diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/AccessInfo.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/AccessInfo.java
new file mode 100644
index 0000000..3728cbe
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/AccessInfo.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+import com.google.common.base.Objects;
+
+/**
+ * Representation of site network access information.
+ */
+public class AccessInfo {
+
+    /**
+     * Site id from sites list.
+     */
+    private String siteId;
+
+    /**
+     * Site network access id from site network access list.
+     */
+    private String accessId;
+
+    /**
+     * Constructs access info with site id and access id.
+     *
+     * @param s site id
+     * @param a access id
+     */
+    public AccessInfo(String s, String a) {
+        siteId = s;
+        accessId = a;
+    }
+
+    /**
+     * Returns the site id.
+     *
+     * @return site id
+     */
+    String siteId() {
+        return siteId;
+    }
+
+    /**
+     * Returns the access id.
+     *
+     * @return access id
+     */
+    String accessId() {
+        return accessId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(siteId, accessId);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (object instanceof AccessInfo) {
+            AccessInfo that = (AccessInfo) object;
+            return Objects.equal(siteId, that.siteId) &&
+                    Objects.equal(accessId, that.accessId);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return "Access id : " + accessId + "\nSite id : " + siteId;
+    }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpDriverInfo.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpDriverInfo.java
new file mode 100644
index 0000000..151f3e5
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpDriverInfo.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+/**
+ * Representation of BGP configuration required for driver to process.
+ */
+public class BgpDriverInfo {
+
+    /**
+     * Model id level of the BGP information that needed to be added in store.
+     */
+    private BgpModelIdLevel modIdLevel;
+
+    /**
+     * Device id required for the creation of driver model object data.
+     */
+    private String devId;
+
+    /**
+     * Constructs BGP driver info.
+     *
+     * @param m model id level for BGP
+     * @param d device id
+     */
+    public BgpDriverInfo(BgpModelIdLevel m, String d) {
+        modIdLevel = m;
+        devId = d;
+    }
+
+    /**
+     * Returns the model id level of the BGP information to be added.
+     *
+     * @return model id level
+     */
+    BgpModelIdLevel modIdLevel() {
+        return modIdLevel;
+    }
+
+    /**
+     * Returns the device id.
+     *
+     * @return device id
+     */
+    String devId() {
+        return devId;
+    }
+
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpInfo.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpInfo.java
new file mode 100644
index 0000000..e461b24
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpInfo.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Representation of BGP information which contains the protocol info and the
+ * VPN name.
+ */
+public class BgpInfo {
+
+    /**
+     * Map of route protocol and the protocol info for the BGP info.
+     */
+    private Map<RouteProtocol, ProtocolInfo> protocolInfo;
+
+    /**
+     * VPN name, to which the BGP info belongs.
+     */
+    private String vpnName;
+
+    /**
+     * Constructs BGP info.
+     */
+    public BgpInfo() {
+    }
+
+    /**
+     * Returns the map of protocol info associated with the BGP info.
+     *
+     * @return protocol info map.
+     */
+    Map<RouteProtocol, ProtocolInfo> protocolInfo() {
+        return protocolInfo;
+    }
+
+    /**
+     * Sets the map of protocol info with route protocol as key value.
+     *
+     * @param protocolInfo protocol info map
+     */
+    void protocolInfo(Map<RouteProtocol, ProtocolInfo> protocolInfo) {
+        this.protocolInfo = protocolInfo;
+    }
+
+    /**
+     * Adds a protocol info with route protocol as key to the map.
+     *
+     * @param route route protocol
+     * @param info  protocol info
+     */
+    void addProtocolInfo(RouteProtocol route, ProtocolInfo info) {
+        if (protocolInfo == null) {
+            protocolInfo = new HashMap<>();
+        }
+        protocolInfo.put(route, info);
+    }
+
+    /**
+     * Returns the VPN name of the BGP info.
+     *
+     * @return VPN name
+     */
+    String vpnName() {
+        return vpnName;
+    }
+
+    /**
+     * Sets the VPN name.
+     *
+     * @param vpnName VPN name
+     */
+    void vpnName(String vpnName) {
+        this.vpnName = vpnName;
+    }
+
+    @Override
+    public String toString() {
+        return "VPN name : " + vpnName;
+    }
+}
+
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpModelIdLevel.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpModelIdLevel.java
new file mode 100644
index 0000000..334f2fe
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpModelIdLevel.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+/**
+ * Represents the model id level of BGP information to be added to store.
+ * //TODO: Further more levels of BGP addition has to be added.
+ */
+public enum BgpModelIdLevel {
+
+    /**
+     * Requested model id level is not present, representing top node.
+     */
+    ROOT,
+
+    /**
+     * Requested model id level is devices container.
+     */
+    DEVICES,
+
+    /**
+     * Requested model id level is device list.
+     */
+    DEVICE
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/DeviceInfo.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/DeviceInfo.java
new file mode 100644
index 0000000..8b4421e
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/DeviceInfo.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.driver.DriverService;
+import org.onosproject.yang.model.ModelObjectData;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Representation of standard device model, with interface, instance and its
+ * respective device id.
+ */
+public class DeviceInfo {
+
+    /**
+     * Device id of the device.
+     */
+    private final DeviceId deviceId;
+
+    /**
+     * BGP information of the device.
+     */
+    private BgpInfo bgpInfo;
+
+    /**
+     * List of interface names of the device.
+     */
+    private List<String> ifNames;
+
+    /**
+     * List of network access of the device.
+     */
+    private List<AccessInfo> accesses;
+
+    /**
+     * Constructs device info with a device id.
+     *
+     * @param d device id
+     */
+    public DeviceInfo(DeviceId d) {
+        deviceId = d;
+    }
+
+    /**
+     * Returns the device id.
+     *
+     * @return device id
+     */
+    DeviceId deviceId() {
+        return deviceId;
+    }
+
+    /**
+     * Adds a interface name to the list.
+     *
+     * @param ifName interface name
+     */
+    void addIfName(String ifName) {
+        if (ifNames == null) {
+            ifNames = new LinkedList<>();
+        }
+        ifNames.add(ifName);
+    }
+
+    /**
+     * Returns the list of interface name.
+     *
+     * @return interface names
+     */
+    List<String> ifNames() {
+        return ifNames;
+    }
+
+    /**
+     * Sets the list of interface name.
+     *
+     * @param ifNames interface names
+     */
+    void ifNames(List<String> ifNames) {
+        this.ifNames = ifNames;
+    }
+
+    /**
+     * Returns the BGP information.
+     *
+     * @return BGP info
+     */
+    BgpInfo bgpInfo() {
+        return bgpInfo;
+    }
+
+    /**
+     * Sets the BGP information.
+     *
+     * @param bgpInfo BGP info
+     */
+    void bgpInfo(BgpInfo bgpInfo) {
+        this.bgpInfo = bgpInfo;
+    }
+
+    /**
+     * Returns the list of network accesses.
+     *
+     * @return network accesses
+     */
+    List<AccessInfo> accesses() {
+        return accesses;
+    }
+
+    /**
+     * Sets the list of network accesses.
+     *
+     * @param accesses network accesses
+     */
+    void accesses(List<AccessInfo> accesses) {
+        this.accesses = accesses;
+    }
+
+    /**
+     * Adds a access info to the network accesses list.
+     *
+     * @param accessInfo access info
+     */
+    void addAccessInfo(AccessInfo accessInfo) {
+        if (accesses == null) {
+            accesses = new LinkedList<>();
+        }
+        accesses.add(accessInfo);
+    }
+
+    /**
+     * Processes the creation of VPN instance to the driver with the model
+     * object data of standard device model. It returns the VPN instance of
+     * driver constructed model object data.
+     *
+     * @param driverSvc driver service
+     * @param modelData std device model object data
+     * @return driver instance model object data
+     */
+    ModelObjectData processCreateInstance(DriverService driverSvc,
+                                          ModelObjectData modelData) {
+        // TODO: Need to call the behaviour.
+        return null;
+    }
+
+    /**
+     * Processes the creation of interface to the driver with the model
+     * object data of standard device model. It returns the interface of driver
+     * constructed model object data.
+     *
+     * @param driverSvc driver service
+     * @param modData   std device model object data
+     * @return driver interface model object data
+     */
+    ModelObjectData processCreateInterface(DriverService driverSvc,
+                                           ModelObjectData modData) {
+        // TODO: Need to call the behaviour.
+        return null;
+    }
+
+    /**
+     * Processes the creation of BGP info to the driver with the BGP info and
+     * the BGP driver configuration. It returns the BGP info of driver
+     * constructed model object data.
+     *
+     * @param driverSvc  driver service
+     * @param bgpInfo    BGP info
+     * @param driverInfo driver config details
+     * @return driver BGP model object data
+     */
+    ModelObjectData processCreateBgpInfo(DriverService driverSvc,
+                                         BgpInfo bgpInfo,
+                                         BgpDriverInfo driverInfo) {
+        // TODO: Need to call the behaviour.
+        return null;
+    }
+
+    /**
+     * Processes the deletion of VPN instance to the driver with the model
+     * object data of standard device model. It returns the VPN instance of
+     * driver constructed model object data.
+     *
+     * @param driverSvc driver service
+     * @param modData   model object data
+     * @return driver instance model object data
+     */
+    ModelObjectData processDeleteInstance(DriverService driverSvc,
+                                          ModelObjectData modData) {
+        // TODO: Need to call the behaviour.
+        return null;
+    }
+
+    /**
+     * Processes the deletion of interface to the driver with the model
+     * object data of standard device model. It returns the interface of driver
+     * constructed model object data.
+     *
+     * @param driverSvc  driver service
+     * @param objectData model object data
+     * @return driver interface model object data
+     */
+    ModelObjectData processDeleteInterface(DriverService driverSvc,
+                                           ModelObjectData objectData) {
+        // TODO: Need to call the behaviour.
+        return null;
+    }
+
+    /**
+     * Processes the deletion of BGP info to the driver with the BGP info and
+     * the BGP driver configuration. It returns the BGP info of driver
+     * constructed model object data.
+     *
+     * @param driverSvc  driver service
+     * @param bgpInfo    BGP info
+     * @param driverInfo driver config details
+     * @return driver BGP model object data
+     */
+    ModelObjectData processDeleteBgpInfo(DriverService driverSvc,
+                                         BgpInfo bgpInfo,
+                                         BgpDriverInfo driverInfo) {
+        // TODO: Need to call the behaviour.
+        return null;
+    }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/FullMeshVpnConfig.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/FullMeshVpnConfig.java
new file mode 100644
index 0000000..8802fc0
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/FullMeshVpnConfig.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+/**
+ * Representation of the full mesh VPN configuration containing RT.
+ */
+public class FullMeshVpnConfig extends VpnConfig {
+
+    /**
+     * Route target value.
+     */
+    private String rt;
+
+    /** Constructs full mesh VPN config.
+     *
+     * @param r RT value
+     */
+    public FullMeshVpnConfig(String r) {
+        rt = r;
+    }
+
+    /**
+     * Returns the RT value.
+     *
+     * @return RT value
+     */
+    String rt() {
+        return rt;
+    }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/HubSpokeVpnConfig.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/HubSpokeVpnConfig.java
new file mode 100644
index 0000000..d305ae3
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/HubSpokeVpnConfig.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+/**
+ * Representation of the hub and spoke VPN configuration containing import and
+ * export RTs.
+ */
+public class HubSpokeVpnConfig extends VpnConfig {
+
+    /**
+     * Hub import RT value.
+     */
+    private String hubImpRt;
+
+    /**
+     * Hub export RT value.
+     */
+    private String hubExpRt;
+
+    /**
+     * Spoke import RT value.
+     */
+    private String spokeImpRt;
+
+    /**
+     * Spoke export RT value.
+     */
+    private String spokeExpRt;
+
+    /**
+     * Creates hub and spoke VPN config.
+     */
+    public HubSpokeVpnConfig() {
+    }
+
+    /**
+     * Returns hub import RT value.
+     *
+     * @return RT value
+     */
+    String hubImpRt() {
+        return hubImpRt;
+    }
+
+    /**
+     * Sets hub import RT value.
+     *
+     * @param hubImpRt RT value
+     */
+    void hubImpRt(String hubImpRt) {
+        this.hubImpRt = hubImpRt;
+    }
+
+    /**
+     * Returns hub export RT value.
+     *
+     * @return RT value
+     */
+    String hubExpRt() {
+        return hubExpRt;
+    }
+
+    /**
+     * Sets hub export RT value.
+     *
+     * @param hubExpRt RT value
+     */
+    void hubExpRt(String hubExpRt) {
+        this.hubExpRt = hubExpRt;
+    }
+
+    /**
+     * Returns spoke import RT value.
+     *
+     * @return RT value
+     */
+    String spokeImpRt() {
+        return spokeImpRt;
+    }
+
+    /**
+     * Sets spoke import RT value.
+     *
+     * @param spokeImpRt RT value
+     */
+    void spokeImpRt(String spokeImpRt) {
+        this.spokeImpRt = spokeImpRt;
+    }
+
+    /**
+     * Returns spoke export RT value.
+     *
+     * @return RT value
+     */
+    String spokeExpRt() {
+        return spokeExpRt;
+    }
+
+    /**
+     * Sets spoke export RT value.
+     *
+     * @param spokeExpRt RT value
+     */
+    void spokeExpRt(String spokeExpRt) {
+        this.spokeExpRt = spokeExpRt;
+    }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/InterfaceInfo.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/InterfaceInfo.java
new file mode 100644
index 0000000..ecdddb6
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/InterfaceInfo.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+/**
+ * Representation of interface information, which has the interface name and
+ * its binding VPN name and the device info to which it belongs to.
+ */
+public class InterfaceInfo {
+
+    /**
+     * Device info value.
+     */
+    private DeviceInfo devInfo;
+
+    /**
+     * Interface name.
+     */
+    private String intName;
+
+    /**
+     * VPN instance name.
+     */
+    private String vpnName;
+
+    /**
+     * Constructs interface info.
+     *
+     * @param d device info
+     * @param i interface name
+     * @param v VPN name
+     */
+    public InterfaceInfo(DeviceInfo d, String i, String v) {
+        devInfo = d;
+        intName = i;
+        vpnName = v;
+    }
+
+    /**
+     * Returns device info of the interface.
+     *
+     * @return device info
+     */
+    DeviceInfo devInfo() {
+        return devInfo;
+    }
+
+    /**
+     * Returns the interface name.
+     *
+     * @return interface name
+     */
+    String intName() {
+        return intName;
+    }
+
+    /**
+     * Returns the VPN name.
+     *
+     * @return VPN name
+     */
+    String vpnName() {
+        return vpnName;
+    }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3VpnException.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3VpnException.java
new file mode 100644
index 0000000..066e4fd
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3VpnException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+/**
+ * Representation of exception that needs to be handled by net l3 VPN.
+ */
+public class NetL3VpnException extends RuntimeException {
+
+    /**
+     * Creates net l3 VPN exception with an exception message.
+     *
+     * @param excMsg message
+     */
+    public NetL3VpnException(String excMsg) {
+        super(excMsg);
+    }
+
+    /**
+     * Creates net l3 VPN exception with a cause for it.
+     *
+     * @param cause cause
+     */
+    public NetL3VpnException(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3VpnStore.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3VpnStore.java
new file mode 100644
index 0000000..b5f8681
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3VpnStore.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+import org.onosproject.net.DeviceId;
+
+import java.util.Map;
+
+/**
+ * Abstraction of an entity providing pool of available VPN instances
+ * its associated devices and interface information.
+ */
+public interface NetL3VpnStore {
+
+    /**
+     * Returns the freed ids that can be re-used for RD and RT generation.
+     *
+     * @return collection of freed ids
+     */
+    Iterable<Long> getFreedIdList();
+
+    /**
+     * Returns the VPN instance map available in the store.
+     *
+     * @return VPN instance map
+     */
+    Map<String, VpnInstance> getVpnInstances();
+
+    /**
+     * Returns the BGP info map available in the store.
+     *
+     * @return BGP info map
+     */
+    Map<BgpInfo, DeviceId> getBgpInfo();
+
+    /**
+     * Returns the interface information map available in the store.
+     *
+     * @return interface info map
+     */
+    Map<AccessInfo, InterfaceInfo> getInterfaceInfo();
+
+    /**
+     * Adds freed id to the freed list in the store.
+     *
+     * @param id id
+     */
+    void addIdToFreeList(Long id);
+
+    /**
+     * Adds the VPN name and the VPN instance, if the map does'nt have the
+     * value with it.
+     *
+     * @param name     VPN name
+     * @param instance VPN instance
+     */
+    void addVpnInsIfAbsent(String name, VpnInstance instance);
+
+    /**
+     * Adds the access info and the interface info to the map in store.
+     *
+     * @param accessInfo access info
+     * @param intInfo    interface info
+     */
+    void addInterfaceInfo(AccessInfo accessInfo, InterfaceInfo intInfo);
+
+    /**
+     * Adds the BGP info and the device id to the map in store.
+     *
+     * @param bgpInfo BGP info
+     * @param devId   device id
+     */
+    void addBgpInfo(BgpInfo bgpInfo, DeviceId devId);
+
+    /**
+     * Removes the interface info with the key access info from the store.
+     *
+     * @param accessInfo access info
+     * @return true if removed; false otherwise
+     */
+    boolean removeInterfaceInfo(AccessInfo accessInfo);
+
+    /**
+     * Removes the VPN instance from the store with the key VPN name from the
+     * store.
+     *
+     * @param vpnName VPN name
+     * @return true if removed; false otherwise
+     */
+    boolean removeVpnInstance(String vpnName);
+
+    /**
+     * Removes the mentioned id from the freed list.
+     *
+     * @param id id
+     * @return true if removed; false otherwise
+     */
+    boolean removeIdFromFreeList(Long id);
+
+    /**
+     * Removes the device id from the store with the key BGP info from the
+     * store.
+     *
+     * @param bgpInfo BGP info
+     * @return true if removed; false otherwise
+     */
+    boolean removeBgpInfo(BgpInfo bgpInfo);
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/ProtocolInfo.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/ProtocolInfo.java
new file mode 100644
index 0000000..1692127
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/ProtocolInfo.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Representation of protocol info of the BGP info. It contains the route
+ * protocol and the interfaces which are associated with the information.
+ */
+public class ProtocolInfo {
+
+    /**
+     * Route protocol.
+     */
+    private RouteProtocol routeProtocol;
+
+    /**
+     * Interface details which uses this protocol with respect to IPV4 address.
+     */
+    private List<AccessInfo> v4Accesses;
+
+    /**
+     * Interface details which uses this protocol with respect to IPV6 address.
+     */
+    private List<AccessInfo> v6Accesses;
+
+    /**
+     * Status of IPV4 address family available.
+     */
+    private boolean ipv4Af;
+
+    /**
+     * Status of IPV6 address family available.
+     */
+    private boolean ipv6Af;
+
+    /**
+     * Process id of the protocol info.
+     */
+    private String processId;
+
+    /**
+     * Constructs protocol info.
+     */
+    public ProtocolInfo() {
+    }
+
+    /**
+     * Returns the route protocol.
+     *
+     * @return route protocol
+     */
+    RouteProtocol routeProtocol() {
+        return routeProtocol;
+    }
+
+    /**
+     * Sets the route protocol.
+     *
+     * @param routeProtocol route protocol
+     */
+    void routeProtocol(RouteProtocol routeProtocol) {
+        this.routeProtocol = routeProtocol;
+    }
+
+    /**
+     * Returns the process id.
+     *
+     * @return process id
+     */
+    String processId() {
+        return processId;
+    }
+
+    /**
+     * Sets the process id.
+     *
+     * @param processId process id.
+     */
+    void processId(String processId) {
+        this.processId = processId;
+    }
+
+    /**
+     * Returns true if the IPV4 address family uses the protocol info; false
+     * otherwise.
+     *
+     * @return true if IPV4 address family uses; false otherwise
+     */
+    boolean isIpv4Af() {
+        return ipv4Af;
+    }
+
+    /**
+     * Sets true if the IPV4 address family uses the protocol info; false
+     * otherwise.
+     *
+     * @param ipv4Af true if IPV4 interface uses; false otherwise
+     */
+    void ipv4Af(boolean ipv4Af) {
+        this.ipv4Af = ipv4Af;
+    }
+
+    /**
+     * Returns true if the IPV6 address family uses the protocol info; false
+     * otherwise.
+     *
+     * @return true if IPV6 address family uses; false otherwise
+     */
+    boolean isIpv6Af() {
+        return ipv6Af;
+    }
+
+    /**
+     * Sets true if the IPV6 address family uses the protocol info; false
+     * otherwise.
+     *
+     * @param ipv6Af true if IPV6 interface uses; false otherwise
+     */
+    void ipv6Af(boolean ipv6Af) {
+        this.ipv6Af = ipv6Af;
+    }
+
+    /**
+     * Returns the list of IPV4 network access information.
+     *
+     * @return IPV4 network accesses
+     */
+    List<AccessInfo> v4Accesses() {
+        return v4Accesses;
+    }
+
+    /**
+     * Sets the list of IPV4 network access information.
+     *
+     * @param v4Accesses IPV4 network accesses
+     */
+    void v4Accesses(List<AccessInfo> v4Accesses) {
+        this.v4Accesses = v4Accesses;
+    }
+
+    /**
+     * Adds a access info to the IPV4 network accesses.
+     *
+     * @param info IPV4 network access
+     */
+    void addV4Key(AccessInfo info) {
+        if (v4Accesses == null) {
+            v4Accesses = new LinkedList<>();
+        }
+        v4Accesses.add(info);
+    }
+
+    /**
+     * Returns the list of IPV6 network access information.
+     *
+     * @return IPV6 network accesses
+     */
+    List<AccessInfo> v6Accesses() {
+        return v6Accesses;
+    }
+
+    /**
+     * Sets the list of IPV6 network access information.
+     *
+     * @param v6Accesses IPV6 network accesses
+     */
+    void v6Accesses(List<AccessInfo> v6Accesses) {
+        this.v4Accesses = v6Accesses;
+    }
+
+    /**
+     * Adds a access info to the IPV6 network accesses.
+     * @param info IPV4 network access
+     */
+    void addV6Key(AccessInfo info) {
+        if (v6Accesses == null) {
+            v6Accesses = new LinkedList<>();
+        }
+        v6Accesses.add(info);
+    }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/RouteProtocol.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/RouteProtocol.java
new file mode 100644
index 0000000..8ff03f6
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/RouteProtocol.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+/**
+ * Represents the route protocol of BGP info.
+ */
+public enum RouteProtocol {
+
+    /**
+     * Requested route protocol type is of BGP.
+     */
+    BGP("bgp"),
+
+    /**
+     * Requested route protocol type is of direct.
+     */
+    DIRECT("direct"),
+
+    /**
+     * Requested route protocol type is of OSPF.
+     */
+    OSPF("ospf"),
+
+    /**
+     * Requested route protocol type is of RIP.
+     */
+    RIP("rip"),
+
+    /**
+     * Requested route protocol type is of RIPNG.
+     */
+    RIP_NG("ripng"),
+
+    /**
+     * Requested route protocol type is of VRRP.
+     */
+    VRRP("vrrp"),
+
+    /**
+     * Requested route protocol type is of static.
+     */
+    STATIC("yangautoprefixstatic");
+
+    /**
+     * Defined protocol type from the enum value.
+     */
+    private final String proType;
+
+    /**
+     * Constructs protocol type value from enum.
+     *
+     * @param proType value of enum
+     */
+    RouteProtocol(String proType) {
+        this.proType = proType;
+    }
+
+    /**
+     * Returns route protocol for corresponding protocol name.
+     *
+     * @param name protocol name
+     * @return route protocol
+     */
+    static RouteProtocol getProType(String name) {
+        for (RouteProtocol protocol : values()) {
+            if (protocol.proType.equals(name.toLowerCase())) {
+                return protocol;
+            }
+        }
+        throw new NetL3VpnException("There is no protocol type as " + name);
+    }
+
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnConfig.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnConfig.java
new file mode 100644
index 0000000..d9973b0
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnConfig.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+/**
+ * Abstraction of VPN config which contains RD value for the VPN instance.
+ */
+public class VpnConfig {
+
+    /**
+     * RD value for VPN instance.
+     */
+    private String rd;
+
+    /**
+     * Created VPN config.
+     */
+    public VpnConfig() {
+    }
+
+    /**
+     * Returns RD value.
+     *
+     * @return RD value
+     */
+    String rd() {
+        return rd;
+    }
+
+    /**
+     * Sets the RD value.
+     *
+     * @param rd RD value
+     */
+    void rd(String rd) {
+        this.rd = rd;
+    }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnInstance.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnInstance.java
new file mode 100644
index 0000000..b411b87
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnInstance.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+import org.onosproject.net.DeviceId;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Representation of stored VPN instance, which contains the configuration
+ * such as RD and RT, also the device info and the VPN type.
+ */
+public class VpnInstance<T extends VpnConfig> {
+
+    /**
+     * VPN instance name.
+     */
+    private String vpnName;
+
+    /**
+     * List of devices for the VPN.
+     */
+    private Map<DeviceId, DeviceInfo> devInfo;
+
+    /**
+     * Type of the VPN.
+     */
+    private VpnType type;
+
+    /**
+     * VPN config information.
+     */
+    private T vpnConfig;
+
+    /**
+     * Creates VPN instance with VPN name.
+     *
+     * @param v VPN name
+     */
+    public VpnInstance(String v) {
+        vpnName = v;
+    }
+
+    /**
+     * Returns the type of the VPN instance.
+     *
+     * @return VPN type
+     */
+    VpnType type() {
+        return type;
+    }
+
+    /**
+     * Sets the type of the VPN instance.
+     *
+     * @param type VPN type
+     */
+    void type(VpnType type) {
+        this.type = type;
+    }
+
+    /**
+     * Returns the configuration of VPN instance.
+     *
+     * @return VPN config
+     */
+    T vpnConfig() {
+        return vpnConfig;
+    }
+
+    /**
+     * Sets the configuration of VPN instance.
+     *
+     * @param vpnConfig VPN config
+     */
+    void vpnConfig(T vpnConfig) {
+        this.vpnConfig = vpnConfig;
+    }
+
+    /**
+     * Returns the device info map.
+     *
+     * @return device info map
+     */
+    Map<DeviceId, DeviceInfo> devInfo() {
+        return devInfo;
+    }
+
+    /**
+     * Sets the device info map.
+     *
+     * @param devInfo device info map
+     */
+    void devInfo(Map<DeviceId, DeviceInfo> devInfo) {
+        this.devInfo = devInfo;
+    }
+
+    /**
+     * Adds the content to device info map.
+     *
+     * @param id   device id
+     * @param info device info
+     */
+    void devInfo(DeviceId id, DeviceInfo info) {
+        if (devInfo == null) {
+            devInfo = new LinkedHashMap<>();
+        }
+        devInfo.put(id, info);
+    }
+
+    /**
+     * Returns the VPN instance name.
+     *
+     * @return VPN name
+     */
+    String vpnName() {
+        return vpnName;
+    }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnSiteRole.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnSiteRole.java
new file mode 100644
index 0000000..e67018c
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnSiteRole.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+/**
+ * Representation of VPN instance name and its respective site role for each
+ * site.
+ */
+public class VpnSiteRole {
+
+    /**
+     * VPN instance name of the site.
+     */
+    private String name;
+
+    /**
+     * Site role of the site.
+     */
+    private VpnType role;
+
+    /**
+     * Creates VPN instance site role.
+     *
+     * @param n VPN name
+     * @param r site role
+     */
+    public VpnSiteRole(String n, VpnType r) {
+        name = n;
+        role = r;
+    }
+
+    /**
+     * Returns the VPN instance name of the site.
+     *
+     * @return VPN name
+     */
+    String name() {
+        return name;
+    }
+
+    /**
+     * Returns the site role.
+     *
+     * @return site role
+     */
+    VpnType role() {
+        return role;
+    }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnType.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnType.java
new file mode 100644
index 0000000..09a3261
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/VpnType.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn;
+
+/**
+ * Represents the type of VPN instance.
+ */
+public enum VpnType {
+
+    /**
+     * Requested VPN type is of full mesh.
+     */
+    ANY_TO_ANY,
+
+    /**
+     * Requested VPN type is of hub.
+     */
+    HUB,
+
+    /**
+     * Requested VPN type is of spoke.
+     */
+    SPOKE
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java
new file mode 100644
index 0000000..baf3bc4
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright 2017-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.l3vpn.netl3vpn.impl;
+
+import com.google.common.collect.ImmutableSet;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.l3vpn.netl3vpn.AccessInfo;
+import org.onosproject.l3vpn.netl3vpn.BgpInfo;
+import org.onosproject.l3vpn.netl3vpn.DeviceInfo;
+import org.onosproject.l3vpn.netl3vpn.FullMeshVpnConfig;
+import org.onosproject.l3vpn.netl3vpn.HubSpokeVpnConfig;
+import org.onosproject.l3vpn.netl3vpn.InterfaceInfo;
+import org.onosproject.l3vpn.netl3vpn.ProtocolInfo;
+import org.onosproject.l3vpn.netl3vpn.RouteProtocol;
+import org.onosproject.l3vpn.netl3vpn.VpnConfig;
+import org.onosproject.l3vpn.netl3vpn.VpnInstance;
+import org.onosproject.l3vpn.netl3vpn.VpnType;
+import org.onosproject.l3vpn.netl3vpn.NetL3VpnStore;
+import org.onosproject.net.DeviceId;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.DistributedSet;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+import org.onosproject.yang.model.LeafListKey;
+import org.onosproject.yang.model.ListKey;
+import org.onosproject.yang.model.NodeKey;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.SchemaId;
+import org.slf4j.Logger;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Manages the pool of available VPN instances and its associated devices
+ * and interface information.
+ */
+@Component(immediate = true)
+@Service
+public class DistributedNetL3VpnStore implements NetL3VpnStore {
+
+    private static final Serializer L3VPN_SERIALIZER = Serializer
+            .using(new KryoNamespace.Builder().register(KryoNamespaces.API)
+                           .register(KryoNamespaces.API)
+                           .register(VpnInstance.class)
+                           .register(VpnType.class)
+                           .register(VpnConfig.class)
+                           .register(FullMeshVpnConfig.class)
+                           .register(HubSpokeVpnConfig.class)
+                           .register(DeviceInfo.class)
+                           .register(ResourceId.class)
+                           .register(NodeKey.class)
+                           .register(SchemaId.class)
+                           .register(LeafListKey.class)
+                           .register(ListKey.class)
+                           .register(AccessInfo.class)
+                           .register(BgpInfo.class)
+                           .register(RouteProtocol.class)
+                           .register(ProtocolInfo.class)
+                           .build());
+
+    private static final String FREE_ID_NULL = "Free ID cannot be null";
+    private static final String VPN_NAME_NULL = "VPN name cannot be null";
+    private static final String VPN_INS_NULL = "VPN instance cannot be null";
+    private static final String ACCESS_INFO_NULL = "Access info cannot be null";
+    private static final String BGP_INFO_NULL = "BGP info cannot be null";
+    private static final String INT_INFO_NULL = "Interface info cannot be null";
+    private static final String DEV_ID_NULL = "Device Id cannot be null";
+
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected StorageService storageService;
+
+    /**
+     * Freed id list of NET L3VPN.
+     */
+    private DistributedSet<Long> freedIdList;
+
+    /**
+     * Map of interface info with access info as key.
+     */
+    private ConsistentMap<AccessInfo, InterfaceInfo> intInfoMap;
+
+    /**
+     * Map of VPN instance with VPN name as key.
+     */
+    private ConsistentMap<String, VpnInstance> vpnInsMap;
+
+    /**
+     * Map of BGP information and the device id.
+     */
+    private ConsistentMap<BgpInfo, DeviceId> bgpInfoMap;
+
+    @Activate
+    protected void activate() {
+        vpnInsMap = storageService.<String, VpnInstance>consistentMapBuilder()
+                .withName("onos-l3vpn-instance-map")
+                .withSerializer(L3VPN_SERIALIZER)
+                .build();
+
+        intInfoMap = storageService
+                .<AccessInfo, InterfaceInfo>consistentMapBuilder()
+                .withName("onos-l3vpn-int-info-map")
+                .withSerializer(L3VPN_SERIALIZER)
+                .build();
+
+        bgpInfoMap = storageService.<BgpInfo, DeviceId>consistentMapBuilder()
+                .withName("onos-l3vpn-bgp-info-map")
+                .withSerializer(L3VPN_SERIALIZER)
+                .build();
+
+        freedIdList = storageService.<Long>setBuilder()
+                .withName("onos-l3vpn-id-freed-list")
+                .withSerializer(Serializer.using(KryoNamespaces.API))
+                .build()
+                .asDistributedSet();
+
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        log.info("Stopped");
+    }
+
+    @Override
+    public Iterable<Long> getFreedIdList() {
+        return ImmutableSet.copyOf(freedIdList);
+    }
+
+    @Override
+    public Map<String, VpnInstance> getVpnInstances() {
+        return vpnInsMap.entrySet().stream()
+                .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
+                        .value()));
+    }
+
+    @Override
+    public Map<BgpInfo, DeviceId> getBgpInfo() {
+        return bgpInfoMap.entrySet().stream()
+                .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
+                        .value()));
+    }
+
+    @Override
+    public Map<AccessInfo, InterfaceInfo> getInterfaceInfo() {
+        return intInfoMap.entrySet().stream()
+                .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
+                        .value()));
+    }
+
+    @Override
+    public void addIdToFreeList(Long id) {
+        checkNotNull(id, FREE_ID_NULL);
+        freedIdList.add(id);
+    }
+
+    @Override
+    public void addVpnInsIfAbsent(String name, VpnInstance instance) {
+        checkNotNull(name, VPN_NAME_NULL);
+        checkNotNull(instance, VPN_INS_NULL);
+        vpnInsMap.putIfAbsent(name, instance);
+    }
+
+    @Override
+    public void addInterfaceInfo(AccessInfo accessInfo, InterfaceInfo intInfo) {
+        checkNotNull(accessInfo, ACCESS_INFO_NULL);
+        checkNotNull(intInfo, INT_INFO_NULL);
+        intInfoMap.putIfAbsent(accessInfo, intInfo);
+    }
+
+    @Override
+    public void addBgpInfo(BgpInfo bgpInfo, DeviceId devId) {
+        checkNotNull(devId, BGP_INFO_NULL);
+        checkNotNull(devId, DEV_ID_NULL);
+        bgpInfoMap.put(bgpInfo, devId);
+    }
+
+    @Override
+    public boolean removeInterfaceInfo(AccessInfo accessInfo) {
+        checkNotNull(accessInfo, ACCESS_INFO_NULL);
+
+        if (intInfoMap.remove(accessInfo) == null) {
+            log.error("Interface info deletion for access info {} has failed.",
+                      accessInfo.toString());
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean removeVpnInstance(String vpnName) {
+        checkNotNull(vpnName, VPN_NAME_NULL);
+
+        if (vpnInsMap.remove(vpnName) == null) {
+            log.error("Vpn instance deletion for vpn name {} has failed.",
+                      vpnName);
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean removeIdFromFreeList(Long id) {
+        checkNotNull(id, FREE_ID_NULL);
+
+        if (!freedIdList.remove(id)) {
+            log.error("Id from free id list {} deletion has failed.",
+                      id.toString());
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean removeBgpInfo(BgpInfo bgpInfo) {
+        checkNotNull(bgpInfo, BGP_INFO_NULL);
+
+        if (bgpInfoMap.remove(bgpInfo) == null) {
+            log.error("Device id deletion for BGP info {} has failed.",
+                      bgpInfo.toString());
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3vpnManager.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3vpnManager.java
similarity index 97%
rename from apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3vpnManager.java
rename to apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3vpnManager.java
index 2535173..107440c 100644
--- a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3vpnManager.java
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3vpnManager.java
@@ -13,7 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.l3vpn.netl3vpn;
+
+package org.onosproject.l3vpn.netl3vpn.impl;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -40,6 +41,7 @@
 
 /**
  * The IETF net l3vpn manager implementation.
+ * // TODO: Implementation of the manager class.
  */
 @Component(immediate = true)
 public class NetL3vpnManager {
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/package-info.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/package-info.java
new file mode 100644
index 0000000..a509d5b
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-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.
+ */
+
+/**
+ * The implementations of IETF NET l3VPN manager and store.
+ */
+package org.onosproject.l3vpn.netl3vpn.impl;
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/package-info.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/package-info.java
index de5783a..a49497c 100644
--- a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/package-info.java
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * The implementations of IETF l3vpn net YANG.
+ * The IETF NET l3VPN YANG application.
  */
 package org.onosproject.l3vpn.netl3vpn;
