Refactor referenced API
diff --git a/pom.xml b/pom.xml
index eacaddc..67b066c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,7 +25,7 @@
     </parent>
     <groupId>org.apache.shardingsphere</groupId>
     <artifactId>shardingsphere-ui</artifactId>
-    <version>5.0.0-beta-SNAPSHOT</version>
+    <version>5.0.0-RC1-SNAPSHOT</version>
     <packaging>pom</packaging>
     <name>${project.artifactId}</name>
     
@@ -83,6 +83,26 @@
                 <artifactId>shardingsphere-governance-repository-etcd</artifactId>
                 <version>${shardingsphere.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.shardingsphere</groupId>
+                <artifactId>shardingsphere-readwrite-splitting-core</artifactId>
+                <version>${shardingsphere.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.shardingsphere</groupId>
+                <artifactId>shardingsphere-encrypt-core</artifactId>
+                <version>${shardingsphere.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.shardingsphere</groupId>
+                <artifactId>shardingsphere-db-discovery-core</artifactId>
+                <version>${shardingsphere.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.shardingsphere</groupId>
+                <artifactId>shardingsphere-shadow-core</artifactId>
+                <version>${shardingsphere.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
     
diff --git a/shardingsphere-ui-backend/pom.xml b/shardingsphere-ui-backend/pom.xml
index 6436ba4..4639c38 100644
--- a/shardingsphere-ui-backend/pom.xml
+++ b/shardingsphere-ui-backend/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
         <artifactId>shardingsphere-ui</artifactId>
-        <version>5.0.0-beta-SNAPSHOT</version>
+        <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
     <artifactId>shardingsphere-ui-backend</artifactId>
     <name>${project.artifactId}</name>
@@ -47,6 +47,22 @@
         </dependency>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-readwrite-splitting-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-encrypt-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-db-discovery-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-shadow-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
             <artifactId>shardingsphere-governance-core</artifactId>
         </dependency>
         <dependency>
diff --git a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/RegistryCenterService.java b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/RegistryCenterService.java
index 460e0d6..6b64207 100644
--- a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/RegistryCenterService.java
+++ b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/RegistryCenterService.java
@@ -17,8 +17,7 @@
 
 package org.apache.shardingsphere.ui.servcie;
 
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
-import org.apache.shardingsphere.governance.repository.api.RegistryRepository;
+import org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 
 /**
  * Registry center service.
@@ -30,12 +29,5 @@
      *
      * @return registry center
      */
-    RegistryRepository getActivatedRegistryCenter();
-    
-    /**
-     * Get activated state node.
-     *
-     * @return state node
-     */
-    RegistryCenterNode getActivatedStateNode();
+    RegistryCenterRepository getActivatedRegistryCenter();
 }
diff --git a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/GovernanceServiceImpl.java b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/GovernanceServiceImpl.java
index 8284ca9..12d2eb9 100644
--- a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/GovernanceServiceImpl.java
+++ b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/GovernanceServiceImpl.java
@@ -19,11 +19,15 @@
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNodeStatus;
-import org.apache.shardingsphere.governance.core.yaml.config.YamlConfigurationConverter;
+import com.google.common.base.Strings;
+import org.apache.shardingsphere.governance.core.registry.state.ResourceState;
+import org.apache.shardingsphere.governance.core.registry.state.node.StatesNode;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
-import org.apache.shardingsphere.readwrite.splitting.api.ReadWriteSplittingRuleConfiguration;
-import org.apache.shardingsphere.readwrite.splitting.api.rule.ReadWriteSplittingDataSourceRuleConfiguration;
+import org.apache.shardingsphere.infra.yaml.config.YamlRuleConfiguration;
+import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
+import org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
+import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
+import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import org.apache.shardingsphere.ui.common.dto.InstanceDTO;
 import org.apache.shardingsphere.ui.common.dto.ReadDataSourceDTO;
 import org.apache.shardingsphere.ui.servcie.GovernanceService;
@@ -57,16 +61,16 @@
         List<String> instanceIds = registryCenterService.getActivatedRegistryCenter().getChildrenKeys(getInstancesNodeFullRootPath());
         Collection<InstanceDTO> result = new ArrayList<>(instanceIds.size());
         for (String instanceId : instanceIds) {
-            String value = registryCenterService.getActivatedRegistryCenter().get(registryCenterService.getActivatedStateNode().getProxyNodePath(instanceId));
-            result.add(new InstanceDTO(instanceId, !RegistryCenterNodeStatus.DISABLED.toString().equalsIgnoreCase(value)));
+            String value = registryCenterService.getActivatedRegistryCenter().get(StatesNode.getProxyNodePath(instanceId));
+            result.add(new InstanceDTO(instanceId, !ResourceState.DISABLED.toString().equalsIgnoreCase(value)));
         }
         return result;
     }
     
     @Override
     public void updateInstanceStatus(final String instanceId, final boolean enabled) {
-        String value = enabled ? "" : RegistryCenterNodeStatus.DISABLED.toString();
-        registryCenterService.getActivatedRegistryCenter().persist(registryCenterService.getActivatedStateNode().getProxyNodePath(instanceId), value);
+        String value = enabled ? "" : ResourceState.DISABLED.toString();
+        registryCenterService.getActivatedRegistryCenter().persist(StatesNode.getProxyNodePath(instanceId), value);
     }
     
     @Override
@@ -79,7 +83,7 @@
             }
             if (configData.contains("!SHARDING")) {
                 handleShardingRuleConfiguration(result, configData, schemaName);
-            } else if (configData.contains("!READ_WRITE_SPLITTING")) {
+            } else if (configData.contains("!READWRITE_SPLITTING")) {
                 handleMasterSlaveRuleConfiguration(result, configData, schemaName);
             }
         }
@@ -88,60 +92,67 @@
     
     @Override
     public void updateReadDataSourceStatus(final String schemaNames, final String readDataSourceName, final boolean enabled) {
-        String value = enabled ? "" : RegistryCenterNodeStatus.DISABLED.toString();
-        registryCenterService.getActivatedRegistryCenter().persist(registryCenterService.getActivatedStateNode().getDataSourcePath(schemaNames, readDataSourceName), value);
+        String value = enabled ? "" : ResourceState.DISABLED.toString();
+        registryCenterService.getActivatedRegistryCenter().persist(StatesNode.getDataSourcePath(schemaNames, readDataSourceName), value);
     }
     
     private String getInstancesNodeFullRootPath() {
-        String result = registryCenterService.getActivatedStateNode().getProxyNodePath("");
+        String result = StatesNode.getProxyNodePath("");
         return result.substring(0, result.length() - 1);
     }
     
     private void handleShardingRuleConfiguration(final Collection<ReadDataSourceDTO> readDataSourceDTOS, final String configData, final String schemaName) {
-        Collection<RuleConfiguration> configurations = YamlConfigurationConverter.convertRuleConfigurations(configData);
-        Collection<ReadWriteSplittingRuleConfiguration> readWriteSplittingRuleConfigurations = configurations.stream().filter(
-            config -> config instanceof ReadWriteSplittingRuleConfiguration).map(config -> (ReadWriteSplittingRuleConfiguration) config).collect(Collectors.toList());
-        for (ReadWriteSplittingRuleConfiguration readWriteSplittingRuleConfiguration : readWriteSplittingRuleConfigurations) {
-            addSlaveDataSource(readDataSourceDTOS, readWriteSplittingRuleConfiguration, schemaName);
+        Collection<RuleConfiguration> configurations = getRuleConfigurations(configData);
+        Collection<ReadwriteSplittingRuleConfiguration> readWriteSplittingRuleConfigurations = configurations.stream().filter(
+            config -> config instanceof ReadwriteSplittingRuleConfiguration).map(config -> (ReadwriteSplittingRuleConfiguration) config).collect(Collectors.toList());
+        for (ReadwriteSplittingRuleConfiguration readwriteSplittingRuleConfiguration : readWriteSplittingRuleConfigurations) {
+            addSlaveDataSource(readDataSourceDTOS, readwriteSplittingRuleConfiguration, schemaName);
         }
     }
     
     private void handleMasterSlaveRuleConfiguration(final Collection<ReadDataSourceDTO> readDataSourceDTOS, final String configData, final String schemaName) {
-        ReadWriteSplittingRuleConfiguration readWriteSplittingRuleConfiguration = loadPrimaryReadRuleConfiguration(configData);
-        addSlaveDataSource(readDataSourceDTOS, readWriteSplittingRuleConfiguration, schemaName);
+        ReadwriteSplittingRuleConfiguration readwriteSplittingRuleConfiguration = loadReadwriteSplittingRuleConfiguration(configData);
+        addSlaveDataSource(readDataSourceDTOS, readwriteSplittingRuleConfiguration, schemaName);
     }
     
-    private ReadWriteSplittingRuleConfiguration loadPrimaryReadRuleConfiguration(final String configData) {
-        Collection<RuleConfiguration> ruleConfigurations = YamlConfigurationConverter.convertRuleConfigurations(configData);
-        Optional<ReadWriteSplittingRuleConfiguration> result = ruleConfigurations.stream().filter(
-                each -> each instanceof ReadWriteSplittingRuleConfiguration).map(ruleConfiguration -> (ReadWriteSplittingRuleConfiguration) ruleConfiguration).findFirst();
+    private ReadwriteSplittingRuleConfiguration loadReadwriteSplittingRuleConfiguration(final String configData) {
+        Collection<RuleConfiguration> ruleConfigurations = getRuleConfigurations(configData);
+        Optional<ReadwriteSplittingRuleConfiguration> result = ruleConfigurations.stream().filter(
+                each -> each instanceof ReadwriteSplittingRuleConfiguration).map(ruleConfiguration -> (ReadwriteSplittingRuleConfiguration) ruleConfiguration).findFirst();
         Preconditions.checkState(result.isPresent());
         return result.get();
     }
     
-    private void addSlaveDataSource(final Collection<ReadDataSourceDTO> readDataSourceDTOS, final ReadWriteSplittingRuleConfiguration readWriteSplittingRuleConfiguration, final String schemaName) {
+    private void addSlaveDataSource(final Collection<ReadDataSourceDTO> readDataSourceDTOS, final ReadwriteSplittingRuleConfiguration readwriteSplittingRuleConfiguration, final String schemaName) {
         Collection<String> disabledSchemaDataSourceNames = getDisabledSchemaDataSourceNames();
-        for (ReadWriteSplittingDataSourceRuleConfiguration each : readWriteSplittingRuleConfiguration.getDataSources()) {
+        for (ReadwriteSplittingDataSourceRuleConfiguration each : readwriteSplittingRuleConfiguration.getDataSources()) {
             readDataSourceDTOS.addAll(getReadDataSourceDTOS(schemaName, disabledSchemaDataSourceNames, each));
         }
     }
     
-    private Collection<ReadDataSourceDTO> getReadDataSourceDTOS(final String schemaName, final Collection<String> disabledSchemaDataSourceNames, final ReadWriteSplittingDataSourceRuleConfiguration group) {
+    private Collection<ReadDataSourceDTO> getReadDataSourceDTOS(final String schemaName, final Collection<String> disabledSchemaDataSourceNames, 
+                                                                final ReadwriteSplittingDataSourceRuleConfiguration group) {
         Collection<ReadDataSourceDTO> result = new LinkedList<>();
         for (String each : group.getReadDataSourceNames()) {
             result.add(new ReadDataSourceDTO(schemaName, group.getWriteDataSourceName(), each, !disabledSchemaDataSourceNames.contains(schemaName + "." + each)));
         }
         return result;
     }
+
+    private Collection<RuleConfiguration> getRuleConfigurations(final String yamlContent) {
+        Collection<YamlRuleConfiguration> rules = Strings.isNullOrEmpty(yamlContent)
+                ? new LinkedList<>() : YamlEngine.unmarshal(yamlContent, Collection.class);
+        return new YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(rules);
+    }
     
     private Collection<String> getDisabledSchemaDataSourceNames() {
         List<String> result = new ArrayList<>();
-        List<String> schemaNames = registryCenterService.getActivatedRegistryCenter().getChildrenKeys(registryCenterService.getActivatedStateNode().getDataNodesPath());
+        List<String> schemaNames = registryCenterService.getActivatedRegistryCenter().getChildrenKeys(StatesNode.getDataNodesPath());
         for (String schemaName : schemaNames) {
-            List<String> dataSourceNames = registryCenterService.getActivatedRegistryCenter().getChildrenKeys(registryCenterService.getActivatedStateNode().getSchemaPath(schemaName));
+            List<String> dataSourceNames = registryCenterService.getActivatedRegistryCenter().getChildrenKeys(StatesNode.getSchemaPath(schemaName));
             for (String dataSourceName : dataSourceNames) {
-                String value = registryCenterService.getActivatedRegistryCenter().get(registryCenterService.getActivatedStateNode().getDataSourcePath(schemaName, dataSourceName));
-                if (RegistryCenterNodeStatus.DISABLED.toString().equalsIgnoreCase(value)) {
+                String value = registryCenterService.getActivatedRegistryCenter().get(StatesNode.getDataSourcePath(schemaName, dataSourceName));
+                if (ResourceState.DISABLED.toString().equalsIgnoreCase(value)) {
                     result.add(Joiner.on(".").join(schemaName, dataSourceName));
                 }
             }
diff --git a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ProxyAuthenticationServiceImpl.java b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ProxyAuthenticationServiceImpl.java
index 4543759..2307808 100644
--- a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ProxyAuthenticationServiceImpl.java
+++ b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ProxyAuthenticationServiceImpl.java
@@ -17,12 +17,17 @@
 
 package org.apache.shardingsphere.ui.servcie.impl;
 
-import org.apache.shardingsphere.governance.core.yaml.config.YamlConfigurationConverter;
+import com.google.common.base.Preconditions;
+import org.apache.shardingsphere.governance.core.registry.config.node.GlobalNode;
+import org.apache.shardingsphere.infra.yaml.config.YamlRuleConfiguration;
+import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import org.apache.shardingsphere.ui.servcie.ProxyAuthenticationService;
 import org.apache.shardingsphere.ui.servcie.RegistryCenterService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Collection;
+
 /**
  * Implementation of sharding proxy authentication service.
  */
@@ -34,19 +39,20 @@
     
     @Override
     public String getAuthentication() {
-        return registryCenterService.getActivatedRegistryCenter().get(registryCenterService.getActivatedStateNode().getAuthenticationPath());
+        return registryCenterService.getActivatedRegistryCenter().get(GlobalNode.getGlobalRuleNode());
     }
     
     @Override
     public void updateAuthentication(final String authentication) {
         checkAuthenticationConfiguration(authentication);
         registryCenterService.getActivatedRegistryCenter()
-                .persist(registryCenterService.getActivatedStateNode().getAuthenticationPath(), authentication);
+                .persist(GlobalNode.getGlobalRuleNode(), authentication);
     }
     
     private void checkAuthenticationConfiguration(final String data) {
         try {
-            YamlConfigurationConverter.convertUserRule(data);
+            Collection<YamlRuleConfiguration> globalRuleConfigs = YamlEngine.unmarshal(data, Collection.class);
+            Preconditions.checkState(!globalRuleConfigs.isEmpty());
             // CHECKSTYLE:OFF
         } catch (final Exception ex) {
             // CHECKSTYLE:ON
diff --git a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/RegistryCenterServiceImpl.java b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/RegistryCenterServiceImpl.java
index 02aad71..ac56fed 100644
--- a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/RegistryCenterServiceImpl.java
+++ b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/RegistryCenterServiceImpl.java
@@ -17,8 +17,7 @@
 
 package org.apache.shardingsphere.ui.servcie.impl;
 
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
-import org.apache.shardingsphere.governance.repository.api.RegistryRepository;
+import org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.ui.common.domain.CenterConfig;
 import org.apache.shardingsphere.ui.common.exception.ShardingSphereUIException;
 import org.apache.shardingsphere.ui.servcie.CenterConfigService;
@@ -39,20 +38,11 @@
     private CenterConfigService centerConfigService;
     
     @Override
-    public RegistryRepository getActivatedRegistryCenter() {
+    public RegistryCenterRepository getActivatedRegistryCenter() {
         Optional<CenterConfig> optional = centerConfigService.loadActivated();
         if (optional.isPresent()) {
             return CenterRepositoryFactory.createRegistryRepository(optional.get());
         }
         throw new ShardingSphereUIException(ShardingSphereUIException.SERVER_ERROR, "No activated registry center!");
     }
-    
-    @Override
-    public RegistryCenterNode getActivatedStateNode() {
-        Optional<CenterConfig> optional = centerConfigService.loadActivated();
-        if (optional.isPresent()) {
-            return new RegistryCenterNode();
-        }
-        throw new ShardingSphereUIException(ShardingSphereUIException.SERVER_ERROR, "No activated registry center!");
-    }
 }
diff --git a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ShardingPropertiesServiceImpl.java b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ShardingPropertiesServiceImpl.java
index 62edefe..9073e2b 100644
--- a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ShardingPropertiesServiceImpl.java
+++ b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ShardingPropertiesServiceImpl.java
@@ -17,8 +17,9 @@
 
 package org.apache.shardingsphere.ui.servcie.impl;
 
-import org.apache.shardingsphere.governance.core.yaml.config.YamlConfigurationConverter;
+import org.apache.shardingsphere.governance.core.registry.config.node.GlobalNode;
 import org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
+import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import org.apache.shardingsphere.ui.servcie.RegistryCenterService;
 import org.apache.shardingsphere.ui.servcie.ShardingPropertiesService;
 import org.springframework.stereotype.Service;
@@ -37,18 +38,18 @@
     
     @Override
     public String loadShardingProperties() {
-        return registryCenterService.getActivatedRegistryCenter().get(registryCenterService.getActivatedStateNode().getPropsPath());
+        return registryCenterService.getActivatedRegistryCenter().get(GlobalNode.getPropsPath());
     }
     
     @Override
     public void updateShardingProperties(final String configData) {
         checkShardingProperties(configData);
-        registryCenterService.getActivatedRegistryCenter().persist(registryCenterService.getActivatedStateNode().getPropsPath(), configData);
+        registryCenterService.getActivatedRegistryCenter().persist(GlobalNode.getPropsPath(), configData);
     }
     
     private void checkShardingProperties(final String configData) {
         try {
-            Properties props = YamlConfigurationConverter.convertProperties(configData);
+            Properties props = YamlEngine.unmarshal(configData, Properties.class);
             new ConfigurationProperties(props);
             // CHECKSTYLE:OFF
         } catch (final Exception ex) {
diff --git a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ShardingSchemaServiceImpl.java b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ShardingSchemaServiceImpl.java
index 7ebba13..c903677 100644
--- a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ShardingSchemaServiceImpl.java
+++ b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/servcie/impl/ShardingSchemaServiceImpl.java
@@ -21,9 +21,11 @@
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
-import org.apache.shardingsphere.governance.core.yaml.config.YamlConfigurationConverter;
-import org.apache.shardingsphere.governance.repository.api.RegistryRepository;
+import org.apache.shardingsphere.governance.core.registry.config.node.SchemaMetadataNode;
+import org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.config.datasource.DataSourceConfiguration;
+import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
+import org.apache.shardingsphere.infra.yaml.swapper.YamlDataSourceConfigurationSwapper;
 import org.apache.shardingsphere.ui.servcie.RegistryCenterService;
 import org.apache.shardingsphere.ui.servcie.ShardingSchemaService;
 import org.springframework.stereotype.Service;
@@ -31,8 +33,11 @@
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * Implementation of sharding schema service.
@@ -45,17 +50,17 @@
 
     @Override
     public Collection<String> getAllSchemaNames() {
-        return registryCenterService.getActivatedRegistryCenter().getChildrenKeys(registryCenterService.getActivatedStateNode().getMetadataNodePath());
+        return registryCenterService.getActivatedRegistryCenter().getChildrenKeys(SchemaMetadataNode.getMetadataNodePath());
     }
     
     @Override
     public String getRuleConfiguration(final String schemaName) {
-        return registryCenterService.getActivatedRegistryCenter().get(registryCenterService.getActivatedStateNode().getRulePath(schemaName));
+        return registryCenterService.getActivatedRegistryCenter().get(SchemaMetadataNode.getRulePath(schemaName));
     }
     
     @Override
     public String getDataSourceConfiguration(final String schemaName) {
-        return registryCenterService.getActivatedRegistryCenter().get(registryCenterService.getActivatedStateNode().getMetadataDataSourcePath(schemaName));
+        return registryCenterService.getActivatedRegistryCenter().get(SchemaMetadataNode.getMetadataDataSourcePath(schemaName));
     }
     
     @Override
@@ -77,29 +82,28 @@
         checkDataSourceConfiguration(dataSourceConfiguration);
         persistRuleConfiguration(schemaName, ruleConfiguration);
         persistDataSourceConfiguration(schemaName, dataSourceConfiguration);
-        persistSchemaName(schemaName);
     }
     
     @Override
     public void deleteSchemaConfiguration(final String schemaName) {
-        RegistryRepository registryRepository = registryCenterService.getActivatedRegistryCenter();
-        String schemaNamePath = registryCenterService.getActivatedStateNode().getSchemaNamePath(schemaName);
+        RegistryCenterRepository registryRepository = registryCenterService.getActivatedRegistryCenter();
+        String schemaNamePath = SchemaMetadataNode.getSchemaNamePath(schemaName);
         registryRepository.delete(schemaNamePath);
-        String schemaNames = registryCenterService.getActivatedRegistryCenter().get(registryCenterService.getActivatedStateNode().getMetadataNodePath());
+        String schemaNames = registryCenterService.getActivatedRegistryCenter().get(SchemaMetadataNode.getMetadataNodePath());
         List<String> schemaNameList = new ArrayList<>(Splitter.on(",").splitToList(schemaNames));
         schemaNameList.remove(schemaName);
-        registryRepository.persist(registryCenterService.getActivatedStateNode().getMetadataNodePath(), Joiner.on(",").join(schemaNameList));
+        registryRepository.persist(SchemaMetadataNode.getMetadataNodePath(), Joiner.on(",").join(schemaNameList));
     }
 
     @Override
     public String getMetadataConfiguration(final String schemaName) {
         return registryCenterService.getActivatedRegistryCenter().get(
-                registryCenterService.getActivatedStateNode().getSchemaPath(schemaName));
+                SchemaMetadataNode.getMetadataSchemaPath(schemaName));
     }
 
     private void checkRuleConfiguration(final String configData) {
         try {
-            YamlConfigurationConverter.convertRuleConfigurations(configData);
+            YamlEngine.unmarshal(configData, Collection.class);
             // CHECKSTYLE:OFF
         } catch (final Exception ex) {
             // CHECKSTYLE:ON
@@ -108,13 +112,16 @@
     }
     
     private void persistRuleConfiguration(final String schemaName, final String ruleConfiguration) {
-        registryCenterService.getActivatedRegistryCenter().persist(registryCenterService.getActivatedStateNode().getRulePath(schemaName), ruleConfiguration);
+        registryCenterService.getActivatedRegistryCenter().persist(SchemaMetadataNode.getRulePath(schemaName), ruleConfiguration);
     }
     
     private void checkDataSourceConfiguration(final String configData) {
         try {
-            Map<String, DataSourceConfiguration> dataSourceConfigs = YamlConfigurationConverter.convertDataSourceConfigurations(configData);
-            Preconditions.checkState(!dataSourceConfigs.isEmpty(), "data source configuration is invalid.");
+            Map<String, Map<String, Object>> yamlDataSources = YamlEngine.unmarshal(configData, Map.class);
+            Map<String, DataSourceConfiguration> dataSourceConfigs = yamlDataSources.isEmpty() ? new HashMap<>()
+                    : yamlDataSources.entrySet().stream().collect(Collectors.toMap(
+                    Map.Entry::getKey, entry -> new YamlDataSourceConfigurationSwapper().swapToDataSourceConfiguration(entry.getValue()), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
+            Preconditions.checkState(!dataSourceConfigs.isEmpty());
             // CHECKSTYLE:OFF
         } catch (final Exception ex) {
             // CHECKSTYLE:ON
@@ -123,22 +130,11 @@
     }
     
     private void persistDataSourceConfiguration(final String schemaName, final String dataSourceConfiguration) {
-        registryCenterService.getActivatedRegistryCenter().persist(registryCenterService.getActivatedStateNode().getMetadataDataSourcePath(schemaName), dataSourceConfiguration);
+        registryCenterService.getActivatedRegistryCenter().persist(SchemaMetadataNode.getMetadataDataSourcePath(schemaName), dataSourceConfiguration);
     }
     
     private void checkSchemaName(final String schemaName, final Collection<String> existedSchemaNames) {
         Preconditions.checkArgument(!Strings.isNullOrEmpty(schemaName), "schema name is invalid.");
         Preconditions.checkArgument(!existedSchemaNames.contains(schemaName), "schema name already exists.");
     }
-    
-    private void persistSchemaName(final String schemaName) {
-        RegistryRepository registryRepository = registryCenterService.getActivatedRegistryCenter();
-        String schemaPath = registryCenterService.getActivatedStateNode().getMetadataNodePath();
-        String schemaNames = registryRepository.get(schemaPath);
-        List<String> schemaNameList = Strings.isNullOrEmpty(schemaNames) ? new ArrayList<>() : new ArrayList<>(Splitter.on(",").splitToList(schemaNames));
-        if (!schemaNameList.contains(schemaName)) {
-            schemaNameList.add(schemaName);
-            registryRepository.persist(schemaPath, Joiner.on(",").join(schemaNameList));
-        }
-    }
 }
diff --git a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/util/CenterRepositoryFactory.java b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/util/CenterRepositoryFactory.java
index 2cb67d1..93ba50d 100644
--- a/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/util/CenterRepositoryFactory.java
+++ b/shardingsphere-ui-backend/src/main/java/org/apache/shardingsphere/ui/util/CenterRepositoryFactory.java
@@ -19,10 +19,9 @@
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.governance.repository.api.GovernanceRepository;
-import org.apache.shardingsphere.governance.repository.api.RegistryRepository;
-import org.apache.shardingsphere.governance.repository.api.config.GovernanceCenterConfiguration;
+import org.apache.shardingsphere.governance.repository.api.config.RegistryCenterConfiguration;
 import org.apache.shardingsphere.governance.repository.etcd.EtcdRepository;
+import org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.governance.repository.zookeeper.CuratorZookeeperRepository;
 import org.apache.shardingsphere.ui.common.constant.InstanceType;
 import org.apache.shardingsphere.ui.common.domain.CenterConfig;
@@ -36,33 +35,33 @@
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class CenterRepositoryFactory {
     
-    private static final ConcurrentHashMap<String, RegistryRepository> REGISTRY_REPOSITORY_MAP = new ConcurrentHashMap<>();
+    private static final ConcurrentHashMap<String, RegistryCenterRepository> REGISTRY_REPOSITORY_MAP = new ConcurrentHashMap<>();
     
     /**
-     * Create registry repository.
+     * Create registry center repository.
      *
      * @param config center config
      * @return registry repository
      */
-    public static RegistryRepository createRegistryRepository(final CenterConfig config) {
-        RegistryRepository result = REGISTRY_REPOSITORY_MAP.get(config.getName());
+    public static RegistryCenterRepository createRegistryRepository(final CenterConfig config) {
+        RegistryCenterRepository result = REGISTRY_REPOSITORY_MAP.get(config.getName());
         if (null != result) {
             return result;
         }
-        result = (RegistryRepository) createGovernanceRepository(config.getInstanceType());
+        result = createGovernanceRepository(config.getInstanceType());
         result.init(config.getGovernanceName(), convert(config));
         REGISTRY_REPOSITORY_MAP.put(config.getName(), result);
         return result;
     }
     
-    private static GovernanceCenterConfiguration convert(final CenterConfig config) {
-        GovernanceCenterConfiguration result = new GovernanceCenterConfiguration(config.getInstanceType(), config.getServerLists(), new Properties());
+    private static RegistryCenterConfiguration convert(final CenterConfig config) {
+        RegistryCenterConfiguration result = new RegistryCenterConfiguration(config.getInstanceType(), config.getServerLists(), new Properties());
         result.getProps().put("digest", config.getDigest());
         return result;
     }
     
-    private static GovernanceRepository createGovernanceRepository(final String instanceType) {
-        RegistryRepository result;
+    private static RegistryCenterRepository createGovernanceRepository(final String instanceType) {
+        RegistryCenterRepository result;
         InstanceType type = InstanceType.nameOf(instanceType);
         switch (type) {
             case ZOOKEEPER:
diff --git a/shardingsphere-ui-distribution/pom.xml b/shardingsphere-ui-distribution/pom.xml
index c16f37c..b25d5be 100644
--- a/shardingsphere-ui-distribution/pom.xml
+++ b/shardingsphere-ui-distribution/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
         <artifactId>shardingsphere-ui</artifactId>
-        <version>5.0.0-beta-SNAPSHOT</version>
+        <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
     <artifactId>shardingsphere-ui-distribution</artifactId>
     <name>${project.artifactId}</name>
diff --git a/shardingsphere-ui-distribution/shardingsphere-ui-bin-distribution/pom.xml b/shardingsphere-ui-distribution/shardingsphere-ui-bin-distribution/pom.xml
index ad964c6..8a57590 100644
--- a/shardingsphere-ui-distribution/shardingsphere-ui-bin-distribution/pom.xml
+++ b/shardingsphere-ui-distribution/shardingsphere-ui-bin-distribution/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
         <artifactId>shardingsphere-ui-distribution</artifactId>
-        <version>5.0.0-beta-SNAPSHOT</version>
+        <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
     <artifactId>shardingsphere-ui-bin-distribution</artifactId>
     <name>${project.artifactId}</name>
diff --git a/shardingsphere-ui-distribution/shardingsphere-ui-src-distribution/pom.xml b/shardingsphere-ui-distribution/shardingsphere-ui-src-distribution/pom.xml
index 6b4bfdc..c623a42 100644
--- a/shardingsphere-ui-distribution/shardingsphere-ui-src-distribution/pom.xml
+++ b/shardingsphere-ui-distribution/shardingsphere-ui-src-distribution/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
         <artifactId>shardingsphere-ui-distribution</artifactId>
-        <version>5.0.0-beta-SNAPSHOT</version>
+        <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
     <artifactId>shardingsphere-ui-src-distribution</artifactId>
     <name>${project.artifactId}</name>
diff --git a/shardingsphere-ui-frontend/pom.xml b/shardingsphere-ui-frontend/pom.xml
index 51fa4d3..0d29091 100644
--- a/shardingsphere-ui-frontend/pom.xml
+++ b/shardingsphere-ui-frontend/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
         <artifactId>shardingsphere-ui</artifactId>
-        <version>5.0.0-beta-SNAPSHOT</version>
+        <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
     <artifactId>shardingsphere-ui-frontend</artifactId>
     <name>${project.artifactId}</name>