dubbo-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From GitBox <...@apache.org>
Subject [GitHub] hupuxiaojun closed pull request #86: Kingnet brance 1.0
Date Wed, 15 Aug 2018 13:20:25 GMT
hupuxiaojun closed pull request #86: Kingnet brance 1.0
URL: https://github.com/apache/incubator-dubbo-ops/pull/86
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..7803986
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,9 @@
+language: java
+sudo: false # faster builds
+
+jdk:
+    - oraclejdk10
+    - oraclejdk9
+    - oraclejdk8
+script:
+    - travis_wait 30 mvn clean package
diff --git a/README.md b/README.md
index eb56733..e81a20c 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,35 @@
-# dubbo-ops
-The ops and reference implementation for dubbo
+### dubbo-ops
+[![Build Status](https://travis-ci.org/apache/incubator-dubbo-ops.svg?branch=master)](https://travis-ci.org/apache/incubator-dubbo-ops) 
+[![Gitter](https://badges.gitter.im/alibaba/dubbo.svg)](https://gitter.im/alibaba/dubbo?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+
+The following modules in [Apache Dubbo(incubating)](https://github.com/apache/incubator-dubbo) have been moved here:
+
+* dubbo-admin
+* dubbo-monitor-simple
+* dubbo-registry-simple
+
+
+### How to use it
+You can get a release of dubbo monitor in two steps:
+
+#### dubbo admin
+dubbo admin is a spring boot application, you can start it with fat jar or in IDE directly
+
+#### dubbo monitor and dubbo registry
+- Step 1:
+```
+git clone https://github.com/apache/incubator-dubbo-ops
+```
+
+- Step 2:
+```
+cd incubator-dubbo-ops && mvn package
+```
+
+Then you will find:
+
+  * dubbo-monitor-simple-2.0.0-assembly.tar.gz in incubator-dubbo-ops\dubbo-monitor-simple\target directory. Unzip it you will find the shell scripts for starting or stopping monitor.
+  * dubbo-registry-simple-2.0.0-assembly.tar.gz in incubator-dubbo-ops\dubbo-registry-simple\target directory. Unzip it you will find the shell scripts for starting or stopping registry.
+
+
+
diff --git a/dubbo-admin/pom.xml b/dubbo-admin/pom.xml
index 57ffc35..7924138 100644
--- a/dubbo-admin/pom.xml
+++ b/dubbo-admin/pom.xml
@@ -1,101 +1,63 @@
-<!--
- - 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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.alibaba</groupId>
-        <artifactId>dubbo-ops</artifactId>
-        <version>2.0.0</version>
-    </parent>
-    <artifactId>dubbo-admin</artifactId>
-    <packaging>war</packaging>
-    <name>${project.artifactId}</name>
-    <description>The service management system for dubbo</description>
-    <properties>
-        <wtpversion>1.5</wtpversion>
-        <wtpContextName>/</wtpContextName>
-        <eclipse.useProjectReferences>false</eclipse.useProjectReferences>
-        <skip_maven_deploy>false</skip_maven_deploy>
-    </properties>
-    <!-- Fix webx 3.x not compatible with spring 4.x or higher -->
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-framework-bom</artifactId>
-                <version>3.2.16.RELEASE</version>
-                <scope>import</scope>
-                <type>pom</type>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-    <dependencies>
+<?xml version="1.0" encoding="UTF-8"?>
+<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>com.alibaba</groupId>
+	<artifactId>dubbo-admin</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>jar</packaging>
+
+	<name>dubbo-admin</name>
+	<description>Demo project for Spring Boot</description>
+
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.0.2.RELEASE</version>
+		<relativePath/> <!-- lookup parent from repository -->
+	</parent>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<java.version>1.8</java.version>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+
+        <dependency>
+            <groupId>com.alibaba.boot</groupId>
+            <artifactId>velocity-spring-boot-starter</artifactId>
+            <version>0.1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.7</version>
+        </dependency>
+
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>dubbo</artifactId>
+            <version>2.6.2</version>
         </dependency>
-        <dependency>
-            <groupId>com.alibaba.citrus</groupId>
-            <artifactId>citrus-webx-all</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.javassist</groupId>
-            <artifactId>javassist</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.jboss.netty</groupId>
-            <artifactId>netty</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.mina</groupId>
-            <artifactId>mina-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.grizzly</groupId>
-            <artifactId>grizzly-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>fastjson</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.thoughtworks.xstream</groupId>
-            <artifactId>xstream</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.bsf</groupId>
-            <artifactId>bsf-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.zookeeper</groupId>
-            <artifactId>zookeeper</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.101tec</groupId>
-            <artifactId>zkclient</artifactId>
-        </dependency>
+
         <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-framework</artifactId>
+            <version>2.12.0</version>
         </dependency>
         <dependency>
             <groupId>com.googlecode.xmemcached</groupId>
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/PageContext.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/PageContext.java
deleted file mode 100644
index de81cee..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/PageContext.java
+++ /dev/null
@@ -1,53 +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 com.alibaba.dubbo.governance;
-
-import com.alibaba.dubbo.registry.common.domain.User;
-
-import java.util.Map;
-
-/**
- * Context
- *
- */
-public interface PageContext {
-
-    public String get(String key);
-
-    public String[] gets(String key);
-
-    public Map<String, String[]> getAll();
-
-    public void put(String key, Object value);
-
-    public String getMessage(String key, Object... args);
-
-    public String getClientAddress();
-
-    public String getOperateAddress();
-
-    public String getRegistryAddress();
-
-    public String getURI();
-
-    public String getURL();
-
-    public String getReferer();
-
-    public User getLoginUser();
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/status/DatabaseStatusChecker.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/status/DatabaseStatusChecker.java
deleted file mode 100644
index 0d03719..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/status/DatabaseStatusChecker.java
+++ /dev/null
@@ -1,98 +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 com.alibaba.dubbo.governance.status;
-
-import com.alibaba.dubbo.common.logger.Logger;
-import com.alibaba.dubbo.common.logger.LoggerFactory;
-import com.alibaba.dubbo.common.status.Status;
-import com.alibaba.dubbo.common.status.StatusChecker;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-
-/**
- * DatabaseStatus
- *
- */
-public class DatabaseStatusChecker implements StatusChecker {
-
-    private static final Logger logger = LoggerFactory.getLogger(DatabaseStatusChecker.class);
-
-    private int version;
-
-    private String message;
-
-    @Autowired
-    private DataSource dataSource;
-
-    public void setDataSource(DataSource dataSource) {
-        this.dataSource = dataSource;
-        check(); // init
-    }
-
-    public Status check() {
-        boolean ok;
-        try {
-            Connection connection = dataSource.getConnection();
-            try {
-                DatabaseMetaData metaData = connection.getMetaData();
-                ResultSet resultSet = metaData.getTypeInfo();
-                try {
-                    ok = resultSet.next();
-                } finally {
-                    resultSet.close();
-                }
-                if (message == null) {
-                    message = metaData.getURL()
-                            + " (" + metaData.getDatabaseProductName()
-                            + " " + metaData.getDatabaseProductVersion()
-                            + ", " + getIsolation(metaData.getDefaultTransactionIsolation()) + ")";
-                }
-                if (version == 0) {
-                    version = metaData.getDatabaseMajorVersion();
-                }
-            } finally {
-                connection.close();
-            }
-        } catch (Throwable e) {
-            logger.error(e.getMessage(), e);
-            ok = false;
-        }
-        return new Status(!ok ? Status.Level.ERROR : (version < 5 ? Status.Level.WARN : Status.Level.OK), message);
-    }
-
-    private String getIsolation(int i) {
-        if (i == Connection.TRANSACTION_READ_COMMITTED) {
-            return "READ_COMMITTED";
-        }
-        if (i == Connection.TRANSACTION_READ_UNCOMMITTED) {
-            return "READ_UNCOMMITTED";
-        }
-        if (i == Connection.TRANSACTION_REPEATABLE_READ) {
-            return "REPEATABLE_READ";
-        }
-        if (i == Connection.TRANSACTION_SERIALIZABLE) {
-            return "SERIALIZABLE)";
-        }
-        return "NONE";
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/status/LoadStatusChecker.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/status/LoadStatusChecker.java
deleted file mode 100644
index c9a4ff4..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/status/LoadStatusChecker.java
+++ /dev/null
@@ -1,45 +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 com.alibaba.dubbo.governance.status;
-
-import com.alibaba.dubbo.common.status.Status;
-import com.alibaba.dubbo.common.status.StatusChecker;
-
-import java.lang.management.ManagementFactory;
-import java.lang.management.OperatingSystemMXBean;
-import java.lang.reflect.Method;
-
-/**
- * Load Status
- *
- */
-public class LoadStatusChecker implements StatusChecker {
-
-    public Status check() {
-        OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
-        double load;
-        try {
-            Method method = OperatingSystemMXBean.class.getMethod("getSystemLoadAverage", new Class<?>[0]);
-            load = (Double) method.invoke(operatingSystemMXBean, new Object[0]);
-        } catch (Throwable e) {
-            load = -1;
-        }
-        int cpu = operatingSystemMXBean.getAvailableProcessors();
-        return new Status(load < 0 ? Status.Level.UNKNOWN : (load < cpu ? Status.Level.OK : Status.Level.WARN), "Load: " + load + " / CPU: " + cpu);
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/status/MemoryStatusChecker.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/status/MemoryStatusChecker.java
deleted file mode 100644
index 087eed1..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/status/MemoryStatusChecker.java
+++ /dev/null
@@ -1,40 +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 com.alibaba.dubbo.governance.status;
-
-import com.alibaba.dubbo.common.status.Status;
-import com.alibaba.dubbo.common.status.StatusChecker;
-
-/**
- * MemoryStatus
- *
- */
-public class MemoryStatusChecker implements StatusChecker {
-
-    public Status check() {
-        Runtime runtime = Runtime.getRuntime();
-        long freeMemory = runtime.freeMemory();
-        long totalMemory = runtime.totalMemory();
-        long maxMemory = runtime.maxMemory();
-        boolean ok = (maxMemory - (totalMemory - freeMemory) > 2048); // Alarm when spare memory < 2M
-        String msg = "Max:" + (maxMemory / 1024 / 1024) + "M, Total:"
-                + (totalMemory / 1024 / 1024) + "M, Free:" + (freeMemory / 1024 / 1024)
-                + "M, Use:" + ((totalMemory / 1024 / 1024) - (freeMemory / 1024 / 1024)) + "M";
-        return new Status(ok ? Status.Level.OK : Status.Level.WARN, msg);
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/LocaleValve.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/LocaleValve.java
deleted file mode 100644
index 175e3d7..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/LocaleValve.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 com.alibaba.dubbo.governance.web.common.interceptor;
-
-import com.alibaba.citrus.service.pipeline.PipelineContext;
-import com.alibaba.citrus.service.pipeline.support.AbstractValve;
-import com.alibaba.citrus.turbine.TurbineRunData;
-import com.alibaba.dubbo.governance.web.common.i18n.LocaleUtil;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-
-import static com.alibaba.citrus.turbine.util.TurbineUtil.getTurbineRunData;
-
-public class LocaleValve extends AbstractValve {
-
-    //Add exceptions for interceptors
-    private final static Set<String> TARGET_WITHOUT_CHECK = new HashSet<String>();
-
-    static {
-        TARGET_WITHOUT_CHECK.add("/ok");
-        TARGET_WITHOUT_CHECK.add("/error");
-        TARGET_WITHOUT_CHECK.add("/login");
-        TARGET_WITHOUT_CHECK.add("/logout");
-    }
-
-    @Autowired
-    private HttpServletRequest request;
-
-    private boolean ignoreTarget(String target) {
-        return TARGET_WITHOUT_CHECK.contains(target);
-    }
-
-    @Override
-    protected void init() throws Exception {
-    }
-
-    public void invoke(PipelineContext pipelineContext) throws Exception {
-        TurbineRunData rundata = getTurbineRunData(request);
-        if (ignoreTarget(rundata.getTarget())) {
-            pipelineContext.invokeNext();
-            return;
-        }
-
-        // default chinese
-        String[] temp = rundata.getCookies().getStrings("locale");
-        String locale = null;
-        if (temp != null) {
-            if (temp.length > 1) {
-                locale = temp[temp.length - 1];
-            } else if (temp.length == 1) {
-                locale = temp[0];
-            }
-        }
-        if (locale == null || "".equals(locale)) {
-            locale = "en";
-        }
-
-        Locale newLocale = Locale.SIMPLIFIED_CHINESE;
-        if ("en".equals(locale)) {
-            newLocale = Locale.ENGLISH;
-        } else if ("zh".equals(locale)) {
-            newLocale = Locale.SIMPLIFIED_CHINESE;
-        } else if ("zh_TW".equals(locale)) {
-            newLocale = Locale.TRADITIONAL_CHINESE;
-        }
-        LocaleUtil.setLocale(newLocale);
-
-        pipelineContext.invokeNext();
-    }
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/RestfuleUrlRewriter.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/RestfuleUrlRewriter.java
deleted file mode 100644
index e974723..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/RestfuleUrlRewriter.java
+++ /dev/null
@@ -1,204 +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 com.alibaba.dubbo.governance.web.common.interceptor;
-
-import com.alibaba.citrus.service.requestcontext.rewrite.RewriteSubstitutionContext;
-import com.alibaba.citrus.service.requestcontext.rewrite.RewriteSubstitutionHandler;
-import com.alibaba.dubbo.common.logger.Logger;
-import com.alibaba.dubbo.common.logger.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-/**
- * Rewrite: RESTFUL URL -> WebX URL.
- *
- */
-public class RestfuleUrlRewriter implements RewriteSubstitutionHandler {
-
-    private static final Logger logger = LoggerFactory.getLogger(RestfuleUrlRewriter.class);
-
-    private static final Map<String, String> pl2single;
-    private static final Set<String> appParameter;
-    private final static String METHOD_KEY = "_method";                                         // show,
-    private final static String TYPE_KEY = "_type";
-    private final static String ID_KEY = "id";
-    private final static String PAGES_KEY = "currentPage";
-    private final static String PATH_KEY = "_path";
-    private final static Pattern SLASH_PATTERN = Pattern.compile("/+");
-    private final static Pattern NUM_PATTERN = Pattern.compile("\\d+");
-    private final static Pattern MULTI_NUM_PATTERN = Pattern.compile("[+\\d]+");
-    private final static Pattern PAGES_SPLIT_PATTERN = Pattern.compile("/+pages/+");
-    private final static Pattern PAGES_PATTERN = Pattern.compile(".*/+pages/+\\d+$");
-
-    static {
-        Map<String, String> map = new HashMap<String, String>();
-
-        map.put("services", "service");
-        map.put("users", "user");
-        map.put("addresses", "address");
-        map.put("applications", "application");
-
-        map.put("providers", "provider");
-        map.put("comsumers", "comsumer");
-
-        pl2single = Collections.unmodifiableMap(map);
-        Set<String> set = new HashSet<String>();
-
-        set.add("_path");
-        set.add("currentPage");
-        set.add("_method");
-        set.add("_type");
-        set.add("id");
-
-        appParameter = Collections.unmodifiableSet(set);
-    }
-
-    public void postSubstitution(RewriteSubstitutionContext context) {
-        final String oldPath = context.getPath();
-        String path = oldPath;
-        while (path.startsWith("/")) {
-            path = path.substring(1);
-        }
-
-        Map<String, String> param = new HashMap<String, String>();
-
-        // Paging
-        if (PAGES_PATTERN.matcher(path).matches()) {
-            String[] page_path = PAGES_SPLIT_PATTERN.split(path);
-            path = page_path[0];
-            param.put(PATH_KEY, page_path[0]);
-            param.put(PAGES_KEY, page_path[1]);
-        } else {
-            param.put(PATH_KEY, path);
-        }
-        List<String> temp = Arrays.asList(SLASH_PATTERN.split(path));
-        //Compatible with 2.0.x registry shell style url, for example: http://root:hello1234@127.0.0.1:8080/status/dubbo.test.api.HelloService:1.1
-        if ("status".equals(temp.get(0)) && temp.size() > 1) {
-            context.setPath("servicestatus");
-            return;
-        }
-        //Compatible with paths containing group
-        String[] split = temp.toArray(new String[temp.size()]);
-
-        if (temp.size() > 2 && temp.contains("services")) {
-            List<String> parts = new ArrayList<String>();
-            parts.addAll(temp);
-            for (int i = 0; i < temp.size(); i++) {
-                if ("services".equals(temp.get(i)) && i < (temp.size() - 1) && (!temp.get(i + 1).contains(".")) && (!temp.get(i + 1).matches("\\d+"))) {
-                    String group = parts.get(i + 1);
-                    String service = parts.get(i + 2);
-                    parts.remove(i + 1);
-                    parts.set(i + 1, group + "/" + service);
-                    break;
-                }
-            }
-            split = parts.toArray(new String[parts.size()]);
-        }
-
-        int index = split.length;
-        // module/action
-        if (split.length < 2) return;
-        // The last part do not contains '.', like .htm .xsd .css etc.
-        if (split[index - 1].contains(".")) {
-            return;
-        }
-
-        final String type;
-        // Even number
-        // module/k/v/type or module/k/v/type/id/method
-        if (index % 2 == 0) {
-            if (MULTI_NUM_PATTERN.matcher(split[index - 2]).matches()) {
-                // module/k/v/action/id/operate
-                if (index < 4) return;
-
-                param.put(METHOD_KEY, split[index - 1]);
-                param.put(ID_KEY, split[index - 2]);
-                type = split[index - 3];
-                param.put(TYPE_KEY, type);
-                index -= 3;
-            } else {
-                // module/k/v/type
-                type = split[index - 1];
-                param.put(TYPE_KEY, type);
-                --index;
-            }
-        }
-        // Odd number
-        // module/k/v/type/method or module/k/v/type/id
-        else {
-            if (index < 3) return;
-            // module/k/v/type/id
-            if (NUM_PATTERN.matcher(split[index - 1]).matches()) {
-                param.put(ID_KEY, split[index - 1]);
-            }
-            // module/k/v/type/method
-            else {
-                param.put(METHOD_KEY, split[index - 1]);
-            }
-            type = split[index - 2];
-            param.put(TYPE_KEY, type);
-            index -= 2;
-        }
-
-        // Extract KV pair
-        for (int i = 1; i < index; i += 2) {
-            param.put(split[i], split[i + 1]);
-        }
-
-        String method = param.get(METHOD_KEY);
-
-        String defaultRedirect = null;
-        if (method == null || method.equals("index")) {
-            defaultRedirect = oldPath;
-        } else {
-            defaultRedirect = oldPath.split("/" + method)[0];
-        }
-        String id = param.get(ID_KEY);
-        if (id != null) {
-            int i = defaultRedirect.lastIndexOf("/");
-            defaultRedirect = defaultRedirect.substring(0, i);
-        }
-        context.getParameters().setString("defaultRedirect", defaultRedirect);
-
-        final String module = split[0];
-        context.setPath("/" + module + "/" + type + ".htm");
-
-        for (Map.Entry<String, String> entry : param.entrySet()) {
-            String key = entry.getKey();
-            if (pl2single.containsKey(key)) {
-                key = pl2single.get(key);
-            } else if (appParameter.contains(key)) {
-                // nothing
-            } else {
-                logger.info("key " + key + " is not pl noun!");
-            }
-            context.getParameters().setString(key, entry.getValue());
-        }
-
-        if (logger.isInfoEnabled()) {
-            logger.info("REWRITE restful uri " + oldPath + " to uri " + module + "/" + type + ".htm?" + param);
-        }
-    }
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/ServicePrivilegeCheckValve.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/ServicePrivilegeCheckValve.java
deleted file mode 100644
index 6a19de7..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/ServicePrivilegeCheckValve.java
+++ /dev/null
@@ -1,102 +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 com.alibaba.dubbo.governance.web.common.interceptor;
-
-import com.alibaba.citrus.service.pipeline.PipelineContext;
-import com.alibaba.citrus.service.pipeline.support.AbstractValve;
-import com.alibaba.citrus.turbine.TurbineRunData;
-import com.alibaba.dubbo.common.logger.Logger;
-import com.alibaba.dubbo.common.logger.LoggerFactory;
-import com.alibaba.dubbo.governance.web.util.WebConstants;
-import com.alibaba.dubbo.registry.common.domain.User;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import java.util.Map;
-
-import static com.alibaba.citrus.turbine.util.TurbineUtil.getTurbineRunData;
-
-public class ServicePrivilegeCheckValve extends AbstractValve {
-    private static final Logger logger = LoggerFactory.getLogger(ServicePrivilegeCheckValve.class);
-
-    @Autowired
-    private HttpServletRequest request;
-
-    @Override
-    protected void init() throws Exception {
-    }
-
-    public void invoke(PipelineContext pipelineContext) throws Exception {
-        User user = (User) request.getSession().getAttribute(WebConstants.CURRENT_USER_KEY);
-        invokeCheckServicePrivilege(user);
-        pipelineContext.invokeNext();
-    }
-
-
-    private void invokeCheckServicePrivilege(User user) {
-        TurbineRunData rundata = getTurbineRunData(request);
-        HttpSession session = request.getSession();
-
-        @SuppressWarnings("unchecked")
-        Map<String, String[]> requestMapping = request.getParameterMap();
-
-        // record the last operation to request
-        String returnURL = "";
-        if (session.getAttribute("returnURL") == null) {
-            returnURL = request.getContextPath();
-        } else {
-            returnURL = (String) session.getAttribute("returnURL");
-        }
-
-        if (requestMapping.get("service").length > 0) {
-            String service = ((String[]) requestMapping.get("service"))[0];
-            String method = "index";
-            if (requestMapping.get("_method").length > 0) {
-                method = requestMapping.get("_method")[0];
-            }
-
-            boolean exclude = "index".equals(method) || "show".equals(method);
-            if (!exclude) {
-                if (user != null && !user.hasServicePrivilege(service)) {
-                    request.setAttribute("returnURL", returnURL);
-                    redirectToNoRight(rundata);
-                }
-            }
-        }
-        String type = requestMapping.get("_type").length == 0 ? null : requestMapping.get("_type")[0];
-        if (!"noServicePrivilege".equals(type)) {
-            session.setAttribute("returnURL", request.getRequestURI());
-        }
-        return;
-    }
-
-    /**
-     * redirect if in case of no right.
-     * @param rundata
-     */
-    private void redirectToNoRight(TurbineRunData rundata) {
-        if (logger.isInfoEnabled()) {
-            logger.info("No right to access: " + request.getRequestURI());
-        }
-
-        rundata.getParameters().setString("returnURL1", (String) rundata.getRequest().getAttribute("returnURL"));
-        rundata.setRedirectLocation("http://localhost:8080/governance/noServicePrivilege?returnURL=" + rundata.getRequest().getAttribute("returnURL"));
-        return;
-    }
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/module/screen/Error_404.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/module/screen/Error_404.java
deleted file mode 100644
index ef5ba2d..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/module/screen/Error_404.java
+++ /dev/null
@@ -1,30 +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 com.alibaba.dubbo.governance.web.common.module.screen;
-
-import com.alibaba.dubbo.governance.web.common.pulltool.RootContextPath;
-
-import java.util.Map;
-
-public class Error_404 {
-
-    public void execute(Map<String, Object> context) throws Throwable {
-        String contextPath = (String) context.get("request.contextPath");
-        context.put("rootContextPath", new RootContextPath(contextPath));
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/module/screen/Restful.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/module/screen/Restful.java
deleted file mode 100644
index 96196b7..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/module/screen/Restful.java
+++ /dev/null
@@ -1,243 +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 com.alibaba.dubbo.governance.web.common.module.screen;
-
-import com.alibaba.dubbo.common.logger.Logger;
-import com.alibaba.dubbo.common.logger.LoggerFactory;
-import com.alibaba.dubbo.common.utils.CompatibleTypeUtils;
-import com.alibaba.dubbo.governance.biz.common.i18n.MessageResourceService;
-import com.alibaba.dubbo.governance.web.common.pulltool.RootContextPath;
-import com.alibaba.dubbo.governance.web.util.WebConstants;
-import com.alibaba.dubbo.registry.common.domain.User;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * BaseScreen
- *
- */
-public abstract class Restful {
-
-    protected static final Logger logger = LoggerFactory.getLogger(Restful.class);
-
-    protected static final Pattern SPACE_SPLIT_PATTERN = Pattern.compile("\\s+");
-    //FIXME, to extract these auxiliary methods
-    protected String role = null;
-    protected String operator = null;
-    protected User currentUser = null;
-    protected String operatorAddress = null;
-    protected String currentRegistry = null;
-    @Autowired
-    private MessageResourceService messageResourceService;
-
-    private static boolean isPrimitive(Class<?> cls) {
-        return cls.isPrimitive() || cls == Boolean.class || cls == Byte.class
-                || cls == Character.class || cls == Short.class || cls == Integer.class
-                || cls == Long.class || cls == Float.class || cls == Double.class
-                || cls == String.class;
-    }
-
-    private static Object convertPrimitive(Class<?> cls, String value) {
-        if (cls == boolean.class || cls == Boolean.class) {
-            return value == null || value.length() == 0 ? false : Boolean.valueOf(value);
-        } else if (cls == byte.class || cls == Byte.class) {
-            return value == null || value.length() == 0 ? 0 : Byte.valueOf(value);
-        } else if (cls == char.class || cls == Character.class) {
-            return value == null || value.length() == 0 ? '\0' : value.charAt(0);
-        } else if (cls == short.class || cls == Short.class) {
-            return value == null || value.length() == 0 ? 0 : Short.valueOf(value);
-        } else if (cls == int.class || cls == Integer.class) {
-            return value == null || value.length() == 0 ? 0 : Integer.valueOf(value);
-        } else if (cls == long.class || cls == Long.class) {
-            return value == null || value.length() == 0 ? 0 : Long.valueOf(value);
-        } else if (cls == float.class || cls == Float.class) {
-            return value == null || value.length() == 0 ? 0 : Float.valueOf(value);
-        } else if (cls == double.class || cls == Double.class) {
-            return value == null || value.length() == 0 ? 0 : Double.valueOf(value);
-        }
-        return value;
-    }
-
-    public String getMessage(String key, Object... args) {
-        return messageResourceService.getMessage(key, args);
-    }
-
-    public void execute(Map<String, Object> context) throws Throwable {
-        if (context.get(WebConstants.CURRENT_USER_KEY) != null) {
-            User user = (User) context.get(WebConstants.CURRENT_USER_KEY);
-            currentUser = user;
-            operator = user.getUsername();
-            role = user.getRole();
-            context.put(WebConstants.CURRENT_USER_KEY, user);
-        }
-        operatorAddress = (String) context.get("request.remoteHost");
-        context.put("operator", operator);
-        context.put("operatorAddress", operatorAddress);
-
-        context.put("currentRegistry", currentRegistry);
-
-        String httpMethod = (String) context.get("request.method");
-        String method = (String) context.get("_method");
-        String contextPath = (String) context.get("request.contextPath");
-        context.put("rootContextPath", new RootContextPath(contextPath));
-
-        // Analyze Method
-        if (method == null || method.length() == 0) {
-            String id = (String) context.get("id");
-            if (id == null || id.length() == 0) {
-                method = "index";
-            } else {
-                method = "show";
-            }
-        }
-        if ("index".equals(method)) {
-            if ("post".equalsIgnoreCase(httpMethod)) {
-                method = "create";
-            }
-        } else if ("show".equals(method)) {
-            if ("put".equalsIgnoreCase(httpMethod) || "post".equalsIgnoreCase(httpMethod)) { // Instead of submitting a PUT request with a form, use POST instead
-                method = "update";
-            } else if ("delete".equalsIgnoreCase(httpMethod)) { // Instead of submitting a PUT request with a form, use POST instead
-                method = "delete";
-            }
-        }
-        context.put("_method", method);
-
-        try {
-            Method m = null;
-            try {
-                m = getClass().getMethod(method, new Class<?>[]{Map.class});
-            } catch (NoSuchMethodException e) {
-                for (Method mtd : getClass().getMethods()) {
-                    if (Modifier.isPublic(mtd.getModifiers())
-                            && mtd.getName().equals(method)) {
-                        m = mtd;
-                        break;
-                    }
-                }
-                if (m == null) {
-                    throw e;
-                }
-            }
-            if (m.getParameterTypes().length > 2) {
-                throw new IllegalStateException("Unsupport restful method " + m);
-            } else if (m.getParameterTypes().length == 2
-                    && (m.getParameterTypes()[0].equals(Map.class)
-                    || !m.getParameterTypes()[1].equals(Map.class))) {
-                throw new IllegalStateException("Unsupport restful method " + m);
-            }
-            Object r;
-            if (m.getParameterTypes().length == 0) {
-                r = m.invoke(this, new Object[0]);
-            } else {
-                Object value;
-                Class<?> t = m.getParameterTypes()[0];
-                if (Map.class.equals(t)) {
-                    value = context;
-                } else if (isPrimitive(t)) {
-                    String id = (String) context.get("id");
-                    value = convertPrimitive(t, id);
-                } else if (t.isArray() && isPrimitive(t.getComponentType())) {
-                    String id = (String) context.get("id");
-                    String[] ids = id == null ? new String[0] : id.split("[.+]+");
-                    value = Array.newInstance(t.getComponentType(), ids.length);
-                    for (int i = 0; i < ids.length; i++) {
-                        Array.set(value, i, convertPrimitive(t.getComponentType(), ids[i]));
-                    }
-                } else {
-                    value = t.newInstance();
-                    for (Method mtd : t.getMethods()) {
-                        if (Modifier.isPublic(mtd.getModifiers())
-                                && mtd.getName().startsWith("set")
-                                && mtd.getParameterTypes().length == 1) {
-                            String p = mtd.getName().substring(3, 4).toLowerCase() + mtd.getName().substring(4);
-                            Object v = context.get(p);
-                            if (v == null) {
-                                if ("operator".equals(p)) {
-                                    v = operator;
-                                } else if ("operatorAddress".equals(p)) {
-                                    v = (String) context.get("request.remoteHost");
-                                }
-                            }
-                            if (v != null) {
-                                try {
-                                    mtd.invoke(value, new Object[]{CompatibleTypeUtils.compatibleTypeConvert(v, mtd.getParameterTypes()[0])});
-                                } catch (Throwable e) {
-                                    logger.warn(e.getMessage(), e);
-                                }
-                            }
-                        }
-                    }
-                }
-                if (m.getParameterTypes().length == 1) {
-                    r = m.invoke(this, new Object[]{value});
-                } else {
-                    r = m.invoke(this, new Object[]{value, context});
-                }
-            }
-            if (m.getReturnType() == boolean.class || m.getReturnType() == Boolean.class) {
-                context.put("rundata.layout", "redirect");
-                context.put("rundata.target", "redirect");
-                context.put("success", r == null || ((Boolean) r).booleanValue());
-                if (context.get("redirect") == null) {
-                    context.put("redirect", getDefaultRedirect(context, method));
-                }
-            } else if (m.getReturnType() == String.class) {
-                String redirect = (String) r;
-                if (redirect == null) {
-                    redirect = getDefaultRedirect(context, method);
-                }
-
-                if (context.get("chain") != null) {
-                    context.put("rundata.layout", "home");
-                    context.put("rundata.target", "home");
-                } else {
-                    context.put("rundata.redirect", redirect);
-                }
-            } else {
-                context.put("rundata.layout", method);
-                context.put("rundata.target", context.get("rundata.target") + "/" + method);
-            }
-        } catch (Throwable e) {
-            if (e instanceof InvocationTargetException) {
-                throw ((InvocationTargetException) e).getTargetException();
-            }
-//            if (e instanceof InvocationTargetException) {
-//                e = ((InvocationTargetException) e).getTargetException();
-//            }
-//            logger.warn(e.getMessage(), e);
-//            context.put("rundata.layout", "redirect");
-//            context.put("rundata.target", "redirect");
-//            context.put("success", false);
-//            context.put("exception", e);
-//            context.put("redirect", getDefaultRedirect(context, method));
-        }
-    }
-
-    private String getDefaultRedirect(Map<String, Object> context, String operate) {
-        String defaultRedirect = (String) context.get("defaultRedirect");
-        return defaultRedirect;
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/I18nMessageTool.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/I18nMessageTool.java
deleted file mode 100644
index fa50d5d..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/I18nMessageTool.java
+++ /dev/null
@@ -1,46 +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 com.alibaba.dubbo.governance.web.common.pulltool;
-
-import com.alibaba.citrus.service.pull.ToolFactory;
-import com.alibaba.dubbo.governance.biz.common.i18n.MessageResourceService;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * PullTool for accessing message bundle.
- *x
- */
-public class I18nMessageTool implements ToolFactory {
-
-    @Autowired
-    private MessageResourceService messageResourceService;
-    private boolean singleton = true;
-
-    public Object createTool() throws Exception {
-        return messageResourceService;
-    }
-
-    public boolean isSingleton() {
-        return this.singleton;
-    }
-
-    public void setSingleton(boolean singleton) {
-        this.singleton = singleton;
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/ToolUtil.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/ToolUtil.java
deleted file mode 100644
index 20dea45..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/ToolUtil.java
+++ /dev/null
@@ -1,52 +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 com.alibaba.dubbo.governance.web.common.pulltool;
-
-import com.alibaba.citrus.service.pull.ToolFactory;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.service.RouteService;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * PullTool for accessing message bundle.
- *
- */
-public class ToolUtil implements ToolFactory {
-    @Autowired
-    OverrideService overrideService;
-
-    @Autowired
-    RouteService routeService;
-    private boolean singleton = false;
-
-    public Object createTool() throws Exception {
-        Tool tool = new Tool();
-        tool.setOverrideService(overrideService);
-        tool.setRouteService(routeService);
-        return tool;
-    }
-
-    public boolean isSingleton() {
-        return this.singleton;
-    }
-
-    public void setSingleton(boolean singleton) {
-        this.singleton = singleton;
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/resolver/MapDataResolverFactory.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/resolver/MapDataResolverFactory.java
deleted file mode 100644
index f513407..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/resolver/MapDataResolverFactory.java
+++ /dev/null
@@ -1,61 +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 com.alibaba.dubbo.governance.web.common.resolver;
-
-import com.alibaba.citrus.service.dataresolver.DataResolver;
-import com.alibaba.citrus.service.dataresolver.DataResolverContext;
-import com.alibaba.citrus.service.dataresolver.DataResolverFactory;
-import com.alibaba.citrus.turbine.TurbineRunDataInternal;
-import com.alibaba.citrus.turbine.util.TurbineUtil;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.Map;
-
-/**
- * MapDataResolverFactory
- *
- */
-public class MapDataResolverFactory implements DataResolverFactory {
-
-    @Autowired
-    private HttpServletRequest request;
-
-    public DataResolver getDataResolver(DataResolverContext context) {
-        if (Map.class == context.getTypeInfo().getRawType()) {
-            return new MapDataResolver(context);
-        }
-        return null;
-    }
-
-    public class MapDataResolver implements DataResolver {
-
-        public final DataResolverContext context;
-
-        public MapDataResolver(DataResolverContext context) {
-            this.context = context;
-        }
-
-        public Object resolve() {
-            TurbineRunDataInternal rundata = (TurbineRunDataInternal) TurbineUtil.getTurbineRunData(request);
-            return new ParameterMap(request, rundata.getContext(), rundata);
-        }
-
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/resolver/ParameterMap.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/resolver/ParameterMap.java
deleted file mode 100644
index 0ba00d3..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/resolver/ParameterMap.java
+++ /dev/null
@@ -1,364 +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 com.alibaba.dubbo.governance.web.common.resolver;
-
-import com.alibaba.citrus.turbine.Context;
-import com.alibaba.citrus.turbine.TurbineRunDataInternal;
-
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * ParameterMap
- *
- */
-public class ParameterMap implements Map<String, Object> {
-
-    private static final String CONTEXT_PREFIX = "context.";
-
-    private static final String PARAMETER_PREFIX = "parameter.";
-
-    private static final String HEADER_PREFIX = "header.";
-
-    private static final String REQUEST_PREFIX = "request.";
-
-    private static final String SESSION_PREFIX = "session.";
-
-    private static final String COOKIE_PREFIX = "cookie.";
-
-    private static final String APPLICATION_PREFIX = "application.";
-
-    private static final String RUNDATA_PREFIX = "rundata.";
-
-    private static final String METHOD_KEY = REQUEST_PREFIX + "method";
-
-    private static final String REMOTE_HOST_KEY = REQUEST_PREFIX + "remoteHost";
-
-    private static final String CONTEXT_PATH_KEY = REQUEST_PREFIX + "contextPath";
-
-    private static final String USER_PRINCIPAL_KEY = REQUEST_PREFIX + "userPrincipal";
-
-    private static final String TARGET_KEY = RUNDATA_PREFIX + "target";
-
-    private static final String FORWARD_KEY = RUNDATA_PREFIX + "forward";
-
-    private static final String BACKWARD_KEY = RUNDATA_PREFIX + "backward";
-
-    private static final String REDIRECT_KEY = RUNDATA_PREFIX + "redirect";
-
-    private static final String REDIRECTED_KEY = RUNDATA_PREFIX + "redirected";
-
-    private static final String LAYOUT_KEY = RUNDATA_PREFIX + "layout";
-
-    private static final String LAYOUT_ENABLED_KEY = RUNDATA_PREFIX + "layoutEnabled";
-
-    private final HttpServletRequest request;
-
-    private final Context context;
-
-    private final TurbineRunDataInternal rundata;
-
-    @SuppressWarnings("unchecked")
-    public ParameterMap(HttpServletRequest request, Context context, TurbineRunDataInternal navigator) {
-        super();
-        this.request = request;
-        this.context = context;
-        this.rundata = navigator;
-        Enumeration<String> keys = request.getParameterNames();
-        while (keys.hasMoreElements()) {
-            String key = keys.nextElement();
-            Object value = getParameterValue(key);
-            context.put(key, value);
-        }
-    }
-
-    public int size() {
-        return 0;
-    }
-
-    public boolean isEmpty() {
-        return false;
-    }
-
-    public boolean containsValue(Object value) {
-        if (value == null) {
-            return false;
-        }
-        Set<String> keys = context.keySet();
-        if (keys != null && keys.size() > 0) {
-            for (String key : keys) {
-                if (value.equals(context.get(key))) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    public boolean containsKey(Object key) {
-        String k = (String) key;
-        if (k == null || k.length() == 0) {
-            return false;
-        }
-        return context.containsKey(k) || request.getParameter(k) != null;
-    }
-
-    public Object get(Object key) {
-        String k = (String) key;
-        if (k == null || k.length() == 0) {
-            return null;
-        }
-        if (METHOD_KEY.equals(k)) {
-            return request.getMethod();
-        } else if (REMOTE_HOST_KEY.equals(k)) {
-            return request.getRemoteHost();
-        } else if (CONTEXT_PATH_KEY.equals(k)) {
-            return request.getContextPath();
-        } else if (USER_PRINCIPAL_KEY.equals(k)) {
-            return request.getUserPrincipal();
-        } else if (TARGET_KEY.equals(k)) {
-            return rundata.getTarget();
-        } else if (FORWARD_KEY.equals(k)) {
-            return rundata.getRedirectTarget();
-        } else if (REDIRECT_KEY.equals(k)) {
-            return rundata.getRedirectLocation();
-        } else if (REDIRECTED_KEY.equals(k)) {
-            return rundata.isRedirected();
-        } else if (LAYOUT_KEY.equals(k)) {
-            return rundata.getLayoutTemplateOverride();
-        } else if (LAYOUT_ENABLED_KEY.equals(k)) {
-            return rundata.isLayoutEnabled();
-        } else if (k.startsWith(CONTEXT_PREFIX)) {
-            return context.get(k.substring(CONTEXT_PREFIX.length()));
-        } else if (k.startsWith(PARAMETER_PREFIX)) {
-            return getParameterValue(k.substring(PARAMETER_PREFIX.length()));
-        } else if (k.startsWith(HEADER_PREFIX)) {
-            return request.getHeader(k.substring(HEADER_PREFIX.length()));
-        } else if (k.startsWith(REQUEST_PREFIX)) {
-            return request.getAttribute(k.substring(REQUEST_PREFIX.length()));
-        } else if (k.startsWith(SESSION_PREFIX)) {
-            return request.getSession().getAttribute(k.substring(SESSION_PREFIX.length()));
-        } else if (k.startsWith(COOKIE_PREFIX)) {
-            return getCookieValue(k.substring(COOKIE_PREFIX.length()));
-        } else if (k.startsWith(APPLICATION_PREFIX)) {
-            return request.getSession().getServletContext().getAttribute(k.substring(APPLICATION_PREFIX.length()));
-        } else {
-            Object value = context.get(k);
-            if (value == null) {
-                value = getParameterValue(k);
-                if (value == null) {
-                    value = request.getAttribute(k);
-                    if (value == null) {
-                        value = request.getSession().getAttribute(k);
-                        if (value == null) {
-                            value = getCookieValue(k);
-                            if (value == null) {
-                                value = request.getSession().getServletContext().getAttribute(k);
-                            }
-                        }
-                    }
-                }
-            }
-            return value;
-        }
-    }
-
-    private Object getParameterValue(String key) {
-        String[] values = request.getParameterValues(key);
-        if (values == null || values.length == 0) {
-            return null;
-        } else if (values.length == 1) {
-            return values[0];
-        } else {
-            return values;
-        }
-    }
-
-    private Object getCookieValue(String key) {
-        Cookie[] cookies = request.getCookies();
-        if (cookies != null && cookies.length > 0) {
-            for (Cookie cookie : cookies) {
-                if (key.equals(cookie.getName())) {
-                    return cookie.getValue();
-                }
-            }
-        }
-        return null;
-    }
-
-    public Object put(String key, Object value) {
-        if (key == null || key.length() == 0) {
-            return null;
-        }
-        if (TARGET_KEY.equals(key)) {
-            rundata.setTarget((String) value);
-            return null;
-        } else if (FORWARD_KEY.equals(key)) {
-            rundata.setRedirectTarget((String) value);
-            return null;
-        } else if (BACKWARD_KEY.equals(key)) {
-            rundata.setRedirectLocation(request.getHeader("Referer"));
-            return null;
-        } else if (REDIRECT_KEY.equals(key)) {
-            rundata.setRedirectLocation((String) value);
-            return null;
-        } else if (LAYOUT_KEY.equals(key)) {
-            rundata.setLayout((String) value);
-            return null;
-        } else if (LAYOUT_ENABLED_KEY.equals(key)) {
-            rundata.setLayoutEnabled((Boolean) value);
-            return null;
-        } else {
-            if (key.startsWith(REQUEST_PREFIX)) {
-                key = key.substring(APPLICATION_PREFIX.length());
-                Object old = request.getAttribute(key);
-                if (value == null) {
-                    request.removeAttribute(key);
-                } else {
-                    request.setAttribute(key, value);
-                }
-                return old;
-            } else if (key.startsWith(SESSION_PREFIX)) {
-                key = key.substring(APPLICATION_PREFIX.length());
-                Object old = request.getSession().getAttribute(key);
-                if (value == null) {
-                    request.getSession().removeAttribute(key);
-                } else {
-                    request.getSession().setAttribute(key, value);
-                }
-                return old;
-            } else if (key.startsWith(COOKIE_PREFIX)) {
-                key = key.substring(APPLICATION_PREFIX.length());
-                Object old = null;
-                Cookie[] cookies = request.getCookies();
-                if (cookies != null && cookies.length > 0) {
-                    for (Cookie cookie : cookies) {
-                        if (key.equals(cookie.getName())) {
-                            old = cookie.getValue();
-                            if (value == null) {
-                                cookie.setMaxAge(-1);
-                            } else {
-                                cookie.setValue((String) value);
-                            }
-                            break;
-                        }
-                    }
-                }
-                return old;
-            } else if (key.startsWith(APPLICATION_PREFIX)) {
-                key = key.substring(APPLICATION_PREFIX.length());
-                Object old = request.getSession().getServletContext().getAttribute(key);
-                if (value == null) {
-                    request.getSession().getServletContext().removeAttribute(key);
-                } else {
-                    request.getSession().getServletContext().setAttribute(key, value);
-                }
-                return old;
-            } else {
-                if (key.startsWith(APPLICATION_PREFIX)) {
-                    key = key.substring(APPLICATION_PREFIX.length());
-                }
-                Object old = context.get(key);
-                if (value == null) {
-                    context.remove(key);
-                } else {
-                    context.put(key, value);
-                }
-                return old;
-            }
-        }
-    }
-
-    public Object remove(Object key) {
-        return put((String) key, null);
-    }
-
-    public void putAll(Map<? extends String, ? extends Object> map) {
-        if (map != null && map.size() > 0) {
-            for (Map.Entry<? extends String, ? extends Object> entry : map.entrySet()) {
-                put(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    public void clear() {
-        Set<String> keys = context.keySet();
-        if (keys != null && keys.size() > 0) {
-            for (String key : keys) {
-                context.remove(key);
-            }
-        }
-    }
-
-    public Set<String> keySet() {
-        return context.keySet();
-    }
-
-    public Collection<Object> values() {
-        Set<String> keys = context.keySet();
-        Set<Object> values = new HashSet<Object>();
-        if (keys != null && keys.size() > 0) {
-            for (String key : keys) {
-                values.add(context.get(key));
-            }
-        }
-        return values;
-    }
-
-    public Set<Entry<String, Object>> entrySet() {
-        Set<String> keys = context.keySet();
-        Set<Entry<String, Object>> entries = new HashSet<Entry<String, Object>>();
-        if (keys != null && keys.size() > 0) {
-            for (String key : keys) {
-                entries.add(new ParameterEntry(key));
-            }
-        }
-        return entries;
-    }
-
-    private class ParameterEntry implements Entry<String, Object> {
-
-        private final String key;
-
-        private volatile Object value;
-
-        public ParameterEntry(String key) {
-            this.key = key;
-            this.value = ParameterMap.this.get(key);
-        }
-
-        public String getKey() {
-            return key;
-        }
-
-        public Object getValue() {
-            return value;
-        }
-
-        public Object setValue(Object value) {
-            this.value = value;
-            return ParameterMap.this.put(key, value);
-        }
-
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/utils/RelateUserUtils.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/utils/RelateUserUtils.java
deleted file mode 100644
index 8f666e2..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/utils/RelateUserUtils.java
+++ /dev/null
@@ -1,59 +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 com.alibaba.dubbo.governance.web.common.utils;
-
-import com.alibaba.dubbo.governance.service.OwnerService;
-import com.alibaba.dubbo.registry.common.route.ParseUtils;
-
-import java.util.List;
-import java.util.Set;
-
-public class RelateUserUtils {
-    /**
-     * Add an owner related with service
-     *
-     * @param usernames the user to add
-     * @param serviceName no wildcards
-     */
-    public static void addOwnersOfService(Set<String> usernames, String serviceName,
-                                          OwnerService ownerDAO) {
-        List<String> serviceNamePatterns = ownerDAO.findAllServiceNames();
-        for (String p : serviceNamePatterns) {
-            if (ParseUtils.isMatchGlobPattern(p, serviceName)) {
-                List<String> list = ownerDAO.findUsernamesByServiceName(p);
-                usernames.addAll(list);
-            }
-        }
-    }
-
-    /**
-     * Add an owner related with service pattern
-     *
-     * @param usernames the user to add
-     * @param serviceNamePattern service pattern, Glob
-     */
-    public static void addOwnersOfServicePattern(Set<String> usernames, String serviceNamePattern,
-                                                 OwnerService ownerDAO) {
-        List<String> serviceNamePatterns = ownerDAO.findAllServiceNames();
-        for (String p : serviceNamePatterns) {
-            if (ParseUtils.hasIntersection(p, serviceNamePattern)) {
-                List<String> list = ownerDAO.findUsernamesByServiceName(p);
-                usernames.addAll(list);
-            }
-        }
-    }
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Applications.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Applications.java
deleted file mode 100644
index 22aa0fb..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Applications.java
+++ /dev/null
@@ -1,274 +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 com.alibaba.dubbo.governance.web.governance.module.screen;
-
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.ConsumerService;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Override;
-import com.alibaba.dubbo.registry.common.route.OverrideUtils;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Providers.
- * URI: /applications
- *
- */
-public class Applications extends Restful {
-
-    @Autowired
-    private ProviderService providerService;
-
-    @Autowired
-    private ConsumerService consumerService;
-
-    @Autowired
-    private OverrideService overrideService;
-
-    public void index(Map<String, Object> context) {
-        String service = (String) context.get("service");
-        if (context.get("service") != null) {
-            Set<String> applications = new TreeSet<String>();
-            List<String> providerApplications = providerService.findApplicationsByServiceName(service);
-            if (providerApplications != null && providerApplications.size() > 0) {
-                applications.addAll(providerApplications);
-            }
-            List<String> consumerApplications = consumerService.findApplicationsByServiceName(service);
-            if (consumerApplications != null && consumerApplications.size() > 0) {
-                applications.addAll(consumerApplications);
-            }
-            context.put("applications", applications);
-            context.put("providerApplications", providerApplications);
-            context.put("consumerApplications", consumerApplications);
-            if (service != null && service.length() > 0) {
-                List<Override> overrides = overrideService.findByService(service);
-                Map<String, List<Override>> application2Overrides = new HashMap<String, List<Override>>();
-                if (overrides != null && overrides.size() > 0
-                        && applications != null && applications.size() > 0) {
-                    for (String a : applications) {
-                        if (overrides != null && overrides.size() > 0) {
-                            List<Override> appOverrides = new ArrayList<Override>();
-                            for (Override override : overrides) {
-                                if (override.isMatch(service, null, a)) {
-                                    appOverrides.add(override);
-                                }
-                            }
-                            Collections.sort(appOverrides, OverrideUtils.OVERRIDE_COMPARATOR);
-                            application2Overrides.put(a, appOverrides);
-                        }
-                    }
-                }
-                context.put("overrides", application2Overrides);
-            }
-            return;
-        }
-        if (context.get("service") == null
-                && context.get("application") == null
-                && context.get("address") == null) {
-            context.put("application", "*");
-        }
-        Set<String> applications = new TreeSet<String>();
-        List<String> providerApplications = providerService.findApplications();
-        if (providerApplications != null && providerApplications.size() > 0) {
-            applications.addAll(providerApplications);
-        }
-        List<String> consumerApplications = consumerService.findApplications();
-        if (consumerApplications != null && consumerApplications.size() > 0) {
-            applications.addAll(consumerApplications);
-        }
-
-        Set<String> newList = new HashSet<String>();
-        Set<String> newProviders = new HashSet<String>();
-        Set<String> newConsumers = new HashSet<String>();
-        context.put("applications", applications);
-        context.put("providerApplications", providerApplications);
-        context.put("consumerApplications", consumerApplications);
-
-        String keyword = (String) context.get("keyword");
-        if (StringUtils.isNotEmpty(keyword) && !"*".equals(keyword)) {
-            keyword = keyword.toLowerCase();
-            for (String o : applications) {
-                if (o.toLowerCase().indexOf(keyword) != -1) {
-                    newList.add(o);
-                }
-            }
-            for (String o : providerApplications) {
-                if (o.toLowerCase().indexOf(keyword) != -1) {
-                    newProviders.add(o);
-                }
-            }
-            for (String o : consumerApplications) {
-                if (o.toLowerCase().indexOf(keyword) != -1) {
-                    newConsumers.add(o);
-                }
-            }
-            context.put("applications", newList);
-            context.put("providerApplications", newProviders);
-            context.put("consumerApplications", newConsumers);
-        }
-    }
-
-    public void search(Map<String, Object> context) {
-        index(context);
-
-        Set<String> newList = new HashSet<String>();
-        @SuppressWarnings("unchecked")
-        Set<String> apps = (Set<String>) context.get("applications");
-        String keyword = (String) context.get("keyword");
-        if (StringUtils.isNotEmpty(keyword)) {
-            keyword = keyword.toLowerCase();
-            for (String o : apps) {
-                if (o.toLowerCase().indexOf(keyword) != -1) {
-                    newList.add(o);
-                }
-            }
-        }
-        context.put("applications", newList);
-    }
-
-    public boolean shield(Map<String, Object> context) throws Exception {
-        return mock(context, "force:return null");
-    }
-
-    public boolean tolerant(Map<String, Object> context) throws Exception {
-        return mock(context, "fail:return null");
-    }
-
-    public boolean recover(Map<String, Object> context) throws Exception {
-        return mock(context, "");
-    }
-
-    private boolean mock(Map<String, Object> context, String mock) throws Exception {
-        String service = (String) context.get("service");
-        String applications = (String) context.get("application");
-        if (service == null || service.length() == 0
-                || applications == null || applications.length() == 0) {
-            context.put("message", getMessage("NoSuchOperationData"));
-            return false;
-        }
-        if (!super.currentUser.hasServicePrivilege(service)) {
-            context.put("message", getMessage("HaveNoServicePrivilege", service));
-            return false;
-        }
-        for (String application : SPACE_SPLIT_PATTERN.split(applications)) {
-            List<Override> overrides = overrideService.findByServiceAndApplication(service, application);
-            if (overrides != null && overrides.size() > 0) {
-                for (Override override : overrides) {
-                    Map<String, String> map = StringUtils.parseQueryString(override.getParams());
-                    if (mock == null || mock.length() == 0) {
-                        map.remove("mock");
-                    } else {
-                        map.put("mock", URL.encode(mock));
-                    }
-                    if (map.size() > 0) {
-                        override.setParams(StringUtils.toQueryString(map));
-                        override.setEnabled(true);
-                        override.setOperator(operator);
-                        override.setOperatorAddress(operatorAddress);
-                        overrideService.updateOverride(override);
-                    } else {
-                        overrideService.deleteOverride(override.getId());
-                    }
-                }
-            } else if (mock != null && mock.length() > 0) {
-                Override override = new Override();
-                override.setService(service);
-                override.setApplication(application);
-                override.setParams("mock=" + URL.encode(mock));
-                override.setEnabled(true);
-                override.setOperator(operator);
-                override.setOperatorAddress(operatorAddress);
-                overrideService.saveOverride(override);
-            }
-        }
-        return true;
-    }
-
-    public boolean allshield(Map<String, Object> context) throws Exception {
-        return allmock(context, "force:return null");
-    }
-
-    public boolean alltolerant(Map<String, Object> context) throws Exception {
-        return allmock(context, "fail:return null");
-    }
-
-    public boolean allrecover(Map<String, Object> context) throws Exception {
-        return allmock(context, "");
-    }
-
-    private boolean allmock(Map<String, Object> context, String mock) throws Exception {
-        String service = (String) context.get("service");
-        if (service == null || service.length() == 0) {
-            context.put("message", getMessage("NoSuchOperationData"));
-            return false;
-        }
-        if (!super.currentUser.hasServicePrivilege(service)) {
-            context.put("message", getMessage("HaveNoServicePrivilege", service));
-            return false;
-        }
-        List<Override> overrides = overrideService.findByService(service);
-        Override allOverride = null;
-        if (overrides != null && overrides.size() > 0) {
-            for (Override override : overrides) {
-                if (override.isDefault()) {
-                    allOverride = override;
-                    break;
-                }
-            }
-        }
-        if (allOverride != null) {
-            Map<String, String> map = StringUtils.parseQueryString(allOverride.getParams());
-            if (mock == null || mock.length() == 0) {
-                map.remove("mock");
-            } else {
-                map.put("mock", URL.encode(mock));
-            }
-            if (map.size() > 0) {
-                allOverride.setParams(StringUtils.toQueryString(map));
-                allOverride.setEnabled(true);
-                allOverride.setOperator(operator);
-                allOverride.setOperatorAddress(operatorAddress);
-                overrideService.updateOverride(allOverride);
-            } else {
-                overrideService.deleteOverride(allOverride.getId());
-            }
-        } else if (mock != null && mock.length() > 0) {
-            Override override = new Override();
-            override.setService(service);
-            override.setParams("mock=" + URL.encode(mock));
-            override.setEnabled(true);
-            override.setOperator(operator);
-            override.setOperatorAddress(operatorAddress);
-            overrideService.saveOverride(override);
-        }
-        return true;
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Loadbalances.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Loadbalances.java
deleted file mode 100644
index d9e4736..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Loadbalances.java
+++ /dev/null
@@ -1,131 +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 com.alibaba.dubbo.governance.web.governance.module.screen;
-
-import com.alibaba.dubbo.common.utils.CollectionUtils;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.LoadBalance;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-import com.alibaba.dubbo.registry.common.util.OverrideUtils;
-import com.alibaba.dubbo.registry.common.util.Tool;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Providers.
- * URI: /services/$service/loadbalances
- *
- */
-public class Loadbalances extends Restful {
-
-    @Autowired
-    private OverrideService overrideService;
-
-    @Autowired
-    private ProviderService providerService;
-
-    public void index(Map<String, Object> context) {
-        final String service = StringUtils.trimToNull((String) context.get("service"));
-
-        List<LoadBalance> loadbalances;
-        if (service != null && service.length() > 0) {
-            loadbalances = OverrideUtils.overridesToLoadBalances(overrideService.findByService(service));
-
-            loadbalances = OverrideUtils.overridesToLoadBalances(overrideService.findByService(service));
-        } else {
-            loadbalances = OverrideUtils.overridesToLoadBalances(overrideService.findAll());
-        }
-        context.put("loadbalances", loadbalances);
-    }
-
-    public void show(Long id, Map<String, Object> context) {
-        LoadBalance loadbalance = OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
-        context.put("loadbalance", loadbalance);
-    }
-
-    public void add(Map<String, Object> context) {
-        String service = (String) context.get("service");
-        if (service != null && service.length() > 0 && !service.contains("*")) {
-            List<Provider> providerList = providerService.findByService(service);
-            List<String> addressList = new ArrayList<String>();
-            for (Provider provider : providerList) {
-                addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
-            }
-            context.put("addressList", addressList);
-            context.put("service", service);
-            context.put("methods", CollectionUtils.sort(providerService.findMethodsByService(service)));
-        } else {
-            List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
-            context.put("serviceList", serviceList);
-        }
-        if (context.get("input") != null) context.put("input", context.get("input"));
-    }
-
-    public void edit(Long id, Map<String, Object> context) {
-        add(context);
-        show(id, context);
-    }
-
-    public boolean create(LoadBalance loadBalance, Map<String, Object> context) {
-        if (!super.currentUser.hasServicePrivilege(loadBalance.getService())) {
-            context.put("message", getMessage("HaveNoServicePrivilege", loadBalance.getService()));
-            return false;
-        }
-
-        loadBalance.setUsername((String) context.get("operator"));
-        overrideService.saveOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
-        return true;
-    }
-
-
-    public boolean update(LoadBalance loadBalance, Map<String, Object> context) {
-        if (!super.currentUser.hasServicePrivilege(loadBalance.getService())) {
-            context.put("message", getMessage("HaveNoServicePrivilege", loadBalance.getService()));
-            return false;
-        }
-        overrideService.updateOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
-        return true;
-    }
-
-    /**
-     *
-     * @param ids
-     * @return
-     */
-    public boolean delete(Long[] ids, Map<String, Object> context) {
-        for (Long id : ids) {
-            LoadBalance lb = OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
-            if (!super.currentUser.hasServicePrivilege(lb.getService())) {
-                context.put("message", getMessage("HaveNoServicePrivilege", lb.getService()));
-                return false;
-            }
-        }
-
-        for (Long id : ids) {
-            overrideService.deleteOverride(id);
-        }
-        return true;
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Owners.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Owners.java
deleted file mode 100644
index ee4b4fa..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Owners.java
+++ /dev/null
@@ -1,97 +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 com.alibaba.dubbo.governance.web.governance.module.screen;
-
-import com.alibaba.dubbo.governance.service.OwnerService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Owner;
-import com.alibaba.dubbo.registry.common.util.Tool;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Providers. URI: /services/$service/owners
- *
- */
-public class Owners extends Restful {
-
-    @Autowired
-    private OwnerService ownerService;
-
-    @Autowired
-    private ProviderService providerService;
-
-    public void index(Map<String, Object> context) {
-        String service = (String) context.get("service");
-        List<Owner> owners;
-        if (service != null && service.length() > 0) {
-            owners = ownerService.findByService(service);
-        } else {
-            owners = ownerService.findAll();
-        }
-        context.put("owners", owners);
-    }
-
-    public void add(Map<String, Object> context) {
-        String service = (String) context.get("service");
-        if (service == null || service.length() == 0) {
-            List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
-            context.put("serviceList", serviceList);
-        }
-    }
-
-    public boolean create(Owner owner, Map<String, Object> context) {
-        String service = owner.getService();
-        String username = owner.getUsername();
-        if (service == null || service.length() == 0
-                || username == null || username.length() == 0) {
-            context.put("message", getMessage("NoSuchOperationData"));
-            return false;
-        }
-        if (!super.currentUser.hasServicePrivilege(service)) {
-            context.put("message", getMessage("HaveNoServicePrivilege", service));
-            return false;
-        }
-        ownerService.saveOwner(owner);
-        return true;
-    }
-
-    public boolean delete(Long[] ids, Map<String, Object> context) {
-        String service = (String) context.get("service");
-        String username = (String) context.get("username");
-        Owner owner = new Owner();
-        owner.setService(service);
-        owner.setUsername(username);
-        if (service == null || service.length() == 0
-                || username == null || username.length() == 0) {
-            context.put("message", getMessage("NoSuchOperationData"));
-            return false;
-        }
-        if (!super.currentUser.hasServicePrivilege(service)) {
-            context.put("message", getMessage("HaveNoServicePrivilege", service));
-            return false;
-        }
-        ownerService.deleteOwner(owner);
-        return true;
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Weights.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Weights.java
deleted file mode 100644
index f05b827..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Weights.java
+++ /dev/null
@@ -1,236 +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 com.alibaba.dubbo.governance.web.governance.module.screen;
-
-import com.alibaba.dubbo.common.utils.CollectionUtils;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-import com.alibaba.dubbo.registry.common.domain.Weight;
-import com.alibaba.dubbo.registry.common.util.OverrideUtils;
-import com.alibaba.dubbo.registry.common.util.Tool;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.math.NumberUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.io.BufferedReader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-/**
- * Providers.
- * URI: /services/$service/weights
- *
- */
-public class Weights extends Restful {
-
-    private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3}$");
-    private static final Pattern LOCAL_IP_PATTERN = Pattern.compile("127(\\.\\d{1,3}){3}$");
-    private static final Pattern ALL_IP_PATTERN = Pattern.compile("0{1,3}(\\.0{1,3}){3}$");
-    @Autowired
-    private OverrideService overrideService;
-    @Autowired
-    private ProviderService providerService;
-
-    public void index(Map<String, Object> context) {
-        final String service = StringUtils.trimToNull((String) context.get("service"));
-        String address = (String) context.get("address");
-        address = Tool.getIP(address);
-        List<Weight> weights;
-        if (service != null && service.length() > 0) {
-            weights = OverrideUtils.overridesToWeights(overrideService.findByService(service));
-        } else if (address != null && address.length() > 0) {
-            weights = OverrideUtils.overridesToWeights(overrideService.findByAddress(address));
-        } else {
-            weights = OverrideUtils.overridesToWeights(overrideService.findAll());
-        }
-        context.put("weights", weights);
-    }
-
-    /**
-     * load page for the adding
-     *
-     * @param context
-     */
-    public void add(Map<String, Object> context) {
-        String service = (String) context.get("service");
-        if (service != null && service.length() > 0 && !service.contains("*")) {
-            List<Provider> providerList = providerService.findByService(service);
-            List<String> addressList = new ArrayList<String>();
-            for (Provider provider : providerList) {
-                addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
-            }
-            context.put("addressList", addressList);
-            context.put("service", service);
-            context.put("methods", CollectionUtils.sort(providerService.findMethodsByService(service)));
-        } else {
-            List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
-            context.put("serviceList", serviceList);
-        }
-        if (context.get("input") != null) context.put("input", context.get("input"));
-    }
-
-    /**
-     * load page for the multi adding
-     *
-     * @param context
-     */
-    public void multiadd(Map<String, Object> context) {
-        List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
-        context.put("serviceList", serviceList);
-    }
-
-    public boolean create(Map<String, Object> context) throws Exception {
-        String addr = (String) context.get("address");
-        String services = (String) context.get("multiservice");
-        if (services == null || services.trim().length() == 0) {
-            services = (String) context.get("service");
-        }
-        String weight = (String) context.get("weight");
-
-        int w = Integer.parseInt(weight);
-
-        Set<String> addresses = new HashSet<String>();
-        BufferedReader reader = new BufferedReader(new StringReader(addr));
-        while (true) {
-            String line = reader.readLine();
-            if (null == line)
-                break;
-
-            String[] split = line.split("[\\s,;]+");
-            for (String s : split) {
-                if (s.length() == 0)
-                    continue;
-
-                String ip = s;
-                String port = null;
-                if (s.indexOf(":") != -1) {
-                    ip = s.substring(0, s.indexOf(":"));
-                    port = s.substring(s.indexOf(":") + 1, s.length());
-                    if (port.trim().length() == 0) port = null;
-                }
-                if (!IP_PATTERN.matcher(ip).matches()) {
-                    context.put("message", "illegal IP: " + s);
-                    return false;
-                }
-                if (LOCAL_IP_PATTERN.matcher(ip).matches() || ALL_IP_PATTERN.matcher(ip).matches()) {
-                    context.put("message", "local IP or any host ip is illegal: " + s);
-                    return false;
-                }
-                if (port != null) {
-                    if (!NumberUtils.isDigits(port)) {
-                        context.put("message", "illegal port: " + s);
-                        return false;
-                    }
-                }
-                addresses.add(s);
-            }
-        }
-
-        Set<String> aimServices = new HashSet<String>();
-        reader = new BufferedReader(new StringReader(services));
-        while (true) {
-            String line = reader.readLine();
-            if (null == line)
-                break;
-
-            String[] split = line.split("[\\s,;]+");
-            for (String s : split) {
-                if (s.length() == 0)
-                    continue;
-                if (!super.currentUser.hasServicePrivilege(s)) {
-                    context.put("message", getMessage("HaveNoServicePrivilege", s));
-                    return false;
-                }
-                aimServices.add(s);
-            }
-        }
-
-        for (String aimService : aimServices) {
-            for (String a : addresses) {
-                Weight wt = new Weight();
-                wt.setUsername((String) context.get("operator"));
-                wt.setAddress(Tool.getIP(a));
-                wt.setService(aimService);
-                wt.setWeight(w);
-                overrideService.saveOverride(OverrideUtils.weightToOverride(wt));
-            }
-        }
-        return true;
-    }
-
-    public void edit(Long id, Map<String, Object> context) {
-        add(context);
-        show(id, context);
-        context.put("service", overrideService.findById(id).getService());
-    }
-
-    public void sameSeviceEdit(Long id, Map<String, Object> context) {
-        add(context);
-        show(id, context);
-    }
-
-    /**
-     * load weight for editing
-     *
-     * @param id
-     * @param context
-     */
-    public void show(Long id, Map<String, Object> context) {
-        Weight weight = OverrideUtils.overrideToWeight(overrideService.findById(id));
-        context.put("weight", weight);
-    }
-
-    public boolean update(Weight weight, Map<String, Object> context) {
-        if (!super.currentUser.hasServicePrivilege(weight.getService())) {
-            context.put("message", getMessage("HaveNoServicePrivilege", weight.getService()));
-            return false;
-        }
-        weight.setAddress(Tool.getIP(weight.getAddress()));
-        overrideService.updateOverride(OverrideUtils.weightToOverride(weight));
-        return true;
-    }
-
-    /**
-     * delete
-     *
-     * @param ids
-     * @return
-     */
-    public boolean delete(Long[] ids, Map<String, Object> context) {
-        for (Long id : ids) {
-            Weight w = OverrideUtils.overrideToWeight(overrideService.findById(id));
-            if (!super.currentUser.hasServicePrivilege(w.getService())) {
-                context.put("message", getMessage("HaveNoServicePrivilege", w.getService()));
-                return false;
-            }
-        }
-
-        for (Long id : ids) {
-            overrideService.deleteOverride(id);
-        }
-        return true;
-    }
-
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/control/Menu.java b/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/control/Menu.java
deleted file mode 100644
index c22f48f..0000000
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/control/Menu.java
+++ /dev/null
@@ -1,58 +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 com.alibaba.dubbo.governance.web.home.module.control;
-
-import com.alibaba.citrus.service.requestcontext.parser.CookieParser;
-import com.alibaba.citrus.turbine.Context;
-import com.alibaba.dubbo.governance.sync.RegistryServerSync;
-import com.alibaba.dubbo.governance.web.common.pulltool.RootContextPath;
-import com.alibaba.dubbo.governance.web.util.WebConstants;
-import com.alibaba.dubbo.registry.common.domain.User;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-public class Menu {
-
-    @Autowired
-    ServletContext servletcontext;
-    @Autowired
-    RegistryServerSync registryServerSync;
-    @Autowired
-    private HttpServletRequest request;
-
-    public void execute(HttpSession session, Context context, CookieParser parser) {
-
-        User user = (User) session.getAttribute(WebConstants.CURRENT_USER_KEY);
-        if (user != null) context.put("operator", user.getUsername());
-
-        RootContextPath rootContextPath = new RootContextPath(request.getContextPath());
-        context.put("rootContextPath", rootContextPath);
-        if (!context.containsKey("bucLogoutAddress")) {
-            context.put("bucLogoutAddress", rootContextPath.getURI("logout"));
-        }
-        if (!context.containsKey("helpUrl")) {
-            context.put("helpUrl", "http://code.alibabatech.com/wiki/display/dubbo");
-        }
-        context.put(WebConstants.CURRENT_USER_KEY, user);
-        context.put("language", parser.getString("locale"));
-        context.put("registryServerSync", registryServerSync);
-    }
-}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/module/screen/Error_other.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/DubboAdminApplication.java
similarity index 64%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/module/screen/Error_other.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/DubboAdminApplication.java
index ee7c087..58ba7c3 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/module/screen/Error_other.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/DubboAdminApplication.java
@@ -14,17 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.common.module.screen;
 
-import com.alibaba.dubbo.governance.web.common.pulltool.RootContextPath;
+package com.alibaba.dubboadmin;
 
-import java.util.Map;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ApplicationContext;
 
-public class Error_other {
+@SpringBootApplication
+public class DubboAdminApplication {
 
-    public void execute(Map<String, Object> context) throws Throwable {
-        String contextPath = (String) context.get("request.contextPath");
-        context.put("rootContextPath", new RootContextPath(contextPath));
-    }
+	public static void main(String[] args) {
+		ApplicationContext act = SpringApplication.run(DubboAdminApplication.class, args);
+		SpringUtil.setApplicationContext(act);
 
+
+	}
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubboadmin/SpringUtil.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/SpringUtil.java
new file mode 100644
index 0000000..c390c09
--- /dev/null
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/SpringUtil.java
@@ -0,0 +1,60 @@
+/*
+ * 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 com.alibaba.dubboadmin;
+
+
+import com.alibaba.dubbo.common.logger.Logger;
+import com.alibaba.dubbo.common.logger.LoggerFactory;
+
+import org.springframework.context.ApplicationContext;
+
+public class SpringUtil {
+
+    public static final Logger logger = LoggerFactory.getLogger(SpringUtil.class);
+    private static ApplicationContext applicationContext = null;
+
+    public static void setApplicationContext(ApplicationContext applicationContext){
+        if(SpringUtil.applicationContext == null){
+            logger.info("set applicationcontext");
+            SpringUtil.applicationContext  = applicationContext;
+        }
+
+    }
+
+    //获取applicationContext
+    public static ApplicationContext getApplicationContext() {
+        return applicationContext;
+    }
+
+    //通过name获取 Bean.
+    public static Object getBean(String name){
+        return getApplicationContext().getBean(name);
+
+    }
+
+    //通过class获取Bean.
+    public static <T> T getBean(Class<T> clazz){
+        return getApplicationContext().getBean(clazz);
+    }
+
+    //通过name,以及Clazz返回指定的Bean
+    public static <T> T getBean(String name,Class<T> clazz){
+        return getApplicationContext().getBean(name, clazz);
+    }
+
+}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubboadmin/config/I18nConfig.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/config/I18nConfig.java
new file mode 100644
index 0000000..669949d
--- /dev/null
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/config/I18nConfig.java
@@ -0,0 +1,58 @@
+/*
+ * 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 com.alibaba.dubboadmin.config;
+
+import java.util.Locale;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.LocaleResolver;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
+import org.springframework.web.servlet.i18n.SessionLocaleResolver;
+
+
+@Configuration
+@EnableAutoConfiguration
+@ComponentScan
+//@ImportResource({"classpath*:dubbo-admin.xml"})
+public class I18nConfig implements WebMvcConfigurer {
+
+    @Bean
+    public LocaleResolver localeResolver() {
+        SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
+        sessionLocaleResolver.setDefaultLocale(Locale.CHINA);
+        return sessionLocaleResolver;
+
+    }
+
+    @Bean
+    public LocaleChangeInterceptor localeChangeInterceptor() {
+        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
+        lci.setParamName("lang");
+        return lci;
+    }
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(localeChangeInterceptor());
+    }
+}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubboadmin/config/XmlConfiguration.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/config/XmlConfiguration.java
new file mode 100644
index 0000000..9c94a83
--- /dev/null
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/config/XmlConfiguration.java
@@ -0,0 +1,28 @@
+/*
+ * 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 com.alibaba.dubboadmin.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.ImportResource;
+
+
+@Configuration
+@ImportResource({"classpath*:dubbo-admin.xml"})
+public class XmlConfiguration {
+
+}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/AuthorizationValve.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/filter/LoginFilter.java
similarity index 64%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/AuthorizationValve.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/filter/LoginFilter.java
index c7dce13..fe6c3aa 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/interceptor/AuthorizationValve.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/filter/LoginFilter.java
@@ -14,23 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.common.interceptor;
 
-import com.alibaba.citrus.service.pipeline.PipelineContext;
-import com.alibaba.citrus.service.pipeline.support.AbstractValve;
-import com.alibaba.dubbo.common.logger.Logger;
-import com.alibaba.dubbo.common.logger.LoggerFactory;
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.UserService;
-import com.alibaba.dubbo.governance.web.util.WebConstants;
-import com.alibaba.dubbo.registry.common.domain.User;
-import com.alibaba.dubbo.registry.common.util.Coder;
+package com.alibaba.dubboadmin.filter;
 
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
@@ -39,18 +25,37 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class AuthorizationValve extends AbstractValve {
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.logger.Logger;
+import com.alibaba.dubbo.common.logger.LoggerFactory;
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.UserService;
+import com.alibaba.dubboadmin.governance.util.WebConstants;
+import com.alibaba.dubboadmin.registry.common.domain.User;
+import com.alibaba.dubboadmin.registry.common.util.Coder;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
-    private static final Logger logger = LoggerFactory.getLogger(AuthorizationValve.class);
+@Component
+public class LoginFilter implements Filter{
+
+    private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);
+    private static Pattern PARAMETER_PATTERN = Pattern.compile("(\\w+)=[\"]?([^,\"]+)[\"]?[,]?\\s*");
     private static final String BASIC_CHALLENGE = "Basic";
     private static final String DIGEST_CHALLENGE = "Digest";
     private static final String CHALLENGE = BASIC_CHALLENGE;
     private static final String REALM = User.REALM;
-    private static Pattern PARAMETER_PATTERN = Pattern.compile("(\\w+)=[\"]?([^,\"]+)[\"]?[,]?\\s*");
-    @Autowired
-    private HttpServletRequest request;
-    @Autowired
-    private HttpServletResponse response;
+
     @Autowired
     private UserService userService;
     private String logout = "/logout";
@@ -74,67 +79,71 @@
     }
 
     @Override
-    protected void init() throws Exception {
+    public void init(FilterConfig filterConfig) throws ServletException {
+
     }
 
-    public void invoke(PipelineContext pipelineContext) throws Exception {
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+        throws IOException, ServletException {
+
+        HttpServletRequest req = (HttpServletRequest)request;
+        HttpServletResponse resp = (HttpServletResponse) response;
         if (logger.isInfoEnabled()) {
-            logger.info("AuthorizationValve of uri: " + request.getRequestURI());
+            logger.info("AuthorizationValve of uri: " + req.getRequestURI());
         }
-        String uri = request.getRequestURI();
-        String contextPath = request.getContextPath();
+        String uri = req.getRequestURI();
+        String contextPath = req.getContextPath();
         if (contextPath != null && contextPath.length() > 0 && !"/".equals(contextPath)) {
             uri = uri.substring(contextPath.length());
         }
         if (uri.equals(logout)) {
-            if (!isLogout()) {
-                setLogout(true);
-                showLoginForm();
+            if (!isLogout(req)) {
+                setLogout(true, resp);
+                showLoginForm(resp);
             } else {
-                setLogout(false);
-                response.sendRedirect(contextPath == null || contextPath.length() == 0 ? "/" : contextPath);
+                setLogout(false, resp);
+                resp.sendRedirect(contextPath == null || contextPath.length() == 0 ? "/" : contextPath);
             }
             return;
         }
-        //FIXME
-        if (!uri.startsWith("/status/")) {
-            User user = null;
-            String authType = null;
-            String authorization = request.getHeader("Authorization");
-            if (authorization != null && authorization.length() > 0) {
-                int i = authorization.indexOf(' ');
-                if (i >= 0) {
-                    authType = authorization.substring(0, i);
-                    String authPrincipal = authorization.substring(i + 1);
-                    if (BASIC_CHALLENGE.equalsIgnoreCase(authType)) {
-                        user = loginByBase(authPrincipal);
-                    } else if (DIGEST_CHALLENGE.equalsIgnoreCase(authType)) {
-                        user = loginByDigest(authPrincipal);
-                    }
+        User user = null;
+        String authType = null;
+        String authorization = req.getHeader("Authorization");
+        if (authorization != null && authorization.length() > 0) {
+            int i = authorization.indexOf(' ');
+            if (i >= 0) {
+                authType = authorization.substring(0, i);
+                String authPrincipal = authorization.substring(i + 1);
+                if (BASIC_CHALLENGE.equalsIgnoreCase(authType)) {
+                    user = loginByBase(authPrincipal);
+                } else if (DIGEST_CHALLENGE.equalsIgnoreCase(authType)) {
+                    user = loginByDigest(authPrincipal, req);
                 }
             }
-            if (user == null || user.getUsername() == null || user.getUsername().length() == 0) {
-                showLoginForm();
-                pipelineContext.breakPipeline(1);
-            }
-            if (user != null && StringUtils.isNotEmpty(user.getUsername())) {
-                request.getSession().setAttribute(WebConstants.CURRENT_USER_KEY, user);
-                pipelineContext.invokeNext();
-            }
-        } else {
-            pipelineContext.invokeNext();
         }
+        if (user == null || user.getUsername() == null || user.getUsername().length() == 0) {
+            showLoginForm(resp);
+            return;
+            //pipelineContext.breakPipeline(1);
+        }
+        if (user != null && StringUtils.isNotEmpty(user.getUsername())) {
+            req.getSession().setAttribute(WebConstants.CURRENT_USER_KEY, user);
+            chain.doFilter(request, response);
+        }
+
     }
 
-    private User getUser(String username) {
-        return userService.findUser(username);
+    @Override
+    public void destroy() {
+
     }
 
-    private void showLoginForm() throws IOException {
+    private void showLoginForm(HttpServletResponse response) throws IOException {
         if (DIGEST_CHALLENGE.equals(CHALLENGE)) {
             response.setHeader("WWW-Authenticate", CHALLENGE + " realm=\"" + REALM + "\", qop=\"auth\", nonce=\""
-                    + UUID.randomUUID().toString().replace("-", "") + "\", opaque=\""
-                    + Coder.encodeMd5(REALM) + "\"");
+                + UUID.randomUUID().toString().replace("-", "") + "\", opaque=\""
+                + Coder.encodeMd5(REALM) + "\"");
         } else {
             response.setHeader("WWW-Authenticate", CHALLENGE + " realm=\"" + REALM + "\"");
         }
@@ -143,6 +152,10 @@ private void showLoginForm() throws IOException {
         response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
     }
 
+    private User getUser(String username) {
+        return userService.findUser(username);
+    }
+
     private User loginByBase(String authorization) {
         authorization = Coder.decodeBase64(authorization);
         int i = authorization.indexOf(':');
@@ -165,7 +178,7 @@ private User loginByBase(String authorization) {
         return null;
     }
 
-    private User loginByDigest(String value) throws IOException {
+    private User loginByDigest(String value, HttpServletRequest request) throws IOException {
         Map<String, String> params = parseParameters(value);
         String username = params.get("username");
         if (username != null && username.length() > 0) {
@@ -185,11 +198,11 @@ private User loginByDigest(String value) throws IOException {
                         String a1 = pwd;
 
                         String a2 = "auth-int".equals(qop)
-                                ? Coder.encodeMd5(method + ":" + uri + ":" + Coder.encodeMd5(readToBytes(request.getInputStream())))
-                                : Coder.encodeMd5(method + ":" + uri);
+                            ? Coder.encodeMd5(method + ":" + uri + ":" + Coder.encodeMd5(readToBytes(request.getInputStream())))
+                            : Coder.encodeMd5(method + ":" + uri);
                         String digest = "auth".equals(qop) || "auth-int".equals(qop)
-                                ? Coder.encodeMd5(a1 + ":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + a2)
-                                : Coder.encodeMd5(a1 + ":" + nonce + ":" + a2);
+                            ? Coder.encodeMd5(a1 + ":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + a2)
+                            : Coder.encodeMd5(a1 + ":" + nonce + ":" + a2);
                         if (digest.equals(passwordDigest)) {
                             return user;
                         }
@@ -200,7 +213,7 @@ private User loginByDigest(String value) throws IOException {
         return null;
     }
 
-    private boolean isLogout() {
+    private boolean isLogout(HttpServletRequest request) {
         Cookie[] cookies = request.getCookies();
         if (cookies != null && cookies.length > 0) {
             for (Cookie cookie : cookies) {
@@ -212,7 +225,8 @@ private boolean isLogout() {
         return false;
     }
 
-    private void setLogout(boolean logoutValue) {
+    private void setLogout(boolean logoutValue, HttpServletResponse response) {
         response.addCookie(new Cookie(logoutCookie, String.valueOf(logoutValue)));
     }
 }
+
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/biz/common/i18n/MessageResourceService.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/biz/common/i18n/MessageResourceService.java
similarity index 94%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/biz/common/i18n/MessageResourceService.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/biz/common/i18n/MessageResourceService.java
index bb4c6f1..e70c5ce 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/biz/common/i18n/MessageResourceService.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/biz/common/i18n/MessageResourceService.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.biz.common.i18n;
+package com.alibaba.dubboadmin.governance.biz.common.i18n;
 
 public interface MessageResourceService {
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/biz/common/i18n/impl/MessageResourceServiceImpl.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/biz/common/i18n/impl/MessageResourceServiceImpl.java
similarity index 85%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/biz/common/i18n/impl/MessageResourceServiceImpl.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/biz/common/i18n/impl/MessageResourceServiceImpl.java
index 5016821..c0b47b8 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/biz/common/i18n/impl/MessageResourceServiceImpl.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/biz/common/i18n/impl/MessageResourceServiceImpl.java
@@ -14,15 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.biz.common.i18n.impl;
+package com.alibaba.dubboadmin.governance.biz.common.i18n.impl;
 
-import com.alibaba.dubbo.governance.biz.common.i18n.MessageResourceService;
-import com.alibaba.dubbo.governance.web.common.i18n.LocaleUtil;
+
+import com.alibaba.dubboadmin.governance.biz.common.i18n.MessageResourceService;
+import com.alibaba.dubboadmin.web.mvc.common.i18n.LocaleUtil;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.MessageSource;
 import org.springframework.context.NoSuchMessageException;
+import org.springframework.stereotype.Component;
 
+@Component
 public class MessageResourceServiceImpl implements MessageResourceService {
 
     @Autowired
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/ConfigService.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/ConfigService.java
similarity index 90%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/ConfigService.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/ConfigService.java
index b6e1931..a3a0ee8 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/ConfigService.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/ConfigService.java
@@ -14,13 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service;
-
-import com.alibaba.dubbo.registry.common.domain.Config;
+package com.alibaba.dubboadmin.governance.service;
 
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubboadmin.registry.common.domain.Config;
+
 /**
  * TODO Comment of ConfigDAO
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/ConsumerService.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/ConsumerService.java
similarity index 93%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/ConsumerService.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/ConsumerService.java
index e8c4da7..e980eeb 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/ConsumerService.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/ConsumerService.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service;
-
-import com.alibaba.dubbo.registry.common.domain.Consumer;
+package com.alibaba.dubboadmin.governance.service;
 
 import java.util.List;
 
+import com.alibaba.dubboadmin.registry.common.domain.Consumer;
+
 /**
  * Query service for consumer info
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/OverrideService.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/OverrideService.java
similarity index 92%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/OverrideService.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/OverrideService.java
index 371b523..afa2a67 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/OverrideService.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/OverrideService.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service;
-
-import com.alibaba.dubbo.registry.common.domain.Override;
+package com.alibaba.dubboadmin.governance.service;
 
 import java.util.List;
 
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+
 public interface OverrideService {
 
     void saveOverride(Override override);
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/OwnerService.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/OwnerService.java
similarity index 91%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/OwnerService.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/OwnerService.java
index 2d47232..367125a 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/OwnerService.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/OwnerService.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service;
-
-import com.alibaba.dubbo.registry.common.domain.Owner;
+package com.alibaba.dubboadmin.governance.service;
 
 import java.util.List;
 
+import com.alibaba.dubboadmin.registry.common.domain.Owner;
+
 public interface OwnerService {
 
     List<String> findAllServiceNames();
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/ProviderService.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/ProviderService.java
similarity index 94%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/ProviderService.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/ProviderService.java
index 4b4a8c7..15ba776 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/ProviderService.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/ProviderService.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service;
-
-import com.alibaba.dubbo.registry.common.domain.Provider;
+package com.alibaba.dubboadmin.governance.service;
 
 import java.util.List;
 
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+
 /**
  * ProviderService
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/RouteService.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/RouteService.java
similarity index 93%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/RouteService.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/RouteService.java
index d6233e6..236d881 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/RouteService.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/RouteService.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service;
-
-import com.alibaba.dubbo.registry.common.domain.Route;
+package com.alibaba.dubboadmin.governance.service;
 
 import java.util.List;
 
+import com.alibaba.dubboadmin.registry.common.domain.Route;
+
 /**
  * RouteService
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/UserService.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/UserService.java
similarity index 92%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/UserService.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/UserService.java
index a4e66cc..1869859 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/UserService.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/UserService.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service;
-
-import com.alibaba.dubbo.registry.common.domain.User;
+package com.alibaba.dubboadmin.governance.service;
 
 import java.util.List;
 
+import com.alibaba.dubboadmin.registry.common.domain.User;
+
 /**
  * UserService
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/AbstractService.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/AbstractService.java
similarity index 92%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/AbstractService.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/AbstractService.java
index e7b037f..3c01d63 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/AbstractService.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/AbstractService.java
@@ -14,19 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service.impl;
+package com.alibaba.dubboadmin.governance.service.impl;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
 
 import com.alibaba.dubbo.common.URL;
 import com.alibaba.dubbo.common.logger.Logger;
 import com.alibaba.dubbo.common.logger.LoggerFactory;
-import com.alibaba.dubbo.governance.sync.RegistryServerSync;
 import com.alibaba.dubbo.registry.RegistryService;
+import com.alibaba.dubboadmin.governance.sync.RegistryServerSync;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
-import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
-
 /**
  * IbatisDAO
  *
@@ -43,5 +43,4 @@
         return sync.getRegistryCache();
     }
 
-
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/ConfigServiceImpl.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/ConfigServiceImpl.java
similarity index 88%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/ConfigServiceImpl.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/ConfigServiceImpl.java
index d31c5f5..7921ac6 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/ConfigServiceImpl.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/ConfigServiceImpl.java
@@ -14,14 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service.impl;
-
-import com.alibaba.dubbo.governance.service.ConfigService;
-import com.alibaba.dubbo.registry.common.domain.Config;
+package com.alibaba.dubboadmin.governance.service.impl;
 
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubboadmin.governance.service.ConfigService;
+import com.alibaba.dubboadmin.registry.common.domain.Config;
+
 /**
  * TODO Comment of IbatisConfigDAO
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/ConsumerServiceImpl.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/ConsumerServiceImpl.java
similarity index 95%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/ConsumerServiceImpl.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/ConsumerServiceImpl.java
index 061df39..bf7c3da 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/ConsumerServiceImpl.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/ConsumerServiceImpl.java
@@ -14,14 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service.impl;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.governance.service.ConsumerService;
-import com.alibaba.dubbo.governance.sync.util.Pair;
-import com.alibaba.dubbo.governance.sync.util.SyncUtils;
-import com.alibaba.dubbo.registry.common.domain.Consumer;
+package com.alibaba.dubboadmin.governance.service.impl;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -29,6 +22,16 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentMap;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
+import com.alibaba.dubboadmin.governance.sync.util.Pair;
+import com.alibaba.dubboadmin.governance.sync.util.SyncUtils;
+import com.alibaba.dubboadmin.registry.common.domain.Consumer;
+
+import org.springframework.stereotype.Component;
+
+@Component
 public class ConsumerServiceImpl extends AbstractService implements ConsumerService {
 
     public List<Consumer> findByService(String service) {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/OverrideServiceImpl.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/OverrideServiceImpl.java
similarity index 94%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/OverrideServiceImpl.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/OverrideServiceImpl.java
index 5a0a02b..151bbac 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/OverrideServiceImpl.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/OverrideServiceImpl.java
@@ -14,23 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service.impl;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.sync.util.Pair;
-import com.alibaba.dubbo.governance.sync.util.SyncUtils;
-import com.alibaba.dubbo.registry.common.domain.Override;
+package com.alibaba.dubboadmin.governance.service.impl;
 
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubboadmin.governance.service.OverrideService;
+import com.alibaba.dubboadmin.governance.sync.util.Pair;
+import com.alibaba.dubboadmin.governance.sync.util.SyncUtils;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+
+import org.springframework.stereotype.Component;
+
 /**
  * IbatisOverrideDAO.java
  *
  */
+@Component
 public class OverrideServiceImpl extends AbstractService implements OverrideService {
 
     public void saveOverride(Override override) {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/OwnerServiceImpl.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/OwnerServiceImpl.java
similarity index 92%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/OwnerServiceImpl.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/OwnerServiceImpl.java
index 6819d0a..4fa2613 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/OwnerServiceImpl.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/OwnerServiceImpl.java
@@ -14,24 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service.impl;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.service.OwnerService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.registry.common.domain.Override;
-import com.alibaba.dubbo.registry.common.domain.Owner;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
+package com.alibaba.dubboadmin.governance.service.impl;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.OverrideService;
+import com.alibaba.dubboadmin.governance.service.OwnerService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.registry.common.domain.Owner;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
 public class OwnerServiceImpl extends AbstractService implements OwnerService {
 
     @Autowired
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/ProviderServiceImpl.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/ProviderServiceImpl.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/ProviderServiceImpl.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/ProviderServiceImpl.java
index b088143..8ee59e1 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/ProviderServiceImpl.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/ProviderServiceImpl.java
@@ -14,20 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service.impl;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.sync.util.Pair;
-import com.alibaba.dubbo.governance.sync.util.SyncUtils;
-import com.alibaba.dubbo.registry.common.domain.Override;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-import com.alibaba.dubbo.registry.common.route.ParseUtils;
-
-import org.springframework.beans.factory.annotation.Autowired;
+package com.alibaba.dubboadmin.governance.service.impl;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -36,10 +23,25 @@
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentMap;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.OverrideService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.governance.sync.util.Pair;
+import com.alibaba.dubboadmin.governance.sync.util.SyncUtils;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.registry.common.route.ParseUtils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
 /**
  * IbatisProviderService
  *
  */
+@Component
 public class ProviderServiceImpl extends AbstractService implements ProviderService {
 
     @Autowired
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/RouteServiceImpl.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/RouteServiceImpl.java
similarity index 93%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/RouteServiceImpl.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/RouteServiceImpl.java
index 6b87cea..f618e90 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/RouteServiceImpl.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/RouteServiceImpl.java
@@ -14,23 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service.impl;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.governance.service.RouteService;
-import com.alibaba.dubbo.governance.sync.util.Pair;
-import com.alibaba.dubbo.governance.sync.util.SyncUtils;
-import com.alibaba.dubbo.registry.common.domain.Route;
+package com.alibaba.dubboadmin.governance.service.impl;
 
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubboadmin.governance.service.RouteService;
+import com.alibaba.dubboadmin.governance.sync.util.Pair;
+import com.alibaba.dubboadmin.governance.sync.util.SyncUtils;
+import com.alibaba.dubboadmin.registry.common.domain.Route;
+
+import org.springframework.stereotype.Component;
+
 /**
  * IbatisRouteService
  *
  */
+@Component
 public class RouteServiceImpl extends AbstractService implements RouteService {
 
     public void createRoute(Route route) {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/UserServiceImpl.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/UserServiceImpl.java
similarity index 88%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/UserServiceImpl.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/UserServiceImpl.java
index d4bf062..b100bad 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/service/impl/UserServiceImpl.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/service/impl/UserServiceImpl.java
@@ -14,22 +14,28 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.service.impl;
-
-import com.alibaba.dubbo.governance.service.UserService;
-import com.alibaba.dubbo.registry.common.domain.User;
-import com.alibaba.dubbo.registry.common.util.Coder;
+package com.alibaba.dubboadmin.governance.service.impl;
 
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubboadmin.governance.service.UserService;
+import com.alibaba.dubboadmin.registry.common.domain.User;
+import com.alibaba.dubboadmin.registry.common.util.Coder;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
 /**
  * IBatisUserService
  *
  */
+@Component
 public class UserServiceImpl extends AbstractService implements UserService {
 
+    @Value("${spring.root.password}")
     private String rootPassword;
+    @Value("${spring.guest.password}")
     private String guestPassword;
 
     public void setRootPassword(String password) {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/sync/RegistryServerSync.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/sync/RegistryServerSync.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/sync/RegistryServerSync.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/sync/RegistryServerSync.java
index 29603e9..40d2ea2 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/sync/RegistryServerSync.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/sync/RegistryServerSync.java
@@ -14,7 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.sync;
+package com.alibaba.dubboadmin.governance.sync;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicLong;
 
 import com.alibaba.dubbo.common.Constants;
 import com.alibaba.dubbo.common.URL;
@@ -22,23 +31,16 @@
 import com.alibaba.dubbo.common.logger.LoggerFactory;
 import com.alibaba.dubbo.common.utils.NetUtils;
 import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.web.common.pulltool.Tool;
 import com.alibaba.dubbo.registry.NotifyListener;
 import com.alibaba.dubbo.registry.RegistryService;
+import com.alibaba.dubboadmin.web.pulltool.Tool;
 
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.AtomicLong;
-
+@Component
 public class RegistryServerSync implements InitializingBean, DisposableBean, NotifyListener {
 
     private static final Logger logger = LoggerFactory.getLogger(RegistryServerSync.class);
@@ -63,7 +65,8 @@
     private final ConcurrentHashMap<String, Long> URL_IDS_MAPPER = new ConcurrentHashMap<String, Long>();
 
     // ConcurrentMap<category, ConcurrentMap<servicename, Map<Long, URL>>>
-    private final ConcurrentMap<String, ConcurrentMap<String, Map<Long, URL>>> registryCache = new ConcurrentHashMap<String, ConcurrentMap<String, Map<Long, URL>>>();
+    private final ConcurrentMap<String, ConcurrentMap<String, Map<Long, URL>>>
+        registryCache = new ConcurrentHashMap<String, ConcurrentMap<String, Map<Long, URL>>>();
     @Autowired
     private RegistryService registryService;
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/sync/util/Pair.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/sync/util/Pair.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/sync/util/Pair.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/sync/util/Pair.java
index 6aa929b..0fbed83 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/sync/util/Pair.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/sync/util/Pair.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.sync.util;
+package com.alibaba.dubboadmin.governance.sync.util;
 
 import java.util.Map;
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/sync/util/SyncUtils.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/sync/util/SyncUtils.java
similarity index 92%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/sync/util/SyncUtils.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/sync/util/SyncUtils.java
index 5bbda57..96e94a3 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/sync/util/SyncUtils.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/sync/util/SyncUtils.java
@@ -14,20 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.sync.util;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.registry.common.domain.Consumer;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-import com.alibaba.dubbo.registry.common.domain.Route;
+package com.alibaba.dubboadmin.governance.sync.util;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.registry.common.domain.Consumer;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.registry.common.domain.Route;
+
 public class SyncUtils {
 
     public static final String SERVICE_FILTER_KEY = ".service";
@@ -132,7 +133,7 @@ public static Route url2Route(Pair<Long, URL> pair) {
         return list;
     }
 
-    public static com.alibaba.dubbo.registry.common.domain.Override url2Override(Pair<Long, URL> pair) {
+    public static Override url2Override(Pair<Long, URL> pair) {
         if (pair == null) {
             return null;
         }
@@ -143,7 +144,7 @@ public static Route url2Route(Pair<Long, URL> pair) {
         if (null == url)
             return null;
 
-        com.alibaba.dubbo.registry.common.domain.Override o = new com.alibaba.dubbo.registry.common.domain.Override();
+        Override o = new Override();
         o.setId(id);
 
         Map<String, String> parameters = new HashMap<String, String>(url.getParameters());
@@ -182,8 +183,9 @@ public static Route url2Route(Pair<Long, URL> pair) {
         return filterFromService(urls.get(c), filter);
     }
 
-    public static List<com.alibaba.dubbo.registry.common.domain.Override> url2OverrideList(Map<Long, URL> cs) {
-        List<com.alibaba.dubbo.registry.common.domain.Override> list = new ArrayList<com.alibaba.dubbo.registry.common.domain.Override>();
+    public static List<Override> url2OverrideList(Map<Long, URL> cs) {
+        List<Override>
+            list = new ArrayList<Override>();
         if (cs == null) return list;
         for (Map.Entry<Long, URL> entry : cs.entrySet()) {
             list.add(url2Override(new Pair<Long, URL>(entry.getKey(), entry.getValue())));
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/ContextUtil.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/ContextUtil.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/ContextUtil.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/ContextUtil.java
index 07e9894..d4e6838 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/ContextUtil.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/ContextUtil.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.util;
+package com.alibaba.dubboadmin.governance.util;
 
 import java.util.Map;
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/GovernanceWarmup.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/GovernanceWarmup.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/GovernanceWarmup.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/GovernanceWarmup.java
index 09ad800..e23c86a 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/GovernanceWarmup.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/GovernanceWarmup.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.util;
+package com.alibaba.dubboadmin.governance.util;
 
 import com.alibaba.dubbo.common.logger.Logger;
 import com.alibaba.dubbo.common.logger.LoggerFactory;
 import com.alibaba.dubbo.common.status.StatusChecker;
-import com.alibaba.dubbo.registry.common.StatusManager;
+import com.alibaba.dubboadmin.registry.common.StatusManager;
 
 import org.springframework.beans.factory.InitializingBean;
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/Paginator.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/Paginator.java
similarity index 99%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/Paginator.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/Paginator.java
index 5e8cd58..4ec1152 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/Paginator.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/Paginator.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.util;
+package com.alibaba.dubboadmin.governance.util;
 
 import java.io.Serializable;
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/UrlUtils.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/UrlUtils.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/UrlUtils.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/UrlUtils.java
index bed766f..15fa653 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/UrlUtils.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/UrlUtils.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.util;
+package com.alibaba.dubboadmin.governance.util;
 
 import java.util.Map;
 import java.util.Map.Entry;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/WebConstants.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/WebConstants.java
similarity index 67%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/WebConstants.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/WebConstants.java
index 5122931..9d6cc3f 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/util/WebConstants.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/governance/util/WebConstants.java
@@ -14,8 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.util;
+package com.alibaba.dubboadmin.governance.util;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -56,6 +57,29 @@
      * Operation record page The default page record shows the number of records
      */
     public static final Integer OPRATION_RECORDS_PAGE_SIZE = 100;
+
+    /**
+     * Help Url
+     */
+    public static final String HELP_URL="https://github.com/apache/incubator-dubbo-ops";
     Map<String, Object> context;
 
+    public static final Map<String, String> mapper = new HashMap<>();
+
+    static {
+        mapper.put("providers", "providersController");
+        mapper.put("consumers", "consumersController");
+        mapper.put("applications", "applicationsController");
+        mapper.put("routes", "routesController");
+        mapper.put("overrides", "overridesController");
+        mapper.put("accesses", "accessesController");
+        mapper.put("loadbalances", "loadbalancesController");
+        mapper.put("owners", "ownersController");
+        mapper.put("weights", "weightsController");
+        mapper.put("addresses", "addressesController");
+        mapper.put("services", "servicesController");
+    }
+
+
+
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/ChangeListener.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/ChangeListener.java
similarity index 95%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/ChangeListener.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/ChangeListener.java
index 4354f54..d74361c 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/ChangeListener.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/ChangeListener.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common;
+package com.alibaba.dubboadmin.registry.common;
 
 public interface ChangeListener {
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/StatusManager.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/StatusManager.java
similarity index 98%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/StatusManager.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/StatusManager.java
index 1e57dcb..5120bae 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/StatusManager.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/StatusManager.java
@@ -14,17 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common;
-
-import com.alibaba.dubbo.common.status.Status;
-import com.alibaba.dubbo.common.status.Status.Level;
-import com.alibaba.dubbo.common.status.StatusChecker;
+package com.alibaba.dubboadmin.registry.common;
 
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import com.alibaba.dubbo.common.status.Status;
+import com.alibaba.dubbo.common.status.Status.Level;
+import com.alibaba.dubbo.common.status.StatusChecker;
+
 /**
  * StatusManager
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Access.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Access.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Access.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Access.java
index bc8ade7..28baf26 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Access.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Access.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 public class Access extends Entity {
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Agreement.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Agreement.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Agreement.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Agreement.java
index 038170f..8a55871 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Agreement.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Agreement.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 /**
  * Specifies the applied Quality of Service Level Agreement (SLA) object.
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Approval.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Approval.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Approval.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Approval.java
index 046a8a4..921381c 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Approval.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Approval.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 /**
  * Service online approval.
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/ApprovalRequisition.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/ApprovalRequisition.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/ApprovalRequisition.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/ApprovalRequisition.java
index 9f215cf..d28ef0a 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/ApprovalRequisition.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/ApprovalRequisition.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 /**
  * Service online / offline approval
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Change.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Change.java
similarity index 98%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Change.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Change.java
index 697caac..6859de7 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Change.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Change.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 /**
  * Service change information object
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Cluster.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Cluster.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Cluster.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Cluster.java
index 155eee8..15124e3 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Cluster.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Cluster.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 public class Cluster extends Entity {
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Config.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Config.java
similarity index 98%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Config.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Config.java
index c3d73e7..72bfd40 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Config.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Config.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 /**
  * Config instance
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Consumer.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Consumer.java
similarity index 99%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Consumer.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Consumer.java
index 8d3527e..c02f802 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Consumer.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Consumer.java
@@ -14,16 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.common.utils.StringUtils;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubbo.common.utils.StringUtils;
+
 /**
  * Consumer
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/DependItem.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/DependItem.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/DependItem.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/DependItem.java
index 36c94be..0a0524b 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/DependItem.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/DependItem.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Dependency.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Dependency.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Dependency.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Dependency.java
index 70bab8f..46f1032 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Dependency.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Dependency.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 import java.io.Serializable;
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Document.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Document.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Document.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Document.java
index 74b5f2e..95b8f9b 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Document.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Document.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 /**
  * Document
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Entity.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Entity.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Entity.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Entity.java
index 1652776..54531f7 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Entity.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Entity.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 import java.io.Serializable;
 import java.util.Date;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Favorite.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Favorite.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Favorite.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Favorite.java
index 997a1c9..bc65057 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Favorite.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Favorite.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 public class Favorite extends Entity {
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Feature.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Feature.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Feature.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Feature.java
index f8486d1..f751ff5 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Feature.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Feature.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 /**
  * System features
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Layer.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Layer.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Layer.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Layer.java
index f55000b..0ad3acf 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Layer.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Layer.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 public class Layer extends Entity {
     private static final long serialVersionUID = 6114868933223039253L;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/LoadBalance.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/LoadBalance.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/LoadBalance.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/LoadBalance.java
index ae448e8..651b8ca 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/LoadBalance.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/LoadBalance.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 /**
  * LoadBalance
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Mock.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Mock.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Mock.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Mock.java
index 1acde0f..1d88db7 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Mock.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Mock.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 /**
  * Mock
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Operation.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Operation.java
similarity index 94%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Operation.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Operation.java
index b8c8f2d..6043242 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Operation.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Operation.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -43,7 +43,8 @@
     public static final String LAYER_TYPE = "Layer";
     public static final String CONFIG_TYPE = "Config";
     public static final List<String> TYPES =
-            Collections.unmodifiableList(Arrays.asList(new String[]{PROVIDER_TYPE, CONSUMER_TYPE, ROUTE_TYPE, WEIGHT_TYPE,
+            Collections.unmodifiableList(
+                Arrays.asList(new String[]{PROVIDER_TYPE, CONSUMER_TYPE, ROUTE_TYPE, WEIGHT_TYPE,
                     CLUSTER_TYPE, DOCUMENT_TYPE, LOADBALANCE_TYPE, TEST_TYPE,
                     AGREEMENT_TYPE, USER_TYPE, FEATURE_TYPE, CONFIG_TYPE}));
     private static final long serialVersionUID = 8220325876753890396L;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Override.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Override.java
similarity index 99%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Override.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Override.java
index 7955319..eeedd20 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Override.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Override.java
@@ -14,14 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
+
+import java.util.Map;
 
 import com.alibaba.dubbo.common.Constants;
 import com.alibaba.dubbo.common.URL;
 import com.alibaba.dubbo.common.utils.StringUtils;
 
-import java.util.Map;
-
 public class Override extends Entity {
 
     private static final long serialVersionUID = 114828505391757846L;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Owner.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Owner.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Owner.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Owner.java
index 88ce5af..278fb83 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Owner.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Owner.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 public class Owner extends Entity {
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/PageList.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/PageList.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/PageList.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/PageList.java
index 46b62d3..6405c32 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/PageList.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/PageList.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 import java.io.Serializable;
 import java.util.List;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Provider.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Provider.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Provider.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Provider.java
index 39c1e4e..5675874 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Provider.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Provider.java
@@ -14,16 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.registry.common.registry.ConvertUtil;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubboadmin.registry.common.registry.ConvertUtil;
+
 /**
  * Provider
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Registry.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Registry.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Registry.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Registry.java
index 5fa17bc..a70464e 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Registry.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Registry.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 import java.util.Date;
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Route.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Route.java
similarity index 99%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Route.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Route.java
index 3562c09..b6e8d47 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Route.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Route.java
@@ -14,13 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
+
+import java.util.List;
 
 import com.alibaba.dubbo.common.Constants;
 import com.alibaba.dubbo.common.URL;
 
-import java.util.List;
-
 /**
  * Route
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/SearchHistory.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/SearchHistory.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/SearchHistory.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/SearchHistory.java
index 91c17ef..32c405b 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/SearchHistory.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/SearchHistory.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 public class SearchHistory extends Entity {
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Test.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Test.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Test.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Test.java
index 2e36a56..e4a1530 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Test.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Test.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 /**
  * Test
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/User.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/User.java
similarity index 98%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/User.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/User.java
index bb9fb65..e9826d3 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/User.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/User.java
@@ -14,13 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
-
-import com.alibaba.dubbo.registry.common.route.ParseUtils;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 import java.util.Arrays;
 import java.util.List;
 
+import com.alibaba.dubboadmin.registry.common.route.ParseUtils;
+
 /**
  * User
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Weight.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Weight.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Weight.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Weight.java
index fda6907..2f3f0da 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/domain/Weight.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/domain/Weight.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.domain;
+package com.alibaba.dubboadmin.registry.common.domain;
 
 public class Weight extends Entity {
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/registry/ConvertUtil.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/registry/ConvertUtil.java
similarity index 98%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/registry/ConvertUtil.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/registry/ConvertUtil.java
index 8e35b6a..b3b1508 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/registry/ConvertUtil.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/registry/ConvertUtil.java
@@ -14,14 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.registry;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.utils.StringUtils;
+package com.alibaba.dubboadmin.registry.common.registry;
 
 import java.util.HashMap;
 import java.util.Map;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.utils.StringUtils;
+
 public class ConvertUtil {
     private ConvertUtil() {
     }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/OverrideUtils.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/OverrideUtils.java
similarity index 93%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/OverrideUtils.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/OverrideUtils.java
index 5f36168..6de10ee 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/OverrideUtils.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/OverrideUtils.java
@@ -14,18 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.route;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.registry.common.domain.Consumer;
-import com.alibaba.dubbo.registry.common.domain.Override;
-import com.alibaba.dubbo.registry.common.domain.Provider;
+package com.alibaba.dubboadmin.registry.common.route;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubboadmin.registry.common.domain.Consumer;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+
 public class OverrideUtils {
 
     public static final Comparator<Override> OVERRIDE_COMPARATOR = new Comparator<Override>() {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/ParseUtils.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/ParseUtils.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/ParseUtils.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/ParseUtils.java
index 1486548..396b4e7 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/ParseUtils.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/ParseUtils.java
@@ -14,9 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.route;
-
-import com.alibaba.dubbo.common.utils.StringUtils;
+package com.alibaba.dubboadmin.registry.common.route;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -30,13 +28,16 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import com.alibaba.dubbo.common.utils.StringUtils;
+
 /**
  * String parsing tools related to interpolation, including Glob mode, Query string, Service URL processing.
  *
  */
 public class ParseUtils {
 
-    private static final ConcurrentMap<String, Pattern> REPLACE_PARAMETER_PATTERNS = new ConcurrentHashMap<String, Pattern>();
+    private static final ConcurrentMap<String, Pattern>
+        REPLACE_PARAMETER_PATTERNS = new ConcurrentHashMap<String, Pattern>();
     public static String METHOD_SPLIT = ",";
     private static Pattern VARIABLE_PATTERN = Pattern.compile(
             "\\$\\s*\\{?\\s*([\\._0-9a-zA-Z]+)\\s*\\}?");
@@ -133,8 +134,8 @@ else if (i == 0) {
          * @param value Glob mode value
      */
     public static boolean isMatchGlobPatternsNeedInterpolate(
-            Collection<String> patternsNeedInterpolate,
-            Map<String, String> interpolateParams, String value) {
+        Collection<String> patternsNeedInterpolate,
+        Map<String, String> interpolateParams, String value) {
         if (patternsNeedInterpolate != null && !patternsNeedInterpolate.isEmpty()) {
             for (String patternNeedItp : patternsNeedInterpolate) {
                 if (StringUtils.isEmpty(patternNeedItp)) {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/RouteRule.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/RouteRule.java
similarity index 95%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/RouteRule.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/RouteRule.java
index 5343f2e..4e6ce27 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/RouteRule.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/RouteRule.java
@@ -14,10 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.route;
-
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.registry.common.domain.Route;
+package com.alibaba.dubboadmin.registry.common.route;
 
 import java.text.ParseException;
 import java.util.Collections;
@@ -29,14 +26,16 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.registry.common.domain.Route;
 
 /**
  * Router rule can be divided into two parts, When Condition and Then Condition <br>
  * When/Then Confition is expressed in a style of (KV) pair, the V part of the condition pair can contain multiple values (a list) <br>
  * The meaning of Rule: If a request matches When Condition, then use Then Condition to filter providers (only providers match Then Condition will be returned). <br>
  * The process of using Conditions to match consumers and providers is called `Filter`.
- * When Condition are used to filter Consumers, while Then Condition are used to filter Providers.
- * RouteRule performs like this: If a Consumer matches When Condition, then only return the Providers matches Then Condition. This means RouteRule should be applied to current Consumer and the providers returned are filtered by RouteRule.<br>
+ * When Condition are used to filter ConsumersController, while Then Condition are used to filter ProvidersController.
+ * RouteRule performs like this: If a Consumer matches When Condition, then only return the ProvidersController matches Then Condition. This means RouteRule should be applied to current Consumer and the providers returned are filtered by RouteRule.<br>
  *
  * An example of Route Rule:<code>
  * key1 = value11,value12 & key2 = value21 & key2 != value22 => key3 = value3 & key4 = value41,vlaue42 & key5 !=value51
@@ -72,7 +71,7 @@ private RouteRule(Map<String, MatchPair> when, Map<String, MatchPair> then) {
 
     public static Map<String, MatchPair> parseRule(String rule)
             throws ParseException {
-        Map<String, MatchPair> condition = new HashMap<String, RouteRule.MatchPair>();
+        Map<String, MatchPair> condition = new HashMap<String, MatchPair>();
         if (StringUtils.isBlank(rule)) {
             return condition;
         }
@@ -195,7 +194,7 @@ public static RouteRule parseQuitely(Route route) {
     }
 
     static Map<String, MatchPair> parseNameAndValueListString2Condition(Map<String, String> params, Map<String, String> notParams) {
-        Map<String, MatchPair> condition = new HashMap<String, RouteRule.MatchPair>();
+        Map<String, MatchPair> condition = new HashMap<String, MatchPair>();
 
         for (Entry<String, String> entry : params.entrySet()) {
             String valueListString = entry.getValue();
@@ -266,14 +265,14 @@ public static RouteRule createFromCondition(Map<String, MatchPair> whenCondition
     }
 
     public static RouteRule copyWithRemove(RouteRule copy, Set<String> whenParams, Set<String> thenParams) {
-        Map<String, MatchPair> when = new HashMap<String, RouteRule.MatchPair>();
+        Map<String, MatchPair> when = new HashMap<String, MatchPair>();
         for (Entry<String, MatchPair> entry : copy.getWhenCondition().entrySet()) {
             if (whenParams == null || !whenParams.contains(entry.getKey())) {
                 when.put(entry.getKey(), entry.getValue());
             }
         }
 
-        Map<String, MatchPair> then = new HashMap<String, RouteRule.MatchPair>();
+        Map<String, MatchPair> then = new HashMap<String, MatchPair>();
         for (Entry<String, MatchPair> entry : copy.getThenCondition().entrySet()) {
             if (thenParams == null || !thenParams.contains(entry.getKey())) {
                 then.put(entry.getKey(), entry.getValue());
@@ -296,13 +295,13 @@ public static RouteRule copyWithReplace(RouteRule copy, Map<String, MatchPair> w
             throw new NullPointerException("Argument copy is null!");
         }
 
-        Map<String, MatchPair> when = new HashMap<String, RouteRule.MatchPair>();
+        Map<String, MatchPair> when = new HashMap<String, MatchPair>();
         when.putAll(copy.getWhenCondition());
         if (whenCondition != null) {
             when.putAll(whenCondition);
         }
 
-        Map<String, MatchPair> then = new HashMap<String, RouteRule.MatchPair>();
+        Map<String, MatchPair> then = new HashMap<String, MatchPair>();
         then.putAll(copy.getThenCondition());
         if (thenCondition != null) {
             then.putAll(thenCondition);
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/RouteRuleUtils.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/RouteRuleUtils.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/RouteRuleUtils.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/RouteRuleUtils.java
index 5a85495..7d1aebd 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/RouteRuleUtils.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/RouteRuleUtils.java
@@ -14,9 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.route;
-
-import com.alibaba.dubbo.common.utils.StringUtils;
+package com.alibaba.dubboadmin.registry.common.route;
 
 import java.util.Collection;
 import java.util.HashMap;
@@ -27,6 +25,8 @@
 import java.util.Map.Entry;
 import java.util.Set;
 
+import com.alibaba.dubbo.common.utils.StringUtils;
+
 public class RouteRuleUtils {
     private RouteRuleUtils() {
     }
@@ -40,8 +40,8 @@ private RouteRuleUtils() {
      * @param expandName2Set the mapping of values to values that are carried out
      */
     public static <T extends Collection<String>> Map<String, RouteRule.MatchPair> expandCondition(
-            Map<String, RouteRule.MatchPair> condition, String srcKeyName, String destKeyName,
-            Map<String, T> expandName2Set) {
+        Map<String, RouteRule.MatchPair> condition, String srcKeyName, String destKeyName,
+        Map<String, T> expandName2Set) {
         if (null == condition || StringUtils.isEmpty(srcKeyName) || StringUtils.isEmpty(destKeyName)) {
             return condition;
         }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/RouteUtils.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/RouteUtils.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/RouteUtils.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/RouteUtils.java
index aaec7f1..6774182 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/route/RouteUtils.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/route/RouteUtils.java
@@ -14,12 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.route;
-
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.registry.common.domain.Override;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-import com.alibaba.dubbo.registry.common.domain.Route;
+package com.alibaba.dubboadmin.registry.common.route;
 
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -30,6 +25,11 @@
 import java.util.Map;
 import java.util.Set;
 
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.registry.common.domain.Route;
+
 /**
  * RouteParser route rule parse tool。
  *
@@ -84,7 +84,7 @@ public static boolean matchRoute(String consumerAddress, String consumerQueryUrl
         Map<String, String> urls = new HashMap<String, String>();
         urls.put("consumer://" + consumerAddress + "/" + serviceName, consumerQueryUrl); // not empty dummy data
         for (Provider provider : providers) {
-            if (com.alibaba.dubbo.governance.web.common.pulltool.Tool.isProviderEnabled(provider, overrides)) {
+            if (com.alibaba.dubboadmin.web.pulltool.Tool.isProviderEnabled(provider, overrides)) {
                 urls.put(provider.getUrl(), provider.getParameters());
             }
         }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/status/DatabaseStatusChecker.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/status/DatabaseStatusChecker.java
similarity index 98%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/status/DatabaseStatusChecker.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/status/DatabaseStatusChecker.java
index 95a0a72..d02def8 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/status/DatabaseStatusChecker.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/status/DatabaseStatusChecker.java
@@ -14,7 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.status;
+package com.alibaba.dubboadmin.registry.common.status;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+
+import javax.sql.DataSource;
 
 import com.alibaba.dubbo.common.logger.Logger;
 import com.alibaba.dubbo.common.logger.LoggerFactory;
@@ -23,11 +29,6 @@
 
 import org.springframework.beans.factory.annotation.Autowired;
 
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-
 /**
  * DatabaseStatus
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/status/LoadStatusChecker.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/status/LoadStatusChecker.java
similarity index 95%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/status/LoadStatusChecker.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/status/LoadStatusChecker.java
index 7570922..cfbf5cc 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/status/LoadStatusChecker.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/status/LoadStatusChecker.java
@@ -14,17 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.status;
-
-import com.alibaba.dubbo.common.status.Status;
-import com.alibaba.dubbo.common.status.StatusChecker;
+package com.alibaba.dubboadmin.registry.common.status;
 
 import java.lang.management.ManagementFactory;
 import java.lang.management.OperatingSystemMXBean;
 import java.lang.reflect.Method;
 
+import com.alibaba.dubbo.common.status.Status;
+import com.alibaba.dubbo.common.status.StatusChecker;
+
 /**
- * Load Status
+ * Load StatusController
  *
  */
 public class LoadStatusChecker implements StatusChecker {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/status/MemoryStatusChecker.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/status/MemoryStatusChecker.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/status/MemoryStatusChecker.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/status/MemoryStatusChecker.java
index 4cd1495..c28e35a 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/status/MemoryStatusChecker.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/status/MemoryStatusChecker.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.status;
+package com.alibaba.dubboadmin.registry.common.status;
 
 import com.alibaba.dubbo.common.status.Status;
 import com.alibaba.dubbo.common.status.StatusChecker;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/Coder.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/Coder.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/Coder.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/Coder.java
index b42545f..644a12b 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/Coder.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/Coder.java
@@ -14,13 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.util;
-
-import com.alibaba.dubbo.common.io.Bytes;
+package com.alibaba.dubboadmin.registry.common.util;
 
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 
+import com.alibaba.dubbo.common.io.Bytes;
+
 public class Coder {
 
     private Coder() {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/Entities.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/Entities.java
similarity index 99%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/Entities.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/Entities.java
index b6b79ab..8361430 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/Entities.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/Entities.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package com.alibaba.dubbo.registry.common.util;
+package com.alibaba.dubboadmin.registry.common.util;
 
 import java.io.IOException;
 import java.io.StringWriter;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/IntHashMap.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/IntHashMap.java
similarity index 99%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/IntHashMap.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/IntHashMap.java
index d3a568b..4713cb8 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/IntHashMap.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/IntHashMap.java
@@ -1,4 +1,3 @@
-/*
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -16,7 +15,7 @@
  * limitations under the License.
  */
 
-package com.alibaba.dubbo.registry.common.util;
+package com.alibaba.dubboadmin.registry.common.util;
 
 /**
  * <p>A hash map that uses primitive ints for the key rather than objects.</p>
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/LocaleUtils.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/LocaleUtils.java
similarity index 96%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/LocaleUtils.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/LocaleUtils.java
index f5436ec..58a29c1 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/LocaleUtils.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/LocaleUtils.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package com.alibaba.dubbo.registry.common.util;
+package com.alibaba.dubboadmin.registry.common.util;
 
 import java.util.Locale;
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/MessageSource.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/MessageSource.java
similarity index 97%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/MessageSource.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/MessageSource.java
index 7bf3c4d..3613abb 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/MessageSource.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/MessageSource.java
@@ -14,14 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.util;
-
-import com.alibaba.dubbo.common.logger.Logger;
-import com.alibaba.dubbo.common.logger.LoggerFactory;
+package com.alibaba.dubboadmin.registry.common.util;
 
 import java.text.MessageFormat;
 import java.util.ResourceBundle;
 
+import com.alibaba.dubbo.common.logger.Logger;
+import com.alibaba.dubbo.common.logger.LoggerFactory;
+
 /**
  * MessageSource
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/OverrideUtils.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/OverrideUtils.java
similarity index 95%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/OverrideUtils.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/OverrideUtils.java
index 47205d2..3c20cae 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/OverrideUtils.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/OverrideUtils.java
@@ -14,18 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.util;
-
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.registry.common.domain.LoadBalance;
-import com.alibaba.dubbo.registry.common.domain.Override;
-import com.alibaba.dubbo.registry.common.domain.Weight;
+package com.alibaba.dubboadmin.registry.common.util;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.registry.common.domain.LoadBalance;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.registry.common.domain.Weight;
+
 /**
  * OverrideUtils.java
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/StringEscapeUtils.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/StringEscapeUtils.java
similarity index 99%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/StringEscapeUtils.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/StringEscapeUtils.java
index 213d65f..32419a9 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/StringEscapeUtils.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/StringEscapeUtils.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.util;
+package com.alibaba.dubboadmin.registry.common.util;
 
 import java.io.IOException;
 import java.io.StringWriter;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/Tool.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/Tool.java
similarity index 99%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/Tool.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/Tool.java
index a2ad8b4..a5d3e95 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/registry/common/util/Tool.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/registry/common/util/Tool.java
@@ -14,11 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.registry.common.util;
-
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.common.utils.NetUtils;
-import com.alibaba.dubbo.common.utils.StringUtils;
+package com.alibaba.dubboadmin.registry.common.util;
 
 import java.lang.reflect.Array;
 import java.net.InetAddress;
@@ -30,6 +26,10 @@
 import java.util.Map;
 import java.util.regex.Pattern;
 
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubbo.common.utils.NetUtils;
+import com.alibaba.dubbo.common.utils.StringUtils;
+
 /**
  * Tool
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/BaseController.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/BaseController.java
new file mode 100644
index 0000000..4cab02f
--- /dev/null
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/BaseController.java
@@ -0,0 +1,85 @@
+/*
+ * 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 com.alibaba.dubboadmin.web.mvc;
+
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.logger.Logger;
+import com.alibaba.dubbo.common.logger.LoggerFactory;
+import com.alibaba.dubboadmin.governance.biz.common.i18n.MessageResourceService;
+import com.alibaba.dubboadmin.governance.util.WebConstants;
+import com.alibaba.dubboadmin.registry.common.domain.User;
+import com.alibaba.dubboadmin.web.pulltool.RootContextPath;
+import com.alibaba.dubboadmin.web.pulltool.Tool;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.Model;
+
+public class BaseController {
+    protected static final Logger logger = LoggerFactory.getLogger(BaseController.class);
+
+    protected static final Pattern SPACE_SPLIT_PATTERN = Pattern.compile("\\s+");
+    //FIXME, to extract these auxiliary methods
+    protected String role = null;
+    protected String operator = null;
+    protected User currentUser = null;
+    protected String operatorAddress = null;
+    protected String currentRegistry = null;
+    @Autowired
+    private MessageResourceService messageResourceService;
+
+    @Autowired
+    protected Tool tool;
+
+    public void prepare(HttpServletRequest request, HttpServletResponse response, Model model,
+                        String methodName, String type) {
+        if (request.getSession().getAttribute(WebConstants.CURRENT_USER_KEY) != null) {
+            User user = (User) request.getSession().getAttribute(WebConstants.CURRENT_USER_KEY);
+            currentUser = user;
+            operator = user.getUsername();
+            role = user.getRole();
+            request.getSession().setAttribute(WebConstants.CURRENT_USER_KEY, user);
+        }
+        operatorAddress = request.getRemoteHost();
+        request.getMethod();
+        model.addAttribute("operator", operator);
+        model.addAttribute("operatorAddress", operatorAddress);
+
+        model.addAttribute("currentRegistry", currentRegistry);
+        model.addAttribute("rootContextPath", new RootContextPath(request.getContextPath()));
+        model.addAttribute("tool", tool);
+        model.addAttribute("_method", methodName);
+        model.addAttribute("helpUrl", WebConstants.HELP_URL);
+        model.addAttribute("_type", type);
+
+    }
+
+    public String getMessage(String key, Object... args) {
+        return messageResourceService.getMessage(key, args);
+    }
+
+    private String getDefaultRedirect(Map<String, Object> context, String operate) {
+        String defaultRedirect = (String) context.get("defaultRedirect");
+        return defaultRedirect;
+    }
+
+}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/RouterController.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/RouterController.java
new file mode 100644
index 0000000..2d7e5a0
--- /dev/null
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/RouterController.java
@@ -0,0 +1,349 @@
+/*
+ * 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 com.alibaba.dubboadmin.web.mvc;
+
+import com.alibaba.dubboadmin.SpringUtil;
+import com.alibaba.dubboadmin.governance.util.WebConstants;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.web.mvc.governance.ServicesController;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+
+@Controller
+public class RouterController {
+
+    @Autowired
+    ServicesController servicesController;
+
+    private boolean isPrimitive(Class<?> cls) {
+        return cls.isPrimitive() || cls == Boolean.class || cls == Byte.class
+                || cls == Character.class || cls == Short.class || cls == Integer.class
+                || cls == Long.class || cls == Float.class || cls == Double.class
+                || cls == String.class;
+    }
+
+    private Object convertPrimitive(Class<?> cls, String value) {
+        if (cls == boolean.class || cls == Boolean.class) {
+            return value == null || value.length() == 0 ? false : Boolean.valueOf(value);
+        } else if (cls == byte.class || cls == Byte.class) {
+            return value == null || value.length() == 0 ? 0 : Byte.valueOf(value);
+        } else if (cls == char.class || cls == Character.class) {
+            return value == null || value.length() == 0 ? '\0' : value.charAt(0);
+        } else if (cls == short.class || cls == Short.class) {
+            return value == null || value.length() == 0 ? 0 : Short.valueOf(value);
+        } else if (cls == int.class || cls == Integer.class) {
+            return value == null || value.length() == 0 ? 0 : Integer.valueOf(value);
+        } else if (cls == long.class || cls == Long.class) {
+            return value == null || value.length() == 0 ? 0 : Long.valueOf(value);
+        } else if (cls == float.class || cls == Float.class) {
+            return value == null || value.length() == 0 ? 0 : Float.valueOf(value);
+        } else if (cls == double.class || cls == Double.class) {
+            return value == null || value.length() == 0 ? 0 : Double.valueOf(value);
+        }
+        return value;
+    }
+
+    //address mapping
+    @RequestMapping("/governance/addresses/{ip:[0-9.]+:?[0-9]+}/{type}")
+    public String addressRouter(@PathVariable("ip") String ip, @PathVariable("type") String type,
+                                HttpServletRequest request, HttpServletResponse response, Model model) {
+        model.addAttribute("address", ip);
+        return appRouter(null, "addresses", ip, type, request, response, model);
+    }
+
+    @RequestMapping("/governance/addresses/{ip:[0-9.]+:?[0-9]+}/{type}/{action}")
+    public String addresswithIDRouter(@RequestParam Map<String, String> params, @PathVariable("ip") String ip, @PathVariable("type") String type,
+                                      @PathVariable("action") String action, HttpServletRequest request,
+                                      HttpServletResponse response, Model model) {
+        model.addAttribute("address", ip);
+        return appAction(params, null, "addresses", ip, type, action, request, response, model);
+    }
+
+    @RequestMapping("/governance/addresses/{ip:[0-9.]+:?[0-9]+}/{type}/{id}/{action}")
+    public String addressWithIDandAction(@PathVariable("ip") String ip, @PathVariable("type") String type,
+                                         @PathVariable("id") String id, @PathVariable("action") String action,
+                                         HttpServletRequest request, HttpServletResponse response, Model model) {
+        model.addAttribute("address", ip);
+        return appActionWithIdandAction(null, null, type, id, action, request, response, model);
+    }
+
+
+    // service mapping
+    @RequestMapping("/governance/services/{service}/{type}")
+    public String servicerRouter(@PathVariable("service") String service, @PathVariable("type") String type,
+                                 HttpServletRequest request, HttpServletResponse response, Model model) {
+        model.addAttribute("service", service);
+        return appRouter(null, "services", service, type, request, response, model);
+    }
+
+    @RequestMapping("/governance/services/{service}/{type}/{action}")
+    public String serviceAction(@RequestParam Map<String, String> param,
+                                @PathVariable("service") String service, @PathVariable("type") String type,
+                                @PathVariable("action") String action, HttpServletRequest request,
+                                HttpServletResponse response, Model model) {
+        for (Map.Entry<String, String> entry : param.entrySet()) {
+            System.out.println("key: " + entry.getKey());
+            System.out.println("value: " + entry.getValue());
+        }
+        model.addAttribute("service", service);
+        return appAction(param, null, "services", service, type, action, request, response, model);
+    }
+
+    @RequestMapping("/governance/services/{service}/{type}/{id}/{action}")
+    public String serviceActionWithId(@RequestParam Map<String, Object> param,
+                                      @PathVariable("service") String service,
+                                      @PathVariable("type") String type, @PathVariable("id") String id,
+                                      @PathVariable("action") String action, HttpServletRequest request, HttpServletResponse response, Model model) {
+        String method = request.getMethod();
+        String app = null;
+        System.out.println("type: " + type);
+        System.out.println("action: " + action);
+        System.out.println("method: " + method);
+        for (Map.Entry<String, Object> entry : param.entrySet()) {
+            if (entry.getKey().equals("application")) {
+                app = (String) entry.getValue();
+            }
+            System.out.println("key: " + entry.getKey());
+            System.out.println("value: " + entry.getValue());
+        }
+        return appActionWithIdandAction(app, service, type, id, action, request, response, model);
+    }
+
+    // app mapping all execute goes here
+    //@RequestMapping("/governance/applications/{app}/services/{ids}/{action}")
+    //public String serviceActionWithApp(@PathVariable("app") String app, @PathVariable("ids") String ids,
+    //                                   @PathVariable("type") String type, HttpServletRequest request,
+    //                                   HttpServletResponse response, Model model) {
+    //    return "";
+    //}
+
+    @RequestMapping("/governance/applications/{app}/{elements}/{element}/{type}")
+    public String appRouter(@PathVariable("app") String app, @PathVariable("elements") String elements,
+                            @PathVariable("element") String element, @PathVariable("type") String type,
+                            HttpServletRequest request,
+                            HttpServletResponse response, Model model) {
+        if (app != null) {
+            model.addAttribute("app", app);
+        }
+        if (StringUtils.isNumeric(element)) {
+            //service action, shield, recover..
+            Long[] ids = new Long[1];
+            ids[0] = Long.valueOf(element);
+            model.addAttribute("service", request.getParameter("service"));
+            try {
+                Method m = servicesController.getClass().getDeclaredMethod(type, Long[].class, HttpServletRequest.class,
+                        HttpServletResponse.class, Model.class);
+                Object result = m.invoke(servicesController, ids, request, response, model);
+                return (String) result;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        if (elements.equals("services")) {
+            model.addAttribute("service", element);
+        } else if (elements.equals("addresses")) {
+            model.addAttribute("address", element);
+        }
+
+        String name = WebConstants.mapper.get(type);
+        if (name != null) {
+            Object controller = SpringUtil.getBean(name);
+            if (controller != null) {
+                try {
+                    Method index = controller.getClass().getDeclaredMethod("index", HttpServletRequest.class, HttpServletResponse.class,
+                            Model.class);
+                    Object result = index.invoke(controller, request, response, model);
+                    return (String) result;
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return "";
+    }
+
+    @RequestMapping("/governance/applications/{app}/{type}")
+    public String appWithService(@PathVariable("app") String app, @PathVariable("type") String type,
+                                 HttpServletRequest request,
+                                 HttpServletResponse response,
+                                 Model model) {
+        model.addAttribute("app", app);
+        String name = WebConstants.mapper.get(type);
+        if (name != null) {
+            Object controller = SpringUtil.getBean(name);
+            try {
+                Method index = controller.getClass().getDeclaredMethod("index", HttpServletRequest.class,
+                        HttpServletResponse.class, Model.class);
+                Object result = index.invoke(controller, request, response, model);
+                return (String) result;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        }
+        return "";
+    }
+
+
+    @RequestMapping("/governance/applications/{app}/{elements}/{element}/{type}/{action}")
+    public String appAction(@RequestParam Map<String, String> params, @PathVariable("app") String app,
+                            @PathVariable("elements") String elements, @PathVariable("element") String element,
+                            @PathVariable("type") String type, @PathVariable("action") String action,
+                            HttpServletRequest request, HttpServletResponse response, Model model) {
+        if (app != null) {
+            model.addAttribute("app", app);
+        }
+        if (elements.equals("services")) {
+            model.addAttribute("service", element);
+        } else if (elements.equals("addresses")) {
+            model.addAttribute("address", element);
+        }
+
+        String name = WebConstants.mapper.get(type);
+        if (name != null) {
+            Object controller = SpringUtil.getBean(name);
+            if (controller != null) {
+                if (request.getMethod().equals("POST")) {
+                    Method[] methods = controller.getClass().getDeclaredMethods();
+                    for (Method method : methods) {
+                        if (method.getName().equals(action)) {
+                            Class<?> param = method.getParameterTypes()[0];
+                            try {
+                                if (!param.isAssignableFrom(HttpServletRequest.class)) {
+                                    Object value = param.newInstance();
+                                    //此处有问题,Override 父类的set方法不会被调用,导致id没有值
+                                    Method[] mms;
+                                    if (param.isAssignableFrom(Override.class)) {
+                                        mms = param.getMethods();
+                                    } else {
+                                        mms = param.getDeclaredMethods();
+                                    }
+                                    for (Method m : mms) {
+                                        if (m.getName().toLowerCase().startsWith("set")) {
+                                            String methodName = m.getName();
+                                            String key = methodName.substring(3).toLowerCase();
+                                            String tmp = params.get(key);
+                                            Object obj = tmp;
+                                            if (tmp != null) {
+                                                Class<?> t = m.getParameterTypes()[0];
+                                                if (isPrimitive(t)) {
+                                                    obj = convertPrimitive(t, tmp);
+                                                }
+                                                m.invoke(value, obj);
+                                            }
+
+                                        }
+                                    }
+                                    return (String) method.invoke(controller, value, request, response, model);
+                                } else {
+                                    return (String) method.invoke(controller, request, response, model);
+                                }
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+
+
+                        }
+                    }
+                } else {
+                    try {
+                        if (StringUtils.isNumeric(action)) {
+                            // action is id, call show method
+                            Method show = controller.getClass().getDeclaredMethod("show", Long.class, HttpServletRequest.class, HttpServletResponse.class,
+                                    Model.class);
+                            Object result = show.invoke(controller, Long.valueOf(action), request, response, model);
+                            return (String) result;
+                        } else {
+                            Method m = controller.getClass().getDeclaredMethod(action, HttpServletRequest.class,
+                                    HttpServletResponse.class,
+                                    Model.class);
+                            Object result = m.invoke(controller, request, response, model);
+                            return (String) result;
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+        return "";
+    }
+
+
+    @RequestMapping("/governance/applications/{app}/services/{service}/{type}/{id}/{action}")
+    public String appActionWithIdandAction(@PathVariable("app") String app, @PathVariable("service") String service,
+                                           @PathVariable("type") String type, @PathVariable("id") String id,
+                                           @PathVariable("action") String action,
+                                           HttpServletRequest request, HttpServletResponse response, Model model) {
+        if (app != null) {
+            model.addAttribute("app", app);
+        }
+        model.addAttribute("service", service);
+        String name = WebConstants.mapper.get(type);
+        if (name != null) {
+            Object controller = SpringUtil.getBean(name);
+            if (controller != null) {
+                try {
+                    Object result = null;
+                    if (StringUtils.isNumeric(id)) {
+                        //single id
+                        Method m = null;
+                        try {
+                            m = controller.getClass().getDeclaredMethod(action, Long.class, HttpServletRequest.class,
+                                    HttpServletResponse.class, Model.class);
+                            result = m.invoke(controller, Long.valueOf(id), request, response, model);
+                        } catch (NoSuchMethodException e) {
+                            m = controller.getClass().getDeclaredMethod(action, Long[].class, HttpServletRequest.class,
+                                    HttpServletResponse.class, Model.class);
+                            result = m.invoke(controller, new Long[]{Long.valueOf(id)}, request, response, model);
+
+                        }
+                    } else {
+                        //id array
+                        String[] array = id.split(",");
+                        Long[] ids = new Long[array.length];
+                        for (int i = 0; i < array.length; i++) {
+                            ids[i] = Long.valueOf(array[i]);
+                        }
+
+                        Method m = controller.getClass().getDeclaredMethod(action, Long[].class, HttpServletRequest.class,
+                                HttpServletResponse.class, Model.class);
+
+                        result = m.invoke(controller, ids, request, response, model);
+                    }
+                    return (String) result;
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return "";
+
+    }
+}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/auth/DubboUser.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/common/auth/DubboUser.java
similarity index 92%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/auth/DubboUser.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/common/auth/DubboUser.java
index 0ab9e9b..9339417 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/auth/DubboUser.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/common/auth/DubboUser.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.common.auth;
-
-import com.alibaba.dubbo.registry.common.domain.User;
+package com.alibaba.dubboadmin.web.mvc.common.auth;
 
 import java.io.Serializable;
 
+import com.alibaba.dubboadmin.registry.common.domain.User;
+
 /**
  * MinasUser: DubboUser
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/i18n/LocaleUtil.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/common/i18n/LocaleUtil.java
similarity index 95%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/i18n/LocaleUtil.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/common/i18n/LocaleUtil.java
index dd7f8af..5d61e8a 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/i18n/LocaleUtil.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/common/i18n/LocaleUtil.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.common.i18n;
+package com.alibaba.dubboadmin.web.mvc.common.i18n;
 
 import java.util.Locale;
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Accesses.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/AccessesController.java
similarity index 70%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Accesses.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/AccessesController.java
index eb8ffcd..bd198bf 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Accesses.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/AccessesController.java
@@ -14,49 +14,57 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.governance.module.screen;
-
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.service.RouteService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Access;
-import com.alibaba.dubbo.registry.common.domain.Route;
-import com.alibaba.dubbo.registry.common.route.RouteRule;
-import com.alibaba.dubbo.registry.common.route.RouteRule.MatchPair;
-import com.alibaba.dubbo.registry.common.util.Tool;
+package com.alibaba.dubboadmin.web.mvc.governance;
 
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.governance.service.RouteService;
+import com.alibaba.dubboadmin.registry.common.domain.Access;
+import com.alibaba.dubboadmin.registry.common.domain.Route;
+import com.alibaba.dubboadmin.registry.common.route.RouteRule;
+import com.alibaba.dubboadmin.registry.common.route.RouteRule.MatchPair;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+import com.alibaba.dubboadmin.web.pulltool.Tool;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.support.BindingAwareModelMap;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.StringReader;
 import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
-import java.util.Set;
 import java.util.regex.Pattern;
 
 /**
- * Providers. URI: /services/$service/accesses
- *
+ * ProvidersController. URI: /services/$service/accesses
  */
-public class Accesses extends Restful {
+
+@Controller
+@RequestMapping("/governance/accesses")
+public class AccessesController extends BaseController {
 
     private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3}$");
     private static final Pattern LOCAL_IP_PATTERN = Pattern.compile("127(\\.\\d{1,3}){3}$");
     private static final Pattern ALL_IP_PATTERN = Pattern.compile("0{1,3}(\\.0{1,3}){3}$");
+
     @Autowired
     private RouteService routeService;
     @Autowired
     private ProviderService providerService;
 
-    public void index(Map<String, Object> context) throws Exception {
-        String service = (String) context.get("service");
-        String address = (String) context.get("address");
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "index", "accesses");
+        BindingAwareModelMap newModel = (BindingAwareModelMap) model;
+        String address = (String) newModel.get("address");
+        String service = (String) newModel.get("service");
+
         address = Tool.getIP(address);
         List<Route> routes;
         if (service != null && service.length() > 0) {
@@ -68,11 +76,16 @@ public void index(Map<String, Object> context) throws Exception {
         }
         List<Access> accesses = new ArrayList<Access>();
         if (routes == null) {
-            context.put("accesses", accesses);
-            return;
+            model.addAttribute("accesses", accesses);
+            return "governance/screen/accesses/index";
         }
         for (Route route : routes) {
-            Map<String, MatchPair> rule = RouteRule.parseRule(route.getMatchRule());
+            Map<String, MatchPair> rule = null;
+            try {
+                rule = RouteRule.parseRule(route.getMatchRule());
+            } catch (ParseException e) {
+                logger.error("parse rule error", e);
+            }
             MatchPair pair = rule.get("consumer.host");
             if (pair != null) {
                 for (String host : pair.getMatches()) {
@@ -91,17 +104,23 @@ public void index(Map<String, Object> context) throws Exception {
                 }
             }
         }
-        context.put("accesses", accesses);
+        model.addAttribute("accesses", accesses);
+        return "governance/screen/accesses/index";
     }
 
-    public void add(Map<String, Object> context) {
+    @RequestMapping("/add")
+    public String add(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "add", "accesses");
         List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
-        context.put("serviceList", serviceList);
+        model.addAttribute("serviceList", serviceList);
+        return "governance/screen/accesses/add";
     }
 
-    public boolean create(Map<String, Object> context) throws Exception {
-        String addr = (String) context.get("consumerAddress");
-        String services = (String) context.get("service");
+    @RequestMapping("/create")
+    public String create(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        prepare(request, response, model, "create", "accesses");
+        String addr = request.getParameter("consumerAddress");
+        String services = request.getParameter("service");
         Set<String> consumerAddresses = toAddr(addr);
         Set<String> aimServices = toService(services);
         for (String aimService : aimServices) {
@@ -130,7 +149,7 @@ public boolean create(Map<String, Object> context) throws Exception {
                 matchPair = when.get("consumer.host");
             }
             for (String consumerAddress : consumerAddresses) {
-                if (Boolean.valueOf((String) context.get("allow"))) {
+                if (Boolean.valueOf((String) request.getParameter("allow"))) {
                     matchPair.getUnmatches().add(Tool.getIP(consumerAddress));
 
                 } else {
@@ -148,7 +167,10 @@ public boolean create(Map<String, Object> context) throws Exception {
             }
 
         }
-        return true;
+        model.addAttribute("success", true);
+        model.addAttribute("redirect", "../accesses");
+        return "governance/screen/redirect";
+
     }
 
     private Set<String> toAddr(String addr) throws IOException {
@@ -194,12 +216,20 @@ public boolean create(Map<String, Object> context) throws Exception {
         return aimServices;
     }
 
+
+    //修复从菜单: 首页 > 服务治理 > 服务 > com.kingnet.blockdata.service.DemoService:1.0.0 > 访问控制,中删除时反射执行方法找不到的BUG
+    // RouterController 284行导致的bug:java.lang.NoSuchMethodException: com.alibaba.dubboadmin.web.mvc.governance.AccessesController.delete(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.springframework.ui.Model)
+    public String delete(HttpServletRequest request, HttpServletResponse response, Model model) throws ParseException {
+        String accesses = request.getParameter("accesses");
+        return delete(accesses, request, response, model);
+    }
+
     /**
-     *
      * @throws ParseException
      */
-    public boolean delete(Map<String, Object> context) throws ParseException {
-        String accesses = (String) context.get("accesses");
+    @RequestMapping("/delete")
+    public String delete(@RequestParam String accesses, HttpServletRequest request, HttpServletResponse response, Model model) throws ParseException {
+        prepare(request, response, model, "delete", "accesses");
         String[] temp = accesses.split(" ");
         Map<String, Set<String>> prepareToDeleate = new HashMap<String, Set<String>>();
         for (String s : temp) {
@@ -254,7 +284,9 @@ public boolean delete(Map<String, Object> context) throws ParseException {
             }
 
         }
-        return true;
+        model.addAttribute("success", true);
+        model.addAttribute("redirect", "../accesses");
+        return "governance/screen/redirect";
     }
 
     public void show(Map<String, Object> context) {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Addresses.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/AddressesController.java
similarity index 50%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Addresses.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/AddressesController.java
index 480fd84..d728e97 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Addresses.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/AddressesController.java
@@ -14,27 +14,37 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.governance.module.screen;
-
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.ConsumerService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-
-import org.springframework.beans.factory.annotation.Autowired;
+package com.alibaba.dubboadmin.web.mvc.governance;
 
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.support.BindingAwareModelMap;
+import org.springframework.web.bind.annotation.RequestMapping;
+
 /**
- * Providers.
+ * ProvidersController.
  * URI: /services/$service/providers
  *
  */
-public class Addresses extends Restful {
+@Controller
+@RequestMapping("/governance/addresses")
+public class AddressesController extends BaseController {
 
     @Autowired
     private ProviderService providerService;
@@ -42,11 +52,21 @@
     @Autowired
     private ConsumerService consumerService;
 
-    public void index(Map<String, Object> context) {
-        String application = (String) context.get("application");
-        String service = (String) context.get("service");
+    @Autowired
+    ServicesController servicesController;
+
+    private Map<String, Object> context = new HashMap<>();
+
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "index", "addresses");
         List<String> providerAddresses = null;
         List<String> consumerAddresses = null;
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String application = (String)newModel.get("app");
+        String service = (String)newModel.get("service");
+        String address = (String)newModel.get("address");
+        String keyword = (String)newModel.get("keyword");
 
         if (application != null && application.length() > 0) {
             providerAddresses = providerService.findAddressesByApplication(application);
@@ -66,19 +86,19 @@ public void index(Map<String, Object> context) {
         if (consumerAddresses != null) {
             addresses.addAll(consumerAddresses);
         }
-        context.put("providerAddresses", providerAddresses);
-        context.put("consumerAddresses", consumerAddresses);
-        context.put("addresses", addresses);
-
-        if (context.get("service") == null
-                && context.get("application") == null
-                && context.get("address") == null) {
-            context.put("address", "*");
+        model.addAttribute("providerAddresses", providerAddresses);
+        model.addAttribute("consumerAddresses", consumerAddresses);
+        model.addAttribute("addresses", addresses);
+
+        if (service == null && application == null
+                && address == null) {
+            model.addAttribute("address", "*");
         }
 
-        String keyword = (String) context.get("keyword");
         if (StringUtils.isNotEmpty(keyword)) {
-            if ("*".equals(keyword)) return;
+            if ("*".equals(keyword)) {
+                return "governance/screen/addresses/index";
+            }
 
             keyword = keyword.toLowerCase();
             Set<String> newList = new HashSet<String>();
@@ -101,26 +121,35 @@ public void index(Map<String, Object> context) {
                 }
             }
             context.put("addresses", newList);
-            context.put("providerAddresses", newProviders);
-            context.put("consumerAddresses", newConsumers);
+            model.addAttribute("addresses", newList);
+            model.addAttribute("providerAddresses", newProviders);
+            model.addAttribute("consumerAddresses", newConsumers);
         }
+        return "governance/screen/addresses/index";
     }
 
-    public void search(Map<String, Object> context) {
-        index(context);
+    //@RequestMapping("/{ip:[0-9.]+}/{type}")
+    //public String addressMapping(@PathVariable("ip") String ip, @PathVariable("type") String type,
+    //                             HttpServletRequest request, HttpServletResponse response, Model model) {
+    //    return servicesController.route(null, type, null, ip, request, response, model);
+    //}
 
-        Set<String> newList = new HashSet<String>();
-        @SuppressWarnings("unchecked")
-        Set<String> list = (Set<String>) context.get("addresses");
-        String keyword = (String) context.get("keyword");
-        if (StringUtils.isNotEmpty(keyword)) {
-            keyword = keyword.toLowerCase();
-            for (String o : list) {
-                if (o.toLowerCase().indexOf(keyword) != -1) {
-                    newList.add(o);
-                }
-            }
-        }
-        context.put("addresses", newList);
-    }
+    //public void search(
+    //                   HttpServletRequest request, HttpServletResponse response, Model model) {
+    //    index(request, response, model);
+    //
+    //    Set<String> newList = new HashSet<String>();
+    //    @SuppressWarnings("unchecked")
+    //    Set<String> list = (Set<String>) context.get("addresses");
+    //    if (StringUtils.isNotEmpty(keyword)) {
+    //        keyword = keyword.toLowerCase();
+    //        for (String o : list) {
+    //            if (o.toLowerCase().indexOf(keyword) != -1) {
+    //                newList.add(o);
+    //            }
+    //        }
+    //    }
+    //    context.put("addresses", newList);
+    //    model.addAttribute("addresses", newList);
+    //}
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ApplicationsController.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ApplicationsController.java
new file mode 100644
index 0000000..c277a37
--- /dev/null
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ApplicationsController.java
@@ -0,0 +1,336 @@
+/*
+ * 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 com.alibaba.dubboadmin.web.mvc.governance;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
+import com.alibaba.dubboadmin.governance.service.OverrideService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.registry.common.route.OverrideUtils;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.support.BindingAwareModelMap;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * ProvidersController.
+ * URI: /applications
+ *
+ */
+@Controller
+@RequestMapping("/governance/applications")
+public class ApplicationsController extends BaseController {
+
+    @Autowired
+    private ProviderService providerService;
+
+    @Autowired
+    private ConsumerService consumerService;
+
+    @Autowired
+    private OverrideService overrideService;
+
+    @Autowired
+    ServicesController servicesController;
+
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "index", "applications");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String)newModel.get("service");
+        String application = (String)newModel.get("app");
+        String address = (String)newModel.get("address");
+        String keyword = request.getParameter("keyword");
+        if (service != null) {
+            Set<String> applications = new TreeSet<String>();
+            List<String> providerApplications = providerService.findApplicationsByServiceName(service);
+            if (providerApplications != null && providerApplications.size() > 0) {
+                applications.addAll(providerApplications);
+            }
+            List<String> consumerApplications = consumerService.findApplicationsByServiceName(service);
+            if (consumerApplications != null && consumerApplications.size() > 0) {
+                applications.addAll(consumerApplications);
+            }
+            model.addAttribute("applications", applications);
+            model.addAttribute("providerApplications", providerApplications);
+            model.addAttribute("consumerApplications", consumerApplications);
+            if (service != null && service.length() > 0) {
+                List<Override> overrides = overrideService.findByService(service);
+                Map<String, List<Override>> application2Overrides = new HashMap<String, List<Override>>();
+                if (overrides != null && overrides.size() > 0
+                        && applications != null && applications.size() > 0) {
+                    for (String a : applications) {
+                        if (overrides != null && overrides.size() > 0) {
+                            List<Override> appOverrides = new ArrayList<Override>();
+                            for (Override override : overrides) {
+                                if (override.isMatch(service, null, a)) {
+                                    appOverrides.add(override);
+                                }
+                            }
+                            Collections.sort(appOverrides, OverrideUtils.OVERRIDE_COMPARATOR);
+                            application2Overrides.put(a, appOverrides);
+                        }
+                    }
+                }
+                model.addAttribute("overrides", application2Overrides);
+            }
+            return "governance/screen/applications/index";
+        }
+        if (service == null && application == null
+                && address == null) {
+            model.addAttribute("app", "*");
+        }
+        Set<String> applications = new TreeSet<String>();
+        List<String> providerApplications = providerService.findApplications();
+        if (providerApplications != null && providerApplications.size() > 0) {
+            applications.addAll(providerApplications);
+        }
+        List<String> consumerApplications = consumerService.findApplications();
+        if (consumerApplications != null && consumerApplications.size() > 0) {
+            applications.addAll(consumerApplications);
+        }
+
+        Set<String> newList = new HashSet<String>();
+        Set<String> newProviders = new HashSet<String>();
+        Set<String> newConsumers = new HashSet<String>();
+        model.addAttribute("applications", applications);
+        model.addAttribute("providerApplications", providerApplications);
+        model.addAttribute("consumerApplications", consumerApplications);
+
+        if (StringUtils.isNotEmpty(keyword) && !"*".equals(keyword)) {
+            keyword = keyword.toLowerCase();
+            for (String o : applications) {
+                if (o.toLowerCase().indexOf(keyword) != -1) {
+                    newList.add(o);
+                }
+            }
+            for (String o : providerApplications) {
+                if (o.toLowerCase().indexOf(keyword) != -1) {
+                    newProviders.add(o);
+                }
+            }
+            for (String o : consumerApplications) {
+                if (o.toLowerCase().indexOf(keyword) != -1) {
+                    newConsumers.add(o);
+                }
+            }
+            model.addAttribute("applications", newList);
+            model.addAttribute("providerApplications", newProviders);
+            model.addAttribute("consumerApplications", newConsumers);
+        }
+        return "governance/screen/applications/index";
+    }
+
+    //@RequestMapping("/{application}/services")
+    //public String getService(@PathVariable("application") String app, HttpServletRequest request,
+    //                         HttpServletResponse response,
+    //                         Model model) {
+    //    return servicesController.index(app, null, null, null, request, response, model);
+    //}
+
+    //@RequestMapping("/{application}/services/{serviceName}/{type}")
+    //public String serviceMapping(@PathVariable("application") String app,
+    //                             @PathVariable("serviceName") String serviceName,
+    //                             @PathVariable("type") String type, HttpServletRequest request, HttpServletResponse response,
+    //                             Model model) {
+    //    return servicesController.route(serviceName, type, app, null, request, response, model);
+    //}
+
+    //public void search(@RequestParam(required = false) String service,
+    //                   @RequestParam(required = false) String address,
+    //                   @RequestParam(required = false) String application,
+    //                   @RequestParam(required = false) String keyword,
+    //                   HttpServletRequest request, HttpServletResponse response, Model model) {
+    //    index(service, address, application, keyword, request, response, model);
+    //
+    //    //Set<String> newList = new HashSet<String>();
+    //    //@SuppressWarnings("unchecked")
+    //    //Set<String> apps = (Set<String>) .get("applications");
+    //    //String keyword = (String) context.get("keyword");
+    //    //if (StringUtils.isNotEmpty(keyword)) {
+    //    //    keyword = keyword.toLowerCase();
+    //    //    for (String o : apps) {
+    //    //        if (o.toLowerCase().indexOf(keyword) != -1) {
+    //    //            newList.add(o);
+    //    //        }
+    //    //    }
+    //    //}
+    //    //context.put("applications", newList);
+    //}
+
+    @RequestMapping("/{ids}/shield")
+    public String shield(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return mock(ids, "force:return null", "shield", request, response, model);
+    }
+
+    @RequestMapping("/{ids}/tolerant")
+    public String tolerant(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return mock(ids, "fail:return null", "tolerant", request, response, model);
+    }
+
+    @RequestMapping("/{ids}/recover")
+    public String recover(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return mock(ids,  "", "recover", request, response, model);
+    }
+
+    private String mock(Long[] ids, String mock, String methodName, HttpServletRequest request,
+                         HttpServletResponse response, Model model) throws Exception {
+        prepare(request, response, model, methodName, "applications");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String) newModel.get("service");
+        String applications = (String) newModel.get("app");
+        if (service == null || service.length() == 0
+                || applications == null || applications.length() == 0) {
+            model.addAttribute("message", getMessage("NoSuchOperationData"));
+            model.addAttribute("success", false);
+            model.addAttribute("redirect", "../../applications");
+            return "governance/screen/redirect";
+        }
+        if (!super.currentUser.hasServicePrivilege(service)) {
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
+            model.addAttribute("success", false);
+            model.addAttribute("redirect", "../../applications");
+            return "governance/screen/redirect";
+        }
+        for (String application : SPACE_SPLIT_PATTERN.split(applications)) {
+            List<Override> overrides = overrideService.findByServiceAndApplication(service, application);
+            if (overrides != null && overrides.size() > 0) {
+                for (Override override : overrides) {
+                    Map<String, String> map = StringUtils.parseQueryString(override.getParams());
+                    if (mock == null || mock.length() == 0) {
+                        map.remove("mock");
+                    } else {
+                        map.put("mock", URL.encode(mock));
+                    }
+                    if (map.size() > 0) {
+                        override.setParams(StringUtils.toQueryString(map));
+                        override.setEnabled(true);
+                        override.setOperator(operator);
+                        override.setOperatorAddress(operatorAddress);
+                        overrideService.updateOverride(override);
+                    } else {
+                        overrideService.deleteOverride(override.getId());
+                    }
+                }
+            } else if (mock != null && mock.length() > 0) {
+                Override override = new Override();
+                override.setService(service);
+                override.setApplication(application);
+                override.setParams("mock=" + URL.encode(mock));
+                override.setEnabled(true);
+                override.setOperator(operator);
+                override.setOperatorAddress(operatorAddress);
+                overrideService.saveOverride(override);
+            }
+        }
+        model.addAttribute("success", true);
+        model.addAttribute("redirect", "../../applications");
+        return "governance/screen/redirect";
+    }
+
+    @RequestMapping("/allshield")
+    public String allshield(@RequestParam(required = false) String service, HttpServletRequest request,
+                             HttpServletResponse response, Model model) throws Exception {
+        return allmock(service, "force:return null", "allshield", request, response, model);
+    }
+
+    @RequestMapping("/alltolerant")
+    public String alltolerant(@RequestParam(required = false) String service, HttpServletRequest request,
+                               HttpServletResponse response, Model model) throws Exception {
+        return allmock(service, "fail:return null", "alltolerant", request, response, model);
+    }
+
+    @RequestMapping("/allrecover")
+    public String allrecover(@RequestParam(required = false) String service, HttpServletRequest request,
+                              HttpServletResponse response, Model model) throws Exception {
+        return allmock(service, "", "allrecover", request, response, model);
+    }
+
+    private String allmock(String service, String mock, String methodName, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        prepare(request, response, model, methodName, "applications");
+        if (service == null || service.length() == 0) {
+            model.addAttribute("message", getMessage("NoSuchOperationData"));
+            model.addAttribute("success", false);
+            model.addAttribute("redirect", "../../applications");
+            return "governance/screen/redirect";
+        }
+        if (!super.currentUser.hasServicePrivilege(service)) {
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
+            model.addAttribute("success", false);
+            model.addAttribute("redirect", "../../applications");
+            return "governance/screen/redirect";
+        }
+        List<Override> overrides = overrideService.findByService(service);
+        Override allOverride = null;
+        if (overrides != null && overrides.size() > 0) {
+            for (Override override : overrides) {
+                if (override.isDefault()) {
+                    allOverride = override;
+                    break;
+                }
+            }
+        }
+        if (allOverride != null) {
+            Map<String, String> map = StringUtils.parseQueryString(allOverride.getParams());
+            if (mock == null || mock.length() == 0) {
+                map.remove("mock");
+            } else {
+                map.put("mock", URL.encode(mock));
+            }
+            if (map.size() > 0) {
+                allOverride.setParams(StringUtils.toQueryString(map));
+                allOverride.setEnabled(true);
+                allOverride.setOperator(operator);
+                allOverride.setOperatorAddress(operatorAddress);
+                overrideService.updateOverride(allOverride);
+            } else {
+                overrideService.deleteOverride(allOverride.getId());
+            }
+        } else if (mock != null && mock.length() > 0) {
+            Override override = new Override();
+            override.setService(service);
+            override.setParams("mock=" + URL.encode(mock));
+            override.setEnabled(true);
+            override.setOperator(operator);
+            override.setOperatorAddress(operatorAddress);
+            overrideService.saveOverride(override);
+        }
+        model.addAttribute("success", false);
+        model.addAttribute("redirect", "../../applications");
+        return "governance/screen/redirect";
+    }
+
+}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Consumers.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ConsumersController.java
similarity index 50%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Consumers.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ConsumersController.java
index d23a714..7fa1675 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Consumers.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ConsumersController.java
@@ -14,26 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.governance.module.screen;
-
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.ConsumerService;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.service.RouteService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Consumer;
-import com.alibaba.dubbo.registry.common.domain.Override;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-import com.alibaba.dubbo.registry.common.domain.Route;
-import com.alibaba.dubbo.registry.common.route.OverrideUtils;
-import com.alibaba.dubbo.registry.common.route.RouteRule;
-import com.alibaba.dubbo.registry.common.route.RouteRule.MatchPair;
-import com.alibaba.dubbo.registry.common.route.RouteUtils;
-import com.alibaba.dubbo.registry.common.util.Tool;
-
-import org.springframework.beans.factory.annotation.Autowired;
+package com.alibaba.dubboadmin.web.mvc.governance;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -42,11 +23,43 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
+import com.alibaba.dubboadmin.governance.service.OverrideService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.governance.service.RouteService;
+import com.alibaba.dubboadmin.registry.common.domain.Consumer;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.registry.common.domain.Route;
+import com.alibaba.dubboadmin.registry.common.route.OverrideUtils;
+import com.alibaba.dubboadmin.registry.common.route.RouteRule;
+import com.alibaba.dubboadmin.registry.common.route.RouteRule.MatchPair;
+import com.alibaba.dubboadmin.registry.common.route.RouteUtils;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+import com.alibaba.dubboadmin.web.pulltool.Tool;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.support.BindingAwareModelMap;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
 /**
- * Consumers. URI: /services/$service/consumers
+ * ConsumersController. URI: /services/$service/consumers
  *
  */
-public class Consumers extends Restful {
+@Controller
+@RequestMapping("/governance/consumers")
+public class ConsumersController extends BaseController {
 
     @Autowired
     private ProviderService providerService;
@@ -60,14 +73,18 @@
     @Autowired
     private RouteService routeService;
 
-    public void index(Map<String, Object> context) throws Exception {
-        String service = (String) context.get("service");
-        String application = (String) context.get("application");
-        String address = (String) context.get("address");
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response,
+                      Model model) {
+        prepare(request, response, model, "index", "consumers");
         List<Consumer> consumers;
         List<Override> overrides;
         List<Provider> providers = null;
         List<Route> routes = null;
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String)newModel.get("service");
+        String address = (String)newModel.get("address");
+        String application = (String)newModel.get("app");
         // service
         if (service != null && service.length() > 0) {
             consumers = consumerService.findByService(service);
@@ -97,15 +114,20 @@ else if (application != null && application.length() > 0) {
                     routes = routeService.findByService(consumer.getService());
                 }
                 List<Route> routed = new ArrayList<Route>();
-                consumer.setProviders(RouteUtils.route(consumer.getService(), consumer.getAddress(), consumer.getParameters(), providers, overrides, routes, null, routed));
+                consumer.setProviders(RouteUtils
+                    .route(consumer.getService(), consumer.getAddress(), consumer.getParameters(), providers, overrides, routes, null, routed));
                 consumer.setRoutes(routed);
                 OverrideUtils.setConsumerOverrides(consumer, overrides);
             }
         }
-        context.put("consumers", consumers);
+        model.addAttribute("consumers", consumers);
+        return "governance/screen/consumers/index";
     }
 
-    public void show(Long id, Map<String, Object> context) {
+    @RequestMapping("/{id}")
+    public String show(@PathVariable("id") Long id,
+                       HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "show", "consumers");
         Consumer consumer = consumerService.findConsumer(id);
         List<Provider> providers = providerService.findByService(consumer.getService());
         List<Route> routes = routeService.findByService(consumer.getService());
@@ -114,28 +136,52 @@ public void show(Long id, Map<String, Object> context) {
         consumer.setProviders(RouteUtils.route(consumer.getService(), consumer.getAddress(), consumer.getParameters(), providers, overrides, routes, null, routed));
         consumer.setRoutes(routed);
         OverrideUtils.setConsumerOverrides(consumer, overrides);
-        context.put("consumer", consumer);
-        context.put("providers", consumer.getProviders());
-        context.put("routes", consumer.getRoutes());
-        context.put("overrides", consumer.getOverrides());
+        model.addAttribute("consumer", consumer);
+        model.addAttribute("providers", consumer.getProviders());
+        model.addAttribute("routes", consumer.getRoutes());
+        model.addAttribute("overrides", consumer.getOverrides());
+        return "governance/screen/consumers/show";
     }
 
-    public void edit(Long id, Map<String, Object> context) {
-        show(id, context);
+    @RequestMapping("/{id}/edit")
+    public String edit(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response,  Model model) {
+        prepare(request, response, model, "edit", "consumers");
+        Consumer consumer = consumerService.findConsumer(id);
+        List<Provider> providers = providerService.findByService(consumer.getService());
+        List<Route> routes = routeService.findByService(consumer.getService());
+        List<Override> overrides = overrideService.findByService(consumer.getService());
+        List<Route> routed = new ArrayList<Route>();
+        consumer.setProviders(RouteUtils.route(consumer.getService(), consumer.getAddress(), consumer.getParameters(), providers, overrides, routes, null, routed));
+        consumer.setRoutes(routed);
+        OverrideUtils.setConsumerOverrides(consumer, overrides);
+        model.addAttribute("consumer", consumer);
+        model.addAttribute("providers", consumer.getProviders());
+        model.addAttribute("routes", consumer.getRoutes());
+        model.addAttribute("overrides", consumer.getOverrides());
+        return "governance/screen/consumers/edit";
     }
 
-    public boolean update(Consumer newConsumer, Map<String, Object> context) {
+    @RequestMapping(value = "/update", method = RequestMethod.POST) //post
+    public String update(@ModelAttribute Consumer newConsumer, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "update", "consumers");
+        boolean success = true;
         Long id = newConsumer.getId();
         String parameters = newConsumer.getParameters();
         Consumer consumer = consumerService.findConsumer(id);
         if (consumer == null) {
-            context.put("message", getMessage("NoSuchOperationData", id));
-            return false;
+            model.addAttribute("message", getMessage("NoSuchOperationData", id));
+            success = false;
+            model.addAttribute("success", success);
+            model.addAttribute("redirect", "governance/consumers");
+            return "governance/screen/redirect";
         }
         String service = consumer.getService();
         if (!super.currentUser.hasServicePrivilege(service)) {
-            context.put("message", getMessage("HaveNoServicePrivilege", service));
-            return false;
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
+            success = false;
+            model.addAttribute("success", success);
+            model.addAttribute("redirect", "governance/consumers");
+            return "governance/screen/redirect";
         }
         Map<String, String> oldMap = StringUtils.parseQueryString(consumer.getParameters());
         Map<String, String> newMap = StringUtils.parseQueryString(parameters);
@@ -168,37 +214,57 @@ public boolean update(Consumer newConsumer, Map<String, Object> context) {
             override.setOperatorAddress(operatorAddress);
             overrideService.saveOverride(override);
         }
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "governance/consumers");
+        return "governance/screen/redirect";
     }
 
-    public void routed(Long id, Map<String, Object> context) {
-        show(id, context);
+    @RequestMapping("/{id}/routed")
+    public String routed(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "routed", "consumers");
+        showDetail(id, request, response, model);
+        return "governance/screen/consumers/routed";
     }
 
-    public void notified(Long id, Map<String, Object> context) {
-        show(id, context);
+    @RequestMapping("/{id}/notified")
+    public String notified(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "notified", "consumers");
+        showDetail(id, request, response, model);
+        return "governance/screen/consumers/notified";
     }
 
-    public void overrided(Long id, Map<String, Object> context) {
-        show(id, context);
+    @RequestMapping("/{id}/overrided")
+    public String overrided(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "overrided", "consumers");
+        showDetail(id, request, response, model);
+        return "governance/screen/consumers/overrided";
     }
 
-    public boolean shield(Long[] ids, Map<String, Object> context) throws Exception {
-        return mock(ids, context, "force:return null");
+    @RequestMapping("/{ids}/shield")
+    public String shield(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return mock(ids, "force:return null", "shield", request, response, model);
     }
 
-    public boolean tolerant(Long[] ids, Map<String, Object> context) throws Exception {
-        return mock(ids, context, "fail:return null");
+    @RequestMapping("/{ids}/tolerant")
+    public String tolerant(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return mock(ids, "fail:return null", "tolerant", request, response, model);
     }
 
-    public boolean recover(Long[] ids, Map<String, Object> context) throws Exception {
-        return mock(ids, context, "");
+    @RequestMapping("/{ids}/recover")
+    public String recover(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return mock(ids,  "", "recover", request, response, model);
     }
 
-    private boolean mock(Long[] ids, Map<String, Object> context, String mock) throws Exception {
+    private String mock(Long[] ids, String mock, String methodName, HttpServletRequest request,
+                         HttpServletResponse response, Model model) throws Exception {
+        prepare(request, response, model, methodName, "consumers");
+        boolean success = true;
         if (ids == null || ids.length == 0) {
-            context.put("message", getMessage("NoSuchOperationData"));
-            return false;
+            model.addAttribute("message", getMessage("NoSuchOperationData"));
+            success = false;
+            model.addAttribute("success", success);
+            model.addAttribute("redirect", "../../consumers");
+            return "governance/screen/redirect";
         }
         List<Consumer> consumers = new ArrayList<Consumer>();
         for (Long id : ids) {
@@ -206,8 +272,11 @@ private boolean mock(Long[] ids, Map<String, Object> context, String mock) throw
             if (c != null) {
                 consumers.add(c);
                 if (!super.currentUser.hasServicePrivilege(c.getService())) {
-                    context.put("message", getMessage("HaveNoServicePrivilege", c.getService()));
-                    return false;
+                    model.addAttribute("message", getMessage("HaveNoServicePrivilege", c.getService()));
+                    success = false;
+                    model.addAttribute("success", success);
+                    model.addAttribute("redirect", "../../consumers");
+                    return "governance/screen/redirect";
                 }
             }
         }
@@ -244,30 +313,61 @@ private boolean mock(Long[] ids, Map<String, Object> context, String mock) throw
                 overrideService.saveOverride(override);
             }
         }
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../consumers");
+        return "governance/screen/redirect";
+    }
+
+    private void showDetail( Long id,
+                             HttpServletRequest request, HttpServletResponse response, Model model) {
+        Consumer consumer = consumerService.findConsumer(id);
+        List<Provider> providers = providerService.findByService(consumer.getService());
+        List<Route> routes = routeService.findByService(consumer.getService());
+        List<Override> overrides = overrideService.findByService(consumer.getService());
+        List<Route> routed = new ArrayList<Route>();
+        consumer.setProviders(RouteUtils.route(consumer.getService(), consumer.getAddress(), consumer.getParameters(), providers, overrides, routes, null, routed));
+        consumer.setRoutes(routed);
+        OverrideUtils.setConsumerOverrides(consumer, overrides);
+        model.addAttribute("consumer", consumer);
+        model.addAttribute("providers", consumer.getProviders());
+        model.addAttribute("routes", consumer.getRoutes());
+        model.addAttribute("overrides", consumer.getOverrides());
     }
 
-    public boolean allshield(Map<String, Object> context) throws Exception {
-        return allmock(context, "force:return null");
+    @RequestMapping("/allshield")
+    public String allshield(@RequestParam(required = false) String service, HttpServletRequest request,
+                                                   HttpServletResponse response, Model model) throws Exception {
+        return allmock(service,  "force:return null", "allshield",request, response, model);
     }
 
-    public boolean alltolerant(Map<String, Object> context) throws Exception {
-        return allmock(context, "fail:return null");
+    @RequestMapping("/alltolerant")
+    public String alltolerant(@RequestParam(required = false) String service, HttpServletRequest request,
+                               HttpServletResponse response, Model model) throws Exception {
+        return allmock(service, "fail:return null", "alltolerant", request, response, model);
     }
 
-    public boolean allrecover(Map<String, Object> context) throws Exception {
-        return allmock(context, "");
+    @RequestMapping("/allrecover")
+    public String allrecover(@RequestParam(required = false) String service, HttpServletRequest request,
+                              HttpServletResponse response, Model model) throws Exception {
+        return allmock(service, "", "allrecover", request, response, model);
     }
 
-    private boolean allmock(Map<String, Object> context, String mock) throws Exception {
-        String service = (String) context.get("service");
+    private String allmock(String service, String mock, String methodName, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        prepare(request, response, model, methodName,"consumers");
+        boolean success = true;
         if (service == null || service.length() == 0) {
-            context.put("message", getMessage("NoSuchOperationData"));
-            return false;
+            model.addAttribute("message", getMessage("NoSuchOperationData"));
+            success = false;
+            model.addAttribute("success", success);
+            model.addAttribute("redirect", "../consumers");
+            return "governance/screen/redirect";
         }
         if (!super.currentUser.hasServicePrivilege(service)) {
-            context.put("message", getMessage("HaveNoServicePrivilege", service));
-            return false;
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
+            success = false;
+            model.addAttribute("success", success);
+            model.addAttribute("redirect", "../consumers");
+            return "governance/screen/redirect";
         }
         List<Override> overrides = overrideService.findByService(service);
         Override allOverride = null;
@@ -304,29 +404,41 @@ private boolean allmock(Map<String, Object> context, String mock) throws Excepti
             override.setOperatorAddress(operatorAddress);
             overrideService.saveOverride(override);
         }
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../consumers");
+        return "governance/screen/redirect";
     }
 
-    public boolean allow(Long[] ids, Map<String, Object> context) throws Exception {
-        return access(ids, context, true, false);
+    @RequestMapping("/{ids}/allow")
+    public String allow(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return access(request, response, ids, model, true, false, "allow");
     }
 
-    public boolean forbid(Long[] ids, Map<String, Object> context) throws Exception {
-        return access(ids, context, false, false);
+    @RequestMapping("/{ids}/forbid")
+    public String forbid(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return access(request, response, ids, model, false, false, "forbid");
     }
 
-    public boolean onlyallow(Long[] ids, Map<String, Object> context) throws Exception {
-        return access(ids, context, true, true);
+    @RequestMapping("/{ids}/onlyallow")
+    public String onlyallow(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return access(request, response, ids, model, true, true, "onlyallow");
     }
 
-    public boolean onlyforbid(Long[] ids, Map<String, Object> context) throws Exception {
-        return access(ids, context, false, true);
+    @RequestMapping("/{ids}/onlyforbid")
+    public String onlyforbid(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return access(request, response, ids, model, false, true, "onlyforbid");
     }
 
-    private boolean access(Long[] ids, Map<String, Object> context, boolean allow, boolean only) throws Exception {
+    private String access(HttpServletRequest request, HttpServletResponse response, Long[] ids,
+                           Model model, boolean allow, boolean only, String methodName) throws Exception {
+        prepare(request, response, model, methodName, "consumers");
+        boolean success = true;
         if (ids == null || ids.length == 0) {
-            context.put("message", getMessage("NoSuchOperationData"));
-            return false;
+            model.addAttribute("message", getMessage("NoSuchOperationData"));
+            success = false;
+            model.addAttribute("success", success);
+            model.addAttribute("redirect", "../../consumers");
+            return "governance/screen/redirect";
         }
         List<Consumer> consumers = new ArrayList<Consumer>();
         for (Long id : ids) {
@@ -334,8 +446,11 @@ private boolean access(Long[] ids, Map<String, Object> context, boolean allow, b
             if (c != null) {
                 consumers.add(c);
                 if (!super.currentUser.hasServicePrivilege(c.getService())) {
-                    context.put("message", getMessage("HaveNoServicePrivilege", c.getService()));
-                    return false;
+                    model.addAttribute("message", getMessage("HaveNoServicePrivilege", c.getService()));
+                    success = false;
+                    model.addAttribute("success", success);
+                    model.addAttribute("redirect", "../../consumers");
+                    return "governance/screen/redirect";
                 }
             }
         }
@@ -416,6 +531,8 @@ private boolean access(Long[] ids, Map<String, Object> context, boolean allow, b
                 routeService.deleteRoute(route.getId());
             }
         }
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../consumers");
+        return "governance/screen/redirect";
     }
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/LoadbalancesController.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/LoadbalancesController.java
new file mode 100644
index 0000000..7b19aa8
--- /dev/null
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/LoadbalancesController.java
@@ -0,0 +1,191 @@
+/*
+ * 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 com.alibaba.dubboadmin.web.mvc.governance;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.utils.CollectionUtils;
+import com.alibaba.dubboadmin.governance.service.OverrideService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.LoadBalance;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.registry.common.util.OverrideUtils;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+import com.alibaba.dubboadmin.web.pulltool.Tool;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.support.BindingAwareModelMap;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * ProvidersController.
+ * URI: /services/$service/loadbalances
+ *
+ */
+@Controller
+@RequestMapping("/governance/loadbalances")
+public class LoadbalancesController extends BaseController {
+
+    @Autowired
+    private OverrideService overrideService;
+
+    @Autowired
+    private ProviderService providerService;
+
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "index", "loadbalances");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String)newModel.get("service");
+        service = StringUtils.trimToNull(service);
+
+        List<LoadBalance> loadbalances;
+        if (service != null && service.length() > 0) {
+            loadbalances = OverrideUtils.overridesToLoadBalances(overrideService.findByService(service));
+        } else {
+            loadbalances = OverrideUtils.overridesToLoadBalances(overrideService.findAll());
+        }
+        model.addAttribute("loadbalances", loadbalances);
+        return "governance/screen/loadbalances/index";
+    }
+
+    @RequestMapping("/{id}")
+    public String show(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "show", "loadbalances");
+        LoadBalance loadbalance = OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
+        model.addAttribute("loadbalance", loadbalance);
+        return "governance/screen/loadbalances/show";
+    }
+
+    @RequestMapping("/add")
+    public String add(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "add", "loadbalances");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String)newModel.get("service");
+
+        if (service != null && service.length() > 0 && !service.contains("*")) {
+            List<Provider> providerList = providerService.findByService(service);
+            List<String> addressList = new ArrayList<String>();
+            for (Provider provider : providerList) {
+                addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
+            }
+            model.addAttribute("addressList", addressList);
+            model.addAttribute("service", service);
+            model.addAttribute("methods", CollectionUtils.sort(providerService.findMethodsByService(service)));
+        } else {
+            List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
+            model.addAttribute("serviceList", serviceList);
+        }
+        //if (input != null) model.addAttribute("input", input);
+        return "governance/screen/loadbalances/add";
+    }
+
+    @RequestMapping("/{id}/edit")
+    public String edit(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "edit", "loadbalances");
+        String service = request.getParameter("service");
+        String input = request.getParameter("input");
+
+        if (service != null && service.length() > 0 && !service.contains("*")) {
+            List<Provider> providerList = providerService.findByService(service);
+            List<String> addressList = new ArrayList<String>();
+            for (Provider provider : providerList) {
+                addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
+            }
+            model.addAttribute("addressList", addressList);
+            model.addAttribute("service", service);
+            model.addAttribute("methods", CollectionUtils.sort(providerService.findMethodsByService(service)));
+        } else {
+            List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
+            model.addAttribute("serviceList", serviceList);
+        }
+        if (input != null) model.addAttribute("input", input);
+        LoadBalance loadbalance = OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
+        model.addAttribute("loadbalance", loadbalance);
+        return "governance/screen/loadbalances/edit";
+    }
+
+    @RequestMapping("/create")
+    public String create(LoadBalance loadBalance, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "create", "loadbalances");
+        boolean success = true;
+        if (!super.currentUser.hasServicePrivilege(loadBalance.getService())) {
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", loadBalance.getService()));
+            success = false;
+        } else {
+            loadBalance.setUsername((String) ((BindingAwareModelMap)model).get("operator"));
+            overrideService.saveOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
+        }
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../loadbalances");
+        return "governance/screen/redirect";
+    }
+
+
+    @RequestMapping("/update")
+    public String update(LoadBalance loadBalance, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "update", "loadbalances");
+        boolean success = true;
+        if (!super.currentUser.hasServicePrivilege(loadBalance.getService())) {
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", loadBalance.getService()));
+            success = false;
+        } else {
+            overrideService.updateOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
+        }
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../loadbalances");
+        return "governance/screen/redirect";
+
+    }
+
+    /**
+     *
+     * @param ids
+     * @return
+     */
+    @RequestMapping("/{ids}/delete")
+    public String delete(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "delete", "loadbalances");
+        boolean success = true;
+        for (Long id : ids) {
+            LoadBalance lb = OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
+            if (!super.currentUser.hasServicePrivilege(lb.getService())) {
+                model.addAttribute("message", getMessage("HaveNoServicePrivilege", lb.getService()));
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../loadbalances");
+                return "governance/screen/redirect";
+            }
+        }
+
+        for (Long id : ids) {
+            overrideService.deleteOverride(id);
+        }
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../loadbalances");
+        return "governance/screen/redirect";
+    }
+
+}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/NoServicePrivilege.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/NoServicePrivilegeController.java
similarity index 65%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/NoServicePrivilege.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/NoServicePrivilegeController.java
index 55fc41b..f2a252d 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/NoServicePrivilege.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/NoServicePrivilegeController.java
@@ -14,24 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.governance.module.screen;
-
-import com.alibaba.citrus.turbine.Context;
-
-import org.springframework.beans.factory.annotation.Autowired;
+package com.alibaba.dubboadmin.web.mvc.governance;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
 
 /**
- * TODO Comment of NoServicePrivilege
+ * TODO Comment of NoServicePrivilegeController
  *
  */
-public class NoServicePrivilege {
+@Controller
+public class NoServicePrivilegeController {
 
-    @Autowired
-    private HttpServletRequest request;
 
-    public void execute(Context context) {
-        context.put("returnUrl", request.getParameter("returnUrl"));
+    public void execute(HttpServletRequest request, HttpServletResponse response, Model model) {
+        model.addAttribute("returnUrl", request.getParameter("returnUrl"));
     }
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Overrides.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/OverridesController.java
similarity index 56%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Overrides.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/OverridesController.java
index d57a81a..da7ead3 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Overrides.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/OverridesController.java
@@ -14,18 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.governance.module.screen;
-
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.common.utils.CollectionUtils;
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.ConsumerService;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Override;
-
-import org.springframework.beans.factory.annotation.Autowired;
+package com.alibaba.dubboadmin.web.mvc.governance;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -33,10 +22,32 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class Overrides extends Restful {
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubbo.common.utils.CollectionUtils;
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
+import com.alibaba.dubboadmin.governance.service.OverrideService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.support.BindingAwareModelMap;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/governance/overrides")
+public class OverridesController extends BaseController {
     static final Pattern AND = Pattern.compile("\\&");
     static final Pattern EQUAL = Pattern.compile("([^=\\s]*)\\s*=\\s*(\\S*)");
     static final String DEFAULT_MOCK_JSON_KEY = "mock";
@@ -75,10 +86,13 @@
         return ret;
     }
 
-    public void index(Map<String, Object> context) {
-        String service = (String) context.get("service");
-        String application = (String) context.get("application");
-        String address = (String) context.get("address");
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "index", "overrides");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String)newModel.get("service");
+        String application = (String)newModel.get("app");
+        String address = (String)newModel.get("address");
         List<Override> overrides;
         if (StringUtils.isNotEmpty(service)) {
             overrides = overrideService.findByService(service);
@@ -89,10 +103,14 @@ public void index(Map<String, Object> context) {
         } else {
             overrides = overrideService.findAll();
         }
-        context.put("overrides", overrides);
+        model.addAttribute("overrides", overrides);
+        return "governance/screen/overrides/index";
     }
 
-    public void show(Long id, Map<String, Object> context) {
+    @RequestMapping("/{id}")
+    public String show(@PathVariable Long id, HttpServletRequest request, HttpServletResponse response,
+                     Model model) {
+        prepare(request, response, model, "show", "overrides");
         Override override = overrideService.findById(id);
 
         Map<String, String> parameters = parseQueryString(override.getParams());
@@ -100,15 +118,15 @@ public void show(Long id, Map<String, Object> context) {
         if (parameters.get(DEFAULT_MOCK_JSON_KEY) != null) {
             String mock = URL.decode(parameters.get(DEFAULT_MOCK_JSON_KEY));
             String[] tokens = parseMock(mock);
-            context.put(FORM_DEFAULT_MOCK_METHOD_FORCE, tokens[0]);
-            context.put(FORM_DEFAULT_MOCK_METHOD_JSON, tokens[1]);
+            model.addAttribute(FORM_DEFAULT_MOCK_METHOD_FORCE, tokens[0]);
+            model.addAttribute(FORM_DEFAULT_MOCK_METHOD_JSON, tokens[1]);
             parameters.remove(DEFAULT_MOCK_JSON_KEY);
         }
 
         Map<String, String> method2Force = new LinkedHashMap<String, String>();
         Map<String, String> method2Json = new LinkedHashMap<String, String>();
 
-        for (Iterator<Map.Entry<String, String>> iterator = parameters.entrySet().iterator(); iterator.hasNext(); ) {
+        for (Iterator<Entry<String, String>> iterator = parameters.entrySet().iterator(); iterator.hasNext(); ) {
             Map.Entry<String, String> e = iterator.next();
             String key = e.getKey();
 
@@ -119,39 +137,47 @@ public void show(Long id, Map<String, Object> context) {
             }
         }
 
-        context.put("methodForces", method2Force);
-        context.put("methodJsons", method2Json);
-        context.put("parameters", parameters);
-        context.put("override", override);
+        model.addAttribute("methodForces", method2Force);
+        model.addAttribute("methodJsons", method2Json);
+        model.addAttribute("parameters", parameters);
+        model.addAttribute("override", override);
+        return "governance/screen/overrides/show";
     }
 
-    public void add(Map<String, Object> context) {
+    @RequestMapping("/add")
+    public String add(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model,"add", "overrides");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String application = (String)newModel.get("app");
+        String service = (String)newModel.get("service");
         List<String> serviceList = new ArrayList<String>();
         List<String> applicationList = new ArrayList<String>();
-        String service = (String) context.get("service");
-        String application = (String) context.get("application");
         if (StringUtils.isNotEmpty(application)) {
             serviceList.addAll(providerService.findServicesByApplication(application));
             serviceList.addAll(consumerService.findServicesByApplication(application));
-            context.put("serviceList", serviceList);
+            model.addAttribute("serviceList", serviceList);
         } else if (StringUtils.isNotEmpty(service)) {
             applicationList.addAll(providerService.findApplicationsByServiceName(service));
             applicationList.addAll(consumerService.findApplicationsByServiceName(service));
-            context.put("applicationList", applicationList);
+            model.addAttribute("applicationList", applicationList);
         } else {
             serviceList.addAll(providerService.findServices());
             serviceList.addAll(consumerService.findServices());
             providerService.findServicesByApplication(application);
             consumerService.findServicesByApplication(application);
         }
-        context.put("serviceList", serviceList);
+        model.addAttribute("serviceList", serviceList);
 
         if (StringUtils.isNotEmpty(service) && !service.contains("*")) {
-            context.put("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(service))));
+            model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(service))));
         }
+        return "governance/screen/overrides/add";
     }
 
-    public void edit(Long id, Map<String, Object> context) {
+    @RequestMapping("/{id}/edit")
+    public String edit(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response,
+                     Model model) {
+        prepare(request, response, model, "edit", "overrides");
         Override override = overrideService.findById(id);
 
         Map<String, String> parameters = parseQueryString(override.getParams());
@@ -159,8 +185,8 @@ public void edit(Long id, Map<String, Object> context) {
         if (parameters.get(DEFAULT_MOCK_JSON_KEY) != null) {
             String mock = URL.decode(parameters.get(DEFAULT_MOCK_JSON_KEY));
             String[] tokens = parseMock(mock);
-            context.put(FORM_DEFAULT_MOCK_METHOD_FORCE, tokens[0]);
-            context.put(FORM_DEFAULT_MOCK_METHOD_JSON, tokens[1]);
+            model.addAttribute(FORM_DEFAULT_MOCK_METHOD_FORCE, tokens[0]);
+            model.addAttribute(FORM_DEFAULT_MOCK_METHOD_JSON, tokens[1]);
             parameters.remove(DEFAULT_MOCK_JSON_KEY);
         }
 
@@ -174,7 +200,7 @@ public void edit(Long id, Map<String, Object> context) {
                 parameters.remove(m + MOCK_JSON_KEY_POSTFIX);
             }
         }
-        for (Iterator<Map.Entry<String, String>> iterator = parameters.entrySet().iterator(); iterator.hasNext(); ) {
+        for (Iterator<Entry<String, String>> iterator = parameters.entrySet().iterator(); iterator.hasNext(); ) {
             Map.Entry<String, String> e = iterator.next();
             String key = e.getKey();
 
@@ -185,11 +211,12 @@ public void edit(Long id, Map<String, Object> context) {
             }
         }
 
-        context.put("methods", methods);
-        context.put("methodForces", method2Force);
-        context.put("methodJsons", method2Json);
-        context.put("parameters", parameters);
-        context.put("override", override);
+        model.addAttribute("methods", methods);
+        model.addAttribute("methodForces", method2Force);
+        model.addAttribute("methodJsons", method2Json);
+        model.addAttribute("parameters", parameters);
+        model.addAttribute("override", override);
+        return "governance/screen/overrides/edit";
     }
 
     private void parseMock(String m, String mock, Map<String, String> method2Force, Map<String, String> method2Json) {
@@ -216,32 +243,33 @@ private void parseMock(String m, String mock, Map<String, String> method2Force,
         return tokens;
     }
 
-    boolean catchParams(Override override, Map<String, Object> context) {
-        String service = (String) context.get("service");
+    boolean catchParams(Override override, HttpServletRequest request, Model model) {
+        Map<String, String[]> map = request.getParameterMap();
+        String service = map.get("service")[0];
         if (service == null || service.trim().length() == 0) {
-            context.put("message", getMessage("service is blank!"));
+            model.addAttribute("message", getMessage("service is blank!"));
             return false;
         }
         if (!super.currentUser.hasServicePrivilege(service)) {
-            context.put("message", getMessage("HaveNoServicePrivilege", service));
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
             return false;
         }
 
-        String defaultMockMethodForce = (String) context.get(FORM_DEFAULT_MOCK_METHOD_FORCE);
-        String defaultMockMethodJson = (String) context.get(FORM_DEFAULT_MOCK_METHOD_JSON);
+        String defaultMockMethodForce = map.get(FORM_DEFAULT_MOCK_METHOD_FORCE)[0];
+        String defaultMockMethodJson = map.get(FORM_DEFAULT_MOCK_METHOD_JSON)[0];
 
         Map<String, String> override2Value = new HashMap<String, String>();
         Map<String, String> method2Json = new HashMap<String, String>();
 
-        for (Map.Entry<String, Object> param : context.entrySet()) {
+        for (Map.Entry<String, String[]> param : map.entrySet()) {
             String key = param.getKey().trim();
-            if (!(param.getValue() instanceof String)) continue;
+            if(param.getValue().length != 1) continue;;
 
-            String value = (String) param.getValue();
+            String value = param.getValue()[0];
 
             if (key.startsWith(FORM_OVERRIDE_KEY) && value != null && value.trim().length() > 0) {
                 String index = key.substring(FORM_OVERRIDE_KEY.length());
-                String overrideValue = (String) context.get(FORM_OVERRIDE_VALUE + index);
+                String overrideValue = map.get(FORM_OVERRIDE_VALUE + index)[0];
                 if (overrideValue != null && overrideValue.trim().length() > 0) {
                     override2Value.put(value.trim(), overrideValue.trim());
                 }
@@ -249,14 +277,14 @@ boolean catchParams(Override override, Map<String, Object> context) {
 
             if (key.startsWith(FORM_ORIGINAL_METHOD_PREFIX) && value != null && value.trim().length() > 0) {
                 String method = key.substring(FORM_ORIGINAL_METHOD_PREFIX.length());
-                String force = (String) context.get(FORM_ORIGINAL_METHOD_FORCE_PREFIX + method);
+                String force = map.get(FORM_ORIGINAL_METHOD_FORCE_PREFIX + method)[0];
                 method2Json.put(method, force + ":" + value.trim());
             }
 
             if (key.startsWith(FORM_DYNAMIC_METHOD_NAME_PREFIX) && value != null && value.trim().length() > 0) {
                 String index = key.substring(FORM_DYNAMIC_METHOD_NAME_PREFIX.length());
-                String force = (String) context.get(FORM_DYNAMIC_METHOD_FORCE_PREFIX + index);
-                String json = (String) context.get(FORM_DYNAMIC_METHOD_JSON_PREFIX + index);
+                String force = map.get(FORM_DYNAMIC_METHOD_FORCE_PREFIX + index)[0];
+                String json =  map.get(FORM_DYNAMIC_METHOD_JSON_PREFIX + index)[0];
 
                 if (json != null && json.trim().length() > 0) {
                     method2Json.put(value.trim(), force + ":" + json.trim());
@@ -285,7 +313,7 @@ boolean catchParams(Override override, Map<String, Object> context) {
 
         String p = paramters.toString();
         if (p.trim().length() == 0) {
-            context.put("message", getMessage("Please enter Parameters!"));
+            model.addAttribute("message", getMessage("Please enter Parameters!"));
             return false;
         }
 
@@ -293,44 +321,78 @@ boolean catchParams(Override override, Map<String, Object> context) {
         return true;
     }
 
-    public boolean create(Override override, Map<String, Object> context) {
-        if (!catchParams(override, context)) return false;
 
-        overrideService.saveOverride(override);
-        return true;
+    @RequestMapping("/create")
+    public String create(Override override, HttpServletRequest request,
+                         HttpServletResponse response, Model model) {
+        prepare(request,response,model,"update", "overrides");
+        boolean success = true;
+        if (!catchParams(override, request, model)) {
+            success =false;
+        } else {
+            overrideService.saveOverride(override);
+        }
+
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../overrides");
+        return "governance/screen/redirect";
     }
 
-    public boolean update(Override override, Map<String, Object> context) {
+    @RequestMapping("/update")
+    public String update(Override override, HttpServletRequest request,
+                         HttpServletResponse response, Model model) {
+        prepare(request, response, model, "update", "overrides");
+        boolean  succcess = true;
         Override o = overrideService.findById(override.getId());
         override.setService(o.getService());
         override.setAddress(o.getAddress());
         override.setApplication(o.getApplication());
 
-        if (!catchParams(override, context)) return false;
+        if (!catchParams(override, request, model)) {
+            succcess = false;
+        } else {
+            overrideService.updateOverride(override);
+        }
 
-        overrideService.updateOverride(override);
+        model.addAttribute("success", succcess);
+        model.addAttribute("redirect", "../overrides");
+        return "governance/screen/redirect";
 
-        return true;
     }
 
-    public boolean delete(Long[] ids, Map<String, Object> context) {
+    @RequestMapping("/{ids}/delete")
+    public String delete(@PathVariable("ids") Long[] ids, HttpServletRequest request,
+                              HttpServletResponse response, Model model) {
+        prepare(request, response, model, "delete", "overrides");
         for (Long id : ids) {
             overrideService.deleteOverride(id);
         }
 
-        return true;
+        model.addAttribute("success", true);
+        model.addAttribute("redirect", "../../overrides");
+        return "governance/screen/redirect";
     }
 
-    public boolean enable(Long[] ids, Map<String, Object> context) {
+    @RequestMapping("/{ids}/enable")
+    public String enable(@PathVariable("ids") Long[] ids, HttpServletRequest request,
+                          HttpServletResponse response, Model model) {
+        prepare(request, response, model, "enable", "overrides");
+        boolean success = true;
         for (Long id : ids) {
             Override override = overrideService.findById(id);
             if (override == null) {
-                context.put("message", getMessage("NoSuchOperationData", id));
-                return false;
+                model.addAttribute("message", getMessage("NoSuchOperationData", id));
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../overrides");
+                return "governance/screen/redirect";
             } else {
                 if (!super.currentUser.hasServicePrivilege(override.getService())) {
-                    context.put("message", getMessage("HaveNoServicePrivilege", override.getService()));
-                    return false;
+                    model.addAttribute("message", getMessage("HaveNoServicePrivilege", override.getService()));
+                    success = false;
+                    model.addAttribute("success", success);
+                    model.addAttribute("redirect", "../../overrides");
+                    return "governance/screen/redirect";
                 }
             }
         }
@@ -339,19 +401,31 @@ public boolean enable(Long[] ids, Map<String, Object> context) {
             overrideService.enableOverride(id);
         }
 
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../overrides");
+        return "governance/screen/redirect";
     }
 
-    public boolean disable(Long[] ids, Map<String, Object> context) {
+    @RequestMapping("/{ids}/disable")
+    public String disable(@PathVariable("ids") Long[] ids, HttpServletRequest request,
+                           HttpServletResponse response, Model model) {
+        prepare(request, response, model, "disable", "overrides");
+        boolean success = true;
         for (Long id : ids) {
             Override override = overrideService.findById(id);
             if (override == null) {
-                context.put("message", getMessage("NoSuchOperationData", id));
-                return false;
+                model.addAttribute("message", getMessage("NoSuchOperationData", id));
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../overrides");
+                return "governance/screen/redirect";
             } else {
                 if (!super.currentUser.hasServicePrivilege(override.getService())) {
-                    context.put("message", getMessage("HaveNoServicePrivilege", override.getService()));
-                    return false;
+                    model.addAttribute("message", getMessage("HaveNoServicePrivilege", override.getService()));
+                    success = false;
+                    model.addAttribute("success", success);
+                    model.addAttribute("redirect", "../../overrides");
+                    return "governance/screen/redirect";
                 }
             }
         }
@@ -359,8 +433,9 @@ public boolean disable(Long[] ids, Map<String, Object> context) {
         for (Long id : ids) {
             overrideService.disableOverride(id);
         }
-
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../overrides");
+        return "governance/screen/redirect";
     }
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/OwnersController.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/OwnersController.java
new file mode 100644
index 0000000..0bd75a0
--- /dev/null
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/OwnersController.java
@@ -0,0 +1,132 @@
+/*
+ * 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 com.alibaba.dubboadmin.web.mvc.governance;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubboadmin.governance.service.OwnerService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Owner;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+import com.alibaba.dubboadmin.web.pulltool.Tool;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.support.BindingAwareModelMap;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * ProvidersController. URI: /services/$service/owners
+ *
+ */
+@Controller
+@RequestMapping("/governance/owners")
+public class OwnersController extends BaseController {
+
+    @Autowired
+    private OwnerService ownerService;
+
+    @Autowired
+    private ProviderService providerService;
+
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "index", "owners");
+        List<Owner> owners;
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String)newModel.get("service");
+        if (service != null && service.length() > 0) {
+            owners = ownerService.findByService(service);
+        } else {
+            owners = ownerService.findAll();
+        }
+        model.addAttribute("owners", owners);
+        return "governance/screen/owners/index";
+    }
+
+    @RequestMapping("/add")
+    public String add(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "add", "owners");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String)newModel.get("service");
+        if (service == null || service.length() == 0) {
+            List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
+            model.addAttribute("serviceList", serviceList);
+        }
+        return "governance/screen/owners/add";
+    }
+
+    @RequestMapping(value =  "/create", method = RequestMethod.POST)  //post
+    public String create(Owner owner, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "create", "owners");
+        String service = owner.getService();
+        String username = owner.getUsername();
+        if (service == null || service.length() == 0
+                || username == null || username.length() == 0) {
+            model.addAttribute("message", getMessage("NoSuchOperationData"));
+            model.addAttribute("success", false);
+            model.addAttribute("redirect", "../owners");
+            return "governance/screen/redirect";
+        }
+        if (!super.currentUser.hasServicePrivilege(service)) {
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
+            model.addAttribute("success", false);
+            model.addAttribute("redirect", "../owners");
+            return "governance/screen/redirect";
+        }
+        ownerService.saveOwner(owner);
+        model.addAttribute("success", true);
+        model.addAttribute("redirect", "../owners");
+        return "governance/screen/redirect";
+    }
+
+    @RequestMapping("/{ids}/delete")
+    public String delete(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "delete", "owners");
+
+        String service = request.getParameter("service");
+        String username = request.getParameter("username");
+        Owner owner = new Owner();
+        owner.setService(service);
+        owner.setUsername(username);
+        if (service == null || service.length() == 0
+                || username == null || username.length() == 0) {
+            model.addAttribute("message", getMessage("NoSuchOperationData"));
+            model.addAttribute("success", false);
+            model.addAttribute("redirect", "../../owners");
+            return "governance/screen/redirect";
+        }
+        if (!super.currentUser.hasServicePrivilege(service)) {
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
+            model.addAttribute("success", false);
+            model.addAttribute("redirect", "../../owners");
+            return "governance/screen/redirect";
+        }
+        ownerService.deleteOwner(owner);
+        model.addAttribute("success", true);
+        model.addAttribute("redirect", "../../owners");
+        return "governance/screen/redirect";
+    }
+
+}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Providers.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ProvidersController.java
similarity index 51%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Providers.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ProvidersController.java
index 3dfa20c..0344073 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Providers.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ProvidersController.java
@@ -14,22 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.governance.module.screen;
+package com.alibaba.dubboadmin.web.mvc.governance;
 
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Override;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-import com.alibaba.dubbo.registry.common.route.OverrideUtils;
-import com.alibaba.dubbo.registry.common.util.Tool;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -37,8 +23,30 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.OverrideService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.registry.common.route.OverrideUtils;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+import com.alibaba.dubboadmin.web.pulltool.Tool;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.support.BindingAwareModelMap;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
 /**
- * <p>Providers.</p>
+ * <p>ProvidersController.</p>
  * URI: <br>
  * GET /providers, show all providers<br>
  * GET /providers/add, show web form for add a static provider<br>
@@ -69,7 +77,9 @@
  * GET /services/$service/providers/$id/recover, recover<br>
  *
  */
-public class Providers extends Restful {
+@Controller
+@RequestMapping("/governance/providers")
+public class ProvidersController extends BaseController {
 
     @Autowired
     private ProviderService providerService;
@@ -77,21 +87,22 @@
     @Autowired
     private OverrideService overrideService;
 
-    @Autowired
-    private HttpServletResponse response;
 
-    @Autowired
-    private HttpServletRequest request;
 
-    public void index(Provider provider, Map<String, Object> context) {
-        String service = (String) context.get("service");
-        String application = (String) context.get("application");
-        String address = (String) context.get("address");
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+
+
+        prepare(request, response, model, "index", "providers");
 
         String value = "";
         String separators = "....";
 
         List<Provider> providers = null;
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String)newModel.get("service");
+        String address = (String)newModel.get("address");
+        String application = (String)newModel.get("app");
 
         // service
         if (service != null && service.length() > 0) {
@@ -116,11 +127,16 @@ else if (application != null && application.length() > 0) {
             providers = providerService.findAll();
         }
 
-        context.put("providers", providers);
-        context.put("serviceAppMap", getServiceAppMap(providers));
+        model.addAttribute("providers", providers);
+        model.addAttribute("serviceAppMap", getServiceAppMap(providers));
 
         // record search history to cookies
-        setSearchHistroy(context, value);
+        try {
+            setSearchHistroy(value, request, response);
+        } catch (Exception e) {
+            //
+        }
+        return "governance/screen/providers/index";
     }
 
     /**
@@ -130,7 +146,7 @@ else if (application != null && application.length() > 0) {
      */
     private Map<String, Set<String>> getServiceAppMap(List<Provider> providers) {
         Map<String, Set<String>> serviceAppMap = new HashMap<String, Set<String>>();
-        if (providers != null && providers.size() >= 0) {
+        if (providers != null && providers.size() > 0) {
             for (Provider provider : providers) {
                 Set<String> appSet;
                 String service = provider.getService();
@@ -150,10 +166,10 @@ else if (application != null && application.length() > 0) {
      * Record search history to cookies, steps:
      * Check whether the added record exists in the cookie, and if so, update the list order; if it does not exist, insert it to the front
      *
-     * @param context
      * @param value
      */
-    private void setSearchHistroy(Map<String, Object> context, String value) {
+    private void setSearchHistroy(String value, HttpServletRequest request, HttpServletResponse response) {
+        //System.out.println("add new cookie: " + value);
         // Analyze existing cookies
         String separatorsB = "\\.\\.\\.\\.\\.\\.";
         String newCookiev = value;
@@ -167,6 +183,7 @@ private void setSearchHistroy(Map<String, Object> context, String value) {
                     if (count <= 10) {
                         if (!value.equals(v)) {
                             newCookiev = newCookiev + separatorsB + v;
+                            //System.out.println("new cookie: " + newCookiev);
                         }
                     }
                     count++;
@@ -181,29 +198,44 @@ private void setSearchHistroy(Map<String, Object> context, String value) {
         response.addCookie(_cookie); // Write to client hard disk
     }
 
-    public void show(Long id, Map<String, Object> context) {
+    @RequestMapping("/{id}")
+    public String show(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "show", "providers");
         Provider provider = providerService.findProvider(id);
         if (provider != null && provider.isDynamic()) {
             List<Override> overrides = overrideService.findByServiceAndAddress(provider.getService(), provider.getAddress());
             OverrideUtils.setProviderOverrides(provider, overrides);
         }
-        context.put("provider", provider);
+        model.addAttribute("provider", provider);
+        return "governance/screen/providers/show";
+
     }
 
     /**
      * Load new service page, get all the service name
-     *
-     * @param context
      */
-    public void add(Long id, Map<String, Object> context) {
-        if (context.get("service") == null) {
+
+    @RequestMapping("/{id}/add")
+    public String add(@PathVariable("id") Long id,
+                      HttpServletRequest request, HttpServletResponse response, Model model) {
+        model.addAttribute("id", id);
+        return add(request, response, model);
+    }
+
+    @RequestMapping("/add")
+    public String add(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "add", "providers");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        Long id = (Long)newModel.get("id");
+        String service = (String)newModel.get("service");
+        if (service == null) {
             List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
-            context.put("serviceList", serviceList);
+            model.addAttribute("serviceList", serviceList);
         }
         if (id != null) {
             Provider p = providerService.findProvider(id);
             if (p != null) {
-                context.put("provider", p);
+                model.addAttribute("provider", p);
                 String parameters = p.getParameters();
                 if (parameters != null && parameters.length() > 0) {
                     Map<String, String> map = StringUtils.parseQueryString(parameters);
@@ -213,17 +245,36 @@ public void add(Long id, Map<String, Object> context) {
                 }
             }
         }
+        return "governance/screen/providers/add";
     }
 
-    public void edit(Long id, Map<String, Object> context) {
-        show(id, context);
+    @RequestMapping("/{id}/edit")
+    public String edit(@PathVariable("id") Long id,  HttpServletRequest request, HttpServletResponse response,  Model model) {
+        prepare(request, response, model,"edit", "providers");
+        Provider provider = providerService.findProvider(id);
+        if (provider != null && provider.isDynamic()) {
+            List<Override> overrides = overrideService.findByServiceAndAddress(provider.getService(), provider.getAddress());
+            OverrideUtils.setProviderOverrides(provider, overrides);
+        }
+        model.addAttribute("provider", provider);
+        return "governance/screen/providers/edit";
     }
 
-    public boolean create(Provider provider, Map<String, Object> context) {
+    @RequestMapping(value =  "/create", method = RequestMethod.POST)  //post
+    public String create(@ModelAttribute Provider provider, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model,"create" ,"providers");
+        boolean success = true;
         String service = provider.getService();
+        if (service == null) {
+            service = (String)((BindingAwareModelMap)model).get("service");
+            provider.setService(service);
+        }
         if (!super.currentUser.hasServicePrivilege(service)) {
-            context.put("message", getMessage("HaveNoServicePrivilege", service));
-            return false;
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
+            success = false;
+            model.addAttribute("success", success);
+            model.addAttribute("redirect", "../providers");
+            return "governance/screen/redirect";
         }
         if (provider.getParameters() == null) {
             String url = provider.getUrl();
@@ -237,21 +288,32 @@ public boolean create(Provider provider, Map<String, Object> context) {
         }
         provider.setDynamic(false); // Provider add through web page must be static
         providerService.create(provider);
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../providers");
+        return "governance/screen/redirect";
     }
 
-    public boolean update(Provider newProvider, Map<String, Object> context) {
+    @RequestMapping(value = "/update", method = RequestMethod.POST) //post
+    public String update(@ModelAttribute Provider newProvider, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "update", "providers");
+        boolean success = true;
         Long id = newProvider.getId();
         String parameters = newProvider.getParameters();
         Provider provider = providerService.findProvider(id);
         if (provider == null) {
-            context.put("message", getMessage("NoSuchOperationData", id));
-            return false;
+            model.addAttribute("message", getMessage("NoSuchOperationData", id));
+            success = false;
+            model.addAttribute("success", success);
+            model.addAttribute("redirect", "../providers");
+            return "governance/screen/redirect";
         }
         String service = provider.getService();
         if (!super.currentUser.hasServicePrivilege(service)) {
-            context.put("message", getMessage("HaveNoServicePrivilege", service));
-            return false;
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
+            success = false;
+            model.addAttribute("success", success);
+            model.addAttribute("redirect", "../providers");
+            return "governance/screen/redirect";
         }
         Map<String, String> oldMap = StringUtils.parseQueryString(provider.getParameters());
         Map<String, String> newMap = StringUtils.parseQueryString(parameters);
@@ -289,97 +351,157 @@ public boolean update(Provider newProvider, Map<String, Object> context) {
             provider.setParameters(parameters);
             providerService.updateProvider(provider);
         }
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../providers");
+        return "governance/screen/redirect";
     }
 
-    public boolean delete(Long[] ids, Map<String, Object> context) {
+    @RequestMapping("/{ids}/delete")
+    public String delete(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "delete", "providers");
+        boolean success = true;
         for (Long id : ids) {
             Provider provider = providerService.findProvider(id);
             if (provider == null) {
-                context.put("message", getMessage("NoSuchOperationData", id));
-                return false;
+                model.addAttribute("message", getMessage("NoSuchOperationData", id));
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../providers");
+                return "governance/screen/redirect";
             } else if (provider.isDynamic()) {
-                context.put("message", getMessage("CanNotDeleteDynamicData", id));
-                return false;
+                model.addAttribute("message", getMessage("CanNotDeleteDynamicData", id));
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../providers");
+                return "governance/screen/redirect";
             } else if (!super.currentUser.hasServicePrivilege(provider.getService())) {
-                context.put("message", getMessage("HaveNoServicePrivilege", provider.getService()));
-                return false;
+                model.addAttribute("message", getMessage("HaveNoServicePrivilege", provider.getService()));
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../providers");
+                return "governance/screen/redirect";
             }
         }
         for (Long id : ids) {
             providerService.deleteStaticProvider(id);
         }
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../providers");
+        return "governance/screen/redirect";
     }
 
-    public boolean enable(Long[] ids, Map<String, Object> context) {
+    @RequestMapping("/{ids}/enable")
+    public String enable(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "enable", "providers");
+        boolean success = true;
         Map<Long, Provider> id2Provider = new HashMap<Long, Provider>();
         for (Long id : ids) {
             Provider provider = providerService.findProvider(id);
             if (provider == null) {
-                context.put("message", getMessage("NoSuchOperationData", id));
-                return false;
+                model.addAttribute("message", getMessage("NoSuchOperationData", id));
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../providers");
+                return "governance/screen/redirect";
             } else if (!super.currentUser.hasServicePrivilege(provider.getService())) {
-                context.put("message", getMessage("HaveNoServicePrivilege", provider.getService()));
-                return false;
+                model.addAttribute("message", getMessage("HaveNoServicePrivilege", provider.getService()));
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../providers");
+                return "governance/screen/redirect";
             }
             id2Provider.put(id, provider);
         }
         for (Long id : ids) {
             providerService.enableProvider(id);
         }
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../providers");
+        return "governance/screen/redirect";
     }
 
-    public boolean disable(Long[] ids, Map<String, Object> context) {
+    @RequestMapping("/{ids}/disable")
+    public String disable(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response,  Model model) {
+        prepare(request, response, model, "disable", "providers");
+        boolean success = true;
         for (Long id : ids) {
             Provider provider = providerService.findProvider(id);
             if (provider == null) {
-                context.put("message", getMessage("NoSuchOperationData", id));
-                return false;
+                model.addAttribute("message", getMessage("NoSuchOperationData", id));
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../providers");
+                return "governance/screen/redirect";
             } else if (!super.currentUser.hasServicePrivilege(provider.getService())) {
-                context.put("message", getMessage("HaveNoServicePrivilege", provider.getService()));
-                return false;
+                success = false;
+                model.addAttribute("message", getMessage("HaveNoServicePrivilege", provider.getService()));
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../providers");
+                return "governance/screen/redirect";
             }
         }
         for (Long id : ids) {
             providerService.disableProvider(id);
         }
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../providers");
+        return "governance/screen/redirect";
     }
 
-    public boolean doubling(Long[] ids, Map<String, Object> context) {
+    @RequestMapping("/{ids}/doubling")
+    public String doubling(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response,  Model model) {
+        prepare(request, response, model, "doubling","providers");
+        boolean success = true;
         for (Long id : ids) {
             Provider provider = providerService.findProvider(id);
             if (provider == null) {
-                context.put("message", getMessage("NoSuchOperationData", id));
-                return false;
+                success = false;
+                model.addAttribute("message", getMessage("NoSuchOperationData", id));
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../providers");
+                return "governance/screen/redirect";
             } else if (!super.currentUser.hasServicePrivilege(provider.getService())) {
-                context.put("message", getMessage("HaveNoServicePrivilege", provider.getService()));
-                return false;
+                success = false;
+                model.addAttribute("message", getMessage("HaveNoServicePrivilege", provider.getService()));
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../providers");
+                return "governance/screen/redirect";
             }
         }
         for (Long id : ids) {
             providerService.doublingProvider(id);
         }
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../providers");
+        return "governance/screen/redirect";
     }
 
-    public boolean halving(Long[] ids, Map<String, Object> context) {
+    @RequestMapping("/{ids}/halving")
+    public String halving(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "halving","providers");
+        boolean success = true;
         for (Long id : ids) {
             Provider provider = providerService.findProvider(id);
             if (provider == null) {
-                context.put("message", getMessage("NoSuchOperationData", id));
-                return false;
+                success = false;
+                model.addAttribute("message", getMessage("NoSuchOperationData", id));
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../providers");
+                return "governance/screen/redirect";
             } else if (!super.currentUser.hasServicePrivilege(provider.getService())) {
-                context.put("message", getMessage("HaveNoServicePrivilege", provider.getService()));
-                return false;
+                success = false;
+                model.addAttribute("message", getMessage("HaveNoServicePrivilege", provider.getService()));
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../providers");
+                return "governance/screen/redirect";
             }
         }
         for (Long id : ids) {
             providerService.halvingProvider(id);
         }
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../providers");
+        return "governance/screen/redirect";
     }
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Routes.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/RoutesController.java
similarity index 54%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Routes.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/RoutesController.java
index 7007f37..3e3384c 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Routes.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/RoutesController.java
@@ -14,39 +14,42 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.governance.module.screen;
+package com.alibaba.dubboadmin.web.mvc.governance;
 
 import com.alibaba.dubbo.common.utils.CollectionUtils;
 import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.ConsumerService;
-import com.alibaba.dubbo.governance.service.OwnerService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.service.RouteService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Consumer;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-import com.alibaba.dubbo.registry.common.domain.Route;
-import com.alibaba.dubbo.registry.common.route.ParseUtils;
-import com.alibaba.dubbo.registry.common.route.RouteRule;
-import com.alibaba.dubbo.registry.common.route.RouteUtils;
-import com.alibaba.dubbo.registry.common.util.Tool;
-
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
+import com.alibaba.dubboadmin.governance.service.OwnerService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.governance.service.RouteService;
+import com.alibaba.dubboadmin.registry.common.domain.Consumer;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.registry.common.domain.Route;
+import com.alibaba.dubboadmin.registry.common.route.ParseUtils;
+import com.alibaba.dubboadmin.registry.common.route.RouteRule;
+import com.alibaba.dubboadmin.registry.common.route.RouteUtils;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+import com.alibaba.dubboadmin.web.pulltool.Tool;
 import org.springframework.beans.factory.annotation.Autowired;
-
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.support.BindingAwareModelMap;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 /**
- * Providers.
+ * ProvidersController.
  * URI: /services/$service/routes
- *
  */
-public class Routes extends Restful {
+@Controller
+@RequestMapping("/governance/routes")
+public class RoutesController extends BaseController {
 
     private static final int MAX_RULE_LENGTH = 1000;
     static String[][] when_names = {
@@ -123,12 +126,13 @@ public static void addOwnersOfServicePattern(Set<String> usernames, String servi
 
     /**
      * Routing module home page
-     *
-     * @param context
      */
-    public void index(Map<String, Object> context) {
-        String service = (String) context.get("service");
-        String address = (String) context.get("address");
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "index", "routes");
+        BindingAwareModelMap newModel = (BindingAwareModelMap) model;
+        String address = (String) newModel.get("address");
+        String service = (String) newModel.get("service");
         address = Tool.getIP(address);
         List<Route> routes;
         if (service != null && service.length() > 0
@@ -141,23 +145,24 @@ public void index(Map<String, Object> context) {
         } else {
             routes = routeService.findAll();
         }
-        context.put("routes", routes);
+        model.addAttribute("routes", routes);
+        return "governance/screen/routes/index";
     }
 
     /**
      * Display routing details
-     *
-     * @param context
      */
-    public void show(Map<String, Object> context) {
+    @RequestMapping("/{id}")
+    public String show(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
         try {
-            Route route = routeService.findRoute(Long.parseLong((String) context.get("id")));
+            prepare(request, response, model, "show", "routes");
+            Route route = routeService.findRoute(id);
 
             if (route == null) {
                 throw new IllegalArgumentException("The route is not existed.");
             }
             if (route.getService() != null && !route.getService().isEmpty()) {
-                context.put("service", route.getService());
+                model.addAttribute("service", route.getService());
             }
 
             RouteRule routeRule = RouteRule.parse(route);
@@ -178,59 +183,126 @@ public void show(Map<String, Object> context) {
 
                     if (!matchPair.getMatches().isEmpty()) {
                         String m = RouteRule.join(matchPair.getMatches());
-                        context.put(name[1], m);
+                        model.addAttribute(name[1], m);
                     }
                     if (!matchPair.getUnmatches().isEmpty()) {
                         String u = RouteRule.join(matchPair.getUnmatches());
-                        context.put(name[2], u);
+                        model.addAttribute(name[2], u);
                     }
                 }
             }
-            context.put("route", route);
-            context.put("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(route.getService()))));
+            model.addAttribute("route", route);
+            model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(route.getService()))));
         } catch (ParseException e) {
             e.printStackTrace();
         }
+        return "governance/screen/routes/show";
     }
 
     /**
      * Load new route page
-     *
-     * @param context
      */
-    public void add(Map<String, Object> context) {
-        String service = (String) context.get("service");
+    @RequestMapping("/add")
+    public String add(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "add", "routes");
+        BindingAwareModelMap newModel = (BindingAwareModelMap) model;
+        String service = (String) newModel.get("service");
         if (service != null && service.length() > 0 && !service.contains("*")) {
-            context.put("service", service);
-            context.put("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(service))));
+            model.addAttribute("service", service);
+            model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(service))));
         } else {
             List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
-            context.put("serviceList", serviceList);
+            model.addAttribute("serviceList", serviceList);
         }
 
-        if (context.get("input") != null) context.put("input", context.get("input"));
+        //if (input != null) model.addAttribute("input", input);
+        return "governance/screen/routes/add";
+    }
+
 
+    //修复指定服务的路由规则编辑的时候报错:java.lang.NoSuchMethodException: com.alibaba.dubboadmin.web.mvc.governance.RoutesController.edit([Ljava.lang.Long;, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.springframework.ui.Model)
+    public String edit(Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+        return edit(id, null, null, request, response, model);
     }
 
     /**
      * Load modified routing page
-     *
-     * @param context
      */
-    public void edit(Map<String, Object> context) {
-        add(context);
-        show(context);
+
+    @RequestMapping("/{id}/edit")
+    public String edit(@PathVariable("id") Long id, @RequestParam(required = false) String service,
+                       @RequestParam(required = false) String input,
+                       HttpServletRequest request, HttpServletResponse response, Model model) {
+
+        prepare(request, response, model, "edit", "routes");
+        if (service != null && service.length() > 0 && !service.contains("*")) {
+            model.addAttribute("service", service);
+            model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(service))));
+        } else {
+            List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
+            model.addAttribute("serviceList", serviceList);
+        }
+
+        if (input != null) model.addAttribute("input", input);
+        Route route = routeService.findRoute(id);
+
+        if (route == null) {
+            throw new IllegalArgumentException("The route is not existed.");
+        }
+        if (route.getService() != null && !route.getService().isEmpty()) {
+            model.addAttribute("service", route.getService());
+        }
+
+        RouteRule routeRule = null;
+        try {
+            routeRule = RouteRule.parse(route);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+
+        @SuppressWarnings("unchecked")
+        Map<String, RouteRule.MatchPair>[] paramArray = new Map[]{
+                routeRule.getWhenCondition(), routeRule.getThenCondition()};
+        String[][][] namesArray = new String[][][]{when_names, then_names};
+
+        for (int i = 0; i < paramArray.length; ++i) {
+            Map<String, RouteRule.MatchPair> param = paramArray[i];
+            String[][] names = namesArray[i];
+            for (String[] name : names) {
+                RouteRule.MatchPair matchPair = param.get(name[0]);
+                if (matchPair == null) {
+                    continue;
+                }
+
+                if (!matchPair.getMatches().isEmpty()) {
+                    String m = RouteRule.join(matchPair.getMatches());
+                    model.addAttribute(name[1], m);
+                }
+                if (!matchPair.getUnmatches().isEmpty()) {
+                    String u = RouteRule.join(matchPair.getUnmatches());
+                    model.addAttribute(name[2], u);
+                }
+            }
+        }
+        model.addAttribute("route", route);
+        model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(route.getService()))));
+
+        return "governance/screen/routes/edit";
     }
 
     /**
      * Save the routing information to the database
      *
-     * @param context
      * @return
      */
-    public boolean create(Map<String, Object> context) {
-        String name = (String) context.get("name");
-        String service = (String) context.get("service");
+
+    @RequestMapping("/create")
+    public String create(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "update", "routes");
+        boolean success = true;
+
+        String name = request.getParameter("name");
+        String service = request.getParameter("service");
         if (StringUtils.isNotEmpty(service)
                 && StringUtils.isNotEmpty(name)) {
             checkService(service);
@@ -238,15 +310,15 @@ public boolean create(Map<String, Object> context) {
             Map<String, String> when_name2valueList = new HashMap<String, String>();
             Map<String, String> notWhen_name2valueList = new HashMap<String, String>();
             for (String[] names : when_names) {
-                when_name2valueList.put(names[0], (String) context.get(names[1]));
-                notWhen_name2valueList.put(names[0], (String) context.get(names[2])); // TODO. We should guarantee value is never null in here, will be supported later
+                when_name2valueList.put(names[0], request.getParameter(names[1]));
+                notWhen_name2valueList.put(names[0], request.getParameter(names[2])); // TODO. We should guarantee value is never null in here, will be supported later
             }
 
             Map<String, String> then_name2valueList = new HashMap<String, String>();
             Map<String, String> notThen_name2valueList = new HashMap<String, String>();
             for (String[] names : then_names) {
-                then_name2valueList.put(names[0], (String) context.get(names[1]));
-                notThen_name2valueList.put(names[0], (String) context.get(names[2]));
+                then_name2valueList.put(names[0], request.getParameter(names[1]));
+                notThen_name2valueList.put(names[0], request.getParameter(names[2]));
             }
 
             RouteRule routeRule = RouteRule.createFromNameAndValueListString(
@@ -254,8 +326,10 @@ public boolean create(Map<String, Object> context) {
                     then_name2valueList, notThen_name2valueList);
 
             if (routeRule.getThenCondition().isEmpty()) {
-                context.put("message", getMessage("Add route error! then is empty."));
-                return false;
+                model.addAttribute("message", getMessage("Add route error! then is empty."));
+                model.addAttribute("success", false);
+                model.addAttribute("redirect", "../routes");
+                return "governance/screen/redirect";
             }
 
             String matchRule = routeRule.getWhenConditionString();
@@ -263,70 +337,87 @@ public boolean create(Map<String, Object> context) {
 
             // Limit the length of the expression
             if (matchRule.length() > MAX_RULE_LENGTH) {
-                context.put("message", getMessage("When rule is too long!"));
-                return false;
+                model.addAttribute("message", getMessage("When rule is too long!"));
+                model.addAttribute("success", false);
+                model.addAttribute("redirect", "../routes");
+                return "governance/screen/redirect";
             }
             if (filterRule.length() > MAX_RULE_LENGTH) {
-                context.put("message", getMessage("Then rule is too long!"));
-                return false;
+                model.addAttribute("message", getMessage("Then rule is too long!"));
+                model.addAttribute("success", false);
+                model.addAttribute("redirect", "../routes");
+                return "governance/screen/redirect";
             }
 
             Route route = new Route();
             route.setService(service);
             route.setName(name);
-            route.setUsername((String) context.get("operator"));
-            route.setOperator((String) context.get("operatorAddress"));
+            route.setUsername(request.getParameter("operator"));
+            route.setOperator(request.getParameter("operatorAddress"));
             route.setRule(routeRule.toString());
-            if (StringUtils.isNotEmpty((String) context.get("priority"))) {
-                route.setPriority(Integer.parseInt((String) context.get("priority")));
+            if (StringUtils.isNotEmpty(request.getParameter("priority"))) {
+                route.setPriority(Integer.parseInt(request.getParameter("priority")));
             }
             routeService.createRoute(route);
 
         }
-
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../routes");
+        return "governance/screen/redirect";
     }
 
     /**
      * Save the update data to the database
      *
-     * @param context
      * @return
      */
-    public boolean update(Map<String, Object> context) {
-        String idStr = (String) context.get("id");
+    @RequestMapping("/{id}/update")
+    public String update(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "update", "routes");
+        boolean success = true;
+        String idStr = String.valueOf(id);
         if (idStr != null && idStr.length() > 0) {
-            String[] blacks = (String[]) context.get("black");
+            String[] blacks = request.getParameterMap().get("black");
+            //String[] blacks = (String[]) context.get("black");
             boolean black = false;
             if (blacks != null && blacks.length > 0) {
-                black = true;
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../routes");
+                return "governance/screen/redirect";
             }
 
             Route oldRoute = routeService.findRoute(Long.valueOf(idStr));
             if (null == oldRoute) {
-                context.put("message", getMessage("NoSuchRecord"));
-                return false;
+                model.addAttribute("message", getMessage("NoSuchRecord"));
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../routes");
+                return "governance/screen/redirect";
             }
             // Check parameters, patchwork rule
-            if (StringUtils.isNotEmpty((String) context.get("name"))) {
+            if (StringUtils.isNotEmpty((String) request.getParameter("name"))) {
                 String service = oldRoute.getService();
-                if (context.get("operator") == null) {
-                    context.put("message", getMessage("HaveNoServicePrivilege", service));
-                    return false;
+                if (((BindingAwareModelMap) model).get("operator") == null) {
+                    model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
+                    success = false;
+                    model.addAttribute("success", success);
+                    model.addAttribute("redirect", "../../routes");
+                    return "governance/screen/redirect";
                 }
 
                 Map<String, String> when_name2valueList = new HashMap<String, String>();
                 Map<String, String> notWhen_name2valueList = new HashMap<String, String>();
                 for (String[] names : when_names) {
-                    when_name2valueList.put(names[0], (String) context.get(names[1]));
-                    notWhen_name2valueList.put(names[0], (String) context.get(names[2]));
+                    when_name2valueList.put(names[0], (String) request.getParameter(names[1]));
+                    notWhen_name2valueList.put(names[0], (String) request.getParameter(names[2]));
                 }
 
                 Map<String, String> then_name2valueList = new HashMap<String, String>();
                 Map<String, String> notThen_name2valueList = new HashMap<String, String>();
                 for (String[] names : then_names) {
-                    then_name2valueList.put(names[0], (String) context.get(names[1]));
-                    notThen_name2valueList.put(names[0], (String) context.get(names[2]));
+                    then_name2valueList.put(names[0], (String) request.getParameter(names[1]));
+                    notThen_name2valueList.put(names[0], (String) request.getParameter(names[2]));
                 }
 
                 RouteRule routeRule = RouteRule.createFromNameAndValueListString(
@@ -353,8 +444,11 @@ public boolean update(Map<String, Object> context) {
                 }
 
                 if (result.getThenCondition().isEmpty()) {
-                    context.put("message", getMessage("Update route error! then is empty."));
-                    return false;
+                    model.addAttribute("message", getMessage("Update route error! then is empty."));
+                    success = false;
+                    model.addAttribute("success", success);
+                    model.addAttribute("redirect", "../../routes");
+                    return "governance/screen/redirect";
                 }
 
                 String matchRule = result.getWhenConditionString();
@@ -362,33 +456,39 @@ public boolean update(Map<String, Object> context) {
 
                 // Limit the length of the expression
                 if (matchRule.length() > MAX_RULE_LENGTH) {
-                    context.put("message", getMessage("When rule is too long!"));
-                    return false;
+                    model.addAttribute("message", getMessage("When rule is too long!"));
+                    success = false;
+                    model.addAttribute("success", success);
+                    model.addAttribute("redirect", "../../routes");
+                    return "governance/screen/redirect";
                 }
                 if (filterRule.length() > MAX_RULE_LENGTH) {
-                    context.put("message", getMessage("Then rule is too long!"));
-                    return false;
+                    model.addAttribute("message", getMessage("Then rule is too long!"));
+                    success = false;
+                    model.addAttribute("success", success);
+                    model.addAttribute("redirect", "../../routes");
+                    return "governance/screen/redirect";
                 }
 
                 int priority = 0;
-                if (StringUtils.isNotEmpty((String) context.get("priority"))) {
-                    priority = Integer.parseInt((String) context.get("priority"));
+                if (StringUtils.isNotEmpty((String) request.getParameter("priority"))) {
+                    priority = Integer.parseInt((String) request.getParameter("priority"));
                 }
 
                 Route route = new Route();
                 route.setRule(result.toString());
                 route.setService(service);
                 route.setPriority(priority);
-                route.setName((String) context.get("name"));
-                route.setUsername((String) context.get("operator"));
-                route.setOperator((String) context.get("operatorAddress"));
+                route.setName((String) request.getParameter("name"));
+                route.setUsername((String) request.getParameter("operator"));
+                route.setOperator((String) request.getParameter("operatorAddress"));
                 route.setId(Long.valueOf(idStr));
-                route.setPriority(Integer.parseInt((String) context.get("priority")));
+                route.setPriority(Integer.parseInt((String) request.getParameter("priority")));
                 route.setEnabled(oldRoute.isEnabled());
                 routeService.updateRoute(route);
 
                 Set<String> usernames = new HashSet<String>();
-                usernames.add((String) context.get("operator"));
+                usernames.add((String) request.getParameter("operator"));
                 usernames.add(route.getUsername());
                 //RelateUserUtils.addOwnersOfService(usernames, route.getService(), ownerDAO);
 
@@ -397,13 +497,15 @@ public boolean update(Map<String, Object> context) {
                 params.put("route", route);
 
             } else {
-                context.put("message", getMessage("MissRequestParameters", "name"));
+                model.addAttribute("message", getMessage("MissRequestParameters", "name"));
             }
         } else {
-            context.put("message", getMessage("MissRequestParameters", "id"));
+            model.addAttribute("message", getMessage("MissRequestParameters", "id"));
         }
 
-        return true;
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../routes");
+        return "governance/screen/redirect";
     }
 
     /**
@@ -412,12 +514,17 @@ public boolean update(Map<String, Object> context) {
      * @param ids
      * @return
      */
-    public boolean delete(Long[] ids, Map<String, Object> context) {
+    @RequestMapping("/{ids}/delete")
+    public String delete(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response,
+                         Model model) {
+        prepare(request, response, model, "delete", "routes");
         for (Long id : ids) {
             routeService.deleteRoute(id);
         }
+        model.addAttribute("success", true);
+        model.addAttribute("redirect", "../../routes");
+        return "governance/screen/redirect";
 
-        return true;
     }
 
     /**
@@ -426,12 +533,16 @@ public boolean delete(Long[] ids, Map<String, Object> context) {
      * @param ids
      * @return
      */
-    public boolean enable(Long[] ids, Map<String, Object> context) {
+    @RequestMapping("/{ids}/enable")
+    public String enable(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response,
+                         Model model) {
+        prepare(request, response, model, "enable", "routes");
         for (Long id : ids) {
             routeService.enableRoute(id);
         }
-
-        return true;
+        model.addAttribute("success", true);
+        model.addAttribute("redirect", "../../routes");
+        return "governance/screen/redirect";
     }
 
     /**
@@ -440,12 +551,16 @@ public boolean enable(Long[] ids, Map<String, Object> context) {
      * @param ids
      * @return
      */
-    public boolean disable(Long[] ids, Map<String, Object> context) {
+    @RequestMapping("/{ids}/disable")
+    public String disable(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response,
+                          Model model) {
+        prepare(request, response, model, "disable", "routes");
         for (Long id : ids) {
             routeService.disableRoute(id);
         }
-
-        return true;
+        model.addAttribute("success", true);
+        model.addAttribute("redirect", "../../routes");
+        return "governance/screen/redirect";
     }
 
     /**
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Services.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ServicesController.java
similarity index 58%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Services.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ServicesController.java
index f4d56f7..8d3f181 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/governance/module/screen/Services.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/ServicesController.java
@@ -14,19 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.governance.module.screen;
-
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.ConsumerService;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Override;
-import com.alibaba.dubbo.registry.common.route.OverrideUtils;
-import com.alibaba.dubbo.registry.common.util.Tool;
-
-import org.springframework.beans.factory.annotation.Autowired;
+package com.alibaba.dubboadmin.web.mvc.governance;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -37,11 +25,33 @@
 import java.util.Set;
 import java.util.TreeSet;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
+import com.alibaba.dubboadmin.governance.service.OverrideService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.registry.common.route.OverrideUtils;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+import com.alibaba.dubboadmin.web.pulltool.Tool;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.support.BindingAwareModelMap;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
 /**
- * Providers. URI: /services/$service/providers /addresses/$address/services /application/$application/services
+ * ProvidersController. URI: /services/$service/providers /addresses/$address/services /application/$application/services
  *
  */
-public class Services extends Restful {
+@Controller
+@RequestMapping("/governance/services")
+public class ServicesController extends BaseController {
 
     @Autowired
     private ProviderService providerService;
@@ -52,20 +62,27 @@
     @Autowired
     private OverrideService overrideService;
 
-    public void index(Map<String, Object> context) {
-        String application = (String) context.get("application");
-        String address = (String) context.get("address");
 
-        if (context.get("service") == null
-                && context.get("application") == null
-                && context.get("address") == null) {
-            context.put("service", "*");
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "index", "services");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String)newModel.get("service");
+        String application = (String)newModel.get("app");
+        String address = (String)newModel.get("address");
+        String keyword = request.getParameter("keyword");
+
+        if (service == null
+                && application == null
+                && address == null) {
+            model.addAttribute("service", "*");
         }
 
         List<String> providerServices = null;
         List<String> consumerServices = null;
         List<Override> overrides = null;
         if (application != null && application.length() > 0) {
+            model.addAttribute("app", application);
             providerServices = providerService.findServicesByApplication(application);
             consumerServices = consumerService.findServicesByApplication(application);
             overrides = overrideService.findByApplication(application);
@@ -104,13 +121,13 @@ public void index(Map<String, Object> context) {
             }
         }
 
-        context.put("providerServices", providerServices);
-        context.put("consumerServices", consumerServices);
-        context.put("services", services);
-        context.put("overrides", service2Overrides);
+        model.addAttribute("providerServices", providerServices);
+        model.addAttribute("consumerServices", consumerServices);
+        model.addAttribute("services", services);
+        model.addAttribute("overrides", service2Overrides);
 
-        String keyword = (String) context.get("keyword");
-        if (StringUtils.isNotEmpty(keyword) && !"*".equals(keyword)) {
+
+        if (keyword != null && !"*".equals(keyword)) {
             keyword = keyword.toLowerCase();
             Set<String> newList = new HashSet<String>();
             Set<String> newProviders = new HashSet<String>();
@@ -120,6 +137,9 @@ public void index(Map<String, Object> context) {
                 if (o.toLowerCase().toLowerCase().indexOf(keyword) != -1) {
                     newList.add(o);
                 }
+                if (o.toLowerCase().toLowerCase().equals(keyword.toLowerCase())) {
+                    service = o;
+                }
             }
             for (String o : providerServices) {
                 if (o.toLowerCase().indexOf(keyword) != -1) {
@@ -131,36 +151,50 @@ public void index(Map<String, Object> context) {
                     newConsumers.add(o);
                 }
             }
-            context.put("services", newList);
-            context.put("providerServices", newProviders);
-            context.put("consumerServices", newConsumers);
+            model.addAttribute("services", newList);
+            model.addAttribute("keyword", keyword);
+            model.addAttribute("providerServices", newProviders);
+            model.addAttribute("consumerServices", newConsumers);
         }
+        return "governance/screen/services/index";
     }
 
-    public boolean shield(Map<String, Object> context) throws Exception {
-        return mock(context, "force:return null");
+
+    @RequestMapping("/{ids}/shield")
+    public String shield(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return mock(ids, "force:return null", "shield", request, response, model);
     }
 
-    public boolean tolerant(Map<String, Object> context) throws Exception {
-        return mock(context, "fail:return null");
+    @RequestMapping("/{ids}/tolerant")
+    public String tolerant(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return mock(ids, "fail:return null", "tolerant", request, response, model);
     }
 
-    public boolean recover(Map<String, Object> context) throws Exception {
-        return mock(context, "");
+    @RequestMapping("/{ids}/recover")
+    public String recover(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        return mock(ids,  "", "recover", request, response, model);
     }
 
-    private boolean mock(Map<String, Object> context, String mock) throws Exception {
-        String services = (String) context.get("service");
-        String application = (String) context.get("application");
+    private String mock(Long[] ids, String mock, String methodName, HttpServletRequest request,
+                        HttpServletResponse response, Model model) throws Exception {
+        prepare(request, response, model, methodName, "services");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String services = (String) newModel.get("service");
+        String application = (String) newModel.get("app");
+
         if (services == null || services.length() == 0
                 || application == null || application.length() == 0) {
-            context.put("message", getMessage("NoSuchOperationData"));
-            return false;
+            model.addAttribute("message", getMessage("NoSuchOperationData"));
+            model.addAttribute("success", false);
+            model.addAttribute("redirect", "../../services");
+            return "governance/screen/redirect";
         }
         for (String service : SPACE_SPLIT_PATTERN.split(services)) {
             if (!super.currentUser.hasServicePrivilege(service)) {
-                context.put("message", getMessage("HaveNoServicePrivilege", service));
-                return false;
+                model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
+                model.addAttribute("success", false);
+                model.addAttribute("redirect", "../../services");
+                return "governance/screen/redirect";
             }
         }
         for (String service : SPACE_SPLIT_PATTERN.split(services)) {
@@ -194,7 +228,9 @@ private boolean mock(Map<String, Object> context, String mock) throws Exception
                 overrideService.saveOverride(override);
             }
         }
-        return true;
+        model.addAttribute("success", true);
+        model.addAttribute("redirect", "../../services");
+        return "governance/screen/redirect";
     }
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/WeightsController.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/WeightsController.java
new file mode 100644
index 0000000..d94428a
--- /dev/null
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/governance/WeightsController.java
@@ -0,0 +1,305 @@
+/*
+ * 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 com.alibaba.dubboadmin.web.mvc.governance;
+
+import java.io.BufferedReader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.utils.CollectionUtils;
+import com.alibaba.dubboadmin.governance.service.OverrideService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.registry.common.domain.Weight;
+import com.alibaba.dubboadmin.registry.common.util.OverrideUtils;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+import com.alibaba.dubboadmin.web.pulltool.Tool;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.support.BindingAwareModelMap;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * ProvidersController.
+ * URI: /services/$service/weights
+ *
+ */
+@Controller
+@RequestMapping("/governance/weights")
+public class WeightsController extends BaseController {
+
+    private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3}$");
+    private static final Pattern LOCAL_IP_PATTERN = Pattern.compile("127(\\.\\d{1,3}){3}$");
+    private static final Pattern ALL_IP_PATTERN = Pattern.compile("0{1,3}(\\.0{1,3}){3}$");
+    @Autowired
+    private OverrideService overrideService;
+    @Autowired
+    private ProviderService providerService;
+
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "index", "weights");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String)newModel.get("service");
+        String address = (String)newModel.get("address");
+        service = StringUtils.trimToNull(service);
+        address = Tool.getIP(address);
+        List<Weight> weights;
+        if (service != null && service.length() > 0) {
+            weights = OverrideUtils.overridesToWeights(overrideService.findByService(service));
+        } else if (address != null && address.length() > 0) {
+            weights = OverrideUtils.overridesToWeights(overrideService.findByAddress(address));
+        } else {
+            weights = OverrideUtils.overridesToWeights(overrideService.findAll());
+        }
+        model.addAttribute("weights", weights);
+        return "governance/screen/weights/index";
+    }
+
+    /**
+     * load page for the adding
+     *
+     */
+    @RequestMapping("/add")
+    public String add(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "add", "weights");
+        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+        String service = (String)newModel.get("service");
+        String input = request.getParameter("input");
+        if (service != null && service.length() > 0 && !service.contains("*")) {
+            List<Provider> providerList = providerService.findByService(service);
+            List<String> addressList = new ArrayList<String>();
+            for (Provider provider : providerList) {
+                addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
+            }
+            model.addAttribute("addressList", addressList);
+            model.addAttribute("service", service);
+            model.addAttribute("methods", CollectionUtils.sort(providerService.findMethodsByService(service)));
+        } else {
+            List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
+            model.addAttribute("serviceList", serviceList);
+        }
+        if (input != null) model.addAttribute("input", input);
+        return "governance/screen/weights/add";
+    }
+
+    /**
+     * load page for the multi adding
+     *
+     * @param context
+     */
+    public void multiadd(Map<String, Object> context) {
+        List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
+        context.put("serviceList", serviceList);
+    }
+
+    @RequestMapping("/create")
+    public String create(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        prepare(request, response, model, "create", "weights");
+        String addr = request.getParameter("address");
+        String services = request.getParameter("multiservice");
+        if (services == null || services.trim().length() == 0) {
+            services = request.getParameter("service");
+        }
+        String weight = request.getParameter("weight");
+
+        int w = Integer.parseInt(weight);
+
+        Set<String> addresses = new HashSet<String>();
+        BufferedReader reader = new BufferedReader(new StringReader(addr));
+        while (true) {
+            String line = reader.readLine();
+            if (null == line)
+                break;
+
+            String[] split = line.split("[\\s,;]+");
+            for (String s : split) {
+                if (s.length() == 0)
+                    continue;
+
+                String ip = s;
+                String port = null;
+                if (s.indexOf(":") != -1) {
+                    ip = s.substring(0, s.indexOf(":"));
+                    port = s.substring(s.indexOf(":") + 1, s.length());
+                    if (port.trim().length() == 0) port = null;
+                }
+                if (!IP_PATTERN.matcher(ip).matches()) {
+                    model.addAttribute("message", "illegal IP: " + s);
+                    model.addAttribute("success", false);
+                    model.addAttribute("redirect", "../weights");
+                    return "governance/screen/redirect";
+                }
+                if (LOCAL_IP_PATTERN.matcher(ip).matches() || ALL_IP_PATTERN.matcher(ip).matches()) {
+                    model.addAttribute("message", "local IP or any host ip is illegal: " + s);
+                    model.addAttribute("success", false);
+                    model.addAttribute("redirect", "../weights");
+                    return "governance/screen/redirect";
+                }
+                if (port != null) {
+                    if (!NumberUtils.isDigits(port)) {
+                        model.addAttribute("message", "illegal port: " + s);
+                        model.addAttribute("success", false);
+                        model.addAttribute("redirect", "../weights");
+                        return "governance/screen/redirect";
+                    }
+                }
+                addresses.add(s);
+            }
+        }
+
+        Set<String> aimServices = new HashSet<String>();
+        reader = new BufferedReader(new StringReader(services));
+        while (true) {
+            String line = reader.readLine();
+            if (null == line)
+                break;
+
+            String[] split = line.split("[\\s,;]+");
+            for (String s : split) {
+                if (s.length() == 0)
+                    continue;
+                if (!super.currentUser.hasServicePrivilege(s)) {
+                    model.addAttribute("message", getMessage("HaveNoServicePrivilege", s));
+                    model.addAttribute("success", false);
+                    model.addAttribute("redirect", "../weights");
+                    return "governance/screen/redirect";
+                }
+                aimServices.add(s);
+            }
+        }
+
+        for (String aimService : aimServices) {
+            for (String a : addresses) {
+                Weight wt = new Weight();
+                wt.setUsername((String) ((BindingAwareModelMap)model).get("operator"));
+                wt.setAddress(Tool.getIP(a));
+                wt.setService(aimService);
+                wt.setWeight(w);
+                overrideService.saveOverride(OverrideUtils.weightToOverride(wt));
+            }
+        }
+        model.addAttribute("success", true);
+        model.addAttribute("redirect", "../weights");
+        return "governance/screen/redirect";
+    }
+
+    @RequestMapping("/{id}/edit")
+    public String edit(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "edit", "weights");
+        String service = request.getParameter("service");
+        String input = request.getParameter("input");
+
+        if (service != null && service.length() > 0 && !service.contains("*")) {
+            List<Provider> providerList = providerService.findByService(service);
+            List<String> addressList = new ArrayList<String>();
+            for (Provider provider : providerList) {
+                addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
+            }
+            model.addAttribute("addressList", addressList);
+            model.addAttribute("service", service);
+            model.addAttribute("methods", CollectionUtils.sort(providerService.findMethodsByService(service)));
+        } else {
+            List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
+            model.addAttribute("serviceList", serviceList);
+        }
+        if (input != null) model.addAttribute("input", input);
+        Weight weight = OverrideUtils.overrideToWeight(overrideService.findById(id));
+        model.addAttribute("weight", weight);
+        model.addAttribute("service", overrideService.findById(id).getService());
+        return "governance/screen/weights/edit";
+    }
+
+    //public void sameSeviceEdit(Long id, Map<String, Object> context) {
+    //    add(context);
+    //    show(id, context);
+    //}
+
+    /**
+     * load weight for editing
+     *
+     * @param id
+
+     */
+    @RequestMapping("/{id}")
+    public String show(@PathVariable("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "show", "weights");
+        Weight weight = OverrideUtils.overrideToWeight(overrideService.findById(id));
+        model.addAttribute("weight", weight);
+        return "governance/screen/weights/show";
+    }
+
+    @RequestMapping(value = "/update", method = RequestMethod.POST) //post
+    public String update(Weight weight, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "update", "weights");
+        boolean success = true;
+        if (!super.currentUser.hasServicePrivilege(weight.getService())) {
+            model.addAttribute("message", getMessage("HaveNoServicePrivilege", weight.getService()));
+            success = false;
+        } else {
+            weight.setAddress(Tool.getIP(weight.getAddress()));
+            overrideService.updateOverride(OverrideUtils.weightToOverride(weight));
+        }
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "governance/weights");
+        return "governance/screen/redirect";
+    }
+
+    /**
+     * delete
+     *
+     * @param ids
+     * @return
+     */
+    @RequestMapping("/{ids}/delete")
+    public String delete(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "delete", "weights");
+        boolean success = true;
+        for (Long id : ids) {
+            Weight w = OverrideUtils.overrideToWeight(overrideService.findById(id));
+            if (!super.currentUser.hasServicePrivilege(w.getService())) {
+                model.addAttribute("message", getMessage("HaveNoServicePrivilege", w.getService()));
+                success = false;
+                model.addAttribute("success", success);
+                model.addAttribute("redirect", "../../weights");
+                return "governance/screen/redirect";
+            }
+        }
+
+        for (Long id : ids) {
+            overrideService.deleteOverride(id);
+        }
+        model.addAttribute("success", success);
+        model.addAttribute("redirect", "../../weights");
+        return "governance/screen/redirect";
+    }
+
+}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Disable.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/DisableController.java
similarity index 87%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Disable.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/DisableController.java
index 7d4f1a4..14453a3 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Disable.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/DisableController.java
@@ -14,18 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
 
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Map;
 
-public class Disable extends Shell {
+import javax.servlet.http.HttpServletRequest;
+
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class DisableController extends ShellController {
 
     @Autowired
     private ProviderService providerService;
@@ -58,7 +59,7 @@ protected String doExecute(Map<String, Object> context) throws Exception {
                 providerService.disableProvider(provider.getId());
             }
         }
-        return "Disable " + (providers == null ? 0 : providers.size()) + " services.";
+        return "DisableController " + (providers == null ? 0 : providers.size()) + " services.";
     }
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Index.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/IndexController.java
similarity index 62%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Index.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/IndexController.java
index 4569a20..b6bb565 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Index.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/IndexController.java
@@ -14,43 +14,43 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
 
-import com.alibaba.citrus.turbine.Context;
-import com.alibaba.dubbo.common.logger.Logger;
-import com.alibaba.dubbo.common.logger.LoggerFactory;
-import com.alibaba.dubbo.governance.service.ConsumerService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.pulltool.RootContextPath;
-import com.alibaba.dubbo.registry.common.domain.Consumer;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
+package com.alibaba.dubboadmin.web.mvc.home;
 
-import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-/**
- * Index
- *
- */
-public class Index {
-    // logger
-    private static final Logger logger = LoggerFactory.getLogger(Index.class);
+import javax.servlet.http.HttpServletRequest;
 
-    @Autowired
-    private HttpServletRequest request;
+import com.alibaba.dubbo.common.logger.Logger;
+import com.alibaba.dubbo.common.logger.LoggerFactory;
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.governance.util.WebConstants;
+import com.alibaba.dubboadmin.registry.common.domain.Consumer;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.web.pulltool.RootContextPath;
+import com.alibaba.dubboadmin.web.pulltool.Tool;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+public class IndexController {
+
+    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
     @Autowired
     private ProviderService providerService;
 
     @Autowired
     private ConsumerService consumerService;
 
-    public void execute(Context context) {
+    @RequestMapping("/")
+    public String indexRequest(HttpServletRequest request, Model model) {
         Set<String> applications = new HashSet<String>();
         Set<String> services = new HashSet<String>();
         List<Provider> pList = new ArrayList<Provider>();
@@ -73,11 +73,15 @@ public void execute(Context context) {
             applications.add(c.getApplication());
             services.add(c.getService());
         }
-        context.put("rootContextPath", new RootContextPath(request.getContextPath()));
-        context.put("services", services.size());
-        context.put("providers", pList.size());
-        context.put("consumers", cList.size());
-        context.put("applications", applications.size());
+        model.addAttribute("rootContextPath", new RootContextPath(request.getContextPath()));
+        model.addAttribute("services", services.size());
+        model.addAttribute("providers", pList.size());
+        model.addAttribute("consumers", cList.size());
+        model.addAttribute("applications", applications.size());
+        model.addAttribute("helpUrl", WebConstants.HELP_URL);
+        model.addAttribute("tool", new Tool());
+        return "home/screen/index";
+
     }
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Lookup.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/LookupController.java
similarity index 86%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Lookup.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/LookupController.java
index 22c2873..df8a795 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Lookup.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/LookupController.java
@@ -14,19 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.governance.service.ConsumerService;
 import com.alibaba.dubbo.registry.RegistryService;
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class Lookup extends Restful {
+public class LookupController extends RestfulController {
 
     @Autowired
     ConsumerService consumerDAO;
@@ -34,7 +34,7 @@
     @Autowired
     private RegistryService registryService;
 
-    public Result doExecute(Map<String, Object> context) throws Exception {
+    public ResultController doExecute(Map<String, Object> context) throws Exception {
         String inf = request.getParameter("interface");
         if (inf == null || inf.isEmpty()) {
             throw new IllegalArgumentException("please give me the interface");
@@ -75,9 +75,9 @@ public Result doExecute(Map<String, Object> context) throws Exception {
             urls.put(u2.toIdentityString(), u2.toParameterString());
         }
 
-        Result result = new Result();
-        result.setMessage(serviceUrl);
-        return result;
+        ResultController resultController = new ResultController();
+        resultController.setMessage(serviceUrl);
+        return resultController;
     }
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Reg.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/RegController.java
similarity index 81%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Reg.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/RegController.java
index 5cf91bd..cf967a4 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Reg.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/RegController.java
@@ -14,14 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
 
 import java.util.HashMap;
 import java.util.Map;
 
-public class Reg extends Restful {
+public class RegController extends RestfulController {
 
-    public Result doExecute(Map<String, Object> context) throws Exception {
+    public ResultController doExecute(Map<String, Object> context) throws Exception {
         if (url == null) {
             throw new IllegalArgumentException("please give me the url");
         }
@@ -34,9 +34,9 @@ public Result doExecute(Map<String, Object> context) throws Exception {
         register.put(url.getPath(), tmp);
 //        Map<String, Map<String, String>> newRegister = RegistryUtils.convertRegister(register);
 //        registryService.register(operatorAddress, newRegister, false);
-        Result result = new Result();
-        result.setMessage("Register Successfully!");
-        return result;
+        ResultController resultController = new ResultController();
+        resultController.setMessage("RegisterController Successfully!");
+        return resultController;
     }
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Register.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/RegisterController.java
similarity index 93%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Register.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/RegisterController.java
index e842af7..fdcc59d 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Register.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/RegisterController.java
@@ -14,20 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
 
 import com.alibaba.dubbo.common.utils.CollectionUtils;
 import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.ProviderService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
-import javax.servlet.http.HttpServletRequest;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Register extends Shell {
+public class RegisterController extends ShellController {
 
     @Autowired
     private ProviderService providerDAO;
@@ -69,6 +70,6 @@ protected String doExecute(Map<String, Object> context) throws Exception {
         if (map.size() > 0) {
 //        	providerDAO.register(registryCache.getCurrentRegistry(), request.getRemoteAddr(), operatorAddress, operator, map, false, true);
         }
-        return "Register " + map.size() + " services.";
+        return "RegisterController " + map.size() + " services.";
     }
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Restful.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/RestfulController.java
similarity index 74%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Restful.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/RestfulController.java
index 48c9378..f9c208f 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Restful.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/RestfulController.java
@@ -14,21 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
 
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.governance.web.util.WebConstants;
-import com.alibaba.dubbo.registry.common.domain.User;
-import com.alibaba.fastjson.JSON;
-
-import org.springframework.beans.factory.annotation.Autowired;
+import java.util.Map;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.Map;
 
-public abstract class Restful {
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubboadmin.governance.util.WebConstants;
+import com.alibaba.dubboadmin.registry.common.domain.User;
+import com.alibaba.fastjson.JSON;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+public abstract class RestfulController {
 
     protected String role = null;
     protected String operator = null;
@@ -44,7 +45,7 @@
     private HttpServletResponse response;
 
     public void execute(Map<String, Object> context) throws Exception {
-        Result result = new Result();
+        ResultController resultController = new ResultController();
         if (request.getParameter("url") != null) {
             url = URL.valueOf(URL.decode(request.getParameter("url")));
         }
@@ -63,27 +64,27 @@ public void execute(Map<String, Object> context) throws Exception {
         context.put("operatorAddress", operatorAddress);
         String jsonResult = null;
         try {
-            result = doExecute(context);
-            result.setStatus("OK");
+            resultController = doExecute(context);
+            resultController.setStatus("OK");
         } catch (IllegalArgumentException t) {
-            result.setStatus("ERROR");
-            result.setCode(3);
-            result.setMessage(t.getMessage());
+            resultController.setStatus("ERROR");
+            resultController.setCode(3);
+            resultController.setMessage(t.getMessage());
         }
 //        catch (InvalidRequestException t) {
-//            result.setStatus("ERROR");
-//            result.setCode(2);
-//            result.setMessage(t.getMessage());
+//            resultController.setStatus("ERROR");
+//            resultController.setCode(2);
+//            resultController.setMessage(t.getMessage());
 //        }
         catch (Throwable t) {
-            result.setStatus("ERROR");
-            result.setCode(1);
-            result.setMessage(t.getMessage());
+            resultController.setStatus("ERROR");
+            resultController.setCode(1);
+            resultController.setMessage(t.getMessage());
         }
         response.setContentType("application/javascript");
         ServletOutputStream os = response.getOutputStream();
         try {
-            jsonResult = JSON.toJSONString(result);
+            jsonResult = JSON.toJSONString(resultController);
             os.print(jsonResult);
         } catch (Exception e) {
             response.setStatus(500);
@@ -93,6 +94,6 @@ public void execute(Map<String, Object> context) throws Exception {
         }
     }
 
-    protected abstract Result doExecute(Map<String, Object> context) throws Exception;
+    protected abstract ResultController doExecute(Map<String, Object> context) throws Exception;
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Result.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/ResultController.java
similarity index 93%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Result.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/ResultController.java
index 3dce14a..6b5e667 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Result.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/ResultController.java
@@ -14,11 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
 
 import java.io.Serializable;
 
-public class Result implements Serializable {
+public class ResultController implements Serializable {
 
     private static final long serialVersionUID = 4922467873471920132L;
     private String status;
@@ -65,7 +65,7 @@ public boolean equals(Object obj) {
         if (this == obj) return true;
         if (obj == null) return false;
         if (getClass() != obj.getClass()) return false;
-        Result other = (Result) obj;
+        ResultController other = (ResultController) obj;
         if (code != other.code) return false;
         if (message == null) {
             if (other.message != null) return false;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Servicestatus.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/ServicestatusController.java
similarity index 90%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Servicestatus.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/ServicestatusController.java
index aae76ff..4aacb22 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Servicestatus.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/ServicestatusController.java
@@ -14,18 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
 
-import com.alibaba.dubbo.governance.service.ProviderService;
-
-import org.springframework.beans.factory.annotation.Autowired;
+import java.io.PrintWriter;
+import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.PrintWriter;
-import java.util.Map;
 
-public class Servicestatus {
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class ServicestatusController {
 //    @Autowired
 //    private RegistryCache registryCache;
 
@@ -54,7 +55,7 @@ public void execute(Map<String, Object> context) throws Exception {
 //        if (providers == null || providers.size() == 0) {
 //            context.put("message", "ERROR"
 //                        + new SimpleDateFormat(" [yyyy-MM-dd HH:mm:ss] ").format(new Date())
-//                        + Status.filterOK("No such any provider for service " + uri));
+//                        + StatusController.filterOK("No such any provider for service " + uri));
 //        } else {
 //            context.put("message", "OK");
 //        }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Shell.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/ShellController.java
similarity index 93%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Shell.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/ShellController.java
index 9eb5975..06cc90e 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Shell.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/ShellController.java
@@ -14,19 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
 
-import com.alibaba.dubbo.governance.web.util.WebConstants;
-import com.alibaba.dubbo.registry.common.domain.User;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.HttpServletResponse;
 import java.io.PrintWriter;
 import java.util.Map;
 import java.util.regex.Pattern;
 
-public abstract class Shell {
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubboadmin.governance.util.WebConstants;
+import com.alibaba.dubboadmin.registry.common.domain.User;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+public abstract class ShellController {
     private static final Pattern OK_PATTERN = Pattern.compile("ok", Pattern.CASE_INSENSITIVE);
     private static final Pattern ERROR_PATTERN = Pattern.compile("error", Pattern.CASE_INSENSITIVE);
     protected String role = null;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Status.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/StatusController.java
similarity index 89%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Status.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/StatusController.java
index 276c934..fabeff7 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Status.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/StatusController.java
@@ -14,15 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
 
-import com.alibaba.dubbo.common.status.Status.Level;
-import com.alibaba.dubbo.common.status.StatusChecker;
-import com.alibaba.dubbo.registry.common.StatusManager;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.HttpServletResponse;
 import java.io.PrintWriter;
 import java.text.SimpleDateFormat;
 import java.util.Collection;
@@ -30,7 +23,15 @@
 import java.util.Map;
 import java.util.regex.Pattern;
 
-public class Status {
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.status.Status.Level;
+import com.alibaba.dubbo.common.status.StatusChecker;
+import com.alibaba.dubboadmin.registry.common.StatusManager;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class StatusController {
     private static final Pattern OK_PATTERN = Pattern.compile("o(k)", Pattern.CASE_INSENSITIVE);
     @Autowired
     private HttpServletResponse response;
@@ -44,7 +45,8 @@ public static String filterOK(String message) {
 
     public void execute(Map<String, Object> context) throws Exception {
         //FIXME cache monitoring has bad performance, should be removed from summary page.
-        Map<String, com.alibaba.dubbo.common.status.Status> statuses = StatusManager.getInstance().getStatusList(new String[]{"cache"});
+        Map<String, com.alibaba.dubbo.common.status.Status>
+            statuses = StatusManager.getInstance().getStatusList(new String[]{"cache"});
         com.alibaba.dubbo.common.status.Status status = StatusManager.getInstance().getStatusSummary(statuses);
         Level level = status.getLevel();
         if (!com.alibaba.dubbo.common.status.Status.Level.OK.equals(level)) {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Unreg.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/UnregController.java
similarity index 82%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Unreg.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/UnregController.java
index 1f3729a..3f76318 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Unreg.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/UnregController.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -25,9 +25,9 @@
  * UnReg.java
  *
  */
-public class Unreg extends Restful {
+public class UnregController extends RestfulController {
 
-    public Result doExecute(Map<String, Object> context) throws Exception {
+    public ResultController doExecute(Map<String, Object> context) throws Exception {
         if (url == null) {
             throw new IllegalArgumentException("please give me the url");
         }
@@ -48,9 +48,9 @@ public Result doExecute(Map<String, Object> context) throws Exception {
         }
         services.put(name, serviceUrl);
 //        registryService.unregister(operatorAddress,services);
-        Result result = new Result();
-        result.setMessage("Unregister Successfully!");
-        return result;
+        ResultController resultController = new ResultController();
+        resultController.setMessage("UnregisterController Successfully!");
+        return resultController;
     }
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Unregister.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/UnregisterController.java
similarity index 89%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Unregister.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/UnregisterController.java
index 6bba10c..aae1858 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Unregister.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/UnregisterController.java
@@ -14,20 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
 
-import com.alibaba.dubbo.common.utils.CollectionUtils;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Map.Entry;
 
-public class Unregister extends Shell {
+import javax.servlet.http.HttpServletRequest;
+
+import com.alibaba.dubbo.common.utils.CollectionUtils;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class UnregisterController extends ShellController {
 
     @Autowired
     private ProviderService providervice;
@@ -57,7 +58,7 @@ protected String doExecute(Map<String, Object> context) throws Exception {
             }
         }
 
-        return "Unregister " + params.size() + " services.";
+        return "UnregisterController " + params.size() + " services.";
     }
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Unregisterall.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/UnregisterallController.java
similarity index 87%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Unregisterall.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/UnregisterallController.java
index 378f21c..d4138c1 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/home/module/screen/Unregisterall.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/home/UnregisterallController.java
@@ -14,18 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.home.module.screen;
+package com.alibaba.dubboadmin.web.mvc.home;
 
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Map;
 
-public class Unregisterall extends Shell {
+import javax.servlet.http.HttpServletRequest;
+
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class UnregisterallController extends ShellController {
 
     @Autowired
     private ProviderService providerService;
@@ -54,7 +55,7 @@ protected String doExecute(Map<String, Object> context) throws Exception {
                 providerService.deleteStaticProvider(provider.getId());
             }
         }
-        return "Unregister " + (providers == null ? 0 : providers.size()) + " services.";
+        return "UnregisterController " + (providers == null ? 0 : providers.size()) + " services.";
     }
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/personal/module/screen/Infos.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/personal/InfosController.java
similarity index 86%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/personal/module/screen/Infos.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/personal/InfosController.java
index ec77146..e7808a2 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/personal/module/screen/Infos.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/personal/InfosController.java
@@ -14,17 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.personal.module.screen;
+package com.alibaba.dubboadmin.web.mvc.personal;
 
-import com.alibaba.dubbo.governance.service.UserService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.User;
+import java.util.Map;
 
-import org.springframework.beans.factory.annotation.Autowired;
+import com.alibaba.dubboadmin.governance.service.UserService;
+import com.alibaba.dubboadmin.registry.common.domain.User;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
 
-import java.util.Map;
+import org.springframework.beans.factory.annotation.Autowired;
 
-public class Infos extends Restful {
+public class InfosController extends BaseController {
     @Autowired
     private UserService userDAO;
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/personal/module/screen/Passwds.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/personal/PasswdsController.java
similarity index 83%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/personal/module/screen/Passwds.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/personal/PasswdsController.java
index b40d125..6dfcd6a 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/personal/module/screen/Passwds.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/personal/PasswdsController.java
@@ -14,17 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.personal.module.screen;
+package com.alibaba.dubboadmin.web.mvc.personal;
 
-import com.alibaba.dubbo.governance.service.UserService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.User;
+import java.util.Map;
 
-import org.springframework.beans.factory.annotation.Autowired;
+import com.alibaba.dubboadmin.governance.service.UserService;
+import com.alibaba.dubboadmin.registry.common.domain.User;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
 
-import java.util.Map;
+import org.springframework.beans.factory.annotation.Autowired;
 
-public class Passwds extends Restful {
+public class PasswdsController extends BaseController {
 
     @Autowired
     private UserService userDAO;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Dump.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/DumpController.java
similarity index 76%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Dump.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/DumpController.java
index 5c7e8d9..64cfae3 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Dump.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/DumpController.java
@@ -14,18 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.sysinfo.module.screen;
+package com.alibaba.dubboadmin.web.mvc.sysinfo;
 
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.ConsumerService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Consumer;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -37,7 +27,24 @@
 import java.util.Map;
 import java.util.Set;
 
-public class Dump extends Restful {
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Consumer;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/sysinfo/dump")
+public class DumpController extends BaseController {
 
     @Autowired
     ProviderService providerDAO;
@@ -45,10 +52,10 @@
     @Autowired
     ConsumerService consumerDAO;
 
-    @Autowired
-    HttpServletResponse response;
 
-    public void noProviders(Map<String, Object> context) throws IOException {
+    @RequestMapping("/noProviders")
+    public void noProviders(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {
+        prepare(request, response, model, "noProviders", "dump");
         PrintWriter writer = response.getWriter();
         List<String> sortedService = getNoProviders();
         Collections.sort(sortedService);
@@ -60,7 +67,9 @@ public void noProviders(Map<String, Object> context) throws IOException {
         response.setContentType("text/plain");
     }
 
-    public void services(Map<String, Object> context) throws IOException {
+    @RequestMapping("/services")
+    public void services(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {
+        prepare(request, response, model, "noProviders", "services");
         PrintWriter writer = response.getWriter();
         List<String> sortedService = providerDAO.findServices();
         Collections.sort(sortedService);
@@ -72,7 +81,8 @@ public void services(Map<String, Object> context) throws IOException {
         response.setContentType("text/plain");
     }
 
-    public void providers(Map<String, Object> context) throws IOException {
+    @RequestMapping("/providers")
+    public void providers(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {
         PrintWriter writer = response.getWriter();
         List<Provider> providers = providerDAO.findAll();
         List<String> sortedProviders = new ArrayList<String>();
@@ -88,7 +98,8 @@ public void providers(Map<String, Object> context) throws IOException {
         response.setContentType("text/plain");
     }
 
-    public void consumers(Map<String, Object> context) throws IOException {
+    @RequestMapping("/consumers")
+    public void consumers(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {
         PrintWriter writer = response.getWriter();
         List<Consumer> consumers = consumerDAO.findAll();
         List<String> sortedConsumerss = new ArrayList<String>();
@@ -104,7 +115,8 @@ public void consumers(Map<String, Object> context) throws IOException {
         response.setContentType("text/plain");
     }
 
-    public void versions(Map<String, Object> context) throws IOException {
+    @RequestMapping("/versions")
+    public void versions(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {
         PrintWriter writer = response.getWriter();
         List<Provider> providers = providerDAO.findAll();
         List<Consumer> consumers = consumerDAO.findAll();
@@ -134,7 +146,7 @@ public void versions(Map<String, Object> context) throws IOException {
             writer.println(StringUtils.join(versions.get(version), "\n"));
             writer.println("\n");
         }
-        context.put("versions", versions);
+        model.addAttribute("versions", versions);
         writer.flush();
         response.setContentType("text/plain");
     }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Dumps.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/DumpsController.java
similarity index 60%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Dumps.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/DumpsController.java
index 66c5a1a..d7b4ff0 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Dumps.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/DumpsController.java
@@ -14,20 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.sysinfo.module.screen;
+package com.alibaba.dubboadmin.web.mvc.sysinfo;
 
-import com.alibaba.dubbo.governance.service.ConsumerService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
-public class Dumps extends Restful {
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/sysinfo/dumps")
+public class DumpsController extends BaseController {
 
     @Autowired
     ProviderService providerDAO;
@@ -38,11 +44,14 @@
     @Autowired
     HttpServletResponse response;
 
-    public void index(Map<String, Object> context) {
-        context.put("noProviderServices", getNoProviders());
-        context.put("services", providerDAO.findServices());
-        context.put("providers", providerDAO.findAll());
-        context.put("consumers", consumerDAO.findAll());
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "index", "dumps");
+        model.addAttribute("noProviderServices", getNoProviders());
+        model.addAttribute("services", providerDAO.findServices());
+        model.addAttribute("providers", providerDAO.findAll());
+        model.addAttribute("consumers", consumerDAO.findAll());
+        return "sysinfo/screen/dumps/index";
     }
 
     private List<String> getNoProviders() {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Envs.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/EnvsController.java
similarity index 80%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Envs.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/EnvsController.java
index 8b30b1a..839b413 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Envs.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/EnvsController.java
@@ -14,11 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.sysinfo.module.screen;
-
-import com.alibaba.dubbo.common.Version;
-import com.alibaba.dubbo.common.utils.NetUtils;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
+package com.alibaba.dubboadmin.web.mvc.sysinfo;
 
 import java.lang.management.ManagementFactory;
 import java.text.SimpleDateFormat;
@@ -27,18 +23,33 @@
 import java.util.Map;
 import java.util.TreeMap;
 
-public class Envs extends Restful {
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.Version;
+import com.alibaba.dubbo.common.utils.NetUtils;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/sysinfo/envs")
+public class EnvsController extends BaseController {
 
     private static final long SECOND = 1000;
     private static final long MINUTE = 60 * SECOND;
     private static final long HOUR = 60 * MINUTE;
     private static final long DAY = 24 * HOUR;
 
-    public void index(Map<String, Object> context) throws Exception {
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        prepare(request, response, model, "index", "envs");
         Map<String, String> properties = new TreeMap<String, String>();
         StringBuilder msg = new StringBuilder();
         msg.append("Version: ");
-        msg.append(Version.getVersion(Envs.class, "2.2.0"));
+        msg.append(Version.getVersion(EnvsController.class, "2.2.0"));
         properties.put("Registry", msg.toString());
         String address = NetUtils.getLocalHost();
         properties.put("Host", NetUtils.getHostName(address) + "/" + address);
@@ -50,9 +61,11 @@ public void index(Map<String, Object> context) throws Exception {
         properties.put("Locale", Locale.getDefault().toString() + "/"
                 + System.getProperty("file.encoding"));
         properties.put("Uptime", formatUptime(ManagementFactory.getRuntimeMXBean().getUptime())
-                + " From " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z").format(new Date(ManagementFactory.getRuntimeMXBean().getStartTime()))
+                + " From " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z").format(new Date(
+            ManagementFactory.getRuntimeMXBean().getStartTime()))
                 + " To " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z").format(new Date()));
-        context.put("properties", properties);
+        model.addAttribute("properties", properties);
+        return "sysinfo/screen/envs/index";
     }
 
     private String formatUptime(long uptime) {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Logs.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/LogsController.java
similarity index 73%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Logs.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/LogsController.java
index 565888c..0e24af4 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Logs.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/LogsController.java
@@ -14,12 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.sysinfo.module.screen;
-
-import com.alibaba.dubbo.common.logger.Level;
-import com.alibaba.dubbo.common.logger.LoggerFactory;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.User;
+package com.alibaba.dubboadmin.web.mvc.sysinfo;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -29,11 +24,27 @@
 import java.util.Date;
 import java.util.Map;
 
-public class Logs extends Restful {
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.logger.Level;
+import com.alibaba.dubbo.common.logger.LoggerFactory;
+import com.alibaba.dubboadmin.registry.common.domain.User;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/sysinfo/logs")
+public class LogsController extends BaseController {
 
     private static final int SHOW_LOG_LENGTH = 30000;
 
-    public void index(Map<String, Object> context) throws Exception {
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
+        prepare(request, response, model, "index", "logs");
         long size;
         String content;
         String modified;
@@ -60,11 +71,12 @@ public void index(Map<String, Object> context) throws Exception {
             modified = "Not exist";
         }
         Level level = LoggerFactory.getLevel();
-        context.put("name", file == null ? "" : file.getAbsoluteFile());
-        context.put("size", String.valueOf(size));
-        context.put("level", level == null ? "" : level);
-        context.put("modified", modified);
-        context.put("content", content);
+        model.addAttribute("name", file == null ? "" : file.getAbsoluteFile());
+        model.addAttribute("size", String.valueOf(size));
+        model.addAttribute("level", level == null ? "" : level);
+        model.addAttribute("modified", modified);
+        model.addAttribute("content", content);
+        return "sysinfo/screen/logs/index";
     }
 
     public boolean change(Map<String, Object> context) throws Exception {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Statuses.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/StatusesController.java
similarity index 61%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Statuses.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/StatusesController.java
index 6c63849..ad2b2fb 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Statuses.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/StatusesController.java
@@ -14,20 +14,34 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.sysinfo.module.screen;
+package com.alibaba.dubboadmin.web.mvc.sysinfo;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 import com.alibaba.dubbo.common.extension.ExtensionLoader;
+import com.alibaba.dubbo.common.status.Status;
 import com.alibaba.dubbo.common.status.StatusChecker;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.StatusManager;
+import com.alibaba.dubboadmin.registry.common.StatusManager;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
 
-import java.util.LinkedHashMap;
-import java.util.Map;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/sysinfo/statuses")
+public class StatusesController extends BaseController {
+
+    @RequestMapping("")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
 
-public class Statuses extends Restful {
-    public void index(Map<String, Object> context) throws Exception {
+        prepare(request, response, model, "index", "status");
         ExtensionLoader<StatusChecker> loader = ExtensionLoader.getExtensionLoader(StatusChecker.class);
-        Map<String, com.alibaba.dubbo.common.status.Status> statusList = new LinkedHashMap<String, com.alibaba.dubbo.common.status.Status>();
+        Map<String, Status> statusList = new LinkedHashMap<String, Status>();
         for (String name : loader.getSupportedExtensions()) {
             com.alibaba.dubbo.common.status.Status status = loader.getExtension(name).check();
             if (status.getLevel() != null && status.getLevel() != com.alibaba.dubbo.common.status.Status.Level.UNKNOWN) {
@@ -35,6 +49,7 @@ public void index(Map<String, Object> context) throws Exception {
             }
         }
         statusList.put("summary", StatusManager.getStatusSummary(statusList));
-        context.put("statusList", statusList);
+        model.addAttribute("statusList", statusList);
+        return "sysinfo/screen/statuses/index";
     }
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Versions.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/VersionsController.java
similarity index 70%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Versions.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/VersionsController.java
index 78c8952..711d2ff 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysinfo/module/screen/Versions.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysinfo/VersionsController.java
@@ -14,16 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.sysinfo.module.screen;
-
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.ConsumerService;
-import com.alibaba.dubbo.governance.service.ProviderService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Consumer;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
+package com.alibaba.dubboadmin.web.mvc.sysinfo;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -32,14 +23,34 @@
 import java.util.Map;
 import java.util.Set;
 
-public class Versions extends Restful {
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.ConsumerService;
+import com.alibaba.dubboadmin.governance.service.ProviderService;
+import com.alibaba.dubboadmin.registry.common.domain.Consumer;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/sysinfo")
+public class VersionsController extends BaseController {
     @Autowired
     private ProviderService providerService;
 
     @Autowired
     private ConsumerService consumerService;
 
-    public void index(Map<String, Object> context) {
+    @RequestMapping("/versions")
+    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
+        prepare(request, response, model, "index", "versions");
         List<Provider> providers = providerService.findAll();
         List<Consumer> consumers = consumerService.findAll();
         Set<String> parametersSet = new HashSet<String>();
@@ -64,11 +75,14 @@ public void index(Map<String, Object> context) {
                 versions.get(dubbo).add(application);
             }
         }
-        context.put("versions", versions);
+        model.addAttribute("versions", versions);
+        return "sysinfo/screen/versions/index";
     }
 
-    public void show(Long[] ids, Map<String, Object> context) {
-        String version = (String) context.get("version");
+    @RequestMapping("/version/{version}/versions/show")
+    public String show(@PathVariable("version") String version, HttpServletRequest request, HttpServletResponse response,
+                     Model model) {
+        prepare(request, response, model, "show", "versions");
         if (version != null && version.length() > 0) {
             List<Provider> providers = providerService.findAll();
             List<Consumer> consumers = consumerService.findAll();
@@ -92,8 +106,9 @@ public void show(Long[] ids, Map<String, Object> context) {
                     }
                 }
             }
-            context.put("applications", applications);
+            model.addAttribute("applications", applications);
         }
+        return "sysinfo/screen/versions/show";
     }
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysmanage/module/screen/Configs.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysmanage/ConfigsController.java
similarity index 90%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysmanage/module/screen/Configs.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysmanage/ConfigsController.java
index 8d71ed3..e7207a2 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysmanage/module/screen/Configs.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysmanage/ConfigsController.java
@@ -14,16 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.sysmanage.module.screen;
+package com.alibaba.dubboadmin.web.mvc.sysmanage;
 
-import com.alibaba.dubbo.governance.service.ConfigService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-import com.alibaba.dubbo.registry.common.domain.Config;
-import com.alibaba.dubbo.registry.common.domain.User;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -31,7 +23,16 @@
 import java.util.Map;
 import java.util.Set;
 
-public class Configs extends Restful {
+import javax.servlet.http.HttpServletRequest;
+
+import com.alibaba.dubboadmin.governance.service.ConfigService;
+import com.alibaba.dubboadmin.registry.common.domain.Config;
+import com.alibaba.dubboadmin.registry.common.domain.User;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class ConfigsController extends BaseController {
 
     @Autowired
     private ConfigService configDAO;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysmanage/module/screen/Privileges.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysmanage/PrivilegesController.java
similarity index 81%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysmanage/module/screen/Privileges.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysmanage/PrivilegesController.java
index dbf83e8..816d025 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysmanage/module/screen/Privileges.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysmanage/PrivilegesController.java
@@ -14,10 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.sysmanage.module.screen;
+package com.alibaba.dubboadmin.web.mvc.sysmanage;
 
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
 
-public class Privileges extends Restful {
+public class PrivilegesController extends BaseController {
 
 }
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysmanage/module/screen/Userown.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysmanage/UserownController.java
similarity index 81%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysmanage/module/screen/Userown.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysmanage/UserownController.java
index 6d52ead..937a1ff 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/sysmanage/module/screen/Userown.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/mvc/sysmanage/UserownController.java
@@ -14,21 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.sysmanage.module.screen;
-
-import com.alibaba.dubbo.governance.service.OwnerService;
-import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
-
-import org.springframework.beans.factory.annotation.Autowired;
+package com.alibaba.dubboadmin.web.mvc.sysmanage;
 
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubboadmin.governance.service.OwnerService;
+import com.alibaba.dubboadmin.web.mvc.BaseController;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
 /**
- * Providers. URI: /services/$service/owners
+ * ProvidersController. URI: /services/$service/owners
  *
  */
-public class Userown extends Restful {
+public class UserownController extends BaseController {
 
     @Autowired
     private OwnerService ownerDAO;
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/DateFormatUtil.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/DateFormatUtil.java
similarity index 95%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/DateFormatUtil.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/DateFormatUtil.java
index 6993bb3..caa6819 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/DateFormatUtil.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/DateFormatUtil.java
@@ -1,5 +1,4 @@
 
-package com.alibaba.dubbo.governance.web.common.pulltool;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -16,13 +15,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import org.apache.commons.lang.StringUtils;
+
+package com.alibaba.dubboadmin.web.pulltool;
 
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
+
 /**
  * DateFormat Utility
  *
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/I18nMessageTool.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/I18nMessageTool.java
new file mode 100644
index 0000000..6933979
--- /dev/null
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/I18nMessageTool.java
@@ -0,0 +1,46 @@
+///*
+// * 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 com.alibaba.dubboadmin.web.pulltool;
+//
+//import com.alibaba.citrus.service.pull.ToolFactory;
+//import com.alibaba.dubbo.governance.biz.common.i18n.MessageResourceService;
+//
+//import org.springframework.beans.factory.annotation.Autowired;
+//
+///**
+// * PullTool for accessing message bundle.
+// *x
+// */
+//public class I18nMessageTool implements ToolFactory {
+//
+//    @Autowired
+//    private MessageResourceService messageResourceService;
+//    private boolean singleton = true;
+//
+//    public Object createTool() throws Exception {
+//        return messageResourceService;
+//    }
+//
+//    public boolean isSingleton() {
+//        return this.singleton;
+//    }
+//
+//    public void setSingleton(boolean singleton) {
+//        this.singleton = singleton;
+//    }
+//
+//}
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/RootContextPath.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/RootContextPath.java
similarity index 95%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/RootContextPath.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/RootContextPath.java
index f1f297d..827c58b 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/RootContextPath.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/RootContextPath.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.common.pulltool;
+package com.alibaba.dubboadmin.web.pulltool;
 
 public class RootContextPath {
 
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/Tool.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/Tool.java
similarity index 94%
rename from dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/Tool.java
rename to dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/Tool.java
index 0abdfb0..fd58f37 100644
--- a/dubbo-admin/src/main/java/com/alibaba/dubbo/governance/web/common/pulltool/Tool.java
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/Tool.java
@@ -14,23 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.dubbo.governance.web.common.pulltool;
-
-import com.alibaba.dubbo.common.Constants;
-import com.alibaba.dubbo.common.URL;
-import com.alibaba.dubbo.common.utils.NetUtils;
-import com.alibaba.dubbo.common.utils.StringUtils;
-import com.alibaba.dubbo.governance.service.OverrideService;
-import com.alibaba.dubbo.governance.service.RouteService;
-import com.alibaba.dubbo.registry.common.domain.Consumer;
-import com.alibaba.dubbo.registry.common.domain.Override;
-import com.alibaba.dubbo.registry.common.domain.Provider;
-import com.alibaba.dubbo.registry.common.domain.Route;
-import com.alibaba.dubbo.registry.common.domain.User;
-import com.alibaba.dubbo.registry.common.route.ParseUtils;
-import com.alibaba.dubbo.registry.common.route.RouteRule;
-import com.alibaba.dubbo.registry.common.route.RouteRule.MatchPair;
-import com.alibaba.dubbo.registry.common.util.StringEscapeUtils;
+package com.alibaba.dubboadmin.web.pulltool;
 
 import java.io.PrintWriter;
 import java.io.StringWriter;
@@ -47,10 +31,30 @@
 import java.util.List;
 import java.util.Map;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubbo.common.utils.NetUtils;
+import com.alibaba.dubbo.common.utils.StringUtils;
+import com.alibaba.dubboadmin.governance.service.OverrideService;
+import com.alibaba.dubboadmin.governance.service.RouteService;
+import com.alibaba.dubboadmin.registry.common.domain.Consumer;
+import com.alibaba.dubboadmin.registry.common.domain.Override;
+import com.alibaba.dubboadmin.registry.common.domain.Provider;
+import com.alibaba.dubboadmin.registry.common.domain.Route;
+import com.alibaba.dubboadmin.registry.common.domain.User;
+import com.alibaba.dubboadmin.registry.common.route.ParseUtils;
+import com.alibaba.dubboadmin.registry.common.route.RouteRule;
+import com.alibaba.dubboadmin.registry.common.route.RouteRule.MatchPair;
+import com.alibaba.dubboadmin.registry.common.util.StringEscapeUtils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
 /**
  * Tool
  *
  */
+@Component
 public class Tool {
 
     private static final Comparator<String> SIMPLE_NAME_COMPARATOR = new Comparator<String>() {
@@ -69,7 +73,9 @@ public int compare(String s1, String s2) {
             return s1.compareToIgnoreCase(s2);
         }
     };
+    @Autowired
     private OverrideService overrideService;
+    @Autowired
     private RouteService routeService;
 
     public static String toStackTraceString(Throwable t) {
diff --git a/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/ToolUtil.java b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/ToolUtil.java
new file mode 100644
index 0000000..5af098b
--- /dev/null
+++ b/dubbo-admin/src/main/java/com/alibaba/dubboadmin/web/pulltool/ToolUtil.java
@@ -0,0 +1,52 @@
+///*
+// * 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 com.alibaba.dubboadmin.web.pulltool;
+//
+//import com.alibaba.citrus.service.pull.ToolFactory;
+//import com.alibaba.dubbo.governance.service.OverrideService;
+//import com.alibaba.dubbo.governance.service.RouteService;
+//
+//import org.springframework.beans.factory.annotation.Autowired;
+//
+///**
+// * PullTool for accessing message bundle.
+// *
+// */
+//public class ToolUtil implements ToolFactory {
+//    @Autowired
+//    OverrideService overrideService;
+//
+//    @Autowired
+//    RouteService routeService;
+//    private boolean singleton = false;
+//
+//    public Object createTool() throws Exception {
+//        Tool tool = new Tool();
+//        tool.setOverrideService(overrideService);
+//        tool.setRouteService(routeService);
+//        return tool;
+//    }
+//
+//    public boolean isSingleton() {
+//        return this.singleton;
+//    }
+//
+//    public void setSingleton(boolean singleton) {
+//        this.singleton = singleton;
+//    }
+//
+//}
diff --git a/dubbo-admin/src/main/resources/META-INF/spring/dubbo-admin.xml b/dubbo-admin/src/main/resources/META-INF/spring/dubbo-admin.xml
deleted file mode 100644
index 0a49117..0000000
--- a/dubbo-admin/src/main/resources/META-INF/spring/dubbo-admin.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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.xsd
-
-		http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
-
-    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
-        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
-        <property name="ignoreResourceNotFound" value="true"/>
-        <property name="locations">
-            <list>
-                <value>/WEB-INF/dubbo.properties</value>
-                <value>file://${user.home}/dubbo.properties</value>
-            </list>
-        </property>
-    </bean>
-
-    <dubbo:application name="dubbo-admin"/>
-
-    <dubbo:registry address="${dubbo.registry.address}" check="false" file="false"/>
-
-    <dubbo:reference id="registryService" interface="com.alibaba.dubbo.registry.RegistryService" check="false"/>
-
-    <bean id="configService" class="com.alibaba.dubbo.governance.service.impl.ConfigServiceImpl"/>
-
-    <bean id="consumerService" class="com.alibaba.dubbo.governance.service.impl.ConsumerServiceImpl"/>
-
-    <bean id="overrideService" class="com.alibaba.dubbo.governance.service.impl.OverrideServiceImpl"/>
-
-    <bean id="ownerService" class="com.alibaba.dubbo.governance.service.impl.OwnerServiceImpl"/>
-
-    <bean id="providerService" class="com.alibaba.dubbo.governance.service.impl.ProviderServiceImpl"/>
-
-    <bean id="routeService" class="com.alibaba.dubbo.governance.service.impl.RouteServiceImpl"/>
-
-    <bean id="userService" class="com.alibaba.dubbo.governance.service.impl.UserServiceImpl">
-        <property name="rootPassword" value="${dubbo.admin.root.password}"/>
-        <property name="guestPassword" value="${dubbo.admin.guest.password}"/>
-    </bean>
-
-    <bean id="governanceCache" class="com.alibaba.dubbo.governance.sync.RegistryServerSync"/>
-
-</beans>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/application.properties b/dubbo-admin/src/main/resources/application.properties
new file mode 100644
index 0000000..6000c6c
--- /dev/null
+++ b/dubbo-admin/src/main/resources/application.properties
@@ -0,0 +1,28 @@
+#
+# 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.
+#
+
+server.port=7001
+spring.velocity.cache=false
+spring.velocity.charset=UTF-8
+spring.velocity.layout-url=/templates/default.vm
+spring.messages.fallback-to-system-locale=false
+spring.messages.basename=i18n/message
+spring.root.password=root
+spring.guest.password=guest
+
+#dubbo.registry.address=zookeeper://127.0.0.1:2181
+dubbo.registry.address=zookeeper://datadev2:2181
diff --git a/dubbo-admin/src/main/resources/dubbo-admin.xml b/dubbo-admin/src/main/resources/dubbo-admin.xml
new file mode 100644
index 0000000..f32036c
--- /dev/null
+++ b/dubbo-admin/src/main/resources/dubbo-admin.xml
@@ -0,0 +1,29 @@
+<?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.
+  -->
+
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:dubbo="http://dubbo.apache.org/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-4.3.xsd
+       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
+
+    <dubbo:application name="dubbo-admin"/>
+    <dubbo:registry address="${dubbo.registry.address}"/>
+    <dubbo:reference id="registryService" interface="com.alibaba.dubbo.registry.RegistryService" check="false"/>
+
+</beans>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/i18n/message.properties b/dubbo-admin/src/main/resources/i18n/message.properties
new file mode 100644
index 0000000..a9fd83f
--- /dev/null
+++ b/dubbo-admin/src/main/resources/i18n/message.properties
@@ -0,0 +1,16 @@
+#
+# 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.
+#
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/i18n/message_en.properties b/dubbo-admin/src/main/resources/i18n/message_en.properties
new file mode 100644
index 0000000..431bca0
--- /dev/null
+++ b/dubbo-admin/src/main/resources/i18n/message_en.properties
@@ -0,0 +1,768 @@
+#
+# 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.
+#
+
+#menus
+home=home
+stat=stat
+revision=revision
+connectionNum=connectionNum
+serviceNum=serviceNum
+providerNum=providerNum
+consumerNum=consumerNum
+applicationNum=applicationNum
+about=about
+help=help
+favorites=favorites
+histories=histories
+governance=governance
+applications=applications
+efferents=efferents
+afferents=afferents
+services=services
+references=references
+addresses=addresses
+providers=providers
+dependencies=dependencies
+layers=layers
+clusters=clusters
+consumers=consumers
+accesses=accesses
+routes=routes
+weights=weights
+loadbalances=loadbalances
+tests=tests
+mocks=mocks
+overrides=overrides
+documents=documents
+owners=owners
+agreements=agreements
+approvals=approvals
+operations=operations
+users=users
+envs=envs
+helps=helps
+registries=registries
+configs=configs
+features=features
+connections=connections
+statuses=statuses
+failed=failed
+cached=cached
+dumps=dumps
+InvalidIp=InvalidIp
+versions=versions
+logs=logs
+infos=infos
+passwds=passwds
+dependency.list=dependency.list
+dependency.tree=dependency.tree
+dependency.graph=dependency.graph
+dependency.efferent=dependency.efferent
+dependency.afferent=dependency.afferent
+provided=provided
+consumed=consumed
+select=select
+clean=clean
+information=information
+control=control
+summary=summary
+consumer.application=consumer.application
+response.time=response.time
+sysinfo.infos=sysinfo.infos
+helps.document=helps.document
+helps.requirement=helps.requirement
+helps.source=helps.source
+connections=connections
+ReconnectUnkwown=ReconnectUnkwown
+confirmReconnectConnection=confirmReconnectConnection
+confirmRedirectRegistry=confirmRedirectRegistry
+confirmReconnectUnknownConnection=confirmReconnectUnknownConnection
+status.resourcename=status.resourcename
+status.status=status.status
+status.message=status.message
+status.description=status.description
+status.memoryStatus=status.memoryStatus
+status.memoryStatusDesc=status.memoryStatusDesc
+status.threadpoolStatus=status.threadpoolStatus
+status.threadpoolStatusDesc=status.threadpoolStatusDesc
+status.failureStatus=status.failureStatus
+status.failureStatusDesc=status.failureStatusDesc
+status.cacheStatus=status.cacheStatus
+status.cacheStatusDesc=status.cacheStatusDesc
+status.timerStatus=status.timerStatus
+status.timerStatusDesc=status.timerStatusDesc
+status.socketStatus=status.socketStatus
+status.socketStatusDesc=status.socketStatusDesc
+status.loadStatus=status.loadStatus
+status.loadStatusDesc=status.loadStatusDesc
+status.datasourceStatus=status.datasourceStatus
+status.datasourceStatusDesc=status.datasourceStatusDesc
+status.registryStatus=status.registryStatus
+status.registryStatusDesc=status.registryStatusDesc
+status.monitorStatus=status.monitorStatus
+status.monitorStatusDesc=status.monitorStatusDesc
+status.summaryStatus=status.summaryStatus
+status.summaryStatusDesc=status.summaryStatusDesc
+status.warmupStatus=status.warmupStatus
+status.warmupStatusDesc=status.warmupStatusDesc
+status.OK=status.OK
+status.WARN=status.WARN
+status.ERROR=status.ERROR
+status.UNKNOWN=status.UNKNOWN
+Status0=Unknow
+Status1=OK
+Status2=OK
+Status3=ERROR
+Status4=FATAL
+Status5=UNKNOW
+service.filter=service.filter
+default.service.filter=default.service.filter
+mock=mock
+force.mocked=force.mocked
+fail.mocked=fail.mocked
+no.mocked=no.mocked
+force.mock=force.mock
+fail.mock=fail.mock
+cancel.mock=cancel.mock
+confirm.force.mock=\u786e\u8ba4\u5c4f\u853d\u8be5\u670d\u52a1\u7684\u8c03\u7528\uff1f<br/><font color=blue size=3>\u5C4F\u853D\u540E\uFF0C\u5c06\u4e0d\u53d1\u8d77\u8fdc\u7a0b\u8c03\u7528\uff0c\u76f4\u63a5\u5728\u5BA2\u6237\u7AEF\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.fail.mock=\u786e\u8ba4\u5bf9\u8be5\u670d\u52a1\u5bb9\u9519\uff1f<br/><font color=blue size=3>\u5BB9\u9519\u540E\uFF0C\u5f53\u8FDC\u7A0B\u8c03\u7528\u5931\u8d25\u65f6\uff0c\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.cancel.mock=\u786e\u8ba4\u6062\u590d\u8be5\u670d\u52a1\u6b63\u5e38\u8bbf\u95ee\uff1f<br/><font color=blue size=3>\u5c06\u53d6\u6d88\u670d\u52a1\u7684\u5c4f\u853d\u548c\u5bb9\u9519\u884c\u4e3a\u3002</font>
+batch.force.mock=batch.force.mock
+batch.fail.mock=batch.fail.mock
+batch.cancel.mock=batch.cancel.mock
+confirm.batch.force.mock=\u786e\u8ba4\u6279\u91cf\u5c4f\u853d\u670d\u52a1\u7684\u8c03\u7528\uff1f<br/><font color=blue size=3>\u5C4F\u853D\u540E\uFF0C\u5c06\u4e0d\u53d1\u8d77\u8fdc\u7a0b\u8c03\u7528\uff0c\u76f4\u63a5\u5728\u5BA2\u6237\u7AEF\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.batch.fail.mock=\u786e\u8ba4\u6279\u91cf\u5bf9\u670d\u52a1\u5bb9\u9519\uff1f<br/><font color=blue size=3>\u5BB9\u9519\u540E\uFF0C\u5f53\u8FDC\u7A0B\u8c03\u7528\u5931\u8d25\u65f6\uff0c\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.batch.cancel.mock=\u786e\u8ba4\u6279\u91cf\u6062\u590d\u670d\u52a1\u6b63\u5e38\u8bbf\u95ee\uff1f<br/><font color=blue size=3>\u5c06\u53d6\u6d88\u670d\u52a1\u7684\u5c4f\u853d\u548c\u5bb9\u9519\u884c\u4e3a\u3002</font>
+all.force.mock=all.force.mock
+all.fail.mock=all.fail.mock
+all.cancel.mock=all.cancel.mock
+confirm.all.force.mock=\u786e\u8ba4\u7F3A\u7701\u5c4f\u853d\u8be5\u670d\u52a1\u7684\u8c03\u7528\uff1f<br/><font color=red size=3>\u8BBE\u7F6E\u964D\u7EA7\u7F3A\u7701\u503C\uFF0C\u5C06\u5F71\u54CD\u672A\u964D\u7EA7\u4EE5\u53CA\u65B0\u7684\u6D88\u8D39\u8005\u3002</font><br/><font color=blue size=3>\u5C4F\u853D\u540E\uFF0C\u5c06\u4e0d\u53d1\u8d77\u8fdc\u7a0b\u8c03\u7528\uff0c\u76f4\u63a5\u5728\u5BA2\u6237\u7AEF\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.all.fail.mock=\u786e\u8ba4\u7F3A\u7701\u5bf9\u8be5\u670d\u52a1\u5bb9\u9519\uff1f<br/><font color=red size=3>\u8BBE\u7F6E\u964D\u7EA7\u7F3A\u7701\u503C\uFF0C\u5C06\u5F71\u54CD\u672A\u964D\u7EA7\u4EE5\u53CA\u65B0\u7684\u6D88\u8D39\u8005\u3002</font><br/><font color=blue size=3>\u5BB9\u9519\u540E\uFF0C\u5f53\u8FDC\u7A0B\u8c03\u7528\u5931\u8d25\u65f6\uff0c\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.all.cancel.mock=\u786e\u8ba4\u7F3A\u7701\u6062\u590d\u8be5\u670d\u52a1\u6b63\u5e38\u8bbf\u95ee\uff1f<br/><font color=red size=3>\u8BBE\u7F6E\u964D\u7EA7\u7F3A\u7701\u503C\uFF0C\u5C06\u5F71\u54CD\u672A\u964D\u7EA7\u4EE5\u53CA\u65B0\u7684\u6D88\u8D39\u8005\u3002</font><br/><font color=blue size=3>\u5c06\u53d6\u6d88\u670d\u52a1\u7684\u5c4f\u853d\u548c\u5bb9\u9519\u884c\u4e3a\u3002</font>
+agreement.invocation.quantity=agreement.invocation.quantity
+agreement.tps=agreement.tps
+response.time=response.time
+agreement.availability=agreement.availability
+layer.name=layer.name
+layer.value=layer.value
+default.lazy=default.lazy
+layer.arch=layer.arch
+loadBalanceStrategy=loadBalanceStrategy
+ServiceName=ServiceName
+cluster.name=cluster.name
+cluster.address=cluster.address
+property.name=property.name
+property.value=property.value
+property.count=property.count
+getMethods=getMethods
+getAddresses=getAddresses
+Edit=Edit
+Username=Username
+Priority=Priority
+ConnectionAddress=ConnectionAddress
+Role=Role
+Reconnect=Reconnect
+Redirect=Redirect
+staff.query=
+configKey=configKey
+configValue=configValue
+Preview=Preview
+routeselect=routeselect
+AllOperations=AllOperations
+BeforeOneMonthOperations=BeforeOneMonthOperations
+BeforeThreeMonthOperations=BeforeThreeMonthOperations
+BeforeHalfYearOperations=BeforeHalfYearOperations
+BeforeOneYearOperations=BeforeOneYearOperations
+PleaseInput=PleaseInput
+BulletinConfig=BulletinConfig
+BulletinMessage=BulletinMessage
+MailConfig=MailConfig
+MailEnabled=MailEnabled
+MailHost=MailHost
+MailPort=MailPort
+MailFrom=MailFrom
+MailAuth=MailAuth
+MailUsername=MailUsername
+MailPassword=MailPassword
+LoginConfig=LoginConfig
+AllowAnonymousLogin=AllowAnonymousLogin
+AllowLegacyLogin=AllowLegacyLogin
+RouteEnabled=RouteEnabled
+WarmupEnabled=WarmupEnabled
+LogConfig=LogConfig
+LogLevel=LogLevel
+RedirectConfig=RedirectConfig
+AutoRedirectInterval=AutoRedirectInterval
+AutoRedirectThreshold=AutoRedirectThreshold
+AutoRedirectToleratePercent=AutoRedirectToleratePercent
+ManualRedirect=ManualRedirect
+LimitConfig=LimitConfig
+MaxConnectionSize=MaxConnectionSize
+MaxCacheSize=MaxCacheSize
+MaxMailSize=MaxMailSize
+TimerConfig=TimerConfig
+AlivedCheckInterval=AlivedCheckInterval
+ChangedCheckInterval=ChangedCheckInterval
+FailedRetryInterval=FailedRetryInterval
+DirtyCheckInterval=DirtyCheckInterval
+HeartbeatConfig=HeartbeatConfig
+HeartbeatCheckInterval=HeartbeatCheckInterval
+HeartbeatCheckTimeout=HeartbeatCheckTimeout
+TimeoutConfig=TimeoutConfig
+NotifyTimeout=NotifyTimeout
+WarmupWaitTime=WarmupWaitTime
+UrlConfig=UrlConfig
+BucServiceAddress=BucServiceAddress
+HelpDocumentUrl=HelpDocumentUrl
+HomepageDomain=HomepageDomain
+HomepageUrl=HomepageUrl
+parametersConfig=parametersConfig
+DefaultServiceParameters=DefaultServiceParameters
+BatchAddressTip=BatchAddressTip
+ConsumerAddress=ConsumerAddress
+AccessControlTip=AccessControlTip
+access=access
+Allowed=Allowed
+Forbidden=Forbidden
+allow=allow
+forbid=forbid
+confirm.allow=confirm.allow
+confirm.forbid=\u786E\u8BA4\u7981\u6B62\u8BBF\u95EE?<br/><font color=red size=3>\u88AB\u7981\u6B62\u7684\u5BA2\u6237\u7AEF\u5C06\u6536\u5230\u7981\u6B62\u8BBF\u95EE\u5F02\u5E38\u3002</font>
+batch.allow=batch.allow
+batch.forbid=batch.forbid
+confirm.batch.allow=confirm.batch.allow
+confirm.batch.forbid=\u786E\u8BA4\u7981\u6B62\u6240\u9009\u9879\u8BBF\u95EE?<br/><font color=red size=3>\u88AB\u7981\u6B62\u7684\u5BA2\u6237\u7AEF\u5C06\u6536\u5230\u7981\u6B62\u8BBF\u95EE\u5F02\u5E38\u3002</font>
+only.allow=only.allow
+only.forbid=only.forbid
+confirm.only.allow=\u786E\u8BA4\u53EA\u5141\u8BB8\u9009\u4E2D\u9879\u8BBF\u95EE?<br/><font color=red size=3>\u5176\u5B83\u672A\u9009\u4E2D\u9879\u53CA\u4EE5\u540E\u65B0\u589E\u9879\u5C06\u5168\u90E8\u53D8\u4E3A\u7981\u6B62\u8BBF\u95EE\u3002</font><br/><font color=red size=3>\u88AB\u7981\u6B62\u7684\u5BA2\u6237\u7AEF\u5C06\u6536\u5230\u7981\u6B62\u8BBF\u95EE\u5F02\u5E38\u3002</font>
+confirm.only.forbid=\u786E\u8BA4\u53EA\u7981\u6B62\u9009\u4E2D\u9879\u8BBF\u95EE?<br/><font color=blue size=3>\u5176\u5B83\u672A\u9009\u4E2D\u9879\u53CA\u4EE5\u540E\u65B0\u589E\u9879\u5C06\u5168\u90E8\u53D8\u4E3A\u5141\u8BB8\u8BBF\u95EE\u3002</font><br/><font color=red size=3>\u88AB\u7981\u6B62\u7684\u5BA2\u6237\u7AEF\u5C06\u6536\u5230\u7981\u6B62\u8BBF\u95EE\u5F02\u5E38\u3002</font>
+Choose=Choose
+userown=userown
+sysmanage.userown=sysmanage.userown
+SingleServiceTip=SingleServiceTip
+MultiServiceTip=MultiServiceTip
+RouteNameTip=\u53ef\u4f7f\u7528\u4e2d\u6587\uff0c\u75311-200\u4e2a\u5b57\u7b26\u7ec4\u6210
+RoutePriorityTip=RoutePriorityTip
+RouteServiceTip=RouteServiceTip
+#RouteServiceTip=\u670d\u52a1\u63a5\u53e3\u540d\u53ef\u4ee5\u4f7f\u7528\u901a\u914d\u7b26\uff0c\u53ea\u652f\u6301\u4e00\u4e2a*\u7b26\u4e14\u8981\u5728\u63a5\u53e3\u672b\u5c3e\uff08\u5206\u7ec4\u3001\u7248\u672c\u4e0d\u652f\u6301\u901a\u914d\u7b26\uff09
+RouteMethodTip=\u53ea\u6709Dubbo2.0.0\u4ee5\u4e0a\u7248\u672c\u7684\u670d\u52a1\u6d88\u8d39\u7aef\u652f\u6301\u6309\u65b9\u6cd5\u8def\u7531\uff0c\u591a\u4e2a\u65b9\u6cd5\u540d\u7528\u9017\u53f7\u5206\u9694
+RouteClusterTip=\u53ef\u901a\u8fc7\u83dc\u5355"\u670d\u52a1\u63a7\u5236"->"\u670d\u52a1\u5668\u96c6\u7fa4"\u7ba1\u7406
+RouteMatchTip=RouteMatchTip
+RouteFilterTip=RouteFilterTip
+RouteHostTip=RouteHostTip
+RouteApplicationTip=RouteApplicationTip
+RouteResult=RouteResult
+preview=preview
+ConsumerApplication=ConsumerApplication
+ConsumerCluster=ConsumerCluster
+ConsumerHost=ConsumerHost
+ConsumerVersion=ConsumerVersion
+ConsumerGroup=ConsumerGroup
+ProviderApplication=ProviderApplication
+ProviderCluster=ProviderCluster
+ProviderProtocol=ProviderProtocol
+ProviderHost=ProviderHost
+ProviderPort=ProviderPort
+ProviderVersion=ProviderVersion
+ProviderGroup=ProviderGroup
+MatchRule=MatchRule
+FilterRule=FilterRule
+routeName=routeName
+routeRule=routeRule
+Match=Match
+Mismatch=Mismatch
+GetMethods=GetMethods
+FeatureName=FeatureName
+Features=Features
+Disable=Disable
+Enable=Enable
+Enabled=Enabled
+Disabled=Disabled
+Unknown=Unknown
+Users=Users
+UsersDescription=UsersDescription
+StatusList=StatusList
+StatusListDescription=StatusListDescription
+Operations=Operations
+OperationsDescription=OperationsDescription
+Accesses=Accesses
+AccessesDescription=AccessesDescription
+Configs=Configs
+Clusters=Clusters
+ClustersDescription=ClustersDescription
+Weights=Weights
+WeightsDescription=WeightsDescription
+Agreements=Agreements
+AgreementsDescription=AgreementsDescription
+ConfigsDescription=ConfigsDescription
+LoadBalances=LoadBalances
+LoadBalancesDescription=LoadBalancesDescription
+CachedList=CachedList
+CachedListDescription=CachedListDescription
+FailedList=FailedList
+Registries=Registries
+FailedListDescription=FailedListDescription
+registryAddress=registryAddress
+RegistriesDescription=RegistriesDescription
+Help=Help
+HelpDescription=HelpDescription
+Providers=Providers
+ProvidersDescription=ProvidersDescription
+Log=Log
+LogDescription=LogDescription
+Services=Services
+ServicesDescription=ervicesDescription
+Owned=Owned
+OwnedDescription=OwnedDescription
+Tests=Tests
+TestsDescription=TestsDescription
+Documents=Documents
+DocumentsDescription=DocumentsDescription
+Applications=Applications
+ApplicationsDescription=ApplicationsDescription
+Consumers=Consumers
+ConsumersDescription=ConsumersDescription
+System=System
+SystemDescription=SystemDescription
+Routes=Routes
+Route=Route
+RoutesDescription=RoutesDescription
+Connections=Connections
+ConnectionsDescription=ConnectionsDescription
+RegistryAddress=RegistryAddress
+RegisterUsername=RegisterUsername
+RegisterDate=RegisterDate
+subscribeDate=subscribeDate
+Statistics=Statistics
+CheckConnection=CheckConnection
+CheckDatabase=CheckDatabase
+queryUrl=queryUrl
+Status=Status
+notify=notify
+notified=notified
+unnotified=unnotified
+Unuse=Unuse
+NoProvider=NoProvider
+NoConsumer=NoConsumer
+route.consumer.not.match=route.consumer.not.match
+#labels
+all=all
+service=service
+application=application
+recursive=recursive
+layer=layer
+address=address
+dubbo=dubbo
+version=version
+group=group
+url=url
+parameters=parameters
+provider=provider
+consumer=consumer
+registry=registry
+username=username
+created=created
+modified=modified
+register.date=register.date
+type=type
+static=static
+dynamic=dynamic
+status=status
+enabled=enabled
+disabled=disabled
+check=check
+operation=operation
+role=role
+provider=provider
+consumer=consumer
+consumer.address=consumer.address
+no.provider=no.provider
+no.consumer=no.consumer
+ok=ok
+warn=warn
+error=error
+success=success
+failure=failure
+operation.success=operation.success
+operation.failure=operation.failure
+isRegistered=isRegistered
+isCached=isCached
+isCached.true=isCached.true
+isCached.false=isCached.false
+isSubscribed=isSubscribed
+isSubscribed.true=isSubscribed.true
+isSubscribed.false=isSubscribed.false
+isSubscribed.unmatch=isSubscribed.unmatch
+#operations
+search=search
+query=query
+show=show
+add=add
+addMock=addMock
+multiadd=multiadd
+edit=edit
+save=save
+delete=delete
+enable=enable
+disable=disable
+recover=recover
+reload=reload
+reconnect=reconnect
+renotify=renotify
+tostatic=tostatic
+todynamic=todynamic
+favorite=favorite
+register=register
+subscribe=subscribe
+logout=logout
+back=back
+cancel=cancel
+confirm=confirm
+batch.add=batch.add
+batch.multiservices.add=batch.multiservices.add
+batch.delete=batch.delete
+batch.enable=batch.enable
+batch.disable=batch.disable
+batch.recover=batch.recover
+batch.reconnect=batch.reconnect
+batch.renotify=batch.renotify
+batch.tostatic=batch.tostatic
+batch.todynamic=batch.todynamic
+batch.favorite=batch.favorite
+batch.reload=batch.reload
+confirm.batch.disable=confirm.batch.disable
+confirm.batch.enable=confirm.batch.enable
+#prompts
+please.input.service=please.input.service
+please.input.application=please.input.application
+please.input.address=please.input.address
+please.input.layer=please.input.layer
+please.input=please.input
+please.select=please.select
+empty.list=empty.list
+not.found=not.found
+show.all=show.all
+confirm.logout=confirm.logout
+confirm.delete=\u786e\u5b9a\u5220\u9664?<br/><font color=red size=3>\u5220\u9664\u540E\u5C06\u4E0D\u53EF\u8FD8\u539F\u3002</font>
+confirm.enable=confirm.enable?
+confirm.disable=confirm.disable?
+confirm.recover=confirm.recover?
+confirm.reconnect=confirm.reconnect?
+confirm.renotify=confirm.renotify?
+confirm.tostatic=confirm.tostatic?
+confirm.todynamic=confirm.todynamic?
+confirm.batch.delete=\u786e\u5b9a\u5220\u9664\u6240\u9009\u9879?<br/><font color=red size=3>\u5220\u9664\u540E\u5C06\u4E0D\u53EF\u8FD8\u539F\u3002</font>
+confirm.batch.enable=confirm.batch.enable
+confirm.batch.disable=confirm.batch.disable
+confirm.batch.recover=confirm.batch.recover
+confirm.batch.reload=confirm.batch.reload
+confirm.batch.reconnect=confirm.batch.reconnect
+confirm.batch.renotify=confirm.batch.renotify
+confirm.batch.tostatic=confirm.batch.tostatic
+confirm.batch.todynamic=confirm.batch.todynamic
+current.user=current.user
+CheckProviderLocalAddress=CheckProviderLocalAddress
+CheckProviderApplicationDifferent=CheckProviderApplicationDifferent
+CheckProviderAddressMismatch=CheckProviderAddressMismatch
+CheckConnectionDisconnected=CheckConnectionDisconnected
+CheckConnectionExpired=CheckConnectionExpired
+CheckDatabaseMiss=CheckDatabaseMiss
+CheckDatabaseMismatch=CheckDatabaseMismatch
+CheckDatabaseDirty2Registered=CheckDatabaseDirty2Registered
+CheckDatabaseDirty2Subscribed=CheckDatabaseDirty2Subscribed
+CheckCacheRegistered=CheckCacheRegistered
+CheckCacheConsumer=CheckCacheConsumer
+CheckCacheProvider=CheckCacheProvider
+CheckCacheSubscribed=CheckCacheSubscribed
+CheckCacheService=CheckCacheService
+select.all=select.all
+ip.address=ip.address
+registry.newservice=registry.newservice
+add.new.provider=add.new.provider
+add.new.route=add.new.route
+message.search.noresult=message.search.noresult
+provide.service=provide.service
+service.method=service.method
+startegy=startegy
+route.name=route.name
+rule.match=rule.match
+rule.filtrate=rule.filtrate
+priority=priority
+routed=routed
+unrouted=unrouted
+page.total=page.total
+page.records=page.records
+page.ordinal=page.ordinal
+page.page=page.page
+page.next=page.next
+page.prev=page.prev
+page.first=page.first
+page.last=page.last
+page.line=page.line
+methodName=methodName
+proview=proview
+cluster.name=cluster.name
+cluster.address=cluster.address
+sameserviceadd=sameserviceadd
+whitelist=whitelist
+blacklist=blacklist
+toWhiteAndBlackList=toWhiteAndBlackList
+obtainProviderAddress=obtainProviderAddress
+towhitelist=towhitelist
+toblacklist=toblacklist
+enable=enable
+disable=disable
+copy=copy
+batch.enable=batch.enable
+batch.disable=batch.disable
+batch.towhitelist=batch.towhitelist
+batch.toblacklist=batch.toblacklist
+confirm.favorites=confirm.favorites
+confirm.batch.towhitelist=\u786e\u8ba4\u52a0\u5165\u767d\u540d\u5355?<br/><font color=blue size=3>\u5c06\u7981\u6b62\u4e0d\u5728\u767d\u540d\u5355\u5185\u7684\u6240\u6709\u6d88\u8d39\u8005\u8bbf\u95ee\uff0c\u9ed1\u540d\u5355\u5931\u6548\u3002</font>
+confirm.batch.toblacklist=\u786e\u8ba4\u52a0\u5165\u9ed1\u540d\u5355?<br/><font color=blue size=3>\u5982\u679c\u6ca1\u6709\u767d\u540d\u5355\uff0c\u5c06\u7981\u6b62\u5728\u9ed1\u540d\u5355\u5185\u7684\u6240\u6709\u5176\u5b83\u6d88\u8d39\u8005\u8bbf\u95ee\u3002</font>
+confirm.enable=confirm.enable
+confirm.disable=confirm.disable
+confirm.edit=confirm.edit
+confirm.disableFeature=confirm.disableFeature
+confirm.enableFeature=confirm.enableFeature
+confirmDeleteOwner=confirmDeleteOwner
+generic=generic
+doubling=doubling
+update=update
+welcome=welcome
+approve=approve
+chinese.simple=chinese.simple
+chinese.tradition=chinese.tradition
+register.service=register.service
+erratum.guide=erratum.guide
+preview.guide=preview.guide
+sysinfo.status=sysinfo.status
+sysinfo.registries=sysinfo.registries
+sysinfo.connections=sysinfo.connections
+sysinfo.cached=sysinfo.cached
+sysinfo.failed=sysinfo.failed
+sysinfo.operations=sysinfo.operations
+sysinfo.logs=sysinfo.logs
+sysinfo.versions=sysinfo.versions
+sysinfo.dumps=sysinfo.dumps
+sysinfo.envs=sysinfo.envs
+sysinfo.helps=sysinfo.helps
+system.management=system.management
+sysmanage.users=sysmanage.users
+sysmanage.configs=sysmanage.configs
+sysmanage.features=sysmanage.features
+system.function.control=system.function
+personal.set=personal.set
+modify.personalinfo=modify.personalinfo
+modify.personal.password=modify.personal.password
+operation.operateaddress=operation.operateaddress
+operation.operatetype=operation.operatetype
+operation.datatype=operation.datatype
+operation.data=operation.data
+operation.createtime=operation.createtime
+operation.clean=operation.clean
+passwd.oldwrong=passwd.oldwrong
+failed=failed
+failed_type=failed_type
+failed_data=failed_data
+failed_sync=failed_sync
+failed_subscribe=failed_subscribe
+failed_notify=failed_notify
+failed_collect=failed_collect
+failed_register=failed_register
+failed_redirect=failed_redirect
+failed_disconnect=failed_disconnect
+clientAddress=clientAddress
+overrideAddress=overrideAddress
+serviceInfo=serviceInfo
+consumerAddress=consumerAddress
+providerAddress=providerAddress
+registryAddress=registryAddress
+serviceName=serviceName
+serviceUrl=serviceUrl
+overrideConsumerAddress=overrideConsumerAddress
+overrideProviderAddress=overrideProviderAddress
+tipConsumerAddress=tipConsumerAddress
+tipProviderAddress=tipProviderAddress
+tipProviderAddress=tipProviderAddress
+logs=logs
+logs.file=logs.file
+logs.size=logs.size
+logs.modify=logs.modify
+logs.level=logs.level
+change.log.level=change.log.level
+logs.confirmChangeLogLevel=logs.confirmChangeLogLevel
+cached=cached
+cached.type=cached.type
+cached.data=cached.data
+cached.reload=cached.reload
+batch.cached.reload=batch.cached.reload
+cached.recover=cached.recover
+batch.cached.recover=batch.cached.recover
+servicePrivilege=servicePrivilege
+creator=creator
+name=name
+department=department
+email=email
+phone=phone
+alitalk=alitalk
+password=password
+roleR=roleR
+roleA=roleA
+roleG=roleG
+roleDescR=roleDescR
+roleDescA=roleDescA
+roleDescG=roleDescG
+oldPassword=oldPassword
+newPassword=newPassword
+reset=reset
+restPassword=restPassword
+confirmNewPassword=confirmNewPassword
+owns=owns
+confirmPassword=confirmPassword
+generatePassword=generatePassword
+displayName=displayName
+locale=locale
+privilegeTip=\u591a\u4e2a\u503c\u7528\u9017\u53f7(,)\u5206\u9694\uff0c\u901a\u914d\u7b26\u7528\u661f\u53f7(*)\u8868\u793a\uff0c\u53ea\u80fd\u5728\u6bcf\u4e2a\u503c\u7684\u672a\u5c3e\u4f7f\u7528\u901a\u914d\u7b26\uff0c\u88ab\u6388\u4e0e\u7684\u6743\u9650\u4e0d\u80fd\u8d85\u51fa\u5f53\u524d\u7ba1\u7406\u4eba\u5458\u7684\u6743\u9650
+displayNameTip=\u7528\u6237\u59d3\u540d\uff0c\u53ef\u4f7f\u7528\u4e2d\u6587\uff0c\u75311-50\u4e2a\u5b57\u7b26\u7ec4\u6210
+emailTip=\u7528\u4e8e\u63a5\u6536\u7cfb\u7edf\u90ae\u4ef6\uff0c\u53ef\u4ee5\u8f93\u5165\u591a\u4e2a\u90ae\u4ef6\u5730\u5740\uff0c\u4f7f\u7528\u82f1\u6587\u5206\u53f7\u5206\u9694(;)\uff0c \u5f62\u5982 foo1@163.comj;foo2@gmail.com
+userLocaleTip=\u53d1\u9001\u7cfb\u7edf\u90ae\u4ef6\u65f6\uff0c\u5c06\u6839\u636e\u7528\u6237\u4f7f\u7528\u7684\u8bed\u8a00\u53d1\u9001\u4e0d\u540c\u8bed\u8a00\u7684\u90ae\u4ef6\u5185\u5bb9
+DisplayNameTip=DisplayNameTip
+EmailTip=EmailTip
+UserLocaleTip=UserLocaleTip
+missRequestParameters=missRequestParameters
+haveNoRootPrivilege=haveNoRootPrivilege
+confirmReloadCache=confirmReloadCache
+confirmDeleteRegistry=confirmDeleteRegistry
+confirmAutoRedirectRegistry=confirmAutoRedirectRegistry
+confirmDeleteExpiredRegistry=confirmDeleteExpiredRegistry
+confirmSyncRegistry=confirmSyncRegistry
+confirm.toblacklist=\u786e\u8ba4\u52a0\u5165\u9ed1\u540d\u5355?<br/><font color=blue size=3>\u5982\u679c\u6ca1\u6709\u767d\u540d\u5355\uff0c\u5c06\u7981\u6b62\u5728\u9ed1\u540d\u5355\u5185\u7684\u6240\u6709\u6d88\u8d39\u8005\u8bbf\u95ee\u3002</font>
+confirm.towhitelist=\u786e\u8ba4\u52a0\u5165\u767d\u540d\u5355?<br/><font color=blue size=3>\u5c06\u7981\u6b62\u4e0d\u5728\u767d\u540d\u5355\u5185\u7684\u6240\u6709\u5176\u5b83\u6d88\u8d39\u8005\u8bbf\u95ee\uff0c\u9ed1\u540d\u5355\u5931\u6548\u3002</font>
+confirm.clean.operation=confirm.clean.operation
+autoRedirect=autoRedirect
+deleteExpired=deleteExpired
+sync=sync
+legacies=legacies
+logined=logined
+dumps=dumps
+Registry=Registry
+Java=JDK version
+Locale=Locale
+OS=OS
+Uptime=Uptime
+Host=Host
+CPU=CPU
+confirmEnableUser=confirmEnableUser
+confirmDisableUser=confirmDisableUser
+documentTitle=documentTitle
+documentLink/documentPage=documentLink/documentPage
+documentInternal=documentInternal
+documentExternal=documentExternal
+documentApi=API
+documentType=documentType
+documentContent=documentContent
+Yes=Yes
+No=No
+returnValue=returnValue
+throwException=
+testMethodTip=\u5982\u679c\u6709\u65b9\u6cd5\u91cd\u8f7d\u6216\u4f7f\u7528Dubbo1.0.x\u7248\u672c\u7684\u670d\u52a1\u63d0\u4f9b\u8005\uff0c\u9700\u5199\u5168\u65b9\u6cd5\u7b7e\u540d\uff0c\u5982\uff1afindBy(int,java.lang.String)\uff0c\u5426\u5219\u53ea\u9700\u65b9\u6cd5\u540d\uff0c\u5982\uff1afindBy
+testJsonTip=JSON\u683c\u5f0f\uff1a\u5b57\u7b26\u4e32\u7528\u53cc\u5f15\u53f7\u8868\u793a\uff0c\u5982\uff1a"\u5b57\u7b26\u4e32"\uff0c\u6570\u5b57\u548cBoolean\u503c\u4e0d\u7528\u5f15\u53f7\uff0c\u5982\uff1a123 \u548c true \u6216 false\uff0cPOJO\u5bf9\u8c61\u6216Map\u7528\u5927\u62ec\u53f7\u8868\u793a\uff0c\u5982\uff1a{"\u5c5e\u6027\u540d1": "\u5c5e\u6027\u503c1", "\u5c5e\u6027\u540d2": "\u5c5e\u6027\u503c2"}\uff0c\u6570\u7ec4\u6216List\u6216Set\u7528\u65b9\u62ec\u53f7\u8868\u793a\uff0c\u5982\uff1a["\u503c1", "\u503c2"]
+testParametersTip=\u5f53\u4e3a\u65e0\u53c2\u6570\u65b9\u6cd5\u65f6\u53c2\u6570\u503c\u53ef\u4ee5\u4e0d\u586b\uff0c\u53c2\u6570\u503c\u4f7f\u7528JSON\u683c\u5f0f\u8868\u793a
+testResultTip=\u5f53\u4e3avoid\u65b9\u6cd5\u65f6\u7ed3\u679c\u53ef\u4ee5\u4e0d\u586b\uff0c\u629b\u51fa\u5f02\u5e38\u4f7f\u7528\u5f02\u5e38\u7c7b\u5168\u540d\u8868\u793a\uff0c\u8fd4\u56de\u503c\u4f7f\u7528JSON\u683c\u5f0f\u8868\u793a
+testAutoRunTip=\u5982\u679c\u8bbe\u7f6e\u4e3a\u81ea\u52a8\u8fd0\u884c\uff0c\u82e5\u8be5\u670d\u52a1\u5df2\u6ce8\u518c\u6216\u65b0\u6ce8\u518c\uff0c\u5219\u81ea\u52a8\u8fd0\u884c\u6b64\u6d4b\u8bd5\u7528\u4f8b\uff0c\u8fd0\u884c\u5931\u8d25\uff0c\u5c06\u53d1\u9001\u90ae\u4ef6
+confirmRunTest=confirmRunTest
+confirm.runAll=confirm.runAll
+loadBalanceStrategy=loadBalanceStrategy
+random=random
+roundrobin=roundrobin
+leastactive=leastactive
+testName=testName
+operator=operator
+dataFormat=dataFormat
+resultType=resultType
+resultController=resultController
+autoRun=autoRun
+manualRun=manualRun
+run=run
+runAll=runAll
+expected=expected
+actual=actual
+reRun=reRun
+startDate=startDate
+console=console
+total=total
+delta=delta
+expired=expired
+alived=alived
+redirect=redirect
+current=current
+#overrides
+override.config=override.config
+override.mock=override.mock
+parameter=parameter
+parameter.key=parameter.key
+parameter.value=parameter.value
+parameter.tip=\u65b9\u6cd5\u7ea7\u914d\u7f6e\u5982\uff1afindPerson.timeout=1000
+mock.all.method=\u6240\u6709\u65b9\u6cd5\u7684Mock\u503c
+mock.method=mock.method
+mock.value=mock.value
+mock.tip=\u793a\u4f8b\uff1areturn null/empty/JSON\u6216throw com.foo.BarException
+protocol=protocol
+host=host
+port=port
+interface=interface
+version=version
+group=group
+methods=methods
+category=category
+application=application
+owner=owner
+cluster=cluster
+loadbalance=loadbalance
+timeout=timeout
+retries=retries
+threads=threads
+connections=connections
+accepts=accepts
+actives=actives
+executes=executes
+check=check
+side=side
+pid=pid
+timestamp=timestamp
+dubbo=dubbo
+anyhost=anyhost
+weight=weight
+weight.doubling=weight.doubling
+weight.halving=weight.halving
+confirm.weight.doubling=confirm.weight.doubling
+confirm.weight.halving=confirm.weight.halving
+batch.weight.doubling=batch.weight.doubling
+batch.weight.halving=batch.weight.halving
+confirm.batch.weight.doubling=confirm.batch.weight
+confirm.batch.weight.halving=confirm.batch.weight
+NoSuchOperationData=NoSuchOperationData
+CanNotDeleteDynamicData=CanNotDeleteDynamicData
+HaveNoServicePrivilege=HaveNoServicePrivilege
+dynamic.parameters.tip=dynamic.parameters.tip
+default.owner=Owner
+logger=logger
+default.server=default.server
+default.actives=default.actives
+default.client=default.client
+default.connections=default.connections
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/i18n/message_zh.properties b/dubbo-admin/src/main/resources/i18n/message_zh.properties
similarity index 96%
rename from dubbo-admin/src/main/webapp/WEB-INF/i18n/message_zh.properties
rename to dubbo-admin/src/main/resources/i18n/message_zh.properties
index 15d9241..83e8753 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/i18n/message_zh.properties
+++ b/dubbo-admin/src/main/resources/i18n/message_zh.properties
@@ -1,6 +1,24 @@
+#
+# 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.
+#
+
 #menus
 home=\u9996\u9875
 stat=\u7edf\u8ba1
+revision=\u4fee\u8ba2\u7248\u672c
 connectionNum=\u8fde\u63a5\u6570
 serviceNum=\u670d\u52a1\u6570
 providerNum=\u63d0\u4f9b\u8005\u6570
@@ -45,6 +63,7 @@ statuses=\u7CFB\u7EDF\u72B6\u6001
 failed=\u5931\u8d25\u8bb0\u5f55
 cached=\u7f13\u5b58\u8bb0\u5f55
 dumps=\u5feb\u7167
+InvalidIp=\u65e0\u6548\u0069\u0070\u5730\u5740
 versions=Dubbo\u7248\u672c
 logs=\u65e5\u5fd7
 infos=\u4fee\u6539\u4e2a\u4eba\u4fe1\u606f
@@ -376,6 +395,7 @@ warn=\u8b66\u544a
 error=\u51fa\u9519
 success=\u6210\u529f
 failure=\u5931\u8d25
+update=\u66f4\u65b0
 operation.success=\u64cd\u4f5c\u6210\u529f\uff01
 operation.failure=\u64cd\u4f5c\u5931\u8d25\uff01
 isRegistered=\u6ce8\u518c\u7f13\u5b58
@@ -477,6 +497,8 @@ add.new.route=\u6dfb\u52a0\u8def\u7531
 message.search.noresult=\u6ca1\u6709\u7b26\u5408\u7684\u67e5\u8be2\uff0c\u8bf7\u4ece\u63d0\u793a\u5217\u8868\u4e2d\u9009\u62e9\u67e5\u8be2\u6761\u4ef6\uff01
 provide.service=\u63d0\u4f9b\u7684\u670d\u52a1
 service.method=\u670d\u52a1\u65b9\u6cd5
+service.filter=\u670d\u52a1filter
+default.service.filter=\u9ed8\u8ba4\u670d\u52a1filter
 startegy=\u7b56\u7565
 route.name=\u8def\u7531\u540d\u79f0
 rule.match=\u5339\u914d\u89c4\u5219
@@ -488,6 +510,7 @@ page.total=\u5171
 page.records=\u6761\u8bb0\u5f55
 page.ordinal=\u7b2c
 page.page=\u9875
+default.lazy=\u9ed8\u8ba4\u61d2\u542f\u52a8
 page.next=\u4e0b\u4e00\u9875
 page.prev=\u4e0a\u4e00\u9875
 page.first=\u9996\u9875
@@ -643,6 +666,7 @@ Locale=\u8bed\u8a00
 OS=\u64cd\u4f5c\u7cfb\u7edf
 Uptime=\u8fd0\u884c\u65f6\u95f4
 Host=\u57df\u540d
+CPU=\u0043\u0050\u0055
 confirmEnableUser=\u786e\u8ba4\u542f\u52a8\u7528\u6237
 confirmDisableUser=\u786e\u8ba4\u7981\u7528\u7528\u6237
 documentTitle=\u6587\u6863\u6807\u9898
@@ -689,6 +713,8 @@ confirm.runAll=\u786e\u8ba4\u5bf9\u6240\u6709\u63d0\u4f9b\u8005\u8fd0\u884c\u6d4
 #Match=\u5339\u914d
 #Mismatch=\u4e0d\u5339\u914d
 #ConsumerAddress=\u6d88\u8d39\u8005\u5730\u5740
+generic=\u6cdb\u5316
+doubling=\u500d\u6743
 loadBalanceStrategy=\u8d1f\u8f7d\u5747\u8861\u7b56\u7565
 random=\u968f\u673a
 roundrobin=\u8f6e\u8be2
@@ -697,7 +723,7 @@ testName=\u6d4b\u8bd5\u7528\u4f8b\u540d\u79f0
 operator=\u64cd\u4f5c
 dataFormat=\u6570\u636e\u683c\u5f0f
 resultType=\u7ed3\u679c\u7c7b\u578b
-result=\u8fd4\u56de\u503c/\u5f02\u5e38\u7c7b\u578b
+resultController=\u8fd4\u56de\u503c/\u5f02\u5e38\u7c7b\u578b
 autoRun=\u81ea\u52a8\u8fd0\u884c
 manualRun=\u624b\u52a8\u8fd0\u884c
 run=\u8fd0\u884c
@@ -768,3 +794,9 @@ NoSuchOperationData=\u64CD\u4F5C\u7684\u6570\u636E\u4E0D\u5B58\u5728\u3002
 CanNotDeleteDynamicData=\u4E0D\u80FD\u5220\u9664\u52A8\u6001\u6570\u636E\u3002
 HaveNoServicePrivilege=\u60A8\u6CA1\u6709\u8BE5\u670D\u52A1\u7684\u6743\u9650\u3002
 dynamic.parameters.tip=\u52A8\u6001URL\u4E0D\u80FD\u76F4\u63A5\u4FEE\u6539\uFF0C\u9700\u901A\u8FC7\u52A8\u6001\u914D\u7F6E\u8FDB\u884C\u8986\u76D6\uFF0C\u683C\u5F0F\u4E0EURL\u53C2\u6570\u76F8\u540C\u3002
+default.owner=\u8d1f\u8d23\u4eba
+logger=\u65e5\u5fd7
+default.server=\u9ed8\u8ba4\u670d\u52a1\u7aef
+default.actives=\u5e76\u53d1\u8c03\u7528\u6570
+default.client=\u9ed8\u8ba4\u5ba2\u6237\u7aef
+default.connections=\u6700\u5927\u8fde\u63a5\u6570
diff --git a/dubbo-admin/src/main/resources/i18n/message_zh_CN.properties b/dubbo-admin/src/main/resources/i18n/message_zh_CN.properties
new file mode 100644
index 0000000..83e8753
--- /dev/null
+++ b/dubbo-admin/src/main/resources/i18n/message_zh_CN.properties
@@ -0,0 +1,802 @@
+#
+# 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.
+#
+
+#menus
+home=\u9996\u9875
+stat=\u7edf\u8ba1
+revision=\u4fee\u8ba2\u7248\u672c
+connectionNum=\u8fde\u63a5\u6570
+serviceNum=\u670d\u52a1\u6570
+providerNum=\u63d0\u4f9b\u8005\u6570
+consumerNum=\u6d88\u8d39\u8005\u6570
+applicationNum=\u5e94\u7528\u6570
+about=\u5173\u4e8e
+help=\u5e2e\u52a9
+favorites=\u6536\u85cf\u5939
+histories=\u5386\u53f2\u8bb0\u5f55
+governance=\u670d\u52a1\u6cbb\u7406
+applications=\u5e94\u7528
+efferents=\u4f9d\u8d56
+afferents=\u88ab\u4f9d\u8d56
+services=\u670d\u52a1
+references=\u5f15\u7528\u670d\u52a1
+addresses=\u673a\u5668
+providers=\u63d0\u4f9b\u8005
+dependencies=\u4f9d\u8d56\u5173\u7cfb
+layers=\u5206\u5c42
+clusters=\u96c6\u7fa4
+consumers=\u6d88\u8d39\u8005
+accesses=\u8BBF\u95EE\u63A7\u5236
+routes=\u8def\u7531\u89C4\u5219
+weights=\u6743\u91cd\u8C03\u8282
+loadbalances=\u8d1f\u8f7d\u5747\u8861
+tests=\u6d4b\u8bd5
+mocks=\u6a21\u62df
+overrides=\u52a8\u6001\u914d\u7f6e
+documents=\u6587\u6863
+owners=\u8d1f\u8d23\u4eba
+agreements=\u534f\u5b9a
+approvals=\u4e0a\u7ebf\u5ba1\u6279
+operations=\u64cd\u4f5c\u65e5\u5fd7
+users=\u7528\u6237
+envs=\u7cfb\u7edf\u73af\u5883
+helps=\u5e2e\u52a9\u6587\u6863
+registries=\u6ce8\u518c\u4e2d\u5fc3
+configs=\u7cfb\u7edf\u53c2\u6570
+features=\u7cfb\u7edf\u529f\u80fd
+connections=\u8fde\u63a5
+statuses=\u7CFB\u7EDF\u72B6\u6001
+failed=\u5931\u8d25\u8bb0\u5f55
+cached=\u7f13\u5b58\u8bb0\u5f55
+dumps=\u5feb\u7167
+InvalidIp=\u65e0\u6548\u0069\u0070\u5730\u5740
+versions=Dubbo\u7248\u672c
+logs=\u65e5\u5fd7
+infos=\u4fee\u6539\u4e2a\u4eba\u4fe1\u606f
+passwds=\u4fee\u6539\u4e2a\u4eba\u5bc6\u7801
+dependency.list=\u5217\u8868
+dependency.tree=\u6811\u72b6
+dependency.graph=\u56fe\u5f62
+dependency.efferent=\u4f9d\u8d56
+dependency.afferent=\u88ab\u4f9d\u8d56
+provided=\u63d0\u4f9b\u670d\u52a1
+consumed=\u6d88\u8d39\u670d\u52a1
+select=\u9009\u62e9
+clean=\u6e05\u9664
+information=\u4fe1\u606f
+control=\u63a7\u5236
+summary=\u6c47\u603b
+consumer.application=\u6d88\u8d39\u8005\u5e94\u7528
+response.time=\u54cd\u5e94\u65f6\u95f4
+sysinfo.infos=\u7cfb\u7edf\u4fe1\u606f
+helps.document=\u6587\u6863
+helps.requirement=\u9700\u6c42
+helps.source=\u6e90\u4ee3\u7801
+connections=\u5957\u63a5\u5b57\u8fde\u63a5
+ReconnectUnkwown=\u91cd\u8fde\u6240\u6709\u672a\u77e5\u8fde\u63a5
+confirmReconnectConnection=\u786e\u8ba4\u91cd\u5efa\u8fde\u63a5
+confirmRedirectRegistry=\u786e\u8ba4\u91cd\u5b9a\u5411\u6ce8\u518c\u4e2d\u5fc3
+confirmReconnectUnknownConnection=\u786e\u8ba4\u91cd\u8fde\u672a\u77e5\u7684\u8fde\u63a5
+status.resourcename=\u8d44\u6e90\u540d\u79f0
+status.status=\u72b6\u6001
+status.message=\u4fe1\u606f
+status.description=\u63cf\u8ff0
+status.memoryStatus=\u5185\u5b58
+status.memoryStatusDesc=\u53ea\u76d1\u63a7Heap\u5185\u5b58\uff0c\u5982\u679c\u7a7a\u95f2\u5185\u5b58\u4e0d\u8db31M\u5219\u8b66\u544a\uff0c\u5426\u5219\u6b63\u5e38
+status.threadpoolStatus=\u7ebf\u7a0b\u6c60
+status.threadpoolStatusDesc=\u53ea\u76d1\u63a7\u6ce8\u518c\u8ba2\u9605\u4e3b\u4e1a\u52a1\u7ebf\u7a0b\u6c60\uff0c\u5982\u679c\u7a7a\u95f2\u7ebf\u7a0b\u5c11\u4e8e1\u4e2a\uff0c\u5219\u8b66\u544a\uff0c\u5426\u5219\u6b63\u5e38
+status.failureStatus=\u5931\u8d25\u8bb0\u5f55
+status.failureStatusDesc=\u5f53\u6709\u4efb\u4f55\u5931\u8d25\u8bb0\u5f55\u5219\u8b66\u544a\uff0c\u5426\u5219\u6b63\u5e38
+status.cacheStatus=\u7f13\u5b58
+status.cacheStatusDesc=\u5982\u679c\u7f13\u5b58\u4e0e\u6570\u636e\u5e93\u4e0d\u4e00\u81f4\u5219\u8b66\u544a\uff0c\u5426\u5219\u6b63\u5e38
+status.timerStatus=\u5b9a\u65f6\u5668
+status.timerStatusDesc=\u5f53\u5b9a\u65f6\u5668\u672a\u6b63\u786e\u542f\u52a8\uff0c\u6216\u88ab\u4e0d\u6b63\u5e38\u53d6\u6d88\uff0c\u5219\u62a5\u9519\uff0c\u5426\u5219\u6b63\u5e38
+status.socketStatus=\u5957\u63a5\u5b57
+status.socketStatusDesc=\u5f53\u5957\u63a5\u53e3\u5f00\u542f\u4e0d\u4e86\u6216\u5df2\u88ab\u5360\u7528\u65f6\u62a5\u9519\uff0c\u5f53\u8fde\u63a5\u6570\u7b49\u4e8e\u6700\u5927\u503c\u65f6\u8b66\u544a\uff0c\u5426\u5219\u6b63\u5e38
+status.loadStatus=\u8d1f\u8f7d
+status.loadStatusDesc=\u5982\u679c\u8d1f\u8f7d\u5927\u4e8eCPU\u4e2a\u6570\u5219\u8b66\u544a\uff0c\u5982\u679c\u7cfb\u7edf\u4e0d\u652f\u6301\u67e5\u8be2\u8d1f\u8f7d\u5219\u4e0d\u542f\u7528\uff0c\u5426\u5219\u6b63\u5e38
+status.datasourceStatus=\u6570\u636e\u5e93
+status.datasourceStatusDesc=\u53d1\u9001\u4e00\u6761\u7b80\u5355\u67e5\u8be2SQL\uff0c\u6267\u884c\u6210\u529f\u5219\u6b63\u5e38\uff0c\u5426\u5219\u62a5\u9519
+status.registryStatus=\u6CE8\u518C\u4E2D\u5FC3
+status.registryStatusDesc=\u5982\u679C\u8FDE\u4E0D\u4E0A\u6CE8\u518C\u4E2D\u5FC3\u5219\u62A5\u9519\uFF0C\u5426\u5219\u6B63\u5E38
+status.monitorStatus=\u76d1\u89c6\u5668
+status.monitorStatusDesc=\u76d1\u89c6\u5668
+status.summaryStatus=\u6c47\u603b
+status.summaryStatusDesc=\u6709\u72b6\u6001\u6c47\u603b\uff0c\u5ffd\u7565\u672a\u542f\u7528\u7684\u72b6\u6001\uff0c\u53ea\u8981\u6709\u4e00\u4e2a\u62a5\u9519\uff0c\u5219\u62a5\u9519\uff0c\u53ea\u8981\u6709\u4e00\u4e2a\u8b66\u544a\uff0c\u5219\u8b66\u544a\uff0c\u5168\u90e8\u6b63\u5e38\u5219\u6b63\u5e38
+status.warmupStatus=\u8fd0\u884c\u72b6\u6001
+status.warmupStatusDesc=\u5904\u4e8ewarmup\u72b6\u6001\u65f6\uff0c\u810f\u6570\u636e\u68c0\u6d4b\u3001\u91cd\u5b9a\u5411\u3001\u4e8b\u4ef6\u53d8\u66f4\u5b9a\u65f6\u5668\u5747\u4e0d\u5de5\u4f5c,\u4e0d\u63a8\u9001\u53d8\u66f4
+status.OK=\u6b63\u5e38
+status.WARN=\u8b66\u544a
+status.ERROR=\u9519\u8bef
+status.UNKNOWN=\u672a\u77e5
+Status0=Unknow
+Status1=OK
+Status2=OK
+Status3=ERROR
+Status4=FATAL
+Status5=UNKNOW
+mock=\u964d\u7ea7
+force.mocked=\u5DF2\u5C4F\u853D
+fail.mocked=\u5DF2\u5BB9\u9519
+no.mocked=\u672A\u964D\u7EA7
+force.mock=\u5c4f\u853d
+fail.mock=\u5bb9\u9519
+cancel.mock=\u6062\u590d
+confirm.force.mock=\u786e\u8ba4\u5c4f\u853d\u8be5\u670d\u52a1\u7684\u8c03\u7528\uff1f<br/><font color=blue size=3>\u5C4F\u853D\u540E\uFF0C\u5c06\u4e0d\u53d1\u8d77\u8fdc\u7a0b\u8c03\u7528\uff0c\u76f4\u63a5\u5728\u5BA2\u6237\u7AEF\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.fail.mock=\u786e\u8ba4\u5bf9\u8be5\u670d\u52a1\u5bb9\u9519\uff1f<br/><font color=blue size=3>\u5BB9\u9519\u540E\uFF0C\u5f53\u8FDC\u7A0B\u8c03\u7528\u5931\u8d25\u65f6\uff0c\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.cancel.mock=\u786e\u8ba4\u6062\u590d\u8be5\u670d\u52a1\u6b63\u5e38\u8bbf\u95ee\uff1f<br/><font color=blue size=3>\u5c06\u53d6\u6d88\u670d\u52a1\u7684\u5c4f\u853d\u548c\u5bb9\u9519\u884c\u4e3a\u3002</font>
+batch.force.mock=\u6279\u91cf\u5c4f\u853d
+batch.fail.mock=\u6279\u91cf\u5bb9\u9519
+batch.cancel.mock=\u6279\u91cf\u6062\u590d
+confirm.batch.force.mock=\u786e\u8ba4\u6279\u91cf\u5c4f\u853d\u670d\u52a1\u7684\u8c03\u7528\uff1f<br/><font color=blue size=3>\u5C4F\u853D\u540E\uFF0C\u5c06\u4e0d\u53d1\u8d77\u8fdc\u7a0b\u8c03\u7528\uff0c\u76f4\u63a5\u5728\u5BA2\u6237\u7AEF\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.batch.fail.mock=\u786e\u8ba4\u6279\u91cf\u5bf9\u670d\u52a1\u5bb9\u9519\uff1f<br/><font color=blue size=3>\u5BB9\u9519\u540E\uFF0C\u5f53\u8FDC\u7A0B\u8c03\u7528\u5931\u8d25\u65f6\uff0c\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.batch.cancel.mock=\u786e\u8ba4\u6279\u91cf\u6062\u590d\u670d\u52a1\u6b63\u5e38\u8bbf\u95ee\uff1f<br/><font color=blue size=3>\u5c06\u53d6\u6d88\u670d\u52a1\u7684\u5c4f\u853d\u548c\u5bb9\u9519\u884c\u4e3a\u3002</font>
+all.force.mock=\u7F3A\u7701\u5c4f\u853d
+all.fail.mock=\u7F3A\u7701\u5bb9\u9519
+all.cancel.mock=\u7F3A\u7701\u6062\u590d
+confirm.all.force.mock=\u786e\u8ba4\u7F3A\u7701\u5c4f\u853d\u8be5\u670d\u52a1\u7684\u8c03\u7528\uff1f<br/><font color=red size=3>\u8BBE\u7F6E\u964D\u7EA7\u7F3A\u7701\u503C\uFF0C\u5C06\u5F71\u54CD\u672A\u964D\u7EA7\u4EE5\u53CA\u65B0\u7684\u6D88\u8D39\u8005\u3002</font><br/><font color=blue size=3>\u5C4F\u853D\u540E\uFF0C\u5c06\u4e0d\u53d1\u8d77\u8fdc\u7a0b\u8c03\u7528\uff0c\u76f4\u63a5\u5728\u5BA2\u6237\u7AEF\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.all.fail.mock=\u786e\u8ba4\u7F3A\u7701\u5bf9\u8be5\u670d\u52a1\u5bb9\u9519\uff1f<br/><font color=red size=3>\u8BBE\u7F6E\u964D\u7EA7\u7F3A\u7701\u503C\uFF0C\u5C06\u5F71\u54CD\u672A\u964D\u7EA7\u4EE5\u53CA\u65B0\u7684\u6D88\u8D39\u8005\u3002</font><br/><font color=blue size=3>\u5BB9\u9519\u540E\uFF0C\u5f53\u8FDC\u7A0B\u8c03\u7528\u5931\u8d25\u65f6\uff0c\u8fd4\u56de\u7a7a\u5bf9\u8c61\u3002</font>
+confirm.all.cancel.mock=\u786e\u8ba4\u7F3A\u7701\u6062\u590d\u8be5\u670d\u52a1\u6b63\u5e38\u8bbf\u95ee\uff1f<br/><font color=red size=3>\u8BBE\u7F6E\u964D\u7EA7\u7F3A\u7701\u503C\uFF0C\u5C06\u5F71\u54CD\u672A\u964D\u7EA7\u4EE5\u53CA\u65B0\u7684\u6D88\u8D39\u8005\u3002</font><br/><font color=blue size=3>\u5c06\u53d6\u6d88\u670d\u52a1\u7684\u5c4f\u853d\u548c\u5bb9\u9519\u884c\u4e3a\u3002</font>
+agreement.invocation.quantity=\u4e00\u5929\u8c03\u7528\u91cf
+agreement.tps=TPS\u4e0a\u9650
+response.time=\u54cd\u5e94\u65f6\u95f4
+agreement.availability=\u53ef\u7528\u7387
+layer.name=\u5206\u5c42\u540d\u79f0
+layer.value=\u6570\u5b57\u7b49\u7ea7
+layer.arch=\u5206\u5c42\u67b6\u6784
+loadBalanceStrategy=\u8d1f\u8f7d\u5747\u8861\u7b56\u7565
+ServiceName=\u670d\u52a1\u540d
+cluster.name=\u96c6\u7fa4\u540d
+cluster.address=\u96c6\u7fa4\u673a\u5668\u5730\u5740
+property.name=\u5c5e\u6027\u540d
+property.value=\u5c5e\u6027\u503c
+property.count=\u5c5e\u6027\u6570\u91cf
+getMethods=\u83b7\u53d6\u670d\u52a1\u65b9\u6cd5
+getAddresses=\u83b7\u53d6\u63d0\u4f9b\u8005\u5730\u5740
+Edit=\u7f16\u8f91
+Username=\u7528\u6237\u540d
+Priority=\u4f18\u5148\u7ea7
+ConnectionAddress=\u8fde\u63a5\u5730\u5740
+Role=\u89d2\u8272
+Reconnect=\u91cd\u8fde
+Redirect=\u91cd\u5b9a\u5411
+staff.query=\u5185\u7f51\u67e5\u8be2
+configKey=\u914d\u7f6e\u9879
+configValue=\u914d\u7f6e\u9879\u503c
+Preview=\u9884\u89c8
+routeselect=\u8def\u7531\u9884\u89c8\uff08\u9009\u62e9\u6d88\u8d39\u8005\uff09
+AllOperations=\u6240\u6709\u64cd\u4f5c\u8bb0\u5f55
+BeforeOneMonthOperations=\u4e00\u4e2a\u6708\u4ee5\u524d\u7684\u6240\u6709\u64cd\u4f5c\u8bb0\u5f55
+BeforeThreeMonthOperations=\u4e09\u4e2a\u6708\u4ee5\u524d\u7684\u6240\u6709\u64cd\u4f5c\u8bb0\u5f55
+BeforeHalfYearOperations=\u534a\u5e74\u4ee5\u524d\u7684\u6240\u6709\u64cd\u4f5c\u8bb0\u5f55
+BeforeOneYearOperations=\u4e00\u5e74\u4ee5\u524d\u7684\u6240\u6709\u64cd\u4f5c\u8bb0\u5f55
+PleaseInput=\u8bf7\u8f93\u5165
+BulletinConfig=\u516c\u544a\u914d\u7f6e
+BulletinMessage=\u516c\u544a\u4fe1\u606f
+MailConfig=\u90ae\u7bb1\u914d\u7f6e
+MailEnabled=\u662f\u5426\u542f\u7528\u90ae\u7bb1
+MailHost=\u90ae\u4ef6\u670d\u52a1\u5668\u4e3b\u673a
+MailPort=\u90ae\u4ef6\u670d\u52a1\u5668\u7aef\u53e3
+MailFrom=\u90ae\u4ef6\u53d1\u4ef6\u4eba\u5730\u5740
+MailAuth=\u90ae\u7bb1\u662f\u5426\u9700\u8981\u767b\u5f55
+MailUsername=\u90ae\u7bb1\u767b\u5f55\u7528\u6237\u540d
+MailPassword=\u90ae\u7bb1\u767b\u5f55\u5bc6\u7801
+LoginConfig=\u767b\u5f55\u914d\u7f6e
+AllowAnonymousLogin=\u5141\u8bb8\u533f\u540d\u767b\u5f55
+AllowLegacyLogin=\u5141\u8bb8\u9057\u7559\u7cfb\u7edf\u767b\u5f55
+RouteEnabled=\u662f\u5426\u5f00\u542f\u8def\u7531\u529f\u80fd
+WarmupEnabled=\u662f\u5426\u8fdb\u5165\u9884\u70ed\u72b6\u6001
+LogConfig=\u65e5\u5fd7\u914d\u7f6e
+LogLevel=\u65e5\u5fd7\u7ea7\u522b
+RedirectConfig=\u91cd\u5b9a\u5411\u914d\u7f6e
+AutoRedirectInterval=\u81ea\u52a8\u91cd\u5b9a\u5411\u68c0\u67e5\u95f4\u9694(\u6beb\u79d2)
+AutoRedirectThreshold=\u80fd\u591f\u81ea\u52a8\u91cd\u5b9a\u5411\u7684\u8fde\u63a5\u4e0b\u754c
+AutoRedirectToleratePercent=\u81ea\u52a8\u91cd\u5b9a\u5411\u65f6\u8fde\u63a5\u6570\u504f\u5dee\u5bb9\u5fcd\u767e\u5206\u6bd4
+ManualRedirect=\u91cd\u5b9a\u5411{0}\u4e2a
+LimitConfig=\u8d44\u6e90\u9650\u5236\u914d\u7f6e
+MaxThreadSize=\u6700\u5927\u7ebf\u7a0b\u6570
+MaxConnectionSize=\u6700\u5927\u8fde\u63a5\u6570
+MaxCacheSize=\u6700\u5927\u7f13\u5b58\u6570
+MaxMailSize=\u6700\u5927\u90ae\u4ef6\u961f\u5217\u6570
+TimerConfig=\u5b9a\u65f6\u5668\u914d\u7f6e
+AlivedCheckInterval=\u6ce8\u518c\u4e2d\u5fc3\u5b58\u6d3b\u72b6\u6001\u68c0\u67e5\u95f4\u9694(\u6beb\u79d2)
+ChangedCheckInterval=\u6570\u636e\u53d8\u66f4\u68c0\u67e5\u95f4\u9694(\u6beb\u79d2)
+FailedRetryInterval=\u5931\u8d25\u91cd\u8bd5\u95f4\u9694(\u6beb\u79d2)
+DirtyCheckInterval=\u810f\u6570\u636e\u68c0\u67e5\u95f4\u9694(\u6beb\u79d2)
+HeartbeatConfig=\u5fc3\u8df3\u914d\u7f6e
+HeartbeatCheckInterval=\u4e0e\u5ba2\u6237\u7aef\u8fde\u63a5\u5fc3\u8df3\u68c0\u67e5\u95f4\u9694(\u6beb\u79d2)
+HeartbeatCheckTimeout=\u5fc3\u8df3\u8d85\u65f6\u65f6\u95f4(\u6beb\u79d2)
+TimeoutConfig=\u8d85\u65f6\u914d\u7f6e
+NotifyTimeout=\u4e8b\u4ef6\u63a8\u9001\u8d85\u65f6(\u6beb\u79d2)
+WarmupWaitTime=\u542f\u52a8\u9884\u70ed\u65f6\u95f4(\u6beb\u79d2)
+UrlConfig=URL\u914d\u7f6e
+BucServiceAddress=BUC\u670d\u52a1\u5730\u5740
+HelpDocumentUrl=\u5e2e\u52a9\u6587\u6863URL
+HomepageDomain=\u663e\u793a\u4e3b\u9875\u57df\u540d
+HomepageUrl=\u4e3b\u9875\u5730\u5740
+parametersConfig=\u53c2\u6570\u914d\u7f6e
+DefaultServiceParameters=\u7f3a\u7701\u53c2\u6570\u914d\u7f6e
+BatchAddressTip=\u591a\u4e2a\u5730\u5740\u7528\u6362\u884c\u7b26\u5206\u9694\uff0c\u5730\u5740\u5fc5\u9700\u662f0.0.0.0\u5230255.255.255.255\u7684IP\u5730\u5740
+ConsumerAddress=\u6d88\u8d39\u8005\u5730\u5740
+AccessControlTip=\u767d\u540d\u5355\u4f18\u5148\uff0c\u53ea\u8981\u6709\u767d\u540d\u5355\uff0c\u5219\u767d\u540d\u5355\u751f\u6548\uff0c\u5426\u5219\u9ed1\u540d\u5355\u751f\u6548
+access=\u8BBF\u95EE
+Allowed=\u5DF2\u5141\u8BB8
+Forbidden=\u5DF2\u7981\u6B62
+allow=\u5141\u8BB8
+forbid=\u7981\u6B62
+confirm.allow=\u786E\u8BA4\u5141\u8BB8\u8BBF\u95EE?
+confirm.forbid=\u786E\u8BA4\u7981\u6B62\u8BBF\u95EE?<br/><font color=red size=3>\u88AB\u7981\u6B62\u7684\u5BA2\u6237\u7AEF\u5C06\u6536\u5230\u7981\u6B62\u8BBF\u95EE\u5F02\u5E38\u3002</font>
+batch.allow=\u6279\u91CF\u5141\u8BB8
+batch.forbid=\u6279\u91CF\u7981\u6B62
+confirm.batch.allow=\u786E\u8BA4\u5141\u8BB8\u6240\u9009\u9879\u8BBF\u95EE?
+confirm.batch.forbid=\u786E\u8BA4\u7981\u6B62\u6240\u9009\u9879\u8BBF\u95EE?<br/><font color=red size=3>\u88AB\u7981\u6B62\u7684\u5BA2\u6237\u7AEF\u5C06\u6536\u5230\u7981\u6B62\u8BBF\u95EE\u5F02\u5E38\u3002</font>
+only.allow=\u53EA\u5141\u8BB8
+only.forbid=\u53EA\u7981\u6B62
+confirm.only.allow=\u786E\u8BA4\u53EA\u5141\u8BB8\u9009\u4E2D\u9879\u8BBF\u95EE?<br/><font color=red size=3>\u5176\u5B83\u672A\u9009\u4E2D\u9879\u53CA\u4EE5\u540E\u65B0\u589E\u9879\u5C06\u5168\u90E8\u53D8\u4E3A\u7981\u6B62\u8BBF\u95EE\u3002</font><br/><font color=red size=3>\u88AB\u7981\u6B62\u7684\u5BA2\u6237\u7AEF\u5C06\u6536\u5230\u7981\u6B62\u8BBF\u95EE\u5F02\u5E38\u3002</font>
+confirm.only.forbid=\u786E\u8BA4\u53EA\u7981\u6B62\u9009\u4E2D\u9879\u8BBF\u95EE?<br/><font color=blue size=3>\u5176\u5B83\u672A\u9009\u4E2D\u9879\u53CA\u4EE5\u540E\u65B0\u589E\u9879\u5C06\u5168\u90E8\u53D8\u4E3A\u5141\u8BB8\u8BBF\u95EE\u3002</font><br/><font color=red size=3>\u88AB\u7981\u6B62\u7684\u5BA2\u6237\u7AEF\u5C06\u6536\u5230\u7981\u6B62\u8BBF\u95EE\u5F02\u5E38\u3002</font>
+Choose=\u8bf7\u9009\u62e9
+userown=\u8d1f\u8d23\u7684\u670d\u52a1
+sysmanage.userown=\u8d1f\u8d23\u7684\u670d\u52a1
+SingleServiceTip=\u4e00\u4e2a\u8def\u7531\u53ea\u80fd\u5e94\u7528\u4e8e\u4e00\u4e2a\u670d\u52a1\uff0c\u4e0d\u652f\u6301\u591a\u670d\u52a1\u53ca\u901a\u914d\u7b26
+MultiServiceTip=\u670d\u52a1\u63a5\u53e3\u540d\u53ef\u4ee5\u4f7f\u7528\u901a\u914d\u7b26\uff0c\u53ea\u652f\u6301\u4e00\u4e2a*\u7b26\u4e14\u8981\u5728\u63a5\u53e3\u672b\u5c3e\uff08\u5206\u7ec4\u3001\u7248\u672c\u4e0d\u652f\u6301\u901a\u914d\u7b26\uff09
+RouteNameTip=\u53ef\u4f7f\u7528\u4e2d\u6587\uff0c\u75311-200\u4e2a\u5b57\u7b26\u7ec4\u6210
+RoutePriorityTip=\u6570\u5b57\u8d8a\u5927\u8d8a\u4f18\u5148
+RouteServiceTip=\u4e00\u4e2a\u8def\u7531\u53ea\u80fd\u5e94\u7528\u4e8e\u4e00\u4e2a\u670d\u52a1\uff0c\u4e0d\u652f\u6301\u591a\u670d\u52a1\u53ca\u901a\u914d\u7b26
+#RouteServiceTip=\u670d\u52a1\u63a5\u53e3\u540d\u53ef\u4ee5\u4f7f\u7528\u901a\u914d\u7b26\uff0c\u53ea\u652f\u6301\u4e00\u4e2a*\u7b26\u4e14\u8981\u5728\u63a5\u53e3\u672b\u5c3e\uff08\u5206\u7ec4\u3001\u7248\u672c\u4e0d\u652f\u6301\u901a\u914d\u7b26\uff09
+RouteMethodTip=\u53ea\u6709Dubbo2.0.0\u4ee5\u4e0a\u7248\u672c\u7684\u670d\u52a1\u6d88\u8d39\u7aef\u652f\u6301\u6309\u65b9\u6cd5\u8def\u7531\uff0c\u591a\u4e2a\u65b9\u6cd5\u540d\u7528\u9017\u53f7\u5206\u9694
+RouteClusterTip=\u53ef\u901a\u8fc7\u83dc\u5355"\u670d\u52a1\u63a7\u5236"->"\u670d\u52a1\u5668\u96c6\u7fa4"\u7ba1\u7406
+RouteMatchTip=\u5f53\u6d88\u8d39\u8005\u6ee1\u8db3\u5339\u914d\u6761\u4ef6\u65f6\u4f7f\u7528\u5f53\u524d\u89c4\u5219\u8fdb\u884c\u8fc7\u6ee4
+RouteFilterTip=\u6ee1\u8db3\u8fc7\u6ee4\u89c4\u5219\u7684\u63d0\u4f9b\u8005\u5730\u5740\u5c06\u88ab\u63a8\u9001\u7ed9\u6d88\u8d39\u8005
+RouteHostTip=\u591a\u4e2a\u503c\u7528\u9017\u53f7\u5206\u9694\uff0c\u4ee5\u661f\u53f7\u7ed3\u5c3e\u8868\u793a\u901a\u914d\u5730\u5740\u6bb5
+RouteApplicationTip=\u591a\u4e2a\u503c\u7528\u9017\u53f7\u5206\u9694
+RouteResult=\u8def\u7531\u7ed3\u679c
+preview=\u9884\u89c8
+ConsumerApplication=\u6d88\u8d39\u8005\u5e94\u7528\u540d
+ConsumerCluster=\u6d88\u8d39\u8005\u96c6\u7fa4
+ConsumerHost=\u6d88\u8d39\u8005IP\u5730\u5740
+ConsumerVersion=\u6d88\u8d39\u8005\u7248\u672c\u53f7
+ConsumerGroup=\u6d88\u8d39\u8005\u540d\u79f0\u7a7a\u95f4
+ProviderApplication=\u63d0\u4f9b\u8005\u5e94\u7528
+ProviderCluster=\u63d0\u4f9b\u8005\u96c6\u7fa4
+ProviderProtocol=\u63d0\u4f9b\u8005\u534f\u8bae
+ProviderHost=\u63d0\u4f9b\u8005IP\u5730\u5740
+ProviderPort=\u63d0\u4f9b\u8005\u7aef\u53e3
+ProviderVersion=\u63d0\u4f9b\u8005\u7248\u672c\u53f7
+ProviderGroup=\u63d0\u4f9b\u8005\u540d\u79f0\u7a7a\u95f4
+MatchRule=\u5339\u914d\u6761\u4ef6
+FilterRule=\u8fc7\u6ee4\u89c4\u5219
+routeName=\u8DEF\u7531\u540D\u79F0
+routeRule=\u8def\u7531\u89c4\u5219
+Match=\u5339\u914d
+Mismatch=\u4e0d\u5339\u914d
+GetMethods=\u83b7\u53d6\u670d\u52a1\u65b9\u6cd5
+FeatureName=\u529f\u80fd\u540d
+Features=\u7cfb\u7edf\u529f\u80fd
+Disable=\u7981\u7528
+Enable=\u542f\u7528
+Enabled=\u5df2\u542f\u7528
+Disabled=\u5df2\u7981\u7528
+Unknown=\u672a\u77e5
+Users=\u7528\u6237\u7ba1\u7406
+UsersDescription=\u7528\u6237\u4fe1\u606f\u7ba1\u7406
+StatusList=\u6ce8\u518c\u4e2d\u5fc3\u72b6\u6001
+StatusListDescription=\u6ce8\u518c\u4e2d\u5fc3\u7cfb\u7edf\u72b6\u6001
+Operations=\u64cd\u4f5c\u8bb0\u5f55
+OperationsDescription=\u8bb0\u5f55\u6240\u6709\u4eba\u4e3a\u7684\u64cd\u4f5c
+Accesses=\u670d\u52a1\u9ed1\u767d\u540d\u5355
+AccessesDescription=\u670d\u52a1\u9ed1\u767d\u540d\u5355
+Configs=\u7cfb\u7edf\u914d\u7f6e
+Clusters=\u670d\u52a1\u5668\u96c6\u7fa4
+ClustersDescription=\u7ba1\u7406\u670d\u52a1\u96c6\u7fa4\u4fe1\u606f
+Weights=\u63d0\u4f9b\u8005\u6743\u91cd
+WeightsDescription=\u7ba1\u7406\u63d0\u4f9b\u8005\u6743\u91cd\u4fe1\u606f
+Agreements=\u670d\u52a1\u7b49\u7ea7\u534f\u5b9a
+AgreementsDescription=\u670d\u52a1\u7b49\u7ea7\u534f\u5b9a
+ConfigsDescription=\u7cfb\u7edf\u914d\u7f6e\u4fe1\u606f
+LoadBalances=\u8d1f\u8f7d\u5747\u8861
+LoadBalancesDescription=\u8d1f\u8f7d\u5747\u8861
+CachedList=\u5185\u5b58\u7f13\u5b58
+CachedListDescription=\u6ce8\u518c\u4e2d\u5fc3\u5185\u5b58\u7f13\u5b58\u8bb0\u5f55
+FailedList=\u5931\u8d25\u8bb0\u5f55
+Registries=\u6ce8\u518c\u4e2d\u5fc3\u96c6\u7fa4
+FailedListDescription=\u5931\u8d25\u8bb0\u5f55\u5217\u8868
+registryAddress=\u6ce8\u518c\u4e2d\u5fc3\u5217\u8868
+RegistriesDescription=\u67e5\u770b\u5df2\u77e5\u7684\u6ce8\u518c\u4e2d\u5fc3
+Help=\u5e2e\u52a9
+HelpDescription=\u5e2e\u52a9
+Providers=\u670d\u52a1\u63d0\u4f9b\u8005
+ProvidersDescription=\u67e5\u770b\u6240\u6709\u670d\u52a1\u63d0\u4f9b\u8005
+Log=\u65e5\u5fd7\u6587\u4ef6
+LogDescription=\u67e5\u770b\u6ce8\u518c\u4e2d\u5fc3Log4J\u65e5\u5fd7
+Services=\u670d\u52a1\u4fe1\u606f
+ServicesDescription=\u67e5\u770b\u670d\u52a1\u5df2\u6ce8\u518c\u7684\u6240\u6709\u670d\u52a1
+Owned=\u670d\u52a1\u5f52\u5c5e
+OwnedDescription=\u670d\u52a1\u5f52\u5c5e
+Tests=\u670d\u52a1\u6d4b\u8bd5
+TestsDescription=\u670d\u52a1\u6d4b\u8bd5\u7528\u4f8b
+Documents=\u670d\u52a1\u6587\u6863
+DocumentsDescription=\u6587\u6863
+Applications=\u670d\u52a1\u5e94\u7528
+ApplicationsDescription=\u670d\u52a1\u5e94\u7528
+Consumers=\u670d\u52a1\u6d88\u8d39\u8005
+ConsumersDescription=\u67e5\u770b\u6240\u6709\u670d\u52a1\u6d88\u8d39\u8005
+System=\u7cfb\u7edf\u73af\u5883
+SystemDescription=\u7cfb\u7edf\u73af\u5883\u4fe1\u606f
+Routes=\u670d\u52a1\u8def\u7531
+Route=\u8def\u7531
+RoutesDescription=\u7ba1\u7406\u670d\u52a1\u8def\u7531\u89c4\u5219
+Connections=\u5957\u63a5\u5b57\u8fde\u63a5
+ConnectionsDescription=\u8fde\u63a5
+RegistryAddress=\u6ce8\u518c\u4e2d\u5fc3\u5730\u5740
+RegisterUsername=\u6ce8\u518c\u7528\u6237\u540d
+RegisterDate=\u6ce8\u518c\u65f6\u95f4
+subscribeDate=\u8ba2\u9605\u65f6\u95f4
+Statistics=\u670d\u52a1\u5b9e\u65f6\u7edf\u8ba1
+CheckConnection=\u68c0\u67e5\u8fde\u63a5
+CheckDatabase=\u68c0\u67e5\u6570\u636e\u5e93
+queryUrl=\u8ba2\u9605\u53c2\u6570
+Status=\u72b6\u6001
+notify=\u901A\u77E5
+notified=\u5df2\u901a\u77e5
+unnotified=\u672A\u901A\u77E5
+Unuse=\u672a\u4f7f\u7528
+NoProvider=\u6ca1\u6709\u63d0\u4f9b\u8005
+NoConsumer=\u6ca1\u6709\u6d88\u8d39\u8005
+route.consumer.not.match=\u672cRoute\u4e0d\u5339\u914d\u6b64\u670d\u52a1\u6d88\u8d39\u8005\uff08\u4f1a\u8fd4\u56de\u6240\u6709\u7684\u670d\u52a1\u63d0\u4f9b\u8005\uff09
+#labels
+all=\u6240\u6709
+service=\u670d\u52a1\u540d
+application=\u5e94\u7528\u540d
+recursive=\u5faa\u73af
+layer=\u670d\u52a1\u5206\u5c42
+address=\u673a\u5668IP
+dubbo=\u4f7f\u7528dubbo\u7248\u672c
+version=\u670d\u52a1\u7248\u672c
+group=\u670d\u52a1\u5206\u7ec4
+url=\u670d\u52a1\u5730\u5740
+parameters=\u670d\u52a1\u53c2\u6570
+provider=\u63d0\u4f9b\u8005\u5730\u5740
+consumer=\u6d88\u8d39\u8005\u5730\u5740
+registry=\u6ce8\u518c\u4e2d\u5fc3\u5730\u5740
+username=\u7528\u6237\u540d
+created=\u521b\u5efa\u65f6\u95f4
+modified=\u4fee\u6539\u65f6\u95f4
+register.date=\u6ce8\u518c\u65f6\u95f4
+type=\u7c7b\u578b
+static=\u9759\u6001
+dynamic=\u52a8\u6001
+status=\u72b6\u6001
+enabled=\u5df2\u542f\u7528
+disabled=\u5df2\u7981\u7528
+check=\u68c0\u67e5
+operation=\u64cd\u4f5c
+role=\u89d2\u8272
+provider=\u63d0\u4f9b\u8005
+consumer=\u6d88\u8d39\u8005
+consumer.address=\u6d88\u8d39\u8005\u5730\u5740
+no.provider=\u6ca1\u6709\u63d0\u4f9b\u8005
+no.consumer=\u6ca1\u6709\u6d88\u8d39\u8005
+ok=\u6b63\u5e38
+warn=\u8b66\u544a
+error=\u51fa\u9519
+success=\u6210\u529f
+failure=\u5931\u8d25
+update=\u66f4\u65b0
+operation.success=\u64cd\u4f5c\u6210\u529f\uff01
+operation.failure=\u64cd\u4f5c\u5931\u8d25\uff01
+isRegistered=\u6ce8\u518c\u7f13\u5b58
+isCached=\u670d\u52a1\u7f13\u5b58
+isCached.true=\u670d\u52a1\u5728\u7f13\u5b58\u4e2d
+isCached.false=\u670d\u52a1\u672a\u540c\u6b65\u5230\u7f13\u5b58
+isSubscribed=\u8ba2\u9605\u7f13\u5b58
+isSubscribed.true=\u6b64\u6d88\u8d39\u8005\u5728\u5f53\u524d\u6ce8\u518c\u4e2d\u5fc3\u8ba2\u9605
+isSubscribed.false=\u6b64\u6d88\u8d39\u8005\u5728\u5176\u4ed6\u6ce8\u518c\u4e2d\u5fc3\u8ba2\u9605
+isSubscribed.unmatch=\u6b64\u6d88\u8d39\u8005\u5728\u6570\u636e\u5e93\u548c\u7f13\u5b58\u4e2d\u7684\u6ce8\u518c\u4e2d\u5fc3\u5730\u5740\u4e0d\u4e00\u81f4
+#operations
+search=\u641c\u7d22
+search=\u641c\u7d22
+query=\u67e5\u8be2
+show=\u67e5\u770b
+add=\u65b0\u589e
+addMock=\u65b0\u589eMock
+multiadd=\u6279\u91cf\u65b0\u589e
+edit=\u7f16\u8f91
+save=\u4fdd\u5b58
+delete=\u5220\u9664
+enable=\u542f\u7528
+disable=\u7981\u7528
+recover=\u6062\u590d
+reload=\u91cd\u8f7d\u7f13\u5b58
+reconnect=\u91cd\u8fde
+renotify=\u91cd\u65b0\u901a\u77e5
+tostatic=\u8f6c\u4e3a\u9759\u6001
+todynamic=\u8f6c\u4e3a\u52a8\u6001
+favorite=\u6536\u85cf
+register=\u7533\u8bf7\u6ce8\u518c
+subscribe=\u7533\u8bf7\u8c03\u7528
+logout=\u9000\u51fa
+back=\u8fd4\u56de
+cancel=\u53d6\u6d88
+confirm=\u786e\u5b9a
+batch.add=\u6279\u91cf\u65b0\u589e
+batch.multiservices.add=\u591a\u670d\u52a1\u65b0\u589e
+batch.delete=\u6279\u91cf\u5220\u9664
+batch.enable=\u6279\u91cf\u542f\u7528
+batch.disable=\u6279\u91cf\u7981\u7528
+batch.recover=\u6279\u91cf\u6062\u590d
+batch.reconnect=\u6279\u91cf\u91cd\u8fde
+batch.renotify=\u6279\u91cf\u91cd\u65b0\u901a\u77e5
+batch.tostatic=\u6279\u91cf\u9759\u6001
+batch.todynamic=\u6279\u91cf\u52a8\u6001
+batch.favorite=\u6279\u91cf\u6536\u85cf
+batch.reload=\u6279\u91cf\u91cd\u8f7d
+confirm.batch.disable=\u786e\u8ba4\u6279\u91cf\u7981\u7528
+confirm.batch.enable=\u786e\u8ba4\u6279\u91cf\u542f\u7528
+#prompts
+please.input.service=\u8bf7\u8f93\u5165\u670d\u52a1\u540d
+please.input.application=\u8bf7\u8f93\u5165\u5e94\u7528\u540d
+please.input.address=\u8bf7\u8f93\u5165\u673a\u5668IP
+please.input.layer=\u8bf7\u8f93\u5165\u670d\u52a1\u5206\u5c42
+please.input=\u8bf7\u8f93\u5165\u8981\u64cd\u4f5c\u7684\u5185\u5bb9
+please.select=\u8bf7\u9009\u62e9\u8981\u64cd\u4f5c\u7684\u9879
+empty.list=\u6ca1\u6709\u6570\u636e\u53ef\u4ee5\u64cd\u4f5c
+not.found=\u6ca1\u6709\u641c\u5230\u5339\u914d\u7684\u7ed3\u679c
+show.all=\u663e\u793a\u5168\u90e8
+confirm.logout=\u786e\u5b9a\u9000\u51fa\u767b\u5f55?
+confirm.delete=\u786e\u5b9a\u5220\u9664?<br/><font color=red size=3>\u5220\u9664\u540E\u5C06\u4E0D\u53EF\u8FD8\u539F\u3002</font>
+confirm.enable=\u786e\u5b9a\u542f\u7528?
+confirm.disable=\u786e\u5b9a\u7981\u7528?
+confirm.recover=\u786e\u5b9a\u6062\u590d?
+confirm.reconnect=\u786e\u5b9a\u91cd\u8fde?
+confirm.renotify=\u786e\u5b9a\u901a\u77e5?
+confirm.tostatic=\u786e\u5b9a\u8f6c\u4e3a\u9759\u6001?
+confirm.todynamic=\u786e\u5b9a\u8f6c\u4e3a\u52a8\u6001?
+confirm.batch.delete=\u786e\u5b9a\u5220\u9664\u6240\u9009\u9879?<br/><font color=red size=3>\u5220\u9664\u540E\u5C06\u4E0D\u53EF\u8FD8\u539F\u3002</font>
+confirm.batch.enable=\u786e\u5b9a\u542f\u7528\u6240\u9009\u9879?
+confirm.batch.disable=\u786e\u5b9a\u7981\u7528\u6240\u9009\u9879?
+confirm.batch.recover=\u786e\u5b9a\u6062\u590d\u6240\u9009\u9879?
+confirm.batch.reload=\u786e\u5b9a\u91cd\u8f7d\u5f53\u524d\u670d\u52a1?
+confirm.batch.reconnect=\u786e\u5b9a\u91cd\u8fde\u6240\u9009\u9879?
+confirm.batch.renotify=\u786e\u5b9a\u91cd\u65b0\u901a\u77e5\u6240\u9009\u9879?
+confirm.batch.tostatic=\u786e\u5b9a\u8f6c\u4e3a\u9759\u6001\u6240\u9009\u9879?
+confirm.batch.todynamic=\u786e\u5b9a\u8f6c\u4e3a\u52a8\u6001\u6240\u9009\u9879?
+current.user=\u5f53\u524d\u7528\u6237
+CheckProviderLocalAddress={0}\u4E0D\u662F\u6709\u6548\u7684\u8FDC\u7A0B\u670D\u52A1\u5730\u5740\uFF0C\u8BF7\u68C0\u67E5\u63D0\u4F9B\u65B9/etc/hosts\u6620\u5C04\u662F\u5426\u6B63\u786E\u3002
+CheckProviderApplicationDifferent=\u591a\u4e2a\u4e0d\u540c\u5e94\u7528\u6ce8\u518c\u4e86\u76f8\u540c\u670d\u52a1\uff0c\u8bf7\u68c0\u67e5{0}\u4e2d\u662f\u5426\u6709\u8bef\u66b4\u9732\u3002
+CheckProviderAddressMismatch=\u670d\u52a1URL\u4e0a\u7684IP\u4e0e\u8fde\u63a5\u6ce8\u518c\u4e2d\u5fc3\u7684IP\u4e0d\u76f8\u540c
+CheckConnectionDisconnected=\u8be5\u8fde\u63a5\u5df2\u65ad\u5f00\uff0c\u6570\u636e\u5e93\u810f\u6570\u636e\uff0c\u8bf7\u70b9\u51fb\u201c\u91cd\u8fde\u201d
+CheckConnectionExpired=\u8be5\u8fde\u63a5\u6240\u5728\u6ce8\u518c\u4e2d\u5fc3\u5df2\u4e0d\u5b58\u5728\uff08\u6570\u636e\u4f1a\u81ea\u52a8\u5b9a\u671f\u6e05\u7406\uff09
+CheckDatabaseMiss=\u6570\u636e\u5e93\u6570\u636e\u610f\u5916\u4e22\u5931\u6b64\u6570\u636e\uff0c\u8bf7\u70b9\u51fb\u201c\u6062\u590d\u201d
+CheckDatabaseMismatch=\u6570\u636e\u5e93\u4e0e\u6ce8\u518c\u7f13\u5b58\u6570\u636e\u6ce8\u518c\u5730\u5740\u4e0d\u4e00\u81f4
+CheckDatabaseDirty2Registered=\u6570\u636e\u5e93\u6bd4\u6ce8\u518c\u7f13\u5b58\u591a\u6b64\u810f\u6570\u636e\uff0c\u8bf7\u70b9\u51fb\u201c\u91cd\u8fde\u201d
+CheckDatabaseDirty2Subscribed=\u6570\u636e\u5e93\u6bd4\u8ba2\u9605\u7f13\u5b58\u591a\u6b64\u810f\u6570\u636e\uff0c\u8bf7\u70b9\u51fb\u201c\u91cd\u8fde\u201d
+CheckCacheRegistered=\u6ce8\u518c\u7f13\u5b58\u4e0d\u5b58\u5728\uff0c\u8bf7\u70b9\u51fb\u201c\u91cd\u8fde\u201d
+CheckCacheConsumer=\u65e0\u6b64\u670d\u52a1\u7684\u670d\u52a1\u7f13\u5b58\uff0c\u4f46\u6709\u6d88\u8d39\u8005\uff01\u8bf7\u70b9\u51fb\u201c\u91cd\u8f7d\u201d
+CheckCacheProvider=\u670d\u52a1\u7f13\u5b58\u65e0\u6b64\u63d0\u4f9b\u8005\uff0c\u8bf7\u70b9\u51fb\u201c\u91cd\u8f7d\u201d
+CheckCacheSubscribed=\u8ba2\u9605\u7f13\u5b58\u4e0d\u5b58\u5728\uff0c\u8bf7\u70b9\u51fb\u201c\u91cd\u8fde\u201d
+CheckCacheService=\u65e0\u6b64\u670d\u52a1\u7684\u670d\u52a1\u7f13\u5b58\uff0c\u8bf7\u70b9\u51fb\u63d0\u4f9b\u8005\u7684\u201c\u91cd\u8f7d\u201d
+select.all=\u5168\u9009
+ip.address=IP\u5730\u5740
+registry.newservice=\u6ce8\u518c\u65b0\u670d\u52a1
+add.new.provider=\u6dfb\u52a0\u63d0\u4f9b\u8005
+add.new.route=\u6dfb\u52a0\u8def\u7531
+message.search.noresult=\u6ca1\u6709\u7b26\u5408\u7684\u67e5\u8be2\uff0c\u8bf7\u4ece\u63d0\u793a\u5217\u8868\u4e2d\u9009\u62e9\u67e5\u8be2\u6761\u4ef6\uff01
+provide.service=\u63d0\u4f9b\u7684\u670d\u52a1
+service.method=\u670d\u52a1\u65b9\u6cd5
+service.filter=\u670d\u52a1filter
+default.service.filter=\u9ed8\u8ba4\u670d\u52a1filter
+startegy=\u7b56\u7565
+route.name=\u8def\u7531\u540d\u79f0
+rule.match=\u5339\u914d\u89c4\u5219
+rule.filtrate=\u8fc7\u6ee4\u89c4\u5219
+priority=\u4f18\u5148\u7ea7
+routed=\u5df2\u8def\u7531
+unrouted=\u672A\u8DEF\u7531
+page.total=\u5171
+page.records=\u6761\u8bb0\u5f55
+page.ordinal=\u7b2c
+page.page=\u9875
+default.lazy=\u9ed8\u8ba4\u61d2\u542f\u52a8
+page.next=\u4e0b\u4e00\u9875
+page.prev=\u4e0a\u4e00\u9875
+page.first=\u9996\u9875
+page.last=\u5c3e\u9875
+page.line=\u6761
+methodName=\u65b9\u6cd5\u540d
+proview=\u9884\u89c8
+cluster.name=\u96c6\u7fa4\u540d
+cluster.address=\u96c6\u7fa4\u673a\u5668\u5730\u5740
+sameserviceadd=\u540c\u670d\u52a1\u6dfb\u52a0
+whitelist=\u5141\u8BB8
+blacklist=\u7981\u6B62
+toWhiteAndBlackList=\u8f6c\u5165\u767d\u540d\u5355/\u8f6c\u5165\u9ed1\u540d\u5355
+obtainProviderAddress=\u83b7\u53d6\u63d0\u4f9b\u8005\u5730\u5740
+towhitelist=\u52a0\u5165\u767d\u540d\u5355
+toblacklist=\u52a0\u5165\u9ed1\u540d\u5355
+enable=\u542f\u7528
+disable=\u7981\u7528
+copy=\u590d\u5236
+batch.enable=\u6279\u91cf\u542f\u7528
+batch.disable=\u6279\u91cf\u7981\u7528
+batch.towhitelist=\u52a0\u5165\u767d\u540d\u5355
+batch.toblacklist=\u52a0\u5165\u9ed1\u540d\u5355
+confirm.favorites=\u786e\u8ba4\u6536\u85cf\u5417
+confirm.batch.towhitelist=\u786e\u8ba4\u52a0\u5165\u767d\u540d\u5355?<br/><font color=blue size=3>\u5c06\u7981\u6b62\u4e0d\u5728\u767d\u540d\u5355\u5185\u7684\u6240\u6709\u6d88\u8d39\u8005\u8bbf\u95ee\uff0c\u9ed1\u540d\u5355\u5931\u6548\u3002</font>
+confirm.batch.toblacklist=\u786e\u8ba4\u52a0\u5165\u9ed1\u540d\u5355?<br/><font color=blue size=3>\u5982\u679c\u6ca1\u6709\u767d\u540d\u5355\uff0c\u5c06\u7981\u6b62\u5728\u9ed1\u540d\u5355\u5185\u7684\u6240\u6709\u5176\u5b83\u6d88\u8d39\u8005\u8bbf\u95ee\u3002</font>
+confirm.enable=\u786e\u8ba4\u542f\u7528
+confirm.disable=\u786e\u8ba4\u7981\u7528
+confirm.edit=\u786e\u8ba4\u7f16\u8f91
+confirm.disableFeature=\u786e\u8ba4\u7981\u7528\u529f\u80fd
+confirm.enableFeature=\u786e\u8ba4\u542f\u7528\u529f\u80fd
+confirmDeleteOwner=\u786e\u8ba4\u5220\u9664\u8d1f\u8d23\u4eba
+welcome=\u60a8\u597d
+approve=\u5f85\u5ba1\u6279
+chinese.simple=\u7b80\u4f53\u4e2d\u6587
+chinese.tradition=\u7e41\u9ad4\u4e2d\u6587
+register.service=\u6ce8\u518c\u65b0\u670d\u52a1
+erratum.guide=\u6392\u9519\u5411\u5bfc
+preview.guide=\u9884\u89c8\u5411\u5bfc
+sysinfo.status=\u6ce8\u518c\u4e2d\u5fc3\u72b6\u6001
+sysinfo.registries=\u6ce8\u518c\u4e2d\u5fc3\u96c6\u7fa4
+sysinfo.connections=\u5957\u63a5\u5b57\u8fde\u63a5
+sysinfo.cached=\u5185\u5b58\u7f13\u5b58
+sysinfo.failed=\u5931\u8d25\u8bb0\u5f55
+sysinfo.operations=\u64cd\u4f5c\u8bb0\u5f55
+sysinfo.logs=\u7cfb\u7edf\u65e5\u5fd7
+sysinfo.versions=Dubbo\u7248\u672c
+sysinfo.dumps=\u7cfb\u7edf\u5feb\u7167
+sysinfo.envs=\u7cfb\u7edf\u73af\u5883
+sysinfo.helps=\u5e2e\u52a9\u6587\u6863
+system.management=\u7cfb\u7edf\u7ba1\u7406
+sysmanage.users=\u7528\u6237\u7ba1\u7406
+sysmanage.configs=\u7cfb\u7edf\u53c2\u6570\u8bbe\u7f6e
+sysmanage.features=\u7cfb\u7edf\u529f\u80fd\u5f00\u5173
+system.function.control=\u7cfb\u7edf\u529f\u80fd\u5f00\u5173
+personal.set=\u4e2a\u4eba\u8bbe\u7f6e
+modify.personalinfo=\u4fee\u6539\u4e2a\u4eba\u4fe1\u606f
+modify.personal.password=\u4fee\u6539\u4e2a\u4eba\u5bc6\u7801
+operation.operateaddress=\u64cd\u4f5c\u8005\u5730\u5740
+operation.operatetype=\u64cd\u4f5c\u7c7b\u578b
+operation.datatype=\u6570\u636e\u7c7b\u578b
+operation.data=\u64cd\u4f5c\u5185\u5bb9
+operation.createtime=\u64cd\u4f5c\u65f6\u95f4
+operation.clean=\u6e05\u7406
+passwd.oldwrong=\u65e7\u5bc6\u7801\u9519\u8bef
+failed=\u5931\u8d25\u8bb0\u5f55
+failed_type=\u7c7b\u578b
+failed_data=\u6570\u636e
+failed_sync=\u540c\u6b65\u5730\u5740\u5931\u8d25\u8bb0\u5f55
+failed_subscribe=\u8ba2\u9605\u5931\u8d25\u8bb0\u5f55
+failed_notify=\u901a\u77e5\u5931\u8d25\u8bb0\u5f55
+failed_collect=\u7edf\u8ba1\u5931\u8d25\u8bb0\u5f55
+failed_register=\u6ce8\u518c\u5931\u8d25\u8bb0\u5f55
+failed_redirect=\u91cd\u5b9a\u5411\u5931\u8d25\u8bb0\u5f55
+failed_disconnect=\u65ad\u5f00\u6e05\u7406\u5931\u8d25\u8bb0\u5f55
+clientAddress=\u5ba2\u6237\u7aef\u5730\u5740
+overrideAddress=\u8986\u76d6\u5730\u5740
+serviceInfo=\u670d\u52a1\u4fe1\u606f
+consumerAddress=\u6d88\u8d39\u8005\u5730\u5740
+providerAddress=\u63d0\u4f9b\u8005\u5730\u5740
+registryAddress=\u6ce8\u518c\u4e2d\u5fc3\u5730\u5740
+serviceName=\u670d\u52a1\u540d
+serviceUrl=\u670d\u52a1\u5730\u5740
+overrideConsumerAddress=\u53ea\u63a8\u9001\u7ed9\u6307\u5b9a\u6d88\u8d39\u8005\u5730\u5740
+overrideProviderAddress=\u53ea\u5728\u8c03\u7528\u6307\u5b9a\u63d0\u4f9b\u8005\u5730\u5740\u65f6\u751f\u6548
+tipConsumerAddress=\u4e0d\u586b\u8868\u793a\u5bf9\u6d88\u8d39\u8005\u5e94\u7528\u7684\u6240\u6709\u673a\u5668\u751f\u6548
+tipProviderAddress=\u4e0d\u586b\u8868\u793a\u5bf9\u670d\u52a1\u7684\u6240\u6709\u63d0\u4f9b\u8005\u673a\u5668\u751f\u6548
+tipProviderAddress=\u4e0d\u586b\u8868\u793a\u5bf9\u670d\u52a1\u7684\u6240\u6709\u63d0\u4f9b\u8005\u673a\u5668\u751f\u6548
+logs=\u7cfb\u7edf\u65e5\u5fd7
+logs.file=\u65e5\u5fd7\u6587\u4ef6
+logs.size=\u6587\u4ef6\u5927\u5c0f
+logs.modify=\u4fee\u6539\u65f6\u95f4
+logs.level=\u65e5\u5fd7\u7ea7\u522b
+change.log.level=\u4fee\u6539\u65e5\u5fd7\u7ea7\u522b
+logs.confirmChangeLogLevel=\u786e\u8ba4\u4fee\u6539\u65e5\u5fd7\u7ea7\u522b
+cached=\u5185\u5b58\u7f13\u5b58
+cached.type=\u7c7b\u578b
+cached.data=\u6570\u636e
+cached.reload=\u91cd\u65b0\u52a0\u8f7d
+batch.cached.reload=\u6279\u91cf\u91cd\u65b0\u52a0\u8f7d
+cached.recover=\u6062\u590d
+batch.cached.recover=\u6279\u91cf\u6062\u590d
+servicePrivilege=\u670d\u52a1\u6743\u9650
+creator=\u521b\u5efa\u8005
+name=\u540d\u79f0
+department=\u90e8\u95e8
+email=\u90ae\u7bb1
+phone=\u7535\u8bdd
+alitalk=\u963f\u91cc\u65fa\u65fa
+password=\u5bc6\u7801
+roleR=\u8d85\u7ea7\u7ba1\u7406\u5458
+roleA=\u7ba1\u7406\u5458
+roleG=\u6e38\u5ba2
+roleDescR=\u7ba1\u7406\u6240\u6709
+roleDescA=\u7ba1\u7406\u81ea\u5df1\u521b\u5efa\u7684\u7528\u6237\u548c\u670d\u52a1
+roleDescG=\u53ea\u67e5\u770b
+oldPassword=\u65e7\u5bc6\u7801
+newPassword=\u65b0\u5bc6\u7801
+reset=\u91cd\u7f6e
+restPassword=\u91cd\u7f6e\u5bc6\u7801
+confirmNewPassword=\u786e\u8ba4\u65b0\u5bc6\u7801  
+owns=\u8d1f\u8d23\u7684\u670d\u52a1
+confirmPassword=\u786e\u8ba4\u5bc6\u7801
+generatePassword=\u751f\u6210\u5bc6\u7801
+displayName=\u59d3\u540d
+locale=\u4f7f\u7528\u8bed\u8a00
+privilegeTip=\u591a\u4e2a\u503c\u7528\u9017\u53f7(,)\u5206\u9694\uff0c\u901a\u914d\u7b26\u7528\u661f\u53f7(*)\u8868\u793a\uff0c\u53ea\u80fd\u5728\u6bcf\u4e2a\u503c\u7684\u672a\u5c3e\u4f7f\u7528\u901a\u914d\u7b26\uff0c\u88ab\u6388\u4e0e\u7684\u6743\u9650\u4e0d\u80fd\u8d85\u51fa\u5f53\u524d\u7ba1\u7406\u4eba\u5458\u7684\u6743\u9650
+displayNameTip=\u7528\u6237\u59d3\u540d\uff0c\u53ef\u4f7f\u7528\u4e2d\u6587\uff0c\u75311-50\u4e2a\u5b57\u7b26\u7ec4\u6210
+emailTip=\u7528\u4e8e\u63a5\u6536\u7cfb\u7edf\u90ae\u4ef6\uff0c\u53ef\u4ee5\u8f93\u5165\u591a\u4e2a\u90ae\u4ef6\u5730\u5740\uff0c\u4f7f\u7528\u82f1\u6587\u5206\u53f7\u5206\u9694(;)\uff0c \u5f62\u5982 foo1@163.comj;foo2@gmail.com
+userLocaleTip=\u53d1\u9001\u7cfb\u7edf\u90ae\u4ef6\u65f6\uff0c\u5c06\u6839\u636e\u7528\u6237\u4f7f\u7528\u7684\u8bed\u8a00\u53d1\u9001\u4e0d\u540c\u8bed\u8a00\u7684\u90ae\u4ef6\u5185\u5bb9
+DisplayNameTip
+EmailTip
+UserLocaleTip
+missRequestParameters=\u4e22\u5931\u8bf7\u6c42\u53c2\u6570
+haveNoRootPrivilege=\u6ca1\u6709root\u6743\u9650
+confirmReloadCache=\u786e\u8ba4\u91cd\u65b0\u52a0\u8f7d\u7f13\u5b58
+confirmDeleteRegistry=\u786e\u8ba4\u5220\u9664\u6ce8\u518c\u4e2d\u5fc3
+confirmAutoRedirectRegistry=\u786e\u8ba4\u91cd\u5b9a\u5411\u6ce8\u518c\u4e2d\u5fc3
+confirmDeleteExpiredRegistry=\u786e\u8ba4\u5220\u9664\u8fc7\u671f\u6ce8\u518c\u4e2d\u5fc3
+confirmSyncRegistry=\u786e\u8ba4\u540c\u6b65\u6ce8\u518c\u4e2d\u5fc3\u5730\u5740\u5217\u8868\u5230\u5ba2\u6237\u7aef
+confirm.toblacklist=\u786e\u8ba4\u52a0\u5165\u9ed1\u540d\u5355?<br/><font color=blue size=3>\u5982\u679c\u6ca1\u6709\u767d\u540d\u5355\uff0c\u5c06\u7981\u6b62\u5728\u9ed1\u540d\u5355\u5185\u7684\u6240\u6709\u6d88\u8d39\u8005\u8bbf\u95ee\u3002</font>
+confirm.towhitelist=\u786e\u8ba4\u52a0\u5165\u767d\u540d\u5355?<br/><font color=blue size=3>\u5c06\u7981\u6b62\u4e0d\u5728\u767d\u540d\u5355\u5185\u7684\u6240\u6709\u5176\u5b83\u6d88\u8d39\u8005\u8bbf\u95ee\uff0c\u9ed1\u540d\u5355\u5931\u6548\u3002</font>
+confirm.clean.operation=\u786e\u8ba4\u6e05\u9664\u64cd\u4f5c\u8bb0\u5f55
+autoRedirect=\u81ea\u52a8\u91cd\u5b9a\u5411
+deleteExpired=\u5220\u9664\u6240\u6709\u5df2\u8fc7\u671f
+sync=\u540c\u6b65
+legacies=1.0\u9057\u7559\u5ba2\u6237\u7aef
+logined=\u5df2\u767b\u5f55\u5ba2\u6237\u7aef
+dumps=\u7cfb\u7edf\u5feb\u7167
+Registry=\u6ce8\u518c\u4e2d\u5fc3\u7248\u672c
+Java=JDK\u7248\u672c
+Locale=\u8bed\u8a00
+OS=\u64cd\u4f5c\u7cfb\u7edf
+Uptime=\u8fd0\u884c\u65f6\u95f4
+Host=\u57df\u540d
+CPU=\u0043\u0050\u0055
+confirmEnableUser=\u786e\u8ba4\u542f\u52a8\u7528\u6237
+confirmDisableUser=\u786e\u8ba4\u7981\u7528\u7528\u6237
+documentTitle=\u6587\u6863\u6807\u9898
+documentLink/documentPage=\u94fe\u63a5\u5730\u5740/\u9875\u9762\u5185\u5bb9
+documentInternal=\u9875\u9762
+documentExternal=\u94fe\u63a5
+documentApi=API
+documentType=\u6587\u6863\u7c7b\u578b
+documentContent=\u6587\u6863\u5185\u5bb9
+Yes=\u662f
+No=\u5426
+returnValue=\u8fd4\u56de\u503c
+throwException=\u629b\u51fa\u5f02\u5e38
+#BatchAddressTip=\u591a\u4e2a\u5730\u5740\u7528\u6362\u884c\u7b26\u5206\u9694\uff0c\u5730\u5740\u5fc5\u9700\u662f0.0.0.0\u5230255.255.255.255\u7684IP\u5730\u5740
+#AccessControlTip=\u767d\u540d\u5355\u4f18\u5148\uff0c\u53ea\u8981\u6709\u767d\u540d\u5355\uff0c\u5219\u767d\u540d\u5355\u751f\u6548\uff0c\u5426\u5219\u9ed1\u540d\u5355\u751f\u6548
+#RouteNameTip=\u53ef\u4f7f\u7528\u4e2d\u6587\uff0c\u75311-200\u4e2a\u5b57\u7b26\u7ec4\u6210
+#RoutePriorityTip=\u6570\u5b57\u8d8a\u5927\u8d8a\u4f18\u5148
+#RouteMethodTip=\u53ea\u6709Dubbo2.0.0\u4ee5\u4e0a\u7248\u672c\u7684\u670d\u52a1\u6d88\u8d39\u7aef\u652f\u6301\u6309\u65b9\u6cd5\u8def\u7531\uff0c\u591a\u4e2a\u65b9\u6cd5\u540d\u7528\u9017\u53f7\u5206\u9694
+#Choose=\u8bf7\u9009\u62e9
+#RouteMatchTip=\u5f53\u6d88\u8d39\u8005\u6ee1\u8db3\u5339\u914d\u6761\u4ef6\u65f6\u4f7f\u7528\u5f53\u524d\u89c4\u5219\u8fdb\u884c\u8fc7\u6ee4
+#RouteHostTip=\u591a\u4e2a\u503c\u7528\u9017\u53f7\u5206\u9694\uff0c\u4ee5\u661f\u53f7\u7ed3\u5c3e\u8868\u793a\u901a\u914d\u5730\u5740\u6bb5
+#RouteClusterTip=\u53ef\u901a\u8fc7\u83dc\u5355"\u670d\u52a1\u63a7\u5236"->"\u670d\u52a1\u5668\u96c6\u7fa4"\u7ba1\u7406
+#RouteFilterTip=\u6ee1\u8db3\u8fc7\u6ee4\u89c4\u5219\u7684\u63d0\u4f9b\u8005\u5730\u5740\u5c06\u88ab\u63a8\u9001\u7ed9\u6d88\u8d39\u8005
+testMethodTip=\u5982\u679c\u6709\u65b9\u6cd5\u91cd\u8f7d\u6216\u4f7f\u7528Dubbo1.0.x\u7248\u672c\u7684\u670d\u52a1\u63d0\u4f9b\u8005\uff0c\u9700\u5199\u5168\u65b9\u6cd5\u7b7e\u540d\uff0c\u5982\uff1afindBy(int,java.lang.String)\uff0c\u5426\u5219\u53ea\u9700\u65b9\u6cd5\u540d\uff0c\u5982\uff1afindBy
+testJsonTip=JSON\u683c\u5f0f\uff1a\u5b57\u7b26\u4e32\u7528\u53cc\u5f15\u53f7\u8868\u793a\uff0c\u5982\uff1a"\u5b57\u7b26\u4e32"\uff0c\u6570\u5b57\u548cBoolean\u503c\u4e0d\u7528\u5f15\u53f7\uff0c\u5982\uff1a123 \u548c true \u6216 false\uff0cPOJO\u5bf9\u8c61\u6216Map\u7528\u5927\u62ec\u53f7\u8868\u793a\uff0c\u5982\uff1a{"\u5c5e\u6027\u540d1": "\u5c5e\u6027\u503c1", "\u5c5e\u6027\u540d2": "\u5c5e\u6027\u503c2"}\uff0c\u6570\u7ec4\u6216List\u6216Set\u7528\u65b9\u62ec\u53f7\u8868\u793a\uff0c\u5982\uff1a["\u503c1", "\u503c2"]
+testParametersTip=\u5f53\u4e3a\u65e0\u53c2\u6570\u65b9\u6cd5\u65f6\u53c2\u6570\u503c\u53ef\u4ee5\u4e0d\u586b\uff0c\u53c2\u6570\u503c\u4f7f\u7528JSON\u683c\u5f0f\u8868\u793a
+testResultTip=\u5f53\u4e3avoid\u65b9\u6cd5\u65f6\u7ed3\u679c\u53ef\u4ee5\u4e0d\u586b\uff0c\u629b\u51fa\u5f02\u5e38\u4f7f\u7528\u5f02\u5e38\u7c7b\u5168\u540d\u8868\u793a\uff0c\u8fd4\u56de\u503c\u4f7f\u7528JSON\u683c\u5f0f\u8868\u793a
+testAutoRunTip=\u5982\u679c\u8bbe\u7f6e\u4e3a\u81ea\u52a8\u8fd0\u884c\uff0c\u82e5\u8be5\u670d\u52a1\u5df2\u6ce8\u518c\u6216\u65b0\u6ce8\u518c\uff0c\u5219\u81ea\u52a8\u8fd0\u884c\u6b64\u6d4b\u8bd5\u7528\u4f8b\uff0c\u8fd0\u884c\u5931\u8d25\uff0c\u5c06\u53d1\u9001\u90ae\u4ef6
+confirmRunTest=\u786e\u8ba4\u8fd0\u884c\u6d4b\u8bd5
+confirm.runAll=\u786e\u8ba4\u5bf9\u6240\u6709\u63d0\u4f9b\u8005\u8fd0\u884c\u6d4b\u8bd5
+#
+#anonymous=\u533f\u540d
+#Unuse=\u672a\u4f7f\u7528
+#RouteName=\u8def\u7531\u540d
+#Priority=\u4f18\u5148\u7ea7
+#MatchRule=\u5339\u914d\u6761\u4ef6
+#ConsumerHost=\u6d88\u8d39\u8005IP\u5730\u5740
+#ConsumerCluster=\u6d88\u8d39\u8005\u96c6\u7fa4
+#FilterRule=\u8fc7\u6ee4\u89c4\u5219
+#ProviderHost=\u63d0\u4f9b\u8005IP\u5730\u5740
+#ProviderCluster=\u63d0\u4f9b\u8005\u96c6\u7fa4
+#ProviderProtocol=\u63d0\u4f9b\u8005\u534f\u8bae
+#ProviderPort=\u63d0\u4f9b\u8005\u7aef\u53e3
+#Match=\u5339\u914d
+#Mismatch=\u4e0d\u5339\u914d
+#ConsumerAddress=\u6d88\u8d39\u8005\u5730\u5740
+generic=\u6cdb\u5316
+doubling=\u500d\u6743
+loadBalanceStrategy=\u8d1f\u8f7d\u5747\u8861\u7b56\u7565
+random=\u968f\u673a
+roundrobin=\u8f6e\u8be2
+leastactive=\u6700\u5c11\u5e76\u53d1
+testName=\u6d4b\u8bd5\u7528\u4f8b\u540d\u79f0
+operator=\u64cd\u4f5c
+dataFormat=\u6570\u636e\u683c\u5f0f
+resultType=\u7ed3\u679c\u7c7b\u578b
+resultController=\u8fd4\u56de\u503c/\u5f02\u5e38\u7c7b\u578b
+autoRun=\u81ea\u52a8\u8fd0\u884c
+manualRun=\u624b\u52a8\u8fd0\u884c
+run=\u8fd0\u884c
+runAll=\u8fd0\u884c\u6240\u6709\u63d0\u4f9b\u8005
+expected=\u671f\u671b\u7ed3\u679c
+actual=\u5b9e\u9645\u7ed3\u679c
+reRun=\u91cd\u65b0\u8fd0\u884c
+#Username=\u7528\u6237\u540d
+#DisplayName=\u663e\u793a\u540d
+#Department=\u90e8\u95e8
+#Email=\u90ae\u7bb1
+#Phone=\u624b\u673a
+#Alitalk=\u65fa\u65fa
+startDate=\u542f\u52a8\u65f6\u95f4
+console=\u63a7\u5236\u53f0
+total=\u603b\u6570
+delta=\u504f\u5dee
+expired=\u8fc7\u671f
+alived=\u5b58\u6d3b
+redirect=\u91cd\u5b9a\u5411
+current=\u5f53\u524d
+#overrides
+override.config=\u52a8\u6001\u914d\u7f6e
+override.mock=\u670d\u52a1\u964d\u7ea7
+parameter=\u53c2\u6570
+parameter.key=\u53c2\u6570\u540d
+parameter.value=\u53c2\u6570\u503c
+parameter.tip=\u65b9\u6cd5\u7ea7\u914d\u7f6e\u5982\uff1afindPerson.timeout=1000
+mock.all.method=\u6240\u6709\u65b9\u6cd5\u7684Mock\u503c
+mock.method=\u65b9\u6cd5
+mock.value=\u7684Mock\u503c
+mock.tip=\u793a\u4f8b\uff1areturn null/empty/JSON\u6216throw com.foo.BarException
+protocol=\u534F\u8BAE
+host=\u4E3B\u673A\u540D
+port=\u7AEF\u53E3
+interface=\u63A5\u53E3\u540D
+version=\u7248\u672C
+group=\u5206\u7EC4
+methods=\u65B9\u6CD5\u5217\u8868
+category=\u6570\u636E\u7C7B\u578B
+application=\u5E94\u7528\u540D
+owner=\u8D1F\u8D23\u4EBA
+cluster=\u96C6\u7FA4
+loadbalance=\u8D1F\u8F7D\u5747\u8861
+timeout=\u8D85\u65F6
+retries=\u91CD\u8BD5\u6B21\u6570
+threads=\u7EBF\u7A0B\u6570
+connections=\u8FDE\u63A5\u6570
+accepts=\u63A5\u6536\u8FDE\u63A5\u6570
+actives=\u5BA2\u6237\u7AEF\u5E76\u53D1\u8BF7\u6C42\u9650\u5236
+executes=\u7EBF\u7A0B\u6C60\u5E76\u53D1\u6267\u884C\u9650\u5236
+check=\u68C0\u67E5
+side=\u6240\u5C5E\u7AEF
+pid=\u8FDB\u7A0B\u53F7
+timestamp=\u65F6\u95F4\u6233
+dubbo=Dubbo\u7248\u672C
+anyhost=\u7ED1\u5B9A\u6240\u6709IP
+weight=\u6743\u91CD
+weight.doubling=\u500D\u6743
+weight.halving=\u534A\u6743
+confirm.weight.doubling=\u786E\u8BA4\u6743\u91CD\u52A0\u500D?
+confirm.weight.halving=\u786E\u8BA4\u6743\u91CD\u51CF\u534A?
+batch.weight.doubling=\u6279\u91CF\u500D\u6743
+batch.weight.halving=\u6279\u91CF\u534A\u6743
+confirm.batch.weight.doubling=\u786E\u8BA4\u6240\u9009\u9879\u6743\u91CD\u52A0\u500D?
+confirm.batch.weight.halving=\u786E\u8BA4\u6240\u9009\u9879\u6743\u91CD\u51CF\u534A?
+NoSuchOperationData=\u64CD\u4F5C\u7684\u6570\u636E\u4E0D\u5B58\u5728\u3002
+CanNotDeleteDynamicData=\u4E0D\u80FD\u5220\u9664\u52A8\u6001\u6570\u636E\u3002
+HaveNoServicePrivilege=\u60A8\u6CA1\u6709\u8BE5\u670D\u52A1\u7684\u6743\u9650\u3002
+dynamic.parameters.tip=\u52A8\u6001URL\u4E0D\u80FD\u76F4\u63A5\u4FEE\u6539\uFF0C\u9700\u901A\u8FC7\u52A8\u6001\u914D\u7F6E\u8FDB\u884C\u8986\u76D6\uFF0C\u683C\u5F0F\u4E0EURL\u53C2\u6570\u76F8\u540C\u3002
+default.owner=\u8d1f\u8d23\u4eba
+logger=\u65e5\u5fd7
+default.server=\u9ed8\u8ba4\u670d\u52a1\u7aef
+default.actives=\u5e76\u53d1\u8c03\u7528\u6570
+default.client=\u9ed8\u8ba4\u5ba2\u6237\u7aef
+default.connections=\u6700\u5927\u8fde\u63a5\u6570
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/i18n/message_zh_TW.properties b/dubbo-admin/src/main/resources/i18n/message_zh_TW.properties
similarity index 96%
rename from dubbo-admin/src/main/webapp/WEB-INF/i18n/message_zh_TW.properties
rename to dubbo-admin/src/main/resources/i18n/message_zh_TW.properties
index 8e4a18b..56ae82e 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/i18n/message_zh_TW.properties
+++ b/dubbo-admin/src/main/resources/i18n/message_zh_TW.properties
@@ -1,7 +1,25 @@
+#
+# 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.
+#
+
 #menus
 home=\u9996\u9801
 about=\u95dc\u65bc
 help=\u5e6b\u52a9
+revision=\u4fee\u8a02
 favorites=\u6211\u7684\u6700\u611b
 histories=\u6b77\u53f2\u8a18\u9304
 governance=\u670d\u52d9\u6cbb\u7406
@@ -19,6 +37,7 @@ consumers=\u6d88\u8cbb\u8005
 accesses=\u9ed1\u767d\u540d\u55ae
 routes=\u8def\u7531
 weights=\u6b0a\u91cd
+InvalidIP=\u7121\u6548\u0069\u0070\u5730\u5740
 loadbalances=\u8ca0\u8f09\u5747\u8861
 tests=\u6e2c\u8a66
 mocks=\u6a21\u64ec
@@ -39,7 +58,10 @@ statuses=\u72c0\u614b\u6e05\u55ae
 failed=\u5931\u6557\u8a18\u9304
 cached=\u7de9\u5b58\u8a18\u9304
 dumps=\u5feb\u7167
+default.lazy=\u9ed8\u8a8d\u61f6\u555f\u52d5
 versions=Dubbo\u7248\u672c
+service.filter=\u670d\u52d9filter
+default.service.filter=\u9ed8\u8a8d\u670d\u52d9filter
 logs=\u65e5\u8a8c
 infos=\u4fee\u6539\u500b\u4eba\u8cc7\u8a0a
 passwds=\u4fee\u6539\u500b\u4eba\u5bc6\u78bc
@@ -602,9 +624,12 @@ sync=\u540c\u6b65
 legacies=1.0\u907a\u7559\u7528\u6236\u7aef
 logined=\u5df2\u767b\u9304\u7528\u6236\u7aef
 dumps=\u7cfb\u7d71\u5feb\u7167
+update=\u66f4\u65b0
+generic=\u6cdb\u5316
 Registry=\u8a3b\u518a\u4e2d\u5fc3\u7248\u672c
 Java=JDK\u7248\u672c
 Locale=\u8a9e\u8a00
+CPU=\u0043\u0050\u0055
 OS=\u4f5c\u696d\u7cfb\u7d71
 Uptime=\u57f7\u884c\u6642\u9593
 Host=\u529f\u80fd\u8b8a\u6578\u540d\u7a31
@@ -662,7 +687,7 @@ testName=\u6e2c\u8a66\u7528\u4f8b\u540d\u7a31
 operator=\u64cd\u4f5c
 dataFormat=\u8cc7\u6599\u683c\u5f0f
 resultType=\u7d50\u679c\u985e\u578b
-result=\u8fd4\u56de\u503c/\u7570\u5e38\u985e\u578b
+resultController=\u8fd4\u56de\u503c/\u7570\u5e38\u985e\u578b
 autoRun=\u81ea\u52d5\u904b\u884c
 manualRun=\u624b\u52d5\u904b\u884c
 run=\u904b\u884c
@@ -693,3 +718,9 @@ parameter.value=\u53c3\u6578\u503c
 mock.all.method=\u6240\u6709\u65b9\u6cd5\u7684Mock\u503c
 mock.method=\u65b9\u6cd5
 mock.value=\u7684Mock\u503c
+default.owner=\u8ca0\u8cac\u4eba
+logger=\u65e5\u8a8c
+default.server=\u9ed8\u8a8d\u670d\u52d9\u7aef
+default.actives=\u4e26\u767c\u8abf\u7528\u6578
+default.client=\u9ed8\u8a8d\u5ba2\u6236\u7aef
+default.connections=\u6700\u5927\u9023\u63a5\u6578
diff --git a/dubbo-admin/src/main/resources/log4j.properties b/dubbo-admin/src/main/resources/log4j.properties
new file mode 100644
index 0000000..5be84a2
--- /dev/null
+++ b/dubbo-admin/src/main/resources/log4j.properties
@@ -0,0 +1,37 @@
+#
+# 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.
+#
+log4j.rootCategory=INFO, stdout, file
+log4j.logger.org.apache=ERROR
+
+
+# 控制台输出
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.target=System.out
+log4j.appender.stdout.Threshold=INFO
+log4j.appender.stdout.encoding=GBK
+log4j.appender.stdout.layout.ConversionPattern=%5p %c{2} - %m%n
+
+# 文件输出
+log4j.appender.file=org.apache.log4j.RollingFileAppender
+log4j.appender.file.file=dubbo-governance.log
+log4j.appender.file.Threshold=INFO
+log4j.appender.file.append=true
+log4j.appender.file.maxFileSize=10MB
+log4j.appender.file.maxBackupIndex=100
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d [%t] %-5p %C{6} (%F:%L) - %m%n
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/css/common.css b/dubbo-admin/src/main/resources/static/css/common.css
similarity index 92%
rename from dubbo-admin/src/main/webapp/css/common.css
rename to dubbo-admin/src/main/resources/static/css/common.css
index a60e788..e5fb2bf 100644
--- a/dubbo-admin/src/main/webapp/css/common.css
+++ b/dubbo-admin/src/main/resources/static/css/common.css
@@ -1,3 +1,20 @@
+/*
+ * 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.
+ */
+
 @charset "utf-8";
 /* CSS Document */
 html, body, div, p, ul, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, form, input, select, button, textarea, iframe, table, th, td {
diff --git a/dubbo-admin/src/main/webapp/css/dubbo.css b/dubbo-admin/src/main/resources/static/css/dubbo.css
similarity index 85%
rename from dubbo-admin/src/main/webapp/css/dubbo.css
rename to dubbo-admin/src/main/resources/static/css/dubbo.css
index 9a9c90c..3a462d9 100644
--- a/dubbo-admin/src/main/webapp/css/dubbo.css
+++ b/dubbo-admin/src/main/resources/static/css/dubbo.css
@@ -1,3 +1,20 @@
+/*
+ * 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.
+ */
+
 @charset "utf-8";
 /* CSS Document */
 /*head*/
diff --git a/dubbo-admin/src/main/webapp/css/skin.css b/dubbo-admin/src/main/resources/static/css/skin.css
similarity index 85%
rename from dubbo-admin/src/main/webapp/css/skin.css
rename to dubbo-admin/src/main/resources/static/css/skin.css
index 3f52060..d0e0794 100644
--- a/dubbo-admin/src/main/webapp/css/skin.css
+++ b/dubbo-admin/src/main/resources/static/css/skin.css
@@ -1,3 +1,20 @@
+/*
+ * 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.
+ */
+
 @charset "utf-8";
 /* CSS Document */
 /*head*/
diff --git a/dubbo-admin/src/main/webapp/images/404error.gif b/dubbo-admin/src/main/resources/static/images/404error.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/404error.gif
rename to dubbo-admin/src/main/resources/static/images/404error.gif
diff --git a/dubbo-admin/src/main/webapp/images/bg01.gif b/dubbo-admin/src/main/resources/static/images/bg01.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/bg01.gif
rename to dubbo-admin/src/main/resources/static/images/bg01.gif
diff --git a/dubbo-admin/src/main/webapp/images/bg02.gif b/dubbo-admin/src/main/resources/static/images/bg02.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/bg02.gif
rename to dubbo-admin/src/main/resources/static/images/bg02.gif
diff --git a/dubbo-admin/src/main/webapp/images/bg03.gif b/dubbo-admin/src/main/resources/static/images/bg03.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/bg03.gif
rename to dubbo-admin/src/main/resources/static/images/bg03.gif
diff --git a/dubbo-admin/src/main/webapp/images/bg04.gif b/dubbo-admin/src/main/resources/static/images/bg04.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/bg04.gif
rename to dubbo-admin/src/main/resources/static/images/bg04.gif
diff --git a/dubbo-admin/src/main/webapp/images/btn_info.png b/dubbo-admin/src/main/resources/static/images/btn_info.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/btn_info.png
rename to dubbo-admin/src/main/resources/static/images/btn_info.png
diff --git a/dubbo-admin/src/main/webapp/images/btn_service.png b/dubbo-admin/src/main/resources/static/images/btn_service.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/btn_service.png
rename to dubbo-admin/src/main/resources/static/images/btn_service.png
diff --git a/dubbo-admin/src/main/webapp/images/button_hover.png b/dubbo-admin/src/main/resources/static/images/button_hover.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/button_hover.png
rename to dubbo-admin/src/main/resources/static/images/button_hover.png
diff --git a/dubbo-admin/src/main/webapp/images/button_normal.png b/dubbo-admin/src/main/resources/static/images/button_normal.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/button_normal.png
rename to dubbo-admin/src/main/resources/static/images/button_normal.png
diff --git a/dubbo-admin/src/main/webapp/images/co_01.gif b/dubbo-admin/src/main/resources/static/images/co_01.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/co_01.gif
rename to dubbo-admin/src/main/resources/static/images/co_01.gif
diff --git a/dubbo-admin/src/main/webapp/images/co_02.gif b/dubbo-admin/src/main/resources/static/images/co_02.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/co_02.gif
rename to dubbo-admin/src/main/resources/static/images/co_02.gif
diff --git a/dubbo-admin/src/main/webapp/images/co_03.gif b/dubbo-admin/src/main/resources/static/images/co_03.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/co_03.gif
rename to dubbo-admin/src/main/resources/static/images/co_03.gif
diff --git a/dubbo-admin/src/main/webapp/images/co_04.gif b/dubbo-admin/src/main/resources/static/images/co_04.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/co_04.gif
rename to dubbo-admin/src/main/resources/static/images/co_04.gif
diff --git a/dubbo-admin/src/main/webapp/images/dog.gif b/dubbo-admin/src/main/resources/static/images/dog.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/dog.gif
rename to dubbo-admin/src/main/resources/static/images/dog.gif
diff --git a/dubbo-admin/src/main/webapp/images/dubbo_list_th.png b/dubbo-admin/src/main/resources/static/images/dubbo_list_th.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/dubbo_list_th.png
rename to dubbo-admin/src/main/resources/static/images/dubbo_list_th.png
diff --git a/dubbo-admin/src/main/webapp/images/exit.png b/dubbo-admin/src/main/resources/static/images/exit.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/exit.png
rename to dubbo-admin/src/main/resources/static/images/exit.png
diff --git a/dubbo-admin/src/main/webapp/images/fav_arrow.png b/dubbo-admin/src/main/resources/static/images/fav_arrow.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/fav_arrow.png
rename to dubbo-admin/src/main/resources/static/images/fav_arrow.png
diff --git a/dubbo-admin/src/main/webapp/images/fav_tab_active.png b/dubbo-admin/src/main/resources/static/images/fav_tab_active.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/fav_tab_active.png
rename to dubbo-admin/src/main/resources/static/images/fav_tab_active.png
diff --git a/dubbo-admin/src/main/webapp/images/fav_tab_normal.png b/dubbo-admin/src/main/resources/static/images/fav_tab_normal.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/fav_tab_normal.png
rename to dubbo-admin/src/main/resources/static/images/fav_tab_normal.png
diff --git a/dubbo-admin/src/main/webapp/images/fav_title.png b/dubbo-admin/src/main/resources/static/images/fav_title.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/fav_title.png
rename to dubbo-admin/src/main/resources/static/images/fav_title.png
diff --git a/dubbo-admin/src/main/webapp/images/head_bg.png b/dubbo-admin/src/main/resources/static/images/head_bg.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/head_bg.png
rename to dubbo-admin/src/main/resources/static/images/head_bg.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_add.png b/dubbo-admin/src/main/resources/static/images/ico_add.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_add.png
rename to dubbo-admin/src/main/resources/static/images/ico_add.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_back.png b/dubbo-admin/src/main/resources/static/images/ico_back.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_back.png
rename to dubbo-admin/src/main/resources/static/images/ico_back.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_balance.png b/dubbo-admin/src/main/resources/static/images/ico_balance.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_balance.png
rename to dubbo-admin/src/main/resources/static/images/ico_balance.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_cancel.png b/dubbo-admin/src/main/resources/static/images/ico_cancel.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_cancel.png
rename to dubbo-admin/src/main/resources/static/images/ico_cancel.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_delete.png b/dubbo-admin/src/main/resources/static/images/ico_delete.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_delete.png
rename to dubbo-admin/src/main/resources/static/images/ico_delete.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_disable.png b/dubbo-admin/src/main/resources/static/images/ico_disable.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_disable.png
rename to dubbo-admin/src/main/resources/static/images/ico_disable.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_down.png b/dubbo-admin/src/main/resources/static/images/ico_down.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_down.png
rename to dubbo-admin/src/main/resources/static/images/ico_down.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_edit.png b/dubbo-admin/src/main/resources/static/images/ico_edit.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_edit.png
rename to dubbo-admin/src/main/resources/static/images/ico_edit.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_enable.png b/dubbo-admin/src/main/resources/static/images/ico_enable.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_enable.png
rename to dubbo-admin/src/main/resources/static/images/ico_enable.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_error.png b/dubbo-admin/src/main/resources/static/images/ico_error.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_error.png
rename to dubbo-admin/src/main/resources/static/images/ico_error.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_favorite.png b/dubbo-admin/src/main/resources/static/images/ico_favorite.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_favorite.png
rename to dubbo-admin/src/main/resources/static/images/ico_favorite.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_forb.png b/dubbo-admin/src/main/resources/static/images/ico_forb.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_forb.png
rename to dubbo-admin/src/main/resources/static/images/ico_forb.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_graph.png b/dubbo-admin/src/main/resources/static/images/ico_graph.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_graph.png
rename to dubbo-admin/src/main/resources/static/images/ico_graph.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_help.png b/dubbo-admin/src/main/resources/static/images/ico_help.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_help.png
rename to dubbo-admin/src/main/resources/static/images/ico_help.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_list.png b/dubbo-admin/src/main/resources/static/images/ico_list.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_list.png
rename to dubbo-admin/src/main/resources/static/images/ico_list.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_password.png b/dubbo-admin/src/main/resources/static/images/ico_password.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_password.png
rename to dubbo-admin/src/main/resources/static/images/ico_password.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_reconnect.png b/dubbo-admin/src/main/resources/static/images/ico_reconnect.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_reconnect.png
rename to dubbo-admin/src/main/resources/static/images/ico_reconnect.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_recover.png b/dubbo-admin/src/main/resources/static/images/ico_recover.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_recover.png
rename to dubbo-admin/src/main/resources/static/images/ico_recover.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_register.png b/dubbo-admin/src/main/resources/static/images/ico_register.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_register.png
rename to dubbo-admin/src/main/resources/static/images/ico_register.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_reload.png b/dubbo-admin/src/main/resources/static/images/ico_reload.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_reload.png
rename to dubbo-admin/src/main/resources/static/images/ico_reload.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_renotify.png b/dubbo-admin/src/main/resources/static/images/ico_renotify.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_renotify.png
rename to dubbo-admin/src/main/resources/static/images/ico_renotify.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_run.png b/dubbo-admin/src/main/resources/static/images/ico_run.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_run.png
rename to dubbo-admin/src/main/resources/static/images/ico_run.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_save.png b/dubbo-admin/src/main/resources/static/images/ico_save.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_save.png
rename to dubbo-admin/src/main/resources/static/images/ico_save.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_search.png b/dubbo-admin/src/main/resources/static/images/ico_search.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_search.png
rename to dubbo-admin/src/main/resources/static/images/ico_search.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_show.png b/dubbo-admin/src/main/resources/static/images/ico_show.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_show.png
rename to dubbo-admin/src/main/resources/static/images/ico_show.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_subscribe.png b/dubbo-admin/src/main/resources/static/images/ico_subscribe.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_subscribe.png
rename to dubbo-admin/src/main/resources/static/images/ico_subscribe.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_tree.png b/dubbo-admin/src/main/resources/static/images/ico_tree.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_tree.png
rename to dubbo-admin/src/main/resources/static/images/ico_tree.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_up.png b/dubbo-admin/src/main/resources/static/images/ico_up.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_up.png
rename to dubbo-admin/src/main/resources/static/images/ico_up.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_user.png b/dubbo-admin/src/main/resources/static/images/ico_user.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_user.png
rename to dubbo-admin/src/main/resources/static/images/ico_user.png
diff --git a/dubbo-admin/src/main/webapp/images/ico_warn.png b/dubbo-admin/src/main/resources/static/images/ico_warn.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/ico_warn.png
rename to dubbo-admin/src/main/resources/static/images/ico_warn.png
diff --git a/dubbo-admin/src/main/webapp/images/input.png b/dubbo-admin/src/main/resources/static/images/input.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/input.png
rename to dubbo-admin/src/main/resources/static/images/input.png
diff --git a/dubbo-admin/src/main/webapp/images/login_bg.png b/dubbo-admin/src/main/resources/static/images/login_bg.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/login_bg.png
rename to dubbo-admin/src/main/resources/static/images/login_bg.png
diff --git a/dubbo-admin/src/main/webapp/images/login_box.png b/dubbo-admin/src/main/resources/static/images/login_box.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/login_box.png
rename to dubbo-admin/src/main/resources/static/images/login_box.png
diff --git a/dubbo-admin/src/main/webapp/images/login_btn_hover.png b/dubbo-admin/src/main/resources/static/images/login_btn_hover.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/login_btn_hover.png
rename to dubbo-admin/src/main/resources/static/images/login_btn_hover.png
diff --git a/dubbo-admin/src/main/webapp/images/login_btn_normal.png b/dubbo-admin/src/main/resources/static/images/login_btn_normal.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/login_btn_normal.png
rename to dubbo-admin/src/main/resources/static/images/login_btn_normal.png
diff --git a/dubbo-admin/src/main/webapp/images/login_shadow.png b/dubbo-admin/src/main/resources/static/images/login_shadow.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/login_shadow.png
rename to dubbo-admin/src/main/resources/static/images/login_shadow.png
diff --git a/dubbo-admin/src/main/webapp/images/logo.png b/dubbo-admin/src/main/resources/static/images/logo.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/logo.png
rename to dubbo-admin/src/main/resources/static/images/logo.png
diff --git a/dubbo-admin/src/main/webapp/images/main_bg.png b/dubbo-admin/src/main/resources/static/images/main_bg.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/main_bg.png
rename to dubbo-admin/src/main/resources/static/images/main_bg.png
diff --git a/dubbo-admin/src/main/webapp/images/nav_bg.png b/dubbo-admin/src/main/resources/static/images/nav_bg.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/nav_bg.png
rename to dubbo-admin/src/main/resources/static/images/nav_bg.png
diff --git a/dubbo-admin/src/main/webapp/images/nav_btn_bg22.png b/dubbo-admin/src/main/resources/static/images/nav_btn_bg22.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/nav_btn_bg22.png
rename to dubbo-admin/src/main/resources/static/images/nav_btn_bg22.png
diff --git a/dubbo-admin/src/main/webapp/images/nav_btn_bg3.png b/dubbo-admin/src/main/resources/static/images/nav_btn_bg3.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/nav_btn_bg3.png
rename to dubbo-admin/src/main/resources/static/images/nav_btn_bg3.png
diff --git a/dubbo-admin/src/main/webapp/images/nav_btn_bg33.png b/dubbo-admin/src/main/resources/static/images/nav_btn_bg33.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/nav_btn_bg33.png
rename to dubbo-admin/src/main/resources/static/images/nav_btn_bg33.png
diff --git a/dubbo-admin/src/main/webapp/images/nav_btn_bg44.png b/dubbo-admin/src/main/resources/static/images/nav_btn_bg44.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/nav_btn_bg44.png
rename to dubbo-admin/src/main/resources/static/images/nav_btn_bg44.png
diff --git a/dubbo-admin/src/main/webapp/images/nav_pass.png b/dubbo-admin/src/main/resources/static/images/nav_pass.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/nav_pass.png
rename to dubbo-admin/src/main/resources/static/images/nav_pass.png
diff --git a/dubbo-admin/src/main/webapp/images/nav_selected.png b/dubbo-admin/src/main/resources/static/images/nav_selected.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/nav_selected.png
rename to dubbo-admin/src/main/resources/static/images/nav_selected.png
diff --git a/dubbo-admin/src/main/webapp/images/pop_close.png b/dubbo-admin/src/main/resources/static/images/pop_close.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/pop_close.png
rename to dubbo-admin/src/main/resources/static/images/pop_close.png
diff --git a/dubbo-admin/src/main/webapp/images/pop_left.png b/dubbo-admin/src/main/resources/static/images/pop_left.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/pop_left.png
rename to dubbo-admin/src/main/resources/static/images/pop_left.png
diff --git a/dubbo-admin/src/main/webapp/images/pop_leftbottom.png b/dubbo-admin/src/main/resources/static/images/pop_leftbottom.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/pop_leftbottom.png
rename to dubbo-admin/src/main/resources/static/images/pop_leftbottom.png
diff --git a/dubbo-admin/src/main/webapp/images/pop_lefttop_small.png b/dubbo-admin/src/main/resources/static/images/pop_lefttop_small.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/pop_lefttop_small.png
rename to dubbo-admin/src/main/resources/static/images/pop_lefttop_small.png
diff --git a/dubbo-admin/src/main/webapp/images/pop_midbottom.png b/dubbo-admin/src/main/resources/static/images/pop_midbottom.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/pop_midbottom.png
rename to dubbo-admin/src/main/resources/static/images/pop_midbottom.png
diff --git a/dubbo-admin/src/main/webapp/images/pop_midtop_small.png b/dubbo-admin/src/main/resources/static/images/pop_midtop_small.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/pop_midtop_small.png
rename to dubbo-admin/src/main/resources/static/images/pop_midtop_small.png
diff --git a/dubbo-admin/src/main/webapp/images/pop_right.png b/dubbo-admin/src/main/resources/static/images/pop_right.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/pop_right.png
rename to dubbo-admin/src/main/resources/static/images/pop_right.png
diff --git a/dubbo-admin/src/main/webapp/images/pop_rightbottom.png b/dubbo-admin/src/main/resources/static/images/pop_rightbottom.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/pop_rightbottom.png
rename to dubbo-admin/src/main/resources/static/images/pop_rightbottom.png
diff --git a/dubbo-admin/src/main/webapp/images/pop_righttop_small.png b/dubbo-admin/src/main/resources/static/images/pop_righttop_small.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/pop_righttop_small.png
rename to dubbo-admin/src/main/resources/static/images/pop_righttop_small.png
diff --git a/dubbo-admin/src/main/webapp/images/search_active.png b/dubbo-admin/src/main/resources/static/images/search_active.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/search_active.png
rename to dubbo-admin/src/main/resources/static/images/search_active.png
diff --git a/dubbo-admin/src/main/webapp/images/search_btn.png b/dubbo-admin/src/main/resources/static/images/search_btn.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/search_btn.png
rename to dubbo-admin/src/main/resources/static/images/search_btn.png
diff --git a/dubbo-admin/src/main/webapp/images/search_global_m.png b/dubbo-admin/src/main/resources/static/images/search_global_m.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/search_global_m.png
rename to dubbo-admin/src/main/resources/static/images/search_global_m.png
diff --git a/dubbo-admin/src/main/webapp/images/search_input.png b/dubbo-admin/src/main/resources/static/images/search_input.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/search_input.png
rename to dubbo-admin/src/main/resources/static/images/search_input.png
diff --git a/dubbo-admin/src/main/webapp/images/search_line.png b/dubbo-admin/src/main/resources/static/images/search_line.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/search_line.png
rename to dubbo-admin/src/main/resources/static/images/search_line.png
diff --git a/dubbo-admin/src/main/webapp/images/tab_active.png b/dubbo-admin/src/main/resources/static/images/tab_active.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tab_active.png
rename to dubbo-admin/src/main/resources/static/images/tab_active.png
diff --git a/dubbo-admin/src/main/webapp/images/table_title_bg.png b/dubbo-admin/src/main/resources/static/images/table_title_bg.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/table_title_bg.png
rename to dubbo-admin/src/main/resources/static/images/table_title_bg.png
diff --git a/dubbo-admin/src/main/webapp/images/tip_choose.png b/dubbo-admin/src/main/resources/static/images/tip_choose.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tip_choose.png
rename to dubbo-admin/src/main/resources/static/images/tip_choose.png
diff --git a/dubbo-admin/src/main/webapp/images/tip_confirm.png b/dubbo-admin/src/main/resources/static/images/tip_confirm.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tip_confirm.png
rename to dubbo-admin/src/main/resources/static/images/tip_confirm.png
diff --git a/dubbo-admin/src/main/webapp/images/tip_del.png b/dubbo-admin/src/main/resources/static/images/tip_del.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tip_del.png
rename to dubbo-admin/src/main/resources/static/images/tip_del.png
diff --git a/dubbo-admin/src/main/webapp/images/tip_succeed.png b/dubbo-admin/src/main/resources/static/images/tip_succeed.png
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tip_succeed.png
rename to dubbo-admin/src/main/resources/static/images/tip_succeed.png
diff --git a/dubbo-admin/src/main/webapp/images/tree-blank.gif b/dubbo-admin/src/main/resources/static/images/tree-blank.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tree-blank.gif
rename to dubbo-admin/src/main/resources/static/images/tree-blank.gif
diff --git a/dubbo-admin/src/main/webapp/images/tree-down-left.gif b/dubbo-admin/src/main/resources/static/images/tree-down-left.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tree-down-left.gif
rename to dubbo-admin/src/main/resources/static/images/tree-down-left.gif
diff --git a/dubbo-admin/src/main/webapp/images/tree-down.gif b/dubbo-admin/src/main/resources/static/images/tree-down.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tree-down.gif
rename to dubbo-admin/src/main/resources/static/images/tree-down.gif
diff --git a/dubbo-admin/src/main/webapp/images/tree-left-up.gif b/dubbo-admin/src/main/resources/static/images/tree-left-up.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tree-left-up.gif
rename to dubbo-admin/src/main/resources/static/images/tree-left-up.gif
diff --git a/dubbo-admin/src/main/webapp/images/tree-right-down.gif b/dubbo-admin/src/main/resources/static/images/tree-right-down.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tree-right-down.gif
rename to dubbo-admin/src/main/resources/static/images/tree-right-down.gif
diff --git a/dubbo-admin/src/main/webapp/images/tree-up-right.gif b/dubbo-admin/src/main/resources/static/images/tree-up-right.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tree-up-right.gif
rename to dubbo-admin/src/main/resources/static/images/tree-up-right.gif
diff --git a/dubbo-admin/src/main/webapp/images/tree-up.gif b/dubbo-admin/src/main/resources/static/images/tree-up.gif
similarity index 100%
rename from dubbo-admin/src/main/webapp/images/tree-up.gif
rename to dubbo-admin/src/main/resources/static/images/tree-up.gif
diff --git a/dubbo-admin/src/main/webapp/js/ajax.js b/dubbo-admin/src/main/resources/static/js/ajax.js
similarity index 69%
rename from dubbo-admin/src/main/webapp/js/ajax.js
rename to dubbo-admin/src/main/resources/static/js/ajax.js
index 4543e3d..3ae7ad7 100644
--- a/dubbo-admin/src/main/webapp/js/ajax.js
+++ b/dubbo-admin/src/main/resources/static/js/ajax.js
@@ -1,3 +1,20 @@
+/*
+ * 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.
+ */
+
 var Ajax = {
     get: function (url, fn) {
         XR.open("GET", url, true);
diff --git a/dubbo-admin/src/main/webapp/js/box.js b/dubbo-admin/src/main/resources/static/js/box.js
similarity index 78%
rename from dubbo-admin/src/main/webapp/js/box.js
rename to dubbo-admin/src/main/resources/static/js/box.js
index f95b4ad..607916f 100644
--- a/dubbo-admin/src/main/webapp/js/box.js
+++ b/dubbo-admin/src/main/resources/static/js/box.js
@@ -1,3 +1,20 @@
+/*
+ * 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.
+ */
+
 /* eg: Box.show(div) */
 var Box = {
     show: function (id) {
diff --git a/dubbo-admin/src/main/webapp/js/dubbo.js b/dubbo-admin/src/main/resources/static/js/dubbo.js
similarity index 94%
rename from dubbo-admin/src/main/webapp/js/dubbo.js
rename to dubbo-admin/src/main/resources/static/js/dubbo.js
index d7bec8f..6433e65 100644
--- a/dubbo-admin/src/main/webapp/js/dubbo.js
+++ b/dubbo-admin/src/main/resources/static/js/dubbo.js
@@ -1,3 +1,20 @@
+/*
+ * 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.
+ */
+
 //==== init ====
 function init() {
     initScroll();
@@ -38,6 +55,13 @@ function byId(x) {
         return document.getElementById(x);
     return x;
 }
+
+function addParameter(address, value) {
+    var url = new URL(address)
+    url.searchParams.set("lang", value)
+    window.location.href = url.href
+}
+
 // ==== cookie ====
 function setCookie(key, value) {
     var date = new Date();
@@ -159,7 +183,7 @@ function getChecked(name) {
     for (var i = 0; i < checkboxs.length; i++) {
         if (checkboxs[i].checked) {
             if (result.length > 0) {
-                result = result + "+";
+                result = result + ",";
             }
             result = result + checkboxs[i].value;
         }
diff --git a/dubbo-admin/src/main/webapp/js/jquery-1.4.2.min.js b/dubbo-admin/src/main/resources/static/js/jquery-1.4.2.min.js
similarity index 100%
rename from dubbo-admin/src/main/webapp/js/jquery-1.4.2.min.js
rename to dubbo-admin/src/main/resources/static/js/jquery-1.4.2.min.js
diff --git a/dubbo-admin/src/main/webapp/js/jquery.hoverIntent.js b/dubbo-admin/src/main/resources/static/js/jquery.hoverIntent.js
similarity index 87%
rename from dubbo-admin/src/main/webapp/js/jquery.hoverIntent.js
rename to dubbo-admin/src/main/resources/static/js/jquery.hoverIntent.js
index 75320af..d35ef42 100644
--- a/dubbo-admin/src/main/webapp/js/jquery.hoverIntent.js
+++ b/dubbo-admin/src/main/resources/static/js/jquery.hoverIntent.js
@@ -1,4 +1,21 @@
-/**
+/*
+ * 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.
+ */
+
+/**
  * hoverIntent is similar to jQuery's built-in "hover" function except that
  * instead of firing the onMouseOver event immediately, hoverIntent checks
  * to see if the user's mouse has slowed down (beneath the sensitivity
diff --git a/dubbo-admin/src/main/webapp/js/jquery.simplemodal-1.4.js b/dubbo-admin/src/main/resources/static/js/jquery.simplemodal-1.4.js
similarity index 97%
rename from dubbo-admin/src/main/webapp/js/jquery.simplemodal-1.4.js
rename to dubbo-admin/src/main/resources/static/js/jquery.simplemodal-1.4.js
index 5d119d8..e0a0e13 100644
--- a/dubbo-admin/src/main/webapp/js/jquery.simplemodal-1.4.js
+++ b/dubbo-admin/src/main/resources/static/js/jquery.simplemodal-1.4.js
@@ -1,9 +1,18 @@
 /*
- * SimpleModal 1.4 - jQuery Plugin
- * http://www.ericmmartin.com/projects/simplemodal/
- * Copyright (c) 2010 Eric Martin (http://twitter.com/ericmmartin)
- * Dual licensed under the MIT and GPL licenses
- * Revision: $Id: jquery.simplemodal-1.4.js 181192 2012-06-21 05:05:47Z tony.chenl $
+ * 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.
  */
 
 /**
diff --git a/dubbo-admin/src/main/webapp/js/menu.js b/dubbo-admin/src/main/resources/static/js/menu.js
similarity index 69%
rename from dubbo-admin/src/main/webapp/js/menu.js
rename to dubbo-admin/src/main/resources/static/js/menu.js
index bff8ee0..5ae496b 100644
--- a/dubbo-admin/src/main/webapp/js/menu.js
+++ b/dubbo-admin/src/main/resources/static/js/menu.js
@@ -1,3 +1,20 @@
+/*
+ * 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.
+ */
+
 // JavaScript Document
 
 $(function () {
diff --git a/dubbo-admin/src/main/webapp/js/pop.js b/dubbo-admin/src/main/resources/static/js/pop.js
similarity index 73%
rename from dubbo-admin/src/main/webapp/js/pop.js
rename to dubbo-admin/src/main/resources/static/js/pop.js
index 5b0ea6a..247b368 100644
--- a/dubbo-admin/src/main/webapp/js/pop.js
+++ b/dubbo-admin/src/main/resources/static/js/pop.js
@@ -1,3 +1,20 @@
+/*
+ * 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.
+ */
+
 // JavaScript Document
 $(function () {
 
diff --git a/dubbo-admin/src/main/webapp/js/trcolor.js b/dubbo-admin/src/main/resources/static/js/trcolor.js
similarity index 50%
rename from dubbo-admin/src/main/webapp/js/trcolor.js
rename to dubbo-admin/src/main/resources/static/js/trcolor.js
index 05e9d52..739f6c1 100644
--- a/dubbo-admin/src/main/webapp/js/trcolor.js
+++ b/dubbo-admin/src/main/resources/static/js/trcolor.js
@@ -1,3 +1,20 @@
+/*
+ * 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.
+ */
+
 // JavaScript Document
 // JavaScript Document
 window.onload = function showtable() {
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/common/screen/error_404.vm b/dubbo-admin/src/main/resources/templates/common/screen/error_404.vm
similarity index 89%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/common/screen/error_404.vm
rename to dubbo-admin/src/main/resources/templates/common/screen/error_404.vm
index 999db47..ccbbd3e 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/common/screen/error_404.vm
+++ b/dubbo-admin/src/main/resources/templates/common/screen/error_404.vm
@@ -1,3 +1,17 @@
+##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.
 #set($title = "Not Found")
 <div>
     <STYLE type=text/css>
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/common/screen/error_other.vm b/dubbo-admin/src/main/resources/templates/common/screen/error_other.vm
similarity index 86%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/common/screen/error_other.vm
rename to dubbo-admin/src/main/resources/templates/common/screen/error_other.vm
index 53713d8..2850765 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/common/screen/error_other.vm
+++ b/dubbo-admin/src/main/resources/templates/common/screen/error_other.vm
@@ -1,3 +1,17 @@
+##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.
 #set($title = "Not Found")
 <div>
     <STYLE type=text/css>
diff --git a/dubbo-admin/src/main/resources/templates/default.vm b/dubbo-admin/src/main/resources/templates/default.vm
new file mode 100644
index 0000000..bd0fae3
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/default.vm
@@ -0,0 +1,15 @@
+##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.
+$screen_content
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/layout/default.vm b/dubbo-admin/src/main/resources/templates/governance/layout/default.vm
similarity index 70%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/layout/default.vm
rename to dubbo-admin/src/main/resources/templates/governance/layout/default.vm
index cf5d545..9db4781 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/layout/default.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/layout/default.vm
@@ -1,3 +1,17 @@
+##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.
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
@@ -15,62 +29,62 @@
     <script type="text/javascript" src="$rootContextPath.getURI("js/dubbo.js")"></script>
 </head>
 <body onload="init();initSearch();">
-    $control.setTemplate("home:menu.vm")
+    #parse("/templates/home/control/menu.vm")
 <script language="javascript">setActiveTab(2);</script>
 <div class="dubbo_search">
     <div class="title title_search"><h2>
-        #if($_method != "index")$i18n.get($_method)#end $i18n.get($_type)
+        #if($_method != "index")#springMessageText($_method,$_method)#end #springMessageText($_type,$_type)
     </h2></div>
     <div class="crumbs">
-        <a href="$rootContextPath.getURI("/")">$i18n.get("home")</a> &gt; $i18n.get("governance")
-        #if($application && $application != '*')
+        <a href="$rootContextPath.getURI("/")">#springMessageText("home", "home")</a> &gt; #springMessageText("governance", "governance")
+        #if($app && $app != '*')
             &gt;
-            $i18n.get("applications")
-            &gt; $application
+            #springMessageText("applications", "applications")
+            &gt; $app
         #end
         #if($service && $service != '*')
             &gt;
-            #if($application && $application != '*')
-                <a href="$rootContextPath.getURI("/governance/applications")/$application/services">$i18n.get(
-                    "services")</a>
+            #if($app && $app != '*')
+                <a href="$rootContextPath.getURI("/governance/applications")/$app/services">#springMessageText(
+                    "services","addresses")</a>
             #else
-                $i18n.get("services")
+                #springMessageText("services", "services")
             #end
             &gt; $service
         #elseif($address && $address != '*')
             &gt;
-            #if($application && $application != '*')
-                <a href="$rootContextPath.getURI("/governance/applications")/$application/addresses">$i18n.get(
-                    "addresses")</a>
+            #if($app && $app != '*')
+                <a href="$rootContextPath.getURI("/governance/applications")/$app/addresses">#springMessageText(
+                    "addresses","addresses")</a>
             #else
-                $i18n.get("addresses")
+                #springMessageText("addresses", "addresses")
             #end
             &gt; $address
         #end
         #if($_method == "index")
-            &gt; $i18n.get($_type)
+            &gt; #springMessageText($_type, $_type)
         #else
             &gt;
             #if($_method == "show")
-                <a href="../$_type">$i18n.get($_type)</a>
+                <a href="../$_type">#springMessageText($_type, $_type)</a>
             #elseif($id)
-                <a href="../../$_type">$i18n.get($_type)</a>
+                <a href="../../$_type">#springMessageText($_type, $_type)</a>
             #else
-                <a href="../$_type">$i18n.get($_type)</a>
+                <a href="../$_type">#springMessageText($_type, $_type)</a>
             #end
             &gt;
             #if($id)$id &gt;#end
-            $i18n.get($_method)
+            #springMessageText($_method,$_method)
         #end
     </div>
     <div class="search_o" id="Tab1">
         <div class="search_categories">
             <ul>
-                <li id="one1" onclick="setTab2('one',1,3); return false;"><a href="#">$i18n.get("service")</a><span
+                <li id="one1" onclick="setTab2('one',1,3); return false;"><a href="#">#springMessageText("service", "service")</a><span
                         class="search_line">|</span></li>
-                <li id="one2" onclick="setTab2('one',2,3); return false;"><a href="#">$i18n.get("application")</a><span
+                <li id="one2" onclick="setTab2('one',2,3); return false;"><a href="#">#springMessageText("application", "application")</a><span
                         class="search_line">|</span></li>
-                <li id="one3" onclick="setTab2('one',3,3); return false;"><a href="#">$i18n.get("address")</a></li>
+                <li id="one3" onclick="setTab2('one',3,3); return false;"><a href="#">#springMessageText("address", "address")</a></li>
             </ul>
         </div>
         <div class="contentbox">
@@ -99,7 +113,7 @@
                 "loadbalances", "owners"])
         #elseif($address && $address != '*')
             #set($tabs = ["providers", "consumers", "routes", "accesses", "weights"])
-        #elseif($application && $application != '*')
+        #elseif($app && $app != '*')
             #set($tabs = ["services", "addresses", "overrides"])
         #else
             #if($_type != "services" && $_type != "applications" && $_type != "addresses")
@@ -117,7 +131,7 @@
                                     "show" || $_method == "add" || $_method == "addMock")../#elseif($_method ==
                                     "edit" || $_method == "editMock" || $_method == "routed" || $_method ==
                                     "notified" || $_method == "preview" || $_method == "routeselect" || $_method ==
-                                    "testrun" || $_method == "notified")../../#{end}$tab';">$i18n.get($tab)</li>
+                                    "testrun" || $_method == "notified")../../#{end}$tab';">#springMessageText($tab, $tab)</li>
                         #end
                     #end
                 </ul>
@@ -125,7 +139,7 @@
         #end
         <div class="contentbox_tab">
             <div id="con_two_1">
-                $screen_placeholder
+                $screen_content
             </div>
         </div>
     </div>
@@ -138,14 +152,14 @@
                                 style="cursor: pointer;" width="20" height="20"/></td>
         </tr>
         <tr height="120">
-            <td align="right"><span id="alertText" style="font-size: 32px;">$i18n.get("please.input")</span><br/><span
+            <td align="right"><span id="alertText" style="font-size: 32px;">#springMessageText("please.input", "please.input")</span><br/><span
                     id="alertData" style="font-size: 12px;"></span></td>
             <td></td>
         </tr>
         <tr>
             <td align="right">
-                <div class="btn_info" style="float: right; clear: left;"><a href="#" onclick="alertOK();">$i18n.get(
-                    "confirm")</a></div>
+                <div class="btn_info" style="float: right; clear: left;"><a href="#" onclick="alertOK();">#springMessageText(
+                    "confirm","confirm")</a></div>
             </td>
             <td></td>
         </tr>
@@ -159,16 +173,16 @@
                                 style="cursor: pointer;" width="20" height="20"/></td>
         </tr>
         <tr height="120">
-            <td align="right"><span id="confirmText" style="font-size: 32px;">$i18n.get("confirm")</span><br/><span
+            <td align="right"><span id="confirmText" style="font-size: 32px;">#springMessageText("confirm", "confirm")</span><br/><span
                     id="confirmData" style="font-size: 12px;"></span></td>
             <td></td>
         </tr>
         <tr>
             <td align="right">
                 <div class="btn_info" style="float: right; clear: left;"><a href="#"
-                                                                            onclick="confirmCancel();">$i18n.get(
-                    "cancel")</a></div>&nbsp;&nbsp;&nbsp;&nbsp;<div class="btn_info" style="float: right; clear: left;">
-                <a href="#" onclick="confirmOK();">$i18n.get("confirm")</a></div>
+                                                                            onclick="confirmCancel();">#springMessageText(
+                    "cancel","cancel")</a></div>&nbsp;&nbsp;&nbsp;&nbsp;<div class="btn_info" style="float: right; clear: left;">
+                <a href="#" onclick="confirmOK();">#springMessageText("confirm", "confirm")</a></div>
             </td>
             <td></td>
         </tr>
@@ -189,15 +203,15 @@
             return;
         }
         if (keyword == ''
-                || keyword == '$i18n.get("please.input.service")'
-                || keyword == '$i18n.get("please.input.application")'
-                || keyword == '$i18n.get("please.input.address")') {
+                || keyword == '#springMessageText("please.input.service", "please.input.service")'
+                || keyword == '#springMessageText("please.input.application", "please.input.application")'
+                || keyword == '#springMessageText("please.input.address", "please.input.address")') {
             keyword = '*';
         }
         window.location.href = '$rootContextPath.getURI("governance/")' + searchType + '?keyword=' + keyword;
     }
     function initSearch() {
-        #if($application && ! $service && ! $address)
+        #if($app && ! $service && ! $address)
             setTab2('one', 2, 3)
         #elseif($address)
             setTab2('one', 3, 3)
@@ -214,7 +228,7 @@
         var msg = "";
         var val = "";
         if (cursel == 1) {
-            msg = '$i18n.get("please.input.service")';
+            msg = '#springMessageText("please.input.service", "please.input.service")';
             #if($service)
                 #if($keyword)
                     val = '$keyword';
@@ -227,12 +241,12 @@
             searchType = "services";
         }
         else if (cursel == 2) {
-            msg = '$i18n.get("please.input.application")';
-            #if($application)
+            msg = '#springMessageText("please.input.application", "please.input.application")';
+            #if($app)
                 #if($keyword)
                     val = '$keyword';
                 #else
-                    val = '$application';
+                    val = '$app';
                 #end
             #else
                 val = msg;
@@ -240,7 +254,7 @@
             searchType = "applications";
         }
         else if (cursel == 3) {
-            msg = '$i18n.get("please.input.address")';
+            msg = '#springMessageText("please.input.address", "please.input.address")';
             #if($address)
                 #if($keyword)
                     val = '$keyword';
@@ -258,9 +272,9 @@
     }
     function fnonfocus() {
         var obj = document.getElementById('searchContent');
-        if (obj.value == '$i18n.get("please.input.service")'
-                || obj.value == '$i18n.get("please.input.application")'
-                || obj.value == '$i18n.get("please.input.address")') {
+        if (obj.value == '#springMessageText("please.input.service", "please.input.service")'
+                || obj.value == '#springMessageText("please.input.application", "please.input.application")'
+                || obj.value == '#springMessageText("please.input.address", "please.input.address")') {
             obj.value = '';
         }
     }
@@ -268,11 +282,11 @@
         var obj = document.getElementById('searchContent');
         if (obj.value == '') {
             if (searchType == 'services')
-                obj.value = '$i18n.get("please.input.service")';
+                obj.value = '#springMessageText("please.input.service", "please.input.service")';
             else if (searchType == 'applications')
-                obj.value = '$i18n.get("please.input.application")';
+                obj.value = '#springMessageText("please.input.application", "please.input.application")';
             else if (searchType == 'addresses')
-                obj.value = '$i18n.get("please.input.address")';
+                obj.value = '#springMessageText("please.input.address", "please.input.address")';
         }
     }
 </script>
diff --git a/dubbo-admin/src/main/resources/templates/governance/layout/noServicePrivilege.vm b/dubbo-admin/src/main/resources/templates/governance/layout/noServicePrivilege.vm
new file mode 100644
index 0000000..91700d2
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/layout/noServicePrivilege.vm
@@ -0,0 +1,29 @@
+##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.
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <title>dubbo</title>
+    <link type="text/css" href="$rootContextPath.getURI("css/common.css")" rel="stylesheet"/>
+    <link type="text/css" href="$rootContextPath.getURI("css/skin.css")" rel="stylesheet"/>
+    <link type="text/css" href="$rootContextPath.getURI("css/dubbo.css")" rel="stylesheet"/>
+    <script type="text/javascript" src="$rootContextPath.getURI("js/box.js")"></script>
+</head>
+<body>
+    $screen_placeholder
+</body>
+</html>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/layout/redirect.vm b/dubbo-admin/src/main/resources/templates/governance/layout/redirect.vm
new file mode 100644
index 0000000..9847895
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/layout/redirect.vm
@@ -0,0 +1,29 @@
+##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.
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <title>dubbo</title>
+    <link type="text/css" href="$rootContextPath.getURI("css/common.css")" rel="stylesheet"/>
+    <link type="text/css" href="$rootContextPath.getURI("css/skin.css")" rel="stylesheet"/>
+    <link type="text/css" href="$rootContextPath.getURI("css/dubbo.css")" rel="stylesheet"/>
+    <script type="text/javascript" src="$rootContextPath.getURI("js/box.js")"></script>
+</head>
+<body>
+    $screen_content
+</body>
+</html>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/layout/search.vm b/dubbo-admin/src/main/resources/templates/governance/layout/search.vm
new file mode 100644
index 0000000..30c0a04
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/layout/search.vm
@@ -0,0 +1,15 @@
+##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.
+$screen_placeholder
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/accesses/add.vm b/dubbo-admin/src/main/resources/templates/governance/screen/accesses/add.vm
similarity index 57%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/accesses/add.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/accesses/add.vm
index 2dae076..f358a45 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/accesses/add.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/accesses/add.vm
@@ -1,12 +1,27 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../accesses"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
-            class="ico_font">$i18n.get("back")</span></a>
+            class="ico_font">#springMessageText("back", "back")</span></a>
 </div>
 <br/>
-<form id="accessesForm" action="../accesses" method="POST">
+<form id="accessesForm" action="../accesses/create" method="POST">
     <table cellpadding="0" cellspacing="0" class="info">
         <tr>
-            <th width="100">$i18n.get("service")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th width="100">#springMessageText("service", "service")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>
                 #if($service)
                     <input type="hidden" id="serviceName" name="service" value="$service"/>$service
@@ -14,7 +29,7 @@
                     <textarea id="serviceName" name="service" style="ime-mode:disabled" rows="2" cols="40"></textarea>
                     #if ($serviceList && $serviceList.size() > 0)
                         <select id="selectService" name="selectService" onchange="fnSetService(this)">
-                            <option value="">$i18n.get("Choose")</option>
+                            <option value="">#springMessageText("Choose", "Choose")</option>
                             #foreach ($s in $serviceList)
                                 <option value="$s">$tool.getSimpleName($s)</option>
                             #end
@@ -24,7 +39,7 @@
             </td>
         </tr>
         <tr>
-            <th style="width: 100px;">$i18n.get("ConsumerAddress"):&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th style="width: 100px;">#springMessageText("ConsumerAddress", "ConsumerAddress"):&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>
                 #if($address)
                     <input type="hidden" id="address" name="address"
@@ -32,24 +47,24 @@
                 #else
                     <textarea id="consumerAddress" name="consumerAddress" rows="2" cols="40"></textarea>
                 #end
-                <font color="blue">$i18n.get("BatchAddressTip")</font>
+                <font color="blue">#springMessageText("BatchAddressTip", "BatchAddressTip")</font>
             </td>
         </tr>
         <tr>
-            <th>$i18n.get("status"):</th>
+            <th>#springMessageText("status", "status"):</th>
             <td>
                 <select id="allow" name="allow">
-                    <option value="false" selected="selected">$i18n.get("Forbidden")</option>
-                    <option value="true">$i18n.get("Allowed")</option>
+                    <option value="false" selected="selected">#springMessageText("Forbidden", "Forbidden")</option>
+                    <option value="true">#springMessageText("Allowed", "Allowed")</option>
                 </select>
-                <font color="blue">$i18n.get("AccessControlTip")</font>
+                <font color="blue">#springMessageText("AccessControlTip", "AccessControlTip")</font>
             </td>
         </tr>
         <tr>
             <th>
                 <div class="btn"><a href="#"
-                                    onclick="if(check()){document.getElementById('accessesForm').submit();}">$i18n.get(
-                    "save")</a></div>
+                                    onclick="if(check()){document.getElementById('accessesForm').submit();}">#springMessageText(
+                    "save","save")</a></div>
             </th>
             <td></td>
         </tr>
@@ -68,12 +83,12 @@
     function check() {
         var serviceName = byId('serviceName').value.trim();
         if (serviceName == '') {
-            showAlert("$i18n.get("PleaseInput")$i18n.get("service")", 'serviceName');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput")#springMessageText("service", "service")", 'serviceName');
             return false;
         }
         var consumerAddress = byId('consumerAddress').value.trim();
         if (consumerAddress == '') {
-            showAlert("$i18n.get("PleaseInput")$i18n.get("ConsumerAddress")", 'consumerAddress');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput")#springMessageText("ConsumerAddress", "ConsumerAddress")", 'consumerAddress');
             return false;
         }
         var exp = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
@@ -83,7 +98,7 @@
             var address = addresses[i];
             if (address != "") {
                 if (!address.match(exp) && !address.match(exp2)) {
-                    showAlert("$i18n.get("InvalidIp")", 'consumerAddress');
+                    showAlert("#springMessageText("InvalidIp", "InvalidIp")", 'consumerAddress');
                     return false;
                 }
             }
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/accesses/index.vm b/dubbo-admin/src/main/resources/templates/governance/screen/accesses/index.vm
new file mode 100644
index 0000000..b432c0d
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/accesses/index.vm
@@ -0,0 +1,92 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    #if($currentUser.role != "G")
+        <a href="accesses/add#if($service)?service=$service#end"><img
+                src="$rootContextPath.getURI("images/ico_add.png")" width="9" height="9"/><span
+                class="ico_font">#springMessageText("add", "add")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.delete","confirm.batch.delete")', 'accesses' + '/delete?accesses=' + getCheckedAccesses('ids')); } return false;"><img
+                src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.delete", "batch.delete")</span></a>
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th width="20"><input type="checkbox" onclick="checkAll('table_o', 'ids', this.checked)"/></th>
+        <th>#springMessageText("consumer.address", "consumer.address"): <input type="text" onkeyup="searchTable('table_o', 1, this.value);"
+                                                  onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        #set($column = 2) ## 是否显示 服务名一列
+        #if(!$service)
+            <th>#springMessageText("service", "service"):
+                <input type="text" onkeyup="searchTable('table_o', 2, this.value);"
+                       onclick="searchTable('table_o', 2, this.value);"/>&nbsp;
+                <img src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/>
+            </th>
+            #set($column = $column + 1)
+        #end
+        <th width="110">#springMessageText("type", "type"):
+            <select onchange="searchTable('table_o', $column, this.value);"
+                    onclick="searchTable('table_o', $column, this.value);">
+                <option value="">#springMessageText("all", "all")</option>
+                <option value="#springMessageText("whitelist", "whitelist")">#springMessageText("whitelist", "whitelist")</option>
+                <option value="#springMessageText("blacklist", "blacklist")">#springMessageText("blacklist", "blacklist")</option>
+            </select>
+        </th>
+        #if($currentUser.role != "G")
+            <th width="170">#springMessageText("operation", "operation")</th>#end
+    </tr>
+    #foreach($access in $accesses)
+        <tr>
+            <td><input type="checkbox" name="ids" value="$access.service=$access.address"/></td>
+            <td>$access.address</td>
+            #if(!$service)
+                <td><a href="services/$access.service/accesses">$access.service</a></td>
+            #end
+            <td>#if($access.allow==true) <font color="green">#springMessageText("whitelist", "whitelist")</font> #elseif($access.allow==false)
+                <font color="red">#springMessageText("blacklist", "blacklist")</font> #end</td>
+            #if($currentUser.role != "G")
+                <td>
+                    <a href="#" onclick="showConfirm('#springMessageText(
+                        "confirm.delete","confirm.delete")', '$access.address', 'accesses/delete?accesses=$access.service=$access.address'); return false;">
+                        <img src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/>
+                        <span class="ico_font">#springMessageText("delete", "delete")</span></a>
+                </td>
+            #end
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$accesses.size()#springMessageText("page.records", "page.records") </div>
+<script language="javascript">
+    function getCheckedAccesses(name) {
+        var resultController = "";
+        var checkboxs = document.getElementsByName(name);
+        for (var i = 0; i < checkboxs.length; i++) {
+            if (checkboxs[i].checked) {
+                if (resultController.length > 0) {
+                    resultController = resultController + "+";
+                }
+                resultController = resultController + checkboxs[i].value;
+            }
+        }
+        return resultController;
+    }
+</script>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/addresses/index.vm b/dubbo-admin/src/main/resources/templates/governance/screen/addresses/index.vm
new file mode 100644
index 0000000..e86d5ea
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/addresses/index.vm
@@ -0,0 +1,62 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+#if(! $addresses || $addresses.size() == 0)
+<font color="red">#springMessageText("not.found", "not.found")</font> (<a href="addresses?keyword=*">#springMessageText("show.all", "show.all") </a>)
+#elseif($keyword && $addresses.size() == 1)
+<script type="text/javascript">
+        #if($providerAddresses.contains($addresses.iterator().next()))
+        window.location.href = "addresses/$addresses.iterator().next()/providers";
+        #else
+        window.location.href = "addresses/$addresses.iterator().next()/consumers";
+        #end
+</script>
+#else
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th>#springMessageText("address", "address"):
+            <input type="text" onkeyup="searchTable('table_o', 0, this.value);"
+                   onclick="searchTable('table_o', 0, this.value);"/>&nbsp;<img
+                    src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/>
+        </th>
+        <th width="100">#springMessageText("role", "role"): <select onchange="searchTable('table_o', 1, this.value);"
+                                                   onclick="searchTable('table_o', 1, this.value);">
+            <option value="">#springMessageText("all", "all")</option>
+            <option value="#springMessageText("provider", "provider")">#springMessageText("provider", "provider")</option>
+            <option value="#springMessageText("consumer", "consumer")">#springMessageText("consumer", "consumer")</option>
+        </select></th>
+    </tr>
+    #foreach($address in $addresses)
+        <tr>
+            <td>
+                #if($providerAddresses.contains($address))
+                    <a href="addresses/$address/providers">$address</a>
+                #else
+                    <a href="addresses/$address/consumers">$address</a>
+                #end
+            </td>
+            <td>
+                #if($providerAddresses.contains($address))
+                    <font color="green">#springMessageText("provider", "provider")</font>
+                #end
+                #if($consumerAddresses.contains($address))
+                    <font color="blue">#springMessageText("consumer", "consumer")</font>
+                #end
+            </td>
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$addresses.size()#springMessageText("page.records", "page.records") </div>
+#end
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/addresses/search.vm b/dubbo-admin/src/main/resources/templates/governance/screen/addresses/search.vm
new file mode 100644
index 0000000..f7fddbb
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/addresses/search.vm
@@ -0,0 +1,19 @@
+##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.
+#set($layout = "/templates/governance/layout/search.vm")
+[#foreach($address in $addresses)
+    #if ($velocityCount > 1),#end
+"$address"
+#end]
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/applications/index.vm b/dubbo-admin/src/main/resources/templates/governance/screen/applications/index.vm
new file mode 100644
index 0000000..a75e364
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/applications/index.vm
@@ -0,0 +1,156 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+#if(! $applications || $applications.size() == 0)
+<font color="red">#springMessageText("not.found", "not.found")</font> (<a href="applications?keyword=*">#springMessageText("show.all", "show.all") </a>)
+#elseif($keyword && $applications.size() == 1)
+<script type="text/javascript">
+    window.location.href = "applications/$applications.iterator().next()/services";
+</script>
+#else
+<div class="ico_btn">
+    #if($currentUser.role != "G")
+        #if($service)
+            <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+                "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+                "please.select","please.select")'); } else { showConfirm('#springMessageText(
+                "confirm.batch.force.mock","confirm.batch.force.mock")', 'applications/0/shield?application=' + getChecked('ids'));} return false;"><img
+                    src="$rootContextPath.getURI("images/ico_disable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("batch.force.mock", "batch.force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+                "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+                "please.select","please.select")'); } else { showConfirm('#springMessageText(
+                "confirm.batch.fail.mock","confirm.batch.fail.mock")', 'applications/0/tolerant?application=' + getChecked('ids'));} return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("batch.fail.mock", "batch.fail.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+                "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+                "please.select","please.select")'); } else { showConfirm('#springMessageText(
+                "confirm.batch.cancel.mock","confirm.batch.cancel.mock")', 'applications/0/recover?application=' + getChecked('ids'));} return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("batch.cancel.mock", "batch.cancel.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.all.force.mock","confirm.all.force.mock")', 'applications/0/allshield'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("all.force.mock", "all.force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#"
+               onclick="showConfirm('#springMessageText("confirm.all.fail.mock", "confirm.all.fail.mock")', 'applications/0/alltolerant'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("all.fail.mock", "all.fail.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.all.cancel.mock","confirm.all.cancel.mock")', 'applications/0/allrecover'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("all.cancel.mock", "all.cancel.mock")</span></a>
+        #end
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th width="20"><input type="checkbox" onclick="checkAll('table_o', 'ids', this.checked)"/></th>
+        <th>#springMessageText("application", "application"):
+            <input type="text" onkeyup="searchTable('table_o', 1, this.value);"
+                   onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                    src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/>
+        </th>
+        <th width="110">#springMessageText("role", "role"): <select onchange="searchTable('table_o', 2, this.value);"
+                                                   onclick="searchTable('table_o', 2, this.value);">
+            <option value="">#springMessageText("all", "all")</option>
+            <option value="#springMessageText("provider", "provider")">#springMessageText("provider", "provider")</option>
+            <option value="#springMessageText("consumer", "consumer")">#springMessageText("consumer", "consumer")</option>
+        </select></th>
+        #if($service)
+            <th width="110">#springMessageText("mock", "mock"): <select onchange="searchTable('table_o', 3, this.value);"
+                                                       onclick="searchTable('table_o', 3, this.value);">
+                <option value="">#springMessageText("all", "all")</option>
+                <option value="#springMessageText("ok", "ok")">#springMessageText("ok", "ok")</option>
+                <option value="#springMessageText("force.mock", "force.mock")">#springMessageText("force.mock", "force.mock")</option>
+                <option value="#springMessageText("fail.mock", "fail.mock")">#springMessageText("fail.mock", "fail.mock")</option>
+            </select></th>
+            <th>#springMessageText("operation", "operation")</th>
+        #end
+    </tr>
+    #foreach($app in $applications)
+        <tr>
+            <td><input type="checkbox" name="ids" value="$app"/></td>
+            <td>#if($service)$app#else<a href="applications/$app/services">$app</a>#end</td>
+            <td>
+                #if($providerApplications.contains($app))
+                    <font color="green">#springMessageText("provider", "provider")</font>
+                #end
+                #if($consumerApplications.contains($app))
+                    <font color="blue">#springMessageText("consumer", "consumer")</font>
+                #end
+            </td>
+            #if($service)
+                <td>
+                    #if($consumerApplications.contains($app))
+                        #set($mock=$tool.getOverridesMock($overrides.get($app)))
+                        #if($mock == "force%3Areturn+null")
+                            <font color="red">#springMessageText("force.mocked", "force.mocked")</font>
+                        #elseif ($mock == "fail%3Areturn+null")
+                            <font color="blue">#springMessageText("fail.mocked", "fail.mocked")</font>
+                        #else
+                            <font color="gray">#springMessageText("no.mocked", "no.mocked")</font>
+                        #end
+                    #end
+                </td>
+                <td>
+                    #if($consumerApplications.contains($app))
+                        #set($mock=$tool.getOverridesMock($overrides.get($app)))
+                        #if($mock == "force%3Areturn+null")
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.cancel.mock","confirm.cancel.mock")', '$app -&gt; $service', 'applications/0/recover?application=$app'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+                            <span class="ico_line">|</span>
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.fail.mock","confirm.fail.mock")', '$app -&gt; $service', 'applications/0/tolerant?application=$app'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+                        #elseif ($mock == "fail%3Areturn+null")
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.force.mock","confirm.force.mock")', '$app -&gt; $service', 'applications/0/shield?application=$app'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_disable.png")" width="12"
+                                    height="12"/><span class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+                            <span class="ico_line">|</span>
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.cancel.mock","confirm.cancel.mock")', '$app -&gt; $service', 'applications/0/recover?application=$app'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+                        #else
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.force.mock","confirm.force.mock")', '$app -&gt; $service', 'applications/0/shield?application=$app'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_disable.png")" width="12"
+                                    height="12"/><span class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+                            <span class="ico_line">|</span>
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.fail.mock","confirm.fail.mock")', '$app -&gt; $service', 'applications/0/tolerant?application=$app'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+                        #end
+                    #end
+                </td>
+            #end
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$applications.size()#springMessageText("page.records", "page.records") </div>
+#end
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/applications/search.vm b/dubbo-admin/src/main/resources/templates/governance/screen/applications/search.vm
new file mode 100644
index 0000000..de0aeae
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/applications/search.vm
@@ -0,0 +1,19 @@
+##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.
+#set($layout = "/templates/governance/layout/search.vm")
+[#foreach($app in $applications)
+    #if ($velocityCount > 1),#end
+"$app"
+#end]
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/consumers/edit.vm b/dubbo-admin/src/main/resources/templates/governance/screen/consumers/edit.vm
new file mode 100644
index 0000000..f91cade
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/consumers/edit.vm
@@ -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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    <a href="../../consumers"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("back", "back")</span></a>
+    <span class="ico_line">|</span>
+    <a href="../$consumer.id"><img src="$rootContextPath.getURI("images/ico_show.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("show", "show")</span></a>
+    #set($mock=$tool.getConsumerMock($consumer))
+    #if($currentUser.hasServicePrivilege($consumer.service))
+        <span class="ico_line">|</span>
+        #if($mock.equals("force%3Areturn+null"))
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.cancel.mock","confirm.cancel.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/recover'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.fail.mock","confirm.fail.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/tolerant'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+        #elseif ($mock.equals("fail%3Areturn+null"))
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.force.mock","confirm.force.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/shield'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.cancel.mock","confirm.cancel.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/recover'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+        #else
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.force.mock","confirm.force.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/shield'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.fail.mock","confirm.fail.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/tolerant'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+        #end
+    #end
+    #if ($consumer.routes && $consumer.routes.size() > 0)
+        <span class="ico_line">|</span>
+        <a href="../$consumer.id/routed"><img src="$rootContextPath.getURI("images/ico_balance.png")" width="12"
+                                              height="12"/><span class="ico_font">#springMessageText("routed", "routed")
+            ($consumer.routes.size())</span></a>
+    #end
+    #if ($consumer.providers && $consumer.providers.size() > 0)
+        <span class="ico_line">|</span>
+        <a href="../$consumer.id/notified"><img src="$rootContextPath.getURI("images/ico_renotify.png")" width="12"
+                                                height="12"/><span class="ico_font">#springMessageText("notified", "notified")
+            ($consumer.providers.size())</span></a>
+    #end
+</div>
+<br/>
+<form id="consumerForm" action="../update" method="POST">
+    <table cellpadding="0" cellspacing="0" class="info">
+        <tr type = "hidden">
+            <td>
+                <input type="hidden" name="id" value="$consumer.id">
+            </td>
+        </tr>
+        #if(! $service)
+            <tr>
+                <th style="width: 100px;">#springMessageText("service", "service"):</th>
+                <td>$!consumer.service</td>
+            </tr>
+        #end
+        <tr>
+            <th style="width: 100px;">#springMessageText("ConsumerAddress", "ConsumerAddress"):</th>
+            <td>consumer://$!consumer.address/$!consumer.service?$!consumer.parameters</td>
+        </tr>
+        <tr>
+            <th>#springMessageText("overrides", "overrides"):</th>
+            <td><input type="text" name="parameters" value="$!consumer.override.params" class="setting_input"
+                       style="width: 400px;"/> <font color="blue">#springMessageText("dynamic.parameters.tip", "dynamic.parameters.tip")</font></td>
+        </tr>
+        <tr>
+            <th>#springMessageText("mock", "mock"):</th>
+            <td>
+                #if($mock.equals("force%3Areturn+null"))
+                    <font color="red">#springMessageText("force.mocked", "force.mocked")</font>
+                #elseif ($mock.equals("fail%3Areturn+null"))
+                    <font color="blue">#springMessageText("fail.mocked", "fail.mocked")</font>
+                #else
+                    <font color="gray">#springMessageText("no.mocked", "no.mocked")</font>
+                #end
+            </td>
+        </tr>
+        <tr>
+            <th>#springMessageText("status", "status"):</th>
+            <td>
+                #if($tool.isInBlackList($consumer))
+                    <font color="red">#springMessageText("Forbidden", "Forbidden")</font>
+                #else
+                    <font color="green">#springMessageText("Allowed", "Allowed")</font>
+                #end
+            </td>
+        </tr>
+        <tr>
+            <th>#springMessageText("Route", "Route"):</th>
+            <td>
+                #if($consumer.routes && $consumer.routes.size() > 0)
+                    <a href="../$consumer.id/routed">#springMessageText("routed", "routed")($consumer.routes.size())</a>
+                #else
+                    <font color="gray">#springMessageText("unrouted", "unrouted")</font>
+                #end
+            </td>
+        </tr>
+        <tr>
+            <th>#springMessageText("notify", "notify"):</th>
+            <td>
+                #if($consumer.providers && $consumer.providers.size() > 0)
+                    <a href="../$consumer.id/notified">#springMessageText("notified", "notified")($consumer.providers.size())</a>
+                #else
+                    <font color="red">#springMessageText("noProvider", "noProvider")</font>
+                #end
+            </td>
+        </tr>
+        <tr>
+            <th>
+                <div class="btn"><a href="#" onclick="document.getElementById('consumerForm').submit();">#springMessageText(
+                    "save","save")</a></div>
+            </th>
+            <td></td>
+        </tr>
+    </table>
+</form>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/consumers/index.vm b/dubbo-admin/src/main/resources/templates/governance/screen/consumers/index.vm
new file mode 100644
index 0000000..9965bb5
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/consumers/index.vm
@@ -0,0 +1,219 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    #if($currentUser.role != "G")
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.forbid","confirm.batch.forbid")', 'consumers/' + getChecked('ids') + '/forbid');} return false;"><img
+                src="$rootContextPath.getURI("images/ico_disable.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.forbid", "batch.forbid")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.allow","confirm.batch.allow")', 'consumers/' + getChecked('ids') + '/allow' );} return false;"><img
+                src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.allow", "batch.allow")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.only.forbid","confirm.only.forbid")',  'consumers/' + getChecked('ids') + '/onlyforbid');} return false;"><img
+                src="$rootContextPath.getURI("images/ico_disable.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("only.forbid", "only.forbid")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.only.allow","confirm.only.allow")',  'consumers/' + getChecked('ids') + '/onlyallow');} return false;"><img
+                src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("only.allow", "only.allow")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.force.mock", "confirm.batch.force.mock")', 'consumers/' + getChecked('ids') + '/shield');} return false;"><img
+                src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.force.mock", "batch.force.mock")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.fail.mock","confirm.batch.fail.mock")', 'consumers/' + getChecked('ids') + '/tolerant');} return false;"><img
+                src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.fail.mock", "batch.fail.mock")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.cancel.mock","confirm.batch.cancel.mock")', 'consumers/' + getChecked('ids') + '/recover');} return false;"><img
+                src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.cancel.mock", "batch.cancel.mock")</span></a>
+        #if($service)
+            <span class="ico_line">|</span>
+            <a href="#"
+               onclick="showConfirm('#springMessageText("confirm.all.force.mock", "confirm.all.force.mock")', 'consumers/0/allshield'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("all.force.mock", "all.force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.all.fail.mock","confirm.all.fail.mock")', 'consumers/0/alltolerant'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("all.fail.mock", "all.fail.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.all.cancel.mock","confirm.all.cancel.mock")', 'consumers/0/allrecover'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("all.cancel.mock", "all.cancel.mock")</span></a>
+        #end
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th width="20"><input type="checkbox" onclick="checkAll('table_o', 'ids', this.checked)"/></th>
+        <th>#if($address)#springMessageText("service", "service")#else#springMessageText("address", "address")#end: <input type="text" style="width: 60px;"
+                                                                                   onkeyup="searchTable('table_o', 1, this.value);"
+                                                                                   onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        <th>#springMessageText("application", "application"): <input type="text" style="width: 60px;"
+                                             onkeyup="searchTable('table_o', 2, this.value);"
+                                             onclick="searchTable('table_o', 2, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        <th width="110">#springMessageText("access", "access"): <select onchange="searchTable('table_o', 3, this.value);"
+                                                     onclick="searchTable('table_o', 3, this.value);">
+            <option value="">#springMessageText("all", "all")</option>
+            <option value="#springMessageText("Allowed", "Allowed")">#springMessageText("Allowed","Allowed")</option>
+            <option value="#springMessageText("Forbidden", "Forbidden")">#springMessageText("Forbidden","Forbidden")</option>
+        </select></th>
+        <th width="110">#springMessageText("mock", "mock"): <select onchange="searchTable('table_o', 4, this.value);"
+                                                   onclick="searchTable('table_o', 4, this.value);">
+            <option value="">#springMessageText("all", "all")</option>
+            <option value="#springMessageText("no.mocked", "no.mocked")">#springMessageText("no.mocked", "no.mocked")</option>
+            <option value="#springMessageText("force.mocked", "force.mocked")">#springMessageText("force.mocked", "force.mocked")</option>
+            <option value="#springMessageText("fail.mocked", "fail.mocked")">#springMessageText("fail.mocked", "fail.mocked")</option>
+        </select></th>
+        <th width="110">#springMessageText("Route", "Route"): <select onchange="searchTable('table_o', 5, this.value);"
+                                                    onclick="searchTable('table_o', 5, this.value);">
+            <option value="">#springMessageText("all", "all")</option>
+            <option value="#springMessageText("routed", "routed")">#springMessageText("routed", "routed")</option>
+            <option value="#springMessageText("unrouted", "unrouted")">#springMessageText("unrouted", "unrouted")</option>
+        </select></th>
+        <th width="110">#springMessageText("notify", "notify"): <select onchange="searchTable('table_o', 6, this.value);"
+                                                     onclick="searchTable('table_o', 6, this.value);">
+            <option value="">#springMessageText("all", "all")</option>
+            <option value="#springMessageText("notified", "notified")">#springMessageText("notified", "notified")</option>
+            <option value="#springMessageText("unnotified", "unnotified")">#springMessageText("unnotified", "unnotified")</option>
+        </select></th>
+        #if($currentUser.role != "G")
+            <th>#springMessageText("operation", "operation")</th>#end
+    </tr>
+    #foreach($consumer in $consumers)
+        <tr>
+            <td><input type="checkbox" name="ids" value="$consumer.id"/></td>
+            <td>
+                <a href="consumers/$consumer.id">#if($address)$tool.getSimpleName($consumer.service)#else$consumer.address#end</a>
+            </td>
+            <td>$consumer.application</td>
+            <td>
+                #if($tool.isInBlackList($consumer))
+                    <font color="red">#springMessageText("Forbidden","Forbidden")</font>
+                #else
+                    <font color="green">#springMessageText("Allowed","Allowed")</font>
+                #end
+            </td>
+            <td>
+                #set($mock=$tool.getConsumerMock($consumer))
+                #if($mock.equals("force%3Areturn+null"))
+                    <font color="red">#springMessageText("force.mocked", "force.mocked")</font>
+                #elseif ($mock.equals("fail%3Areturn+null"))
+                    <font color="blue">#springMessageText("fail.mocked", "fail.mocked")</font>
+                #else
+                    <font color="gray">#springMessageText("no.mocked", "no.mocked")</font>
+                #end
+            </td>
+            <td>
+                #if($consumer.routes && $consumer.routes.size() > 0)
+                    <a href="consumers/$consumer.id/routed">#springMessageText("routed", "routed")($consumer.routes.size())</a>
+                #else
+                    <font color="gray">#springMessageText("unrouted", "unrouted")</font>
+                #end
+            </td>
+            <td>
+                #if($consumer.providers && $consumer.providers.size() > 0)
+                    <a href="consumers/$consumer.id/notified">#springMessageText("notified", "notified")($consumer.providers.size())</a>
+                #else
+                    <font color="red">#springMessageText("noProvider", "noProvider")</font>
+                #end
+            </td>
+            #if($currentUser.role != "G")
+                <td>
+                    #if($currentUser.hasServicePrivilege($consumer.service))
+                        <a href="consumers/$consumer.id/edit"><img src="$rootContextPath.getURI("images/ico_edit.png")"
+                                                                   width="12" height="12"/><span
+                                class="ico_font">#springMessageText("edit", "edit")</span></a>
+                        <span class="ico_line">|</span>
+                        #if($tool.isInBlackList($consumer))
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.allow","confirm.allow")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', 'consumers/$consumer.id/allow'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("allow", "allow")</span></a>
+                        #else
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.forbid","confirm.forbid")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', 'consumers/$consumer.id/forbid'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_disable.png")" width="12"
+                                    height="12"/><span class="ico_font">#springMessageText("forbid", "forbid")</span></a>
+                        #end
+                        <span class="ico_line">|</span>
+                        #if($mock.equals("force%3Areturn+null"))
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.cancel.mock","confirm.cancel.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', 'consumers/$consumer.id/recover'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+                            <span class="ico_line">|</span>
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.fail.mock","confirm.fail.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', 'consumers/$consumer.id/tolerant'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+                        #elseif ($mock.equals("fail%3Areturn+null"))
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.force.mock","confirm.force.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', 'consumers/$consumer.id/shield'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+                            <span class="ico_line">|</span>
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.cancel.mock","confirm.cancel.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', 'consumers/$consumer.id/recover'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+                        #else
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.force.mock","confirm.force.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', 'consumers/$consumer.id/shield'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+                            <span class="ico_line">|</span>
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.fail.mock","confirm.fail.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', 'consumers/$consumer.id/tolerant'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+                        #end
+                    #end
+                </td>
+            #end
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$consumers.size()#springMessageText("page.records", "page.records") </div>
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/consumers/notified.vm b/dubbo-admin/src/main/resources/templates/governance/screen/consumers/notified.vm
new file mode 100644
index 0000000..f31d462
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/consumers/notified.vm
@@ -0,0 +1,133 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    <a href="../../consumers"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("back", "back")</span></a>
+    #set($mock=$tool.getConsumerMock($consumer))
+    #if($currentUser.hasServicePrivilege($consumer.service))
+        <span class="ico_line">|</span>
+        <a href="../$consumer.id/edit"><img src="$rootContextPath.getURI("images/ico_edit.png")" width="12"
+                                            height="12"/><span class="ico_font">#springMessageText("edit", "edit")</span></a>
+        <span class="ico_line">|</span>
+        #if($mock.equals("force%3Areturn+null"))
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.cancel.mock","confirm.cancel.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/recover'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.fail.mock","confirm.fail.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/tolerant'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+        #elseif ($mock.equals("fail%3Areturn+null"))
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.force.mock","confirm.force.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/shield'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.cancel.mock","confirm.cancel.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/recover'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+        #else
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.force.mock","confirm.force.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/shield'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.fail.mock","confirm.fail.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/tolerant'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+        #end
+    #end
+    #if ($consumer.routes && $consumer.routes.size() > 0)
+        <span class="ico_line">|</span>
+        <a href="../$consumer.id/routed"><img src="$rootContextPath.getURI("images/ico_balance.png")" width="12"
+                                              height="12"/><span class="ico_font">#springMessageText("routed", "routed")
+            ($consumer.routes.size())</span></a>
+    #end
+    <span class="ico_line">|</span>
+    <a href="../$consumer.id"><img src="$rootContextPath.getURI("images/ico_show.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("show", "show")</span></a>
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="info">
+    #if(! $service)
+        <tr>
+            <th style="width: 100px;">#springMessageText("service", "service"):</th>
+            <td>$!consumer.service</td>
+        </tr>
+    #end
+    <tr>
+        <th style="width: 100px;">#springMessageText("ConsumerAddress", "ConsumerAddress"):</th>
+        <td>consumer://$!consumer.address/$!consumer.service?$!consumer.parameters</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("overrides", "overrides"):</th>
+        <td>$!consumer.override.params</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("mock", "mock"):</th>
+        <td>
+            #if($mock.equals("force%3Areturn+null"))
+                <font color="red">#springMessageText("force.mocked", "force.mocked")</font>
+            #elseif ($mock.equals("fail%3Areturn+null"))
+                <font color="blue">#springMessageText("fail.mocked", "fail.mocked")</font>
+            #else
+                <font color="gray">#springMessageText("no.mocked", "no.mocked")</font>
+            #end
+        </td>
+    </tr>
+    <tr>
+        <th>#springMessageText("status", "status"):</th>
+        <td>
+            #if($tool.isInBlackList($consumer))
+                <font color="red">#springMessageText("Forbidden", "Forbidden")</font>
+            #else
+                <font color="green">#springMessageText("Allowed", "Allowed")</font>
+            #end
+        </td>
+    </tr>
+    <tr>
+        <th>#springMessageText("Route", "Route"):</th>
+        <td>
+            #if($consumer.routes && $consumer.routes.size() > 0)
+                <a href="../$consumer.id/routed">#springMessageText("routed", "routed")($consumer.routes.size())</a>
+            #else
+                <font color="gray">#springMessageText("unrouted", "unrouted")</font>
+            #end
+        </td>
+    </tr>
+    <tr>
+        <th>#springMessageText("notify", "notify"):</th>
+        <td></td>
+    </tr>
+</table>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th>#springMessageText("url", "url"): <input type="text" style="width: 100px;" onkeyup="searchTable('table_o', 0, this.value);"
+                                     onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+    </tr>
+    #foreach($provider in $providers)
+        <tr>
+            <td>$provider.url?$provider.parameters</td>
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$providers.size()#springMessageText("page.records", "page.records") </div>
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/consumers/routed.vm b/dubbo-admin/src/main/resources/templates/governance/screen/consumers/routed.vm
new file mode 100644
index 0000000..a6da47c
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/consumers/routed.vm
@@ -0,0 +1,139 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    <a href="../../consumers"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("back", "back")</span></a>
+    #set($mock=$tool.getConsumerMock($consumer))
+    #if($currentUser.hasServicePrivilege($consumer.service))
+        <span class="ico_line">|</span>
+        <a href="../$consumer.id/edit"><img src="$rootContextPath.getURI("images/ico_edit.png")" width="12"
+                                            height="12"/><span class="ico_font">#springMessageText("edit", "edit")</span></a>
+        <span class="ico_line">|</span>
+        #if($mock.equals("force%3Areturn+null"))
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.cancel.mock","confirm.cancel.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/recover'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.fail.mock","confirm.fail.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/tolerant'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+        #elseif ($mock.equals("fail%3Areturn+null"))
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.force.mock","confirm.force.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/shield'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.cancel.mock","confirm.cancel.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/recover'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+        #else
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.force.mock","confirm.force.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/shield'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.fail.mock","confirm.fail.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '../$consumer.id/tolerant'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+        #end
+    #end
+    <span class="ico_line">|</span>
+    <a href="../$consumer.id"><img src="$rootContextPath.getURI("images/ico_show.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("show", "show")</span></a>
+    #if ($consumer.providers && $consumer.providers.size() > 0)
+        <span class="ico_line">|</span>
+        <a href="../$consumer.id/notified"><img src="$rootContextPath.getURI("images/ico_renotify.png")" width="12"
+                                                height="12"/><span class="ico_font">#springMessageText("notified", "notified")
+            ($consumer.providers.size())</span></a>
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="info">
+    #if(! $service)
+        <tr>
+            <th style="width: 100px;">#springMessageText("service", "service"):</th>
+            <td>$!consumer.service</td>
+        </tr>
+    #end
+    <tr>
+        <th style="width: 100px;">#springMessageText("consumerAddress", "consumerAddress"):</th>
+        <td>consumer://$!consumer.address/$!consumer.service?$!consumer.parameters</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("overrides", "overrides"):</th>
+        <td>$!consumer.override.params</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("mock", "mock"):</th>
+        <td>
+            #if($mock.equals("force%3Areturn+null"))
+                <font color="red">#springMessageText("force.mocked", "force.mocked")</font>
+            #elseif ($mock.equals("fail%3Areturn+null"))
+                <font color="blue">#springMessageText("fail.mocked", "fail.mocked")</font>
+            #else
+                <font color="gray">#springMessageText("no.mocked", "no.mocked")</font>
+            #end
+        </td>
+    </tr>
+    <tr>
+        <th>#springMessageText("status", "status"):</th>
+        <td>
+            #if($tool.isInBlackList($consumer))
+                <font color="red">#springMessageText("Forbidden", "Forbidden")</font>
+            #else
+                <font color="green">#springMessageText("Allowed", "Allowed")</font>
+            #end
+        </td>
+    </tr>
+    <tr>
+        <th>#springMessageText("notify", "notify"):</th>
+        <td>
+            #if($consumer.providers && $consumer.providers.size() > 0)
+                <a href="../$consumer.id/notified">#springMessageText("notified", "notified")($consumer.providers.size())</a>
+            #else
+                <font color="red">#springMessageText("noProvider", "noProvider")</font>
+            #end
+        </td>
+    </tr>
+    <tr>
+        <th>#springMessageText("Route", "Route"):</th>
+        <td></td>
+    </tr>
+</table>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th>#springMessageText("routeName", "routeName"): <input type="text" style="width: 100px;"
+                                           onkeyup="searchTable('table_o', 0, this.value);"
+                                           onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        <th>#springMessageText("routeRule", "routeRule"): <input type="text" style="width: 100px;"
+                                           onkeyup="searchTable('table_o', 0, this.value);"
+                                           onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+    </tr>
+    #foreach($route in $routes)
+        <tr>
+            <td>$route.name</td>
+            <td>$route.matchRule => $route.filterRule</td>
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$providers.size()#springMessageText("page.records", "page.records") </div>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/consumers/show.vm b/dubbo-admin/src/main/resources/templates/governance/screen/consumers/show.vm
new file mode 100644
index 0000000..53dca52
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/consumers/show.vm
@@ -0,0 +1,139 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    <a href="../consumers"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("back", "back")</span></a>
+    #set($mock=$tool.getConsumerMock($consumer))
+    #if($currentUser.hasServicePrivilege($consumer.service))
+        <span class="ico_line">|</span>
+        <a href="$consumer.id/edit"><img src="$rootContextPath.getURI("images/ico_edit.png")" width="12"
+                                         height="12"/><span class="ico_font">#springMessageText("edit", "edit")</span></a>
+        <span class="ico_line">|</span>
+        #if($mock.equals("force%3Areturn+null"))
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.cancel.mock","confirm.cancel.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '$consumer.id/recover'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.fail.mock","confirm.fail.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '$consumer.id/tolerant'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+        #elseif ($mock.equals("fail%3Areturn+null"))
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.force.mock","confirm.force.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '$consumer.id/shield'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.cancel.mock","confirm.cancel.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '$consumer.id/recover'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+        #else
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.force.mock","confirm.force.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '$consumer.id/shield'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_cancel.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.fail.mock","confirm.fail.mock")', '$consumer.address -&gt; $tool.getSimpleName($consumer.service)', '$consumer.id/tolerant'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+        #end
+    #end
+    #if ($consumer.routes && $consumer.routes.size() > 0)
+        <span class="ico_line">|</span>
+        <a href="$consumer.id/routed"><img src="$rootContextPath.getURI("images/ico_balance.png")" width="12"
+                                           height="12"/><span class="ico_font">#springMessageText("routed", "routed")
+            ($consumer.routes.size())</span></a>
+    #end
+    #if ($consumer.providers && $consumer.providers.size() > 0)
+        <span class="ico_line">|</span>
+        <a href="$consumer.id/notified"><img src="$rootContextPath.getURI("images/ico_renotify.png")" width="12"
+                                             height="12"/><span class="ico_font">#springMessageText("notified", "notified")
+            ($consumer.providers.size())</span></a>
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="info" id="content">
+    #if(! $service)
+        <tr>
+            <th style="width: 100px;">#springMessageText("service", "service"):</th>
+            <td>$!consumer.service</td>
+        </tr>
+    #end
+    <tr>
+        <th style="width: 100px;">#springMessageText("consumerAddress", "consumerAddress"):</th>
+        <td>consumer://$!consumer.address/$!consumer.service?$!consumer.parameters</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("overrides", "overrides"):</th>
+        <td>$!consumer.override.params</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("host", "host"):</th>
+        <td>$tool.getHostPrefix($!consumer.address)$!consumer.address</td>
+    </tr>
+    #foreach($entry in $tool.toParameterMap($!consumer.parameters).entrySet())
+        <tr>
+            <th>#springMessageText($entry.key, $entry.key):</th>
+            <td>#if($entry.key == "timestamp") $tool.formatTimestamp($entry.value)
+                ($entry.value) #else $entry.value #end</td>
+        </tr>
+    #end
+    <tr>
+        <th>#springMessageText("mock", "mock"):</th>
+        <td>
+            #if($mock.equals("force%3Areturn+null"))
+                <font color="red">#springMessageText("force.mocked", "force.mocked")</font>
+            #elseif ($mock.equals("fail%3Areturn+null"))
+                <font color="blue">#springMessageText("fail.mocked", "fail.mocked")</font>
+            #else
+                <font color="gray">#springMessageText("no.mocked", "no.mocked")</font>
+            #end
+        </td>
+    </tr>
+    <tr>
+        <th>#springMessageText("status", "status"):</th>
+        <td>
+            #if($tool.isInBlackList($consumer))
+                <font color="red">#springMessageText("Forbidden", "Forbidden")</font>
+            #else
+                <font color="green">#springMessageText("Allowed", "Allowed")</font>
+            #end
+        </td>
+    </tr>
+    <tr>
+        <th>#springMessageText("Route", "Route"):</th>
+        <td>
+            #if($consumer.routes && $consumer.routes.size() > 0)
+                <a href="$consumer.id/routed">#springMessageText("routed", "routed")($consumer.routes.size())</a>
+            #else
+                <font color="gray">#springMessageText("unrouted", "unrouted")</font>
+            #end
+        </td>
+    </tr>
+    <tr>
+        <th>#springMessageText("notify", "notify"):</th>
+        <td>
+            #if($consumer.providers && $consumer.providers.size() > 0)
+                <a href="$consumer.id/notified">#springMessageText("notified", "notified")($consumer.providers.size())</a>
+            #else
+                <font color="red">#springMessageText("noProvider", "noProvider")</font>
+            #end
+        </td>
+    </tr>
+</table>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/error.vm b/dubbo-admin/src/main/resources/templates/governance/screen/error.vm
new file mode 100644
index 0000000..18b82ad
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/error.vm
@@ -0,0 +1,15 @@
+##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.
+ERROR
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/loadbalances/add.vm b/dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/add.vm
similarity index 51%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/loadbalances/add.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/add.vm
index 7f42126..d33caf2 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/loadbalances/add.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/add.vm
@@ -1,44 +1,59 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../loadbalances"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
-            class="ico_font">$i18n.get("back")</span></a>
+            class="ico_font">#springMessageText("back", "back")</span></a>
 </div>
 <br/>
-<form id="df" action="../loadbalances" method="POST" onsubmit="return check()">
+<form id="df" action="../loadbalances/create" method="POST" onsubmit="return check()">
     <table cellpadding="0" cellspacing="0" class="info">
         <tr>
-            <th style="width: 150px;">$i18n.get("service")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th style="width: 150px;">#springMessageText("service", "service")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>#if($service)
                 <input type="hidden" id="service" name="service" value="$service"/>$service
                 #if($input)
-                    <button onclick="window.location.href='../loadbalances/add'; return false;">$i18n.get(
-                        "Edit")</button>
+                    <button onclick="window.location.href='../loadbalances/add'; return false;">#springMessageText(
+                        "Edit","Edit")</button>
                 #end
             #else
                 <input type="text" id="service" name="service" value="$!route.serviceName" style="ime-mode:disabled"
                        maxlength="200"/>
                 #if ($serviceList && $serviceList.size() > 0)
                     <select onchange="if (this.value != '') { byId('service').value = this.value; this.value = ''; }">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($s in $serviceList)
                             <option value="$s">$tool.getSimpleName($s)</option>
                         #end
                     </select>
                 #end
-                <button onclick="if(byId('service').value == '') { showAlert('$i18n.get("PleaseInput")$i18n.get(
-                    "ServiceName")', 'service'); } else if(!checkService(byId('service').value)) { showAlert('Service name can not contain , only last * is allowed', 'service'); } else { window.location.href='../services/' + byId('service').value+'/loadbalances/add?input=true'; } return false;">$i18n.get(
-                    "getMethods")</button>
+                <button onclick="if(byId('service').value == '') { showAlert('#springMessageText("PleaseInput", "PleaseInput")#springMessageText(
+                    "ServiceName", "ServiceName")', 'service'); } else if(!checkService(byId('service').value)) { showAlert('Service name can not contain , only last * is allowed', 'service'); } else { window.location.href='../services/' + byId('service').value+'/loadbalances/add?input=true'; } return false;">#springMessageText(
+                    "getMethods","getMethods")</button>
                 <br>
-                <font color='blue'>$i18n.get("MultiServiceTip")</font>
+                <font color='blue'>#springMessageText("MultiServiceTip", "MultiServiceTip")</font>
             #end
             </td>
         </tr>
         <tr>
-            <th style="width: 150px;">$i18n.get("methodName")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th style="width: 150px;">#springMessageText("methodName", "methodName")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>
                 <input type="type" id="method" name="method" value="*" style="ime-mode:disabled" maxlength="200"/>
                 #if ($methods)
                     <select onchange="if (this.value != '') {byId('method').value = this.value; this.value = '';}">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($m in $methods)
                             <option value="$m">$m</option>
                         #end
@@ -48,22 +63,22 @@
             </td>
         </tr>
         <tr>
-            <th>$i18n.get("loadBalanceStrategy"):</th>
+            <th>#springMessageText("loadBalanceStrategy", "loadBalanceStrategy"):</th>
             <td>
                 <input type="text" id="strategy" name="strategy" style="ime-mode:disabled" maxlength="200" value=""/>
                 <select id="lbstrategy" name="lbstrategy"
                         onchange="if (this.value != '') { byId('strategy').value = this.value; this.value = ''; }">>
-                    <option value="">$i18n.get("Choose")</option>
-                    <option value="random">$i18n.get("random")</option>
-                    <option value="roundrobin">$i18n.get("roundrobin")</option>
-                    <option value="leastactive">$i18n.get("leastactive")</option>
+                    <option value="">#springMessageText("Choose", "Choose")</option>
+                    <option value="random">#springMessageText("random", "random")</option>
+                    <option value="roundrobin">#springMessageText("roundrobin", "roundrobin")</option>
+                    <option value="leastactive">#springMessageText("leastactive", "leastactive")</option>
                 </select>
             </td>
         </tr>
         <tr>
             <th>
-                <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}">$i18n.get(
-                    "save")</a></div>
+                <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}">#springMessageText(
+                    "save","save")</a></div>
             </th>
             <td></td>
         </tr>
@@ -91,12 +106,12 @@
     function check() {
         var method = byId('method').value.trim();
         if (method == '') {
-            showAlert("$i18n.get("PleaseInput")$i18n.get("methodName")", 'method');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput")#springMessageText("methodName", "methodName")", 'method');
             return false;
         }
         var strategy = byId('strategy').value.trim();
         if (strategy == '') {
-            showAlert("$i18n.get("PleaseInput")$i18n.get("loadBalanceStrategy")", 'strategy');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput")#springMessageText("loadBalanceStrategy", "loadBalanceStrategy")", 'strategy');
             return false;
         }
         return true;
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/edit.vm b/dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/edit.vm
new file mode 100644
index 0000000..f1305d7
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/edit.vm
@@ -0,0 +1,103 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    <a href="../../loadbalances"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("back", "back")</span></a>
+    <span class="ico_line">|</span>
+    <a href="../$loadbalance.id"><img src="$rootContextPath.getURI("images/ico_show.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("show", "show")</span></a>
+</div>
+<br/>
+<form id="df" action="../update" method="POST" onsubmit="return check();">
+    <table cellpadding="0" cellspacing="0" class="info">
+        <tr type = "hidden">
+            <td>
+                <input type="hidden" name="id" value="$loadbalance.id">
+            </td>
+        </tr>
+        <tr>
+            <th style="width: 100px;">#springMessageText("service", "service")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <td>
+                $loadbalance.service
+            </td>
+        </tr>
+        <tr>
+            <th style="width: 100px;">#springMessageText("methodName", "methodName")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <td>
+                $loadbalance.method
+            </td>
+        </tr>
+        <tr>
+            <th>#springMessageText("loadBalanceStrategy", "loadBalanceStrategy"):</th>
+            <td>
+                <input type="hidden" id="service" name="service" style="ime-mode:disabled" maxlength="200"
+                       value="$loadbalance.service"/>
+                <input type="hidden" id="method" name="method" style="ime-mode:disabled" maxlength="200"
+                       value="$loadbalance.method"/>
+                <input type="text" id="strategy" name="strategy" style="ime-mode:disabled" maxlength="200"
+                       value="$loadbalance.strategy"/>
+                <select id="lbstrategy" name="lbstrategy"
+                        onchange="if (this.value != '') { byId('strategy').value = this.value; this.value = ''; }">>
+                    <option value="">#springMessageText("Choose", "Choose")</option>
+                    <option value="random">#springMessageText("random", "random")</option>
+                    <option value="roundrobin">#springMessageText("roundrobin", "roundrobin")</option>
+                    <option value="leastactive">#springMessageText("leastactive", "leastactive")</option>
+                </select>
+            </td>
+        </tr>
+        <tr>
+            <th>
+                <div class="btn"><a href="#" onclick="if(check){document.getElementById('df').submit();}">#springMessageText(
+                    "save","save")</a></div>
+            </th>
+            <td></td>
+        </tr>
+    </table>
+</form>
+
+<script language="javascript">
+    function checkService(service) {
+        //if(service.indexOf(',') != -1) return false;
+
+        var interfaceName = service;
+
+        var gi = service.indexOf('/');
+        if (gi != -1) interfaceName = interfaceName.substring(gi + 1);
+        var vi = interfaceName.indexOf(':');
+        if (vi != -1) interfaceName = interfaceName.substring(0, vi);
+
+        if (interfaceName.indexOf('*') != -1 && interfaceName.indexOf('*') != interfaceName.length - 1) {
+            return false;
+        }
+
+        return true;
+    }
+
+    function check() {
+        var method = byId('method').value.trim();
+        if (method == '') {
+            showAlert("#springMessageText("PleaseInput", "PleaseInput")#springMessageText("methodName", "methodName")", 'method');
+            return false;
+        }
+        var strategy = byId('strategy').value.trim();
+        if (strategy == '') {
+            showAlert("#springMessageText("PleaseInput", "PleaseInput")#springMessageText("loadBalanceStrategy", "loadBalanceStrategy")", 'strategy');
+            return false;
+        }
+        return true;
+    }
+
+</script>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/index.vm b/dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/index.vm
new file mode 100644
index 0000000..288d951
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/index.vm
@@ -0,0 +1,82 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    #if($currentUser.role != "G")
+        <a href="loadbalances/add"><img src="$rootContextPath.getURI("images/ico_add.png")" width="9" height="9"/><span
+                class="ico_font">#springMessageText("add", "add")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.delete","confirm.batch.delete")', 'loadbalances/' + getChecked('ids') + '/delete'); } return false;"><img
+                src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.delete", "batch.delete")</span></a>
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th width="20"><input type="checkbox" onclick="checkAll('table_o', 'ids', this.checked)"/></th>
+        <th>#springMessageText("service.method", "service.method"): <input type="text" onkeyup="searchTable('table_o', 1, this.value);"
+                                                onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        #if(! $service)
+            <th>#springMessageText("service", "service"): <input type="text" onkeyup="searchTable('table_o', 2, this.value);"
+                                             onclick="searchTable('table_o', 2, this.value);"/>&nbsp;<img
+                    src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+            <th width="190">#springMessageText("loadBalanceStrategy", "loadBalanceStrategy"): <select onchange="searchTable('table_o', 3, this.value);"
+                                                                      onclick="searchTable('table_o', 3, this.value);">
+                <option value="">#springMessageText("all", "all")</option>
+                <option value="#springMessageText("random", "random")">#springMessageText("random", "random")</option>
+                <option value="#springMessageText("roundrobin", "roundrobin")">#springMessageText("roundrobin", "roundrobin")</option>
+                <option value="#springMessageText("leastactive", "leastactive")">#springMessageText("leastactive", "leastactive")</option>
+            </select></th>
+        #else
+            <th width="190">#springMessageText("loadBalanceStrategy", "loadBalanceStrategy"): <select onchange="searchTable('table_o', 2, this.value);"
+                                                                      onclick="searchTable('table_o', 2, this.value);">
+                <option value="">#springMessageText("all", "all")</option>
+                <option value="#springMessageText("random", "random")">#springMessageText("random", "random")</option>
+                <option value="#springMessageText("roundrobin", "roundrobin")">#springMessageText("roundrobin", "roundrobin")</option>
+                <option value="#springMessageText("leastactive", "leastactive")">#springMessageText("leastactive", "leastactive")</option>
+            </select></th>
+        #end
+        #if($currentUser.role != "G")
+            <th width="130">#springMessageText("operation", "operation")</th>#end
+    </tr>
+    #foreach($loadbalance in $loadbalances)
+        <tr>
+            <td><input type="checkbox" name="ids" value="$loadbalance.id"/></td>
+            <td>$loadbalance.method</td>
+            #if(! $service)
+                <td><a href="services/$loadbalance.service/loadbalances">$loadbalance.service</a></td>
+            #end
+            <td>#springMessageText($loadbalance.strategy,$loadbalance.strategy)</td>
+            #if($currentUser.role != "G")
+                <td>
+                    <a href="loadbalances/$loadbalance.id/edit"><img
+                            src="$rootContextPath.getURI("images/ico_edit.png")" width="12" height="12"/><span
+                            class="ico_font">#springMessageText("edit", "edit")</span></a>
+                    <span class="ico_line">|</span>
+                    <a href="#" onclick="showConfirm('#springMessageText(
+                        "confirm.delete","confirm.delete")', '$loadbalance.service', 'loadbalances/$loadbalance.id/delete'); return false;">
+                        <img src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/>
+                        <span class="ico_font">#springMessageText("delete", "delete")</span></a>
+                </td>
+            #end
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$loadbalances.size()#springMessageText("page.records", "page.records") </div>
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/show.vm b/dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/show.vm
new file mode 100644
index 0000000..4b2cdb3
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/loadbalances/show.vm
@@ -0,0 +1,45 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    <a href="../loadbalances"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("back", "back")</span></a>
+    <span class="ico_line">|</span>
+    <a href="$loadbalance.id/edit"><img src="$rootContextPath.getURI("images/ico_edit.png")" width="12"
+                                        height="12"/><span class="ico_font">#springMessageText("edit", "edit")</span></a>
+</div>
+<br/>
+<form id="df" action="../$loadbalance.id" method="POST">
+    <table cellpadding="0" cellspacing="0" class="info">
+        <tr>
+            <th style="width: 100px;">#springMessageText("service", "service")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <td>
+                $service
+            </td>
+        </tr>
+        <tr>
+            <th style="width: 100px;">#springMessageText("methodName", "methodName")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <td>
+                $loadbalance.method
+            </td>
+        </tr>
+        <tr>
+            <th>#springMessageText("loadBalanceStrategy", "loadBalanceStrategy"):</th>
+            <td>
+                $loadbalance.strategy
+            </td>
+        </tr>
+    </table>
+</form>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/noServicePrivilege.vm b/dubbo-admin/src/main/resources/templates/governance/screen/noServicePrivilege.vm
similarity index 58%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/noServicePrivilege.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/noServicePrivilege.vm
index 4594dbf..40f781d 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/noServicePrivilege.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/noServicePrivilege.vm
@@ -1,3 +1,18 @@
+##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.
+#set($layout = "/templates/governance/layout/noServicePrivilege.vm")
 <div id="alertBox" style="display: none; position: absolute; left: 200px; top: 200px; width: 720px; height: 300px;">
     <table style="background-image: url('#if($success)$rootContextPath.getURI(
         "images/tip_succeed.png")#else$rootContextPath.getURI("images/tip_del.png")#end');" width="720" height="300">
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/overrides/add.vm b/dubbo-admin/src/main/resources/templates/governance/screen/overrides/add.vm
similarity index 56%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/overrides/add.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/overrides/add.vm
index b51c5ad..0398a3e 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/overrides/add.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/overrides/add.vm
@@ -1,6 +1,21 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../overrides"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
-            class="ico_font">$i18n.get("back")</span></a>
+            class="ico_font">#springMessageText("back", "back")</span></a>
 </div>
 <br/>
 <form id="df" action="../overrides/create" method="POST">
@@ -8,11 +23,11 @@
     <table cellpadding="0" cellspacing="0" class="info" id="table1">
         #if(! $service)
             <tr>
-                <td style="width: 100px;"><b>$i18n.get("service"):</b></td>
+                <td style="width: 100px;"><b>#springMessageText("service", "service"):</b></td>
                 <td style="width: 300px;"><input id="service" type="text" name="service" class="setting_input"
                                                  style="width: 200px;"/>
                     <select onchange="fnSetService(this)">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach($s in $serviceList)
                             <option value="$s">$tool.getSimpleName($s)</option>
                         #end
@@ -20,81 +35,81 @@
                 </td>
             </tr>
         #else
-            <td><b>$i18n.get("service"):</b></td>
+            <td><b>#springMessageText("service", "service"):</b></td>
             <td
             ">$service<input id="service" type="hidden" name="service" class="setting_input" style="width: 200px;"
                              value="$service"/>
         #end
         <tr>
-            <td><b>$i18n.get("ConsumerApplication"):</b></td>
-            #if($application)
-                <td>$application</td>
+            <td><b>#springMessageText("ConsumerApplication", "ConsumerApplication"):</b></td>
+            #if($app)
+                <td>$app</td>
             #else
                 <td><input type="text" id="application" name="application" class="setting_input" style="width: 300px;"
                            value="" maxlength="200"/></td>
             #end
         </tr>
         <tr>
-            <td><b>$i18n.get("overrideConsumerAddress"):</b></td>
+            <td><b>#springMessageText("overrideConsumerAddress", "overrideConsumerAddress"):</b></td>
             <td><input type="text" id="address" name="address" class="setting_input" style="width: 300px;" value=""
-                       maxlength="200"/> <font color="blue">$i18n.get("tipConsumerAddress")</font></td>
+                       maxlength="200"/> <font color="blue">#springMessageText("tipConsumerAddress", "tipConsumerAddress")</font></td>
         </tr>
         <tr>
-            <td><b>$i18n.get("status"): <b></td>
+            <td><b>#springMessageText("status", "status"): <b></td>
             <td>
                 <select name="enabled">
-                    <option value="true">$i18n.get("enable")</option>
-                    <option value="false" selected="selected">$i18n.get("disable")</option>
+                    <option value="true">#springMessageText("enable", "enable")</option>
+                    <option value="false" selected="selected">#springMessageText("disable", "disable")</option>
                 </select>
             </td>
         </tr>
     </table>
     <hr>
-    <b>$i18n.get("override.config")</b>
+    <b>#springMessageText("override.config", "override.config")</b>
     <br>
     <table cellpadding="0" cellspacing="0" class="info" id="paramTable">
         <tr>
-            <td style="width: 150px;"><b>$i18n.get("parameter.key"): </b><input name='overrideKey0' id='overrideKey0'
+            <td style="width: 150px;"><b>#springMessageText("parameter.key", "parameter.key"): </b><input name='overrideKey0' id='overrideKey0'
                                                                                 type='text' style='width: 100px;'/></td>
-            <td><b>$i18n.get("parameter.value"): </b><input type="text" id="overrideValue0" name="overrideValue0"
+            <td><b>#springMessageText("parameter.value", "parameter.value"): </b><input type="text" id="overrideValue0" name="overrideValue0"
                                                             class="setting_input" style="width: 300px;" value=""
-                                                            maxlength="200"/> <font color="blue">$i18n.get(
-                "parameter.tip")</font></td>
+                                                            maxlength="200"/> <font color="blue">#springMessageText(
+                "parameter.tip","parameter.tip")</font></td>
         </tr>
     </table>
     <br>
     <div class="btn">
-        <a href="#" onclick="paramTableAddRow(); return false;"><b>$i18n.get("add")$i18n.get("parameter")</b></a>
+        <a href="#" onclick="paramTableAddRow(); return false;"><b>#springMessageText("add", "add")#springMessageText("parameter", "parameter")</b></a>
     </div>
 
     <br>
     <br>
     <hr>
 
-    <b>$i18n.get("override.mock")</b>
+    <b>#springMessageText("override.mock", "override.mock")</b>
     <br>
     <table cellpadding="0" cellspacing="0" class="info" id="mockTable">
         <tr>
-            <td style="width: 230px;"><b>$i18n.get("mock.all.method"):</b>
+            <td style="width: 230px;"><b>#springMessageText("mock.all.method", "mock.all.method"):</b>
             </th>
             <td><select type="text" id="mockDefaultMethodForce" name="mockDefaultMethodForce">
-                <option value='fail'>$i18n.get("fail.mock")</option>
-                <option value='force'>$i18n.get("force.mock")</option>
+                <option value='fail'>#springMessageText("fail.mock", "fail.mock")</option>
+                <option value='force'>#springMessageText("force.mock", "force.mock")</option>
             </select></td>
             <td><input type="text" id="mockDefaultMethodJson" name="mockDefaultMethodJson" class="setting_input"
-                       style="width: 300px;" value="" maxlength="200"/> <font color="blue">$i18n.get("mock.tip")</font>
+                       style="width: 300px;" value="" maxlength="200"/> <font color="blue">#springMessageText("mock.tip", "mock.tip")</font>
             </td>
         </tr>
     </table>
     <br/>
     <div class="btn">
-        <a href="#" onclick="mockTableAddRow(); return false;"><b>$i18n.get("add")$i18n.get("mock.method")</b></a>
+        <a href="#" onclick="mockTableAddRow(); return false;"><b>#springMessageText("add", "add")#springMessageText("mock.method", "mock.method")</b></a>
     </div>
     <br/>
     <hr>
     <br/>
     <div class="btn">
-        <a href="#" onclick="if(check()){byId('df').submit();}"><b>$i18n.get("save")</b></a>
+        <a href="#" onclick="if(check()){byId('df').submit();}"><b>#springMessageText("save", "save")</b></a>
     </div>
 </form>
 
@@ -108,7 +123,7 @@
     function check() {
         var service = byId('service').value.trim();
         if (service == '') {
-            showAlert("$i18n.get("PleaseInput", $i18n.get("service"))", 'service');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput") #springMessageText("service", "service")", 'service');
             return false;
         }
 
@@ -118,7 +133,7 @@
         var address = byId('address').value.trim();
         if (address != "") {
             if (!address.match(exp) && !address.match(exp2)) {
-                showAlert("$i18n.get("InvalidIp")", 'address');
+                showAlert("#springMessageText("InvalidIp", "InvalidIp")", 'address');
                 return false;
             }
         }
@@ -149,13 +164,13 @@
         var newNameTH = document.createElement('th');
 
         var newNameTD = newTR.insertCell(0);
-        newNameTD.innerHTML = "<b>$i18n.get(
-                    "parameter.key"): </b><input name='overrideKey" + paramTRLastIndex + "' id='overrideKey" + paramTRLastIndex + "' type='text' style='width: 100px;' />";
+        newNameTD.innerHTML = "<b>#springMessageText(
+                    "parameter.key","parameter.key"): </b><input name='overrideKey" + paramTRLastIndex + "' id='overrideKey" + paramTRLastIndex + "' type='text' style='width: 100px;' />";
         var newMockTD = newTR.insertCell(1);
-        newMockTD.innerHTML = "<b>$i18n.get(
-                    "parameter.value"): </b><input type='text' id='overrideValue" + paramTRLastIndex + "' name='overrideValue" + paramTRLastIndex + "' class='setting_input' style='width: 300px;' value='' maxlength='200'/>"
-                + "&nbsp;<a href='javascript:;' onclick=\"tableDeleteRow('paramTable', 'paramTable" + paramTRLastIndex + "'); return false;\">$i18n.get(
-                    "delete")</a>";
+        newMockTD.innerHTML = "<b>#springMessageText(
+                    "parameter.value","parameter.value"): </b><input type='text' id='overrideValue" + paramTRLastIndex + "' name='overrideValue" + paramTRLastIndex + "' class='setting_input' style='width: 300px;' value='' maxlength='200'/>"
+                + "&nbsp;<a href='javascript:;' onclick=\"tableDeleteRow('paramTable', 'paramTable" + paramTRLastIndex + "'); return false;\">#springMessageText(
+                    "delete","delete")</a>";
 
         paramTRLastIndex++; //将行号推进下一行
     }
@@ -170,16 +185,16 @@
         var newNameTH = document.createElement('th');
 
         var newNameTD = newTR.insertCell(0);
-        newNameTD.innerHTML = "<b>$i18n.get(
-                    "mock.method"):</b><input name='mockMethodName" + mockTRLastIndex + "' id='mockMethodName" + mockTRLastIndex + "' type='text' style='width: 100px;' /><b>$i18n.get(
-                    "mock.value"):</b>";
+        newNameTD.innerHTML = "<b>#springMessageText(
+                    "mock.method","mock.method"):</b><input name='mockMethodName" + mockTRLastIndex + "' id='mockMethodName" + mockTRLastIndex + "' type='text' style='width: 100px;' /><b>#springMessageText(
+                    "mock.value","mock.value"):</b>";
         var newNameTD = newTR.insertCell(1);
-        newNameTD.innerHTML = "<select name='mockMethodForce" + mockTRLastIndex + "' id='mockMethodForce" + mockTRLastIndex + "'><option value='fail'>$i18n.get(
-                    "fail.mock")</option><option value='force'>$i18n.get("force.mock")</option></select>";
+        newNameTD.innerHTML = "<select name='mockMethodForce" + mockTRLastIndex + "' id='mockMethodForce" + mockTRLastIndex + "'><option value='fail'>#springMessageText(
+                    "fail.mock","fail.mock")</option><option value='force'>#springMessageText("force.mock", "force.mock")</option></select>";
         var newMockTD = newTR.insertCell(2);
         newMockTD.innerHTML = "<input name='mockMethodJson" + mockTRLastIndex + "' id='mockMethodJson" + mockTRLastIndex + "' type='text' value='return empty' style='width: 300px;' />"
-                + "&nbsp;<a href='javascript:;' onclick=\"tableDeleteRow('mockTable', 'mockTable" + mockTRLastIndex + "'); return false;\">$i18n.get(
-                    "delete")</a>";
+                + "&nbsp;<a href='javascript:;' onclick=\"tableDeleteRow('mockTable', 'mockTable" + mockTRLastIndex + "'); return false;\">#springMessageText(
+                    "delete","delete")</a>";
 
         mockTRLastIndex++; //将行号推进下一行
     }
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/overrides/edit.vm b/dubbo-admin/src/main/resources/templates/governance/screen/overrides/edit.vm
similarity index 56%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/overrides/edit.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/overrides/edit.vm
index 2093e2b..4fe7e29 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/overrides/edit.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/overrides/edit.vm
@@ -1,76 +1,97 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../../overrides"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
-            class="ico_font">$i18n.get("back")</span></a>
+            class="ico_font">#springMessageText("back", "back")</span></a>
     <span class="ico_line">|</span>
     <a href="../$override.id">
         <img src="$rootContextPath.getURI("images/ico_show.png")" width="13" height="13"/>
-        <span class="ico_font">$i18n.get("show")</span></a>
+        <span class="ico_font">#springMessageText("show", "show")</span></a>
     <span class="ico_line">|</span>
-    <a href="#" onclick="showConfirm('$i18n.get("confirm.delete")', '$override.id', 'delete'); return false;">
+    <a href="#" onclick="showConfirm('#springMessageText("confirm.delete", "confirm.delete")', '$override.id', 'delete'); return false;">
         <img src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/>
-        <span class="ico_font">$i18n.get("delete")</span></a>
+        <span class="ico_font">#springMessageText("delete", "delete")</span></a>
 </div>
 <br/>
-<form id="df" action="../$override.id" method="POST">
+<form id="df" action="../update" method="POST">
     <table cellpadding="0" cellspacing="0" class="info" id="dynamicTable">
+
+        <tr type = "hidden">
+            <td>
+                <input type="hidden" name="id" value="$override.id">
+            </td>
+        </tr>
         <tr>
-            <td style="width: 100px;"><b>$i18n.get("service"):</b></td>
+            <td style="width: 100px;"><b>#springMessageText("service", "service"):</b></td>
             <td style="width: 300px;">$override.service <input type="hidden" id="service" name="service"
                                                                value="$override.service" style="ime-mode:disabled"
                                                                maxlength="200"/></td>
         </tr>
         <tr>
-            <td><b>$i18n.get("status"): <b></td>
+            <td><b>#springMessageText("status", "status"): <b></td>
             <td>
                 #if($override.enabled)
-				$i18n.get("enable")
+				#springMessageText("enable", "enable")
 			#else
-                    $i18n.get("disable")
+                    #springMessageText("disable", "disable")
                 #end
             </td>
         </tr>
         <tr>
-            <td style="width: 100px;"><b>$i18n.get("ConsumerApplication"):</b></td>
+            <td style="width: 100px;"><b>#springMessageText("ConsumerApplication", "ConsumerApplication"):</b></td>
             <td>$!override.application<input type="hidden" id="application" name="application"
                                              value="$override.application" style="ime-mode:disabled" maxlength="200"/>
             </td>
         </tr>
         <tr>
-            <td style="width: 100px;"><b>$i18n.get("overrideConsumerAddress"):</b></td>
+            <td style="width: 100px;"><b>#springMessageText("overrideConsumerAddress", "overrideConsumerAddress"):</b></td>
             <td>$!override.address<input type="hidden" id="address" name="address" value="$override.address"
-                                         style="ime-mode:disabled" maxlength="200"/> <font color="blue">$i18n.get(
-                "tipConsumerAddress")</font></td>
+                                         style="ime-mode:disabled" maxlength="200"/> <font color="blue">#springMessageText(
+                "tipConsumerAddress","tipConsumerAddress")</font></td>
         </tr>
     </table>
     <br>
 
     <hr>
-    <b>$i18n.get("override.config")</b>
+    <b>#springMessageText("override.config", "override.config")</b>
     <br>
     <table cellpadding="0" cellspacing="0" class="info" id="paramTable">
         #if($parameters.empty())
             <tr>
-                <td style="width: 150px;"><b>$i18n.get("parameter.key"): </b><input name='overrideKey0'
+                <td style="width: 150px;"><b>#springMessageText("parameter.key", "parameter.key"): </b><input name='overrideKey0'
                                                                                     id='overrideKey0' type='text'
                                                                                     style='width: 100px;'/></td>
-                <td><b>$i18n.get("parameter.value"): </b><input type="text" id="overrideValue0" name="overrideValue0"
+                <td><b>#springMessageText("parameter.value", "parameter.value"): </b><input type="text" id="overrideValue0" name="overrideValue0"
                                                                 class="setting_input" style="width: 300px;" value=""
-                                                                maxlength="200"/> <font color="blue">$i18n.get(
-                    "parameter.tip")</font></td>
+                                                                maxlength="200"/> <font color="blue">#springMessageText(
+                    "parameter.tip","parameter.tip")</font></td>
             </tr>
         #else
             #foreach($p in $parameters.entrySet())
                 <tr id="paramTable.old.$velocityCount">
-                    <td style="width: 150px;"><b>$i18n.get("parameter.key"): </b><input
+                    <td style="width: 150px;"><b>#springMessageText("parameter.key", "parameter.key"): </b><input
                             name='overrideKey.old.$velocityCount' id='overrideKey.old.$velocityCount' type='text'
                             style='width: 100px;' value='$p.key'/></td>
-                    <td><b>$i18n.get("parameter.value"): </b><input type="text" id="overrideValue.old.$velocityCount"
+                    <td><b>#springMessageText("parameter.value", "parameter.value"): </b><input type="text" id="overrideValue.old.$velocityCount"
                                                                     name="overrideValue.old.$velocityCount"
                                                                     class="setting_input" style="width: 300px;"
                                                                     value="$p.value" maxlength="200"/>
                         &nbsp;<a href='javascript:;'
-                                 onclick="tableDeleteRow('paramTable', 'paramTable.old.$velocityCount'); return false;">$i18n.get(
-                            "delete")</a>
+                                 onclick="tableDeleteRow('paramTable', 'paramTable.old.$velocityCount'); return false;">#springMessageText(
+                            "delete","delete")</a>
                     </td>
                 </tr>
             #end
@@ -78,35 +99,35 @@
     </table>
     <br>
     <div class="btn">
-        <a href="#" onclick="paramTableAddRow(); return false;"><b>$i18n.get("add")$i18n.get("parameter")</b></a>
+        <a href="#" onclick="paramTableAddRow(); return false;"><b>#springMessageText("add", "add")#springMessageText("parameter", "parameter")</b></a>
     </div>
 
     <br>
     <br>
     <hr>
 
-    <b>$i18n.get("override.mock")</b>
+    <b>#springMessageText("override.mock", "override.mock")</b>
     <br>
     <table cellpadding="0" cellspacing="0" class="info" id="mockTable">
         <tr>
-            <td style="width: 230px;"><b>$i18n.get("mock.all.method"):</b>
+            <td style="width: 230px;"><b>#springMessageText("mock.all.method", "mock.all.method"):</b>
             </th>
             <td><select type="text" id="mockDefaultMethodForce" name="mockDefaultMethodForce">
-                <option value='fail'>$i18n.get("fail.mock")</option>
-                <option value='force'>$i18n.get("force.mock")</option>
+                <option value='fail'>#springMessageText("fail.mock", "fail.mock")</option>
+                <option value='force'>#springMessageText("force.mock", "force.mock")</option>
             </select></td>
             <td><input type="text" id="mockDefaultMethodJson" name="mockDefaultMethodJson" class="setting_input"
                        style="width: 300px;" value="$!mockDefaultMethodJson" maxlength="200"/> <font
-                    color="blue">$i18n.get("mock.tip")</font></td>
+                    color="blue">#springMessageText("mock.tip", "mock.tip")</font></td>
         </tr>
         #foreach($m in $methodJsons.entrySet())
-            <td><b>$i18n.get("mock.method")<font color="orange"><code>${m.key}</code></font>$i18n.get("mock.value"):</b>
+            <td><b>#springMessageText("mock.method", "mock.method")<font color="orange"><code>${m.key}</code></font>#springMessageText("mock.value", "mock.value"):</b>
             </td>
             <td><select type="text" id="mockMethodForce.$m.key" name="mockMethodForce.$m.key">
-                <option value='fail'#if($methodForces.get($m.key) != "force") selected='selected'#end>$i18n.get(
-                    "fail.mock")</option>
-                <option value='force'#if($methodForces.get($m.key) == "force") selected='selected'#end>$i18n.get(
-                    "force.mock")</option>
+                <option value='fail'#if($methodForces.get($m.key) != "force") selected='selected'#end>#springMessageText(
+                    "fail.mock","fail.mock")</option>
+                <option value='force'#if($methodForces.get($m.key) == "force") selected='selected'#end>#springMessageText(
+                    "force.mock","force.mock")</option>
             </select></td>
             <td><input type="text" id="mockMethod.$m.key" name="mockMethod.$m.key" class="setting_input"
                        style="width: 300px;" value="$!m.value" maxlength="200"/></td>
@@ -115,7 +136,7 @@
     </table>
     <br/>
     <div class="btn">
-        <a href="#" onclick="mockTableAddRow(); return false;"><b>$i18n.get("add")$i18n.get("mock.method")</b></a>
+        <a href="#" onclick="mockTableAddRow(); return false;"><b>#springMessageText("add", "add")#springMessageText("mock.method", "mock.method")</b></a>
     </div>
     <br/>
     <hr>
@@ -123,8 +144,8 @@
 
 
     <div class="btn">
-        <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}"><b>$i18n.get(
-            "save")</b></a>
+        <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}"><b>#springMessageText(
+            "save","save")</b></a>
         </div>
 </form>
 
@@ -139,7 +160,7 @@
     function check() {
         var service = byId('service').value.trim();
         if (service == '') {
-            showAlert("$i18n.get("PleaseInput", $i18n.get("service"))", 'service');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput"), #springMessageText("service", "service"))", 'service');
             return false;
         }
         return true;
@@ -168,13 +189,13 @@
         var newNameTH = document.createElement('th');
 
         var newNameTD = newTR.insertCell(0);
-        newNameTD.innerHTML = "<b>$i18n.get(
-                    "parameter.key"): </b><input name='overrideKey" + paramTRLastIndex + "' id='overrideKey" + paramTRLastIndex + "' type='text' style='width: 100px;' />";
+        newNameTD.innerHTML = "<b>#springMessageText(
+                    "parameter.key","parameter.key"): </b><input name='overrideKey" + paramTRLastIndex + "' id='overrideKey" + paramTRLastIndex + "' type='text' style='width: 100px;' />";
         var newMockTD = newTR.insertCell(1);
-        newMockTD.innerHTML = "<b>$i18n.get(
-                    "parameter.value"): </b><input type='text' id='overrideValue" + paramTRLastIndex + "' name='overrideValue" + paramTRLastIndex + "' class='setting_input' style='width: 300px;' value='' maxlength='200'/>"
-                + "&nbsp;<a href='javascript:;' onclick=\"tableDeleteRow('paramTable', 'paramTable" + paramTRLastIndex + "'); return false;\">$i18n.get(
-                    "delete")</a>";
+        newMockTD.innerHTML = "<b>#springMessageText(
+                    "parameter.value","parameter.value"): </b><input type='text' id='overrideValue" + paramTRLastIndex + "' name='overrideValue" + paramTRLastIndex + "' class='setting_input' style='width: 300px;' value='' maxlength='200'/>"
+                + "&nbsp;<a href='javascript:;' onclick=\"tableDeleteRow('paramTable', 'paramTable" + paramTRLastIndex + "'); return false;\">#springMessageText(
+                    "delete","delete")</a>";
 
         paramTRLastIndex++; //将行号推进下一行
     }
@@ -189,15 +210,15 @@
         var newNameTH = document.createElement('th');
 
         var newNameTD = newTR.insertCell(0);
-        newNameTD.innerHTML = "<b>$i18n.get(
-                    "mock.method"):</b><input name='mockMethodName" + mockTRLastIndex + "' id='mockMethodName" + mockTRLastIndex + "' type='text' style='width: 100px;' /><b>$i18n.get(
-                    "mock.value"):</b>";
+        newNameTD.innerHTML = "<b>#springMessageText(
+                    "mock.method","mock.method"):</b><input name='mockMethodName" + mockTRLastIndex + "' id='mockMethodName" + mockTRLastIndex + "' type='text' style='width: 100px;' /><b>#springMessageText(
+                    "mock.value","mock.value"):</b>";
         var newNameTD = newTR.insertCell(1);
         newNameTD.innerHTML = "<select name='mockMethodForce" + mockTRLastIndex + "' id='mockMethodForce" + mockTRLastIndex + "'><option value='fail'>fail</option><option value='force'>force</option></select>";
         var newMockTD = newTR.insertCell(2);
         newMockTD.innerHTML = "<input name='mockMethodJson" + mockTRLastIndex + "' id='mockMethodJson" + mockTRLastIndex + "' type='text' value='return empty' style='width: 300px;' />"
-                + "&nbsp;<a href='javascript:;' onclick=\"tableDeleteRow('mockTable', 'mockTable" + mockTRLastIndex + "'); return false;\">$i18n.get(
-                    "delete")</a>";
+                + "&nbsp;<a href='javascript:;' onclick=\"tableDeleteRow('mockTable', 'mockTable" + mockTRLastIndex + "'); return false;\">#springMessageText(
+                    "delete","delete")</a>";
 
         mockTRLastIndex++; //将行号推进下一行
     }
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/overrides/index.vm b/dubbo-admin/src/main/resources/templates/governance/screen/overrides/index.vm
new file mode 100644
index 0000000..1820164
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/overrides/index.vm
@@ -0,0 +1,90 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    #if($currentUser.role != "G")
+        <a href="overrides/add"><img src="$rootContextPath.getURI("images/ico_add.png")" width="9" height="9"/><span
+                class="ico_font">#springMessageText("add", "add")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.delete","confirm.batch.delete")', 'overrides/' + getChecked('ids') + '/delete'); } return false;"><img
+                src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.delete", "batch.delete")</span></a>
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th width="20"><input type="checkbox" onclick="checkAll('table_o', 'ids', this.checked)"/></th>
+        #if(!$service)
+            <th>#springMessageText("service", "service")</th>
+        #end
+        <th>#springMessageText("application", "application")</th>
+        <th>#springMessageText("address", "address")</th>
+        <th>#springMessageText("parameters", "parameters")</th>
+        <th>#springMessageText("status", "status")</th>
+        #if($currentUser.role != "G")
+            <th>#springMessageText("operation", "operation")</th>#end
+    </tr>
+    #foreach($override in $overrides)
+        <tr>
+            <td><input type="checkbox" name="ids" value="$override.id"/></td>
+            #if(!$service)
+                <td><a href="overrides/$override.id">$override.service</a></td>
+            #end
+            <td>$!override.application</td>
+            <td>$!override.address</td>
+            <td>$!tool.decodeUrl($override.params)</td>
+            <td>
+                #if($override.enabled)
+                    <font color="green">#springMessageText("enabled", "enabled")</font>
+                #else
+                    <font color="red">#springMessageText("disabled", "disabled")</font>
+                #end
+            </td>
+            #if($currentUser.role != "G")
+                <td>
+                    <a href="overrides/$override.id">
+                        <img src="$rootContextPath.getURI("images/ico_show.png")" width="13" height="13"/>
+                        <span class="ico_font">#springMessageText("show", "show")</span></a>
+                    <span class="ico_line">|</span>
+                    <a href="overrides/$override.id/edit">
+                        <img src="$rootContextPath.getURI("images/ico_edit.png")" width="13" height="13"/>
+                        <span class="ico_font">#springMessageText("edit", "edit")</span></a>
+                    <span class="ico_line">|</span>
+                    #if($override.enabled)
+                        <a href="#" onclick="showConfirm('#springMessageText(
+                            "confirm.disable","confirm.disable")', '$override.application - $override.address', 'overrides/$override.id/disable'); return false;"><img
+                                src="$rootContextPath.getURI("images/ico_disable.png")" width="12" height="12"/><span
+                                class="ico_font">#springMessageText("disable", "disable")</span></a>
+                    #else
+                        <a href="#" onclick="showConfirm('#springMessageText(
+                            "confirm.enable","confirm.enable")', '$override.application - $override.address', 'overrides/$override.id/enable'); return false;"><img
+                                src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                                class="ico_font">#springMessageText("enable", "enable")</span></a>
+                    #end
+                    <span class="ico_line">|</span>
+                    <a href="#" onclick="showConfirm('#springMessageText(
+                        "confirm.delete","confirm.delete")', '$override.id', 'overrides/$override.id/delete'); return false;">
+                        <img src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/>
+                        <span class="ico_font">#springMessageText("delete", "delete")</span></a>
+                </td>
+            #end
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$overrides.size()#springMessageText("page.records", "page.records") </div>
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/overrides/show.vm b/dubbo-admin/src/main/resources/templates/governance/screen/overrides/show.vm
similarity index 63%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/overrides/show.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/overrides/show.vm
index 543cfe1..2a7980f 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/overrides/show.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/overrides/show.vm
@@ -1,52 +1,67 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../overrides"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
-            class="ico_font">$i18n.get("back")</span></a>
+            class="ico_font">#springMessageText("back", "back")</span></a>
     <span class="ico_line">|</span>
     <a href="$override.id/edit">
         <img src="$rootContextPath.getURI("images/ico_edit.png")" width="13" height="13"/>
-        <span class="ico_font">$i18n.get("edit")</span></a>
+        <span class="ico_font">#springMessageText("edit", "edit")</span></a>
     <span class="ico_line">|</span>
     <a href="#"
-       onclick="showConfirm('$i18n.get("confirm.delete")', '$override.id', '$override.id/delete'); return false;">
+       onclick="showConfirm('#springMessageText("confirm.delete", "confirm.delete")', '$override.id', '$override.id/delete'); return false;">
         <img src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/>
-        <span class="ico_font">$i18n.get("delete")</span></a>
+        <span class="ico_font">#springMessageText("delete", "delete")</span></a>
 </div>
 <br/>
 
 <table cellpadding="0" cellspacing="0" class="info" id="dynamicTable">
     <tr>
-        <td style="width: 100px;"><b>$i18n.get("service"):</b></td>
+        <td style="width: 100px;"><b>#springMessageText("service", "service"):</b></td>
         <td style="width: 300px;">$override.service</td>
     </tr>
     <tr>
-        <td><b>$i18n.get("status"): <b></td>
+        <td><b>#springMessageText("status", "status"): <b></td>
         <td>
             #if($override.enabled)
-				$i18n.get("enable")
+				#springMessageText("enable", "enable")
 			#else
-                $i18n.get("disable")
+                #springMessageText("disable", "disable")
             #end
         </td>
     </tr>
     <tr>
-        <td style="width: 100px;"><b>$i18n.get("application")</b></td>
+        <td style="width: 100px;"><b>#springMessageText("application", "application")</b></td>
         <td>$!override.application</td>
     </tr>
     <tr>
-        <td style="width: 100px;"><b>$i18n.get("clientAddress")</b></td>
+        <td style="width: 100px;"><b>#springMessageText("clientAddress", "clientAddress")</b></td>
         <td>$!override.address</td>
     </tr>
 </table>
 <br>
 
 <hr>
-<b>$i18n.get("override.config")</b>
+<b>#springMessageText("override.config", "override.config")</b>
 <br>
 <table cellpadding="0" cellspacing="0" class="info" id="paramTable">
     #foreach($p in $parameters.entrySet())
         <tr id="paramTable.old.$velocityCount">
-            <td style="width: 150px;"><b>$i18n.get("parameter.key"): </b> $p.key</td>
-            <td><b>$i18n.get("parameter.value"): </b> $p.value
+            <td style="width: 150px;"><b>#springMessageText("parameter.key", "parameter.key"): </b> $p.key</td>
+            <td><b>#springMessageText("parameter.value", "parameter.value"): </b> $p.value
             </td>
         </tr>
     #end
@@ -56,18 +71,18 @@
 <br>
 <hr>
 
-<b>$i18n.get("override.mock")</b>
+<b>#springMessageText("override.mock", "override.mock")</b>
 <br>
 <table cellpadding="0" cellspacing="0" class="info" id="mockTable">
     #if($mockDefaultMethodJson)
         <tr>
-            <td style="width: 150px;"><b>$i18n.get("mock.all.method"):</b>
+            <td style="width: 150px;"><b>#springMessageText("mock.all.method", "mock.all.method"):</b>
             </th>
             <td>
                 #if($mockDefaultMethodForce == "force")
-                    $i18n.get("force.mock")
+                    #springMessageText("force.mock", "force.mock")
                 #else
-                    $i18n.get("fail.mock")
+                    #springMessageText("fail.mock", "fail.mock")
                 #end
                 :
                 $mockDefaultMethodJson
@@ -75,13 +90,13 @@
         </tr>
     #end
     #foreach($m in $methodJsons.entrySet())
-        <td><b>$i18n.get("mock.method")<font color="orange"><code>${m.key}</code></font>$i18n.get("mock.value"):</b>
+        <td><b>#springMessageText("mock.method", "mock.method")<font color="orange"><code>${m.key}</code></font>#springMessageText("mock.value", "mock.value"):</b>
         </td>
         <td>
             #if($methodForces.get($m.key) == "force")
-                $i18n.get("force.mock")
+                #springMessageText("force.mock", "force.mock")
             #else
-                $i18n.get("fail.mock")
+                #springMessageText("fail.mock", "fail.mock")
             #end
             :
             $m.value
@@ -104,7 +119,7 @@
     function check() {
         var service = byId('service').value.trim();
         if (service == '') {
-            showAlert("$i18n.get("PleaseInput", $i18n.get("service"))", 'service');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput"), #springMessageText("service", "service"))", 'service');
             return false;
         }
         return true;
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/owners/add.vm b/dubbo-admin/src/main/resources/templates/governance/screen/owners/add.vm
similarity index 51%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/owners/add.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/owners/add.vm
index 0492ab1..963f423 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/owners/add.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/owners/add.vm
@@ -1,12 +1,27 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../owners"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
-            class="ico_font">$i18n.get("back")</span></a>
+            class="ico_font">#springMessageText("back", "back")</span></a>
 </div>
 <br/>
-<form id="df" action="../owners" method="POST">
+<form id="df" action="create" method="POST">
     <table cellpadding="0" cellspacing="0" class="info">
         <tr>
-            <th style="width: 150px;">$i18n.get("service")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th style="width: 150px;">#springMessageText("service", "service")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>
                 #if($service)
                     <input type="hidden" id="serviceName" name="service" value="$service"/>$service
@@ -14,7 +29,7 @@
                     <input id="serviceName" name="service" rows="5" cols="40" maxlength="200">
                     #if ($serviceList && $serviceList.size() > 0)
                         <select id="selectService" name="selectService" onchange="fnSetService(this)">
-                            <option value="">$i18n.get("Choose")</option>
+                            <option value="">#springMessageText("Choose", "Choose")</option>
                             #foreach ($s in $serviceList)
                                 <option value="$s">$tool.getSimpleName($s)</option>
                             #end
@@ -24,14 +39,14 @@
             </td>
         </tr>
         <tr>
-            <th style="width: 150px;">$i18n.get("Username")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th style="width: 150px;">#springMessageText("Username", "Username")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td><input type="text" id="username" name="username" style="ime-mode:disabled" value="$operator"
                        maxlength="100"/></td>
         </tr>
         <tr>
             <th>
-                <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}">$i18n.get(
-                    "save")</a></div>
+                <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}">#springMessageText(
+                    "save","save")</a></div>
             </th>
             <td></td>
         </tr>
@@ -41,7 +56,7 @@
     function check() {
         var username = byId('username').value.trim();
         if (username == '') {
-            showAlert("$i18n.get("PleaseInput")$i18n.get("Username")", 'username');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput")#springMessageText("Username", "Username")", 'username');
             return false;
         }
         return true;
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/owners/index.vm b/dubbo-admin/src/main/resources/templates/governance/screen/owners/index.vm
new file mode 100644
index 0000000..168f253
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/owners/index.vm
@@ -0,0 +1,55 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    #if($currentUser.role != "G")
+        <a href="owners/add"><img src="$rootContextPath.getURI("images/ico_add.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("add", "add")</span></a>
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th>#springMessageText("Username", "Username"): <input type="text" onkeyup="searchTable('table_o', 1, this.value);"
+                                          onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        #if(! $service)
+            <th>#springMessageText("service", "service"): <input type="text" onkeyup="searchTable('table_o', 2, this.value);"
+                                             onclick="searchTable('table_o', 2, this.value);"/>&nbsp;<img
+                    src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        #end
+        #if($currentUser.role != "G")
+            <th>#springMessageText("operation", "operation")</th>#end
+    </tr>
+    #foreach($owner in $owners)
+        <tr>
+            <td>$owner.username</td>
+            #if(! $service)
+                <td><a href="services/$owner.service/owners">$owner.service</a></td>
+            #end
+            #if($currentUser.role != "G")
+                <td>
+                    #if($currentUser.hasServicePrivilege($owner.service))
+                        <a href="#" onclick="showConfirm('#springMessageText(
+                            "confirm.delete","confirm.delete")', '$owner.username', 'owners/0/delete?username=$owner.username#if(! $service)&service=$owner.service#end'); return false;"><img
+                                src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/><span
+                                class="ico_font">#springMessageText("delete", "delete")</span></a>
+                    #end
+                </td>
+            #end
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$owners.size()#springMessageText("page.records", "page.records") </div>
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/providers/add.vm b/dubbo-admin/src/main/resources/templates/governance/screen/providers/add.vm
similarity index 54%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/providers/add.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/providers/add.vm
index 6c60cdf..0f60dfd 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/providers/add.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/providers/add.vm
@@ -1,20 +1,35 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="#if($id)../#end../providers"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12"
-                                               height="12"/><span class="ico_font">$i18n.get("back")</span></a>
+                                               height="12"/><span class="ico_font">#springMessageText("back", "back")</span></a>
 </div>
 <br/>
-<form id="providerForm" action="#if($id)../#end../providers" method="POST">
+<form id="providerForm" action="#if($id)../create#{else}create#end" method="POST">
     <table cellpadding="0" cellspacing="0" class="info">
         #if(! $service)
             #if($provider.service)
                 <input type="hidden" id="service" name="service" value="$!provider.service"/>
             #else
                 <tr>
-                    <th style="width: 100px;">$i18n.get("service"):</th>
+                    <th style="width: 100px;">#springMessageText("service", "service"):</th>
                     <td style="width: 300px;"><input id="service" type="text" name="service" class="setting_input"
                                                      style="width: 200px;"/>
                         <select onchange="fnSetService(this)">
-                            <option value="">$i18n.get("Choose")</option>
+                            <option value="">#springMessageText("Choose", "Choose")</option>
                             #foreach($s in $serviceList)
                                 <option value="$s">$tool.getSimpleName($s)</option>
                             #end
@@ -24,29 +39,29 @@
             #end
         #end
         <tr>
-            <th style="width: 100px;">$i18n.get("url"):</th>
+            <th style="width: 100px;">#springMessageText("url", "url"):</th>
             <td><input type="text" id="url" name="url"
-                       value="#if($provider.url)$!provider.url?$!provider.parameters#{else}dubbo://#if($address)$address#{else}0.0.0.0:20880#end/#if($service)$tool.getInterface($service)#{else}com.xxx.XxxService#end?application=#if($application)$application#{else}xxx#end#if($tool.getGroup($service))&group=$tool.getGroup($service)#end#if($tool.getVersion($service))&version=$tool.getVersion($service)#end#end"
+                       value="#if($provider.url)$!provider.url?$!provider.parameters#{else}dubbo://#if($address)$address#{else}0.0.0.0:20880#end/#if($service)$tool.getInterface($service)#{else}com.xxx.XxxService#end?application=#if($app)$app#{else}xxx#end#if($tool.getGroup($service))&group=$tool.getGroup($service)#end#if($tool.getVersion($service))&version=$tool.getVersion($service)#end#end"
                        class="setting_input" style="width: 700px;" maxlength="2000"/></td>
         </tr>
         <tr>
-            <th>$i18n.get("type"):</th>
-            <td><font color="blue">$i18n.get("static")</font></td>
+            <th>#springMessageText("type", "type"):</th>
+            <td><font color="blue">#springMessageText("static", "static")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("status"):</th>
+            <th>#springMessageText("status", "status"):</th>
             <td>
                 <select name="enabled">
-                    <option value="true">$i18n.get("enable")</option>
-                    <option value="false" selected="selected">$i18n.get("disable")</option>
+                    <option value="true">#springMessageText("enable", "enable")</option>
+                    <option value="false" selected="selected">#springMessageText("disable", "disable")</option>
                 </select>
             </td>
         </tr>
         <tr>
             <th>
                 <div class="btn"><a href="#"
-                                    onclick="if(check()){document.getElementById('providerForm').submit();}">$i18n.get(
-                    "save")</a></div>
+                                    onclick="if(check()){document.getElementById('providerForm').submit();}">#springMessageText(
+                    "save","save")</a></div>
             </th>
         </tr>
     </table>
@@ -69,13 +84,13 @@
         #if(! $service)
             var service = byId('service').value.trim();
             if (service == '') {
-                showAlert("$i18n.get("PleaseInput")$i18n.get("service")", 'service');
+                showAlert("#springMessageText("PleaseInput", "PleaseInput")#springMessageText("service", "service")", 'service');
                 return false;
             }
         #end
         var url = byId('url').value.trim();
         if (url == '' || url.indexOf('0.0.0.0') > 0 || url.indexOf('com.xxx.XxxService') > 0 || url.indexOf('application=xxx') > 0) {
-            showAlert("$i18n.get("PleaseInput")$i18n.get("url")", 'url');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput")#springMessageText("url", "url")", 'url');
             return false;
         }
         return true;
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/providers/edit.vm b/dubbo-admin/src/main/resources/templates/governance/screen/providers/edit.vm
new file mode 100644
index 0000000..456592a
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/providers/edit.vm
@@ -0,0 +1,109 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    <a href="../../providers"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("back", "back")</span></a>
+    <span class="ico_line">|</span>
+    <a href="../$provider.id"><img src="$rootContextPath.getURI("images/ico_show.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("show", "show")</span></a>
+    #if($currentUser.hasServicePrivilege($provider.service))
+        <span class="ico_line">|</span>
+        <a href="../$provider.id/add"><img src="$rootContextPath.getURI("images/ico_add.png")" width="12"
+                                           height="12"/><span class="ico_font">#springMessageText("copy", "copy")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="showConfirm('#springMessageText(
+            "confirm.weight.doubling","confirm.weight.doubling")', '$provider.url', '../$provider.id/doubling'); return false;"><img
+                src="$rootContextPath.getURI("images/ico_up.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("weight.doubling", "weight.doubling")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="showConfirm('#springMessageText(
+            "confirm.weight.halving","confirm.weight.halving")', '$provider.url', '../$provider.id/halving'); return false;"><img
+                src="$rootContextPath.getURI("images/ico_down.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("weight.halving", "weight.halving")</span></a>
+        <span class="ico_line">|</span>
+        #if($tool.isProviderEnabled($provider))
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.disable","confirm.disable")', '$provider.url', '../$provider.id/disable'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_disable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("disable", "disable")</span></a>
+        #else
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.enable","confirm.enable")', '$provider.url', '../$provider.id/enable'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("enable", "enable")</span></a>
+        #end
+        #if(! $provider.dynamic)
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.delete","confirm.delete")', '$provider.url', '../$provider.id/delete'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("delete", "delete")</span></a>
+        #end
+    #end
+</div>
+<br/>
+<form id="providerForm" action="../update" method="POST">
+    <table cellpadding="0" cellspacing="0" class="info">
+        <tr type = "hidden">
+            <td>
+                <input type="hidden" name="id" value="$provider.id">
+            </td>
+        </tr>
+        #if(! $service)
+            <tr>
+                <th style="width: 100px;">#springMessageText("service", "service"):</th>
+                <td style="width: 300px;"><input type="hidden" name="service"
+                                                 value="$provider.service"/>$provider.service</td>
+            </tr>
+        #end
+        <tr>
+            <th style="width: 100px;">#springMessageText("url", "url"):</th>
+            <td>
+                <input type="hidden" name="url" value="$provider.url"/>
+                #if($provider.dynamic)
+                    ${provider.url}?$!provider.parameters
+                #else
+                    ${provider.url}?<input type="text" name="parameters" value="$!provider.parameters"
+                                           class="setting_input" style="width: 400px;"/>
+                #end
+            </td>
+        </tr>
+        #if($provider.dynamic)
+            <tr>
+                <th>#springMessageText("overrides", "overrides"):</th>
+                <td><input type="text" name="parameters" value="$!provider.override.params" class="setting_input"
+                           style="width: 400px;"/> <font color="blue">#springMessageText("dynamic.parameters.tip", "dynamic.parameters.tip")</font></td>
+            </tr>
+        #end
+        <tr>
+            <th>#springMessageText("type", "type"):</th>
+            <td>#if($provider.dynamic)<font color="green">#springMessageText("dynamic", "dynamic")</font>#else<font color="blue">#springMessageText(
+                "static","static")</font>#end</td>
+        </tr>
+        <tr>
+            <th>#springMessageText("status", "status"):</th>
+            <td>#if($provider.enabled)<font color="green">#springMessageText("enabled", "enabled")</font>#else<font color="red">#springMessageText(
+                "disabled","disabled")</font>#end</td>
+        </tr>
+        <tr>
+            <th>
+                <div class="btn"><a href="#" onclick="document.getElementById('providerForm').submit();">#springMessageText(
+                    "save","save")</a></div>
+            </th>
+            <td></td>
+        </tr>
+    </table>
+</form>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/providers/index.vm b/dubbo-admin/src/main/resources/templates/governance/screen/providers/index.vm
new file mode 100644
index 0000000..b10dff3
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/providers/index.vm
@@ -0,0 +1,182 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    #if($currentUser.role != "G")
+        <a href="providers/add"><img src="$rootContextPath.getURI("images/ico_add.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("add", "add")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.weight.doubling","confirm.batch.weight.doubling")', 'providers/' + getChecked('ids') + '/doubling' );} return false;"><img
+                src="$rootContextPath.getURI("images/ico_up.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.weight.doubling", "batch.weight.doubling")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.weight.halving","confirm.batch.weight.halving")', 'providers/' + getChecked('ids') + '/halving' );} return false;"><img
+                src="$rootContextPath.getURI("images/ico_down.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.weight.halving", "batch.weight.halving")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.disable","confirm.batch.disable")', 'providers/' + getChecked('ids') + '/disable' );} return false;"><img
+                src="$rootContextPath.getURI("images/ico_disable.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.disable", "batch.disable")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.enable","confirm.batch.enable")', 'providers/' + getChecked('ids') + '/enable' );} return false;"><img
+                src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.enable", "batch.enable")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.delete","confirm.batch.delete")', 'providers/' + getChecked('ids') + '/delete' ); } return false;"><img
+                src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.delete", "batch.delete")</span></a>
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th width="20"><input type="checkbox" onclick="checkAll('table_o', 'ids', this.checked)"/></th>
+        <th>#if($address)#springMessageText("service", "service")#else#springMessageText("address", "address")#end: <input type="text" style="width: 60px;"
+                                                                                   onkeyup="searchTable('table_o', 1, this.value);"
+                                                                                   onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        <th>#springMessageText("weight", "weight"): <input type="text" style="width: 60px;"
+                                        onkeyup="searchTable('table_o', 2, this.value);"
+                                        onclick="searchTable('table_o', 2, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        <th width="100">#springMessageText("type", "type"): <select onchange="searchTable('table_o', 3, this.value);"
+                                                   onclick="searchTable('table_o', 3, this.value);">
+            <option value="">#springMessageText("all", "all")</option>
+            <option value="#springMessageText("dynamic", "dynamic")">#springMessageText("dynamic", "dynamic")</option>
+            <option value="#springMessageText("static", "static")">#springMessageText("static", "static")</option>
+        </select></th>
+        <th width="110">#springMessageText("status", "status"): <select onchange="searchTable('table_o', 4, this.value);"
+                                                     onclick="searchTable('table_o', 4, this.value);">
+            <option value="">#springMessageText("all", "all")</option>
+            <option value="#springMessageText("enabled", "enabled")">#springMessageText("enabled", "enabled")</option>
+            <option value="#springMessageText("disabled", "disabled")">#springMessageText("disabled", "disabled")</option>
+        </select></th>
+        <th width="100">#springMessageText("check", "check"): <select onchange="searchTable('table_o', 5, this.value);"
+                                                    onclick="searchTable('table_o', 5, this.value);">
+            <option value="">#springMessageText("all", "all")</option>
+            <option value="#springMessageText("ok", "ok")">#springMessageText("ok", "ok")</option>
+            <option value="#springMessageText("warn", "warn")">#springMessageText("warn", "warn")</option>
+            <option value="#springMessageText("error", "error")">#springMessageText("error", "error")</option>
+        </select></th>
+        #if($currentUser.role != "G")
+            <th>#springMessageText("operation", "operation")</th>#end
+    </tr>
+
+    #foreach($provider in $providers)
+        #set($providerApplication = "")
+        <tr>
+            <td><input type="checkbox" name="ids" value="$provider.id"/></td>
+            <td>
+                <a href="providers/$provider.id">#if($address)$tool.getSimpleName($provider.service)#else$provider.address#end</a>
+            </td>
+            <td>$tool.getProviderWeight($provider)</td>
+            <td>#if($provider.dynamic)<font color="green">#springMessageText("dynamic", "dynamic")</font>#else<font color="blue">#springMessageText(
+                "static","static")</font>#end</td>
+            <td>#if($tool.isProviderEnabled($provider))<font color="green">#springMessageText("enabled", "enabled")</font>#else<font
+                    color="red">#springMessageText("disabled", "disabled")</font>#end</td>
+            <td>
+                #set($errorLevel = "ok")
+                #set($errorMessage = "")
+                #set($appList = $!serviceAppMap.get($provider.service))
+                #if($appList.size()>1)
+                    #if ($errorLevel != "error") #set($errorLevel = "warn") #end
+                    #set($errorMessage ="$errorMessage<br>#springMessageText('warn', 'warn'): #springMessageText(
+                        'CheckProviderApplicationDifferent', $appList)")
+                #end
+
+                #if($provider.address.startsWith("127.") || $provider.address.startsWith(
+                    "localhost:") || $provider.address.startsWith("0.0.0.0:"))
+                    #if ($errorLevel != "error") #set($errorLevel = "warn") #end
+                    #set($errorMessage =
+                        "$errorMessage<br>#springMessageText('warn', 'warn'): #springMessage('CheckProviderLocalAddress', $provider.address)")
+                #end
+
+                #if ($errorLevel == "warn")
+                    <a href="#" onclick="showAlert('<font color=orange>#springMessageText(
+                        'warn','warn')</font>', '$errorMessage'); return false;">
+                        <img src="$rootContextPath.getURI("images/ico_warn.png")" width="12" height="12"/>
+                        <font color="orange"><u>#springMessageText("warn", "warn")</u></font>
+                    </a>
+                #elseif ($errorLevel == "error")
+                    <a href="#"
+                       onclick="showAlert('<font color=red>#springMessageText("error", "error")</font>', '$errorMessage'); return false;">
+                        <img src="$rootContextPath.getURI("images/ico_error.png")" width="12" height="12"/>
+                        <font color="red"><u>#springMessageText("error", "error")</u></font>
+                    </a>
+                #else
+                    <font color="green">#springMessageText("ok", "ok")</font>
+                #end
+            </td>
+            #if($currentUser.role != "G")
+                <td>
+                    #if($currentUser.hasServicePrivilege($provider.service))
+                        <a href="providers/$provider.id/edit"><img src="$rootContextPath.getURI("images/ico_edit.png")"
+                                                                   width="12" height="12"/><span
+                                class="ico_font">#springMessageText("edit", "edit")</span></a>
+                        <span class="ico_line">|</span>
+                        <a href="providers/$provider.id/add"><img src="$rootContextPath.getURI("images/ico_add.png")"
+                                                                  width="12" height="12"/><span
+                                class="ico_font">#springMessageText("copy", "copy")</span></a>
+                        <span class="ico_line">|</span>
+                        <a href="#" onclick="showConfirm('#springMessageText(
+                            "confirm.weight.doubling","confirm.weight.doubling")', '$provider.url', 'providers/$provider.id/doubling'); return false;"><img
+                                src="$rootContextPath.getURI("images/ico_up.png")" width="12" height="12"/><span
+                                class="ico_font">#springMessageText("weight.doubling", "weight.doubling")</span></a>
+                        <span class="ico_line">|</span>
+                        <a href="#" onclick="showConfirm('#springMessageText(
+                            "confirm.weight.halving","confirm.weight.halving")', '$provider.url', 'providers/$provider.id/halving'); return false;"><img
+                                src="$rootContextPath.getURI("images/ico_down.png")" width="12" height="12"/><span
+                                class="ico_font">#springMessageText("weight.halving", "weight.halving")</span></a>
+                        <span class="ico_line">|</span>
+                        #if($tool.isProviderEnabled($provider))
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.disable","confirm.disable")', '$provider.url', 'providers/$provider.id/disable'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_disable.png")" width="12"
+                                    height="12"/><span class="ico_font">#springMessageText("disable", "disable")</span></a>
+                        #else
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.enable","confirm.enable")', '$provider.url', 'providers/$provider.id/enable'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("enable", "enable")</span></a>
+                        #end
+                        #if(! $provider.dynamic)
+                            <span class="ico_line">|</span>
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.delete","confirm.delete")', '$provider.url', 'providers/$provider.id/delete'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("delete", "delete")</span></a>
+                        #end
+                    #end
+                </td>
+            #end
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$providers.size()#springMessageText("page.records", "page.records") </div>
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/providers/show.vm b/dubbo-admin/src/main/resources/templates/governance/screen/providers/show.vm
new file mode 100644
index 0000000..50aade4
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/providers/show.vm
@@ -0,0 +1,126 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    <a href="../providers"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("back", "back")</span></a>
+    #if($currentUser.hasServicePrivilege($provider.service))
+        <span class="ico_line">|</span>
+        <a href="$provider.id/edit"><img src="$rootContextPath.getURI("images/ico_edit.png")" width="12"
+                                         height="12"/><span class="ico_font">#springMessageText("edit", "edit")</span></a>
+        <span class="ico_line">|</span>
+        <a href="$provider.id/add"><img src="$rootContextPath.getURI("images/ico_add.png")" width="12"
+                                        height="12"/><span class="ico_font">#springMessageText("copy", "copy")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="showConfirm('#springMessageText(
+            "confirm.weight.doubling","confirm.weight.doubling")', '$provider.url', '../doubling?ids=$provider.id'); return false;"><img
+                src="$rootContextPath.getURI("images/ico_up.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("weight.doubling", "weight.doubling")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="showConfirm('#springMessageText(
+            "confirm.weight.halving","confirm.weight.halving")', '$provider.url', '../halving?ids=$provider.id'); return false;"><img
+                src="$rootContextPath.getURI("images/ico_down.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("weight.halving", "weight.halving")</span></a>
+        <span class="ico_line">|</span>
+        #if($tool.isProviderEnabled($provider))
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.disable","confirm.disable")', '$provider.url', '../disable?ids=$provider.id'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_disable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("disable", "disable")</span></a>
+        #else
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.enable", "confirm.enable")', '$provider.url', '../enable?ids=$provider.id'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("enable", "enable")</span></a>
+        #end
+        #if(! $provider.dynamic)
+            <span class="ico_line">|</span>
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.delete","confirm.delete")', '$provider.url', '../delete?ids=$provider.id'); return false;"><img
+                    src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("delete", "delete")</span></a>
+        #end
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="info">
+    #if(! $service)
+        <tr>
+            <th style="width: 100px;">#springMessageText("service", "service"):</th>
+            <td>$!provider.service</td>
+        </tr>
+    #end
+    <tr>
+        <th style="width: 100px;">#springMessageText("url", "url"):</th>
+        <td>$!provider.url?$!provider.parameters</td>
+    </tr>
+    #if($provider.dynamic)
+        <tr>
+            <th>#springMessageText("overrides", "overrides"):</th>
+            <td>$!provider.override.params</td>
+        </tr>
+    #end
+    <tr>
+        <th>#springMessageText("host", "host"):</th>
+        <td>$tool.getHostPrefix($!provider.address)$!provider.address</td>
+    </tr>
+    #foreach($entry in $tool.toParameterMap($!provider.parameters).entrySet())
+        <tr>
+            <th>#springMessageText($entry.key, $entry.key):</th>
+            <td>#if($entry.key == "timestamp") $tool.formatTimestamp($entry.value)
+                ($entry.value) #else $entry.value #end</td>
+        </tr>
+    #end
+    <tr>
+        <th>#springMessageText("type", "type"):</th>
+        <td>#if($provider.dynamic)<font color="green">#springMessageText("dynamic", "dynamic")</font>#else<font color="blue">#springMessageText(
+            "static","static")</font>#end</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("status", "status"):</th>
+        <td>#if($provider.enabled)<font color="green">#springMessageText("enabled", "enabled")</font>#else<font color="red">#springMessageText(
+            "disabled","disabled")</font>#end</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("check", "check"):</th>
+        <td>
+            #set($errorLevel = "ok")
+            #set($errorMessage = "")
+
+            #if($provider.address.startsWith("127.") || $provider.address.startsWith(
+                "localhost:") || $provider.address.startsWith("0.0.0.0:"))
+                #if ($errorLevel != "error") #set($errorLevel = "warn") #end
+                #set($errorMessage =
+                    "$errorMessage<br>#springMessageText('warn', 'warn'): #springMessage('CheckProviderLocalAddress', $provider.address)")
+            #end
+
+            #if ($errorLevel == "warn")
+                <a href="#"
+                   onclick="showAlert('<font color=orange>#springMessageText("warn", "warn")</font>', '$errorMessage'); return false;">
+                    <img src="$rootContextPath.getURI("images/ico_warn.png")" width="12" height="12"/>
+                    <font color="orange"><u>#springMessageText("warn", "warn")</u></font>
+                </a>
+            #elseif ($errorLevel == "error")
+                <a href="#"
+                   onclick="showAlert('<font color=red>#springMessageText("error", "error")</font>', '$errorMessage'); return false;">
+                    <img src="$rootContextPath.getURI("images/ico_error.png")" width="12" height="12"/>
+                    <font color="red"><u>#springMessageText("error", "error")</u></font>
+                </a>
+            #else
+                <font color="green">#springMessageText("ok", "ok")</font>
+            #end
+        </td>
+    </tr>
+</table>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/redirect.vm b/dubbo-admin/src/main/resources/templates/governance/screen/redirect.vm
similarity index 62%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/redirect.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/redirect.vm
index 68a431b..4b86740 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/redirect.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/redirect.vm
@@ -1,3 +1,18 @@
+##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.
+#set($layout = "/templates/governance/layout/redirect.vm")
 <div id="alertBox" style="display: none; position: absolute; left: 200px; top: 200px; width: 720px; height: 300px;">
     <table style="background-image: url('#if($success)$rootContextPath.getURI(
         "images/tip_succeed.png")#else$rootContextPath.getURI("images/tip_del.png")#end');" width="720" height="300"
@@ -10,14 +25,14 @@
                                 height="20"/></td>
         </tr>
         <tr height="120">
-            <td align="right"><span style="font-size: 32px;">#if($success)$i18n.get("operation.success")#else$i18n.get(
-                "operation.failure")#end</span><br/>$!message$!exception.message</td>
+            <td align="right"><span style="font-size: 32px;">#if($success)#springMessageText("operation.success", "operation.success")#else#springMessageText(
+                "operation.failure","operation.failure")#end</span><br/>$!message$!exception.message</td>
             <td></td>
         </tr>
         <tr>
             <td align="right">#if(!$success)
                 <div class="btn_info" style="float: right; clear: left;"><a
-                        href="$rootContextPath.getURI("$redirect")">$i18n.get("confirm")</a>
+                        href="$redirect">#springMessageText("confirm", "confirm")</a>
                 </div>#end</td>
             <td></td>
         </tr>
@@ -28,7 +43,7 @@
         #if($success)
         sleep(this, 500);
         this.NextStep = function () {
-            window.location.href = '$rootContextPath.getURI("$redirect")';
+            window.location.href = '$redirect';
         }
         #end
     function sleep(obj, iMinSecond) {
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/routes/add.vm b/dubbo-admin/src/main/resources/templates/governance/screen/routes/add.vm
similarity index 66%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/routes/add.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/routes/add.vm
index 3ec982c..b502738 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/routes/add.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/routes/add.vm
@@ -1,59 +1,74 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../routes"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
-            class="ico_font">$i18n.get("back")</span></a>
+            class="ico_font">#springMessageText("back", "back")</span></a>
 </div>
 <br/>
-<form id="df" action="../routes" method="POST" onsubmit="return check();">
+<form id="df" action="create" method="POST" onsubmit="return check();">
     <table cellpadding="0" cellspacing="0" class="info">
         <tr>
-            <th width="100">$i18n.get("route.name"): <font color='red'>*</font></th>
+            <th width="100">#springMessageText("route.name", "route.name"): <font color='red'>*</font></th>
             <td colspan="2"><input type="text" id="name" name="name" maxlength="200"/></td>
-            <td><font color='blue'>$i18n.get("RouteNameTip")</font></td>
+            <td><font color='blue'>#springMessageText("RouteNameTip", "RouteNameTip")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("Priority"):</th>
+            <th>#springMessageText("Priority", "Priority"):</th>
             <td colspan="2">
                 <input type="text" id="priority" name="priority" value="#if($route)$route.priority#{else}0#end"
                        onkeydown="return checkNumber();"/>
             </td>
-            <td><font color='blue'>$i18n.get("RoutePriorityTip")</font></td>
+            <td><font color='blue'>#springMessageText("RoutePriorityTip", "RoutePriorityTip")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("service"): <font color='red'>*</font></th>
+            <th>#springMessageText("service", "service"): <font color='red'>*</font></th>
             <td colspan="2">
                 #if($service)
                     <input type="hidden" id="service" name="service" value="$service"/>$service
                     #if($input)
-                        <button onclick="window.location.href='../routes/add'; return false;">$i18n.get("Edit")</button>
+                        <button onclick="window.location.href='../routes/add'; return false;">#springMessageText("edit", "edit")</button>
                     #end
                 #else
                     <input type="text" id="service" name="service" value="$!route.serviceName" style="ime-mode:disabled"
                            maxlength="200"/>
                     #if ($serviceList && $serviceList.size() > 0)
                         <select onchange="if (this.value != '') { byId('service').value = this.value; this.value = ''; }">
-                            <option value="">$i18n.get("Choose")</option>
+                            <option value="">#springMessageText("Choose", "Choose")</option>
                             #foreach ($s in $serviceList)
                                 <option value="$s">$tool.getSimpleName($s)</option>
                             #end
                         </select>
                     #end
-                    <button onclick="if(byId('service').value == '') { showAlert('$i18n.get("PleaseInput")$i18n.get(
-                        "ServiceName")', 'service'); } else if(!checkService(byId('service').value)) { showAlert('Service name can not contain , only last * is allowed', 'service'); } else { window.location.href='../services/' + byId('service').value+'/routes/add?input=true'; } return false;">$i18n.get(
-                        "getMethods")</button>
+                    <button onclick="if(byId('service').value == '') { showAlert('#springMessageText("PleaseInput", "PleaseInput")#springMessageText(
+                        "ServiceName","ServiceName")', 'service'); } else if(!checkService(byId('service').value)) { showAlert('Service name can not contain , only last * is allowed', 'service'); } else { window.location.href='../services/' + byId('service').value+'/routes/add?input=true'; } return false;">#springMessageText(
+                        "getMethods","getMethods")</button>
                     <br>
-                    <font color='blue'>$i18n.get("RouteServiceTip")</font>
+                    <font color='blue'>#springMessageText("RouteServiceTip", "RouteServiceTip")</font>
                 #end
             </td>
             <td>
             </td>
         </tr>
         <tr>
-            <th>$i18n.get("methodName"):</th>
+            <th>#springMessageText("methodName", "methodName"):</th>
             <td colspan="2">
                 <input type="text" id="method" name="method" value="" style="ime-mode:disabled"/>
                 #if ($methods)
                     <select onchange="if (this.value != '') { if (byId('method').value == '') { byId('method').value = this.value; } else { byId('method').value = byId('method').value + ',' + this.value; } this.value = ''; }">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($m in $methods)
                             <option value="$m">$m</option>
                         #end
@@ -63,37 +78,37 @@
 
             </td>
             <td>
-                <font color='blue'>$i18n.get("RouteMethodTip")<font>
+                <font color='blue'>#springMessageText("RouteMethodTip", "RouteMethodTip")<font>
             </td>
         </tr>
         <tr>
-            <th>$i18n.get("MatchRule")</th>
-            <th>$i18n.get("Match")</th>
-            <th>$i18n.get("Mismatch")</th>
-            <td><font color='blue'>$i18n.get("RouteMatchTip")</font></td>
+            <th>#springMessageText("MatchRule","MatchRule")</th>
+            <th>#springMessageText("Match", "Match")</th>
+            <th>#springMessageText("Mismatch", "Mismatch")</th>
+            <td><font color='blue'>#springMessageText("RouteMatchTip", "RouteMatchTip")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("ConsumerHost"):</th>
+            <th>#springMessageText("ConsumerHost", "ConsumerHost"):</th>
             <td><input type="text" id="consumerHost" name="consumerHost" value="$!tool.getIP($address)"
                        style="ime-mode:disabled"/></td>
             <td><input type="text" id="unconsumerHost" name="unconsumerHost" value="" style="ime-mode:disabled"/></td>
-            <td><font color="blue">$i18n.get("RouteHostTip")</font></td>
+            <td><font color="blue">#springMessageText("RouteHostTip", "RouteHostTip")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("ConsumerApplication"):</th>
+            <th>#springMessageText("ConsumerApplication", "ConsumerApplication"):</th>
             <td><input type="text" id="consumerApplication" name="consumerApplication" value=""
                        style="ime-mode:disabled"/></td>
             <td><input type="text" id="unconsumerApplication" name="unconsumerApplication" value=""
                        style="ime-mode:disabled"/></td>
-            <td><font color="blue">$i18n.get("RouteApplicationTip")</font></td>
+            <td><font color="blue">#springMessageText("RouteApplicationTip", "RouteApplicationTip")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("ConsumerCluster"):</th>
+            <th>#springMessageText("ConsumerCluster", "ConsumerCluster"):</th>
             <td>
                 <input type="text" id="consumerCluster" name="consumerCluster" value="" style="ime-mode:disabled"/>
                 #if ($clusterNames && $clusterNames.size() > 0)
                     <select onchange="if (this.value != '') { if (byId('consumerCluster').value == '') { byId('consumerCluster').value = this.value; } else { byId('consumerCluster').value = byId('consumerCluster').value + ',' + this.value; } this.value = ''; }">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($c in $clusterNames)
                             <option value="$c">$c</option>
                         #end
@@ -104,36 +119,36 @@
                 <input type="text" id="unconsumerCluster" name="unconsumerCluster" value="" style="ime-mode:disabled"/>
                 #if ($clusterNames && $clusterNames.size() > 0)
                     <select onchange="if (this.value != '') { if (byId('unconsumerCluster').value == '') { byId('unconsumerCluster').value = this.value; } else { byId('unconsumerCluster').value = byId('unconsumerCluster').value + ',' + this.value; } this.value = ''; }">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($c in $clusterNames)
                             <option value="$c">$c</option>
                         #end
                     </select>
                 #end
             </td>
-            <td><font color="blue">$i18n.get("RouteClusterTip")</font></td>
+            <td><font color="blue">#springMessageText("RouteClusterTip","RouteClusterTip")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("FilterRule")</th>
-            <th>$i18n.get("Match")</th>
-            <th>$i18n.get("Mismatch")</th>
-            <td><font color='blue'>$i18n.get("RouteFilterTip")</font></td>
+            <th>#springMessageText("FilterRule","FilterRule")</th>
+            <th>#springMessageText("Match","Match")</th>
+            <th>#springMessageText("Mismatch","Mismatch")</th>
+            <td><font color='blue'>#springMessageText("RouteFilterTip","RouteFilterTip")</font></td>
         </tr>
         <tr id="host">
-            <th>$i18n.get("ProviderHost"):</th>
+            <th>#springMessageText("ProviderHost","ProviderHost"):</th>
             <td><input type="text" id="providerHost" value=""
                        name="providerHost" style="ime-mode:disabled"/></td>
             <td><input type="text" id="unproviderHost" value=""
                        name="unproviderHost" style="ime-mode:disabled"/></td>
-            <td><font color="blue">$i18n.get("RouteHostTip")</font></td>
+            <td><font color="blue">#springMessageText("RouteHostTip","RouteHostTip")</font></td>
         </tr>
         <tr id="cluster">
-            <th>$i18n.get("ProviderCluster"):</th>
+            <th>#springMessageText("ProviderCluster","ProviderCluster"):</th>
             <td>
                 <input type="text" id="providerCluster" value="" name="providerCluster" style="ime-mode:disabled"/>
                 #if ($clusterNames && $clusterNames.size() > 0)
                     <select onchange="if (this.value != '') { if (byId('providerCluster').value == '') { byId('providerCluster').value = this.value; } else { byId('providerCluster').value = byId('providerCluster').value + ',' + this.value; } this.value = ''; }">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($c in $clusterNames)
                             <option value="$c">$c</option>
                         #end
@@ -144,17 +159,17 @@
                 <input type="text" id="unproviderCluster" value="" name="unproviderCluster" style="ime-mode:disabled"/>
                 #if ($clusterNames && $clusterNames.size() > 0)
                     <select onchange="if (this.value != '') { if (byId('unproviderCluster').value == '') { byId('unproviderCluster').value = this.value; } else { byId('unproviderCluster').value = byId('unproviderCluster').value + ',' + this.value; } this.value = ''; }">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($c in $clusterNames)
                             <option value="$c">$c</option>
                         #end
                     </select>
                 #end
             </td>
-            <td><font color="blue">$i18n.get("RouteClusterTip")</font></td>
+            <td><font color="blue">#springMessageText("RouteClusterTip")</font></td>
         </tr>
         <tr id="protocol">
-            <th>$i18n.get("ProviderProtocol"):</th>
+            <th>#springMessageText("ProviderProtocol","ProviderProtocol"):</th>
             <td><input type="text" id="providerProtocol" value=""
                        name="providerProtocol" style="ime-mode:disabled"/></td>
             <td><input type="text" id="unproviderProtocol" value=""
@@ -162,15 +177,15 @@
             <td></td>
         </tr>
         <tr id="port">
-            <th>$i18n.get("ProviderPort"):</th>
+            <th>#springMessageText("ProviderPort","ProviderPort"):</th>
             <td><input type="text" id="providerPort" name="providerPort" value="" style="ime-mode:disabled"/>
             </td>
             <td><input type="text" id="unproviderPort" name="unproviderPort" value="" style="ime-mode:disabled"/></td>
         </tr>
         <tr>
             <td colspan="4">
-                <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}">$i18n.get(
-                    "save")</a></div>
+                <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}">#springMessageText(
+                    "save","save")</a></div>
             </td>
         </tr>
     </table>
@@ -198,11 +213,11 @@
 
     function check() {
         if (byId('name').value.trim() == '') {
-            showAlert("$i18n.get("PleaseInput")$i18n.get("route.name")", 'name');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput")#springMessageText("route.name","route.name")", 'name');
             return false;
         }
         if (byId('service').value.trim() == '') {
-            showAlert("$i18n.get("PleaseInput", $i18n.get("service"))", 'service');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput")#springMessageText("service", "service")", 'service');
             return false;
         }
         if (byId('service').value.indexOf('*') != -1 || byId('service').value.indexOf(',') != -1) {
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/routes/edit.vm b/dubbo-admin/src/main/resources/templates/governance/screen/routes/edit.vm
similarity index 66%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/routes/edit.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/routes/edit.vm
index d6d57b2..b85445a 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/routes/edit.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/routes/edit.vm
@@ -1,42 +1,57 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../../routes"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
-            class="ico_font">$i18n.get("back")</span></a>
+            class="ico_font">#springMessageText("back", "back")</span></a>
     <span class="ico_line">|</span>
     <a href="../$route.id/routeselect"><img src="$rootContextPath.getURI("images/ico_show.png")" width="12"
-                                            height="12"/><span class="ico_font">$i18n.get("proview")</span></a>
+                                            height="12"/><span class="ico_font">#springMessageText("proview", "proview")</span></a>
     #if($currentUser.role != "G")
         <span class="ico_line">|</span>
         <a href="../$route.id"><img src="$rootContextPath.getURI("images/ico_show.png")" width="12" height="12"/><span
-                class="ico_font">$i18n.get("show")</span></a>
+                class="ico_font">#springMessageText("show", "show")</span></a>
         <span class="ico_line">|</span>
         <a href="../$route.id/edit?actionflag=copy"><img src="$rootContextPath.getURI("images/ico_register.png")"
-                                                         width="12" height="12"/><span class="ico_font">$i18n.get(
-            "copy")</span></a>
+                                                         width="12" height="12"/><span class="ico_font">#springMessageText(
+            "copy","copy")</span></a>
         <span class="ico_line">|</span>
         #if($route.enabled)
-            <a href="#" onclick="showConfirm('$i18n.get(
-                "confirm.disable")', '$route.name', '../$route.id/disable'); return false;">
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.disable","confirm.disable")', '$route.name', '../$route.id/disable'); return false;">
                 <img src="$rootContextPath.getURI("images/ico_disable.png")" width="13" height="13"/>
-                <span class="ico_font">$i18n.get("disable")</span></a>
+                <span class="ico_font">#springMessageText("disable", "disable")</span></a>
         #else
-            <a href="#" onclick="showConfirm('$i18n.get(
-                "confirm.enable")', '$route.name', '../$route.id/enable'); return false;">
+            <a href="#" onclick="showConfirm('#springMessageText(
+                "confirm.enable","confirm.enable")', '$route.name', '../$route.id/enable'); return false;">
                 <img src="$rootContextPath.getURI("images/ico_enable.png")" width="13" height="13"/>
-                <span class="ico_font">$i18n.get("enable")</span></a>
+                <span class="ico_font">#springMessageText("enable", "enable")</span></a>
         #end
         <span class="ico_line">|</span>
         <a href="#"
-           onclick="showConfirm('$i18n.get("confirm.delete")', '$route.name', '../$route.id/delete'); return false;">
+           onclick="showConfirm('#springMessageText("confirm.delete", "confirm.delete")', '$route.name', '../$route.id/delete'); return false;">
             <img src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/>
-            <span class="ico_font">$i18n.get("delete")</span></a>
+            <span class="ico_font">#springMessageText("delete", "delete")</span></a>
     #end
 </div>
 <br/>
-<form id="df" #if($actionflag=="copy") action="../../routes" #else action="../$route.id" #end onSubmit="return check();"
+<form id="df" #if($actionflag=="copy") action="update" #else action="update" #end onSubmit="return check();"
       method="POST">
     <table cellpadding="0" cellspacing="0" class="info">
         <tr>
-            <th width="100">$i18n.get("route.name"): <font color='red'>*</font></th>
+            <th width="100">#springMessageText("route.name", "route.name"): <font color='red'>*</font></th>
             <td colspan="2">
                 #if($actionflag=="copy")
                     <input type="text" id="name" name="name" maxlength="200" value=""/>
@@ -44,32 +59,32 @@
                     <input type="text" id="name" name="name" maxlength="200" value="$route.name"/>
                 #end
             </td>
-            <td><font color='blue'>$i18n.get("RouteNameTip")</font></td>
+            <td><font color='blue'>#springMessageText("RouteNameTip", "RouteNameTip")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("Priority"):</th>
+            <th>#springMessageText("Priority", "Priority"):</th>
             <td colspan="2">
                 <input type="text" id="priority" name="priority" value="#if($route)$route.priority#{else}0#end"
                        onkeydown="return checkNumber();"/>
             </td>
             <td>
-                <font color='blue'>$i18n.get("RoutePriorityTip")</font>
+                <font color='blue'>#springMessageText("RoutePriorityTip", "RoutePriorityTip")</font>
             </td>
         </tr>
         <tr>
-            <th>$i18n.get("service"): <font color='red'>*</font></th>
+            <th>#springMessageText("service", "service"): <font color='red'>*</font></th>
             <td colspan="2">
                 <input type="hidden" id="service" name="service" value="$service"/>$service
             </td>
             <td></td>
         </tr>
         <tr>
-            <th>$i18n.get("methodName"):</th>
+            <th>#springMessageText("methodName", "methodName"):</th>
             <td colspan="2">
                 <input type="text" id="method" name="method" value="$!method" style="ime-mode:disabled"/>
                 #if ($methods)
                     <select onchange="if (this.value != '') { if (byId('method').value == '') { byId('method').value = this.value; } else { byId('method').value = byId('method').value + ',' + this.value; } this.value = ''; }">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($m in $methods)
                             <option value="$m">$m</option>
                         #end
@@ -77,39 +92,39 @@
                 #end
             </td>
             <td>
-                <font color='blue'>$i18n.get("RouteMethodTip")<font>
+                <font color='blue'>#springMessageText("RouteMethodTip", "RouteMethodTip")<font>
             </td>
         </tr>
         <tr>
-            <th>$i18n.get("MatchRule")</th>
-            <th>$i18n.get("Match")</th>
-            <th>$i18n.get("Mismatch")</th>
-            <td><font color='blue'>$i18n.get("RouteMatchTip")</font></td>
+            <th>#springMessageText("MatchRule","MatchRule")</th>
+            <th>#springMessageText("Match", "Match")</th>
+            <th>#springMessageText("Mismatch", "Mismatch")</th>
+            <td><font color='blue'>#springMessageText("RouteMatchTip", "RouteMatchTip")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("ConsumerHost"):</th>
+            <th>#springMessageText("ConsumerHost", "ConsumerHost"):</th>
             <td><input type="text" id="consumerHost" name="consumerHost" value="$!consumerHost"
                        style="ime-mode:disabled"/></td>
             <td><input type="text" id="unconsumerHost" name="unconsumerHost" value="$!unconsumerHost"
                        style="ime-mode:disabled"/></td>
-            <td><font color="blue">$i18n.get("RouteHostTip")</font></td>
+            <td><font color="blue">#springMessageText("RouteHostTip", "RouteHostTip")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("ConsumerApplication"):</th>
+            <th>#springMessageText("ConsumerApplication", "ConsumerApplication"):</th>
             <td><input type="text" id="consumerApplication" name="consumerApplication" value="$!consumerApplication"
                        style="ime-mode:disabled"/></td>
             <td><input type="text" id="unconsumerApplication" name="unconsumerApplication"
                        value="$!unconsumerApplication" style="ime-mode:disabled"/></td>
-            <td><font color="blue">$i18n.get("RouteApplicationTip")</font></td>
+            <td><font color="blue">#springMessageText("RouteApplicationTip", "RouteApplicationTip")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("ConsumerCluster"):</th>
+            <th>#springMessageText("ConsumerCluster","ConsumerCluster"):</th>
             <td>
                 <input type="text" id="consumerCluster" name="consumerCluster" value="$!consumerCluster"
                        style="ime-mode:disabled"/>
                 #if ($clusterNames && $clusterNames.size() > 0)
                     <select onchange="if (this.value != '') { if (byId('consumerCluster').value == '') { byId('consumerCluster').value = this.value; } else { byId('consumerCluster').value = byId('consumerCluster').value + ',' + this.value; } this.value = ''; }">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($c in $clusterNames)
                             <option value="$c">$c</option>
                         #end
@@ -121,37 +136,37 @@
                        style="ime-mode:disabled"/>
                 #if ($clusterNames && $clusterNames.size() > 0)
                     <select onchange="if (this.value != '') { if (byId('unconsumerCluster').value == '') { byId('unconsumerCluster').value = this.value; } else { byId('unconsumerCluster').value = byId('unconsumerCluster').value + ',' + this.value; } this.value = ''; }">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($c in $clusterNames)
                             <option value="$c">$c</option>
                         #end
                     </select>
                 #end
             </td>
-            <td><font color="blue">$i18n.get("RouteClusterTip")</font></td>
+            <td><font color="blue">#springMessageText("RouteClusterTip", "RouteClusterTip")</font></td>
         </tr>
         <tr>
-            <th>$i18n.get("FilterRule")</th>
-            <th>$i18n.get("Match")</th>
-            <th>$i18n.get("Mismatch")</th>
-            <td><font color='blue'>$i18n.get("RouteFilterTip")</font></td>
+            <th>#springMessageText("FilterRule","FilterRule")</th>
+            <th>#springMessageText("Match", "Match")</th>
+            <th>#springMessageText("Mismatch", "Mismatch")</th>
+            <td><font color='blue'>#springMessageText("RouteFilterTip", "RouteFilterTip")</font></td>
         </tr>
         <tr id="host">
-            <th>$i18n.get("ProviderHost"):</th>
+            <th>#springMessageText("ProviderHost", "ProviderHost"):</th>
             <td><input type="text" id="providerHost" value="$!providerHost"
                        name="providerHost" style="ime-mode:disabled"/></td>
             <td><input type="text" id="unproviderHost" value="$!unproviderHost"
                        name="unproviderHost" style="ime-mode:disabled"/></td>
-            <td><font color="blue">$i18n.get("RouteHostTip")</font></td>
+            <td><font color="blue">#springMessageText("RouteHostTip", "RouteHostTip")</font></td>
         </tr>
         <tr id="cluster">
-            <th>$i18n.get("ProviderCluster"):</th>
+            <th>#springMessageText("ProviderCluster", "ProviderCluster"):</th>
             <td>
                 <input type="text" id="providerCluster" value="$!providerCluster" name="providerCluster"
                        style="ime-mode:disabled"/>
                 #if ($clusterNames && $clusterNames.size() > 0)
                     <select onchange="if (this.value != '') { if (byId('providerCluster').value == '') { byId('providerCluster').value = this.value; } else { byId('providerCluster').value = byId('providerCluster').value + ',' + this.value; } this.value = ''; }">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($c in $clusterNames)
                             <option value="$c">$c</option>
                         #end
@@ -163,17 +178,17 @@
                        style="ime-mode:disabled"/>
                 #if ($clusterNames && $clusterNames.size() > 0)
                     <select onchange="if (this.value != '') { if (byId('unproviderCluster').value == '') { byId('unproviderCluster').value = this.value; } else { byId('unproviderCluster').value = byId('unproviderCluster').value + ',' + this.value; } this.value = ''; }">
-                        <option value="">$i18n.get("Choose")</option>
+                        <option value="">#springMessageText("Choose", "Choose")</option>
                         #foreach ($c in $clusterNames)
                             <option value="$c">$c</option>
                         #end
                     </select>
                 #end
             </td>
-            <td><font color="blue">$i18n.get("RouteClusterTip")</font></td>
+            <td><font color="blue">#springMessageText("RouteClusterTip", "RouteClusterTip")</font></td>
         </tr>
         <tr id="protocol">
-            <th>$i18n.get("ProviderProtocol"):</th>
+            <th>#springMessageText("ProviderProtocol","ProviderProtocol"):</th>
             <td><input type="text" id="providerProtocol" value="$!providerProtocol"
                        name="providerProtocol" style="ime-mode:disabled"/></td>
             <td><input type="text" id="unproviderProtocol" value="$!unproviderProtocol"
@@ -181,7 +196,7 @@
             <td></td>
         </tr>
         <tr id="port">
-            <th>$i18n.get("ProviderPort"):</th>
+            <th>#springMessageText("ProviderPort","ProviderPort"):</th>
             <td><input type="text" id="providerPort" name="providerPort" value="$!providerPort"
                        style="ime-mode:disabled"/>
             </td>
@@ -190,8 +205,8 @@
         </tr>
         <tr>
             <td colspan="4">
-                <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}">$i18n.get(
-                    "save")</a></div>
+                <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}">#springMessageText(
+                    "save","save")</a></div>
             </td>
         </tr>
     </table>
@@ -201,11 +216,11 @@
 <script type="text/javascript">
     function check() {
         if (byId('name').value.trim() == '') {
-            showAlert("$i18n.get("PleaseInput", $i18n.get("route.name"))", 'name');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput"), #springMessageText("route.name","route.name"))", 'name');
             return false;
         }
         if (byId('service').value.trim() == '') {
-            showAlert("$i18n.get("PleaseInput", $i18n.get("service"))", 'service');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput"), #springMessageText("service", "service"))", 'service');
             return false;
         }
         if (byId('service').value.indexOf('*') != -1 || byId('service').value.indexOf(',') != -1) {
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/routes/index.vm b/dubbo-admin/src/main/resources/templates/governance/screen/routes/index.vm
new file mode 100644
index 0000000..2bed7ff
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/routes/index.vm
@@ -0,0 +1,122 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    #if($currentUser.role != "G")
+        <a href="routes/add"><img src="$rootContextPath.getURI("images/ico_add.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("add", "add")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.delete","confirm.batch.delete")', 'routes/' + getChecked('ids') + '/delete'); } return false;"><img
+                src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.delete", "batch.delete")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.enable","confirm.batch.enable")', 'routes/' + getChecked('ids') + '/enable');} return false;"><img
+                src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.enable", "batch.enable")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.disable","confirm.batch.delete")', 'routes/' + getChecked('ids') + '/disable');} return false;"><img
+                src="$rootContextPath.getURI("images/ico_disable.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.disable", "batch.disable")</span></a>
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th width="20"><input type="checkbox" onclick="checkAll('table_o', 'ids', this.checked)"/></th>
+        <th>#springMessageText("route.name", "route.name"): <input type="text" onkeyup="searchTable('table_o', 1, this.value);"
+                                            onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        #if(!$service)
+            <th>#springMessageText("ServiceName", "ServiceName"): <input type="text" onkeyup="searchTable('table_o', 2, this.value);"
+                                                 onclick="searchTable('table_o', 2, this.value);"/>&nbsp;<img
+                    src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+            <th width="50">#springMessageText("Priority", "Priority")</th>
+            <th width="100">#springMessageText("status", "status"): <select onchange="searchTable('table_o', 4, this.value);"
+                                                         onclick="searchTable('table_o', 4, this.value);">
+                <option value="">#springMessageText("all", "all")</option>
+                <option value="#springMessageText("enabled", "enabled")">#springMessageText("enabled", "enabled")</option>
+                <option value="#springMessageText("disabled", "disabled")">#springMessageText("disabled", "disabled")</option>
+            </select></th>
+        #else
+            <th width="50">#springMessageText("Priority", "Priority")</th>
+            <th width="100">#springMessageText("status", "status"): <select onchange="searchTable('table_o', 3, this.value);"
+                                                         onclick="searchTable('table_o', 3, this.value);">
+                <option value="">#springMessageText("all", "all")</option>
+                <option value="#springMessageText("enabled", "enabled")">#springMessageText("enabled", "enabled")</option>
+                <option value="#springMessageText("disabled", "disabled")">#springMessageText("disabled", "disabled")</option>
+            </select></th>
+        #end
+        <th width="340">#springMessageText("operation", "operation")</th>
+    </tr>
+    #foreach($route in $routes)
+        <tr>
+            <td><input type="checkbox" name="ids" value="$route.id"/></td>
+            <td><a href="routes/$route.id">$route.name</a></td>
+            #if(!$service)
+                <td><a href="services/$route.service/routes">$route.service</a></td>
+            #end
+            <td>$route.priority</td>
+            <td>
+                #if($route.enabled)
+                    <font color="green">#springMessageText("enabled", "enabled")</font>
+                #else
+                    <font color="red">#springMessageText("disabled", "disabled")</font>
+                #end
+            </td>
+            <td>
+                <a href="routes/$route.id/routeselect"><img src="$rootContextPath.getURI("images/ico_show.png")"
+                                                            width="12" height="12"/><span class="ico_font">#springMessageText(
+                    "proview","proview")</span></a>
+                #if($currentUser.role != "G")
+                    <span class="ico_line">|</span>
+                    <a href="routes/$route.id/edit"><img src="$rootContextPath.getURI("images/ico_edit.png")" width="12"
+                                                         height="12"/><span class="ico_font">#springMessageText(
+                        "edit","edit")</span></a>
+                    <span class="ico_line">|</span>
+                    <a href="routes/$route.id/edit?actionflag=copy"><img
+                            src="$rootContextPath.getURI("images/ico_register.png")" width="12" height="12"/><span
+                            class="ico_font">#springMessageText("copy", "copy")</span></a>
+                    <span class="ico_line">|</span>
+                    #if($route.enabled)
+                        <a href="#" onclick="showConfirm('#springMessageText(
+                            "confirm.disable","confirm.disable")', '$route.name', 'routes/$route.id/disable'); return false;">
+                            <img src="$rootContextPath.getURI("images/ico_disable.png")" width="13" height="13"/>
+                            <span class="ico_font">#springMessageText("disable", "disable")</span></a>
+                    #else
+                        <a href="#" onclick="showConfirm('#springMessageText(
+                            "confirm.enable","confirm.enable")', '$route.name', 'routes/$route.id/enable'); return false;">
+                            <img src="$rootContextPath.getURI("images/ico_enable.png")" width="13" height="13"/>
+                            <span class="ico_font">#springMessageText("enable", "enable")</span></a>
+                    #end
+                    <span class="ico_line">|</span>
+                    <a href="#" onclick="showConfirm('#springMessageText(
+                        "confirm.delete","confirm.delete")', '$route.name', 'routes/$route.id/delete'); return false;">
+                        <img src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/>
+                        <span class="ico_font">#springMessageText("delete", "delete")</span></a>
+                #end
+            </td>
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$routes.size()#springMessageText("page.records", "page.records") </div>
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/routes/preview.vm b/dubbo-admin/src/main/resources/templates/governance/screen/routes/preview.vm
new file mode 100644
index 0000000..f056ef8
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/routes/preview.vm
@@ -0,0 +1,29 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    <a href="routeselect"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
+            class="ico_font">$i18n.get("back")</span></a>
+</div><br>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th>$i18n.get("RouteResult")</th>
+    </tr>
+    #foreach($url in $resultController.entrySet())
+        <tr>
+            <td>$url.key?$url.value</td>
+        </tr>
+    #end
+</table>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/routes/routeselect.vm b/dubbo-admin/src/main/resources/templates/governance/screen/routes/routeselect.vm
similarity index 84%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/routes/routeselect.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/routes/routeselect.vm
index d69cf93..8ce5a8d 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/routes/routeselect.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/routes/routeselect.vm
@@ -1,3 +1,18 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../../routes"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
             class="ico_font">$i18n.get("back")</span></a>
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/routes/show.vm b/dubbo-admin/src/main/resources/templates/governance/screen/routes/show.vm
new file mode 100644
index 0000000..5b43466
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/routes/show.vm
@@ -0,0 +1,95 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    <a href="../routes"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("back", "back")</span></a>
+    <span class="ico_line">|</span>
+    <a href="$route.id/routeselect"><img src="$rootContextPath.getURI("images/ico_show.png")" width="12"
+                                         height="12"/><span class="ico_font">#springMessageText("proview", "proview")</span></a>
+    #if($currentUser.role != "G")
+        <span class="ico_line">|</span>
+        <a href="$route.id/edit"><img src="$rootContextPath.getURI("images/ico_edit.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("edit", "edit")</span></a>
+        <span class="ico_line">|</span>
+        <a href="$route.id/edit?actionflag=copy"><img src="$rootContextPath.getURI("images/ico_register.png")"
+                                                      width="12" height="12"/><span class="ico_font">#springMessageText(
+            "copy","copy")</span></a>
+        <span class="ico_line">|</span>
+        #if($route.enabled)
+            <a href="#"
+               onclick="showConfirm('#springMessageText("confirm.disable", "confirm.disable")', '$route.name', '$route.id/disable'); return false;">
+                <img src="$rootContextPath.getURI("images/ico_disable.png")" width="13" height="13"/>
+                <span class="ico_font">#springMessageText("disable", "disable")</span></a>
+        #else
+            <a href="#"
+               onclick="showConfirm('#springMessageText("confirm.enable", "confirm.enable")', '$route.name', '$route.id/enable'); return false;">
+                <img src="$rootContextPath.getURI("images/ico_enable.png")" width="13" height="13"/>
+                <span class="ico_font">#springMessageText("enable", "enable")</span></a>
+        #end
+        <span class="ico_line">|</span>
+        <a href="#"
+           onclick="showConfirm('#springMessageText("confirm.delete", "confirm.delete")', '$route.name', '$route.id/delete'); return false;">
+            <img src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/>
+            <span class="ico_font">#springMessageText("delete", "delete")</span></a>
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="info">
+    #if(! $service)
+        <tr>
+            <th style="width: 100px;">#springMessageText("service", "service"):</th>
+            <td>$!route.service</td>
+        </tr>
+    #end
+    <tr>
+        <th style="width: 100px;">#springMessageText("route.name", "route.name"):</th>
+        <td>$!route.name</td>
+    </tr>
+    <tr>
+        <th style="width: 100px;">#springMessageText("rule.match","rule.match"):</th>
+        <td>$!route.matchRule</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("rule.filtrate","rule.filtrate"):</th>
+        <td>$!route.filterRule</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("Priority", "Priority"):</th>
+        <td>$!route.priority</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("Username", "Username"):</th>
+        <td>$!route.username</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("created", "created"):</th>
+        <td>$tool.formatDate($!route.created)</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("modified", "modified"):</th>
+        <td>$tool.formatDate($!route.modified)</td>
+    </tr>
+    <tr>
+        <th>#springMessageText("status", "status"):</th>
+        <td>
+            #if($route.enabled)
+                <font color="green">#springMessageText("enabled", "enabled")</font>
+            #else
+                <font color="red">#springMessageText("disabled", "disabled")</font>
+            #end
+        </td>
+    </tr>
+</table>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/services/index.vm b/dubbo-admin/src/main/resources/templates/governance/screen/services/index.vm
new file mode 100644
index 0000000..e49d55a
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/services/index.vm
@@ -0,0 +1,169 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+#if(! $services || $services.size() == 0)
+<font color="red">#springMessageText("not.found", "not.found")</font> (<a href="services?keyword=*">#springMessageText("show.all", "show.all")</a>)
+#elseif($keyword && $services.size() == 1)
+<script type="text/javascript">
+        #if(! $providerServices.contains($services.iterator().next()))
+        window.location.href = "services/$services.iterator().next()/consumers";
+        #else
+        window.location.href = "services/$services.iterator().next()/providers";
+        #end
+</script>
+#else
+<div class="ico_btn">
+    #if($currentUser.role != "G")
+        #if($app)
+            <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+                "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+                "please.select","please.select")'); } else { showConfirm('#springMessageText(
+                "confirm.batch.force.mock","confirm.batch.force.mock")', 'services/0/shield?service=' + getChecked('ids'));} return false;"><img
+                    src="$rootContextPath.getURI("images/ico_disable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("batch.force.mock", "batch.force.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+                "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+                "please.select","please.select")'); } else { showConfirm('#springMessageText(
+                "confirm.batch.fail.mock","confirm.batch.fail.mock")', 'services/0/tolerant?service=' + getChecked('ids'));} return false;"><img
+                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("batch.fail.mock", "batch.fail.mock")</span></a>
+            <span class="ico_line">|</span>
+            <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+                "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+                "please.select","please.select")'); } else { showConfirm('#springMessageText(
+                "confirm.batch.fail.mock","confirm.batch.fail.mock")', 'services/0/recover?service=' + getChecked('ids'));} return false;"><img
+                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                    class="ico_font">#springMessageText("batch.cancel.mock", "batch.cancel.mock")</span></a>
+        #end
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th width="20"><input type="checkbox" onclick="checkAll('table_o', 'ids', this.checked)"/></th>
+        <th>#springMessageText("service", "service"):
+            <input type="text" onkeyup="searchTable('table_o', 0, this.value);"
+                   onclick="searchTable('table_o', 0, this.value);"/>&nbsp;<img
+                    src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/>
+        </th>
+        <th width="135">#springMessageText("status", "status"):
+        <select onchange="searchTable('table_o', 2, this.value);" onclick="searchTable('table_o', 2, this.value);">
+            <option value="">#springMessageText("all", "all")</option>
+            #if($app)
+                <option value="#springMessageText("provided", "provided")">#springMessageText("provided", "provided")</option>
+                <option value="#springMessageText("consumed", "consumed")">#springMessageText("consumed", "consumed")</option>
+            #else
+                <option value="#springMessageText("ok", "ok")">#springMessageText("ok", "ok")</option>
+                <option value="#springMessageText("no.provider", "no.provider")">#springMessageText("no.provider", "no.provider")</option>
+                <option value="#springMessageText("no.consumer", "no.consumer")">#springMessageText("no.consumer", "no.consumer")</option></select>
+            #end
+            </select></th>
+        #if($appj)
+            <th width="110">#springMessageText("mock", "mock"): <select onchange="searchTable('table_o', 3, this.value);"
+                                                       onclick="searchTable('table_o', 3, this.value);">
+                <option value="">#springMessageText("all", "all")</option>
+                <option value="#springMessageText("ok", "ok")">#springMessageText("ok", "ok")</option>
+                <option value="#springMessageText("force.mock", "force.mock")">#springMessageText("force.mock", "force.mock")</option>
+                <option value="#springMessageText("fail.mock", "fail.mock")">#springMessageText("fail.mock", "fail.mock")</option>
+            </select></th>
+            <th>#springMessageText("operation", "operation")</th>
+        #end
+    </tr>
+    #foreach($service in $services)
+        <tr>
+            <td><input type="checkbox" name="ids" value="$service"/></td>
+            <td>
+                #if(! $providerServices.contains($service))
+                    <a href="services/$service/consumers">$service</a>
+                #else
+                    <a href="services/$service/providers">$service</a>
+                #end
+            </td>
+            <td>
+                #if($app)
+                    #if($providerServices.contains($service))
+                        <font color="green">#springMessageText("provided", "provided")</font>
+                        #if($consumerServices.contains($service))
+                            &<font color="blue">#springMessageText("consumed", "consumed")</font>
+                        #end
+                    #elseif($consumerServices.contains($service))
+                        <font color="blue">#springMessageText("consumed", "consumed")</font>
+                    #end
+                #else
+                    #if(! $providerServices.contains($service))
+                        <font color="red">#springMessageText("no.provider", "no.provider")</font>
+                    #elseif(! $consumerServices.contains($service))
+                        <font color="blue">#springMessageText("no.consumer", "no.consumer")</font>
+                    #else
+                        <font color="green">#springMessageText("ok", "ok")</font>
+                    #end
+                #end
+            </td>
+            #if($app)
+                <td>
+                    #if($consumerServices.contains($service))
+                        #set($mock=$tool.getOverridesMock($overrides.get($app)))
+                        #if($mock == "force%3Areturn+null")
+                            <font color="red">#springMessageText("force.mocked", "force.mocked")</font>
+                        #elseif ($mock == "fail%3Areturn+null")
+                            <font color="blue">#springMessageText("fail.mocked", "fail.mocked")</font>
+                        #else
+                            <font color="gray">#springMessageText("no.mocked", "no.mocked")</font>
+                        #end
+                    #end
+                </td>
+                <td>
+                    #if($consumerServices.contains($service))
+                        #set($mock=$tool.getOverridesMock($overrides.get($app)))
+                        #if($mock == "force%3Areturn+null")
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.cancel.mock","confirm.cancel.mock")', 'services/0/recover?service=$service'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+                            <span class="ico_line">|</span>
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.fail.mock","confirm.fail.mock")', 'services/0/tolerant?service=$service'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+                        #elseif ($mock == "fail%3Areturn+null")
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.force.mock","confirm.force.mock")', 'services/0/shield?service=$service'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_disable.png")" width="12"
+                                    height="12"/><span class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+                            <span class="ico_line">|</span>
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.cancel.mock","confirm.cancel.mock")', 'services/0/recover?service=$service'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("cancel.mock", "cancel.mock")</span></a>
+                        #else
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.force.mock","confirm.force.mock")', 'services/0/shield?service=$service'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_disable.png")" width="12"
+                                    height="12"/><span class="ico_font">#springMessageText("force.mock", "force.mock")</span></a>
+                            <span class="ico_line">|</span>
+                            <a href="#" onclick="showConfirm('#springMessageText(
+                                "confirm.fail.mock","confirm.fail.mock")', 'services/0/tolerant?service=$service'); return false;"><img
+                                    src="$rootContextPath.getURI("images/ico_run.png")" width="12" height="12"/><span
+                                    class="ico_font">#springMessageText("fail.mock", "fail.mock")</span></a>
+                        #end
+                    #end
+                </td>
+            #end
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$services.size()#springMessageText("page.records", "page.records") </div>
+#end
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/services/search.vm b/dubbo-admin/src/main/resources/templates/governance/screen/services/search.vm
new file mode 100644
index 0000000..d9a652b
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/services/search.vm
@@ -0,0 +1,19 @@
+##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.
+#set($layout = "/templates/governance/layout/search.vm")
+[#foreach($service in $services)
+    #if ($velocityCount > 1),#end
+"$service"
+#end]
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/weights/add.vm b/dubbo-admin/src/main/resources/templates/governance/screen/weights/add.vm
similarity index 68%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/weights/add.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/weights/add.vm
index c38a960..7afce5e 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/weights/add.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/weights/add.vm
@@ -1,12 +1,27 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../weights"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
-            class="ico_font">$i18n.get("back")</span></a>
+            class="ico_font">#springMessageText("back", "back")</span></a>
 </div>
 <br/>
-<form id="df" action="../weights" method="POST">
+<form id="df" action="../weights/create" method="POST">
     <table cellpadding="0" cellspacing="0" class="info">
         <tr>
-            <th width="100">$i18n.get("service")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th width="100">#springMessageText("service", "service")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td width="300">
                 #if($service)
                     <input type="hidden" id="multiservice" name="service" value="$service"/>$service
@@ -14,7 +29,7 @@
                     <textarea id="service" name="multiservice" style="ime-mode:disabled" rows="2" cols="40"></textarea>
                     #if ($serviceList && $serviceList.size() > 0)
                         <select id="selectService" name="selectService" onchange="fnSetService(this)">
-                            <option value="">$i18n.get("Choose")</option>
+                            <option value="">#springMessageText("Choose", "Choose")</option>
                             #foreach ($s in $serviceList)
                                 <option value="$s">$tool.getSimpleName($s)</option>
                             #end
@@ -24,7 +39,7 @@
             </td>
         </tr>
         <tr>
-            <th style="width: 100px;">$i18n.get("provider"):&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th style="width: 100px;">#springMessageText("provider", "provider"):&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>
                 #if($address)
                     <input type="hidden" id="address" name="address"
@@ -33,25 +48,25 @@
                     <textarea id="address" name="address" rows="2" cols="40"></textarea>
                     #if ($addressList && $addressList.size() > 0)
                         <select id="selectAddeess" name="selectAddeess" onchange="fnSetAddress(this)">
-                            <option value="">$i18n.get("Choose")</option>
+                            <option value="">#springMessageText("Choose", "Choose")</option>
                             #foreach ($s in $addressList)
                                 <option value="$s">$tool.getHostPrefix($s)$s</option>
                             #end
                         </select>
                     #end
-                    <font color="blue">$i18n.get("BatchAddressTip")</font>
+                    <font color="blue">#springMessageText("BatchAddressTip", "BatchAddressTip")</font>
                 #end
             </td>
         </tr>
         <tr>
-            <th style="width: 100px;">$i18n.get("weights"):&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th style="width: 100px;">#springMessageText("weights", "weights"):&nbsp;&nbsp;<font color='red'>*</font></th>
             <td><input type="text" id="weight" name="weight" value="" maxlength="3" onkeydown="return checkNumber();"/>
             </td>
         </tr>
         <tr>
             <th>
-                <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}">$i18n.get(
-                    "save")</a></div>
+                <div class="btn"><a href="#" onclick="if(check()){document.getElementById('df').submit();}">#springMessageText(
+                    "save","save")</a></div>
             </th>
             <td></td>
         </tr>
@@ -97,12 +112,12 @@
     function check() {
         var service = byId('service').value.trim();
         if (service == '') {
-            showAlert("$i18n.get("PleaseInput", $i18n.get("service"))", 'service');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput"), #springMessageText("service", "service")", 'service');
             return false;
         }
         var address = byId('address').value.trim();
         if (address == '') {
-            showAlert("$i18n.get("PleaseInput", $i18n.get("address"))", 'address');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput"), #springMessageText("address", "address")", 'address');
             return false;
         }
         var exp = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]):\d+$/;
@@ -114,7 +129,7 @@
             var address = addresses[i];
             if (address != "") {
                 if (!address.match(exp) && !address.match(exp2) && !address.match(exp3) && !address.match(exp4)) {
-                    showAlert("$i18n.get("InvalidIp", $i18n.get("address"))", 'address');
+                    showAlert("#springMessageText("InvalidIp", "InvalidIp"), #springMessageText("address", "address")", 'address');
                     return false;
                 }
             }
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/weights/edit.vm b/dubbo-admin/src/main/resources/templates/governance/screen/weights/edit.vm
similarity index 66%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/weights/edit.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/weights/edit.vm
index 0e203eb..3a13ed6 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/weights/edit.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/weights/edit.vm
@@ -1,26 +1,46 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../../weights"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
-            class="ico_font">$i18n.get("back")</span></a>
+            class="ico_font">#springMessageText("back", "back")</span></a>
 </div>
 <br/>
-<form id="weightForm" #if($actionflag=="copy") action="../../weights" #else action="../$weight.id" #end method="POST">
+<form id="weightForm" action="../update" method="POST">
     <table cellpadding="0" cellspacing="0" class="info">
+        <tr type = "hidden">
+            <td>
+                <input type="hidden" name="id" value="$weight.id">
+            </td>
+        </tr>
         <tr>
-            <th width="100">$i18n.get("service")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th width="100">#springMessageText("service", "service")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>
                 $weight.service <input type="hidden" id="serviceName" name="service" value="$weight.service"
                                        style="ime-mode:disabled" maxlength="200"/>
             </td>
         </tr>
         <tr>
-            <th>$i18n.get("provider")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th>#springMessageText("provider", "provider")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>
                 #if($actionflag=="copy")
                     <input type="text" id="address" name="address" value="$!weight.address" style="ime-mode:disabled"
                            maxlength="200"/>
                     #if($service)
                         <select id="selectAddeess" name="selectAddeess" onchange="fnSetService(this,'address')">
-                            <option value="">$i18n.get("Choose")</option>
+                            <option value="">#springMessageText("Choose", "Choose")</option>
                             #if ($addressList && $addressList.size() > 0)
                                 #foreach ($s in $addressList)
                                     <option value="$s">$s</option>
@@ -36,7 +56,7 @@
             </td>
         </tr>
         <tr>
-            <th style="width: 100px;">$i18n.get("weights")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th style="width: 100px;">#springMessageText("weights", "weights")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>
                 <input type="text" id="weight" name="weight" value="$!weight.weight" maxlength="3"
                        onkeydown="return checkNumber();"/>
@@ -45,8 +65,8 @@
         <tr>
             <th>
                 <div class="btn"><a href="#"
-                                    onclick="if(check()){document.getElementById('weightForm').submit();}">$i18n.get(
-                    "save")</a></div>
+                                    onclick="if(check()){document.getElementById('weightForm').submit();}">#springMessageText(
+                    "save","save")</a></div>
             </th>
             <td></td>
         </tr>
@@ -83,12 +103,12 @@
     function check() {
         var serviceName = byId('serviceName').value.trim();
         if (serviceName == '') {
-            showAlert("$i18n.get("PleaseInput")$i18n.get("service")", 'serviceName');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput"), #springMessageText("service", "service")", 'serviceName');
             return false;
         }
         var address = byId('address').value.trim();
         if (address == '') {
-            showAlert("$i18n.get("PleaseInput", $i18n.get("address"))", 'address');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput"), #springMessageText("address", "address")", 'address');
             return false;
         }
         var exp = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]):\d+$/;
@@ -100,7 +120,7 @@
             var address = addresses[i];
             if (address != "") {
                 if (!address.match(exp) && !address.match(exp2) && !address.match(exp3) && !address.match(exp4)) {
-                    showAlert("$i18n.get("InvalidIp", $i18n.get("address"))", 'address');
+                    showAlert("#springMessageText("InvalidIp", "InvalidIp"), #springMessageText("address", "address")", 'address');
                     return false;
                 }
             }
diff --git a/dubbo-admin/src/main/resources/templates/governance/screen/weights/index.vm b/dubbo-admin/src/main/resources/templates/governance/screen/weights/index.vm
new file mode 100644
index 0000000..2aee5d6
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/weights/index.vm
@@ -0,0 +1,69 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
+<div class="ico_btn">
+    #if($currentUser.role != "G")
+        <a href="weights/add"><img src="$rootContextPath.getURI("images/ico_add.png")"
+                                                                     width="9" height="9"/><span
+                class="ico_font">#springMessageText("add", "add")</span></a>
+        <span class="ico_line">|</span>
+        <a href="#" onclick="if(! hasCheckbox('ids')) { showAlert('#springMessageText(
+            "empty.list","empty.list")'); } else if(! hasChecked('ids')) { showAlert('#springMessageText(
+            "please.select","please.select")'); } else { showConfirm('#springMessageText(
+            "confirm.batch.delete","confirm.batch.delete")', 'weights/' + getChecked('ids') + '/delete'); } return false;"><img
+                src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/><span
+                class="ico_font">#springMessageText("batch.delete", "batch.delete")</span></a>
+    #end
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th width="20"><input type="checkbox" onclick="checkAll('table_o', 'ids', this.checked)"/></th>
+        <th>#springMessageText("address", "address"): <input type="text" onkeyup="searchTable('table_o', 1, this.value);"
+                                         onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        #if(! $service)
+            <th>#springMessageText("service", "service"): <input type="text" onkeyup="searchTable('table_o', 2, this.value);"
+                                             onclick="searchTable('table_o', 2, this.value);"/>&nbsp;<img
+                    src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        #end
+        <th width="50">#springMessageText("weights", "weights")</th>
+        #if($currentUser.role != "G")
+            <th width="135">#springMessageText("operation", "operation")</th>#end
+    </tr>
+    #foreach($weight in $weights)
+        <tr>
+            <td><input type="checkbox" name="ids" value="$weight.id"/></td>
+            <td>$weight.address</td>
+            #if(! $service)
+                <td><a href="services/$weight.service/weights">$weight.service</a></td>
+            #end
+            <td>$weight.weight</td>
+            #if($currentUser.role != "G")
+                <td>
+                    <a href="weights/$weight.id/edit">
+                        <img src="$rootContextPath.getURI("images/ico_edit.png")" width="13" height="13"/>
+                        <span class="ico_font">#springMessageText("edit", "edit")</span></a>
+                    <span class="ico_line">|</span>
+                    <a href="#" onclick="showConfirm('#springMessageText(
+                        "confirm.delete","confirm.delete")', '$weight.address', 'weights/$weight.id/delete'); return false;">
+                        <img src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/>
+                        <span class="ico_font">#springMessageText("delete", "delete")</span></a>
+                </td>
+            #end
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$weights.size()#springMessageText("page.records", "page.records") </div>
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/weights/show.vm b/dubbo-admin/src/main/resources/templates/governance/screen/weights/show.vm
similarity index 50%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/weights/show.vm
rename to dubbo-admin/src/main/resources/templates/governance/screen/weights/show.vm
index 1851b79..05d2073 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/governance/screen/weights/show.vm
+++ b/dubbo-admin/src/main/resources/templates/governance/screen/weights/show.vm
@@ -1,35 +1,50 @@
+##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.
+#set($layout = "/templates/governance/layout/default.vm")
 <div class="ico_btn">
     <a href="../weights"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
-            class="ico_font">$i18n.get("back")</span></a>
+            class="ico_font">#springMessageText("back", "back")</span></a>
     #if($currentUser.role != "G")
         <span class="ico_line">|</span>
         <a href="$weight.id/edit">
             <img src="$rootContextPath.getURI("images/ico_edit.png")" width="13" height="13"/>
-            <span class="ico_font">$i18n.get("edit")</span></a>
+            <span class="ico_font">#springMessageText("edit", "edit")</span></a>
         <span class="ico_line">|</span>
-        <a href="#" onclick="showConfirm('$i18n.get(
-            "confirm.delete")', '$weight.address', '$weight.id/delete'); return false;"><img
+        <a href="#" onclick="showConfirm('#springMessageText(
+            "confirm.delete","confirm.delete")', '$weight.address', '$weight.id/delete'); return false;"><img
                 src="$rootContextPath.getURI("images/ico_delete.png")" width="12" height="12"/><span
-                class="ico_font">$i18n.get("delete")</span></a>
+                class="ico_font">#springMessageText("delete", "delete")</span></a>
     #end
 </div>
 <br/>
 <form id="weightForm" action="../$weight.id" method="POST">
     <table cellpadding="0" cellspacing="0" class="info">
         <tr>
-            <th style="width: 100px;">$i18n.get("service")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th style="width: 100px;">#springMessageText("service", "service")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>
                 $weight.service
             </td>
         </tr>
         <tr>
-            <th style="width: 100px;">$i18n.get("provider")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th style="width: 100px;">#springMessageText("provider", "provider")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>
                 $weight.address
             </td>
         </tr>
         <tr>
-            <th style="width: 100px;">$i18n.get("weights")&nbsp;&nbsp;<font color='red'>*</font></th>
+            <th style="width: 100px;">#springMessageText("weights", "weights")&nbsp;&nbsp;<font color='red'>*</font></th>
             <td>
                 $weight.weight
             </td>
@@ -50,12 +65,12 @@
     function check() {
         var serviceName = byId('serviceName').value.trim();
         if (serviceName == '') {
-            showAlert("$i18n.get("PleaseInput", $i18n.get("service"))", 'serviceName');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput") #springMessageText("service", "service")", 'serviceName');
             return false;
         }
         var consumerAddress = byId('consumerAddress').value.trim();
         if (consumerAddress == '') {
-            showAlert("$i18n.get("PleaseInput", $i18n.get("ConsumerAddress"))", 'consumerAddress');
+            showAlert("#springMessageText("PleaseInput", "PleaseInput") #springMessageText("ConsumerAddress", "ConsumerAddress")", 'consumerAddress');
             return false;
         }
         var exp = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
@@ -65,7 +80,7 @@
             var address = addresses[i];
             if (address != "") {
                 if (!address.match(exp) && !address.match(exp2)) {
-                    showAlert("$i18n.get("InvalidIp", $i18n.get("ConsumerAddress"))", 'consumerAddress');
+                    showAlert("#springMessageText("InvalidIp", "InvalidIp") #springMessageText("ConsumerAddress", "ConsumerAddress")", 'consumerAddress');
                     return false;
                 }
             }
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/home/control/menu.vm b/dubbo-admin/src/main/resources/templates/home/control/menu.vm
similarity index 65%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/home/control/menu.vm
rename to dubbo-admin/src/main/resources/templates/home/control/menu.vm
index 16dd95a..d3f8365 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/home/control/menu.vm
+++ b/dubbo-admin/src/main/resources/templates/home/control/menu.vm
@@ -1,3 +1,18 @@
+##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.
+#set($lang = $request.getParameter("lang"))
 <div class="head" style="color: white;">
     <table cellpadding="0" cellspacing="0" border="0" height="78" width="100%">
         <tr>
@@ -26,34 +41,36 @@
                         <td>
                             <div id="showLanguage" style="display: ; text-decoration: underline;"
                                  onmouseover="byId('showLanguage').style.display = 'none'; byId('chooseLanguage').style.display = ''; byId('selectLanguage').focus();">
-                                #if($language == "en")
+                                #if(!$lang || $lang == "zh")
+                                    简体中文
+                                #end
+                                #if($lang == "en")
                                     English
-                                #elseif($language == "zh_TW")
+                                #elseif($lang == "zh_TW")
                                     繁體中文
                                 #else
-                                    简体中文
                                 #end
                             </div>
                             <div id="chooseLanguage" style="display: none;">
                                 <select id="selectLanguage"
-                                        onchange="setCookie('locale', this.value);window.location.reload();"
+                                        onchange="setCookie('locale', this.value);addParameter(window.location.href, this.value)"
                                         onblur="byId('showLanguage').style.display = ''; byId('chooseLanguage').style.display = 'none';">
-                                    <option value="en" #if($language == "en")selected="selected"#end>English</option>
-                                    <option value="zh" #if($language == "zh")selected="selected"#end>简体中文</option>
-                                    <option value="zh_TW" #if($language == "zh_TW")selected="selected"#end>繁體中文</option>
+                                    <option value="en" #if($lang == "en")selected="selected"#end>English</option>
+                                    <option value="zh" #if($lang == "zh" || !$lang)selected="selected"#end>简体中文</option>
+                                    <option value="zh_TW" #if($lang == "zh_TW")selected="selected"#end>繁體中文</option>
                                 </select>
                             </div>
                         </td>
                         <td style="padding-left: 10px;"><img src="$rootContextPath.getURI("images/ico_user.png")"
                                                              width="14" height="14" border="0"/></td>
                         <td>
-                            #if($currentUser.name)$currentUser.name#else$currentUser.username#end, $i18n.get("welcome")
+                            #if($currentUser.name)$currentUser.name#else$currentUser.username#end, #springMessageText("welcome", "welcome")
                         </td>
                         <td style="padding-left: 10px;"><img src="$rootContextPath.getURI("images/exit.png")" width="14"
                                                              height="19" border="0"/></td>
-                        <td><a href="#" onclick="showConfirm('$i18n.get("confirm.logout")', '$i18n.get(
-                            "current.user"): $currentUser.Name', '$bucLogoutAddress'); return false;"
-                               style="color: white;">$i18n.get("logout")</a></td>
+                        <td><a href="#" onclick="showConfirm('#springMessageText("confirm.logout", "confirm.logout")', '#springMessageText(
+                            "current.user","current.user"): $currentUser.Name', '/logout'); return false;"
+                               style="color: white;">#springMessageText("logout", "logout")</a></td>
                     </tr>
                 </table>
             </td>
@@ -62,49 +79,49 @@
 </div>
 <div class="nav">
     <ul>
-        <li id="unique_tab1"><a href="$rootContextPath.getURI("/")">$i18n.get("home")</a></li>
-        <li id="unique_tab2" class="sub_nav"><a href="#" onclick="return false;" style="cursor:default;">$i18n.get(
-            "governance")</a>
+        <li id="unique_tab1"><a href="$rootContextPath.getURI("/")">#springMessageText("home", "home")</a></li>
+        <li id="unique_tab2" class="sub_nav"><a href="#" onclick="return false;" style="cursor:default;">#springMessageText(
+            "governance","governance")</a>
             <ul>
                 #if($tool.checkUrl($currentUser,"/governance/services"))
-                    <li><a href="$rootContextPath.getURI("/governance/services")">$i18n.get("services")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/governance/services")">#springMessageText("services", "services")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/governance/applications"))
-                    <li><a href="$rootContextPath.getURI("/governance/applications")">$i18n.get("applications")</a>
+                    <li><a href="$rootContextPath.getURI("/governance/applications")">#springMessageText("applications", "applications")</a>
                     </li>#end
                 #if($tool.checkUrl($currentUser,"/governance/addresses"))
-                    <li><a href="$rootContextPath.getURI("/governance/addresses")">$i18n.get("addresses")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/governance/addresses")">#springMessageText("addresses", "addresses")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/governance/providers"))
-                    <li><a href="$rootContextPath.getURI("/governance/providers")">$i18n.get("providers")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/governance/providers")">#springMessageText("providers", "providers")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/governance/consumers"))
-                    <li><a href="$rootContextPath.getURI("/governance/consumers")">$i18n.get("consumers")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/governance/consumers")">#springMessageText("consumers", "consumers")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/governance/routes"))
-                    <li><a href="$rootContextPath.getURI("/governance/routes")">$i18n.get("routes")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/governance/routes")">#springMessageText("routes", "routes")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/governance/overrides"))
-                    <li><a href="$rootContextPath.getURI("/governance/overrides")">$i18n.get("overrides")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/governance/overrides")">#springMessageText("overrides", "overrides")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/governance/accesses"))
-                    <li><a href="$rootContextPath.getURI("/governance/accesses")">$i18n.get("accesses")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/governance/accesses")">#springMessageText("accesses", "accesses")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/governance/weights"))
-                    <li><a href="$rootContextPath.getURI("/governance/weights")">$i18n.get("weights")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/governance/weights")">#springMessageText("weights", "weights")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/governance/loadbalances"))
-                    <li><a href="$rootContextPath.getURI("/governance/loadbalances")">$i18n.get("loadbalances")</a>
+                    <li><a href="$rootContextPath.getURI("/governance/loadbalances")">#springMessageText("loadbalances", "loadbalances")</a>
                     </li>#end
                 #if($tool.checkUrl($currentUser,"/governance/owners"))
-                    <li><a href="$rootContextPath.getURI("/governance/owners")">$i18n.get("owners")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/governance/owners")">#springMessageText("owners", "owners")</a></li>#end
             </ul>
         </li>
-        <li id="unique_tab3" class="sub_nav"><a href="#" onclick="return false;" style="cursor:default;">$i18n.get(
-            "system.management")</a>
+        <li id="unique_tab3" class="sub_nav"><a href="#" onclick="return false;" style="cursor:default;">#springMessageText(
+            "system.management","system.management")</a>
             <ul>
                 #if($tool.checkUrl($currentUser,"/sysinfo/versions"))
-                    <li><a href="$rootContextPath.getURI("/sysinfo/versions")">$i18n.get("versions")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/sysinfo/versions")">#springMessageText("versions", "versions")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/sysinfo/dumps"))
-                    <li><a href="$rootContextPath.getURI("/sysinfo/dumps")">$i18n.get("dumps")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/sysinfo/dumps")">#springMessageText("dumps", "dumps")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/sysinfo/statuses"))
-                    <li><a href="$rootContextPath.getURI("/sysinfo/statuses")">$i18n.get("statuses")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/sysinfo/statuses")">#springMessageText("statuses", "statuses")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/sysinfo/logs"))
-                    <li><a href="$rootContextPath.getURI("/sysinfo/logs")">$i18n.get("logs")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/sysinfo/logs")">#springMessageText("logs", "logs")</a></li>#end
                 #if($tool.checkUrl($currentUser,"/sysinfo/envs"))
-                    <li><a href="$rootContextPath.getURI("/sysinfo/envs")">$i18n.get("envs")</a></li>#end
+                    <li><a href="$rootContextPath.getURI("/sysinfo/envs")">#springMessageText("envs", "envs")</a></li>#end
             </ul>
         </li>
     </ul>
@@ -112,7 +129,7 @@
         <table>
             <tr>
                 <td><img src="$rootContextPath.getURI("images/ico_help.png")" width="14" height="14" border="0"/></td>
-                <td><a href="$helpUrl" target="_blank">$i18n.get("help")</a></td>
+                <td><a href="$helpUrl" target="_blank">#springMessageText("help", "help")</a></td>
             </tr>
         </table>
     </div>
diff --git a/dubbo-admin/src/main/resources/templates/home/screen/ajax.vm b/dubbo-admin/src/main/resources/templates/home/screen/ajax.vm
new file mode 100644
index 0000000..ff0bc3b
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/home/screen/ajax.vm
@@ -0,0 +1,15 @@
+##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.
+no data
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/home/screen/index.vm b/dubbo-admin/src/main/resources/templates/home/screen/index.vm
similarity index 64%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/home/screen/index.vm
rename to dubbo-admin/src/main/resources/templates/home/screen/index.vm
index 0d4ca96..6970ebc 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/home/screen/index.vm
+++ b/dubbo-admin/src/main/resources/templates/home/screen/index.vm
@@ -1,11 +1,25 @@
+##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.
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <title>Dubbo Admin</title>
 
-    <link type="text/css" href="$rootContextPath.getURI("css/common.css")" rel="stylesheet"/>
-    <link type="text/css" href="$rootContextPath.getURI("css/skin.css")" rel="stylesheet"/>
+    <link type="text/css" href="/css/common.css" rel="stylesheet"/>
+    <link type="text/css" href="/css/skin.css" rel="stylesheet"/>
     <link type="text/css" href="$rootContextPath.getURI("css/dubbo.css")" rel="stylesheet"/>
     <script type="text/javascript" src="$rootContextPath.getURI("js/ajax.js")"></script>
     <script type="text/javascript" src="$rootContextPath.getURI("js/box.js")"></script>
@@ -49,14 +63,13 @@
                                     style="cursor: pointer;" width="20" height="20"/></td>
             </tr>
             <tr height="100">
-                <td align="right"><span id="alertText" style="font-size: 32px;">$i18n.get(
-                    "please.input")</span><br/><span id="alertData" style="font-size: 12px;"></span></td>
+                <td align="right"><span id="alertText" style="font-size: 32px;">#springMessageText("please.input", "please.input")</span><br/><span id="alertData" style="font-size: 12px;"></span></td>
                 <td></td>
             </tr>
             <tr>
                 <td align="right">
-                    <div class="btn_info" style="float: right; clear: left;"><a href="#" onclick="alertOK();">$i18n.get(
-                        "confirm")</a></div>
+                    <div class="btn_info" style="float: right; clear: left;"><a href="#" onclick="alertOK();">#springMessageText(
+                        "confirm", "confirm")</a></div>
                 </td>
                 <td></td>
             </tr>
@@ -72,48 +85,49 @@
                                     style="cursor: pointer;" width="20" height="20"/></td>
             </tr>
             <tr height="120">
-                <td align="right"><span id="confirmText" style="font-size: 32px;">$i18n.get("confirm")</span><br/><span
+                <td align="right"><span id="confirmText" style="font-size: 32px;">#springMessageText("confirm", "confirm")</span><br/><span
                         id="confirmData" style="font-size: 12px;"></span></td>
                 <td></td>
             </tr>
             <tr>
                 <td align="right">
                     <div class="btn_info" style="float: right; clear: left;"><a href="#"
-                                                                                onclick="confirmCancel();">$i18n.get(
-                        "cancel")</a></div>&nbsp;&nbsp;&nbsp;&nbsp;<div class="btn_info"
+                                                                                onclick="confirmCancel();">#springMessageText(
+                        "cancel", "cancel")</a></div>&nbsp;&nbsp;&nbsp;&nbsp;<div class="btn_info"
                                                                         style="float: right; clear: left;"><a href="#"
-                                                                                                              onclick="confirmOK();">$i18n.get(
-                    "confirm")</a></div>
+                                                                                                              onclick="confirmOK();">#springMessageText(
+                    "confirm", "confirm")</a></div>
                 </td>
                 <td></td>
             </tr>
         </table>
     </div>
-        $control.setTemplate("home:menu.vm")
+        #parse("/templates/home/control/menu.vm")
+##        $control.setTemplate("home:menu.vm")
     <script language="javascript">setActiveTab(1);</script>
 
     <input type="hidden" name="searchName" id="searchName" value="1"/>
     <input id="providerId" name="providerId" value="" type="hidden"/>
 
     <div class="main">
-        <div class="title"><h2>$i18n.get("search")</h2></div>
-        <div class="crumbs">$i18n.get("home") &gt; $i18n.get("search")</div>
+        <div class="title"><h2>#springMessageText("addresses", "addresses")</h2></div>
+        <div class="crumbs">#springMessageText("home", "home") &gt; #springMessageText("addresses", "addresses")</div>
         <!--
  <div class="favorite">
  <div id="Tab2" class="fav_tab">
    <ul>
-    <li class="active" id="two1" onclick="setTab('two',1,2)"><a href="#">$i18n.get("favorites")</a></li>
-    <li id="two2" onclick="setTab('two',2,2)"><a href="#">$i18n.get("histories")</a></li>
+    <li class="active" id="two1" onclick="setTab('two',1,2)"><a href="#">#springMessageText("favorites", "favorites")</a></li>
+    <li id="two2" onclick="setTab('two',2,2)"><a href="#">#springMessageText("histories", "histories")</a></li>
    </ul>
  </div>
  <div class="fav_box" id="fav_box">
     <div id="con_two_1">
      <div class="fav_box_title">
       <div class="fav_title_left">
-       <a onclick="fnSelectAll()"><input name="favoritesAll" type="checkbox" value="" class="checkbox"/> <span>$i18n.get(
-            "select.all")</span></a>
+       <a onclick="fnSelectAll()"><input name="favoritesAll" type="checkbox" value="" class="checkbox"/> <span>#springMessageText(
+            "select.all","select.all")</span></a>
        <a onclick="fnDeleteAll()"><img src="$rootContextPath.getURI(
-            "images/ico_delete.png")" width="13" height="13"/><span>$i18n.get("delete")</span></a>
+            "images/ico_delete.png")" width="13" height="13"/><span>#springMessageText("delete", "delete")</span></a>
       </div>
        <a href="#" onclick="fnFolder()"><img src="$rootContextPath.getURI("images/fav_arrow.png")" width="14" height="15" class="fav_arrow"/></a>
      </div>
@@ -142,11 +156,11 @@
         <div class="search" id="Tab1">
             <div class="search_categories">
                 <ul>
-                    <li id="one1" onclick="setTab2('one',1,3); return false;" class="active"><a href="#">$i18n.get(
-                        "service")</a><span class="search_line">|</span></li>
-                    <li id="one2" onclick="setTab2('one',2,3); return false;"><a href="#">$i18n.get(
-                        "application")</a><span class="search_line">|</span></li>
-                    <li id="one3" onclick="setTab2('one',3,3); return false;"><a href="#">$i18n.get("address")</a><span
+                    <li id="one1" onclick="setTab2('one',1,3); return false;" class="active"><a href="#">#springMessageText(
+                        "service", "service")</a><span class="search_line">|</span></li>
+                    <li id="one2" onclick="setTab2('one',2,3); return false;"><a href="#">#springMessageText(
+                        "application", "application")</a><span class="search_line">|</span></li>
+                    <li id="one3" onclick="setTab2('one',3,3); return false;"><a href="#">#springMessageText("address", "address")</a><span
                             class="search_line_end">|</span></li>
                 </ul>
             </div>
@@ -169,16 +183,16 @@
             <table id="serviceCompletion" style="margin-top: 20px;">
                 #if($currentUser.role != "G")
                     <tr>
-                        <th>$i18n.get("add"):</th>
+                        <th>#springMessageText("add", "add"):</th>
                         <td style="padding-left: 10px;">
-                            <a href="$rootContextPath.getURI("governance/providers/add")">$i18n.get("providers")</a>&nbsp;
-                            <a href="$rootContextPath.getURI("governance/routes/add")">$i18n.get("routes")</a>&nbsp;
-                            <a href="$rootContextPath.getURI("governance/overrides/add")">$i18n.get("overrides")</a>&nbsp;
-                            <a href="$rootContextPath.getURI("governance/accesses/add")">$i18n.get("accesses")</a>&nbsp;
-                            <a href="$rootContextPath.getURI("governance/weights/add")">$i18n.get("weights")</a>&nbsp;
-                            <a href="$rootContextPath.getURI("governance/loadbalances/add")">$i18n.get(
-                                "loadbalances")</a>&nbsp;
-                            <a href="$rootContextPath.getURI("governance/owners/add")">$i18n.get("owners")</a>&nbsp;
+                            <a href="$rootContextPath.getURI("governance/providers/add")">#springMessageText("providers", "providers")</a>&nbsp;
+                            <a href="$rootContextPath.getURI("governance/routes/add")">#springMessageText("routes", "routes")</a>&nbsp;
+                            <a href="$rootContextPath.getURI("governance/overrides/add")">#springMessageText("overrides", "overrides")</a>&nbsp;
+                            <a href="$rootContextPath.getURI("governance/accesses/add")">#springMessageText("accesses", "accesses")</a>&nbsp;
+                            <a href="$rootContextPath.getURI("governance/weights/add")">#springMessageText("weights", "weights")</a>&nbsp;
+                            <a href="$rootContextPath.getURI("governance/loadbalances/add")">#springMessageText(
+                                "loadbalances", "loadbalances")</a>&nbsp;
+                            <a href="$rootContextPath.getURI("governance/owners/add")">#springMessageText("owners", "owners")</a>&nbsp;
                         </td>
                     </tr>
                     <tr>
@@ -187,12 +201,12 @@
                     </tr>
                 #end
                 <tr>
-                    <th>$i18n.get("stat"):</th>
+                    <th>#springMessageText("stat","stat"):</th>
                     <td style="padding-left: 10px;">
-                        $i18n.get("serviceNum"):$services &nbsp;
-                        $i18n.get("applicationNum"):$applications &nbsp;
-                        $i18n.get("providerNum"):$providers &nbsp;
-                        $i18n.get("consumerNum"):$consumers &nbsp;
+                        #springMessageText("serviceNum","serviceNum"):$services &nbsp;
+                        #springMessageText("applicationNum","applicationNum"):$applications &nbsp;
+                        #springMessageText("providerNum", "providerNum"):$providers &nbsp;
+                        #springMessageText("consumerNum", "consumerNum"):$consumers &nbsp;
                     </td>
                 </tr>
             </table>
@@ -209,9 +223,9 @@
             var searchContent = document.getElementById('searchContent');
             var keyword = searchContent.value;
             if (keyword == ''
-                    || keyword == '$i18n.get("please.input.service")'
-                    || keyword == '$i18n.get("please.input.application")'
-                    || keyword == '$i18n.get("please.input.address")') {
+                    || keyword == '#springMessageText("please.input.service", "please.input.service")'
+                    || keyword == '#springMessageText("please.input.application", "please.input.application")'
+                    || keyword == '#springMessageText("please.input.address", "please.input.address")') {
                 keyword = '*';
             }
             window.location.href = '$rootContextPath.getURI("governance")/' + searchType + '?keyword=' + keyword;
@@ -224,19 +238,19 @@
             }
             var msg = "";
             if (cursel == 1) {
-                msg = '$i18n.get("please.input.service")';
+                msg = '#springMessageText("please.input.service", "please.input.service")';
                 searchType = "services";
             } else if (cursel == 2) {
-                msg = '$i18n.get("please.input.application")';
+                msg = '#springMessageText("please.input.application", "please.input.application")';
                 searchType = "applications";
             } else if (cursel == 3) {
-                msg = '$i18n.get("please.input.address")';
+                msg = '#springMessageText("please.input.address", "please.input.address")';
                 searchType = "addresses";
             }
 
-            if (obj.value == '' || obj.value == '$i18n.get("please.input.service")'
-                    || obj.value == '$i18n.get("please.input.application")'
-                    || obj.value == '$i18n.get("please.input.address")') {
+            if (obj.value == '' || obj.value == '#springMessageText("please.input.service", "please.input.service")'
+                    || obj.value == '#springMessageText("please.input.application", "please.input.application")'
+                    || obj.value == '#springMessageText("please.input.address", "please.input.address")') {
                 obj.value = msg;
             }
             obj.setAttribute("onfocus", "fnonfocus('" + msg + "')");
@@ -246,9 +260,9 @@
         }
         function fnonfocus() {
             var obj = document.getElementById('searchContent');
-            if (obj.value == '$i18n.get("please.input.service")'
-                    || obj.value == '$i18n.get("please.input.application")'
-                    || obj.value == '$i18n.get("please.input.address")') {
+            if (obj.value == '#springMessageText("please.input.service", "please.input.service")'
+                    || obj.value == '#springMessageText("please.input.application", "please.input.application")'
+                    || obj.value == '#springMessageText("please.input.address", "please.input.address")') {
                 obj.value = '';
             }
         }
@@ -256,11 +270,11 @@
             var obj = document.getElementById('searchContent');
             if (obj.value == '') {
                 if (searchType == 'services')
-                    obj.value = '$i18n.get("please.input.service")';
+                    obj.value = '#springMessageText("please.input.service", "please.input.service")';
                 else if (searchType == 'applications')
-                    obj.value = '$i18n.get("please.input.application")';
+                    obj.value = '#springMessageText("please.input.application", "please.input.application")';
                 else if (searchType == 'addresses')
-                    obj.value = '$i18n.get("please.input.address")';
+                    obj.value = '#springMessageText("please.input.address", "please.input.address")';
             }
         }
     </script>
diff --git a/dubbo-admin/src/main/resources/templates/home/screen/services.vm b/dubbo-admin/src/main/resources/templates/home/screen/services.vm
new file mode 100644
index 0000000..63192d7
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/home/screen/services.vm
@@ -0,0 +1,26 @@
+##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.
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <title>Dubbo Registry</title>
+    <script type="text/javascript">
+        window.location.href = '/';
+    </script>
+</head>
+<body>
+</body>
+</html>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/layout/default.vm b/dubbo-admin/src/main/resources/templates/sysinfo/layout/default.vm
similarity index 66%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/layout/default.vm
rename to dubbo-admin/src/main/resources/templates/sysinfo/layout/default.vm
index db29144..5e18d04 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/layout/default.vm
+++ b/dubbo-admin/src/main/resources/templates/sysinfo/layout/default.vm
@@ -1,4 +1,18 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+##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.
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
@@ -17,38 +31,39 @@
     <script type="text/javascript" src="$rootContextPath.getURI("js/dubbo.js")"></script>
 </head>
 <body onload="init();">
-    $control.setTemplate("home:menu.vm")
+##    $control.setTemplate("home:menu.vm")
+    #parse("/templates/home/control/menu.vm")
 <script language="javascript">setActiveTab(3);</script>
 <div class="dubbo_search dubbo_search_nobox">
     <div class="title title_search">
         <h2>
             #if($_method == "index")
-                $i18n.get("sysinfo.$_type")
+                #springMessageText("sysinfo.$_type", "sysinfo.$_type")
             #else
-                $i18n.get($_method)
+                #springMessageText($_method, $_method)
             #end
         </h2>
     </div>
     <div class="crumbs">
-        <a href="$rootContextPath.getURI("/")">$i18n.get("home")</a> &gt; $i18n.get("system.management")
+        <a href="$rootContextPath.getURI("/")">#springMessageText("home", "home")</a> &gt; #springMessageText("system.management", "system.management")
         #if($service)
             &gt; <a href="../../#if($_method == "show" || $_method == "add")../#elseif($_method ==
-            "edit")../../#{end}services">$i18n.get("services")</a>
+            "edit")../../#{end}services">#springMessageText("services", "services")</a>
             &gt; $service
-        #elseif($application)
+        #elseif($app)
             &gt; <a href="../../#if($_method == "show" || $_method == "add")../#elseif($_method ==
-            "edit")../../#{end}applications">$i18n.get("applications")</a>
-            &gt; $application
+            "edit")../../#{end}applications">#springMessageText("applications", "applications")</a>
+            &gt; $app
         #elseif($address)
             &gt; <a href="../../#if($_method == "show" || $_method == "add")../#elseif($_method ==
-            "edit")../../#{end}addresses">$i18n.get("addresses")</a>
+            "edit")../../#{end}addresses">#springMessageText("addresses", "addresses")</a>
             &gt; $address
         #end
         #if($_method == "index")
-            &gt; $i18n.get("sysinfo.$_type")
+            &gt; #springMessageText("sysinfo.$_type", "sysinfo.$_type")
         #else
-            &gt; <a href="../$_type">$i18n.get("sysinfo.$_type")</a>
-            &gt; #if($id)$id &gt;#end $i18n.get($_method)
+            &gt; <a href="../$_type">#springMessageText("sysinfo.$_type", "sysinfo.$_type")</a>
+            &gt; #if($id)$id &gt;#end #springMessageText($_method, $_method)
         #end
     </div>
 </div>
@@ -61,14 +76,14 @@
                     #if($tool.checkUrl($currentUser,"/sysinfo/$tab"))
                         <li id="$tab"#if($_type == $tab) class="active"#else style="color: white;"#end
                             onclick="window.location.href='$rootContextPath.getURI(
-                                "/sysinfo/$tab")';">$i18n.get($tab)</li>
+                                "/sysinfo/$tab")';">#springMessageText($tab, $tab)</li>
                     #end
                 #end
             </ul>
         </div>
         <div class="contentbox_tab">
             <div id="con_two_1">
-                $screen_placeholder
+                $screen_content
             </div>
         </div>
     </div>
@@ -84,7 +99,7 @@
         </tr>
         <tr height="120">
             <td align="right">
-                <span id="alertText" style="font-size: 32px;">$i18n.get("please.input")</span>
+                <span id="alertText" style="font-size: 32px;">#springMessageText("please.input", "please.input")</span>
                 <br/><span id="alertData" style="font-size: 12px;"></span>
             </td>
             <td></td>
@@ -92,7 +107,7 @@
         <tr>
             <td align="right">
                 <div class="btn_info" style="float: right; clear: left;">
-                    <a href="#" onclick="alertOK();">$i18n.get("confirm")</a>
+                    <a href="#" onclick="alertOK();">#springMessageText("confirm", "confirm")</a>
                 </div>
             </td>
             <td></td>
@@ -110,7 +125,7 @@
         </tr>
         <tr height="120">
             <td align="right">
-                <span id="confirmText" style="font-size: 32px;">$i18n.get("confirm")</span>
+                <span id="confirmText" style="font-size: 32px;">#springMessageText("confirm", "confirm")</span>
                 <br/>
                 <span id="confirmData" style="font-size: 12px;"></span>
             </td>
@@ -119,10 +134,10 @@
         <tr>
             <td align="right">
                 <div class="btn_info" style="float: right; clear: left;">
-                    <a href="#" onclick="confirmCancel();">$i18n.get("cancel")</a>
+                    <a href="#" onclick="confirmCancel();">#springMessageText("cancel", "cancel")</a>
                 </div>
                 &nbsp;&nbsp;&nbsp;&nbsp;<div class="btn_info" style="float: right; clear: left;">
-                <a href="#" onclick="confirmOK();">$i18n.get("confirm")</a>
+                <a href="#" onclick="confirmOK();">#springMessageText("confirm", "confirm")</a>
             </div>
             </td>
             <td></td>
diff --git a/dubbo-admin/src/main/resources/templates/sysinfo/layout/redirect.vm b/dubbo-admin/src/main/resources/templates/sysinfo/layout/redirect.vm
new file mode 100644
index 0000000..91700d2
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/sysinfo/layout/redirect.vm
@@ -0,0 +1,29 @@
+##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.
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <title>dubbo</title>
+    <link type="text/css" href="$rootContextPath.getURI("css/common.css")" rel="stylesheet"/>
+    <link type="text/css" href="$rootContextPath.getURI("css/skin.css")" rel="stylesheet"/>
+    <link type="text/css" href="$rootContextPath.getURI("css/dubbo.css")" rel="stylesheet"/>
+    <script type="text/javascript" src="$rootContextPath.getURI("js/box.js")"></script>
+</head>
+<body>
+    $screen_placeholder
+</body>
+</html>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/sysinfo/layout/search.vm b/dubbo-admin/src/main/resources/templates/sysinfo/layout/search.vm
new file mode 100644
index 0000000..30c0a04
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/sysinfo/layout/search.vm
@@ -0,0 +1,15 @@
+##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.
+$screen_placeholder
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/sysinfo/screen/dumps/index.vm b/dubbo-admin/src/main/resources/templates/sysinfo/screen/dumps/index.vm
new file mode 100644
index 0000000..8648ff9
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/sysinfo/screen/dumps/index.vm
@@ -0,0 +1,76 @@
+##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.
+#set($layout = "/templates/sysinfo/layout/default.vm")
+<div class="ico_btn">
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th>#springMessageText("property.name", "property.name"): <input type="text" onkeyup="searchTable('table_o', 0, this.value);"
+                                               onclick="searchTable('table_o', 0, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        <th>#springMessageText("property.count", "property.count")</th>
+    </tr>
+    <tr>
+        <td>
+            #springMessageText("noProvider", "noProvider")
+        </td>
+        <td>
+            <a herf="#" onclick="window.open('$rootContextPath.getURI("/sysinfo/dump/noProviders")')">#springMessageText(
+                "property.count","property.count")
+                ($noProviderServices.size())</a>
+        </td>
+    </tr>
+    <tr>
+        <td>
+            #springMessageText("services", "services")
+        </td>
+        <td>
+            <a herf="#" onclick="window.open('$rootContextPath.getURI("/sysinfo/dump/services")')">#springMessageText(
+                "property.count","property.count")
+                ($services.size())</a>
+        </td>
+    </tr>
+    <tr>
+        <td>
+            #springMessageText("providers", "providers")
+        </td>
+        <td>
+            <a herf="#" onclick="window.open('$rootContextPath.getURI("/sysinfo/dump/providers")')">#springMessageText(
+                "property.count","property.count")
+                ($providers.size())</a>
+        </td>
+    </tr>
+    <tr>
+        <td>
+            #springMessageText("consumers", "consumers")
+        </td>
+        <td>
+            <a herf="#" onclick="window.open('$rootContextPath.getURI("/sysinfo/dump/consumers")')">#springMessageText(
+                "property.count","property.count")
+                ($consumers.size())</a>
+        </td>
+    </tr>
+    <tr>
+        <td>
+            #springMessageText("versions", "versions")
+        </td>
+        <td>
+            #set ($client=$providers.size()+$consumers.size())
+            <a herf="#" onclick="window.open('$rootContextPath.getURI("/sysinfo/dump/versions")')">#springMessageText(
+                "property.count","property.count")($client)</a>
+        </td>
+    </tr>
+</table>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/sysinfo/screen/envs/index.vm b/dubbo-admin/src/main/resources/templates/sysinfo/screen/envs/index.vm
new file mode 100644
index 0000000..fb78d32
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/sysinfo/screen/envs/index.vm
@@ -0,0 +1,35 @@
+##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.
+#set($layout = "/templates/sysinfo/layout/default.vm")
+<div class="ico_btn">
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th width="140">#springMessageText("property.name", "property.name"): <input type="text" style="width: 60px;"
+                                                           onkeyup="searchTable('table_o', 0, this.value);"
+                                                           onclick="searchTable('table_o', 0, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        <th>#springMessageText("property.value", "property.value"): <input type="text" onkeyup="searchTable('table_o', 1, this.value);"
+                                                onclick="searchTable('table_o', 1, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+    </tr>
+    #foreach($entry in $properties.entrySet())
+        <tr>
+            <td>#springMessageText($entry.key, $entry.key)</td>
+            <td>$entry.value</td>
+        </tr>
+    #end
+</table>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/screen/logs/index.vm b/dubbo-admin/src/main/resources/templates/sysinfo/screen/logs/index.vm
similarity index 53%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/screen/logs/index.vm
rename to dubbo-admin/src/main/resources/templates/sysinfo/screen/logs/index.vm
index 1eaca6c..4a00104 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/screen/logs/index.vm
+++ b/dubbo-admin/src/main/resources/templates/sysinfo/screen/logs/index.vm
@@ -1,3 +1,18 @@
+##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.
+#set($layout = "/templates/sysinfo/layout/default.vm")
 <div class="ico_btn">
     #if($currentUser.role == "R")
         <select id="logLevel" name="logLevel" onchange="changeLevel(this.value);">
@@ -9,10 +24,10 @@
             <option value="ERROR" #if($level == "ERROR")selected="selected"#end>ERROR</option>
             <option value="OFF" #if($level == "OFF")selected="selected"#end>OFF</option>
         </select>
-        <a href="#" onclick="showConfirm('$i18n.get(
-            "logs.confirmChangeLogLevel")', '/sysinfo/logs/change?level=' + document.getElementById('logLevel').value);">
+        <a href="#" onclick="showConfirm('#springMessageText(
+            "logs.confirmChangeLogLevel","logs.confirmChangeLogLevel")', '/sysinfo/logs/change?level=' + document.getElementById('logLevel').value);">
             <img src="$rootContextPath.getURI("images/ico_enable.png")" width="12" height="12"/><span
-                class="ico_font">$i18n.get("change.log.level")</span>
+                class="ico_font">#springMessageText("change.log.level", "change.log.level")</span>
         </a>
     #end
 </div>
@@ -20,8 +35,8 @@
 <table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
     <tr>
         <th>
-            $i18n.get("logs.file"): $name ($i18n.get("logs.size"): $size / $i18n.get(
-            "logs.modify"): $modified) $i18n.get("logs.level"): $level
+            #springMessageText("logs.file", "logs.file"): $name (#springMessageText("logs.size", "logs.size"): $size / #springMessageText(
+            "logs.modify","logs.modify"): $modified) #springMessageText("logs.level", "logs.level"): $level
             : <input type="text" onkeyup="searchTable('table_o', 0, this.value);"
                      onclick="searchTable('table_o', 0, this.value);"/>&nbsp;<img
                 src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/>
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/screen/redirect.vm b/dubbo-admin/src/main/resources/templates/sysinfo/screen/redirect.vm
similarity index 75%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/screen/redirect.vm
rename to dubbo-admin/src/main/resources/templates/sysinfo/screen/redirect.vm
index c64a86f..f9352f8 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/screen/redirect.vm
+++ b/dubbo-admin/src/main/resources/templates/sysinfo/screen/redirect.vm
@@ -1,3 +1,17 @@
+##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.
 <div id="alertBox" style="display: none; position: absolute; left: 200px; top: 200px; width: 720px; height: 300px;">
     <table style="background-image: url('#if($success)$rootContextPath.getURI(
         "images/tip_succeed.png")#else$rootContextPath.getURI("images/tip_del.png")#end');" width="720" height="300">
diff --git a/dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/screen/socketConn.vm b/dubbo-admin/src/main/resources/templates/sysinfo/screen/socketConn.vm
similarity index 88%
rename from dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/screen/socketConn.vm
rename to dubbo-admin/src/main/resources/templates/sysinfo/screen/socketConn.vm
index b7af1b7..36bcb98 100644
--- a/dubbo-admin/src/main/webapp/WEB-INF/templates/sysinfo/screen/socketConn.vm
+++ b/dubbo-admin/src/main/resources/templates/sysinfo/screen/socketConn.vm
@@ -1,3 +1,17 @@
+##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.
 $control.setTemplate("home:menu.vm")
 <script language="javascript">setActiveTab(2);</script>
 
diff --git a/dubbo-admin/src/main/resources/templates/sysinfo/screen/statuses/index.vm b/dubbo-admin/src/main/resources/templates/sysinfo/screen/statuses/index.vm
new file mode 100644
index 0000000..d88d0bc
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/sysinfo/screen/statuses/index.vm
@@ -0,0 +1,59 @@
+##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.
+#set($layout = "/templates/sysinfo/layout/default.vm")
+<div class="ico_btn">
+    <a href="../status" target="_blank"><img src="$rootContextPath.getURI("images/ico_run.png")" width="12"
+                                             height="12"/><span class="ico_font">#springMessageText("summary", "summary")</span></a>
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th width="140">#springMessageText("status.resourcename", "status.resourcename"): <input type="text" style="width: 60px;"
+                                                                 onkeyup="searchTable('table_o', 0, this.value);"
+                                                                 onclick="searchTable('table_o', 0, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        <th width="100">#springMessageText("status.status", "status.status"): <select onchange="searchTable('table_o', 1, this.value);"
+                                                            onclick="searchTable('table_o', 1, this.value);">
+            <option value="">#springMessageText("all", "all")</option>
+            <option value="#springMessageText("status.OK", "status.OK")">#springMessageText("status.OK", "status.OK")</option>
+            <option value="#springMessageText("status.WARN", "status.WARN")">#springMessageText("status.WARN", "status.WARN")</option>
+            <option value="#springMessageText("status.ERROR", "status.ERROR")">#springMessageText("status.ERROR", "status.ERROR")</option>
+        </select></th>
+        <th width="50%">#springMessageText("status.message", "status.message"): <input type="text" onkeyup="searchTable('table_o', 2, this.value);"
+                                                            onclick="searchTable('table_o', 2, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        <th>#springMessageText("status.description","status.description")</th>
+    </tr>
+    #foreach($status in $statusList.entrySet())
+        <tr>
+            <td>#springMessageText("status.${status.key}Status","status.${status.key}Status")</td>
+            <td>
+                #if($status.value.level == "OK")
+                <font color="green">
+                #elseif($status.value.level == "WARN")
+                <font color="orange">
+                #elseif($status.value.level == "ERROR")
+                <font color="red">
+                #else
+                <font color="gray">
+                #end
+                #springMessageText("status.$status.value.level","status.$status.value.level")
+            </font>
+            </td>
+            <td>$tool.unescape($status.value.message)</td>
+            <td>#springMessageText("status.${status.key}StatusDesc", "status.${status.key}StatusDesc")</td>
+        </tr>
+    #end
+</table>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/resources/templates/sysinfo/screen/versions/index.vm b/dubbo-admin/src/main/resources/templates/sysinfo/screen/versions/index.vm
new file mode 100644
index 0000000..c253187
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/sysinfo/screen/versions/index.vm
@@ -0,0 +1,35 @@
+##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.
+#set($layout = "/templates/sysinfo/layout/default.vm")
+<div class="ico_btn">
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th>#springMessageText("versions", "versions"): <input type="text" onkeyup="searchTable('table_o', 0, this.value);"
+                                          onclick="searchTable('table_o', 0, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+        <th>#springMessageText("applications", "applications")</th>
+    </tr>
+    #foreach($version in $versions.entrySet())
+        <tr>
+            <td>
+                <a href="version/$version.key/versions/show">$version.key</a>
+            </td>
+            <td>$version.value.size()</td>
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$versions.size()#springMessageText("page.records", "page.records")</div>
diff --git a/dubbo-admin/src/main/resources/templates/sysinfo/screen/versions/show.vm b/dubbo-admin/src/main/resources/templates/sysinfo/screen/versions/show.vm
new file mode 100644
index 0000000..f2f3589
--- /dev/null
+++ b/dubbo-admin/src/main/resources/templates/sysinfo/screen/versions/show.vm
@@ -0,0 +1,38 @@
+##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.
+#set($layout = "/templates/sysinfo/layout/default.vm")
+<div class="ico_btn">
+    <a href="../../../versions"><img src="$rootContextPath.getURI("images/ico_back.png")" width="12" height="12"/><span
+            class="ico_font">#springMessageText("back", "back")</span></a>
+</div>
+<br/>
+<table cellpadding="0" cellspacing="0" class="list list_dubbo" id="table_o">
+    <tr>
+        <th>#springMessageText("applications", "applications"): <input type="text" onkeyup="searchTable('table_o', 0, this.value);"
+                                              onclick="searchTable('table_o', 0, this.value);"/>&nbsp;<img
+                src="$rootContextPath.getURI("images/ico_search.png")" width="12" height="12"/></th>
+    </tr>
+    #foreach($app in $applications)
+        <tr>
+            <td>
+                #if($app) $app
+                #else
+                <无应用名>
+                #end
+            </td>
+        </tr>
+    #end
+</table>
+<div class="page">#springMessageText("page.total", "page.total")$applications.size()#springMessageText("page.records", "page.records")</div>
diff --git a/dubbo-admin/src/main/webapp/META-INF/autoconf/auto-config.xml b/dubbo-admin/src/main/webapp/META-INF/autoconf/auto-config.xml
deleted file mode 100644
index 30e6371..0000000
--- a/dubbo-admin/src/main/webapp/META-INF/autoconf/auto-config.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<config description="Dubbo Registry Configurations">
-
-    <group name="web">
-        <property name="dubbo.governance.webx.server.host" defaultValue="dubbo.com" description="服务器域名地址"/>
-
-        <property name="dubbo.governance.webx.loggingRoot" defaultValue="${dubbo.governance.output}/logs"
-                  description="日志文件根目录"/>
-        <property name="dubbo.governance.webx.loggingLevel" defaultValue="ERROR" description="以何种级别记录日志"/>
-
-        <property name="dubbo.governance.dragoon.app.name" description="Dragoon App Name需要个armory上的应用名相同"/>
-
-    </group>
-
-    <group name="governance">
-        <property name="dubbo.governance.console.port" defaultValue="8080" description="Web服务器端口"/>
-        <property name="dubbo.governance.server.adress" defaultValue=""
-                  description="注册中心Server地址,如2.2.2.2:9090,3.3.3.3:9090"/>
-    </group>
-
-    <group name="dubbo.registry.database">
-        <property name="dubbo.registry.database.url"
-                  defaultValue="jdbc:wrap-jdbc:filters=default:name=com.alibaba.dragoon.master:jdbc:mysql://localhost/dubbo_registry"
-                  description="数据库URL,格式:jdbc:mysql://ip:port/dbname"/>
-        <property name="dubbo.registry.database.username" defaultValue="dubbo_registry" description="数据库用户名"/>
-        <property name="dubbo.registry.database.password" description="数据库密码"/>
-        <property name="dubbo.registry.database.pool" defaultValue="druid" description="数据库连接池类型,可选druid、c3p0和dbcp"/>
-        <property name="dubbo.registry.database.initial.size" defaultValue="0" description="数据库连接池初始连接数"/>
-        <property name="dubbo.registry.database.increment.size" defaultValue="5" description="数据库连接不够时,每次增长的连接数"/>
-        <property name="dubbo.registry.database.min.size" defaultValue="0" description="数据库连接池最小连接数,低于这个数的空闲连接不会被回收"/>
-        <property name="dubbo.registry.database.max.size" defaultValue="50" description="数据库连接池最大连接数,大于将等待,直到超时报错"/>
-        <property name="dubbo.registry.database.max.idle.time" defaultValue="180000"
-                  description="数据库连接最大空闲时间(毫秒),超时将回收关闭,为0表示不限制"/>
-        <property name="dubbo.registry.database.max.active.time" defaultValue="300000"
-                  description="数据库连接最大持续运行时间(毫秒),需大于最大事务所需时间,超出表示连接泄漏或死锁,将强行释放,为0表示不限制"/>
-        <property name="dubbo.registry.database.max.wait.time" defaultValue="10000"
-                  description="获取数据库连接最大等待时间(毫秒),为0表示无限等待可用连接"/>
-        <property name="dubbo.registry.database.retry.interval" defaultValue="500"
-                  description="在最大等待时间内,获取数据库连接失败重试间隔(毫秒),dbcp采用事件通知方式不需要此配置"/>
-        <property name="dubbo.registry.database.test.interval" defaultValue="30000" description="测试数据库连接是否可用间隔(毫秒)"/>
-    </group>
-    <script>
-        <generate template="web.xml.vm" destfile="WEB-INF/web.xml" charset="UTF-8"/>
-        <generate template="log4j.xml" destfile="WEB-INF/log4j.xml" charset="UTF-8"/>
-        <generate template="resources.xml" destfile="WEB-INF/common/resources.xml" charset="UTF-8"/>
-        <generate template="dubbo.properties.vm" destfile="WEB-INF/classes/dubbo.properties" charset="UTF-8"/>
-    </script>
-</config>
diff --git a/dubbo-admin/src/main/webapp/META-INF/autoconf/dubbo.properties.vm b/dubbo-admin/src/main/webapp/META-INF/autoconf/dubbo.properties.vm
deleted file mode 100644
index 07f8a53..0000000
--- a/dubbo-admin/src/main/webapp/META-INF/autoconf/dubbo.properties.vm
+++ /dev/null
@@ -1,21 +0,0 @@
-dubbo.governance.webx.loggingLevel=${dubbo_governance_webx_loggingLevel}
-dubbo.governance.webx.loggingRoot=${dubbo_governance_webx_loggingRoot}
-
-dubbo.governance.console.port=${dubbo_governance_console_port}
-
-dubbo.governance.server.adress=${dubbo_governance_server_adress}
-
-dubbo.registry.allow.no.database=false
-dubbo.registry.database.url=${dubbo_registry_database_url}
-dubbo.registry.database.username=${dubbo_registry_database_username}
-dubbo.registry.database.password=${dubbo_registry_database_password}
-dubbo.registry.database.pool=${dubbo_registry_database_pool}
-dubbo.registry.database.initial.size=${dubbo_registry_database_initial_size}
-dubbo.registry.database.increment.size=${dubbo_registry_database_increment_size}
-dubbo.registry.database.min.size=${dubbo_registry_database_min_size}
-dubbo.registry.database.max.size=${dubbo_registry_database_max_size}
-dubbo.registry.database.max.idle.time=${dubbo_registry_database_max_idle_time}
-dubbo.registry.database.max.active.time=${dubbo_registry_database_max_active_time}
-dubbo.registry.database.max.wait.time=${dubbo_registry_database_max_wait_time}
-dubbo.registry.database.retry.interval=${dubbo_registry_database_retry_interval}
-dubbo.registry.database.test.interval=${dubbo_registry_database_test_interval}
diff --git a/dubbo-admin/src/main/webapp/META-INF/autoconf/log4j.xml b/dubbo-admin/src/main/webapp/META-INF/autoconf/log4j.xml
deleted file mode 100644
index 63d97a8..0000000
--- a/dubbo-admin/src/main/webapp/META-INF/autoconf/log4j.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
-        <param name="target" value="System.out"/>
-        <param name="encoding" value="GBK"/>
-        <layout class="org.apache.log4j.PatternLayout">
-            <param name="ConversionPattern" value="%5p %c{2} - %m%n"/>
-        </layout>
-    </appender>
-    <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
-        <param name="file" value="${dubbo_governance_webx_loggingRoot}/dubbo-governance.log"/>
-        <param name="append" value="true"/>
-        <param name="maxFileSize" value="10MB"/>
-        <param name="maxBackupIndex" value="100"/>
-        <layout class="org.apache.log4j.PatternLayout">
-            <param name="ConversionPattern" value="%d [%t] %-5p %C{6} (%F:%L) - %m%n"/>
-        </layout>
-    </appender>
-
-
-    <appender name="EXCEPTION_LOG" class="com.alibaba.dragoon.patrol.log4j.PatrolLog4jAppender">
-        <param name="Threshold" value="ERROR"/>
-    </appender>
-
-    <logger name="org.apache">
-        <level value="ERROR"/>
-    </logger>
-    <root>
-        <level value="INFO"/>
-        <appender-ref ref="STDOUT"/>
-        <appender-ref ref="FILE"/>
-        <appender-ref ref="EXCEPTION_LOG"/>
-    </root>
-</log4j:configuration>
\ No newline at end of file
diff --git a/dubbo-admin/src/main/webapp/META-INF/autoconf/resources.xml b/dubbo-admin/src/main/webapp/META-INF/autoconf/resources.xml
deleted file mode 100644
index ba253aa..0000000
--- a/dubbo-admin/src/main/webapp/META-INF/autoconf/resources.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<beans:beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-             xmlns:services="http://www.alibaba.com/schema/services"
-             xmlns:res-loaders="http://www.alibaba.com/schema/services/resource-loading/loaders"
-             xmlns:beans="http://www.springframework.org/schema/beans"
-             xsi:schemaLocation="http://www.alibaba.com/schema/services http://localhost:8080/schema/services.xsd
-
-        http://www.alibaba.com/schema/services/resource-loading/loaders http://localhost:8080/schema/services-resource-loading-loaders.xsd
-        http://www.springframework.org/schema/beans http://localhost:8080/schema/www.springframework.org/schema/beans/spring-beans.xsd">
-
-    <services:resource-loading xmlns="http://www.alibaba.com/schema/services">
-
-        <resource-alias pattern="/" name="/webroot"/>
-
-        <!-- 子模块模板目录:/*/templates -->
-        <!-- 全局模板目录: /*/templates/global -->
-        <resource-alias pattern="/*/templates/global" name="/webroot/common/templates"/>
-
-        <!-- 配置文件根目录:/conf -->
-        <resource-alias pattern="/conf" name="/webroot/WEB-INF"/>
-
-        <!-- 内部资源 -->
-        <resource pattern="/webroot" internal="true">
-            <res-loaders:webapp-loader/>
-        </resource>
-        <resource pattern="/classpath" internal="true">
-            <res-loaders:classpath-loader/>
-        </resource>
-
-        <resource-alias pattern="/templates" name="/webroot/WEB-INF/templates"/>
-    </services:resource-loading>
-
-    <beans:bean xmlns="http://www.springframework.org/schema/beans"
-                id="messageSource"
-                class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
-        <beans:property name="basenames">
-            <beans:list>
-                <beans:value>/WEB-INF/i18n/message</beans:value>
-            </beans:list>
-        </beans:property>
-        <beans:property name="cacheSeconds" value="3"/>
-        <beans:property name="fallbackToSystemLocale" value="false"/>
-        <beans:property name="defaultEncoding" value="GBK"/>
-    </beans:bean>
-</beans:beans>
diff --git a/dubbo-admin/src/main/webapp/META-INF/autoconf/web.xml.vm b/dubbo-admin/src/main/webapp/META-INF/autoconf/web.xml.vm
deleted file mode 100644
index d02621c..0000000
--- a/dubbo-admin/src/main/webapp/META-INF/autoconf/web.xml.vm
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
-
-    <!-- Webx Logging Settings -->
-    <context-param>
-        <param-name>loggingRoot</param-name>
-        <param-value>$dubbo_governance_webx_loggingRoot</param-value>
-    </context-param>
-    <context-param>
-        <param-name>loggingLevel</param-name>
-        <param-value>$dubbo_governance_webx_loggingLevel</param-value>
-    </context-param>
-    <context-param>
-        <param-name>loggingCharset</param-name>
-        <param-value>UTF-8</param-value>
-    </context-param>
-
-    <!-- BUC Settings -->
-    <context-param>
-        <param-name>APP_NAME</param-name>
-        <param-value>dubbo</param-value>
-    </context-param>
-
-    <!-- Draoon App Name -->
-    <context-param>
-        <param-name>APP_NUM</param-name>
-        <param-value>$dubbo_governance_dragoon_app_name</param-value>
-    </context-param>
-
-    <context-param>
-        <param-name>USER_COOKIE_HANDLER</param-name>
-        <!-- 用户可扩展的userCookieHandler -->
-        <param-value>com.alibaba.dubbo.governance.web.common.interceptor.BucCookieHandler</param-value>
-    </context-param>
-
-    <context-param>
-        <param-name>SSO_LOGIN_URL</param-name><!-- sso login page url -->
-        <param-value>http://login.alibaba-inc.com/ssoLogin.htm</param-value>
-    </context-param>
-    <context-param>
-        <param-name>SSO_LOGOUT_URL</param-name><!-- sso logout page url -->
-        <param-value>http://login.alibaba-inc.com/ssoLogout.htm</param-value>
-    </context-param>
-    <context-param>
-        <param-name>SSO_TOKEN_API</param-name><!-- sso server token api -->
-        <param-value>http://login.alibaba-inc.com/rpc/sso/renewToken.json</param-value>
-    </context-param>
-    <context-param>
-        <param-name>EXCLUSIONS</param-name><!-- url that excluded -->
-        <param-value>
-            /sendBucSSOToken,/bucSSOLogout,/login.htm,/logout.htm,/images*,/css*,/js*,/reg,/lookup,/unreg,/unregister,/unregisterall,/status,/status/*,/register,/disable,*.ico,/rpc/*,/sysinfo/dump/*
-        </param-value>
-    </context-param>
-
-    <!-- BUC -->
-    <filter>
-        <filter-name>ssoFilter</filter-name><!-- buc sso filter -->
-        <filter-class>com.alibaba.buc.sso.client.filter.SSOFilter</filter-class>
-    </filter>
-
-    <filter-mapping>
-        <filter-name>ssoFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-    </filter-mapping>
-
-    <servlet>
-        <servlet-name>BucSSOTokenHandlerServlet</servlet-name>
-        <!-- 写token入cookie的servlet -->
-        <servlet-class>com.alibaba.buc.sso.client.servlet.SSOTokenHandlerServlet</servlet-class>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-
-    <servlet>
-        <servlet-name>BucSSOLogoutServlet</servlet-name>
-        <!-- sso logout的servlet -->
-        <servlet-class>com.alibaba.buc.sso.client.servlet.SSOLogoutServlet</servlet-class>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-
-    <!-- dragoon -->
-    <listener>
-        <listener-class>com.alibaba.dragoon.patrol.web.PatrolServletContextListener</listener-class>
-    </listener>
-    <listener>
-        <listener-class>com.alibaba.dragoon.client.DragoonClientServletContextListener</listener-class>
-    </listener>
-
-    <!-- Logger -->
-    <listener>
-        <listener-class>com.alibaba.citrus.logconfig.LogConfiguratorListener</listener-class>
-    </listener>
-
-    <!-- Loading /WEB-INF/webx.xml, /WEB-INF/webx-*.xml -->
-    <listener>
-        <listener-class>com.alibaba.citrus.webx.context.WebxContextLoaderListener</listener-class>
-    </listener>
-
-    <filter>
-        <filter-name>mdc</filter-name>
-        <filter-class>com.alibaba.citrus.webx.servlet.SetLoggingContextFilter</filter-class>
-    </filter>
-
-    <filter>
-        <filter-name>webx</filter-name>
-        <filter-class>com.alibaba.citrus.webx.servlet.WebxFrameworkFilter</filter-class>
-        <init-param>
-            <param-name>excludes</param-name>
-            <param-value>*.css, *.js, *.jpg, *.gif, *.png, *.jpeg,/sendBucSSOToken,/bucSSOLogout</param-value>
-        </init-param>
-    </filter>
-
-    <servlet-mapping>
-        <servlet-name>BucSSOTokenHandlerServlet</servlet-name>
-        <url-pattern>/sendBucSSOToken</url-pattern>
-    </servlet-mapping>
-
-    <servlet-mapping>
-        <servlet-name>BucSSOLogoutServlet</servlet-name>
-        <url-pattern>/bucSSOLogout</url-pattern>
-    </servlet-mapping>
-
-    <filter-mapping>
-        <filter-name>mdc</filter-name>
-        <url-pattern>/*</url-pattern>
-    </filter-mapping>
-
-    <filter-mapping>
-        <filter-name>webx</filter-name>
-        <url-pattern>/*</url-pattern>
-    </filter-mapping>
-
-    <welcome-file-list>
-        <welcome-file>index.html</welcome-file>
-        <welcome-file>index.jsp</welcome-file>
-    </welcome-file-list>
-
-</web-app>
diff --git a/dubbo-admin/src/main/webapp/SpryAssets/SpryValidationRadio.css b/dubbo-admin/src/main/webapp/SpryAssets/SpryValidationRadio.css
deleted file mode 100644
index d88a47a..0000000
--- a/dubbo-admin/src/main/webapp/SpryAssets/SpryValidationRadio.css
+++ /dev/null
@@ -1,25 +0,0 @@
-@charset "UTF-8";
-
-/* SpryValidationRadio.css - version 0.1 - Spry Pre-Release 1.6.1 */
-
-/* Copyright (c) 2007. Adobe Systems Incorporated. All rights reserved. */
-
-/* These are the classes applied on the messages
- * (required message and invalid value message )
- * which prevent them from being displayed by default.
- */
-.radioRequiredMsg, .radioInvalidMsg {
-    display: none;
-}
-
-/* These selectors change the way messages look when the widget is in one of the error states.
- * These classes set a default red border and font color for the error text.
- * The state class (e.g. .radioRequiredState) is applied on the top-level container for the widget, 
- * and this way only the specific error message can be shown by setting the display property to "inline".
- */
-.radioRequiredState .radioRequiredMsg,
-.radioInvalidState .radioInvalidMsg {
-    display: inline;
-    color: #CC3333;
-    border: 1px solid #CC3333;
-}
diff --git a/dubbo-admin/src/main/webapp/SpryAssets/SpryValidationRadio.js b/dubbo-admin/src/main/webapp/SpryAssets/SpryValidationRadio.js
deleted file mode 100644
index b90538a..0000000
--- a/dubbo-admin/src/main/webapp/SpryAssets/SpryValidationRadio.js
+++ /dev/null
@@ -1,480 +0,0 @@
-// SpryValidationRadio.js - version 0.1 - Spry Pre-Release 1.6.1
-//
-// Copyright (c) 2007. Adobe Systems Incorporated.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-//   * Redistributions of source code must retain the above copyright notice,
-//     this list of conditions and the following disclaimer.
-//   * Redistributions in binary form must reproduce the above copyright notice,
-//     this list of conditions and the following disclaimer in the documentation
-//     and/or other materials provided with the distribution.
-//   * Neither the name of Adobe Systems Incorporated nor the names of its
-//     contributors may be used to endorse or promote products derived from this
-//     software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-
-var Spry;
-if (!Spry) Spry = {};
-if (!Spry.Widget) Spry.Widget = {};
-
-Spry.Widget.ValidationRadio = function (element, opts) {
-    this.init(element);
-
-    Spry.Widget.Utils.setOptions(this, opts);
-
-    // set validateOn flags
-    var validateOn = ['submit'].concat(this.validateOn || []);
-    validateOn = validateOn.join(",");
-    this.validateOn = 0 | (validateOn.indexOf('submit') != -1 ? Spry.Widget.ValidationRadio.ONSUBMIT : 0);
-    this.validateOn = this.validateOn | (validateOn.indexOf('blur') != -1 ? Spry.Widget.ValidationRadio.ONBLUR : 0);
-    this.validateOn = this.validateOn | (validateOn.indexOf('change') != -1 ? Spry.Widget.ValidationRadio.ONCHANGE : 0);
-
-    if (this.additionalError)
-        this.additionalError = this.getElement(this.additionalError);
-
-    // Unfortunately in some browsers like Safari, the Stylesheets our
-    // page depends on may not have been loaded at the time we are called.
-    // This means we have to defer attaching our behaviors until after the
-    // onload event fires, since some of our behaviors rely on dimensions
-    // specified in the CSS.
-
-    if (Spry.Widget.ValidationRadio.onloadDidFire)
-        this.attachBehaviors();
-    else
-        Spry.Widget.ValidationRadio.loadQueue.push(this);
-};
-
-Spry.Widget.ValidationRadio.ONCHANGE = 1;
-Spry.Widget.ValidationRadio.ONBLUR = 2;
-Spry.Widget.ValidationRadio.ONSUBMIT = 4;
-
-Spry.Widget.ValidationRadio.prototype.init = function (element) {
-    this.element = this.getElement(element);
-    this.additionalError = false;
-    this.radioElements = null;
-    this.form = null;
-    this.event_handlers = [];
-
-    // this.element can be either the container (<span>)
-    // or the <input type="radio"> element, when no error messages are used.
-    this.requiredClass = "radioRequiredState";
-    this.focusClass = "radioFocusState";
-    this.invalidClass = "radioInvalidState";
-    this.validClass = "radioValidState";
-
-    this.emptyValue = "";
-    this.invalidValue = null;
-    this.isRequired = true;
-    this.validateOn = ["submit"]; // change, submit (blur ?)
-};
-
-Spry.Widget.ValidationRadio.onloadDidFire = false;
-Spry.Widget.ValidationRadio.loadQueue = [];
-
-Spry.Widget.ValidationRadio.prototype.getElement = function (ele) {
-    if (ele && typeof ele == "string")
-        return document.getElementById(ele);
-    return ele;
-};
-
-Spry.Widget.ValidationRadio.processLoadQueue = function (handler) {
-    Spry.Widget.ValidationRadio.onloadDidFire = true;
-    var q = Spry.Widget.ValidationRadio.loadQueue;
-    var qlen = q.length;
-    for (var i = 0; i < qlen; i++)
-        q[i].attachBehaviors();
-};
-
-Spry.Widget.ValidationRadio.addLoadListener = function (handler) {
-    if (typeof window.addEventListener != 'undefined')
-        window.addEventListener('load', handler, false);
-    else if (typeof document.addEventListener != 'undefined')
-        document.addEventListener('load', handler, false);
-    else if (typeof window.attachEvent != 'undefined')
-        window.attachEvent('onload', handler);
-};
-
-Spry.Widget.ValidationRadio.addLoadListener(Spry.Widget.ValidationRadio.processLoadQueue);
-Spry.Widget.ValidationRadio.addLoadListener(function () {
-    Spry.Widget.Utils.addEventListener(window, "unload", Spry.Widget.Form.destroyAll, false);
-});
-
-Spry.Widget.ValidationRadio.prototype.attachBehaviors = function () {
-    if (!this.element)
-        return;
-    // find the INPUT type="Radio" element(s) inside current container
-    if (this.element.nodeName == "INPUT") {
-        this.radioElements = [this.element];
-    } else {
-        this.radioElements = this.getRadios();
-    }
-    if (this.radioElements) {
-        var self = this;
-        this.event_handlers = [];
-
-        var qlen = this.radioElements.length;
-        for (var i = 0; i < qlen; i++) {
-            // focus
-            this.event_handlers.push([this.radioElements[i], "focus", function (e) {
-                return self.onFocus(e);
-            }]);
-            // blur
-            this.event_handlers.push([this.radioElements[i], "blur", function (e) {
-                return self.onBlur(e);
-            }]);
-            // add click instead of onChange
-            if (this.validateOn & Spry.Widget.ValidationRadio.ONCHANGE) {
-                this.event_handlers.push([this.radioElements[i], "click", function (e) {
-                    return self.onClick(e);
-                }]);
-            }
-        }
-
-        for (var i = 0; i < this.event_handlers.length; i++) {
-            Spry.Widget.Utils.addEventListener(this.event_handlers[i][0], this.event_handlers[i][1], this.event_handlers[i][2], false);
-        }
-
-        // submit
-        this.form = Spry.Widget.Utils.getFirstParentWithNodeName(this.element, "FORM");
-        if (this.form) {
-            // if no "onSubmit" handler has been attached to the current form, attach one
-            if (!this.form.attachedSubmitHandler && !this.form.onsubmit) {
-                this.form.onsubmit = function (e) {
-                    e = e || event;
-                    return Spry.Widget.Form.onSubmit(e, e.srcElement || e.currentTarget)
-                };
-                this.form.attachedSubmitHandler = true;
-            }
-            if (!this.form.attachedResetHandler) {
-                Spry.Widget.Utils.addEventListener(this.form, "reset", function (e) {
-                    e = e || event;
-                    return Spry.Widget.Form.onReset(e, e.srcElement || e.currentTarget)
-                }, false);
-                this.form.attachedResetHandler = true;
-            }
-            // add the currrent widget to the "onSubmit" check queue;
-            Spry.Widget.Form.onSubmitWidgetQueue.push(this);
-        }
-    }
-};
-
-Spry.Widget.ValidationRadio.prototype.getRadios = function () {
-    var arrRadios;
-    var elements = this.element.getElementsByTagName("INPUT");
-    if (elements.length) {
-        arrRadios = [];
-        var qlen = elements.length;
-        for (var i = 0; i < qlen; i++) {
-            if (elements[i].getAttribute('type').toLowerCase() == "radio")
-                arrRadios.push(elements[i]);
-        }
-        return arrRadios;
-    }
-    return null;
-};
-
-Spry.Widget.ValidationRadio.prototype.addClassName = function (ele, className) {
-    if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))
-        return;
-    ele.className += (ele.className ? " " : "") + className;
-};
-
-Spry.Widget.ValidationRadio.prototype.removeClassName = function (ele, className) {
-    if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))
-        return;
-    ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
-};
-
-Spry.Widget.ValidationRadio.prototype.onFocus = function (e) {
-    var eventRadio = (e.srcElement != null) ? e.srcElement : e.target;
-    if (eventRadio.disabled) return;
-
-    this.addClassName(this.element, this.focusClass);
-    this.addClassName(this.additionalError, this.focusClass);
-};
-
-Spry.Widget.ValidationRadio.prototype.onBlur = function (e) {
-    var eventRadio = (e.srcElement != null) ? e.srcElement : e.target;
-    if (eventRadio.disabled) return;
-
-    var doValidation = false;
-    if (this.validateOn & Spry.Widget.ValidationRadio.ONBLUR)
-        doValidation = true;
-    if (doValidation)
-        this.validate();
-    this.removeClassName(this.element, this.focusClass);
-    this.removeClassName(this.additionalError, thi