diff --git a/sdx-l2/BUCK b/sdx-l2/BUCK
new file mode 100644
index 0000000..a24176b
--- /dev/null
+++ b/sdx-l2/BUCK
@@ -0,0 +1,24 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+]
+
+BUNDLES = [
+    '//apps/sdx-l2:onos-apps-sdx-l2',
+]
+
+TEST_DEPS = [
+    '//lib:TEST_ADAPTERS',
+]
+
+osgi_jar_with_tests (
+    deps = COMPILE_DEPS,
+    test_deps = TEST_DEPS,
+)
+
+onos_app (
+  title = 'SDX-L2 Application',
+  category = 'Utility',
+  url = 'http://www.geant.org',
+  included_bundles = BUNDLES,
+  description = 'SDX-L2 application for ONOS project developed by GEANT',
+)
\ No newline at end of file
diff --git a/sdx-l2/pom.xml b/sdx-l2/pom.xml
index d55b2e7..cd49efa 100644
--- a/sdx-l2/pom.xml
+++ b/sdx-l2/pom.xml
@@ -85,25 +85,6 @@
         </dependency>
 
         <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-sdnip</artifactId>
-            <version>${onos.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-            <version>3.2</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-routing-api</artifactId>
-            <version>${onos.version}</version>
-        </dependency>
-
-        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
             <version>5.0.0</version>
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPoint.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPoint.java
index fafb9d3..f5f6849 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPoint.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPoint.java
@@ -28,8 +28,8 @@
 import static com.google.common.base.Preconditions.*;
 
 /**
- * Sdx-l2 connection point expressed as composition of a:
- * ConnectPoint; Set of Vlanid; Customer edge MAC address (optional).
+ * SDX-L2 connection point expressed as composition of a:
+ * connect point; set of VLAN id; MAC address (optional).
  */
 public class SdxL2ConnectionPoint {
 
@@ -39,12 +39,12 @@
     private final MacAddress ceMac;
 
     /**
-     * Creates a new SDXL2 connection point.
+     * Creates a new SDX-L2 connection point.
      *
-     * @param name connection point name
-     * @param cPoint connection point
-     * @param vlans the customer edge vlans
-     * @param ceMac the customer edge router mac address
+     * @param name SDX-L2 connection point name
+     * @param cPoint connect point
+     * @param vlans the customer edge VLANs
+     * @param ceMac the customer edge router MAC address
      */
     public SdxL2ConnectionPoint(String name, ConnectPoint cPoint, List<VlanId> vlans, MacAddress ceMac) {
         this.name = name;
@@ -54,7 +54,7 @@
     }
 
     /**
-     * Return the name of SDXL2 connection point.
+     * Returns the name of SDX-L2 connection point.
      *
      * @return a string representing the name of connection point
      */
@@ -63,44 +63,44 @@
     }
 
     /**
-     * Returns the connection point.
+     * Returns the connect point.
      *
-     * @return connection point object
+     * @return connect point object
      */
     public ConnectPoint connectPoint() {
         return cPoint;
     }
 
     /**
-     * Returns the set of vlans that are used by the customer edge.
+     * Returns the set of VLANs that are used by the customer edge.
      *
-     * @return a set of vlan ids
+     * @return a set of VLAN ids
      */
     public List<VlanId> vlanIds() {
         return vlanIds;
     }
 
     /**
-     * Returns the customer edge mac address.
+     * Returns the customer edge MAC address.
      *
-     * @return a mac address object
+     * @return a MAC address object
      */
     public MacAddress macAddress() {
         return ceMac;
     }
 
     /**
-     * Parse a device connect point from a string, set of vlans from a string
-     * and mac from a string.
+     * Parse a device connect point from a string, set of VLANs from a string
+     * and MAC from a string.
      * The connect point should be in the format "deviceUri/portNumber".
-     * The vlans should be in the format "vlan1,vlan2,vlan3"
-     * The mac address should be in hex
+     * The VLANs should be in the format "vlan1,vlan2,vlan3"
+     * The MAC address should be in hex
      *
-     * @param name name of the SDXL2 cp
-     * @param connectPoint connection point to parse
-     * @param vlans vlanIds to parse
-     * @param mac mac address to parse
-     * @return a ConnectPoint based on the information in the string.
+     * @param name name of the SDX-L2 connection point
+     * @param connectPoint connect point to parse
+     * @param vlans VLAN ids to parse
+     * @param mac MAC address to parse
+     * @return a SDX-L2 connection point based on the information in the string.
      *
      */
     public static SdxL2ConnectionPoint
@@ -133,14 +133,14 @@
     }
 
     /**
-     * Parse a device connect point from a string and set of vlans from a string.
+     * Parse a device connect point from a string and set of VLANs from a string.
      * The connect point should be in the format "deviceUri/portNumber".
-     * The vlans should be in the format "vlan1,vlan2,vlan3"
+     * The VLANs should be in the format "vlan1,vlan2,vlan3"
      *
-     * @param name name of the SDXL2 cp
-     * @param connectPoint connection point to parse
-     * @param vlans vlanIds to parse
-     * @return a ConnectPoint based on the information in the string.
+     * @param name name of the SDX-L2 connection point
+     * @param connectPoint connect point to parse
+     * @param vlans VLAN ids to parse
+     * @return a SDX-L2 connection point based on the information in the string.
      *
      */
     public static SdxL2ConnectionPoint sdxl2ConnectionPoint(String name, String connectPoint, String vlans) {
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPointSerializer.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPointSerializer.java
index 698bc31..014d7fc 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPointSerializer.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPointSerializer.java
@@ -27,7 +27,7 @@
 import java.util.List;
 
 /**
- * Kryo serializer for SdxL2ConnectionPoint.
+ * Kryo serializer for SDX-L2 connection point.
  */
 public class SdxL2ConnectionPointSerializer extends Serializer<SdxL2ConnectionPoint> {
 
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2DistributedStore.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2DistributedStore.java
index 6b33025..4bee790 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2DistributedStore.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2DistributedStore.java
@@ -17,26 +17,34 @@
 package org.onosproject.sdxl2;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Deactivate;
+import org.onlab.packet.VlanId;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.store.primitives.DefaultDistributedSet;
 import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.DistributedPrimitive;
-import org.onosproject.store.service.DistributedSet;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 /**
- * SDXL2 Store implementation backed by different distributed primitives.
+ * SDX-L2 Store implementation backed by different distributed primitives.
  */
 @Component(immediate = true)
 @Service
@@ -47,10 +55,39 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     private StorageService storageService;
 
-    private DistributedSet<String> sdxL2s;
+    private Set<String> sdxL2s;
 
-    private static String errorAddSdx = "It is not possible to add ";
-    private static String errorRemoveSdx = "It is not possible to remove ";
+    private Map<SdxL2ConnectionPoint, String> sdxL2CPs;
+    private ConsistentMap<SdxL2ConnectionPoint, String> sdxL2cps;
+
+    private static String errorAddSdx = "It is not possible to add %s " +
+            "because it exists";
+
+    private static String errorRemoveSdx = "It is not possible to remove %s " +
+            "because it does not exist";
+
+    private static String errorAddSdxL2CPName = "It is not possible to add %s " +
+            "because there is a sdxl2cp with the same name";
+    private static String errorAddSdxL2CPVlans = "It is not possible to add %s " +
+            "because there is a conflict with %s on the vlan ids";
+    private static String errorAddSdxL2CPCP = "It is not possible to add %s " +
+            "because there is a conflict with %s on the connection point";
+    private static String errorAddSdxL2CPSdx = "It is not possible to add %s " +
+            "because the relative sdxl2 does not exist";
+
+    private static String errorGetSdxL2CPs = "It is not possible to list the sdxl2cps" +
+            "because sdxl2 %s does not exist";
+
+    private static String errorRemoveSdxL2CP = "It is not possible to remove %s " +
+            "because it does not exist";
+
+    public void initForTest() {
+
+        this.sdxL2s = Sets.newHashSet();
+
+        this.sdxL2CPs = new ConcurrentHashMap<SdxL2ConnectionPoint, String>();
+
+    }
 
     @Activate
     public void activate() {
@@ -67,6 +104,13 @@
                 .withName("sdxl2s")
                 .build(), DistributedPrimitive.DEFAULT_OPERTATION_TIMEOUT_MILLIS);
 
+        sdxL2cps = this.storageService
+                .<SdxL2ConnectionPoint, String>consistentMapBuilder()
+                .withSerializer(Serializer.using(custom))
+                .withName("sdxl2cps")
+                .build();
+        sdxL2CPs = sdxL2cps.asJavaMap();
+
         log.info("Started");
     }
 
@@ -76,41 +120,175 @@
     }
 
     /**
-     * Create a named sdx-l2.
+     * Creates a named SDX-L2.
      *
-     * @param sdxl2 sdx-l2 name
-     * @throws SdxL2Exception if sdxl2 exists
+     * @param sdxl2 SDX-L2 name
+     * @throws SdxL2Exception if SDX-L2 exists
      */
     @Override
     public void putSdxL2(String sdxl2) throws SdxL2Exception {
         boolean inserted = sdxL2s.add(sdxl2);
         if (!inserted) {
-            throw new SdxL2Exception(errorAddSdx + sdxl2);
+            throw new SdxL2Exception(String.format(errorAddSdx, sdxl2));
         }
     }
 
     /**
-     * Remove a named sdx-l2.
+     * Removes a named SDX-L2.
      *
-     * @param sdxl2 sdx-l2 name
-     * @throws SdxL2Exception if sdxl2 does not exist
+     * @param sdxl2 SDX-L2 name
+     * @throws SdxL2Exception if SDX-L2 does not exist
      */
     @Override
     public void removeSdxL2(String sdxl2) throws SdxL2Exception {
         boolean removed = sdxL2s.remove(sdxl2);
         if (!removed) {
-            throw new SdxL2Exception(errorRemoveSdx + sdxl2);
+            throw new SdxL2Exception(String.format(errorRemoveSdx, sdxl2));
         }
+
+        Set<Map.Entry<SdxL2ConnectionPoint, String>> toRemove = sdxL2CPs.entrySet().parallelStream().filter(
+                key_value -> {
+                    String sdxl2Temp = key_value.getValue();
+                    return sdxl2Temp.equals(sdxl2) ? true : false;
+                }).collect(Collectors.toSet());
+        toRemove.forEach(key_value -> sdxL2CPs.remove(key_value.getKey()));
     }
 
     /**
-     * Returns a set of sdxl2 names.
+     * Returns a set of SDX-L2 names.
      *
-     * @return a set of sdxl2 names
+     * @return a set of SDX-L2 names
      */
     @Override
     public Set<String> getSdxL2s() {
         return ImmutableSet.copyOf(sdxL2s);
     }
 
+    /**
+     * Adds an SDX-L2 connection point to an SDX-L2.
+     *
+     * @param sdxl2 SDX-L2 name
+     * @param connectionPoint the connection point object
+     * @throws SdxL2Exception if it is not possible to add the SDX-L2 connection point
+     */
+    @Override
+    public void addSdxL2ConnectionPoint(String sdxl2, SdxL2ConnectionPoint connectionPoint) throws SdxL2Exception {
+
+        boolean exist = sdxL2s.contains(sdxl2);
+
+        if (!exist) {
+            throw new SdxL2Exception(String.format(errorAddSdxL2CPSdx, connectionPoint.name()));
+        }
+
+        Set<SdxL2ConnectionPoint> sdxl2cpsTemp = ImmutableSet.copyOf(sdxL2CPs.keySet());
+        Set<SdxL2ConnectionPoint> sdxl2cpsTempByName = sdxl2cpsTemp.parallelStream().filter(
+                sdxl2cpTemp-> sdxl2cpTemp.name().equals(connectionPoint.name()
+                )
+        ).collect(Collectors.toSet());
+
+        if (sdxl2cpsTempByName.size() != 0) {
+            throw new SdxL2Exception(String.format(errorAddSdxL2CPName, connectionPoint.name()));
+        }
+
+
+        Set<SdxL2ConnectionPoint> sdxl2cpsByCP = sdxl2cpsTemp.parallelStream().filter(
+                sdxl2cp_temp-> sdxl2cp_temp.connectPoint().equals(connectionPoint.connectPoint()
+                )
+        ).collect(Collectors.toSet());
+
+        String tempName;
+        List<VlanId> vlans = connectionPoint.vlanIds();
+        for (VlanId vlanId : vlans) {
+            Set<SdxL2ConnectionPoint> sdxl2cpsByVlan = sdxl2cpsByCP.parallelStream().filter(
+                    sdxl2cp_by_vlan -> (
+                            sdxl2cp_by_vlan.vlanIds().contains(vlanId) || sdxl2cp_by_vlan.vlanIds().size() == 0
+                    )).collect(Collectors.toSet());
+
+            tempName =  sdxl2cpsByVlan.iterator().hasNext() ?  sdxl2cpsByVlan.iterator().next().name() : null;
+
+            if (sdxl2cpsByVlan.size() != 0) {
+                throw new SdxL2Exception(String.format(errorAddSdxL2CPVlans, connectionPoint.name(), tempName));
+            }
+
+        }
+
+        tempName =  sdxl2cpsByCP.iterator().hasNext() ? sdxl2cpsByCP.iterator().next().name() : null;
+
+        if (sdxl2cpsByCP.size() != 0 && vlans.size() == 0) {
+            throw new SdxL2Exception(String.format(errorAddSdxL2CPCP, connectionPoint.name(), tempName));
+        }
+
+        sdxL2CPs.put(connectionPoint, sdxl2);
+
+    }
+
+    /**
+     * Returns all the SDX-L2 connection points names or the SDX-L2 2connection points names
+     * that are related to an SDX-L2.
+     *
+     * @param sdxl2 name (optional) of the SDX-L2
+     * @return a set of SDX-L2 connection points names, the result depends on the input parameter;
+     * @throws SdxL2Exception if SDX-L2 is present but it does not exist
+     */
+    @Override
+    public Set<String> getSdxL2ConnectionPoints(Optional<String> sdxl2) throws SdxL2Exception {
+
+        if (sdxl2.isPresent()) {
+
+            Set<Map.Entry<SdxL2ConnectionPoint, String>> toGet = sdxL2CPs.entrySet().parallelStream().filter(
+                    key_value -> {
+                        String sdxl2Temp = key_value.getValue();
+                        return sdxl2Temp.equals(sdxl2.get()) ? true : false;
+                    }).collect(Collectors.toSet());
+
+            Iterator<String> itsdxL2s = sdxL2s.iterator();
+            boolean found = false;
+            while (itsdxL2s.hasNext()) {
+                if (sdxl2.get().equals(itsdxL2s.next())) {
+                    found = true;
+                }
+            }
+
+            if (!found) {
+                throw new SdxL2Exception(String.format(errorGetSdxL2CPs, sdxl2.get()));
+            }
+
+            Set<String> cpsTemp = Sets.newHashSet();
+            for (Map.Entry<SdxL2ConnectionPoint, String> cp : toGet) {
+                cpsTemp.add(cp.getKey().name());
+            }
+
+            return cpsTemp;
+        }
+
+        return ImmutableSet.copyOf(sdxL2CPs.keySet()).parallelStream().map(
+                SdxL2ConnectionPoint::name).collect(Collectors.toSet());
+
+    }
+
+    /**
+     * Removes a named SDX-L2 connection point in an SDX-L2.
+     *
+     * @param sdxl2cp the connection point name
+     * @throws SdxL2Exception if SDX-L2 connection point does not exist
+     */
+    @Override
+    public void removeSdxL2ConnectionPoint(String sdxl2cp) throws SdxL2Exception {
+
+        Set<SdxL2ConnectionPoint> sdxl2cpsTemp = ImmutableSet.copyOf(sdxL2CPs.keySet());
+        Set<SdxL2ConnectionPoint> sdxl2cpsTempByName = sdxl2cpsTemp.parallelStream().filter(
+                sdxl2cpTemp -> sdxl2cpTemp.name().equals(sdxl2cp
+                )
+        ).collect(Collectors.toSet());
+
+        if (sdxl2cpsTempByName.size() == 0) {
+            throw new SdxL2Exception(String.format(errorRemoveSdxL2CP, sdxl2cp));
+        }
+
+        for (SdxL2ConnectionPoint sdxl2cpTemp : sdxl2cpsTempByName) {
+            sdxL2CPs.remove(sdxl2cpTemp);
+        }
+
+    }
+
 }
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Exception.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Exception.java
index c69e670..1692edc 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Exception.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Exception.java
@@ -17,7 +17,7 @@
 package org.onosproject.sdxl2;
 
 /**
- * SdxL2 exception for errors.
+ * SDX-L2 error Exception.
  */
 public class SdxL2Exception extends Exception {
 
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Manager.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Manager.java
index d9c77e3..f73fb24 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Manager.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Manager.java
@@ -28,13 +28,16 @@
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+
+import java.util.Collections;
+import java.util.Optional;
 import java.util.Set;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 
 /**
- * Implementation of the Interface SdxL2Service.
+ * Implementation of the SdxL2Service.
  */
 @Component(immediate = true)
 @Service
@@ -63,12 +66,13 @@
     }
 
     /**
-     * Create a named sdxl2.
+     * Creates a named SDX-L2.
      *
-     * @param sdxl2 sdxl2 name
+     * @param sdxl2 SDX-L2 name
      */
     @Override
     public void createSdxL2(String sdxl2) {
+
         checkNotNull(sdxl2, "sdxl2 name cannot be null");
         checkState(!sdxl2.contains(","), "sdxl2 names cannot contain commas");
         checkState(!sdxl2.contains("|"), "sdxl2 names cannot contain pipe");
@@ -78,36 +82,94 @@
         try {
             this.sdxL2Store.putSdxL2(sdxl2);
         } catch (SdxL2Exception e) {
-            e.printStackTrace();
+            log.info(e.getMessage());
         }
 
     }
 
     /**
-     * Delete a named sdxl2.
+     * Deletes a named SDX-L2.
      *
-     * @param sdxl2 sdxl2 name
+     * @param sdxl2 SDX-L2 name
      */
     @Override
     public void deleteSdxL2(String sdxl2) {
+
         checkNotNull(sdxl2, "sdxl2 name cannot be null");
 
         try {
             this.sdxL2Store.removeSdxL2(sdxl2);
         } catch (SdxL2Exception e) {
-            e.printStackTrace();
+            log.info(e.getMessage());
         }
 
     }
 
     /**
-     * Returns a set of sdxl2 names.
+     * Returns a set of SDX-L2 names.
      *
-     * @return a set of sdxl2 names
+     * @return a set of SDX-L2 names
      */
     @Override
     public Set<String> getSdxL2s() {
         return this.sdxL2Store.getSdxL2s();
     }
 
+    /**
+     * Adds an SDX-L2 connection point to an SDX-L2.
+     *
+     * @param sdxl2   SDX-L2 name
+     * @param sdxl2cp SDX-L2 connection point object
+     */
+    @Override
+    public void addSdxL2ConnectionPoint(String sdxl2, SdxL2ConnectionPoint sdxl2cp) {
+
+        checkNotNull(sdxl2, "sdxl2 name cannot be null");
+        checkNotNull(sdxl2cp, "SdxL2ConnectionPoint cannot be null");
+
+        try {
+            this.sdxL2Store.addSdxL2ConnectionPoint(sdxl2, sdxl2cp);
+        } catch (SdxL2Exception e) {
+            log.info(e.getMessage());
+        }
+
+    }
+
+    /**
+     * Returns all the SDX-L2 connection points names in a SDX-L2 or all the SDX-L2 connection points names.
+     *
+     * @param sdxl2 SDX-L2 name
+     * @return a set of SDX-L2 connection points names
+     */
+    @Override
+    public Set<String> getSdxL2ConnectionPoints(Optional<String> sdxl2) {
+
+        try {
+            return this.sdxL2Store.getSdxL2ConnectionPoints(sdxl2);
+        } catch (SdxL2Exception e) {
+            log.info(e.getMessage());
+        }
+
+        return Collections.emptySet();
+
+    }
+
+    /**
+     * Removes an SDX-L2 connection point from an SDX-L2.
+     *
+     * @param sdxl2cp SDX-L2 connection point name
+     */
+    @Override
+    public void removeSdxL2ConnectionPoint(String sdxl2cp) {
+
+        checkNotNull(sdxl2cp, "SdxL2ConnectionPoint name cannot be null");
+
+        try {
+            this.sdxL2Store.removeSdxL2ConnectionPoint(sdxl2cp);
+        } catch (SdxL2Exception e) {
+            log.info(e.getMessage());
+        }
+
+    }
+
 }
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Service.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Service.java
index e61d121..57c1be2 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Service.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Service.java
@@ -16,34 +16,58 @@
 
 package org.onosproject.sdxl2;
 
+import java.util.Optional;
 import java.util.Set;
 
 /**
- * Service that allows to create virtual named SDXL2s
- * In which it is possible to provide connectivity
+ * Service that allows to create virtual named sdx-l2s
+ * in which is possible to provide connectivity
  * (layer 2 Virtual Circuits - VC) between edge ports.
  */
 public interface SdxL2Service {
 
     /**
-     * Create a named SDXL2.
+     * Creates a named SDX-L2.
      *
-     * @param sdxl2 SDXL2 name
+     * @param sdxl2 SDX-L2 name
      */
     void createSdxL2(String sdxl2);
 
     /**
-     * Delete a named SDXL2.
+     * Deletes a named SDX-L2.
      *
-     * @param sdxl2 SDXL2 name
+     * @param sdxl2 SDX-L2 name
      */
     void deleteSdxL2(String sdxl2);
 
     /**
-     * Returns a set of SDXL2 names.
+     * Returns a set of SDX-L2 names.
      *
-     * @return a set of SDXL2 names
+     * @return a set of SDX-L2 names
      */
     Set<String> getSdxL2s();
 
+    /**
+     * Adds an SDX-L2 connection point to an SDX-L2.
+     *
+     * @param sdxl2 SDX-L2 name
+     * @param sdxl2cp SDX-L2 connection point object
+     */
+    void addSdxL2ConnectionPoint(String sdxl2, SdxL2ConnectionPoint sdxl2cp);
+
+    /**
+     * Returns all the SDX-L2 connection points names in a SDX-L2 or all the SDX-L2 connection points names.
+     *
+     * @param sdxl2 SDX-L2 name
+     * @return a set of SDX-L2 connection points names
+     */
+    Set<String> getSdxL2ConnectionPoints(Optional<String> sdxl2);
+
+    /**
+     * Removes an SDX-L2 connection point from an SDX-L2.
+     *
+     * @param sdxl2cp SDX-L2 connection point name
+     */
+    void removeSdxL2ConnectionPoint(String sdxl2cp);
+
 }
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Store.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Store.java
index 6380a65..217a52a 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Store.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2Store.java
@@ -16,34 +16,63 @@
 
 package org.onosproject.sdxl2;
 
+import java.util.Optional;
 import java.util.Set;
 
 /**
- * Storage service of sdxl2 application.
+ * Storage service for SDX-L2 application.
  */
 public interface SdxL2Store {
 
     /**
-     * Create a named sdx-l2.
+     * Creates a named SDX-L2.
      *
-     * @param sdxl2 sdx-l2 name
-     * @throws SdxL2Exception if sdxl2 exists
+     * @param sdxl2 SDX-L2 name
+     * @throws SdxL2Exception if SDX-L2 exists
      */
     void putSdxL2(String sdxl2) throws SdxL2Exception;
 
     /**
-     * Remove a named sdx-l2.
+     * Removes a named SDX-L2.
      *
-     * @param sdxl2 sdx-l2 name
-     * @throws SdxL2Exception if sdxl2 does not exist
+     * @param sdxl2 SDX-L2 name
+     * @throws SdxL2Exception if SDX-L2 does not exist
      */
     void removeSdxL2(String sdxl2) throws SdxL2Exception;
 
     /**
-     * Returns a set of sdxl2 names.
+     * Returns a set of SDX-L2 names.
      *
-     * @return a set of sdxl2 names
+     * @return a set of SDX-L2 names
      */
     Set<String> getSdxL2s();
 
+    /**
+     * Adds an SDX-L2 connection point to an SDX-L2.
+     *
+     * @param sdxl2 SDX-L2 name
+     * @param connectionPoint the SDX-L2 connection point object
+     * @throws SdxL2Exception if it is not possible to add the SDX-L2 connection point
+     */
+    void addSdxL2ConnectionPoint(String sdxl2, SdxL2ConnectionPoint connectionPoint) throws SdxL2Exception;
+
+    /**
+     * Returns all the SDX-L2 connection points names or the SDX-L2 connection points name
+     * that are related to an SDX-L2.
+     *
+     * @param sdxl2 name (optional) of the SDX-L2
+     * @return a set of SDX-L2 connection points names, the result depends on the input parameter;
+     * @throws SdxL2Exception if SDX-L2 is present but it does not exist
+     */
+    Set<String> getSdxL2ConnectionPoints(Optional<String> sdxl2) throws SdxL2Exception;
+
+
+    /**
+     * Removes a named SDX-L2 connection point in an SDX-L2.
+     *
+     * @param sdxl2cp the connection point name
+     * @throws SdxL2Exception if the connection point does not exist
+     */
+    void removeSdxL2ConnectionPoint(String sdxl2cp) throws SdxL2Exception;
+
 }
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2AddCPCommand.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2AddCPCommand.java
new file mode 100644
index 0000000..eb000b8
--- /dev/null
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2AddCPCommand.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.sdxl2.cli;
+
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.sdxl2.SdxL2ConnectionPoint;
+import org.onosproject.sdxl2.SdxL2Service;
+
+/**
+ * CLI to create a named SDX-L2 connection point.
+ */
+@Command(scope = "sdxl2", name = "sdxl2cp-add", description = "Create a named sdx-l2 connection point")
+public class SdxL2AddCPCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "sdxl2name", description = "Sdxl2name",
+            required = true, multiValued = false)
+    String sdxl2name = null;
+
+    @Argument(index = 1, name = "connectionpoint", description = "Connection point",
+            required = true, multiValued = false)
+    String cp = null;
+
+    @Argument(index = 2, name = "vlans", description = "Customer edge vlans separated by comma",
+            required = true, multiValued = false)
+    String vlans = null;
+
+    @Argument(index = 3, name = "sdxl2cpname", description = "Sdxl2 connection point name",
+            required = true, multiValued = false)
+    String sdxl2cpname = null;
+
+    @Option(name = "-ce_mac", description = "Customer edge mac address",
+            required = false, multiValued = false)
+    String mac = null;
+
+    @Override
+    protected void execute() {
+        SdxL2Service sdxl2Service = get(SdxL2Service.class);
+        SdxL2ConnectionPoint sdxl2cp;
+        if (mac != null) {
+            sdxl2cp = SdxL2ConnectionPoint.sdxl2ConnectionPoint(sdxl2cpname, cp, vlans, mac);
+        } else {
+            sdxl2cp = SdxL2ConnectionPoint.sdxl2ConnectionPoint(sdxl2cpname, cp, vlans);
+        }
+        sdxl2Service.addSdxL2ConnectionPoint(sdxl2name, sdxl2cp);
+    }
+
+}
+
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2AddCommand.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2AddCommand.java
index 141f2f3..c7bb963 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2AddCommand.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2AddCommand.java
@@ -22,9 +22,9 @@
 import org.onosproject.sdxl2.SdxL2Service;
 
 /**
- * CLI to create sdxl2.
+ * CLI to create SDX-L2.
  */
-@Command(scope = "sdxl2", name = "sdxl2-add", description = "Create a sdxl2")
+@Command(scope = "sdxl2", name = "sdxl2-add", description = "Create a sdx-l2")
 public class SdxL2AddCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "sdxl2name", description = "Sdxl2 name", required = true, multiValued = false)
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2ListCommand.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2ListCommand.java
index e027d11..56fc850 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2ListCommand.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2ListCommand.java
@@ -23,9 +23,9 @@
 import java.util.Set;
 
 /**
- * CLI to list sdxl2.
+ * CLI to list the SDX-L2s.
  */
-@Command(scope = "sdxl2", name = "sdxl2-list", description = "Lists the sdxl2s")
+@Command(scope = "sdxl2", name = "sdxl2-list", description = "Lists the sdx-l2s")
 public class SdxL2ListCommand extends AbstractShellCommand {
 
     private static final String HEADER           = "\n\u001B[1;37mSDXL2\u001B[0m";
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2RemoveCPCommand.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2RemoveCPCommand.java
new file mode 100644
index 0000000..3e1dfee
--- /dev/null
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2RemoveCPCommand.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.sdxl2.cli;
+
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.sdxl2.SdxL2Service;
+
+/**
+ * CLI to delete a named SDX-L2 connection point.
+ */
+@Command(scope = "sdxl2", name = "sdxl2cp-remove", description = "Remove a named sdxl2 connection point")
+public class SdxL2RemoveCPCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "sdxl2cpname", description = "Sdxl2 connection point name",
+            required = true, multiValued = false)
+    String sdxl2cpname = null;
+
+    @Override
+    protected void execute() {
+        SdxL2Service sdxl2Service = get(SdxL2Service.class);
+        sdxl2Service.removeSdxL2ConnectionPoint(sdxl2cpname);
+    }
+
+}
+
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2RemoveCommand.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2RemoveCommand.java
index 4a01a61..aecb899 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2RemoveCommand.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/SdxL2RemoveCommand.java
@@ -22,9 +22,9 @@
 import org.onosproject.sdxl2.SdxL2Service;
 
 /**
- * CLI to delete a named sdxl2.
+ * CLI to delete a named SDX-L2.
  */
-@Command(scope = "sdxl2", name = "sdxl2-remove", description = "Delete a sdxl2")
+@Command(scope = "sdxl2", name = "sdxl2-remove", description = "Delete a sdx-l2")
 public class SdxL2RemoveCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "sdxl2name", description = "Sdxl2 name",
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/completer/SdxL2CPNameCompleter.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/completer/SdxL2CPNameCompleter.java
new file mode 100644
index 0000000..706c1e3
--- /dev/null
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/completer/SdxL2CPNameCompleter.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.sdxl2.cli.completer;
+
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.sdxl2.SdxL2Service;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Completes SDX-L2 connection point names.
+ */
+public class SdxL2CPNameCompleter implements Completer {
+
+    @Override
+    public int complete(String buffer, int cursor, List<String> candidates) {
+        StringsCompleter delegate = new StringsCompleter();
+        SdxL2Service service = AbstractShellCommand.get(SdxL2Service.class);
+        delegate.getStrings().addAll(service.getSdxL2ConnectionPoints(Optional.ofNullable(null)));
+        return delegate.complete(buffer, cursor, candidates);
+    }
+}
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/completer/SdxL2NameCompleter.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/completer/SdxL2NameCompleter.java
index bd64da1..50b4366 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/completer/SdxL2NameCompleter.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/completer/SdxL2NameCompleter.java
@@ -24,7 +24,7 @@
 import java.util.List;
 
 /**
- * Completes SDXL2 names.
+ * Completes SDX-L2 names.
  */
 public class SdxL2NameCompleter implements Completer {
 
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/completer/package-info.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/completer/package-info.java
index 7920073..753c338 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/completer/package-info.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/completer/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * Provides the implementation of L2-SDX CLI completers.
+ * Provides the implementation of SDX-L2 CLI completers.
  */
 package org.onosproject.sdxl2.cli.completer;
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/package-info.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/package-info.java
index ba9de9e..b94a3c1 100644
--- a/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/package-info.java
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/cli/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * Provides the implementation of L2-SDX CLI commands.
+ * Provides the implementation of SDX-L2 CLI commands.
  */
 package org.onosproject.sdxl2.cli;
diff --git a/sdx-l2/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/sdx-l2/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index e81d722..06a2060 100644
--- a/sdx-l2/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/sdx-l2/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -28,8 +28,23 @@
         <command>
             <action class="org.onosproject.sdxl2.cli.SdxL2ListCommand"/>
         </command>
+        <command>
+            <action class="org.onosproject.sdxl2.cli.SdxL2AddCPCommand"/>
+            <completers>
+                <ref component-id="sdxl2Completer"/>
+                <ref component-id="connectPointCompleter"/>
+            </completers>
+        </command>
+        <command>
+            <action class="org.onosproject.sdxl2.cli.SdxL2RemoveCPCommand"/>
+            <completers>
+                <ref component-id="sdxl2cpnameCompleter"/>
+            </completers>
+        </command>
     </command-bundle>
 
     <bean id="sdxl2Completer" class="org.onosproject.sdxl2.cli.completer.SdxL2NameCompleter"/>
+    <bean id="connectPointCompleter" class="org.onosproject.cli.net.ConnectPointCompleter"/>
+    <bean id="sdxl2cpnameCompleter" class="org.onosproject.sdxl2.cli.completer.SdxL2CPNameCompleter"/>
 
 </blueprint>
diff --git a/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2ConnectionPointTest.java b/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2ConnectionPointTest.java
index 9a3419a..ae20d28 100644
--- a/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2ConnectionPointTest.java
+++ b/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2ConnectionPointTest.java
@@ -30,7 +30,7 @@
 import static org.junit.Assert.assertNotEquals;
 
 /**
- * Test SdxL2ConnectionPoint functionalities.
+ * Tests SdxL2ConnectionPoint functionality.
  */
 public class SdxL2ConnectionPointTest {
 
diff --git a/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2ManagerTest.java b/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2ManagerTest.java
index fbe1ce4..f1d1321 100644
--- a/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2ManagerTest.java
+++ b/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2ManagerTest.java
@@ -16,12 +16,14 @@
 
 package org.onosproject.sdxl2;
 
+import com.google.common.collect.Sets;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.onosproject.TestApplicationId;
 
 import java.util.HashSet;
+import java.util.Optional;
 import java.util.Set;
 
 import static org.junit.Assert.assertEquals;
@@ -29,7 +31,7 @@
 
 
 /**
- * Test network manager.
+ * Tests SdxL2Manager functionality.
  */
 public class SdxL2ManagerTest {
 
@@ -39,7 +41,9 @@
     public void setUp() {
         manager = new SdxL2Manager();
         manager.appId = new TestApplicationId("sdxl2-test");
-        manager.sdxL2Store = new SdxL2TestStore();
+        SdxL2DistributedStore store = new SdxL2DistributedStore();
+        store.initForTest();
+        manager.sdxL2Store = store;
     }
 
     @After
@@ -81,4 +85,159 @@
         assertNotEquals(sdxl2, old);
     }
 
+    public static final String CP1 = "of:00000000000001/1";
+    public static final String CP2 = "of:00000000000002/1";
+    public static final String CP3 = "of:00000000000003/1";
+    public static final String CP4 = "of:00000000000003/2";
+    public static final String CP5 = "of:00000000000004/2";
+
+    public static final String VLANS1 = "1,2,3,4";
+    public static final String VLANS2 = "-1";
+    public static final String VLANS3 = "1,2,3";
+    public static final String VLANS4 = "2,2,2";
+    public static final String VLANS7 = "5";
+    public static final String VLANS8 = "3,2,1";
+
+    public static final String CEMAC1 = "52:40:00:12:44:01";
+
+    @Test
+    public void testaddSdxL2ConnectionPoint() {
+
+        manager.createSdxL2(SDXL2);
+        manager.createSdxL2(SDXL2_2);
+        manager.createSdxL2("test1");
+
+        SdxL2ConnectionPoint one = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM1", CP1, VLANS1, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, one);
+
+        SdxL2ConnectionPoint three = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM2", CP2, VLANS2, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, three);
+
+        SdxL2ConnectionPoint six = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM3", CP1, VLANS7, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2_2, six);
+
+        SdxL2ConnectionPoint seven = SdxL2ConnectionPoint.sdxl2ConnectionPoint("MI3", CP3, VLANS3, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, seven);
+
+        SdxL2ConnectionPoint nine = SdxL2ConnectionPoint.sdxl2ConnectionPoint("FI1", CP4, VLANS8, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2_2, nine);
+
+        SdxL2ConnectionPoint ten = SdxL2ConnectionPoint.sdxl2ConnectionPoint("FI2", CP5, VLANS2, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, ten);
+
+        SdxL2ConnectionPoint fourteen = SdxL2ConnectionPoint.sdxl2ConnectionPoint("RO1",
+                "of:0000000000000003/3", "1", "52:54:00:04:E5:9E");
+        manager.addSdxL2ConnectionPoint("test1", fourteen);
+
+        SdxL2ConnectionPoint fifteen = SdxL2ConnectionPoint.sdxl2ConnectionPoint("RO2",
+                "of:0000000000000009/3", "1", "52:54:00:68:F7:D9");
+        manager.addSdxL2ConnectionPoint("test1", fifteen);
+
+        SdxL2ConnectionPoint two = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM1", CP2, VLANS1, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, two);
+
+        SdxL2ConnectionPoint four = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM2", CP2, VLANS2, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2_2, four);
+
+        SdxL2ConnectionPoint five = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM3", CP1, VLANS2, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2_2, five);
+
+        SdxL2ConnectionPoint eight = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM4", CP3, VLANS4, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, eight);
+
+        SdxL2ConnectionPoint eleven = SdxL2ConnectionPoint.sdxl2ConnectionPoint("FI3", CP5, VLANS1, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2_2, eleven);
+
+        SdxL2ConnectionPoint twelve = SdxL2ConnectionPoint.sdxl2ConnectionPoint("FI31", CP5, VLANS1, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2_2, twelve);
+
+        SdxL2ConnectionPoint thirteen = SdxL2ConnectionPoint.sdxl2ConnectionPoint("FI31", CP5, VLANS8, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2_2, thirteen);
+
+    }
+
+    @Test
+    public void testgetSdxL2ConnectionPoints() {
+
+        manager.createSdxL2(SDXL2);
+        manager.createSdxL2(SDXL2_2);
+
+        Set<String> allExt = Sets.newHashSet();
+        Set<String> allExtBySdxl2 = Sets.newHashSet();
+        Set<String> allExtBySdxl22 = Sets.newHashSet();
+
+        SdxL2ConnectionPoint one = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM1", CP1, VLANS1, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, one);
+        allExt.add(one.name());
+        allExtBySdxl2.add(one.name());
+        SdxL2ConnectionPoint three = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM2", CP2, VLANS2, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, three);
+        allExt.add(three.name());
+        allExtBySdxl2.add(three.name());
+        SdxL2ConnectionPoint six = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM3", CP1, VLANS7, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2_2, six);
+        allExt.add(six.name());
+        allExtBySdxl22.add(six.name());
+        SdxL2ConnectionPoint seven = SdxL2ConnectionPoint.sdxl2ConnectionPoint("MI3", CP3, VLANS3, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, seven);
+        allExt.add(seven.name());
+        allExtBySdxl2.add(seven.name());
+        SdxL2ConnectionPoint nine = SdxL2ConnectionPoint.sdxl2ConnectionPoint("FI1", CP4, VLANS8, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2_2, nine);
+        allExt.add(nine.name());
+        allExtBySdxl22.add(nine.name());
+        SdxL2ConnectionPoint ten = SdxL2ConnectionPoint.sdxl2ConnectionPoint("FI2", CP5, VLANS2, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, ten);
+        allExt.add(ten.name());
+        allExtBySdxl2.add(ten.name());
+
+        Set<String> all = manager.getSdxL2ConnectionPoints(Optional.ofNullable(null));
+        Set<String> allBySdxl2 = manager.getSdxL2ConnectionPoints(Optional.of(SDXL2));
+        Set<String> allBySdxl22 = manager.getSdxL2ConnectionPoints(Optional.of(SDXL2_2));
+
+        assertEquals(allExt, all);
+        assertNotEquals(allExtBySdxl2, all);
+        assertNotEquals(allExtBySdxl22, all);
+
+        assertNotEquals(allExt, allBySdxl2);
+        assertEquals(allExtBySdxl2, allBySdxl2);
+        assertNotEquals(allExtBySdxl22, allBySdxl2);
+
+        assertNotEquals(allExt, allBySdxl22);
+        assertNotEquals(allExtBySdxl2, allBySdxl22);
+        assertEquals(allExtBySdxl22, allBySdxl22);
+
+    }
+
+    @Test
+    public void testremoveSdxL2ConnectionPoint() {
+
+        manager.createSdxL2(SDXL2);
+        manager.createSdxL2(SDXL2_2);
+
+        SdxL2ConnectionPoint one = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM1", CP1, VLANS1, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, one);
+
+        SdxL2ConnectionPoint three = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM2", CP2, VLANS2, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, three);
+
+        SdxL2ConnectionPoint six = SdxL2ConnectionPoint.sdxl2ConnectionPoint("ROM3", CP1, VLANS7, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2_2, six);
+
+        SdxL2ConnectionPoint seven = SdxL2ConnectionPoint.sdxl2ConnectionPoint("MI3", CP3, VLANS3, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, seven);
+
+        SdxL2ConnectionPoint nine = SdxL2ConnectionPoint.sdxl2ConnectionPoint("FI1", CP4, VLANS8, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2_2, nine);
+
+        SdxL2ConnectionPoint ten = SdxL2ConnectionPoint.sdxl2ConnectionPoint("FI2", CP5, VLANS2, CEMAC1);
+        manager.addSdxL2ConnectionPoint(SDXL2, ten);
+
+        manager.removeSdxL2ConnectionPoint(one.name());
+        manager.removeSdxL2ConnectionPoint(six.name());
+        manager.removeSdxL2ConnectionPoint(one.name());
+        manager.removeSdxL2ConnectionPoint("ROM");
+
+    }
+
 }
diff --git a/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2TestStore.java b/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2TestStore.java
deleted file mode 100644
index 6cf3ef2..0000000
--- a/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2TestStore.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.sdxl2;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-
-import java.util.Set;
-
-/**
- * Stub class that emulates the behaviours of the SdxL2Store.
- */
-public final class SdxL2TestStore implements SdxL2Store {
-
-    private Set<String> sdxL2s = Sets.newHashSet();
-
-    private static String errorAddSdx = "It is not possible to add ";
-    private static String errorRemoveSdx = "It is not possible to remove ";
-
-    /**
-     * Create a named sdx-l2.
-     *
-     * @param sdxl2 sdx-l2 name
-     * @throws SdxL2Exception if sdxl2 exists
-     */
-    @Override
-    public void putSdxL2(String sdxl2) throws SdxL2Exception {
-        boolean inserted = sdxL2s.add(sdxl2);
-        if (!inserted) {
-            throw new SdxL2Exception(errorAddSdx + sdxl2);
-        }
-    }
-
-    /**
-     * Remove a named sdx-l2.
-     *
-     * @param sdxl2 sdx-l2 name
-     * @throws SdxL2Exception if sdxl2 does not exist
-     */
-    @Override
-    public void removeSdxL2(String sdxl2) throws SdxL2Exception {
-        boolean removed = sdxL2s.remove(sdxl2);
-        if (!removed) {
-            throw new SdxL2Exception(errorRemoveSdx + sdxl2);
-        }
-    }
-
-    /**
-     * Returns a set of sdxl2 names.
-     *
-     * @return a set of sdxl2 names
-     */
-    @Override
-    public Set<String> getSdxL2s() {
-        return ImmutableSet.copyOf(sdxL2s);
-    }
-
-}
diff --git a/sdx-l2/src/test/java/org/onosproject/sdxl2/package-info.java b/sdx-l2/src/test/java/org/onosproject/sdxl2/package-info.java
index de39d20..a358545 100644
--- a/sdx-l2/src/test/java/org/onosproject/sdxl2/package-info.java
+++ b/sdx-l2/src/test/java/org/onosproject/sdxl2/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * Test sdx-l2 functionalities.
+ * Tests SDX-L2 functionality.
  */
 package org.onosproject.sdxl2;
