diff --git a/src/main/java/org/opencord/cordvtn/api/net/ServiceNetwork.java b/src/main/java/org/opencord/cordvtn/api/net/ServiceNetwork.java
index 36cac9f..354a999 100644
--- a/src/main/java/org/opencord/cordvtn/api/net/ServiceNetwork.java
+++ b/src/main/java/org/opencord/cordvtn/api/net/ServiceNetwork.java
@@ -18,12 +18,10 @@
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 
-import java.util.Comparator;
 import java.util.Map;
 
 /**
- * Representation of a service network which holds service specific information,
- * like service type or dependency, in addition to the common network.
+ * Representation of a service network.
  */
 public interface ServiceNetwork {
 
@@ -42,9 +40,6 @@
         UNIDIRECTIONAL
     }
 
-    Comparator<ServiceNetwork> SERVICE_NETWORK_COMPARATOR =
-            (net1, net2) -> net1.id().id().compareTo(net2.id().id());
-
     /**
      * Returns the service network identifier.
      *
diff --git a/src/main/java/org/opencord/cordvtn/api/net/ServicePort.java b/src/main/java/org/opencord/cordvtn/api/net/ServicePort.java
index 83117ee..07db2e7 100644
--- a/src/main/java/org/opencord/cordvtn/api/net/ServicePort.java
+++ b/src/main/java/org/opencord/cordvtn/api/net/ServicePort.java
@@ -19,18 +19,13 @@
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 
-import java.util.Comparator;
 import java.util.Set;
 
 /**
- * Representation of a service port which holds service specific port information,
- * like vlan tag or additional addresses, to the common network port.
+ * Representation of a service port.
  */
 public interface ServicePort {
 
-    Comparator<ServicePort> SERVICE_PORT_COMPARATOR =
-            (port1, port2) -> port1.networkId().id().compareTo(port2.networkId().id());
-
     /**
      * Returns the port identifier.
      *
diff --git a/src/main/java/org/opencord/cordvtn/cli/CordVtnNetworkListCommand.java b/src/main/java/org/opencord/cordvtn/cli/CordVtnNetworkListCommand.java
index 7f42dc2..10ae833 100644
--- a/src/main/java/org/opencord/cordvtn/cli/CordVtnNetworkListCommand.java
+++ b/src/main/java/org/opencord/cordvtn/cli/CordVtnNetworkListCommand.java
@@ -24,7 +24,7 @@
 import org.opencord.cordvtn.api.core.ServiceNetworkService;
 import org.opencord.cordvtn.api.net.ServiceNetwork;
 
-import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
@@ -36,13 +36,13 @@
         description = "Lists all VTN networks")
 public class CordVtnNetworkListCommand extends AbstractShellCommand {
 
-    private static final String FORMAT = "%-40s%-20s%-20s%-8s%-20s%s";
+    private static final String FORMAT = "%-40s%-30s%-20s%-8s%-20s%s";
 
     @Override
     protected void execute() {
         ServiceNetworkService service = AbstractShellCommand.get(ServiceNetworkService.class);
         List<ServiceNetwork> networks = Lists.newArrayList(service.serviceNetworks());
-        Collections.sort(networks, ServiceNetwork.SERVICE_NETWORK_COMPARATOR);
+        networks.sort(Comparator.comparing(ServiceNetwork::name));
 
         if (outputJson()) {
             try {
diff --git a/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeListCommand.java b/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeListCommand.java
index 5c995f1..7086a09 100644
--- a/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeListCommand.java
+++ b/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeListCommand.java
@@ -23,7 +23,7 @@
 import org.opencord.cordvtn.impl.CordVtnNodeManager;
 import org.opencord.cordvtn.api.node.CordVtnNode;
 
-import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
@@ -43,7 +43,7 @@
     protected void execute() {
         CordVtnNodeManager nodeManager = AbstractShellCommand.get(CordVtnNodeManager.class);
         List<CordVtnNode> nodes = nodeManager.getNodes();
-        Collections.sort(nodes, CordVtnNode.CORDVTN_NODE_COMPARATOR);
+        nodes.sort(Comparator.comparing(CordVtnNode::hostname));
 
         if (outputJson()) {
             try {
diff --git a/src/main/java/org/opencord/cordvtn/cli/CordVtnPortListCommand.java b/src/main/java/org/opencord/cordvtn/cli/CordVtnPortListCommand.java
index 6a7618d..a5c5db1 100644
--- a/src/main/java/org/opencord/cordvtn/cli/CordVtnPortListCommand.java
+++ b/src/main/java/org/opencord/cordvtn/cli/CordVtnPortListCommand.java
@@ -26,7 +26,7 @@
 import org.opencord.cordvtn.api.core.ServiceNetworkService;
 import org.opencord.cordvtn.api.net.ServicePort;
 
-import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -49,7 +49,7 @@
         ServiceNetworkService service = AbstractShellCommand.get(ServiceNetworkService.class);
 
         List<ServicePort> ports = Lists.newArrayList(service.servicePorts());
-        Collections.sort(ports, ServicePort.SERVICE_PORT_COMPARATOR);
+        ports.sort(Comparator.comparing(port -> port.networkId().id()));
         if (!Strings.isNullOrEmpty(networkId)) {
             ports.removeIf(port -> !port.networkId().id().equals(networkId));
         }
diff --git a/src/main/java/org/opencord/cordvtn/impl/CordVtnNodeManager.java b/src/main/java/org/opencord/cordvtn/impl/CordVtnNodeManager.java
index 0fb9772..8a8bc37 100644
--- a/src/main/java/org/opencord/cordvtn/impl/CordVtnNodeManager.java
+++ b/src/main/java/org/opencord/cordvtn/impl/CordVtnNodeManager.java
@@ -615,10 +615,7 @@
             return false;
         }
         return deviceService.getPorts(node.integrationBridgeId()).stream()
-                .filter(p -> portName(p).contains(ifaceName) &&
-                        p.isEnabled())
-                .findAny()
-                .isPresent();
+                .anyMatch(p -> portName(p).contains(ifaceName) && p.isEnabled());
     }
 
     /**
@@ -868,7 +865,7 @@
             return;
         }
         controllers = config.controllers();
-        controllers.stream().forEach(ctrl -> {
+        controllers.forEach(ctrl -> {
             log.debug("Added controller {}:{}", ctrl.ip(), ctrl.port());
         });
     }
diff --git a/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java b/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java
index b31a575..80f21ee 100644
--- a/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java
+++ b/src/main/java/org/opencord/cordvtn/impl/InstanceManager.java
@@ -203,10 +203,9 @@
 
     @Override
     public void removeInstance(ConnectPoint connectPoint) {
-        hostService.getConnectedHosts(connectPoint).stream()
-                .forEach(host -> {
-                    hostProvider.hostVanished(host.id());
-                });
+        hostService.getConnectedHosts(connectPoint).forEach(host -> {
+            hostProvider.hostVanished(host.id());
+        });
     }
 
     @Override
diff --git a/src/main/java/org/opencord/cordvtn/impl/handler/DefaultInstanceHandler.java b/src/main/java/org/opencord/cordvtn/impl/handler/DefaultInstanceHandler.java
index e668673..3f68c22 100644
--- a/src/main/java/org/opencord/cordvtn/impl/handler/DefaultInstanceHandler.java
+++ b/src/main/java/org/opencord/cordvtn/impl/handler/DefaultInstanceHandler.java
@@ -113,7 +113,7 @@
                     true);
         }
         // FIXME don't add the existing instance again
-        sport.addressPairs().stream().forEach(pair -> {
+        sport.addressPairs().forEach(pair -> {
             // add instance for the additional address pairs
             addAdditionalInstance(instance, pair.ip(), pair.mac());
         });
@@ -337,7 +337,7 @@
                 .build();
 
 
-        nodeManager.completeNodes().stream().forEach(node -> {
+        nodeManager.completeNodes().forEach(node -> {
             FlowRule flowRuleDirect = DefaultFlowRule.builder()
                     .fromApp(appId)
                     .withSelector(selector)
@@ -362,7 +362,7 @@
                 .drop()
                 .build();
 
-        nodeManager.completeNodes().stream().forEach(node -> {
+        nodeManager.completeNodes().forEach(node -> {
             FlowRule flowRuleDirect = DefaultFlowRule.builder()
                     .fromApp(appId)
                     .withSelector(selector)
@@ -426,7 +426,7 @@
                                          boolean install) {
         // for traffic coming from WAN, tag 500 and take through the vSG VM
         // based on destination ip
-        ipAddrs.stream().forEach(wanIp -> {
+        ipAddrs.forEach(wanIp -> {
             // for traffic coming from WAN, tag 500 and take through the vSG VM
             TrafficSelector downstream = DefaultTrafficSelector.builder()
                     .matchEthType(Ethernet.TYPE_IPV4)
diff --git a/src/main/java/org/opencord/cordvtn/impl/handler/DependencyHandler.java b/src/main/java/org/opencord/cordvtn/impl/handler/DependencyHandler.java
index 684bc6e..772e1bc 100644
--- a/src/main/java/org/opencord/cordvtn/impl/handler/DependencyHandler.java
+++ b/src/main/java/org/opencord/cordvtn/impl/handler/DependencyHandler.java
@@ -234,20 +234,18 @@
     private boolean isProviderInUse(NetworkId providerId) {
         return snetService.serviceNetworks().stream()
                 .flatMap(net -> net.providers().keySet().stream())
-                .filter(provider -> Objects.equals(provider, providerId))
-                .findAny().isPresent();
+                .anyMatch(provider -> Objects.equals(provider, providerId));
     }
 
     private void removeGroup(NetworkId netId) {
         GroupKey groupKey = getGroupKey(netId);
-        nodeManager.completeNodes().stream()
-                .forEach(node -> {
-                    DeviceId deviceId = node.integrationBridgeId();
-                    Group group = groupService.getGroup(deviceId, groupKey);
-                    if (group != null) {
-                        groupService.removeGroup(deviceId, groupKey, appId);
-                    }
-                });
+        nodeManager.completeNodes().forEach(node -> {
+            DeviceId deviceId = node.integrationBridgeId();
+            Group group = groupService.getGroup(deviceId, groupKey);
+            if (group != null) {
+                groupService.removeGroup(deviceId, groupKey, appId);
+            }
+        });
         log.debug("Removed group for network {}", netId);
     }
 
@@ -287,7 +285,7 @@
         Map<DeviceId, GroupId> providerGroups = Maps.newHashMap();
         Map<DeviceId, Set<PortNumber>> subscriberPorts = Maps.newHashMap();
 
-        nodeManager.completeNodes().stream().forEach(node -> {
+        nodeManager.completeNodes().forEach(node -> {
             DeviceId deviceId = node.integrationBridgeId();
             GroupId groupId = getProviderGroup(provider, deviceId);
             providerGroups.put(deviceId, groupId);
@@ -357,7 +355,7 @@
                 .transition(TABLE_DST)
                 .build();
 
-        nodeManager.completeNodes().stream().forEach(node -> {
+        nodeManager.completeNodes().forEach(node -> {
             DeviceId deviceId = node.integrationBridgeId();
             FlowRule flowRuleDirect = DefaultFlowRule.builder()
                     .fromApp(appId)
@@ -383,7 +381,7 @@
             if (groupId == null) {
                 continue;
             }
-            ports.stream().forEach(port -> {
+            ports.forEach(port -> {
                 TrafficSelector selector = DefaultTrafficSelector.builder()
                         .matchInPort(port)
                         .build();
@@ -410,7 +408,7 @@
     private GroupBuckets getProviderGroupBuckets(DeviceId deviceId, long tunnelId,
                                                  Set<Instance> instances) {
         List<GroupBucket> buckets = Lists.newArrayList();
-        instances.stream().forEach(instance -> {
+        instances.forEach(instance -> {
             Ip4Address tunnelIp = nodeManager.dataIp(instance.deviceId()).getIp4Address();
 
             if (deviceId.equals(instance.deviceId())) {
