diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbMirror.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbMirror.java
index 7f889db..2046561 100644
--- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbMirror.java
+++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbMirror.java
@@ -17,6 +17,7 @@
 package org.onosproject.ovsdb.controller;
 
 import com.google.common.collect.Maps;
+import org.onlab.packet.VlanId;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.behaviour.MirroringDescription;
 import org.onosproject.ovsdb.rfc.notation.Uuid;
@@ -232,13 +233,13 @@
             mirroringName = mirrorDesc.name().name();
             selectAll = false;
             monitorSrcPorts = mirrorDesc.monitorSrcPorts().parallelStream()
-                    .map(monitorSrcPort -> Uuid.uuid(monitorSrcPort))
+                    .map(Uuid::uuid)
                     .collect(Collectors.toSet());
             monitorDstPorts = mirrorDesc.monitorDstPorts().parallelStream()
-                    .map(monitorDstPort -> Uuid.uuid(monitorDstPort))
+                    .map(Uuid::uuid)
                     .collect(Collectors.toSet());
             monitorVlans = mirrorDesc.monitorVlans().parallelStream()
-                    .map(monitorVlan -> monitorVlan.toShort())
+                    .map(VlanId::toShort)
                     .collect(Collectors.toSet());
 
             if (mirrorDesc.mirrorPort().isPresent()) {
diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbQos.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbQos.java
index e44076c..5f1d4c9 100644
--- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbQos.java
+++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbQos.java
@@ -181,7 +181,7 @@
             }
 
             if (qosDesc.queues().isPresent()) {
-                Map<Long, String> map = new HashMap();
+                Map<Long, String> map = new HashMap<>();
                 qosDesc.queues().get().forEach((k, v) -> map.put(k, v.queueId().name()));
                 queues = Optional.ofNullable(map);
             }
diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
index e830d30..ec29386 100644
--- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
+++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
@@ -730,13 +730,11 @@
             return ovsdbQoses;
         }
         ConcurrentMap<String, Row> rows = rowStore.getRowStore();
-        for (String uuid : rows.keySet()) {
-            Row row = getRow(DATABASENAME, QOS, uuid);
-            OvsdbQos ovsdbQos = getOvsdbQos(row);
-            if (ovsdbQos != null) {
-                ovsdbQoses.add(ovsdbQos);
-            }
-        }
+        ovsdbQoses = rows.keySet().stream()
+                .map(uuid -> getRow(DATABASENAME, QOS, uuid))
+                .map(this::getOvsdbQos)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
         return ovsdbQoses;
     }
 
@@ -769,7 +767,7 @@
 
         Uuid qosUuid = qosRow.uuid();
 
-        Map<Long, Uuid> newQueues = new HashMap<Long, Uuid>();
+        Map<Long, Uuid> newQueues = new HashMap<>();
         for (Map.Entry<Long, QueueDescription> entry : queues.entrySet()) {
             Row queueRow = queueTableRows.values().stream().filter(r -> {
                 OvsdbMap ovsdbMap = (OvsdbMap) (r.getColumn(EXTERNAL_ID).data());
@@ -813,14 +811,12 @@
             return;
         }
 
-        Map<Long, Uuid> deleteQueuesMap = new HashMap<>();
+        Map<Long, Uuid> deleteQueuesMap;
         Map<Integer, Uuid> queuesMap = ((OvsdbMap) qosRow.getColumn(QUEUES).data()).map();
 
-        queueKeys.forEach(key -> {
-            if (queuesMap.containsKey(key.intValue())) {
-                deleteQueuesMap.put(key, queuesMap.get(key.intValue()));
-            }
-        });
+        deleteQueuesMap = queueKeys.stream()
+                .filter(key -> queuesMap.containsKey(key.intValue()))
+                .collect(Collectors.toMap(key -> key, key -> queuesMap.get(key.intValue()), (a, b) -> b));
 
         if (deleteQueuesMap.size() != 0) {
             TableSchema parentTableSchema = dbSchema
@@ -922,13 +918,12 @@
             return ovsdbqueues;
         }
         ConcurrentMap<String, Row> rows = rowStore.getRowStore();
-        for (String uuid : rows.keySet()) {
-            Row row = getRow(DATABASENAME, QUEUE, uuid);
-            OvsdbQueue ovsdbQueue = getOvsdbQueue(row);
-            if (ovsdbQueue != null) {
-                ovsdbqueues.add(ovsdbQueue);
-            }
-        }
+        ovsdbqueues = rows.keySet()
+                .stream()
+                .map(uuid -> getRow(DATABASENAME, QUEUE, uuid))
+                .map(this::getOvsdbQueue)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
         return ovsdbqueues;
     }
     /**
@@ -1311,7 +1306,7 @@
         }
         DatabaseSchema databaseSchema = schema.get(dbName);
         if (databaseSchema == null) {
-            List<String> dbNames = new ArrayList<String>();
+            List<String> dbNames = new ArrayList<>();
             dbNames.add(dbName);
             Function<JsonNode, DatabaseSchema> rowFunction = input -> {
                 log.debug("Get ovsdb database schema {}", dbName);
@@ -1603,7 +1598,7 @@
 
     @Override
     public Set<OvsdbPort> getPorts() {
-        Set<OvsdbPort> ovsdbPorts = new HashSet<>();
+        Set<OvsdbPort> ovsdbPorts;
         OvsdbTableStore tableStore = getTableStore(DATABASENAME);
         if (tableStore == null) {
             return null;
@@ -1613,13 +1608,12 @@
             return null;
         }
         ConcurrentMap<String, Row> rows = rowStore.getRowStore();
-        for (String uuid : rows.keySet()) {
-            Row row = getRow(DATABASENAME, INTERFACE, uuid);
-            OvsdbPort ovsdbPort = getOvsdbPort(row);
-            if (ovsdbPort != null) {
-                ovsdbPorts.add(ovsdbPort);
-            }
-        }
+        ovsdbPorts = rows.keySet()
+                .stream()
+                .map(uuid -> getRow(DATABASENAME, INTERFACE, uuid))
+                .map(this::getOvsdbPort)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
         return ovsdbPorts;
     }
 
@@ -1843,22 +1837,19 @@
                 .entrySet().stream().filter(intf -> Objects.nonNull(intf.getValue())
                         && ((OvsdbSet) intf.getValue().getOpenFlowPortColumn().data()).set()
                         .stream().findAny().orElse(OFPORT_ERROR_COMPARISON).equals(OFPORT_ERROR))
-                .map(intf -> intf.getValue()).collect(Collectors.toList());
+                .map(Map.Entry::getValue).collect(Collectors.toList());
 
-        interfaceList.forEach(intf -> new Consumer<Interface>() {
-            @Override
-            public void accept(Interface intf) {
-                try {
-                    Set<String> setErrors = ((OvsdbSet) intf.getErrorColumn().data()).set();
-                    log.info("Port has errors. ofport value - {}, Interface - {} has error - {} ",
-                            intf.getOpenFlowPortColumn().data(), intf.getName(), setErrors.stream()
-                                    .findFirst().get());
-                } catch (ColumnSchemaNotFoundException | VersionMismatchException  e) {
-                    log.debug("Port has errors. ofport value - {}, Interface - {} has error - {} ",
-                            intf.getOpenFlowPortColumn().data(), intf.getName(), e);
-                }
+        interfaceList.forEach(intf -> ((Consumer<Interface>) intf1 -> {
+            try {
+                Set<String> setErrors = ((OvsdbSet) intf1.getErrorColumn().data()).set();
+                log.info("Port has errors. ofport value - {}, Interface - {} has error - {} ",
+                        intf1.getOpenFlowPortColumn().data(), intf1.getName(), setErrors.stream()
+                                .findFirst().get());
+            } catch (ColumnSchemaNotFoundException | VersionMismatchException e) {
+                log.debug("Port has errors. ofport value - {}, Interface - {} has error - {} ",
+                        intf1.getOpenFlowPortColumn().data(), intf1.getName(), e);
             }
-        }.accept(intf));
+        }).accept(intf));
 
         return !interfaceList.isEmpty();
     }
diff --git a/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java b/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java
index 7e05c4c..6282c5b 100644
--- a/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java
+++ b/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java
@@ -114,7 +114,7 @@
     @Override
     public OvsdbQos getQos(QosId qosId) {
         return null;
-    };
+    }
 
     @Override
     public Set<OvsdbQos> getQoses() {
@@ -143,7 +143,7 @@
     @Override
     public OvsdbQueue getQueue(QueueId queueId) {
         return null;
-    };
+    }
 
     @Override
     public Set<OvsdbQueue> getQueues() {
diff --git a/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbControllerAdapter.java b/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbControllerAdapter.java
index 2f2b1fd..842f753 100644
--- a/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbControllerAdapter.java
+++ b/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbControllerAdapter.java
@@ -25,7 +25,7 @@
 import org.onosproject.ovsdb.controller.OvsdbNodeListener;
 
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Consumer;
@@ -35,7 +35,7 @@
  */
 public class OvsdbControllerAdapter implements OvsdbController {
     protected ConcurrentHashMap<OvsdbNodeId, OvsdbClientServiceAdapter> ovsdbClients =
-            new ConcurrentHashMap<OvsdbNodeId, OvsdbClientServiceAdapter>();
+            new ConcurrentHashMap<>();
 
     @Override
     public void addNodeListener(OvsdbNodeListener listener) {
@@ -60,7 +60,7 @@
     @Override
     public List<OvsdbNodeId> getNodeIds() {
         long port = 6653;
-        return new ArrayList<OvsdbNodeId>(Arrays.asList(
+        return new ArrayList<>(Collections.singletonList(
                 new OvsdbNodeId(IpAddress.valueOf("127.0.0.1"), port)));
     }
 
diff --git a/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/Controller.java b/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/Controller.java
index aedccf6..8bf0609 100644
--- a/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/Controller.java
+++ b/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/Controller.java
@@ -138,38 +138,35 @@
      * @param channel the channel to use.
      */
     private void handleNewNodeConnection(final Channel channel) {
-        executorService.execute(new Runnable() {
-            @Override
-            public void run() {
-                log.info("Handle new node connection");
+        executorService.execute(() -> {
+            log.info("Handle new node connection");
 
-                IpAddress ipAddress = IpAddress
-                        .valueOf(((InetSocketAddress) channel.remoteAddress())
-                                .getAddress().getHostAddress());
-                long port = ((InetSocketAddress) channel.remoteAddress())
-                        .getPort();
+            IpAddress ipAddress = IpAddress
+                    .valueOf(((InetSocketAddress) channel.remoteAddress())
+                            .getAddress().getHostAddress());
+            long port = ((InetSocketAddress) channel.remoteAddress())
+                    .getPort();
 
-                log.info("Get connection from ip address {} : {}",
-                         ipAddress.toString(), port);
+            log.info("Get connection from ip address {} : {}",
+                     ipAddress.toString(), port);
 
-                OvsdbNodeId nodeId = new OvsdbNodeId(ipAddress, port);
-                OvsdbProviderService ovsdbProviderService = getNodeInstance(nodeId,
-                                                                            agent,
-                                                                            monitorCallback,
-                                                                            channel);
-                ovsdbProviderService.setConnection(true);
-                OvsdbJsonRpcHandler ovsdbJsonRpcHandler = new OvsdbJsonRpcHandler(
-                                                                                  nodeId);
-                ovsdbJsonRpcHandler
-                        .setOvsdbProviderService(ovsdbProviderService);
-                channel.pipeline().addLast(ovsdbJsonRpcHandler);
+            OvsdbNodeId nodeId = new OvsdbNodeId(ipAddress, port);
+            OvsdbProviderService ovsdbProviderService = getNodeInstance(nodeId,
+                                                                        agent,
+                                                                        monitorCallback,
+                                                                        channel);
+            ovsdbProviderService.setConnection(true);
+            OvsdbJsonRpcHandler ovsdbJsonRpcHandler = new OvsdbJsonRpcHandler(
+                                                                              nodeId);
+            ovsdbJsonRpcHandler
+                    .setOvsdbProviderService(ovsdbProviderService);
+            channel.pipeline().addLast(ovsdbJsonRpcHandler);
 
-                ovsdbProviderService.nodeAdded();
-                ChannelFuture closeFuture = channel.closeFuture();
-                closeFuture
-                        .addListener(new ChannelConnectionListener(
-                                                                   ovsdbProviderService));
-            }
+            ovsdbProviderService.nodeAdded();
+            ChannelFuture closeFuture = channel.closeFuture();
+            closeFuture
+                    .addListener(new ChannelConnectionListener(
+                                                               ovsdbProviderService));
         });
     }
 
diff --git a/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java b/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
index 3ed30d8..8f070b2 100644
--- a/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
+++ b/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
@@ -93,14 +93,14 @@
     private static final long DEFAULT_OVSDB_RPC_TIMEOUT = 3000;
     private final Controller controller = new Controller();
     protected ConcurrentHashMap<OvsdbNodeId, OvsdbClientService> ovsdbClients =
-            new ConcurrentHashMap<OvsdbNodeId, OvsdbClientService>();
+            new ConcurrentHashMap<>();
     protected OvsdbAgent agent = new InternalOvsdbNodeAgent();
     protected InternalMonitorCallBack updateCallback = new InternalMonitorCallBack();
     protected Set<OvsdbNodeListener> ovsdbNodeListener = new CopyOnWriteArraySet<>();
     protected Set<OvsdbEventListener> ovsdbEventListener = new CopyOnWriteArraySet<>();
     protected ConcurrentHashMap<String, OvsdbClientService> requestNotification =
-            new ConcurrentHashMap<String, OvsdbClientService>();
-    protected ConcurrentHashMap<String, String> requestDbName = new ConcurrentHashMap<String, String>();
+            new ConcurrentHashMap<>();
+    protected ConcurrentHashMap<String, String> requestDbName = new ConcurrentHashMap<>();
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ComponentConfigService configService;
@@ -273,7 +273,7 @@
 
         EventSubject eventSubject = new DefaultEventSubject(MacAddress.valueOf(
                 macAndIfaceId[0]),
-                                                            new HashSet<IpAddress>(),
+                new HashSet<>(),
                                                             new OvsdbPortName(intf
                                                                                       .getName()),
                                                             new OvsdbPortNumber(localPort),
@@ -282,8 +282,8 @@
                                                             new OvsdbPortType(portType),
                                                             new OvsdbIfaceId(macAndIfaceId[1]));
         for (OvsdbEventListener listener : ovsdbEventListener) {
-            listener.handle(new OvsdbEvent<EventSubject>(eventType,
-                                                         eventSubject));
+            listener.handle(new OvsdbEvent<>(eventType,
+                    eventSubject));
         }
     }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/jsonrpc/JsonReadContext.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/jsonrpc/JsonReadContext.java
index 9c9395e..f0faaec 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/jsonrpc/JsonReadContext.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/jsonrpc/JsonReadContext.java
@@ -31,7 +31,7 @@
      * entity.
      */
     public JsonReadContext() {
-        bufStack = new Stack<Byte>();
+        bufStack = new Stack<>();
         isStartMatch = false;
         lastReadBytes = 0;
     }
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Condition.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Condition.java
index a546aed..20deccc 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Condition.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Condition.java
@@ -40,7 +40,7 @@
 
         private final String function;
 
-        private Function(String function) {
+        Function(String function) {
             this.function = function;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Mutation.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Mutation.java
index 7815ee3..126cd84 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Mutation.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Mutation.java
@@ -41,7 +41,7 @@
 
         private final String mutator;
 
-        private Mutator(String mutator) {
+        Mutator(String mutator) {
             this.mutator = mutator;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Operation.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Operation.java
index a278d50..44a5e09 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Operation.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/operations/Operation.java
@@ -45,7 +45,7 @@
 
         private String op;
 
-        private Operations(String op) {
+        Operations(String op) {
             this.op = op;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnTypeFactory.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnTypeFactory.java
index 35423df..c6942d7 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnTypeFactory.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/ColumnTypeFactory.java
@@ -40,7 +40,7 @@
 
         private final String type;
 
-        private Type(String type) {
+        Type(String type) {
             this.type = type;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/UuidBaseType.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/UuidBaseType.java
index 9cf7dd0..4c2f18b 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/UuidBaseType.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/schema/type/UuidBaseType.java
@@ -33,7 +33,7 @@
 
         private String refType;
 
-        private RefType(String refType) {
+        RefType(String refType) {
             this.refType = refType;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Bridge.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Bridge.java
index dcf49ed..f31cf38 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Bridge.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Bridge.java
@@ -45,7 +45,7 @@
 
         private final String columnName;
 
-        private BridgeColumn(String columnName) {
+        BridgeColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Controller.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Controller.java
index f93cb7d..4c019cd 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Controller.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Controller.java
@@ -46,7 +46,7 @@
 
         private final String columnName;
 
-        private ControllerColumn(String columnName) {
+        ControllerColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/FlowSampleCollectorSet.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/FlowSampleCollectorSet.java
index a169808..c5dde81 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/FlowSampleCollectorSet.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/FlowSampleCollectorSet.java
@@ -36,7 +36,7 @@
 
         private final String columnName;
 
-        private FlowSampleCollectorSetColumn(String columnName) {
+        FlowSampleCollectorSetColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/FlowTable.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/FlowTable.java
index cdcbf7a..71c89d3 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/FlowTable.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/FlowTable.java
@@ -37,7 +37,7 @@
 
         private final String columnName;
 
-        private FlowTableColumn(String columnName) {
+        FlowTableColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Interface.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Interface.java
index b05657b..30f0104 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Interface.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Interface.java
@@ -50,7 +50,7 @@
 
         private final String columnName;
 
-        private InterfaceColumn(String columnName) {
+        InterfaceColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Ipfix.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Ipfix.java
index 7b01376..48d23c7 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Ipfix.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Ipfix.java
@@ -38,7 +38,7 @@
 
         private final String columnName;
 
-        private IpfixColumn(String columnName) {
+        IpfixColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Manager.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Manager.java
index a6e30c5..7c4ad0d 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Manager.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Manager.java
@@ -38,7 +38,7 @@
 
         private final String columnName;
 
-        private ManagerColumn(String columnName) {
+        ManagerColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Mirror.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Mirror.java
index 48631d4..f2f6210 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Mirror.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Mirror.java
@@ -39,7 +39,7 @@
 
         private final String columnName;
 
-        private MirrorColumn(String columnName) {
+        MirrorColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Netflow.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Netflow.java
index cbb6056..bdb4bac 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Netflow.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Netflow.java
@@ -37,7 +37,7 @@
 
         private final String columnName;
 
-        private NetflowColumn(String columnName) {
+        NetflowColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OpenVSwitch.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OpenVSwitch.java
index 692a6c5..3ddc1b9 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OpenVSwitch.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OpenVSwitch.java
@@ -44,7 +44,7 @@
 
         private final String columnName;
 
-        private OpenVSwitchColumn(String columnName) {
+        OpenVSwitchColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OvsdbTable.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OvsdbTable.java
index a6ebed2..0594dd2 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OvsdbTable.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/OvsdbTable.java
@@ -27,7 +27,7 @@
 
     private final String tableName;
 
-    private OvsdbTable(String tableName) {
+    OvsdbTable(String tableName) {
         this.tableName = tableName;
     }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Port.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Port.java
index 1db8137..3be5f55 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Port.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Port.java
@@ -43,7 +43,7 @@
 
         private final String columnName;
 
-        private PortColumn(String columnName) {
+        PortColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Qos.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Qos.java
index dc3e67d..f7caecd 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Qos.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Qos.java
@@ -37,7 +37,7 @@
 
         private final String columnName;
 
-        private QosColumn(String columnName) {
+        QosColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Queue.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Queue.java
index 84841a3..de8ced9 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Queue.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Queue.java
@@ -36,7 +36,7 @@
 
         private final String columnName;
 
-        private QueueColumn(String columnName) {
+        QueueColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Sflow.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Sflow.java
index ac70ea3..ad8e5cc 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Sflow.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Sflow.java
@@ -37,7 +37,7 @@
 
         private final String columnName;
 
-        private SflowColumn(String columnName) {
+        SflowColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Ssl.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Ssl.java
index 7667110..bb0a7b0 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Ssl.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Ssl.java
@@ -36,7 +36,7 @@
 
         private final String columnName;
 
-        private SslColumn(String columnName) {
+        SslColumn(String columnName) {
             this.columnName = columnName;
         }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/VersionNum.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/VersionNum.java
index 33327d8..7e7825e 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/VersionNum.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/VersionNum.java
@@ -36,7 +36,7 @@
 
     private final String versionNum;
 
-    private VersionNum(String versionNum) {
+    VersionNum(String versionNum) {
         this.versionNum = versionNum;
     }
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java
index 3383ba9..858a1fc 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java
@@ -218,7 +218,7 @@
     public static List<OperationResult> jsonNodeToOperationResult(List<JsonNode> input,
                                                                   List<Operation> operations) {
         ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper(false);
-        List<OperationResult> operationResults = new ArrayList<OperationResult>();
+        List<OperationResult> operationResults = new ArrayList<>();
         for (int i = 0; i < input.size(); i++) {
             JsonNode jsonNode = input.get(i);
 
diff --git a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/JsonRpcReaderUtil.java b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/JsonRpcReaderUtil.java
index 5f677cf..b7662ef 100644
--- a/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/JsonRpcReaderUtil.java
+++ b/protocols/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/JsonRpcReaderUtil.java
@@ -115,7 +115,6 @@
     /**
      * Filter the invalid characters before decoding.
      * @param in input of bytes
-     * @param lastReadBytes the bytes for last decoding incomplete record
      */
     private static void fliterCharaters(ByteBuf in) {
         while (in.isReadable()) {
@@ -130,14 +129,11 @@
 
     /**
      * Check whether the peek of the stack element is double quote.
-     * @param jrContext context for the last decoding process
+     * @param bufStack context for the last decoding process
      * @return boolean
      */
     private static boolean isDoubleQuote(Stack<Byte> bufStack) {
-        if (!bufStack.isEmpty() && bufStack.peek() == '"') {
-            return true;
-        }
-        return false;
+        return !bufStack.isEmpty() && bufStack.peek() == '"';
     }
 
     /**
