diff --git a/carrierethernet/pom.xml b/carrierethernet/pom.xml
index 1054cd9..4ef8f36 100644
--- a/carrierethernet/pom.xml
+++ b/carrierethernet/pom.xml
@@ -17,6 +17,13 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-dependencies</artifactId>
+        <version>1.8.0</version>
+        <relativePath/><!-- parent is remote -->
+    </parent>
+
     <groupId>org.onosproject</groupId>
     <artifactId>onos-app-carrierethernet</artifactId>
     <version>1.8.0-SNAPSHOT</version>
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetConnection.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetConnection.java
index 857f8cc..2d3acec 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetConnection.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetConnection.java
@@ -49,7 +49,7 @@
         this.cfgId = cfgId;
         this.type = type;
         this.state = State.INACTIVE;
-        this.maxLatency = maxLatency == null? DEFAULT_MAX_LATENCY: maxLatency;
+        this.maxLatency = maxLatency == null ? DEFAULT_MAX_LATENCY : maxLatency;
     }
 
     /**
@@ -84,7 +84,9 @@
      *
      * @return connectivity state
      */
-    public State state() { return state; }
+    public State state() {
+        return state;
+    }
 
     /**
      * Indicates whether the connection is active or partially active.
@@ -127,14 +129,18 @@
      *
      * @param state the connectivity state to set
      */
-    public void setState(State state) { this.state = state; }
+    public void setState(State state) {
+        this.state = state;
+    }
 
     /**
      * Sets the type of connection.
      *
      * @param type type of connection to set
      */
-    public void setType(Type type) { this.type = type; }
+    public void setType(Type type) {
+        this.type = type;
+    }
 
     /**
      * Sets maximum latency constraint.
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetEnni.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetEnni.java
index dd002d0..8ffd3dd 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetEnni.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetEnni.java
@@ -33,7 +33,7 @@
  * 1. As a global ENNI descriptor containing one or more S-VLAN tags
  * 2. As a service-specific ENNI descriptor containing a single S-VLAN tag and including a role (e.g. hub, spoke)
  */
-public class CarrierEthernetEnni extends CarrierEthernetNetworkInterface <CarrierEthernetEnni> {
+public class CarrierEthernetEnni extends CarrierEthernetNetworkInterface<CarrierEthernetEnni> {
 
     private final Logger log = getLogger(getClass());
 
@@ -92,7 +92,8 @@
             this.sVlanIdSet.add(enni.sVlanId());
         }
         // Used capacity cannot be more than ENNI capacity
-        this.usedCapacity = Bandwidth.bps(Math.min(this.usedCapacity.bps() + enni.usedCapacity().bps(), this.capacity.bps()));
+        this.usedCapacity = Bandwidth.bps(Math.min(this.usedCapacity.bps() + enni.usedCapacity().bps(),
+                                                   this.capacity.bps()));
     }
 
     /**
@@ -139,16 +140,19 @@
      *
      * @return ENNI role
      */
+    @Override
     public Role role() {
         return role;
     }
 
     /**
-     * Returns the S-VLAN id associated with a service ENNI, or the first S-VLAN ID found for a global ENNI.
+     * Returns the S-VLAN id associated with a service ENNI,
+     * or the first S-VLAN ID found for a global ENNI.
      * This is assumed to be the S-TAG of another FC interconnected with this ENNI.
      *
      * @return S-VLAN id
      */
+    @Override
     public VlanId sVlanId() {
         if (sVlanIdSet.isEmpty()) {
             return VlanId.NONE;
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetGenericNi.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetGenericNi.java
index d14fed7..6352304 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetGenericNi.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetGenericNi.java
@@ -24,7 +24,7 @@
  * Representation of a Generic Carrier Ethernet NI.
  * Class is only meant to be used for establishing forwarding in CarrierEthernetPacketNodeManagers
  */
-public class CarrierEthernetGenericNi extends CarrierEthernetNetworkInterface <CarrierEthernetGenericNi> {
+public class CarrierEthernetGenericNi extends CarrierEthernetNetworkInterface<CarrierEthernetGenericNi> {
 
     public enum Role {
 
@@ -46,6 +46,7 @@
         super(connectPoint, Type.GENERIC, uniCfgId);
     }
 
+    @Override
     public Role role() {
         return Role.NONE;
     }
@@ -93,7 +94,9 @@
      * @return true
      */
     @Override
-    public boolean validateEcNi(CarrierEthernetGenericNi gni) { return true; }
+    public boolean validateEcNi(CarrierEthernetGenericNi gni) {
+        return true;
+    }
 
     @Override
     public String toString() {
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetInni.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetInni.java
index bc0964a..efcbfb0 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetInni.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetInni.java
@@ -34,7 +34,7 @@
  * 1. As a global INNI descriptor containing one or more S-VLAN tags
  * 2. As a service-specific INNI descriptor containing a single S-VLAN tag and including a role (e.g. hub, spoke)
  */
-public class CarrierEthernetInni extends CarrierEthernetNetworkInterface <CarrierEthernetInni> {
+public class CarrierEthernetInni extends CarrierEthernetNetworkInterface<CarrierEthernetInni> {
 
     private final Logger log = getLogger(getClass());
 
@@ -147,6 +147,7 @@
      *
      * @return INNI role
      */
+    @Override
     public Role role() {
         return role;
     }
@@ -157,6 +158,7 @@
      *
      * @return S-VLAN id
      */
+    @Override
     public VlanId sVlanId() {
         if (sVlanIdSet.isEmpty()) {
             return VlanId.NONE;
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetManager.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetManager.java
index 7aa4860..e65fe86 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetManager.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetManager.java
@@ -182,7 +182,7 @@
     }
 
     /**
-     * Get the map containing all installed FCs
+     * Get the map containing all installed FCs.
      *
      * @return the FC map
      */
@@ -191,7 +191,7 @@
     }
 
     /**
-     * Get the map containing all global LTPs
+     * Get the map containing all global LTPs.
      *
      * @return the global LTP map
      */
@@ -200,7 +200,7 @@
     }
 
     /**
-     * Get the map containing all global UNIs
+     * Get the map containing all global UNIs.
      *
      * @return the global UNI map
      */
@@ -240,7 +240,7 @@
             if (ni.ceVlanId() == VlanId.NONE && isVirtual) {
                 log.error("Could not validate the virtual status of the EVC.");
                 return null;
-            } else if (ni.ceVlanId() != VlanId.NONE){
+            } else if (ni.ceVlanId() != VlanId.NONE) {
                 isVirtual = true;
             }
         }
@@ -503,7 +503,8 @@
                     }
 
                     // Just select any of the returned paths
-                    // TODO: Select path in more sophisticated way and return null if any of the constraints cannot be met
+                    // TODO: Select path in more sophisticated way and return null
+                    // if any of the constraints cannot be met
                     Path path = paths.iterator().hasNext() ? paths.iterator().next() : null;
 
                     if (path == null) {
@@ -536,7 +537,8 @@
                                     fcLtpFromCp(links.get(i).src(), dstLtpRole);
                         }
                         if (dstLtp != null) {
-                            // Create a new LTP pair and null the srcLtp so that we can continue searching for a new pair
+                            // Create a new LTP pair and null the srcLtp
+                            // so that we can continue searching for a new pair
                             ltpPairList.add(Pair.of(srcLtp, dstLtp));
                             srcLtp = null;
                         }
@@ -569,7 +571,7 @@
                         // If one of the LTPs is already contained in a set, add the other one as well in that set
                         ltpSetMap.get(ltp2.id()).add(ltp1);
                         ltpSetMap.put(ltp1.id(), ltpSetMap.get(ltp2.id()));
-                    } else if (!ltpSetMap.containsKey(ltp1.id()) && !ltpSetMap.containsKey(ltp2.id())){
+                    } else if (!ltpSetMap.containsKey(ltp1.id()) && !ltpSetMap.containsKey(ltp2.id())) {
                         // Create a new LTP set containing the two LTPs and map both to it
                         ltpSetMap.put(ltp1.id(), Sets.newHashSet(ltp1, ltp2));
                         ltpSetMap.put(ltp2.id(), ltpSetMap.get(ltp1.id()));
@@ -835,7 +837,9 @@
             ceProvisioner.removeBandwidthProfiles(fc);
             removeFcFromGlobalLtps(fc);
             // Avoid excessively incrementing FC VLAN ids
-            nextVlanId = (fcMap.get(fcId).vlanId().toShort() < nextVlanId ? fcMap.get(fcId).vlanId().toShort() : nextVlanId);
+            nextVlanId = (fcMap.get(fcId).vlanId().toShort() < nextVlanId ?
+                                       fcMap.get(fcId).vlanId().toShort() :
+                                       nextVlanId);
             // Decrement the global LTP and corresponding NI refCount
             fcMap.get(fcId).ltpSet().forEach(ltp -> ltpMap.get(ltp.id()).refCount().decrementAndGet());
             fcMap.remove(fcId);
@@ -1394,7 +1398,7 @@
             if (config.portVlanId().isPresent() && !negative.contains(event.type())) {
                 VlanId assignedVlan = config.portVlanId().get();
                 if (usedVlans().contains(assignedVlan)) {
-                    log.warn("VLAN tag {} is already used in the CE network" , assignedVlan);
+                    log.warn("VLAN tag {} is already used in the CE network", assignedVlan);
                 } else {
                     log.info("VLAN tag {} is assigned to port {}", assignedVlan, cp);
                     portVlanMap.put(cp, assignedVlan);
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetNetworkInterface.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetNetworkInterface.java
index f77cd62..76d8084 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetNetworkInterface.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetNetworkInterface.java
@@ -30,7 +30,7 @@
 /**
  * Representation of a Carrier Ethernet Network Interface (UNI, INNI or ENNI).
  */
-public abstract class CarrierEthernetNetworkInterface <E extends CarrierEthernetNetworkInterface> {
+public abstract class CarrierEthernetNetworkInterface<E extends CarrierEthernetNetworkInterface> {
 
     protected DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
 
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetPacketNodeManager.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetPacketNodeManager.java
index d6d4f12..fca4f6d 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetPacketNodeManager.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetPacketNodeManager.java
@@ -40,7 +40,14 @@
 import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.flow.instructions.Instructions;
 import org.onosproject.net.flow.instructions.L2ModificationInstruction;
-import org.onosproject.net.flowobjective.*;
+import org.onosproject.net.flowobjective.DefaultFilteringObjective;
+import org.onosproject.net.flowobjective.DefaultForwardingObjective;
+import org.onosproject.net.flowobjective.DefaultNextObjective;
+import org.onosproject.net.flowobjective.FilteringObjective;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
+import org.onosproject.net.flowobjective.ForwardingObjective;
+import org.onosproject.net.flowobjective.NextObjective;
+import org.onosproject.net.flowobjective.Objective;
 import org.onosproject.net.meter.Meter;
 import org.onosproject.net.meter.MeterId;
 import org.onosproject.net.meter.MeterRequest;
@@ -152,7 +159,7 @@
         Criterion filterVlanIdCriterion = Criteria.matchVlanId(fc.vlanId());
 
         if ((ingressNi.type().equals(CarrierEthernetNetworkInterface.Type.INNI))
-                || (ingressNi.type().equals(CarrierEthernetNetworkInterface.Type.ENNI)) ) {
+                || (ingressNi.type().equals(CarrierEthernetNetworkInterface.Type.ENNI))) {
             // TODO: Check TPID? Also: Is is possible to receive untagged pkts at an INNI/ENNI?
             // Source node of an FC should match on S-TAG if it's an INNI/ENNI
             filterVlanIdCriterion = Criteria.matchVlanId(ingressNi.sVlanId());
@@ -208,7 +215,8 @@
          egressNiSet.forEach(egressNi -> {
             // TODO: Check if ingressNi and egressNi are on the same device?
             TrafficTreatment.Builder nextTreatmentBuilder = DefaultTrafficTreatment.builder();
-            // If last NI in FC is not UNI, keep the existing S-TAG - it will be translated at the entrance of the next FC
+            // If last NI in FC is not UNI,
+            // keep the existing S-TAG - it will be translated at the entrance of the next FC
             if (egressNi.type().equals(CarrierEthernetNetworkInterface.Type.UNI)) {
                 nextTreatmentBuilder.popVlan();
             }
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetProvisioner.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetProvisioner.java
index 181cce2..55e1298 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetProvisioner.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetProvisioner.java
@@ -202,7 +202,8 @@
     }
 
     /**
-     * Select feasible link paths between two NIs in both directions and update ingressEgressNiMap accordingly
+     * Select feasible link paths between two NIs in both directions and update
+     * ingressEgressNiMap accordingly.
      *
      * @param ni1 the first NI
      * @param ni2 the second NI
@@ -310,7 +311,7 @@
 
         inverseLinks.add(createEdgeLink(originalLinks.get(originalLinks.size() - 1).src(), true));
 
-        for (int i = originalLinks.size() - 2 ; i > 0 ; i--) {
+        for (int i = originalLinks.size() - 2; i > 0; i--) {
             // FIXME: Check again the Link creation parameters
             inverseLinks.add(DefaultLink.builder()
                     .src(originalLinks.get(i).dst())
@@ -386,6 +387,7 @@
             long startTime = System.currentTimeMillis();
             while (((System.currentTimeMillis() - startTime) < OPTICAL_CONNECT_TIMEOUT_MILLIS) &&
                     (opticalConnectStatusMap.get(opticalConnectId) != OpticalPathEvent.Type.PATH_INSTALLED)) {
+                // FIXME WTF
             }
         }
         return opticalConnectId;
@@ -397,6 +399,7 @@
             long startTime = System.currentTimeMillis();
             while (((System.currentTimeMillis() - startTime) < OPTICAL_CONNECT_TIMEOUT_MILLIS) &&
                     (opticalConnectStatusMap.get(opticalConnectId) != OpticalPathEvent.Type.PATH_REMOVED)) {
+                // FIXME WTF
             }
         }
     }
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetUni.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetUni.java
index 0a4279d..11b2beb 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetUni.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetUni.java
@@ -38,7 +38,7 @@
  * 1. As a global UNI descriptor containing one or more BW profiles
  * 2. As a service-specific UNI descriptor containing a single BW profile and including a type (root, leaf)
  */
-public class CarrierEthernetUni extends CarrierEthernetNetworkInterface <CarrierEthernetUni> {
+public class CarrierEthernetUni extends CarrierEthernetNetworkInterface<CarrierEthernetUni> {
 
     private final Logger log = getLogger(getClass());
 
@@ -145,7 +145,8 @@
             Map<String, CarrierEthernetBandwidthProfile> subBwpMap = this.bwpMap.get(bwp.type());
             subBwpMap.put(bwp.id(), bwp);
             this.bwpMap.put(bwp.type(), subBwpMap);
-            // Used capacity cannot be more than UNI capacity (redundant check - should be avoided by check in validateBwp)
+            // Used capacity cannot be more than UNI capacity
+            // (redundant check - should be avoided by check in validateBwp)
             this.usedCapacity = Bandwidth.bps(Math.min(this.usedCapacity.bps() + bwp.cir().bps(), this.capacity.bps()));
         }
     }
@@ -223,6 +224,7 @@
      *
      * @return UNI role
      */
+    @Override
     public Role role() {
         return role;
     }
@@ -232,6 +234,7 @@
      *
      * @return CE-VLAN id
      */
+    @Override
     public VlanId ceVlanId() {
         if (ceVlanIdSet.isEmpty()) {
             return VlanId.NONE;
@@ -276,7 +279,7 @@
     }
 
     /**
-     * Returns a collection of all BWPs of the UNI
+     * Returns a collection of all BWPs of the UNI.
      *
      * @return all BWPs of the UNI
      */
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetVirtualConnection.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetVirtualConnection.java
index 3b0de5f..61722da 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetVirtualConnection.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/CarrierEthernetVirtualConnection.java
@@ -77,7 +77,9 @@
      *
      * @return true the maximum number of UNIs in the EVC
      */
-    public Integer maxNumUni() { return maxNumUni; }
+    public Integer maxNumUni() {
+        return maxNumUni;
+    }
 
     /**
      * Returns set of UNIs.
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/PortVlanConfig.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/PortVlanConfig.java
index b7a47f4..dde224b 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/PortVlanConfig.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/app/PortVlanConfig.java
@@ -19,8 +19,6 @@
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.config.Config;
 
-import com.google.common.annotations.Beta;
-
 import java.util.Optional;
 
 /**
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateFcCommand.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateFcCommand.java
index 67545f9..15838d6 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateFcCommand.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateFcCommand.java
@@ -22,7 +22,15 @@
 import org.onlab.packet.VlanId;
 import org.onlab.util.Bandwidth;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.ecord.carrierethernet.app.*;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetBandwidthProfile;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetEnni;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetForwardingConstruct;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetInni;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetLogicalTerminationPoint;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetManager;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetNetworkInterface;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetUni;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetVirtualConnection;
 import org.onosproject.net.ConnectPoint;
 
 import java.util.HashSet;
@@ -163,7 +171,7 @@
 
         CarrierEthernetManager ceManager = get(CarrierEthernetManager.class);
 
-        if(ceManager.ltpMap().get(ltpId).ni() instanceof CarrierEthernetUni) {
+        if (ceManager.ltpMap().get(ltpId).ni() instanceof CarrierEthernetUni) {
             return CarrierEthernetUni.builder()
                     .cp(ConnectPoint.deviceConnectPoint(ltpId))
                     .role(role)
@@ -177,7 +185,7 @@
                                  .ebs(Long.parseLong(argEbs))
                                  .build())
                     .build();
-        } else if(ceManager.ltpMap().get(ltpId).ni() instanceof CarrierEthernetInni) {
+        } else if (ceManager.ltpMap().get(ltpId).ni() instanceof CarrierEthernetInni) {
             // FIXME: Use role properly
             return CarrierEthernetInni.builder()
                     .cp(ConnectPoint.deviceConnectPoint(ltpId))
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateLtpCommand.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateLtpCommand.java
index a519111..3e5e70d 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateLtpCommand.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateLtpCommand.java
@@ -19,13 +19,13 @@
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.ecord.carrierethernet.app.*;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetLogicalTerminationPoint;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetManager;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetNetworkInterface;
 import org.onosproject.net.ConnectPoint;
 
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
 
 /**
  * CLI command for generating one or more Carrier Ethernet Logical Termination Points.
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateUniCommand.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateUniCommand.java
index f500d29..dfdf84e 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateUniCommand.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetCreateUniCommand.java
@@ -19,7 +19,8 @@
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.ecord.carrierethernet.app.*;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetManager;
+import org.onosproject.ecord.carrierethernet.app.CarrierEthernetUni;
 import org.onosproject.net.ConnectPoint;
 
 import java.util.Iterator;
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetEvcFragmentationCommand.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetEvcFragmentationCommand.java
index 7d2bd4a..f21e6ea 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetEvcFragmentationCommand.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetEvcFragmentationCommand.java
@@ -19,7 +19,6 @@
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.ecord.carrierethernet.app.CarrierEthernetManager;
-import org.onosproject.ecord.carrierethernet.app.CarrierEthernetProvisioner;
 
 /**
  * CLI command for indicating whether EVCs will be fragmented into FCs.
@@ -42,4 +41,4 @@
             print("  %s", ceManager.getEvcFragmentation());
         }
     }
-}
\ No newline at end of file
+}
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveAllEvcsCommand.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveAllEvcsCommand.java
index 21b3196..d25f1e1 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveAllEvcsCommand.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveAllEvcsCommand.java
@@ -31,4 +31,4 @@
         CarrierEthernetManager ceManager = get(CarrierEthernetManager.class);
         ceManager.removeAllEvcs();
     }
-}
\ No newline at end of file
+}
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveEvcCommand.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveEvcCommand.java
index dba5dcf..6bfdf1a 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveEvcCommand.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveEvcCommand.java
@@ -39,4 +39,4 @@
         CarrierEthernetManager ceManager = get(CarrierEthernetManager.class);
         argEvcIdList.forEach(argEvcId -> ceManager.removeEvc(argEvcId));
     }
-}
\ No newline at end of file
+}
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveLtpCommand.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveLtpCommand.java
index 6163430..47b2a46 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveLtpCommand.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveLtpCommand.java
@@ -39,4 +39,4 @@
         CarrierEthernetManager ceManager = get(CarrierEthernetManager.class);
         argLtpIdList.forEach(argLtpId -> ceManager.removeGlobalLtp(argLtpId));
     }
-}
\ No newline at end of file
+}
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveUniCommand.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveUniCommand.java
index dd47ba8..e50ec7a 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveUniCommand.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/CarrierEthernetRemoveUniCommand.java
@@ -39,4 +39,4 @@
         CarrierEthernetManager ceManager = get(CarrierEthernetManager.class);
         argUniIdList.forEach(argUniId -> ceManager.removeGlobalUni(argUniId));
     }
-}
\ No newline at end of file
+}
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/package-info.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/package-info.java
index 3590035..b5a81b3 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/package-info.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/commands/package-info.java
@@ -17,4 +17,4 @@
 /**
  * Command classes for the Carrier Ethernet app CLI.
  */
-package org.onosproject.ecord.carrierethernet.cli.commands;
\ No newline at end of file
+package org.onosproject.ecord.carrierethernet.cli.commands;
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/CarrierEthernetConnectPointCompleter.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/CarrierEthernetConnectPointCompleter.java
index 84873b7..7eb4447 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/CarrierEthernetConnectPointCompleter.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/CarrierEthernetConnectPointCompleter.java
@@ -54,4 +54,4 @@
         return delegate.complete(buffer, cursor, candidates);
     }
 
-}
\ No newline at end of file
+}
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/CarrierEthernetLtpTypeCompleter.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/CarrierEthernetLtpTypeCompleter.java
index 79c065f..964d8ce 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/CarrierEthernetLtpTypeCompleter.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/CarrierEthernetLtpTypeCompleter.java
@@ -17,7 +17,6 @@
 
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
-import org.onosproject.ecord.carrierethernet.app.CarrierEthernetLogicalTerminationPoint;
 import org.onosproject.ecord.carrierethernet.app.CarrierEthernetNetworkInterface;
 
 import java.util.List;
diff --git a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/UniqueStringsCompleter.java b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/UniqueStringsCompleter.java
index 038b13a..97f9d3d 100644
--- a/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/UniqueStringsCompleter.java
+++ b/carrierethernet/src/main/java/org/onosproject/ecord/carrierethernet/cli/completers/UniqueStringsCompleter.java
@@ -33,7 +33,7 @@
 
         // Get all preceding arguments
         CommandSession session = CommandSessionHolder.getSession();
-        List<String> prevArgsList = Arrays.asList(((ArgumentCompleter.ArgumentList)session
+        List<String> prevArgsList = Arrays.asList(((ArgumentCompleter.ArgumentList) session
                 .get("ARGUMENTS_LIST")).getArguments());
 
         super.complete(buffer, cursor, candidates);
@@ -41,7 +41,7 @@
         // Remove from candidate list all strings included in preceding arguments
         candidates.removeAll(prevArgsList);
 
-        return candidates.isEmpty() ? - 1 : 0;
+        return candidates.isEmpty() ? -1 : 0;
     }
 
 }
