diff --git a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfNotificationEventListener.java b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfNotificationEventListener.java
index 31b3298..7866587 100644
--- a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfNotificationEventListener.java
+++ b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfNotificationEventListener.java
@@ -25,8 +25,8 @@
     /**
      * Handles the notification event.
      *
-     * @param deviceId restconf device identifier
-     * @param event    event payload
+     * @param deviceId        restconf device identifier
+     * @param eventJsonString the json string representation of the event
      */
-    void handleNotificationEvent(DeviceId deviceId, T event);
+    void handleNotificationEvent(DeviceId deviceId, T eventJsonString);
 }
diff --git a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfSBController.java b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfSBController.java
index 4cf9fe0..772aaea 100644
--- a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfSBController.java
+++ b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfSBController.java
@@ -31,48 +31,29 @@
      * callBackListener upon receiving notifications to notify the requester
      * about notifications.
      *
-     * @param device           device to make the request to
-     * @param request          url of the request
-     * @param mediaType        format to retrieve the content in
+     *
+     * @param device device to make the request to
+     * @param request url of the request
+     * @param mediaType format to retrieve the content in
      * @param callBackListener method to call when notifications arrives
      */
     void enableNotifications(DeviceId device, String request, String mediaType,
-                             RestconfNotificationEventListener callBackListener);
-
-    //TODO: To be removed once the caller to this API is updated.
-    @Deprecated void enableNotifications(DeviceId device, String request, String mediaType,
-                             RestConfNotificationEventListener callBackListener);
+                          RestConfNotificationEventListener callBackListener);
 
     /**
-     * Registers a listener for notification events that occur to restconf
+     * Register a listener for notification events that occur to restconf
      * devices.
      *
-     * @param deviceId identifier of the device to which the listener is attached
+     * @param deviceId the deviceId
      * @param listener the listener to notify
      */
     void addNotificationListener(DeviceId deviceId,
-                                 RestconfNotificationEventListener listener);
+                                 RestConfNotificationEventListener listener);
 
     /**
-     * Unregisters the listener for the device.
+     * Unregister the listener for the device.
      *
-     * @param deviceId identifier of the device for which the listener
-     *                 is to be removed
-     * @param listener listener to be removed
+     * @param deviceId the deviceId
      */
-    void removeNotificationListener(DeviceId deviceId,
-                                    RestconfNotificationEventListener listener);
-
-    //TODO: temporarily keep this API for backward compatibility.
-    @Deprecated void removeNotificationListener(DeviceId deviceId);
-
-    /**
-     * Returns true if a listener has been installed to listen to RESTCONF
-     * notifications sent from a particular device.
-     *
-     * @param deviceId identifier of the device from which the notifications
-     *                 are generated
-     * @return true if listener is installed; false otherwise
-     */
-    boolean isNotificationEnabled(DeviceId deviceId);
+    void removeNotificationListener(DeviceId deviceId);
 }
diff --git a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestconfNotificationEventListener.java b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestconfNotificationEventListener.java
deleted file mode 100644
index 230724b..0000000
--- a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestconfNotificationEventListener.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;
-
-import org.onosproject.net.DeviceId;
-
-/**
- * Notifies providers about incoming RESTCONF notification events.
- */
-public interface RestconfNotificationEventListener<T> {
-
-    /**
-     * Handles the notification event.
-     *
-     * @param deviceId restconf device identifier
-     * @param event    event payload
-     */
-    void handleNotificationEvent(DeviceId deviceId, T event);
-}
diff --git a/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java b/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java
index 77e87ef..ce6335b 100644
--- a/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java
+++ b/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java
@@ -15,6 +15,16 @@
  */
 package org.onosproject.protocol.restconf.ctl;
 
+import java.io.InputStream;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
+
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -28,23 +38,11 @@
 import org.onosproject.protocol.rest.RestSBDevice;
 import org.onosproject.protocol.restconf.RestConfNotificationEventListener;
 import org.onosproject.protocol.restconf.RestConfSBController;
-import org.onosproject.protocol.restconf.RestconfNotificationEventListener;
 import org.onosproject.yms.ych.YangProtocolEncodingFormat;
 import org.onosproject.yms.ymsm.YmsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
-import java.io.InputStream;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
 /**
  * The implementation of RestConfSBController.
  */
@@ -64,8 +62,8 @@
     private static final String RESOURCE_PATH_PREFIX = "/data/";
     private static final String NOTIFICATION_PATH_PREFIX = "/streams/";
 
-    private Map<DeviceId, Set<RestconfNotificationEventListener>>
-            restconfNotificationListenerMap = new ConcurrentHashMap<>();
+    private Map<DeviceId, RestConfNotificationEventListener>
+                                            restconfNotificationListenerMap = new ConcurrentHashMap<>();
     private Map<DeviceId, GetChunksRunnable> runnableTable = new ConcurrentHashMap<>();
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -170,13 +168,8 @@
 
     @Override
     public void enableNotifications(DeviceId device, String request,
-                                    String mediaType,
-                                    RestconfNotificationEventListener listener) {
-
-        if (isNotificationEnabled(device)) {
-            log.warn("enableNotifications: already enabled on device: {}", device);
-            return;
-        }
+                                 String mediaType,
+                                 RestConfNotificationEventListener listener) {
 
         request = discoverRootResource(device) + NOTIFICATION_PATH_PREFIX
                 + request;
@@ -189,17 +182,11 @@
         executor.execute(runnable);
     }
 
-    @Override
-    public void enableNotifications(DeviceId device, String request,
-                                    String mediaType,
-                                    RestConfNotificationEventListener callBackListener) {
-        //TODO: to be removed once the call to the API is updated.
-    }
-
     public void stopNotifications(DeviceId device) {
+
         runnableTable.get(device).terminate();
         runnableTable.remove(device);
-        restconfNotificationListenerMap.remove(device);
+        removeNotificationListener(device);
         log.debug("Stop sending notifications for device URI: " + device.uri().toString());
 
     }
@@ -216,9 +203,9 @@
         }
 
         /**
-         * @param request   request
+         * @param request request
          * @param mediaType media type
-         * @param device    device identifier
+         * @param device device identifier
          */
         public GetChunksRunnable(String request, String mediaType,
                                  DeviceId device) {
@@ -231,8 +218,8 @@
         public void run() {
             WebTarget wt = getWebTarget(device, request);
             Response clientResp = wt.request(mediaType).get();
-            Set<RestconfNotificationEventListener> listeners =
-                    restconfNotificationListenerMap.get(device);
+            RestConfNotificationEventListener listener = restconfNotificationListenerMap
+                    .get(device);
             final ChunkedInput<String> chunkedInput = (ChunkedInput<String>) clientResp
                     .readEntity(new GenericType<ChunkedInput<String>>() {
                     });
@@ -246,12 +233,10 @@
                 chunk = chunkedInput.read();
                 if (chunk != null) {
                     if (running) {
-                        for (RestconfNotificationEventListener listener : listeners) {
-                            listener.handleNotificationEvent(device, chunk);
-                        }
+                        listener.handleNotificationEvent(device, chunk);
                     } else {
                         log.trace("the requesting client is no more interested "
-                                          + "to receive such notifications.");
+                                + "to receive such notifications.");
                     }
                 } else {
                     log.trace("The received notification chunk is null. do not continue any more.");
@@ -271,35 +256,15 @@
 
     @Override
     public void addNotificationListener(DeviceId deviceId,
-                                        RestconfNotificationEventListener listener) {
-        Set<RestconfNotificationEventListener> listeners =
-                restconfNotificationListenerMap.get(deviceId);
-        if (listeners == null) {
-            listeners = new HashSet<>();
-        }
-
-        listeners.add(listener);
-
-        this.restconfNotificationListenerMap.put(deviceId, listeners);
-    }
-
-    @Override
-    public void removeNotificationListener(DeviceId deviceId,
-                                           RestconfNotificationEventListener listener) {
-        Set<RestconfNotificationEventListener> listeners =
-                restconfNotificationListenerMap.get(deviceId);
-        if (listeners != null) {
-            listeners.remove(listener);
+                                        RestConfNotificationEventListener listener) {
+        if (!restconfNotificationListenerMap.containsKey(deviceId)) {
+            this.restconfNotificationListenerMap.put(deviceId, listener);
         }
     }
 
     @Override
     public void removeNotificationListener(DeviceId deviceId) {
-        //TODO: This API is obsolete.
-        return;
+        this.restconfNotificationListenerMap.remove(deviceId);
     }
 
-    public boolean isNotificationEnabled(DeviceId deviceId) {
-        return runnableTable.containsKey(deviceId);
-    }
 }
