diff --git a/lua/Trans/README.md b/lua/Trans/README.md
index 93d2545..a43075c 100644
--- a/lua/Trans/README.md
+++ b/lua/Trans/README.md
@@ -1,8 +1,12 @@
 # TODO
 
 <!--toc:start-->
-- [TODO](#todo)
+
+-   [TODO](#todo)
 <!--toc:end-->
 
 -   [ ] Refactor query engine to 'Backend' and 'Frontend'
--   [ ] Use `Trans.install` instead of `install.sh`
+-   [x] Use `Trans.install` instead of `install.sh`
+-   [ ] Check if str is a word
+-   [ ] init frontend window
+-   [ ] build frontend window format logic
diff --git a/lua/Trans/backend/baidu.lua b/lua/Trans/backend/baidu.lua
index ab8d3bc..0845035 100644
--- a/lua/Trans/backend/baidu.lua
+++ b/lua/Trans/backend/baidu.lua
@@ -43,8 +43,8 @@ function M.query(data)
                 assert(#result == 1)
                 result = result[1]
                 data.result.baidu = {
-                    title = result.src,
-                    translation = result.dst,
+                    ['title'] = result.src,
+                    [data.from == 'en' and 'translation' or 'definition'] = result.dst,
                 }
                 return
             end
diff --git a/lua/Trans/backend/offline.lua b/lua/Trans/backend/offline.lua
index 4d39d76..c74e123 100644
--- a/lua/Trans/backend/offline.lua
+++ b/lua/Trans/backend/offline.lua
@@ -13,25 +13,22 @@ vim.api.nvim_create_autocmd('VimLeavePre', {
 function M.query(data)
     if data.is_word == false or data.from == 'zh' then return end
 
-    data.path        = data.path or require('Trans').conf.dir .. '/ultimate.db'
-    data.engine      = 'offline'
-    data.formatter   = data.formatter or M.formatter
-    data.query_field = data.query_field or M.query_field
+    local path       = require('Trans').conf.dir .. '/ultimate.db'
 
-
-    local dict    = db:open(data.path)
+    local dict    = db:open(path)
     local db_name = data.db_name or 'stardict'
     local res     = dict:select(db_name, {
         where = { word = data.str, },
-        keys = data.query_field,
+        keys = M.query_field,
         limit = 1,
     })[1]
 
 
-    data.result.offline = res and data.formatter(res) or false
+    data.result.offline = res and M.formatter(res) or false
     return data
 end
 
+-- this is a awesome plugin
 M.query_field = {
     'word',
     'phonetic',
diff --git a/lua/Trans/core/translate.lua b/lua/Trans/core/translate.lua
index de1a09e..4f62f1e 100644
--- a/lua/Trans/core/translate.lua
+++ b/lua/Trans/core/translate.lua
@@ -41,21 +41,24 @@ local function set_result(data)
 
     local frontend = Trans.frontend[data.frontend]
 
+    -- HACK :Rewrite this function to support multi request
     local function do_query(name)
         local backend = backends[name]
         if backend.no_wait then
             backend.query(data)
-            if type(data.result[name]) == 'table' then
-                return
-            end
         else
             backend.query(data)
             frontend.wait(data.result, name, backend.timeout)
         end
+
+        return type(data.result[name]) == "table"
     end
 
     for _, name in ipairs(backend_list) do
-        do_query(name)
+        if do_query(name) then
+            -- TODO : process data
+            break
+        end
     end
 end
 
@@ -72,8 +75,16 @@ local function process(opts)
     if not data then return end
 
     set_result(data)
-    if data.result == false then return end
+    local success = false
+    for _, v in pairs(data.result) do
+        if type(v) == "table" then
+            success = true
+            break
+        end
+    end
 
+    vim.pretty_print(data)
+    if success == false then return end
     render_window(data)
 end
 
diff --git a/lua/Trans/frontend/hover.lua b/lua/Trans/frontend/hover.lua
index f59b702..39358c2 100644
--- a/lua/Trans/frontend/hover.lua
+++ b/lua/Trans/frontend/hover.lua
@@ -8,7 +8,7 @@ function M.init()
     print('TODO: init hover window')
 end
 
-function M.wait(tbl, key, timeout)
+function M.wait(tbl, name, timeout)
     local thread = coroutine.running()
     local function pause(ms)
         vim.defer_fn(function()
@@ -18,18 +18,14 @@ function M.wait(tbl, key, timeout)
     end
 
     local error_message = 'Faild'
-    local times = 0
     local interval = math.floor(timeout / #error_message)
-    while tbl[key] == nil do
-        print(('waitting' .. (' '):rep(times)))
+    for i = 1, #error_message do
+        if tbl[name] ~= nil then break end
+        print('waitting' .. ('.'):rep(i))
         pause(interval)
     end
 
-    if tbl[key] == false then
-        print('TODO: show error message: ' .. error_message)
-    else
-        vim.pretty_print(tbl[key])
-    end
+    -- TODO : End waitting animation
 end
 
 function M.process(data)
diff --git a/lua/Trans/wrapper/curl.lua b/lua/Trans/wrapper/curl.lua
index 605d669..be91429 100644
--- a/lua/Trans/wrapper/curl.lua
+++ b/lua/Trans/wrapper/curl.lua
@@ -1,35 +1,37 @@
 local curl = {}
 
 curl.get = function(uri, opts)
-    local query = opts.query
-    local headers = opts.headers
+    local query    = opts.query
+    local output   = opts.output
+    local headers  = opts.headers
     local callback = opts.callback
-    local output = opts.output
+
 
     -- INFO :Init Curl command with {s}ilent and {G}et
-    local cmd = { 'curl', '-GLs' }
+    local cmd  = { 'curl', '-GLs', uri }
+    local size = #cmd
+    local function insert(value)
+        size = size + 1
+        cmd[size] = value
+    end
 
     -- INFO :Add headers
     if headers then
         for k, v in pairs(headers) do
-            cmd[#cmd + 1] = ([[-H '%s: %s']]):format(k, v)
+            insert(('-H %q: %q'):format(k, v))
+        end
+    end
+
+    -- INFO :Add arguments
+    if query then
+        for k, v in pairs(query) do
+            insert(('--data-urlencode %q=%q'):format(k, v))
         end
     end
 
     -- INFO :Store output to file
     if output then
-        cmd[#cmd + 1] = [[-o ]] .. output
-    end
-
-    -- INFO :Add arguments
-    if query then
-        local info = {}
-        for k, v in pairs(query) do
-            info[#info + 1] = ('%s=%s'):format(k, v)
-        end
-        cmd[#cmd + 1] = ([['%s?%s']]):format(uri, table.concat(info, '&'))
-    else
-        cmd[#cmd + 1] = uri
+        insert(('-o %q'):format(output))
     end
 
     -- INFO : Start a job