diff --git a/protocols/restconf/server/BUCK b/protocols/restconf/server/BUCK
index e08b996..b6ac9d4 100644
--- a/protocols/restconf/server/BUCK
+++ b/protocols/restconf/server/BUCK
@@ -1,8 +1,5 @@
 BUNDLES = [
-    '//protocols/restconf/server/api:onos-protocols-restconf-server-api',
-    '//protocols/restconf/server/restconfmgr:onos-protocols-restconf-server-restconfmgr',
     '//protocols/restconf/server/rpp:onos-protocols-restconf-server-rpp',
-    '//protocols/restconf/server/utils:onos-protocols-restconf-server-utils',
 ]
 
 onos_app (
diff --git a/protocols/restconf/server/api/BUCK b/protocols/restconf/server/api/BUCK
deleted file mode 100644
index 97d99aa..0000000
--- a/protocols/restconf/server/api/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:jersey-client',
-    '//lib:javax.ws.rs-api',
-    '//lib:jersey-server',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/restconf/server/api/pom.xml b/protocols/restconf/server/api/pom.xml
deleted file mode 100644
index e262726..0000000
--- a/protocols/restconf/server/api/pom.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<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>
-
-    <parent>
-        <groupId>org.onosproject</groupId>
-        <artifactId>onos-restconf-server</artifactId>
-        <version>1.10.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>onos-restconf-server-api</artifactId>
-    <packaging>bundle</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-core-serializers</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-       <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-servlet</artifactId>
-        </dependency>
-    </dependencies>
-
-</project>
-
diff --git a/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/Patch.java b/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/Patch.java
deleted file mode 100644
index 5004944..0000000
--- a/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/Patch.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.api;
-
-import javax.ws.rs.HttpMethod;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Indicates that the annotated method responds to HTTP PATCH requests.
- */
-@Target({ElementType.METHOD})
-@Retention(RetentionPolicy.RUNTIME)
-@HttpMethod("PATCH")
-public @interface Patch {
-}
\ No newline at end of file
diff --git a/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/RestconfException.java b/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/RestconfException.java
deleted file mode 100644
index e6b572c..0000000
--- a/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/RestconfException.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.protocol.restconf.server.api;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Response;
-
-import static javax.ws.rs.core.Response.Status;
-
-/**
- * Exceptions raised during RESTCONF operations. This class extends
- * WebApplicationException. The design intention is to create a place holder
- * for RESTCONF specific errors and to be able to add more functions as the
- * subsystem grows.
- */
-public class RestconfException extends WebApplicationException {
-
-    // This is a randomly generated value. A WebApplicationException class is required to define it.
-    private static final long SERIAL_VERSION_UID = 3275970397584007046L;
-
-    /**
-     * Constructs a new RESTCONF server error exception. The caller raising this
-     * exception may pass in a HTTP error status code and an error message. The
-     * error code will be displayed to the RESTCONF client as part of the
-     * response from the RESTCONF server. The error message is a string which
-     * may be saved in a log file and may be later retrieved by the
-     * getMessage() method.
-     *
-     * @param message the detailed error message
-     * @param status  HTTP error status
-     * @throws IllegalArgumentException in case the status code is null or is not from
-     *                                  javax.ws.rs.core.Response.Status.Family
-     *                                  status code family
-     */
-    public RestconfException(String message, Status status) {
-        super(message, null, Response.status(status).build());
-    }
-
-    /**
-     * Constructs a new RESTCONF server error exception. The caller raising
-     * this exception may pass in the numerical value of a HTTP error
-     * status code, The error code will be displayed to the RESTCONF client
-     * as a response from the RESTCONF server.
-     *
-     * @param status HTTP error status
-     * @throws IllegalArgumentException in case the status code is not a valid
-     *                                  HTTP status code or if it is not from the
-     *                                  javax.ws.rs.core.Response.Status.Family
-     *                                  status code family
-     */
-    public RestconfException(int status) {
-        super((Throwable) null, Response.status(status).build());
-    }
-}
diff --git a/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/RestconfService.java b/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/RestconfService.java
deleted file mode 100644
index fb8a975..0000000
--- a/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/RestconfService.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.protocol.restconf.server.api;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.glassfish.jersey.server.ChunkedOutput;
-
-/**
- * Abstraction of RESTCONF Server functionality according to the
- * RESTCONF RFC (no official RFC number yet).
- * <p>
- * NOTE: This interface will be obsolete and will be replaced by the one
- * in the RESTCONF application.
- */
-@Deprecated
-public interface RestconfService {
-    /**
-     * Processes a GET request against a data resource. The
-     * target data resource is identified by its URI. If the
-     * GET operation cannot be fulfilled due to reasons such
-     * as the nonexistence of the target resource, then a
-     * RestconfException exception is raised. The proper
-     * HTTP error status code is enclosed in the exception, so
-     * that the caller may return it to the RESTCONF client to
-     * display.
-     *
-     * @param uri URI of the target data resource
-     * @return JSON representation of the data resource
-     * @throws RestconfException if the GET operation cannot be fulfilled
-     */
-    ObjectNode runGetOperationOnDataResource(String uri)
-            throws RestconfException;
-
-    /**
-     * Processes a POST request against a data resource. The location of
-     * the target resource is passed in as a URI. And the resource's
-     * content is passed in as a JSON ObjectNode. If the POST operation
-     * cannot be fulfilled due to reasons such as wrong input URIs or
-     * syntax errors in the JSON payloads, a RestconfException exception
-     * is raised. The proper HTTP error status code is enclosed in the
-     * exception.
-     *
-     * @param uri      URI of the data resource to be created
-     * @param rootNode JSON representation of the data resource
-     * @throws RestconfException if the POST operation cannot be fulfilled
-     */
-    void runPostOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException;
-
-    /**
-     * Processes a PUT request against a data resource. The location of
-     * the target resource is passed in as a URI. And the resource's
-     * content is passed in as a JSON ObjectNode. If the PUT operation
-     * cannot be fulfilled due to reasons such as wrong input URIs or
-     * syntax errors in the JSON payloads, a RestconfException exception
-     * is raised. The proper HTTP error status code is enclosed in the
-     * exception.
-     *
-     * @param uri      URI of the data resource to be created or updated
-     * @param rootNode JSON representation of the data resource
-     * @throws RestconfException if the PUT operation cannot be fulfilled
-     */
-    void runPutOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException;
-
-    /**
-     * Processes the DELETE operation against a data resource. The target
-     * data resource is identified by its URI. If the DELETE operation
-     * cannot be fulfilled due reasons such as the nonexistence of the
-     * target resource, a RestconfException exception is raised. The
-     * proper HTTP error status code is enclosed in the exception.
-     *
-     * @param uri URI of the data resource to be deleted
-     * @throws RestconfException if the DELETE operation cannot be fulfilled
-     */
-    void runDeleteOperationOnDataResource(String uri) throws RestconfException;
-
-    /**
-     * Processes a PATCH operation on a data resource. The target data
-     * resource is identified by its URI passed in by the caller.
-     * And the content of the data resource is passed in as a JSON ObjectNode.
-     * If the PATCH operation cannot be fulfilled due reasons such as
-     * the nonexistence of the target resource, a RestconfException
-     * exception is raised. The proper HTTP error status code is
-     * enclosed in the exception.
-     *
-     * @param uri      URI of the data resource to be patched
-     * @param rootNode JSON representation of the data resource
-     * @throws RestconfException if the PATCH operation cannot be fulfilled
-     */
-    void runPatchOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException;
-
-    /**
-     * Retrieves the RESTCONF Root directory.
-     *
-     * @return the RESTCONF Root directory
-     */
-    String getRestconfRootPath();
-
-    /**
-     * Handles an Event Stream subscription request. This function creates
-     * a worker thread to listen to events and writes to a ChunkedOutput,
-     * which is passed in from the caller. (The worker thread blocks if
-     * no events arrive.) The ChuckedOutput is a pipe to which this
-     * function acts as the writer and the caller the reader.
-     * <p>
-     * If the Event Stream cannot be subscribed due to reasons such as
-     * the nonexistence of the target stream or failure to allocate
-     * worker thread to handle the request, a RestconfException exception
-     * is raised. The proper HTTP error status code is enclosed in the
-     * exception, so that the caller may return it to the RESTCONF client
-     * to display.
-     *
-     * @param streamId ID of the RESTCONF stream to subscribe
-     * @param output   A string data stream
-     * @throws RestconfException if the Event Stream cannot be subscribed
-     */
-    void subscribeEventStream(String streamId, ChunkedOutput<String> output)
-            throws RestconfException;
-}
diff --git a/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/RestconfServiceBroker.java b/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/RestconfServiceBroker.java
deleted file mode 100644
index b5a0c53..0000000
--- a/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/RestconfServiceBroker.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.protocol.restconf.server.api;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.glassfish.jersey.server.ChunkedOutput;
-
-/**
- * Representation of a RESTCONF service broker. The broker
- * provides services to the RESTCONF protocol proxy.
- */
-public interface RestconfServiceBroker {
-    /**
-     * Processes a GET request against a data resource. The
-     * target data resource is identified by its URI. If the
-     * GET operation cannot be fulfilled due to reasons such
-     * as the nonexistence of the target resource, then a
-     * RestconfException exception is raised. The proper
-     * HTTP error status code is enclosed in the exception, so
-     * that the caller may return it to the RESTCONF client to
-     * display.
-     *
-     * @param uri URI of the target data resource
-     * @return JSON representation of the data resource
-     * @throws RestconfException if the GET operation cannot be fulfilled
-     */
-    ObjectNode runGetOperationOnDataResource(String uri)
-            throws RestconfException;
-
-    /**
-     * Processes a POST request against a data resource. The location of
-     * the target resource is passed in as a URI. And the resource's
-     * content is passed in as a JSON ObjectNode. If the POST operation
-     * cannot be fulfilled due to reasons such as wrong input URIs or
-     * syntax errors in the JSON payloads, a RestconfException exception
-     * is raised. The proper HTTP error status code is enclosed in the
-     * exception.
-     *
-     * @param uri      URI of the data resource to be created
-     * @param rootNode JSON representation of the data resource
-     * @throws RestconfException if the POST operation cannot be fulfilled
-     */
-    void runPostOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException;
-
-    /**
-     * Processes a PUT request against a data resource. The location of
-     * the target resource is passed in as a URI. And the resource's
-     * content is passed in as a JSON ObjectNode. If the PUT operation
-     * cannot be fulfilled due to reasons such as wrong input URIs or
-     * syntax errors in the JSON payloads, a RestconfException exception
-     * is raised. The proper HTTP error status code is enclosed in the
-     * exception.
-     *
-     * @param uri      URI of the data resource to be created or updated
-     * @param rootNode JSON representation of the data resource
-     * @throws RestconfException if the PUT operation cannot be fulfilled
-     */
-    void runPutOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException;
-
-    /**
-     * Processes the DELETE operation against a data resource. The target
-     * data resource is identified by its URI. If the DELETE operation
-     * cannot be fulfilled due reasons such as the nonexistence of the
-     * target resource, a RestconfException exception is raised. The
-     * proper HTTP error status code is enclosed in the exception.
-     *
-     * @param uri URI of the data resource to be deleted
-     * @throws RestconfException if the DELETE operation cannot be fulfilled
-     */
-    void runDeleteOperationOnDataResource(String uri) throws RestconfException;
-
-    /**
-     * Processes a PATCH operation on a data resource. The target data
-     * resource is identified by its URI passed in by the caller.
-     * And the content of the data resource is passed in as a JSON ObjectNode.
-     * If the PATCH operation cannot be fulfilled due reasons such as
-     * the nonexistence of the target resource, a RestconfException
-     * exception is raised. The proper HTTP error status code is
-     * enclosed in the exception.
-     *
-     * @param uri      URI of the data resource to be patched
-     * @param rootNode JSON representation of the data resource
-     * @throws RestconfException if the PATCH operation cannot be fulfilled
-     */
-    void runPatchOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException;
-
-    /**
-     * Retrieves the RESTCONF Root directory.
-     *
-     * @return the RESTCONF Root directory
-     */
-    String getRestconfRootPath();
-
-    /**
-     * Handles an Event Stream subscription request. This function creates
-     * a worker thread to listen to events and writes to a ChunkedOutput,
-     * which is passed in from the caller. (The worker thread blocks if
-     * no events arrive.) The ChuckedOutput is a pipe to which this
-     * function acts as the writer and the caller the reader.
-     * <p>
-     * If the Event Stream cannot be subscribed due to reasons such as
-     * the nonexistence of the target stream or failure to allocate
-     * worker thread to handle the request, a RestconfException exception
-     * is raised. The proper HTTP error status code is enclosed in the
-     * exception, so that the caller may return it to the RESTCONF client
-     * to display.
-     *
-     * @param streamId ID of the RESTCONF stream to subscribe
-     * @param output   A string data stream
-     * @throws RestconfException if the Event Stream cannot be subscribed
-     */
-    void subscribeEventStream(String streamId, ChunkedOutput<String> output)
-            throws RestconfException;
-}
diff --git a/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/package-info.java b/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/package-info.java
deleted file mode 100644
index e0bb150..0000000
--- a/protocols/restconf/server/api/src/main/java/org/onosproject/protocol/restconf/server/api/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * RESTCONF Server Public Interface. All public interfaces/APIs that might be used by
- * external applications should be packaged here.
- */
-package org.onosproject.protocol.restconf.server.api;
diff --git a/protocols/restconf/server/app/app.xml b/protocols/restconf/server/app/app.xml
index 28775b6..af3eee8 100644
--- a/protocols/restconf/server/app/app.xml
+++ b/protocols/restconf/server/app/app.xml
@@ -19,8 +19,5 @@
      featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
      features="${project.artifactId}" >
     <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-restconf-server-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-restconf-server-restconfmanager/${project.version}</artifact>
     <artifact>mvn:${project.groupId}/onos-restconf-server-rpp/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-restconf-server-utils/${project.version}</artifact>
 </app>
diff --git a/protocols/restconf/server/app/features.xml b/protocols/restconf/server/app/features.xml
index 2ef4707..d38c562 100644
--- a/protocols/restconf/server/app/features.xml
+++ b/protocols/restconf/server/app/features.xml
@@ -18,9 +18,6 @@
     <feature name="${project.artifactId}" version="${project.version}"
              description="${project.description}">
         <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-restconf-server-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-restconf-server-restconfmanager/${project.version}</bundle>
         <bundle>mvn:${project.groupId}/onos-restconf-server-rpp/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-restconf-server-utils/${project.version}</bundle>
     </feature>
 </features>
diff --git a/protocols/restconf/server/pom.xml b/protocols/restconf/server/pom.xml
index 31e5fb4..31947c6 100644
--- a/protocols/restconf/server/pom.xml
+++ b/protocols/restconf/server/pom.xml
@@ -30,12 +30,9 @@
     <packaging>pom</packaging>
 
     <modules>
-        <module>api</module>
-        <module>restconfmgr</module>
         <module>rpp</module>
         <module>app</module>
-        <module>utils</module>
     </modules>
 
-    <description>RESTCONF Server Module</description>
+    <description>RESTCONF Server-side Protocol Module</description>
 </project>
diff --git a/protocols/restconf/server/restconfmgr/BUCK b/protocols/restconf/server/restconfmgr/BUCK
deleted file mode 100644
index 8b01d0e..0000000
--- a/protocols/restconf/server/restconfmgr/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:jersey-client',
-    '//lib:jersey-server',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//core/store/serializers:onos-core-serializers',
-    '//incubator/api:onos-incubator-api',
-    '//apps/restconf/api:onos-apps-restconf-api',
-    '//protocols/restconf/server/api:onos-protocols-restconf-server-api',
-    '//protocols/restconf/server/utils:onos-protocols-restconf-server-utils',
-    '//apps/yms/api:onos-apps-yms-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/restconf/server/restconfmgr/pom.xml b/protocols/restconf/server/restconfmgr/pom.xml
deleted file mode 100644
index aaed7cc..0000000
--- a/protocols/restconf/server/restconfmgr/pom.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<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/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.onosproject</groupId>
-        <artifactId>onos-restconf-server</artifactId>
-        <version>1.10.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>onos-restconf-server-restconfmanager</artifactId>
-    <packaging>bundle</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-restconf-server-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-rest</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onlab-rest</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onlab-misc</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jersey.containers</groupId>
-            <artifactId>jersey-container-servlet</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-restconf-server-utils</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-yms-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-       <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-restconf-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-scr-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/RestconfBrokerImpl.java b/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/RestconfBrokerImpl.java
deleted file mode 100644
index e59805f..0000000
--- a/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/RestconfBrokerImpl.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.protocol.restconf.server.restconfmanager;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.glassfish.jersey.server.ChunkedOutput;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.incubator.net.config.basics.ConfigException;
-import org.onosproject.net.config.ConfigFactory;
-import org.onosproject.net.config.NetworkConfigEvent;
-import org.onosproject.net.config.NetworkConfigListener;
-import org.onosproject.net.config.NetworkConfigRegistry;
-import org.onosproject.protocol.restconf.server.api.RestconfException;
-import org.onosproject.protocol.restconf.server.api.RestconfServiceBroker;
-import org.onosproject.restconf.api.RestconfService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED;
-import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED;
-import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
-
-/**
- * Implementation of the RestconfServiceBroker interface.
- */
-@Component(immediate = true)
-@Service
-public class RestconfBrokerImpl implements RestconfServiceBroker {
-
-    private static final String APP_NAME = "org.onosproject.protocols.restconfserver";
-    private static final String CONFIG_KEY = "restconfCfg";
-    private static final String DYN_CONFIG_MODE = "true";
-    private static final String RESTCONF_ROOT = "/onos/restconf";
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected NetworkConfigRegistry cfgService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected org.onosproject.protocol.restconf.server.api.RestconfService restconfYms;
-
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected RestconfService restconfDynConfig;
-
-    private ApplicationId appId;
-    private boolean useDynamicConfig = true;
-
-    private final NetworkConfigListener cfgLister = new InternalConfigListener();
-    private final ConfigFactory<ApplicationId, RestconfConfig> factory =
-            new ConfigFactory<ApplicationId, RestconfConfig>(APP_SUBJECT_FACTORY,
-                                                             RestconfConfig.class,
-                                                             CONFIG_KEY,
-                                                             false) {
-                @Override
-                public RestconfConfig createConfig() {
-                    return new RestconfConfig();
-                }
-            };
-
-    @Activate
-    protected void activate() {
-        appId = coreService.registerApplication(APP_NAME);
-        cfgService.registerConfigFactory(factory);
-        cfgService.addListener(cfgLister);
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        cfgService.removeListener(cfgLister);
-        cfgService.unregisterConfigFactory(factory);
-        log.info("Stopped");
-    }
-
-    @Override
-    public ObjectNode runGetOperationOnDataResource(String uri)
-            throws RestconfException {
-        return useDynamicConfig ?
-                restconfDynConfig.runGetOperationOnDataResource(uri) :
-                restconfYms.runGetOperationOnDataResource(uri);
-    }
-
-
-    @Override
-    public void runPostOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException {
-        if (useDynamicConfig) {
-            restconfDynConfig.runPostOperationOnDataResource(uri, rootNode);
-        } else {
-            restconfYms.runPostOperationOnDataResource(uri, rootNode);
-        }
-    }
-
-    @Override
-    public void runPutOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException {
-        if (useDynamicConfig) {
-            restconfDynConfig.runPutOperationOnDataResource(uri, rootNode);
-        } else {
-            restconfYms.runPutOperationOnDataResource(uri, rootNode);
-        }
-    }
-
-    @Override
-    public void runDeleteOperationOnDataResource(String uri)
-            throws RestconfException {
-        if (useDynamicConfig) {
-            restconfDynConfig.runDeleteOperationOnDataResource(uri);
-        } else {
-            restconfYms.runDeleteOperationOnDataResource(uri);
-        }
-    }
-
-    @Override
-    public void runPatchOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException {
-        if (useDynamicConfig) {
-            restconfDynConfig.runPatchOperationOnDataResource(uri, rootNode);
-        } else {
-            restconfYms.runPatchOperationOnDataResource(uri, rootNode);
-        }
-    }
-
-    @Override
-    public String getRestconfRootPath() {
-        return RESTCONF_ROOT;
-    }
-
-    @Override
-    public void subscribeEventStream(String streamId,
-                                     ChunkedOutput<String> output)
-            throws RestconfException {
-        if (useDynamicConfig) {
-            restconfDynConfig.subscribeEventStream(streamId, output);
-        } else {
-            restconfYms.subscribeEventStream(streamId, output);
-        }
-    }
-
-    private class InternalConfigListener implements NetworkConfigListener {
-
-        @Override
-        public void event(NetworkConfigEvent event) {
-            try {
-                useDynamicConfig = cfgService.getConfig(appId, RestconfConfig.class)
-                        .useDynamicConfig().equals(DYN_CONFIG_MODE);
-            } catch (ConfigException e) {
-                log.error("Configuration error {}", e);
-            }
-        }
-
-        @Override
-        public boolean isRelevant(NetworkConfigEvent event) {
-            return event.configClass().equals(RestconfConfig.class) &&
-                    (event.type() == CONFIG_ADDED ||
-                            event.type() == CONFIG_UPDATED);
-        }
-    }
-}
diff --git a/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/RestconfConfig.java b/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/RestconfConfig.java
deleted file mode 100644
index 2dd6bb0..0000000
--- a/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/RestconfConfig.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.protocol.restconf.server.restconfmanager;
-
-import org.onosproject.core.ApplicationId;
-import org.onosproject.incubator.net.config.basics.ConfigException;
-import org.onosproject.net.config.Config;
-
-/**
- * Configuration for TE Topology parameters.
- */
-public class RestconfConfig extends Config<ApplicationId> {
-    private static final String CONFIG_VALUE_ERROR = "Error parsing config value";
-    private static final String USE_DNY_CONFIG = "use-dyn-config";
-
-
-    /**
-     * Retrieves whether RESTCONF should use Dynamic Config service.
-     *
-     * @return string value of true or false
-     * @throws ConfigException if the parameters are not correctly configured or
-     *                         conversion of the parameters fails
-     */
-    public String useDynamicConfig() throws ConfigException {
-        try {
-            return object.path(USE_DNY_CONFIG).asText();
-        } catch (IllegalArgumentException e) {
-            throw new ConfigException(CONFIG_VALUE_ERROR, e);
-        }
-    }
-
-}
diff --git a/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/RestconfManager.java b/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/RestconfManager.java
deleted file mode 100644
index e041f1c..0000000
--- a/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/RestconfManager.java
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.protocol.restconf.server.restconfmanager;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.glassfish.jersey.server.ChunkedOutput;
-import org.onosproject.event.ListenerTracker;
-import org.onosproject.protocol.restconf.server.api.RestconfException;
-import org.onosproject.protocol.restconf.server.api.RestconfService;
-import org.onosproject.yms.ydt.YdtBuilder;
-import org.onosproject.yms.ydt.YdtContext;
-import org.onosproject.yms.ydt.YdtContextOperationType;
-import org.onosproject.yms.ydt.YdtResponse;
-import org.onosproject.yms.ydt.YmsOperationExecutionStatus;
-import org.onosproject.yms.ydt.YmsOperationType;
-import org.onosproject.yms.ymsm.YmsService;
-import org.onosproject.yms.ynh.YangNotificationEvent;
-import org.onosproject.yms.ynh.YangNotificationListener;
-import org.onosproject.yms.ynh.YangNotificationService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.Map.Entry;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR;
-import static org.onosproject.protocol.restconf.server.utils.parser.json.ParserUtils.convertJsonToYdt;
-import static org.onosproject.protocol.restconf.server.utils.parser.json.ParserUtils.convertUriToYdt;
-import static org.onosproject.protocol.restconf.server.utils.parser.json.ParserUtils.convertYdtToJson;
-import static org.onosproject.protocol.restconf.server.utils.parser.json.ParserUtils.getJsonNameFromYdtNode;
-import static org.onosproject.yms.ydt.YdtContextOperationType.CREATE;
-import static org.onosproject.yms.ydt.YdtContextOperationType.DELETE;
-import static org.onosproject.yms.ydt.YdtContextOperationType.MERGE;
-import static org.onosproject.yms.ydt.YdtContextOperationType.NONE;
-import static org.onosproject.yms.ydt.YdtContextOperationType.REPLACE;
-import static org.onosproject.yms.ydt.YdtType.SINGLE_INSTANCE_LEAF_VALUE_NODE;
-import static org.onosproject.yms.ydt.YmsOperationExecutionStatus.EXECUTION_EXCEPTION;
-import static org.onosproject.yms.ydt.YmsOperationExecutionStatus.EXECUTION_SUCCESS;
-import static org.onosproject.yms.ydt.YmsOperationType.EDIT_CONFIG_REQUEST;
-import static org.onosproject.yms.ydt.YmsOperationType.QUERY_REQUEST;
-
-/*
- * Skeletal ONOS RESTCONF Server application. The RESTCONF Manager
- * implements the main logic of the RESTCONF Server.
- *
- * The design of the RESTCONF subsystem contains 2 major bundles:
- *
- * 1. RESTCONF Protocol Proxy (RPP). This bundle is implemented as a
- *    JAX-RS application. It acts as the frond-end of the RESTCONF server.
- *    It intercepts/handles HTTP requests that are sent to the RESTCONF
- *    Root Path. It then calls the RESTCONF Manager to process the requests.
- *
- * 2. RESTCONF Manager. This bundle module is the back-end of the server.
- *    It provides the main logic of the RESTCONF server. It interacts with
- *    the YMS (YANG Management System) to run operations on the YANG data
- *    objects (i.e., data resources).
- *
- * NOTE: This implementation will be obsolete and will be replaced by the
- *       RESTCONF application.
- */
-
-/**
- * Implementation of the RestconfService interface. The class is designed
- * as a Apache Flex component. Note that to avoid unnecessary
- * activation, the @Component annotation's immediate parameter is set to false.
- * So the component is not activated until a RESTCONF request is received by
- * the RESTCONF Protocol Proxy (RPP) module, which consumes the service.
- */
-@Component(immediate = false)
-@Service
-public class RestconfManager implements RestconfService {
-
-    private static final String RESTCONF_ROOT = "/onos/restconf";
-    private static final int THREAD_TERMINATION_TIMEOUT = 10;
-
-    // Jersey's default chunk parser uses "\r\n" as the chunk separator.
-    private static final String EOL = "\r\n";
-
-    private final int maxNumOfWorkerThreads = 5;
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected YmsService ymsService;
-
-    protected YangNotificationService ymsNotificationService;
-
-    private ListenerTracker listeners;
-
-    private ConcurrentMap<String, BlockingQueue<ObjectNode>> eventQueueList =
-            new ConcurrentHashMap<>();
-
-    private ExecutorService workerThreadPool;
-
-    @Activate
-    protected void activate() {
-        workerThreadPool = Executors
-                .newFixedThreadPool(maxNumOfWorkerThreads,
-                                    new ThreadFactoryBuilder()
-                                            .setNameFormat("restconf-worker")
-                                            .build());
-        ymsNotificationService = ymsService.getYangNotificationService();
-        listeners = new ListenerTracker();
-        listeners.addListener(ymsNotificationService, new InternalYangNotificationListener());
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        listeners.removeListeners();
-        shutdownAndAwaitTermination(workerThreadPool);
-        log.info("Stopped");
-    }
-
-    @Override
-    public ObjectNode runGetOperationOnDataResource(String uri)
-            throws RestconfException {
-        YdtBuilder ydtBuilder = getYdtBuilder(QUERY_REQUEST);
-        //Convert the URI to ydtBuilder
-        convertUriToYdt(uri, ydtBuilder, NONE);
-        YdtResponse ydtResponse = ymsService.executeOperation(ydtBuilder);
-        YmsOperationExecutionStatus status = ydtResponse
-                .getYmsOperationResult();
-        if (status != EXECUTION_SUCCESS) {
-            throw new RestconfException("YMS GET operation failed",
-                                        INTERNAL_SERVER_ERROR);
-        }
-
-        YdtContext rootNode = ydtResponse.getRootNode();
-        YdtContext curNode = ydtBuilder.getCurNode();
-
-        ObjectNode result = convertYdtToJson(getJsonNameFromYdtNode(curNode),
-                                             rootNode,
-                                             ymsService.getYdtWalker());
-        //if the query URI contain a key, something like list=key
-        //here should only get get child with the specific key
-        YdtContext child = curNode.getFirstChild();
-        if (child != null &&
-                child.getYdtType() == SINGLE_INSTANCE_LEAF_VALUE_NODE) {
-
-            ArrayNode jsonNode = (ArrayNode) result.get(getJsonNameFromYdtNode(curNode));
-            for (JsonNode next : jsonNode) {
-                if (next.findValue(getJsonNameFromYdtNode(child))
-                        .asText().equals(child.getValue())) {
-                    return (ObjectNode) next;
-                }
-            }
-            throw new RestconfException(String.format("No content for %s = %s",
-                                                      getJsonNameFromYdtNode(child),
-                                                      child.getValue()),
-                                        INTERNAL_SERVER_ERROR);
-        }
-        return result;
-    }
-
-    private YmsOperationExecutionStatus
-    invokeYmsOp(String uri, ObjectNode rootNode,
-                YdtContextOperationType opType) {
-        YdtBuilder ydtBuilder = getYdtBuilder(EDIT_CONFIG_REQUEST);
-        //Convert the URI to ydtBuilder
-        convertUriToYdt(uri, ydtBuilder, opType);
-
-        //set default operation type for the payload node
-        ydtBuilder.setDefaultEditOperationType(opType);
-        //convert the payload json body to ydt
-        convertJsonToYdt(rootNode, ydtBuilder);
-
-        YmsOperationExecutionStatus status = EXECUTION_EXCEPTION;
-
-        try {
-            status = ymsService.executeOperation(ydtBuilder).getYmsOperationResult();
-        } catch (Exception e) {
-            log.error("YMS operation failed: {}", e.getMessage());
-            log.debug("Exception in invokeYmsOp: ", e);
-        }
-
-        return status;
-    }
-
-    @Override
-    public void runPostOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException {
-        YmsOperationExecutionStatus status =
-                invokeYmsOp(uri, rootNode, CREATE);
-
-        if (status != EXECUTION_SUCCESS) {
-            throw new RestconfException("YMS post operation failed.",
-                                        INTERNAL_SERVER_ERROR);
-        }
-    }
-
-    @Override
-    public void runPutOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException {
-        YmsOperationExecutionStatus status =
-                invokeYmsOp(uri, rootNode, REPLACE);
-
-        if (status != EXECUTION_SUCCESS) {
-            throw new RestconfException("YMS put operation failed.",
-                                        INTERNAL_SERVER_ERROR);
-        }
-    }
-
-    @Override
-    public void runDeleteOperationOnDataResource(String uri)
-            throws RestconfException {
-        //Get a root ydtBuilder
-        YdtBuilder ydtBuilder = getYdtBuilder(EDIT_CONFIG_REQUEST);
-        //Convert the URI to ydtBuilder
-        convertUriToYdt(uri, ydtBuilder, DELETE);
-        //Execute the delete operation
-        YmsOperationExecutionStatus status = ymsService
-                .executeOperation(ydtBuilder)
-                .getYmsOperationResult();
-        if (status != EXECUTION_SUCCESS) {
-            throw new RestconfException("YMS delete operation failed.",
-                                        INTERNAL_SERVER_ERROR);
-        }
-    }
-
-    @Override
-    public void runPatchOperationOnDataResource(String uri, ObjectNode rootNode)
-            throws RestconfException {
-        YmsOperationExecutionStatus status = invokeYmsOp(uri, rootNode, MERGE);
-
-        if (status != EXECUTION_SUCCESS) {
-            throw new RestconfException("YMS patch operation failed.",
-                                        INTERNAL_SERVER_ERROR);
-        }
-    }
-
-    @Override
-    public String getRestconfRootPath() {
-        return RESTCONF_ROOT;
-    }
-
-    /**
-     * Creates a worker thread to listen to events and write to chunkedOutput.
-     * The worker thread blocks if no events arrive.
-     *
-     * @param streamId the RESTCONF stream id to which the client subscribes
-     * @param output   the string data stream
-     * @throws RestconfException if the worker thread fails to create
-     */
-    @Override
-    public void subscribeEventStream(String streamId,
-                                     ChunkedOutput<String> output)
-            throws RestconfException {
-        if (workerThreadPool instanceof ThreadPoolExecutor) {
-            if (((ThreadPoolExecutor) workerThreadPool).getActiveCount() >=
-                    maxNumOfWorkerThreads) {
-                throw new RestconfException("no more work threads left to " +
-                                                    "handle event subscription",
-                                            INTERNAL_SERVER_ERROR);
-            }
-        } else {
-            throw new RestconfException("Server ERROR: workerThreadPool NOT " +
-                                                "instanceof ThreadPoolExecutor",
-                                        INTERNAL_SERVER_ERROR);
-
-        }
-
-        BlockingQueue<ObjectNode> eventQueue = new LinkedBlockingQueue<>();
-        workerThreadPool.submit(new EventConsumer(output, eventQueue));
-    }
-
-    /**
-     * Shutdown a pool cleanly if possible.
-     *
-     * @param pool an executorService
-     */
-    private void shutdownAndAwaitTermination(ExecutorService pool) {
-        pool.shutdown(); // Disable new tasks from being submitted
-        try {
-            // Wait a while for existing tasks to terminate
-            if (!pool.awaitTermination(THREAD_TERMINATION_TIMEOUT, SECONDS)) {
-                pool.shutdownNow(); // Cancel currently executing tasks
-                // Wait a while for tasks to respond to being cancelled
-                if (!pool.awaitTermination(THREAD_TERMINATION_TIMEOUT,
-                                           SECONDS)) {
-                    log.error("Pool did not terminate");
-                }
-            }
-        } catch (Exception ie) {
-            // (Re-)Cancel if current thread also interrupted
-            pool.shutdownNow();
-            // Preserve interrupt status
-            Thread.currentThread().interrupt();
-        }
-    }
-
-    /**
-     * Implementation of a worker thread which reads data from a
-     * blocking queue and writes the data to a given chunk output stream.
-     * The thread is blocked when no data arrive to the queue and is
-     * terminated when the chunk output stream is closed (i.e., the
-     * HTTP-keep-alive session is closed).
-     */
-    private class EventConsumer implements Runnable {
-
-        private String queueId;
-        private final ChunkedOutput<String> output;
-        private final BlockingQueue<ObjectNode> bqueue;
-
-        public EventConsumer(ChunkedOutput<String> output,
-                             BlockingQueue<ObjectNode> q) {
-            this.output = output;
-            this.bqueue = q;
-        }
-
-        @Override
-        public void run() {
-            try {
-                queueId = String.valueOf(Thread.currentThread().getId());
-                eventQueueList.put(queueId, bqueue);
-                log.debug("EventConsumer thread created: {}", queueId);
-
-                ObjectNode chunk;
-                while ((chunk = bqueue.take()) != null) {
-                    output.write(chunk.toString().concat(EOL));
-                }
-            } catch (IOException e) {
-                log.debug("chunkedOuput is closed: {}", this.bqueue.toString());
-                /*
-                 * Remove queue from the queue list, so that the event producer
-                 * (i.e., listener) would stop working.
-                 */
-                eventQueueList.remove(this.queueId);
-            } catch (InterruptedException e) {
-                log.error("ERROR: EventConsumer: bqueue.take() " +
-                                  "has been interrupted.");
-                log.debug("EventConsumer Exception:", e);
-            } finally {
-                try {
-                    output.close();
-                    log.debug("EventConsumer thread terminated: {}", queueId);
-                } catch (IOException e) {
-                    log.error("ERROR: EventConsumer: ", e);
-                }
-            }
-        }
-    }
-
-    private YdtBuilder getYdtBuilder(YmsOperationType ymsOperationType) {
-        return ymsService.getYdtBuilder(RESTCONF_ROOT, null, ymsOperationType);
-    }
-
-    /**
-     * The listener class acts as the event producer for the event queues. The
-     * queues are created by the event consumer threads and are removed when the
-     * threads terminate.
-     */
-    private class InternalYangNotificationListener implements YangNotificationListener {
-
-        @Override
-        public void event(YangNotificationEvent event) {
-            if (event.type() != YangNotificationEvent.Type.YANG_NOTIFICATION) {
-                // For now, we only handle YANG notification events.
-                return;
-            }
-
-            if (eventQueueList.isEmpty()) {
-                /*
-                 * There is no consumer waiting to consume, so don't have to
-                 * produce this event.
-                 */
-                log.debug("Q list is empty");
-                return;
-            }
-
-            try {
-                YdtContext ydtNode = event.subject().getNotificationRootContext();
-                ObjectNode jsonNode = convertYdtToJson(getJsonNameFromYdtNode(ydtNode),
-                                                       ydtNode,
-                                                       ymsService.getYdtWalker());
-                /*
-                 * Put the event to every queue out there. Each queue is
-                 * corresponding to an event stream session. The queue is
-                 * removed when the session terminates.
-                 */
-                for (Entry<String, BlockingQueue<ObjectNode>> entry : eventQueueList
-                        .entrySet()) {
-                    entry.getValue().put(jsonNode);
-                }
-            } catch (InterruptedException e) {
-                log.error("Failed to put event in queue: {}", e.getMessage());
-                log.debug("Exception trace in InternalYangNotificationListener: ", e);
-                throw new RestconfException("Failed to put event in queue",
-                                            INTERNAL_SERVER_ERROR);
-            }
-        }
-    }
-}
diff --git a/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/package-info.java b/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/package-info.java
deleted file mode 100644
index 866663d..0000000
--- a/protocols/restconf/server/restconfmgr/src/main/java/org/onosproject/protocol/restconf/server/restconfmanager/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * RESTCONF Service Manager implementation.
- */
-package org.onosproject.protocol.restconf.server.restconfmanager;
diff --git a/protocols/restconf/server/rpp/BUCK b/protocols/restconf/server/rpp/BUCK
index 20d2d45..6531f88 100644
--- a/protocols/restconf/server/rpp/BUCK
+++ b/protocols/restconf/server/rpp/BUCK
@@ -4,8 +4,7 @@
     '//lib:jersey-server',
     '//lib:javax.ws.rs-api',
     '//utils/rest:onlab-rest',
-    '//protocols/restconf/server/api:onos-protocols-restconf-server-api',
-    '//protocols/restconf/server/restconfmgr:onos-protocols-restconf-server-restconfmgr',
+    '//apps/restconf/api:onos-apps-restconf-api',
 ]
 
 osgi_jar_with_tests (
diff --git a/protocols/restconf/server/rpp/pom.xml b/protocols/restconf/server/rpp/pom.xml
index 264d03e..bc0dfbb 100644
--- a/protocols/restconf/server/rpp/pom.xml
+++ b/protocols/restconf/server/rpp/pom.xml
@@ -42,12 +42,7 @@
     <dependencies>
         <dependency>
             <groupId>org.onosproject</groupId>
-            <artifactId>onos-restconf-server-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-restconf-server-restconfmanager</artifactId>
+            <artifactId>onos-app-restconf-api</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git a/protocols/restconf/server/rpp/src/main/java/org/onosproject/protocol/restconf/server/rpp/RestconfWebResource.java b/protocols/restconf/server/rpp/src/main/java/org/onosproject/protocol/restconf/server/rpp/RestconfWebResource.java
index 0e0a686..ceba1e0 100644
--- a/protocols/restconf/server/rpp/src/main/java/org/onosproject/protocol/restconf/server/rpp/RestconfWebResource.java
+++ b/protocols/restconf/server/rpp/src/main/java/org/onosproject/protocol/restconf/server/rpp/RestconfWebResource.java
@@ -19,10 +19,10 @@
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.glassfish.jersey.server.ChunkedOutput;
-import org.onosproject.protocol.restconf.server.api.Patch;
-import org.onosproject.protocol.restconf.server.api.RestconfException;
-import org.onosproject.protocol.restconf.server.api.RestconfServiceBroker;
 import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.restconf.api.Patch;
+import org.onosproject.restconf.api.RestconfException;
+import org.onosproject.restconf.api.RestconfService;
 import org.slf4j.Logger;
 
 import javax.ws.rs.Consumes;
@@ -62,7 +62,7 @@
     @Context
     UriInfo uriInfo;
 
-    private final RestconfServiceBroker service = get(RestconfServiceBroker.class);
+    private final RestconfService service = get(RestconfService.class);
     private final Logger log = getLogger(getClass());
 
     /**
diff --git a/protocols/restconf/server/utils/BUCK b/protocols/restconf/server/utils/BUCK
deleted file mode 100644
index dde27c3..0000000
--- a/protocols/restconf/server/utils/BUCK
+++ /dev/null
@@ -1,9 +0,0 @@
-COMPILE_DEPS = [
- '//lib:CORE_DEPS',
- '//apps/yms/api:onos-apps-yms-api',
- '//apps/yms/app:onos-apps-yms-app',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/restconf/server/utils/pom.xml b/protocols/restconf/server/utils/pom.xml
deleted file mode 100644
index ba80532..0000000
--- a/protocols/restconf/server/utils/pom.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?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">
-    <parent>
-        <artifactId>onos-restconf-server</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.10.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>onos-restconf-server-utils</artifactId>
-    <packaging>bundle</packaging>
-    <dependencies>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-yms-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-yms</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/exceptions/JsonParseException.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/exceptions/JsonParseException.java
deleted file mode 100644
index cd178c5..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/exceptions/JsonParseException.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.protocol.restconf.server.utils.exceptions;
-
-/**
- * Represents class of errors related to Json parse utils.
- */
-public class JsonParseException extends RuntimeException {
-
-    /**
-     * Constructs an exception with the specified message.
-     *
-     * @param message the message describing the specific nature of the error
-     */
-    public JsonParseException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructs an exception with the specified message and the underlying
-     * cause.
-     *
-     * @param message the message describing the specific nature of the error
-     * @param cause   the underlying cause of this error
-     */
-    public JsonParseException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/exceptions/YdtParseException.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/exceptions/YdtParseException.java
deleted file mode 100644
index c2e121b..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/exceptions/YdtParseException.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.exceptions;
-
-/**
- * Represents class of errors related to YDT parse utils.
- */
-public class YdtParseException extends RuntimeException {
-    /**
-     * Constructs an exception with the specified message.
-     *
-     * @param message the message describing the specific nature of the error
-     */
-    public YdtParseException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructs an exception with the specified message and the underlying
-     * cause.
-     *
-     * @param message the message describing the specific nature of the error
-     * @param cause   the underlying cause of this error
-     */
-    public YdtParseException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/exceptions/package-info.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/exceptions/package-info.java
deleted file mode 100644
index 508bca0..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/exceptions/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Parse utils custom exceptions.
- */
-package org.onosproject.protocol.restconf.server.utils.exceptions;
\ No newline at end of file
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/JsonBuilder.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/JsonBuilder.java
deleted file mode 100644
index f56422f..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/JsonBuilder.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.protocol.restconf.server.utils.parser.api;
-
-import com.fasterxml.jackson.databind.node.JsonNodeType;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import java.util.Set;
-
-/**
- * Abstraction of an entity which provides interfaces to build and obtain JSON
- * data tree.
- */
-public interface JsonBuilder {
-
-    /**
-     * Adds a to half (a left brace/bracket and the field name) of a JSON
-     * object/array to the JSON tree. This method is used by protocols which
-     * knows the nature (object/array) of node.
-     *
-     * @param fieldName name of child to be added
-     * @param nodeType  the type of the child
-     */
-    void addNodeTopHalf(String fieldName, JsonNodeType nodeType);
-
-    /**
-     * Adds a child with value and a comma to the JSON tree.
-     * Protocols unaware of nature of node (single/multiple) will use it to add
-     * both single instance and multi instance node. Protocols aware of nature
-     * of node will use it for single instance value node addition.
-     *
-     * @param fieldName name of child to be added
-     * @param value     the type of the child
-     */
-    void addNodeWithValueTopHalf(String fieldName, String value);
-
-    /**
-     * Adds a child with list of values to JSON data tree. This method is
-     * used by protocols which knows the nature (object/array) of node for
-     * ArrayNode addition.
-     *
-     * @param fieldName name of child to be added
-     * @param sets      the value list of the child
-     */
-    void addNodeWithSetTopHalf(String fieldName, Set<String> sets);
-
-    /**
-     * Adds the bottom half(a right brace/bracket) of  a JSON object/array to
-     * the JSON tree. for the text, a comma should be taken out.
-     *
-     * @param nodeType the type of the child
-     */
-    void addNodeBottomHalf(JsonNodeType nodeType);
-
-    /**
-     * Returns the JSON tree after build operations in the format of string.
-     *
-     * @return the final string JSON tree after build operations
-     */
-    String getTreeString();
-
-    /**
-     * Returns the JSON tree after build operations in the format of ObjectNode.
-     *
-     * @return the final ObjectNode JSON tree after build operations
-     */
-    ObjectNode getTreeNode();
-}
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/JsonListener.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/JsonListener.java
deleted file mode 100644
index 7432dd3..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/JsonListener.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.protocol.restconf.server.utils.parser.api;
-
-
-import com.fasterxml.jackson.databind.JsonNode;
-
-/**
- * Abstraction of an entity which provide call back methods which are called
- * by JSON walker while walking the JSON data tree. This interface needs to be
- * implemented by protocol implementing listener's based call backs while JSON
- * walk.
- */
-public interface JsonListener {
-
-    /**
-     * Callback invoked during a node entry.
-     * All the related information about the node can be obtain from the JSON
-     * object.
-     *
-     * @param fieldName the field name of the JSON Node value
-     * @param node      the JsonNode which is walked through
-     */
-    void enterJsonNode(String fieldName, JsonNode node);
-
-    /**
-     * Callback invoked during a node exit.
-     * All the related information about the node can be obtain from the JSON
-     * node.
-     *
-     * @param jsonNode JSON node which has been walked through
-     */
-    void exitJsonNode(JsonNode jsonNode);
-
-}
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/JsonWalker.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/JsonWalker.java
deleted file mode 100644
index 59ce2ab..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/JsonWalker.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.protocol.restconf.server.utils.parser.api;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-/**
- * Abstraction of an entity which provides interfaces for Json walk.
- * This interface serve as common tools for anyone who needs to parse
- * the json node with depth-first algorithm.
- */
-public interface JsonWalker {
-
-    /**
-     * Walks the JSON data tree. Protocols implements JSON listener service
-     * and walks JSON tree with input as implemented object. JSON walker
-     * provides call backs to implemented methods. For the original json
-     * node(come from NB), there is a field name which is something like the
-     * module name of a YANG model. If not, the fieldName can be null.
-     *
-     * @param jsonListener Json listener implemented by the user
-     * @param fieldName    the original object node field
-     * @param node         the json node which needs to be walk
-     */
-    void walk(JsonListener jsonListener, String fieldName, ObjectNode node);
-}
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/NormalizedYangNode.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/NormalizedYangNode.java
deleted file mode 100644
index 31a1423..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/NormalizedYangNode.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.api;
-
-/**
- * Abstraction of an entity which represents a simple YANG node. This entity
- * is usually described by a path segment in URI, or a field name in a JSON
- * node.
- */
-public class NormalizedYangNode {
-    private final String namespace;
-    private final String name;
-
-    /**
-     * Creates an instance of normalized YANG node using the supplied information.
-     *
-     * @param namespace namespace of a YANG node
-     * @param name      name of a YANG node
-     */
-    public NormalizedYangNode(String namespace, String name) {
-        this.namespace = namespace;
-        this.name = name;
-    }
-
-    /**
-     * Returns the namespace info of a YANG node.
-     *
-     * @return namespace info
-     */
-    public String getNamespace() {
-        return namespace;
-    }
-
-    /**
-     * Returns the name of a YANG node.
-     *
-     * @return name
-     */
-    public String getName() {
-        return name;
-    }
-}
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/package-info.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/package-info.java
deleted file mode 100644
index 51d28df..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/api/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Provider json related process interface.
- */
-package org.onosproject.protocol.restconf.server.utils.parser.api;
\ No newline at end of file
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/DefaultJsonBuilder.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/DefaultJsonBuilder.java
deleted file mode 100644
index 90a28b2..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/DefaultJsonBuilder.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.json;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.JsonNodeType;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.protocol.restconf.server.utils.exceptions.JsonParseException;
-import org.onosproject.protocol.restconf.server.utils.parser.api.JsonBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Strings.isNullOrEmpty;
-
-/**
- * Represents implementation of interfaces to build and obtain JSON data tree.
- */
-public class DefaultJsonBuilder implements JsonBuilder {
-
-    private static final String LEFT_BRACE = "{";
-    private static final String RIGHT_BRACE = "}";
-    private static final String LEFT_BRACKET = "[";
-    private static final String RIGHT_BRACKET = "]";
-    private static final String COMMA = ",";
-    private static final String COLON = ":";
-    private static final String QUOTE = "\"";
-    private static final String E_UNSUP_TYPE = "Unsupported node type %s " +
-            "field name is %s fieldName";
-
-    private Logger log = LoggerFactory.getLogger(getClass());
-
-    private StringBuilder treeString;
-
-    /**
-     * Creates a Default Json Builder with a specific root name.
-     *
-     * @param rootName the start string of the Json builder
-     */
-    public DefaultJsonBuilder(String rootName) {
-        checkNotNull(rootName);
-        treeString = new StringBuilder(rootName);
-    }
-
-    /**
-     * Creates a Default Json Builder with a default root name.
-     */
-    public DefaultJsonBuilder() {
-        treeString = new StringBuilder(LEFT_BRACE);
-    }
-
-    @Override
-    public void addNodeTopHalf(String fieldName, JsonNodeType nodeType) {
-
-        appendField(fieldName);
-
-        switch (nodeType) {
-            case OBJECT:
-                treeString.append(LEFT_BRACE);
-                break;
-            case ARRAY:
-                treeString.append(LEFT_BRACKET);
-                break;
-            default:
-                throw new JsonParseException(String.format(E_UNSUP_TYPE,
-                                                           nodeType, fieldName));
-        }
-    }
-
-    @Override
-    public void addNodeWithValueTopHalf(String fieldName, String value) {
-        if (isNullOrEmpty(fieldName)) {
-            return;
-        }
-        appendField(fieldName);
-
-        // If the value is null, then it's a empty leaf-node
-        if (value == null) {
-            treeString.append(QUOTE)
-                    .append(QUOTE + COMMA);
-            return;
-        }
-
-        // If the value is empty, then it's a non-leaf node
-        if (value.isEmpty()) {
-            return;
-        }
-
-        // It's a non-empty leaf node
-        treeString.append(QUOTE)
-                .append(value)
-                .append(QUOTE + COMMA);
-    }
-
-    @Override
-    public void addNodeWithSetTopHalf(String fieldName, Set<String> sets) {
-        if (isNullOrEmpty(fieldName)) {
-            return;
-        }
-        appendField(fieldName);
-        treeString.append(LEFT_BRACKET);
-        for (String el : sets) {
-            treeString.append(QUOTE)
-                    .append(el)
-                    .append(QUOTE + COMMA);
-        }
-    }
-
-    @Override
-    public void addNodeBottomHalf(JsonNodeType nodeType) {
-
-        switch (nodeType) {
-            case OBJECT:
-                removeCommaIfExist();
-                treeString.append(RIGHT_BRACE + COMMA);
-                break;
-
-            case ARRAY:
-                removeCommaIfExist();
-                treeString.append(RIGHT_BRACKET + COMMA);
-                break;
-
-            case BINARY:
-            case BOOLEAN:
-            case MISSING:
-            case NULL:
-            case NUMBER:
-            case POJO:
-            case STRING:
-                log.trace("Unimplemented node type {}", nodeType);
-                break;
-
-            default:
-                throw new JsonParseException("Unsupported json node type " +
-                                                     nodeType);
-        }
-    }
-
-    @Override
-    public String getTreeString() {
-        removeCommaIfExist();
-        return treeString.append(RIGHT_BRACE).toString();
-    }
-
-    @Override
-    public ObjectNode getTreeNode() {
-        ObjectNode node = null;
-        try {
-            node = (ObjectNode) (new ObjectMapper()).readTree(getTreeString());
-        } catch (IOException e) {
-            log.error("Parse json string failed {}", e.getMessage());
-        }
-        return node;
-    }
-
-
-    private void appendField(String fieldName) {
-        if (!isNullOrEmpty(fieldName)) {
-            treeString.append(QUOTE)
-                    .append(fieldName)
-                    .append(QUOTE + COLON);
-        }
-    }
-
-    private void removeCommaIfExist() {
-        int lastIndex = treeString.length() - 1;
-        if (treeString.charAt(lastIndex) == COMMA.charAt(0)) {
-            treeString.deleteCharAt(lastIndex);
-        }
-    }
-}
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/DefaultJsonWalker.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/DefaultJsonWalker.java
deleted file mode 100644
index c1802ac..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/DefaultJsonWalker.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.json;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.protocol.restconf.server.utils.parser.api.JsonWalker;
-import org.onosproject.protocol.restconf.server.utils.parser.api.JsonListener;
-
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Represents implementation of JSON walk, which walks the JSON object node.
- */
-public class DefaultJsonWalker implements JsonWalker {
-    @Override
-    public void walk(JsonListener jsonListener, String fieldName,
-                     ObjectNode objectNode) {
-
-        //enter the object node, the original ObjectNode should have a module
-        //name as fieldName.
-        jsonListener.enterJsonNode(fieldName, objectNode);
-        //the node has no children, then exist and return.
-        if (!objectNode.isContainerNode()) {
-            jsonListener.exitJsonNode(objectNode);
-            return;
-        }
-
-        Iterator<Map.Entry<String, JsonNode>> fields = objectNode.fields();
-        while (fields.hasNext()) {
-            //get the children entry of the node
-            Map.Entry<String, JsonNode> currentChild = fields.next();
-            String key = currentChild.getKey();
-            JsonNode value = currentChild.getValue();
-            //if the entry's value has its own children, do a recursion.
-            //if the entry has no children, store the key and value.
-            //for we don't know the specific type of the entry's value, we
-            // should give it to a method which can handle JsonNode
-            if (value.isContainerNode()) {
-                walkJsonNode(jsonListener, key, value);
-            } else {
-                jsonListener.enterJsonNode(key, value);
-                jsonListener.exitJsonNode(value);
-            }
-        }
-        jsonListener.exitJsonNode(objectNode);
-    }
-
-    /**
-     * Walks the JSON data tree. This method is called when we don't know
-     * the exact type of a json node.
-     *
-     * @param jsonListener Json listener implemented by the user
-     * @param fieldName    the original object node field
-     * @param rootNode     the json node which needs to be walk
-     */
-    private void walkJsonNode(JsonListener jsonListener, String fieldName,
-                              JsonNode rootNode) {
-        if (rootNode.isObject()) {
-            walk(jsonListener, fieldName, (ObjectNode) rootNode);
-            return;
-        }
-
-        if (rootNode.isArray()) {
-            walkArrayNode(jsonListener, fieldName, (ArrayNode) rootNode);
-        }
-    }
-
-    /**
-     * Walks the JSON data tree. This method is called when the user knows the
-     * json node type is ArrayNode.
-     *
-     * @param jsonListener Json listener implemented by the user
-     * @param fieldName    the original object node field
-     * @param rootNode     the json node which needs to be walk
-     */
-    private void walkArrayNode(JsonListener jsonListener, String fieldName,
-                               ArrayNode rootNode) {
-        if (rootNode == null) {
-            return;
-        }
-        //enter the array node.
-        jsonListener.enterJsonNode(fieldName, rootNode);
-        Iterator<JsonNode> children = rootNode.elements();
-        while (children.hasNext()) {
-            JsonNode currentChild = children.next();
-            if (currentChild.isContainerNode()) {
-                walkJsonNode(jsonListener, null, currentChild);
-            }
-        }
-        jsonListener.exitJsonNode(rootNode);
-    }
-}
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/JsonToYdtListener.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/JsonToYdtListener.java
deleted file mode 100644
index a9df870..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/JsonToYdtListener.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.json;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.JsonNodeType;
-import org.onosproject.protocol.restconf.server.utils.exceptions.JsonParseException;
-import org.onosproject.protocol.restconf.server.utils.parser.api.JsonListener;
-import org.onosproject.protocol.restconf.server.utils.parser.api.NormalizedYangNode;
-import org.onosproject.yms.ydt.YdtBuilder;
-import org.onosproject.yms.ydt.YdtContext;
-import org.slf4j.Logger;
-
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Set;
-import java.util.Stack;
-
-import static com.fasterxml.jackson.databind.node.JsonNodeType.ARRAY;
-import static com.fasterxml.jackson.databind.node.JsonNodeType.MISSING;
-import static com.fasterxml.jackson.databind.node.JsonNodeType.NULL;
-import static com.fasterxml.jackson.databind.node.JsonNodeType.POJO;
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.onosproject.protocol.restconf.server.utils.parser.json.ParserUtils.buildNormalizedNode;
-import static org.onosproject.yms.ydt.YdtType.MULTI_INSTANCE_NODE;
-import static org.onosproject.yms.ydt.YdtType.SINGLE_INSTANCE_NODE;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Represents default implementation of codec JSON listener.
- */
-public class JsonToYdtListener implements JsonListener {
-
-    private static final String INPUT_FIELD_NAME = "input";
-    private static final String COLON = ":";
-    private static final int INPUT_FIELD_LENGTH = 2;
-    private static final String E_UNSUP_TYPE = "Unsupported node type %s " +
-            "field name is %s fieldName";
-    private static final String EMPTY_STRING = "null";
-
-    private Logger log = getLogger(getClass());
-
-    private YdtBuilder ydtBuilder;
-    private NormalizedYangNode defaultMultiInsNode;
-    private Stack<NormalizedYangNode> nameStack = new Stack<>();
-    private YdtContext rpcModule;
-    private boolean isListArray = false;
-
-    /**
-     * Creates a listener for the process of a Json Object, the listener will
-     * try to transfer the JSON object to a Ydt builder.
-     *
-     * @param ydtBuilder the YDT builder to build a YDT object
-     */
-    public JsonToYdtListener(YdtBuilder ydtBuilder) {
-        this.ydtBuilder = ydtBuilder;
-    }
-
-    @Override
-    public void enterJsonNode(String fieldName, JsonNode node) {
-        if (isNullOrEmpty(fieldName)) {
-            if (defaultMultiInsNode != null) {
-                ydtBuilder.addChild(defaultMultiInsNode.getName(),
-                                    defaultMultiInsNode.getNamespace(),
-                                    MULTI_INSTANCE_NODE);
-            }
-            return;
-        }
-        NormalizedYangNode normalizedNode = buildNormalizedNode(fieldName);
-        JsonNodeType nodeType = node.getNodeType();
-        switch (nodeType) {
-            case OBJECT:
-                processObjectNode(normalizedNode);
-                break;
-
-            case ARRAY:
-                processArrayNode(normalizedNode, node);
-                break;
-
-            //TODO for now, just process the following three node type
-            case STRING:
-            case NUMBER:
-            case BOOLEAN:
-                processLeafNode(normalizedNode, node.asText());
-                break;
-
-            case BINARY:
-            case MISSING:
-            case NULL:
-            case POJO:
-                log.trace("Unimplemented node type {}", nodeType);
-                break;
-
-            default:
-                throw new JsonParseException(String.format(E_UNSUP_TYPE,
-                                                           nodeType, fieldName));
-        }
-    }
-
-    @Override
-    public void exitJsonNode(JsonNode jsonNode) {
-
-        if (isListArray) {
-            isListArray = false;
-            ydtBuilder.traverseToParent();
-            return;
-        }
-
-        if (jsonNode.getNodeType() == ARRAY) {
-            // Since node is not pushed to stack when array node is empty.
-            // It should not be poped.
-            ArrayNode arrayNode = (ArrayNode) jsonNode;
-            if (arrayNode.size() == 0) {
-                return;
-            }
-
-            //check empty before pop
-            if (nameStack.empty()) {
-                return;
-            }
-            nameStack.pop();
-            //check empty after pop
-            if (nameStack.empty()) {
-                return;
-            }
-            defaultMultiInsNode = nameStack.get(nameStack.size() - 1);
-            return;
-        }
-        // Since node is not added to ydt when node types are binary, missing,
-        // null and pojo, traverse to parent should not be called.
-        JsonNodeType nodeType = jsonNode.getNodeType();
-        if (nodeType != JsonNodeType.BINARY && nodeType != MISSING &&
-                nodeType != NULL && nodeType != POJO) {
-            ydtBuilder.traverseToParent();
-        }
-    }
-
-    private void processObjectNode(NormalizedYangNode node) {
-        ydtBuilder.addChild(node.getName(), node.getNamespace(),
-                            SINGLE_INSTANCE_NODE);
-    }
-
-    private void processLeafNode(NormalizedYangNode node, String value) {
-        String leafValue = value.equalsIgnoreCase(EMPTY_STRING) ? null : value;
-        ydtBuilder.addLeaf(node.getName(), node.getNamespace(), leafValue);
-    }
-
-    private void processArrayNode(NormalizedYangNode normalizedNode,
-                                  JsonNode node) {
-        ArrayNode arrayNode = (ArrayNode) node;
-        if (arrayNode.size() == 0) {
-            return;
-        }
-        Set<String> sets = new LinkedHashSet<>();
-        Iterator<JsonNode> elements = arrayNode.elements();
-        boolean isLeafList = true;
-        while (elements.hasNext()) {
-            JsonNode element = elements.next();
-            JsonNodeType eleType = element.getNodeType();
-
-            if (eleType == JsonNodeType.STRING ||
-                    eleType == JsonNodeType.NUMBER ||
-                    eleType == JsonNodeType.BOOLEAN) {
-                sets.add(element.asText());
-            } else {
-                isLeafList = false;
-            }
-        }
-        if (isLeafList) {
-            //leaf-list
-            ydtBuilder.addLeaf(normalizedNode.getName(),
-                               normalizedNode.getNamespace(), sets);
-            isListArray = true;
-        } else {
-            defaultMultiInsNode = normalizedNode;
-            nameStack.push(defaultMultiInsNode);
-        }
-    }
-}
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/ParserUtils.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/ParserUtils.java
deleted file mode 100644
index c00e265..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/ParserUtils.java
+++ /dev/null
@@ -1,583 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.json;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Lists;
-import org.onosproject.protocol.restconf.server.utils.exceptions.JsonParseException;
-import org.onosproject.protocol.restconf.server.utils.parser.api.JsonBuilder;
-import org.onosproject.protocol.restconf.server.utils.parser.api.NormalizedYangNode;
-import org.onosproject.yms.app.ydt.YdtExtendedContext;
-import org.onosproject.yms.app.ydt.YdtSingleInstanceLeafNode;
-import org.onosproject.yms.ydt.YdtBuilder;
-import org.onosproject.yms.ydt.YdtContext;
-import org.onosproject.yms.ydt.YdtContextOperationType;
-import org.onosproject.yms.ydt.YdtListener;
-import org.onosproject.yms.ydt.YdtType;
-import org.onosproject.yms.ydt.YdtWalker;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.List;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.yms.ydt.YdtContextOperationType.NONE;
-
-/**
- * Utils to complete the conversion between JSON and YDT(YANG DATA MODEL).
- */
-public final class ParserUtils {
-
-    private static final Splitter SLASH_SPLITTER = Splitter.on('/');
-    private static final Splitter COMMA_SPLITTER = Splitter.on(',');
-    private static final String EQUAL = "=";
-    private static final String COMMA = ",";
-    private static final String COLON = ":";
-    private static final String SLASH = "/";
-    private static final String URI_ENCODING_CHAR_SET = "ISO-8859-1";
-    private static final String ERROR_LIST_MSG = "List/Leaf-list node should be " +
-            "in format \"nodeName=key\"or \"nodeName=instance-value\"";
-    private static final String ERROR_MODULE_MSG = "First node should be in " +
-            "format \"moduleName:nodeName\"";
-
-    // no instantiation
-    private ParserUtils() {
-    }
-
-    /**
-     * Converts  URI identifier to YDT builder.
-     *
-     * @param id      the uri identifier from web request
-     * @param builder the base ydt builder
-     * @param opType  the ydt operation type for the uri
-     */
-    public static void convertUriToYdt(String id,
-                                       YdtBuilder builder,
-                                       YdtContextOperationType opType) {
-        checkNotNull(id, "uri identifier should not be null");
-        List<String> paths = urlPathArgsDecode(SLASH_SPLITTER.split(id));
-        if (!paths.isEmpty()) {
-            processPathSegments(paths, builder, opType, true);
-        }
-    }
-
-    /**
-     * Converts  JSON objectNode to YDT builder. The objectNode can be any
-     * standard JSON node, node just for RESTconf payload.
-     *
-     * @param objectNode the objectNode from web request
-     * @param builder    the base ydt builder
-     */
-    public static void convertJsonToYdt(ObjectNode objectNode,
-                                        YdtBuilder builder) {
-
-        JsonToYdtListener listener = new JsonToYdtListener(builder);
-        new DefaultJsonWalker().walk(listener, null, objectNode);
-    }
-
-    /**
-     * Converts a Ydt context tree to a JSON object.
-     *
-     * @param rootName the name of the YdtContext from which the YdtListener
-     *                 start to builder a Json Object
-     * @param context  a abstract data model for YANG data
-     * @param walker   abstraction of an entity which provides interfaces for
-     *                 YDT walk
-     * @return the JSON node corresponding the YANG data
-     */
-    public static ObjectNode convertYdtToJson(String rootName,
-                                              YdtContext context,
-                                              YdtWalker walker) {
-        JsonBuilder builder = new DefaultJsonBuilder();
-        YdtListener listener = new YdtToJsonListener(rootName, builder);
-        walker.walk(listener, context);
-        return builder.getTreeNode();
-    }
-
-    /**
-     * Converts a list of path segments to a YDT builder tree.
-     *
-     * @param paths            the list of path segments split from URI
-     * @param builder          the base YDT builder
-     * @param opType           the YDT operation type for the Path segment
-     * @param isFirstIteration true if paths contains all the URI segments
-     * @return the YDT builder with the tree info of paths
-     */
-    private static YdtBuilder processPathSegments(List<String> paths,
-                                                  YdtBuilder builder,
-                                                  YdtContextOperationType opType,
-                                                  boolean isFirstIteration) {
-        if (paths.isEmpty()) {
-            return builder;
-        }
-
-        boolean isLastSegment = paths.size() == 1;
-
-        /*
-         * Process the first segment in path.
-         *
-         * BUG ONOS-5500: YMS requires the treatment for the very first
-         * segment in the URI path to be different than the rest. So,
-         * we added a parameter, isFirstIteration, to this function.
-         * It is set to true by the caller when this function is called
-         * the very first time (i.e,, "paths" contains all the segments).
-         *
-         */
-        YdtContextOperationType opTypeForThisSegment = isLastSegment ? opType : NONE;
-        String segment = paths.iterator().next();
-        processSinglePathSegment(segment, builder, opTypeForThisSegment, isFirstIteration);
-
-        if (isLastSegment) {
-            // We have hit the base case of recursion.
-            return builder;
-        }
-
-        /*
-         * Chop off the first segment, and recursively process the rest
-         * of the path segments.
-         */
-        List<String> remainPaths = paths.subList(1, paths.size());
-        processPathSegments(remainPaths, builder, opType, false);
-
-        return builder;
-    }
-
-    private static void processSinglePathSegment(String pathSegment,
-                                                 YdtBuilder builder,
-                                                 YdtContextOperationType opType,
-                                                 boolean isTopLevelSegment) {
-        if (pathSegment.contains(COLON)) {
-            processPathSegmentWithNamespace(pathSegment, builder, opType, isTopLevelSegment);
-        } else {
-            processPathSegmentWithoutNamespace(pathSegment, builder, opType);
-        }
-    }
-
-    private static void processPathSegmentWithNamespace(String pathSegment,
-                                                        YdtBuilder builder,
-                                                        YdtContextOperationType opType,
-                                                        boolean isTopLevelSegment) {
-        if (isTopLevelSegment) {
-            /*
-             * BUG ONOS-5500: If this segment refers to the first node in
-             * the path (i.e., top level of the model hierarchy), then
-             * YMS requires 2 YDT nodes to be added instead of one. The
-             * first one contains the namespace, and the second contains
-             * the node name. For other segments in the path, only one
-             * YDT node is needed.
-             */
-            addModule(builder, pathSegment);
-        }
-
-        String nodeName = getLatterSegment(pathSegment, COLON);
-        String namespace = getPreSegment(pathSegment, COLON);
-        convertPathSegmentToYdtNode(nodeName, namespace, builder, opType);
-    }
-
-    private static void processPathSegmentWithoutNamespace(String pathSegment,
-                                                           YdtBuilder builder,
-                                                           YdtContextOperationType opType) {
-        convertPathSegmentToYdtNode(pathSegment, null, builder, opType);
-    }
-
-    private static void convertPathSegmentToYdtNode(String pathSegment,
-                                                    String namespace,
-                                                    YdtBuilder builder,
-                                                    YdtContextOperationType opType) {
-        if (pathSegment.contains(EQUAL)) {
-            addListOrLeafList(pathSegment, namespace, builder, opType);
-        } else {
-            addLeaf(pathSegment, namespace, builder, opType);
-        }
-    }
-
-    private static YdtBuilder addListOrLeafList(String path,
-                                                String namespace,
-                                                YdtBuilder builder,
-                                                YdtContextOperationType opType) {
-        String nodeName = getPreSegment(path, EQUAL);
-        String keyStr = getLatterSegment(path, EQUAL);
-        if (keyStr == null) {
-            throw new JsonParseException(ERROR_LIST_MSG);
-        }
-
-        if (keyStr.contains(COMMA)) {
-            List<String> keys = Lists.
-                    newArrayList(COMMA_SPLITTER.split(keyStr));
-            builder.addMultiInstanceChild(nodeName, namespace, keys, opType);
-        } else {
-            builder.addMultiInstanceChild(nodeName, namespace,
-                                          Lists.newArrayList(keyStr), opType);
-        }
-        return builder;
-    }
-
-    private static YdtBuilder addLeaf(String path,
-                                      String namespace,
-                                      YdtBuilder builder,
-                                      YdtContextOperationType opType) {
-        checkNotNull(path);
-        builder.addChild(path, namespace, opType);
-        return builder;
-    }
-
-    private static YdtBuilder addModule(YdtBuilder builder, String path) {
-        String moduleName = getPreSegment(path, COLON);
-        if (moduleName == null) {
-            throw new JsonParseException(ERROR_MODULE_MSG);
-        }
-        builder.addChild(moduleName, null, YdtType.SINGLE_INSTANCE_NODE);
-        return builder;
-    }
-
-    private static YdtBuilder addNode(String path, YdtBuilder builder,
-                                      YdtContextOperationType opType) {
-        String nodeName = getLatterSegment(path, COLON);
-        builder.addChild(nodeName,
-                         null,
-                         YdtType.SINGLE_INSTANCE_NODE,
-                         opType);
-        return builder;
-    }
-
-    /**
-     * Returns the previous segment of a path which is separated by a split char.
-     * For example:
-     * <pre>
-     * "foo:bar", ":"   -->  "foo"
-     * </pre>
-     *
-     * @param path      the original path string
-     * @param splitChar char used to split the path
-     * @return the previous segment of the path
-     */
-    private static String getPreSegment(String path, String splitChar) {
-        int idx = path.indexOf(splitChar);
-        if (idx == -1) {
-            return null;
-        }
-
-        if (path.indexOf(splitChar, idx + 1) != -1) {
-            return null;
-        }
-
-        return path.substring(0, idx);
-    }
-
-    /**
-     * Returns the latter segment of a path which is separated by a split char.
-     * For example:
-     * <pre>
-     * "foo:bar", ":"   -->  "bar"
-     * </pre>
-     *
-     * @param path      the original path string
-     * @param splitChar char used to split the path
-     * @return the latter segment of the path
-     */
-    private static String getLatterSegment(String path, String splitChar) {
-        int idx = path.indexOf(splitChar);
-        if (idx == -1) {
-            return path;
-        }
-
-        if (path.indexOf(splitChar, idx + 1) != -1) {
-            return null;
-        }
-
-        return path.substring(idx + 1);
-    }
-
-    /**
-     * Converts a list of path from the original format to ISO-8859-1 code.
-     *
-     * @param paths the original paths
-     * @return list of decoded paths
-     */
-    public static List<String> urlPathArgsDecode(Iterable<String> paths) {
-        try {
-            List<String> decodedPathArgs = new ArrayList<>();
-            for (String pathArg : paths) {
-                String decode = URLDecoder.decode(pathArg,
-                                                  URI_ENCODING_CHAR_SET);
-                decodedPathArgs.add(decode);
-            }
-            return decodedPathArgs;
-        } catch (UnsupportedEncodingException e) {
-            throw new JsonParseException("Invalid URL path arg '" +
-                                                 paths + "': ", e);
-        }
-    }
-
-    /**
-     * Converts a field to a simple YANG node description which contains the
-     * namespace and name information.
-     *
-     * @param field field name of a JSON body, or a segment of a URI
-     *              in a request of RESTCONF
-     * @return a simple normalized YANG node
-     */
-    public static NormalizedYangNode buildNormalizedNode(String field) {
-        String namespace = getPreSegment(field, COLON);
-        String name = getLatterSegment(field, COLON);
-        return new NormalizedYangNode(namespace, name);
-    }
-
-
-    /**
-     * Extracts the node name from a YDT node and encodes it in JSON format.
-     * A JSON encoded node name has the following format:
-     * <p>
-     * module_name ":" node_name
-     * <p>
-     * where module_name is name of the YANG module in which the data
-     * resource is defined, and node_name is the name of the data resource.
-     * <p>
-     * If the YDT node is null or its node name field is null, then the function
-     * returns null. If the node name field is not null but module name field is,
-     * then the function returns only the node name.
-     *
-     * @param ydtContext YDT node of the target data resource
-     * @return JSON encoded name of the target data resource
-     */
-    public static String getJsonNameFromYdtNode(YdtContext ydtContext) {
-        if (ydtContext == null) {
-            return null;
-        }
-
-        String nodeName = ydtContext.getName();
-        if (nodeName == null) {
-            return null;
-        }
-
-        /*
-         * The namespace field in YDT node is a string which contains a list
-         * of identifiers separated by colon (:). e.g.,
-         *
-         * {identifier ":" identifier}+
-         *
-         * The last identifier in the string is the YANG module name.
-         */
-        String moduleName = getModuleNameFromNamespace(ydtContext.getNamespace());
-        if (moduleName == null) {
-            return nodeName;
-        } else {
-            return moduleName + COLON + nodeName;
-        }
-    }
-
-    private static String getModuleNameFromNamespace(String namespace) {
-        if (namespace == null) {
-            return null;
-        }
-
-        String moduleName = null;
-
-        if (namespace.contains(COLON)) {
-            String[] tokens = namespace.split(COLON);
-            moduleName = tokens[tokens.length - 1];
-        }
-
-        return moduleName;
-    }
-
-    /**
-     * Extracts the URI from the given YANG Data Tree (YDT). The URI is
-     * presented in string format. If no URI is found in the YDT, an
-     * empty string is returned.
-     *
-     * @param ydtBuilder the YDT from which the URI is extracted
-     * @return URI
-     */
-    public static String getUriInCompositeYdt(YdtBuilder ydtBuilder) {
-        checkNotNull(ydtBuilder, "ydt cannot be null");
-
-        StringBuilder uriBuilder = new StringBuilder();
-        YdtContext ydtNode = ydtBuilder.getRootNode().getFirstChild();
-        String currModuleName = null;
-
-        boolean isLastNodeInUri = false;
-        int levelNum = 0;
-        while (((YdtExtendedContext) ydtNode).getYdtContextOperationType() == NONE ||
-                isLastNodeInUri) {
-            currModuleName = addNodeToUri(ydtNode, currModuleName,
-                                          levelNum, uriBuilder);
-
-            if (ydtNode.getYdtType() == YdtType.MULTI_INSTANCE_NODE) {
-                if (isLastNodeInUri) {
-                    addKeyNodeToUri(ydtNode, uriBuilder);
-                    break;
-                }
-
-                YdtContext firstChild = ydtNode.getFirstChild();
-                YdtContext lastChild = ydtNode.getLastChild();
-                if ((firstChild.getYdtType() == YdtType.SINGLE_INSTANCE_LEAF_VALUE_NODE) &&
-                        ((YdtSingleInstanceLeafNode) firstChild).isKeyLeaf()) {
-                    currModuleName = addNodeToUri(firstChild,
-                                                  currModuleName,
-                                                  levelNum,
-                                                  uriBuilder);
-                    ydtNode = lastChild;
-                } else {
-                    currModuleName = addNodeToUri(lastChild,
-                                                  currModuleName,
-                                                  levelNum,
-                                                  uriBuilder);
-                    ydtNode = firstChild;
-                }
-            } else {
-                ydtNode = ydtNode.getFirstChild();
-            }
-
-            if (isLastNodeInUri) {
-                break;
-            }
-
-            if (((YdtExtendedContext) ydtNode).getYdtContextOperationType() != NONE) {
-                isLastNodeInUri = true;
-            }
-
-            levelNum++;
-        }
-
-        return uriBuilder.toString();
-    }
-
-    /**
-     * Finds the key leaf node from the given multi-instance YDT node and
-     * appends the key value to the given URI string.
-     * <p>
-     * If no key leaf node is found, then the given URI is unchanged.
-     *
-     * @param ydtNode    YDT node under which the key leaf node is found
-     * @param uriBuilder URI
-     */
-    private static void addKeyNodeToUri(YdtContext ydtNode,
-                                        StringBuilder uriBuilder) {
-        YdtContext child = ydtNode.getFirstChild();
-
-        while (child != null) {
-            if (child.getYdtType() == YdtType.SINGLE_INSTANCE_LEAF_VALUE_NODE) {
-                if (((YdtSingleInstanceLeafNode) child).isKeyLeaf()) {
-                    uriBuilder.append(EQUAL).append(ydtNode.getValue());
-                    break;
-                }
-            }
-            child = child.getNextSibling();
-        }
-    }
-
-    /**
-     * Extracts the path segment from a given YANG Data Tree (YDT) node and
-     * appends it to the given URI string.
-     *
-     * @param ydtNode        YDT node from which the URI segment is extracted
-     * @param currModuleName current YANG module name in URI
-     * @param ydtNodeDepth   depth of the YDT node's position in the tree
-     * @param uriBuilder     URI to which the URI segment appends
-     * @return YANG module name extracted from the YDT node
-     */
-    private static String addNodeToUri(YdtContext ydtNode,
-                                       String currModuleName,
-                                       int ydtNodeDepth,
-                                       StringBuilder uriBuilder) {
-        YdtType nodeType = ydtNode.getYdtType();
-
-        /*
-         * The given YDT node is the root of the YDT. Only the module name
-         * needs to be extracted and added to URI.
-         */
-        if (ydtNodeDepth == 0) {
-            String moduleName = ydtNode.getModuleNameAsNameSpace();
-            uriBuilder.append(moduleName);
-            return moduleName;
-        }
-
-        if (ydtNodeDepth == 1) {
-            String moduleName = ydtNode.getModuleNameAsNameSpace();
-            uriBuilder.append(COLON);
-            uriBuilder.append(ydtNode.getName());
-            return moduleName;
-        }
-
-        if (nodeType == YdtType.SINGLE_INSTANCE_LEAF_VALUE_NODE &&
-                ((YdtSingleInstanceLeafNode) ydtNode).isKeyLeaf()) {
-            uriBuilder.append(EQUAL).append(ydtNode.getValue());
-            return currModuleName;
-        } else {
-            uriBuilder.append(SLASH);
-        }
-
-        String moduleName = ydtNode.getModuleNameAsNameSpace();
-
-        if (currModuleName == null || !currModuleName.equals(moduleName)) {
-            uriBuilder.append(moduleName).append(COLON);
-        }
-
-        uriBuilder.append(ydtNode.getName());
-
-        return moduleName;
-    }
-
-    /**
-     * Retrieves the top data node of the subtree from the given composite
-     * YANG Data Tree (YDT) which contains both the URI path and the data
-     * subtree to which the URI points.
-     * <p>
-     * A null is returned if no data subtree is found.
-     *
-     * @param ydtBuilder the given YDT
-     * @return the top data node of the data subtree.
-     */
-    public static YdtContext findTopNodeInCompositeYdt(YdtBuilder ydtBuilder) {
-        checkNotNull(ydtBuilder, "ydt cannot be null");
-
-        YdtContext ydtNode = ydtBuilder.getRootNode().getFirstChild();
-        YdtContextOperationType opType = ((YdtExtendedContext) ydtNode).getYdtContextOperationType();
-        while (opType == NONE) {
-            if (ydtNode.getYdtType() == YdtType.MULTI_INSTANCE_NODE) {
-                YdtContext firstChild = ydtNode.getFirstChild();
-                YdtContext lastChild = ydtNode.getLastChild();
-                if (firstChild.getYdtType() == YdtType.SINGLE_INSTANCE_LEAF_VALUE_NODE &&
-                        ((YdtSingleInstanceLeafNode) firstChild).isKeyLeaf()) {
-                    ydtNode = lastChild;
-                } else {
-                    ydtNode = firstChild;
-                }
-            } else {
-                ydtNode = ydtNode.getFirstChild();
-            }
-
-            if (ydtNode == null) {
-                // There is no more node to find in YDT
-                return null;
-            }
-
-            if (((YdtExtendedContext) ydtNode).getYdtContextOperationType() != NONE) {
-                // We found last node
-                break;
-            }
-
-
-            opType = ((YdtExtendedContext) ydtNode).getYdtContextOperationType();
-        }
-
-        return ydtNode;
-    }
-}
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/YdtToJsonListener.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/YdtToJsonListener.java
deleted file mode 100644
index 9479d97..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/YdtToJsonListener.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.json;
-
-import com.fasterxml.jackson.databind.node.JsonNodeType;
-import org.onosproject.protocol.restconf.server.utils.exceptions.YdtParseException;
-import org.onosproject.protocol.restconf.server.utils.parser.api.JsonBuilder;
-import org.onosproject.yms.ydt.YdtContext;
-import org.onosproject.yms.ydt.YdtListener;
-
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.onosproject.protocol.restconf.server.utils.parser.json.ParserUtils.getJsonNameFromYdtNode;
-
-/**
- * Represents implementation of codec YDT listener.
- */
-public class YdtToJsonListener implements YdtListener {
-
-    private static final String EMPTY = "";
-    private JsonBuilder jsonBuilder;
-    //the root name of the json
-    //the input YdtContext is usually a total tree of a YANG resource
-    //this property is used to mark the start of the request node.
-    private String rootName;
-    //the parse state
-    private boolean isBegin;
-
-    /**
-     * Creates a listener for the process of a Ydt, the listener will try to
-     * transfer the Ydt to a JSON Object.
-     *
-     * @param rootName    the name of a specific YdtContext begin to  process
-     * @param jsonBuilder the JSON builder to build a JSON object
-     */
-    public YdtToJsonListener(String rootName, JsonBuilder jsonBuilder) {
-        this.jsonBuilder = jsonBuilder;
-        this.rootName = rootName;
-        this.isBegin = isNullOrEmpty(rootName);
-    }
-
-    @Override
-    public void enterYdtNode(YdtContext ydtContext) {
-        String name = getJsonNameFromYdtNode(ydtContext);
-
-        if (!isBegin && name != null && name.equals(rootName)) {
-            isBegin = true;
-        }
-        if (!isBegin) {
-            return;
-        }
-
-        switch (ydtContext.getYdtType()) {
-
-            case SINGLE_INSTANCE_NODE:
-                jsonBuilder.addNodeTopHalf(name, JsonNodeType.OBJECT);
-                break;
-            case MULTI_INSTANCE_NODE:
-                YdtContext preNode = ydtContext.getPreviousSibling();
-                if (preNode == null || !getJsonNameFromYdtNode(preNode).equals(name)) {
-                    jsonBuilder.addNodeTopHalf(name, JsonNodeType.ARRAY);
-                }
-                jsonBuilder.addNodeTopHalf(EMPTY, JsonNodeType.OBJECT);
-                break;
-            case SINGLE_INSTANCE_LEAF_VALUE_NODE:
-                jsonBuilder.addNodeWithValueTopHalf(name, ydtContext.getValue());
-                break;
-            case MULTI_INSTANCE_LEAF_VALUE_NODE:
-                jsonBuilder.addNodeWithSetTopHalf(name, ydtContext.getValueSet());
-                break;
-            case LOGICAL_ROOT_NODE:
-                break;
-            default:
-                throw new YdtParseException("unknown Ydt type " +
-                                                    ydtContext.getYdtType());
-        }
-
-    }
-
-    @Override
-    public void exitYdtNode(YdtContext ydtContext) {
-
-        if (!isBegin) {
-            return;
-        }
-
-        String curName = getJsonNameFromYdtNode(ydtContext);
-        YdtContext nextNode = ydtContext.getNextSibling();
-        switch (ydtContext.getYdtType()) {
-
-            case SINGLE_INSTANCE_NODE:
-                jsonBuilder.addNodeBottomHalf(JsonNodeType.OBJECT);
-                break;
-            case MULTI_INSTANCE_NODE:
-                if (nextNode == null || !getJsonNameFromYdtNode(nextNode).equals(curName)) {
-                    jsonBuilder.addNodeBottomHalf(JsonNodeType.OBJECT);
-                    jsonBuilder.addNodeBottomHalf(JsonNodeType.ARRAY);
-                } else {
-                    jsonBuilder.addNodeBottomHalf(JsonNodeType.OBJECT);
-                }
-                break;
-            case SINGLE_INSTANCE_LEAF_VALUE_NODE:
-                jsonBuilder.addNodeBottomHalf(JsonNodeType.STRING);
-                break;
-            case MULTI_INSTANCE_LEAF_VALUE_NODE:
-                jsonBuilder.addNodeBottomHalf(JsonNodeType.ARRAY);
-                break;
-            case LOGICAL_ROOT_NODE:
-                break;
-            default:
-                throw new YdtParseException("Unknown Ydt type " +
-                                                    ydtContext.getYdtType());
-        }
-        if (curName.equals(rootName) &&
-                (nextNode == null || !getJsonNameFromYdtNode(nextNode).equals(rootName))) {
-            isBegin = false;
-        }
-    }
-}
diff --git a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/package-info.java b/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/package-info.java
deleted file mode 100644
index 3e3c49b..0000000
--- a/protocols/restconf/server/utils/src/main/java/org/onosproject/protocol/restconf/server/utils/parser/json/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Provider utilities to support the data format based encoding and decoding,
- * used by YMSC to operate on different data format and YDT(YANG DATA TYPE).
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.json;
\ No newline at end of file
diff --git a/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/api/TestYangSchemaId.java b/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/api/TestYangSchemaId.java
deleted file mode 100644
index fb04710..0000000
--- a/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/api/TestYangSchemaId.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.api;
-
-import java.util.Objects;
-
-/**
- * A test class which represents YANG data node identifier which is a
- * combination of name and namespace.
- */
-public class TestYangSchemaId {
-    private String name;
-    private String namespace;
-
-    /**
-     * Returns the name of the node.
-     *
-     * @return name of the node
-     */
-    public String getName() {
-        return this.name;
-    }
-
-    /**
-     * Sets name of the node.
-     *
-     * @param name name of the node
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    /**
-     * Returns namespace of the node.
-     *
-     * @return namespace of the node
-     */
-    public String getNameSpace() {
-        return this.namespace;
-    }
-
-    /**
-     * Sets namespace of the node.
-     *
-     * @param namespace namespace of the node
-     */
-    public void setNameSpace(String namespace) {
-        this.namespace = namespace;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        } else if (!(obj instanceof TestYangSchemaId)) {
-            return false;
-        } else {
-            TestYangSchemaId other = (TestYangSchemaId) obj;
-            return Objects.equals(this.name, other.name) &&
-                    Objects.equals(this.namespace, other.namespace);
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(this.name, this.namespace);
-    }
-}
diff --git a/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/api/TestYdtBuilder.java b/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/api/TestYdtBuilder.java
deleted file mode 100644
index 03cddba..0000000
--- a/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/api/TestYdtBuilder.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.api;
-
-import org.onosproject.yms.ydt.YdtBuilder;
-import org.onosproject.yms.ydt.YdtContext;
-import org.onosproject.yms.ydt.YdtContextOperationType;
-import org.onosproject.yms.ydt.YdtType;
-import org.onosproject.yms.ydt.YmsOperationType;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static org.onosproject.yms.ydt.YdtContextOperationType.NONE;
-import static org.onosproject.yms.ydt.YdtType.MULTI_INSTANCE_LEAF_VALUE_NODE;
-import static org.onosproject.yms.ydt.YdtType.SINGLE_INSTANCE_LEAF_VALUE_NODE;
-import static org.onosproject.yms.ydt.YdtType.SINGLE_INSTANCE_NODE;
-
-/**
- * A test class which represents YANG request work bench which contains all
- * parameters for request handling and methods to build and obtain YANG data
- * tree which is data (sub)instance representation, abstract of protocol.
- */
-public class TestYdtBuilder implements YdtBuilder {
-
-    private TestYdtNode curNode;
-
-    private TestYdtNode rootNode;
-
-    private final YmsOperationType ymsOperationType;
-
-    private YdtContextOperationType ydtDefaultOpType;
-
-    /**
-     * Creates an instance of YANG request work bench which is use to initialize
-     * logical rootNode and and schema registry.
-     *
-     * @param name      name of logical container of a protocol
-     *                  which is a holder of the complete tree
-     * @param namespace namespace of logical container
-     * @param opType    type of operation done by using YANG
-     *                  interface
-     */
-    public TestYdtBuilder(String name, String namespace,
-                          YmsOperationType opType) {
-        TestYangSchemaId nodeId = new TestYangSchemaId();
-        nodeId.setName(name);
-        nodeId.setNameSpace(namespace);
-        setRootNode(new TestYdtNode(nodeId, SINGLE_INSTANCE_NODE));
-        ymsOperationType = opType;
-    }
-
-    private void setRootNode(TestYdtNode node) {
-        rootNode = node;
-        curNode = node;
-    }
-
-    @Override
-    public YdtContext getRootNode() {
-        return rootNode;
-    }
-
-    @Override
-    public YmsOperationType getYmsOperationType() {
-        return ymsOperationType;
-    }
-
-    @Override
-    public void setRootTagAttributeMap(Map<String, String> attributeTag) {
-
-    }
-
-    @Override
-    public Map<String, String> getRootTagAttributeMap() {
-        return null;
-    }
-
-    @Override
-    public void addChild(String name, String namespace) {
-        addChild(name, namespace, SINGLE_INSTANCE_NODE, NONE);
-    }
-
-    @Override
-    public void addChild(String name, String namespace, YdtType ydtType) {
-        addChild(name, namespace, ydtType, NONE);
-    }
-
-    @Override
-    public void addChild(String name, String namespace,
-                         YdtContextOperationType opType) {
-        addChild(name, namespace, SINGLE_INSTANCE_NODE, opType);
-    }
-
-    @Override
-    public void addChild(String name, String namespace, YdtType ydtType,
-                         YdtContextOperationType opType) {
-        TestYangSchemaId id = new TestYangSchemaId();
-        id.setName(name);
-        String ns = namespace != null ? namespace :
-                curNode.getYdtNodeIdentifier().getNameSpace();
-        id.setNameSpace(ns);
-        TestYdtNode childNode = new TestYdtNode(id, ydtType);
-
-        YdtContextOperationType type = opType == null ? NONE : opType;
-        childNode.setYdtContextOperationType(type);
-
-        curNode.addChild(childNode);
-
-        // Updating the curNode.
-        curNode = childNode;
-    }
-
-    @Override
-    public void addLeaf(String name, String namespace, String value) {
-        addLeaf(name, namespace, value, null, SINGLE_INSTANCE_LEAF_VALUE_NODE);
-    }
-
-    @Override
-    public void addLeaf(String name, String namespace, Set<String> valueSet) {
-        addLeaf(name, namespace, null, valueSet, MULTI_INSTANCE_LEAF_VALUE_NODE);
-    }
-
-    @Override
-    public void addMultiInstanceChild(String name, String namespace,
-                                      List<String> valueList,
-                                      YdtContextOperationType operationType) {
-        addChild(name, namespace, MULTI_INSTANCE_LEAF_VALUE_NODE,
-                 operationType);
-        if (curNode.getYdtType() == MULTI_INSTANCE_LEAF_VALUE_NODE) {
-            for (String value : valueList) {
-                curNode.addValue(value);
-            }
-        }
-    }
-
-    private void addLeaf(String name, String namespace, String value,
-                         Set<String> valueSet, YdtType ydtType) {
-        addChild(name, namespace, ydtType, NONE);
-
-        if (value != null) {
-            curNode.addValue(value);
-        } else if (valueSet != null) {
-            curNode.addValueSet(valueSet);
-        }
-    }
-
-    @Override
-    public void traverseToParent() {
-        curNode = curNode.getParent();
-    }
-
-    @Override
-    public YdtContext getCurNode() {
-        return curNode;
-    }
-
-    @Override
-    public void setDefaultEditOperationType(YdtContextOperationType opType) {
-        ydtDefaultOpType = opType;
-    }
-
-    /**
-     * Returns the default context operation type of a YDT builder.
-     *
-     * @return default context operation type
-     */
-    public YdtContextOperationType getYdtDefaultOpType() {
-        return ydtDefaultOpType;
-    }
-
-    @Override
-    public void addNode(String name, String namespace) throws IllegalArgumentException {
-        addChild(name, namespace, SINGLE_INSTANCE_NODE, null);
-    }
-}
diff --git a/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/api/TestYdtNode.java b/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/api/TestYdtNode.java
deleted file mode 100644
index c7a9bbf..0000000
--- a/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/api/TestYdtNode.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.api;
-
-import org.onosproject.yms.ydt.YdtContext;
-import org.onosproject.yms.ydt.YdtContextOperationType;
-import org.onosproject.yms.ydt.YdtExtendedInfoType;
-import org.onosproject.yms.ydt.YdtType;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A test class which represents a general instance node in YANG data tree.
- */
-public class TestYdtNode implements YdtContext {
-
-    private TestYdtNode parent;
-    private TestYdtNode child;
-    private TestYdtNode nextSibling;
-    private TestYdtNode previousSibling;
-    private TestYdtNode lastChild;
-    private YdtType ydtType;
-    private String value;
-    private final Set<String> valueSet = new HashSet<>();
-    private TestYangSchemaId id;
-    private YdtContextOperationType ydtContextOperationType;
-
-    /**
-     * Creates a general YANG instance node object.
-     *
-     * @param id      node identifier of YDT multi instance node .
-     * @param ydtType type of YDT node to be added
-     */
-    public TestYdtNode(TestYangSchemaId id, YdtType ydtType) {
-        this.id = id;
-        this.ydtType = ydtType;
-    }
-
-    @Override
-    public String getName() {
-        return id.getName();
-    }
-
-    @Override
-    public String getNamespace() {
-        return id.getNameSpace();
-    }
-
-    @Override
-    public String getModuleNameAsNameSpace() {
-        return null;
-    }
-
-    @Override
-    public <T> T getYdtContextExtendedInfo() {
-        return null;
-    }
-
-    @Override
-    public YdtExtendedInfoType getYdtExtendedInfoType() {
-        return null;
-    }
-
-    @Override
-    public YdtType getYdtType() {
-        return ydtType;
-    }
-
-    @Override
-    public TestYdtNode getParent() {
-        return parent;
-    }
-
-    @Override
-    public TestYdtNode getFirstChild() {
-        return child;
-    }
-
-    @Override
-    public TestYdtNode getLastChild() {
-        return lastChild;
-    }
-
-    @Override
-    public TestYdtNode getNextSibling() {
-        return nextSibling;
-    }
-
-    @Override
-    public YdtContext getPreviousSibling() {
-        return previousSibling;
-    }
-
-    @Override
-    public String getValue() {
-        return value;
-    }
-
-    @Override
-    public Set<String> getValueSet() {
-        return valueSet;
-    }
-
-    /**
-     * Sets the parent of node.
-     *
-     * @param parent node
-     */
-    public void setParent(TestYdtNode parent) {
-        this.parent = parent;
-    }
-
-    /**
-     * Sets the first instance of a child node.
-     *
-     * @param child is only child to be set
-     */
-    public void setChild(TestYdtNode child) {
-        this.child = child;
-    }
-
-    /**
-     * Sets the last instance of a child node.
-     *
-     * @param child is last child to be set
-     */
-    public void setLastChild(TestYdtNode child) {
-        lastChild = child;
-    }
-
-    /**
-     * Sets the next sibling of node.
-     *
-     * @param sibling YANG node
-     */
-    public void setNextSibling(TestYdtNode sibling) {
-        nextSibling = sibling;
-    }
-
-    /**
-     * Sets the previous sibling.
-     *
-     * @param previousSibling points to predecessor sibling
-     */
-    public void setPreviousSibling(TestYdtNode previousSibling) {
-        this.previousSibling = previousSibling;
-    }
-
-    /**
-     * Returns object node identifier.
-     *
-     * @return node identifier
-     */
-    public TestYangSchemaId getYdtNodeIdentifier() {
-        return id;
-    }
-
-    /**
-     * Adds a child node.
-     * The children sibling list will be sorted based on node
-     * type. This will add single child or sub-tree based on isAtomic flag.
-     *
-     * @param newChild refers to a new child to be added
-     */
-    public void addChild(YdtContext newChild) {
-        TestYdtNode node = (TestYdtNode) newChild;
-
-        if (node.getParent() == null) {
-            node.setParent(this);
-        }
-
-        // If new node needs to be added as first child.
-        if (getFirstChild() == null) {
-            setChild(node);
-            setLastChild(node);
-            return;
-        }
-
-        // If new node needs to be added as last child.
-        TestYdtNode curNode = getLastChild();
-        curNode.setNextSibling(node);
-        node.setPreviousSibling(curNode);
-        setLastChild(node);
-    }
-
-    /**
-     * Adds the given value to the non single instance leaf node.
-     *
-     * @param value value in a single instance node
-     */
-    public void addValue(String value) {
-        this.value = value;
-    }
-
-    /**
-     * Adds the given valueSet to the non multi instance leaf node.
-     *
-     * @param values value set in a multi instance leaf node
-     */
-    public void addValueSet(Set<String> values) {
-        valueSet.addAll(values);
-    }
-
-
-    /**
-     * Sets the context operation type for the YDT node.
-     *
-     * @param opType context operation type
-     */
-    public void setYdtContextOperationType(YdtContextOperationType opType) {
-        this.ydtContextOperationType = opType;
-    }
-
-    /**
-     * Returns the context operation type for the YDT node.
-     *
-     * @return context operation type
-     */
-    public YdtContextOperationType getYdtContextOperationType() {
-        return ydtContextOperationType;
-    }
-}
diff --git a/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/json/DefaultJsonWalkerTest.java b/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/json/DefaultJsonWalkerTest.java
deleted file mode 100644
index 0c4f9b0..0000000
--- a/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/json/DefaultJsonWalkerTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.json;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.junit.Before;
-import org.junit.Test;
-import org.onosproject.protocol.restconf.server.utils.parser.api.JsonListener;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.Is.is;
-
-public class DefaultJsonWalkerTest {
-
-    private static final String[] EXP_TEXT_ARRAY = {
-            "Enter: type is OBJECT name is null",
-            "Enter: type is STRING name is name",
-            "Exit: type is STRING",
-            "Enter: type is STRING name is surname",
-            "Exit: type is STRING",
-            "Exit: type is OBJECT"
-    };
-
-    private static final String[] EXP_NODE_LIST_ARRAY = {
-            "Enter: type is OBJECT name is null",
-            "Enter: type is STRING name is surname",
-            "Exit: type is STRING",
-            "Enter: type is ARRAY name is networklist",
-            "Exit: type is ARRAY",
-            "Exit: type is OBJECT"
-    };
-
-    private static final String[] EXP_NODE_WITH_ARRAY = {
-            "Enter: type is OBJECT name is null",
-            "Enter: type is STRING name is surname",
-            "Exit: type is STRING",
-            "Enter: type is ARRAY name is networklist",
-            "Enter: type is OBJECT name is null",
-            "Enter: type is STRING name is network-id",
-            "Exit: type is STRING",
-            "Enter: type is STRING name is server-provided",
-            "Exit: type is STRING",
-            "Exit: type is OBJECT",
-            "Enter: type is OBJECT name is null",
-            "Enter: type is STRING name is network-id",
-            "Exit: type is STRING",
-            "Enter: type is STRING name is server-provided",
-            "Exit: type is STRING",
-            "Exit: type is OBJECT",
-            "Enter: type is OBJECT name is null",
-            "Enter: type is STRING name is network-id",
-            "Exit: type is STRING",
-            "Enter: type is STRING name is server-provided",
-            "Exit: type is STRING",
-            "Exit: type is OBJECT",
-            "Exit: type is ARRAY",
-            "Exit: type is OBJECT"
-    };
-    private static final String WRONG_CONTENT_MSG = "Wrong content in array";
-
-    private final List<String> logger = new ArrayList<>();
-
-    DefaultJsonWalker defaultJsonWalker = new DefaultJsonWalker();
-    InternalJsonListener jsonListener = new InternalJsonListener();
-
-    ObjectNode arrayNode;
-    ObjectNode textNode;
-    ObjectNode listNode;
-
-    @Before
-    public void setup() throws Exception {
-        textNode = loadJsonFile("/textNode.json");
-        listNode = loadJsonFile("/listNode.json");
-        arrayNode = loadJsonFile("/arrayNode.json");
-    }
-
-    private ObjectNode loadJsonFile(String path) throws Exception {
-        InputStream jsonStream = getClass().getResourceAsStream(path);
-        ObjectMapper mapper = new ObjectMapper();
-        return (ObjectNode) mapper.readTree(jsonStream);
-    }
-
-    private void assertWalkResult(String[] expectArray, List<String> logger) {
-        for (int i = 0; i < expectArray.length; i++) {
-            assertThat(WRONG_CONTENT_MSG,
-                       true,
-                       is(logger.get(i).contentEquals(expectArray[i])));
-        }
-    }
-
-    @Test
-    public void testWalkTextNode() throws Exception {
-
-        defaultJsonWalker.walk(jsonListener, null, textNode);
-        assertWalkResult(EXP_TEXT_ARRAY, logger);
-    }
-
-    @Test
-    public void testWalkNodeWithList() throws Exception {
-        defaultJsonWalker.walk(jsonListener, null, listNode);
-        assertWalkResult(EXP_NODE_LIST_ARRAY, logger);
-    }
-
-    @Test
-    public void testWalkNodeWithArray() throws Exception {
-        defaultJsonWalker.walk(jsonListener, null, arrayNode);
-        assertWalkResult(EXP_NODE_WITH_ARRAY, logger);
-    }
-
-    private class InternalJsonListener implements JsonListener {
-
-        @Override
-        public void enterJsonNode(String fieldName, JsonNode node) {
-            logger.add("Enter: type is " + node.getNodeType() + " name is " +
-                               fieldName);
-        }
-
-        @Override
-        public void exitJsonNode(JsonNode node) {
-            logger.add("Exit: type is " + node.getNodeType());
-        }
-    }
-}
\ No newline at end of file
diff --git a/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/json/JsonToYdtListenerTest.java b/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/json/JsonToYdtListenerTest.java
deleted file mode 100644
index 07cc223..0000000
--- a/protocols/restconf/server/utils/src/test/java/org/onosproject/protocol/restconf/server/utils/parser/json/JsonToYdtListenerTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.protocol.restconf.server.utils.parser.json;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableSet;
-import org.junit.Before;
-import org.junit.Test;
-import org.onosproject.protocol.restconf.server.utils.parser.api.JsonWalker;
-import org.onosproject.protocol.restconf.server.utils.parser.api.TestYdtBuilder;
-import org.onosproject.yms.ydt.YdtBuilder;
-import org.onosproject.yms.ydt.YdtContext;
-
-import java.io.InputStream;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.onosproject.yms.ydt.YdtType.*;
-import static org.onosproject.yms.ydt.YmsOperationType.QUERY_REQUEST;
-
-/**
- * Unit tests for JsonToYtdListener.
- */
-public class JsonToYdtListenerTest {
-    private static final String RESTCONF_ROOT = "/onos/restconf";
-    private static final String WRONG_STRUCTURE = "The Ydt structure is wrong!";
-    private static final String WRONG_TYPE = "The Ydt type is wrong!";
-
-    private YdtBuilder builder;
-    private JsonToYdtListener listener;
-    private JsonWalker jsonWalker;
-
-    @Before
-    public void setup() throws Exception {
-        builder = new TestYdtBuilder(RESTCONF_ROOT, null, QUERY_REQUEST);
-        listener = new JsonToYdtListener(builder);
-        jsonWalker = new DefaultJsonWalker();
-    }
-
-    private ObjectNode loadJsonFile(String path) throws Exception {
-        InputStream jsonStream = getClass().getResourceAsStream(path);
-        ObjectMapper mapper = new ObjectMapper();
-        return (ObjectNode) mapper.readTree(jsonStream);
-    }
-
-    @Test
-    public void testArrayNodeTransfer() throws Exception {
-        ObjectNode arrayNode = loadJsonFile("/arrayNode.json");
-        jsonWalker.walk(listener, null, arrayNode);
-        YdtContext rootNode = builder.getRootNode();
-        YdtContext firstChild = rootNode.getFirstChild();
-        YdtContext nextSibling = firstChild.getNextSibling();
-        assertEquals(WRONG_TYPE, SINGLE_INSTANCE_LEAF_VALUE_NODE,
-                     firstChild.getYdtType());
-        assertEquals(WRONG_STRUCTURE, "surname", firstChild.getName());
-        assertEquals(WRONG_TYPE, MULTI_INSTANCE_NODE, nextSibling.getYdtType());
-        assertEquals(WRONG_STRUCTURE, "networklist", nextSibling.getName());
-        assertEquals(WRONG_STRUCTURE, "networklist",
-                     nextSibling.getNextSibling().getName());
-        assertEquals(WRONG_STRUCTURE, "networklist",
-                     rootNode.getLastChild().getName());
-    }
-
-    @Test
-    public void testListInListNodeTransfer() throws Exception {
-        ObjectNode arrayNode = loadJsonFile("/listInList.json");
-        jsonWalker.walk(listener, null, arrayNode);
-        YdtContext rootNode = builder.getRootNode();
-        YdtContext firstChild = rootNode.getFirstChild();
-        YdtContext levelOneArray = firstChild.getFirstChild();
-        assertEquals(WRONG_STRUCTURE, "container-identifier1",
-                     firstChild.getName());
-        assertEquals(WRONG_STRUCTURE, "list-identifier2",
-                     levelOneArray.getName());
-        assertEquals(WRONG_STRUCTURE, "list-identifier2",
-                     levelOneArray.getNextSibling().getName());
-
-        YdtContext identifier3Node = levelOneArray.getLastChild();
-        assertEquals(WRONG_STRUCTURE, "container-identifier3",
-                     identifier3Node.getName());
-        YdtContext identifier4Node = identifier3Node.getLastChild();
-        assertEquals(WRONG_STRUCTURE, "list-identifier4",
-                     identifier4Node.getName());
-        YdtContext identifier5ListNode = identifier4Node.getLastChild();
-        assertEquals(WRONG_STRUCTURE, "leaf-list-identifier5",
-                     identifier5ListNode.getName());
-        assertEquals(WRONG_TYPE, MULTI_INSTANCE_LEAF_VALUE_NODE,
-                     identifier5ListNode.getYdtType());
-    }
-
-    @Test
-    public void testListAfterLeafList() throws Exception {
-        ObjectNode arrayNode = loadJsonFile("/listAfterLeaflist.json");
-        jsonWalker.walk(listener, null, arrayNode);
-        YdtContext rootNode = builder.getRootNode();
-        YdtContext firstChild = rootNode.getFirstChild();
-        YdtContext second = firstChild.getNextSibling();
-        YdtContext lastChild = rootNode.getLastChild();
-        assertEquals(WRONG_STRUCTURE, "leaf-identifier1", firstChild.getName());
-        assertEquals(WRONG_STRUCTURE, "leaf-list-identifier1", second.getName());
-        assertEquals(WRONG_STRUCTURE, "list-identifier1", lastChild.getName());
-    }
-
-    @Test
-    public void testLeafListAfterList() throws Exception {
-        ObjectNode arrayNode = loadJsonFile("/leaflistAfterlist.json");
-        jsonWalker.walk(listener, null, arrayNode);
-        YdtContext rootNode = builder.getRootNode();
-        YdtContext firstChild = rootNode.getFirstChild();
-        YdtContext second = firstChild.getNextSibling();
-        YdtContext lastChild = rootNode.getLastChild();
-        assertEquals(WRONG_STRUCTURE, "leaf-identifier1", firstChild.getName());
-        assertEquals(WRONG_STRUCTURE, "list-identifier1", second.getName());
-        YdtContext level2Child = second.getFirstChild();
-        assertEquals(WRONG_STRUCTURE, "leaf-identifier2", level2Child.getName());
-        assertEquals(WRONG_STRUCTURE, "5", level2Child.getValue());
-        assertEquals(WRONG_STRUCTURE, "leaf-list-identifier1", lastChild.getName());
-        Set<String> sets =  ImmutableSet.of("5", "12");
-        assertEquals(WRONG_STRUCTURE, sets, lastChild.getValueSet());
-    }
-}
\ No newline at end of file
diff --git a/protocols/restconf/server/utils/src/test/resources/arrayNode.json b/protocols/restconf/server/utils/src/test/resources/arrayNode.json
deleted file mode 100644
index 2035e82..0000000
--- a/protocols/restconf/server/utils/src/test/resources/arrayNode.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "surname": "Bangalore",
-  "networklist":[
-    {
-      "network-id": "520",
-      "server-provided": "123"
-    },
-    {
-      "network-id": "521",
-      "server-provided": "124"
-    },
-    {
-      "network-id": "523",
-      "server-provided": "125"
-    }
-
-  ]
-}
\ No newline at end of file
diff --git a/protocols/restconf/server/utils/src/test/resources/leaflistAfterlist.json b/protocols/restconf/server/utils/src/test/resources/leaflistAfterlist.json
deleted file mode 100644
index 8b0c4e1..0000000
--- a/protocols/restconf/server/utils/src/test/resources/leaflistAfterlist.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "leaf-identifier1": "1",
-  "list-identifier1": [
-    {
-      "leaf-identifier2": "5"
-    }
-  ],
-  "leaf-list-identifier1": [
-    "5",
-    "12"
-  ]
-}
\ No newline at end of file
diff --git a/protocols/restconf/server/utils/src/test/resources/listAfterLeaflist.json b/protocols/restconf/server/utils/src/test/resources/listAfterLeaflist.json
deleted file mode 100644
index bbe25e1..0000000
--- a/protocols/restconf/server/utils/src/test/resources/listAfterLeaflist.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "leaf-identifier1": "1",
-  "leaf-list-identifier1": [
-    "5",
-    "12"
-  ],
-  "list-identifier1": [
-    {
-      "leaf-identifier2": "5"
-    }
-  ]
-}
\ No newline at end of file
diff --git a/protocols/restconf/server/utils/src/test/resources/listInList.json b/protocols/restconf/server/utils/src/test/resources/listInList.json
deleted file mode 100644
index 185d878..0000000
--- a/protocols/restconf/server/utils/src/test/resources/listInList.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "container-identifier1": {
-    "list-identifier2": [
-      {
-        "leaf-identifier3": "enum1",
-        "container-identifier3": {
-          "leaf-identifier4": "",
-          "leaf-list-identifier4": [
-            "type-pattern-string6"
-          ],
-          "list-identifier4": [
-            {
-              "leaf-identifier5": "type-pattern-string7",
-              "leaf-list-identifier5": [
-                "type-pattern-string7",
-                "type-pattern-string7",
-                "type-pattern-string7"
-              ]
-            }
-          ]
-        }
-      },
-      {
-        "leaf-identifier3": "enum2",
-        "list-identifier3": [
-          {
-            "leaf-identifier4": "myidentity",
-            "container-identifier4": {
-              "leaf-identifier5": "type-pattern-string3",
-              "leaf-list-identifier5": [
-                "type-pattern-string3"
-              ]
-            }
-          }
-        ]
-      }
-    ]
-  }
-}
\ No newline at end of file
diff --git a/protocols/restconf/server/utils/src/test/resources/listNode.json b/protocols/restconf/server/utils/src/test/resources/listNode.json
deleted file mode 100644
index c7902f5..0000000
--- a/protocols/restconf/server/utils/src/test/resources/listNode.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "surname": "Bangalore",
-  "networklist":[
-    "0.79",
-    "1.04",
-    "3.14"
-  ]
-}
\ No newline at end of file
diff --git a/protocols/restconf/server/utils/src/test/resources/textNode.json b/protocols/restconf/server/utils/src/test/resources/textNode.json
deleted file mode 100644
index 8894cfb..0000000
--- a/protocols/restconf/server/utils/src/test/resources/textNode.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "name": "Huawei",
-  "surname": "Bangalore"
-}
\ No newline at end of file
