diff --git a/pom.xml b/pom.xml
index d644b72..64cc54c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,7 +25,7 @@
 		<tomcat.version>7.0.59</tomcat.version>
 		<docker.assemblyDescriptorRef>artifact</docker.assemblyDescriptorRef>
 		<docker.from>docker.io/fabric8/java-jboss-openjdk8-jdk:1.0.10</docker.from>
-		<docker.image>weipeng2k/${project.artifactId}:${project.version}</docker.image>
+		<docker.image>dubboteam/${project.artifactId}:${project.version}</docker.image>
 		<docker.port.container.http>8080</docker.port.container.http>
 		<docker.port.container.jolokia>8778</docker.port.container.jolokia>
 		<fabric8.iconRef>icons/spring-boot</fabric8.iconRef>
@@ -54,7 +54,7 @@
 		<dependency>
 			<groupId>com.alibaba</groupId>
 			<artifactId>dubbo</artifactId>
-			<version>2.5.5</version>
+			<version>2.5.6-SNAPSHOT</version>
 			<exclusions>
 				<exclusion>
 					<groupId>org.javassist</groupId>
@@ -82,9 +82,42 @@
 			<artifactId>tomcat-juli</artifactId>
 			<version>${tomcat.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+		</dependency>
 
 	</dependencies>
 
+	<profiles>
+		<profile>
+			<id>f8-build</id>
+			<build>
+				<defaultGoal>clean install docker:build fabric8:json</defaultGoal>
+			</build>
+		</profile>
+		<profile>
+			<id>f8-deploy</id>
+			<build>
+				<defaultGoal>clean install docker:build docker:push fabric8:json fabric8:apply</defaultGoal>
+			</build>
+			<properties>
+				<fabric8.recreate>true</fabric8.recreate>
+				<fabric8.imagePullPolicySnapshot>Always</fabric8.imagePullPolicySnapshot>
+			</properties>
+		</profile>
+		<profile>
+			<id>f8-local-deploy</id>
+			<build>
+				<defaultGoal>clean install docker:build fabric8:json fabric8:apply</defaultGoal>
+			</build>
+			<properties>
+				<fabric8.recreate>true</fabric8.recreate>
+			</properties>
+		</profile>
+	</profiles>
+
 	<build>
 		<plugins>
 			<plugin>
diff --git a/src/main/java/com/alibaba/dubbo/config/spring/AnnotationBean.java b/src/main/java/com/alibaba/dubbo/config/spring/AnnotationBean.java
deleted file mode 100644
index 0d2c32f..0000000
--- a/src/main/java/com/alibaba/dubbo/config/spring/AnnotationBean.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright 1999-2012 Alibaba Group.
- *
- * Licensed 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 com.alibaba.dubbo.config.spring;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.logger.Logger;
-import com.alibaba.dubbo.common.logger.LoggerFactory;
-import com.alibaba.dubbo.common.utils.ConcurrentHashSet;
-import com.alibaba.dubbo.common.utils.ReflectUtils;
-import com.alibaba.dubbo.config.AbstractConfig;
-import com.alibaba.dubbo.config.ApplicationConfig;
-import com.alibaba.dubbo.config.ConsumerConfig;
-import com.alibaba.dubbo.config.ModuleConfig;
-import com.alibaba.dubbo.config.MonitorConfig;
-import com.alibaba.dubbo.config.ProtocolConfig;
-import com.alibaba.dubbo.config.ProviderConfig;
-import com.alibaba.dubbo.config.ReferenceConfig;
-import com.alibaba.dubbo.config.RegistryConfig;
-import com.alibaba.dubbo.config.ServiceConfig;
-import com.alibaba.dubbo.config.annotation.Reference;
-import com.alibaba.dubbo.config.annotation.Service;
-
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.DisposableBean;
-import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
-import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-import org.springframework.beans.factory.support.BeanDefinitionRegistry;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * AnnotationBean
- *
- * @author william.liangf
- * @export
- */
-public class AnnotationBean extends AbstractConfig implements DisposableBean, BeanFactoryPostProcessor, BeanPostProcessor, ApplicationContextAware {
-
-    private static final long serialVersionUID = -7582802454287589552L;
-
-    private static final Logger logger = LoggerFactory.getLogger(Logger.class);
-    private final Set<ServiceConfig<?>> serviceConfigs = new ConcurrentHashSet<ServiceConfig<?>>();
-    private final ConcurrentMap<String, ReferenceBean<?>> referenceConfigs = new ConcurrentHashMap<String, ReferenceBean<?>>();
-    private String annotationPackage;
-    private String[] annotationPackages;
-    private ApplicationContext applicationContext;
-
-    public String getPackage() {
-        return annotationPackage;
-    }
-
-    public void setPackage(String annotationPackage) {
-        this.annotationPackage = annotationPackage;
-        this.annotationPackages = (annotationPackage == null || annotationPackage.length() == 0) ? null
-                : Constants.COMMA_SPLIT_PATTERN.split(annotationPackage);
-    }
-
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-        this.applicationContext = applicationContext;
-    }
-
-    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
-            throws BeansException {
-        if (annotationPackage == null || annotationPackage.length() == 0) {
-            return;
-        }
-        if (beanFactory instanceof BeanDefinitionRegistry) {
-            try {
-                // init scanner
-                Class<?> scannerClass = ReflectUtils.forName("org.springframework.context.annotation.ClassPathBeanDefinitionScanner");
-                Object scanner = scannerClass.getConstructor(new Class<?>[]{BeanDefinitionRegistry.class, boolean.class}).newInstance(new Object[]{(BeanDefinitionRegistry) beanFactory, true});
-                // add filter
-                Class<?> filterClass = ReflectUtils.forName("org.springframework.core.type.filter.AnnotationTypeFilter");
-                Object filter = filterClass.getConstructor(Class.class).newInstance(Service.class);
-                Method addIncludeFilter = scannerClass.getMethod("addIncludeFilter", ReflectUtils.forName("org.springframework.core.type.filter.TypeFilter"));
-                addIncludeFilter.invoke(scanner, filter);
-                // scan packages
-                String[] packages = Constants.COMMA_SPLIT_PATTERN.split(annotationPackage);
-                Method scan = scannerClass.getMethod("scan", new Class<?>[]{String[].class});
-                scan.invoke(scanner, new Object[]{packages});
-            } catch (Throwable e) {
-                // spring 2.0
-            }
-        }
-    }
-
-    public void destroy() throws Exception {
-        for (ServiceConfig<?> serviceConfig : serviceConfigs) {
-            try {
-                serviceConfig.unexport();
-            } catch (Throwable e) {
-                logger.error(e.getMessage(), e);
-            }
-        }
-        for (ReferenceConfig<?> referenceConfig : referenceConfigs.values()) {
-            try {
-                referenceConfig.destroy();
-            } catch (Throwable e) {
-                logger.error(e.getMessage(), e);
-            }
-        }
-    }
-
-    public Object postProcessAfterInitialization(Object bean, String beanName)
-            throws BeansException {
-        if (!isMatchPackage(bean)) {
-            return bean;
-        }
-        Service service = bean.getClass().getAnnotation(Service.class);
-        if (service != null) {
-            ServiceBean<Object> serviceConfig = new ServiceBean<Object>(service);
-            if (void.class.equals(service.interfaceClass())
-                    && "".equals(service.interfaceName())) {
-                if (bean.getClass().getInterfaces().length > 0) {
-                    serviceConfig.setInterface(bean.getClass().getInterfaces()[0]);
-                } else {
-                    throw new IllegalStateException("Failed to export remote service class " + bean.getClass().getName() + ", cause: The @Service undefined interfaceClass or interfaceName, and the service class unimplemented any interfaces.");
-                }
-            }
-            if (applicationContext != null) {
-                serviceConfig.setApplicationContext(applicationContext);
-                if (service.registry() != null && service.registry().length > 0) {
-                    List<RegistryConfig> registryConfigs = new ArrayList<RegistryConfig>();
-                    for (String registryId : service.registry()) {
-                        if (registryId != null && registryId.length() > 0) {
-                            registryConfigs.add((RegistryConfig) applicationContext.getBean(registryId, RegistryConfig.class));
-                        }
-                    }
-                    serviceConfig.setRegistries(registryConfigs);
-                }
-                if (service.provider() != null && service.provider().length() > 0) {
-                    serviceConfig.setProvider((ProviderConfig) applicationContext.getBean(service.provider(), ProviderConfig.class));
-                }
-                if (service.monitor() != null && service.monitor().length() > 0) {
-                    serviceConfig.setMonitor((MonitorConfig) applicationContext.getBean(service.monitor(), MonitorConfig.class));
-                }
-                if (service.application() != null && service.application().length() > 0) {
-                    serviceConfig.setApplication((ApplicationConfig) applicationContext.getBean(service.application(), ApplicationConfig.class));
-                }
-                if (service.module() != null && service.module().length() > 0) {
-                    serviceConfig.setModule((ModuleConfig) applicationContext.getBean(service.module(), ModuleConfig.class));
-                }
-                if (service.provider() != null && service.provider().length() > 0) {
-                    serviceConfig.setProvider((ProviderConfig) applicationContext.getBean(service.provider(), ProviderConfig.class));
-                } else {
-
-                }
-                if (service.protocol() != null && service.protocol().length > 0) {
-                    List<ProtocolConfig> protocolConfigs = new ArrayList<ProtocolConfig>();
-                    for (String protocolId : service.registry()) {
-                        if (protocolId != null && protocolId.length() > 0) {
-                            protocolConfigs.add((ProtocolConfig) applicationContext.getBean(protocolId, ProtocolConfig.class));
-                        }
-                    }
-                    serviceConfig.setProtocols(protocolConfigs);
-                }
-                try {
-                    serviceConfig.afterPropertiesSet();
-                } catch (RuntimeException e) {
-                    throw (RuntimeException) e;
-                } catch (Exception e) {
-                    throw new IllegalStateException(e.getMessage(), e);
-                }
-            }
-            serviceConfig.setRef(bean);
-            serviceConfigs.add(serviceConfig);
-            serviceConfig.export();
-        }
-        return bean;
-    }
-
-    public Object postProcessBeforeInitialization(Object bean, String beanName)
-            throws BeansException {
-        if (!isMatchPackage(bean)) {
-            return bean;
-        }
-        Method[] methods = bean.getClass().getMethods();
-        for (Method method : methods) {
-            String name = method.getName();
-            if (name.length() > 3 && name.startsWith("set")
-                    && method.getParameterTypes().length == 1
-                    && Modifier.isPublic(method.getModifiers())
-                    && !Modifier.isStatic(method.getModifiers())) {
-                try {
-                    Reference reference = method.getAnnotation(Reference.class);
-                    if (reference != null) {
-                        Object value = refer(reference, method.getParameterTypes()[0]);
-                        if (value != null) {
-                            method.invoke(bean, new Object[]{value});
-                        }
-                    }
-                } catch (Throwable e) {
-                    logger.error("Failed to init remote service reference at method " + name + " in class " + bean.getClass().getName() + ", cause: " + e.getMessage(), e);
-                }
-            }
-        }
-        Field[] fields = bean.getClass().getFields();
-        for (Field field : fields) {
-            try {
-                if (!field.isAccessible()) {
-                    field.setAccessible(true);
-                }
-                Reference reference = field.getAnnotation(Reference.class);
-                if (reference != null) {
-                    Object value = refer(reference, field.getType());
-                    if (value != null) {
-                        field.set(bean, value);
-                    }
-                }
-            } catch (Throwable e) {
-                logger.error("Failed to init remote service reference at filed " + field.getName() + " in class " + bean.getClass().getName() + ", cause: " + e.getMessage(), e);
-            }
-        }
-        return bean;
-    }
-
-    private Object refer(Reference reference, Class<?> referenceClass) { //method.getParameterTypes()[0]
-        String interfaceName;
-        if (!"".equals(reference.interfaceName())) {
-            interfaceName = reference.interfaceName();
-        } else if (!void.class.equals(reference.interfaceClass())) {
-            interfaceName = reference.interfaceClass().getName();
-        } else if (referenceClass.isInterface()) {
-            interfaceName = referenceClass.getName();
-        } else {
-            throw new IllegalStateException("The @Reference undefined interfaceClass or interfaceName, and the property type " + referenceClass.getName() + " is not a interface.");
-        }
-        String key = reference.group() + "/" + interfaceName + ":" + reference.version();
-        ReferenceBean<?> referenceConfig = referenceConfigs.get(key);
-        if (referenceConfig == null) {
-            referenceConfig = new ReferenceBean<Object>(reference);
-            if (void.class.equals(reference.interfaceClass())
-                    && "".equals(reference.interfaceName())
-                    && referenceClass.isInterface()) {
-                referenceConfig.setInterface(referenceClass);
-            }
-            if (applicationContext != null) {
-                referenceConfig.setApplicationContext(applicationContext);
-                if (reference.registry() != null && reference.registry().length > 0) {
-                    List<RegistryConfig> registryConfigs = new ArrayList<RegistryConfig>();
-                    for (String registryId : reference.registry()) {
-                        if (registryId != null && registryId.length() > 0) {
-                            registryConfigs.add((RegistryConfig) applicationContext.getBean(registryId, RegistryConfig.class));
-                        }
-                    }
-                    referenceConfig.setRegistries(registryConfigs);
-                }
-                if (reference.consumer() != null && reference.consumer().length() > 0) {
-                    referenceConfig.setConsumer((ConsumerConfig) applicationContext.getBean(reference.consumer(), ConsumerConfig.class));
-                }
-                if (reference.monitor() != null && reference.monitor().length() > 0) {
-                    referenceConfig.setMonitor((MonitorConfig) applicationContext.getBean(reference.monitor(), MonitorConfig.class));
-                }
-                if (reference.application() != null && reference.application().length() > 0) {
-                    referenceConfig.setApplication((ApplicationConfig) applicationContext.getBean(reference.application(), ApplicationConfig.class));
-                }
-                if (reference.module() != null && reference.module().length() > 0) {
-                    referenceConfig.setModule((ModuleConfig) applicationContext.getBean(reference.module(), ModuleConfig.class));
-                }
-                if (reference.consumer() != null && reference.consumer().length() > 0) {
-                    referenceConfig.setConsumer((ConsumerConfig) applicationContext.getBean(reference.consumer(), ConsumerConfig.class));
-                }
-                try {
-                    referenceConfig.afterPropertiesSet();
-                } catch (RuntimeException e) {
-                    throw (RuntimeException) e;
-                } catch (Exception e) {
-                    throw new IllegalStateException(e.getMessage(), e);
-                }
-            }
-            referenceConfigs.putIfAbsent(key, referenceConfig);
-            referenceConfig = referenceConfigs.get(key);
-        }
-        return referenceConfig.get();
-    }
-
-    private boolean isMatchPackage(Object bean) {
-        if (annotationPackages == null || annotationPackages.length == 0) {
-            return true;
-        }
-        String beanClassName = bean.getClass().getName();
-        for (String pkg : annotationPackages) {
-            if (beanClassName.startsWith(pkg)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-}
diff --git a/src/main/java/com/alibaba/dubbo/test/DubboFeatureTestApplication.java b/src/main/java/com/alibaba/dubbo/test/DubboFeatureTestApplication.java
index 3270ab1..182715a 100644
--- a/src/main/java/com/alibaba/dubbo/test/DubboFeatureTestApplication.java
+++ b/src/main/java/com/alibaba/dubbo/test/DubboFeatureTestApplication.java
@@ -7,7 +7,6 @@
 
 
 @SpringBootApplication
-@ComponentScan(basePackages = {"com.alibaba.dubbo.test"}, includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {com.alibaba.dubbo.config.annotation.Service.class, com.alibaba.dubbo.config.annotation.Reference.class})})
 public class DubboFeatureTestApplication {
 
 	public static void main(String[] args) throws InterruptedException {
diff --git a/src/main/java/com/alibaba/dubbo/test/conf/DubboConfiguration.java b/src/main/java/com/alibaba/dubbo/test/conf/DubboConfiguration.java
index d48269a..e128426 100644
--- a/src/main/java/com/alibaba/dubbo/test/conf/DubboConfiguration.java
+++ b/src/main/java/com/alibaba/dubbo/test/conf/DubboConfiguration.java
@@ -9,7 +9,7 @@
  * Created by ken.lj on 2017/9/10.
  */
 @Configuration
-@ImportResource(locations = "classpath:dubbo-${spring.profiles.active}.xml")
+@ImportResource(locations = {"classpath:dubbo-common.xml", "classpath:dubbo-${spring.profiles.active}.xml"})
 public class DubboConfiguration {
 
 }
diff --git a/src/main/java/com/alibaba/dubbo/test/dto/Bean.java b/src/main/java/com/alibaba/dubbo/test/dto/Bean.java
new file mode 100644
index 0000000..9ee7832
--- /dev/null
+++ b/src/main/java/com/alibaba/dubbo/test/dto/Bean.java
@@ -0,0 +1,28 @@
+package com.alibaba.dubbo.test.dto;
+
+import java.io.Serializable;
+
+/**
+ * Created by ken.lj on 2017/9/24.
+ */
+public class Bean implements Serializable {
+    private int id;
+
+    private String name;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/src/main/java/com/alibaba/dubbo/test/service/AsyncService.java b/src/main/java/com/alibaba/dubbo/test/service/AsyncService.java
new file mode 100644
index 0000000..37e3653
--- /dev/null
+++ b/src/main/java/com/alibaba/dubbo/test/service/AsyncService.java
@@ -0,0 +1,7 @@
+package com.alibaba.dubbo.test.service;
+
+/**
+ * Created by ken.lj on 2017/9/24.
+ */
+public interface AsyncService {
+}
diff --git a/src/main/java/com/alibaba/dubbo/test/service/CacheService.java b/src/main/java/com/alibaba/dubbo/test/service/CacheService.java
new file mode 100644
index 0000000..4352f01
--- /dev/null
+++ b/src/main/java/com/alibaba/dubbo/test/service/CacheService.java
@@ -0,0 +1,7 @@
+package com.alibaba.dubbo.test.service;
+
+/**
+ * Created by ken.lj on 2017/9/24.
+ */
+public interface CacheService {
+}
diff --git a/src/main/java/com/alibaba/dubbo/test/service/DemoService.java b/src/main/java/com/alibaba/dubbo/test/service/DemoService.java
new file mode 100644
index 0000000..2c6869e
--- /dev/null
+++ b/src/main/java/com/alibaba/dubbo/test/service/DemoService.java
@@ -0,0 +1,21 @@
+package com.alibaba.dubbo.test.service;
+
+import com.alibaba.dubbo.test.dto.Bean;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by ken.lj on 2017/9/24.
+ */
+public interface DemoService {
+    String testString(String str);
+
+    boolean testPojo(Bean bean);
+
+    boolean testList(List<Bean> list);
+
+    boolean testMap(Map<String, Object> map);
+
+    Bean testResult(Bean bean);
+}
diff --git a/src/main/java/com/alibaba/dubbo/test/service/WSService.java b/src/main/java/com/alibaba/dubbo/test/service/WSService.java
new file mode 100644
index 0000000..626c5af
--- /dev/null
+++ b/src/main/java/com/alibaba/dubbo/test/service/WSService.java
@@ -0,0 +1,7 @@
+package com.alibaba.dubbo.test.service;
+
+/**
+ * Created by ken.lj on 2017/9/24.
+ */
+public interface WSService {
+}
diff --git a/src/main/java/com/alibaba/dubbo/test/service/CatService.java b/src/main/java/com/alibaba/dubbo/test/service/chain/CatService.java
similarity index 100%
rename from src/main/java/com/alibaba/dubbo/test/service/CatService.java
rename to src/main/java/com/alibaba/dubbo/test/service/chain/CatService.java
diff --git a/src/main/java/com/alibaba/dubbo/test/service/DogService.java b/src/main/java/com/alibaba/dubbo/test/service/chain/DogService.java
similarity index 100%
rename from src/main/java/com/alibaba/dubbo/test/service/DogService.java
rename to src/main/java/com/alibaba/dubbo/test/service/chain/DogService.java
diff --git a/src/main/java/com/alibaba/dubbo/test/service/LionService.java b/src/main/java/com/alibaba/dubbo/test/service/chain/LionService.java
similarity index 100%
rename from src/main/java/com/alibaba/dubbo/test/service/LionService.java
rename to src/main/java/com/alibaba/dubbo/test/service/chain/LionService.java
diff --git a/src/main/java/com/alibaba/dubbo/test/service/MouseService.java b/src/main/java/com/alibaba/dubbo/test/service/chain/MouseService.java
similarity index 100%
rename from src/main/java/com/alibaba/dubbo/test/service/MouseService.java
rename to src/main/java/com/alibaba/dubbo/test/service/chain/MouseService.java
diff --git a/src/main/java/com/alibaba/dubbo/test/service/impl/CatServiceImpl.java b/src/main/java/com/alibaba/dubbo/test/service/chain/impl/CatServiceImpl.java
similarity index 92%
rename from src/main/java/com/alibaba/dubbo/test/service/impl/CatServiceImpl.java
rename to src/main/java/com/alibaba/dubbo/test/service/chain/impl/CatServiceImpl.java
index de2ba8b..0b583e9 100644
--- a/src/main/java/com/alibaba/dubbo/test/service/impl/CatServiceImpl.java
+++ b/src/main/java/com/alibaba/dubbo/test/service/chain/impl/CatServiceImpl.java
@@ -1,4 +1,4 @@
-package com.alibaba.dubbo.test.service.impl;
+package com.alibaba.dubbo.test.service.chain.impl;
 
 import com.alibaba.dubbo.test.service.CatService;
 import com.alibaba.dubbo.test.service.MouseService;
diff --git a/src/main/java/com/alibaba/dubbo/test/service/impl/DogServiceImpl.java b/src/main/java/com/alibaba/dubbo/test/service/chain/impl/DogServiceImpl.java
similarity index 93%
rename from src/main/java/com/alibaba/dubbo/test/service/impl/DogServiceImpl.java
rename to src/main/java/com/alibaba/dubbo/test/service/chain/impl/DogServiceImpl.java
index a6c3baa..edc38f1 100644
--- a/src/main/java/com/alibaba/dubbo/test/service/impl/DogServiceImpl.java
+++ b/src/main/java/com/alibaba/dubbo/test/service/chain/impl/DogServiceImpl.java
@@ -1,4 +1,4 @@
-package com.alibaba.dubbo.test.service.impl;
+package com.alibaba.dubbo.test.service.chain.impl;
 
 import com.alibaba.dubbo.test.service.CatService;
 import com.alibaba.dubbo.test.service.DogService;
diff --git a/src/main/java/com/alibaba/dubbo/test/service/impl/LionServiceImpl.java b/src/main/java/com/alibaba/dubbo/test/service/chain/impl/LionServiceImpl.java
similarity index 94%
rename from src/main/java/com/alibaba/dubbo/test/service/impl/LionServiceImpl.java
rename to src/main/java/com/alibaba/dubbo/test/service/chain/impl/LionServiceImpl.java
index 4cec2dd..102069c 100644
--- a/src/main/java/com/alibaba/dubbo/test/service/impl/LionServiceImpl.java
+++ b/src/main/java/com/alibaba/dubbo/test/service/chain/impl/LionServiceImpl.java
@@ -1,4 +1,4 @@
-package com.alibaba.dubbo.test.service.impl;
+package com.alibaba.dubbo.test.service.chain.impl;
 
 import com.alibaba.dubbo.test.service.CatService;
 import com.alibaba.dubbo.test.service.DogService;
diff --git a/src/main/java/com/alibaba/dubbo/test/service/impl/MouseServiceImpl.java b/src/main/java/com/alibaba/dubbo/test/service/chain/impl/MouseServiceImpl.java
similarity index 73%
rename from src/main/java/com/alibaba/dubbo/test/service/impl/MouseServiceImpl.java
rename to src/main/java/com/alibaba/dubbo/test/service/chain/impl/MouseServiceImpl.java
index ae2e352..b9dc4bc 100644
--- a/src/main/java/com/alibaba/dubbo/test/service/impl/MouseServiceImpl.java
+++ b/src/main/java/com/alibaba/dubbo/test/service/chain/impl/MouseServiceImpl.java
@@ -1,11 +1,13 @@
-package com.alibaba.dubbo.test.service.impl;
+package com.alibaba.dubbo.test.service.chain.impl;
 
 import com.alibaba.dubbo.test.service.MouseService;
 
+import org.springframework.stereotype.Service;
+
 /**
  * Created by ken.lj on 2017/9/8.
  */
-
+@Service("mouseService")
 public class MouseServiceImpl implements MouseService {
     @Override
     public void eat(String master) {
diff --git a/src/main/java/com/alibaba/dubbo/test/service/impl/AnnotateServiceImpl.java b/src/main/java/com/alibaba/dubbo/test/service/impl/AnnotateServiceImpl.java
index bad2f2f..b232043 100644
--- a/src/main/java/com/alibaba/dubbo/test/service/impl/AnnotateServiceImpl.java
+++ b/src/main/java/com/alibaba/dubbo/test/service/impl/AnnotateServiceImpl.java
@@ -1,12 +1,12 @@
 package com.alibaba.dubbo.test.service.impl;
 
-import com.alibaba.dubbo.config.annotation.Service;
 import com.alibaba.dubbo.test.service.AnnotateService;
 
+import org.springframework.stereotype.Service;
+
 /**
  * Created by ken.lj on 2017/9/19.
  */
-@Service
 public class AnnotateServiceImpl implements AnnotateService {
     @Override
     public String sayHello() {
diff --git a/src/main/java/com/alibaba/dubbo/test/service/impl/AsycServiceImpl.java b/src/main/java/com/alibaba/dubbo/test/service/impl/AsycServiceImpl.java
new file mode 100644
index 0000000..89ff903
--- /dev/null
+++ b/src/main/java/com/alibaba/dubbo/test/service/impl/AsycServiceImpl.java
@@ -0,0 +1,11 @@
+package com.alibaba.dubbo.test.service.impl;
+
+import com.alibaba.dubbo.test.service.AsyncService;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * Created by ken.lj on 2017/9/24.
+ */
+public class AsycServiceImpl implements AsyncService {
+}
diff --git a/src/main/java/com/alibaba/dubbo/test/service/impl/CacheServiceImpl.java b/src/main/java/com/alibaba/dubbo/test/service/impl/CacheServiceImpl.java
new file mode 100644
index 0000000..5bcd175
--- /dev/null
+++ b/src/main/java/com/alibaba/dubbo/test/service/impl/CacheServiceImpl.java
@@ -0,0 +1,9 @@
+package com.alibaba.dubbo.test.service.impl;
+
+import com.alibaba.dubbo.test.service.CacheService;
+
+/**
+ * Created by ken.lj on 2017/9/24.
+ */
+public class CacheServiceImpl implements CacheService {
+}
diff --git a/src/main/java/com/alibaba/dubbo/test/service/impl/DemoServiceImpl.java b/src/main/java/com/alibaba/dubbo/test/service/impl/DemoServiceImpl.java
new file mode 100644
index 0000000..b511336
--- /dev/null
+++ b/src/main/java/com/alibaba/dubbo/test/service/impl/DemoServiceImpl.java
@@ -0,0 +1,39 @@
+package com.alibaba.dubbo.test.service.impl;
+
+import com.alibaba.dubbo.test.dto.Bean;
+import com.alibaba.dubbo.test.service.DemoService;
+
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by ken.lj on 2017/9/24.
+ */
+public class DemoServiceImpl implements DemoService {
+    @Override
+    public String testString(String str) {
+        return null;
+    }
+
+    @Override
+    public boolean testPojo(Bean bean) {
+        return false;
+    }
+
+    @Override
+    public boolean testList(List<Bean> list) {
+        return false;
+    }
+
+    @Override
+    public boolean testMap(Map<String, Object> map) {
+        return false;
+    }
+
+    @Override
+    public Bean testResult(Bean bean) {
+        return null;
+    }
+}
diff --git a/src/main/java/com/alibaba/dubbo/test/service/impl/WSServiceImpl.java b/src/main/java/com/alibaba/dubbo/test/service/impl/WSServiceImpl.java
new file mode 100644
index 0000000..048e91b
--- /dev/null
+++ b/src/main/java/com/alibaba/dubbo/test/service/impl/WSServiceImpl.java
@@ -0,0 +1,11 @@
+package com.alibaba.dubbo.test.service.impl;
+
+import com.alibaba.dubbo.test.service.WSService;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * Created by ken.lj on 2017/9/24.
+ */
+public class WSServiceImpl implements WSService {
+}
diff --git a/src/main/java/com/alibaba/dubbo/test/web/BaseController.java b/src/main/java/com/alibaba/dubbo/test/web/BaseController.java
index a2d7200..4f4c896 100644
--- a/src/main/java/com/alibaba/dubbo/test/web/BaseController.java
+++ b/src/main/java/com/alibaba/dubbo/test/web/BaseController.java
@@ -1,6 +1,5 @@
 package com.alibaba.dubbo.test.web;
 
-import com.alibaba.dubbo.config.annotation.Reference;
 import com.alibaba.dubbo.test.service.AnnotateService;
 
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -9,7 +8,7 @@
  * Created by ken.lj on 2017/9/19.
  */
 public class BaseController<T extends AnnotateService> {
-    @Reference
+
     public T annotateService;
 
     @RequestMapping("/hello")
diff --git a/src/main/java/com/alibaba/dubbo/test/web/HelloController.java b/src/main/java/com/alibaba/dubbo/test/web/HelloController.java
index d244964..0dc8f2f 100644
--- a/src/main/java/com/alibaba/dubbo/test/web/HelloController.java
+++ b/src/main/java/com/alibaba/dubbo/test/web/HelloController.java
@@ -1,9 +1,7 @@
 package com.alibaba.dubbo.test.web;
 
-import com.alibaba.dubbo.config.annotation.Reference;
 import com.alibaba.dubbo.test.service.AnnotateService;
 
-import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
diff --git a/src/main/java/com/alibaba/dubbo/test/web/TestcaseController.java b/src/main/java/com/alibaba/dubbo/test/web/TestcaseController.java
new file mode 100644
index 0000000..7d3199a
--- /dev/null
+++ b/src/main/java/com/alibaba/dubbo/test/web/TestcaseController.java
@@ -0,0 +1,54 @@
+package com.alibaba.dubbo.test.web;
+
+import com.alibaba.dubbo.test.service.AnnotateService;
+import com.alibaba.dubbo.test.service.AsyncService;
+import com.alibaba.dubbo.test.service.CacheService;
+import com.alibaba.dubbo.test.service.DemoService;
+import com.alibaba.dubbo.test.service.WSService;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Created by ken.lj on 2017/9/25.
+ */
+@RestController
+@RequestMapping("/testcase")
+public class TestcaseController {
+
+    @Autowired
+    private DemoService demoService;
+    private AsyncService asyncService;
+    private CacheService cacheService;
+    private WSService wsService;
+    private AnnotateService annotateService;
+
+    @RequestMapping("/all")
+    public String testAll() {
+        return "all";
+    }
+
+    @RequestMapping("/async")
+    public String testAsync() {
+        return "async";
+    }
+
+    @RequestMapping("/cache")
+    public String testCache() {
+        return "cache";
+    }
+
+    @RequestMapping("/simple")
+    public String testSimple() {
+        String result = demoService.testString("hello");
+        System.out.println(result);
+        return "DemoService string";
+    }
+
+    @RequestMapping("/annotate")
+    public String testAnnotate() {
+        return "annotate";
+    }
+}
diff --git a/src/main/resources/dubbo-annotation.xml b/src/main/resources/dubbo-annotation.xml
index 4e01d66..97868d4 100644
--- a/src/main/resources/dubbo-annotation.xml
+++ b/src/main/resources/dubbo-annotation.xml
@@ -20,18 +20,8 @@
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
-    <!-- 提供方应用信息，用于计算依赖关系 -->
-    <dubbo:application name="Annotation" />
 
-    <dubbo:provider />
-
-    <!-- 使用multicast广播注册中心暴露服务地址 -->
-    <dubbo:registry client="curator" address="zookeeper://11.160.112.23:2181?backup=11.239.190.141:2181,11.239.172.213:2181"/>
-
-    <!-- 用dubbo协议在20880端口暴露服务 -->
-    <dubbo:protocol name="dubbo" port="-1"/>
-
-    <bean id="mouseService" class="com.alibaba.dubbo.test.service.impl.MouseServiceImpl" />
+    <bean id="mouseService" class="com.alibaba.dubbo.test.service.chain.impl.MouseServiceImpl" />
 
     <dubbo:annotation />
 
diff --git a/src/main/resources/dubbo-cat.xml b/src/main/resources/dubbo-cat.xml
index 1d004d2..3a92d66 100644
--- a/src/main/resources/dubbo-cat.xml
+++ b/src/main/resources/dubbo-cat.xml
@@ -20,15 +20,6 @@
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
-    <!-- 提供方应用信息，用于计算依赖关系 -->
-    <dubbo:application name="Cat"/>
-
-    <!-- 使用multicast广播注册中心暴露服务地址 -->
-    <dubbo:registry client="curator"
-                    address="zookeeper://11.160.112.23:2181?backup=11.239.190.141:2181,11.239.172.213:2181"/>
-
-    <!-- 用dubbo协议在20880端口暴露服务 -->
-    <dubbo:protocol name="dubbo" port="-1"/>
 
     <!-- 和本地bean一样实现服务 -->
     <dubbo:service interface="com.alibaba.dubbo.test.service.CatService" ref="catService"/>
diff --git a/src/main/resources/dubbo-common.xml b/src/main/resources/dubbo-common.xml
new file mode 100644
index 0000000..a10e3d5
--- /dev/null
+++ b/src/main/resources/dubbo-common.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ - Copyright 1999-2011 Alibaba Group.
+ -  
+ - Licensed 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.
+-->
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
+       xmlns="http://www.springframework.org/schema/beans"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
+
+    <!-- 提供方应用信息，用于计算依赖关系 -->
+    <dubbo:application name="dubbo-feature-test" />
+
+    <!-- 使用multicast广播注册中心暴露服务地址 -->
+    <dubbo:registry client="curator" address="zookeeper://11.160.112.23:2181?backup=11.239.190.141:2181,11.239.172.213:2181"/>
+
+    <!-- 用dubbo协议在20880端口暴露服务 -->
+    <dubbo:protocol name="dubbo" port="-1"/>
+
+</beans>
\ No newline at end of file
diff --git a/src/main/resources/dubbo-dog.xml b/src/main/resources/dubbo-dog.xml
index 798ba73..d9794ed 100644
--- a/src/main/resources/dubbo-dog.xml
+++ b/src/main/resources/dubbo-dog.xml
@@ -20,15 +20,6 @@
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
-    <!-- 提供方应用信息，用于计算依赖关系 -->
-    <dubbo:application name="Dog"/>
-
-    <!-- 使用multicast广播注册中心暴露服务地址 -->
-    <dubbo:registry address="zookeeper://11.160.112.23:2181?backup=11.239.190.141:2181,11.239.172.213:2181"/>
-
-    <!-- 用dubbo协议在20880端口暴露服务 -->
-    <dubbo:protocol name="dubbo" port="-1"/>
-
     <!-- 和本地bean一样实现服务 -->
     <dubbo:service interface="com.alibaba.dubbo.test.service.DogService" ref="dogService"/>
 
diff --git a/src/main/resources/dubbo-lion.xml b/src/main/resources/dubbo-lion.xml
index 9dfc720..e7c6b13 100644
--- a/src/main/resources/dubbo-lion.xml
+++ b/src/main/resources/dubbo-lion.xml
@@ -20,15 +20,6 @@
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
-    <!-- 提供方应用信息，用于计算依赖关系 -->
-    <dubbo:application name="Lion"/>
-
-    <!-- 使用multicast广播注册中心暴露服务地址 -->
-    <dubbo:registry address="zookeeper://11.160.112.23:2181?backup=11.239.190.141:2181,11.239.172.213:2181"/>
-
-    <!-- 用dubbo协议在20880端口暴露服务 -->
-    <dubbo:protocol name="dubbo" port="-1"/>
-
     <!-- 和本地bean一样实现服务 -->
     <dubbo:service interface="com.alibaba.dubbo.test.service.LionService" ref="lionService"/>
 
diff --git a/src/main/resources/dubbo-mouse.xml b/src/main/resources/dubbo-mouse.xml
index bb818ad..b662c83 100644
--- a/src/main/resources/dubbo-mouse.xml
+++ b/src/main/resources/dubbo-mouse.xml
@@ -20,18 +20,7 @@
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
-    <!-- 提供方应用信息，用于计算依赖关系 -->
-    <dubbo:application compiler="jdk" name="Mouse" />
-
-    <dubbo:provider proxy="jdk" />
-
-    <!-- 使用multicast广播注册中心暴露服务地址 -->
-    <dubbo:registry client="curator" address="zookeeper://11.160.112.23:2181?backup=11.239.190.141:2181,11.239.172.213:2181"/>
-
-    <!-- 用dubbo协议在20880端口暴露服务 -->
-    <dubbo:protocol name="dubbo" port="-1"/>
-
-    <bean id="mouseService" class="com.alibaba.dubbo.test.service.impl.MouseServiceImpl" />
+    <bean id="mouseService" class="com.alibaba.dubbo.test.service.chain.impl.MouseServiceImpl" />
 
     <!-- 和本地bean一样实现服务 -->
     <dubbo:service interface="com.alibaba.dubbo.test.service.MouseService" ref="mouseService"/>
diff --git a/src/main/resources/dubbo-regression-consumer.xml b/src/main/resources/dubbo-regression-consumer.xml
new file mode 100644
index 0000000..19e79f3
--- /dev/null
+++ b/src/main/resources/dubbo-regression-consumer.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ - Copyright 1999-2011 Alibaba Group.
+ -  
+ - Licensed 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.
+-->
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
+       xmlns="http://www.springframework.org/schema/beans"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
+    
+    <dubbo:consumer />
+
+    <dubbo:reference id="demoService" interface="com.alibaba.dubbo.test.service.DemoService" />
+
+    <dubbo:reference id="asyncService" interface="com.alibaba.dubbo.test.service.AsyncService" />
+
+    <dubbo:reference id="cacheService" interface="com.alibaba.dubbo.test.service.CacheService" />
+
+    <dubbo:reference id="wsService" interface="com.alibaba.dubbo.test.service.WSService" />
+
+    <dubbo:reference id="annotateService" interface="com.alibaba.dubbo.test.service.AnnotateService" />
+
+</beans>
\ No newline at end of file
diff --git a/src/main/resources/dubbo-regression-provider.xml b/src/main/resources/dubbo-regression-provider.xml
new file mode 100644
index 0000000..1efb88e
--- /dev/null
+++ b/src/main/resources/dubbo-regression-provider.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ - Copyright 1999-2011 Alibaba Group.
+ -  
+ - Licensed 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.
+-->
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
+       xmlns="http://www.springframework.org/schema/beans"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
+
+    <dubbo:provider />
+
+    <dubbo:service interface="com.alibaba.dubbo.test.service.DemoService" ref="demoService"/>
+
+    <dubbo:service interface="com.alibaba.dubbo.test.service.AsyncService" ref="asyncService"/>
+
+    <dubbo:service interface="com.alibaba.dubbo.test.service.CacheService" ref="cacheService"/>
+
+    <dubbo:service interface="com.alibaba.dubbo.test.service.WSService" ref="wsService"/>
+
+    <dubbo:service interface="com.alibaba.dubbo.test.service.AnnotateService" ref="annotateService"/>
+
+    <bean id="demoService" class="com.alibaba.dubbo.test.service.impl.DemoServiceImpl" />
+    <bean id="asyncService" class="com.alibaba.dubbo.test.service.impl.AsycServiceImpl" />
+    <bean id="cacheService" class="com.alibaba.dubbo.test.service.impl.CacheServiceImpl" />
+    <bean id="wsService" class="com.alibaba.dubbo.test.service.impl.WSServiceImpl" />
+    <bean id="annotateService" class="com.alibaba.dubbo.test.service.impl.AnnotateServiceImpl" />
+
+</beans>
\ No newline at end of file
diff --git a/src/test/java/com/alibaba/dubbo/test/DubboFeatureTestApplicationTests.java b/src/test/java/com/alibaba/dubbo/test/DubboFeatureTestApplicationTests.java
index 0351b8e..450bd6d 100644
--- a/src/test/java/com/alibaba/dubbo/test/DubboFeatureTestApplicationTests.java
+++ b/src/test/java/com/alibaba/dubbo/test/DubboFeatureTestApplicationTests.java
@@ -9,8 +9,6 @@
 @SpringBootTest
 public class DubboFeatureTestApplicationTests {
 
-	@Test
-	public void contextLoads() {
-	}
+
 
 }
