Finish the service and instance register.
diff --git a/examples/nginx.conf b/examples/nginx.conf
index 4368ca4..7473e5d 100644
--- a/examples/nginx.conf
+++ b/examples/nginx.conf
@@ -34,6 +34,7 @@
     init_worker_by_lua_block {
         local metadata_buffer = ngx.shared.tracing_buffer
         metadata_buffer['serviceName'] = 'Service Name'
+        metadata_buffer['serviceInstanceName'] = 'Service Instance Name'
 
         require("client"):startTimer(metadata_buffer, "http://127.0.0.1:8080/skywalking")
     }
@@ -70,7 +71,7 @@
                 local contextCarrier = {}
                 contextCarrier["sw6"] = ngx.req.get_headers()["sw6"]
                 local entrySpan = tracingContext:createEntrySpan(ngx.var.uri, nil, contextCarrier)
-                entrySpan:start(ngx.now())
+                entrySpan:start(ngx.now() * 1000)
                 entrySpan:setComponentId(nginxComponentId)
                 entrySpan:setLayer(Layer.HTTP)
                 
@@ -89,7 +90,7 @@
                 local upstreamServerName = "upstream_ip:port"
                 ------------------------------------------------------
                 local exitSpan = tracingContext:createExitSpan(upstreamUri, entrySpan, upstreamServerName, contextCarrier)
-                exitSpan:start(ngx.now())
+                exitSpan:start(ngx.now() * 1000)
                 exitSpan:setComponentId(nginxComponentId)
                 exitSpan:setLayer(Layer.HTTP)
                 
@@ -108,14 +109,14 @@
             body_filter_by_lua_block {
                 -- Finish the exit span when received the first response package from upstream
                 if ngx.ctx.exitSpan ~= nil then
-                    ngx.ctx.exitSpan:finish()
+                    ngx.ctx.exitSpan:finish(ngx.now() * 1000)
                     ngx.ctx.exitSpan = nil
                 end
             }
 
             log_by_lua_block {
                 if ngx.ctx.entrySpan ~= nil then
-                    ngx.ctx.entrySpan:finish()
+                    ngx.ctx.entrySpan:finish(ngx.now() * 1000)
                     local status, segment = ngx.ctx.tracingContext:drainAfterFinished()
                     if status then
                         local segmentJson = require('cjson').encode(segment:transform())
@@ -129,6 +130,9 @@
             }
         }
 
+        # ------------------------------------------------------
+        # -- Mock backend business service as the upsteeam
+        # ------------------------------------------------------
         location /backend {
             default_type text/html;
             content_by_lua_block {
@@ -137,12 +141,39 @@
             }
         }
 
+
+        # ------------------------------------------------------
+        # -- Mock OAP server to provide register and trace collection
+        # ------------------------------------------------------
         location /skywalking/register/service {
             default_type text/html;
+            lua_need_request_body on;
+
             content_by_lua_block {
+                local cjson = require('cjson')
+                
+                ngx.log(ngx.DEBUG, 'Service register request = ', ngx.req.get_body_data())
+                local param = cjson.decode(ngx.req.get_body_data())
+
                 local registeredInfo = {}
-                registeredInfo[1] = {key="Service Name", value=1}
-                ngx.say(require('cjson').encode(registeredInfo))
+                registeredInfo[1] = {key=param.services[1].serviceName, value=1}
+                ngx.say(cjson.encode(registeredInfo))
+            }
+        }
+
+        location /skywalking/register/serviceInstance {
+            default_type text/html;
+            lua_need_request_body on;
+
+            content_by_lua_block {
+                local cjson = require('cjson')
+                ngx.log(ngx.DEBUG, 'Service instance register request = ', ngx.req.get_body_data())
+                local param = cjson.decode(ngx.req.get_body_data())
+
+                local registeredInfo = {}
+
+                registeredInfo[1] = {key=param.instances[1].instanceUUID, value=1}
+                ngx.say(cjson.encode(registeredInfo))
             }
         }
     }
diff --git a/lib/skywalking/client.lua b/lib/skywalking/client.lua
index 48bba96..cc91c60 100644
--- a/lib/skywalking/client.lua
+++ b/lib/skywalking/client.lua
@@ -37,10 +37,14 @@
             -- Register is in the async way, if register successfully, go for instance register
             if metadata_buffer['serviceId'] ~= nil then
                 if metadata_buffer['serviceInstId'] == nil then
-                    
+                    self:registerServiceInstance(metadata_buffer, backend_http_uri)
                 end
             end
 
+            -- After all register successfully, begin to send trace segments
+            if metadata_buffer['serviceInstId'] ~= nil then
+            end
+
             -- do the health check
             local ok, err = new_timer(delay, check)
             if not ok then
@@ -65,8 +69,9 @@
     local DEBUG = ngx.DEBUG
 
     local serviceName = metadata_buffer['serviceName']
+    
     local cjson = require('cjson')
-    local serviceRegister = require("register").newServiceRegister(serviceName)
+    local serviceRegister = require("register"):newServiceRegister(serviceName)
     local serviceRegisterParam = cjson.encode(serviceRegister)
 
     local http = require('resty.http')
@@ -80,6 +85,7 @@
     })
 
     if #res.body > 0 then
+        log(DEBUG, "Service register response = " .. res.body)
         local registerResults = cjson.decode(res.body)
 
         for i, result in ipairs(registerResults)
@@ -93,4 +99,43 @@
     end
 end
 
+-- Register service instance
+function Client:registerServiceInstance(metadata_buffer, backend_http_uri)
+    local log = ngx.log
+    local DEBUG = ngx.DEBUG
+
+    local serviceInstName = 'name:' .. metadata_buffer['serviceInstanceName']
+
+    local cjson = require('cjson')
+    local serviceInstanceRegister = require("register"):newServiceInstanceRegister(
+        metadata_buffer['serviceId'], 
+        serviceInstName, 
+        ngx.now() * 1000)
+    local serviceInstanceRegisterParam = cjson.encode(serviceInstanceRegister)
+
+    local http = require('resty.http')
+    local httpc = http.new()
+    local res, err = httpc:request_uri(backend_http_uri .. '/register/serviceInstance', {
+        method = "POST",
+        body = serviceInstanceRegisterParam,
+        headers = {
+            ["Content-Type"] = "application/json",
+        },
+    })
+
+    if #res.body > 0 then
+        log(DEBUG, "Service Instance register response = " .. res.body)
+        local registerResults = cjson.decode(res.body)
+
+        for i, result in ipairs(registerResults)
+        do
+            if result.key == serviceInstName then
+                local serviceId = result.value 
+                log(DEBUG, "Service Instance registered, service instance id = " .. serviceId)
+                metadata_buffer['serviceInstId'] = serviceId
+            end
+        end
+    end
+end
+
 return Client
\ No newline at end of file
diff --git a/lib/skywalking/register.lua b/lib/skywalking/register.lua
index 727b487..b6645bf 100644
--- a/lib/skywalking/register.lua
+++ b/lib/skywalking/register.lua
@@ -15,39 +15,42 @@
 -- limitations under the License.
 -- 
 
-local Services = {
-    services
-}
-
-local Service = {
-    serviceName,
-    -- Field type is optional, default value is `normal`
-    type = 'normal'
-}
-
-local ServiceInstances = {
-    instances
-}
-
-local ServiceInstance = {
-    serviceId,
-    instanceUUID,
-    time,
-    tags,
-    properties
-}
-
 local Register = {}
 
 -- Return Services as service register parameter
-function Register:newServiceRegister(serviceName)
-    local o = {}
-    setmetatable(o, Service)
-    Service.__index = Service
+function Register:newServiceRegister(unRegisterServiceName)
+    local serv = {
+        services = {}
+    }
+    
+    local service = {
+        serviceName = unRegisterServiceName,
+        -- Field type is optional, default value is `normal`
+        type = 'normal'
+    }
 
-    o.serviceName = serviceName
+    serv.services[#serv.services + 1] = service
 
-    return o
+    return serv
+end
+
+function Register:newServiceInstanceRegister(registeredServiceId, serviceInstUUID, registerTime)
+    local serviceInstances = {
+        instances = {}
+    }
+    
+    local serviceInstance = {
+        serviceId = registeredServiceId,
+        instanceUUID = serviceInstUUID,
+        time = registerTime,
+        properties = {}
+    }
+
+    serviceInstance.properties[#serviceInstance.properties + 1] = {key = "language", value = "Lua"}
+
+    serviceInstances.instances[#serviceInstances.instances + 1] = serviceInstance
+
+    return serviceInstances
 end
 
 return Register
\ No newline at end of file
diff --git a/lib/skywalking/span.lua b/lib/skywalking/span.lua
index c02bdb6..6f8f3e1 100644
--- a/lib/skywalking/span.lua
+++ b/lib/skywalking/span.lua
@@ -168,7 +168,7 @@
     end 
 
     context.internal:addActive(o)
-    o.start_time = Util.timestamp()
+    -- o.start_time = Util.timestamp()
     o.refs = {}
     o.owner = context
     o.tags = {}