diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java
index 45d81d2..daf92fa 100644
--- a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2019-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
 package org.onosproject.netconf;
 
 import org.onlab.packet.IpAddress;
+import org.onosproject.cluster.NodeId;
 import org.onosproject.net.DeviceId;
 
 import java.util.Map;
@@ -138,4 +139,13 @@
         errorFuture.completeExceptionally(new NetconfException("Method executeAtMaster not implemented"));
         return errorFuture;
     }
+
+    /**
+     * Get a contoller node Id .
+     *
+     * @return controller node Id
+     */
+    default NodeId getLocalNodeId() {
+        return null;
+    }
 }
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfProxyMessage.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfProxyMessage.java
index 8ebfbe3..66a73b2 100644
--- a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfProxyMessage.java
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfProxyMessage.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2018-present Open Networking Foundation
+ * Copyright 2019-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
 
 package org.onosproject.netconf;
 
+import org.onosproject.cluster.NodeId;
 import org.onosproject.net.DeviceId;
 
 import java.util.List;
@@ -57,4 +58,10 @@
      * @return arguments
      */
     List<String> arguments();
+
+    /**
+     * Returns the node id of proxymessage sender.
+     * @return NodeId
+     */
+    NodeId senderId();
 }
diff --git a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfProxyMessageHandler.java b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfProxyMessageHandler.java
index a1d4d74..69d29f5 100644
--- a/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfProxyMessageHandler.java
+++ b/protocols/netconf/api/src/main/java/org/onosproject/netconf/NetconfProxyMessageHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2018-present Open Networking Foundation
+ * Copyright 2019-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,6 +15,8 @@
  */
 package org.onosproject.netconf;
 
+import java.util.Set;
+
 /**
  * Abstract interface for the implementation of proxy message handler.
  */
@@ -28,4 +30,32 @@
      * @throws NetconfException netconf exception
      */
     <T> T handleIncomingMessage(NetconfProxyMessage proxyMessage) throws NetconfException;
+
+    /**
+     * Will decode the message on case basis and
+     * call the actual method in Netconf Session implementation bound to secure transport.
+     * @param replyMessage incoming reply message
+     * @param <T> return type
+     * @return the value returned by session call
+     * @throws NetconfException netconf exception
+     */
+    <T> T handleReplyMessage(NetconfProxyMessage replyMessage) throws NetconfException;
+
+    /**
+     * Will decode the message on case basis and
+     * call the actual method in Netconf Session implementation bound to secure transport.
+     * @param proxyMessage incoming proxy message
+     * @return the set value returned by session call
+     * @throws NetconfException netconf exception
+     */
+    Set<String> handleIncomingSetMessage(NetconfProxyMessage proxyMessage) throws NetconfException;
+
+    /**
+     * Will decode the message on case basis and
+     * call the actual method in Netconf Session implementation bound to secure transport.
+     * @param replyMessage incoming proxy message
+     * @return the set value returned by session call
+     * @throws NetconfException netconf exception
+     */
+    Set<String> handleReplySetMessage(NetconfProxyMessage replyMessage) throws NetconfException;
 }
\ No newline at end of file
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/DefaultNetconfProxyMessage.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/DefaultNetconfProxyMessage.java
index 1a57d4d..da9db37 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/DefaultNetconfProxyMessage.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/DefaultNetconfProxyMessage.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2018-present Open Networking Foundation
+ * Copyright 2019-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
 package org.onosproject.netconf.ctl.impl;
 
 import com.google.common.collect.ImmutableList;
+import org.onosproject.cluster.NodeId;
 import org.onosproject.net.DeviceId;
 import org.onosproject.netconf.NetconfProxyMessage;
 
@@ -30,21 +31,26 @@
     private final SubjectType subjectType;
     private final DeviceId deviceId;
     private final List<String> arguments;
+    private final NodeId senderId;
 
     /**
      * Create new NetconfProxyMessage with provided informations.
      * @param subType Message subject type.
      * @param devId Device information that recieve message.
      * @param args Messages arguments.
+     * @param nodeId nodeId of sender
      */
     public DefaultNetconfProxyMessage(SubjectType subType,
                                       DeviceId devId,
-                                      List<String> args) {
+                                      List<String> args,
+                                      NodeId nodeId) {
         subjectType = subType;
         deviceId = devId;
         arguments = args;
+        senderId = nodeId;
     }
 
+
     @Override
     public SubjectType subjectType() {
         return subjectType;
@@ -59,4 +65,9 @@
     public List<String> arguments() {
         return ImmutableList.copyOf(arguments);
     }
+
+    @Override
+    public NodeId senderId() {
+        return senderId;
+    }
 }
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java
index b793c13..d0ee1f0 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2019-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,9 @@
 import com.google.common.annotations.Beta;
 import com.google.common.collect.Lists;
 
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.ControllerNode;
+import org.onosproject.cluster.NodeId;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -70,12 +73,14 @@
 
 import java.util.ArrayList;
 import java.util.Dictionary;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -116,16 +121,19 @@
 
     protected NetconfSshClientLib sshClientLib = NetconfSshClientLib.APACHE_MINA;
 
-
-    private static final String APACHE_MINA_STR = "apache-mina";
-
-
     private static final MessageSubject SEND_REQUEST_SUBJECT_STRING =
             new MessageSubject("netconf-session-master-send-message-string");
 
+    private static final MessageSubject SEND_REPLY_SUBJECT_STRING =
+            new MessageSubject("netconf-session-master-send-reply-message-string");
+
     private static final MessageSubject SEND_REQUEST_SUBJECT_SET_STRING =
             new MessageSubject("netconf-session-master-send-message-set-string");
 
+    private static final MessageSubject SEND_REPLY_SUBJECT_SET_STRING =
+            new MessageSubject("netconf-session-master-send-reply-message-set-string");
+
+
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
@@ -144,6 +152,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected ClusterService clusterService;
+
     public static final Logger log = LoggerFactory
             .getLogger(NetconfControllerImpl.class);
 
@@ -163,6 +174,15 @@
             Executors.newCachedThreadPool(groupedThreads("onos/netconfdevicecontroller",
                                                          "connection-reopen-%d", log));
 
+    private final ExecutorService remoteRequestExecutor =
+            Executors.newCachedThreadPool();
+
+    protected NodeId localNodeId;
+
+    private CountDownLatch countDownLatch;
+
+    private ArrayList<String> replyArguments = new ArrayList<>();
+
     public static final Serializer SERIALIZER = Serializer.using(
             KryoNamespace.newBuilder()
                     .register(KryoNamespaces.API)
@@ -177,16 +197,30 @@
         cfgService.registerProperties(getClass());
         modified(context);
         Security.addProvider(new BouncyCastleProvider());
-        clusterCommunicator.<NetconfProxyMessage, String>addSubscriber(
+        clusterCommunicator.<NetconfProxyMessage>addSubscriber(
                 SEND_REQUEST_SUBJECT_STRING,
                 SERIALIZER::decode,
                 this::handleProxyMessage,
-                SERIALIZER::encode);
-        clusterCommunicator.<NetconfProxyMessage, Set<String>>addSubscriber(
+                remoteRequestExecutor);
+        clusterCommunicator.<NetconfProxyMessage>addSubscriber(
                 SEND_REQUEST_SUBJECT_SET_STRING,
                 SERIALIZER::decode,
                 this::handleProxyMessage,
-                SERIALIZER::encode);
+                remoteRequestExecutor);
+        clusterCommunicator.<NetconfProxyMessage>addSubscriber(
+                SEND_REPLY_SUBJECT_STRING,
+                SERIALIZER::decode,
+                this::handleProxyReplyMessage,
+                remoteRequestExecutor);
+        clusterCommunicator.<NetconfProxyMessage>addSubscriber(
+                SEND_REPLY_SUBJECT_SET_STRING,
+                SERIALIZER::decode,
+                this::handleProxyReplyMessage,
+                remoteRequestExecutor);
+
+        localNodeId = Optional.ofNullable(clusterService.getLocalNode())
+                .map(ControllerNode::id)
+                .orElseGet(() -> new NodeId("nullNodeId"));
         log.info("Started");
     }
 
@@ -204,6 +238,8 @@
         });
         clusterCommunicator.removeSubscriber(SEND_REQUEST_SUBJECT_STRING);
         clusterCommunicator.removeSubscriber(SEND_REQUEST_SUBJECT_SET_STRING);
+        clusterCommunicator.removeSubscriber(SEND_REPLY_SUBJECT_STRING);
+        clusterCommunicator.removeSubscriber(SEND_REPLY_SUBJECT_SET_STRING);
         cfgService.unregisterProperties(getClass(), false);
         netconfDeviceListeners.clear();
         netconfDeviceMap.clear();
@@ -350,6 +386,11 @@
         }
     }
 
+    @Override
+    public NodeId getLocalNodeId() {
+        return localNodeId;
+    }
+
     private NetconfDeviceInfo createDeviceInfo(DeviceId deviceId) throws NetconfException {
             Device device = deviceService.getDevice(deviceId);
             String ip, path = null;
@@ -469,36 +510,94 @@
         return netconfDeviceMap.keySet();
     }
 
+    private void unicastRpcToMaster(NetconfProxyMessage proxyMessage, NodeId receiverId) {
+        MessageSubject messageSubject;
+
+        switch (proxyMessage.subjectType()) {
+            case GET_DEVICE_CAPABILITIES_SET:
+                messageSubject = SEND_REQUEST_SUBJECT_SET_STRING;
+                break;
+            default:
+                messageSubject = SEND_REQUEST_SUBJECT_STRING;
+                break;
+        }
+
+        clusterCommunicator
+                .unicast(proxyMessage,
+                         messageSubject,
+                         SERIALIZER::encode,
+                         receiverId);
+    }
+
+    private void unicastReplyToSender(NetconfProxyMessage proxyMessage, NodeId receiverId) {
+        MessageSubject messageSubject;
+
+        switch (proxyMessage.subjectType()) {
+            case GET_DEVICE_CAPABILITIES_SET:
+                messageSubject = SEND_REPLY_SUBJECT_SET_STRING;
+                break;
+            default:
+                messageSubject = SEND_REPLY_SUBJECT_STRING;
+                break;
+        }
+
+        clusterCommunicator
+                .unicast(proxyMessage,
+                         messageSubject,
+                         SERIALIZER::encode,
+                         receiverId);
+    }
+
     @Override
     public <T> CompletableFuture<T> executeAtMaster(NetconfProxyMessage proxyMessage) throws NetconfException {
         DeviceId deviceId = proxyMessage.deviceId();
         if (deviceService.getRole(deviceId).equals(MastershipRole.MASTER)) {
-            return CompletableFuture.completedFuture(
-                    netconfProxyMessageHandler.handleIncomingMessage(proxyMessage));
+            return handleProxyMessage(proxyMessage);
         } else {
-            MessageSubject subject;
+            return relayMessageToMaster(proxyMessage);
+        }
+    }
+
+    public <T> CompletableFuture<T> relayMessageToMaster(NetconfProxyMessage proxyMessage) {
+        DeviceId deviceId = proxyMessage.deviceId();
+
+        countDownLatch = new CountDownLatch(1);
+        unicastRpcToMaster(proxyMessage, mastershipService.getMasterFor(deviceId));
+
+        try {
+            countDownLatch.await(netconfReplyTimeout, TimeUnit.SECONDS);
+
             switch (proxyMessage.subjectType()) {
                 case GET_DEVICE_CAPABILITIES_SET:
-                    subject = SEND_REQUEST_SUBJECT_SET_STRING;
-                    break;
+                    Set<String> forReturnValue = new LinkedHashSet<>(replyArguments);
+                    return CompletableFuture.completedFuture((T) forReturnValue);
                 default:
-                    subject = SEND_REQUEST_SUBJECT_STRING;
-                    break;
+                    String returnValue = Optional.ofNullable(replyArguments.get(0)).orElse(null);
+                    return CompletableFuture.completedFuture((T) returnValue);
             }
-
-            return clusterCommunicator
-                    .sendAndReceive(proxyMessage,
-                                    subject,
-                                    SERIALIZER::encode,
-                                    SERIALIZER::decode,
-                                    mastershipService.getMasterFor(deviceId));
+        } catch (InterruptedException e) {
+            log.error("InterruptedOccured while awaiting because of {}", e);
+            CompletableFuture<T> errorFuture = new CompletableFuture<>();
+            errorFuture.completeExceptionally(e);
+            return errorFuture;
+        } catch (Exception e) {
+            log.error("Exception occured because of {}", e);
+            CompletableFuture<T> errorFuture = new CompletableFuture<>();
+            errorFuture.completeExceptionally(e);
+            return errorFuture;
         }
     }
 
     private <T> CompletableFuture<T> handleProxyMessage(NetconfProxyMessage proxyMessage) {
         try {
-            return CompletableFuture.completedFuture(
-                    netconfProxyMessageHandler.handleIncomingMessage(proxyMessage));
+            switch (proxyMessage.subjectType()) {
+                case GET_DEVICE_CAPABILITIES_SET:
+                    return CompletableFuture.completedFuture(
+                            (T) netconfProxyMessageHandler.handleIncomingSetMessage(proxyMessage));
+                default:
+                    return CompletableFuture.completedFuture(
+                            netconfProxyMessageHandler.handleIncomingMessage(proxyMessage));
+            }
         } catch (NetconfException e) {
             CompletableFuture<T> errorFuture = new CompletableFuture<>();
             errorFuture.completeExceptionally(e);
@@ -506,6 +605,25 @@
         }
     }
 
+    private <T> CompletableFuture<T> handleProxyReplyMessage(NetconfProxyMessage replyMessage) {
+        try {
+            switch (replyMessage.subjectType()) {
+                case GET_DEVICE_CAPABILITIES_SET:
+                    return CompletableFuture.completedFuture(
+                            (T) netconfProxyMessageHandler.handleReplySetMessage(replyMessage));
+                default:
+                    return CompletableFuture.completedFuture(
+                            netconfProxyMessageHandler.handleReplyMessage(replyMessage));
+
+            }
+        } catch (NetconfException e) {
+            CompletableFuture<T> errorFuture = new CompletableFuture<>();
+            errorFuture.completeExceptionally(e);
+            return errorFuture;
+        }
+    }
+
+
     /**
      * Netconf Proxy Message Handler Implementation class.
      */
@@ -517,6 +635,7 @@
             DeviceId deviceId = proxyMessage.deviceId();
             NetconfProxyMessage.SubjectType subjectType = proxyMessage.subjectType();
             NetconfSession secureTransportSession;
+
             if (netconfDeviceMap.get(deviceId).isMasterSession()) {
                 secureTransportSession = netconfDeviceMap.get(deviceId).getSession();
             } else {
@@ -546,9 +665,6 @@
                     case GET_SESSION_ID:
                         reply = (T) secureTransportSession.getSessionId();
                         break;
-                    case SET_ONOS_CAPABILITIES:
-                        secureTransportSession.setOnosCapabilities(arguments);
-                        break;
                     case GET_DEVICE_CAPABILITIES_SET:
                         reply = (T) secureTransportSession.getDeviceCapabilitiesSet();
                         break;
@@ -562,8 +678,61 @@
                 throw new NetconfException(e.getMessage(), e.getCause());
             }
 
+            ArrayList<String> returnArgument = new ArrayList<String>();
+            Optional.ofNullable(reply).ifPresent(r -> returnArgument.add((String) r));
+
+            DefaultNetconfProxyMessage replyMessage = new DefaultNetconfProxyMessage(
+                    subjectType,
+                    deviceId,
+                    returnArgument,
+                    localNodeId);
+
+            unicastReplyToSender(replyMessage, proxyMessage.senderId());
+
+
             return reply;
         }
+
+        @Override
+        public <T> T handleReplyMessage(NetconfProxyMessage replyMessage) {
+            replyArguments = new ArrayList<>(replyMessage.arguments());
+            countDownLatch.countDown();
+            return (T) Optional.ofNullable(replyArguments.get(0)).orElse(null);
+        }
+
+        @Override
+        public Set<String> handleIncomingSetMessage(NetconfProxyMessage proxyMessage) throws NetconfException {
+            DeviceId deviceId = proxyMessage.deviceId();
+            NetconfProxyMessage.SubjectType subjectType = proxyMessage.subjectType();
+            NetconfSession secureTransportSession;
+
+            if (netconfDeviceMap.get(deviceId).isMasterSession()) {
+                secureTransportSession = netconfDeviceMap.get(deviceId).getSession();
+            } else {
+                throw new NetconfException("SSH session not present");
+            }
+
+            Set<String> reply = secureTransportSession.getDeviceCapabilitiesSet();
+            ArrayList<String> returnArgument = new ArrayList<String>(reply);
+
+            DefaultNetconfProxyMessage replyMessage = new DefaultNetconfProxyMessage(
+                    subjectType,
+                    deviceId,
+                    returnArgument,
+                    localNodeId);
+
+            unicastReplyToSender(replyMessage, proxyMessage.senderId());
+            return reply;
+        }
+
+        @Override
+        public Set<String> handleReplySetMessage(NetconfProxyMessage replyMessage) {
+            replyArguments = new ArrayList<>(replyMessage.arguments());
+            countDownLatch.countDown();
+
+            return new LinkedHashSet<>(replyArguments);
+
+        }
     }
 
     /**
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionProxyImpl.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionProxyImpl.java
index 5734820..6e6a996 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionProxyImpl.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfSessionProxyImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2018-present Open Networking Foundation
+ * Copyright 2019-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
 
 package org.onosproject.netconf.ctl.impl;
 
+import org.onosproject.cluster.NodeId;
 import org.onosproject.netconf.AbstractNetconfSession;
 import org.onosproject.netconf.NetconfController;
 import org.onosproject.netconf.NetconfDeviceInfo;
@@ -38,14 +39,17 @@
 public class NetconfSessionProxyImpl extends AbstractNetconfSession {
     protected final NetconfDeviceInfo deviceInfo;
     protected final NetconfController netconfController;
+    protected final NodeId sessionNodeId;
     private static final Logger log = getLogger(NetconfSessionMinaImpl.class);
 
     private static final int CONFIGURE_REPLY_TIMEOUT_SEC = 5;
 
     public NetconfSessionProxyImpl(NetconfDeviceInfo deviceInfo,
-                                   NetconfController controller) {
+                                   NetconfController controller,
+                                   NodeId nodeId) {
         this.deviceInfo = deviceInfo;
         this.netconfController = controller;
+        this.sessionNodeId = nodeId;
     }
 
     private <T> CompletableFuture<T> executeAtMasterCompletableFuture(
@@ -77,7 +81,8 @@
     protected NetconfProxyMessage makeProxyMessage(NetconfProxyMessage.SubjectType subjectType, String request) {
         return new DefaultNetconfProxyMessage(subjectType,
                                               deviceInfo.getDeviceId(),
-                                              new ArrayList<>(Arrays.asList(request)));
+                                              new ArrayList<>(Arrays.asList(request)),
+                                              sessionNodeId);
     }
 
     @Override
@@ -164,7 +169,8 @@
         NetconfProxyMessage proxyMessage =
                 new DefaultNetconfProxyMessage(
                         NetconfProxyMessage.SubjectType.SET_ONOS_CAPABILITIES,
-                        deviceInfo.getDeviceId(), capabilitiesList);
+                        deviceInfo.getDeviceId(), capabilitiesList,
+                        sessionNodeId);
         try {
             executeAtMaster(proxyMessage);
         } catch (NetconfException e) {
@@ -178,7 +184,9 @@
         @Override
         public NetconfSession createNetconfSession(NetconfDeviceInfo netconfDeviceInfo,
                                                    NetconfController netconfController) {
-            return new NetconfSessionProxyImpl(netconfDeviceInfo, netconfController);
+            return new NetconfSessionProxyImpl(netconfDeviceInfo,
+                                               netconfController,
+                                               netconfController.getLocalNodeId());
         }
     }
 }
diff --git a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java
index 5e54559..d420db8 100644
--- a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java
+++ b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Foundation
+ * Copyright 2019-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +18,6 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
-import org.easymock.EasyMock;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -26,6 +25,7 @@
 import org.onlab.packet.IpAddress;
 import org.onosproject.cfg.ComponentConfigAdapter;
 import org.onosproject.cfg.ComponentConfigService;
+import org.onosproject.cluster.ClusterService;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.mastership.MastershipServiceAdapter;
 import org.onosproject.net.DeviceId;
@@ -60,6 +60,7 @@
 import java.util.Optional;
 import java.util.Set;
 
+import static org.easymock.EasyMock.createMock;
 import static org.hamcrest.Matchers.*;
 import static org.junit.Assert.*;
 import static org.onosproject.netconf.ctl.impl.OsgiPropertyConstants.NETCONF_CONNECT_TIMEOUT_DEFAULT;
@@ -124,6 +125,7 @@
     private final MastershipService mastershipService = new MockmastershipService();
     private final ClusterCommunicationService clusterCommunicationService =
             new ClusterCommunicationServiceMock();
+    private final ClusterService mockClusterService = createMock(ClusterService.class);
 
     private final ComponentContext context = new MockComponentContext();
 
@@ -140,6 +142,7 @@
         NetconfControllerImpl.netconfIdleTimeout = NETCONF_IDLE_TIMEOUT_DEFAULT;
         NetconfControllerImpl.netconfReplyTimeout = NETCONF_REPLY_TIMEOUT_DEFAULT;
         ctrl.clusterCommunicator = clusterCommunicationService;
+        ctrl.clusterService = mockClusterService;
 
         //Creating mock devices
         deviceInfo1 = new NetconfDeviceInfo("device1", "001", IpAddress.valueOf(DEVICE_1_IP), DEVICE_1_PORT);
@@ -240,9 +243,9 @@
      */
     @Test
     public void testAddRemoveDeviceListener() {
-        NetconfDeviceListener deviceListener1 = EasyMock.createMock(NetconfDeviceListener.class);
-        NetconfDeviceListener deviceListener2 = EasyMock.createMock(NetconfDeviceListener.class);
-        NetconfDeviceListener deviceListener3 = EasyMock.createMock(NetconfDeviceListener.class);
+        NetconfDeviceListener deviceListener1 = createMock(NetconfDeviceListener.class);
+        NetconfDeviceListener deviceListener2 = createMock(NetconfDeviceListener.class);
+        NetconfDeviceListener deviceListener3 = createMock(NetconfDeviceListener.class);
 
         ctrl.addDeviceListener(deviceListener1);
         ctrl.addDeviceListener(deviceListener2);
@@ -422,7 +425,7 @@
         public TestNetconfDevice(NetconfDeviceInfo deviceInfo) throws NetconfException {
             netconfDeviceInfo = deviceInfo;
             if (!badDeviceInfo3.getDeviceId().equals(deviceInfo.getDeviceId())) {
-                netconfSession = EasyMock.createMock(NetconfSession.class);
+                netconfSession = createMock(NetconfSession.class);
                 deviceState = true;
             } else {
                 throw new NetconfException("Cannot create Connection and Session");
