You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2020/03/31 09:51:27 UTC

[skywalking] branch 8.x-core created (now 212339c)

This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a change to branch 8.x-core
in repository https://gitbox.apache.org/repos/asf/skywalking.git.


      at 212339c  1. Update protocol. 2.Finish most changes at the agent side. 3. Working on the test case fix.

This branch includes the following new commits:

     new 212339c  1. Update protocol. 2.Finish most changes at the agent side. 3. Working on the test case fix.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[skywalking] 01/01: 1. Update protocol. 2.Finish most changes at the agent side. 3. Working on the test case fix.

Posted by wu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch 8.x-core
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit 212339c81ab60bed5a1ff16ae79b81531b6af7c1
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Tue Mar 31 17:50:47 2020 +0800

    1. Update protocol. 2.Finish most changes at the agent side. 3. Working on the test case fix.
---
 .../skywalking/apm/util/ConfigInitializer.java     |  13 +-
 .../org/apache/skywalking/apm/util/Length.java     |  26 ++-
 apm-protocol/apm-network/src/main/proto            |   2 +-
 .../apm/network/trace/proto/GRPCNoServerTest.java  |   6 +-
 .../core/commands/CommandExecutorService.java      |  10 +-
 .../executor/ServiceResetCommandExecutor.java      |  50 -----
 .../skywalking/apm/agent/core/conf/Config.java     |  11 +-
 .../agent/core/conf/RemoteDownstreamConfig.java    |  35 ----
 .../agent/core/context/AbstractTracerContext.java  |   2 +-
 .../apm/agent/core/context/ContextCarrier.java     | 179 ++++-------------
 .../apm/agent/core/context/ContextManager.java     |  21 +-
 .../apm/agent/core/context/ContextSnapshot.java    |  92 ++-------
 .../agent/core/context/IgnoredTracerContext.java   |   4 +-
 .../{SW6CarrierItem.java => SW8CarrierItem.java}   |  10 +-
 .../apm/agent/core/context/TracingContext.java     | 112 +++--------
 .../agent/core/context/ids/DistributedTraceId.java |  57 +-----
 .../agent/core/context/ids/GlobalIdGenerator.java  |  34 ++--
 .../skywalking/apm/agent/core/context/ids/ID.java  | 101 ----------
 .../core/context/trace/AbstractTracingSpan.java    |   8 +-
 .../apm/agent/core/context/trace/ExitSpan.java     |   9 -
 .../apm/agent/core/context/trace/ExitTypeSpan.java |   2 -
 .../agent/core/context/trace/LogDataEntity.java    |   2 +-
 .../apm/agent/core/context/trace/NoopExitSpan.java |  11 --
 .../core/context/trace/StackBasedTracingSpan.java  |  33 +---
 .../apm/agent/core/context/trace/TraceSegment.java |  34 +---
 .../agent/core/context/trace/TraceSegmentRef.java  | 103 +++-------
 .../core/dictionary/NetworkAddressDictionary.java  |  69 -------
 .../skywalking/apm/agent/core/jvm/JVMService.java  | 113 ++++++-----
 .../apm/agent/core/jvm/gc/GCMetricAccessor.java    |   2 +-
 .../skywalking/apm/agent/core/jvm/gc/GCModule.java |   4 +-
 .../apm/agent/core/jvm/gc/GCProvider.java          |   2 +-
 .../skywalking/apm/agent/core/jvm/gc/UnknowGC.java |   4 +-
 .../apm/agent/core/jvm/memory/MemoryProvider.java  |   2 +-
 .../jvm/memorypool/MemoryPoolMetricsAccessor.java  |   2 +-
 .../core/jvm/memorypool/MemoryPoolModule.java      |   6 +-
 .../core/jvm/memorypool/MemoryPoolProvider.java    |   2 +-
 .../core/jvm/memorypool/UnknownMemoryPool.java     |   4 +-
 .../skywalking/apm/agent/core/os/OSUtil.java       |  11 ++
 .../core/profile/ProfileTaskChannelService.java    |  63 +++---
 .../core/profile/ProfileTaskExecutionContext.java  |  18 +-
 .../core/profile/ProfileTaskExecutionService.java  |   7 +-
 .../apm/agent/core/profile/ThreadProfiler.java     |  12 +-
 .../agent/core/profile/TracingThreadSnapshot.java  |  14 +-
 .../agent/core/remote/ServiceManagementClient.java | 143 ++++++++++++++
 .../agent/core/remote/ServiceRegisterClient.java   | 217 ---------------------
 .../core/remote/TraceSegmentServiceClient.java     |   8 +-
 ...ache.skywalking.apm.agent.core.boot.BootService |   2 +-
 ...erTest.java => ContextCarrierV3HeaderTest.java} |  67 +++----
 .../apm/agent/core/context/ContextManagerTest.java |  63 +++---
 .../core/context/IgnoredTracerContextTest.java     |  12 +-
 .../apm/agent/core/context/TracingContextTest.java |  15 --
 .../core/context/util/TraceSegmentRefHelper.java   |   2 +-
 .../agent/core/remote/GRPCChannelManagerTest.java  |  89 ---------
 .../core/remote/TraceSegmentServiceClientTest.java |  39 ++--
 .../apm/plugin/dubbo/DubboInterceptorTest.java     |   9 +-
 .../apm/plugin/dubbo/DubboInterceptorTest.java     |   9 +-
 .../apm/plugin/finagle/CodecUtilsTest.java         |   4 +-
 .../ServerTracingFilterInterceptorTest.java        |   8 +-
 .../jetty/v9/server/HandleInterceptorTest.java     |   7 +-
 .../plugin/kafka/KafkaConsumerInterceptorTest.java |  14 +-
 .../plugin/motan/MotanProviderInterceptorTest.java |  27 ++-
 .../pulsar/PulsarConsumerInterceptorTest.java      |   6 +-
 .../rabbitmq/RabbitMQConsumerInterceptorTest.java  |   4 +-
 .../apm/plugin/resteasy/v3/server/AssertTools.java |   2 +-
 .../SynchronousDispatcherInterceptorTest.java      |   4 +-
 .../sofarpc/SofaRpcProviderInterceptorTest.java    |   8 +-
 .../v4/RequestMappingMethodInterceptorTest.java    |   2 +-
 .../mvc/v4/RestMappingMethodInterceptorTest.java   |   8 +-
 .../apm/plugin/struts2/Struts2InterceptorTest.java |   7 +-
 .../tomcat78x/TomcatInvokeInterceptorTest.java     |   7 +-
 .../plugin/undertow/v2x/TracingHandlerTest.java    |   6 +-
 .../agent/core/context/MockContextSnapshot.java    |   9 +-
 .../apm/agent/test/helper/SegmentRefHelper.java    |  11 +-
 .../apm/agent/test/tools/AgentServiceRule.java     |  18 +-
 .../apm/agent/test/tools/SegmentRefAssert.java     |   5 -
 .../opentracing/SkywalkingSpanActivationTest.java  |  25 ++-
 ...ross-Process-Propagation-Headers-Protocol-v3.md |  19 +-
 docs/en/protocols/Trace-Data-Protocol-v3.md        |   8 +-
 test/untitled/pom.xml                              |  42 ++++
 .../untitled/src/main/java/Main.java               |  13 +-
 80 files changed, 732 insertions(+), 1509 deletions(-)

diff --git a/apm-commons/apm-util/src/main/java/org/apache/skywalking/apm/util/ConfigInitializer.java b/apm-commons/apm-util/src/main/java/org/apache/skywalking/apm/util/ConfigInitializer.java
index f4efb0d..909883b 100644
--- a/apm-commons/apm-util/src/main/java/org/apache/skywalking/apm/util/ConfigInitializer.java
+++ b/apm-commons/apm-util/src/main/java/org/apache/skywalking/apm/util/ConfigInitializer.java
@@ -42,7 +42,7 @@ public class ConfigInitializer {
     }
 
     private static void initNextLevel(Properties properties, Class<?> recentConfigType,
-        ConfigDesc parentDesc) throws IllegalArgumentException, IllegalAccessException {
+                                      ConfigDesc parentDesc) throws IllegalArgumentException, IllegalAccessException {
         for (Field field : recentConfigType.getFields()) {
             if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) {
                 String configKey = (parentDesc + "." + field.getName()).toLowerCase();
@@ -73,6 +73,12 @@ public class ConfigInitializer {
                      */
                     String value = properties.getProperty(configKey);
                     // Convert the value into real type
+                    final Length lengthDefine = field.getAnnotation(Length.class);
+                    if (lengthDefine != null) {
+                        if (value != null && value.length() > lengthDefine.value()) {
+                            value = value.substring(0, lengthDefine.value());
+                        }
+                    }
                     Object convertedValue = convertToTypicalType(type, value);
                     if (convertedValue != null) {
                         field.set(null, convertedValue);
@@ -133,7 +139,7 @@ public class ConfigInitializer {
      * @param valueType  value type of the map
      */
     private static void setForMapType(String configKey, Map<Object, Object> map, Properties properties,
-        final Type keyType, final Type valueType) {
+                                      final Type keyType, final Type valueType) {
 
         Objects.requireNonNull(configKey);
         Objects.requireNonNull(map);
@@ -145,7 +151,8 @@ public class ConfigInitializer {
         properties.forEach((propertyKey, propertyValue) -> {
             String propertyStringKey = propertyKey.toString();
             if (propertyStringKey.startsWith(prefix) && propertyStringKey.endsWith(suffix)) {
-                String itemKey = propertyStringKey.substring(prefix.length(), propertyStringKey.length() - suffix.length());
+                String itemKey = propertyStringKey.substring(
+                    prefix.length(), propertyStringKey.length() - suffix.length());
                 Object keyObj;
                 Object valueObj;
 
diff --git a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/ProtocolVersion.java b/apm-commons/apm-util/src/main/java/org/apache/skywalking/apm/util/Length.java
similarity index 70%
rename from apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/ProtocolVersion.java
rename to apm-commons/apm-util/src/main/java/org/apache/skywalking/apm/util/Length.java
index e9b5b01..5d4eb47 100644
--- a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/ProtocolVersion.java
+++ b/apm-commons/apm-util/src/main/java/org/apache/skywalking/apm/util/Length.java
@@ -16,21 +16,19 @@
  *
  */
 
-package org.apache.skywalking.apm.network;
+package org.apache.skywalking.apm.util;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
 /**
- * The version of the protocol between agent and backend.
+ * The length rule of the target field.
  */
-public enum ProtocolVersion {
-    V2(2);
-
-    private final int number;
-
-    ProtocolVersion(final int number) {
-        this.number = number;
-    }
-
-    public int number() {
-        return number;
-    }
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Length {
+    int value();
 }
+
diff --git a/apm-protocol/apm-network/src/main/proto b/apm-protocol/apm-network/src/main/proto
index eebd016..4a466a1 160000
--- a/apm-protocol/apm-network/src/main/proto
+++ b/apm-protocol/apm-network/src/main/proto
@@ -1 +1 @@
-Subproject commit eebd016e32b0808416923acf04dcd31d9eb86c09
+Subproject commit 4a466a177614405dff952243d369643ad80f40fc
diff --git a/apm-protocol/apm-network/src/test/java/org/apache/skywalking/apm/network/trace/proto/GRPCNoServerTest.java b/apm-protocol/apm-network/src/test/java/org/apache/skywalking/apm/network/trace/proto/GRPCNoServerTest.java
index 350f533..b4bc1a6 100644
--- a/apm-protocol/apm-network/src/test/java/org/apache/skywalking/apm/network/trace/proto/GRPCNoServerTest.java
+++ b/apm-protocol/apm-network/src/test/java/org/apache/skywalking/apm/network/trace/proto/GRPCNoServerTest.java
@@ -26,8 +26,8 @@ import io.grpc.internal.DnsNameResolverProvider;
 import io.grpc.netty.NettyChannelBuilder;
 import io.grpc.stub.StreamObserver;
 import org.apache.skywalking.apm.network.common.Commands;
-import org.apache.skywalking.apm.network.language.agent.UpstreamSegment;
-import org.apache.skywalking.apm.network.language.agent.v2.TraceSegmentReportServiceGrpc;
+import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
+import org.apache.skywalking.apm.network.language.agent.v3.TraceSegmentReportServiceGrpc;
 import org.junit.Assert;
 
 public class GRPCNoServerTest {
@@ -39,7 +39,7 @@ public class GRPCNoServerTest {
         ManagedChannel channel = channelBuilder.build();
         TraceSegmentReportServiceGrpc.TraceSegmentReportServiceStub serviceStub = TraceSegmentReportServiceGrpc.newStub(channel);
         final Status[] status = {null};
-        StreamObserver<UpstreamSegment> streamObserver = serviceStub.collect(new StreamObserver<Commands>() {
+        StreamObserver<SegmentObject> streamObserver = serviceStub.collect(new StreamObserver<Commands>() {
             @Override
             public void onNext(Commands value) {
 
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/commands/CommandExecutorService.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/commands/CommandExecutorService.java
index 7ce5727..81fc8d7 100755
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/commands/CommandExecutorService.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/commands/CommandExecutorService.java
@@ -17,17 +17,14 @@
 
 package org.apache.skywalking.apm.agent.core.commands;
 
+import java.util.HashMap;
+import java.util.Map;
 import org.apache.skywalking.apm.agent.core.boot.BootService;
 import org.apache.skywalking.apm.agent.core.boot.DefaultImplementor;
 import org.apache.skywalking.apm.agent.core.commands.executor.NoopCommandExecutor;
 import org.apache.skywalking.apm.agent.core.commands.executor.ProfileTaskCommandExecutor;
-import org.apache.skywalking.apm.agent.core.commands.executor.ServiceResetCommandExecutor;
 import org.apache.skywalking.apm.network.trace.component.command.BaseCommand;
 import org.apache.skywalking.apm.network.trace.component.command.ProfileTaskCommand;
-import org.apache.skywalking.apm.network.trace.component.command.ServiceResetCommand;
-
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * Command executor service, acts like a routing executor that controls all commands' execution, is responsible for
@@ -44,9 +41,6 @@ public class CommandExecutorService implements BootService, CommandExecutor {
     public void prepare() throws Throwable {
         commandExecutorMap = new HashMap<String, CommandExecutor>();
 
-        // Register all the supported commands with their executors here
-        commandExecutorMap.put(ServiceResetCommand.NAME, new ServiceResetCommandExecutor());
-
         // Profile task executor
         commandExecutorMap.put(ProfileTaskCommand.NAME, new ProfileTaskCommandExecutor());
     }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/commands/executor/ServiceResetCommandExecutor.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/commands/executor/ServiceResetCommandExecutor.java
deleted file mode 100755
index 57f639f..0000000
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/commands/executor/ServiceResetCommandExecutor.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.apache.skywalking.apm.agent.core.commands.executor;
-
-import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
-import org.apache.skywalking.apm.agent.core.commands.CommandExecutionException;
-import org.apache.skywalking.apm.agent.core.commands.CommandExecutor;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
-import org.apache.skywalking.apm.agent.core.dictionary.NetworkAddressDictionary;
-import org.apache.skywalking.apm.agent.core.logging.api.ILog;
-import org.apache.skywalking.apm.agent.core.logging.api.LogManager;
-import org.apache.skywalking.apm.agent.core.remote.ServiceRegisterClient;
-import org.apache.skywalking.apm.network.trace.component.command.BaseCommand;
-import org.apache.skywalking.apm.network.trace.component.command.ServiceResetCommand;
-
-/**
- * Command executor that executes the {@link ServiceResetCommand} command
- */
-public class ServiceResetCommandExecutor implements CommandExecutor {
-    private static final ILog LOGGER = LogManager.getLogger(ServiceResetCommandExecutor.class);
-
-    @Override
-    public void execute(final BaseCommand command) throws CommandExecutionException {
-        LOGGER.warn("Received ServiceResetCommand, a re-register task is scheduled.");
-
-        ServiceManager.INSTANCE.findService(ServiceRegisterClient.class).coolDown();
-
-        RemoteDownstreamConfig.Agent.SERVICE_ID = DictionaryUtil.nullValue();
-        RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = DictionaryUtil.nullValue();
-        RemoteDownstreamConfig.Agent.INSTANCE_REGISTERED_TIME = DictionaryUtil.nullValue();
-
-        NetworkAddressDictionary.INSTANCE.clear();
-    }
-}
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java
index 71fc41c..cc78e2c 100755
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java
@@ -24,6 +24,7 @@ import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
 import org.apache.skywalking.apm.agent.core.logging.core.LogLevel;
 import org.apache.skywalking.apm.agent.core.logging.core.LogOutput;
 import org.apache.skywalking.apm.agent.core.logging.core.WriterFactory;
+import org.apache.skywalking.apm.util.Length;
 
 /**
  * This is the core config in sniffer agent.
@@ -40,6 +41,7 @@ public class Config {
          * Service name is showed in skywalking-ui. Suggestion: set a unique name for each service, service instance
          * nodes share the same code
          */
+        @Length(50)
         public static String SERVICE_NAME = "";
 
         /**
@@ -74,7 +76,8 @@ public class Config {
         /**
          * The identifier of the instance
          */
-        public static String INSTANCE_UUID = "";
+        @Length(50)
+        public volatile static String INSTANCE_NAME = "";
 
         /*
          * service instance properties
@@ -89,12 +92,6 @@ public class Config {
         public static int CAUSE_EXCEPTION_DEPTH = 5;
 
         /**
-         * How long should the agent wait (in minute) before re-registering to the OAP server after receiving reset
-         * command
-         */
-        public static int COOL_DOWN_THRESHOLD = 10;
-
-        /**
          * Force reconnection period of grpc, based on grpc_channel_check_interval. If count of check grpc channel
          * status more than this number. The channel check will call channel.getState(true) to requestConnection.
          */
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/RemoteDownstreamConfig.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/RemoteDownstreamConfig.java
deleted file mode 100644
index bd27b98..0000000
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/RemoteDownstreamConfig.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.apm.agent.core.conf;
-
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
-
-/**
- * The <code>RemoteDownstreamConfig</code> includes configurations from collector side. All of them initialized null,
- * Null-Value or empty collection.
- */
-public class RemoteDownstreamConfig {
-    public static class Agent {
-        public volatile static int SERVICE_ID = DictionaryUtil.nullValue();
-
-        public volatile static int SERVICE_INSTANCE_ID = DictionaryUtil.nullValue();
-
-        public volatile static long INSTANCE_REGISTERED_TIME = DictionaryUtil.nullValue();
-    }
-}
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AbstractTracerContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AbstractTracerContext.java
index 9af1d1b..2a66a77 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AbstractTracerContext.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/AbstractTracerContext.java
@@ -60,7 +60,7 @@ public interface AbstractTracerContext {
      *
      * @return the string represents the id.
      */
-    String getReadableGlobalTraceId();
+    String getReadablePrimaryTraceId();
 
     /**
      * Create an entry span
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java
index 194822c..67e261b 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java
@@ -19,12 +19,10 @@
 package org.apache.skywalking.apm.agent.core.context;
 
 import java.io.Serializable;
-import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
 import org.apache.skywalking.apm.agent.core.base64.Base64;
-import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId;
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
-import org.apache.skywalking.apm.agent.core.context.ids.PropagatedTraceId;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
+import org.apache.skywalking.apm.agent.core.conf.Constants;
 import org.apache.skywalking.apm.util.StringUtil;
 
 /**
@@ -32,50 +30,23 @@ import org.apache.skywalking.apm.util.StringUtil;
  * TracingContext}.
  * <p>
  */
+@Setter
+@Getter
 public class ContextCarrier implements Serializable {
-    private ID traceSegmentId;
-
-    /**
-     * id of parent span. It is unique in parent trace segment.
-     */
+    private String traceId;
+    private String traceSegmentId;
     private int spanId = -1;
-
-    /**
-     * id of parent application instance, it's the id assigned by collector.
-     */
-    private int parentServiceInstanceId = DictionaryUtil.nullValue();
-
-    /**
-     * id of first application instance in this distributed trace, it's the id assigned by collector.
-     */
-    private int entryServiceInstanceId = DictionaryUtil.nullValue();
-
-    /**
-     * peer(ipv4s/ipv6/hostname + port) of the server, from client side.
-     */
-    private String peerHost;
-
-    /**
-     * Operation/Service name of the first one in this distributed trace. This name may be compressed to an integer.
-     */
-    private String entryEndpointName;
-
-    /**
-     * Operation/Service name of the parent one in this distributed trace. This name may be compressed to an integer.
-     */
-    private String parentEndpointName;
-
-    /**
-     * {@link DistributedTraceId}, also known as TraceId
-     */
-    private DistributedTraceId primaryDistributedTraceId;
+    private String parentService = Constants.EMPTY_STRING;
+    private String parentServiceInstance = Constants.EMPTY_STRING;
+    private String parentEndpoint;
+    private String addressUsedAtClient;
 
     private CorrelationContext correlationContext = new CorrelationContext();
 
     public CarrierItem items() {
         SW8CorrelationCarrierItem sw8CorrelationCarrierItem = new SW8CorrelationCarrierItem(correlationContext, null);
-        SW6CarrierItem sw6CarrierItem = new SW6CarrierItem(this, sw8CorrelationCarrierItem);
-        return new CarrierItemHead(sw6CarrierItem);
+        SW8CarrierItem sw8CarrierItem = new SW8CarrierItem(this, sw8CorrelationCarrierItem);
+        return new CarrierItemHead(sw8CarrierItem);
     }
 
     /**
@@ -88,14 +59,13 @@ public class ContextCarrier implements Serializable {
             return StringUtil.join(
                 '-',
                 "1",
-                Base64.encode(this.getPrimaryDistributedTraceId().encode()),
-                Base64.encode(this.getTraceSegmentId().encode()),
+                Base64.encode(this.getTraceId()),
+                Base64.encode(this.getTraceSegmentId()),
                 this.getSpanId() + "",
-                this.getParentServiceInstanceId() + "",
-                this.getEntryServiceInstanceId() + "",
-                Base64.encode(this.getPeerHost()),
-                Base64.encode(this.getEntryEndpointName()),
-                Base64.encode(this.getParentEndpointName())
+                Base64.encode(this.getParentService()),
+                Base64.encode(this.getParentServiceInstance()),
+                Base64.encode(this.getParentEndpoint()),
+                Base64.encode(this.getAddressUsedAtClient())
             );
         }
         return "";
@@ -111,22 +81,21 @@ public class ContextCarrier implements Serializable {
             return this;
         }
         // if this carrier is initialized by v2, don't do deserialize again for performance.
-        if (this.isValid(HeaderVersion.v2)) {
+        if (this.isValid(HeaderVersion.v3)) {
             return this;
         }
-        if (HeaderVersion.v2 == version) {
-            String[] parts = text.split("-", 9);
-            if (parts.length == 9) {
+        if (HeaderVersion.v3 == version) {
+            String[] parts = text.split("-", 8);
+            if (parts.length == 8) {
                 try {
                     // parts[0] is sample flag, always trace if header exists.
-                    this.primaryDistributedTraceId = new PropagatedTraceId(Base64.decode2UTFString(parts[1]));
-                    this.traceSegmentId = new ID(Base64.decode2UTFString(parts[2]));
+                    this.traceId = Base64.decode2UTFString(parts[1]);
+                    this.traceSegmentId = Base64.decode2UTFString(parts[2]);
                     this.spanId = Integer.parseInt(parts[3]);
-                    this.parentServiceInstanceId = Integer.parseInt(parts[4]);
-                    this.entryServiceInstanceId = Integer.parseInt(parts[5]);
-                    this.peerHost = Base64.decode2UTFString(parts[6]);
-                    this.entryEndpointName = Base64.decode2UTFString(parts[7]);
-                    this.parentEndpointName = Base64.decode2UTFString(parts[8]);
+                    this.parentService = Base64.decode2UTFString(parts[4]);
+                    this.parentServiceInstance = Base64.decode2UTFString(parts[5]);
+                    this.parentEndpoint = Base64.decode2UTFString(parts[6]);
+                    this.addressUsedAtClient = Base64.decode2UTFString(parts[7]);
                 } catch (NumberFormatException ignored) {
 
                 }
@@ -136,7 +105,7 @@ public class ContextCarrier implements Serializable {
     }
 
     public boolean isValid() {
-        return isValid(HeaderVersion.v2);
+        return isValid(HeaderVersion.v3);
     }
 
     /**
@@ -145,95 +114,23 @@ public class ContextCarrier implements Serializable {
      * @return true for unbroken {@link ContextCarrier} or no-initialized. Otherwise, false;
      */
     boolean isValid(HeaderVersion version) {
-        if (HeaderVersion.v2 == version) {
-            return traceSegmentId != null
-                && traceSegmentId.isValid()
+        if (HeaderVersion.v3 == version) {
+            return StringUtil.isNotEmpty(traceId)
+                && StringUtil.isNotEmpty(traceSegmentId)
                 && getSpanId() > -1
-                && parentServiceInstanceId != DictionaryUtil.nullValue()
-                && entryServiceInstanceId != DictionaryUtil.nullValue()
-                && !StringUtil.isEmpty(peerHost)
-                && primaryDistributedTraceId != null;
+                && StringUtil.isNotEmpty(parentService)
+                && StringUtil.isNotEmpty(parentServiceInstance)
+                && StringUtil.isNotEmpty(parentEndpoint)
+                && StringUtil.isNotEmpty(addressUsedAtClient);
         }
         return false;
     }
 
-    public String getEntryEndpointName() {
-        return entryEndpointName;
-    }
-
-    void setEntryEndpointName(String entryEndpointName) {
-        this.entryEndpointName = '#' + entryEndpointName;
-    }
-
-    void setParentEndpointName(String parentEndpointName) {
-        this.parentEndpointName = '#' + parentEndpointName;
-    }
-
-    public ID getTraceSegmentId() {
-        return traceSegmentId;
-    }
-
-    public int getSpanId() {
-        return spanId;
-    }
-
-    void setTraceSegmentId(ID traceSegmentId) {
-        this.traceSegmentId = traceSegmentId;
-    }
-
-    void setSpanId(int spanId) {
-        this.spanId = spanId;
-    }
-
-    public int getParentServiceInstanceId() {
-        return parentServiceInstanceId;
-    }
-
-    void setParentServiceInstanceId(int parentServiceInstanceId) {
-        this.parentServiceInstanceId = parentServiceInstanceId;
-    }
-
-    public String getPeerHost() {
-        return peerHost;
-    }
-
-    void setPeerHost(String peerHost) {
-        this.peerHost = '#' + peerHost;
-    }
-
-    void setPeerId(int peerId) {
-        this.peerHost = peerId + "";
-    }
-
-    public DistributedTraceId getDistributedTraceId() {
-        return primaryDistributedTraceId;
-    }
-
-    public void setDistributedTraceIds(List<DistributedTraceId> distributedTraceIds) {
-        this.primaryDistributedTraceId = distributedTraceIds.get(0);
-    }
-
-    private DistributedTraceId getPrimaryDistributedTraceId() {
-        return primaryDistributedTraceId;
-    }
-
-    public String getParentEndpointName() {
-        return parentEndpointName;
-    }
-
-    public int getEntryServiceInstanceId() {
-        return entryServiceInstanceId;
-    }
-
-    public void setEntryServiceInstanceId(int entryServiceInstanceId) {
-        this.entryServiceInstanceId = entryServiceInstanceId;
-    }
-
     public CorrelationContext getCorrelationContext() {
         return correlationContext;
     }
 
     public enum HeaderVersion {
-        v2
+        v3
     }
 }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java
index 5608cde..46f7dc0 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java
@@ -20,10 +20,8 @@ package org.apache.skywalking.apm.agent.core.context;
 
 import org.apache.skywalking.apm.agent.core.boot.BootService;
 import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
 import org.apache.skywalking.apm.agent.core.logging.api.ILog;
 import org.apache.skywalking.apm.agent.core.logging.api.LogManager;
 import org.apache.skywalking.apm.agent.core.sampling.SamplingService;
@@ -54,18 +52,11 @@ public class ContextManager implements BootService {
                 }
                 context = new IgnoredTracerContext();
             } else {
-                if (RemoteDownstreamConfig.Agent.SERVICE_ID != DictionaryUtil.nullValue()
-                    && RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID != DictionaryUtil.nullValue()) {
-                    if (EXTEND_SERVICE == null) {
-                        EXTEND_SERVICE = ServiceManager.INSTANCE.findService(ContextManagerExtendService.class);
-                    }
-                    context = EXTEND_SERVICE.createTraceContext(operationName, forceSampling);
-                } else {
-                    /*
-                     * Can't register to collector, no need to trace anything.
-                     */
-                    context = new IgnoredTracerContext();
+                if (EXTEND_SERVICE == null) {
+                    EXTEND_SERVICE = ServiceManager.INSTANCE.findService(ContextManagerExtendService.class);
                 }
+                context = EXTEND_SERVICE.createTraceContext(operationName, forceSampling);
+
             }
             CONTEXT.set(context);
         }
@@ -84,7 +75,7 @@ public class ContextManager implements BootService {
         if (segment == null) {
             return "N/A";
         } else {
-            return segment.getReadableGlobalTraceId();
+            return segment.getReadablePrimaryTraceId();
         }
     }
 
@@ -149,7 +140,7 @@ public class ContextManager implements BootService {
         if (snapshot == null) {
             throw new IllegalArgumentException("ContextSnapshot can't be null.");
         }
-        if (snapshot.isValid() && !snapshot.isFromCurrent()) {
+        if (!snapshot.isFromCurrent()) {
             get().continued(snapshot);
         }
     }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java
index 5796763..656fc11 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java
@@ -18,96 +18,34 @@
 
 package org.apache.skywalking.apm.agent.core.context;
 
-import java.util.List;
+import lombok.Getter;
 import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId;
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
 
 /**
  * The <code>ContextSnapshot</code> is a snapshot for current context. The snapshot carries the info for building
  * reference between two segments in two thread, but have a causal relationship.
  */
+@Getter
 public class ContextSnapshot {
-    /**
-     * trace segment id of the parent trace segment.
-     */
-    private ID traceSegmentId;
-
-    /**
-     * span id of the parent span, in parent trace segment.
-     */
-    private int spanId = -1;
-
-    private String entryOperationName;
-
-    private String parentOperationName;
-
-    /**
-     * {@link DistributedTraceId}
-     */
-    private DistributedTraceId primaryDistributedTraceId;
-
-    private int entryApplicationInstanceId = DictionaryUtil.nullValue();
+    private DistributedTraceId traceId;
+    private String traceSegmentId;
+    private int spanId;
+    private String parentEndpoint;
 
     private CorrelationContext correlationContext;
 
-    ContextSnapshot(ID traceSegmentId, int spanId, List<DistributedTraceId> distributedTraceIds, CorrelationContext correlationContext) {
+    ContextSnapshot(String traceSegmentId,
+                    int spanId,
+                    DistributedTraceId primaryTraceId,
+                    String parentEndpoint,
+                    CorrelationContext correlationContext) {
         this.traceSegmentId = traceSegmentId;
         this.spanId = spanId;
-        if (distributedTraceIds != null) {
-            this.primaryDistributedTraceId = distributedTraceIds.get(0);
-        }
+        this.traceId = primaryTraceId;
+        this.parentEndpoint = parentEndpoint;
         this.correlationContext = correlationContext.clone();
     }
 
-    public void setEntryOperationName(String entryOperationName) {
-        this.entryOperationName = "#" + entryOperationName;
-    }
-
-    public void setEntryOperationId(int entryOperationId) {
-        this.entryOperationName = entryOperationId + "";
-    }
-
-    public void setParentOperationName(String parentOperationName) {
-        this.parentOperationName = "#" + parentOperationName;
-    }
-
-    public void setParentOperationId(int parentOperationId) {
-        this.parentOperationName = parentOperationId + "";
-    }
-
-    public DistributedTraceId getDistributedTraceId() {
-        return primaryDistributedTraceId;
-    }
-
-    public ID getTraceSegmentId() {
-        return traceSegmentId;
-    }
-
-    public int getSpanId() {
-        return spanId;
-    }
-
-    public String getParentOperationName() {
-        return parentOperationName;
-    }
-
-    public boolean isValid() {
-        return traceSegmentId != null && spanId > -1 && entryApplicationInstanceId != DictionaryUtil.nullValue() && primaryDistributedTraceId != null;
-    }
-
-    public String getEntryOperationName() {
-        return entryOperationName;
-    }
-
-    public void setEntryApplicationInstanceId(int entryApplicationInstanceId) {
-        this.entryApplicationInstanceId = entryApplicationInstanceId;
-    }
-
-    public int getEntryApplicationInstanceId() {
-        return entryApplicationInstanceId;
-    }
-
     public boolean isFromCurrent() {
         return traceSegmentId.equals(ContextManager.capture().getTraceSegmentId());
     }
@@ -115,4 +53,8 @@ public class ContextSnapshot {
     public CorrelationContext getCorrelationContext() {
         return correlationContext;
     }
+
+    public boolean isValid() {
+        return traceSegmentId != null && spanId > 0 && traceId != null;
+    }
 }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java
index f9aeb4e..9e4ac5f 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java
@@ -53,7 +53,7 @@ public class IgnoredTracerContext implements AbstractTracerContext {
 
     @Override
     public ContextSnapshot capture() {
-        return new ContextSnapshot(null, -1, null, correlationContext);
+        return new ContextSnapshot(null, -1, null, null, correlationContext);
     }
 
     @Override
@@ -62,7 +62,7 @@ public class IgnoredTracerContext implements AbstractTracerContext {
     }
 
     @Override
-    public String getReadableGlobalTraceId() {
+    public String getReadablePrimaryTraceId() {
         return "[Ignored Trace]";
     }
 
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/SW6CarrierItem.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/SW8CarrierItem.java
similarity index 85%
rename from apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/SW6CarrierItem.java
rename to apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/SW8CarrierItem.java
index f071b05..07f79f2 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/SW6CarrierItem.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/SW8CarrierItem.java
@@ -18,17 +18,17 @@
 
 package org.apache.skywalking.apm.agent.core.context;
 
-public class SW6CarrierItem extends CarrierItem {
-    public static final String HEADER_NAME = "sw6";
+public class SW8CarrierItem extends CarrierItem {
+    public static final String HEADER_NAME = "sw8";
     private ContextCarrier carrier;
 
-    public SW6CarrierItem(ContextCarrier carrier, CarrierItem next) {
-        super(HEADER_NAME, carrier.serialize(ContextCarrier.HeaderVersion.v2), next);
+    public SW8CarrierItem(ContextCarrier carrier, CarrierItem next) {
+        super(HEADER_NAME, carrier.serialize(ContextCarrier.HeaderVersion.v3), next);
         this.carrier = carrier;
     }
 
     @Override
     public void setHeadValue(String headValue) {
-        carrier.deserialize(headValue, ContextCarrier.HeaderVersion.v2);
+        carrier.deserialize(headValue, ContextCarrier.HeaderVersion.v3);
     }
 }
\ No newline at end of file
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java
index 0c36f2a..edc7837 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java
@@ -24,7 +24,8 @@ import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
 import java.util.concurrent.locks.ReentrantLock;
 import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
 import org.apache.skywalking.apm.agent.core.conf.Config;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
+import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId;
+import org.apache.skywalking.apm.agent.core.context.ids.PropagatedTraceId;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.EntrySpan;
@@ -35,8 +36,6 @@ import org.apache.skywalking.apm.agent.core.context.trace.NoopExitSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.NoopSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentRef;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryManager;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
 import org.apache.skywalking.apm.agent.core.logging.api.ILog;
 import org.apache.skywalking.apm.agent.core.logging.api.LogManager;
 import org.apache.skywalking.apm.agent.core.profile.ProfileStatusReference;
@@ -165,43 +164,17 @@ public class TracingContext implements AbstractTracerContext {
 
         ExitTypeSpan spanWithPeer = (ExitTypeSpan) exitSpan;
         String peer = spanWithPeer.getPeer();
-        int peerId = spanWithPeer.getPeerId();
-        if (StringUtil.isEmpty(peer) && DictionaryUtil.isNull(peerId)) {
+        if (StringUtil.isEmpty(peer)) {
             throw new IllegalStateException("Exit span doesn't include meaningful peer information.");
         }
 
+        carrier.setTraceId(getReadablePrimaryTraceId());
         carrier.setTraceSegmentId(this.segment.getTraceSegmentId());
         carrier.setSpanId(exitSpan.getSpanId());
-
-        carrier.setParentServiceInstanceId(segment.getApplicationInstanceId());
-
-        if (DictionaryUtil.isNull(peerId)) {
-            carrier.setPeerHost(peer);
-        } else {
-            carrier.setPeerId(peerId);
-        }
-
-        AbstractSpan firstSpan = first();
-        String firstSpanOperationName = firstSpan.getOperationName();
-
-        List<TraceSegmentRef> refs = this.segment.getRefs();
-        String operationName = "";
-        int entryApplicationInstanceId;
-
-        if (refs != null && refs.size() > 0) {
-            TraceSegmentRef ref = refs.get(0);
-            operationName = ref.getEntryEndpointName();
-            entryApplicationInstanceId = ref.getEntryServiceInstanceId();
-        } else {
-            operationName = firstSpanOperationName;
-            entryApplicationInstanceId = this.segment.getApplicationInstanceId();
-        }
-
-        carrier.setEntryServiceInstanceId(entryApplicationInstanceId);
-        carrier.setEntryEndpointName(operationName);
-        carrier.setParentEndpointName(firstSpanOperationName);
-
-        carrier.setDistributedTraceIds(this.segment.getRelatedGlobalTraces());
+        carrier.setParentService(Config.Agent.SERVICE_NAME);
+        carrier.setParentServiceInstance(Config.Agent.INSTANCE_NAME);
+        carrier.setParentEndpoint(first().getOperationName());
+        carrier.setAddressUsedAtClient(peer);
 
         this.correlationContext.inject(carrier);
     }
@@ -215,7 +188,7 @@ public class TracingContext implements AbstractTracerContext {
     public void extract(ContextCarrier carrier) {
         TraceSegmentRef ref = new TraceSegmentRef(carrier);
         this.segment.ref(ref);
-        this.segment.relatedGlobalTraces(carrier.getDistributedTraceId());
+        this.segment.relatedGlobalTraces(new PropagatedTraceId(carrier.getTraceId()));
         AbstractSpan span = this.activeSpan();
         if (span instanceof EntrySpan) {
             span.ref(ref);
@@ -231,28 +204,13 @@ public class TracingContext implements AbstractTracerContext {
      */
     @Override
     public ContextSnapshot capture() {
-        List<TraceSegmentRef> refs = this.segment.getRefs();
         ContextSnapshot snapshot = new ContextSnapshot(
-            segment.getTraceSegmentId(), activeSpan().getSpanId(), segment.getRelatedGlobalTraces(),
+            segment.getTraceSegmentId(),
+            activeSpan().getSpanId(),
+            getPrimaryTraceId(),
+            first().getOperationName(),
             this.correlationContext
         );
-        int entryOperationId;
-        String entryOperationName = "";
-        int entryApplicationInstanceId;
-        AbstractSpan firstSpan = first();
-        String firstSpanOperationName = firstSpan.getOperationName();
-
-        if (refs != null && refs.size() > 0) {
-            TraceSegmentRef ref = refs.get(0);
-            entryOperationName = ref.getEntryEndpointName();
-            entryApplicationInstanceId = ref.getEntryServiceInstanceId();
-        } else {
-            entryOperationName = firstSpanOperationName;
-            entryApplicationInstanceId = this.segment.getApplicationInstanceId();
-        }
-        snapshot.setEntryApplicationInstanceId(entryApplicationInstanceId);
-        snapshot.setEntryOperationName(entryOperationName);
-        snapshot.setParentOperationName(firstSpanOperationName);
 
         return snapshot;
     }
@@ -264,19 +222,25 @@ public class TracingContext implements AbstractTracerContext {
      */
     @Override
     public void continued(ContextSnapshot snapshot) {
-        TraceSegmentRef segmentRef = new TraceSegmentRef(snapshot);
-        this.segment.ref(segmentRef);
-        this.activeSpan().ref(segmentRef);
-        this.segment.relatedGlobalTraces(snapshot.getDistributedTraceId());
-        this.correlationContext.continued(snapshot);
+        if (snapshot.isValid()) {
+            TraceSegmentRef segmentRef = new TraceSegmentRef(snapshot);
+            this.segment.ref(segmentRef);
+            this.activeSpan().ref(segmentRef);
+            this.segment.relatedGlobalTraces(snapshot.getTraceId());
+            this.correlationContext.continued(snapshot);
+        }
     }
 
     /**
      * @return the first global trace id.
      */
     @Override
-    public String getReadableGlobalTraceId() {
-        return segment.getRelatedGlobalTraces().get(0).toString();
+    public String getReadablePrimaryTraceId() {
+        return getPrimaryTraceId().getId();
+    }
+
+    private DistributedTraceId getPrimaryTraceId() {
+        return segment.getRelatedGlobalTraces().get(0);
     }
 
     /**
@@ -363,17 +327,10 @@ public class TracingContext implements AbstractTracerContext {
             if (StringUtil.isEmpty(remotePeer)) {
                 exitSpan = new ExitSpan(spanIdGenerator++, parentSpanId, operationName, owner);
             } else {
-                exitSpan = (AbstractSpan) DictionaryManager.findNetworkAddressSection()
-                                                           .find(remotePeer)
-                                                           .doInCondition(
-                                                               peerId -> new ExitSpan(spanIdGenerator++, parentSpanId,
-                                                                                      operationName, peerId, owner
-                                                               ), () -> {
-                                                                   return new ExitSpan(
-                                                                       spanIdGenerator++, parentSpanId, operationName,
-                                                                       remotePeer, owner
-                                                                   );
-                                                               });
+                exitSpan = new ExitSpan(
+                    spanIdGenerator++, parentSpanId, operationName,
+                    remotePeer, owner
+                );
             }
             push(exitSpan);
         }
@@ -492,15 +449,6 @@ public class TracingContext implements AbstractTracerContext {
                     }
                 }
 
-                /*
-                 * Check that the segment is created after the agent (re-)registered to backend,
-                 * otherwise the segment may be created when the agent is still rebooting and should
-                 * be ignored
-                 */
-                if (segment.createTime() < RemoteDownstreamConfig.Agent.INSTANCE_REGISTERED_TIME) {
-                    finishedSegment.setIgnore(true);
-                }
-
                 TracingContext.ListenerManager.notifyFinish(finishedSegment);
 
                 running = false;
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/DistributedTraceId.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/DistributedTraceId.java
index 7fd60ab..9281890 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/DistributedTraceId.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/DistributedTraceId.java
@@ -18,8 +18,10 @@
 
 package org.apache.skywalking.apm.agent.core.context.ids;
 
-import java.util.Objects;
-import org.apache.skywalking.apm.network.language.agent.UniqueId;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.ToString;
 
 /**
  * The <code>DistributedTraceId</code> presents a distributed call chain.
@@ -32,51 +34,10 @@ import org.apache.skywalking.apm.network.language.agent.UniqueId;
  * The <code>DistributedTraceId</code> contains only one string, and can NOT be reset, creating a new instance is the
  * only option.
  */
+@RequiredArgsConstructor
+@ToString
+@EqualsAndHashCode
 public abstract class DistributedTraceId {
-    private ID id;
-
-    public DistributedTraceId(ID id) {
-        this.id = id;
-    }
-
-    public DistributedTraceId(String id) {
-        this.id = new ID(id);
-    }
-
-    public String encode() {
-        return id.encode();
-    }
-
-    @Override
-    public String toString() {
-        return id.toString();
-    }
-
-    public UniqueId toUniqueId() {
-        return id.transform();
-    }
-
-    /**
-     * Compare the two <code>DistributedTraceId</code> by its {@link #id}, even these two
-     * <code>DistributedTraceId</code>s are not the same instances.
-     *
-     * @param o target <code>DistributedTraceId</code>
-     * @return return if they have the same {@link #id}
-     */
-    @Override
-    public boolean equals(Object o) {
-        if (this == o)
-            return true;
-        if (o == null || getClass() != o.getClass())
-            return false;
-
-        DistributedTraceId id1 = (DistributedTraceId) o;
-
-        return Objects.equals(id, id1.id);
-    }
-
-    @Override
-    public int hashCode() {
-        return id != null ? id.hashCode() : 0;
-    }
+    @Getter
+    private final String id;
 }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/GlobalIdGenerator.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/GlobalIdGenerator.java
index c92d525..21a85b0 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/GlobalIdGenerator.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/GlobalIdGenerator.java
@@ -19,10 +19,11 @@
 package org.apache.skywalking.apm.agent.core.context.ids;
 
 import java.util.Random;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
+import java.util.UUID;
+import org.apache.skywalking.apm.util.StringUtil;
 
 public final class GlobalIdGenerator {
+    private static final String PROCESS_ID = UUID.randomUUID().toString().replaceAll("-", "");
     private static final ThreadLocal<IDContext> THREAD_ID_SEQUENCE = ThreadLocal.withInitial(
         () -> new IDContext(System.currentTimeMillis(), (short) 0));
 
@@ -30,32 +31,23 @@ public final class GlobalIdGenerator {
     }
 
     /**
-     * Generate a new id, combined by three long numbers.
+     * Generate a new id, combined by three parts.
      * <p>
-     * The first one represents application instance id. (most likely just an integer value, would be helpful in
-     * protobuf)
+     * The first one represents application instance id.
      * <p>
-     * The second one represents thread id. (most likely just an integer value, would be helpful in protobuf)
+     * The second one represents thread id.
      * <p>
      * The third one also has two parts, 1) a timestamp, measured in milliseconds 2) a seq, in current thread, between
      * 0(included) and 9999(included)
-     * <p>
-     * Notice, a long costs 8 bytes, three longs cost 24 bytes. And at the same time, a char costs 2 bytes. So
-     * sky-walking's old global and segment id like this: "S.1490097253214.-866187727.57515.1.1" which costs at least 72
-     * bytes.
      *
-     * @return an array contains three long numbers, which represents a unique id.
+     * @return unique id to represent a trace or segment
      */
-    public static ID generate() {
-        if (RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID == DictionaryUtil.nullValue()) {
-            throw new IllegalStateException();
-        }
-        IDContext context = THREAD_ID_SEQUENCE.get();
-
-        return new ID(
-            RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID,
-            Thread.currentThread().getId(),
-            context.nextSeq()
+    public static String generate() {
+        return StringUtil.join(
+            '.',
+            PROCESS_ID,
+            String.valueOf(Thread.currentThread().getId()),
+            String.valueOf(THREAD_ID_SEQUENCE.get().nextSeq())
         );
     }
 
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/ID.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/ID.java
deleted file mode 100644
index f1b45e4..0000000
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/ID.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.apm.agent.core.context.ids;
-
-import org.apache.skywalking.apm.network.language.agent.UniqueId;
-
-public class ID {
-    private long part1;
-    private long part2;
-    private long part3;
-    private String encoding;
-    private boolean isValid;
-
-    public ID(long part1, long part2, long part3) {
-        this.part1 = part1;
-        this.part2 = part2;
-        this.part3 = part3;
-        this.encoding = null;
-        this.isValid = true;
-    }
-
-    public ID(String encodingString) {
-        String[] idParts = encodingString.split("\\.", 3);
-        this.isValid = true;
-        for (int part = 0; part < 3; part++) {
-            try {
-                if (part == 0) {
-                    part1 = Long.parseLong(idParts[part]);
-                } else if (part == 1) {
-                    part2 = Long.parseLong(idParts[part]);
-                } else {
-                    part3 = Long.parseLong(idParts[part]);
-                }
-            } catch (NumberFormatException e) {
-                this.isValid = false;
-                break;
-            }
-
-        }
-    }
-
-    public String encode() {
-        if (encoding == null) {
-            encoding = toString();
-        }
-        return encoding;
-    }
-
-    @Override
-    public String toString() {
-        return part1 + "." + part2 + '.' + part3;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o)
-            return true;
-        if (o == null || getClass() != o.getClass())
-            return false;
-
-        ID id = (ID) o;
-
-        if (part1 != id.part1)
-            return false;
-        if (part2 != id.part2)
-            return false;
-        return part3 == id.part3;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (int) (part1 ^ (part1 >>> 32));
-        result = 31 * result + (int) (part2 ^ (part2 >>> 32));
-        result = 31 * result + (int) (part3 ^ (part3 >>> 32));
-        return result;
-    }
-
-    public boolean isValid() {
-        return isValid;
-    }
-
-    public UniqueId transform() {
-        return UniqueId.newBuilder().addIdParts(part1).addIdParts(part2).addIdParts(part3).build();
-    }
-}
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java
index de593de..eeba721 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java
@@ -30,8 +30,8 @@ import org.apache.skywalking.apm.agent.core.context.util.KeyValuePair;
 import org.apache.skywalking.apm.agent.core.context.util.TagValuePair;
 import org.apache.skywalking.apm.agent.core.context.util.ThrowableTransformer;
 import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
-import org.apache.skywalking.apm.network.language.agent.SpanType;
-import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2;
+import org.apache.skywalking.apm.network.language.agent.v3.SpanObject;
+import org.apache.skywalking.apm.network.language.agent.v3.SpanType;
 import org.apache.skywalking.apm.network.trace.component.Component;
 
 /**
@@ -251,8 +251,8 @@ public abstract class AbstractTracingSpan implements AbstractSpan {
         return this;
     }
 
-    public SpanObjectV2.Builder transform() {
-        SpanObjectV2.Builder spanBuilder = SpanObjectV2.newBuilder();
+    public SpanObject.Builder transform() {
+        SpanObject.Builder spanBuilder = SpanObject.newBuilder();
 
         spanBuilder.setSpanId(this.spanId);
         spanBuilder.setParentSpanId(parentSpanId);
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitSpan.java
index d872a06..e1d64ec 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitSpan.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitSpan.java
@@ -39,10 +39,6 @@ public class ExitSpan extends StackBasedTracingSpan implements ExitTypeSpan {
         super(spanId, parentSpanId, operationName, peer, owner);
     }
 
-    public ExitSpan(int spanId, int parentSpanId, String operationName, int peerId, TracingContext owner) {
-        super(spanId, parentSpanId, operationName, peerId, owner);
-    }
-
     public ExitSpan(int spanId, int parentSpanId, String operationName, TracingContext owner) {
         super(spanId, parentSpanId, operationName, owner);
     }
@@ -119,11 +115,6 @@ public class ExitSpan extends StackBasedTracingSpan implements ExitTypeSpan {
     }
 
     @Override
-    public int getPeerId() {
-        return peerId;
-    }
-
-    @Override
     public String getPeer() {
         return peer;
     }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitTypeSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitTypeSpan.java
index 8f4f580..0ec4bfb 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitTypeSpan.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitTypeSpan.java
@@ -24,8 +24,6 @@ import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
  * The exit span has some additional behaviours
  */
 public interface ExitTypeSpan {
-    int getPeerId();
-
     String getPeer();
 
     ExitTypeSpan inject(ContextCarrier carrier);
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/LogDataEntity.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/LogDataEntity.java
index ee6580c..84b3b2e 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/LogDataEntity.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/LogDataEntity.java
@@ -22,7 +22,7 @@ import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import org.apache.skywalking.apm.agent.core.context.util.KeyValuePair;
-import org.apache.skywalking.apm.network.language.agent.v2.Log;
+import org.apache.skywalking.apm.network.language.agent.v3.Log;
 
 /**
  * The <code>LogDataEntity</code> represents a collection of {@link KeyValuePair}, contains several fields of a logging
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopExitSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopExitSpan.java
index 6adce3e..e7c33d0 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopExitSpan.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopExitSpan.java
@@ -21,24 +21,13 @@ package org.apache.skywalking.apm.agent.core.context.trace;
 import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
 
 public class NoopExitSpan extends NoopSpan implements ExitTypeSpan {
-
     private String peer;
-    private int peerId;
-
-    public NoopExitSpan(int peerId) {
-        this.peerId = peerId;
-    }
 
     public NoopExitSpan(String peer) {
         this.peer = peer;
     }
 
     @Override
-    public int getPeerId() {
-        return peerId;
-    }
-
-    @Override
     public String getPeer() {
         return peer;
     }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/StackBasedTracingSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/StackBasedTracingSpan.java
index 55a0c77..613c34d 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/StackBasedTracingSpan.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/StackBasedTracingSpan.java
@@ -19,9 +19,8 @@
 package org.apache.skywalking.apm.agent.core.context.trace;
 
 import org.apache.skywalking.apm.agent.core.context.TracingContext;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryManager;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
-import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2;
+import org.apache.skywalking.apm.network.language.agent.v3.SpanObject;
+import org.apache.skywalking.apm.util.StringUtil;
 
 /**
  * The <code>StackBasedTracingSpan</code> represents a span with an inside stack construction.
@@ -31,38 +30,24 @@ import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2;
 public abstract class StackBasedTracingSpan extends AbstractTracingSpan {
     protected int stackDepth;
     protected String peer;
-    protected int peerId;
 
     protected StackBasedTracingSpan(int spanId, int parentSpanId, String operationName, TracingContext owner) {
         super(spanId, parentSpanId, operationName, owner);
         this.stackDepth = 0;
         this.peer = null;
-        this.peerId = DictionaryUtil.nullValue();
     }
 
     protected StackBasedTracingSpan(int spanId, int parentSpanId, String operationName, String peer,
                                     TracingContext owner) {
         super(spanId, parentSpanId, operationName, owner);
         this.peer = peer;
-        this.peerId = DictionaryUtil.nullValue();
-    }
-
-    protected StackBasedTracingSpan(int spanId, int parentSpanId, String operationName, int peerId,
-                                    TracingContext owner) {
-        super(spanId, parentSpanId, operationName, owner);
-        this.peer = null;
-        this.peerId = peerId;
     }
 
     @Override
-    public SpanObjectV2.Builder transform() {
-        SpanObjectV2.Builder spanBuilder = super.transform();
-        if (peerId != DictionaryUtil.nullValue()) {
-            spanBuilder.setPeerId(peerId);
-        } else {
-            if (peer != null) {
-                spanBuilder.setPeer(peer);
-            }
+    public SpanObject.Builder transform() {
+        SpanObject.Builder spanBuilder = super.transform();
+        if (StringUtil.isNotEmpty(peer)) {
+            spanBuilder.setPeer(peer);
         }
         return spanBuilder;
     }
@@ -78,11 +63,7 @@ public abstract class StackBasedTracingSpan extends AbstractTracingSpan {
 
     @Override
     public AbstractSpan setPeer(final String remotePeer) {
-        DictionaryManager.findNetworkAddressSection().find(remotePeer).doInCondition(
-            remotePeerId -> peerId = remotePeerId, () -> {
-                peer = remotePeer;
-            }
-        );
+        this.peer = remotePeer;
         return this;
     }
 }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegment.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegment.java
index 1244500..b9b8f04 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegment.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegment.java
@@ -20,14 +20,12 @@ package org.apache.skywalking.apm.agent.core.context.trace;
 
 import java.util.LinkedList;
 import java.util.List;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
+import org.apache.skywalking.apm.agent.core.conf.Config;
 import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId;
 import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceIds;
 import org.apache.skywalking.apm.agent.core.context.ids.GlobalIdGenerator;
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
 import org.apache.skywalking.apm.agent.core.context.ids.NewDistributedTraceId;
-import org.apache.skywalking.apm.network.language.agent.UpstreamSegment;
-import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject;
+import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
 
 /**
  * {@link TraceSegment} is a segment or fragment of the distributed trace. See https://github.com/opentracing/specification/blob/master/specification.md#the-opentracing-data-model
@@ -38,7 +36,7 @@ public class TraceSegment {
     /**
      * The id of this trace segment. Every segment has its unique-global-id.
      */
-    private ID traceSegmentId;
+    private String traceSegmentId;
 
     /**
      * The refs of parent trace segments, except the primary one. For most RPC call, {@link #refs} contains only one
@@ -119,14 +117,10 @@ public class TraceSegment {
         return this;
     }
 
-    public ID getTraceSegmentId() {
+    public String getTraceSegmentId() {
         return traceSegmentId;
     }
 
-    public int getServiceId() {
-        return RemoteDownstreamConfig.Agent.SERVICE_ID;
-    }
-
     public boolean hasRef() {
         return !(refs == null || refs.size() == 0);
     }
@@ -156,28 +150,24 @@ public class TraceSegment {
      *
      * @return the segment as GRPC service parameter
      */
-    public UpstreamSegment transform() {
-        UpstreamSegment.Builder upstreamBuilder = UpstreamSegment.newBuilder();
-        for (DistributedTraceId distributedTraceId : getRelatedGlobalTraces()) {
-            upstreamBuilder = upstreamBuilder.addGlobalTraceIds(distributedTraceId.toUniqueId());
-        }
+    public SegmentObject transform() {
         SegmentObject.Builder traceSegmentBuilder = SegmentObject.newBuilder();
+        traceSegmentBuilder.setTraceId(getRelatedGlobalTraces().get(0).getId());
         /*
          * Trace Segment
          */
-        traceSegmentBuilder.setTraceSegmentId(this.traceSegmentId.transform());
+        traceSegmentBuilder.setTraceSegmentId(this.traceSegmentId);
         // Don't serialize TraceSegmentReference
 
         // SpanObject
         for (AbstractTracingSpan span : this.spans) {
             traceSegmentBuilder.addSpans(span.transform());
         }
-        traceSegmentBuilder.setServiceId(RemoteDownstreamConfig.Agent.SERVICE_ID);
-        traceSegmentBuilder.setServiceInstanceId(RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID);
+        traceSegmentBuilder.setService(Config.Agent.SERVICE_NAME);
+        traceSegmentBuilder.setServiceInstance(Config.Agent.INSTANCE_NAME);
         traceSegmentBuilder.setIsSizeLimited(this.isSizeLimited);
 
-        upstreamBuilder.setSegment(traceSegmentBuilder.build().toByteString());
-        return upstreamBuilder.build();
+        return traceSegmentBuilder.build();
     }
 
     @Override
@@ -185,10 +175,6 @@ public class TraceSegment {
         return "TraceSegment{" + "traceSegmentId='" + traceSegmentId + '\'' + ", refs=" + refs + ", spans=" + spans + ", relatedGlobalTraces=" + relatedGlobalTraces + '}';
     }
 
-    public int getApplicationInstanceId() {
-        return RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID;
-    }
-
     public long createTime() {
         return this.createTime;
     }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java
index 384d793..688dca1 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java
@@ -18,39 +18,28 @@
 
 package org.apache.skywalking.apm.agent.core.context.trace;
 
-import org.apache.skywalking.apm.agent.core.conf.Constants;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
+import lombok.Getter;
+import org.apache.skywalking.apm.agent.core.conf.Config;
 import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
 import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
-import org.apache.skywalking.apm.network.language.agent.RefType;
-import org.apache.skywalking.apm.network.language.agent.v2.SegmentReference;
-import org.apache.skywalking.apm.util.StringUtil;
+import org.apache.skywalking.apm.network.language.agent.v3.RefType;
+import org.apache.skywalking.apm.network.language.agent.v3.SegmentReference;
 
 /**
  * {@link TraceSegmentRef} is like a pointer, which ref to another {@link TraceSegment}, use {@link #spanId} point to
  * the exact span of the ref {@link TraceSegment}.
  * <p>
  */
+@Getter
 public class TraceSegmentRef {
     private SegmentRefType type;
-
-    private ID traceSegmentId;
-
+    private String traceId;
+    private String traceSegmentId;
     private int spanId;
-
-    private int peerId = DictionaryUtil.nullValue();
-
-    private String peerHost;
-
-    private int entryServiceInstanceId;
-
-    private int parentServiceInstanceId;
-
-    private String entryEndpointName = Constants.EMPTY_STRING;
-
-    private String parentEndpointName = Constants.EMPTY_STRING;
+    private String parentService;
+    private String parentServiceInstance;
+    private String parentEndpoint;
+    private String addressUsedAtClient;
 
     /**
      * Transform a {@link ContextCarrier} to the <code>TraceSegmentRef</code>
@@ -59,77 +48,41 @@ public class TraceSegmentRef {
      */
     public TraceSegmentRef(ContextCarrier carrier) {
         this.type = SegmentRefType.CROSS_PROCESS;
+        this.traceId = carrier.getTraceId();
         this.traceSegmentId = carrier.getTraceSegmentId();
         this.spanId = carrier.getSpanId();
-        this.parentServiceInstanceId = carrier.getParentServiceInstanceId();
-        this.entryServiceInstanceId = carrier.getEntryServiceInstanceId();
-        String host = carrier.getPeerHost();
-        if (host.charAt(0) == '#') {
-            this.peerHost = host.substring(1);
-        } else {
-            this.peerId = Integer.parseInt(host);
-        }
-        String entryOperationName = carrier.getEntryEndpointName();
-        if (!StringUtil.isEmpty(entryOperationName)) {
-            if (entryOperationName.charAt(0) == '#') {
-                this.entryEndpointName = entryOperationName.substring(1);
-            }
-        }
-        String parentOperationName = carrier.getParentEndpointName();
-        if (!StringUtil.isEmpty(parentOperationName)) {
-            if (parentOperationName.charAt(0) == '#') {
-                this.parentEndpointName = parentOperationName.substring(1);
-            }
-        }
+        this.parentService = carrier.getParentService();
+        this.parentServiceInstance = carrier.getParentServiceInstance();
+        this.parentEndpoint = carrier.getParentEndpoint();
+        this.addressUsedAtClient = carrier.getAddressUsedAtClient();
     }
 
     public TraceSegmentRef(ContextSnapshot snapshot) {
         this.type = SegmentRefType.CROSS_THREAD;
+        this.traceId = snapshot.getTraceId().getId();
         this.traceSegmentId = snapshot.getTraceSegmentId();
         this.spanId = snapshot.getSpanId();
-        this.parentServiceInstanceId = RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID;
-        this.entryServiceInstanceId = snapshot.getEntryApplicationInstanceId();
-        String entryOperationName = snapshot.getEntryOperationName();
-        if (!StringUtil.isEmpty(entryOperationName)) {
-            if (entryOperationName.charAt(0) == '#') {
-                this.entryEndpointName = entryOperationName.substring(1);
-            }
-        }
-        String parentOperationName = snapshot.getParentOperationName();
-        if (!StringUtil.isEmpty(parentOperationName)) {
-            if (parentOperationName.charAt(0) == '#') {
-                this.parentEndpointName = parentOperationName.substring(1);
-            }
-        }
-    }
-
-    public String getEntryEndpointName() {
-        return entryEndpointName;
-    }
-
-    public int getEntryServiceInstanceId() {
-        return entryServiceInstanceId;
+        this.parentService = Config.Agent.SERVICE_NAME;
+        this.parentServiceInstance = Config.Agent.INSTANCE_NAME;
+        this.parentEndpoint = snapshot.getParentEndpoint();
     }
 
     public SegmentReference transform() {
         SegmentReference.Builder refBuilder = SegmentReference.newBuilder();
         if (SegmentRefType.CROSS_PROCESS.equals(type)) {
             refBuilder.setRefType(RefType.CrossProcess);
-            if (peerId == DictionaryUtil.nullValue()) {
-                refBuilder.setNetworkAddress(peerHost);
-            } else {
-                refBuilder.setNetworkAddressId(peerId);
-            }
         } else {
             refBuilder.setRefType(RefType.CrossThread);
         }
-
-        refBuilder.setParentServiceInstanceId(parentServiceInstanceId);
-        refBuilder.setEntryServiceInstanceId(entryServiceInstanceId);
-        refBuilder.setParentTraceSegmentId(traceSegmentId.transform());
+        refBuilder.setTraceId(traceId);
+        refBuilder.setParentTraceSegmentId(traceSegmentId);
         refBuilder.setParentSpanId(spanId);
-        refBuilder.setEntryEndpoint(entryEndpointName);
-        refBuilder.setParentEndpoint(parentEndpointName);
+        refBuilder.setParentService(parentService);
+        refBuilder.setParentServiceInstance(parentServiceInstance);
+        refBuilder.setParentEndpoint(parentEndpoint);
+        if (addressUsedAtClient != null) {
+            refBuilder.setNetworkAddressUsedAtPeer(addressUsedAtClient);
+        }
 
         return refBuilder.build();
     }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/NetworkAddressDictionary.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/NetworkAddressDictionary.java
deleted file mode 100755
index ac30860..0000000
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/NetworkAddressDictionary.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.apm.agent.core.dictionary;
-
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import org.apache.skywalking.apm.network.common.KeyIntValuePair;
-import org.apache.skywalking.apm.network.register.v2.NetAddressMapping;
-import org.apache.skywalking.apm.network.register.v2.NetAddresses;
-import org.apache.skywalking.apm.network.register.v2.RegisterGrpc;
-
-import static org.apache.skywalking.apm.agent.core.conf.Config.Dictionary.NETWORK_ADDRESS_BUFFER_SIZE;
-
-/**
- * Map of network address id to network literal address, which is from the collector side.
- */
-public enum NetworkAddressDictionary {
-    INSTANCE;
-    private Map<String, Integer> serviceDictionary = new ConcurrentHashMap<>();
-    private Set<String> unRegisterServices = ConcurrentHashMap.newKeySet();
-
-    public PossibleFound find(String networkAddress) {
-        Integer applicationId = serviceDictionary.get(networkAddress);
-        if (applicationId != null) {
-            return new Found(applicationId);
-        } else {
-            if (serviceDictionary.size() + unRegisterServices.size() < NETWORK_ADDRESS_BUFFER_SIZE) {
-                unRegisterServices.add(networkAddress);
-            }
-            return new NotFound();
-        }
-    }
-
-    public void syncRemoteDictionary(RegisterGrpc.RegisterBlockingStub networkAddressRegisterServiceBlockingStub) {
-        if (unRegisterServices.size() > 0) {
-            NetAddressMapping networkAddressMappings = networkAddressRegisterServiceBlockingStub
-                .doNetworkAddressRegister(NetAddresses.newBuilder()
-                                                      .addAllAddresses(unRegisterServices)
-                                                      .build());
-            if (networkAddressMappings.getAddressIdsCount() > 0) {
-                for (KeyIntValuePair keyWithIntegerValue : networkAddressMappings.getAddressIdsList()) {
-                    unRegisterServices.remove(keyWithIntegerValue.getKey());
-                    serviceDictionary.put(keyWithIntegerValue.getKey(), keyWithIntegerValue.getValue());
-                }
-            }
-        }
-    }
-
-    public void clear() {
-        this.serviceDictionary.clear();
-    }
-}
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/JVMService.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/JVMService.java
index 6945898..9be8835 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/JVMService.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/JVMService.java
@@ -30,8 +30,6 @@ import org.apache.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory;
 import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
 import org.apache.skywalking.apm.agent.core.commands.CommandService;
 import org.apache.skywalking.apm.agent.core.conf.Config;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
 import org.apache.skywalking.apm.agent.core.jvm.cpu.CPUProvider;
 import org.apache.skywalking.apm.agent.core.jvm.gc.GCProvider;
 import org.apache.skywalking.apm.agent.core.jvm.memory.MemoryProvider;
@@ -42,9 +40,9 @@ import org.apache.skywalking.apm.agent.core.remote.GRPCChannelListener;
 import org.apache.skywalking.apm.agent.core.remote.GRPCChannelManager;
 import org.apache.skywalking.apm.agent.core.remote.GRPCChannelStatus;
 import org.apache.skywalking.apm.network.common.Commands;
-import org.apache.skywalking.apm.network.language.agent.JVMMetric;
-import org.apache.skywalking.apm.network.language.agent.v2.JVMMetricCollection;
-import org.apache.skywalking.apm.network.language.agent.v2.JVMMetricReportServiceGrpc;
+import org.apache.skywalking.apm.network.language.agent.v3.JVMMetric;
+import org.apache.skywalking.apm.network.language.agent.v3.JVMMetricCollection;
+import org.apache.skywalking.apm.network.language.agent.v3.JVMMetricReportServiceGrpc;
 import org.apache.skywalking.apm.util.RunnableWithExceptionProtection;
 
 import static org.apache.skywalking.apm.agent.core.conf.Config.Collector.GRPC_UPSTREAM_TIMEOUT;
@@ -70,20 +68,36 @@ public class JVMService implements BootService, Runnable {
 
     @Override
     public void boot() throws Throwable {
-        collectMetricFuture = Executors.newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("JVMService-produce"))
-                                       .scheduleAtFixedRate(new RunnableWithExceptionProtection(this, new RunnableWithExceptionProtection.CallbackWhenException() {
-                                           @Override
-                                           public void handle(Throwable t) {
-                                               logger.error("JVMService produces metrics failure.", t);
+        collectMetricFuture = Executors.newSingleThreadScheduledExecutor(
+            new DefaultNamedThreadFactory("JVMService-produce"))
+                                       .scheduleAtFixedRate(new RunnableWithExceptionProtection(
+                                           this,
+                                           new RunnableWithExceptionProtection.CallbackWhenException() {
+                                               @Override
+                                               public void handle(
+                                                   Throwable t) {
+                                                   logger.error(
+                                                       "JVMService produces metrics failure.",
+                                                       t
+                                                   );
+                                               }
                                            }
-                                       }), 0, 1, TimeUnit.SECONDS);
-        sendMetricFuture = Executors.newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("JVMService-consume"))
-                                    .scheduleAtFixedRate(new RunnableWithExceptionProtection(sender, new RunnableWithExceptionProtection.CallbackWhenException() {
-                                        @Override
-                                        public void handle(Throwable t) {
-                                            logger.error("JVMService consumes and upload failure.", t);
+                                       ), 0, 1, TimeUnit.SECONDS);
+        sendMetricFuture = Executors.newSingleThreadScheduledExecutor(
+            new DefaultNamedThreadFactory("JVMService-consume"))
+                                    .scheduleAtFixedRate(new RunnableWithExceptionProtection(
+                                        sender,
+                                        new RunnableWithExceptionProtection.CallbackWhenException() {
+                                            @Override
+                                            public void handle(
+                                                Throwable t) {
+                                                logger.error(
+                                                    "JVMService consumes and upload failure.",
+                                                    t
+                                                );
+                                            }
                                         }
-                                    }), 0, 1, TimeUnit.SECONDS);
+                                    ), 0, 1, TimeUnit.SECONDS);
     }
 
     @Override
@@ -99,26 +113,24 @@ public class JVMService implements BootService, Runnable {
 
     @Override
     public void run() {
-        if (RemoteDownstreamConfig.Agent.SERVICE_ID != DictionaryUtil.nullValue() && RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID != DictionaryUtil
-            .nullValue()) {
-            long currentTimeMillis = System.currentTimeMillis();
-            try {
-                JVMMetric.Builder jvmBuilder = JVMMetric.newBuilder();
-                jvmBuilder.setTime(currentTimeMillis);
-                jvmBuilder.setCpu(CPUProvider.INSTANCE.getCpuMetric());
-                jvmBuilder.addAllMemory(MemoryProvider.INSTANCE.getMemoryMetricList());
-                jvmBuilder.addAllMemoryPool(MemoryPoolProvider.INSTANCE.getMemoryPoolMetricsList());
-                jvmBuilder.addAllGc(GCProvider.INSTANCE.getGCList());
-
-                JVMMetric jvmMetric = jvmBuilder.build();
-                if (!queue.offer(jvmMetric)) {
-                    queue.poll();
-                    queue.offer(jvmMetric);
-                }
-            } catch (Exception e) {
-                logger.error(e, "Collect JVM info fail.");
+        long currentTimeMillis = System.currentTimeMillis();
+        try {
+            JVMMetric.Builder jvmBuilder = JVMMetric.newBuilder();
+            jvmBuilder.setTime(currentTimeMillis);
+            jvmBuilder.setCpu(CPUProvider.INSTANCE.getCpuMetric());
+            jvmBuilder.addAllMemory(MemoryProvider.INSTANCE.getMemoryMetricList());
+            jvmBuilder.addAllMemoryPool(MemoryPoolProvider.INSTANCE.getMemoryPoolMetricsList());
+            jvmBuilder.addAllGc(GCProvider.INSTANCE.getGCList());
+
+            JVMMetric jvmMetric = jvmBuilder.build();
+            if (!queue.offer(jvmMetric)) {
+                queue.poll();
+                queue.offer(jvmMetric);
             }
+        } catch (Exception e) {
+            logger.error(e, "Collect JVM info fail.");
         }
+
     }
 
     private class Sender implements Runnable, GRPCChannelListener {
@@ -127,23 +139,22 @@ public class JVMService implements BootService, Runnable {
 
         @Override
         public void run() {
-            if (RemoteDownstreamConfig.Agent.SERVICE_ID != DictionaryUtil.nullValue() && RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID != DictionaryUtil
-                .nullValue()) {
-                if (status == GRPCChannelStatus.CONNECTED) {
-                    try {
-                        JVMMetricCollection.Builder builder = JVMMetricCollection.newBuilder();
-                        LinkedList<JVMMetric> buffer = new LinkedList<JVMMetric>();
-                        queue.drainTo(buffer);
-                        if (buffer.size() > 0) {
-                            builder.addAllMetrics(buffer);
-                            builder.setServiceInstanceId(RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID);
-                            Commands commands = stub.withDeadlineAfter(GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS)
-                                                    .collect(builder.build());
-                            ServiceManager.INSTANCE.findService(CommandService.class).receiveCommand(commands);
-                        }
-                    } catch (Throwable t) {
-                        logger.error(t, "send JVM metrics to Collector fail.");
+
+            if (status == GRPCChannelStatus.CONNECTED) {
+                try {
+                    JVMMetricCollection.Builder builder = JVMMetricCollection.newBuilder();
+                    LinkedList<JVMMetric> buffer = new LinkedList<JVMMetric>();
+                    queue.drainTo(buffer);
+                    if (buffer.size() > 0) {
+                        builder.addAllMetrics(buffer);
+                        builder.setService(Config.Agent.SERVICE_NAME);
+                        builder.setServiceInstance(Config.Agent.INSTANCE_NAME);
+                        Commands commands = stub.withDeadlineAfter(GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS)
+                                                .collect(builder.build());
+                        ServiceManager.INSTANCE.findService(CommandService.class).receiveCommand(commands);
                     }
+                } catch (Throwable t) {
+                    logger.error(t, "send JVM metrics to Collector fail.");
                 }
             }
         }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCMetricAccessor.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCMetricAccessor.java
index 9193d64..dfc3ca7 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCMetricAccessor.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCMetricAccessor.java
@@ -19,7 +19,7 @@
 package org.apache.skywalking.apm.agent.core.jvm.gc;
 
 import java.util.List;
-import org.apache.skywalking.apm.network.language.agent.GC;
+import org.apache.skywalking.apm.network.language.agent.v3.GC;
 
 public interface GCMetricAccessor {
     List<GC> getGCList();
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCModule.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCModule.java
index 42fe534..a4cd667 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCModule.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCModule.java
@@ -21,8 +21,8 @@ package org.apache.skywalking.apm.agent.core.jvm.gc;
 import java.lang.management.GarbageCollectorMXBean;
 import java.util.LinkedList;
 import java.util.List;
-import org.apache.skywalking.apm.network.language.agent.GC;
-import org.apache.skywalking.apm.network.language.agent.GCPhrase;
+import org.apache.skywalking.apm.network.language.agent.v3.GC;
+import org.apache.skywalking.apm.network.language.agent.v3.GCPhrase;
 
 public abstract class GCModule implements GCMetricAccessor {
     private List<GarbageCollectorMXBean> beans;
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCProvider.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCProvider.java
index 1d7d7ab..1b3391f 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCProvider.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCProvider.java
@@ -21,7 +21,7 @@ package org.apache.skywalking.apm.agent.core.jvm.gc;
 import java.lang.management.GarbageCollectorMXBean;
 import java.lang.management.ManagementFactory;
 import java.util.List;
-import org.apache.skywalking.apm.network.language.agent.GC;
+import org.apache.skywalking.apm.network.language.agent.v3.GC;
 
 public enum GCProvider {
     INSTANCE;
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/UnknowGC.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/UnknowGC.java
index 25b5adf..f7c617e 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/UnknowGC.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/UnknowGC.java
@@ -20,8 +20,8 @@ package org.apache.skywalking.apm.agent.core.jvm.gc;
 
 import java.util.LinkedList;
 import java.util.List;
-import org.apache.skywalking.apm.network.language.agent.GC;
-import org.apache.skywalking.apm.network.language.agent.GCPhrase;
+import org.apache.skywalking.apm.network.language.agent.v3.GC;
+import org.apache.skywalking.apm.network.language.agent.v3.GCPhrase;
 
 public class UnknowGC implements GCMetricAccessor {
     @Override
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memory/MemoryProvider.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memory/MemoryProvider.java
index 7c73d62..71f9980 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memory/MemoryProvider.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memory/MemoryProvider.java
@@ -23,7 +23,7 @@ import java.lang.management.MemoryMXBean;
 import java.lang.management.MemoryUsage;
 import java.util.LinkedList;
 import java.util.List;
-import org.apache.skywalking.apm.network.language.agent.Memory;
+import org.apache.skywalking.apm.network.language.agent.v3.Memory;
 
 public enum MemoryProvider {
     INSTANCE;
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolMetricsAccessor.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolMetricsAccessor.java
index 562eecc..0eea9a1 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolMetricsAccessor.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolMetricsAccessor.java
@@ -19,7 +19,7 @@
 package org.apache.skywalking.apm.agent.core.jvm.memorypool;
 
 import java.util.List;
-import org.apache.skywalking.apm.network.language.agent.MemoryPool;
+import org.apache.skywalking.apm.network.language.agent.v3.MemoryPool;
 
 public interface MemoryPoolMetricsAccessor {
     List<MemoryPool> getMemoryPoolMetricsList();
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolModule.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolModule.java
index 839712b..850e2c0 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolModule.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolModule.java
@@ -22,8 +22,8 @@ import java.lang.management.MemoryPoolMXBean;
 import java.lang.management.MemoryUsage;
 import java.util.LinkedList;
 import java.util.List;
-import org.apache.skywalking.apm.network.language.agent.MemoryPool;
-import org.apache.skywalking.apm.network.language.agent.PoolType;
+import org.apache.skywalking.apm.network.language.agent.v3.MemoryPool;
+import org.apache.skywalking.apm.network.language.agent.v3.PoolType;
 
 public abstract class MemoryPoolModule implements MemoryPoolMetricsAccessor {
     private List<MemoryPoolMXBean> beans;
@@ -59,7 +59,7 @@ public abstract class MemoryPoolModule implements MemoryPoolMetricsAccessor {
                                    .setType(type)
                                    .setInit(usage.getInit())
                                    .setMax(usage.getMax())
-                                   .setCommited(usage.getCommitted())
+                                   .setCommitted(usage.getCommitted())
                                    .setUsed(usage.getUsed())
                                    .build());
         }
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolProvider.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolProvider.java
index d728652..8633c12 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolProvider.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolProvider.java
@@ -21,7 +21,7 @@ package org.apache.skywalking.apm.agent.core.jvm.memorypool;
 import java.lang.management.ManagementFactory;
 import java.lang.management.MemoryPoolMXBean;
 import java.util.List;
-import org.apache.skywalking.apm.network.language.agent.MemoryPool;
+import org.apache.skywalking.apm.network.language.agent.v3.MemoryPool;
 
 public enum MemoryPoolProvider {
     INSTANCE;
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/UnknownMemoryPool.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/UnknownMemoryPool.java
index 7519531..f7d414f 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/UnknownMemoryPool.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/UnknownMemoryPool.java
@@ -20,8 +20,8 @@ package org.apache.skywalking.apm.agent.core.jvm.memorypool;
 
 import java.util.LinkedList;
 import java.util.List;
-import org.apache.skywalking.apm.network.language.agent.MemoryPool;
-import org.apache.skywalking.apm.network.language.agent.PoolType;
+import org.apache.skywalking.apm.network.language.agent.v3.MemoryPool;
+import org.apache.skywalking.apm.network.language.agent.v3.PoolType;
 
 public class UnknownMemoryPool implements MemoryPoolMetricsAccessor {
     @Override
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java
index aad9f40..ee1cd10 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java
@@ -69,6 +69,8 @@ public class OSUtil {
                             String addressStr = address.getHostAddress();
                             if ("127.0.0.1".equals(addressStr)) {
                                 continue;
+                            } else if ("localhost".equals(addressStr)) {
+                                continue;
                             }
                             IPV4_LIST.add(addressStr);
                         }
@@ -81,6 +83,15 @@ public class OSUtil {
         return IPV4_LIST;
     }
 
+    public static String getIPV4() {
+        final List<String> allIPV4 = getAllIPV4();
+        if (allIPV4.size() > 0) {
+            return allIPV4.get(0);
+        } else {
+            return "no-hostname";
+        }
+    }
+
     public static int getProcessNo() {
         if (PROCESS_NO == 0) {
             try {
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskChannelService.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskChannelService.java
index 973dc0f..0690182 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskChannelService.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskChannelService.java
@@ -34,8 +34,6 @@ import org.apache.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory;
 import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
 import org.apache.skywalking.apm.agent.core.commands.CommandService;
 import org.apache.skywalking.apm.agent.core.conf.Config;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
 import org.apache.skywalking.apm.agent.core.logging.api.ILog;
 import org.apache.skywalking.apm.agent.core.logging.api.LogManager;
 import org.apache.skywalking.apm.agent.core.remote.GRPCChannelListener;
@@ -78,45 +76,41 @@ public class ProfileTaskChannelService implements BootService, Runnable, GRPCCha
 
     @Override
     public void run() {
-        if (RemoteDownstreamConfig.Agent.SERVICE_ID != DictionaryUtil.nullValue()
-            && RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID != DictionaryUtil.nullValue()) {
-            if (status == GRPCChannelStatus.CONNECTED) {
-                try {
-                    ProfileTaskCommandQuery.Builder builder = ProfileTaskCommandQuery.newBuilder();
+        if (status == GRPCChannelStatus.CONNECTED) {
+            try {
+                ProfileTaskCommandQuery.Builder builder = ProfileTaskCommandQuery.newBuilder();
 
-                    // sniffer info
-                    builder.setServiceId(RemoteDownstreamConfig.Agent.SERVICE_ID)
-                           .setInstanceId(RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID);
+                // sniffer info
+                builder.setService(Config.Agent.SERVICE_NAME)
+                       .setServiceInstance(Config.Agent.INSTANCE_NAME);
 
-                    // last command create time
-                    builder.setLastCommandTime(ServiceManager.INSTANCE.findService(ProfileTaskExecutionService.class)
-                                                                      .getLastCommandCreateTime());
+                // last command create time
+                builder.setLastCommandTime(ServiceManager.INSTANCE.findService(ProfileTaskExecutionService.class)
+                                                                  .getLastCommandCreateTime());
 
-                    Commands commands = profileTaskBlockingStub.withDeadlineAfter(GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS)
-                                                               .getProfileTaskCommands(builder.build());
+                Commands commands = profileTaskBlockingStub.withDeadlineAfter(GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS)
+                                                           .getProfileTaskCommands(builder.build());
 
-                    ServiceManager.INSTANCE.findService(CommandService.class).receiveCommand(commands);
-                } catch (Throwable t) {
-                    if (!(t instanceof StatusRuntimeException)) {
-                        logger.error(t, "Query profile task from backend fail.");
-                        return;
+                ServiceManager.INSTANCE.findService(CommandService.class).receiveCommand(commands);
+            } catch (Throwable t) {
+                if (!(t instanceof StatusRuntimeException)) {
+                    logger.error(t, "Query profile task from backend fail.");
+                    return;
+                }
+                final StatusRuntimeException statusRuntimeException = (StatusRuntimeException) t;
+                if (statusRuntimeException.getStatus().getCode() == Status.Code.UNIMPLEMENTED) {
+                    logger.warn("Backend doesn't support profiling, profiling will be disabled");
+                    if (getTaskListFuture != null) {
+                        getTaskListFuture.cancel(true);
                     }
-                    final StatusRuntimeException statusRuntimeException = (StatusRuntimeException) t;
-                    if (statusRuntimeException.getStatus().getCode() == Status.Code.UNIMPLEMENTED) {
-                        logger.warn("Backend doesn't support profiling, profiling will be disabled");
-                        if (getTaskListFuture != null) {
-                            getTaskListFuture.cancel(true);
-                        }
 
-                        // stop snapshot sender
-                        if (sendSnapshotFuture != null) {
-                            sendSnapshotFuture.cancel(true);
-                        }
+                    // stop snapshot sender
+                    if (sendSnapshotFuture != null) {
+                        sendSnapshotFuture.cancel(true);
                     }
                 }
             }
         }
-
     }
 
     @Override
@@ -190,8 +184,8 @@ public class ProfileTaskChannelService implements BootService, Runnable, GRPCCha
         try {
             final ProfileTaskFinishReport.Builder reportBuilder = ProfileTaskFinishReport.newBuilder();
             // sniffer info
-            reportBuilder.setServiceId(RemoteDownstreamConfig.Agent.SERVICE_ID)
-                         .setInstanceId(RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID);
+            reportBuilder.setService(Config.Agent.SERVICE_NAME)
+                         .setServiceInstance(Config.Agent.INSTANCE_NAME);
             // task info
             reportBuilder.setTaskId(task.getTaskId());
 
@@ -212,7 +206,8 @@ public class ProfileTaskChannelService implements BootService, Runnable, GRPCCha
         public void run() {
             if (status == GRPCChannelStatus.CONNECTED) {
                 try {
-                    ArrayList<TracingThreadSnapshot> buffer = new ArrayList<>(Config.Profile.SNAPSHOT_TRANSPORT_BUFFER_SIZE);
+                    ArrayList<TracingThreadSnapshot> buffer = new ArrayList<>(
+                        Config.Profile.SNAPSHOT_TRANSPORT_BUFFER_SIZE);
                     snapshotQueue.drainTo(buffer);
                     if (buffer.size() > 0) {
                         final GRPCStreamServiceStatus status = new GRPCStreamServiceStatus(false);
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskExecutionContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskExecutionContext.java
index d1f5caf..cf18ccb 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskExecutionContext.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskExecutionContext.java
@@ -18,15 +18,13 @@
 
 package org.apache.skywalking.apm.agent.core.profile;
 
-import org.apache.skywalking.apm.agent.core.conf.Config;
-import org.apache.skywalking.apm.agent.core.context.TracingContext;
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
-
 import java.util.Objects;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReferenceArray;
+import org.apache.skywalking.apm.agent.core.conf.Config;
+import org.apache.skywalking.apm.agent.core.context.TracingContext;
 
 /**
  * profile task execution context, it will create on process this profile task
@@ -74,7 +72,9 @@ public class ProfileTaskExecutionContext {
      *
      * @return is add profile success
      */
-    public ProfileStatusReference attemptProfiling(TracingContext tracingContext, ID traceSegmentId, String firstSpanOPName) {
+    public ProfileStatusReference attemptProfiling(TracingContext tracingContext,
+                                                   String traceSegmentId,
+                                                   String firstSpanOPName) {
         // check has available slot
         final int usingSlotCount = currentProfilingCount.get();
         if (usingSlotCount >= Config.Profile.MAX_PARALLEL) {
@@ -96,7 +96,8 @@ public class ProfileTaskExecutionContext {
             return ProfileStatusReference.createWithNone();
         }
 
-        final ThreadProfiler threadProfiler = new ThreadProfiler(tracingContext, traceSegmentId, Thread.currentThread(), this);
+        final ThreadProfiler threadProfiler = new ThreadProfiler(
+            tracingContext, traceSegmentId, Thread.currentThread(), this);
         int slotLength = profilingSegmentSlots.length();
         for (int slot = 0; slot < slotLength; slot++) {
             if (profilingSegmentSlots.compareAndSet(slot, null, threadProfiler)) {
@@ -109,14 +110,15 @@ public class ProfileTaskExecutionContext {
     /**
      * profiling recheck
      */
-    public void profilingRecheck(TracingContext tracingContext, ID traceSegmentId, String firstSpanOPName) {
+    public void profilingRecheck(TracingContext tracingContext, String traceSegmentId, String firstSpanOPName) {
         // if started, keep profiling
         if (tracingContext.profileStatus().isBeingWatched()) {
             return;
         }
 
         // update profiling status
-        tracingContext.profileStatus().updateStatus(attemptProfiling(tracingContext, traceSegmentId, firstSpanOPName).get());
+        tracingContext.profileStatus()
+                      .updateStatus(attemptProfiling(tracingContext, traceSegmentId, firstSpanOPName).get());
     }
 
     /**
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskExecutionService.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskExecutionService.java
index 308b20c..44bb5ff 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskExecutionService.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ProfileTaskExecutionService.java
@@ -32,7 +32,6 @@ import org.apache.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory;
 import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
 import org.apache.skywalking.apm.agent.core.context.TracingContext;
 import org.apache.skywalking.apm.agent.core.context.TracingThreadListener;
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
 import org.apache.skywalking.apm.agent.core.logging.api.ILog;
 import org.apache.skywalking.apm.agent.core.logging.api.LogManager;
 import org.apache.skywalking.apm.network.constants.ProfileConstants;
@@ -91,7 +90,9 @@ public class ProfileTaskExecutionService implements BootService, TracingThreadLi
     /**
      * check and add {@link TracingContext} profiling
      */
-    public ProfileStatusReference addProfiling(TracingContext tracingContext, ID traceSegmentId, String firstSpanOPName) {
+    public ProfileStatusReference addProfiling(TracingContext tracingContext,
+                                               String traceSegmentId,
+                                               String firstSpanOPName) {
         // get current profiling task, check need profiling
         final ProfileTaskExecutionContext executionContext = taskExecutionContext.get();
         if (executionContext == null) {
@@ -104,7 +105,7 @@ public class ProfileTaskExecutionService implements BootService, TracingThreadLi
     /**
      * Re-check current trace need profiling, in case that third-party plugins change the operation name.
      */
-    public void profilingRecheck(TracingContext tracingContext, ID traceSegmentId, String firstSpanOPName) {
+    public void profilingRecheck(TracingContext tracingContext, String traceSegmentId, String firstSpanOPName) {
         // get current profiling task, check need profiling
         final ProfileTaskExecutionContext executionContext = taskExecutionContext.get();
         if (executionContext == null) {
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ThreadProfiler.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ThreadProfiler.java
index 8587a97..37254b0 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ThreadProfiler.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/ThreadProfiler.java
@@ -19,19 +19,17 @@
 package org.apache.skywalking.apm.agent.core.profile;
 
 import com.google.common.base.Objects;
-import org.apache.skywalking.apm.agent.core.conf.Config;
-import org.apache.skywalking.apm.agent.core.context.TracingContext;
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
-
 import java.util.ArrayList;
 import java.util.concurrent.TimeUnit;
+import org.apache.skywalking.apm.agent.core.conf.Config;
+import org.apache.skywalking.apm.agent.core.context.TracingContext;
 
 public class ThreadProfiler {
 
     // current tracing context
     private final TracingContext tracingContext;
     // current tracing segment id
-    private final ID traceSegmentId;
+    private final String traceSegmentId;
     // need to profiling thread
     private final Thread profilingThread;
     // profiling execution context
@@ -46,7 +44,7 @@ public class ThreadProfiler {
     // thread dump sequence
     private int dumpSequence = 0;
 
-    public ThreadProfiler(TracingContext tracingContext, ID traceSegmentId, Thread profilingThread,
+    public ThreadProfiler(TracingContext tracingContext, String traceSegmentId, Thread profilingThread,
         ProfileTaskExecutionContext executionContext) {
         this.tracingContext = tracingContext;
         this.traceSegmentId = traceSegmentId;
@@ -130,7 +128,7 @@ public class ThreadProfiler {
      */
     public boolean matches(TracingContext context) {
         // match trace id
-        return Objects.equal(context.getReadableGlobalTraceId(), tracingContext.getReadableGlobalTraceId());
+        return Objects.equal(context.getReadablePrimaryTraceId(), tracingContext.getReadablePrimaryTraceId());
     }
 
     /**
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/TracingThreadSnapshot.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/TracingThreadSnapshot.java
index 3311832..302b3d2 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/TracingThreadSnapshot.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/profile/TracingThreadSnapshot.java
@@ -18,24 +18,26 @@
 
 package org.apache.skywalking.apm.agent.core.profile;
 
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
+import java.util.List;
 import org.apache.skywalking.apm.network.language.profile.ThreadSnapshot;
 import org.apache.skywalking.apm.network.language.profile.ThreadStack;
 
-import java.util.List;
-
 public class TracingThreadSnapshot {
 
     // thread profiler
     private final String taskId;
-    private final ID traceSegmentId;
+    private final String traceSegmentId;
 
     // dump info
     private final int sequence;
     private final long time;
     private final List<String> stackList;
 
-    public TracingThreadSnapshot(String taskId, ID traceSegmentId, int sequence, long time, List<String> stackList) {
+    public TracingThreadSnapshot(String taskId,
+                                 String traceSegmentId,
+                                 int sequence,
+                                 long time,
+                                 List<String> stackList) {
         this.taskId = taskId;
         this.traceSegmentId = traceSegmentId;
         this.sequence = sequence;
@@ -51,7 +53,7 @@ public class TracingThreadSnapshot {
         // task id
         builder.setTaskId(taskId);
         // dumped segment id
-        builder.setTraceSegmentId(traceSegmentId.transform());
+        builder.setTraceSegmentId(traceSegmentId);
         // dump time
         builder.setTime(time);
         // snapshot dump sequence
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/ServiceManagementClient.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/ServiceManagementClient.java
new file mode 100755
index 0000000..af88ffc
--- /dev/null
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/ServiceManagementClient.java
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.agent.core.remote;
+
+import io.grpc.Channel;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import org.apache.skywalking.apm.agent.core.boot.BootService;
+import org.apache.skywalking.apm.agent.core.boot.DefaultImplementor;
+import org.apache.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory;
+import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
+import org.apache.skywalking.apm.agent.core.commands.CommandService;
+import org.apache.skywalking.apm.agent.core.conf.Config;
+import org.apache.skywalking.apm.agent.core.logging.api.ILog;
+import org.apache.skywalking.apm.agent.core.logging.api.LogManager;
+import org.apache.skywalking.apm.agent.core.os.OSUtil;
+import org.apache.skywalking.apm.network.common.Commands;
+import org.apache.skywalking.apm.network.common.KeyStringValuePair;
+import org.apache.skywalking.apm.network.management.InstancePingPkg;
+import org.apache.skywalking.apm.network.management.InstanceProperties;
+import org.apache.skywalking.apm.network.management.ManagementServiceGrpc;
+import org.apache.skywalking.apm.util.RunnableWithExceptionProtection;
+import org.apache.skywalking.apm.util.StringUtil;
+
+import static org.apache.skywalking.apm.agent.core.conf.Config.Collector.GRPC_UPSTREAM_TIMEOUT;
+
+@DefaultImplementor
+public class ServiceManagementClient implements BootService, Runnable, GRPCChannelListener {
+    private static final ILog logger = LogManager.getLogger(ServiceManagementClient.class);
+    private static List<KeyStringValuePair> SERVICE_INSTANCE_PROPERTIES;
+
+    private volatile GRPCChannelStatus status = GRPCChannelStatus.DISCONNECT;
+    private volatile ManagementServiceGrpc.ManagementServiceBlockingStub managementServiceBlockingStub;
+    private volatile ScheduledFuture<?> serviceRegisterFuture;
+    private volatile boolean instancePropertiesSubmitted = false;
+
+    @Override
+    public void statusChanged(GRPCChannelStatus status) {
+        if (GRPCChannelStatus.CONNECTED.equals(status)) {
+            Channel channel = ServiceManager.INSTANCE.findService(GRPCChannelManager.class).getChannel();
+            managementServiceBlockingStub = ManagementServiceGrpc.newBlockingStub(channel);
+        } else {
+            managementServiceBlockingStub = null;
+        }
+        this.status = status;
+    }
+
+    @Override
+    public void prepare() {
+        ServiceManager.INSTANCE.findService(GRPCChannelManager.class).addChannelListener(this);
+
+        SERVICE_INSTANCE_PROPERTIES = new ArrayList<>();
+
+        for (String key : Config.Agent.INSTANCE_PROPERTIES.keySet()) {
+            SERVICE_INSTANCE_PROPERTIES.add(KeyStringValuePair.newBuilder()
+                                                              .setKey(key)
+                                                              .setValue(Config.Agent.INSTANCE_PROPERTIES.get(key))
+                                                              .build());
+        }
+
+        Config.Agent.INSTANCE_NAME = StringUtil.isEmpty(Config.Agent.INSTANCE_NAME)
+            ? UUID.randomUUID().toString().replaceAll("-", "") + "@" + OSUtil.getIPV4()
+            : Config.Agent.INSTANCE_NAME;
+    }
+
+    @Override
+    public void boot() {
+        serviceRegisterFuture = Executors.newSingleThreadScheduledExecutor(
+            new DefaultNamedThreadFactory("ServiceRegisterClient")
+        ).scheduleAtFixedRate(
+            new RunnableWithExceptionProtection(
+                this,
+                t -> logger.error("unexpected exception.", t)
+            ), 0, Config.Collector.APP_AND_SERVICE_REGISTER_CHECK_INTERVAL,
+            TimeUnit.SECONDS
+        );
+    }
+
+    @Override
+    public void onComplete() {
+    }
+
+    @Override
+    public void shutdown() {
+        serviceRegisterFuture.cancel(true);
+    }
+
+    @Override
+    public void run() {
+        logger.debug("ServiceManagementClient running, status:{}.", status);
+
+        while (GRPCChannelStatus.CONNECTED.equals(status)) {
+            try {
+                if (managementServiceBlockingStub != null) {
+                    if (!instancePropertiesSubmitted) {
+
+                        managementServiceBlockingStub
+                            .withDeadlineAfter(GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS)
+                            .reportInstanceProperties(InstanceProperties.newBuilder()
+                                                                        .setService(Config.Agent.SERVICE_NAME)
+                                                                        .setServiceInstance(Config.Agent.INSTANCE_NAME)
+                                                                        .addAllProperties(OSUtil.buildOSInfo())
+                                                                        .addAllProperties(SERVICE_INSTANCE_PROPERTIES)
+                                                                        .build());
+                        instancePropertiesSubmitted = true;
+                    } else {
+                        final Commands commands = managementServiceBlockingStub.withDeadlineAfter(
+                            GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS
+                        ).keepAlive(InstancePingPkg.newBuilder()
+                                                   .setService(Config.Agent.SERVICE_NAME)
+                                                   .setServiceInstance(Config.Agent.INSTANCE_NAME)
+                                                   .build());
+
+                        ServiceManager.INSTANCE.findService(CommandService.class).receiveCommand(commands);
+                    }
+                }
+            } catch (Throwable t) {
+                logger.error(t, "ServiceManagementClient execute fail.");
+                ServiceManager.INSTANCE.findService(GRPCChannelManager.class).reportError(t);
+            }
+        }
+    }
+}
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/ServiceRegisterClient.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/ServiceRegisterClient.java
deleted file mode 100755
index 3af141d..0000000
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/ServiceRegisterClient.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.apm.agent.core.remote;
-
-import io.grpc.Channel;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-import org.apache.skywalking.apm.agent.core.boot.BootService;
-import org.apache.skywalking.apm.agent.core.boot.DefaultImplementor;
-import org.apache.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory;
-import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
-import org.apache.skywalking.apm.agent.core.commands.CommandService;
-import org.apache.skywalking.apm.agent.core.conf.Config;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
-import org.apache.skywalking.apm.agent.core.dictionary.NetworkAddressDictionary;
-import org.apache.skywalking.apm.agent.core.logging.api.ILog;
-import org.apache.skywalking.apm.agent.core.logging.api.LogManager;
-import org.apache.skywalking.apm.agent.core.os.OSUtil;
-import org.apache.skywalking.apm.network.common.Commands;
-import org.apache.skywalking.apm.network.common.KeyIntValuePair;
-import org.apache.skywalking.apm.network.common.KeyStringValuePair;
-import org.apache.skywalking.apm.network.common.ServiceType;
-import org.apache.skywalking.apm.network.register.v2.RegisterGrpc;
-import org.apache.skywalking.apm.network.register.v2.Service;
-import org.apache.skywalking.apm.network.register.v2.ServiceInstance;
-import org.apache.skywalking.apm.network.register.v2.ServiceInstancePingGrpc;
-import org.apache.skywalking.apm.network.register.v2.ServiceInstancePingPkg;
-import org.apache.skywalking.apm.network.register.v2.ServiceInstanceRegisterMapping;
-import org.apache.skywalking.apm.network.register.v2.ServiceInstances;
-import org.apache.skywalking.apm.network.register.v2.ServiceRegisterMapping;
-import org.apache.skywalking.apm.network.register.v2.Services;
-import org.apache.skywalking.apm.util.RunnableWithExceptionProtection;
-import org.apache.skywalking.apm.util.StringUtil;
-
-import static org.apache.skywalking.apm.agent.core.conf.Config.Collector.GRPC_UPSTREAM_TIMEOUT;
-
-@DefaultImplementor
-public class ServiceRegisterClient implements BootService, Runnable, GRPCChannelListener {
-    private static final ILog logger = LogManager.getLogger(ServiceRegisterClient.class);
-    private static String INSTANCE_UUID;
-    private static List<KeyStringValuePair> SERVICE_INSTANCE_PROPERTIES;
-
-    private volatile GRPCChannelStatus status = GRPCChannelStatus.DISCONNECT;
-    private volatile RegisterGrpc.RegisterBlockingStub registerBlockingStub;
-    private volatile ServiceInstancePingGrpc.ServiceInstancePingBlockingStub serviceInstancePingStub;
-    private volatile ScheduledFuture<?> serviceRegisterFuture;
-    private volatile long coolDownStartTime = -1;
-
-    @Override
-    public void statusChanged(GRPCChannelStatus status) {
-        if (GRPCChannelStatus.CONNECTED.equals(status)) {
-            Channel channel = ServiceManager.INSTANCE.findService(GRPCChannelManager.class).getChannel();
-            registerBlockingStub = RegisterGrpc.newBlockingStub(channel);
-            serviceInstancePingStub = ServiceInstancePingGrpc.newBlockingStub(channel);
-        } else {
-            registerBlockingStub = null;
-            serviceInstancePingStub = null;
-        }
-        this.status = status;
-    }
-
-    @Override
-    public void prepare() {
-        ServiceManager.INSTANCE.findService(GRPCChannelManager.class).addChannelListener(this);
-
-        INSTANCE_UUID = StringUtil.isEmpty(Config.Agent.INSTANCE_UUID)
-            ? UUID.randomUUID().toString().replaceAll("-", "")
-            : Config.Agent.INSTANCE_UUID;
-
-        SERVICE_INSTANCE_PROPERTIES = new ArrayList<>();
-
-        for (String key : Config.Agent.INSTANCE_PROPERTIES.keySet()) {
-            SERVICE_INSTANCE_PROPERTIES.add(KeyStringValuePair.newBuilder()
-                                                              .setKey(key)
-                                                              .setValue(Config.Agent.INSTANCE_PROPERTIES.get(key))
-                                                              .build());
-        }
-    }
-
-    @Override
-    public void boot() {
-        serviceRegisterFuture = Executors.newSingleThreadScheduledExecutor(
-            new DefaultNamedThreadFactory("ServiceRegisterClient")
-        ).scheduleAtFixedRate(
-            new RunnableWithExceptionProtection(
-                this,
-                t -> logger.error("unexpected exception.", t)
-            ), 0, Config.Collector.APP_AND_SERVICE_REGISTER_CHECK_INTERVAL,
-            TimeUnit.SECONDS
-        );
-    }
-
-    @Override
-    public void onComplete() {
-    }
-
-    @Override
-    public void shutdown() {
-        serviceRegisterFuture.cancel(true);
-    }
-
-    @Override
-    public void run() {
-        logger.debug("ServiceRegisterClient running, status:{}.", status);
-
-        if (coolDownStartTime > 0) {
-            final long coolDownDurationInMillis = TimeUnit.MINUTES.toMillis(Config.Agent.COOL_DOWN_THRESHOLD);
-            if (System.currentTimeMillis() - coolDownStartTime < coolDownDurationInMillis) {
-                logger.warn("The agent is cooling down, won't register itself");
-                return;
-            } else {
-                logger.warn("The agent is re-registering itself to backend");
-            }
-        }
-        coolDownStartTime = -1;
-
-        boolean shouldTry = true;
-        while (GRPCChannelStatus.CONNECTED.equals(status) && shouldTry) {
-            shouldTry = false;
-            try {
-                if (RemoteDownstreamConfig.Agent.SERVICE_ID == DictionaryUtil.nullValue()) {
-                    if (registerBlockingStub != null) {
-                        ServiceRegisterMapping serviceRegisterMapping = registerBlockingStub.withDeadlineAfter(
-                            GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS
-                        ).doServiceRegister(
-                            Services.newBuilder()
-                                    .addServices(
-                                        Service
-                                            .newBuilder()
-                                            .setServiceName(Config.Agent.SERVICE_NAME)
-                                            .setType(ServiceType.normal))
-                                    .build()
-                        );
-                        if (serviceRegisterMapping != null) {
-                            for (KeyIntValuePair registered : serviceRegisterMapping.getServicesList()) {
-                                if (Config.Agent.SERVICE_NAME.equals(registered.getKey())) {
-                                    RemoteDownstreamConfig.Agent.SERVICE_ID = registered.getValue();
-                                    shouldTry = true;
-                                }
-                            }
-                        }
-                    }
-                } else {
-                    if (registerBlockingStub != null) {
-                        if (RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID == DictionaryUtil.nullValue()) {
-
-                            ServiceInstanceRegisterMapping instanceMapping = registerBlockingStub.withDeadlineAfter(
-                                GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS
-                            ).doServiceInstanceRegister(
-                                ServiceInstances
-                                    .newBuilder()
-                                    .addInstances(
-                                        ServiceInstance
-                                            .newBuilder()
-                                            .setServiceId(RemoteDownstreamConfig.Agent.SERVICE_ID)
-                                            .setInstanceUUID(INSTANCE_UUID)
-                                            .setTime(System.currentTimeMillis())
-                                            .addAllProperties(OSUtil.buildOSInfo())
-                                            .addAllProperties(SERVICE_INSTANCE_PROPERTIES))
-                                    .build());
-                            for (KeyIntValuePair serviceInstance : instanceMapping.getServiceInstancesList()) {
-                                if (INSTANCE_UUID.equals(serviceInstance.getKey())) {
-                                    int serviceInstanceId = serviceInstance.getValue();
-                                    if (serviceInstanceId != DictionaryUtil.nullValue()) {
-                                        RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = serviceInstanceId;
-                                        RemoteDownstreamConfig.Agent.INSTANCE_REGISTERED_TIME = System.currentTimeMillis();
-                                    }
-                                }
-                            }
-                        } else {
-                            final Commands commands = serviceInstancePingStub.withDeadlineAfter(
-                                GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS
-                            ).doPing(ServiceInstancePingPkg.newBuilder()
-                                                           .setServiceInstanceId(
-                                                               RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID)
-                                                           .setTime(System.currentTimeMillis())
-                                                           .setServiceInstanceUUID(INSTANCE_UUID)
-                                                           .build());
-
-                            NetworkAddressDictionary.INSTANCE.syncRemoteDictionary(
-                                registerBlockingStub.withDeadlineAfter(GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS));
-                            ServiceManager.INSTANCE.findService(CommandService.class).receiveCommand(commands);
-                        }
-                    }
-                }
-            } catch (Throwable t) {
-                logger.error(t, "ServiceRegisterClient execute fail.");
-                ServiceManager.INSTANCE.findService(GRPCChannelManager.class).reportError(t);
-            }
-        }
-    }
-
-    public void coolDown() {
-        this.coolDownStartTime = System.currentTimeMillis();
-    }
-}
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClient.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClient.java
index 4d639d5..853919b 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClient.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClient.java
@@ -36,8 +36,8 @@ import org.apache.skywalking.apm.commons.datacarrier.DataCarrier;
 import org.apache.skywalking.apm.commons.datacarrier.buffer.BufferStrategy;
 import org.apache.skywalking.apm.commons.datacarrier.consumer.IConsumer;
 import org.apache.skywalking.apm.network.common.Commands;
-import org.apache.skywalking.apm.network.language.agent.UpstreamSegment;
-import org.apache.skywalking.apm.network.language.agent.v2.TraceSegmentReportServiceGrpc;
+import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
+import org.apache.skywalking.apm.network.language.agent.v3.TraceSegmentReportServiceGrpc;
 
 import static org.apache.skywalking.apm.agent.core.conf.Config.Buffer.BUFFER_SIZE;
 import static org.apache.skywalking.apm.agent.core.conf.Config.Buffer.CHANNEL_SIZE;
@@ -89,7 +89,7 @@ public class TraceSegmentServiceClient implements BootService, IConsumer<TraceSe
     public void consume(List<TraceSegment> data) {
         if (CONNECTED.equals(status)) {
             final GRPCStreamServiceStatus status = new GRPCStreamServiceStatus(false);
-            StreamObserver<UpstreamSegment> upstreamSegmentStreamObserver = serviceStub.withDeadlineAfter(
+            StreamObserver<SegmentObject> upstreamSegmentStreamObserver = serviceStub.withDeadlineAfter(
                 Config.Collector.GRPC_UPSTREAM_TIMEOUT, TimeUnit.SECONDS
             ).collect(new StreamObserver<Commands>() {
                 @Override
@@ -121,7 +121,7 @@ public class TraceSegmentServiceClient implements BootService, IConsumer<TraceSe
 
             try {
                 for (TraceSegment segment : data) {
-                    UpstreamSegment upstreamSegment = segment.transform();
+                    SegmentObject upstreamSegment = segment.transform();
                     upstreamSegmentStreamObserver.onNext(upstreamSegment);
                 }
             } catch (Throwable t) {
diff --git a/apm-sniffer/apm-agent-core/src/main/resources/META-INF/services/org.apache.skywalking.apm.agent.core.boot.BootService b/apm-sniffer/apm-agent-core/src/main/resources/META-INF/services/org.apache.skywalking.apm.agent.core.boot.BootService
index d21536b..da40cdf 100644
--- a/apm-sniffer/apm-agent-core/src/main/resources/META-INF/services/org.apache.skywalking.apm.agent.core.boot.BootService
+++ b/apm-sniffer/apm-agent-core/src/main/resources/META-INF/services/org.apache.skywalking.apm.agent.core.boot.BootService
@@ -21,7 +21,7 @@ org.apache.skywalking.apm.agent.core.context.ContextManager
 org.apache.skywalking.apm.agent.core.sampling.SamplingService
 org.apache.skywalking.apm.agent.core.remote.GRPCChannelManager
 org.apache.skywalking.apm.agent.core.jvm.JVMService
-org.apache.skywalking.apm.agent.core.remote.ServiceRegisterClient
+org.apache.skywalking.apm.agent.core.remote.ServiceManagementClient
 org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService
 org.apache.skywalking.apm.agent.core.commands.CommandService
 org.apache.skywalking.apm.agent.core.commands.CommandExecutorService
diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextCarrierV2HeaderTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextCarrierV3HeaderTest.java
similarity index 66%
rename from apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextCarrierV2HeaderTest.java
rename to apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextCarrierV3HeaderTest.java
index 74736d1..56488d4 100644
--- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextCarrierV2HeaderTest.java
+++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextCarrierV3HeaderTest.java
@@ -21,21 +21,20 @@ package org.apache.skywalking.apm.agent.core.context;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId;
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
 import org.apache.skywalking.apm.agent.core.context.ids.PropagatedTraceId;
 import org.junit.Assert;
 import org.junit.Test;
 
-public class ContextCarrierV2HeaderTest {
+public class ContextCarrierV3HeaderTest {
 
     @Test
-    public void testDeserializeV2Header() {
+    public void testDeserializeV3Header() {
         ContextCarrier contextCarrier = new ContextCarrier();
         CarrierItem next = contextCarrier.items();
         while (next.hasNext()) {
             next = next.next();
-            if (next.getHeadKey().equals(SW6CarrierItem.HEADER_NAME)) {
-                next.setHeadValue("1-My40LjU=-MS4yLjM=-4-1-1-IzEyNy4wLjAuMTo4MDgw--");
+            if (next.getHeadKey().equals(SW8CarrierItem.HEADER_NAME)) {
+                next.setHeadValue("1-My40LjU=-MS4yLjM=-4-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=");
             } else if (next.getHeadKey().equals(SW8CorrelationCarrierItem.HEADER_NAME)) {
                 next.setHeadValue("dGVzdA==:dHJ1ZQ==");
             } else {
@@ -47,32 +46,26 @@ public class ContextCarrierV2HeaderTest {
     }
 
     @Test
-    public void testSerializeV2Header() {
+    public void testSerializeV3Header() {
         List<DistributedTraceId> distributedTraceIds = new ArrayList<>();
-        distributedTraceIds.add(new PropagatedTraceId("3.4.5"));
 
         ContextCarrier contextCarrier = new ContextCarrier();
-        contextCarrier.setTraceSegmentId(new ID(1, 2, 3));
-        contextCarrier.setDistributedTraceIds(distributedTraceIds);
+        contextCarrier.setTraceSegmentId("1.2.3");
+        contextCarrier.setTraceId("3.4.5");
         contextCarrier.setSpanId(4);
-        contextCarrier.setEntryServiceInstanceId(1);
-        contextCarrier.setParentServiceInstanceId(1);
-        contextCarrier.setPeerHost("127.0.0.1:8080");
-        contextCarrier.setEntryEndpointName("/portal");
-        contextCarrier.setParentEndpointName("/app");
+        contextCarrier.setParentService("service");
+        contextCarrier.setParentServiceInstance("instance");
+        contextCarrier.setAddressUsedAtClient("127.0.0.1:8080");
+        contextCarrier.setParentEndpoint("/portal");
+        contextCarrier.setParentEndpoint("/app");
 
         contextCarrier.getCorrelationContext().put("test", "true");
 
         CarrierItem next = contextCarrier.items();
         while (next.hasNext()) {
             next = next.next();
-            /*
-             * sampleFlag-traceId-segmentId-spanId-parentAppInstId-entryAppInstId-peerHost-entryEndpoint-parentEndpoint
-             *
-             * "1-3.4.5-1.2.3-4-1-1-#127.0.0.1:8080-#/portal-123"
-             */
-            if (next.getHeadKey().equals(SW6CarrierItem.HEADER_NAME)) {
-                Assert.assertEquals("1-My40LjU=-MS4yLjM=-4-1-1-IzEyNy4wLjAuMTo4MDgw-Iy9wb3J0YWw=-Iy9hcHA=", next.getHeadValue());
+            if (next.getHeadKey().equals(SW8CarrierItem.HEADER_NAME)) {
+                Assert.assertEquals("1-My40LjU=-MS4yLjM=-4-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=", next.getHeadValue());
             } else if (next.getHeadKey().equals(SW8CorrelationCarrierItem.HEADER_NAME)) {
                 /**
                  * customKey:customValue
@@ -88,8 +81,8 @@ public class ContextCarrierV2HeaderTest {
         next = contextCarrier.items();
         while (next.hasNext()) {
             next = next.next();
-            if (next.getHeadKey().equals(SW6CarrierItem.HEADER_NAME)) {
-                Assert.assertEquals("1-My40LjU=-MS4yLjM=-4-1-1-IzEyNy4wLjAuMTo4MDgw-Iy9wb3J0YWw=-Iy9hcHA=", next.getHeadValue());
+            if (next.getHeadKey().equals(SW8CarrierItem.HEADER_NAME)) {
+                Assert.assertEquals("1-My40LjU=-MS4yLjM=-4-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=", next.getHeadValue());
             } else if (next.getHeadKey().equals(SW8CorrelationCarrierItem.HEADER_NAME)) {
                 Assert.assertEquals("dGVzdA==:dHJ1ZQ==", next.getHeadValue());
             } else {
@@ -106,14 +99,14 @@ public class ContextCarrierV2HeaderTest {
         distributedTraceIds.add(new PropagatedTraceId("3.4.5"));
 
         ContextCarrier contextCarrier = new ContextCarrier();
-        contextCarrier.setTraceSegmentId(new ID(1, 2, 3));
-        contextCarrier.setDistributedTraceIds(distributedTraceIds);
+        contextCarrier.setTraceSegmentId("1.2.3");
+        contextCarrier.setTraceId("3.4.5");
         contextCarrier.setSpanId(4);
-        contextCarrier.setEntryServiceInstanceId(1);
-        contextCarrier.setParentServiceInstanceId(1);
-        contextCarrier.setPeerHost("127.0.0.1:8080");
-        contextCarrier.setEntryEndpointName("/portal");
-        contextCarrier.setParentEndpointName("/app");
+        contextCarrier.setParentService("service");
+        contextCarrier.setParentServiceInstance("instance");
+        contextCarrier.setAddressUsedAtClient("127.0.0.1:8080");
+        contextCarrier.setParentEndpoint("/portal");
+        contextCarrier.setParentEndpoint("/app");
 
         contextCarrier.getCorrelationContext().put("test", "true");
 
@@ -122,7 +115,7 @@ public class ContextCarrierV2HeaderTest {
         String correlationHeaderValue = null;
         while (next.hasNext()) {
             next = next.next();
-            if (next.getHeadKey().equals(SW6CarrierItem.HEADER_NAME)) {
+            if (next.getHeadKey().equals(SW8CarrierItem.HEADER_NAME)) {
                 sw6HeaderValue = next.getHeadValue();
             } else if (next.getHeadKey().equals(SW8CorrelationCarrierItem.HEADER_NAME)) {
                 correlationHeaderValue = next.getHeadValue();
@@ -135,7 +128,7 @@ public class ContextCarrierV2HeaderTest {
         next = contextCarrier2.items();
         while (next.hasNext()) {
             next = next.next();
-            if (next.getHeadKey().equals(SW6CarrierItem.HEADER_NAME)) {
+            if (next.getHeadKey().equals(SW8CarrierItem.HEADER_NAME)) {
                 next.setHeadValue(sw6HeaderValue);
             } else if (next.getHeadKey().equals(SW8CorrelationCarrierItem.HEADER_NAME)) {
                 next.setHeadValue(correlationHeaderValue);
@@ -146,12 +139,12 @@ public class ContextCarrierV2HeaderTest {
 
         Assert.assertTrue(contextCarrier2.isValid());
         Assert.assertEquals(contextCarrier.getSpanId(), contextCarrier2.getSpanId());
-        Assert.assertEquals(contextCarrier.getPeerHost(), contextCarrier2.getPeerHost());
-        Assert.assertEquals(contextCarrier.getDistributedTraceId(), contextCarrier2.getDistributedTraceId());
+        Assert.assertEquals(contextCarrier.getAddressUsedAtClient(), contextCarrier2.getAddressUsedAtClient());
+        Assert.assertEquals(contextCarrier.getTraceId(), contextCarrier2.getTraceId());
         Assert.assertEquals(contextCarrier.getTraceSegmentId(), contextCarrier2.getTraceSegmentId());
-        Assert.assertEquals(contextCarrier.getEntryEndpointName(), contextCarrier2.getEntryEndpointName());
-        Assert.assertEquals(contextCarrier.getEntryServiceInstanceId(), contextCarrier2.getEntryServiceInstanceId());
-        Assert.assertEquals(contextCarrier.getParentServiceInstanceId(), contextCarrier2.getParentServiceInstanceId());
+        Assert.assertEquals(contextCarrier.getParentService(), contextCarrier2.getParentService());
+        Assert.assertEquals(contextCarrier.getParentServiceInstance(), contextCarrier2.getParentServiceInstance());
+        Assert.assertEquals(contextCarrier.getParentEndpoint(), contextCarrier2.getParentEndpoint());
         Assert.assertEquals(contextCarrier.getCorrelationContext(), contextCarrier2.getCorrelationContext());
     }
 }
diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextManagerTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextManagerTest.java
index f1d9006..4a793be 100644
--- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextManagerTest.java
+++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextManagerTest.java
@@ -22,7 +22,6 @@ import com.google.protobuf.InvalidProtocolBufferException;
 import java.util.List;
 import java.util.Objects;
 import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
 import org.apache.skywalking.apm.agent.core.context.tag.Tags;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
@@ -34,23 +33,19 @@ import org.apache.skywalking.apm.agent.core.context.util.AbstractTracingSpanHelp
 import org.apache.skywalking.apm.agent.core.context.util.SegmentHelper;
 import org.apache.skywalking.apm.agent.core.context.util.SpanHelper;
 import org.apache.skywalking.apm.agent.core.context.util.TraceSegmentRefHelper;
-import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
 import org.apache.skywalking.apm.agent.core.test.tools.AgentServiceRule;
 import org.apache.skywalking.apm.agent.core.test.tools.SegmentStorage;
 import org.apache.skywalking.apm.agent.core.test.tools.SegmentStoragePoint;
 import org.apache.skywalking.apm.agent.core.test.tools.TracingSegmentRunner;
 import org.apache.skywalking.apm.network.common.KeyStringValuePair;
-import org.apache.skywalking.apm.network.language.agent.SpanType;
-import org.apache.skywalking.apm.network.language.agent.UpstreamSegment;
-import org.apache.skywalking.apm.network.language.agent.v2.Log;
-import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject;
-import org.apache.skywalking.apm.network.language.agent.v2.SegmentReference;
-import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2;
+import org.apache.skywalking.apm.network.language.agent.v3.Log;
+import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
+import org.apache.skywalking.apm.network.language.agent.v3.SegmentReference;
+import org.apache.skywalking.apm.network.language.agent.v3.SpanObject;
+import org.apache.skywalking.apm.network.language.agent.v3.SpanType;
 import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
 import org.hamcrest.MatcherAssert;
-import org.junit.After;
 import org.junit.AfterClass;
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -69,12 +64,6 @@ public class ContextManagerTest {
     @Rule
     public AgentServiceRule agentServiceRule = new AgentServiceRule();
 
-    @Before
-    public void setUp() throws Exception {
-        RemoteDownstreamConfig.Agent.SERVICE_ID = 1;
-        RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = 1;
-    }
-
     @AfterClass
     public static void afterClass() {
         ServiceManager.INSTANCE.shutdown();
@@ -107,7 +96,10 @@ public class ContextManagerTest {
 
     @Test
     public void createMultipleEntrySpan() {
-        ContextCarrier contextCarrier = new ContextCarrier().deserialize("1-MS4yMzQzLjIzNDIzNDIzNA==-MS4yMzQzLjIzNDIzNDIzNA==-1-1-1-IzEyNy4wLjAuMTo4MDgw-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu", ContextCarrier.HeaderVersion.v2);
+        ContextCarrier contextCarrier = new ContextCarrier().deserialize(
+            "1-My40LjU=-MS4yLjM=-4-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=",
+            ContextCarrier.HeaderVersion.v3
+        );
         assertTrue(contextCarrier.isValid());
 
         AbstractSpan firstEntrySpan = ContextManager.createEntrySpan("/testFirstEntry", contextCarrier);
@@ -140,7 +132,6 @@ public class ContextManagerTest {
 
         TraceSegmentRef ref = actualSegment.getRefs().get(0);
         MatcherAssert.assertThat(TraceSegmentRefHelper.getPeerHost(ref), is("127.0.0.1:8080"));
-        assertThat(ref.getEntryEndpointName(), is("/portal/"));
 
         List<AbstractTracingSpan> spanList = SegmentHelper.getSpan(actualSegment);
         assertThat(spanList.size(), is(2));
@@ -162,8 +153,7 @@ public class ContextManagerTest {
         assertThat(logs.get(0).getLogs().size(), is(4));
 
         assertThat(injectContextCarrier.getSpanId(), is(1));
-        assertThat(injectContextCarrier.getEntryEndpointName(), is("#/portal/"));
-        assertThat(injectContextCarrier.getPeerHost(), is("#127.0.0.1:12800"));
+        assertThat(injectContextCarrier.getAddressUsedAtClient(), is("127.0.0.1:12800"));
     }
 
     @Test
@@ -175,13 +165,15 @@ public class ContextManagerTest {
         SpanLayer.asHttp(entrySpan);
 
         ContextCarrier firstExitSpanContextCarrier = new ContextCarrier();
-        AbstractSpan firstExitSpan = ContextManager.createExitSpan("/testFirstExit", firstExitSpanContextCarrier, "127.0.0.1:8080");
+        AbstractSpan firstExitSpan = ContextManager.createExitSpan(
+            "/testFirstExit", firstExitSpanContextCarrier, "127.0.0.1:8080");
         firstExitSpan.setComponent(ComponentsDefine.DUBBO);
         Tags.URL.set(firstExitSpan, "dubbo://127.0.0.1:8080");
         SpanLayer.asRPCFramework(firstExitSpan);
 
         ContextCarrier secondExitSpanContextCarrier = new ContextCarrier();
-        AbstractSpan secondExitSpan = ContextManager.createExitSpan("/testSecondExit", secondExitSpanContextCarrier, "127.0.0.1:9080");
+        AbstractSpan secondExitSpan = ContextManager.createExitSpan(
+            "/testSecondExit", secondExitSpanContextCarrier, "127.0.0.1:9080");
         secondExitSpan.setComponent(ComponentsDefine.TOMCAT);
         Tags.HTTP.METHOD.set(secondExitSpan, "GET");
         Tags.URL.set(secondExitSpan, "127.0.0.1:8080");
@@ -211,25 +203,19 @@ public class ContextManagerTest {
         assertThat(actualEntrySpan.getSpanId(), is(0));
         assertThat(AbstractTracingSpanHelper.getParentSpanId(actualEntrySpan), is(-1));
 
-        assertThat(firstExitSpanContextCarrier.getPeerHost(), is("#127.0.0.1:8080"));
+        assertThat(firstExitSpanContextCarrier.getAddressUsedAtClient(), is("127.0.0.1:8080"));
         assertThat(firstExitSpanContextCarrier.getSpanId(), is(1));
-        assertThat(firstExitSpanContextCarrier.getEntryEndpointName(), is("#/testEntrySpan"));
 
-        assertThat(secondExitSpanContextCarrier.getPeerHost(), is("#127.0.0.1:8080"));
         assertThat(secondExitSpanContextCarrier.getSpanId(), is(1));
-        assertThat(secondExitSpanContextCarrier.getEntryEndpointName(), is("#/testEntrySpan"));
-
-    }
 
-    @After
-    public void tearDown() throws Exception {
-        RemoteDownstreamConfig.Agent.SERVICE_ID = DictionaryUtil.nullValue();
-        RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = DictionaryUtil.nullValue();
     }
 
     @Test
     public void testTransform() throws InvalidProtocolBufferException {
-        ContextCarrier contextCarrier = new ContextCarrier().deserialize("1-MS4yMzQzLjIzNDIzNDIzNA==-MS4yMzQuMTk4MzgyOQ==-3-1-1-IzEyNy4wLjAuMTo4MDgw-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu", ContextCarrier.HeaderVersion.v2);
+        ContextCarrier contextCarrier = new ContextCarrier().deserialize(
+            "1-My40LjU=-MS4yLjM=-3-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=",
+            ContextCarrier.HeaderVersion.v3
+        );
         assertTrue(contextCarrier.isValid());
 
         AbstractSpan firstEntrySpan = ContextManager.createEntrySpan("/testFirstEntry", contextCarrier);
@@ -256,20 +242,17 @@ public class ContextManagerTest {
 
         TraceSegment actualSegment = tracingData.getTraceSegments().get(0);
 
-        UpstreamSegment upstreamSegment = actualSegment.transform();
-        assertThat(upstreamSegment.getGlobalTraceIdsCount(), is(1));
-        SegmentObject traceSegmentObject = SegmentObject.parseFrom(upstreamSegment.getSegment());
+        SegmentObject traceSegmentObject = actualSegment.transform();
         SegmentReference reference = traceSegmentObject.getSpans(1).getRefs(0);
 
-        assertThat(reference.getNetworkAddress(), is("127.0.0.1:8080"));
+        assertThat(reference.getNetworkAddressUsedAtPeer(), is("127.0.0.1:8080"));
         assertThat(reference.getParentSpanId(), is(3));
 
-        assertThat(traceSegmentObject.getServiceId(), is(1));
         assertThat(traceSegmentObject.getSpans(1).getRefsCount(), is(1));
 
         assertThat(traceSegmentObject.getSpansCount(), is(2));
 
-        SpanObjectV2 actualSpan = traceSegmentObject.getSpans(1);
+        SpanObject actualSpan = traceSegmentObject.getSpans(1);
         assertThat(actualSpan.getComponentId(), is(3));
         assertThat(actualSpan.getComponent(), is(""));
 
@@ -278,7 +261,7 @@ public class ContextManagerTest {
         assertThat(actualSpan.getSpanId(), is(0));
         assertThat(actualSpan.getSpanType(), is(SpanType.Entry));
 
-        SpanObjectV2 exitSpanObject = traceSegmentObject.getSpans(0);
+        SpanObject exitSpanObject = traceSegmentObject.getSpans(0);
         assertThat(exitSpanObject.getComponentId(), is(2));
         assertThat(exitSpanObject.getComponent(), is(""));
         assertThat(exitSpanObject.getSpanType(), is(SpanType.Exit));
diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContextTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContextTest.java
index 95462d2..eb61073 100644
--- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContextTest.java
+++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContextTest.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.agent.core.context;
 import java.util.LinkedList;
 import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
 import org.apache.skywalking.apm.agent.core.conf.Config;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.NoopSpan;
 import org.apache.skywalking.apm.agent.core.test.tools.AgentServiceRule;
@@ -30,7 +29,6 @@ import org.apache.skywalking.apm.agent.core.test.tools.SegmentStoragePoint;
 import org.apache.skywalking.apm.agent.core.test.tools.TracingSegmentRunner;
 import org.junit.After;
 import org.junit.AfterClass;
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -48,12 +46,6 @@ public class IgnoredTracerContextTest {
     @Rule
     public AgentServiceRule agentServiceRule = new AgentServiceRule();
 
-    @Before
-    public void setUp() throws Exception {
-        RemoteDownstreamConfig.Agent.SERVICE_ID = 1;
-        RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = 1;
-    }
-
     @AfterClass
     public static void afterClass() {
         ServiceManager.INSTANCE.shutdown();
@@ -101,9 +93,9 @@ public class IgnoredTracerContextTest {
         ContextManager.stopSpan();
 
         assertThat(abstractSpan.getClass().getName(), is(NoopSpan.class.getName()));
-        assertNull(contextCarrier.getEntryEndpointName());
+        assertNull(contextCarrier.getParentEndpoint());
         assertThat(contextCarrier.getSpanId(), is(-1));
-        assertNull(contextCarrier.getPeerHost());
+        assertNull(contextCarrier.getAddressUsedAtClient());
 
         LinkedList<IgnoredTracerContext> ignoredTracerContexts = storage.getIgnoredTracerContexts();
         assertThat(ignoredTracerContexts.size(), is(1));
diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/TracingContextTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/TracingContextTest.java
index 02fbadd..a717c43 100644
--- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/TracingContextTest.java
+++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/TracingContextTest.java
@@ -18,27 +18,12 @@
 
 package org.apache.skywalking.apm.agent.core.context;
 
-import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
-import org.junit.AfterClass;
 import org.junit.Assert;
-import org.junit.BeforeClass;
 import org.junit.Test;
 
 public class TracingContextTest {
-    @BeforeClass
-    public static void setup() {
-        ServiceManager.INSTANCE.boot();
-        RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = 5;
-    }
-
-    @AfterClass
-    public static void clear() {
-        RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = 0;
-        ServiceManager.INSTANCE.shutdown();
-    }
 
     @Test
     public void testSpanLimit() {
diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/util/TraceSegmentRefHelper.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/util/TraceSegmentRefHelper.java
index 21b11b8..c51e492 100644
--- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/util/TraceSegmentRefHelper.java
+++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/util/TraceSegmentRefHelper.java
@@ -23,7 +23,7 @@ import org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentRef;
 public class TraceSegmentRefHelper {
     public static String getPeerHost(TraceSegmentRef ref) {
         try {
-            return FieldGetter.getValue(ref, "peerHost");
+            return FieldGetter.getValue(ref, "addressUsedAtClient");
         } catch (Exception e) {
         }
 
diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/remote/GRPCChannelManagerTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/remote/GRPCChannelManagerTest.java
deleted file mode 100644
index ba613fb..0000000
--- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/remote/GRPCChannelManagerTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.apm.agent.core.remote;
-
-import io.grpc.Server;
-import io.grpc.netty.NettyServerBuilder;
-import io.grpc.stub.StreamObserver;
-import java.net.InetSocketAddress;
-import org.apache.skywalking.apm.agent.core.conf.Config;
-import org.apache.skywalking.apm.network.register.v2.RegisterGrpc;
-import org.apache.skywalking.apm.network.register.v2.Service;
-import org.apache.skywalking.apm.network.register.v2.ServiceRegisterMapping;
-import org.apache.skywalking.apm.network.register.v2.Services;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-
-public class GRPCChannelManagerTest {
-    @BeforeClass
-    public static void setup() {
-        Config.Collector.BACKEND_SERVICE = "127.0.0.1:8080";
-    }
-
-    @AfterClass
-    public static void clear() {
-        Config.Collector.BACKEND_SERVICE = "";
-    }
-
-    //@Test
-    public void testConnected() throws Throwable {
-        GRPCChannelManager manager = new GRPCChannelManager();
-        manager.addChannelListener(new GRPCChannelListener() {
-            @Override
-            public void statusChanged(GRPCChannelStatus status) {
-            }
-        });
-
-        manager.boot();
-        Thread.sleep(1000);
-
-        RegisterGrpc.RegisterBlockingStub stub = RegisterGrpc.newBlockingStub(manager.getChannel());
-        try {
-            stub.doServiceRegister(Services.newBuilder()
-                                           .addServices(Service.newBuilder().setServiceName("abc"))
-                                           .build());
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        NettyServerBuilder nettyServerBuilder = NettyServerBuilder.forAddress(new InetSocketAddress("127.0.0.1", 8080));
-        nettyServerBuilder.addService(new RegisterGrpc.RegisterImplBase() {
-            @Override
-            public void doServiceRegister(Services request, StreamObserver<ServiceRegisterMapping> responseObserver) {
-            }
-        });
-        Server server = nettyServerBuilder.build();
-        server.start();
-        Thread.sleep(1000);
-
-        boolean registerSuccess = false;
-        try {
-            stub.doServiceRegister(Services.newBuilder()
-                                           .addServices(Service.newBuilder().setServiceName("abc"))
-                                           .build());
-            registerSuccess = true;
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        Assert.assertTrue(registerSuccess);
-        server.shutdownNow();
-    }
-}
diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClientTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClientTest.java
index e2cfc87..beb6cad 100644
--- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClientTest.java
+++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClientTest.java
@@ -24,7 +24,6 @@ import io.grpc.testing.GrpcServerRule;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
 import org.apache.skywalking.apm.agent.core.context.ContextManager;
 import org.apache.skywalking.apm.agent.core.context.tag.Tags;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
@@ -34,15 +33,13 @@ import org.apache.skywalking.apm.agent.core.test.tools.SegmentStorage;
 import org.apache.skywalking.apm.agent.core.test.tools.SegmentStoragePoint;
 import org.apache.skywalking.apm.agent.core.test.tools.TracingSegmentRunner;
 import org.apache.skywalking.apm.network.common.Commands;
-import org.apache.skywalking.apm.network.language.agent.SpanType;
-import org.apache.skywalking.apm.network.language.agent.UpstreamSegment;
-import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject;
-import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2;
-import org.apache.skywalking.apm.network.language.agent.v2.TraceSegmentReportServiceGrpc;
+import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
+import org.apache.skywalking.apm.network.language.agent.v3.SpanObject;
+import org.apache.skywalking.apm.network.language.agent.v3.SpanType;
+import org.apache.skywalking.apm.network.language.agent.v3.TraceSegmentReportServiceGrpc;
 import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
 import org.junit.AfterClass;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -65,14 +62,14 @@ public class TraceSegmentServiceClientTest {
     private SegmentStorage storage;
 
     private TraceSegmentServiceClient serviceClient = new TraceSegmentServiceClient();
-    private List<UpstreamSegment> upstreamSegments;
+    private List<SegmentObject> upstreamSegments;
 
     private TraceSegmentReportServiceGrpc.TraceSegmentReportServiceImplBase serviceImplBase = new TraceSegmentReportServiceGrpc.TraceSegmentReportServiceImplBase() {
         @Override
-        public StreamObserver<UpstreamSegment> collect(final StreamObserver<Commands> responseObserver) {
-            return new StreamObserver<UpstreamSegment>() {
+        public StreamObserver<SegmentObject> collect(final StreamObserver<Commands> responseObserver) {
+            return new StreamObserver<SegmentObject>() {
                 @Override
-                public void onNext(UpstreamSegment value) {
+                public void onNext(SegmentObject value) {
                     upstreamSegments.add(value);
                 }
 
@@ -89,12 +86,6 @@ public class TraceSegmentServiceClientTest {
         }
     };
 
-    @BeforeClass
-    public static void setUpBeforeClass() {
-        RemoteDownstreamConfig.Agent.SERVICE_ID = 1;
-        RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = 1;
-    }
-
     @AfterClass
     public static void afterClass() {
         ServiceManager.INSTANCE.shutdown();
@@ -105,10 +96,11 @@ public class TraceSegmentServiceClientTest {
         Whitebox.setInternalState(ServiceManager.INSTANCE.findService(GRPCChannelManager.class), "reconnect", false);
         spy(serviceClient);
 
-        Whitebox.setInternalState(serviceClient, "serviceStub", TraceSegmentReportServiceGrpc.newStub(grpcServerRule.getChannel()));
+        Whitebox.setInternalState(
+            serviceClient, "serviceStub", TraceSegmentReportServiceGrpc.newStub(grpcServerRule.getChannel()));
         Whitebox.setInternalState(serviceClient, "status", GRPCChannelStatus.CONNECTED);
 
-        upstreamSegments = new ArrayList<UpstreamSegment>();
+        upstreamSegments = new ArrayList<>();
     }
 
     @Test
@@ -125,13 +117,11 @@ public class TraceSegmentServiceClientTest {
         serviceClient.consume(storage.getTraceSegments());
 
         assertThat(upstreamSegments.size(), is(1));
-        UpstreamSegment upstreamSegment = upstreamSegments.get(0);
-        assertThat(upstreamSegment.getGlobalTraceIdsCount(), is(1));
-        SegmentObject traceSegmentObject = SegmentObject.parseFrom(upstreamSegment.getSegment());
+        SegmentObject traceSegmentObject = upstreamSegments.get(0);
         assertThat(traceSegmentObject.getSpans(0).getRefsCount(), is(0));
         assertThat(traceSegmentObject.getSpansCount(), is(1));
 
-        SpanObjectV2 spanObject = traceSegmentObject.getSpans(0);
+        SpanObject spanObject = traceSegmentObject.getSpans(0);
         assertThat(spanObject.getSpanType(), is(SpanType.Entry));
         assertThat(spanObject.getSpanId(), is(0));
         assertThat(spanObject.getParentSpanId(), is(-1));
@@ -152,7 +142,8 @@ public class TraceSegmentServiceClientTest {
 
         assertThat(upstreamSegments.size(), is(0));
 
-        boolean reconnect = Whitebox.getInternalState(ServiceManager.INSTANCE.findService(GRPCChannelManager.class), "reconnect");
+        boolean reconnect = Whitebox.getInternalState(
+            ServiceManager.INSTANCE.findService(GRPCChannelManager.class), "reconnect");
         assertThat(reconnect, is(true));
 
     }
diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java
index d978eda..122c724 100644
--- a/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java
@@ -27,7 +27,7 @@ import java.util.List;
 import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
 import org.apache.skywalking.apm.agent.core.conf.Config;
 import org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
 import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
@@ -166,7 +166,8 @@ public class DubboInterceptorTest {
     @Test
     public void testProviderWithAttachment() throws Throwable {
         when(rpcContext.isConsumerSide()).thenReturn(false);
-        when(rpcContext.getAttachment(SW6CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4zMjMuNDQzMw==-3-1-1-IzE5Mi4xNjguMS44IDoxODAwMg==-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
+        when(rpcContext.getAttachment(
+            SW8CarrierItem.HEADER_NAME)).thenReturn("1-My40LjU=-MS4yLjM=-3-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=");
 
         dubboInterceptor.beforeMethod(enhancedInstance, null, allArguments, argumentTypes, methodInterceptResult);
         dubboInterceptor.afterMethod(enhancedInstance, null, allArguments, argumentTypes, result);
@@ -198,8 +199,8 @@ public class DubboInterceptorTest {
 
     private void assertTraceSegmentRef(TraceSegmentRef actual) {
         assertThat(SegmentRefHelper.getSpanId(actual), is(3));
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(actual), is(1));
-        assertThat(SegmentRefHelper.getTraceSegmentId(actual).toString(), is("1.323.4433"));
+        assertThat(SegmentRefHelper.getParentServiceInstance(actual), is("instance"));
+        assertThat(SegmentRefHelper.getTraceSegmentId(actual), is("3.4.5"));
     }
 
     private void assertProviderSpan(AbstractTracingSpan span) {
diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/dubbo-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java
index 89b6da7..8bff8ae 100644
--- a/apm-sniffer/apm-sdk-plugin/dubbo-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/dubbo-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java
@@ -27,7 +27,7 @@ import java.util.List;
 import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
 import org.apache.skywalking.apm.agent.core.conf.Config;
 import org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
 import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
@@ -165,7 +165,8 @@ public class DubboInterceptorTest {
     @Test
     public void testProviderWithAttachment() throws Throwable {
         when(rpcContext.isConsumerSide()).thenReturn(false);
-        when(rpcContext.getAttachment(SW6CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4zMjMuNDQzMw==-3-1-1-IzE5Mi4xNjguMS44IDoxODAwMg==-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
+        when(rpcContext.getAttachment(
+            SW8CarrierItem.HEADER_NAME)).thenReturn("1-My40LjU=-MS4yLjM=-3-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=");
 
         dubboInterceptor.beforeMethod(enhancedInstance, null, allArguments, argumentTypes, methodInterceptResult);
         dubboInterceptor.afterMethod(enhancedInstance, null, allArguments, argumentTypes, result);
@@ -197,8 +198,8 @@ public class DubboInterceptorTest {
 
     private void assertTraceSegmentRef(TraceSegmentRef actual) {
         assertThat(SegmentRefHelper.getSpanId(actual), is(3));
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(actual), is(1));
-        assertThat(SegmentRefHelper.getTraceSegmentId(actual).toString(), is("1.323.4433"));
+        assertThat(SegmentRefHelper.getParentServiceInstance(actual), is("instance"));
+        assertThat(SegmentRefHelper.getTraceSegmentId(actual).toString(), is("3.4.5"));
     }
 
     private void assertProviderSpan(AbstractTracingSpan span) {
diff --git a/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/finagle/CodecUtilsTest.java b/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/finagle/CodecUtilsTest.java
index 0b8454d..f759d2f 100644
--- a/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/finagle/CodecUtilsTest.java
+++ b/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/finagle/CodecUtilsTest.java
@@ -21,7 +21,7 @@ package org.apache.skywalking.apm.plugin.finagle;
 import com.twitter.io.Bufs;
 import org.apache.skywalking.apm.agent.core.context.CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.junit.Test;
 
 import java.util.HashMap;
@@ -54,7 +54,7 @@ public class CodecUtilsTest {
         CarrierItem next = contextCarrier.items();
         while (next.hasNext()) {
             next = next.next();
-            if (next.getHeadKey().equals(SW6CarrierItem.HEADER_NAME)) {
+            if (next.getHeadKey().equals(SW8CarrierItem.HEADER_NAME)) {
                 next.setHeadValue(UUID.randomUUID().toString());
             }
         }
diff --git a/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/finagle/ServerTracingFilterInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/finagle/ServerTracingFilterInterceptorTest.java
index a51305b..e8aa547 100644
--- a/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/finagle/ServerTracingFilterInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/finagle/ServerTracingFilterInterceptorTest.java
@@ -21,7 +21,7 @@ package org.apache.skywalking.apm.plugin.finagle;
 import com.twitter.finagle.context.Contexts;
 import org.apache.skywalking.apm.agent.core.context.CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentRef;
@@ -109,7 +109,7 @@ public class ServerTracingFilterInterceptorTest extends AbstractTracingFilterTes
         CarrierItem next = contextCarrier.items();
         while (next.hasNext()) {
             next = next.next();
-            if (next.getHeadKey().equals(SW6CarrierItem.HEADER_NAME)) {
+            if (next.getHeadKey().equals(SW8CarrierItem.HEADER_NAME)) {
                 next.setHeadValue("1-MC4wLjA=-MS4zMjMuNDQzMw==-3-1-1-IzE5Mi4xNjguMS44IDoxODAwMg==-Iy9wb3J0Y" +
                         "Wwv-Iy90ZXN0RW50cnlTcGFu");
             }
@@ -138,7 +138,7 @@ public class ServerTracingFilterInterceptorTest extends AbstractTracingFilterTes
         TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
         TraceSegmentRef actual = traceSegment.getRefs().get(0);
         assertThat(SegmentRefHelper.getSpanId(actual), is(3));
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(actual), is(1));
-        assertThat(SegmentRefHelper.getTraceSegmentId(actual).toString(), is("1.323.4433"));
+        assertThat(SegmentRefHelper.getParentServiceInstance(actual), is("instance"));
+        assertThat(SegmentRefHelper.getTraceSegmentId(actual).toString(), is("3.4.5"));
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java
index f2f7393..e7eee05 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java
@@ -19,7 +19,7 @@
 package org.apache.skywalking.apm.plugin.jetty.v9.server;
 
 import java.util.List;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
 import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
@@ -108,7 +108,8 @@ public class HandleInterceptorTest {
 
     @Test
     public void testWithSerializedContextData() throws Throwable {
-        when(request.getHeader(SW6CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
+        when(request.getHeader(
+            SW8CarrierItem.HEADER_NAME)).thenReturn("1-My40LjU=-MS4yLjM=-3-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=");
 
         jettyInvokeInterceptor.beforeMethod(service, null, arguments, argumentType, methodInterceptResult);
         jettyInvokeInterceptor.afterMethod(service, null, arguments, argumentType, null);
@@ -138,7 +139,7 @@ public class HandleInterceptorTest {
     }
 
     private void assertTraceSegmentRef(TraceSegmentRef ref) {
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1));
+        assertThat(SegmentRefHelper.getParentServiceInstance(ref), is("instance"));
         assertThat(SegmentRefHelper.getSpanId(ref), is(3));
         assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111"));
     }
diff --git a/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/KafkaConsumerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/KafkaConsumerInterceptorTest.java
index d04905a..6393046 100644
--- a/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/KafkaConsumerInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/KafkaConsumerInterceptorTest.java
@@ -24,7 +24,7 @@ import java.util.List;
 import java.util.Map;
 import org.apache.kafka.clients.consumer.ConsumerRecord;
 import org.apache.kafka.common.TopicPartition;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
@@ -97,8 +97,11 @@ public class KafkaConsumerInterceptorTest {
         List<ConsumerRecord> records = new ArrayList<ConsumerRecord>();
         ConsumerRecord consumerRecord = new ConsumerRecord("test", 1, 0, "1", "1");
         consumerRecord.headers()
-                      .add(SW6CarrierItem.HEADER_NAME, "1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-I3Rlc3RFbnRyeVNwYW4="
-                          .getBytes());
+                      .add(
+                          SW8CarrierItem.HEADER_NAME,
+                          "1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-I3Rlc3RFbnRyeVNwYW4="
+                              .getBytes()
+                      );
         records.add(consumerRecord);
         messages.put(topicPartition, records);
     }
@@ -106,7 +109,8 @@ public class KafkaConsumerInterceptorTest {
     @Test
     public void testConsumerWithoutMessage() throws Throwable {
         consumerInterceptor.beforeMethod(consumerInstance, null, new Object[0], new Class[0], null);
-        consumerInterceptor.afterMethod(consumerInstance, null, new Object[0], new Class[0], new HashMap<TopicPartition, List<ConsumerRecord>>());
+        consumerInterceptor.afterMethod(
+            consumerInstance, null, new Object[0], new Class[0], new HashMap<TopicPartition, List<ConsumerRecord>>());
 
         List<TraceSegment> traceSegments = segmentStorage.getTraceSegments();
         assertThat(traceSegments.size(), is(0));
@@ -139,7 +143,7 @@ public class KafkaConsumerInterceptorTest {
     }
 
     private void assertTraceSegmentRef(TraceSegmentRef ref) {
-        MatcherAssert.assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1));
+        MatcherAssert.assertThat(SegmentRefHelper.getParentServiceInstance(ref), is("instance"));
         MatcherAssert.assertThat(SegmentRefHelper.getSpanId(ref), is(3));
         MatcherAssert.assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111"));
     }
diff --git a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanProviderInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanProviderInterceptorTest.java
index e0c521b..aee2c16 100644
--- a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanProviderInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanProviderInterceptorTest.java
@@ -23,17 +23,21 @@ import com.weibo.api.motan.rpc.Response;
 import com.weibo.api.motan.rpc.URL;
 import java.util.HashMap;
 import java.util.List;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
 import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
+import org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentRef;
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
 import org.apache.skywalking.apm.agent.test.helper.SegmentHelper;
+import org.apache.skywalking.apm.agent.test.helper.SegmentRefHelper;
 import org.apache.skywalking.apm.agent.test.helper.SpanHelper;
 import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule;
 import org.apache.skywalking.apm.agent.test.tools.SegmentStorage;
 import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint;
 import org.apache.skywalking.apm.agent.test.tools.SpanAssert;
+import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
 import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
 import org.hamcrest.MatcherAssert;
 import org.junit.Before;
@@ -43,16 +47,12 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.powermock.modules.junit4.PowerMockRunner;
 import org.powermock.modules.junit4.PowerMockRunnerDelegate;
-import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
-import org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentRef;
-import org.apache.skywalking.apm.agent.test.helper.SegmentRefHelper;
-import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
 
+import static org.apache.skywalking.apm.agent.test.tools.SpanAssert.assertComponent;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.when;
-import static org.apache.skywalking.apm.agent.test.tools.SpanAssert.assertComponent;
 
 @RunWith(PowerMockRunner.class)
 @PowerMockRunnerDelegate(TracingSegmentRunner.class)
@@ -107,7 +107,10 @@ public class MotanProviderInterceptorTest {
     @Test
     public void testInvokerWithRefSegment() throws Throwable {
         HashMap attachments = new HashMap();
-        attachments.put(SW6CarrierItem.HEADER_NAME, "1-MC4wLjA=-MS4xMjMuNDU2-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
+        attachments.put(
+            SW8CarrierItem.HEADER_NAME,
+            "1-MC4wLjA=-MS4xMjMuNDU2-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu"
+        );
         when(request.getAttachments()).thenReturn(attachments);
 
         invokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, null);
@@ -134,7 +137,8 @@ public class MotanProviderInterceptorTest {
     public void testOccurException() throws Throwable {
 
         invokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, null);
-        invokeInterceptor.handleMethodException(enhancedInstance, null, arguments, argumentType, new RuntimeException());
+        invokeInterceptor.handleMethodException(
+            enhancedInstance, null, arguments, argumentType, new RuntimeException());
         invokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, response);
 
         assertTraceSegmentWhenOccurException();
@@ -153,12 +157,15 @@ public class MotanProviderInterceptorTest {
     private void assertRefSegment(TraceSegmentRef primaryRef) {
         assertThat(SegmentRefHelper.getTraceSegmentId(primaryRef).toString(), is("1.123.456"));
         assertThat(SegmentRefHelper.getSpanId(primaryRef), is(3));
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(primaryRef), is(1));
+        MatcherAssert.assertThat(SegmentRefHelper.getParentServiceInstance(primaryRef), is("instance"));
         assertThat(SegmentRefHelper.getPeerHost(primaryRef), is("192.168.1.8:18002"));
     }
 
     private void assertMotanProviderSpan(AbstractTracingSpan span) {
-        assertThat(span.getOperationName(), is("org.apache.skywalking.apm.test.TestService.test(java.lang.String, java.lang.Object)"));
+        assertThat(
+            span.getOperationName(),
+            is("org.apache.skywalking.apm.test.TestService.test(java.lang.String, java.lang.Object)")
+        );
         assertComponent(span, ComponentsDefine.MOTAN);
         assertThat(span.isEntry(), is(true));
         SpanAssert.assertLayer(span, SpanLayer.RPC_FRAMEWORK);
diff --git a/apm-sniffer/apm-sdk-plugin/pulsar-plugin/src/test/java/org/apache/skywalking/apm/plugin/pulsar/PulsarConsumerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/pulsar-plugin/src/test/java/org/apache/skywalking/apm/plugin/pulsar/PulsarConsumerInterceptorTest.java
index e871755..3316312 100644
--- a/apm-sniffer/apm-sdk-plugin/pulsar-plugin/src/test/java/org/apache/skywalking/apm/plugin/pulsar/PulsarConsumerInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/pulsar-plugin/src/test/java/org/apache/skywalking/apm/plugin/pulsar/PulsarConsumerInterceptorTest.java
@@ -19,7 +19,7 @@
 package org.apache.skywalking.apm.plugin.pulsar;
 
 import org.apache.pulsar.common.api.proto.PulsarApi;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
@@ -85,7 +85,7 @@ public class PulsarConsumerInterceptorTest {
         msg = new MockMessage();
         msg.getMessageBuilder()
            .addProperties(PulsarApi.KeyValue.newBuilder()
-                                            .setKey(SW6CarrierItem.HEADER_NAME)
+                                            .setKey(SW8CarrierItem.HEADER_NAME)
                                             .setValue("1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-I3Rlc3RFbnRyeVNwYW4="));
     }
 
@@ -125,7 +125,7 @@ public class PulsarConsumerInterceptorTest {
     }
 
     private void assertTraceSegmentRef(TraceSegmentRef ref) {
-        MatcherAssert.assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1));
+        MatcherAssert.assertThat(SegmentRefHelper.getParentServiceInstance(ref), is("instance"));
         MatcherAssert.assertThat(SegmentRefHelper.getSpanId(ref), is(3));
         MatcherAssert.assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111"));
     }
diff --git a/apm-sniffer/apm-sdk-plugin/rabbitmq-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/rabbitmq/RabbitMQConsumerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/rabbitmq-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/rabbitmq/RabbitMQConsumerInterceptorTest.java
index fc3ef50..8c220bd 100644
--- a/apm-sniffer/apm-sdk-plugin/rabbitmq-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/rabbitmq/RabbitMQConsumerInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/rabbitmq-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/rabbitmq/RabbitMQConsumerInterceptorTest.java
@@ -20,7 +20,7 @@ package org.apache.skywalking.apm.plugin.rabbitmq;
 
 import com.rabbitmq.client.AMQP;
 import com.rabbitmq.client.Envelope;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
 import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule;
@@ -73,7 +73,7 @@ public class RabbitMQConsumerInterceptorTest {
     public void TestRabbitMQConsumerInterceptor() throws Throwable {
         Envelope envelope = new Envelope(1111, false, "", "rabbitmq-test");
         Map<String, Object> headers = new HashMap<String, Object>();
-        headers.put(SW6CarrierItem.HEADER_NAME, "1-MS4xLjE1NDM5NzU1OTEwMTQwMDAx-MS4xLjE1NDM5NzU1OTA5OTcwMDAw-0-1-1-IzEyNy4wLjAuMTo1Mjcy-I1JhYmJpdE1RL1RvcGljL1F1ZXVlL3JhYmJpdG1xLXRlc3QvUHJvZHVjZXI=-I1JhYmJpdE1RL1RvcGljL1F1ZXVlL3JhYmJpdG1xLXRlc3QvUHJvZHVjZXI=");
+        headers.put(SW8CarrierItem.HEADER_NAME, "1-MS4xLjE1NDM5NzU1OTEwMTQwMDAx-MS4xLjE1NDM5NzU1OTA5OTcwMDAw-0-1-1-IzEyNy4wLjAuMTo1Mjcy-I1JhYmJpdE1RL1RvcGljL1F1ZXVlL3JhYmJpdG1xLXRlc3QvUHJvZHVjZXI=-I1JhYmJpdE1RL1RvcGljL1F1ZXVlL3JhYmJpdG1xLXRlc3QvUHJvZHVjZXI=");
         AMQP.BasicProperties.Builder propsBuilder = new AMQP.BasicProperties.Builder();
         Object[] arguments = new Object[] {
             0,
diff --git a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/resteasy/v3/server/AssertTools.java b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/resteasy/v3/server/AssertTools.java
index a737fa9..81711aa 100644
--- a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/resteasy/v3/server/AssertTools.java
+++ b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/resteasy/v3/server/AssertTools.java
@@ -32,7 +32,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 class AssertTools {
 
     static void assertTraceSegmentRef(TraceSegmentRef ref) {
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1));
+        assertThat(SegmentRefHelper.getParentServiceInstance(ref), is("instance"));
         assertThat(SegmentRefHelper.getSpanId(ref), is(3));
         assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111"));
     }
diff --git a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/resteasy/v3/server/SynchronousDispatcherInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/resteasy/v3/server/SynchronousDispatcherInterceptorTest.java
index cda9c71..2c45b7a 100644
--- a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/resteasy/v3/server/SynchronousDispatcherInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/resteasy/v3/server/SynchronousDispatcherInterceptorTest.java
@@ -21,7 +21,7 @@ package org.apache.skywalking.apm.plugin.resteasy.v3.server;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.List;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
@@ -136,7 +136,7 @@ public class SynchronousDispatcherInterceptorTest {
     @Test
     public void testWithSW6SerializedContextData() throws Throwable {
         MultivaluedMapImpl<String, String> multivaluedMap = new MultivaluedMapImpl<String, String>();
-        multivaluedMap.putSingle(SW6CarrierItem.HEADER_NAME, "1-I0FRQSojQVFBKkV0MFdlMHRRTlFBKg==-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
+        multivaluedMap.putSingle(SW8CarrierItem.HEADER_NAME, "1-I0FRQSojQVFBKkV0MFdlMHRRTlFBKg==-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
         when(request.getHttpHeaders()).thenReturn(new ResteasyHttpHeaders(multivaluedMap));
 
         synchronousDispatcherInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
diff --git a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcProviderInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcProviderInterceptorTest.java
index 64c0042..032c3b8 100644
--- a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcProviderInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcProviderInterceptorTest.java
@@ -25,7 +25,7 @@ import com.alipay.sofa.rpc.core.response.SofaResponse;
 import com.alipay.sofa.rpc.filter.ProviderInvoker;
 import java.util.List;
 import org.apache.skywalking.apm.agent.core.conf.Config;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
@@ -117,7 +117,7 @@ public class SofaRpcProviderInterceptorTest {
     @Test
     public void testProviderWithAttachment() throws Throwable {
         when(rpcContext.isConsumerSide()).thenReturn(false);
-        when(sofaRequest.getRequestProp(SKYWALKING_PREFIX + SW6CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4zMjMuNDQzMw==-3-1-1-IzE5Mi4xNjguMS44IDoxODAwMg==-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
+        when(sofaRequest.getRequestProp(SKYWALKING_PREFIX + SW8CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4zMjMuNDQzMw==-3-1-1-IzE5Mi4xNjguMS44IDoxODAwMg==-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
 
         sofaRpcProviderInterceptor.beforeMethod(enhancedInstance, null, allArguments, argumentTypes, methodInterceptResult);
         sofaRpcProviderInterceptor.afterMethod(enhancedInstance, null, allArguments, argumentTypes, sofaResponse);
@@ -133,8 +133,8 @@ public class SofaRpcProviderInterceptorTest {
 
     private void assertTraceSegmentRef(TraceSegmentRef actual) {
         assertThat(SegmentRefHelper.getSpanId(actual), is(3));
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(actual), is(1));
-        assertThat(SegmentRefHelper.getTraceSegmentId(actual).toString(), is("1.323.4433"));
+        assertThat(SegmentRefHelper.getParentServiceInstance(actual), is("instance"));
+        assertThat(SegmentRefHelper.getTraceSegmentId(actual).toString(), is("3.4.5"));
     }
 
     private void assertProviderSpan(AbstractTracingSpan span) {
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java
index 45022f7..5cc382d 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java
@@ -162,7 +162,7 @@ public class RequestMappingMethodInterceptorTest {
     }
 
     private void assertTraceSegmentRef(TraceSegmentRef ref) {
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1));
+        assertThat(SegmentRefHelper.getParentServiceInstance(ref), is("instance"));
         assertThat(SegmentRefHelper.getSpanId(ref), is(3));
         assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.444.555"));
     }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java
index e0d49f5..e5eebb2 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java
@@ -201,7 +201,8 @@ public class RestMappingMethodInterceptorTest {
                 RestMappingClass1 mappingClass1 = new RestMappingClass1();
                 Method m = mappingClass1.getClass().getMethod("deleteRequestURL");
                 when(request.getRequestURI()).thenReturn("/test/testRequestURL");
-                when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/test/deleteRequestURL"));
+                when(request.getRequestURL()).thenReturn(
+                    new StringBuffer("http://localhost:8080/test/deleteRequestURL"));
                 ServletRequestAttributes servletRequestAttributes = new ServletRequestAttributes(request, response);
                 RequestContextHolder.setRequestAttributes(servletRequestAttributes);
 
@@ -227,7 +228,8 @@ public class RestMappingMethodInterceptorTest {
                 RestMappingClass1 mappingClass1 = new RestMappingClass1();
                 Method m = mappingClass1.getClass().getMethod("patchRequestURL");
                 when(request.getRequestURI()).thenReturn("/test/testRequestURL");
-                when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/test/patchRequestURL"));
+                when(request.getRequestURL()).thenReturn(
+                    new StringBuffer("http://localhost:8080/test/patchRequestURL"));
                 ServletRequestAttributes servletRequestAttributes = new ServletRequestAttributes(request, response);
                 RequestContextHolder.setRequestAttributes(servletRequestAttributes);
 
@@ -299,7 +301,7 @@ public class RestMappingMethodInterceptorTest {
     }
 
     private void assertTraceSegmentRef(TraceSegmentRef ref) {
-        MatcherAssert.assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1));
+        MatcherAssert.assertThat(SegmentRefHelper.getParentServiceInstance(ref), is("instance"));
         assertThat(SegmentRefHelper.getSpanId(ref), is(3));
         MatcherAssert.assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.444.555"));
     }
diff --git a/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/struts2/Struts2InterceptorTest.java b/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/struts2/Struts2InterceptorTest.java
index 4feda6d..eb58f9e 100644
--- a/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/struts2/Struts2InterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/struts2/Struts2InterceptorTest.java
@@ -22,7 +22,7 @@ import com.opensymphony.xwork2.ActionContext;
 import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.struts2.StrutsStatics;
 import org.junit.Before;
 import org.junit.Rule;
@@ -136,7 +136,8 @@ public class Struts2InterceptorTest {
 
     @Test
     public void testWithSerializedContextData() throws Throwable {
-        when(request.getHeader(SW6CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
+        when(request.getHeader(
+            SW8CarrierItem.HEADER_NAME)).thenReturn("1-My40LjU=-MS4yLjM=-3-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=");
 
         struts2Interceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
         struts2Interceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null);
@@ -166,7 +167,7 @@ public class Struts2InterceptorTest {
     }
 
     private void assertTraceSegmentRef(TraceSegmentRef ref) {
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1));
+        assertThat(SegmentRefHelper.getParentServiceInstance(ref), is("instance"));
         assertThat(SegmentRefHelper.getSpanId(ref), is(3));
         assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111"));
     }
diff --git a/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/tomcat78x/TomcatInvokeInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/tomcat78x/TomcatInvokeInterceptorTest.java
index d4c8277..ec32d02 100644
--- a/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/tomcat78x/TomcatInvokeInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/tomcat78x/TomcatInvokeInterceptorTest.java
@@ -22,7 +22,7 @@ import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.catalina.connector.Request;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
@@ -121,7 +121,8 @@ public class TomcatInvokeInterceptorTest {
 
     @Test
     public void testWithSerializedContextData() throws Throwable {
-        when(request.getHeader(SW6CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
+        when(request.getHeader(
+            SW8CarrierItem.HEADER_NAME)).thenReturn("1-My40LjU=-MS4yLjM=-3-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=");
 
         tomcatInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
         tomcatInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null);
@@ -167,7 +168,7 @@ public class TomcatInvokeInterceptorTest {
     }
 
     private void assertTraceSegmentRef(TraceSegmentRef ref) {
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1));
+        assertThat(SegmentRefHelper.getParentServiceInstance(ref), is("instance"));
         assertThat(SegmentRefHelper.getSpanId(ref), is(3));
         assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111"));
     }
diff --git a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/undertow/v2x/TracingHandlerTest.java b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/undertow/v2x/TracingHandlerTest.java
index ed424b4..fdc52db 100644
--- a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/undertow/v2x/TracingHandlerTest.java
+++ b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/undertow/v2x/TracingHandlerTest.java
@@ -25,7 +25,7 @@ import io.undertow.util.HeaderMap;
 import io.undertow.util.HttpString;
 import io.undertow.util.Methods;
 import io.undertow.util.StatusCodes;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
@@ -100,7 +100,7 @@ public class TracingHandlerTest {
         TracingHandler handler = new TracingHandler(httpHandler);
         HttpServerExchange exchange = buildExchange();
         exchange.getRequestHeaders()
-                .put(HttpString.tryFromString(SW6CarrierItem.HEADER_NAME), "1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
+                .put(HttpString.tryFromString(SW8CarrierItem.HEADER_NAME), "1-My40LjU=-MS4yLjM=-3-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=");
         handler.handleRequest(exchange);
         exchange.endExchange();
 
@@ -133,7 +133,7 @@ public class TracingHandlerTest {
     }
 
     private void assertTraceSegmentRef(TraceSegmentRef ref) {
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1));
+        assertThat(SegmentRefHelper.getParentServiceInstance(ref), is("instance"));
         assertThat(SegmentRefHelper.getSpanId(ref), is(3));
         assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111"));
     }
diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/core/context/MockContextSnapshot.java b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/core/context/MockContextSnapshot.java
index e725999..117485f 100644
--- a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/core/context/MockContextSnapshot.java
+++ b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/core/context/MockContextSnapshot.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.agent.core.context;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId;
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
 import org.apache.skywalking.apm.agent.core.context.ids.NewDistributedTraceId;
 
 public enum MockContextSnapshot {
@@ -33,12 +32,8 @@ public enum MockContextSnapshot {
         List<DistributedTraceId> distributedTraceIds = new ArrayList<DistributedTraceId>();
         distributedTraceIds.add(new NewDistributedTraceId());
 
-        contextSnapshot = new ContextSnapshot(new ID(1, 2, 3), 1, distributedTraceIds, new CorrelationContext());
-        contextSnapshot.setEntryApplicationInstanceId(1);
-        contextSnapshot.setEntryOperationId(0);
-        contextSnapshot.setEntryOperationName("/for-test-entryOperationName");
-        contextSnapshot.setParentOperationId(0);
-        contextSnapshot.setParentOperationName("/for-test-parentOperationName");
+        contextSnapshot = new ContextSnapshot(
+            "1, 2, 3", 1, new NewDistributedTraceId(), "/for-test-entryOperationName", new CorrelationContext());
     }
 
     public ContextSnapshot mockContextSnapshot() {
diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SegmentRefHelper.java b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SegmentRefHelper.java
index 6693d05..1eb99d0 100644
--- a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SegmentRefHelper.java
+++ b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SegmentRefHelper.java
@@ -18,7 +18,6 @@
 
 package org.apache.skywalking.apm.agent.test.helper;
 
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentRef;
 
 public class SegmentRefHelper {
@@ -31,9 +30,9 @@ public class SegmentRefHelper {
         return null;
     }
 
-    public static ID getTraceSegmentId(TraceSegmentRef ref) {
+    public static String getTraceSegmentId(TraceSegmentRef ref) {
         try {
-            return FieldGetter.getValue(ref, "traceSegmentId");
+            return FieldGetter.getValue(ref, "traceId");
         } catch (Exception e) {
         }
 
@@ -49,12 +48,12 @@ public class SegmentRefHelper {
         return -1;
     }
 
-    public static int getEntryServiceInstanceId(TraceSegmentRef ref) {
+    public static String getParentServiceInstance(TraceSegmentRef ref) {
         try {
-            return FieldGetter.getValue(ref, "entryServiceInstanceId");
+            return FieldGetter.getValue(ref, "parentServiceInstance");
         } catch (Exception e) {
         }
 
-        return -1;
+        return "Unknown";
     }
 }
diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/AgentServiceRule.java b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/AgentServiceRule.java
index 20e3f8a..a12da5a 100644
--- a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/AgentServiceRule.java
+++ b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/AgentServiceRule.java
@@ -20,17 +20,16 @@ package org.apache.skywalking.apm.agent.test.tools;
 
 import java.util.HashMap;
 import java.util.LinkedList;
-import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig;
-import org.apache.skywalking.apm.agent.core.context.TracingContext;
-import org.apache.skywalking.apm.agent.core.plugin.loader.AgentClassLoader;
-import org.junit.rules.ExternalResource;
 import org.apache.skywalking.apm.agent.core.boot.BootService;
 import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
 import org.apache.skywalking.apm.agent.core.conf.Config;
 import org.apache.skywalking.apm.agent.core.context.IgnoredTracerContext;
+import org.apache.skywalking.apm.agent.core.context.TracingContext;
 import org.apache.skywalking.apm.agent.core.context.TracingContextListener;
 import org.apache.skywalking.apm.agent.core.logging.core.LogLevel;
+import org.apache.skywalking.apm.agent.core.plugin.loader.AgentClassLoader;
 import org.apache.skywalking.apm.agent.test.helper.FieldSetter;
+import org.junit.rules.ExternalResource;
 
 public class AgentServiceRule extends ExternalResource {
 
@@ -38,9 +37,12 @@ public class AgentServiceRule extends ExternalResource {
     protected void after() {
         super.after();
         try {
-            FieldSetter.setValue(ServiceManager.INSTANCE.getClass(), "bootedServices", new HashMap<Class, BootService>());
-            FieldSetter.setValue(IgnoredTracerContext.ListenerManager.class, "LISTENERS", new LinkedList<TracingContextListener>());
-            FieldSetter.setValue(TracingContext.ListenerManager.class, "LISTENERS", new LinkedList<TracingContextListener>());
+            FieldSetter.setValue(
+                ServiceManager.INSTANCE.getClass(), "bootedServices", new HashMap<Class, BootService>());
+            FieldSetter.setValue(
+                IgnoredTracerContext.ListenerManager.class, "LISTENERS", new LinkedList<TracingContextListener>());
+            FieldSetter.setValue(
+                TracingContext.ListenerManager.class, "LISTENERS", new LinkedList<TracingContextListener>());
             ServiceManager.INSTANCE.shutdown();
         } catch (Exception e) {
         }
@@ -52,7 +54,5 @@ public class AgentServiceRule extends ExternalResource {
         AgentClassLoader.initDefaultLoader();
         Config.Logging.LEVEL = LogLevel.OFF;
         ServiceManager.INSTANCE.boot();
-        RemoteDownstreamConfig.Agent.SERVICE_ID = 1;
-        RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = 1;
     }
 }
diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/SegmentRefAssert.java b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/SegmentRefAssert.java
index 55487ab..8252cc8 100644
--- a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/SegmentRefAssert.java
+++ b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/SegmentRefAssert.java
@@ -36,9 +36,4 @@ public class SegmentRefAssert {
     public static void assertPeerHost(TraceSegmentRef ref, String peerHost) {
         assertThat(SegmentRefHelper.getPeerHost(ref), is(peerHost));
     }
-
-    public static void assertEntryApplicationInstanceId(TraceSegmentRef ref, int entryApplicationInstanceID) {
-        assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(entryApplicationInstanceID));
-    }
-
 }
diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/opentracing/SkywalkingSpanActivationTest.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/opentracing/SkywalkingSpanActivationTest.java
index d5a672c..477675d 100644
--- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/opentracing/SkywalkingSpanActivationTest.java
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/opentracing/SkywalkingSpanActivationTest.java
@@ -26,16 +26,15 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-
 import org.apache.skywalking.apm.agent.core.base64.Base64;
 import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
-import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
-import org.apache.skywalking.apm.agent.core.context.ids.ID;
+import org.apache.skywalking.apm.agent.core.context.SW8CarrierItem;
 import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
 import org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentRef;
 import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
 import org.apache.skywalking.apm.agent.test.helper.SegmentHelper;
+import org.apache.skywalking.apm.agent.test.helper.SegmentRefHelper;
 import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule;
 import org.apache.skywalking.apm.agent.test.tools.SegmentRefAssert;
 import org.apache.skywalking.apm.agent.test.tools.SegmentStorage;
@@ -219,10 +218,9 @@ public class SkywalkingSpanActivationTest {
             carrier
         }, null, null);
 
-        String[] parts = values.get(SW6CarrierItem.HEADER_NAME).split("-", 9);
+        String[] parts = values.get(SW8CarrierItem.HEADER_NAME).split("-", 9);
         Assert.assertEquals("0", parts[3]);
         Assert.assertEquals(Base64.encode("#127.0.0.1:8080"), parts[6]);
-        Assert.assertTrue(new ID(Base64.decode2UTFString(parts[1])).isValid());
         stopSpan();
     }
 
@@ -246,7 +244,10 @@ public class SkywalkingSpanActivationTest {
 
         };
 
-        values.put(SW6CarrierItem.HEADER_NAME, "1-NDM0LjEyLjEyMTIz-MS4zNDMuMjIy-3-1-1-IzEyNy4wLjAuMTo4MDgw-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
+        values.put(
+            SW8CarrierItem.HEADER_NAME,
+            "1-NDM0LjEyLjEyMTIz-MS4zNDMuMjIy-3-1-1-IzEyNy4wLjAuMTo4MDgw-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu"
+        );
 
         extractInterceptor.afterMethod(enhancedInstance, null, new Object[] {
             Format.Builtin.TEXT_MAP,
@@ -260,7 +261,7 @@ public class SkywalkingSpanActivationTest {
         TraceSegmentRef ref = tracingSegment.getRefs().get(0);
         SegmentRefAssert.assertSegmentId(ref, "1.343.222");
         SegmentRefAssert.assertSpanId(ref, 3);
-        SegmentRefAssert.assertEntryApplicationInstanceId(ref, 1);
+        assertThat(SegmentRefHelper.getParentServiceInstance(ref), is("instance"));
         SegmentRefAssert.assertPeerHost(ref, "127.0.0.1:8080");
         assertThat(spans.size(), is(1));
         assertSpanCommonsAttribute(spans.get(0));
@@ -287,7 +288,7 @@ public class SkywalkingSpanActivationTest {
 
         };
 
-        values.put(SW6CarrierItem.HEADER_NAME, "aaaaaaaa|3|#192.168.1.8:18002|#/portal/|#/testEntrySpan|1.234.444");
+        values.put(SW8CarrierItem.HEADER_NAME, "aaaaaaaa|3|#192.168.1.8:18002|#/portal/|#/testEntrySpan|1.234.444");
 
         extractInterceptor.afterMethod(enhancedInstance, null, new Object[] {
             Format.Builtin.TEXT_MAP,
@@ -313,7 +314,8 @@ public class SkywalkingSpanActivationTest {
                 MockEnhancedInstance enhancedInstance = new MockEnhancedInstance();
                 try {
                     startSpan(enhancedInstance);
-                    activateInterceptor.afterMethod(continuationHolder, SkywalkingContinuation.class.getMethod("activate"), null, null, null);
+                    activateInterceptor.afterMethod(
+                        continuationHolder, SkywalkingContinuation.class.getMethod("activate"), null, null, null);
                 } catch (Throwable throwable) {
                     throwable.printStackTrace();
                 } finally {
@@ -359,7 +361,10 @@ public class SkywalkingSpanActivationTest {
         constructorWithSpanBuilderInterceptor.onConstruct(enhancedInstance, new Object[] {spanBuilder});
         spanLogInterceptor.afterMethod(enhancedInstance, null, logArgument, logArgumentType, null);
 
-        setOperationNameInterceptor.afterMethod(enhancedInstance, SkywalkingSpan.class.getMethod("setOperationName", String.class), setOperationNameArgument, setOperationNameArgumentType, null);
+        setOperationNameInterceptor.afterMethod(
+            enhancedInstance, SkywalkingSpan.class.getMethod("setOperationName", String.class),
+            setOperationNameArgument, setOperationNameArgumentType, null
+        );
     }
 
     private class MockEnhancedInstance implements EnhancedInstance {
diff --git a/docs/en/protocols/Skywalking-Cross-Process-Propagation-Headers-Protocol-v3.md b/docs/en/protocols/Skywalking-Cross-Process-Propagation-Headers-Protocol-v3.md
index f451edd..d34a58e 100644
--- a/docs/en/protocols/Skywalking-Cross-Process-Propagation-Headers-Protocol-v3.md
+++ b/docs/en/protocols/Skywalking-Cross-Process-Propagation-Headers-Protocol-v3.md
@@ -21,21 +21,16 @@ Values include the following segments, all String type values are in BASE64 enco
 1. Sample. 0 or 1. 0 means context exists, but could(most likely will) ignore. 1 means this trace need to be sampled and send to backend. 
 1. Trace Id. **String(BASE64 encoded)**. Three Longs split by `.` to represent the unique id of this trace.
 1. Parent trace segment Id. **String(BASE64 encoded)**. Three Longs split by `.` to represent the unique id of parent segment in parent service.
-1. Parent span Id. Integer. Begin with 0. This span id points to the parent span in parent trace segment. 
-1. Parent service instance Id.  **String(BASE64 encoded)**.
-1. Entrance service instance Id.  **String(BASE64 encoded)**. 
-1. Target address of this request. **String(BASE64 encoded)**. The network address(not must be IP + port) used at client side to access this target
+1. Parent span Id. Integer. Begin with 0. This span id points to the parent span in parent trace segment.
+1. Parent service.  **String(BASE64 encoded)**. 
+1. Parent service instance.  **String(BASE64 encoded)**.
+1. Parent endpoint. **String(BASE64 encoded)**.
+1. Target address used at client side of this request. **String(BASE64 encoded)**. The network address(not must be IP + port) used at client side to access this target
 service.
 
-- Optional(s)
-
-Optional values could not exist if the agent/SDK haven't those info or the length of header is over the threshold(2k default).  
-1. Entry endpoint of the trace. **String(BASE64 encoded)**. 
-1. Parent endpoint of the parent service. **String(BASE64 encoded)**. 
-
 ## Sample values
-1. Short version, `1-TRACEID-SEGMENTID-3-INSTANCEID-ENTRY_INSTANCE_ID-IPPORT`
-1. Complete version, `1-TRACEID-SEGMENTID-3-5-2-IPPORT-ENTRYURI-PARENTURI`
+`1-TRACEID-SEGMENTID-3-PARENT_SERVICE-PARENT_INSTANCE-PARENT_ENDPOINT-IPPORT`
+
 
 ## Differences from v2
 All ID register mechanism has been removed. Agent keeps using literal string to propagate all necessary information.
diff --git a/docs/en/protocols/Trace-Data-Protocol-v3.md b/docs/en/protocols/Trace-Data-Protocol-v3.md
index ac1e5ac..d1cf088 100644
--- a/docs/en/protocols/Trace-Data-Protocol-v3.md
+++ b/docs/en/protocols/Trace-Data-Protocol-v3.md
@@ -10,10 +10,14 @@ or metrics data.
 Since SkyWalking v8.x, SkyWalking provided register and uplink trace data through HTTP API way.
 [HTTP API Protocol](HTTP-API-Protocol.md) defined the API data format.
 
-### Report service instance properties 
-Service Instance has more information than a name, once the agent wants to report this, use `ServiceInstanceService#reportProperties` service
+### Report service instance status
+1. Service Instance Properties 
+Service instance has more information than a name, once the agent wants to report this, use `ManagementService#reportInstanceProperties` service
 providing a string-key/string-value pair list as the parameter. `language` of target instance is expected at least.
 
+2. Service Ping
+Service instance should keep alive with the backend. The agent should set a scheduler using `ManagementService#keepAlive` service in every minute.
+
 ### Send trace and metrics
 After you have service id and service instance id, you could send traces and metrics. Now we
 have 
diff --git a/test/untitled/pom.xml b/test/untitled/pom.xml
new file mode 100644
index 0000000..841cccd
--- /dev/null
+++ b/test/untitled/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  ~
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.example</groupId>
+    <artifactId>untitled</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>7</source>
+                    <target>7</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
\ No newline at end of file
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/DictionaryManager.java b/test/untitled/src/main/java/Main.java
similarity index 70%
rename from apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/DictionaryManager.java
rename to test/untitled/src/main/java/Main.java
index 5384104..2bf8766 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/DictionaryManager.java
+++ b/test/untitled/src/main/java/Main.java
@@ -16,13 +16,12 @@
  *
  */
 
-package org.apache.skywalking.apm.agent.core.dictionary;
+import java.nio.charset.StandardCharsets;
 
-public class DictionaryManager {
-    /**
-     * @return {@link NetworkAddressDictionary} to find application id for application code and network address.
-     */
-    public static NetworkAddressDictionary findNetworkAddressSection() {
-        return NetworkAddressDictionary.INSTANCE;
+public class Main {
+    public static void main(String[] args) {
+        String abc = "3_b3JnLnNreXdha2luZy5hcG0udGVzdGNhc2UuZHViYm8uc2VydmljZXMuR3JlZXRTZXJ2aWNlSW1wbC5kb0J1c2luZXNzKCk=_0";
+        System.out.println(abc.length());
+        System.out.println(abc.getBytes(StandardCharsets.UTF_8).length);
     }
 }