diff --git a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionMinaImplTest.java b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionMinaImplTest.java
index 4665125..8fd4a86 100644
--- a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionMinaImplTest.java
+++ b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionMinaImplTest.java
@@ -26,11 +26,11 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onlab.junit.TestTools;
-import org.onlab.packet.Ip4Address;
 import org.onosproject.netconf.NetconfDeviceInfo;
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.NetconfSession;
-import org.onosproject.netconf.TargetConfig;
+import org.onosproject.netconf.DatastoreId;
+import org.onlab.packet.Ip4Address;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,9 +46,14 @@
 import java.util.regex.Pattern;
 
 import static org.hamcrest.Matchers.containsInAnyOrder;
-import static org.junit.Assert.*;
-import static org.onosproject.netconf.TargetConfig.CANDIDATE;
-import static org.onosproject.netconf.TargetConfig.RUNNING;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+import static org.junit.Assert.assertFalse;
+import static org.onosproject.netconf.DatastoreId.CANDIDATE;
+import static org.onosproject.netconf.DatastoreId.RUNNING;
+import static org.onosproject.netconf.DatastoreId.STARTUP;
 
 /**
  * Unit tests for NetconfSession.
@@ -73,7 +78,7 @@
                     + "<some-child-element/>"
                     + "</some-yang-element>";
 
-    private static final String EDIT_CONFIG_REQUEST =
+    protected static final String EDIT_CONFIG_REQUEST =
             "<?xml version=\"1.0\" encoding=\"UTF-8\"?><rpc message-id=\"6\"  "
                     + "xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
                     + "<edit-config>\n"
@@ -86,6 +91,18 @@
 
     static final List<String> DEFAULT_CAPABILITIES = ImmutableList.<String>builder()
             .add("urn:ietf:params:netconf:base:1.0")
+            .add("urn:ietf:params:netconf:capability:writable-running:1.0")
+            .add("urn:ietf:params:netconf:capability:candidate:1.0")
+            .add("urn:ietf:params:netconf:capability:startup:1.0")
+            .add("urn:ietf:params:netconf:capability:rollback-on-error:1.0")
+            .add("urn:ietf:params:netconf:capability:interleave:1.0")
+            .add("urn:ietf:params:netconf:capability:notification:1.0")
+            .add("urn:ietf:params:netconf:capability:validate:1.0")
+            .add("urn:ietf:params:netconf:capability:validate:1.1")
+            .build();
+
+    static final List<String> DEFAULT_CAPABILITIES_1_1 = ImmutableList.<String>builder()
+            .add("urn:ietf:params:netconf:base:1.0")
             .add("urn:ietf:params:netconf:base:1.1")
             .add("urn:ietf:params:netconf:capability:writable-running:1.0")
             .add("urn:ietf:params:netconf:capability:candidate:1.0")
@@ -100,6 +117,8 @@
 
     private static NetconfSession session1;
     private static NetconfSession session2;
+    private static NetconfSession session3;
+    private static NetconfSession session4;
     private static SshServer sshServerNetconf;
 
     @BeforeClass
@@ -127,17 +146,29 @@
         NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo(
                 TEST_USERNAME, TEST_PASSWORD, Ip4Address.valueOf(TEST_HOSTNAME), PORT_NUMBER);
 
-        session1 = new NetconfSessionMinaImpl(deviceInfo);
+        session1 = new NetconfSessionMinaImpl(deviceInfo, ImmutableList.of("urn:ietf:params:netconf:base:1.0"));
         log.info("Started NETCONF Session {} with test SSHD server in Unit Test", session1.getSessionId());
         assertTrue("Incorrect sessionId", !session1.getSessionId().equalsIgnoreCase("-1"));
         assertTrue("Incorrect sessionId", !session1.getSessionId().equalsIgnoreCase("0"));
         assertThat(session1.getDeviceCapabilitiesSet(), containsInAnyOrder(DEFAULT_CAPABILITIES.toArray()));
 
-        session2 = new NetconfSessionMinaImpl(deviceInfo);
+        session2 = new NetconfSessionMinaImpl(deviceInfo, ImmutableList.of("urn:ietf:params:netconf:base:1.0"));
         log.info("Started NETCONF Session {} with test SSHD server in Unit Test", session2.getSessionId());
         assertTrue("Incorrect sessionId", !session2.getSessionId().equalsIgnoreCase("-1"));
         assertTrue("Incorrect sessionId", !session2.getSessionId().equalsIgnoreCase("0"));
         assertThat(session2.getDeviceCapabilitiesSet(), containsInAnyOrder(DEFAULT_CAPABILITIES.toArray()));
+
+        session3 = new NetconfSessionMinaImpl(deviceInfo);
+        log.info("Started NETCONF Session {} with test SSHD server in Unit Test", session3.getSessionId());
+        assertTrue("Incorrect sessionId", !session3.getSessionId().equalsIgnoreCase("-1"));
+        assertTrue("Incorrect sessionId", !session3.getSessionId().equalsIgnoreCase("0"));
+        assertThat(session3.getDeviceCapabilitiesSet(), containsInAnyOrder(DEFAULT_CAPABILITIES_1_1.toArray()));
+
+        session4 = new NetconfSessionMinaImpl(deviceInfo);
+        log.info("Started NETCONF Session {} with test SSHD server in Unit Test", session4.getSessionId());
+        assertTrue("Incorrect sessionId", !session4.getSessionId().equalsIgnoreCase("-1"));
+        assertTrue("Incorrect sessionId", !session4.getSessionId().equalsIgnoreCase("0"));
+        assertThat(session4.getDeviceCapabilitiesSet(), containsInAnyOrder(DEFAULT_CAPABILITIES_1_1.toArray()));
     }
 
     @AfterClass
@@ -148,6 +179,12 @@
         if (session2 != null) {
             session2.close();
         }
+        if (session3 != null) {
+            session3.close();
+        }
+        if (session4 != null) {
+            session4.close();
+        }
 
         sshServerNetconf.stop();
     }
@@ -158,8 +195,24 @@
         assertNotNull("Incorrect sessionId", session1.getSessionId());
         try {
             assertTrue("NETCONF edit-config command failed",
-                       session1.editConfig(TargetConfig.RUNNING.toString(),
-                                           null, SAMPLE_REQUEST));
+                    session1.editConfig(RUNNING.toString(),
+                            null, SAMPLE_REQUEST));
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF edit-config test failed: " + e.getMessage());
+        }
+        log.info("Finishing edit-config async");
+    }
+
+    @Test
+    public void testEditConfigRequestWithChunkedFraming() {
+        log.info("Starting edit-config async");
+
+        assertNotNull("Incorrect sessionId", session3.getSessionId());
+        try {
+            assertTrue("NETCONF edit-config command failed",
+                    session3.editConfig(RUNNING.toString(),
+                            null, SAMPLE_REQUEST));
         } catch (NetconfException e) {
             e.printStackTrace();
             fail("NETCONF edit-config test failed: " + e.getMessage());
@@ -173,7 +226,7 @@
         assertNotNull("Incorrect sessionId", session1.getSessionId());
         try {
             assertTrue("NETCONF edit-config command failed",
-                       session1.editConfig(EDIT_CONFIG_REQUEST));
+                    session1.editConfig(EDIT_CONFIG_REQUEST));
         } catch (NetconfException e) {
             e.printStackTrace();
             fail("NETCONF edit-config test failed: " + e.getMessage());
@@ -182,12 +235,40 @@
     }
 
     @Test
-    public void testDeleteConfigRequestWithRunningTargetConfiguration() {
+    public void testEditConfigRequestWithOnlyNewConfigurationWithChunkedFraming() {
+        log.info("Starting edit-config async");
+        assertNotNull("Incorrect sessionId", session3.getSessionId());
+        try {
+            assertTrue("NETCONF edit-config command failed",
+                    session3.editConfig(EDIT_CONFIG_REQUEST));
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF edit-config test failed: " + e.getMessage());
+        }
+        log.info("Finishing edit-config async");
+    }
+
+    @Test
+    public void testDeleteConfigRequestWithRunningDatastoreIdDuration() {
         log.info("Starting delete-config async");
         assertNotNull("Incorrect sessionId", session1.getSessionId());
         try {
             assertFalse("NETCONF delete-config command failed",
-                        session1.deleteConfig(TargetConfig.RUNNING));
+                    session1.deleteConfig(RUNNING));
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF delete-config test failed: " + e.getMessage());
+        }
+        log.info("Finishing delete-config async");
+    }
+
+    @Test
+    public void testDeleteConfigRequestWithRunningDatastoreIdDurationWithChunkedFraming() {
+        log.info("Starting delete-config async");
+        assertNotNull("Incorrect sessionId", session3.getSessionId());
+        try {
+            assertFalse("NETCONF delete-config command failed",
+                    session3.deleteConfig(RUNNING));
         } catch (NetconfException e) {
             e.printStackTrace();
             fail("NETCONF delete-config test failed: " + e.getMessage());
@@ -201,8 +282,23 @@
         assertNotNull("Incorrect sessionId", session1.getSessionId());
         try {
             assertTrue("NETCONF copy-config command failed",
-                       session1.copyConfig(TargetConfig.RUNNING.toString(),
-                                           "candidate"));
+                    session1.copyConfig(RUNNING.toString(),
+                            "candidate"));
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF edit-config test failed: " + e.getMessage());
+        }
+        log.info("Finishing copy-config async");
+    }
+
+    @Test
+    public void testCopyConfigRequestWithChunkedFraming() {
+        log.info("Starting copy-config async");
+        assertNotNull("Incorrect sessionId", session3.getSessionId());
+        try {
+            assertTrue("NETCONF copy-config command failed",
+                    session3.copyConfig(RUNNING.toString(),
+                            "candidate"));
         } catch (NetconfException e) {
             e.printStackTrace();
             fail("NETCONF edit-config test failed: " + e.getMessage());
@@ -216,10 +312,28 @@
         assertNotNull("Incorrect sessionId", session1.getSessionId());
         try {
             assertTrue("NETCONF get-config running command failed. ",
-                       GET_REPLY_PATTERN.matcher(session1.getConfig(RUNNING, SAMPLE_REQUEST)).matches());
+                    GET_REPLY_PATTERN.matcher(session1.getConfig(RUNNING, SAMPLE_REQUEST)).matches());
 
             assertTrue("NETCONF get-config candidate command failed. ",
-                       GET_REPLY_PATTERN.matcher(session1.getConfig(CANDIDATE, SAMPLE_REQUEST)).matches());
+                    GET_REPLY_PATTERN.matcher(session1.getConfig(CANDIDATE, SAMPLE_REQUEST)).matches());
+
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF get-config test failed: " + e.getMessage());
+        }
+        log.info("Finishing get-config async");
+    }
+
+    @Test
+    public void testGetConfigRequestWithChunkedFraming() {
+        log.info("Starting get-config async");
+        assertNotNull("Incorrect sessionId", session3.getSessionId());
+        try {
+            assertTrue("NETCONF get-config running command failed. ",
+                    GET_REPLY_PATTERN.matcher(session3.getConfig(RUNNING, SAMPLE_REQUEST)).matches());
+
+            assertTrue("NETCONF get-config candidate command failed. ",
+                    GET_REPLY_PATTERN.matcher(session3.getConfig(CANDIDATE, SAMPLE_REQUEST)).matches());
 
         } catch (NetconfException e) {
             e.printStackTrace();
@@ -234,7 +348,22 @@
         assertNotNull("Incorrect sessionId", session1.getSessionId());
         try {
             assertTrue("NETCONF get running command failed. ",
-                       GET_REPLY_PATTERN.matcher(session1.get(SAMPLE_REQUEST, null)).matches());
+                    GET_REPLY_PATTERN.matcher(session1.get(SAMPLE_REQUEST, null)).matches());
+
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF get test failed: " + e.getMessage());
+        }
+        log.info("Finishing get async");
+    }
+
+    @Test
+    public void testGetRequestWithChunkedFraming() {
+        log.info("Starting get async");
+        assertNotNull("Incorrect sessionId", session3.getSessionId());
+        try {
+            assertTrue("NETCONF get running command failed. ",
+                    GET_REPLY_PATTERN.matcher(session3.get(SAMPLE_REQUEST, null)).matches());
 
         } catch (NetconfException e) {
             e.printStackTrace();
@@ -257,6 +386,19 @@
     }
 
     @Test
+    public void testLockRequestWithChunkedFraming() {
+        log.info("Starting lock async");
+        assertNotNull("Incorrect sessionId", session3.getSessionId());
+        try {
+            assertTrue("NETCONF lock request failed", session3.lock());
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF lock test failed: " + e.getMessage());
+        }
+        log.info("Finishing lock async");
+    }
+
+    @Test
     public void testUnLockRequest() {
         log.info("Starting unlock async");
         assertNotNull("Incorrect sessionId", session1.getSessionId());
@@ -269,6 +411,19 @@
         log.info("Finishing unlock async");
     }
 
+    @Test
+    public void testUnLockRequestWithChunkedFraming() {
+        log.info("Starting unlock async");
+        assertNotNull("Incorrect sessionId", session3.getSessionId());
+        try {
+            assertTrue("NETCONF unlock request failed", session3.unlock());
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF unlock test failed: " + e.getMessage());
+        }
+        log.info("Finishing unlock async");
+    }
+
 
     @Test
     public void testConcurrentSameSessionAccess() throws InterruptedException {
@@ -297,6 +452,32 @@
     }
 
     @Test
+    public void testConcurrentSameSessionAccessWithChunkedFraming() throws InterruptedException {
+        NCCopyConfigCallable testCopyConfig1 = new NCCopyConfigCallable(session3, RUNNING, "candidate");
+        NCCopyConfigCallable testCopyConfig2 = new NCCopyConfigCallable(session3, RUNNING, "startup");
+
+        FutureTask<Boolean> futureCopyConfig1 = new FutureTask<>(testCopyConfig1);
+        FutureTask<Boolean> futureCopyConfig2 = new FutureTask<>(testCopyConfig2);
+
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        log.info("Starting concurrent execution of copy-config through same session");
+        executor.execute(futureCopyConfig1);
+        executor.execute(futureCopyConfig2);
+
+        int count = 0;
+        while (count < 10) {
+            if (futureCopyConfig1.isDone() && futureCopyConfig2.isDone()) {
+                executor.shutdown();
+                log.info("Finished concurrent same session execution");
+                return;
+            }
+            Thread.sleep(100L);
+            count++;
+        }
+        fail("NETCONF test failed to complete.");
+    }
+
+    @Test
     public void test2SessionAccess() throws InterruptedException {
         NCCopyConfigCallable testCopySession1 = new NCCopyConfigCallable(session1, RUNNING, "candidate");
         NCCopyConfigCallable testCopySession2 = new NCCopyConfigCallable(session2, RUNNING, "candidate");
@@ -322,6 +503,32 @@
         fail("NETCONF test failed to complete.");
     }
 
+    @Test
+    public void test2SessionAccessWithChunkedFraming() throws InterruptedException {
+        NCCopyConfigCallable testCopySession1 = new NCCopyConfigCallable(session3, RUNNING, "candidate");
+        NCCopyConfigCallable testCopySession2 = new NCCopyConfigCallable(session4, RUNNING, "candidate");
+
+        FutureTask<Boolean> futureCopySession1 = new FutureTask<>(testCopySession1);
+        FutureTask<Boolean> futureCopySession2 = new FutureTask<>(testCopySession2);
+
+        ExecutorService executor = Executors.newFixedThreadPool(2);
+        log.info("Starting concurrent execution of copy-config through 2 different sessions");
+        executor.execute(futureCopySession1);
+        executor.execute(futureCopySession2);
+
+        int count = 0;
+        while (count < 10) {
+            if (futureCopySession1.isDone() && futureCopySession2.isDone()) {
+                executor.shutdown();
+                log.info("Finished concurrent 2 session execution");
+                return;
+            }
+            Thread.sleep(100L);
+            count++;
+        }
+        fail("NETCONF test failed to complete.");
+    }
+
 
     public static String getTestHelloReply(Optional<Long> sessionId) {
         return getTestHelloReply(DEFAULT_CAPABILITIES, sessionId);
@@ -376,20 +583,21 @@
 
     public static final Pattern HELLO_REQ_PATTERN =
             Pattern.compile("(<\\?xml).*"
-                    + "(<hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
-                    + "( *)(<capabilities>)\\R?"
-                    + "( *)(<capability>urn:ietf:params:netconf:base:1.0</capability>)\\R?"
-                    + "( *)(</capabilities>)\\R?"
-                    + "(</hello>)\\R? *",
+                            + "(<hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
+                            + "( *)(<capabilities>)\\R?"
+                            + "( *)(<capability>urn:ietf:params:netconf:base:1.0</capability>)\\R?"
+                            + "( *)(<capability>urn:ietf:params:netconf:base:1.1</capability>)\\R?"
+                            + "( *)(</capabilities>)\\R?"
+                            + "(</hello>)\\R? *",
                     Pattern.DOTALL);
 
     public static final Pattern EDIT_CONFIG_REQ_PATTERN =
             Pattern.compile("(<\\?xml).*"
                     + "(<rpc message-id=\")[0-9]*(\") *(xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                     + "(<edit-config>)\\R?"
-                    + "(<target>\\R?((<" + TargetConfig.CANDIDATE.toString() + "/>)|"
-                                    + "(<" + TargetConfig.RUNNING.toString() + "/>)|"
-                                    + "(<" + TargetConfig.STARTUP.toString() + "/>))\\R?</target>)\\R?"
+                    + "(<target>\\R?((<" + CANDIDATE.toString() + "/>)|"
+                    + "(<" + RUNNING.toString() + "/>)|"
+                    + "(<" + STARTUP.toString() + "/>))\\R?</target>)\\R?"
                     + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                     + ".*"
                     + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
@@ -397,46 +605,46 @@
 
     public static final Pattern LOCK_REQ_PATTERN =
             Pattern.compile("(<\\?xml).*"
-                                    + "(<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" "
-                                    + "message-id=\")[0-9]*(\">)\\R?"
-                                    + "(<lock>)\\R?"
-                                    + "(<target>\\R?((<" + TargetConfig.CANDIDATE.toString() + "/>)|"
-                                    + "(<" + TargetConfig.RUNNING.toString() + "/>)|"
-                                    + "(<" + TargetConfig.STARTUP.toString() + "/>))\\R?</target>)\\R?"
-                                    + "(</lock>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
+                    + "(<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" "
+                    + "message-id=\")[0-9]*(\">)\\R?"
+                    + "(<lock>)\\R?"
+                    + "(<target>\\R?((<" + CANDIDATE.toString() + "/>)|"
+                    + "(<" + RUNNING.toString() + "/>)|"
+                    + "(<" + STARTUP.toString() + "/>))\\R?</target>)\\R?"
+                    + "(</lock>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
 
     public static final Pattern UNLOCK_REQ_PATTERN =
             Pattern.compile("(<\\?xml).*"
-                                    + "(<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" "
-                                    + "message-id=\")[0-9]*(\">)\\R?"
-                                    + "(<unlock>)\\R?"
-                                    + "(<target>\\R?((<" + TargetConfig.CANDIDATE.toString() + "/>)|"
-                                    + "(<" + TargetConfig.RUNNING.toString() + "/>)|"
-                                    + "(<" + TargetConfig.STARTUP.toString() + "/>))\\R?</target>)\\R?"
-                                    + "(</unlock>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
+                    + "(<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" "
+                    + "message-id=\")[0-9]*(\">)\\R?"
+                    + "(<unlock>)\\R?"
+                    + "(<target>\\R?((<" + CANDIDATE.toString() + "/>)|"
+                    + "(<" + RUNNING.toString() + "/>)|"
+                    + "(<" + STARTUP.toString() + "/>))\\R?</target>)\\R?"
+                    + "(</unlock>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
 
     public static final Pattern COPY_CONFIG_REQ_PATTERN =
             Pattern.compile("(<\\?xml).*"
                     + "(<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\")[0-9]*(\">)\\R?"
                     + "(<copy-config>)\\R?"
-                    + "(<target>\\R?((<" + TargetConfig.CANDIDATE.toString() + "/>)|"
-                                    + "(<" + TargetConfig.RUNNING.toString() + "/>)|"
-                                    + "(<" + TargetConfig.STARTUP.toString() + "/>))\\R?</target>)\\R?"
-                                    + "(<source>)\\R?(<config>)(("
-                                    + TargetConfig.CANDIDATE.toString() + ")|("
-                                    + TargetConfig.RUNNING.toString() + ")|("
-                                    + TargetConfig.STARTUP.toString()
-                                    + "))(</config>)\\R?(</source>)\\R?"
-                                    + "(</copy-config>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
+                    + "(<target>\\R?((<" + CANDIDATE.toString() + "/>)|"
+                    + "(<" + RUNNING.toString() + "/>)|"
+                    + "(<" + STARTUP.toString() + "/>))\\R?</target>)\\R?"
+                    + "(<source>)\\R?(<config>)(("
+                    + CANDIDATE.toString() + ")|("
+                    + RUNNING.toString() + ")|("
+                    + STARTUP.toString()
+                    + "))(</config>)\\R?(</source>)\\R?"
+                    + "(</copy-config>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
 
     public static final Pattern GET_CONFIG_REQ_PATTERN =
             Pattern.compile("(<\\?xml).*"
                     + "(<rpc message-id=\")[0-9]*(\"  xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                     + "(<get-config>)\\R?" + "(<source>)\\R?((<"
-                                    + TargetConfig.CANDIDATE.toString()
-                                    + "/>)|(<" + TargetConfig.RUNNING.toString()
-                                    + "/>)|(<" + TargetConfig.STARTUP.toString()
-                                    + "/>))\\R?(</source>)\\R?"
+                    + CANDIDATE.toString()
+                    + "/>)|(<" + RUNNING.toString()
+                    + "/>)|(<" + STARTUP.toString()
+                    + "/>))\\R?(</source>)\\R?"
                     + "(<filter type=\"subtree\">).*(</filter>)\\R?"
                     + "(</get-config>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
 
@@ -455,10 +663,10 @@
 
     public class NCCopyConfigCallable implements Callable<Boolean> {
         private NetconfSession session;
-        private TargetConfig target;
+        private DatastoreId target;
         private String source;
 
-        public NCCopyConfigCallable(NetconfSession session, TargetConfig target, String source) {
+        public NCCopyConfigCallable(NetconfSession session, DatastoreId target, String source) {
             this.session = session;
             this.target = target;
             this.source = source;
@@ -469,4 +677,4 @@
             return session.copyConfig(target, source);
         }
     }
-}
+}
\ No newline at end of file
