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;
+    }
+}
