diff --git a/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java b/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java
index e18ebfa..9a6e127 100644
--- a/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java
+++ b/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java
@@ -48,7 +48,7 @@
 
     private static final Logger log = LoggerFactory
             .getLogger(DeviceConfiguration.class);
-    private final List<Integer> allSegmentIds = new ArrayList<Integer>();
+    private final List<Integer> allSegmentIds = new ArrayList<>();
     private final HashMap<DeviceId, SegmentRouterInfo> deviceConfigMap = new HashMap<>();
     private final NetworkConfigManager configService;
 
@@ -88,7 +88,7 @@
             info.ip = prefix.address();
             info.isEdge = ((SegmentRouterConfig) cfg).isEdgeRouter();
             info.subnets = new HashMap<>();
-            info.gatewayIps = new HashMap<PortNumber, Ip4Address>();
+            info.gatewayIps = new HashMap<>();
             for (Subnet s: ((SegmentRouterConfig) cfg).getSubnets()) {
                 info.subnets.put(PortNumber.portNumber(s.getPortNo()),
                                  Ip4Prefix.valueOf(s.getSubnetIp()));
diff --git a/src/main/java/org/onosproject/segmentrouting/ECMPShortestPathGraph.java b/src/main/java/org/onosproject/segmentrouting/ECMPShortestPathGraph.java
index cd28fcf..b483d9e 100644
--- a/src/main/java/org/onosproject/segmentrouting/ECMPShortestPathGraph.java
+++ b/src/main/java/org/onosproject/segmentrouting/ECMPShortestPathGraph.java
@@ -109,7 +109,7 @@
                     ArrayList<DeviceId> distanceSwArray = distanceDeviceMap
                             .get(currDistance + 1);
                     if (distanceSwArray == null) {
-                        distanceSwArray = new ArrayList<DeviceId>();
+                        distanceSwArray = new ArrayList<>();
                         distanceSwArray.add(reachedDevice);
                         distanceDeviceMap.put(currDistance + 1, distanceSwArray);
                     } else {
@@ -120,7 +120,7 @@
                 ArrayList<Link> upstreamLinkArray =
                         upstreamLinks.get(reachedDevice);
                 if (upstreamLinkArray == null) {
-                    upstreamLinkArray = new ArrayList<Link>();
+                    upstreamLinkArray = new ArrayList<>();
                     upstreamLinkArray.add(copyDefaultLink(link));
                     //upstreamLinkArray.add(link);
                     upstreamLinks.put(reachedDevice, upstreamLinkArray);
@@ -183,7 +183,7 @@
                     ArrayList<DeviceId> distanceSwArray = distanceDeviceMap
                             .get(currDistance + 1);
                     if (distanceSwArray == null) {
-                        distanceSwArray = new ArrayList<DeviceId>();
+                        distanceSwArray = new ArrayList<>();
                         distanceSwArray.add(reachedDevice);
                         distanceDeviceMap.put(currDistance + 1, distanceSwArray);
                     } else {
@@ -194,7 +194,7 @@
                 ArrayList<Link> upstreamLinkArray =
                         upstreamLinks.get(reachedDevice);
                 if (upstreamLinkArray == null) {
-                    upstreamLinkArray = new ArrayList<Link>();
+                    upstreamLinkArray = new ArrayList<>();
                     upstreamLinkArray.add(copyDefaultLink(link));
                     upstreamLinks.put(reachedDevice, upstreamLinkArray);
                 } else {
@@ -234,7 +234,7 @@
         for (Link upstreamLink : upstreamLinks.get(dstDeviceDeviceId)) {
             /* Deep clone the path object */
             Path sofarPath;
-            ArrayList<Link> sofarLinks = new ArrayList<Link>();
+            ArrayList<Link> sofarLinks = new ArrayList<>();
             if (path != null && !path.links().isEmpty()) {
                 sofarLinks.addAll(path.links());
             }
@@ -288,12 +288,10 @@
     public HashMap<Integer, HashMap<DeviceId,
             ArrayList<Path>>> getCompleteLearnedDeviceesAndPaths() {
 
-        HashMap<Integer, HashMap<DeviceId, ArrayList<Path>>> pathGraph = new
-                HashMap<Integer, HashMap<DeviceId, ArrayList<Path>>>();
+        HashMap<Integer, HashMap<DeviceId, ArrayList<Path>>> pathGraph = new HashMap<>();
 
         for (Integer itrIndx : distanceDeviceMap.keySet()) {
-            HashMap<DeviceId, ArrayList<Path>> swMap = new
-                    HashMap<DeviceId, ArrayList<Path>>();
+            HashMap<DeviceId, ArrayList<Path>> swMap = new HashMap<>();
             for (DeviceId sw : distanceDeviceMap.get(itrIndx)) {
                 swMap.put(sw, getECMPPaths(sw));
             }
@@ -314,12 +312,10 @@
     public HashMap<Integer, HashMap<DeviceId,
             ArrayList<ArrayList<DeviceId>>>> getAllLearnedSwitchesAndVia() {
 
-        HashMap<Integer, HashMap<DeviceId, ArrayList<ArrayList<DeviceId>>>> deviceViaMap =
-                new HashMap<Integer, HashMap<DeviceId, ArrayList<ArrayList<DeviceId>>>>();
+        HashMap<Integer, HashMap<DeviceId, ArrayList<ArrayList<DeviceId>>>> deviceViaMap = new HashMap<>();
 
         for (Integer itrIndx : distanceDeviceMap.keySet()) {
-            HashMap<DeviceId, ArrayList<ArrayList<DeviceId>>> swMap =
-                    new HashMap<DeviceId, ArrayList<ArrayList<DeviceId>>>();
+            HashMap<DeviceId, ArrayList<ArrayList<DeviceId>>> swMap = new HashMap<>();
 
             for (DeviceId sw : distanceDeviceMap.get(itrIndx)) {
                 ArrayList<ArrayList<DeviceId>> swViaArray = new ArrayList<>();
diff --git a/src/main/java/org/onosproject/segmentrouting/IpHandler.java b/src/main/java/org/onosproject/segmentrouting/IpHandler.java
index 81d00f5..e37fe52 100644
--- a/src/main/java/org/onosproject/segmentrouting/IpHandler.java
+++ b/src/main/java/org/onosproject/segmentrouting/IpHandler.java
@@ -50,7 +50,7 @@
     public IpHandler(SegmentRoutingManager srManager) {
         this.srManager = srManager;
         this.config = checkNotNull(srManager.deviceConfiguration);
-        ipPacketQueue = new ConcurrentHashMap<Ip4Address, ConcurrentLinkedQueue<IPv4>>();
+        ipPacketQueue = new ConcurrentHashMap<>();
     }
 
     /**
@@ -104,7 +104,7 @@
         Ip4Address destIpAddress = Ip4Address.valueOf(ipPacket.getDestinationAddress());
 
         if (ipPacketQueue.get(destIpAddress) == null) {
-            ConcurrentLinkedQueue<IPv4> queue = new ConcurrentLinkedQueue<IPv4>();
+            ConcurrentLinkedQueue<IPv4> queue = new ConcurrentLinkedQueue<>();
             queue.add(ipPacket);
             ipPacketQueue.put(destIpAddress, queue);
         } else {
diff --git a/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java b/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java
index 59fc4ca..d802be9 100644
--- a/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java
+++ b/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java
@@ -221,7 +221,7 @@
                                     Set<DeviceId> nextHops) {
 
         TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
-        List<ForwardingObjective.Builder> fwdObjBuilders = new ArrayList<ForwardingObjective.Builder>();
+        List<ForwardingObjective.Builder> fwdObjBuilders = new ArrayList<>();
 
         // TODO Handle the case of Bos == false
         sbuilder.matchMplsLabel(MplsLabel.mplsLabel(config.getSegmentId(destSwId)));
diff --git a/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultEdgeGroupHandler.java b/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultEdgeGroupHandler.java
index 41cf8ac..3dc312d 100644
--- a/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultEdgeGroupHandler.java
+++ b/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultEdgeGroupHandler.java
@@ -69,7 +69,7 @@
         Set<Set<DeviceId>> powerSet = getPowerSetOfNeighbors(neighbors);
         log.trace("createGroupsAtEdgeRouter: The size of neighbor powerset "
                 + "for sw {} is {}", deviceId, powerSet.size());
-        Set<NeighborSet> nsSet = new HashSet<NeighborSet>();
+        Set<NeighborSet> nsSet = new HashSet<>();
         for (Set<DeviceId> combo : powerSet) {
             if (combo.isEmpty()) {
                 continue;
@@ -148,7 +148,7 @@
                                             Set<DeviceId> updatedNeighbors) {
         Set<Set<DeviceId>> powerSet = getPowerSetOfNeighbors(updatedNeighbors);
 
-        Set<DeviceId> tmp = new HashSet<DeviceId>();
+        Set<DeviceId> tmp = new HashSet<>();
         tmp.addAll(updatedNeighbors);
         tmp.remove(impactedNeighbor);
         Set<Set<DeviceId>> tmpPowerSet = getPowerSetOfNeighbors(tmp);
@@ -156,7 +156,7 @@
         // Compute the impacted neighbor sets
         powerSet.removeAll(tmpPowerSet);
 
-        Set<NeighborSet> nsSet = new HashSet<NeighborSet>();
+        Set<NeighborSet> nsSet = new HashSet<>();
         for (Set<DeviceId> combo : powerSet) {
             if (combo.isEmpty()) {
                 continue;
diff --git a/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java b/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java
index a43a0f0..3ff0e35 100644
--- a/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java
+++ b/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java
@@ -371,7 +371,7 @@
         if (devicePortMap.get(neighborId) != null) {
             devicePortMap.get(neighborId).add(portToNeighbor);
         } else {
-            Set<PortNumber> ports = new HashSet<PortNumber>();
+            Set<PortNumber> ports = new HashSet<>();
             ports.add(portToNeighbor);
             devicePortMap.put(neighborId, ports);
         }
@@ -383,8 +383,8 @@
     }
 
     protected Set<Set<DeviceId>> getPowerSetOfNeighbors(Set<DeviceId> neighbors) {
-        List<DeviceId> list = new ArrayList<DeviceId>(neighbors);
-        Set<Set<DeviceId>> sets = new HashSet<Set<DeviceId>>();
+        List<DeviceId> list = new ArrayList<>(neighbors);
+        Set<Set<DeviceId>> sets = new HashSet<>();
         // get the number of elements in the neighbors
         int elements = list.size();
         // the number of members of a power set is 2^n
@@ -394,7 +394,7 @@
         // run a binary counter for the number of power elements
         // NOTE: Exclude empty set
         for (long i = 1; i < powerElements; i++) {
-            Set<DeviceId> neighborSubSet = new HashSet<DeviceId>();
+            Set<DeviceId> neighborSubSet = new HashSet<>();
             for (int j = 0; j < elements; j++) {
                 if ((i >> j) % 2 == 1) {
                     neighborSubSet.add(list.get(j));
@@ -411,7 +411,7 @@
 
     protected List<Integer> getSegmentIdsTobePairedWithNeighborSet(Set<DeviceId> neighbors) {
 
-        List<Integer> nsSegmentIds = new ArrayList<Integer>();
+        List<Integer> nsSegmentIds = new ArrayList<>();
 
         // Always pair up with no edge label
         // If (neighbors.size() == 1) {
diff --git a/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultTransitGroupHandler.java b/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultTransitGroupHandler.java
index e12426c..3cb73ab 100644
--- a/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultTransitGroupHandler.java
+++ b/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultTransitGroupHandler.java
@@ -63,7 +63,7 @@
         sets = filterEdgeRouterOnlyPairings(sets);
         log.debug("createGroupsAtTransitRouter: The size of neighbor powerset "
                 + "for sw {} is {}", deviceId, sets.size());
-        Set<NeighborSet> nsSet = new HashSet<NeighborSet>();
+        Set<NeighborSet> nsSet = new HashSet<>();
         for (Set<DeviceId> combo : sets) {
             if (combo.isEmpty()) {
                 continue;
@@ -137,7 +137,7 @@
                                             Set<DeviceId> updatedNeighbors) {
         Set<Set<DeviceId>> powerSet = getPowerSetOfNeighbors(updatedNeighbors);
 
-        Set<DeviceId> tmp = new HashSet<DeviceId>();
+        Set<DeviceId> tmp = new HashSet<>();
         tmp.addAll(updatedNeighbors);
         tmp.remove(impactedNeighbor);
         Set<Set<DeviceId>> tmpPowerSet = getPowerSetOfNeighbors(tmp);
@@ -146,7 +146,7 @@
         powerSet.removeAll(tmpPowerSet);
 
         powerSet = filterEdgeRouterOnlyPairings(powerSet);
-        Set<NeighborSet> nsSet = new HashSet<NeighborSet>();
+        Set<NeighborSet> nsSet = new HashSet<>();
         for (Set<DeviceId> combo : powerSet) {
             if (combo.isEmpty()) {
                 continue;
@@ -163,7 +163,7 @@
     }
 
     private Set<Set<DeviceId>> filterEdgeRouterOnlyPairings(Set<Set<DeviceId>> sets) {
-        Set<Set<DeviceId>> fiteredSets = new HashSet<Set<DeviceId>>();
+        Set<Set<DeviceId>> fiteredSets = new HashSet<>();
         for (Set<DeviceId> deviceSubSet : sets) {
             if (deviceSubSet.size() > 1) {
                 boolean avoidEdgeRouterPairing = true;
diff --git a/src/main/java/org/onosproject/segmentrouting/grouphandler/NeighborSet.java b/src/main/java/org/onosproject/segmentrouting/grouphandler/NeighborSet.java
index 7ada322..44715d2 100644
--- a/src/main/java/org/onosproject/segmentrouting/grouphandler/NeighborSet.java
+++ b/src/main/java/org/onosproject/segmentrouting/grouphandler/NeighborSet.java
@@ -44,7 +44,7 @@
     public NeighborSet(Set<DeviceId> neighbors) {
         checkNotNull(neighbors);
         this.edgeLabel = NO_EDGE_LABEL;
-        this.neighbors = new HashSet<DeviceId>();
+        this.neighbors = new HashSet<>();
         this.neighbors.addAll(neighbors);
     }
 
@@ -57,7 +57,7 @@
     public NeighborSet(Set<DeviceId> neighbors, int edgeLabel) {
         checkNotNull(neighbors);
         this.edgeLabel = edgeLabel;
-        this.neighbors = new HashSet<DeviceId>();
+        this.neighbors = new HashSet<>();
         this.neighbors.addAll(neighbors);
     }
 
@@ -66,7 +66,7 @@
      */
     public NeighborSet() {
         this.edgeLabel = NO_EDGE_LABEL;
-        this.neighbors = new HashSet<DeviceId>();
+        this.neighbors = new HashSet<>();
     }
 
     /**
