diff --git a/sdx-l2/README.md b/sdx-l2/README.md
new file mode 100644
index 0000000..19baf7b
--- /dev/null
+++ b/sdx-l2/README.md
@@ -0,0 +1,101 @@
+![GEANT logo](http://www.geant.org/Style%20Library/Geant/Images/logo.png "http://geant.org")
+
+Software Defined eXchange - L2
+==========================
+
+SDXL2 is an application for ONOS project which can provide layer 2 connectivity between edge ports of a given SDN network.
+
+License
+=======
+
+This sofware is licensed under the Apache License, Version 2.0.
+
+Information can be found here:
+ [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0).
+
+Tips
+==============
+
+TBD.
+
+SDXL2 dependencies
+=============================
+
+TBD.
+
+SDXL2 installation
+=============================
+
+- Compile the project:
+
+        mci
+
+    or to skip unit tests:
+
+        mci -Dmaven.test.skip=true
+
+- Install in your ONOS deployment:
+
+        onos-app $OC1 install target/SDXL2-1.0-SNAPSHOT.oar
+
+SDXL2 cli commands
+=============================
+
+- Create a named SDX:
+
+        add-sdxl2 $sdxname
+
+
+- Delete a named SDX:
+
+        remove-sdxl2 $sdxname
+
+
+- List all the active SDXs:
+
+        list-sdxl2s
+
+
+- Create a named SDX connection point:
+
+        add-sdxl2cp [-ce_mac] $mac $sdxname $connectionpoint $vlans $sdxcpname
+
+
+- Remove a named SDX connection point:
+
+        remove-sdxl2cp $sdxcpname
+
+
+- List all the active SDX connection points or all the active SDX connection points related to an SDX:
+
+        list-sdxl2cps [$sdxname]
+
+
+- Get the information of an SDX connection point:
+
+        sdxl2cp $sdxcpname
+
+
+- Create a VC between two connection points:
+
+        add-sdxl2vc $sdxname $sdxcp1 $sdxcp2
+
+
+- Remove a named VC:
+
+        remove-sdxl2vc $sdxcname
+
+
+- List all the active layer2 virtual circuit or all the layer2 vc related to an SDX:
+
+        list-sdxl2vcs [$sdxname]
+
+
+- Get the information of a layer 2 virtual circuit:
+
+        sdxl2vc $sdxvcname
+
+SDXL2 GUI
+=============================
+
+- TBD
\ No newline at end of file
diff --git a/sdx-l2/pom.xml b/sdx-l2/pom.xml
new file mode 100644
index 0000000..3929c23
--- /dev/null
+++ b/sdx-l2/pom.xml
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2016 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.
+  --><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>
+    <artifactId>onos-app-samples</artifactId>
+    <groupId>org.onosproject</groupId>
+    <version>1.6.0-SNAPSHOT</version>
+  </parent>
+
+    <groupId>org.onosproject</groupId>
+    <artifactId>onos-app-sdx-l2</artifactId>
+    <version>1.6.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <description>SDX-L2 application for ONOS project developed by GEANT</description>
+    <url>http://www.geant.org</url>
+
+    <properties>
+        <onos.version>1.6.0-SNAPSHOT</onos.version>
+        <onos.app.name>org.onosproject.sdx-l2</onos.app.name>
+        <onos.app.origin>GN4 project</onos.app.origin>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+            <version>${onos.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-core-dist</artifactId>
+            <version>${onos.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+            <version>${onos.version}</version>
+            <scope>test</scope>
+            <classifier>tests</classifier>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-cli</artifactId>
+            <version>${onos.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <version>4.3.1</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+            <version>3.0.3</version>
+            <scope>provided</scope>
+        </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>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.5.3</version>
+                <extensions>true</extensions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.5.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-scr-plugin</artifactId>
+                <version>1.20.0</version>
+                <executions>
+                    <execution>
+                        <id>generate-scr-srcdescriptor</id>
+                        <goals>
+                            <goal>scr</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <supportedProjectTypes>
+                        <supportedProjectType>bundle</supportedProjectType>
+                        <supportedProjectType>war</supportedProjectType>
+                    </supportedProjectTypes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.onosproject</groupId>
+                <artifactId>onos-maven-plugin</artifactId>
+                <version>1.5</version>
+                <executions>
+                    <execution>
+                        <id>cfg</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>cfg</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>swagger</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>swagger</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>app</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>app</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPoint.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPoint.java
new file mode 100644
index 0000000..6370ddc
--- /dev/null
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPoint.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2016 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.base.MoreObjects;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+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).
+ */
+public class SdxL2ConnectionPoint {
+
+    private String name;
+    private final ConnectPoint cPoint;
+    private final List<VlanId> vlanIds;
+    private final MacAddress ceMac;
+
+    /**
+     * Creates a new SDXL2 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
+     */
+    public SdxL2ConnectionPoint(String name, ConnectPoint cPoint, List<VlanId> vlans, MacAddress ceMac) {
+        this.name = name;
+        this.cPoint = cPoint;
+        this.vlanIds = vlans;
+        this.ceMac = ceMac;
+    }
+
+    /**
+     * Return the name of SDXL2 connection point.
+     *
+     * @return a string representing the name of connection point
+     */
+    public String name() {
+        return name;
+    }
+
+    /**
+     * Returns the connection point.
+     *
+     * @return connection point object
+     */
+    public ConnectPoint connectPoint() {
+        return cPoint;
+    }
+
+    /**
+     * Returns the set of vlans that are used by the customer edge.
+     *
+     * @return a set of vlan ids
+     */
+    public List<VlanId> vlanIds() {
+        return vlanIds;
+    }
+
+    /**
+     * Returns the customer edge mac address.
+     *
+     * @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.
+     * 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
+     *
+     * @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.
+     *
+     */
+    public static SdxL2ConnectionPoint
+    sdxl2ConnectionPoint(String name, String connectPoint, String vlans, String mac) {
+        checkNotNull(connectPoint);
+        checkNotNull(vlans);
+        checkState(!(name.contains(",") ||
+                name.contains("-") ||
+                name.contains("vlanid=") ||
+                name.contains("ConnectPoint{") ||
+                name.contains("elementId=") ||
+                name.contains("portNumber=") ||
+                name.contains("{") ||
+                name.contains("}") ||
+                name.contains("|")), "Names cannot contain some special characters");
+        checkNotNull(mac);
+        ConnectPoint connectionPoint = ConnectPoint.deviceConnectPoint(connectPoint);
+        String[] splitted = vlans.split(",");
+        checkArgument(splitted.length != 0, "At least '-1' or '1' as value");
+        List<VlanId> vlanslist = new ArrayList<>();
+        for (String vlan : splitted) {
+            if (!vlanslist.contains(VlanId.vlanId(Short.parseShort(vlan))) &&
+                    Short.parseShort(vlan) != -1 &&
+                    Short.parseShort(vlan) != 1) {
+                vlanslist.add(VlanId.vlanId(Short.parseShort(vlan)));
+            }
+        }
+        MacAddress macAddress = MacAddress.valueOf(mac);
+        return new SdxL2ConnectionPoint(name, connectionPoint, vlanslist, macAddress);
+    }
+
+    /**
+     * 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"
+     *
+     * @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.
+     *
+     */
+    public static SdxL2ConnectionPoint sdxl2ConnectionPoint(String name, String connectPoint, String vlans) {
+        checkNotNull(connectPoint);
+        checkNotNull(vlans);
+        checkState(!(name.contains(",") ||
+                name.contains("-") ||
+                name.contains("vlanid=") ||
+                name.contains("ConnectPoint{") ||
+                name.contains("elementId=") ||
+                name.contains("portNumber=") ||
+                name.contains("{") ||
+                name.contains("}") ||
+                name.contains("|")), "Names cannot contain some special characters");
+        ConnectPoint connectionPoint = ConnectPoint.deviceConnectPoint(connectPoint);
+        String[] splitted = vlans.split(",");
+        checkArgument(splitted.length != 0, "At least '-1' or '1' as value");
+        List<VlanId> vlanslist = new ArrayList<>();
+        for (String vlan : splitted) {
+            if (!vlanslist.contains(VlanId.vlanId(Short.parseShort(vlan))) &&
+                    Short.parseShort(vlan) != -1 &&
+                    Short.parseShort(vlan) != 1) {
+                vlanslist.add(VlanId.vlanId(Short.parseShort(vlan)));
+            }
+        }
+        MacAddress macAddress = MacAddress.ZERO;
+        return new SdxL2ConnectionPoint(name, connectionPoint, vlanslist, macAddress);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name, cPoint, vlanIds, ceMac);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof SdxL2ConnectionPoint) {
+            final SdxL2ConnectionPoint other = (SdxL2ConnectionPoint) obj;
+            return  Objects.equals(this.name, other.name) &&
+                    Objects.equals(this.cPoint, other.cPoint) &&
+                    Objects.equals(this.vlanIds, other.vlanIds) &&
+                    Objects.equals(this.ceMac, other.ceMac);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("name", name)
+                .add("connectionPoint", cPoint)
+                .add("vlanIds", vlanIds)
+                .add("ceMac", ceMac)
+                .toString();
+    }
+}
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPointSerializer.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPointSerializer.java
new file mode 100644
index 0000000..adbc246
--- /dev/null
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/SdxL2ConnectionPointSerializer.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2016 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.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.Serializer;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+
+import java.util.List;
+
+/**
+ * Kryo serializer for SdxL2ConnectionPoint.
+ */
+public class SdxL2ConnectionPointSerializer extends Serializer<SdxL2ConnectionPoint> {
+
+    /**
+     * Serialize the object using kryo.
+     *
+     * @param kryo the serializer
+     * @param output the output
+     * @param object the object to serialize
+     */
+    public void write(Kryo kryo, Output output, SdxL2ConnectionPoint object) {
+        kryo.writeClassAndObject(output, object.name());
+        kryo.writeClassAndObject(output, object.connectPoint());
+        kryo.writeClassAndObject(output, object.macAddress());
+        kryo.writeClassAndObject(output, object.vlanIds());
+    }
+
+    /**
+     * Create an object from one serialized using kryo.
+     *
+     * @param kryo the serializer
+     * @param input the inpunt
+     * @param type the object to create
+     * @return the object
+     */
+    public SdxL2ConnectionPoint read(Kryo kryo, Input input, Class<SdxL2ConnectionPoint> type) {
+        String name = (String) kryo.readClassAndObject(input);
+        ConnectPoint cp = (ConnectPoint) kryo.readClassAndObject(input);
+        MacAddress mac = (MacAddress) kryo.readClassAndObject(input);
+        List<VlanId> vlans = (List<VlanId>) kryo.readClassAndObject(input);
+        return new SdxL2ConnectionPoint(name, cp, vlans, mac);
+    }
+}
diff --git a/sdx-l2/src/main/java/org/onosproject/sdxl2/package-info.java b/sdx-l2/src/main/java/org/onosproject/sdxl2/package-info.java
new file mode 100644
index 0000000..0e134d7
--- /dev/null
+++ b/sdx-l2/src/main/java/org/onosproject/sdxl2/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 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.
+ */
+
+/**
+ * Application providing the basic functionality of a L2-SDX.
+ */
+package org.onosproject.sdxl2;
diff --git a/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2ConnectionPointTest.java b/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2ConnectionPointTest.java
new file mode 100644
index 0000000..bea7ccc
--- /dev/null
+++ b/sdx-l2/src/test/java/org/onosproject/sdxl2/SdxL2ConnectionPointTest.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2016 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 org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onlab.packet.VlanId;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+/**
+ * Test SdxL2ConnectionPoint functionalities.
+ */
+public class SdxL2ConnectionPointTest {
+
+    @Before
+    public void setUp() {
+
+    }
+
+    @After
+    public void tearDown() {
+
+    }
+
+    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 = "-1";
+    public static final String CP6 = "of:00000000000004/2";
+    public static final String CP7 = "of:00000000000004/1";
+
+    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 VLANS5 = "2";
+    public static final String VLANS6 = "-1";
+    public static final String VLANS7 = "5";
+    public static final String VLANS8 = "3,2,1";
+    public static final String VLANS10 = "a";
+    public static final String VLANS11 = "5196";
+    public static final String VLANS12 = "2,-1,6";
+
+    public static final String CEMAC1 = "52:40:00:12:44:01";
+    public static final String CEMAC2 = "-1";
+    public static final String CEMAC3 = "-1";
+    public static final String CEMAC4 = "-1";
+    public static final String CEMAC5 = "52:40:00:12:44:01";
+    public static final String CEMAC6 = "52:40:00:12:44:01";
+    public static final String CEMAC7 = "-1";
+
+    @Test
+    public void testSdxL2ConnectionPoint1() {
+        SdxL2ConnectionPoint scp1 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("RO1", CP1, VLANS1, CEMAC1);
+    }
+
+    @Test
+    public void testSdxL2ConnectionPoint2() {
+        SdxL2ConnectionPoint scp2 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("RO2", CP2, VLANS2);
+    }
+
+    @Test
+    public void testSdxL2ConnectionPoint3() {
+        SdxL2ConnectionPoint scp3 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("MI1", CP3, VLANS3);
+    }
+
+    @Test
+    public void testSdxL2ConnectionPoint4() {
+        SdxL2ConnectionPoint scp4 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("RO3", CP4, VLANS4);
+    }
+
+    @Rule
+    public ExpectedException exceptionconnectionpoint = ExpectedException.none();
+
+    @Test
+    public void testSdxL2ConnectionPoint5() {
+        exceptionconnectionpoint.expect(IllegalArgumentException.class);
+        exceptionconnectionpoint.expectMessage("Connect point must be in \"deviceUri/portNumber\" format");
+        SdxL2ConnectionPoint scp5 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("MI2", CP5, VLANS5, CEMAC5);
+    }
+
+    @Test
+    public void testSdxL2ConnectionPoint6() {
+        SdxL2ConnectionPoint scp6 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("MI3", CP6, VLANS6, CEMAC6);
+
+    }
+
+    @Rule
+    public ExpectedException exceptionmac = ExpectedException.none();
+
+    @Test
+    public void testSdxL2ConnectionPoint7() {
+        exceptionmac.expect(IllegalArgumentException.class);
+        exceptionmac.expectMessage("Specified MAC Address must contain");
+        SdxL2ConnectionPoint scp7 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("RO4", CP7, VLANS7, CEMAC7);
+    }
+
+    @Test
+    public void testSdxL2ConnectionPoint8() {
+        SdxL2ConnectionPoint scp8 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("", CP4, VLANS2, CEMAC6);
+    }
+
+    @Rule
+    public ExpectedException exceptionname = ExpectedException.none();
+
+    @Test
+    public void testSdxL2ConnectionPoint9() {
+        exceptionname.expect(IllegalStateException.class);
+        exceptionname.expectMessage("Names cannot contain some special characters");
+        SdxL2ConnectionPoint scp9a = SdxL2ConnectionPoint.sdxl2ConnectionPoint("NA,1", CP1, VLANS1, CEMAC1);
+        SdxL2ConnectionPoint scp9b = SdxL2ConnectionPoint.sdxl2ConnectionPoint("{NA2}", CP2, VLANS2, CEMAC2);
+        SdxL2ConnectionPoint scp9c = SdxL2ConnectionPoint.sdxl2ConnectionPoint("NA3,elementId=50", CP3, VLANS3, CEMAC3);
+    }
+
+    @Rule
+    public ExpectedException exceptionvlans = ExpectedException.none();
+
+    @Test
+    public void testSdxL2ConnectionPoint10() {
+        exceptionvlans.expect(NumberFormatException.class);
+        SdxL2ConnectionPoint scp10 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("VE1", CP1, VLANS10, CEMAC7);
+    }
+
+    @Test
+    public void testSdxL2ConnectionPoint11() {
+        exceptionvlans.expect(IllegalArgumentException.class);
+        exceptionvlans.expectMessage("value exceeds allowed maximum VLAN ID value (4095)");
+        SdxL2ConnectionPoint scp11 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("VE2", CP2, VLANS11, CEMAC6);
+    }
+
+    @Test
+    public void testSdxL2ConnectionPoint12() {
+        SdxL2ConnectionPoint scp12 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("AQ1", CP1, VLANS12, CEMAC5);
+        List<VlanId> vlanIdList = new ArrayList<>();
+        vlanIdList.add(VlanId.vlanId(Short.parseShort("2")));
+        vlanIdList.add(VlanId.vlanId(Short.parseShort("6")));
+        assertEquals(vlanIdList, scp12.vlanIds());
+    }
+
+    @Test
+    public void testSdxL2ConnectionPointEquality() {
+        SdxL2ConnectionPoint scp1 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("FI1", CP1, VLANS1, CEMAC1);
+        SdxL2ConnectionPoint scp2 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("FI1", CP1, VLANS1, CEMAC6);
+        assertEquals(scp1, scp2);
+        SdxL2ConnectionPoint scp3 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("GE4", CP2, VLANS3, CEMAC6);
+        assertNotEquals(scp1, scp3);
+        SdxL2ConnectionPoint scp4 = SdxL2ConnectionPoint.sdxl2ConnectionPoint("GE4", CP2, VLANS8, CEMAC6);
+        assertNotEquals(scp3, scp4);
+    }
+
+}
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
new file mode 100644
index 0000000..4a06994
--- /dev/null
+++ b/sdx-l2/src/test/java/org/onosproject/sdxl2/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 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.
+ */
+
+/**
+ * Test sdx-l2 functionalities.
+ */
+package org.onosproject.sdxl2;
