diff --git a/apps/drivermatrix/src/main/java/org/onosproject/drivermatrix/DriverViewMessageHandler.java b/apps/drivermatrix/src/main/java/org/onosproject/drivermatrix/DriverViewMessageHandler.java
index 29543b9..59e3a87 100644
--- a/apps/drivermatrix/src/main/java/org/onosproject/drivermatrix/DriverViewMessageHandler.java
+++ b/apps/drivermatrix/src/main/java/org/onosproject/drivermatrix/DriverViewMessageHandler.java
@@ -50,9 +50,9 @@
     private static final String MATRIX = "matrix";
 
     private static final Comparator<? super Class<? extends Behaviour>> BEHAVIOUR_BY_NAME =
-            (o1, o2) -> o1.getSimpleName().compareTo(o2.getSimpleName());
+            Comparator.comparing(Class::getSimpleName);
     private static final Comparator<? super Driver> DRIVER_BY_NAME =
-            (o1, o2) -> o1.name().compareTo(o2.name());
+            Comparator.comparing(Driver::name);
 
 
     @Override
@@ -72,7 +72,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             DriverService driverService = get(DriverService.class);
 
             List<Driver> drivers = new ArrayList<>(driverService.getDrivers());
@@ -82,7 +82,7 @@
             List<Class<? extends Behaviour>> behaviours = orderBehaviours(drivers);
 
             // Produce a JSON structure and send it
-            sendMessage(DRIVER_DATA_RESPONSE, 0, driversJson(drivers, behaviours));
+            sendMessage(DRIVER_DATA_RESPONSE, driversJson(drivers, behaviours));
         }
 
         private List<Driver> orderDrivers(List<Driver> drivers) {
diff --git a/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTableMessageHandler.java b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTableMessageHandler.java
index 46c3a9d..b0ebbad 100644
--- a/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTableMessageHandler.java
+++ b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTableMessageHandler.java
@@ -18,20 +18,22 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
+import org.joda.time.DateTime;
+import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
+import org.onosproject.net.DeviceId;
 import org.onosproject.ui.RequestHandler;
 import org.onosproject.ui.UiMessageHandler;
 import org.onosproject.ui.table.TableModel;
 import org.onosproject.ui.table.TableRequestHandler;
+import org.onosproject.ui.table.cell.TimeFormatter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Collection;
 import java.util.Set;
-import org.joda.time.DateTime;
-import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
-import org.onosproject.incubator.net.faultmanagement.alarm.AlarmId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.ui.table.cell.TimeFormatter;
+
+import static java.lang.Long.parseLong;
+import static org.onosproject.incubator.net.faultmanagement.alarm.AlarmId.alarmId;
 
 /**
  * Skeletal ONOS UI Table-View message handler.
@@ -58,8 +60,12 @@
 
     // TODO No need to show id column in ONOS-GUI
 
-    // TODO Replace SEVERITY column by color-coding of row depending on severity ie. red=critical, green=cleared etc
-    private static final String[] COLUMN_IDS = {ID, DEVICE_ID_STR, DESCRIPTION, SOURCE, TIME_RAISED, SEVERITY};
+    // TODO Replace SEVERITY column by color-coding of row depending on severity
+    // e.g. red=critical, green=cleared etc
+
+    private static final String[] COLUMN_IDS = {
+            ID, DEVICE_ID_STR, DESCRIPTION, SOURCE, TIME_RAISED, SEVERITY
+    };
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -82,7 +88,6 @@
 
         @Override
         protected String defaultColumnId() {
-            // if necessary, override defaultColumnId() -- if it isn't "id"
             return ID;
         }
 
@@ -98,7 +103,6 @@
 
         @Override
         protected TableModel createTableModel() {
-            // if required, override createTableModel() to set column formatters / comparators
             TableModel tm = super.createTableModel();
             tm.setFormatter(TIME_RAISED, new TimeFormatter());
             return tm;
@@ -106,21 +110,18 @@
 
         @Override
         protected void populateTable(TableModel tm, ObjectNode payload) {
-            log.debug(" populateTable tm={} payload ={}", tm, payload);
+            log.debug(" populateTable: tm = {}; payload = {}", tm, payload);
             String devId = string(payload, "devId");
 
             Set<Alarm> alarms = Strings.isNullOrEmpty(devId) ?
                     AlarmServiceUtil.lookUpAlarms() :
                     AlarmServiceUtil.lookUpAlarms(DeviceId.deviceId(devId));
 
-            alarms.forEach((alarm) -> {
-                populateRow(tm.addRow(), alarm);
-            });
-
+            alarms.forEach((alarm) -> populateRow(tm.addRow(), alarm));
         }
 
         private void populateRow(TableModel.Row row, Alarm alarm) {
-            log.debug("populate table Row row={} item ={}", row, alarm);
+            log.debug("populateRow: row = {} alarm = {}", row, alarm);
 
             row.cell(ID, alarm.id().fingerprint())
                     .cell(DEVICE_ID_STR, alarm.deviceId())
@@ -139,11 +140,11 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
-            log.debug("sid={}, payload ={}", sid, payload);
+        public void process(ObjectNode payload) {
+            log.debug("payload = {}", payload);
 
             String id = string(payload, ID, "(none)");
-            Alarm alarm = AlarmServiceUtil.lookupAlarm(AlarmId.alarmId(Long.parseLong(id)));
+            Alarm alarm = AlarmServiceUtil.lookupAlarm(alarmId(parseLong(id)));
             ObjectNode rootNode = objectNode();
             ObjectNode data = objectNode();
             rootNode.set(DETAILS, data);
@@ -167,9 +168,9 @@
                 data.put(TIME_CLEARED, formatTime(alarm.timeCleared()));
                 data.put(SEVERITY, alarm.severity().toString());
             }
-            log.debug("send ={}", rootNode);
+            log.debug("send = {}", rootNode);
 
-            sendMessage(ALARM_TABLE_DETAIL_RESP, 0, rootNode);
+            sendMessage(ALARM_TABLE_DETAIL_RESP, rootNode);
         }
     }
 
@@ -179,6 +180,4 @@
         }
         return new TimeFormatter().format(new DateTime(msSinceStartOfEpoch));
     }
-
-
 }
diff --git a/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovMessageHandler.java b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovMessageHandler.java
index 3268343..10ebad9 100644
--- a/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovMessageHandler.java
+++ b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovMessageHandler.java
@@ -19,6 +19,8 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 import org.onlab.osgi.ServiceDirectory;
+import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Element;
@@ -38,8 +40,6 @@
 
 import java.util.Collection;
 import java.util.Set;
-import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
-import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
 
 /**
  * FaultManagement UI Topology-Overlay message handler.
@@ -54,7 +54,6 @@
     private static final String MODE = "mode";
 
     private enum Mode {
-
         IDLE, MOUSE
     }
 
@@ -67,7 +66,7 @@
     private Mode currentMode = Mode.IDLE;
     private Element elementOfNote;
 
-    // ===============-=-=-=-=-=-======================-=-=-=-=-=-=-================================
+    // =======================================================================
     @Override
     public void init(UiConnection connection, ServiceDirectory directory) {
         super.init(connection, directory);
@@ -94,23 +93,21 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String mode = string(payload, MODE);
-
             log.debug("Start Display: mode [{}]", mode);
+
             clearState();
             clearForMode();
 
             switch (mode) {
                 case "mouse":
                     currentMode = Mode.MOUSE;
-
                     sendMouseData();
                     break;
 
                 default:
                     currentMode = Mode.IDLE;
-
                     break;
             }
         }
@@ -123,9 +120,10 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String id = string(payload, ID);
             log.debug("Update Display: id [{}]", id);
+
             if (!Strings.isNullOrEmpty(id)) {
                 updateForMode(id);
             } else {
@@ -141,8 +139,9 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             log.debug("Stop Display");
+
             clearState();
             clearForMode();
         }
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelUiMessageHandler.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelUiMessageHandler.java
index b03bb02..d1f0cbf 100644
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelUiMessageHandler.java
+++ b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelUiMessageHandler.java
@@ -21,24 +21,26 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableSet;
 import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Device;
+import org.onosproject.net.Port;
+import org.onosproject.net.device.DeviceService;
 import org.onosproject.ui.RequestHandler;
 import org.onosproject.ui.UiMessageHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.onosproject.net.Device;
-import org.onosproject.net.Port;
-import org.onosproject.net.device.DeviceService;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import static org.onosproject.net.ConnectPoint.deviceConnectPoint;
+
 /**
- *  ONOS UI Custom-View message handler.
- *
- *  This class contains the request handlers that handle the response
- *  to each event. In this particular implementation the second message
- *  handler creates the patch and the first message handler loads the data
+ * ONOS UI Custom-View message handler.
+ * <p>
+ * This class contains the request handlers that handle the response
+ * to each event. In this particular implementation the second message
+ * handler creates the patch and the first message handler loads the data.
  */
 public class PatchPanelUiMessageHandler extends UiMessageHandler {
 
@@ -48,60 +50,68 @@
     private static final String SAMPLE_CUSTOM_DATA_RESP2 = "sampleCustomDataResponse2";
     private static final String SAMPLE_CUSTOM_DATA_REQ3 = "sampleCustomDataRequest3";
     private static final String SAMPLE_CUSTOM_DATA_RESP3 = "sampleCustomDataResponse3";
-    private String message = "";
-    private String cpoints = "";
+
+    private static final String SLASH = "/";
+    private static final String CPS = "cps";
+    private static final String RESULT = "result";
+    private static final String MESSAGE = "message";
+
+    private static final String EOL = String.format("%n");
+    private static final String WITH = " with ";
+    private static final String CPOINTS = "cpoints";
+
     private List<ConnectPoint> previous = new ArrayList<>();
-    private static ConnectPoint cp1;
-    private static ConnectPoint cp2;
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     @Override
     protected Collection<RequestHandler> createRequestHandlers() {
-        return ImmutableSet.of(new DataRequestHandler(), new SecondDataRequestHandler(), new ThirdDataRequestHandler());
+        return ImmutableSet.of(
+                new DataRequestHandler(),
+                new SecondDataRequestHandler(),
+                new ThirdDataRequestHandler()
+        );
     }
 
     // handler for data requests/events
     private final class DataRequestHandler extends RequestHandler {
-
         private DataRequestHandler() {
             super(SAMPLE_CUSTOM_DATA_REQ);
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             DeviceService service = get(DeviceService.class);
             ObjectNode result = objectNode();
             ArrayNode cps = arrayNode();
-            result.set("cps", cps);
+            result.set(CPS, cps);
 
             for (Device device : service.getDevices()) {
                 cps.add(device.id().toString());
                 for (Port port : service.getPorts(device.id())) {
                     if (!port.number().isLogical()) {
                         cps.add(port.number().toString());
-                        log.info(device.id().toString() + "/" + port.number());
+                        log.info(device.id() + SLASH + port.number());
                     }
                 }
             }
-            sendMessage(SAMPLE_CUSTOM_DATA_RESP, 0, result);
+            sendMessage(SAMPLE_CUSTOM_DATA_RESP, result);
         }
     }
 
     private final class SecondDataRequestHandler extends RequestHandler {
-
         private SecondDataRequestHandler() {
             super(SAMPLE_CUSTOM_DATA_REQ2);
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
-            boolean done;
-            String deviceId = payload.get("result").get(0).asText();
-            cp1 = ConnectPoint.deviceConnectPoint(deviceId + "/" + payload.get("result").get(1).asText());
-            cp2 = ConnectPoint.deviceConnectPoint(deviceId + "/" + payload.get("result").get(2).asText());
-            PatchPanelService patchPanelService;
-            patchPanelService = get(PatchPanelService.class);
-            done = patchPanelService.addPatch(cp1, cp2);
+        public void process(ObjectNode payload) {
+            String deviceId = payload.get(RESULT).get(0).asText();
+            ConnectPoint cp1 = deviceConnectPoint(deviceId + SLASH + payload.get(RESULT).get(1).asText());
+            ConnectPoint cp2 = deviceConnectPoint(deviceId + SLASH + payload.get(RESULT).get(2).asText());
+            PatchPanelService pps = get(PatchPanelService.class);
+
+            boolean done = pps.addPatch(cp1, cp2);
+            String message;
             if (done) {
                 message = "Patch has been created";
                 previous.add(cp1);
@@ -112,28 +122,26 @@
                     message = "Both ports can not be the same";
                 }
             }
-            payload.put("message", message);
-            sendMessage(SAMPLE_CUSTOM_DATA_RESP2, sid, payload);
+            payload.put(MESSAGE, message);
+            sendMessage(SAMPLE_CUSTOM_DATA_RESP2, payload);
 
         }
     }
+
     private final class ThirdDataRequestHandler extends RequestHandler {
         private ThirdDataRequestHandler() {
             super(SAMPLE_CUSTOM_DATA_REQ3);
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
-            cpoints = "";
+        public void process(ObjectNode payload) {
+            StringBuilder sb = new StringBuilder();
             for (int i = 0; i < previous.size(); i++) {
-                if (i % 2 == 1) {
-                    cpoints += previous.get(i) + "\n";
-                } else {
-                    cpoints += previous.get(i) + " with ";
-                }
+                sb.append(previous.get(i)).append(i % 2 == 0 ? WITH : EOL);
             }
-            payload.put("cpoints", cpoints);
-            sendMessage(SAMPLE_CUSTOM_DATA_RESP3, sid, payload);
+            payload.put(CPOINTS, sb.toString());
+            sendMessage(SAMPLE_CUSTOM_DATA_RESP3, payload);
         }
     }
+
 }
diff --git a/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainterTopovMessageHandler.java b/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainterTopovMessageHandler.java
index b24bd85..95429c0 100644
--- a/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainterTopovMessageHandler.java
+++ b/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainterTopovMessageHandler.java
@@ -40,7 +40,6 @@
 import org.onosproject.ui.topo.Highlights;
 import org.onosproject.ui.topo.HostHighlight;
 import org.onosproject.ui.topo.NodeBadge;
-import org.onosproject.ui.topo.TopoJson;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,6 +47,8 @@
 import java.util.List;
 import java.util.Set;
 
+import static org.onosproject.ui.topo.TopoJson.highlightsMessage;
+
 /**
  * ONOS UI PathPainter Topology-Overlay message handler.
  */
@@ -67,11 +68,11 @@
     private static final String TYPE = "type";
     private static final String SWITCH = "switch";
     private static final String ENDSTATION = "endstation";
-    public static final String DST = "Dst";
-    public static final String SRC = "Src";
+    private static final String DST = "Dst";
+    private static final String SRC = "Src";
     // Delay for showHighlights event processing on GUI client side to
     // account for addLink animation.
-    public static final int DELAY_MS = 1100;
+    private static final int DELAY_MS = 1100;
 
     private final TopologyListener topologyListener = new InternalTopologyListener();
 
@@ -97,7 +98,7 @@
     protected TopologyService topologyService;
 
 
-    // ===============-=-=-=-=-=-======================-=-=-=-=-=-=-================================
+    // ===============-=-=-=-=-=-======================-=-=-=-=-=-=-===========
 
 
     @Override
@@ -139,10 +140,10 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             src = null;
             dst = null;
-            sendMessage(TopoJson.highlightsMessage(new Highlights()));
+            sendMessage(highlightsMessage(new Highlights()));
         }
     }
 
@@ -153,17 +154,17 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String id = string(payload, ID);
             src = elementId(id);
             srcType = string(payload, TYPE);
             if (src.equals(dst)) {
                 dst = null;
             }
-            sendMessage(TopoJson.highlightsMessage(addBadge(new Highlights(),
-                                                            srcType,
-                                                            src.toString(),
-                                                            SRC)));
+
+            sendMessage(highlightsMessage(
+                    addBadge(new Highlights(), srcType, src.toString(), SRC))
+            );
             findAndSendPaths(currentMode);
         }
     }
@@ -174,7 +175,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String id = string(payload, ID);
             dst = elementId(id);
             dstType = string(payload, TYPE);
@@ -182,10 +183,9 @@
                 src = null;
             }
 
-            sendMessage(TopoJson.highlightsMessage(addBadge(new Highlights(),
-                                                            dstType,
-                                                            dst.toString(),
-                                                            DST)));
+            sendMessage(highlightsMessage(
+                    addBadge(new Highlights(), dstType, dst.toString(), DST))
+            );
             findAndSendPaths(currentMode);
         }
     }
@@ -196,7 +196,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             ElementId temp = src;
             src = dst;
             dst = temp;
@@ -214,7 +214,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             pathIndex = (pathIndex >= paths.size() - 1 ? 0 : pathIndex + 1);
             hilightAndSendPaths();
         }
@@ -226,7 +226,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             pathIndex = (pathIndex <= 0 ? paths.size() - 1 : pathIndex - 1);
             hilightAndSendPaths();
         }
@@ -238,7 +238,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String mode = string(payload, MODE);
             switch (mode) {
                 case "shortest":
@@ -287,7 +287,7 @@
                 paths = ImmutableList.copyOf(pathService.getPaths(src, dst, linkData));
                 allPathLinks = buildPaths(builder).build();
             } else {
-                log.info("Unsupported MODE");
+                log.warn("Unsupported MODE");
             }
         } else {
             paths = ImmutableList.of();
@@ -342,7 +342,7 @@
         if (dst != null) {
             highlights = addBadge(highlights, dstType, dst.toString(), DST);
         }
-        sendMessage(TopoJson.highlightsMessage(highlights));
+        sendMessage(highlightsMessage(highlights));
     }
 
     private Highlights addBadge(Highlights highlights, String type, String elemId, String src) {
diff --git a/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovMessageHandler.java b/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovMessageHandler.java
index 8282d8c..8e93b80 100644
--- a/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovMessageHandler.java
+++ b/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovMessageHandler.java
@@ -16,19 +16,32 @@
 
 package org.onosproject.pceweb;
 
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableSet;
-
 import org.onlab.osgi.ServiceDirectory;
 import org.onlab.packet.IpAddress;
 import org.onlab.util.DataRateUnit;
+import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint;
+import org.onosproject.incubator.net.tunnel.Tunnel;
+import org.onosproject.incubator.net.tunnel.TunnelEndPoint;
+import org.onosproject.incubator.net.tunnel.TunnelEvent;
+import org.onosproject.incubator.net.tunnel.TunnelId;
+import org.onosproject.incubator.net.tunnel.TunnelListener;
+import org.onosproject.incubator.net.tunnel.TunnelService;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.ElementId;
 import org.onosproject.net.HostId;
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.intent.Constraint;
+import org.onosproject.net.intent.constraint.BandwidthConstraint;
 import org.onosproject.net.topology.TopologyService;
+import org.onosproject.pce.pceservice.LspType;
+import org.onosproject.pce.pceservice.api.PceService;
+import org.onosproject.pce.pceservice.constraint.CostConstraint;
 import org.onosproject.ui.RequestHandler;
 import org.onosproject.ui.UiConnection;
 import org.onosproject.ui.UiMessageHandler;
@@ -37,34 +50,20 @@
 import org.onosproject.ui.topo.LinkHighlight;
 import org.onosproject.ui.topo.Mod;
 import org.onosproject.ui.topo.NodeBadge;
-import org.onosproject.ui.topo.TopoJson;
 import org.onosproject.ui.topo.TopoUtils;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.intent.Constraint;
-import org.onosproject.pce.pceservice.LspType;
-import org.onosproject.pce.pceservice.api.PceService;
-import org.onosproject.pce.pceservice.constraint.CostConstraint;
-import org.onosproject.net.intent.constraint.BandwidthConstraint;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint;
-import org.onosproject.incubator.net.tunnel.Tunnel;
-import static org.onosproject.incubator.net.tunnel.Tunnel.State.ACTIVE;
-import org.onosproject.incubator.net.tunnel.TunnelEndPoint;
-import org.onosproject.incubator.net.tunnel.TunnelEvent;
-import org.onosproject.incubator.net.tunnel.TunnelId;
-import org.onosproject.incubator.net.tunnel.TunnelListener;
-import org.onosproject.incubator.net.tunnel.TunnelService;
-import static org.onosproject.ui.topo.LinkHighlight.Flavor.*;
-import static org.onosproject.incubator.net.tunnel.Tunnel.Type.MPLS;
-
-import com.fasterxml.jackson.databind.node.ArrayNode;
 
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
+import static org.onosproject.incubator.net.tunnel.Tunnel.State.ACTIVE;
+import static org.onosproject.incubator.net.tunnel.Tunnel.Type.MPLS;
+import static org.onosproject.ui.topo.LinkHighlight.Flavor.PRIMARY_HIGHLIGHT;
+import static org.onosproject.ui.topo.TopoJson.highlightsMessage;
+
 /**
  * ONOS UI PCE WEB Topology-Overlay message handler.
  */
@@ -105,13 +104,17 @@
     private static final String STRING_NULL = "null";
     // Delay for showHighlights event processing on GUI client side to
     // account for addLink animation.
-    private static final int DELAY_MS = 1100;
+    private static final int DELAY_MS = 1_100;
     private static final double BANDWIDTH_KBPS = 1_000;
     private static final double BANDWIDTH_MBPS = 1_000_000;
-    private static String[] linkColor = {"pCol1", "pCol2", "pCol3", "pCol4", "pCol5",
-                                               "pCol6", "pCol7", "pCol8", "pCol9", "pCol10",
-                                               "pCol11", "pCol12", "pCol13", "pCol14", "pCol15"};
-    private static final int LINK_COLOR_MAX = 15;
+    private static final String[] LINK_COLOR = {
+            "pCol1", "pCol2", "pCol3", "pCol4", "pCol5",
+            "pCol6", "pCol7", "pCol8", "pCol9", "pCol10",
+            "pCol11", "pCol12", "pCol13", "pCol14", "pCol15"
+    };
+
+    private static final int LINK_COLOR_MAX = LINK_COLOR.length;
+
     private Set<Link> allPathLinks;
     private ElementId src, dst;
     private List<Path> paths = new LinkedList<>();
@@ -124,9 +127,9 @@
     protected TunnelService tunnelService;
     protected PceService pceService;
     protected DeviceService deviceService;
+
     @Override
     public void init(UiConnection connection, ServiceDirectory directory) {
-
         super.init(connection, directory);
         tunnelService = directory.get(TunnelService.class);
         pceService = directory.get(PceService.class);
@@ -155,6 +158,7 @@
     }
 
     // Handler classes
+
     /**
      * Handles the 'clear' event received from the client.
      */
@@ -165,10 +169,10 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             src = null;
             dst = null;
-            sendMessage(TopoJson.highlightsMessage(new Highlights()));
+            sendMessage(highlightsMessage(new Highlights()));
         }
     }
 
@@ -182,7 +186,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String srcId = string(payload, SRCID);
             src = elementId(srcId);
             String dstId = string(payload, DSTID);
@@ -237,7 +241,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String srcId = string(payload, SRCID);
             ElementId src = elementId(srcId);
             String dstId = string(payload, DSTID);
@@ -263,7 +267,7 @@
             }
 
             result.putArray(BUFFER_ARRAY).addAll(arrayNode);
-            sendMessage(PCEWEB_SHOW_TUNNEL, sid, result);
+            sendMessage(PCEWEB_SHOW_TUNNEL, result);
         }
     }
 
@@ -277,7 +281,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String bandWidth = string(payload, BANDWIDTH);
             String bandWidthType = string(payload, BANDWIDTHTYPE);
             String costType = string(payload, COSTTYPE);
@@ -301,7 +305,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String tunnelIdStr = string(payload, TUNNEL_ID);
 
             if (tunnelIdStr == null) {
@@ -332,7 +336,7 @@
             arrayNode.add(tunnel.annotations().value("costType"));
 
             result.putArray(BUFFER_ARRAY).addAll(arrayNode);
-            sendMessage(PCEWEB_TUNNEL_UPDATE_INFO_REPLY, sid, result);
+            sendMessage(PCEWEB_TUNNEL_UPDATE_INFO_REPLY, result);
         }
     }
 
@@ -346,7 +350,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String srcId = string(payload, SRCID);
             ElementId src = elementId(srcId);
             String dstId = string(payload, DSTID);
@@ -374,7 +378,7 @@
             }
 
             result.putArray(BUFFER_ARRAY).addAll(arrayNode);
-            sendMessage(PCEWEB_SHOW_TUNNEL_REMOVE, sid, result);
+            sendMessage(PCEWEB_SHOW_TUNNEL_REMOVE, result);
         }
     }
 
@@ -388,7 +392,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String tunnelId = string(payload, TUNNEL_ID);
 
             if (tunnelId == null) {
@@ -409,7 +413,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             ObjectNode result = objectNode();
             ArrayNode arrayNode = arrayNode();
             Collection<Tunnel> tunnelSet = null;
@@ -423,7 +427,7 @@
             }
 
             result.putArray(BUFFER_ARRAY).addAll(arrayNode);
-            sendMessage(PCEWEB_TUNNEL_QUERY_INFO, sid, result);
+            sendMessage(PCEWEB_TUNNEL_QUERY_INFO, result);
         }
     }
 
@@ -437,7 +441,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String tunnelIdStr = string(payload, TUNNEL_ID);
 
             if (tunnelIdStr == null) {
@@ -477,14 +481,18 @@
     /**
      * Handles the setup path and highlights the path.
      *
-     * @param bandWidth
+     * @param src           ID of source
+     * @param dst           ID of destination
+     * @param bandWidth     bandwidth
      * @param bandWidthType is the kbps or mbps
-     * @param costType is igp or te
-     * @param lspType is WITH_SIGNALLING,WITHOUT_SIGNALLING_AND_WITHOUT_SR or SR_WITHOUT_SIGNALLING
-     * @param tunnelName tunnel id
+     * @param costType      is igp or te
+     * @param lspType       is WITH_SIGNALLING, WITHOUT_SIGNALLING_AND_WITHOUT_SR
+     *                      or SR_WITHOUT_SIGNALLING
+     * @param tunnelName    tunnel id
      */
-    private void findAndSendPaths(ElementId src, ElementId dst, String bandWidth, String bandWidthType,
-                                    String costType, String lspType, String tunnelName) {
+    private void findAndSendPaths(ElementId src, ElementId dst, String bandWidth,
+                                  String bandWidthType, String costType,
+                                  String lspType, String tunnelName) {
         log.debug("src={}; dst={};", src, dst);
         boolean path;
         List<Constraint> listConstrnt;
@@ -508,25 +516,24 @@
         }
 
         //TODO: need to get explicit paths [temporarily using null as the value]
-        path = pceService.setupPath((DeviceId) src, (DeviceId) dst, tunnelName, listConstrnt, lspTypeVal,
-                null);
-        if (!path) {
-             log.error("setup path is failed");
-             return;
-        }
+        path = pceService.setupPath((DeviceId) src, (DeviceId) dst,
+                tunnelName, listConstrnt, lspTypeVal, null);
 
-        return;
+        if (!path) {
+            log.error("setup path is failed");
+        }
     }
 
     /**
      * Handles the update path and highlights the path.
      *
-     * @param bandWidth bandWidth
+     * @param bandWidth     bandWidth
      * @param bandWidthType is the kbps or mbps
-     * @param costType is igp or te
-     * @param tunnelIdStr tunnel id
+     * @param costType      is igp or te
+     * @param tunnelIdStr   tunnel id
      */
-    private void findAndSendPathsUpdate(String bandWidth, String bandWidthType, String costType, String tunnelIdStr) {
+    private void findAndSendPathsUpdate(String bandWidth, String bandWidthType,
+                                        String costType, String tunnelIdStr) {
         if (tunnelIdStr != null) {
             List<Constraint> listConstrnt;
 
@@ -546,10 +553,8 @@
 
             if (!path) {
                 log.error("update path is failed");
-                return;
             }
         }
-        return;
     }
 
     /**
@@ -568,10 +573,8 @@
             boolean path = pceService.releasePath(tunnelId);
             if (!path) {
                 log.error("remove path is failed");
-                return;
             }
         }
-        return;
     }
 
     private ImmutableSet.Builder<Link> buildPaths(ImmutableSet.Builder<Link> pathBuilder) {
@@ -582,9 +585,9 @@
     /**
      * Handles the preparation of constraints list with given bandwidth and cost-type.
      *
-     * @param bandWidth bandWidth
+     * @param bandWidth     bandWidth
      * @param bandWidthType is the kbps or mbps
-     * @param costType is igp or te
+     * @param costType      is igp or te
      * @return
      */
     private List<Constraint> addBandwidthCostTypeConstraints(String bandWidth,
@@ -605,14 +608,14 @@
         //Cost type
         CostConstraint.Type costTypeVal = null;
         switch (costType) {
-        case COST_TYPE_IGP:
-            costTypeVal = CostConstraint.Type.COST;
-            break;
-        case COST_TYPE_TE:
-            costTypeVal = CostConstraint.Type.TE_COST;
-            break;
-        default:
-            break;
+            case COST_TYPE_IGP:
+                costTypeVal = CostConstraint.Type.COST;
+                break;
+            case COST_TYPE_TE:
+                costTypeVal = CostConstraint.Type.TE_COST;
+                break;
+            default:
+                break;
         }
 
         if (bwValue != 0.0) {
@@ -635,7 +638,7 @@
         for (Path path : paths) {
             for (Link link : path.links()) {
                 lh = new LinkHighlight(TopoUtils.compactLinkString(link), PRIMARY_HIGHLIGHT)
-                         .addMod(new Mod(linkColor[linkclr]));
+                        .addMod(new Mod(LINK_COLOR[linkclr]));
                 highlights.add(lh);
             }
             linkclr = linkclr + 1;
@@ -644,19 +647,19 @@
             }
         }
 
-        sendMessage(TopoJson.highlightsMessage(highlights));
+        sendMessage(highlightsMessage(highlights));
     }
 
     /**
-     *  Handles the addition of badge and highlights.
+     * Handles the addition of badge and highlights.
      *
      * @param highlights highlights
-     * @param elemId device to be add badge
-     * @param src device to be add badge
+     * @param elemId     device to be add badge
+     * @param src        device to be add badge
      * @return
      */
     private Highlights addBadge(Highlights highlights,
-            String elemId, String src) {
+                                String elemId, String src) {
         highlights = addDeviceBadge(highlights, elemId, src);
         return highlights;
     }
@@ -664,9 +667,9 @@
     /**
      * Handles the badge add and highlights.
      *
-     * @param h highlights
+     * @param h      highlights
      * @param elemId device to be add badge
-     * @param type device badge value
+     * @param type   device badge value
      * @return highlights
      */
     private Highlights addDeviceBadge(Highlights h, String elemId, String type) {
@@ -699,9 +702,9 @@
         }
     }
 
-   /**
+    /**
      * Handles the event of topology listeners.
-    */
+     */
     private void findTunnelAndHighlights() {
         Collection<Tunnel> tunnelSet = null;
         Highlights highlights = new Highlights();
@@ -709,31 +712,31 @@
         tunnelSet = tunnelService.queryTunnel(MPLS);
         if (tunnelSet.size() == 0) {
             log.warn("Tunnel does not exist");
-            sendMessage(TopoJson.highlightsMessage(highlights));
+            sendMessage(highlightsMessage(highlights));
             return;
         }
 
         for (Tunnel tunnel : tunnelSet) {
             if (tunnel.path() == null) {
                 log.error("path does not exist");
-                sendMessage(TopoJson.highlightsMessage(highlights));
+                sendMessage(highlightsMessage(highlights));
                 return;
             }
             if (!tunnel.state().equals(ACTIVE)) {
                 log.debug("Tunnel state is not active");
-                sendMessage(TopoJson.highlightsMessage(highlights));
+                sendMessage(highlightsMessage(highlights));
                 return;
             }
             Link firstLink = tunnel.path().links().get(0);
             if (firstLink != null) {
                 if (firstLink.src() != null) {
-                        highlights = addBadge(highlights, firstLink.src().deviceId().toString(), SRC);
+                    highlights = addBadge(highlights, firstLink.src().deviceId().toString(), SRC);
                 }
             }
             Link lastLink = tunnel.path().links().get(tunnel.path().links().size() - 1);
             if (lastLink != null) {
                 if (lastLink.dst() != null) {
-                        highlights = addBadge(highlights, lastLink.dst().deviceId().toString(), DST);
+                    highlights = addBadge(highlights, lastLink.dst().deviceId().toString(), DST);
                 }
             }
             paths.add(tunnel.path());
@@ -752,12 +755,12 @@
         paths.removeAll(paths);
         if (tunnel.path() == null) {
             log.error("path does not exist");
-            sendMessage(TopoJson.highlightsMessage(highlights));
+            sendMessage(highlightsMessage(highlights));
             return;
         }
         if (!tunnel.state().equals(ACTIVE)) {
             log.debug("Tunnel state is not active");
-            sendMessage(TopoJson.highlightsMessage(highlights));
+            sendMessage(highlightsMessage(highlights));
             return;
         }
 
@@ -770,7 +773,7 @@
         Link lastLink = tunnel.path().links().get(tunnel.path().links().size() - 1);
         if (lastLink != null) {
             if (lastLink.dst() != null) {
-                    highlights = addBadge(highlights, lastLink.dst().deviceId().toString(), DST);
+                highlights = addBadge(highlights, lastLink.dst().deviceId().toString(), DST);
             }
         }
         paths.add(tunnel.path());
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
index d3e4a76..ab4bef7 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
@@ -157,7 +157,7 @@
             }
 
             @Override
-            public void process(long sid, ObjectNode payload) {
+            public void process(ObjectNode payload) {
                 streamingEnabled = true;
                 sendInitData();
             }
@@ -171,7 +171,7 @@
 
                 collector.getSampleHeaders().forEach(an::add);
                 collector.getSamples().forEach(s -> sn.add(sampleNode(s)));
-                sendMessage("intentPerfInit", 0, rootNode);
+                sendMessage("intentPerfInit", rootNode);
             }
         }
 
@@ -184,7 +184,7 @@
             }
 
             @Override
-            public void process(long sid, ObjectNode payload) {
+            public void process(ObjectNode payload) {
                 streamingEnabled = false;
             }
         }
diff --git a/apps/vtn/sfcweb/src/main/java/org/onosproject/sfcweb/SfcwebUiTopovMessageHandler.java b/apps/vtn/sfcweb/src/main/java/org/onosproject/sfcweb/SfcwebUiTopovMessageHandler.java
index 8319137..daedb14 100644
--- a/apps/vtn/sfcweb/src/main/java/org/onosproject/sfcweb/SfcwebUiTopovMessageHandler.java
+++ b/apps/vtn/sfcweb/src/main/java/org/onosproject/sfcweb/SfcwebUiTopovMessageHandler.java
@@ -15,16 +15,10 @@
  */
 package org.onosproject.sfcweb;
 
-import static org.onosproject.net.DefaultEdgeLink.createEdgeLink;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Set;
-import java.util.TimerTask;
-
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
 import jersey.repackaged.com.google.common.collect.Lists;
-
 import org.onlab.osgi.DefaultServiceDirectory;
 import org.onlab.osgi.ServiceDirectory;
 import org.onlab.packet.MacAddress;
@@ -59,9 +53,13 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableSet;
+import java.util.Collection;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Set;
+import java.util.TimerTask;
+
+import static org.onosproject.net.DefaultEdgeLink.createEdgeLink;
 
 /**
  * SFC web gui topology-overlay message handler.
@@ -125,8 +123,9 @@
         public DisplayStartHandler() {
             super(SAMPLE_TOPOV_DISPLAY_START);
         }
+
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String mode = string(payload, MODE);
             PortChainService pcs = get(PortChainService.class);
             Iterable<PortChain> portChains = pcs.getPortChains();
@@ -139,7 +138,7 @@
             }
             result.putArray("a").addAll(arrayNode);
 
-            sendMessage(SAMPLE_TOPOV_DISPLAY_SFC, sid, result);
+            sendMessage(SAMPLE_TOPOV_DISPLAY_SFC, result);
         }
     }
 
@@ -149,7 +148,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             log.debug("Stop Display");
             clearState();
             clearForMode();
@@ -163,7 +162,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String id = string(payload, ID);
             ServiceDirectory serviceDirectory = new DefaultServiceDirectory();
             vtnRscService = serviceDirectory.get(VtnRscService.class);
@@ -269,7 +268,7 @@
             }
             result.putArray("sfcPathList").addAll(arrayNode);
 
-            sendMessage(SAMPLE_TOPOV_SHOW_SFC_PATH, sid, result);
+            sendMessage(SAMPLE_TOPOV_SHOW_SFC_PATH, result);
         }
     }
 
diff --git a/core/api/src/main/java/org/onosproject/ui/RequestHandler.java b/core/api/src/main/java/org/onosproject/ui/RequestHandler.java
index 7c8f2a5..cb7c901 100644
--- a/core/api/src/main/java/org/onosproject/ui/RequestHandler.java
+++ b/core/api/src/main/java/org/onosproject/ui/RequestHandler.java
@@ -59,11 +59,9 @@
     /**
      * Processes the incoming message payload from the client.
      *
-     * @param sid     message sequence identifier
      * @param payload request message payload
      */
-    // TODO: remove sid from signature
-    public abstract void process(long sid, ObjectNode payload);
+    public abstract void process(ObjectNode payload);
 
 
     // ===================================================================
@@ -85,19 +83,6 @@
      * Sends a message back to the client with the given event type and payload.
      *
      * @param eventType message event type
-     * @param sid       message sequence identifier
-     * @param payload   message payload
-     */
-    // TODO: remove sid from signature
-    @Deprecated
-    protected void sendMessage(String eventType, long sid, ObjectNode payload) {
-        parent.connection().sendMessage(eventType, sid, payload);
-    }
-
-    /**
-     * Sends a message back to the client with the given event type and payload.
-     *
-     * @param eventType message event type
      * @param payload   message payload
      */
     protected void sendMessage(String eventType, ObjectNode payload) {
@@ -108,7 +93,7 @@
     /**
      * Sends a message back to the client.
      * Here, the message is preformatted; the assumption is that it has its
-     * eventType and payload attributes already filled in.
+     * "event" (event type) and "payload" attributes already filled in.
      *
      * @param message the message to send
      */
@@ -122,12 +107,10 @@
      * Note that the message handlers must be defined in the same parent.
      *
      * @param eventType event type
-     * @param sid       sequence identifier
      * @param payload   message payload
      */
-    // TODO: remove sid from signature
-    protected void chain(String eventType, long sid, ObjectNode payload) {
-        parent.exec(eventType, sid, payload);
+    protected void chain(String eventType, ObjectNode payload) {
+        parent.exec(eventType, payload);
     }
 
     // ===================================================================
diff --git a/core/api/src/main/java/org/onosproject/ui/UiMessageHandler.java b/core/api/src/main/java/org/onosproject/ui/UiMessageHandler.java
index f6c1535..609c28b 100644
--- a/core/api/src/main/java/org/onosproject/ui/UiMessageHandler.java
+++ b/core/api/src/main/java/org/onosproject/ui/UiMessageHandler.java
@@ -39,7 +39,7 @@
  * </p>
  * <pre>
  * {
- *     "type": "<em>event-type</em>",
+ *     "event": "<em>event-type</em>",
  *     "payload": {
  *         <em>arbitrary JSON object structure</em>
  *     }
@@ -93,22 +93,19 @@
     public void process(ObjectNode message) {
         String type = JsonUtils.eventType(message);
         ObjectNode payload = JsonUtils.payload(message);
-        // TODO: remove sid
-        exec(type, 0, payload);
+        exec(type, payload);
     }
 
     /**
      * Finds the appropriate handler and executes the process method.
      *
      * @param eventType event type
-     * @param sid       sequence identifier
      * @param payload   message payload
      */
-    // TODO: remove sid from signature
-    void exec(String eventType, long sid, ObjectNode payload) {
+    void exec(String eventType, ObjectNode payload) {
         RequestHandler requestHandler = handlerMap.get(eventType);
         if (requestHandler != null) {
-            requestHandler.process(sid, payload);
+            requestHandler.process(payload);
         } else {
             log.warn("no request handler for event type {}", eventType);
         }
diff --git a/core/api/src/main/java/org/onosproject/ui/chart/ChartRequestHandler.java b/core/api/src/main/java/org/onosproject/ui/chart/ChartRequestHandler.java
index 5c3e2f7..4d5459b 100644
--- a/core/api/src/main/java/org/onosproject/ui/chart/ChartRequestHandler.java
+++ b/core/api/src/main/java/org/onosproject/ui/chart/ChartRequestHandler.java
@@ -49,7 +49,7 @@
     }
 
     @Override
-    public void process(long sid, ObjectNode payload) {
+    public void process(ObjectNode payload) {
         ChartModel cm = createChartModel();
         populateChart(cm, payload);
 
diff --git a/core/api/src/main/java/org/onosproject/ui/table/TableRequestHandler.java b/core/api/src/main/java/org/onosproject/ui/table/TableRequestHandler.java
index 6fadeb3..99fca8b 100644
--- a/core/api/src/main/java/org/onosproject/ui/table/TableRequestHandler.java
+++ b/core/api/src/main/java/org/onosproject/ui/table/TableRequestHandler.java
@@ -46,9 +46,9 @@
      * table rows, sort them according the the request sort parameters, and
      * send back the response to the client.
      *
-     * @param reqType   type of the request event
-     * @param respType  type of the response event
-     * @param nodeName  name of JSON node holding row data
+     * @param reqType  type of the request event
+     * @param respType type of the response event
+     * @param nodeName name of JSON node holding row data
      */
     public TableRequestHandler(String reqType, String respType, String nodeName) {
         super(reqType);
@@ -57,7 +57,7 @@
     }
 
     @Override
-    public void process(long sid, ObjectNode payload) {
+    public void process(ObjectNode payload) {
         TableModel tm = createTableModel();
         populateTable(tm, payload);
 
@@ -72,7 +72,7 @@
         ObjectNode rootNode = MAPPER.createObjectNode();
         rootNode.set(nodeName, TableUtils.generateRowArrayNode(tm));
         rootNode.set(ANNOTS, TableUtils.generateAnnotObjectNode(tm));
-        sendMessage(respType, 0, rootNode);
+        sendMessage(respType, rootNode);
     }
 
     /**
@@ -91,7 +91,7 @@
     /**
      * Adds table configuration specific annotations to table model.
      *
-     * @param tm a table model
+     * @param tm      a table model
      * @param payload the event payload from the client
      */
     protected void addTableConfigAnnotations(TableModel tm, ObjectNode payload) {
@@ -141,7 +141,7 @@
      * parameters (other than sort column and sort direction) that are required
      * to generate the appropriate data.
      *
-     * @param tm the table model
+     * @param tm      the table model
      * @param payload request payload
      */
     protected abstract void populateTable(TableModel tm, ObjectNode payload);
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java
index 6cb06fb..43b871b 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java
@@ -133,20 +133,27 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String action = string(payload, "action");
             String name = string(payload, "name");
+
             if (action != null && name != null) {
                 ApplicationAdminService service = get(ApplicationAdminService.class);
                 ApplicationId appId = service.getId(name);
-                if (action.equals("activate")) {
-                    service.activate(appId);
-                } else if (action.equals("deactivate")) {
-                    service.deactivate(appId);
-                } else if (action.equals("uninstall")) {
-                    service.uninstall(appId);
+                switch (action) {
+                    case "activate":
+                        service.activate(appId);
+                        break;
+                    case "deactivate":
+                        service.deactivate(appId);
+                        break;
+                    case "uninstall":
+                        service.uninstall(appId);
+                        break;
+                    default:
+                        break;
                 }
-                chain(APP_DATA_REQ, sid, payload);
+                chain(APP_DATA_REQ, payload);
             }
         }
     }
@@ -158,7 +165,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String id = string(payload, ID);
             ApplicationService as = get(ApplicationService.class);
 
@@ -204,7 +211,7 @@
 
             ObjectNode rootNode = objectNode();
             rootNode.set(DETAILS, data);
-            sendMessage(APP_DETAILS_RESP, 0, rootNode);
+            sendMessage(APP_DETAILS_RESP, rootNode);
         }
 
     }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java
index dbc7a83..3e3799b 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java
@@ -168,7 +168,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
 
             String id = string(payload, ID);
             ClusterService cs = get(ClusterService.class);
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java
index 56ab5ad..a04f616 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java
@@ -41,7 +41,6 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -181,7 +180,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String id = string(payload, ID, ZERO_URI);
 
             DeviceId deviceId = deviceId(id);
@@ -206,7 +205,7 @@
             ArrayNode ports = arrayNode();
 
             List<Port> portList = new ArrayList<>(service.getPorts(deviceId));
-            Collections.sort(portList, (p1, p2) -> {
+            portList.sort((p1, p2) -> {
                 long delta = p1.number().toLong() - p2.number().toLong();
                 return delta == 0 ? 0 : (delta < 0 ? -1 : +1);
             });
@@ -218,7 +217,7 @@
 
             ObjectNode rootNode = objectNode();
             rootNode.set(DETAILS, data);
-            sendMessage(DEV_DETAILS_RESP, 0, rootNode);
+            sendMessage(DEV_DETAILS_RESP, rootNode);
         }
 
         private ObjectNode portData(Port p, DeviceId id) {
@@ -262,7 +261,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             DeviceId deviceId = deviceId(string(payload, ID, ZERO_URI));
             String name = emptyToNull(string(payload, NAME, null));
             log.debug("Name change request: {} -- '{}'", deviceId, name);
@@ -275,7 +274,7 @@
             // means that the friendly name should be unset.
             cfg.name(name);
             cfg.apply();
-            sendMessage(DEV_NAME_CHANGE_RESP, 0, payload);
+            sendMessage(DEV_NAME_CHANGE_RESP, payload);
         }
     }
 }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/FlowViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/FlowViewMessageHandler.java
index 18c3637..46f9f9e 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/FlowViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/FlowViewMessageHandler.java
@@ -132,17 +132,17 @@
 
         private void populateRow(TableModel.Row row, FlowEntry flow) {
             row.cell(ID, flow.id().value())
-                .cell(APP_ID, flow.appId())
-                .cell(GROUP_ID, flow.groupId().id())
-                .cell(TABLE_ID, flow.tableId())
-                .cell(PRIORITY, flow.priority())
-                .cell(TIMEOUT, flow.timeout())
-                .cell(PERMANENT, flow.isPermanent())
-                .cell(STATE, flow.state())
-                .cell(PACKETS, flow.packets())
-                .cell(BYTES, flow.bytes())
-                .cell(SELECTOR, flow)
-                .cell(TREATMENT, flow);
+                    .cell(APP_ID, flow.appId())
+                    .cell(GROUP_ID, flow.groupId().id())
+                    .cell(TABLE_ID, flow.tableId())
+                    .cell(PRIORITY, flow.priority())
+                    .cell(TIMEOUT, flow.timeout())
+                    .cell(PERMANENT, flow.isPermanent())
+                    .cell(STATE, flow.state())
+                    .cell(PACKETS, flow.packets())
+                    .cell(BYTES, flow.bytes())
+                    .cell(SELECTOR, flow)
+                    .cell(TREATMENT, flow);
         }
 
         private final class SelectorFormatter implements CellFormatter {
@@ -258,7 +258,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
 
             String flowId = string(payload, FLOW_ID);
             String appId = string(payload, APP_ID);
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/GroupViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/GroupViewMessageHandler.java
index f5ca81f..95fdd53 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/GroupViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/GroupViewMessageHandler.java
@@ -127,12 +127,12 @@
 
         private void populateRow(TableModel.Row row, Group g) {
             row.cell(ID, g.id().id())
-                .cell(APP_ID, g.appId().name())
-                .cell(STATE, g.state())
-                .cell(TYPE, g.type())
-                .cell(PACKETS, g.packets())
-                .cell(BYTES, g.bytes())
-                .cell(BUCKETS, g.buckets().buckets());
+                    .cell(APP_ID, g.appId().name())
+                    .cell(STATE, g.state())
+                    .cell(TYPE, g.type())
+                    .cell(PACKETS, g.packets())
+                    .cell(BYTES, g.bytes())
+                    .cell(BUCKETS, g.buckets().buckets());
         }
 
         private final class BucketFormatter implements CellFormatter {
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/IntentViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/IntentViewMessageHandler.java
index 1b97592..0d1c062 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/IntentViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/IntentViewMessageHandler.java
@@ -112,12 +112,12 @@
 
         private void populateRow(TableModel.Row row, Intent intent, IntentService is) {
             row.cell(APP_ID, intent.appId())
-                .cell(KEY, intent.key())
-                .cell(TYPE, intent.getClass().getSimpleName())
-                .cell(PRIORITY, intent.priority())
-                .cell(STATE, is.getIntentState(intent.key()))
-                .cell(RESOURCES, intent)
-                .cell(DETAILS, intent);
+                    .cell(KEY, intent.key())
+                    .cell(TYPE, intent.getClass().getSimpleName())
+                    .cell(PRIORITY, intent.priority())
+                    .cell(STATE, is.getIntentState(intent.key()))
+                    .cell(RESOURCES, intent)
+                    .cell(DETAILS, intent);
         }
 
         private final class ResourcesFormatter implements CellFormatter {
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/MapSelectorMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/MapSelectorMessageHandler.java
index fdb2467..621bf84 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/MapSelectorMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/MapSelectorMessageHandler.java
@@ -20,10 +20,10 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableSet;
 import org.onosproject.ui.RequestHandler;
-import org.onosproject.ui.UiMessageHandler;
 import org.onosproject.ui.UiExtensionService;
-import org.onosproject.ui.UiTopoMapFactory;
+import org.onosproject.ui.UiMessageHandler;
 import org.onosproject.ui.UiTopoMap;
+import org.onosproject.ui.UiTopoMapFactory;
 
 import java.util.Collection;
 import java.util.List;
@@ -56,8 +56,8 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
-            sendMessage(MAP_LIST_RESP, 0, mapsJson());
+        public void process(ObjectNode payload) {
+            sendMessage(MAP_LIST_RESP, mapsJson());
         }
     }
 
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/SettingsViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/SettingsViewMessageHandler.java
index 57e380f..632f721 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/SettingsViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/SettingsViewMessageHandler.java
@@ -79,12 +79,6 @@
         }
 
         @Override
-        protected TableModel createTableModel() {
-            TableModel tm = super.createTableModel();
-            return tm;
-        }
-
-        @Override
         protected void populateTable(TableModel tm, ObjectNode payload) {
             ComponentConfigService ccs = get(ComponentConfigService.class);
             for (String component : ccs.getComponentNames()) {
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java
index b6098bb..609b775 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java
@@ -67,7 +67,6 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashSet;
 import java.util.List;
@@ -159,7 +158,7 @@
     private static final long SUMMARY_PERIOD = 30000;
 
     private static final Comparator<? super ControllerNode> NODE_COMPARATOR =
-            (o1, o2) -> o1.id().toString().compareTo(o2.id().toString());
+            Comparator.comparing(o -> o.id().toString());
 
 
     private final Timer timer = new Timer("onos-topology-view");
@@ -255,7 +254,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             addListeners();
             sendAllInstances(null);
             sendAllDevices();
@@ -271,7 +270,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String deact = string(payload, DEACTIVATE);
             String act = string(payload, ACTIVATE);
             overlayCache.switchOverlay(deact, act);
@@ -284,7 +283,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             removeListeners();
             stopSummaryMonitoring();
             traffic.stopMonitoring();
@@ -297,8 +296,8 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
-            requestSummary(sid);
+        public void process(ObjectNode payload) {
+            requestSummary();
             startSummaryMonitoring();
         }
     }
@@ -309,7 +308,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             stopSummaryMonitoring();
         }
     }
@@ -320,12 +319,12 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             ObjectNode root = objectNode();
             ArrayNode names = arrayNode();
             get(SpriteService.class).getNames().forEach(names::add);
             root.set(NAMES, names);
-            sendMessage(SPRITE_LIST_RESPONSE, sid, root);
+            sendMessage(SPRITE_LIST_RESPONSE, root);
         }
     }
 
@@ -335,11 +334,11 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String name = string(payload, NAME);
             ObjectNode root = objectNode();
             root.set(DATA, get(SpriteService.class).get(name));
-            sendMessage(SPRITE_DATA_RESPONSE, sid, root);
+            sendMessage(SPRITE_DATA_RESPONSE, root);
         }
     }
 
@@ -349,22 +348,22 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String type = string(payload, CLASS, UNKNOWN);
             String id = string(payload, ID);
             PropertyPanel pp = null;
 
             if (type.equals(DEVICE)) {
                 DeviceId did = deviceId(id);
-                pp = deviceDetails(did, sid);
+                pp = deviceDetails(did);
                 overlayCache.currentOverlay().modifyDeviceDetails(pp, did);
             } else if (type.equals(HOST)) {
                 HostId hid = hostId(id);
-                pp = hostDetails(hid, sid);
+                pp = hostDetails(hid);
                 overlayCache.currentOverlay().modifyHostDetails(pp, hid);
             }
 
-            sendMessage(envelope(SHOW_DETAILS, sid, json(pp)));
+            sendMessage(envelope(SHOW_DETAILS, json(pp)));
         }
     }
 
@@ -374,7 +373,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             updateMetaUi(payload);
         }
     }
@@ -385,7 +384,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             directory.get(MastershipAdminService.class).balanceRoles();
         }
     }
@@ -401,7 +400,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             // TODO: add protection against device ids and non-existent hosts.
             HostId one = hostId(string(payload, ONE));
             HostId two = hostId(string(payload, TWO));
@@ -441,7 +440,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             Intent intent = findIntentByPayload(payload);
             if (intent == null) {
                 log.warn("Unable to find intent from payload {}", payload);
@@ -462,7 +461,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             Intent intent = findIntentByPayload(payload);
             if (intent == null) {
                 log.warn("Unable to find intent from payload {}", payload);
@@ -479,7 +478,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             // TODO: add protection against device ids and non-existent hosts.
             Set<HostId> src = getHostIds((ArrayNode) payload.path(SRC));
             HostId dst = hostId(string(payload, DST));
@@ -516,7 +515,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             traffic.monitor(Mode.ALL_FLOW_TRAFFIC);
         }
     }
@@ -527,7 +526,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             traffic.monitor(Mode.ALL_PORT_TRAFFIC);
         }
     }
@@ -538,7 +537,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             NodeSelection nodeSelection =
                     new NodeSelection(payload, deviceService, hostService, linkService);
             traffic.monitor(Mode.DEV_LINK_FLOWS, nodeSelection);
@@ -551,7 +550,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             NodeSelection nodeSelection =
                     new NodeSelection(payload, deviceService, hostService, linkService);
             traffic.monitor(Mode.RELATED_INTENTS, nodeSelection);
@@ -564,7 +563,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             traffic.selectNextIntent();
         }
     }
@@ -575,7 +574,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             traffic.selectPreviousIntent();
         }
     }
@@ -586,7 +585,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             traffic.monitor(Mode.SELECTED_INTENT);
         }
     }
@@ -597,7 +596,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             Intent intent = findIntentByPayload(payload);
             if (intent == null) {
                 log.warn("Unable to find intent from payload {}", payload);
@@ -614,7 +613,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             traffic.stopMonitoring();
         }
     }
@@ -622,15 +621,15 @@
     //=======================================================================
 
     // Converts highlights to JSON format and sends the message to the client
-    protected void sendHighlights(Highlights highlights) {
+    void sendHighlights(Highlights highlights) {
         sendMessage(highlightsMessage(highlights));
     }
 
     // Subscribes for summary messages.
-    private synchronized void requestSummary(long sid) {
-        PropertyPanel pp = summmaryMessage(sid);
+    private synchronized void requestSummary() {
+        PropertyPanel pp = summmaryMessage();
         overlayCache.currentOverlay().modifySummary(pp);
-        sendMessage(envelope(SHOW_SUMMARY, sid, json(pp)));
+        sendMessage(envelope(SHOW_SUMMARY, json(pp)));
     }
 
 
@@ -642,7 +641,7 @@
     // Sends all controller nodes to the client as node-added messages.
     private void sendAllInstances(String messageType) {
         List<ControllerNode> nodes = new ArrayList<>(clusterService.getNodes());
-        Collections.sort(nodes, NODE_COMPARATOR);
+        nodes.sort(NODE_COMPARATOR);
         for (ControllerNode node : nodes) {
             sendMessage(instanceMessage(new ClusterEvent(INSTANCE_ADDED, node),
                     messageType));
@@ -873,7 +872,7 @@
         public void run() {
             try {
                 if (summaryRunning) {
-                    msgSender.execute(() -> requestSummary(0));
+                    msgSender.execute(() -> requestSummary());
                 }
             } catch (Exception e) {
                 log.warn("Unable to handle summary request due to {}", e.getMessage());
@@ -900,7 +899,7 @@
 
             try {
                 if (summaryRunning) {
-                    msgSender.execute(() -> requestSummary(0));
+                    msgSender.execute(() -> requestSummary());
                 }
             } catch (Exception e) {
                 log.warn("Unable to handle summary request due to {}", e.getMessage());
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
index c2c14f2..95c0cf4 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
@@ -395,7 +395,7 @@
     // Create models of the data to return, that overlays can adjust / augment
 
     // Returns property panel model for summary response.
-    protected PropertyPanel summmaryMessage(long sid) {
+    protected PropertyPanel summmaryMessage() {
         Topology topology = topologyService.currentTopology();
 
         return new PropertyPanel("ONOS Summary", "node")
@@ -412,7 +412,7 @@
     }
 
     // Returns property panel model for device details response.
-    protected PropertyPanel deviceDetails(DeviceId deviceId, long sid) {
+    protected PropertyPanel deviceDetails(DeviceId deviceId) {
         Device device = deviceService.getDevice(deviceId);
         Annotations annot = device.annotations();
         String name = annot.value(AnnotationKeys.NAME);
@@ -525,7 +525,7 @@
     }
 
     // Returns host details response.
-    protected PropertyPanel hostDetails(HostId hostId, long sid) {
+    protected PropertyPanel hostDetails(HostId hostId) {
         Host host = hostService.getHost(hostId);
         Annotations annot = host.annotations();
         String type = annot.value(AnnotationKeys.TYPE);
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/UserPreferencesMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/UserPreferencesMessageHandler.java
index 3bd3744..44a8ef0 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/UserPreferencesMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/UserPreferencesMessageHandler.java
@@ -46,12 +46,12 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             if (!isNullOrEmpty(connection().userName())) {
                 UiPreferencesService service = get(UiPreferencesService.class);
                 service.setPreference(connection().userName(),
-                                      payload.get(KEY).asText(),
-                                      (ObjectNode) payload.get(VALUE));
+                        payload.get(KEY).asText(),
+                        (ObjectNode) payload.get(VALUE));
             }
         }
     }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java
index 4aa6fc9..ea774d9 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java
@@ -67,7 +67,6 @@
     private static final String CURRENT_LAYOUT = "topo2CurrentLayout";
     private static final String CURRENT_REGION = "topo2CurrentRegion";
     private static final String PEER_REGIONS = "topo2PeerRegions";
-    private static final String TOPO_START_DONE = "topo2StartDone";
 
 
     private UiTopoSession topoSession;
@@ -122,7 +121,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             // client view is ready to receive data to display; so start up
             // server-side processing, and send over initial state
 
@@ -162,7 +161,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             String rid = string(payload, "rid");
             log.debug("topo2navRegion: rid={}", rid);
 
@@ -185,7 +184,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             // client view has gone away; so shut down server-side processing
             // TODO: implement...
 
@@ -204,7 +203,7 @@
         }
 
         @Override
-        public void process(long sid, ObjectNode payload) {
+        public void process(ObjectNode payload) {
             t2json.updateMeta(payload);
         }
     }
diff --git a/web/gui/src/main/webapp/app/README.txt b/web/gui/src/main/webapp/app/README.txt
index d5f94d8..cffc8a1 100644
--- a/web/gui/src/main/webapp/app/README.txt
+++ b/web/gui/src/main/webapp/app/README.txt
@@ -1,6 +1,6 @@
-# Main Application
+# Main ONOS UI Web Application
 
-index.html is the main launch point for the application.
+../index.html is the main launch point for the application.
 
 fw/ contains framework related code
 
diff --git a/web/gui/src/main/webapp/app/directives.js b/web/gui/src/main/webapp/app/directives.js
index ce94bd6..0e85d76 100644
--- a/web/gui/src/main/webapp/app/directives.js
+++ b/web/gui/src/main/webapp/app/directives.js
@@ -15,7 +15,7 @@
  */
 
 /*
- ONOS GUI -- General Purpose Angular directives defined here.
+ ONOS GUI -- General Purpose Angular directives.
  */
 
 (function () {
diff --git a/web/gui/src/main/webapp/app/fw/remote/websocket.js b/web/gui/src/main/webapp/app/fw/remote/websocket.js
index bd1f44d..55c7b40 100644
--- a/web/gui/src/main/webapp/app/fw/remote/websocket.js
+++ b/web/gui/src/main/webapp/app/fw/remote/websocket.js
@@ -27,7 +27,6 @@
     var webSockOpts,            // web socket options
         ws = null,              // web socket reference
         wsUp = false,           // web socket is good to go
-        sid = 0,                // event sequence identifier
         handlers = {},          // event handler bindings
         pendingEvents = [],     // events TX'd while socket not up
         host,                   // web socket host
@@ -108,7 +107,7 @@
     function handleClose() {
         var gsucc;
 
-        $log.info('Web socket closed');
+        $log.warn('Web socket closed');
         ls && ls.stop();
         wsUp = false;
 
@@ -167,9 +166,6 @@
     // === API Functions
 
     // Required for unit tests to set to known state
-    function resetSid() {
-        sid = 0;
-    }
     function resetState() {
         webSockOpts = undefined;
         ws = null;
@@ -178,7 +174,6 @@
         url = undefined;
         pendingEvents = [];
         handlers = {};
-        sid = 0;
         clusterNodes = [];
         clusterIndex = -1;
         connectRetries = 0;
@@ -291,7 +286,6 @@
     function sendEvent(evType, payload) {
         var ev = {
                 event: evType,
-                sid: ++sid,
                 payload: payload || {}
             };
 
@@ -329,7 +323,6 @@
             bindHandlers(builtinHandlers);
 
             return {
-                resetSid: resetSid,
                 resetState: resetState,
                 createWebSocket: createWebSocket,
                 bindHandlers: bindHandlers,
diff --git a/web/gui/src/main/webapp/tests/app/fw/remote/websocket-spec.js b/web/gui/src/main/webapp/tests/app/fw/remote/websocket-spec.js
index 6b0d4a7..fc7aa09 100644
--- a/web/gui/src/main/webapp/tests/app/fw/remote/websocket-spec.js
+++ b/web/gui/src/main/webapp/tests/app/fw/remote/websocket-spec.js
@@ -79,7 +79,7 @@
 
     it('should define api functions', function () {
         expect(fs.areFunctions(wss, [
-            'resetSid', 'resetState',
+            'resetState',
             'createWebSocket', 'bindHandlers', 'unbindHandlers',
             'addOpenListener', 'removeOpenListener', 'sendEvent',
             'isConnected', 'loggedInUser',
@@ -118,7 +118,6 @@
     it('should send pending events, handleOpen', function () {
         var fakeEvent = {
             event: 'mockEv',
-            sid: 1,
             payload: { mock: 'thing' }
         };
         wss.sendEvent(fakeEvent.event, fakeEvent.payload);
