Merge branch 'master' into merge

Change-Id: Id77bb2de77dd288404c83e331b076aaf9aafacc5
diff --git a/apps/dhcprelay/BUCK b/apps/dhcprelay/BUCK
new file mode 100644
index 0000000..903a23a
--- /dev/null
+++ b/apps/dhcprelay/BUCK
@@ -0,0 +1,14 @@
+BUNDLES = [
+    '//apps/dhcprelay/web:onos-apps-dhcprelay-web',
+    '//apps/dhcprelay/app:onos-apps-dhcprelay-app',
+]
+
+onos_app (
+    app_name = 'org.onosproject.dhcprelay',
+    title = 'DHCP Relay Agent',
+    category = 'Utility',
+    url = 'http://onosproject.org',
+    description = 'DHCP Relay Agent Application.',
+    required_apps = [ 'org.onosproject.route-service' ],
+    included_bundles = BUNDLES,
+)
diff --git a/apps/dhcprelay/BUILD b/apps/dhcprelay/BUILD
index 5d9a3ca..c444b1a 100644
--- a/apps/dhcprelay/BUILD
+++ b/apps/dhcprelay/BUILD
@@ -1,25 +1,8 @@
-COMPILE_DEPS = CORE_DEPS + JACKSON + KRYO + CLI + [
-    "//core/store/serializers:onos-core-serializers",
-    "//apps/route-service/api:onos-apps-route-service-api",
-    "//apps/routing/fpm/api:onos-apps-routing-fpm-api",
-]
-
-TEST_DEPS = TEST + [
-    "//apps/route-service/api:onos-apps-route-service-api-tests",
-    "//core/api:onos-api-tests",
-]
-
 BUNDLES = [
-    "//apps/dhcprelay:onos-apps-dhcprelay",
-    "//apps/routing/fpm/api:onos-apps-routing-fpm-api",
+    "//apps/dhcprelay/web:onos-apps-dhcprelay-web",
+    "//apps/dhcprelay/app:onos-apps-dhcprelay-app",
 ]
 
-osgi_jar_with_tests(
-    karaf_command_packages = ["org.onosproject.dhcprelay.cli"],
-    test_deps = TEST_DEPS,
-    deps = COMPILE_DEPS,
-)
-
 onos_app(
     app_name = "org.onosproject.dhcprelay",
     category = "Utility",
diff --git a/apps/dhcprelay/app/BUCK b/apps/dhcprelay/app/BUCK
new file mode 100644
index 0000000..d698297
--- /dev/null
+++ b/apps/dhcprelay/app/BUCK
@@ -0,0 +1,21 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//lib:JACKSON',
+    '//lib:KRYO',
+    '//lib:org.apache.karaf.shell.console',
+    '//cli:onos-cli',
+    '//core/store/serializers:onos-core-serializers',
+    '//apps/route-service/api:onos-apps-route-service-api',
+    '//apps/routing/fpm/api:onos-apps-routing-fpm-api',
+]
+
+TEST_DEPS = [
+    '//lib:TEST',
+    '//apps/route-service/api:onos-apps-route-service-api-tests',
+    '//core/api:onos-api-tests',
+]
+
+osgi_jar_with_tests (
+    deps = COMPILE_DEPS,
+    test_deps = TEST_DEPS,
+)
diff --git a/apps/dhcprelay/app/BUILD b/apps/dhcprelay/app/BUILD
new file mode 100644
index 0000000..811ed84
--- /dev/null
+++ b/apps/dhcprelay/app/BUILD
@@ -0,0 +1,16 @@
+COMPILE_DEPS = CORE_DEPS + JACKSON + KRYO + CLI + [
+    "//core/store/serializers:onos-core-serializers",
+    "//apps/route-service/api:onos-apps-route-service-api",
+    "//apps/routing/fpm/api:onos-apps-routing-fpm-api",
+]
+
+TEST_DEPS = TEST + [
+    "//apps/route-service/api:onos-apps-route-service-api-tests",
+    "//core/api:onos-api-tests",
+]
+
+osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.dhcprelay.cli"],
+    test_deps = TEST_DEPS,
+    deps = COMPILE_DEPS,
+)
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
similarity index 99%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
index 515db1f..e70be90 100644
--- a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
@@ -881,7 +881,11 @@
                     // Sets relay agent IP
                     int effectiveRelayAgentIp = relayAgentIp != null ?
                             relayAgentIp.toInt() : clientInterfaceIp.toInt();
+                    Ip4Address effectiveRealRealyAgentIP = relayAgentIp != null ?
+                            relayAgentIp : clientInterfaceIp;
                     dhcpPacket.setGatewayIPAddress(effectiveRelayAgentIp);
+                    ipv4Packet.setSourceAddress(effectiveRealRealyAgentIP.toInt());
+                    log.debug("Source IP address set as relay agent IP with value: {}", effectiveRealRealyAgentIP);
                 }
             }
 
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerUtil.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerUtil.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerUtil.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerUtil.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerUtil.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerUtil.java
similarity index 98%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerUtil.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerUtil.java
index 9b3097e..5d07993 100644
--- a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerUtil.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerUtil.java
@@ -568,12 +568,15 @@
                 ipv6Packet.setDestinationAddress(serverInfo.getDhcpServerIp6().get().toOctets());
             }
             if (isRelayAgentIpFromCfgEmpty(serverInfo, receivedFromDevice)) {
-                dhcp6Relay.setLinkAddress(relayAgentIp.toOctets());
                 log.debug("indirect connection: relayAgentIp NOT availale from config file! Use dynamic. {}",
                         HexString.toHexString(relayAgentIp.toOctets(), ":"));
+                serverIpFacing = relayAgentIp;
             } else {
-                dhcp6Relay.setLinkAddress(serverInfo.getRelayAgentIp6(receivedFromDevice).get().toOctets());
+                serverIpFacing = serverInfo.getRelayAgentIp6(receivedFromDevice).get();
             }
+            log.debug("Source IP address set as relay agent IP with value: {}", serverIpFacing);
+            dhcp6Relay.setLinkAddress(serverIpFacing.toOctets());
+            ipv6Packet.setSourceAddress(serverIpFacing.toOctets());
         }
         // peer address: address of the client or relay agent from which the message to be relayed was received.
         dhcp6Relay.setPeerAddress(peerAddress);
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/InternalPacket.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/InternalPacket.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/InternalPacket.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/InternalPacket.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/api/DhcpHandler.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/api/DhcpHandler.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/api/DhcpHandler.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/api/DhcpHandler.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/api/DhcpRelayService.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/api/DhcpRelayService.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/api/DhcpRelayService.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/api/DhcpRelayService.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/api/DhcpServerInfo.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/api/DhcpServerInfo.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/api/DhcpServerInfo.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/api/DhcpServerInfo.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/api/package-info.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/api/package-info.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/api/package-info.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/api/package-info.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmAddCommand.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmAddCommand.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmAddCommand.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmAddCommand.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmDeleteCommand.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmDeleteCommand.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmDeleteCommand.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmDeleteCommand.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmRoutesCommand.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmRoutesCommand.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmRoutesCommand.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmRoutesCommand.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayAggCountersCommand.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayAggCountersCommand.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayAggCountersCommand.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayAggCountersCommand.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCounterCompleter.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCounterCompleter.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCounterCompleter.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCounterCompleter.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayResetCompleter.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayResetCompleter.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayResetCompleter.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayResetCompleter.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/package-info.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/package-info.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/cli/package-info.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/package-info.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/DefaultDhcpRelayConfig.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/DefaultDhcpRelayConfig.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/DefaultDhcpRelayConfig.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/DefaultDhcpRelayConfig.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/DhcpServerConfig.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/DhcpServerConfig.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/DhcpServerConfig.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/DhcpServerConfig.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/EnableDhcpFpmConfig.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/EnableDhcpFpmConfig.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/EnableDhcpFpmConfig.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/EnableDhcpFpmConfig.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/IgnoreDhcpConfig.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/IgnoreDhcpConfig.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/IgnoreDhcpConfig.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/IgnoreDhcpConfig.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/IndirectDhcpRelayConfig.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/IndirectDhcpRelayConfig.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/IndirectDhcpRelayConfig.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/IndirectDhcpRelayConfig.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/package-info.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/package-info.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/config/package-info.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/config/package-info.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/package-info.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/package-info.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/package-info.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/package-info.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpFpmPrefixStore.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpFpmPrefixStore.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpFpmPrefixStore.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpFpmPrefixStore.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpFpmRecord.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpFpmRecord.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpFpmRecord.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpFpmRecord.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpRecord.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpRecord.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpRecord.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpRecord.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayCounters.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayCounters.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayCounters.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayCounters.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayCountersStore.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayCountersStore.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayCountersStore.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayCountersStore.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayStore.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayStore.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayStore.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayStore.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayStoreEvent.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayStoreEvent.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayStoreEvent.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DhcpRelayStoreEvent.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayCountersStore.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayCountersStore.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayCountersStore.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayCountersStore.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStore.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStore.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStore.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStore.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DistributedFpmPrefixStore.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedFpmPrefixStore.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/DistributedFpmPrefixStore.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedFpmPrefixStore.java
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/package-info.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/package-info.java
similarity index 100%
rename from apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/store/package-info.java
rename to apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/package-info.java
diff --git a/apps/dhcprelay/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/dhcprelay/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
similarity index 100%
rename from apps/dhcprelay/src/main/resources/OSGI-INF/blueprint/shell-config.xml
rename to apps/dhcprelay/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
diff --git a/apps/dhcprelay/src/test/java/org/onosproject/dhcprelay/DhcpRelayManagerTest.java b/apps/dhcprelay/app/src/test/java/org/onosproject/dhcprelay/DhcpRelayManagerTest.java
similarity index 100%
rename from apps/dhcprelay/src/test/java/org/onosproject/dhcprelay/DhcpRelayManagerTest.java
rename to apps/dhcprelay/app/src/test/java/org/onosproject/dhcprelay/DhcpRelayManagerTest.java
diff --git a/apps/dhcprelay/src/test/java/org/onosproject/dhcprelay/config/DhcpRelayConfigTest.java b/apps/dhcprelay/app/src/test/java/org/onosproject/dhcprelay/config/DhcpRelayConfigTest.java
similarity index 100%
rename from apps/dhcprelay/src/test/java/org/onosproject/dhcprelay/config/DhcpRelayConfigTest.java
rename to apps/dhcprelay/app/src/test/java/org/onosproject/dhcprelay/config/DhcpRelayConfigTest.java
diff --git a/apps/dhcprelay/src/test/java/org/onosproject/dhcprelay/config/IgnoreDhcpConfigTest.java b/apps/dhcprelay/app/src/test/java/org/onosproject/dhcprelay/config/IgnoreDhcpConfigTest.java
similarity index 100%
rename from apps/dhcprelay/src/test/java/org/onosproject/dhcprelay/config/IgnoreDhcpConfigTest.java
rename to apps/dhcprelay/app/src/test/java/org/onosproject/dhcprelay/config/IgnoreDhcpConfigTest.java
diff --git a/apps/dhcprelay/src/test/java/org/onosproject/dhcprelay/store/DhcpRecordTest.java b/apps/dhcprelay/app/src/test/java/org/onosproject/dhcprelay/store/DhcpRecordTest.java
similarity index 100%
rename from apps/dhcprelay/src/test/java/org/onosproject/dhcprelay/store/DhcpRecordTest.java
rename to apps/dhcprelay/app/src/test/java/org/onosproject/dhcprelay/store/DhcpRecordTest.java
diff --git a/apps/dhcprelay/src/test/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStoreTest.java b/apps/dhcprelay/app/src/test/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStoreTest.java
similarity index 100%
rename from apps/dhcprelay/src/test/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStoreTest.java
rename to apps/dhcprelay/app/src/test/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStoreTest.java
diff --git a/apps/dhcprelay/src/test/resources/dhcp-relay.json b/apps/dhcprelay/app/src/test/resources/dhcp-relay.json
similarity index 100%
rename from apps/dhcprelay/src/test/resources/dhcp-relay.json
rename to apps/dhcprelay/app/src/test/resources/dhcp-relay.json
diff --git a/apps/dhcprelay/src/test/resources/invalid-dhcp-relay.json b/apps/dhcprelay/app/src/test/resources/invalid-dhcp-relay.json
similarity index 100%
rename from apps/dhcprelay/src/test/resources/invalid-dhcp-relay.json
rename to apps/dhcprelay/app/src/test/resources/invalid-dhcp-relay.json
diff --git a/apps/dhcprelay/web/BUCK b/apps/dhcprelay/web/BUCK
new file mode 100644
index 0000000..d173841
--- /dev/null
+++ b/apps/dhcprelay/web/BUCK
@@ -0,0 +1,23 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//lib:JACKSON',
+    '//lib:KRYO',
+    '//lib:org.apache.karaf.shell.console',
+    '//cli:onos-cli',
+    '//utils/rest:onlab-rest',
+    '//lib:javax.ws.rs-api',
+    '//lib:jersey-server',
+    '//core/store/serializers:onos-core-serializers',
+    '//apps/route-service/api:onos-apps-route-service-api',
+    '//apps/dhcprelay/app:onos-apps-dhcprelay-app',
+    '//apps/routing/fpm/api:onos-apps-routing-fpm-api',
+]
+
+osgi_jar (
+   deps = COMPILE_DEPS,
+   web_context = '/onos/v1/dhcprelay',
+   api_title = 'DHCPRelay App',
+   api_version = '1.0',
+   api_description = 'REST API for DHCPRelay',
+   api_package = 'org.onosproject.dhcprelay.rest',
+)
\ No newline at end of file
diff --git a/apps/dhcprelay/web/BUILD b/apps/dhcprelay/web/BUILD
new file mode 100644
index 0000000..1bdee49
--- /dev/null
+++ b/apps/dhcprelay/web/BUILD
@@ -0,0 +1,16 @@
+COMPILE_DEPS = CORE_DEPS + KRYO + JACKSON + REST + CLI + [
+    "@jersey_server//jar",
+    "//core/store/serializers:onos-core-serializers",
+    "//apps/route-service/api:onos-apps-route-service-api",
+    "//apps/dhcprelay/app:onos-apps-dhcprelay-app",
+    "//apps/routing/fpm/api:onos-apps-routing-fpm-api",
+]
+
+osgi_jar(
+    api_description = "REST API for DHCPRelay",
+    api_package = "org.onosproject.dhcprelay.rest",
+    api_title = "REST API for DHCPRelay Agent Application",
+    api_version = "1.0",
+    web_context = "/onos/v1/dhcprelay",
+    deps = COMPILE_DEPS,
+)
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricWebApplication.java b/apps/dhcprelay/web/src/main/java/org/onosproject/dhcprelay/rest/DhcpRelayWebApplication.java
similarity index 72%
copy from apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricWebApplication.java
copy to apps/dhcprelay/web/src/main/java/org/onosproject/dhcprelay/rest/DhcpRelayWebApplication.java
index d82de73..180394a 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricWebApplication.java
+++ b/apps/dhcprelay/web/src/main/java/org/onosproject/dhcprelay/rest/DhcpRelayWebApplication.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,19 +14,18 @@
  * limitations under the License.
  */
 
-package org.onosproject.simplefabric;
+package org.onosproject.dhcprelay.rest;
 
 import org.onlab.rest.AbstractWebApplication;
 
 import java.util.Set;
 
 /**
- * SIMPLE_FABRIC REST API web application.
+ * DHCP Relay Web application.
  */
-public class SimpleFabricWebApplication extends AbstractWebApplication {
+public class DhcpRelayWebApplication extends AbstractWebApplication {
     @Override
     public Set<Class<?>> getClasses() {
-        return getClasses(SimpleFabricWebResource.class);
+        return getClasses(DhcpRelayWebResource.class);
     }
 }
-
diff --git a/apps/dhcprelay/web/src/main/java/org/onosproject/dhcprelay/rest/DhcpRelayWebResource.java b/apps/dhcprelay/web/src/main/java/org/onosproject/dhcprelay/rest/DhcpRelayWebResource.java
new file mode 100644
index 0000000..9338a4b
--- /dev/null
+++ b/apps/dhcprelay/web/src/main/java/org/onosproject/dhcprelay/rest/DhcpRelayWebResource.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.dhcprelay.rest;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.dhcprelay.api.DhcpRelayService;
+import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.routeservice.Route;
+import org.onosproject.routeservice.RouteStore;
+import org.onosproject.routing.fpm.api.FpmRecord;
+import org.slf4j.Logger;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Response;
+
+import java.io.IOException;
+import java.util.Optional;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * DHCP Relay agent REST API.
+ */
+@Path("fpm-delete")
+public class DhcpRelayWebResource extends AbstractWebResource {
+    private static final Logger LOG = getLogger(DhcpRelayWebResource.class);
+
+    /**
+     * Deletes the fpm route from fpm record.
+     * Corresponding route from the route store
+     *
+     * @param prefix IpPrefix
+     * @return 204 NO CONTENT
+     * @throws IOException to signify bad request
+     */
+    @DELETE
+    @Path("{prefix}")
+    public Response dhcpFpmDelete(@PathParam("prefix") String prefix) {
+        DhcpRelayService dhcpRelayService = get(DhcpRelayService.class);
+        RouteStore routeStore = get(RouteStore.class);
+
+        try {
+            // removes fpm route from fpm record
+            Optional<FpmRecord> fpmRecord = dhcpRelayService.removeFpmRecord(IpPrefix.valueOf(prefix));
+            if (fpmRecord.isPresent()) {
+                IpAddress nextHop = fpmRecord.get().nextHop();
+                Route route = new Route(Route.Source.DHCP, IpPrefix.valueOf(prefix), nextHop);
+                // removes DHCP route from route store
+                routeStore.removeRoute(route);
+            } else {
+                LOG.warn("fpmRecord is not present");
+            }
+        } catch (IllegalArgumentException ex) {
+            throw new IllegalArgumentException(ex);
+        }
+
+        return Response.noContent().build();
+    }
+
+}
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css b/apps/dhcprelay/web/src/main/java/org/onosproject/dhcprelay/rest/package-info.java
similarity index 81%
copy from web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
copy to apps/dhcprelay/web/src/main/java/org/onosproject/dhcprelay/rest/package-info.java
index fca0dc7..959a884 100644
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
+++ b/apps/dhcprelay/web/src/main/java/org/onosproject/dhcprelay/rest/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2018-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,5 +15,6 @@
  */
 
 /**
- * ONOS GUI -- Topology Zoom Layer -- CSS file
- */
\ No newline at end of file
+ * DHCP Relay agent REST API.
+ */
+package org.onosproject.dhcprelay.rest;
diff --git a/apps/simplefabric/src/main/webapp/WEB-INF/web.xml b/apps/dhcprelay/web/src/main/webapp/WEB-INF/web.xml
similarity index 81%
copy from apps/simplefabric/src/main/webapp/WEB-INF/web.xml
copy to apps/dhcprelay/web/src/main/webapp/WEB-INF/web.xml
index e136671..0322a40 100644
--- a/apps/simplefabric/src/main/webapp/WEB-INF/web.xml
+++ b/apps/dhcprelay/web/src/main/webapp/WEB-INF/web.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Copyright 2017-present Open Networking Foundation
+  ~ Copyright 2018-present Open Networking Foundation
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -14,11 +14,12 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://java.sun.com/xml/ns/javaee"
          xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
          id="ONOS" version="2.5">
-    <display-name>Simple Fabric application REST API</display-name>
+    <display-name>DHCPRELAY REST API v1.0</display-name>
 
     <security-constraint>
         <web-resource-collection>
@@ -27,13 +28,11 @@
         </web-resource-collection>
         <auth-constraint>
             <role-name>admin</role-name>
-            <role-name>viewer</role-name>
         </auth-constraint>
     </security-constraint>
 
     <security-role>
         <role-name>admin</role-name>
-        <role-name>viewer</role-name>
     </security-role>
 
     <login-config>
@@ -46,7 +45,7 @@
         <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
         <init-param>
             <param-name>javax.ws.rs.Application</param-name>
-            <param-value>org.onosproject.simplefabric.SimpleFabricWebApplication</param-value>
+            <param-value>org.onosproject.dhcprelay.rest.DhcpRelayWebApplication</param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
     </servlet>
@@ -55,5 +54,4 @@
         <servlet-name>JAX-RS Service</servlet-name>
         <url-pattern>/*</url-pattern>
     </servlet-mapping>
-
 </web-app>
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiObjectRefFactory.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiObjectRefFactory.java
index e1d1889..166e8e3 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiObjectRefFactory.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiObjectRefFactory.java
@@ -16,10 +16,10 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.ConnectionEndPoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.OwnedNodeEdgePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.Node;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connection.ConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.node.OwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topology.Node;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.Topology;
 
 /**
  * Util class to create TapiXXXRef class instances using classes auto-generated by onos-yang-tool compiler.
@@ -59,8 +59,8 @@
      * @return cep reference instance
      */
     public static TapiCepRef create(ConnectionEndPoint cep) {
-        return TapiCepRef.create(cep.topologyId().toString(), cep.nodeId().toString(),
-                cep.ownedNodeEdgePointId().toString(), cep.connectionEndPointId().toString());
+        return TapiCepRef.create(cep.topologyUuid().toString(), cep.nodeUuid().toString(),
+                                 cep.nodeEdgePointUuid().toString(), cep.connectionEndPointUuid().toString());
     }
 
 }
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepHandler.java
index b49de0c..9bc872f 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepHandler.java
@@ -16,16 +16,17 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.ceplist.DefaultConnectionEndPoint;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectionendpoint.DefaultParentNodeEdgePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.DefaultOwnedNodeEdgePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.OwnedNodeEdgePointKeys;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultNode;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.NodeKeys;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.TopologyKeys;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.ceplist.DefaultConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectionendpoint.DefaultParentNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.augmentedtapicommoncontext.DefaultTopologyContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.node.DefaultOwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.node.OwnedNodeEdgePointKeys;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topology.DefaultNode;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topology.NodeKeys;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.TopologyKeys;
 import org.onosproject.yang.model.ModelObjectId;
 
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -77,6 +78,7 @@
 
         return ModelObjectId.builder()
                 .addChild(DefaultContext.class)
+                .addChild(DefaultTopologyContext.class)
                 .addChild(DefaultTopology.class, topologyKey)
                 .addChild(DefaultNode.class, nodeKey)
                 .addChild(DefaultOwnedNodeEdgePoint.class, nepKey)
@@ -104,10 +106,10 @@
         checkNotNull(nepUuid);
 
         DefaultParentNodeEdgePoint parentNep = new DefaultParentNodeEdgePoint();
-        parentNep.topologyId(topologyUuid);
-        parentNep.nodeId(nodeUuid);
-        parentNep.ownedNodeEdgePointId(nepUuid);
-        obj.addToParentNodeEdgePoint(parentNep);
+        parentNep.topologyUuid(topologyUuid);
+        parentNep.nodeUuid(nodeUuid);
+        parentNep.nodeEdgePointUuid(nepUuid);
+        obj.parentNodeEdgePoint(parentNep);
 
         return this;
     }
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepRefHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepRefHandler.java
index 38acd75..266ea1a 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepRefHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepRefHandler.java
@@ -16,10 +16,10 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.ceplist.ConnectionEndPoint;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.DefaultConnectionEndPoint;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectionendpoint.ParentNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.ceplist.ConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connection.DefaultConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectionendpoint.ParentNodeEdgePoint;
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
@@ -37,7 +37,7 @@
 
     @Override
     protected Uuid getIdDetail() {
-        return (Uuid) obj.connectionEndPointId();
+        return (Uuid) obj.connectionEndPointUuid();
     }
 
     @Override
@@ -49,19 +49,19 @@
     }
 
     public TapiCepRefHandler setCep(TapiCepRef cepRef) {
-        obj.topologyId(cepRef.getTopologyId());
-        obj.nodeId(cepRef.getNodeId());
-        obj.ownedNodeEdgePointId(cepRef.getNepId());
-        obj.connectionEndPointId(cepRef.getCepId());
+        obj.topologyUuid(cepRef.getTopologyId());
+        obj.nodeUuid(cepRef.getNodeId());
+        obj.nodeEdgePointUuid(cepRef.getNepId());
+        obj.connectionEndPointUuid(cepRef.getCepId());
         return this;
     }
 
     public TapiCepRefHandler setCep(ConnectionEndPoint cep) {
-        obj.connectionEndPointId(cep.uuid());
-        ParentNodeEdgePoint parentNep = cep.parentNodeEdgePoint().get(0);
-        obj.topologyId(parentNep.topologyId());
-        obj.nodeId(parentNep.nodeId());
-        obj.ownedNodeEdgePointId(parentNep.ownedNodeEdgePointId());
+        obj.connectionEndPointUuid(cep.uuid());
+        ParentNodeEdgePoint parentNep = cep.parentNodeEdgePoint();
+        obj.topologyUuid(parentNep.topologyUuid());
+        obj.nodeUuid(parentNep.nodeUuid());
+        obj.nodeEdgePointUuid(parentNep.nodeEdgePointUuid());
         return this;
     }
 }
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectionHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectionHandler.java
index 6e3b729..044e2c7 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectionHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectionHandler.java
@@ -19,15 +19,16 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.ConnectionEndPoint;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.DefaultConnectionEndPoint;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.DefaultLowerConnection;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.DefaultRoute;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.LowerConnection;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectionKeys;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.DefaultConnection;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connection.ConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connection.DefaultConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connection.DefaultLowerConnection;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connection.DefaultRoute;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connection.LowerConnection;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.ConnectionKeys;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.DefaultConnection;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context.augmentedtapicommoncontext.DefaultConnectivityContext;
 import org.onosproject.yang.model.DefaultModelObjectData;
 import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
@@ -61,7 +62,10 @@
 
     @Override
     public ModelObjectId getParentModelObjectId() {
-        return ModelObjectId.builder().addChild(DefaultContext.class).build();
+        return ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .addChild(DefaultConnectivityContext.class)
+                .build();
     }
 
     @Override
@@ -74,6 +78,7 @@
 
         ModelObjectId mId = ModelObjectId.builder()
                 .addChild(DefaultContext.class)
+                .addChild(DefaultConnectivityContext.class)
                 .addChild(DefaultConnection.class, key)
                 .build();
 
@@ -90,7 +95,7 @@
 
     public TapiConnectionHandler addLowerConnection(DefaultConnection connection) {
         DefaultLowerConnection lowerConnection = new DefaultLowerConnection();
-        lowerConnection.connectionId(connection.uuid());
+        lowerConnection.connectionUuid(connection.uuid());
         obj.addToLowerConnection(lowerConnection);
         return this;
     }
@@ -108,7 +113,7 @@
 
         try {
             return obj.lowerConnection().stream()
-                    .map(LowerConnection::connectionId)
+                    .map(LowerConnection::connectionUuid)
                     .map(id -> {
                         TapiConnectionHandler handler = new TapiConnectionHandler();
                         handler.setId(Uuid.fromString(id.toString()));
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectivityContextHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectivityContextHandler.java
new file mode 100644
index 0000000..a1084e9
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectivityContextHandler.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.tapi;
+
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context.DefaultAugmentedTapiCommonContext;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context.augmentedtapicommoncontext.DefaultConnectivityContext;
+import org.onosproject.yang.model.ModelObjectId;
+
+/**
+ * Utility class to deal with TAPI Augmented Connectivity Context with DCS.
+ */
+public final class TapiConnectivityContextHandler extends TapiObjectHandler<DefaultConnectivityContext> {
+
+    private TapiConnectivityContextHandler() {
+        obj = new DefaultConnectivityContext();
+    }
+
+    public static TapiConnectivityContextHandler create() {
+        return new TapiConnectivityContextHandler();
+    }
+
+    @Override
+    protected Uuid getIdDetail() {
+        // The target yang object of this class is container, so no need to handle Id.
+        return null;
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+        // The target yang object of this class is container, so no need to handle Id.
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        DefaultAugmentedTapiCommonContext context = new DefaultAugmentedTapiCommonContext();
+        context.connectivityContext(obj);
+
+        return ModelObjectId.builder()
+                .addChild(DefaultContext.class).build();
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectivityServiceHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectivityServiceHandler.java
index 89ac48e..c32558c 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectivityServiceHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectivityServiceHandler.java
@@ -16,12 +16,13 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectivityServiceKeys;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.DefaultConnectivityService;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivityservice.DefaultConnection;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivityservice.EndPoint;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.ConnectivityServiceKeys;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.DefaultConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivityservice.DefaultConnection;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivityservice.EndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context.augmentedtapicommoncontext.DefaultConnectivityContext;
 import org.onosproject.yang.model.DefaultModelObjectData;
 import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
@@ -55,7 +56,10 @@
 
     @Override
     public ModelObjectId getParentModelObjectId() {
-        return ModelObjectId.builder().addChild(DefaultContext.class).build();
+        return ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .addChild(DefaultConnectivityContext.class)
+                .build();
     }
 
     @Override
@@ -68,6 +72,7 @@
 
         ModelObjectId mId = ModelObjectId.builder()
                 .addChild(DefaultContext.class)
+                .addChild(DefaultConnectivityContext.class)
                 .addChild(DefaultConnectivityService.class, key)
                 .build();
 
@@ -84,7 +89,7 @@
 
     public TapiConnectivityServiceHandler addConnection(Uuid connectionUuid) {
         DefaultConnection connection = new DefaultConnection();
-        connection.connectionId(connectionUuid.toString());
+        connection.connectionUuid(connectionUuid.toString());
         obj.addToConnection(connection);
         return this;
     }
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextHandler.java
index ff8e24d..68e3978 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextHandler.java
@@ -19,11 +19,11 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.DefaultConnectivityService;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.context.DefaultAugmentedTapiCommonContext;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.DefaultConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context.DefaultAugmentedTapiCommonContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.DefaultTopology;
 import org.onosproject.yang.model.DefaultModelObjectData;
 import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
@@ -43,11 +43,13 @@
 
     @Override
     protected Uuid getIdDetail() {
+        // The target yang object of this class is container, so no need to handle Id.
         return null;
     }
 
     @Override
     protected void setIdDetail(Uuid uuid) {
+        // The target yang object of this class is container, so no need to handle Id.
     }
 
     @Override
@@ -74,7 +76,7 @@
 
         DefaultAugmentedTapiCommonContext augmentedContext = obj.augmentation(DefaultAugmentedTapiCommonContext.class);
         try {
-            return augmentedContext.connectivityService().stream()
+            return augmentedContext.connectivityContext().connectivityService().stream()
                     .map(connectivityService -> {
                         TapiConnectivityServiceHandler handler = TapiConnectivityServiceHandler.create();
                         handler.setModelObject((DefaultConnectivityService) connectivityService);
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityInputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityInputHandler.java
index 1a182b8..e58de7d 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityInputHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityInputHandler.java
@@ -19,9 +19,9 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.createconnectivityservice.CreateConnectivityServiceInput;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.createconnectivityservice.DefaultCreateConnectivityServiceInput;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.createconnectivityservice.createconnectivityserviceinput.EndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.createconnectivityservice.CreateConnectivityServiceInput;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.createconnectivityservice.DefaultCreateConnectivityServiceInput;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.createconnectivityservice.createconnectivityserviceinput.EndPoint;
 
 /**
  * Utility class to deal with TAPI RPC input with DCS.
@@ -39,7 +39,7 @@
 
     public List<String> getSips() {
         return getEndPoints().stream()
-                .map(ep -> ep.serviceInterfacePoint().serviceInterfacePointId().toString())
+                .map(ep -> ep.serviceInterfacePoint().serviceInterfacePointUuid().toString())
                 .collect(Collectors.toList());
     }
 
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityOutputHandler.java
index f503072..beb92b2 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityOutputHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityOutputHandler.java
@@ -16,9 +16,9 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectivityService;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.createconnectivityservice.DefaultCreateConnectivityServiceOutput;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.createconnectivityservice.createconnectivityserviceoutput.DefaultService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.ConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.createconnectivityservice.DefaultCreateConnectivityServiceOutput;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.createconnectivityservice.createconnectivityserviceoutput.DefaultService;
 
 /**
  * Utility class to deal with TAPI RPC output with DCS.
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityInputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityInputHandler.java
index 75d854e..256dea0 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityInputHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityInputHandler.java
@@ -17,8 +17,8 @@
 package org.onosproject.odtn.utils.tapi;
 
 import java.util.UUID;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.deleteconnectivityservice.DefaultDeleteConnectivityServiceInput;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.deleteconnectivityservice.DefaultDeleteConnectivityServiceInput;
 
 /**
  * Utility class to deal with TAPI RPC input with DCS.
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityOutputHandler.java
deleted file mode 100644
index 34186a4..0000000
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityOutputHandler.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * 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.odtn.utils.tapi;
-
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectivityService;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.deleteconnectivityservice.DefaultDeleteConnectivityServiceOutput;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.deleteconnectivityservice.deleteconnectivityserviceoutput.DefaultService;
-
-/**
- * Utility class to deal with TAPI RPC output with DCS.
- */
-public final class TapiDeleteConnectivityOutputHandler
-        extends TapiRpcOutputHandler<DefaultDeleteConnectivityServiceOutput> {
-
-    private TapiDeleteConnectivityOutputHandler() {
-        obj = new DefaultDeleteConnectivityServiceOutput();
-    }
-
-    public static TapiDeleteConnectivityOutputHandler create() {
-        return new TapiDeleteConnectivityOutputHandler();
-    }
-
-    public TapiDeleteConnectivityOutputHandler addService(ConnectivityService res) {
-        log.info("Output service: {}", res);
-        DefaultService rpcOutputService = new DefaultService();
-        rpcOutputService.uuid(res.uuid());
-        obj.service(rpcOutputService);
-        return this;
-    }
-
-}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsInputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsInputHandler.java
index ca01812..3af0594 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsInputHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsInputHandler.java
@@ -17,8 +17,8 @@
 package org.onosproject.odtn.utils.tapi;
 
 import java.util.UUID;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.getconnectivityservicedetails.DefaultGetConnectivityServiceDetailsInput;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.getconnectivityservicedetails.DefaultGetConnectivityServiceDetailsInput;
 
 /**
  * Utility class to deal with TAPI RPC input with DCS.
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsOutputHandler.java
index 1d7b02d..1495b41 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsOutputHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsOutputHandler.java
@@ -16,9 +16,9 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectivityService;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.getconnectivityservicedetails.DefaultGetConnectivityServiceDetailsOutput;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.getconnectivityservicedetails.getconnectivityservicedetailsoutput.DefaultService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.ConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.getconnectivityservicedetails.DefaultGetConnectivityServiceDetailsOutput;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.getconnectivityservicedetails.getconnectivityservicedetailsoutput.DefaultService;
 
 /**
  * Utility class to deal with TAPI RPC output with DCS.
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityListOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityListOutputHandler.java
index 99bc678..19b8a33 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityListOutputHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityListOutputHandler.java
@@ -16,9 +16,9 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectivityService;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.getconnectivityservicelist.DefaultGetConnectivityServiceListOutput;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.getconnectivityservicelist.getconnectivityservicelistoutput.DefaultService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.ConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.getconnectivityservicelist.DefaultGetConnectivityServiceListOutput;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.getconnectivityservicelist.getconnectivityservicelistoutput.DefaultService;
 
 /**
  * Utility class to deal with TAPI RPC output with DCS.
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetSipListOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetSipListOutputHandler.java
index 95143d6..8c9f8e5 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetSipListOutputHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetSipListOutputHandler.java
@@ -16,10 +16,10 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.getserviceinterfacepointlist.DefaultGetServiceInterfacePointListOutput;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.getserviceinterfacepointlist.getserviceinterfacepointlistoutput.DefaultSip;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.getserviceinterfacepointlist.getserviceinterfacepointlistoutput.Sip;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.getserviceinterfacepointlist.DefaultGetServiceInterfacePointListOutput;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.getserviceinterfacepointlist.getserviceinterfacepointlistoutput.DefaultSip;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.getserviceinterfacepointlist.getserviceinterfacepointlistoutput.Sip;
 
 /**
  * Utility class to deal with TAPI RPC output with DCS.
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java
index 016ea2c..ce5e7b5 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java
@@ -16,9 +16,9 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.DefaultName;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.Name;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.globalclass.DefaultName;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.globalclass.Name;
 import org.onosproject.yang.model.ModelObject;
 
 import java.lang.reflect.InvocationTargetException;
@@ -128,4 +128,4 @@
             log.error("Exception thrown", e);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkHandler.java
index 2af1cb1..88cb480 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkHandler.java
@@ -16,12 +16,13 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.link.DefaultNodeEdgePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultLink;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.TopologyKeys;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.augmentedtapicommoncontext.DefaultTopologyContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.link.DefaultNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topology.DefaultLink;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.TopologyKeys;
 import org.onosproject.yang.model.ModelObjectId;
 
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -62,6 +63,7 @@
         topologyKey.uuid(topologyUuid);
         return ModelObjectId.builder()
                 .addChild(DefaultContext.class)
+                .addChild(DefaultTopologyContext.class)
                 .addChild(DefaultTopology.class, topologyKey)
                 .build();
     }
@@ -73,9 +75,9 @@
 
     public TapiLinkHandler addNep(TapiNepRef nepRef) {
         DefaultNodeEdgePoint nep = new DefaultNodeEdgePoint();
-        nep.topologyId(nepRef.getTopologyId());
-        nep.nodeId(nepRef.getNodeId());
-        nep.ownedNodeEdgePointId(nepRef.getNepId());
+        nep.topologyUuid(nepRef.getTopologyId());
+        nep.nodeUuid(nepRef.getNodeId());
+        nep.nodeEdgePointUuid(nepRef.getNepId());
         obj.addToNodeEdgePoint(nep);
         return this;
     }
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLocalClassUtil.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLocalClassUtil.java
index 7ff0a2b..4a95eeb 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLocalClassUtil.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLocalClassUtil.java
@@ -20,8 +20,8 @@
 import java.lang.reflect.Method;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.DefaultName;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.Name;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.globalclass.DefaultName;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.globalclass.Name;
 import org.onosproject.yang.model.ModelObject;
 import org.slf4j.Logger;
 
@@ -125,4 +125,4 @@
             log.error("Exception thrown", e);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepHandler.java
index 2934b3e..32f7091 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepHandler.java
@@ -26,18 +26,20 @@
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
 
 import org.onosproject.net.Port;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
 
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.ceplist.DefaultConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.ceplist.DefaultConnectionEndPoint;
 
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.context.topology.node.ownednodeedgepoint.DefaultAugmentedTapiTopologyOwnedNodeEdgePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.DefaultOwnedNodeEdgePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.nodeedgepoint.DefaultMappedServiceInterfacePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultNode;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.NodeKeys;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.TopologyKeys;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context.topologycontext.topology.node.ownednodeedgepoint.DefaultAugmentedTapiTopologyOwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context.topologycontext.topology.node.ownednodeedgepoint.augmentedtapitopologyownednodeedgepoint.DefaultCepList;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.augmentedtapicommoncontext.DefaultTopologyContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.node.DefaultOwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.nodeedgepoint.DefaultMappedServiceInterfacePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topology.DefaultNode;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topology.NodeKeys;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.TopologyKeys;
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
@@ -80,6 +82,7 @@
 
         return ModelObjectId.builder()
                 .addChild(DefaultContext.class)
+                .addChild(DefaultTopologyContext.class)
                 .addChild(DefaultTopology.class, topologyKey)
                 .addChild(DefaultNode.class, nodeKey)
                 .build();
@@ -111,16 +114,21 @@
 
     public TapiNepHandler addSip(Uuid sipUuid) {
         DefaultMappedServiceInterfacePoint mappedSip = new DefaultMappedServiceInterfacePoint();
-        mappedSip.serviceInterfacePointId(sipUuid);
+        mappedSip.serviceInterfacePointUuid(sipUuid);
         obj.addToMappedServiceInterfacePoint(mappedSip);
         return this;
     }
 
     public TapiNepHandler addCep(DefaultConnectionEndPoint cep) {
+
+        DefaultCepList cepList = new DefaultCepList();
+        cepList.addToConnectionEndPoint(cep);
+
         DefaultAugmentedTapiTopologyOwnedNodeEdgePoint augmentNep =
                 new DefaultAugmentedTapiTopologyOwnedNodeEdgePoint();
-        augmentNep.addToConnectionEndPoint(cep);
+        augmentNep.cepList(cepList);
         obj.addAugmentation(augmentNep);
+
         return this;
     }
 
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeHandler.java
index 1d897ad..9928f14 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeHandler.java
@@ -25,12 +25,13 @@
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
 
 import org.onosproject.net.DeviceId;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.OwnedNodeEdgePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultNode;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.TopologyKeys;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.augmentedtapicommoncontext.DefaultTopologyContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.node.OwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topology.DefaultNode;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.TopologyKeys;
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
@@ -67,6 +68,7 @@
         topologyKey.uuid(topologyUuid);
         return ModelObjectId.builder()
                 .addChild(DefaultContext.class)
+                .addChild(DefaultTopologyContext.class)
                 .addChild(DefaultTopology.class, topologyKey)
                 .build();
     }
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java
index 71cd256..465cd34 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java
@@ -112,4 +112,4 @@
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiObjectHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiObjectHandler.java
index 4acaf47..040982f 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiObjectHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiObjectHandler.java
@@ -23,7 +23,7 @@
 import org.onosproject.config.DynamicConfigService;
 import org.onosproject.config.FailedException;
 import org.onosproject.config.Filter;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.DefaultModelObjectData;
 import org.onosproject.yang.model.DefaultResourceData;
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRouteHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRouteHandler.java
index 7482979..3d7c964 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRouteHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRouteHandler.java
@@ -16,13 +16,14 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.DefaultRoute;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectionKeys;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.DefaultConnection;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.route.ConnectionEndPoint;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.route.DefaultConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connection.DefaultRoute;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.ConnectionKeys;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.DefaultConnection;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context.augmentedtapicommoncontext.DefaultConnectivityContext;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.route.ConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.route.DefaultConnectionEndPoint;
 import org.onosproject.yang.model.ModelObjectId;
 
 import static org.onosproject.odtn.utils.tapi.TapiLocalClassUtil.getLocalId;
@@ -61,16 +62,17 @@
 
         return ModelObjectId.builder()
                 .addChild(DefaultContext.class)
+                .addChild(DefaultConnectivityContext.class)
                 .addChild(DefaultConnection.class, connectionKeys)
                 .build();
     }
 
     public TapiRouteHandler addCep(TapiCepRef cepRef) {
         DefaultConnectionEndPoint cep = new DefaultConnectionEndPoint();
-        cep.topologyId(cepRef.getTopologyId());
-        cep.nodeId(cepRef.getNodeId());
-        cep.ownedNodeEdgePointId(cepRef.getNepId());
-        cep.connectionEndPointId(cepRef.getCepId());
+        cep.topologyUuid(cepRef.getTopologyId());
+        cep.nodeUuid(cepRef.getNodeId());
+        cep.nodeEdgePointUuid(cepRef.getNepId());
+        cep.connectionEndPointUuid(cepRef.getCepId());
 
         obj.addToConnectionEndPoint(cep);
         return this;
@@ -78,14 +80,14 @@
 
     public TapiCepRef getRouteStart() {
         ConnectionEndPoint cep = obj.connectionEndPoint().get(0);
-        return TapiCepRef.create(cep.topologyId().toString(), cep.nodeId().toString(),
-                cep.ownedNodeEdgePointId().toString(), cep.connectionEndPointId().toString());
+        return TapiCepRef.create(cep.topologyUuid().toString(), cep.nodeUuid().toString(),
+                cep.nodeEdgePointUuid().toString(), cep.connectionEndPointUuid().toString());
     }
 
     public TapiCepRef getRouteEnd() {
         ConnectionEndPoint cep = obj.connectionEndPoint().get(obj.connectionEndPoint().size() - 1);
-        return TapiCepRef.create(cep.topologyId().toString(), cep.nodeId().toString(),
-                cep.ownedNodeEdgePointId().toString(), cep.connectionEndPointId().toString());
+        return TapiCepRef.create(cep.topologyUuid().toString(), cep.nodeUuid().toString(),
+                cep.nodeEdgePointUuid().toString(), cep.connectionEndPointUuid().toString());
     }
 
     public TapiRouteHandler setConnectionId(Uuid connectionId) {
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcInputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcInputHandler.java
index 9112f34..d034f3e 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcInputHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcInputHandler.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
 import org.onosproject.yang.model.ModelObject;
 import org.onosproject.yang.model.ModelObjectId;
 import org.onosproject.yang.model.RpcInput;
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcOutputHandler.java
index aa2c890..aaf48aa 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcOutputHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcOutputHandler.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
 import org.onosproject.yang.model.ModelObject;
 import org.onosproject.yang.model.ModelObjectId;
 
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSepHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSepHandler.java
index 35e01e0..ef80b82 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSepHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSepHandler.java
@@ -16,9 +16,9 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivityservice.DefaultEndPoint;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivityserviceendpoint.DefaultServiceInterfacePoint;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivityservice.DefaultEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivityserviceendpoint.DefaultServiceInterfacePoint;
 import org.onosproject.yang.model.ModelObjectId;
 
 import static org.onosproject.odtn.utils.tapi.TapiLocalClassUtil.getLocalId;
@@ -55,7 +55,7 @@
 
     public TapiSepHandler setSip(String sipId) {
         DefaultServiceInterfacePoint sip = new DefaultServiceInterfacePoint();
-        sip.serviceInterfacePointId(sipId);
+        sip.serviceInterfacePointUuid(sipId);
         obj.serviceInterfacePoint(sip);
         return this;
     }
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipHandler.java
index 34b3896..367122e 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipHandler.java
@@ -22,16 +22,16 @@
 
 import org.onosproject.net.Port;
 import org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.LayerProtocolName;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.LayerProtocolName;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
 
 import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.PORT_TYPE;
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.addNameList;
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.getUuid;
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
-import static org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.layerprotocolname.LayerProtocolNameEnum.DSR;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.tapicontext.DefaultServiceInterfacePoint;
+import static org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.layerprotocolname.LayerProtocolNameEnum.DSR;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.tapicontext.DefaultServiceInterfacePoint;
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
@@ -90,7 +90,7 @@
         Map<String, String> kvs = new HashMap<>();
         kvs.put(ONOS_CP, cp.toString());
         addNameList(obj, kvs);
-        obj.addToLayerProtocolName(LayerProtocolName.of(DSR));
+        obj.layerProtocolName(LayerProtocolName.of(DSR));
         return this;
     }
 
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyContextHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyContextHandler.java
new file mode 100644
index 0000000..30d7e09
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyContextHandler.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.utils.tapi;
+
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.DefaultAugmentedTapiCommonContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.augmentedtapicommoncontext.DefaultTopologyContext;
+import org.onosproject.yang.model.ModelObjectId;
+
+/**
+ * Utility class to deal with TAPI Augmented Topology Context with DCS.
+ */
+public final class TapiTopologyContextHandler extends TapiObjectHandler<DefaultTopologyContext> {
+
+    private TapiTopologyContextHandler() {
+        obj = new DefaultTopologyContext();
+    }
+
+    public static TapiTopologyContextHandler create() {
+        return new TapiTopologyContextHandler();
+    }
+
+    @Override
+    protected Uuid getIdDetail() {
+        // The target yang object of this class is container, so no need to handle Id.
+        return null;
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+        // The target yang object of this class is container, so no need to handle Id.
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        DefaultAugmentedTapiCommonContext context = new DefaultAugmentedTapiCommonContext();
+        context.topologyContext(obj);
+
+        return ModelObjectId.builder()
+                .addChild(DefaultContext.class).build();
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyHandler.java
index 2d81e80..6ef0417 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyHandler.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyHandler.java
@@ -19,10 +19,10 @@
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.getUuid;
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.context.DefaultAugmentedTapiCommonContext;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.augmentedtapicommoncontext.DefaultTopologyContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.DefaultTopology;
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
@@ -51,9 +51,10 @@
 
     @Override
     public ModelObjectId getParentModelObjectId() {
-        DefaultAugmentedTapiCommonContext topologyContext = new DefaultAugmentedTapiCommonContext();
-        topologyContext.addToTopology(obj);
 
-        return ModelObjectId.builder().addChild(DefaultContext.class).build();
+        return ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .addChild(DefaultTopologyContext.class)
+                .build();
     }
 }
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/package-info.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/package-info.java
index 8d71ec1..fcb1c29 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/package-info.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/package-info.java
@@ -17,4 +17,4 @@
 /**
  * Utilities to deal with onos-yang-tools TAPI objects.
  */
-package org.onosproject.odtn.utils.tapi;
\ No newline at end of file
+package org.onosproject.odtn.utils.tapi;
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnDcsModelCheckCommand.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnDcsModelCheckCommand.java
index feb12e4..bf7db2f 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnDcsModelCheckCommand.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnDcsModelCheckCommand.java
@@ -27,7 +27,7 @@
 import static org.onosproject.odtn.utils.YangToolUtil.toCompositeData;
 import static org.onosproject.odtn.utils.YangToolUtil.toResourceData;
 import static org.onosproject.odtn.utils.YangToolUtil.toXmlCompositeStream;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.DefaultModelObjectData;
 import org.onosproject.yang.model.InnerModelObject;
@@ -76,4 +76,4 @@
         CharSequence strNode = toCharSequence(toXmlCompositeStream(toCompositeData(toResourceData(empty, all))));
         printlog("XML:\n{}", XmlString.prettifyXml(strNode));
     }
-}
\ No newline at end of file
+}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnTapiHandlersTestCommand.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnTapiHandlersTestCommand.java
new file mode 100644
index 0000000..72d1a54
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnTapiHandlersTestCommand.java
@@ -0,0 +1,287 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.odtn.cli.impl;
+
+import org.apache.karaf.shell.api.action.Command;
+import org.onlab.util.XmlString;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.config.DynamicConfigService;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.odtn.utils.tapi.TapiCepHandler;
+import org.onosproject.odtn.utils.tapi.TapiCepRefHandler;
+import org.onosproject.odtn.utils.tapi.TapiConnectionHandler;
+import org.onosproject.odtn.utils.tapi.TapiConnectivityContextHandler;
+import org.onosproject.odtn.utils.tapi.TapiConnectivityServiceHandler;
+import org.onosproject.odtn.utils.tapi.TapiContextHandler;
+import org.onosproject.odtn.utils.tapi.TapiNepHandler;
+import org.onosproject.odtn.utils.tapi.TapiNodeHandler;
+import org.onosproject.odtn.utils.tapi.TapiSepHandler;
+import org.onosproject.odtn.utils.tapi.TapiSipHandler;
+import org.onosproject.odtn.utils.tapi.TapiTopologyContextHandler;
+import org.onosproject.odtn.utils.tapi.TapiTopologyHandler;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.tapicontext.DefaultServiceInterfacePoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.DefaultConnection;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.DefaultConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivityservice.DefaultEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context.augmentedtapicommoncontext.DefaultConnectivityContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.augmentedtapicommoncontext.DefaultTopologyContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.node.DefaultOwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topology.DefaultNode;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.model.Augmentable;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.ResourceId;
+import org.slf4j.Logger;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.regex.Pattern;
+
+import static org.onosproject.odtn.utils.YangToolUtil.*;
+import static org.slf4j.LoggerFactory.getLogger;
+
+@Command(scope = "onos", name = "odtn-tapi-handlers-test")
+public class OdtnTapiHandlersTestCommand extends AbstractShellCommand {
+
+    private static final Logger log = getLogger(OdtnDcsModelCheckCommand.class);
+    private DynamicConfigService dcs;
+    private ModelConverter modelConverter;
+    private TapiContextHandler contextHandler;
+
+    @Override
+    public void doExecute() {
+        dcs = get(DynamicConfigService.class);
+        modelConverter = get(ModelConverter.class);
+
+        setupTapiContext();
+        DataNode data = contextHandler.getDataNode();
+
+        ResourceId empty = ResourceId.builder().build();
+        CharSequence strNode = toCharSequence(toXmlCompositeStream(toCompositeData(toResourceData(empty, data))));
+        StringBuilder exp = loadXml("/test-tapi-context.xml");
+
+        if (XmlString.prettifyXml(strNode).toString().contentEquals(exp)) {
+            log.info("result: ok");
+        } else {
+            log.info("result: failed");
+        }
+    }
+
+    private void printlog(String format, Object... objs) {
+        print(format.replaceAll(Pattern.quote("{}"), "%s"), objs);
+        log.info(format, objs);
+    }
+
+    private static StringBuilder loadXml(final String fileName) {
+
+        InputStream inputStream = OdtnTapiHandlersTestCommand.class.getResourceAsStream(fileName);
+        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+        StringBuilder result = new StringBuilder();
+        try {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                result.append(line).append("\n");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    private void setupTapiContext() {
+
+        DeviceId did1 = DeviceId.deviceId("netconf:127.0.0.1:11001");
+        DeviceId did2 = DeviceId.deviceId("netconf:127.0.0.1:11002");
+
+        ConnectPoint cp11 = new ConnectPoint(did1, PortNumber.portNumber(1, "TRANSCEIVER"));
+        ConnectPoint cp12 = new ConnectPoint(did1, PortNumber.portNumber(2, "TRANSCEIVER"));
+        ConnectPoint cp21 = new ConnectPoint(did2, PortNumber.portNumber(1, "TRANSCEIVER"));
+        ConnectPoint cp22 = new ConnectPoint(did2, PortNumber.portNumber(2, "TRANSCEIVER"));
+
+        // context
+        contextHandler = TapiContextHandler.create();
+        DefaultContext context = contextHandler.getModelObject();
+
+        // context augmentation
+        Augmentable augmentableContext = context;
+
+        // context augmentation with topologyContext
+        org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context
+                .DefaultAugmentedTapiCommonContext augmentedTopologyContext
+                = new org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology
+                .context.DefaultAugmentedTapiCommonContext();
+        augmentableContext.addAugmentation(augmentedTopologyContext);
+
+        // context augmentation with connectivityServiceContext
+        org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context
+                .DefaultAugmentedTapiCommonContext augmentedConnectivityContext
+                = new org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity
+                .context.DefaultAugmentedTapiCommonContext();
+        augmentableContext.addAugmentation(augmentedConnectivityContext);
+
+        // topology context
+        DefaultTopologyContext topologyContext = TapiTopologyContextHandler.create().getModelObject();
+        augmentedTopologyContext.topologyContext(topologyContext);
+
+        // topology
+        TapiTopologyHandler topologyHandler = TapiTopologyHandler.create();
+        topologyHandler.setId(Uuid.of("00000000-0000-0000-0000-000000000001"));
+        DefaultTopology topology = topologyHandler.getModelObject();
+        topologyContext.addToTopology(topology);
+
+        // nodes
+        TapiNodeHandler nodeHandler1 = TapiNodeHandler.create();
+        nodeHandler1.setId(Uuid.of("00000000-0000-0000-0001-000000000001"));
+        DefaultNode node1 = nodeHandler1.setTopologyUuid(topology.uuid())
+                .setDeviceId(did1)
+                .getModelObject();
+        topology.addToNode(node1);
+
+        TapiNodeHandler nodeHandler2 = TapiNodeHandler.create();
+        nodeHandler2.setId(Uuid.of("00000000-0000-0000-0001-000000000002"));
+        DefaultNode node2 = nodeHandler2.setTopologyUuid(topology.uuid())
+                .setDeviceId(did2)
+                .getModelObject();
+        topology.addToNode(node2);
+
+        // sips
+        TapiSipHandler sipHandler1 = TapiSipHandler.create();
+        sipHandler1.setId(Uuid.of("00000000-0000-0000-0002-000000000001"));
+        DefaultServiceInterfacePoint sip1 = sipHandler1.setConnectPoint(cp11)
+                .getModelObject();
+        context.addToServiceInterfacePoint(sip1);
+
+        TapiSipHandler sipHandler2 = TapiSipHandler.create();
+        sipHandler2.setId(Uuid.of("00000000-0000-0000-0002-000000000002"));
+        DefaultServiceInterfacePoint sip2 = sipHandler2.setConnectPoint(cp21)
+                .getModelObject();
+        context.addToServiceInterfacePoint(sip2);
+
+        // neps
+        TapiNepHandler nepHandler11 = TapiNepHandler.create();
+        nepHandler11.setId(Uuid.of("00000000-0000-0000-0003-000000000011"));
+        DefaultOwnedNodeEdgePoint nep11 = nepHandler11
+                .setTopologyUuid(topology.uuid())
+                .setNodeUuid(node1.uuid())
+                .setConnectPoint(cp11)
+                .addSip(sip1.uuid())
+                .getModelObject();
+        nodeHandler1.addNep(nep11);
+
+        TapiNepHandler nepHandler12 = TapiNepHandler.create();
+        nepHandler12.setId(Uuid.of("00000000-0000-0000-0003-000000000012"));
+        DefaultOwnedNodeEdgePoint nep12 = nepHandler12
+                .setTopologyUuid(topology.uuid())
+                .setNodeUuid(node1.uuid())
+                .setConnectPoint(cp12)
+                .getModelObject();
+        nodeHandler1.addNep(nep12);
+
+        TapiNepHandler nepHandler21 = TapiNepHandler.create();
+        nepHandler21.setId(Uuid.of("00000000-0000-0000-0003-000000000021"));
+        DefaultOwnedNodeEdgePoint nep21 = nepHandler21
+                .setTopologyUuid(topology.uuid())
+                .setNodeUuid(node2.uuid())
+                .setConnectPoint(cp21)
+                .addSip(sip2.uuid())
+                .getModelObject();
+        nodeHandler2.addNep(nep21);
+
+        TapiNepHandler nepHandler22 = TapiNepHandler.create();
+        nepHandler22.setId(Uuid.of("00000000-0000-0000-0003-000000000022"));
+        DefaultOwnedNodeEdgePoint nep22 = nepHandler22
+                .setTopologyUuid(topology.uuid())
+                .setNodeUuid(node2.uuid())
+                .setConnectPoint(cp22)
+                .getModelObject();
+        nodeHandler2.addNep(nep22);
+
+        // connectivity context
+        DefaultConnectivityContext connectivityContext = TapiConnectivityContextHandler.create().getModelObject();
+        augmentedConnectivityContext.connectivityContext(connectivityContext);
+
+        // connectivityService
+        TapiConnectivityServiceHandler connectivityServiceHandler = TapiConnectivityServiceHandler.create();
+        connectivityServiceHandler.setId(Uuid.of("00000000-0000-0000-0004-000000000001"));
+        DefaultConnectivityService connectivityService = connectivityServiceHandler.getModelObject();
+        connectivityContext.addToConnectivityService(connectivityService);
+
+        // connection
+        TapiConnectionHandler connectionHandler = TapiConnectionHandler.create();
+        connectionHandler.setId(Uuid.of("00000000-0000-0000-0005-000000000001"));
+        DefaultConnection connection1 = connectionHandler.getModelObject();
+        connectivityServiceHandler.addConnection(connection1.uuid());
+        connectivityContext.addToConnection(connection1);
+
+
+        // seps
+        TapiSepHandler sepHandler1 = TapiSepHandler.create();
+        sepHandler1.setId(Uuid.of("00000000-0000-0000-0006-000000000001"));
+        DefaultEndPoint sep1 = sepHandler1.getModelObject();
+        connectivityServiceHandler.addSep(sep1);
+
+        TapiSepHandler sepHandler2 = TapiSepHandler.create();
+        sepHandler2.setId(Uuid.of("00000000-0000-0000-0006-000000000002"));
+        DefaultEndPoint sep2 = sepHandler2.getModelObject();
+        connectivityServiceHandler.addSep(sep2);
+
+        // ceps
+        TapiCepHandler cepHandler11 = TapiCepHandler.create();
+        cepHandler11.setId(Uuid.of("00000000-0000-0000-0007-000000000011"));
+        org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity
+                .ceplist.DefaultConnectionEndPoint
+                cep11 = cepHandler11
+                .setTopologyUuid(topology.uuid())
+                .setNodeUuid(node1.uuid())
+                .setNepUuid(nep11.uuid())
+                .setParentNep()
+                .getModelObject();
+        nepHandler11.addCep(cep11);
+        org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity
+                .connection.DefaultConnectionEndPoint
+                cepRef11 = TapiCepRefHandler.create()
+                .setCep(cep11)
+                .getModelObject();
+        connectionHandler.addCep(cepRef11);
+
+        TapiCepHandler cepHandler21 = TapiCepHandler.create();
+        cepHandler21.setId(Uuid.of("00000000-0000-0000-0007-000000000021"));
+        org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity
+                .ceplist.DefaultConnectionEndPoint
+                cep21 = cepHandler21
+                .setTopologyUuid(topology.uuid())
+                .setNodeUuid(node1.uuid())
+                .setNepUuid(nep21.uuid())
+                .setParentNep()
+                .getModelObject();
+        nepHandler21.addCep(cep21);
+        org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity
+                .connection.DefaultConnectionEndPoint
+                cepRef21 = TapiCepRefHandler.create()
+                .setCep(cep21)
+                .getModelObject();
+        connectionHandler.addCep(cepRef21);
+
+    }
+}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiCommonRpc.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiCommonRpc.java
index 315e10c..0d42ca0 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiCommonRpc.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiCommonRpc.java
@@ -19,8 +19,8 @@
 import org.onosproject.config.DynamicConfigService;
 import org.onosproject.odtn.TapiResolver;
 import org.onosproject.odtn.utils.tapi.TapiGetSipListOutputHandler;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.TapiCommonService;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.TapiCommonService;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
 import org.onosproject.yang.model.ModelConverter;
 import org.onosproject.yang.model.RpcInput;
 import org.onosproject.yang.model.RpcOutput;
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectivityRpc.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectivityRpc.java
index 2598781..a55c16b 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectivityRpc.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectivityRpc.java
@@ -27,16 +27,15 @@
 import org.onosproject.odtn.utils.tapi.TapiCreateConnectivityInputHandler;
 import org.onosproject.odtn.utils.tapi.TapiCreateConnectivityOutputHandler;
 import org.onosproject.odtn.utils.tapi.TapiDeleteConnectivityInputHandler;
-import org.onosproject.odtn.utils.tapi.TapiDeleteConnectivityOutputHandler;
 import org.onosproject.odtn.utils.tapi.TapiGetConnectivityDetailsInputHandler;
 import org.onosproject.odtn.utils.tapi.TapiGetConnectivityDetailsOutputHandler;
 import org.onosproject.odtn.utils.tapi.TapiGetConnectivityListOutputHandler;
 import org.onosproject.odtn.utils.tapi.TapiNepRef;
 import org.onosproject.odtn.utils.tapi.TapiObjectHandler;
 import org.onosproject.odtn.utils.tapi.TapiSepHandler;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.TapiConnectivityService;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.DefaultConnectivityService;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.TapiConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.connectivitycontext.DefaultConnectivityService;
 import org.onosproject.yang.model.ModelConverter;
 import org.onosproject.yang.model.RpcInput;
 import org.onosproject.yang.model.RpcOutput;
@@ -139,17 +138,14 @@
 
             service.connection().stream().forEach(connection -> {
                 TapiConnectionHandler connectionHandler = TapiConnectionHandler.create();
-                connectionHandler.setId(Uuid.fromString(connection.connectionId().toString()));
+                connectionHandler.setId(Uuid.fromString(connection.connectionUuid().toString()));
                 DcsBasedTapiConnectionManager manager = DcsBasedTapiConnectionManager.create();
                 manager.deleteConnection(connectionHandler);
                 manager.apply();
             });
             serviceHandler.remove();
 
-            TapiDeleteConnectivityOutputHandler output = TapiDeleteConnectivityOutputHandler.create()
-                    .addService(serviceHandler.getModelObject());
-
-            return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, output.getDataNode());
+            return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, null);
         } catch (Throwable e) {
             log.error("Error:", e);
             return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java
index 4adc3d2..40e606a 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java
@@ -30,11 +30,11 @@
 import org.onosproject.odtn.utils.tapi.DcsBasedTapiObjectRefFactory;
 import org.onosproject.odtn.utils.tapi.TapiNepRef;
 import org.onosproject.odtn.utils.tapi.TapiNodeRef;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.Name;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.context.topology.node.ownednodeedgepoint.DefaultAugmentedTapiTopologyOwnedNodeEdgePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.context.DefaultAugmentedTapiCommonContext;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.globalclass.Name;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.tapiconnectivity.context.topologycontext.topology.node.ownednodeedgepoint.DefaultAugmentedTapiTopologyOwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.DefaultAugmentedTapiCommonContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.Topology;
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.DefaultModelObjectData;
 import org.onosproject.yang.model.DefaultResourceData;
@@ -114,7 +114,7 @@
     private List<TapiNodeRef> getNodes(DefaultContext context) {
         DefaultAugmentedTapiCommonContext topologyContext
                 = context.augmentation(DefaultAugmentedTapiCommonContext.class);
-        Topology topology = topologyContext.topology().get(0);
+        Topology topology = topologyContext.topologyContext().topology().get(0);
 
         if (topology.node() == null) {
             return Collections.emptyList();
@@ -142,7 +142,7 @@
     private List<TapiNepRef> getNeps(DefaultContext context) {
         DefaultAugmentedTapiCommonContext topologyContext
                 = context.augmentation(DefaultAugmentedTapiCommonContext.class);
-        Topology topology = topologyContext.topology().get(0);
+        Topology topology = topologyContext.topologyContext().topology().get(0);
 
         if (topology.node() == null) {
             return Collections.emptyList();
@@ -169,15 +169,15 @@
                                         if (nep.mappedServiceInterfacePoint() != null) {
                                             nep.mappedServiceInterfacePoint().stream()
                                                     .forEach(sip -> {
-                                                        nepRef.setSipId(sip.serviceInterfacePointId().toString());
+                                                        nepRef.setSipId(sip.serviceInterfacePointUuid().toString());
                                                     });
                                         }
 
                                         DefaultAugmentedTapiTopologyOwnedNodeEdgePoint augmentNep =
                                                 nep.augmentation(DefaultAugmentedTapiTopologyOwnedNodeEdgePoint.class);
                                         try {
-                                            if (augmentNep.connectionEndPoint() != null) {
-                                                List<String> cepIds = augmentNep.connectionEndPoint().stream()
+                                            if (augmentNep.cepList().connectionEndPoint() != null) {
+                                                List<String> cepIds = augmentNep.cepList().connectionEndPoint().stream()
                                                         .map(cep -> cep.uuid().toString()).collect(Collectors.toList());
                                                 nepRef.setCepIds(cepIds);
                                             }
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
index 585e282..c5fd719 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
@@ -24,6 +24,7 @@
 import org.onosproject.net.Port;
 import org.onosproject.odtn.TapiResolver;
 import org.onosproject.odtn.TapiTopologyManager;
+import org.onosproject.odtn.utils.tapi.TapiConnectivityContextHandler;
 import org.onosproject.odtn.utils.tapi.TapiCepHandler;
 import org.onosproject.odtn.utils.tapi.TapiContextHandler;
 import org.onosproject.odtn.utils.tapi.TapiLinkHandler;
@@ -32,10 +33,11 @@
 import org.onosproject.odtn.utils.tapi.TapiNodeHandler;
 import org.onosproject.odtn.utils.tapi.TapiNodeRef;
 import org.onosproject.odtn.utils.tapi.TapiSipHandler;
+import org.onosproject.odtn.utils.tapi.TapiTopologyContextHandler;
 import org.onosproject.odtn.utils.tapi.TapiTopologyHandler;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.DefaultTopology;
 import org.onosproject.yang.model.ModelConverter;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -70,6 +72,7 @@
     public void activate() {
         initDcsTapiContext();
         initDcsTapiTopology();
+        initDcsTapiConnectivityContext();
         log.info("Started");
     }
 
@@ -167,13 +170,26 @@
     }
 
     /**
-     * Add Tapi Topology to Dcs store.
+     * Add Tapi TopologyContext and Topology to Dcs store.
      *
      * Assumed there is only one topology for ODTN Phase 1.0
      */
     private void initDcsTapiTopology() {
+        TapiTopologyContextHandler topologyContextHandler = TapiTopologyContextHandler.create();
+        topologyContextHandler.add();
         TapiTopologyHandler topologyHandler = TapiTopologyHandler.create();
-        topology = topologyHandler.getModelObject();
         topologyHandler.add();
+        topology = topologyHandler.getModelObject();
     }
+
+    /**
+     * Add Tapi ConnectivityContext to Dcs store.
+     *
+     * Assumed there is only one topology for ODTN Phase 1.0
+     */
+    private void initDcsTapiConnectivityContext() {
+        TapiConnectivityContextHandler connectivityContextHandler = TapiConnectivityContextHandler.create();
+        connectivityContextHandler.add();
+    }
+
 }
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/package-info.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/package-info.java
index b75ad48..9dc4dad 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/package-info.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/package-info.java
@@ -17,4 +17,4 @@
 /**
  * Package to place ODTN internal implementations.
  */
-package org.onosproject.odtn.internal;
\ No newline at end of file
+package org.onosproject.odtn.internal;
diff --git a/apps/odtn/service/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/odtn/service/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index a2c2c6e..953a71e 100644
--- a/apps/odtn/service/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/apps/odtn/service/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -34,6 +34,10 @@
             <action class="org.onosproject.odtn.cli.impl.OdtnDcsModelCheckCommand"/>
         </command>
 
+        <command>
+            <action class="org.onosproject.odtn.cli.impl.OdtnTapiHandlersTestCommand"/>
+        </command>
+
     </command-bundle>
 
     <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
diff --git a/apps/odtn/service/src/main/resources/test-tapi-context.xml b/apps/odtn/service/src/main/resources/test-tapi-context.xml
new file mode 100644
index 0000000..b56f488
--- /dev/null
+++ b/apps/odtn/service/src/main/resources/test-tapi-context.xml
@@ -0,0 +1,120 @@
+<context xmlns="urn:onf:otcc:yang:tapi-common">
+  <topology-context xmlns="urn:onf:otcc:yang:tapi-topology">
+    <topology>
+      <uuid>00000000-0000-0000-0000-000000000001</uuid>
+      <node>
+        <uuid>00000000-0000-0000-0001-000000000001</uuid>
+        <owned-node-edge-point>
+          <uuid>00000000-0000-0000-0003-000000000011</uuid>
+          <cep-list xmlns="urn:onf:otcc:yang:tapi-connectivity">
+            <connection-end-point>
+              <uuid>00000000-0000-0000-0007-000000000011</uuid>
+              <parent-node-edge-point>
+                <node-edge-point-uuid>00000000-0000-0000-0003-000000000011</node-edge-point-uuid>
+                <node-uuid>00000000-0000-0000-0001-000000000001</node-uuid>
+                <topology-uuid>00000000-0000-0000-0000-000000000001</topology-uuid>
+              </parent-node-edge-point>
+            </connection-end-point>
+          </cep-list>
+          <mapped-service-interface-point>
+            <service-interface-point-uuid>00000000-0000-0000-0002-000000000001</service-interface-point-uuid>
+          </mapped-service-interface-point>
+          <name>
+            <value-name>onos-cp</value-name>
+            <value>netconf:127.0.0.1:11001/[TRANSCEIVER](1)</value>
+          </name>
+        </owned-node-edge-point>
+        <owned-node-edge-point>
+          <uuid>00000000-0000-0000-0003-000000000012</uuid>
+          <name>
+            <value-name>onos-cp</value-name>
+            <value>netconf:127.0.0.1:11001/[TRANSCEIVER](2)</value>
+          </name>
+        </owned-node-edge-point>
+        <name>
+          <value-name>device-id</value-name>
+          <value>netconf:127.0.0.1:11001</value>
+        </name>
+      </node>
+      <node>
+        <uuid>00000000-0000-0000-0001-000000000002</uuid>
+        <owned-node-edge-point>
+          <uuid>00000000-0000-0000-0003-000000000021</uuid>
+          <cep-list xmlns="urn:onf:otcc:yang:tapi-connectivity">
+            <connection-end-point>
+              <uuid>00000000-0000-0000-0007-000000000021</uuid>
+              <parent-node-edge-point>
+                <node-edge-point-uuid>00000000-0000-0000-0003-000000000021</node-edge-point-uuid>
+                <node-uuid>00000000-0000-0000-0001-000000000001</node-uuid>
+                <topology-uuid>00000000-0000-0000-0000-000000000001</topology-uuid>
+              </parent-node-edge-point>
+            </connection-end-point>
+          </cep-list>
+          <mapped-service-interface-point>
+            <service-interface-point-uuid>00000000-0000-0000-0002-000000000002</service-interface-point-uuid>
+          </mapped-service-interface-point>
+          <name>
+            <value-name>onos-cp</value-name>
+            <value>netconf:127.0.0.1:11002/[TRANSCEIVER](1)</value>
+          </name>
+        </owned-node-edge-point>
+        <owned-node-edge-point>
+          <uuid>00000000-0000-0000-0003-000000000022</uuid>
+          <name>
+            <value-name>onos-cp</value-name>
+            <value>netconf:127.0.0.1:11002/[TRANSCEIVER](2)</value>
+          </name>
+        </owned-node-edge-point>
+        <name>
+          <value-name>device-id</value-name>
+          <value>netconf:127.0.0.1:11002</value>
+        </name>
+      </node>
+    </topology>
+  </topology-context>
+  <connectivity-context xmlns="urn:onf:otcc:yang:tapi-connectivity">
+    <connectivity-service>
+      <uuid>00000000-0000-0000-0004-000000000001</uuid>
+      <end-point>
+        <local-id>00000000-0000-0000-0006-000000000001</local-id>
+      </end-point>
+      <end-point>
+        <local-id>00000000-0000-0000-0006-000000000002</local-id>
+      </end-point>
+      <connection>
+        <connection-uuid>00000000-0000-0000-0005-000000000001</connection-uuid>
+      </connection>
+    </connectivity-service>
+    <connection>
+      <uuid>00000000-0000-0000-0005-000000000001</uuid>
+      <connection-end-point>
+        <connection-end-point-uuid>00000000-0000-0000-0007-000000000011</connection-end-point-uuid>
+        <node-edge-point-uuid>00000000-0000-0000-0003-000000000011</node-edge-point-uuid>
+        <node-uuid>00000000-0000-0000-0001-000000000001</node-uuid>
+        <topology-uuid>00000000-0000-0000-0000-000000000001</topology-uuid>
+      </connection-end-point>
+      <connection-end-point>
+        <connection-end-point-uuid>00000000-0000-0000-0007-000000000021</connection-end-point-uuid>
+        <node-edge-point-uuid>00000000-0000-0000-0003-000000000021</node-edge-point-uuid>
+        <node-uuid>00000000-0000-0000-0001-000000000001</node-uuid>
+        <topology-uuid>00000000-0000-0000-0000-000000000001</topology-uuid>
+      </connection-end-point>
+    </connection>
+  </connectivity-context>
+  <service-interface-point>
+    <layer-protocol-name>DSR</layer-protocol-name>
+    <uuid>00000000-0000-0000-0002-000000000001</uuid>
+    <name>
+      <value-name>onos-cp</value-name>
+      <value>netconf:127.0.0.1:11001/[TRANSCEIVER](1)</value>
+    </name>
+  </service-interface-point>
+  <service-interface-point>
+    <layer-protocol-name>DSR</layer-protocol-name>
+    <uuid>00000000-0000-0000-0002-000000000002</uuid>
+    <name>
+      <value-name>onos-cp</value-name>
+      <value>netconf:127.0.0.1:11002/[TRANSCEIVER](1)</value>
+    </name>
+  </service-interface-point>
+</context>
\ No newline at end of file
diff --git a/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java b/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java
index bfc45c7..64278fe 100644
--- a/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java
+++ b/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java
@@ -31,13 +31,15 @@
 import org.onosproject.odtn.utils.tapi.TapiNodeHandler;
 import org.onosproject.odtn.utils.tapi.TapiNodeRef;
 import org.onosproject.odtn.utils.tapi.TapiSipHandler;
+import org.onosproject.odtn.utils.tapi.TapiTopologyContextHandler;
 import org.onosproject.odtn.utils.tapi.TapiTopologyHandler;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.tapicontext.DefaultServiceInterfacePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.context.DefaultAugmentedTapiCommonContext;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.DefaultOwnedNodeEdgePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultNode;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.tapicontext.DefaultServiceInterfacePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.DefaultAugmentedTapiCommonContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.context.augmentedtapicommoncontext.DefaultTopologyContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.node.DefaultOwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topology.DefaultNode;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.DefaultTopology;
 import org.onosproject.yang.model.Augmentable;
 
 import static org.easymock.EasyMock.expectLastCall;
@@ -73,10 +75,14 @@
         context = new DefaultContext();
 
         topology = TapiTopologyHandler.create().getModelObject();
-        DefaultAugmentedTapiCommonContext topologyContext = new DefaultAugmentedTapiCommonContext();
-        topologyContext.addToTopology(topology);
+        DefaultTopologyContext topologyContext = TapiTopologyContextHandler.create().getModelObject();
+
+        DefaultAugmentedTapiCommonContext augmentedTopologyContext = new DefaultAugmentedTapiCommonContext();
         Augmentable augmentableContext = context;
-        augmentableContext.addAugmentation(topologyContext);
+        augmentableContext.addAugmentation(augmentedTopologyContext);
+
+        augmentedTopologyContext.topologyContext(topologyContext);
+        topologyContext.addToTopology(topology);
 
         node1 = TapiNodeHandler.create()
                 .setTopologyUuid(topology.uuid())
@@ -236,4 +242,4 @@
         verify(mockResolver);
     }
 
-}
\ No newline at end of file
+}
diff --git a/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DefaultTapiResolverTest.java b/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DefaultTapiResolverTest.java
index 5fcad14..6e4dd3a 100644
--- a/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DefaultTapiResolverTest.java
+++ b/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DefaultTapiResolverTest.java
@@ -192,4 +192,4 @@
         assertThat(tapiResolver.getNepRefs(filter), is(exp));
     }
 
-}
\ No newline at end of file
+}
diff --git a/apps/odtn/service/src/test/resources/create-connectivity.json b/apps/odtn/service/src/test/resources/create-connectivity.json
index 283de56..35798f4 100644
--- a/apps/odtn/service/src/test/resources/create-connectivity.json
+++ b/apps/odtn/service/src/test/resources/create-connectivity.json
@@ -5,79 +5,30 @@
             {
                 "layer-protocol-name" : "DSR",
                 "service-interface-point": {
-                    "service-interface-point-id" : "00000000-0000-4200-0001-110000000000"
+                    "service-interface-point-uuid" : "00000001-0000-0000-0000-000000000001"
                 },
                 "capacity" : {
                 },
                 "direction" : "BIDIRECTIONAL",
                 "role" : "UNKNOWN",
-                "protection-role" : "WORK",
-                "local-id": "00000000-0000-4100-0001-110000000000",
-                "name" : [
-                        {
-                            "value-name" : "port",
-                            "value" : "1"
-                        },
-                        {
-                            "value-name" : "transponder",
-                            "value" : "TRNP_A"
-                        },
-                        {
-                            "value-name" : "onos-index",
-                            "value" : "1"
-                        },
-                        {
-                            "value-name" : "test-driver",
-                            "value" : "driver"
-                        }
-                ],
-                "administrative-state" : "UNLOCKED",
-                "operational-state" : "ENABLED",
-                "lifecycle-state" : "INSTALLED"
+                "protection-role" : "WORK"
             }
             ,
             {
                 "layer-protocol-name" : "DSR",
                 "service-interface-point": {
-                    "service-interface-point-id" : "00000000-0000-4200-0001-210000000000"
+                    "service-interface-point-uuid" : "00000001-0000-0000-0000-000000000002"
                 },
                 "capacity" : {
                 },
                 "direction" : "BIDIRECTIONAL",
                 "role" : "UNKNOWN",
-                "protection-role" : "WORK",
-                "local-id": "00000000-0000-4100-0001-210000000000",
-                "name" : [
-                        {
-                            "value-name" : "port",
-                            "value" : "1"
-                        },
-                        {
-                            "value-name" : "transponder",
-                            "value" : "TRNP_B"
-                        },
-                        {
-                            "value-name" : "onos-index",
-                            "value" : "1"
-                        },
-                        {
-                            "value-name" : "test-driver",
-                            "value" : "driver"
-                        }
-                ],
-                "administrative-state" : "UNLOCKED",
-                "operational-state" : "ENABLED",
-                "lifecycle-state" : "INSTALLED"
+                "protection-role" : "WORK"
             }
         ],
-
         "conn-constraint" : {},
-
         "topo-constraint" : {},
-
-        "resilience-constraint" : [ ],
-
-        "state" : "operational-state"
+        "resilience-constraint" : [ ]
     }
 }
 
diff --git a/apps/odtn/service/src/test/resources/delete-connectivity.json b/apps/odtn/service/src/test/resources/delete-connectivity.json
new file mode 100644
index 0000000..850c18f
--- /dev/null
+++ b/apps/odtn/service/src/test/resources/delete-connectivity.json
@@ -0,0 +1,6 @@
+{
+  "tapi-connectivity:input":
+  {
+    "service-id-or-name" : "00000002-0000-0000-0000-000000000001"
+  }
+}
\ No newline at end of file
diff --git a/apps/odtn/service/src/test/resources/nbi-tapi-sample.json b/apps/odtn/service/src/test/resources/nbi-tapi-sample.json
deleted file mode 100644
index 4578336..0000000
--- a/apps/odtn/service/src/test/resources/nbi-tapi-sample.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
-  "tapi-common:context": {
-    "service-interface-point": [
-      {
-        "uuid": "9F759964-2410-44AF-8522-4FCE2C3ED464",
-        "layer-protocol-name": ["DSR"],
-        "name": [
-          {
-            "value-name": "port",
-            "value": "1"
-          },
-          {
-            "value-name": "transponder",
-            "value": "TRPN_A"
-          }
-        ]
-      },
-      {
-        "uuid": "FBDDC006-8913-4509-BA71-485CFAC89567",
-        "layer-protocol-name": ["DSR"],
-        "name": [
-          {
-            "value-name": "port",
-            "value": "1"
-          },
-          {
-            "value-name": "transponder",
-            "value": "TRPN_B"
-          }
-        ]
-      }
-    ],
-
-    "tapi-connectivity:connectivity-service": [
-      {
-        "uuid" : "D0BF25C8-B20C-49C3-9030-1C5AEC993E44",
-        "end-point": [
-          {
-            "local-id" : "TRPN_A-1",
-            "layer-protocol-name": "DSR",
-            "service-interface-point": {
-                "service-interface-point-id" : "9F759964-2410-44AF-8522-4FCE2C3ED464"
-            }
-          },
-          {
-            "local-id" : "TRPN_B-1",
-            "layer-protocol-name": "DSR",
-            "service-interface-point": {
-                "service-interface-point-id" : "FBDDC006-8913-4509-BA71-485CFAC89567"
-            }
-          }
-        ]
-      }
-    ]
-  }
-}
diff --git a/apps/odtn/service/src/test/resources/post-nbi-tapi-rpc b/apps/odtn/service/src/test/resources/post-nbi-tapi-rpc
deleted file mode 100644
index 45bdb17..0000000
--- a/apps/odtn/service/src/test/resources/post-nbi-tapi-rpc
+++ /dev/null
@@ -1 +0,0 @@
-curl -X POST http://localhost:8181/onos/restconf/operations/tapi-connectivity:create-connectivity-service -H 'cache-control: no-cache' -H 'content-type: application/json' -d @create-connectivity.json
diff --git a/apps/odtn/service/src/test/resources/post-nbi-tapi-sample b/apps/odtn/service/src/test/resources/post-nbi-tapi-sample
deleted file mode 100644
index ffdd3d9..0000000
--- a/apps/odtn/service/src/test/resources/post-nbi-tapi-sample
+++ /dev/null
@@ -1,2 +0,0 @@
-curl -X POST http://localhost:8181/onos/restconf/data -H 'cache-control: no-cache' -H 'content-type: application/json' -d @nbi-tapi-sample.json
-
diff --git a/apps/odtn/service/src/test/resources/post-tapi-rpc-create-connectivity-service b/apps/odtn/service/src/test/resources/post-tapi-rpc-create-connectivity-service
new file mode 100644
index 0000000..8f3409d
--- /dev/null
+++ b/apps/odtn/service/src/test/resources/post-tapi-rpc-create-connectivity-service
@@ -0,0 +1 @@
+curl -X POST http://localhost:8181/onos/restconf/operations/tapi-connectivity:create-connectivity-service -H 'cache-control: no-cache' -H 'content-type: application/json' -H 'Basic a2FyYWY6a2FyYWY=' -d @create-connectivity.json
diff --git a/apps/odtn/service/src/test/resources/post-tapi-rpc-delete-connectivity-service b/apps/odtn/service/src/test/resources/post-tapi-rpc-delete-connectivity-service
new file mode 100644
index 0000000..b45296e
--- /dev/null
+++ b/apps/odtn/service/src/test/resources/post-tapi-rpc-delete-connectivity-service
@@ -0,0 +1 @@
+curl -X POST http://localhost:8181/onos/restconf/operations/tapi-connectivity:delete-connectivity-service -H 'cache-control: no-cache' -H 'content-type: application/json' -H 'Basic a2FyYWY6a2FyYWY=' -d @delete-connectivity.json
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java
index e9577bf..863e40a 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java
@@ -123,6 +123,8 @@
 
     private final Logger log = getLogger(getClass());
 
+    private static final int VM_IP_PREFIX = 32;
+
     /** Apply OpenStack security group rule for VM traffic. */
     private boolean useSecurityGroup = USE_SECURITY_GROUP_DEFAULT;
 
@@ -360,28 +362,32 @@
             return;
         }
 
-        selectors.forEach(selector -> {
-            osFlowRuleService.setRule(appId,
-                    instPort.deviceId(),
-                    selector,
-                    DefaultTrafficTreatment.builder().transition(JUMP_TABLE).build(),
-                    PRIORITY_ACL_RULE,
-                    ACL_TABLE,
-                    install);
-        });
+        selectors.forEach(selector ->
+                osFlowRuleService.setRule(appId,
+                instPort.deviceId(),
+                selector,
+                DefaultTrafficTreatment.builder().transition(JUMP_TABLE).build(),
+                PRIORITY_ACL_RULE,
+                ACL_TABLE,
+                install));
     }
 
     /**
      * Sets connection tracking rule using OVS extension commands.
-     * It is not so graceful, but I don't want to make it more general because it is going to be used
-     * only here. The following is the usage of the function.
+     * It is not so graceful, but I don't want to make it more general because
+     * it is going to be used only here.
+     * The following is the usage of the function.
      *
      * @param deviceId Device ID
-     * @param ctState ctState: please use RulePopulatorUtil.computeCtStateFlag() to build the value
-     * @param ctMask crMask: please use RulePopulatorUtil.computeCtMaskFlag() to build the value
+     * @param ctState ctState: please use RulePopulatorUtil.computeCtStateFlag()
+     *                to build the value
+     * @param ctMask crMask: please use RulePopulatorUtil.computeCtMaskFlag()
+     *               to build the value
      * @param commit CT_COMMIT for commit action, CT_NO_COMMIT otherwise
-     * @param recircTable table number for recirculation after CT actions. CT_NO_RECIRC with no recirculation
-     * @param action Additional actions. ACTION_DROP, ACTION_NONE, GOTO_XXX_TABLE are supported.
+     * @param recircTable table number for recirculation after CT actions.
+     *                    CT_NO_RECIRC with no recirculation
+     * @param action Additional actions. ACTION_DROP, ACTION_NONE,
+     *               GOTO_XXX_TABLE are supported.
      * @param priority priority value for the rule
      * @param install true for insertion, false for removal
      */
@@ -446,7 +452,8 @@
      * @param sgId security group id
      * @return set of ip addresses
      */
-    private Set<InstancePort> getRemoteInstPorts(String tenantId, String sgId, boolean install) {
+    private Set<InstancePort> getRemoteInstPorts(String tenantId,
+                                                 String sgId, boolean install) {
         Set<InstancePort> remoteInstPorts;
 
         Set<Port> removedPorts = Sets.newConcurrentHashSet();
@@ -469,7 +476,7 @@
                                                 Ip4Address vmIp,
                                                 IpPrefix remoteIp,
                                                 Port port) {
-        if (remoteIp != null && remoteIp.equals(IpPrefix.valueOf(vmIp, 32))) {
+        if (remoteIp != null && remoteIp.equals(IpPrefix.valueOf(vmIp, VM_IP_PREFIX))) {
             // do nothing if the remote IP is my IP
             return null;
         }
@@ -484,25 +491,24 @@
             Map<TpPort, TpPort> portRangeMatchMap =
                     buildPortRangeMatches(sgRule.getPortRangeMin(),
                     sgRule.getPortRangeMax());
-            portRangeMatchMap.entrySet().forEach(entry -> {
+            portRangeMatchMap.forEach((key, value) -> {
 
-                        if (sgRule.getProtocol().toUpperCase().equals(PROTO_TCP)) {
-                            if (sgRule.getDirection().toUpperCase().equals(EGRESS)) {
-                                sBuilder.matchTcpSrcMasked(entry.getKey(), entry.getValue());
-                            } else {
-                                sBuilder.matchTcpDstMasked(entry.getKey(), entry.getValue());
-                            }
-                        } else if (sgRule.getProtocol().toUpperCase().equals(PROTO_UDP)) {
-                            if (sgRule.getDirection().toUpperCase().equals(EGRESS)) {
-                                sBuilder.matchUdpSrcMasked(entry.getKey(), entry.getValue());
-                            } else {
-                                sBuilder.matchUdpDstMasked(entry.getKey(), entry.getValue());
-                            }
-                        }
-
-                        selectorSet.add(sBuilder.build());
+                if (sgRule.getProtocol().toUpperCase().equals(PROTO_TCP)) {
+                    if (sgRule.getDirection().toUpperCase().equals(EGRESS)) {
+                        sBuilder.matchTcpSrcMasked(key, value);
+                    } else {
+                        sBuilder.matchTcpDstMasked(key, value);
                     }
-            );
+                } else if (sgRule.getProtocol().toUpperCase().equals(PROTO_UDP)) {
+                    if (sgRule.getDirection().toUpperCase().equals(EGRESS)) {
+                        sBuilder.matchUdpSrcMasked(key, value);
+                    } else {
+                        sBuilder.matchUdpDstMasked(key, value);
+                    }
+                }
+
+                selectorSet.add(sBuilder.build());
+            });
         } else {
             selectorSet.add(sBuilder.build());
         }
@@ -541,9 +547,9 @@
                                      String direction,
                                      Ip4Address vmIp) {
         if (direction.toUpperCase().equals(EGRESS)) {
-            sBuilder.matchIPSrc(IpPrefix.valueOf(vmIp, 32));
+            sBuilder.matchIPSrc(IpPrefix.valueOf(vmIp, VM_IP_PREFIX));
         } else {
-            sBuilder.matchIPDst(IpPrefix.valueOf(vmIp, 32));
+            sBuilder.matchIPDst(IpPrefix.valueOf(vmIp, VM_IP_PREFIX));
         }
     }
 
@@ -660,21 +666,21 @@
     }
 
     private int binLower(String binStr, int bits) {
-        String outBin = binStr.substring(0, 16 - bits);
+        StringBuilder outBin = new StringBuilder(binStr.substring(0, 16 - bits));
         for (int i = 0; i < bits; i++) {
-            outBin += "0";
+            outBin.append("0");
         }
 
-        return Integer.parseInt(outBin, 2);
+        return Integer.parseInt(outBin.toString(), 2);
     }
 
     private int binHigher(String binStr, int bits) {
-        String outBin = binStr.substring(0, 16 - bits);
+        StringBuilder outBin = new StringBuilder(binStr.substring(0, 16 - bits));
         for (int i = 0; i < bits; i++) {
-            outBin += "1";
+            outBin.append("1");
         }
 
-        return Integer.parseInt(outBin, 2);
+        return Integer.parseInt(outBin.toString(), 2);
     }
 
     private int testMasks(String binStr, int start, int end) {
@@ -743,11 +749,8 @@
 
         @Override
         public boolean isRelevant(InstancePortEvent event) {
-            InstancePort instPort = event.subject();
-            if (!useSecurityGroup) {
-                return false;
-            }
-            return mastershipService.isLocalMaster(instPort.deviceId());
+            return useSecurityGroup &&
+                    mastershipService.isLocalMaster(event.subject().deviceId());
         }
 
         @Override
@@ -782,10 +785,9 @@
             log.debug("Instance port detected/updated MAC:{} IP:{}",
                     instPort.macAddress(),
                     instPort.ipAddress());
-            eventExecutor.execute(() -> {
-                setSecurityGroupRules(instPort,
-                        osNetService.port(event.subject().portId()), true);
-            });
+            eventExecutor.execute(() ->
+                    setSecurityGroupRules(instPort,
+                            osNetService.port(event.subject().portId()), true));
         }
     }
 
@@ -822,21 +824,27 @@
         }
     }
 
-    private class InternalOpenstackNetworkListener implements OpenstackNetworkListener {
+    private class InternalOpenstackNetworkListener
+                                            implements OpenstackNetworkListener {
 
         @Override
         public boolean isRelevant(OpenstackNetworkEvent event) {
             if (event.port() == null || Strings.isNullOrEmpty(event.port().getId())) {
                 return false;
             }
+
             if (event.securityGroupId() == null ||
                     securityGroupService.securityGroup(event.securityGroupId()) == null) {
                 return false;
             }
-            if (instancePortService.instancePort(event.port().getId()) == null) {
+
+            InstancePort instPort = instancePortService.instancePort(event.port().getId());
+
+            if (instPort == null) {
                 return false;
             }
-            return useSecurityGroup;
+
+            return useSecurityGroup && mastershipService.isLocalMaster(instPort.deviceId());
         }
 
         @Override
@@ -872,7 +880,8 @@
         }
     }
 
-    private class InternalSecurityGroupListener implements OpenstackSecurityGroupListener {
+    private class InternalSecurityGroupListener
+                                    implements OpenstackSecurityGroupListener {
 
         @Override
         public boolean isRelevant(OpenstackSecurityGroupEvent event) {
@@ -888,20 +897,20 @@
         public void event(OpenstackSecurityGroupEvent event) {
             switch (event.type()) {
                 case OPENSTACK_SECURITY_GROUP_RULE_CREATED:
-                    SecurityGroupRule securityGroupRuleToAdd = event.securityGroupRule();
+                    SecurityGroupRule sgRuleToAdd = event.securityGroupRule();
                     eventExecutor.execute(() -> {
-                        securityGroupRuleAdded(securityGroupRuleToAdd);
+                        securityGroupRuleAdded(sgRuleToAdd);
                         log.info("Applied new security group rule {} to ports",
-                                securityGroupRuleToAdd.getId());
+                                sgRuleToAdd.getId());
                     });
                     break;
 
                 case OPENSTACK_SECURITY_GROUP_RULE_REMOVED:
-                    SecurityGroupRule securityGroupRuleToRemove = event.securityGroupRule();
+                    SecurityGroupRule sgRuleToRemove = event.securityGroupRule();
                     eventExecutor.execute(() -> {
-                        securityGroupRuleRemoved(securityGroupRuleToRemove);
+                        securityGroupRuleRemoved(sgRuleToRemove);
                         log.info("Removed security group rule {} from ports",
-                                securityGroupRuleToRemove.getId());
+                                sgRuleToRemove.getId());
                     });
                     break;
                 case OPENSTACK_SECURITY_GROUP_REMOVED:
diff --git a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java
index 943290b..8d4ac94 100644
--- a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java
+++ b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java
@@ -34,8 +34,11 @@
 
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
+import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
+import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 
@@ -61,6 +64,9 @@
             required = false, multiValued = true)
     private String[] vmIps = null;
 
+    private final ExecutorService probeExecutor = newSingleThreadScheduledExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "probe-handler", log));
+
     @Override
     protected void doExecute() {
         OpenstackTroubleshootService tsService = get(OpenstackTroubleshootService.class);
@@ -144,7 +150,8 @@
             dstIps.stream()
                     .filter(ip -> instPort(instPortService, ip) != null)
                     .map(ip -> instPort(instPortService, ip))
-                    .forEach(port -> printReachability(tsService.probeEastWest(srcPort, port)));
+                    .forEach(port -> probeExecutor.execute(() ->
+                            printReachability(tsService.probeEastWest(srcPort, port))));
         }
     }
 
diff --git a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java
index edef1c2..32c32c0 100644
--- a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java
+++ b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java
@@ -32,7 +32,10 @@
 import org.onosproject.openstacktroubleshoot.api.Reachability;
 
 import java.util.Set;
+import java.util.concurrent.ExecutorService;
 
+import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
+import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 
@@ -58,6 +61,9 @@
             required = false, multiValued = true)
     private String[] vmIps = null;
 
+    private final ExecutorService probeExecutor = newSingleThreadScheduledExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "probe-handler", log));
+
     @Override
     protected void doExecute() {
         OpenstackTroubleshootService tsService = get(OpenstackTroubleshootService.class);
@@ -108,7 +114,8 @@
             }
 
             printHeader();
-            ports.forEach(port -> printReachability(tsService.probeNorthSouth(port)));
+            ports.forEach(port -> probeExecutor.execute(() ->
+                    printReachability(tsService.probeNorthSouth(port))));
         }
     }
 
diff --git a/apps/simplefabric/BUCK b/apps/simplefabric/BUCK
new file mode 100644
index 0000000..e181a98
--- /dev/null
+++ b/apps/simplefabric/BUCK
@@ -0,0 +1,13 @@
+BUNDLES = [
+    '//apps/simplefabric/api:onos-apps-simplefabric-api',
+    '//apps/simplefabric/app:onos-apps-simplefabric-app',
+]
+
+onos_app (
+    title = 'SONA SimpleFabric',
+    category = 'Traffic Engineering',
+    url = 'http://onosproject.org',
+    included_bundles = BUNDLES,
+    description = 'SONA Simple Fabric Application',
+    required_apps = [ 'org.onosproject.openflow-base', 'org.onosproject.lldpprovider', 'org.onosproject.hostprovider' ],
+)
\ No newline at end of file
diff --git a/apps/simplefabric/BUILD b/apps/simplefabric/BUILD
index 007b701..3fabae0 100644
--- a/apps/simplefabric/BUILD
+++ b/apps/simplefabric/BUILD
@@ -1,27 +1,17 @@
-COMPILE_DEPS = CORE_DEPS + JACKSON + CLI + REST + [
-    "@concurrent_trees//jar",
-]
-
 BUNDLES = [
-    "//apps/simplefabric:onos-apps-simplefabric",
+    "//apps/simplefabric/api:onos-apps-simplefabric-api",
+    "//apps/simplefabric/app:onos-apps-simplefabric-app",
 ]
 
-osgi_jar_with_tests(
-    karaf_command_packages = ["org.onosproject.simplefabric"],
-    test_deps = TEST_ADAPTERS,
-    web_context = "/onos/v1/simplefabric",
-    deps = COMPILE_DEPS,
-)
-
 onos_app(
     category = "Traffic Engineering",
-    description = "Simple Fabric application",
+    description = "SONA Simple Fabric Application",
     included_bundles = BUNDLES,
     required_apps = [
         "org.onosproject.openflow-base",
         "org.onosproject.lldpprovider",
         "org.onosproject.hostprovider",
     ],
-    title = "SimpleFabric",
+    title = "SONA SimpleFabric",
     url = "http://onosproject.org",
 )
diff --git a/apps/simplefabric/api/BUCK b/apps/simplefabric/api/BUCK
new file mode 100644
index 0000000..520bddf
--- /dev/null
+++ b/apps/simplefabric/api/BUCK
@@ -0,0 +1,16 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//lib:org.apache.karaf.shell.console',
+    '//cli:onos-cli',
+]
+
+TEST_DEPS = [
+    '//lib:TEST_ADAPTERS',
+    '//core/api:onos-api-tests',
+    '//core/common:onos-core-common-tests',
+]
+
+osgi_jar_with_tests (
+    deps = COMPILE_DEPS,
+    test_deps = TEST_DEPS,
+)
diff --git a/apps/simplefabric/api/BUILD b/apps/simplefabric/api/BUILD
new file mode 100644
index 0000000..b22d9f6
--- /dev/null
+++ b/apps/simplefabric/api/BUILD
@@ -0,0 +1,11 @@
+COMPILE_DEPS = CORE_DEPS + CLI
+
+TEST_DEPS = TEST_ADAPTERS + [
+    "//core/api:onos-api-tests",
+    "//core/common:onos-core-common-tests",
+]
+
+osgi_jar_with_tests(
+    test_deps = TEST_DEPS,
+    deps = COMPILE_DEPS,
+)
diff --git a/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/Constants.java b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/Constants.java
new file mode 100644
index 0000000..703e01b
--- /dev/null
+++ b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/Constants.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.api;
+
+/**
+ * Provides constants used in simple fabric services.
+ */
+public final class Constants {
+
+    private Constants() {
+    }
+
+    // App symbols
+    public static final String APP_ID = "org.onosproject.simplefabric";
+    public static final String FORWARDING_APP_ID = "org.onosproject.simplefabric.forwarding";
+    public static final String ROUTING_APP_ID = "org.onosproject.simplefabric.routing";
+
+    // Priority for l2NetworkRouting: L2NETWORK_UNICAST or L2NETWORK_BROADCAST
+    public static final int PRI_L2NETWORK_UNICAST = 601;
+    public static final int PRI_L2NETWORK_BROADCAST = 600;
+
+    // Reactive Routing within Local Subnets
+    // ASSUME: local subnets NEVER overlaps each other
+    public static final int PRI_REACTIVE_LOCAL_FORWARD = 501;
+    public static final int PRI_REACTIVE_LOCAL_INTERCEPT = 500;
+    // Reactive Routing for Border Routes with local subnet
+    // Priority: REACTIVE_BROUTE_BASE + routeIpPrefix * REACTIVE_BROUTE_STEP
+    //           + REACTIVE_BROUTE_FORWARD or REACTIVE_BROUTE_INTERCEPT
+    public static final int PRI_REACTIVE_BORDER_BASE = 100;
+    public static final int PRI_REACTIVE_BORDER_STEP = 2;
+    public static final int PRI_REACTIVE_BORDER_FORWARD = 1;
+    public static final int PRI_REACTIVE_BORDER_INTERCEPT = 0;
+
+    // Simple fabric event related timers
+    public static final long IDLE_INTERVAL_MSEC = 5000;
+
+    // Feature control parameters
+    public static final boolean ALLOW_IPV6 = false;
+    public static final boolean ALLOW_ETH_ADDRESS_SELECTOR = true;
+    public static final boolean REACTIVE_SINGLE_TO_SINGLE = false;
+    public static final boolean REACTIVE_ALLOW_LINK_CP = false;  // MUST BE false (yjlee, 2017-10-18)
+    public static final boolean REACTIVE_HASHED_PATH_SELECTION = false;
+    public static final boolean REACTIVE_MATCH_IP_PROTO = false;
+}
diff --git a/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/FabricNetwork.java b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/FabricNetwork.java
new file mode 100644
index 0000000..bae189d
--- /dev/null
+++ b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/FabricNetwork.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.api;
+
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.EncapsulationType;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.intf.Interface;
+
+import java.util.Set;
+
+/**
+ * Interface of fabric network.
+ */
+public interface FabricNetwork {
+
+    /**
+     * Gets DefaultFabricNetwork name.
+     *
+     * @return the name of DefaultFabricNetwork
+     */
+    String name();
+
+    /**
+     * Gets DefaultFabricNetwork interfaceNames.
+     *
+     * @return the interfaceNames of DefaultFabricNetwork
+     */
+    Set<String> interfaceNames();
+
+    /**
+     * Gets DefaultFabricNetwork encapsulation type.
+     *
+     * @return the encapsulation type of DefaultFabricNetwork
+     */
+    EncapsulationType encapsulation();
+
+    /**
+     * Gets DefaultFabricNetwork forward flag.
+     *
+     * @return the forward flag of DefaultFabricNetwork
+     */
+    boolean isForward();
+
+    /**
+     * Gets DefaultFabricNetwork broadcast flag.
+     *
+     * @return the broadcast flag of DefaultFabricNetwork
+     */
+    boolean isBroadcast();
+
+    /**
+     * Gets DefaultFabricNetwork interfaces.
+     *
+     * @return the interfaces of DefaultFabricNetwork
+     */
+    Set<Interface> interfaces();
+
+    /**
+     * Gets DefaultFabricNetwork hosts.
+     *
+     * @return the hosts of DefaultFabricNetwork
+     */
+    Set<HostId> hostIds();
+
+    /**
+     * Gets DefaultFabricNetwork isDirty flag.
+     *
+     * @return the isDirty flag of DefaultFabricNetwork
+     */
+    boolean isDirty();
+
+    /**
+     * Checks if the interface is of DefaultFabricNetwork.
+     *
+     * @param iface the interface to be checked
+     * @return true if DefaultFabricNetwork contains the interface
+     */
+    boolean contains(Interface iface);
+
+    /**
+     * Checks if the ConnectPoint and Vlan is of DefaultFabricNetwork.
+     *
+     * @param port the ConnectPoint to be checked
+     * @param vlanId the VlanId of the ConnectPoint to be checked
+     * @return true if DefaultFabricNetwork contains the interface of the ConnnectPoint and VlanId
+     */
+    boolean contains(ConnectPoint port, VlanId vlanId);
+
+    /**
+     * Checks if the DeviceId is of DefaultFabricNetwork.
+     *
+     * @param deviceId the DeviceId to be checked
+     * @return true if DefaultFabricNetwork contains any interface of the DeviceId
+     */
+    boolean contains(DeviceId deviceId);
+
+    /**
+     * Adds interface to DefaultFabricNetwork.
+     *
+     * @param iface the Interface to be added
+     */
+    void addInterface(Interface iface);
+
+    /**
+     * Adds host to DefaultFabricNetwork.
+     *
+     * @param host the Host to be added
+     */
+    void addHost(Host host);
+
+    /**
+     * Sets DefaultFabricNetwork isDirty flag.
+     *
+     * @param newDirty the isDirty flag to be set
+     */
+    void setDirty(boolean newDirty);
+
+    /**
+     * Builder of FabricNetwork.
+     */
+    interface Builder {
+
+        /**
+         * Returns FabricNetwork builder with supplied network name.
+         *
+         * @param name network name
+         * @return FabricNetwork instance builder
+         */
+        Builder name(String name);
+
+        /**
+         * Returns FabricNetwork builder with supplied interface names.
+         *
+         * @param interfaceNames interface names
+         * @return FabricNetwork instance builder
+         */
+        Builder interfaceNames(Set<String> interfaceNames);
+
+        /**
+         * Returns FabricNetwork builder with supplied encapsulation type.
+         *
+         * @param encapsulation encapsulation type
+         * @return FabricNetwork instance builder
+         */
+        Builder encapsulation(EncapsulationType encapsulation);
+
+        /**
+         * Returns FabricNetwork builder with supplied forward flag.
+         *
+         * @param forward forward flag
+         * @return FabricNetwork instance builder
+         */
+        Builder forward(boolean forward);
+
+        /**
+         * Returns FabricNetwork builder with supplied broadcast flag.
+         *
+         * @param broadcast broadcast flag
+         * @return FabricNetwork instance builder
+         */
+        Builder broadcast(boolean broadcast);
+
+        /**
+         * Builds an immutable FabricNetwork instance.
+         *
+         * @return FabricNetwork instance
+         */
+        FabricNetwork build();
+    }
+}
diff --git a/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/FabricRoute.java b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/FabricRoute.java
new file mode 100644
index 0000000..f12260a
--- /dev/null
+++ b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/FabricRoute.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.api;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.cluster.NodeId;
+
+/**
+ * Interface of fabric route.
+ */
+public interface FabricRoute {
+
+    /**
+     * Source of the route.
+     */
+    enum Source {
+        /**
+         * Route came from the iBGP route source.
+         */
+        BGP,
+
+        /**
+         * Route came from the FPM route source.
+         */
+        FPM,
+
+        /**
+         * Route can from the static route source.
+         */
+        STATIC,
+
+        /**
+         * Route source was not defined.
+         */
+        UNDEFINED
+    }
+
+    /**
+     * Returns the route source.
+     *
+     * @return route source
+     */
+    Source source();
+
+    /**
+     * Returns the IP prefix of the route.
+     *
+     * @return IP prefix
+     */
+    IpPrefix prefix();
+
+    /**
+     * Returns the next hop IP address.
+     *
+     * @return next hop
+     */
+    IpAddress nextHop();
+
+    /**
+     * Returns the ONOS node the route was sourced from.
+     *
+     * @return ONOS node ID
+     */
+    NodeId sourceNode();
+
+    /**
+     * Builder of FabricRoute.
+     */
+    interface Builder {
+
+        /**
+         * Returns FabricRoute builder with supplied source.
+         *
+         * @param source source of route
+         * @return FabricRoute instance builder
+         */
+        Builder source(Source source);
+
+        /**
+         * Returns FabricRoute builder with supplied IP prefix.
+         *
+         * @param prefix IP prefix
+         * @return FabricRoute instance builder
+         */
+        Builder prefix(IpPrefix prefix);
+
+        /**
+         * Returns Fabric builder with supplied next hop.
+         *
+         * @param nextHop next hop
+         * @return FabricRoute instance builder
+         */
+        Builder nextHop(IpAddress nextHop);
+
+        /**
+         * Returns Fabric builder with supplied source node identifier.
+         *
+         * @param sourceNode source node identifier
+         * @return FabricRoute instance builder
+         */
+        Builder sourceNode(NodeId sourceNode);
+
+        /**
+         * Builds an immutable FabricRoute instance.
+         *
+         * @return FabricRoute instance
+         */
+        FabricRoute build();
+    }
+}
diff --git a/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/FabricSubnet.java b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/FabricSubnet.java
new file mode 100644
index 0000000..ca56946
--- /dev/null
+++ b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/FabricSubnet.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.api;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.EncapsulationType;
+
+/**
+ * Interface of FabricSubnet.
+ */
+public interface FabricSubnet {
+
+    /**
+     * Gets the IP subnet of the IP subnet entry.
+     *
+     * @return the IP subnet
+     */
+    IpPrefix prefix();
+
+    /**
+     * Gets the virtual gateway IP address of the IP subnet entry.
+     *
+     * @return the virtual gateway IP address
+     */
+    IpAddress gatewayIp();
+
+    /**
+     * Gets the virtual gateway Mac address of the IP subnet entry.
+     *
+     * @return the virtuai gateway Mac address
+     */
+    MacAddress gatewayMac();
+
+    /**
+     * Gets the encapsulation type of IP subnet entry.
+     *
+     * @return the encapsulation type
+     */
+    EncapsulationType encapsulation();
+
+    /**
+     * Gets the network name.
+     *
+     * @return the network name
+     */
+    String networkName();
+
+    /**
+     * Tests whether the IP version of this entry is IPv4.
+     *
+     * @return true if the IP version of this entry is IPv4, otherwise false.
+     */
+    boolean isIp4();
+
+    /**
+     * Tests whether the IP version of this entry is IPv6.
+     *
+     * @return true if the IP version of this entry is IPv6, otherwise false.
+     */
+    boolean isIp6();
+
+    /**
+     * Builder of Ip Subnet.
+     */
+    interface Builder {
+
+        /**
+         * Returns FabricSubnet builder with supplied IpPrefix.
+         *
+         * @param ipPrefix IP prefix
+         * @return FabricSubnet instance builder
+         */
+        Builder prefix(IpPrefix ipPrefix);
+
+        /**
+         * Returns FabricSubnet builder with supplied gatewayIp.
+         *
+         * @param gatewayIp gateway IP
+         * @return FabricSubnet instance builder
+         */
+        Builder gatewayIp(IpAddress gatewayIp);
+
+        /**
+         * Returns FabricSubnet builder with supplied gatewayMac.
+         *
+         * @param gatewayMac gateway MAC
+         * @return FabricSubnet instance builder
+         */
+        Builder gatewayMac(MacAddress gatewayMac);
+
+        /**
+         * Returns FabricSubnet builder with supplied encapsulation type.
+         *
+         * @param encapsulation encapsulation type
+         * @return FabricSubnet instance builder
+         */
+        Builder encapsulation(EncapsulationType encapsulation);
+
+        /**
+         * Returns FabricSubnet builder with supplied network name.
+         *
+         * @param networkName network name
+         * @return FabricSubnet instance builder
+         */
+        Builder networkName(String networkName);
+
+        /**
+         * Builds an immutable FabricSubnet instance.
+         *
+         * @return FabricSubnet instance
+         */
+        FabricSubnet build();
+    }
+}
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricEvent.java b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/SimpleFabricEvent.java
similarity index 95%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricEvent.java
rename to apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/SimpleFabricEvent.java
index cac1276..aac465b 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricEvent.java
+++ b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/SimpleFabricEvent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.simplefabric;
+package org.onosproject.simplefabric.api;
 
 import org.onosproject.event.AbstractEvent;
 
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricListener.java b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/SimpleFabricListener.java
similarity index 88%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricListener.java
rename to apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/SimpleFabricListener.java
index 726d578..25bf529 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricListener.java
+++ b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/SimpleFabricListener.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.simplefabric;
+package org.onosproject.simplefabric.api;
 
 import org.onosproject.event.EventListener;
 
diff --git a/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/SimpleFabricService.java b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/SimpleFabricService.java
new file mode 100644
index 0000000..33b9c5e
--- /dev/null
+++ b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/SimpleFabricService.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.api;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.event.ListenerService;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Host;
+
+import java.io.OutputStream;
+import java.util.Set;
+import java.util.Collection;
+
+/**
+ * Provides information about the routing configuration.
+ */
+public interface SimpleFabricService
+        extends ListenerService<SimpleFabricEvent, SimpleFabricListener> {
+
+    /**
+     * Gets appId.
+     *
+     * @return appId of simple fabric app
+     */
+    ApplicationId appId();
+
+    /**
+     * Gets all the fabric networks.
+     *
+     * @return all the fabric networks
+     */
+    Collection<FabricNetwork> fabricNetworks();
+
+    /**
+     * Retrieves the entire set of fabricSubnets configuration.
+     *
+     * @return all the fabricSubnets
+     */
+    Set<FabricSubnet> defaultFabricSubnets();
+
+    /**
+     * Retrieves the entire set of static routes to outer networks.
+     *
+     * @return the set of static routes to outer networks.
+     */
+    Set<FabricRoute> fabricRoutes();
+
+    /**
+     * Evaluates whether a MAC is of virtual gateway MAC addresses.
+     *
+     * @param mac the MAC address to evaluate
+     * @return true if the mac is of any virtual gateway MAC address of fabricSubnets
+     */
+    boolean isVirtualGatewayMac(MacAddress mac);
+
+    /**
+     * Evaluates whether an interface belongs to fabric network or not.
+     *
+     * @param intf the interface to evaluate
+     * @return true if the interface belongs to fabric network, otherwise false
+     */
+    boolean isFabricNetworkInterface(Interface intf);
+
+    /**
+     * Finds virtual gateway MAC address for local subnet virtual gateway IP.
+     *
+     * @param ip the IP to check for virtual gateway IP
+     * @return MAC address of virtual gateway
+     */
+    MacAddress vMacForIp(IpAddress ip);
+
+    /**
+     * Finds the L2 fabric network with given port and vlanId.
+     *
+     * @param port the port to be matched
+     * @param vlanId the vlanId to be matched
+     * @return the L2 Network for specific port and vlanId or null
+     */
+    FabricNetwork fabricNetwork(ConnectPoint port, VlanId vlanId);
+
+    /**
+     * Finds the fabric network by its name.
+     *
+     * @param name the name to be matched
+     * @return the fabric network
+     */
+    FabricNetwork fabricNetwork(String name);
+
+    /**
+     * Finds the FabricSubnet which contains the given IP address.
+     *
+     * @param ipAddress the IP address to be matched
+     * @return the FabricSubnet
+     */
+    FabricSubnet fabricSubnet(IpAddress ipAddress);
+
+    /**
+     * Finds the FabricRoute which contains the given IP address.
+     *
+     * @param ipAddress the IP address to be matched
+     * @return the FabricRoute
+     */
+    FabricRoute fabricRoute(IpAddress ipAddress);
+
+    /**
+     * Finds the network interface which associated with the host.
+     *
+     * @param host the host
+     * @return the interface associated with the host
+     */
+    Interface hostInterface(Host host);
+
+    /**
+     * Sends neighbour query (ARP or NDP) to find host location.
+     *
+     * @param ip the IP address to resolve
+     * @return true if request MAC packets are emitted, false otherwise
+     */
+    boolean requestMac(IpAddress ip);
+
+    /**
+     * Sends dump event to all SimpleFabricListeners to dump info on the subject.
+     *
+     * @param subject the subject to dump
+     * @param out the output stream to dump
+     */
+    void dumpToStream(String subject, OutputStream out);
+
+    /**
+     * Triggers to send refresh notification to all sub modules.
+     */
+    void triggerRefresh();
+
+    /**
+     * Triggers to send flush notification to all sub modules.
+     */
+    void triggerFlush();
+}
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/package-info.java
similarity index 88%
copy from web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
copy to apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/package-info.java
index fca0dc7..a11519f 100644
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
+++ b/apps/simplefabric/api/src/main/java/org/onosproject/simplefabric/api/package-info.java
@@ -15,5 +15,6 @@
  */
 
 /**
- * ONOS GUI -- Topology Zoom Layer -- CSS file
- */
\ No newline at end of file
+ * Simple fabric API package.
+ */
+package org.onosproject.simplefabric.api;
\ No newline at end of file
diff --git a/apps/simplefabric/app/BUCK b/apps/simplefabric/app/BUCK
new file mode 100644
index 0000000..6aefd2c
--- /dev/null
+++ b/apps/simplefabric/app/BUCK
@@ -0,0 +1,24 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//lib:JACKSON',
+    '//lib:concurrent-trees',
+    '//lib:javax.ws.rs-api',
+    '//lib:org.apache.karaf.shell.console',
+    '//cli:onos-cli',
+    '//utils/rest:onlab-rest',
+    '//apps/simplefabric/api:onos-apps-simplefabric-api',
+]
+
+TEST_DEPS = [
+    '//lib:TEST_ADAPTERS',
+]
+
+osgi_jar_with_tests (
+    api_description = 'REST API for Simple Fabric',
+    api_package = 'org.onosproject.simplefabric.web',
+    api_title = 'Simple Fabric API',
+    api_version = '1.0',
+    deps = COMPILE_DEPS,
+    test_deps = TEST_DEPS,
+    web_context = '/onos/v1/simplefabric',
+)
\ No newline at end of file
diff --git a/apps/simplefabric/app/BUILD b/apps/simplefabric/app/BUILD
new file mode 100644
index 0000000..69d12f7
--- /dev/null
+++ b/apps/simplefabric/app/BUILD
@@ -0,0 +1,21 @@
+COMPILE_DEPS = CORE_DEPS + JACKSON + CLI + REST + [
+    "//apps/simplefabric/api:onos-apps-simplefabric-api",
+    "@concurrent_trees//jar",
+]
+
+TEST_DEPS = TEST_ADAPTERS + TEST_REST + [
+    "//core/api:onos-api-tests",
+    "//core/common:onos-core-common-tests",
+    "//web/api:onos-rest-tests",
+]
+
+osgi_jar_with_tests(
+    api_description = "REST API for Simple Fabric",
+    api_package = "org.onosproject.simplefabric.web",
+    api_title = "Simple Fabric API",
+    api_version = "1.0",
+    karaf_command_packages = ["org.onosproject.simplefabric.cli"],
+    test_deps = TEST_DEPS,
+    web_context = "/onos/v1/simplefabric",
+    deps = COMPILE_DEPS,
+)
diff --git a/apps/simplefabric/app.xml b/apps/simplefabric/app/app.xml
similarity index 100%
rename from apps/simplefabric/app.xml
rename to apps/simplefabric/app/app.xml
diff --git a/apps/simplefabric/features.xml b/apps/simplefabric/app/features.xml
similarity index 100%
rename from apps/simplefabric/features.xml
rename to apps/simplefabric/app/features.xml
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricCommand.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommand.java
similarity index 93%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricCommand.java
rename to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommand.java
index 8d88f08..3271e8d 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricCommand.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommand.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,13 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.simplefabric;
+package org.onosproject.simplefabric.cli;
 
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
 import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.simplefabric.api.SimpleFabricService;
 
 /**
  * CLI to interact with the SIMPLE_FABRIC application.
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricCommandCompleter.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommandCompleter.java
similarity index 93%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricCommandCompleter.java
rename to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommandCompleter.java
index 43d79d8..a643539 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricCommandCompleter.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommandCompleter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.simplefabric;
+package org.onosproject.simplefabric.cli;
 
 import com.google.common.collect.Lists;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/package-info.java
similarity index 88%
copy from web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
copy to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/package-info.java
index fca0dc7..1a92219 100644
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/package-info.java
@@ -15,5 +15,6 @@
  */
 
 /**
- * ONOS GUI -- Topology Zoom Layer -- CSS file
- */
\ No newline at end of file
+ * Simple fabric CLI package.
+ */
+package org.onosproject.simplefabric.cli;
\ No newline at end of file
diff --git a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/DefaultFabricNetwork.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/DefaultFabricNetwork.java
new file mode 100644
index 0000000..386a345
--- /dev/null
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/DefaultFabricNetwork.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.impl;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.EncapsulationType;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.simplefabric.api.FabricNetwork;
+
+import java.util.Collection;
+import java.util.Objects;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.onosproject.simplefabric.api.Constants.ALLOW_ETH_ADDRESS_SELECTOR;
+
+
+/**
+ * Class stores a DefaultFabricNetwork information.
+ */
+public final class DefaultFabricNetwork implements FabricNetwork {
+
+    private static final String NOT_NULL_MSG = "FabricNetwork % cannot be null";
+
+    private final String name;
+    private final Set<String> interfaceNames;
+    private final EncapsulationType encapsulation;
+    private boolean forward;
+    private boolean broadcast;
+
+    /* status variables */
+    private final Set<Interface> interfaces;
+    private final Set<HostId> hostIds;
+    private boolean dirty;
+
+    /**
+     * Constructs a DefaultFabricNetwork instance.
+     *
+     * @param name              fabric name name
+     * @param interfaceNames    a collection of  interface names
+     * @param encapsulation     encapsulation type
+     * @param forward           flag for forward intents to be installed or not
+     * @param broadcast         flag for broadcast intents to be installed or not
+     */
+    private DefaultFabricNetwork(String name, Collection<String> interfaceNames,
+                                 EncapsulationType encapsulation,
+                                 boolean forward, boolean broadcast) {
+        this.name = name;
+        this.interfaceNames = Sets.newHashSet();
+
+        if (interfaceNames != null) {
+            this.interfaceNames.addAll(interfaceNames);
+        }
+
+        this.encapsulation = encapsulation;
+        this.forward = (ALLOW_ETH_ADDRESS_SELECTOR) && forward;
+        this.broadcast = (ALLOW_ETH_ADDRESS_SELECTOR) && broadcast;
+        this.interfaces = Sets.newHashSet();
+        this.hostIds = Sets.newHashSet();
+        this.dirty = false;
+    }
+
+    /**
+     * Constructs a DefaultFabricNetwork instance.
+     *
+     * @param name              fabric network name
+     * @param encapsulation     encapsulation type
+     */
+    private DefaultFabricNetwork(String name, EncapsulationType encapsulation) {
+        this.name = name;
+        this.interfaceNames = Sets.newHashSet();
+        this.encapsulation = encapsulation;
+        this.forward = ALLOW_ETH_ADDRESS_SELECTOR;
+        this.broadcast = ALLOW_ETH_ADDRESS_SELECTOR;
+        this.interfaces = Sets.newHashSet();
+        this.hostIds = Sets.newHashSet();
+        this.dirty = false;
+    }
+
+    /**
+     * Creates a DefaultFabricNetwork data by given name.
+     * The encapsulation type of the DefaultFabricNetwork will be NONE.
+     *
+     * @param name              fabric network name
+     * @return DefaultFabricNetwork instance
+     */
+    public static FabricNetwork of(String name) {
+        Objects.requireNonNull(name);
+        return new DefaultFabricNetwork(name, EncapsulationType.NONE);
+    }
+
+    /**
+     * Creates a copy of DefaultFabricNetwork instance.
+     *
+     * @param fabricNetwork DefaultFabricNetwork instance
+     * @return the copy of the DefaultFabricNetwork instance
+     */
+    public static FabricNetwork of(FabricNetwork fabricNetwork) {
+        Objects.requireNonNull(fabricNetwork);
+        DefaultFabricNetwork fabricNetworkCopy =
+                new DefaultFabricNetwork(fabricNetwork.name(), fabricNetwork.encapsulation());
+        fabricNetworkCopy.interfaceNames.addAll(fabricNetwork.interfaceNames());
+        fabricNetworkCopy.forward = (ALLOW_ETH_ADDRESS_SELECTOR) && fabricNetwork.isForward();
+        fabricNetworkCopy.broadcast = (ALLOW_ETH_ADDRESS_SELECTOR) && fabricNetwork.isBroadcast();
+        fabricNetworkCopy.interfaces.addAll(fabricNetwork.interfaces());
+        fabricNetworkCopy.hostIds.addAll(fabricNetwork.hostIds());
+        fabricNetworkCopy.setDirty(fabricNetwork.isDirty());
+        return fabricNetworkCopy;
+    }
+
+    // field queries
+
+    @Override
+    public String name() {
+        return name;
+    }
+
+    @Override
+    public Set<String> interfaceNames() {
+        return ImmutableSet.copyOf(interfaceNames);
+    }
+
+    @Override
+    public EncapsulationType encapsulation() {
+        return encapsulation;
+    }
+
+    @Override
+    public boolean isForward() {
+        return forward;
+    }
+
+    @Override
+    public boolean isBroadcast() {
+        return broadcast;
+    }
+
+    @Override
+    public Set<Interface> interfaces() {
+        return ImmutableSet.copyOf(interfaces);
+    }
+
+    @Override
+    public Set<HostId> hostIds() {
+        return ImmutableSet.copyOf(hostIds);
+    }
+
+    @Override
+    public boolean isDirty() {
+        return dirty;
+    }
+
+    @Override
+    public boolean contains(Interface iface) {
+        return interfaces.contains(iface);
+    }
+
+    @Override
+    public boolean contains(ConnectPoint port, VlanId vlanId) {
+        for (Interface iface : interfaces) {
+            if (iface.connectPoint().equals(port) && iface.vlan().equals(vlanId)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean contains(DeviceId deviceId) {
+        for (Interface iface : interfaces) {
+            if (iface.connectPoint().deviceId().equals(deviceId)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void addInterface(Interface iface) {
+        Objects.requireNonNull(iface);
+        if (interfaces.add(iface)) {
+            setDirty(true);
+        }
+    }
+
+    @Override
+    public void addHost(Host host) {
+        Objects.requireNonNull(host);
+        if (hostIds.add(host.id())) {
+            setDirty(true);
+        }
+    }
+
+    @Override
+    public void setDirty(boolean newDirty) {
+        dirty = newDirty;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("name", name)
+                .add("interfaceNames", interfaceNames)
+                .add("encapsulation", encapsulation)
+                .add("forward", forward)
+                .add("broadcast", broadcast)
+                .add("interfaces", interfaces)
+                .add("hostIds", hostIds)
+                .add("isDirty", dirty)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof DefaultFabricNetwork)) {
+            return false;
+        }
+        DefaultFabricNetwork other = (DefaultFabricNetwork) obj;
+        return Objects.equals(other.name, this.name)
+                && Objects.equals(other.interfaceNames, this.interfaceNames)
+                && Objects.equals(other.encapsulation, this.encapsulation)
+                && Objects.equals(other.forward, this.forward)
+                && Objects.equals(other.broadcast, this.broadcast)
+                && Objects.equals(other.interfaces, this.interfaces)
+                && Objects.equals(other.hostIds, this.hostIds);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name, interfaces, encapsulation, forward, broadcast);
+    }
+
+    /**
+     * Returns new builder instance.
+     *
+     * @return fabric network builder
+     */
+    public static DefaultFabricNetworkBuilder builder() {
+        return new DefaultFabricNetworkBuilder();
+    }
+
+    /**
+     * A builder class for fabric network.
+     */
+    public static final class DefaultFabricNetworkBuilder implements Builder {
+        private String name;
+        private Set<String> interfaceNames;
+        private EncapsulationType encapsulation;
+        private boolean forward;
+        private boolean broadcast;
+
+        private DefaultFabricNetworkBuilder() {
+        }
+
+        @Override
+        public Builder name(String name) {
+            this.name = name;
+            return this;
+        }
+
+        @Override
+        public Builder interfaceNames(Set<String> interfaceNames) {
+            this.interfaceNames = interfaceNames;
+            return this;
+        }
+
+        @Override
+        public Builder encapsulation(EncapsulationType encapsulation) {
+            this.encapsulation = encapsulation;
+            return this;
+        }
+
+        @Override
+        public Builder forward(boolean forward) {
+            this.forward = forward;
+            return this;
+        }
+
+        @Override
+        public Builder broadcast(boolean broadcast) {
+            this.broadcast = broadcast;
+            return this;
+        }
+
+        @Override
+        public FabricNetwork build() {
+            checkArgument(name != null, NOT_NULL_MSG, "name");
+            return new DefaultFabricNetwork(name, interfaceNames,
+                    encapsulation, forward, broadcast);
+        }
+    }
+}
\ No newline at end of file
diff --git a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/DefaultFabricRoute.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/DefaultFabricRoute.java
new file mode 100644
index 0000000..6b9a132
--- /dev/null
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/DefaultFabricRoute.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.impl;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.simplefabric.api.FabricRoute;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Represents a route.
+ */
+public final class DefaultFabricRoute implements FabricRoute {
+
+    private static final String VERSION_MISMATCH =
+            "Prefix and next hop must be in the same address family";
+
+    private static final NodeId UNDEFINED = new NodeId("-");
+
+    private final Source source;
+    private final IpPrefix prefix;
+    private final IpAddress nextHop;
+    private final NodeId sourceNode;
+
+    /**
+     * Creates a route.
+     *
+     * @param source route source
+     * @param prefix IP prefix
+     * @param nextHop next hop IP address
+     */
+    private DefaultFabricRoute(Source source, IpPrefix prefix, IpAddress nextHop) {
+        this(source, prefix, nextHop, UNDEFINED);
+    }
+
+    /**
+     * Creates a route.
+     *
+     * @param source route source
+     * @param prefix IP prefix
+     * @param nextHop next hop IP address
+     * @param sourceNode ONOS node the route was sourced from
+     */
+    private DefaultFabricRoute(Source source, IpPrefix prefix,
+                              IpAddress nextHop, NodeId sourceNode) {
+        this.source = checkNotNull(source);
+        this.prefix = prefix;
+        this.nextHop = nextHop;
+        this.sourceNode = checkNotNull(sourceNode);
+    }
+
+    @Override
+    public Source source() {
+        return source;
+    }
+
+    @Override
+    public IpPrefix prefix() {
+        return prefix;
+    }
+
+    @Override
+    public IpAddress nextHop() {
+        return nextHop;
+    }
+
+    @Override
+    public NodeId sourceNode() {
+        return sourceNode;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(prefix, nextHop);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+
+        if (!(other instanceof DefaultFabricRoute)) {
+            return false;
+        }
+
+        DefaultFabricRoute that = (DefaultFabricRoute) other;
+
+        return Objects.equals(this.prefix, that.prefix) &&
+                Objects.equals(this.nextHop, that.nextHop);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("prefix", prefix)
+                .add("nextHop", nextHop)
+                .toString();
+    }
+
+    /**
+     * Returns new builder instance.
+     *
+     * @return fabric route builder
+     */
+    public static DefaultFabricRouteBuilder builder() {
+        return new DefaultFabricRouteBuilder();
+    }
+
+    /**
+     * A builder class for fabric route.
+     */
+    public static final class DefaultFabricRouteBuilder implements Builder {
+        private Source source;
+        private IpPrefix prefix;
+        private IpAddress nextHop;
+        private NodeId sourceNode;
+
+        private DefaultFabricRouteBuilder() {
+        }
+
+        @Override
+        public Builder source(Source source) {
+            this.source = source;
+            return this;
+        }
+
+        @Override
+        public Builder prefix(IpPrefix prefix) {
+            this.prefix = prefix;
+            return this;
+        }
+
+        @Override
+        public Builder nextHop(IpAddress nextHop) {
+            this.nextHop = nextHop;
+            return this;
+        }
+
+        @Override
+        public Builder sourceNode(NodeId sourceNode) {
+            this.sourceNode = sourceNode;
+            return this;
+        }
+
+        @Override
+        public FabricRoute build() {
+
+            checkNotNull(prefix);
+            checkNotNull(nextHop);
+            checkArgument(prefix.version().equals(nextHop.version()), VERSION_MISMATCH);
+
+            if (sourceNode != null) {
+                return new DefaultFabricRoute(source, prefix, nextHop, sourceNode);
+            } else {
+                return new DefaultFabricRoute(source, prefix, nextHop);
+            }
+        }
+    }
+}
diff --git a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/DefaultFabricSubnet.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/DefaultFabricSubnet.java
new file mode 100644
index 0000000..b7fec47
--- /dev/null
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/DefaultFabricSubnet.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.impl;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.EncapsulationType;
+import org.onosproject.simplefabric.api.FabricSubnet;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Configuration details for an ip subnet entry.
+ */
+public final class DefaultFabricSubnet implements FabricSubnet {
+
+    private static final String NOT_NULL_MSG = "FabricSubnet % cannot be null";
+
+    private final IpPrefix prefix;
+    private final IpAddress gatewayIp;
+    private final MacAddress gatewayMac;
+    private EncapsulationType encapsulation;
+    private final String networkName;
+
+    /**
+     * Creates a new subnet entry.
+     *
+     * @param prefix  an ip subnet
+     * @param gatewayIp IP of the virtual gateway
+     * @param gatewayMac MacAddress of the virtual gateway
+     * @param encapsulation encapsulation type
+     * @param networkName network name
+     */
+    private DefaultFabricSubnet(IpPrefix prefix, IpAddress gatewayIp,
+                                MacAddress gatewayMac, EncapsulationType encapsulation,
+                                String networkName) {
+        this.prefix = prefix;
+        this.gatewayIp = gatewayIp;
+        this.gatewayMac = gatewayMac;
+        this.encapsulation = encapsulation;
+        this.networkName = networkName;
+    }
+
+    @Override
+    public IpPrefix prefix() {
+        return prefix;
+    }
+
+    @Override
+    public IpAddress gatewayIp() {
+        return gatewayIp;
+    }
+
+    @Override
+    public MacAddress gatewayMac() {
+        return gatewayMac;
+    }
+
+    @Override
+    public EncapsulationType encapsulation() {
+        return encapsulation;
+    }
+
+    @Override
+    public String networkName() {
+        return networkName;
+    }
+
+    @Override
+    public boolean isIp4() {
+        return prefix.isIp4();
+    }
+
+    @Override
+    public boolean isIp6() {
+        return prefix.isIp6();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(prefix, gatewayIp, gatewayMac, encapsulation, networkName);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof DefaultFabricSubnet)) {
+            return false;
+        }
+        DefaultFabricSubnet that = (DefaultFabricSubnet) obj;
+        return Objects.equals(this.prefix, that.prefix)
+                && Objects.equals(this.gatewayIp, that.gatewayIp)
+                && Objects.equals(this.gatewayMac, that.gatewayMac)
+                && Objects.equals(this.encapsulation, that.encapsulation)
+                && Objects.equals(this.networkName, that.networkName);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("prefix", prefix)
+                .add("gatewayIp", gatewayIp)
+                .add("gatewayMac", gatewayMac)
+                .add("encapsulation", encapsulation)
+                .add("networkName", networkName)
+                .toString();
+    }
+
+    /**
+     * Returns new builder instance.
+     *
+     * @return fabric IP subnet builder
+     */
+    public static DefaultSubnetBuilder builder() {
+        return new DefaultSubnetBuilder();
+    }
+
+    /**
+     * A builder class for Ip Subnet.
+     */
+    public static final class DefaultSubnetBuilder implements Builder {
+        private IpPrefix prefix;
+        private IpAddress gatewayIp;
+        private MacAddress gatewayMac;
+        private EncapsulationType encapsulation;
+        private String networkName;
+
+        private DefaultSubnetBuilder() {
+        }
+
+        @Override
+        public Builder prefix(IpPrefix prefix) {
+            this.prefix = prefix;
+            return this;
+        }
+
+        @Override
+        public Builder gatewayIp(IpAddress gatewayIp) {
+            this.gatewayIp = gatewayIp;
+            return this;
+        }
+
+        @Override
+        public Builder gatewayMac(MacAddress gatewayMac) {
+            this.gatewayMac = gatewayMac;
+            return this;
+        }
+
+        @Override
+        public Builder encapsulation(EncapsulationType encapsulation) {
+            this.encapsulation = encapsulation;
+            return this;
+        }
+
+        @Override
+        public Builder networkName(String networkName) {
+            this.networkName = networkName;
+            return this;
+        }
+
+        @Override
+        public FabricSubnet build() {
+            checkArgument(prefix != null, NOT_NULL_MSG, "prefix");
+            checkArgument(gatewayIp != null, NOT_NULL_MSG, "gatewayIp");
+            checkArgument(gatewayMac != null, NOT_NULL_MSG, "gatewayMac");
+            checkArgument(networkName != null, NOT_NULL_MSG, "name");
+
+            if (this.encapsulation == null) {
+                encapsulation = EncapsulationType.NONE;
+            }
+
+            return new DefaultFabricSubnet(prefix, gatewayIp, gatewayMac,
+                    encapsulation, networkName);
+        }
+    }
+}
\ No newline at end of file
diff --git a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricConfig.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricConfig.java
new file mode 100644
index 0000000..1d4b97c
--- /dev/null
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricConfig.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.impl;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.Sets;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.EncapsulationType;
+import org.onosproject.net.config.Config;
+import org.onosproject.simplefabric.api.FabricNetwork;
+import org.onosproject.simplefabric.api.FabricRoute;
+import org.onosproject.simplefabric.api.FabricSubnet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Set;
+
+/**
+ * Configuration object for prefix config.
+ */
+public class SimpleFabricConfig extends Config<ApplicationId> {
+    public static final String KEY = "simpleFabric";
+
+    private static final String FABRIC_NETWORKS = "fabricNetworks";
+    private static final String NAME = "name";
+    private static final String INTERFACES = "interfaces";
+    private static final String ENCAPSULATION = "encapsulation";
+    private static final String IS_FORWARD = "isForward";
+    private static final String IS_BROADCAST = "isBroadcast";
+
+    private static final String FABRIC_SUBNETS = "fabricSubnets";
+    private static final String PREFIX = "prefix";
+    private static final String GATEWAY_IP = "gatewayIp";
+    private static final String GATEWAY_MAC = "gatewayMac";
+    private static final String NETWORK_NAME = "networkName";
+
+    private static final String FABRIC_ROUTES = "fabricRoutes";
+    private static final String NEXT_HOP = "nextHop";
+
+    private static final String NONE_ENCAPSULATION = "NONE";
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    /**
+     * Returns all fabric networks in this configuration.
+     *
+     * @return a set of fabric networks
+     */
+    public Set<FabricNetwork> fabricNetworks() {
+        Set<FabricNetwork> fabricNetworks = Sets.newHashSet();
+        JsonNode fabricNetworkNodes = object.get(FABRIC_NETWORKS);
+        if (fabricNetworkNodes == null) {
+            return fabricNetworks;
+        }
+
+        fabricNetworkNodes.forEach(jsonNode -> {
+            Set<String> ifaces = Sets.newHashSet();
+            JsonNode fabricNetworkIfaces = jsonNode.path(INTERFACES);
+            if (fabricNetworkIfaces == null) {
+                log.warn("Fabric network interfaces cannot find {}; skip: jsonNode={}", INTERFACES, jsonNode);
+            } else if (!fabricNetworkIfaces.toString().isEmpty()) {
+                fabricNetworkIfaces.forEach(ifacesNode -> ifaces.add(ifacesNode.asText()));
+            }
+            String encapsulation = NONE_ENCAPSULATION;   // NONE or VLAN
+            if (jsonNode.hasNonNull(ENCAPSULATION)) {
+                encapsulation = jsonNode.get(ENCAPSULATION).asText();
+            }
+            boolean isForward = true;
+            if (jsonNode.hasNonNull(IS_FORWARD)) {
+                isForward = jsonNode.get(IS_FORWARD).asBoolean();
+            }
+            boolean isBroadcast = true;
+            if (jsonNode.hasNonNull(IS_BROADCAST)) {
+                isBroadcast = jsonNode.get(IS_BROADCAST).asBoolean();
+            }
+            try {
+                fabricNetworks.add(DefaultFabricNetwork.builder()
+                                    .name(jsonNode.get(NAME).asText())
+                                    .interfaceNames(ifaces)
+                                    .encapsulation(EncapsulationType.enumFromString(encapsulation))
+                                    .forward(isForward)
+                                    .broadcast(isBroadcast)
+                                    .build());
+            } catch (Exception e) {
+                log.warn("Fabric network parse failed; skip: jsonNode={}", jsonNode);
+            }
+        });
+        return fabricNetworks;
+    }
+
+    /**
+     * Gets the set of configured local subnets.
+     *
+     * @return a set of subnets
+     */
+    public Set<FabricSubnet> fabricSubnets() {
+        Set<FabricSubnet> subnets = Sets.newHashSet();
+        JsonNode subnetsNode = object.get(FABRIC_SUBNETS);
+        if (subnetsNode == null) {
+            log.warn("FabricSubnets is null!");
+            return subnets;
+        }
+
+        subnetsNode.forEach(jsonNode -> {
+            String encapsulation = NONE_ENCAPSULATION;   // NONE or VLAN
+            if (jsonNode.hasNonNull(ENCAPSULATION)) {
+                encapsulation = jsonNode.get(ENCAPSULATION).asText();
+            }
+            try {
+                subnets.add(DefaultFabricSubnet.builder()
+                            .prefix(IpPrefix.valueOf(jsonNode.get(PREFIX).asText()))
+                            .gatewayIp(IpAddress.valueOf(jsonNode.get(GATEWAY_IP).asText()))
+                            .gatewayMac(MacAddress.valueOf(jsonNode.get(GATEWAY_MAC).asText()))
+                            .encapsulation(EncapsulationType.enumFromString(encapsulation))
+                            .networkName(jsonNode.get(NETWORK_NAME).asText())
+                            .build());
+            } catch (Exception e) {
+                log.warn("Fabric subnet parse failed; skip: jsonNode={}", jsonNode);
+            }
+        });
+
+        return subnets;
+    }
+
+    /**
+     * Returns all routes in this configuration.
+     *
+     * @return a set of routes.
+     */
+    public Set<FabricRoute> fabricRoutes() {
+        Set<FabricRoute> routes = Sets.newHashSet();
+
+        JsonNode routesNode = object.get(FABRIC_ROUTES);
+        if (routesNode == null) {
+            return routes;
+        }
+
+        routesNode.forEach(jsonNode -> {
+            try {
+                routes.add(DefaultFabricRoute.builder()
+                        .source(FabricRoute.Source.STATIC)
+                        .prefix(IpPrefix.valueOf(jsonNode.path(PREFIX).asText()))
+                        .nextHop(IpAddress.valueOf(jsonNode.path(NEXT_HOP).asText()))
+                        .build());
+            } catch (IllegalArgumentException e) {
+                log.warn("Fabric router parse error; skip: jsonNode={}", jsonNode);
+            }
+        });
+
+        return routes;
+    }
+}
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricL2Forward.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricForwarding.java
similarity index 74%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricL2Forward.java
rename to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricForwarding.java
index c8ecdd7..48fdf34 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricL2Forward.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricForwarding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.simplefabric;
+package org.onosproject.simplefabric.impl;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -29,7 +29,6 @@
 import org.onlab.packet.VlanId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.net.intf.Interface;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.EncapsulationType;
 import org.onosproject.net.FilteredConnectPoint;
@@ -46,19 +45,28 @@
 import org.onosproject.net.intent.SinglePointToMultiPointIntent;
 import org.onosproject.net.intent.constraint.EncapsulationConstraint;
 import org.onosproject.net.intent.constraint.PartialFailureConstraint;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.simplefabric.api.FabricNetwork;
+import org.onosproject.simplefabric.api.SimpleFabricEvent;
+import org.onosproject.simplefabric.api.SimpleFabricListener;
+import org.onosproject.simplefabric.api.SimpleFabricService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Set;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Objects;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
+import static org.onosproject.simplefabric.api.Constants.FORWARDING_APP_ID;
+import static org.onosproject.simplefabric.api.Constants.PRI_L2NETWORK_BROADCAST;
+import static org.onosproject.simplefabric.api.Constants.PRI_L2NETWORK_UNICAST;
+
 
 /**
  * An implementation of L2NetworkOperationService.
@@ -66,13 +74,13 @@
  * application.
  */
 @Component(immediate = true, enabled = false)
-public class SimpleFabricL2Forward {
+public class SimpleFabricForwarding {
 
     public static final String BROADCAST = "BCAST";
     public static final String UNICAST = "UNI";
 
     private final Logger log = LoggerFactory.getLogger(getClass());
-    protected ApplicationId l2ForwardAppId;
+    protected ApplicationId appId;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
@@ -97,20 +105,20 @@
 
     @Activate
     public void activate() {
-        l2ForwardAppId = coreService.registerApplication(simpleFabric.L2FORWARD_APP_ID);
-        log.info("simple fabric l2 forwaring starting with l2net app id {}", l2ForwardAppId.toString());
+        appId = coreService.registerApplication(FORWARDING_APP_ID);
+        log.info("simple fabric forwarding starting with l2net app id {}", appId.toString());
 
         simpleFabric.addListener(simpleFabricListener);
 
         refresh();
         checkIntentsPurge();
 
-        log.info("simple fabric l2forward started");
+        log.info("simple fabric forwarding started");
     }
 
     @Deactivate
     public void deactivate() {
-        log.info("simple fabric l2forward stopping");
+        log.info("simple fabric forwarding stopping");
 
         simpleFabric.removeListener(simpleFabricListener);
 
@@ -133,26 +141,27 @@
         //bctIntentsMap.clear();
         //uniIntentsMap.clear();
 
-        log.info("simple fabric l2forward stopped");
+        log.info("simple fabric forwarding stopped");
     }
 
     private void refresh() {
-        log.debug("simple fabric l2forward refresh");
+        log.debug("simple fabric forwarding refresh");
 
         Map<Key, SinglePointToMultiPointIntent> newBctIntentsMap = Maps.newConcurrentMap();
         Map<Key, MultiPointToSinglePointIntent> newUniIntentsMap = Maps.newConcurrentMap();
 
-        for (L2Network l2Network : simpleFabric.getL2Networks()) {
-            // scans all l2network regardless of dirty flag
-            // if l2Network.l2Forward == false or number of interfaces() < 2, no Intents generated
-            for (SinglePointToMultiPointIntent intent : buildBrcIntents(l2Network)) {
+        for (FabricNetwork fabricNetwork : simpleFabric.fabricNetworks()) {
+            // scans all l2network regardless of isDirty flag
+            // if fabricNetwork.isForward == false or number of interfaces() < 2, no Intents generated
+            for (SinglePointToMultiPointIntent intent : buildBrcIntents(fabricNetwork)) {
                 newBctIntentsMap.put(intent.key(), intent);
             }
-            for (MultiPointToSinglePointIntent intent : buildUniIntents(l2Network, hostsFromL2Network(l2Network))) {
+            for (MultiPointToSinglePointIntent intent :
+                    buildUniIntents(fabricNetwork, hostsFromL2Network(fabricNetwork))) {
                 newUniIntentsMap.put(intent.key(), intent);
             }
-            if (l2Network.dirty()) {
-                l2Network.setDirty(false);
+            if (fabricNetwork.isDirty()) {
+                fabricNetwork.setDirty(false);
             }
         }
 
@@ -160,7 +169,8 @@
         for (SinglePointToMultiPointIntent intent : bctIntentsMap.values()) {
             SinglePointToMultiPointIntent newIntent = newBctIntentsMap.get(intent.key());
             if (newIntent == null) {
-                log.info("simple fabric l2forward withdraw broadcast intent: {}", intent.key().toString());
+                log.info("simple fabric forwarding withdraw broadcast intent: {}",
+                        intent.key().toString());
                 toBePurgedIntentKeys.add(intent.key());
                 intentService.withdraw(intent);
                 bctUpdated = true;
@@ -174,7 +184,8 @@
                     !oldIntent.selector().equals(intent.selector()) ||
                     !oldIntent.treatment().equals(intent.treatment()) ||
                     !oldIntent.constraints().equals(intent.constraints())) {
-                log.info("simple fabric l2forward submit broadcast intent: {}", intent.key().toString());
+                log.info("simple fabric forwarding submit broadcast intent: {}",
+                        intent.key().toString());
                 toBePurgedIntentKeys.remove(intent.key());
                 intentService.submit(intent);
                 bctUpdated = true;
@@ -185,7 +196,8 @@
         for (MultiPointToSinglePointIntent intent : uniIntentsMap.values()) {
             MultiPointToSinglePointIntent newIntent = newUniIntentsMap.get(intent.key());
             if (newIntent == null) {
-                log.info("simple fabric l2forward withdraw unicast intent: {}", intent.key().toString());
+                log.info("simple fabric forwarding withdraw unicast intent: {}",
+                        intent.key().toString());
                 toBePurgedIntentKeys.add(intent.key());
                 intentService.withdraw(intent);
                 uniUpdated = true;
@@ -199,7 +211,8 @@
                     !oldIntent.selector().equals(intent.selector()) ||
                     !oldIntent.treatment().equals(intent.treatment()) ||
                     !oldIntent.constraints().equals(intent.constraints())) {
-                log.info("simple fabric l2forward submit unicast intent: {}", intent.key().toString());
+                log.info("simple fabric forwarding submit unicast intent: {}",
+                        intent.key().toString());
                 toBePurgedIntentKeys.remove(intent.key());
                 intentService.submit(intent);
                 uniUpdated = true;
@@ -221,13 +234,14 @@
             for (Key key : toBePurgedIntentKeys) {
                 Intent intentToPurge = intentService.getIntent(key);
                 if (intentToPurge == null) {
-                    log.info("simple fabric l2forward purged intent: key={}", key.toString());
+                    log.info("simple fabric forwarding purged intent: key={}", key.toString());
                     purgedKeys.add(key);
                 } else {
                     switch (intentService.getIntentState(key)) {
                     case FAILED:
                     case WITHDRAWN:
-                        log.info("simple fabric l2forward try to purge intent: key={}", key.toString());
+                        log.info("simple fabric forwarding try to purge intent: key={}",
+                                key.toString());
                         intentService.purge(intentToPurge);
                         break;
                     case INSTALL_REQ:
@@ -235,7 +249,7 @@
                     case INSTALLING:
                     case RECOMPILING:
                     case COMPILING:
-                        log.warn("simple fabric l2forward withdraw intent to purge: key={}", key);
+                        log.warn("simple fabric forwarding withdraw intent to purge: key={}", key);
                         intentService.withdraw(intentToPurge);
                         break;
                     case WITHDRAW_REQ:
@@ -254,21 +268,21 @@
 
     // Generates Unicast Intents and broadcast Intents for the L2 Network.
 
-    private Set<Intent> generateL2NetworkIntents(L2Network l2Network) {
+    private Set<Intent> generateL2NetworkIntents(FabricNetwork fabricNetwork) {
         return new ImmutableSet.Builder<Intent>()
-                .addAll(buildBrcIntents(l2Network))
-                .addAll(buildUniIntents(l2Network, hostsFromL2Network(l2Network)))
+                .addAll(buildBrcIntents(fabricNetwork))
+                .addAll(buildUniIntents(fabricNetwork, hostsFromL2Network(fabricNetwork)))
                 .build();
     }
 
     // Build Boadcast Intents for a L2 Network.
-    private Set<SinglePointToMultiPointIntent> buildBrcIntents(L2Network l2Network) {
-        Set<Interface> interfaces = l2Network.interfaces();
-        if (interfaces.size() < 2 || !l2Network.l2Forward() || !l2Network.l2Broadcast()) {
+    private Set<SinglePointToMultiPointIntent> buildBrcIntents(FabricNetwork fabricNetwork) {
+        Set<Interface> interfaces = fabricNetwork.interfaces();
+        if (interfaces.size() < 2 || !fabricNetwork.isForward() || !fabricNetwork.isBroadcast()) {
             return ImmutableSet.of();
         }
         Set<SinglePointToMultiPointIntent> brcIntents = Sets.newHashSet();
-        ResourceGroup resourceGroup = ResourceGroup.of(l2Network.name());
+        ResourceGroup resourceGroup = ResourceGroup.of(fabricNetwork.name());
 
         // Generates broadcast Intents from any network interface to other
         // network interface from the L2 Network.
@@ -279,18 +293,21 @@
                     .filter(iface -> !iface.equals(src))
                     .map(this::buildFilteredConnectedPoint)
                     .collect(Collectors.toSet());
-            Key key = buildKey(l2Network.name(), "BCAST", srcFcp.connectPoint(), MacAddress.BROADCAST);
+            Key key = buildKey(fabricNetwork.name(), "BCAST",
+                    srcFcp.connectPoint(), MacAddress.BROADCAST);
             TrafficSelector selector = DefaultTrafficSelector.builder()
                     .matchEthDst(MacAddress.BROADCAST)
                     .build();
-            SinglePointToMultiPointIntent.Builder intentBuilder = SinglePointToMultiPointIntent.builder()
-                    .appId(l2ForwardAppId)
+            SinglePointToMultiPointIntent.Builder
+                    intentBuilder = SinglePointToMultiPointIntent.builder()
+                    .appId(appId)
                     .key(key)
                     .selector(selector)
                     .filteredIngressPoint(srcFcp)
                     .filteredEgressPoints(dstFcps)
-                    .constraints(buildConstraints(L2NETWORK_CONSTRAINTS, l2Network.encapsulation()))
-                    .priority(SimpleFabricService.PRI_L2NETWORK_BROADCAST)
+                    .constraints(buildConstraints(L2NETWORK_CONSTRAINTS,
+                            fabricNetwork.encapsulation()))
+                    .priority(PRI_L2NETWORK_BROADCAST)
                     .resourceGroup(resourceGroup);
             brcIntents.add(intentBuilder.build());
         });
@@ -298,30 +315,33 @@
     }
 
     // Builds unicast Intents for a L2 Network.
-    private Set<MultiPointToSinglePointIntent> buildUniIntents(L2Network l2Network, Set<Host> hosts) {
-        Set<Interface> interfaces = l2Network.interfaces();
-        if (!l2Network.l2Forward() || interfaces.size() < 2) {
+    private Set<MultiPointToSinglePointIntent> buildUniIntents(FabricNetwork fabricNetwork,
+                                                               Set<Host> hosts) {
+        Set<Interface> interfaces = fabricNetwork.interfaces();
+        if (!fabricNetwork.isForward() || interfaces.size() < 2) {
             return ImmutableSet.of();
         }
         Set<MultiPointToSinglePointIntent> uniIntents = Sets.newHashSet();
-        ResourceGroup resourceGroup = ResourceGroup.of(l2Network.name());
+        ResourceGroup resourceGroup = ResourceGroup.of(fabricNetwork.name());
         hosts.forEach(host -> {
             FilteredConnectPoint hostFcp = buildFilteredConnectedPoint(host);
             Set<FilteredConnectPoint> srcFcps = interfaces.stream()
                     .map(this::buildFilteredConnectedPoint)
                     .filter(fcp -> !fcp.equals(hostFcp))
                     .collect(Collectors.toSet());
-            Key key = buildKey(l2Network.name(), "UNI", hostFcp.connectPoint(), host.mac());
+            Key key = buildKey(fabricNetwork.name(), "UNI", hostFcp.connectPoint(), host.mac());
             TrafficSelector selector = DefaultTrafficSelector.builder()
                     .matchEthDst(host.mac()).build();
-            MultiPointToSinglePointIntent.Builder intentBuilder = MultiPointToSinglePointIntent.builder()
-                    .appId(l2ForwardAppId)
+            MultiPointToSinglePointIntent.Builder
+                    intentBuilder = MultiPointToSinglePointIntent.builder()
+                    .appId(appId)
                     .key(key)
                     .selector(selector)
                     .filteredIngressPoints(srcFcps)
                     .filteredEgressPoint(hostFcp)
-                    .constraints(buildConstraints(L2NETWORK_CONSTRAINTS, l2Network.encapsulation()))
-                    .priority(SimpleFabricService.PRI_L2NETWORK_UNICAST)
+                    .constraints(buildConstraints(L2NETWORK_CONSTRAINTS,
+                            fabricNetwork.encapsulation()))
+                    .priority(PRI_L2NETWORK_UNICAST)
                     .resourceGroup(resourceGroup);
             uniIntents.add(intentBuilder.build());
         });
@@ -331,8 +351,8 @@
 
     // Intent generate utilities
 
-    private Set<Host> hostsFromL2Network(L2Network l2Network) {
-        Set<Interface> interfaces = l2Network.interfaces();
+    private Set<Host> hostsFromL2Network(FabricNetwork fabricNetwork) {
+        Set<Interface> interfaces = fabricNetwork.interfaces();
         return interfaces.stream()
                 .map(this::hostsFromInterface)
                 .flatMap(Collection::stream)
@@ -346,11 +366,14 @@
                 .collect(Collectors.toSet());
     }
 
-    private Key buildKey(String l2NetworkName, String type, ConnectPoint cPoint, MacAddress dstMac) {
-        return Key.of(l2NetworkName + "-" + type + "-" + cPoint.toString() + "-" + dstMac, l2ForwardAppId);
+    private Key buildKey(String l2NetworkName, String type,
+                         ConnectPoint cPoint, MacAddress dstMac) {
+        return Key.of(l2NetworkName + "-" + type + "-" +
+                cPoint.toString() + "-" + dstMac, appId);
     }
 
-    private List<Constraint> buildConstraints(List<Constraint> constraints, EncapsulationType encapsulation) {
+    private List<Constraint> buildConstraints(List<Constraint> constraints,
+                                              EncapsulationType encapsulation) {
         if (!encapsulation.equals(EncapsulationType.NONE)) {
             List<Constraint> newConstraints = new ArrayList<>(constraints);
             constraints.stream()
@@ -385,25 +408,27 @@
     // Dump command handler
     private void dump(String subject, PrintStream out) {
         if ("intents".equals(subject)) {
-            out.println("L2Forward Broadcast Intents:\n");
+            out.println("Forwarding Broadcast Intents:\n");
             for (SinglePointToMultiPointIntent intent: bctIntentsMap.values()) {
                 out.println("    " + intent.key().toString()
                           + ": " + intent.selector().criteria()
                           + ", [" + intent.filteredIngressPoint().connectPoint()
                           + "] -> " + intent.filteredEgressPoints().stream()
-                                      .map(FilteredConnectPoint::connectPoint).collect(Collectors.toSet()));
+                                      .map(FilteredConnectPoint::connectPoint)
+                                        .collect(Collectors.toSet()));
             }
             out.println("");
-            out.println("L2Forward Unicast Intents:\n");
+            out.println("Forwarding Unicast Intents:\n");
             for (MultiPointToSinglePointIntent intent: uniIntentsMap.values()) {
                 out.println("    " + intent.key().toString()
                           + ": " + intent.selector().criteria()
                           + ", [" + intent.filteredIngressPoints().stream()
-                                    .map(FilteredConnectPoint::connectPoint).collect(Collectors.toSet())
+                                    .map(FilteredConnectPoint::connectPoint)
+                                    .collect(Collectors.toSet())
                           + "] -> " + intent.filteredEgressPoint().connectPoint());
             }
             out.println("");
-            out.println("L2Forward Intents to Be Purged:\n");
+            out.println("Forwarding Intents to Be Purged:\n");
             for (Key key: toBePurgedIntentKeys) {
                 out.println("    " + key.toString());
             }
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricManager.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricManager.java
similarity index 72%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricManager.java
rename to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricManager.java
index d42f8e1..7a4e5d8 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricManager.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.simplefabric;
+package org.onosproject.simplefabric.impl;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
@@ -64,6 +64,12 @@
 import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
 import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.onosproject.simplefabric.api.FabricNetwork;
+import org.onosproject.simplefabric.api.FabricRoute;
+import org.onosproject.simplefabric.api.FabricSubnet;
+import org.onosproject.simplefabric.api.SimpleFabricEvent;
+import org.onosproject.simplefabric.api.SimpleFabricListener;
+import org.onosproject.simplefabric.api.SimpleFabricService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -75,7 +81,15 @@
 import java.util.Map;
 import java.util.Set;
 
-import static org.onosproject.simplefabric.RouteTools.createBinaryString;
+import static org.onosproject.simplefabric.api.Constants.ALLOW_ETH_ADDRESS_SELECTOR;
+import static org.onosproject.simplefabric.api.Constants.ALLOW_IPV6;
+import static org.onosproject.simplefabric.api.Constants.APP_ID;
+import static org.onosproject.simplefabric.api.Constants.IDLE_INTERVAL_MSEC;
+import static org.onosproject.simplefabric.api.Constants.REACTIVE_ALLOW_LINK_CP;
+import static org.onosproject.simplefabric.api.Constants.REACTIVE_HASHED_PATH_SELECTION;
+import static org.onosproject.simplefabric.api.Constants.REACTIVE_MATCH_IP_PROTO;
+import static org.onosproject.simplefabric.api.Constants.REACTIVE_SINGLE_TO_SINGLE;
+import static org.onosproject.simplefabric.util.RouteTools.createBinaryString;
 
 
 /**
@@ -118,25 +132,25 @@
     // SimpleFabric variables
     private ApplicationId appId = null;
 
-    // l2 broadcast networks
-    private Set<L2Network> l2Networks = new HashSet<>();
-    private Set<Interface> l2NetworkInterfaces = new HashSet<>();
+    // fabric networks
+    private Set<FabricNetwork> fabricNetworks = new HashSet<>();
+    private Set<Interface> networkInterfaces = new HashSet<>();
 
     // Subnet table
-    private Set<IpSubnet> ipSubnets = new HashSet<>();
-    private InvertedRadixTree<IpSubnet> ip4SubnetTable =
+    private Set<FabricSubnet> fabricSubnets = new HashSet<>();
+    private InvertedRadixTree<FabricSubnet> ip4SubnetTable =
                  new ConcurrentInvertedRadixTree<>(new DefaultByteArrayNodeFactory());
-    private InvertedRadixTree<IpSubnet> ip6SubnetTable =
+    private InvertedRadixTree<FabricSubnet> ip6SubnetTable =
                  new ConcurrentInvertedRadixTree<>(new DefaultByteArrayNodeFactory());
 
-    // Border Route table
-    private Set<Route> borderRoutes = new HashSet<>();
-    private InvertedRadixTree<Route> ip4BorderRouteTable =
+    // Fabric Route table
+    private Set<FabricRoute> fabricRoutes = new HashSet<>();
+    private InvertedRadixTree<FabricRoute> ip4BorderRouteTable =
                  new ConcurrentInvertedRadixTree<>(new DefaultByteArrayNodeFactory());
-    private InvertedRadixTree<Route> ip6BorderRouteTable =
+    private InvertedRadixTree<FabricRoute> ip6BorderRouteTable =
                  new ConcurrentInvertedRadixTree<>(new DefaultByteArrayNodeFactory());
 
-    // VirtialGateway
+    // Virtual gateway
     private Map<IpAddress, MacAddress> virtualGatewayIpMacMap = Maps.newConcurrentMap();
 
     // Refresh monitor thread
@@ -149,7 +163,6 @@
     private final InternalNetworkConfigListener configListener = new InternalNetworkConfigListener();
     private final InternalDeviceListener deviceListener = new InternalDeviceListener();
     private final InternalHostListener hostListener = new InternalHostListener();
-    private final InternalInterfaceListener interfaceListener = new InternalInterfaceListener();
 
     private ConfigFactory<ApplicationId, SimpleFabricConfig> simpleFabricConfigFactory =
         new ConfigFactory<ApplicationId, SimpleFabricConfig>(
@@ -178,9 +191,9 @@
         hostService.addListener(hostListener);
 
         componentService.activate(appId, SimpleFabricNeighbour.class.getName());
-        componentService.activate(appId, SimpleFabricReactiveRouting.class.getName());
-        if (SimpleFabricService.ALLOW_ETH_ADDRESS_SELECTOR) {
-            componentService.activate(appId, SimpleFabricL2Forward.class.getName());
+        componentService.activate(appId, SimpleFabricRouting.class.getName());
+        if (ALLOW_ETH_ADDRESS_SELECTOR) {
+            componentService.activate(appId, SimpleFabricForwarding.class.getName());
         }
 
         refreshThread = new InternalRefreshThread();
@@ -194,9 +207,9 @@
         log.info("simple fabric stopping");
 
         componentService.deactivate(appId, SimpleFabricNeighbour.class.getName());
-        componentService.deactivate(appId, SimpleFabricReactiveRouting.class.getName());
-        if (SimpleFabricService.ALLOW_ETH_ADDRESS_SELECTOR) {
-            componentService.deactivate(appId, SimpleFabricL2Forward.class.getName());
+        componentService.deactivate(appId, SimpleFabricRouting.class.getName());
+        if (ALLOW_ETH_ADDRESS_SELECTOR) {
+            componentService.deactivate(appId, SimpleFabricForwarding.class.getName());
         }
 
         deviceService.removeListener(deviceListener);
@@ -211,7 +224,7 @@
     }
 
     // Set up from configuration
-    // returns found dirty and refresh listners are called (true) or not (false)
+    // returns found isDirty and refresh listeners are called (true) or not (false)
     private boolean refresh() {
         log.debug("simple fabric refresh");
         boolean dirty = false;
@@ -223,66 +236,66 @@
             return false;
         }
 
-        // l2Networks
-        Set<L2Network> newL2Networks = new HashSet<>();
-        Set<Interface> newL2NetworkInterfaces = new HashSet<>();
-        for (L2Network newL2NetworkConfig : config.getL2Networks()) {
-            L2Network newL2Network = L2Network.of(newL2NetworkConfig);
+        // fabricNetworks
+        Set<FabricNetwork> newFabricNetworks = new HashSet<>();
+        Set<Interface> newInterfaces = new HashSet<>();
+        for (FabricNetwork newFabricNetworkConfig : config.fabricNetworks()) {
+            FabricNetwork newFabricNetwork = DefaultFabricNetwork.of(newFabricNetworkConfig);
 
             // fill up interfaces and Hosts with active port only
-            for (String ifaceName : newL2NetworkConfig.interfaceNames()) {
+            for (String ifaceName : newFabricNetworkConfig.interfaceNames()) {
                 Interface iface = getInterfaceByName(ifaceName);
                 if (iface != null && deviceService.isAvailable(iface.connectPoint().deviceId())) {
-                     newL2Network.addInterface(iface);
-                     newL2NetworkInterfaces.add(iface);
+                     newFabricNetwork.addInterface(iface);
+                     newInterfaces.add(iface);
                 }
             }
             for (Host host : hostService.getHosts()) {
                 // consider host with ip only
                 if (!host.ipAddresses().isEmpty()) {
                     Interface iface = findAvailableDeviceHostInterface(host);
-                    if (iface != null && newL2Network.contains(iface)) {
-                        newL2Network.addHost(host);
+                    if (iface != null && newFabricNetwork.contains(iface)) {
+                        newFabricNetwork.addHost(host);
                     }
                 }
             }
-            newL2Network.setDirty(true);
+            newFabricNetwork.setDirty(true);
 
-            // update newL2Network's dirty flags if same entry already exists
-            for (L2Network prevL2Network : l2Networks) {
-                if (prevL2Network.equals(newL2Network)) {
-                    newL2Network.setDirty(prevL2Network.dirty());
+            // update newFabricNetwork's isDirty flags if same entry already exists
+            for (FabricNetwork prevFabricNetwork : fabricNetworks) {
+                if (prevFabricNetwork.equals(newFabricNetwork)) {
+                    newFabricNetwork.setDirty(prevFabricNetwork.isDirty());
                     break;
                 }
             }
-            newL2Networks.add(newL2Network);
+            newFabricNetworks.add(newFabricNetwork);
         }
-        if (!l2Networks.equals(newL2Networks)) {
-            l2Networks = newL2Networks;
+        if (!fabricNetworks.equals(newFabricNetworks)) {
+            fabricNetworks = newFabricNetworks;
             dirty = true;
         }
-        if (!l2NetworkInterfaces.equals(newL2NetworkInterfaces)) {
-            l2NetworkInterfaces = newL2NetworkInterfaces;
+        if (!networkInterfaces.equals(newInterfaces)) {
+            networkInterfaces = newInterfaces;
             dirty = true;
         }
 
-        // ipSubnets
-        Set<IpSubnet> newIpSubnets = config.ipSubnets();
-        InvertedRadixTree<IpSubnet> newIp4SubnetTable =
+        // default Fabric Subnets
+        Set<FabricSubnet> newFabricSubnets = config.fabricSubnets();
+        InvertedRadixTree<FabricSubnet> newIp4SubnetTable =
                  new ConcurrentInvertedRadixTree<>(new DefaultByteArrayNodeFactory());
-        InvertedRadixTree<IpSubnet> newIp6SubnetTable =
+        InvertedRadixTree<FabricSubnet> newIp6SubnetTable =
                  new ConcurrentInvertedRadixTree<>(new DefaultByteArrayNodeFactory());
         Map<IpAddress, MacAddress> newVirtualGatewayIpMacMap = Maps.newConcurrentMap();
-        for (IpSubnet subnet : newIpSubnets) {
-            if (subnet.ipPrefix().isIp4()) {
-                newIp4SubnetTable.put(createBinaryString(subnet.ipPrefix()), subnet);
+        for (FabricSubnet subnet : newFabricSubnets) {
+            if (subnet.prefix().isIp4()) {
+                newIp4SubnetTable.put(createBinaryString(subnet.prefix()), subnet);
             } else {
-                newIp6SubnetTable.put(createBinaryString(subnet.ipPrefix()), subnet);
+                newIp6SubnetTable.put(createBinaryString(subnet.prefix()), subnet);
             }
             newVirtualGatewayIpMacMap.put(subnet.gatewayIp(), subnet.gatewayMac());
         }
-        if (!ipSubnets.equals(newIpSubnets)) {
-            ipSubnets = newIpSubnets;
+        if (!fabricSubnets.equals(newFabricSubnets)) {
+            fabricSubnets = newFabricSubnets;
             ip4SubnetTable = newIp4SubnetTable;
             ip6SubnetTable = newIp6SubnetTable;
             dirty = true;
@@ -292,21 +305,21 @@
             dirty = true;
         }
 
-        // borderRoutes config handling
-        Set<Route> newBorderRoutes = config.borderRoutes();
-        if (!borderRoutes.equals(newBorderRoutes)) {
-            InvertedRadixTree<Route> newIp4BorderRouteTable =
+        // fabricRoutes config handling
+        Set<FabricRoute> newFabricRoutes = config.fabricRoutes();
+        if (!fabricRoutes.equals(newFabricRoutes)) {
+            InvertedRadixTree<FabricRoute> newIp4BorderRouteTable =
                     new ConcurrentInvertedRadixTree<>(new DefaultByteArrayNodeFactory());
-            InvertedRadixTree<Route> newIp6BorderRouteTable =
+            InvertedRadixTree<FabricRoute> newIp6BorderRouteTable =
                     new ConcurrentInvertedRadixTree<>(new DefaultByteArrayNodeFactory());
-            for (Route route : newBorderRoutes) {
+            for (FabricRoute route : newFabricRoutes) {
                 if (route.prefix().isIp4()) {
                     newIp4BorderRouteTable.put(createBinaryString(route.prefix()), route);
                 } else {
                     newIp6BorderRouteTable.put(createBinaryString(route.prefix()), route);
                 }
             }
-            borderRoutes = newBorderRoutes;
+            fabricRoutes = newFabricRoutes;
             ip4BorderRouteTable = newIp4BorderRouteTable;
             ip6BorderRouteTable = newIp6BorderRouteTable;
             dirty = true;
@@ -332,7 +345,7 @@
     }
 
     @Override
-    public ApplicationId getAppId() {
+    public ApplicationId appId() {
         if (appId == null) {
             appId = coreService.registerApplication(APP_ID);
         }
@@ -340,57 +353,57 @@
     }
 
     @Override
-    public Collection<L2Network> getL2Networks() {
-        return ImmutableSet.copyOf(l2Networks);
+    public Collection<FabricNetwork> fabricNetworks() {
+        return ImmutableSet.copyOf(fabricNetworks);
     }
 
     @Override
-    public Set<IpSubnet> getIpSubnets() {
-        return ImmutableSet.copyOf(ipSubnets);
+    public Set<FabricSubnet> defaultFabricSubnets() {
+        return ImmutableSet.copyOf(fabricSubnets);
     }
 
     @Override
-    public Set<Route> getBorderRoutes() {
-        return ImmutableSet.copyOf(borderRoutes);
+    public Set<FabricRoute> fabricRoutes() {
+        return ImmutableSet.copyOf(fabricRoutes);
     }
 
     @Override
-    public boolean isVMac(MacAddress mac) {
+    public boolean isVirtualGatewayMac(MacAddress mac) {
         return virtualGatewayIpMacMap.containsValue(mac);
     }
 
     @Override
-    public boolean isL2NetworkInterface(Interface intf) {
-        return l2NetworkInterfaces.contains(intf);
+    public boolean isFabricNetworkInterface(Interface intf) {
+        return networkInterfaces.contains(intf);
     }
 
     @Override
-    public MacAddress findVMacForIp(IpAddress ip) {
+    public MacAddress vMacForIp(IpAddress ip) {
         return virtualGatewayIpMacMap.get(ip);
     }
 
     @Override
-    public L2Network findL2Network(ConnectPoint port, VlanId vlanId) {
-        for (L2Network l2Network : l2Networks) {
-            if (l2Network.contains(port, vlanId)) {
-                return l2Network;
+    public FabricNetwork fabricNetwork(ConnectPoint port, VlanId vlanId) {
+        for (FabricNetwork fabricNetwork : fabricNetworks) {
+            if (fabricNetwork.contains(port, vlanId)) {
+                return fabricNetwork;
             }
         }
         return null;
     }
 
     @Override
-    public L2Network findL2Network(String name) {
-        for (L2Network l2Network : l2Networks) {
-            if (l2Network.name().equals(name)) {
-                return l2Network;
+    public FabricNetwork fabricNetwork(String name) {
+        for (FabricNetwork fabricNetwork : fabricNetworks) {
+            if (fabricNetwork.name().equals(name)) {
+                return fabricNetwork;
             }
         }
         return null;
     }
 
     @Override
-    public IpSubnet findIpSubnet(IpAddress ip) {
+    public FabricSubnet fabricSubnet(IpAddress ip) {
         if (ip.isIp4()) {
             return ip4SubnetTable.getValueForLongestKeyPrefixing(
                      createBinaryString(IpPrefix.valueOf(ip, Ip4Address.BIT_LENGTH)));
@@ -401,8 +414,8 @@
     }
 
     @Override
-    public Route findBorderRoute(IpAddress ip) {
-        // ASSUME: ipAddress is out of ipSubnet
+    public FabricRoute fabricRoute(IpAddress ip) {
+        // ASSUME: ipAddress is out of fabricSubnet
         if (ip.isIp4()) {
             return ip4BorderRouteTable.getValueForLongestKeyPrefixing(
                      createBinaryString(IpPrefix.valueOf(ip, Ip4Address.BIT_LENGTH)));
@@ -414,7 +427,7 @@
 
 
     @Override
-    public Interface findHostInterface(Host host) {
+    public Interface hostInterface(Host host) {
         return interfaceService.getInterfaces().stream()
                 .filter(iface -> iface.connectPoint().equals(host.location()) &&
                                  iface.vlan().equals(host.vlan()))
@@ -433,32 +446,32 @@
 
     @Override
     public boolean requestMac(IpAddress ip) {
-        IpSubnet ipSubnet = findIpSubnet(ip);
-        if (ipSubnet == null) {
-            log.warn("simple fabric request mac failed for unknown IpSubnet: {}", ip);
+        FabricSubnet fabricSubnet = fabricSubnet(ip);
+        if (fabricSubnet == null) {
+            log.warn("simple fabric request mac failed for unknown fabricSubnet: {}", ip);
             return false;
         }
-        L2Network l2Network = findL2Network(ipSubnet.l2NetworkName());
-        if (l2Network == null) {
-            log.warn("simple fabric request mac failed for unknown l2Network name {}: {}",
-                     ipSubnet.l2NetworkName(), ip);
+        FabricNetwork fabricNetwork = fabricNetwork(fabricSubnet.networkName());
+        if (fabricNetwork == null) {
+            log.warn("simple fabric request mac failed for unknown fabricNetwork name {}: {}",
+                     fabricSubnet.networkName(), ip);
             return false;
         }
-        log.debug("simple fabric send request mac L2Network {}: {}", l2Network.name(), ip);
-        for (Interface iface : l2Network.interfaces()) {
+        log.debug("simple fabric send request mac fabricNetwork {}: {}", fabricNetwork.name(), ip);
+        for (Interface iface : fabricNetwork.interfaces()) {
             Ethernet neighbourReq;
             if (ip.isIp4()) {
-                neighbourReq = ARP.buildArpRequest(ipSubnet.gatewayMac().toBytes(),
-                                                   ipSubnet.gatewayIp().toOctets(),
+                neighbourReq = ARP.buildArpRequest(fabricSubnet.gatewayMac().toBytes(),
+                                                   fabricSubnet.gatewayIp().toOctets(),
                                                    ip.toOctets(),
                                                    iface.vlan().toShort());
             } else {
                 byte[] soliciteIp = IPv6.getSolicitNodeAddress(ip.toOctets());
                 neighbourReq = NeighborSolicitation.buildNdpSolicit(
                                                    ip.toOctets(),
-                                                   ipSubnet.gatewayIp().toOctets(),
+                                                   fabricSubnet.gatewayIp().toOctets(),
                                                    soliciteIp,
-                                                   ipSubnet.gatewayMac().toBytes(),
+                                                   fabricSubnet.gatewayMac().toBytes(),
                                                    IPv6.getMCastMacAddress(soliciteIp),
                                                    iface.vlan());
             }
@@ -482,34 +495,28 @@
     protected void dump(String subject, PrintStream out) {
         if ("show".equals(subject)) {
             out.println("Static Configuration Flag:");
-            out.println("    ALLOW_IPV6="
-                        + SimpleFabricService.ALLOW_IPV6);
-            out.println("    ALLOW_ETH_ADDRESS_SELECTOR="
-                        + SimpleFabricService.ALLOW_ETH_ADDRESS_SELECTOR);
-            out.println("    REACTIVE_SINGLE_TO_SINGLE="
-                        + SimpleFabricService.REACTIVE_SINGLE_TO_SINGLE);
-            out.println("    REACTIVE_ALLOW_LINK_CP="
-                        + SimpleFabricService.REACTIVE_ALLOW_LINK_CP);
-            out.println("    REACTIVE_HASHED_PATH_SELECTION="
-                        + SimpleFabricService.REACTIVE_HASHED_PATH_SELECTION);
-            out.println("    REACTIVE_MATCH_IP_PROTO="
-                        + SimpleFabricService.REACTIVE_MATCH_IP_PROTO);
+            out.println("    ALLOW_IPV6=" + ALLOW_IPV6);
+            out.println("    ALLOW_ETH_ADDRESS_SELECTOR=" + ALLOW_ETH_ADDRESS_SELECTOR);
+            out.println("    REACTIVE_SINGLE_TO_SINGLE=" + REACTIVE_SINGLE_TO_SINGLE);
+            out.println("    REACTIVE_ALLOW_LINK_CP=" + REACTIVE_ALLOW_LINK_CP);
+            out.println("    REACTIVE_HASHED_PATH_SELECTION=" + REACTIVE_HASHED_PATH_SELECTION);
+            out.println("    REACTIVE_MATCH_IP_PROTO=" + REACTIVE_MATCH_IP_PROTO);
             out.println("");
             out.println("SimpleFabricAppId:");
-            out.println("    " + getAppId());
+            out.println("    " + appId());
             out.println("");
-            out.println("l2Networks:");
-            for (L2Network l2Network : getL2Networks()) {
-                out.println("    " + l2Network);
+            out.println("fabricNetworks:");
+            for (FabricNetwork fabricNetwork : fabricNetworks()) {
+                out.println("    " + fabricNetwork);
             }
             out.println("");
-            out.println("ipSubnets:");
-            for (IpSubnet ipSubnet : getIpSubnets()) {
-                out.println("    " + ipSubnet);
+            out.println("fabricSubnets:");
+            for (FabricSubnet fabricIpSubnet : defaultFabricSubnets()) {
+                out.println("    " + fabricIpSubnet);
             }
             out.println("");
-            out.println("borderRoutes:");
-            for (Route route : getBorderRoutes()) {
+            out.println("fabricRoutes:");
+            for (FabricRoute route : fabricRoutes()) {
                 out.println("    " + route);
             }
         }
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricNeighbour.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricNeighbour.java
similarity index 88%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricNeighbour.java
rename to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricNeighbour.java
index d506a7e..5d7c8b0 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricNeighbour.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricNeighbour.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.simplefabric;
+package org.onosproject.simplefabric.impl;
 
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -30,6 +30,10 @@
 import org.onosproject.net.neighbour.NeighbourResolutionService;
 import org.onosproject.net.Host;
 import org.onosproject.net.host.HostService;
+import org.onosproject.simplefabric.api.FabricNetwork;
+import org.onosproject.simplefabric.api.SimpleFabricEvent;
+import org.onosproject.simplefabric.api.SimpleFabricListener;
+import org.onosproject.simplefabric.api.SimpleFabricService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -73,7 +77,7 @@
 
     @Activate
     public void activate() {
-        appId = simpleFabric.getAppId();
+        appId = simpleFabric.appId();
         simpleFabric.addListener(simpleFabricListener);
         refresh();
         log.info("simple fabric neighbour started");
@@ -94,7 +98,7 @@
         Set<Interface> interfaces = interfaceService.getInterfaces();
         // check for new interfaces
         for (Interface intf : interfaces) {
-            if (!monitoredInterfaces.contains(intf) && simpleFabric.isL2NetworkInterface(intf)) {
+            if (!monitoredInterfaces.contains(intf) && simpleFabric.isFabricNetworkInterface(intf)) {
                log.info("simple fabric neighbour register handler: {}", intf);
                neighbourService.registerNeighbourHandler(intf, neighbourHandler, appId);
                monitoredInterfaces.add(intf);
@@ -130,7 +134,7 @@
      * @param context the message context
      */
     protected void handleRequest(NeighbourMessageContext context) {
-        MacAddress mac = simpleFabric.findVMacForIp(context.target());
+        MacAddress mac = simpleFabric.vMacForIp(context.target());
         if (mac != null) {
             log.trace("simple fabric neightbour request on virtualGatewayAddress {}; response to {} {} mac={}",
                       context.target(), context.inPort(), context.vlan(), mac);
@@ -139,8 +143,8 @@
         }
         // else forward to corresponding host
 
-        L2Network l2Network = simpleFabric.findL2Network(context.inPort(), context.vlan());
-        if (l2Network != null) {
+        FabricNetwork fabricNetwork = simpleFabric.fabricNetwork(context.inPort(), context.vlan());
+        if (fabricNetwork != null) {
             int numForwards = 0;
             if (!context.dstMac().isBroadcast() && !context.dstMac().isMulticast()) {
                 for (Host host : hostService.getHostsByMac(context.dstMac())) {
@@ -156,7 +160,7 @@
             // else do broadcast to all host in the same l2 network
             log.trace("simple fabric neightbour request forward broadcast: {} {}",
                      context.inPort(), context.vlan());
-            for (Interface iface : l2Network.interfaces()) {
+            for (Interface iface : fabricNetwork.interfaces()) {
                 if (!context.inPort().equals(iface.connectPoint())) {
                     log.trace("simple fabric forward neighbour request broadcast to {}", iface);
                     context.forward(iface);
@@ -178,10 +182,10 @@
     protected void handleReply(NeighbourMessageContext context,
                                HostService hostService) {
         // Find target L2 Network, then reply to the host
-        L2Network l2Network = simpleFabric.findL2Network(context.inPort(), context.vlan());
-        if (l2Network != null) {
-            // TODO: need to check and update simpleFabric.L2Network
-            MacAddress mac = simpleFabric.findVMacForIp(context.target());
+        FabricNetwork fabricNetwork = simpleFabric.fabricNetwork(context.inPort(), context.vlan());
+        if (fabricNetwork != null) {
+            // TODO: need to check and update simpleFabric.DefaultFabricNetwork
+            MacAddress mac = simpleFabric.vMacForIp(context.target());
             if (mac != null) {
                 log.trace("simple fabric neightbour response message to virtual gateway; drop: {} {} target={}",
                           context.inPort(), context.vlan(), context.target());
@@ -192,14 +196,14 @@
                 log.trace("simple fabric neightbour response message forward: {} {} target={} -> {}",
                           context.inPort(), context.vlan(), context.target(), hosts);
                 hosts.stream()
-                        .map(host -> simpleFabric.findHostInterface(host))
+                        .map(host -> simpleFabric.hostInterface(host))
                         .filter(Objects::nonNull)
                         .forEach(context::forward);
             }
         } else {
             // this might be happened when we remove an interface from L2 Network
             // just ignore this message
-            log.warn("simple fabric neightbour response message drop for unknown l2Network: {} {}",
+            log.warn("simple fabric neightbour response message drop for unknown fabricNetwork: {} {}",
                      context.inPort(), context.vlan());
             context.drop();
         }
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricReactiveRouting.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricRouting.java
similarity index 85%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricReactiveRouting.java
rename to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricRouting.java
index ee37a95..cbca9a5 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricReactiveRouting.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricRouting.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.simplefabric;
+package org.onosproject.simplefabric.impl;
 
 import com.google.common.collect.ImmutableList;
 import org.osgi.service.component.annotations.Activate;
@@ -27,41 +27,41 @@
 import org.onlab.packet.ICMP6;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IPv6;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.Ip4Prefix;
 import org.onlab.packet.Ip6Address;
 import org.onlab.packet.Ip6Prefix;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.net.FilteredConnectPoint;
-import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.EncapsulationType;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.EncapsulationType;
+import org.onosproject.net.FilteredConnectPoint;
+import org.onosproject.net.Host;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultFlowRule;
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.FlowRule;
 import org.onosproject.net.flow.FlowRuleService;
-import org.onosproject.net.Host;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.intent.constraint.EncapsulationConstraint;
-import org.onosproject.net.intent.constraint.PartialFailureConstraint;
-import org.onosproject.net.intent.constraint.HashedPathSelectionConstraint;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentService;
 import org.onosproject.net.intent.Key;
 import org.onosproject.net.intent.MultiPointToSinglePointIntent;
+import org.onosproject.net.intent.constraint.EncapsulationConstraint;
+import org.onosproject.net.intent.constraint.HashedPathSelectionConstraint;
+import org.onosproject.net.intent.constraint.PartialFailureConstraint;
 import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.net.link.LinkService;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.InboundPacket;
@@ -70,6 +70,12 @@
 import org.onosproject.net.packet.PacketPriority;
 import org.onosproject.net.packet.PacketProcessor;
 import org.onosproject.net.packet.PacketService;
+import org.onosproject.simplefabric.api.FabricNetwork;
+import org.onosproject.simplefabric.api.FabricSubnet;
+import org.onosproject.simplefabric.api.FabricRoute;
+import org.onosproject.simplefabric.api.SimpleFabricEvent;
+import org.onosproject.simplefabric.api.SimpleFabricListener;
+import org.onosproject.simplefabric.api.SimpleFabricService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -82,15 +88,29 @@
 import java.util.List;
 import java.util.Set;
 
+import static org.onosproject.simplefabric.api.Constants.ALLOW_ETH_ADDRESS_SELECTOR;
+import static org.onosproject.simplefabric.api.Constants.ALLOW_IPV6;
+import static org.onosproject.simplefabric.api.Constants.PRI_REACTIVE_BORDER_BASE;
+import static org.onosproject.simplefabric.api.Constants.PRI_REACTIVE_BORDER_FORWARD;
+import static org.onosproject.simplefabric.api.Constants.PRI_REACTIVE_BORDER_INTERCEPT;
+import static org.onosproject.simplefabric.api.Constants.PRI_REACTIVE_BORDER_STEP;
+import static org.onosproject.simplefabric.api.Constants.PRI_REACTIVE_LOCAL_FORWARD;
+import static org.onosproject.simplefabric.api.Constants.PRI_REACTIVE_LOCAL_INTERCEPT;
+import static org.onosproject.simplefabric.api.Constants.REACTIVE_ALLOW_LINK_CP;
+import static org.onosproject.simplefabric.api.Constants.ROUTING_APP_ID;
+import static org.onosproject.simplefabric.api.Constants.REACTIVE_HASHED_PATH_SELECTION;
+import static org.onosproject.simplefabric.api.Constants.REACTIVE_MATCH_IP_PROTO;
+import static org.onosproject.simplefabric.api.Constants.REACTIVE_SINGLE_TO_SINGLE;
+
 
 /**
- * SimpleFabricReactiveRouting handles L3 Reactive Routing.
+ * SimpleFabricRouting handles Routing.
  */
 @Component(immediate = true, enabled = false)
-public class SimpleFabricReactiveRouting {
+public class SimpleFabricRouting {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
-    private ApplicationId reactiveAppId;
+    private ApplicationId appId;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
@@ -130,36 +150,36 @@
             // NOTE: manage purged intents by key for intentService.getIntent() supports key only
 
     private final InternalSimpleFabricListener simpleFabricListener = new InternalSimpleFabricListener();
-    private ReactiveRoutingProcessor processor = new ReactiveRoutingProcessor();
+    private InternalRoutingProcessor processor = new InternalRoutingProcessor();
 
     @Activate
     public void activate() {
-        reactiveAppId = coreService.registerApplication(simpleFabric.REACTIVE_APP_ID);
-        log.info("simple fabric reactive routing starting with app id {}", reactiveAppId.toString());
+        appId = coreService.registerApplication(ROUTING_APP_ID);
+        log.info("simple fabric routing starting with app id {}", appId.toString());
 
         // NOTE: may not clear at init for MIGHT generate pending_remove garbages
         //       use flush event from simple fabric cli command
 
-        if (simpleFabric.REACTIVE_HASHED_PATH_SELECTION) {
+        if (REACTIVE_HASHED_PATH_SELECTION) {
             reactiveConstraints = ImmutableList.of(new PartialFailureConstraint(),
                                                    new HashedPathSelectionConstraint());
         } else {
             reactiveConstraints = ImmutableList.of(new PartialFailureConstraint());
         }
 
-        processor = new ReactiveRoutingProcessor();
+        processor = new InternalRoutingProcessor();
         packetService.addProcessor(processor, PacketProcessor.director(2));
         simpleFabric.addListener(simpleFabricListener);
 
         registerIntercepts();
         refreshIntercepts();
 
-        log.info("simple fabric reactive routing started");
+        log.info("simple fabric routing started");
     }
 
     @Deactivate
     public void deactivate() {
-        log.info("simple fabric reactive routing stopping");
+        log.info("simple fabric routing stopping");
 
         packetService.removeProcessor(processor);
         simpleFabric.removeListener(simpleFabricListener);
@@ -171,11 +191,11 @@
 
         toBePurgedIntentKeys.clear();
 
-        flowRuleService.removeFlowRulesById(reactiveAppId);
+        flowRuleService.removeFlowRulesById(appId);
 
         processor = null;
 
-        log.info("simple fabric reactive routing stopped");
+        log.info("simple fabric routing stopped");
     }
 
     /**
@@ -186,15 +206,15 @@
 
         packetService.requestPackets(
             DefaultTrafficSelector.builder().matchEthType(Ethernet.TYPE_IPV4).build(),
-            PacketPriority.REACTIVE, reactiveAppId);
+            PacketPriority.REACTIVE, appId);
 
-        if (simpleFabric.ALLOW_IPV6) {
+        if (ALLOW_IPV6) {
             packetService.requestPackets(
                 DefaultTrafficSelector.builder().matchEthType(Ethernet.TYPE_IPV6).build(),
-                PacketPriority.REACTIVE, reactiveAppId);
+                PacketPriority.REACTIVE, appId);
         }
 
-        log.info("simple fabric reactive routing ip packet intercepts started");
+        log.info("simple fabric routing ip packet intercepts started");
     }
 
     /**
@@ -205,35 +225,35 @@
 
         packetService.cancelPackets(
             DefaultTrafficSelector.builder().matchEthType(Ethernet.TYPE_IPV4).build(),
-            PacketPriority.REACTIVE, reactiveAppId);
+            PacketPriority.REACTIVE, appId);
 
-        if (simpleFabric.ALLOW_IPV6) {
+        if (ALLOW_IPV6) {
             packetService.cancelPackets(
                 DefaultTrafficSelector.builder().matchEthType(Ethernet.TYPE_IPV6).build(),
-                PacketPriority.REACTIVE, reactiveAppId);
+                PacketPriority.REACTIVE, appId);
         }
 
-        log.info("simple fabric reactive routing ip packet intercepts stopped");
+        log.info("simple fabric routing ip packet intercepts stopped");
     }
 
     /**
-     * Refresh device flow rules for reative intercepts on local ipSubnets.
+     * Refresh device flow rules for intercepts on local fabricSubnets.
      */
     private void refreshIntercepts() {
         Set<FlowRule> newInterceptFlowRules = new HashSet<>();
         for (Device device : deviceService.getAvailableDevices()) {
-            for (IpSubnet subnet : simpleFabric.getIpSubnets()) {
-                newInterceptFlowRules.add(generateInterceptFlowRule(true, device.id(), subnet.ipPrefix()));
-                // check if this devices has the ipSubnet, then add ip broadcast flue rule
-                L2Network l2Network = simpleFabric.findL2Network(subnet.l2NetworkName());
-                if (l2Network != null && l2Network.contains(device.id())) {
-                    newInterceptFlowRules.add(generateLocalSubnetIpBctFlowRule(device.id(), subnet.ipPrefix(),
-                                                                               l2Network));
+            for (FabricSubnet subnet : simpleFabric.defaultFabricSubnets()) {
+                newInterceptFlowRules.add(generateInterceptFlowRule(true, device.id(), subnet.prefix()));
+                // check if this devices has the fabricSubnet, then add ip broadcast flue rule
+                FabricNetwork fabricNetwork = simpleFabric.fabricNetwork(subnet.networkName());
+                if (fabricNetwork != null && fabricNetwork.contains(device.id())) {
+                    newInterceptFlowRules.add(generateLocalSubnetIpBctFlowRule(device.id(), subnet.prefix(),
+                            fabricNetwork));
                 }
                 // JUST FOR FLOW RULE TEST ONLY
                 //newInterceptFlowRules.add(generateTestFlowRule(device.id(), subnet.ipPrefix()));
             }
-            for (Route route : simpleFabric.getBorderRoutes()) {
+            for (FabricRoute route : simpleFabric.fabricRoutes()) {
                 newInterceptFlowRules.add(generateInterceptFlowRule(false, device.id(), route.prefix()));
             }
         }
@@ -252,7 +272,7 @@
                 .filter(rule -> !interceptFlowRules.contains(rule))
                 .forEach(rule -> {
                     flowRuleService.applyFlowRules(rule);
-                    log.info("simple fabric reactive routing apply intercept flow rule: {}", rule);
+                    log.info("simple fabric routing apply intercept flow rule: {}", rule);
                 });
             interceptFlowRules = newInterceptFlowRules;
         }
@@ -276,13 +296,13 @@
                 .withPriority(reactivePriority(false, isDstLocalSubnet, prefix.prefixLength()))
                 .withSelector(selector.build())
                 .withTreatment(DefaultTrafficTreatment.builder().punt().build())
-                .fromApp(reactiveAppId)
+                .fromApp(appId)
                 .makePermanent()
                 .forTable(0).build();
         return rule;
     }
 
-    private FlowRule generateLocalSubnetIpBctFlowRule(DeviceId deviceId, IpPrefix prefix, L2Network l2Network) {
+    private FlowRule generateLocalSubnetIpBctFlowRule(DeviceId deviceId, IpPrefix prefix, FabricNetwork fabricNetwork) {
         TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
         IpPrefix bctPrefix;
         if (prefix.isIp4()) {
@@ -303,7 +323,7 @@
         }
         TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
         Set<ConnectPoint> newEgressPoints = new HashSet<>();
-        for (Interface iface : l2Network.interfaces()) {
+        for (Interface iface : fabricNetwork.interfaces()) {
             if (iface.connectPoint().deviceId().equals(deviceId)) {
                 treatment.setOutput(iface.connectPoint().port());
             }
@@ -313,7 +333,7 @@
                 .withPriority(reactivePriority(true, true, bctPrefix.prefixLength()))
                 .withSelector(selector.build())
                 .withTreatment(treatment.build())
-                .fromApp(reactiveAppId)
+                .fromApp(appId)
                 .makePermanent()
                 .forTable(0).build();
         return rule;
@@ -324,7 +344,7 @@
      */
     private void refreshRouteIntents() {
         for (Intent entry : intentService.getIntents()) {
-            if (!reactiveAppId.equals(entry.appId())) {
+            if (!appId.equals(entry.appId())) {
                 continue;
             }
 
@@ -362,8 +382,8 @@
                 toBePurgedIntentKeys.add(intent.key());
                 continue;
             }
-            if (!(simpleFabric.findL2Network(intent.egressPoint(), VlanId.NONE) != null ||
-                  (simpleFabric.REACTIVE_ALLOW_LINK_CP &&
+            if (!(simpleFabric.fabricNetwork(intent.egressPoint(), VlanId.NONE) != null ||
+                  (REACTIVE_ALLOW_LINK_CP &&
                    !linkService.getEgressLinks(intent.egressPoint()).isEmpty()))) {
                 log.info("refresh route intents; remove intent for egress point not available: key={}", intent.key());
                 intentService.withdraw(intentService.getIntent(intent.key()));
@@ -372,7 +392,7 @@
             }
 
             // MAY NEED TO CHECK: intent.egressPoint and intent.treatment's dstMac is valid against hosts
-            if (simpleFabric.REACTIVE_SINGLE_TO_SINGLE && !simpleFabric.REACTIVE_ALLOW_LINK_CP) {
+            if (REACTIVE_SINGLE_TO_SINGLE && !REACTIVE_ALLOW_LINK_CP) {
                 // single path intent only; no need to check ingress points
                 continue;
             }
@@ -381,8 +401,8 @@
             boolean ingressPointChanged = false;
             for (FilteredConnectPoint cp : intent.filteredIngressPoints()) {
                 if (deviceService.isAvailable(cp.connectPoint().deviceId()) &&
-                    (simpleFabric.findL2Network(cp.connectPoint(), VlanId.NONE) != null ||
-                     (simpleFabric.REACTIVE_ALLOW_LINK_CP &&
+                    (simpleFabric.fabricNetwork(cp.connectPoint(), VlanId.NONE) != null ||
+                     (REACTIVE_ALLOW_LINK_CP &&
                       !linkService.getIngressLinks(cp.connectPoint()).isEmpty()))) {
                     newIngressPoints.add(cp);
                 } else {
@@ -402,7 +422,7 @@
             if (ingressPointChanged) {
                 MultiPointToSinglePointIntent updatedIntent =
                     MultiPointToSinglePointIntent.builder()
-                        .appId(reactiveAppId)
+                        .appId(appId)
                         .key(intent.key())
                         .selector(intent.selector())
                         .treatment(intent.treatment())
@@ -466,7 +486,7 @@
         // NOTE: cli calls are handling within the cli called node only; so should not user inents.isLocal()
         Set<Intent> myIntents = new HashSet<>();
         for (Intent intent : intentService.getIntents()) {
-            if (reactiveAppId.equals(intent.appId())) {
+            if (appId.equals(intent.appId())) {
                 myIntents.add(intent);
             }
         }
@@ -503,9 +523,9 @@
     }
 
     /**
-     * Reactive Packet Handling.
+     * Internal Packet Handling.
      */
-    private class ReactiveRoutingProcessor implements PacketProcessor {
+    private class InternalRoutingProcessor implements PacketProcessor {
         @Override
         public void process(PacketContext context) {
             InboundPacket pkt = context.inPacket();
@@ -552,8 +572,8 @@
     private boolean checkVirtualGatewayIpPacket(InboundPacket pkt, IpAddress srcIp, IpAddress dstIp) {
         Ethernet ethPkt = pkt.parsed();  // assume valid
 
-        MacAddress mac = simpleFabric.findVMacForIp(dstIp);
-        if (mac == null || !simpleFabric.isVMac(ethPkt.getDestinationMAC())) {
+        MacAddress mac = simpleFabric.vMacForIp(dstIp);
+        if (mac == null || !simpleFabric.isVirtualGatewayMac(ethPkt.getDestinationMAC())) {
             /* Destination MAC should be any of virtual gateway macs */
             return false;
         } else if (dstIp.isIp4()) {
@@ -621,12 +641,12 @@
         IpAddress dstNextHop = dstIp;
         MacAddress treatmentSrcMac = ethPkt.getDestinationMAC();
         int borderRoutePrefixLength = 0;
-        boolean updateMac = simpleFabric.isVMac(ethPkt.getDestinationMAC());
+        boolean updateMac = simpleFabric.isVirtualGatewayMac(ethPkt.getDestinationMAC());
 
         // check subnet local or route
-        IpSubnet srcSubnet = simpleFabric.findIpSubnet(srcIp);
+        FabricSubnet srcSubnet = simpleFabric.fabricSubnet(srcIp);
         if (srcSubnet == null) {
-            Route route = simpleFabric.findBorderRoute(srcIp);
+            FabricRoute route = simpleFabric.fabricRoute(srcIp);
             if (route == null) {
                 log.warn("unknown srcIp; drop: srcCp={} srcIp={} dstIp={} ipProto={}",
                          srcCp, srcIp, dstIp, ipProto);
@@ -636,9 +656,9 @@
             srcNextHop = route.nextHop();
             borderRoutePrefixLength = route.prefix().prefixLength();
         }
-        IpSubnet dstSubnet = simpleFabric.findIpSubnet(dstIp);
+        FabricSubnet dstSubnet = simpleFabric.fabricSubnet(dstIp);
         if (dstSubnet == null) {
-            Route route = simpleFabric.findBorderRoute(dstIp);
+            FabricRoute route = simpleFabric.fabricRoute(dstIp);
             if (route == null) {
                 log.warn("unknown dstIp; drop: srcCp={} srcIp={} dstIp={} ipProto={}",
                          srcCp, srcIp, dstIp, ipProto);
@@ -651,11 +671,11 @@
 
         if (dstSubnet != null) {
             // destination is local subnet ip
-            if (SimpleFabricService.ALLOW_ETH_ADDRESS_SELECTOR && dstSubnet.equals(srcSubnet)) {
-                // NOTE: if ALLOW_ETH_ADDRESS_SELECTOR=false; l2Forward is always false
-                L2Network l2Network = simpleFabric.findL2Network(dstSubnet.l2NetworkName());
+            if (ALLOW_ETH_ADDRESS_SELECTOR && dstSubnet.equals(srcSubnet)) {
+                // NOTE: if ALLOW_ETH_ADDRESS_SELECTOR=false; isForward is always false
+                FabricNetwork fabricNetwork = simpleFabric.fabricNetwork(dstSubnet.networkName());
                 treatmentSrcMac = ethPkt.getSourceMAC();
-                if (l2Network != null && l2Network.l2Forward()) {
+                if (fabricNetwork != null && fabricNetwork.isForward()) {
                     // NOTE: no reactive route action but do forward packet for L2Forward do not handle packet
                     // update mac only if dstMac is virtualGatewayMac, else assume valid mac already for the l2 network
                     log.info("LOCAL FORWARD ONLY: "
@@ -709,7 +729,7 @@
             log.warn("forward packet nextHopIp host_mac unknown: nextHopIp={}", nextHopIp);
             hostService.startMonitoringIp(nextHopIp);
             simpleFabric.requestMac(nextHopIp);
-            // CONSIDER: make flood on all port of the dstHost's L2Network
+            // CONSIDER: make flood on all port of the dstHost's DefaultFabricNetwork
             return;
         }
         TrafficTreatment treatment = DefaultTrafficTreatment.builder()
@@ -736,15 +756,15 @@
      *
      * ToHost: dstPrefix = dstHostIp.toIpPrefix(), nextHopIp = destHostIp
      * ToInternet: dstPrefix = route.prefix(), nextHopIp = route.nextHopIp
-     * returns intent submited or not
+     * returns intent submitted or not
      */
     private boolean setUpConnectivity(ConnectPoint srcCp, byte ipProto, IpPrefix srcPrefix, IpPrefix dstPrefix,
                                       IpAddress nextHopIp, MacAddress treatmentSrcMac,
                                       EncapsulationType encap, boolean updateMac,
                                       boolean isDstLocalSubnet, int borderRoutePrefixLength) {
-        if (!(simpleFabric.findL2Network(srcCp, VlanId.NONE) != null ||
-             (simpleFabric.REACTIVE_ALLOW_LINK_CP && !linkService.getIngressLinks(srcCp).isEmpty()))) {
-            log.warn("NO REGI for srcCp not in L2Network; srcCp={} srcPrefix={} dstPrefix={} nextHopIp={}",
+        if (!(simpleFabric.fabricNetwork(srcCp, VlanId.NONE) != null ||
+             (REACTIVE_ALLOW_LINK_CP && !linkService.getIngressLinks(srcCp).isEmpty()))) {
+            log.warn("NO REGI for srcCp not in DefaultFabricNetwork; srcCp={} srcPrefix={} dstPrefix={} nextHopIp={}",
                       srcCp, srcPrefix, dstPrefix, nextHopIp);
             return false;
         }
@@ -766,7 +786,7 @@
             return false;
         }
         TrafficTreatment treatment;
-        if (updateMac && simpleFabric.ALLOW_ETH_ADDRESS_SELECTOR) {
+        if (updateMac && ALLOW_ETH_ADDRESS_SELECTOR) {
             treatment = generateSetMacTreatment(nextHopMac, treatmentSrcMac);
         } else {
             treatment = DefaultTrafficTreatment.builder().build();
@@ -775,39 +795,39 @@
         TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
         if (dstPrefix.isIp4()) {
             selector.matchEthType(Ethernet.TYPE_IPV4);
-            if (simpleFabric.REACTIVE_SINGLE_TO_SINGLE && srcPrefix.prefixLength() > 0) {
+            if (REACTIVE_SINGLE_TO_SINGLE && srcPrefix.prefixLength() > 0) {
                 selector.matchIPSrc(srcPrefix);
             }
             if (dstPrefix.prefixLength() > 0) {
                 selector.matchIPDst(dstPrefix);
             }
-            if (ipProto != 0 && simpleFabric.REACTIVE_MATCH_IP_PROTO) {
+            if (ipProto != 0 && REACTIVE_MATCH_IP_PROTO) {
                 selector.matchIPProtocol(ipProto);
             }
         } else {
             selector.matchEthType(Ethernet.TYPE_IPV6);
-            if (simpleFabric.REACTIVE_SINGLE_TO_SINGLE && srcPrefix.prefixLength() > 0) {
+            if (REACTIVE_SINGLE_TO_SINGLE && srcPrefix.prefixLength() > 0) {
                 selector.matchIPv6Src(srcPrefix);
             }
             if (dstPrefix.prefixLength() > 0) {
                 selector.matchIPv6Dst(dstPrefix);
             }
-            if (ipProto != 0 && simpleFabric.REACTIVE_MATCH_IP_PROTO) {
+            if (ipProto != 0 && REACTIVE_MATCH_IP_PROTO) {
                 selector.matchIPProtocol(ipProto);
             }
         }
 
         Key key;
         String keyProtoTag = "";
-        if (simpleFabric.REACTIVE_MATCH_IP_PROTO) {
+        if (REACTIVE_MATCH_IP_PROTO) {
             keyProtoTag = "-p" + ipProto;
         }
-        if (simpleFabric.REACTIVE_SINGLE_TO_SINGLE) {
+        if (REACTIVE_SINGLE_TO_SINGLE) {
             // allocate intent per (srcPrefix, dstPrefix)
-            key = Key.of(srcPrefix.toString() + "-to-" + dstPrefix.toString() + keyProtoTag, reactiveAppId);
+            key = Key.of(srcPrefix.toString() + "-to-" + dstPrefix.toString() + keyProtoTag, appId);
         } else {
             // allocate intent per (srcDeviceId, dstPrefix)
-            key = Key.of(srcCp.deviceId().toString() + "-to-" +  dstPrefix.toString() + keyProtoTag, reactiveAppId);
+            key = Key.of(srcCp.deviceId().toString() + "-to-" +  dstPrefix.toString() + keyProtoTag, appId);
         }
 
         // check and merge already existing ingress points
@@ -835,7 +855,7 @@
 
         MultiPointToSinglePointIntent newIntent = MultiPointToSinglePointIntent.builder()
             .key(key)
-            .appId(reactiveAppId)
+            .appId(appId)
             .selector(selector.build())
             .treatment(treatment)
             .filteredIngressPoints(ingressPoints)
@@ -843,7 +863,7 @@
             .priority(priority)
             .constraints(buildConstraints(reactiveConstraints, encap))
             .build();
-        log.info("submmit mp2p intent: srcPrefix={} dstPrefix={} srcCp={} "
+        log.info("submit mp2p intent: srcPrefix={} dstPrefix={} srcCp={} "
                  + "newIntent={} nextHopIp={} nextHopMac={} priority={}",
                  srcPrefix, dstPrefix, ingressPoints, newIntent, nextHopIp, nextHopMac, priority);
         toBePurgedIntentKeys.remove(newIntent.key());
@@ -862,7 +882,7 @@
 
     // monitor border peers for routeService lookup to be effective
     private void monitorBorderPeers() {
-        for (Route route : simpleFabric.getBorderRoutes()) {
+        for (FabricRoute route : simpleFabric.fabricRoutes()) {
             hostService.startMonitoringIp(route.nextHop());
             simpleFabric.requestMac(route.nextHop());
         }
@@ -872,19 +892,19 @@
     private int reactivePriority(boolean isForward, boolean isDstLocalSubnet, int borderRoutePrefixLength) {
         if (isDstLocalSubnet) {  // -> dst:localSubnet
             if (isForward) {
-                return simpleFabric.PRI_REACTIVE_LOCAL_FORWARD;
+                return PRI_REACTIVE_LOCAL_FORWARD;
             } else {  // isInterncept
-                return simpleFabric.PRI_REACTIVE_LOCAL_INTERCEPT;
+                return PRI_REACTIVE_LOCAL_INTERCEPT;
             }
         } else {  // -> dst:boarderRouteNextHop
             int offset;
             if (isForward) {
-                offset = simpleFabric.PRI_REACTIVE_BORDER_FORWARD;
+                offset = PRI_REACTIVE_BORDER_FORWARD;
             } else {  // isIntercept
-                offset = simpleFabric.PRI_REACTIVE_BORDER_INTERCEPT;
+                offset = PRI_REACTIVE_BORDER_INTERCEPT;
             }
-           return simpleFabric.PRI_REACTIVE_BORDER_BASE
-                  + borderRoutePrefixLength * simpleFabric.PRI_REACTIVE_BORDER_STEP + offset;
+           return PRI_REACTIVE_BORDER_BASE
+                  + borderRoutePrefixLength * PRI_REACTIVE_BORDER_STEP + offset;
         }
     }
 
@@ -904,9 +924,9 @@
     // Dump Cli Handler
     private void dump(String subject, PrintStream out) {
         if ("intents".equals(subject)) {
-            out.println("Reactive Routing Route Intents:\n");
+            out.println("Routing Route Intents:\n");
             for (Intent entry : intentService.getIntents()) {
-                if (reactiveAppId.equals(entry.appId())) {
+                if (appId.equals(entry.appId())) {
                     MultiPointToSinglePointIntent intent = (MultiPointToSinglePointIntent) entry;
                     out.println("    " + intent.key().toString()
                                 + " to " + intent.egressPoint().toString()
@@ -916,7 +936,7 @@
             }
             out.println("");
 
-            out.println("Reactive Routing Intercept Flow Rules:\n");
+            out.println("Routing Intercept Flow Rules:\n");
             List<FlowRule> rules = new ArrayList(interceptFlowRules);
             Collections.sort(rules, new Comparator<FlowRule>() {
                     @Override
@@ -931,7 +951,7 @@
                           + " selector=" + rule.selector().criteria().toString());
             }
             out.println("");
-            out.println("Reactive Routing Intents to Be Purged:\n");
+            out.println("Routing Intents to Be Purged:\n");
             for (Key key: toBePurgedIntentKeys) {
                 out.println("    " + key.toString());
             }
@@ -939,7 +959,7 @@
 
         } else if ("reactive-intents".equals(subject)) {
             for (Intent entry : intentService.getIntents()) {
-                if (reactiveAppId.equals(entry.appId())) {
+                if (appId.equals(entry.appId())) {
                     MultiPointToSinglePointIntent intent = (MultiPointToSinglePointIntent) entry;
                     out.println(intent.key().toString()
                                 + " to " + intent.egressPoint().toString()
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/package-info.java
similarity index 87%
copy from web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
copy to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/package-info.java
index fca0dc7..d190b08 100644
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/package-info.java
@@ -15,5 +15,6 @@
  */
 
 /**
- * ONOS GUI -- Topology Zoom Layer -- CSS file
- */
\ No newline at end of file
+ * Simple fabric implementation package.
+ */
+package org.onosproject.simplefabric.impl;
\ No newline at end of file
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/package-info.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/package-info.java
similarity index 100%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/package-info.java
rename to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/package-info.java
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/RouteTools.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/util/RouteTools.java
similarity index 94%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/RouteTools.java
rename to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/util/RouteTools.java
index b14438a..d02fed2 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/RouteTools.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/util/RouteTools.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
  * to remove dependency on onos.incubator.routing services, since 2017-08-09.
  */
 
-package org.onosproject.simplefabric;
+package org.onosproject.simplefabric.util;
 
 import org.onlab.packet.IpPrefix;
 
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/util/package-info.java
similarity index 88%
rename from web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
rename to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/util/package-info.java
index fca0dc7..9b3dde3 100644
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/util/package-info.java
@@ -15,5 +15,6 @@
  */
 
 /**
- * ONOS GUI -- Topology Zoom Layer -- CSS file
- */
\ No newline at end of file
+ * Simple fabric utility package.
+ */
+package org.onosproject.simplefabric.util;
\ No newline at end of file
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricWebApplication.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/web/SimpleFabricWebApplication.java
similarity index 89%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricWebApplication.java
rename to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/web/SimpleFabricWebApplication.java
index d82de73..960b4df 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricWebApplication.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/web/SimpleFabricWebApplication.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.simplefabric;
+package org.onosproject.simplefabric.web;
 
 import org.onlab.rest.AbstractWebApplication;
 
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricWebResource.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/web/SimpleFabricWebResource.java
similarity index 94%
rename from apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricWebResource.java
rename to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/web/SimpleFabricWebResource.java
index f1e9af7..cc68d6b 100644
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricWebResource.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/web/SimpleFabricWebResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2018-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package org.onosproject.simplefabric;
+package org.onosproject.simplefabric.web;
 
 import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.simplefabric.api.SimpleFabricService;
 
 import java.io.ByteArrayOutputStream;
 import javax.ws.rs.GET;
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/web/package-info.java
similarity index 88%
copy from web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
copy to apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/web/package-info.java
index fca0dc7..596ded0 100644
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/web/package-info.java
@@ -15,5 +15,6 @@
  */
 
 /**
- * ONOS GUI -- Topology Zoom Layer -- CSS file
- */
\ No newline at end of file
+ * Simple fabric web package.
+ */
+package org.onosproject.simplefabric.web;
\ No newline at end of file
diff --git a/apps/simplefabric/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/simplefabric/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
similarity index 88%
rename from apps/simplefabric/src/main/resources/OSGI-INF/blueprint/shell-config.xml
rename to apps/simplefabric/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 7b6893b..2aad546 100644
--- a/apps/simplefabric/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/apps/simplefabric/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -17,12 +17,12 @@
 
     <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
         <command>
-            <action class="org.onosproject.simplefabric.SimpleFabricCommand"/>
+            <action class="org.onosproject.simplefabric.cli.SimpleFabricCommand"/>
             <completers>
                 <ref component-id="SimpleFabricCommandCompleter"/>
             </completers>
         </command>
     </command-bundle>
  
-    <bean id="SimpleFabricCommandCompleter" class="org.onosproject.simplefabric.SimpleFabricCommandCompleter"/>
+    <bean id="SimpleFabricCommandCompleter" class="org.onosproject.simplefabric.cli.SimpleFabricCommandCompleter"/>
 </blueprint>
diff --git a/apps/simplefabric/src/main/webapp/WEB-INF/web.xml b/apps/simplefabric/app/src/main/webapp/WEB-INF/web.xml
similarity index 95%
rename from apps/simplefabric/src/main/webapp/WEB-INF/web.xml
rename to apps/simplefabric/app/src/main/webapp/WEB-INF/web.xml
index e136671..ebcac0e 100644
--- a/apps/simplefabric/src/main/webapp/WEB-INF/web.xml
+++ b/apps/simplefabric/app/src/main/webapp/WEB-INF/web.xml
@@ -46,7 +46,7 @@
         <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
         <init-param>
             <param-name>javax.ws.rs.Application</param-name>
-            <param-value>org.onosproject.simplefabric.SimpleFabricWebApplication</param-value>
+            <param-value>org.onosproject.simplefabric.web.SimpleFabricWebApplication</param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
     </servlet>
diff --git a/apps/simplefabric/app/src/test/java/org/onosproject/simplefabric/impl/DefaultFabricNetworkTest.java b/apps/simplefabric/app/src/test/java/org/onosproject/simplefabric/impl/DefaultFabricNetworkTest.java
new file mode 100644
index 0000000..57152e7
--- /dev/null
+++ b/apps/simplefabric/app/src/test/java/org/onosproject/simplefabric/impl/DefaultFabricNetworkTest.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.impl;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.EncapsulationType;
+import org.onosproject.net.host.InterfaceIpAddress;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.simplefabric.api.FabricNetwork;
+
+import java.util.List;
+import java.util.Set;
+
+import static junit.framework.TestCase.assertEquals;
+
+/**
+ * Unit tests for the default fabric network class.
+ */
+public final class DefaultFabricNetworkTest {
+
+    private static final String NAME_1 = "network1";
+    private static final String NAME_2 = "network2";
+
+    private static final String INTF_NAMES_1_1 = "h11";
+    private static final String INTF_NAMES_1_2 = "h12";
+    private static final String INTF_NAMES_2_1 = "h21";
+    private static final String INTF_NAMES_2_2 = "h22";
+
+    private static final Set<String> INTF_NAME_SET_1 =
+                            ImmutableSet.of(INTF_NAMES_1_1, INTF_NAMES_1_2);
+    private static final Set<String> INTF_NAME_SET_2 =
+                            ImmutableSet.of(INTF_NAMES_2_1, INTF_NAMES_2_2);
+
+    private static final EncapsulationType ENCAP_TYPE_1 = EncapsulationType.NONE;
+    private static final EncapsulationType ENCAP_TYPE_2 = EncapsulationType.NONE;
+
+    private static final boolean IS_FORWARD_1 = false;
+    private static final boolean IS_FORWARD_2 = true;
+    private static final boolean IS_BROADCAST_1 = false;
+    private static final boolean IS_BROADCAST_2 = true;
+
+    private FabricNetwork fabricNetwork1;
+    private FabricNetwork sameAsFabricNetwork1;
+    private FabricNetwork fabricNetwork2;
+
+    private static Interface createInterface(int index) {
+
+        String name = "INTF_NAME_" + index;
+        ConnectPoint cp = ConnectPoint.fromString("of:0011223344556677/" + index);
+        InterfaceIpAddress intfIp1 = InterfaceIpAddress.valueOf("10.10.10." + index + "/32");
+        InterfaceIpAddress intfIp2 = InterfaceIpAddress.valueOf("20.20.20." + index + "/32");
+        List<InterfaceIpAddress> intfIps = ImmutableList.of(intfIp1, intfIp2);
+        MacAddress mac = MacAddress.valueOf("00:00:00:00:00:00");
+        VlanId vlanId = VlanId.NONE;
+
+        return new Interface(name, cp, intfIps, mac, vlanId);
+    }
+
+    /**
+     * Initial setup for this unit test.
+     */
+    @Before
+    public void setUp() {
+
+        fabricNetwork1 = DefaultFabricNetwork.builder()
+                                .name(NAME_1)
+                                .interfaceNames(INTF_NAME_SET_1)
+                                .encapsulation(ENCAP_TYPE_1)
+                                .forward(IS_FORWARD_1)
+                                .broadcast(IS_BROADCAST_1)
+                                .build();
+
+        sameAsFabricNetwork1 = DefaultFabricNetwork.builder()
+                                .name(NAME_1)
+                                .interfaceNames(INTF_NAME_SET_1)
+                                .encapsulation(ENCAP_TYPE_1)
+                                .forward(IS_FORWARD_1)
+                                .broadcast(IS_BROADCAST_1)
+                                .build();
+
+        fabricNetwork2 = DefaultFabricNetwork.builder()
+                                .name(NAME_2)
+                                .interfaceNames(INTF_NAME_SET_2)
+                                .encapsulation(ENCAP_TYPE_2)
+                                .forward(IS_FORWARD_2)
+                                .broadcast(IS_BROADCAST_2)
+                                .build();
+    }
+
+    /**
+     * Tests object equality.
+     */
+    @Test
+    public void testEquality() {
+        new EqualsTester().addEqualityGroup(fabricNetwork1, sameAsFabricNetwork1)
+                .addEqualityGroup(fabricNetwork2)
+                .testEquals();
+    }
+
+    /**
+     * Test object construction.
+     */
+    @Test
+    public void testConstruction() {
+        FabricNetwork network = fabricNetwork1;
+
+        assertEquals(network.name(), NAME_1);
+        assertEquals(network.interfaceNames(), INTF_NAME_SET_1);
+        assertEquals(network.encapsulation(), ENCAP_TYPE_1);
+        assertEquals(network.isForward(), IS_FORWARD_1);
+        assertEquals(network.isBroadcast(), IS_BROADCAST_1);
+    }
+}
diff --git a/apps/simplefabric/app/src/test/java/org/onosproject/simplefabric/impl/DefaultFabricRouteTest.java b/apps/simplefabric/app/src/test/java/org/onosproject/simplefabric/impl/DefaultFabricRouteTest.java
new file mode 100644
index 0000000..8a39179
--- /dev/null
+++ b/apps/simplefabric/app/src/test/java/org/onosproject/simplefabric/impl/DefaultFabricRouteTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.impl;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.simplefabric.api.FabricRoute;
+import org.onosproject.simplefabric.api.FabricRoute.Source;
+
+import static junit.framework.TestCase.assertEquals;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+/**
+ * Unit tests for the default fabric router.
+ */
+public final class DefaultFabricRouteTest {
+
+    private static final Source SOURCE_1 = Source.STATIC;
+    private static final Source SOURCE_2 = Source.BGP;
+
+    private static final IpPrefix IP_PREFIX_1 = IpPrefix.valueOf("10.10.10.1/32");
+    private static final IpPrefix IP_PREFIX_2 = IpPrefix.valueOf("20.20.20.2/32");
+
+    private static final IpAddress NEXT_HOP_1 = IpAddress.valueOf("10.10.10.1");
+    private static final IpAddress NEXT_HOP_2 = IpAddress.valueOf("20.20.20.2");
+
+    private static final NodeId SOURCE_NODE_1 = NodeId.nodeId("1");
+    private static final NodeId SOURCE_NODE_2 = NodeId.nodeId("2");
+
+    private FabricRoute fabricRoute1;
+    private FabricRoute sameAsFabricRoute1;
+    private FabricRoute fabricRoute2;
+
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultFabricRoute.class);
+    }
+
+    /**
+     * Initial setup for this unit test.
+     */
+    @Before
+    public void setUp() {
+        fabricRoute1 = DefaultFabricRoute.builder()
+                                .source(SOURCE_1)
+                                .prefix(IP_PREFIX_1)
+                                .nextHop(NEXT_HOP_1)
+                                .sourceNode(SOURCE_NODE_1)
+                                .build();
+
+        sameAsFabricRoute1 = DefaultFabricRoute.builder()
+                                .source(SOURCE_1)
+                                .prefix(IP_PREFIX_1)
+                                .nextHop(NEXT_HOP_1)
+                                .sourceNode(SOURCE_NODE_1)
+                                .build();
+
+        fabricRoute2 = DefaultFabricRoute.builder()
+                                .source(SOURCE_2)
+                                .prefix(IP_PREFIX_2)
+                                .nextHop(NEXT_HOP_2)
+                                .sourceNode(SOURCE_NODE_2)
+                                .build();
+    }
+
+    /**
+     * Tests object equality.
+     */
+    @Test
+    public void testEquality() {
+        new EqualsTester().addEqualityGroup(fabricRoute1, sameAsFabricRoute1)
+                .addEqualityGroup(fabricRoute2)
+                .testEquals();
+    }
+
+    /**
+     * Test object construction.
+     */
+    @Test
+    public void testConstruction() {
+        FabricRoute route = fabricRoute1;
+
+        assertEquals(route.source(), SOURCE_1);
+        assertEquals(route.prefix(), IP_PREFIX_1);
+        assertEquals(route.nextHop(), NEXT_HOP_1);
+        assertEquals(route.sourceNode(), SOURCE_NODE_1);
+    }
+}
diff --git a/apps/simplefabric/app/src/test/java/org/onosproject/simplefabric/impl/DefaultFabricSubnetTest.java b/apps/simplefabric/app/src/test/java/org/onosproject/simplefabric/impl/DefaultFabricSubnetTest.java
new file mode 100644
index 0000000..82efd14
--- /dev/null
+++ b/apps/simplefabric/app/src/test/java/org/onosproject/simplefabric/impl/DefaultFabricSubnetTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.simplefabric.impl;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.EncapsulationType;
+import org.onosproject.simplefabric.api.FabricSubnet;
+
+import static junit.framework.TestCase.assertEquals;
+
+/**
+ * Unit tests for the default fabric IP subnet class.
+ */
+public final class DefaultFabricSubnetTest {
+
+    private static final IpPrefix IP_PREFIX_1 = IpPrefix.valueOf("10.10.10.11/32");
+    private static final IpPrefix IP_PREFIX_2 = IpPrefix.valueOf("20.20.20.11/32");
+
+    private static final IpAddress GATEWAY_IP_1 = IpAddress.valueOf("10.10.10.1");
+    private static final IpAddress GATEWAY_IP_2 = IpAddress.valueOf("20.20.20.1");
+
+    private static final MacAddress GATEWAY_MAC_1 = MacAddress.valueOf("00:11:22:33:44:55");
+    private static final MacAddress GATEWAY_MAC_2 = MacAddress.valueOf("11:22:33:44:55:66");
+
+    private static final EncapsulationType ENCAP_TYPE_1 = EncapsulationType.NONE;
+    private static final EncapsulationType ENCAP_TYPE_2 = EncapsulationType.NONE;
+
+    private static final String NETWORK_NAME_1 = "sonaFabric1";
+    private static final String NETWORK_NAME_2 = "sonaFabric2";
+
+    private FabricSubnet subnet1;
+    private FabricSubnet sameAsSubnet1;
+    private FabricSubnet subnet2;
+
+    /**
+     * Initial setup for this unit test.
+     */
+    @Before
+    public void setUp() {
+
+        subnet1 = DefaultFabricSubnet.builder()
+                            .prefix(IP_PREFIX_1)
+                            .gatewayIp(GATEWAY_IP_1)
+                            .gatewayMac(GATEWAY_MAC_1)
+                            .encapsulation(ENCAP_TYPE_1)
+                            .networkName(NETWORK_NAME_1)
+                            .build();
+
+        sameAsSubnet1 = DefaultFabricSubnet.builder()
+                            .prefix(IP_PREFIX_1)
+                            .gatewayIp(GATEWAY_IP_1)
+                            .gatewayMac(GATEWAY_MAC_1)
+                            .encapsulation(ENCAP_TYPE_1)
+                            .networkName(NETWORK_NAME_1)
+                            .build();
+
+        subnet2 = DefaultFabricSubnet.builder()
+                            .prefix(IP_PREFIX_2)
+                            .gatewayIp(GATEWAY_IP_2)
+                            .gatewayMac(GATEWAY_MAC_2)
+                            .encapsulation(ENCAP_TYPE_2)
+                            .networkName(NETWORK_NAME_2)
+                            .build();
+    }
+
+    /**
+     * Tests object equality.
+     */
+    @Test
+    public void testEquality() {
+        new EqualsTester().addEqualityGroup(subnet1, sameAsSubnet1)
+                .addEqualityGroup(subnet2)
+                .testEquals();
+    }
+
+    /**
+     * Test object construction.
+     */
+    @Test
+    public void testConstruction() {
+        FabricSubnet subnet = subnet1;
+
+        assertEquals(subnet.prefix(), IP_PREFIX_1);
+        assertEquals(subnet.gatewayIp(), GATEWAY_IP_1);
+        assertEquals(subnet.gatewayMac(), GATEWAY_MAC_1);
+        assertEquals(subnet.encapsulation(), ENCAP_TYPE_1);
+        assertEquals(subnet.networkName(), NETWORK_NAME_1);
+    }
+}
diff --git a/apps/simplefabric/network-cfg.json b/apps/simplefabric/network-cfg.json
index c8e118b..c7ba9c8 100644
--- a/apps/simplefabric/network-cfg.json
+++ b/apps/simplefabric/network-cfg.json
@@ -1,56 +1,229 @@
 {
-
-  "devices":{
-    "of:0000000000000011":{ "basic":{ "name":"LS1", "latitude":35, "longitude":-100 } },
-    "of:0000000000000012":{ "basic":{ "name":"LS2", "latitude":35, "longitude":-90  } },
-    "of:0000000000000021":{ "basic":{ "name":"SS1", "latitude":40, "longitude":-100 } },
-    "of:0000000000000022":{ "basic":{ "name":"SS2", "latitude":40, "longitude":-90  } }
+  "devices": {
+    "of:0000000000000011": {
+      "basic": {
+        "name": "LS1",
+        "latitude": 35,
+        "longitude": -100
+      }
+    },
+    "of:0000000000000012": {
+      "basic": {
+        "name": "LS2",
+        "latitude": 35,
+        "longitude": -90
+      }
+    },
+    "of:0000000000000021": {
+      "basic": {
+        "name": "SS1",
+        "latitude": 40,
+        "longitude": -100
+      }
+    },
+    "of:0000000000000022": {
+      "basic": {
+        "name": "SS2",
+        "latitude": 40,
+        "longitude": -90
+      }
+    }
   },
-
-  "ports" : {
-    "of:0000000000000011/1" : { "interfaces" : [ { "name" : "h11" } ] },
-    "of:0000000000000011/2" : { "interfaces" : [ { "name" : "h12" } ] },
-    "of:0000000000000011/3" : { "interfaces" : [ { "name" : "h13" } ] },
-    "of:0000000000000011/4" : { "interfaces" : [ { "name" : "h14" } ] },
-    "of:0000000000000011/5" : { "interfaces" : [ { "name" : "d11" } ] },
-    "of:0000000000000011/6" : { "interfaces" : [ { "name" : "d12" } ] },
-    "of:0000000000000011/7" : { "interfaces" : [ { "name" : "LS1_SS1" } ] },
-    "of:0000000000000011/8" : { "interfaces" : [ { "name" : "LS1_SS2" } ] },
-
-    "of:0000000000000012/1" : { "interfaces" : [ { "name" : "h21" } ] } ,
-    "of:0000000000000012/2" : { "interfaces" : [ { "name" : "h22" } ] },
-    "of:0000000000000012/3" : { "interfaces" : [ { "name" : "h23" } ] },
-    "of:0000000000000012/4" : { "interfaces" : [ { "name" : "h24" } ] },
-    "of:0000000000000012/5" : { "interfaces" : [ { "name" : "d21" } ] },
-    "of:0000000000000012/6" : { "interfaces" : [ { "name" : "d22" } ] },
-    "of:0000000000000012/7" : { "interfaces" : [ { "name" : "LS2_SS1" } ] },
-    "of:0000000000000012/8" : { "interfaces" : [ { "name" : "LS2_SS2" } ] },
-
-    "of:0000000000000021/1" : { "interfaces" : [ { "name" : "SS1_LS1" } ] },
-    "of:0000000000000021/2" : { "interfaces" : [ { "name" : "SS1_LS2" } ] },
-
-    "of:0000000000000022/1" : { "interfaces" : [ { "name" : "SS2_LS1" } ] },
-    "of:0000000000000022/2" : { "interfaces" : [ { "name" : "SS2_LS2" } ] }
-
+  "ports": {
+    "of:0000000000000011/1": {
+      "interfaces": [
+        {
+          "name": "h11"
+        }
+      ]
+    },
+    "of:0000000000000011/2": {
+      "interfaces": [
+        {
+          "name": "h12"
+        }
+      ]
+    },
+    "of:0000000000000011/3": {
+      "interfaces": [
+        {
+          "name": "h13"
+        }
+      ]
+    },
+    "of:0000000000000011/4": {
+      "interfaces": [
+        {
+          "name": "h14"
+        }
+      ]
+    },
+    "of:0000000000000011/5": {
+      "interfaces": [
+        {
+          "name": "d11"
+        }
+      ]
+    },
+    "of:0000000000000011/6": {
+      "interfaces": [
+        {
+          "name": "d12"
+        }
+      ]
+    },
+    "of:0000000000000011/7": {
+      "interfaces": [
+        {
+          "name": "LS1_SS1"
+        }
+      ]
+    },
+    "of:0000000000000011/8": {
+      "interfaces": [
+        {
+          "name": "LS1_SS2"
+        }
+      ]
+    },
+    "of:0000000000000012/1": {
+      "interfaces": [
+        {
+          "name": "h21"
+        }
+      ]
+    },
+    "of:0000000000000012/2": {
+      "interfaces": [
+        {
+          "name": "h22"
+        }
+      ]
+    },
+    "of:0000000000000012/3": {
+      "interfaces": [
+        {
+          "name": "h23"
+        }
+      ]
+    },
+    "of:0000000000000012/4": {
+      "interfaces": [
+        {
+          "name": "h24"
+        }
+      ]
+    },
+    "of:0000000000000012/5": {
+      "interfaces": [
+        {
+          "name": "d21"
+        }
+      ]
+    },
+    "of:0000000000000012/6": {
+      "interfaces": [
+        {
+          "name": "d22"
+        }
+      ]
+    },
+    "of:0000000000000012/7": {
+      "interfaces": [
+        {
+          "name": "LS2_SS1"
+        }
+      ]
+    },
+    "of:0000000000000012/8": {
+      "interfaces": [
+        {
+          "name": "LS2_SS2"
+        }
+      ]
+    },
+    "of:0000000000000021/1": {
+      "interfaces": [
+        {
+          "name": "SS1_LS1"
+        }
+      ]
+    },
+    "of:0000000000000021/2": {
+      "interfaces": [
+        {
+          "name": "SS1_LS2"
+        }
+      ]
+    },
+    "of:0000000000000022/1": {
+      "interfaces": [
+        {
+          "name": "SS2_LS1"
+        }
+      ]
+    },
+    "of:0000000000000022/2": {
+      "interfaces": [
+        {
+          "name": "SS2_LS2"
+        }
+      ]
+    }
   },
-
-  "apps" : {
-    "org.onosproject.simplefabric" : {
-      "simpleFabric" : {
-        "l2Networks" : [
-          { "name" : "LEAF1", "interfaces" : ["h11", "h12", "h13", "h14", "d11", "d12" ], "l2Forward" : true, "l2Broadcast" : true },
-          { "name" : "LEAF2", "interfaces" : ["h21", "h22", "h23", "h24", "d21", "d22" ], "l2Forward" : true, "l2Broadcast" : true }
+  "apps": {
+    "org.onosproject.simplefabric": {
+      "simpleFabric": {
+        "fabricNetworks": [
+          {
+            "name": "LEAF1",
+            "interfaces": [
+              "h11",
+              "h12",
+              "h13",
+              "h14",
+              "d11",
+              "d12"
+            ],
+            "isForward": true,
+            "isBroadcast": true
+          },
+          {
+            "name": "LEAF2",
+            "interfaces": [
+              "h21",
+              "h22",
+              "h23",
+              "h24",
+              "d21",
+              "d22"
+            ],
+            "isForward": true,
+            "isBroadcast": true
+          }
         ],
-        "ipSubnets" : [
-           { "ipPrefix" : "10.0.1.0/24", "gatewayIp" : "10.0.1.1", "gatewayMac" : "00:00:10:00:01:01", "l2NetworkName" : "LEAF1" },
-           { "ipPrefix" : "10.0.2.0/24", "gatewayIp" : "10.0.2.1", "gatewayMac" : "00:00:10:00:02:01", "l2NetworkName" : "LEAF2" }
+        "fabricSubnets": [
+          {
+            "prefix": "10.0.1.0/24",
+            "gatewayIp": "10.0.1.1",
+            "gatewayMac": "00:00:10:00:01:01",
+            "networkName": "LEAF1"
+          },
+          {
+            "prefix": "10.0.2.0/24",
+            "gatewayIp": "10.0.2.1",
+            "gatewayMac": "00:00:10:00:02:01",
+            "networkName": "LEAF2"
+          }
         ],
-        "borderRoutes" : [
-           { "ipPrefix" : "0.0.0.0/0", "nextHop" : "10.0.1.2" }
+        "fabricRoutes": [
+          {
+            "prefix": "0.0.0.0/0",
+            "nextHop": "10.0.1.2"
+          }
         ]
       }
     }
   }
-
 }
 
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/IpSubnet.java b/apps/simplefabric/src/main/java/org/onosproject/simplefabric/IpSubnet.java
deleted file mode 100644
index 596c659..0000000
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/IpSubnet.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.simplefabric;
-
-import com.google.common.base.MoreObjects;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.MacAddress;
-import org.onosproject.net.EncapsulationType;
-
-import java.util.Objects;
-
-/**
- * Configuration details for an ip subnet entry.
- */
-public class IpSubnet {
-    private final IpPrefix ipPrefix;
-    private final IpAddress gatewayIp;
-    private final MacAddress gatewayMac;
-    private EncapsulationType encapsulation;
-    private final String l2NetworkName;
-
-    /**
-     * Creates a new ip subnet entry.
-     *
-     * @param ipPrefix  an ip subnet
-     * @param gatewayIp IP of the virtual gateway
-     * @param gatewayMac MacAddress of the virtual gateway
-     * @param encapsulation EnacaptulatioType for routes related to this subnet
-     * @param l2NetworkName Name of L2 Network this subnet is bound
-     */
-    public IpSubnet(IpPrefix ipPrefix, IpAddress gatewayIp, MacAddress gatewayMac,
-                    EncapsulationType encapsulation, String l2NetworkName) {
-        this.ipPrefix = ipPrefix;
-        this.gatewayIp = gatewayIp;
-        this.gatewayMac = gatewayMac;
-        this.encapsulation = EncapsulationType.NONE;
-        this.l2NetworkName = l2NetworkName;
-    }
-
-    /**
-     * Gets the ip subnet of the ip subnet entry.
-     *
-     * @return the ip subnet
-     */
-    public IpPrefix ipPrefix() {
-        return ipPrefix;
-    }
-
-    /**
-     * Gets the virtual gateway IP address of the ip subnet entry.
-     *
-     * @return the virtual gateway IP address
-     */
-    public IpAddress gatewayIp() {
-        return gatewayIp;
-    }
-
-    /**
-     * Gets the virtual gateway Mac address of the ip subnet entry.
-     *
-     * @return the virtuai gateway Mac address
-     */
-    public MacAddress gatewayMac() {
-        return gatewayMac;
-    }
-
-    /**
-     * Gets the encapsulation type of ip subnet entry.
-     *
-     * @return the encapsulation type
-     */
-    public EncapsulationType encapsulation() {
-        return encapsulation;
-    }
-
-    /**
-     * Gets the name of L2 Network this subnet is bound.
-     *
-     * @return the l2Network name this subnet is allocated
-     */
-    public String l2NetworkName() {
-        return l2NetworkName;
-    }
-
-    /**
-     * Tests whether the IP version of this entry is IPv4.
-     *
-     * @return true if the IP version of this entry is IPv4, otherwise false.
-     */
-    public boolean isIp4() {
-        return ipPrefix.isIp4();
-    }
-
-    /**
-     * Tests whether the IP version of this entry is IPv6.
-     *
-     * @return true if the IP version of this entry is IPv6, otherwise false.
-     */
-    public boolean isIp6() {
-        return ipPrefix.isIp6();
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(ipPrefix, gatewayIp, gatewayMac, encapsulation, l2NetworkName);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (!(obj instanceof IpSubnet)) {
-            return false;
-        }
-        IpSubnet that = (IpSubnet) obj;
-        return Objects.equals(this.ipPrefix, that.ipPrefix)
-               && Objects.equals(this.gatewayIp, that.gatewayIp)
-               && Objects.equals(this.gatewayMac, that.gatewayMac)
-               && Objects.equals(this.encapsulation, that.encapsulation)
-               && Objects.equals(this.l2NetworkName, that.l2NetworkName);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("ipPrefix", ipPrefix)
-                .add("gatewayIp", gatewayIp)
-                .add("gatewayMac", gatewayMac)
-                .add("encapsulation", encapsulation)
-                .add("l2NetworkName", l2NetworkName)
-                .toString();
-    }
-}
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/L2Network.java b/apps/simplefabric/src/main/java/org/onosproject/simplefabric/L2Network.java
deleted file mode 100644
index 5579159..0000000
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/L2Network.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.simplefabric;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import org.onlab.packet.VlanId;
-import org.onosproject.net.intf.Interface;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.EncapsulationType;
-
-import java.util.Collection;
-import java.util.Objects;
-import java.util.Set;
-
-
-/**
- * Class stores a L2Network information.
- */
-public final class L2Network {
-
-    private String name;                  // also for network configuration
-    private Set<String> interfaceNames;   // also for network configuration
-    private EncapsulationType encapsulation;  // also for network configuration
-    private boolean l2Forward;            // do l2Forward (default:true) or not
-    private boolean l2Broadcast;          // do l2Broadcast (default:true) or not
-
-    /* status variables */
-    private Set<Interface> interfaces;    // available interfaces from interfaceNames
-    private Set<HostId> hostIds;          // available hosts from interfaces
-    private boolean dirty;
-
-    /**
-     * Constructs a L2Network data for Config value.
-     *
-     * @param name the given name
-     * @param ifaceNames the interface names
-     * @param encapsulation the encapsulation type
-     * @param l2Forward flag for l2Forward intents to be installed or not
-     * @param l2Broadcast flag for l2Broadcast intents to be installed or not
-     */
-    L2Network(String name, Collection<String> ifaceNames, EncapsulationType encapsulation,
-              boolean l2Forward, boolean l2Broadcast) {
-        this.name = name;
-        this.interfaceNames = Sets.newHashSet();
-        this.interfaceNames.addAll(ifaceNames);
-        this.encapsulation = encapsulation;
-        this.l2Forward = (SimpleFabricService.ALLOW_ETH_ADDRESS_SELECTOR) ? l2Forward : false;
-        this.l2Broadcast = (SimpleFabricService.ALLOW_ETH_ADDRESS_SELECTOR) ? l2Broadcast : false;
-        this.interfaces = Sets.newHashSet();
-        this.hostIds = Sets.newHashSet();
-        this.dirty = false;
-    }
-
-    /**
-     * Constructs a L2Network data by given name and encapsulation type.
-     *
-     * @param name the given name
-     * @param encapsulation the encapsulation type
-     */
-    private L2Network(String name, EncapsulationType encapsulation) {
-        this.name = name;
-        this.interfaceNames = Sets.newHashSet();
-        this.encapsulation = encapsulation;
-        this.l2Forward = (SimpleFabricService.ALLOW_ETH_ADDRESS_SELECTOR) ? true : false;
-        this.l2Broadcast = (SimpleFabricService.ALLOW_ETH_ADDRESS_SELECTOR) ? true : false;
-        this.interfaces = Sets.newHashSet();
-        this.hostIds = Sets.newHashSet();
-        this.dirty = false;
-    }
-
-    /**
-     * Creates a L2Network data by given name.
-     * The encapsulation type of the L2Network will be NONE.
-     *
-     * @param name the given name
-     * @return the L2Network data
-     */
-    public static L2Network of(String name) {
-        Objects.requireNonNull(name);
-        return new L2Network(name, EncapsulationType.NONE);
-    }
-
-    /**
-     * Creates a copy of L2Network data.
-     *
-     * @param l2Network the L2Network data
-     * @return the copy of the L2Network data
-     */
-    public static L2Network of(L2Network l2Network) {
-        Objects.requireNonNull(l2Network);
-        L2Network l2NetworkCopy = new L2Network(l2Network.name(), l2Network.encapsulation());
-        l2NetworkCopy.interfaceNames.addAll(l2Network.interfaceNames());
-        l2NetworkCopy.l2Forward = (SimpleFabricService.ALLOW_ETH_ADDRESS_SELECTOR) ? l2Network.l2Forward() : false;
-        l2NetworkCopy.l2Broadcast = (SimpleFabricService.ALLOW_ETH_ADDRESS_SELECTOR) ? l2Network.l2Broadcast() : false;
-        l2NetworkCopy.interfaces.addAll(l2Network.interfaces());
-        l2NetworkCopy.hostIds.addAll(l2Network.hostIds());
-        l2NetworkCopy.setDirty(l2Network.dirty());
-        return l2NetworkCopy;
-    }
-
-    // field queries
-
-    /**
-     * Gets L2Network name.
-     *
-     * @return the name of L2Network
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Gets L2Network interfaceNames.
-     *
-     * @return the interfaceNames of L2Network
-     */
-    public Set<String> interfaceNames() {
-        return ImmutableSet.copyOf(interfaceNames);
-    }
-
-    /**
-     * Gets L2Network encapsulation type.
-     *
-     * @return the encapsulation type of L2Network
-     */
-    public EncapsulationType encapsulation() {
-        return encapsulation;
-    }
-
-    /**
-     * Gets L2Network l2Forward flag.
-     *
-     * @return the l2Forward flag of L2Network
-     */
-    public boolean l2Forward() {
-        return l2Forward;
-    }
-
-    /**
-     * Gets L2Network l2Broadcast flag.
-     *
-     * @return the l2Broadcast flag of L2Network
-     */
-    public boolean l2Broadcast() {
-        return l2Broadcast;
-    }
-
-    /**
-     * Gets L2Network interfaces.
-     *
-     * @return the interfaces of L2Network
-     */
-    public Set<Interface> interfaces() {
-        return ImmutableSet.copyOf(interfaces);
-    }
-
-    /**
-     * Gets L2Network hosts.
-     *
-     * @return the hosts of L2Network
-     */
-    public Set<HostId> hostIds() {
-        return ImmutableSet.copyOf(hostIds);
-    }
-
-    /**
-     * Gets L2Network dirty flag.
-     *
-     * @return the dirty flag of L2Network
-     */
-    public boolean dirty() {
-        return dirty;
-    }
-
-    /**
-     * Checks if the interface is of L2Network.
-     *
-     * @param iface the interface to be checked
-     * @return true if L2Network contains the interface
-     */
-    public boolean contains(Interface iface) {
-        return interfaces.contains(iface);
-    }
-
-    /**
-     * Checks if the ConnectPoint and Vlan is of L2Network.
-     *
-     * @param port the ConnectPoint to be checked
-     * @param vlanId the VlanId of the ConnectPoint to be checked
-     * @return true if L2Network contains the interface of the ConnnectPoint and VlanId
-     */
-    public boolean contains(ConnectPoint port, VlanId vlanId) {
-        for (Interface iface : interfaces) {
-            if (iface.connectPoint().equals(port) && iface.vlan().equals(vlanId)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Checks if the DeviceId is of L2Network.
-     *
-     * @param deviceId the DeviceId to be checked
-     * @return true if L2Network contains any interface of the DeviceId
-     */
-    public boolean contains(DeviceId deviceId) {
-        for (Interface iface : interfaces) {
-            if (iface.connectPoint().deviceId().equals(deviceId)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Adds interface to L2Network.
-     *
-     * @param iface the Interface to be added
-     */
-    public void addInterface(Interface iface) {
-        Objects.requireNonNull(iface);
-        if (interfaces.add(iface)) {
-            setDirty(true);
-        }
-    }
-
-    /**
-     * Adds host to L2Network.
-     *
-     * @param host the Host to be added
-     */
-    public void addHost(Host host) {
-        Objects.requireNonNull(host);
-        if (hostIds.add(host.id())) {
-            setDirty(true);
-        }
-    }
-
-    /**
-     * Sets L2Network dirty flag.
-     *
-     * @param newDirty the dirty flag to be set
-     */
-    public void setDirty(boolean newDirty) {
-        dirty = newDirty;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("name", name)
-                .add("interfaceNames", interfaceNames)
-                .add("encapsulation", encapsulation)
-                .add("l2Forward", l2Forward)
-                .add("l2Broadcast", l2Broadcast)
-                .add("interfaces", interfaces)
-                .add("hostIds", hostIds)
-                .add("dirty", dirty)
-                .toString();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (!(obj instanceof L2Network)) {
-            return false;
-        }
-        L2Network other = (L2Network) obj;
-        return Objects.equals(other.name, this.name)
-               && Objects.equals(other.interfaceNames, this.interfaceNames)
-               && Objects.equals(other.encapsulation, this.encapsulation)
-               && Objects.equals(other.l2Forward, this.l2Forward)
-               && Objects.equals(other.l2Broadcast, this.l2Broadcast)
-               && Objects.equals(other.interfaces, this.interfaces)
-               && Objects.equals(other.hostIds, this.hostIds);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(name, interfaces, encapsulation, l2Forward, l2Broadcast);
-    }
-}
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/Route.java b/apps/simplefabric/src/main/java/org/onosproject/simplefabric/Route.java
deleted file mode 100644
index 8eabb95..0000000
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/Route.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * 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.
- */
-/*
- * local copy of onos/incubator/api/src/main/java/org/onosproject/incubator/net/routing/Route.java
- * to remove dependency on onos.incubator.routing services, since 2017-08-09.
- */
-
-package org.onosproject.simplefabric;
-
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onosproject.cluster.NodeId;
-
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Represents a route.
- */
-public class Route {
-
-    private static final String VERSION_MISMATCH =
-            "Prefix and next hop must be in the same address family";
-
-    private static final NodeId UNDEFINED = new NodeId("-");
-
-    /**
-     * Source of the route.
-     */
-    public enum Source {
-        /**
-         * Route came from the iBGP route source.
-         */
-        BGP,
-
-        /**
-         * Route came from the FPM route source.
-         */
-        FPM,
-
-        /**
-         * Route can from the static route source.
-         */
-        STATIC,
-
-        /**
-         * Route source was not defined.
-         */
-        UNDEFINED
-    }
-
-    private final Source source;
-    private final IpPrefix prefix;
-    private final IpAddress nextHop;
-    private final NodeId sourceNode;
-
-    /**
-     * Creates a route.
-     *
-     * @param source route source
-     * @param prefix IP prefix
-     * @param nextHop next hop IP address
-     */
-    public Route(Source source, IpPrefix prefix, IpAddress nextHop) {
-        this(source, prefix, nextHop, UNDEFINED);
-    }
-
-    /**
-     * Creates a route.
-     *
-     * @param source route source
-     * @param prefix IP prefix
-     * @param nextHop next hop IP address
-     * @param sourceNode ONOS node the route was sourced from
-     */
-    public Route(Source source, IpPrefix prefix, IpAddress nextHop, NodeId sourceNode) {
-        checkNotNull(prefix);
-        checkNotNull(nextHop);
-        checkArgument(prefix.version().equals(nextHop.version()), VERSION_MISMATCH);
-
-        this.source = checkNotNull(source);
-        this.prefix = prefix;
-        this.nextHop = nextHop;
-        this.sourceNode = checkNotNull(sourceNode);
-    }
-
-    /**
-     * Returns the route source.
-     *
-     * @return route source
-     */
-    public Source source() {
-        return source;
-    }
-
-    /**
-     * Returns the IP prefix of the route.
-     *
-     * @return IP prefix
-     */
-    public IpPrefix prefix() {
-        return prefix;
-    }
-
-    /**
-     * Returns the next hop IP address.
-     *
-     * @return next hop
-     */
-    public IpAddress nextHop() {
-        return nextHop;
-    }
-
-    /**
-     * Returns the ONOS node the route was sourced from.
-     *
-     * @return ONOS node ID
-     */
-    public NodeId sourceNode() {
-        return sourceNode;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(prefix, nextHop);
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (this == other) {
-            return true;
-        }
-
-        if (!(other instanceof Route)) {
-            return false;
-        }
-
-        Route that = (Route) other;
-
-        return Objects.equals(this.prefix, that.prefix) &&
-                Objects.equals(this.nextHop, that.nextHop);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("prefix", prefix)
-                .add("nextHop", nextHop)
-                .toString();
-    }
-}
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricConfig.java b/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricConfig.java
deleted file mode 100644
index 7bae152..0000000
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricConfig.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.simplefabric;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.collect.Sets;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.MacAddress;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.net.config.Config;
-import org.onosproject.net.EncapsulationType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Set;
-
-/**
- * Configuration object for prefix config.
- */
-public class SimpleFabricConfig extends Config<ApplicationId> {
-    public static final String KEY = "simpleFabric";
-
-    private static final String L2NETWORKS = "l2Networks";
-    private static final String NAME = "name";
-    private static final String INTERFACES = "interfaces";
-    private static final String ENCAPSULATION = "encapsulation";
-    private static final String L2FORWARD = "l2Forward";
-    private static final String L2BROADCAST = "l2Broadcast";
-    private static final String IPSUBNETS = "ipSubnets";
-    private static final String BORDERROUTES = "borderRoutes";
-    private static final String IPPREFIX = "ipPrefix";
-    private static final String GATEWAYIP = "gatewayIp";
-    private static final String GATEWAYMAC = "gatewayMac";
-    private static final String L2NETWORKNAME = "l2NetworkName";
-    private static final String NEXTHOP = "nextHop";
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    /**
-     * Returns all l2Networks in this configuration.
-     *
-     * @return A set of L2Network.
-     */
-    public Set<L2Network> getL2Networks() {
-        Set<L2Network> l2Networks = Sets.newHashSet();
-        JsonNode l2NetworkNode = object.get(L2NETWORKS);
-        if (l2NetworkNode == null) {
-            return l2Networks;
-        }
-
-        l2NetworkNode.forEach(jsonNode -> {
-            Set<String> ifaces = Sets.newHashSet();
-            JsonNode l2NetworkIfaces = jsonNode.path(INTERFACES);
-            if (l2NetworkIfaces == null) {
-                log.warn("simple fabric network config cannot find {}; skip: jsonNode={}", INTERFACES, jsonNode);
-            } else if (!l2NetworkIfaces.toString().isEmpty()) {
-                l2NetworkIfaces.forEach(ifacesNode -> ifaces.add(new String(ifacesNode.asText())));
-            }
-            String encapsulation = "NONE";   // NONE or VLAN
-            if (jsonNode.hasNonNull(ENCAPSULATION)) {
-                encapsulation = jsonNode.get(ENCAPSULATION).asText();
-            }
-            boolean l2Forward = true;
-            if (jsonNode.hasNonNull(L2FORWARD)) {
-                l2Forward = jsonNode.get(L2FORWARD).asBoolean();
-            }
-            boolean l2Broadcast = true;
-            if (jsonNode.hasNonNull(L2BROADCAST)) {
-                l2Broadcast = jsonNode.get(L2BROADCAST).asBoolean();
-            }
-            try {
-                l2Networks.add(new L2Network(
-                        jsonNode.get(NAME).asText(), ifaces, EncapsulationType.enumFromString(encapsulation),
-                        l2Forward, l2Broadcast));
-            } catch (Exception e) {
-                log.warn("simple fabric network config l2Network parse failed; skip: error={} jsonNode={}", jsonNode);
-            }
-        });
-        return l2Networks;
-    }
-
-    /**
-     * Gets the set of configured local IP subnets.
-     *
-     * @return IP Subnets
-     */
-    public Set<IpSubnet> ipSubnets() {
-        Set<IpSubnet> subnets = Sets.newHashSet();
-        JsonNode subnetsNode = object.get(IPSUBNETS);
-        if (subnetsNode == null) {
-            log.warn("simple fabric network config ipSubnets is null!");
-            return subnets;
-        }
-
-        subnetsNode.forEach(jsonNode -> {
-            String encapsulation = "NONE";   // NONE or VLAN
-            if (jsonNode.hasNonNull(ENCAPSULATION)) {
-                encapsulation = jsonNode.get(ENCAPSULATION).asText();
-            }
-            try {
-                subnets.add(new IpSubnet(
-                        IpPrefix.valueOf(jsonNode.get(IPPREFIX).asText()),
-                        IpAddress.valueOf(jsonNode.get(GATEWAYIP).asText()),
-                        MacAddress.valueOf(jsonNode.get(GATEWAYMAC).asText()),
-                        EncapsulationType.enumFromString(encapsulation),
-                        jsonNode.get(L2NETWORKNAME).asText()));
-            } catch (Exception e) {
-                log.warn("simple fabric network config ipSubnet parse failed; skip: error={} jsonNode={}", jsonNode);
-            }
-        });
-
-        return subnets;
-    }
-
-    /**
-     * Returns all routes in this configuration.
-     *
-     * @return A set of route.
-     */
-    public Set<Route> borderRoutes() {
-        Set<Route> routes = Sets.newHashSet();
-
-        JsonNode routesNode = object.get(BORDERROUTES);
-        if (routesNode == null) {
-            //log.warn("simple fabric network config borderRoutes is null!");
-            return routes;
-        }
-
-        routesNode.forEach(jsonNode -> {
-            try {
-                routes.add(new Route(
-                      Route.Source.STATIC,
-                      IpPrefix.valueOf(jsonNode.path(IPPREFIX).asText()),
-                      IpAddress.valueOf(jsonNode.path(NEXTHOP).asText())));
-            } catch (IllegalArgumentException e) {
-                log.warn("simple fabric network config parse error; skip: {}", jsonNode);
-            }
-        });
-
-        return routes;
-    }
-
-}
diff --git a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricService.java b/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricService.java
deleted file mode 100644
index be2bed3..0000000
--- a/apps/simplefabric/src/main/java/org/onosproject/simplefabric/SimpleFabricService.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.simplefabric;
-
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.VlanId;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.event.ListenerService;
-import org.onosproject.net.intf.Interface;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Host;
-
-import java.io.OutputStream;
-import java.util.Set;
-import java.util.Collection;
-
-/**
- * Provides information about the routing configuration.
- */
-public interface SimpleFabricService
-        extends ListenerService<SimpleFabricEvent, SimpleFabricListener> {
-
-    // App symbols
-    static final String APP_ID = "org.onosproject.simplefabric";
-    static final String L2FORWARD_APP_ID = "org.onosproject.simplefabric.l2forward";
-    static final String REACTIVE_APP_ID = "org.onosproject.simplefabric.reactive";
-
-    // Priority for l2NetworkRouting: L2NETWORK_UNICAST or L2NETWORK_BROADCAST
-    static final int PRI_L2NETWORK_UNICAST = 601;
-    static final int PRI_L2NETWORK_BROADCAST = 600;
-
-    // Reactive Routing within Local Subnets
-    // ASSUME: local subnets NEVER overlaps each other
-    static final int PRI_REACTIVE_LOCAL_FORWARD = 501;
-    static final int PRI_REACTIVE_LOCAL_INTERCEPT = 500;
-    // Reactive Routing for Border Routes with local subnet
-    // Priority: REACTIVE_BROUTE_BASE + routeIpPrefix * REACTIVE_BROUTE_STEP
-    //           + REACTIVE_BROUTE_FORWARD or REACTIVE_BROUTE_INTERCEPT
-    static final int PRI_REACTIVE_BORDER_BASE = 100;
-    static final int PRI_REACTIVE_BORDER_STEP = 2;
-    static final int PRI_REACTIVE_BORDER_FORWARD = 1;
-    static final int PRI_REACTIVE_BORDER_INTERCEPT = 0;
-
-    // Simple fabric event related timers
-    static final long IDLE_INTERVAL_MSEC = 5000;
-
-    // Feature control parameters
-    static final boolean ALLOW_IPV6 = false;
-    static final boolean ALLOW_ETH_ADDRESS_SELECTOR = true;
-    static final boolean REACTIVE_SINGLE_TO_SINGLE = false;
-    static final boolean REACTIVE_ALLOW_LINK_CP = false;  // MUST BE false (yjlee, 2017-10-18)
-    static final boolean REACTIVE_HASHED_PATH_SELECTION = false;
-    static final boolean REACTIVE_MATCH_IP_PROTO = false;
-
-    /**
-     * Gets appId.
-     *
-     * @return appId of simple fabric app
-     */
-    ApplicationId getAppId();
-
-    /**
-     * Gets all the l2Networks.
-     *
-     * @return all the l2Networks
-     */
-    Collection<L2Network> getL2Networks();
-
-    /**
-     * Retrieves the entire set of ipSubnets configuration.
-     *
-     * @return all the ipSubnets
-     */
-    Set<IpSubnet> getIpSubnets();
-
-    /**
-     * Retrieves the entire set of static routes to outer networks.
-     *
-     * @return the set of static routes to outer networks.
-     */
-    Set<Route> getBorderRoutes();
-
-    /**
-     * Evaluates whether a mac is of Virtual Gateway Mac Addresses.
-     *
-     * @param mac the MacAddress to evaluate
-     * @return true if the mac is of any Vitrual Gateway Mac Address of ipSubnets
-     */
-    boolean isVMac(MacAddress mac);
-
-    /**
-     * Evaluates whether an Interface belongs to l2Networks.
-     *
-     * @param intf the interface to evaluate
-     * @return true if the inteface belongs to l2Networks configed, otherwise false
-     */
-    boolean isL2NetworkInterface(Interface intf);
-
-    /**
-     * Find Virtual Gateway Mac Address for Local Subnet Virtual Gateway Ip.
-     *
-     * @param ip the ip to check for Virtual Gateway Ip
-     * @return mac address of virtual gateway
-     */
-    MacAddress findVMacForIp(IpAddress ip);
-
-    /**
-     * Finds the L2 Network with given port and vlanId.
-     *
-     * @param port the port to be matched
-     * @param vlanId the vlanId to be matched
-     * @return the L2 Network for specific port and vlanId or null
-     */
-    L2Network findL2Network(ConnectPoint port, VlanId vlanId);
-
-    /**
-     * Finds the L2 Network of the name.
-     *
-     * @param name the name to be matched
-     * @return the L2 Network for specific name
-     */
-    L2Network findL2Network(String name);
-
-    /**
-     * Finds the IpSubnet containing the ipAddress.
-     *
-     * @param ipAddress the ipAddress to be matched
-     * @return the IpSubnet for specific ipAddress
-     */
-    IpSubnet findIpSubnet(IpAddress ipAddress);
-
-    /**
-     * Finds the Border Route containing the ipAddress.
-     * ASSUME: ipAddress is out of ipSubnets
-     *
-     * @param ipAddress the ipAddress to be matched
-     * @return the IpSubnet for specific ipAddress
-     */
-    Route findBorderRoute(IpAddress ipAddress);
-
-    /**
-     * Finds the network interface related to the host.
-     *
-     * @param host the host
-     * @return the interface related to the host
-     */
-    Interface findHostInterface(Host host);
-
-    /**
-     * Sends Neighbour Query (ARP or NDP) to Find Host Location.
-     *
-     * @param ip the ip address to resolve
-     * @return true if request mac packets are emitted. otherwise false
-     */
-    boolean requestMac(IpAddress ip);
-
-    /**
-     * Sends Dump Event to all SimpleFabricListeners to Dump Info on the Subject.
-     *
-     * @param subject the subject to dump
-     * @param out the output stream to dump
-     */
-    void dumpToStream(String subject, OutputStream out);
-
-    /**
-     * Triggers to send Refresh Notification to all sub modules.
-     */
-    void triggerRefresh();
-
-    /**
-     * Triggers to send Flush Notification to all sub modules.
-     */
-    void triggerFlush();
-
-}
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/DocumentTreeTestCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/DocumentTreeTestCommand.java
new file mode 100644
index 0000000..448d681
--- /dev/null
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/DocumentTreeTestCommand.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * 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.distributedprimitives.cli;
+
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.DocumentPath;
+import org.onosproject.store.service.DocumentTree;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+import org.onosproject.store.service.Versioned;
+
+/**
+ * CLI command to manipulate a document tree.
+ */
+@Command(scope = "onos", name = "document-tree-test",
+        description = "Manipulate a document tree")
+public class DocumentTreeTestCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "name",
+            description = "tree name",
+            required = true, multiValued = false)
+    String name = null;
+
+    @Argument(index = 1, name = "operation",
+            description = "operation name",
+            required = true, multiValued = false)
+    String operation = null;
+
+    @Argument(index = 2, name = "path",
+            description = "first arg",
+            required = false, multiValued = false)
+    String arg1 = null;
+
+    @Argument(index = 3, name = "value",
+            description = "second arg",
+            required = false, multiValued = false)
+    String arg2 = null;
+
+    DocumentTree<String> tree;
+
+    @Override
+    protected void doExecute() {
+        StorageService storageService = get(StorageService.class);
+        tree = storageService.<String>getDocumentTree(name, Serializer.using(KryoNamespaces.BASIC)).asDocumentTree();
+
+        tree.addListener(value -> {
+            log.debug("Received event: {}", value);
+        });
+
+        if ("set".equals(operation)) {
+            log.debug("set {} {}", DocumentPath.from(arg1), arg2);
+            print(tree.set(DocumentPath.from(arg1), arg2));
+        } else if ("get".equals(operation)) {
+            log.debug("get {}", DocumentPath.from(arg1));
+            print(tree.get(DocumentPath.from(arg1)));
+        } else if ("remove".equals(operation)) {
+            log.debug("removeNode {}", DocumentPath.from(arg1));
+            print(tree.removeNode(DocumentPath.from(arg1)));
+        } else if ("create".equals(operation)) {
+            log.debug("create {} {}", DocumentPath.from(arg1), arg2);
+            print("%b", tree.create(DocumentPath.from(arg1), arg2));
+        } else if ("createRecursive".equals(operation)) {
+            log.debug("createRecursive {} {}", DocumentPath.from(arg1), arg2);
+            print("%b", tree.createRecursive(DocumentPath.from(arg1), arg2));
+        }
+    }
+
+    void print(Versioned<String> value) {
+        if (value == null) {
+            print("null");
+        } else {
+            print("%s", value.value());
+        }
+    }
+}
diff --git a/apps/test/distributed-primitives/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/test/distributed-primitives/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 30401a0..eeeab33 100644
--- a/apps/test/distributed-primitives/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/apps/test/distributed-primitives/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -44,6 +44,9 @@
             <action class="org.onosproject.distributedprimitives.cli.ConsistentMapTestCommand"/>
         </command>
         <command>
+            <action class="org.onosproject.distributedprimitives.cli.DocumentTreeTestCommand"/>
+        </command>
+        <command>
             <action class="org.onosproject.distributedprimitives.cli.EventuallyConsistentMapTestCommand"/>
         </command>
         <command>
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/TableStatisticsDiscovery.java b/core/api/src/main/java/org/onosproject/net/behaviour/TableStatisticsDiscovery.java
new file mode 100644
index 0000000..84e6c2b
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/TableStatisticsDiscovery.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.net.behaviour;
+
+import org.onosproject.net.driver.HandlerBehaviour;
+import org.onosproject.net.flow.TableStatisticsEntry;
+import java.util.Collection;
+
+/**
+ * Behaviour capable of retrieving table statistics from device.
+ */
+public interface TableStatisticsDiscovery extends HandlerBehaviour {
+
+    /**
+     * Returns statistics for all match-action tables currently defined by the device forwarding pipeline.
+     *
+     * @return a list of tableStatisticEntry
+     */
+    Collection<TableStatisticsEntry> getTableStatistics();
+
+}
diff --git a/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java b/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java
index ec50bc5..8656e71 100644
--- a/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java
+++ b/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java
@@ -111,7 +111,7 @@
     public void activate() {
 
         if (maxProcessMillis != 0) {
-            dispatchers.forEach(DispatchLoop::startWatchdog);
+            dispatchers.forEach(DispatchLoop::start);
         }
 
         log.info("Started");
@@ -163,7 +163,6 @@
                     groupedThreads("onos/event",
                     "dispatch-" + name + "%d", log));
             eventsQueue = new LinkedBlockingQueue<>();
-            dispatchFuture = executor.submit(this);
         }
 
         public boolean add(Event event) {
@@ -172,7 +171,6 @@
 
         @Override
         public void run() {
-            stopped = false;
             log.info("Dispatch loop({}) initiated", name);
             while (!stopped) {
                 try {
@@ -208,11 +206,16 @@
         void stop() {
             stopped = true;
             add(KILL_PILL);
+            if (null != dispatchFuture) {
+                dispatchFuture.cancel(true);
+            }
+            stopWatchdog();
         }
 
-        void restart() {
-            dispatchFuture.cancel(true);
+        void start() {
+            stopped = false;
             dispatchFuture = executor.submit(this);
+            startWatchdog();
         }
 
         // Monitors event sinks to make sure none take too long to execute.
@@ -232,7 +235,7 @@
                     // Cancel the old dispatch loop and submit a new one.
 
                     stop();
-                    restart();
+                    start();
                 }
             }
         }
diff --git a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java
index abda2bf..8a3d724 100644
--- a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java
+++ b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.net.flow.impl;
 
+import static com.google.common.collect.Lists.newArrayList;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Multimap;
@@ -25,6 +26,7 @@
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.TableStatisticsDiscovery;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
@@ -35,6 +37,7 @@
 import org.onosproject.net.flow.FlowRuleProgrammable;
 import org.onosproject.net.flow.FlowRuleProvider;
 import org.onosproject.net.flow.FlowRuleProviderService;
+import org.onosproject.net.flow.TableStatisticsEntry;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
 import org.slf4j.Logger;
@@ -45,6 +48,7 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
+import java.util.List;
 
 import static com.google.common.collect.ImmutableSet.copyOf;
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
@@ -196,12 +200,25 @@
         }
     }
 
+    private void pollTableStatistics(Device device) {
+        try {
+            List<TableStatisticsEntry> tableStatsList = newArrayList(device.as(TableStatisticsDiscovery.class)
+                    .getTableStatistics());
+            providerService.pushTableStatistics(device.id(), tableStatsList);
+        } catch (Exception e) {
+            log.warn("Exception thrown while polling table statistics for {}", device.id(), e);
+        }
+    }
+
     private void pollFlowEntries() {
         try {
             deviceService.getAvailableDevices().forEach(device -> {
                 if (mastershipService.isLocalMaster(device.id()) && device.is(FlowRuleProgrammable.class)) {
                     pollDeviceFlowEntries(device);
                 }
+                if (mastershipService.isLocalMaster(device.id()) && device.is(TableStatisticsDiscovery.class)) {
+                    pollTableStatistics(device);
+                }
             });
         } catch (Exception e) {
             log.warn("Exception thrown while polling flows", e);
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/PiGroupTranslatorImpl.java b/core/net/src/main/java/org/onosproject/net/pi/impl/PiGroupTranslatorImpl.java
index d989571..4a4dff7 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/PiGroupTranslatorImpl.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/PiGroupTranslatorImpl.java
@@ -109,6 +109,9 @@
 
             final PiTableAction tableAction = translateTreatment(bucket.treatment(), interpreter, groupKey.tableId(),
                                                                  pipeconf.pipelineModel());
+            if (tableAction == null) {
+                throw new PiTranslationException("The PI table action returned by the interpreter is null");
+            }
 
             if (tableAction.type() != ACTION) {
                 throw new PiTranslationException(format(
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraCt.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraCt.java
index 1828a65..73f37c8 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraCt.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraCt.java
@@ -24,6 +24,7 @@
 import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -39,7 +40,11 @@
     private short recircTable;
     private int alg;
     private List<ExtensionTreatment> nestedActions;
-    private final KryoNamespace appKryo = new KryoNamespace.Builder().build();
+    private final KryoNamespace appKryo = new KryoNamespace.Builder()
+                                                .register(HashMap.class)
+                                                .register(ArrayList.class)
+                                                .register(ExtensionTreatment.class)
+                                                .build();
 
     /**
      * Creates a new nicicra ct instruction.
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraMatchCtMark.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraMatchCtMark.java
index 9203555..67d9733 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraMatchCtMark.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraMatchCtMark.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.driver.extensions;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 
@@ -35,7 +36,9 @@
     private long ctMark;
     private long ctMarkMask;
 
-    private final KryoNamespace appKryo = new KryoNamespace.Builder().build();
+    private final KryoNamespace appKryo = new KryoNamespace.Builder()
+                                                    .register(HashMap.class)
+                                                    .build();
 
     /**
      * Creates a new conntrack mark selector.
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraMatchCtState.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraMatchCtState.java
index eb4c6da..f2fb423 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraMatchCtState.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/NiciraMatchCtState.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.driver.extensions;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 
@@ -34,7 +35,9 @@
     private long ctState;
     private long ctStateMask;
 
-    private final KryoNamespace appKryo = new KryoNamespace.Builder().build();
+    private final KryoNamespace appKryo = new KryoNamespace.Builder()
+                                                .register(HashMap.class)
+                                                .build();
 
     /**
      * Creates a new conntrack state selector.
diff --git a/drivers/juniper/src/main/java/org/onosproject/drivers/juniper/JuniperUtils.java b/drivers/juniper/src/main/java/org/onosproject/drivers/juniper/JuniperUtils.java
index 3cf5eec..fca4697 100644
--- a/drivers/juniper/src/main/java/org/onosproject/drivers/juniper/JuniperUtils.java
+++ b/drivers/juniper/src/main/java/org/onosproject/drivers/juniper/JuniperUtils.java
@@ -592,15 +592,17 @@
             List<HierarchicalConfiguration> routes = routeTable.configurationsAt("rt");
             for (HierarchicalConfiguration route : routes) {
                 if (route != null) {
-                    HierarchicalConfiguration rtEntry = route.configurationAt("rt-entry");
-                    if (rtEntry.getString(PROTOCOL_NAME) != null &&
-                            rtEntry.getString(PROTOCOL_NAME).contains("Static")) {
-                        parseStaticRoute(rtEntry,
-                                route.getString("rt-destination"),
-                                rtEntry.getString("metric"))
-                                .ifPresent(x -> staticRoutes.add(x));
+                    List<HierarchicalConfiguration> rtEntries = route.configurationsAt("rt-entry");
+                    rtEntries.forEach(rtEntry -> {
+                        if (rtEntry.getString(PROTOCOL_NAME) != null &&
+                                rtEntry.getString(PROTOCOL_NAME).contains("Static")) {
+                            parseStaticRoute(rtEntry,
+                                    route.getString("rt-destination"),
+                                    rtEntry.getString("metric"))
+                                    .ifPresent(staticRoutes::add);
 
-                    }
+                        }
+                    });
                 }
             }
         }
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeActionGroupProgrammable.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeActionGroupProgrammable.java
index 5ee965d..fd2ef27 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeActionGroupProgrammable.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeActionGroupProgrammable.java
@@ -26,6 +26,7 @@
 import org.onosproject.drivers.p4runtime.mirror.P4RuntimeActionProfileMemberMirror;
 import org.onosproject.drivers.p4runtime.mirror.P4RuntimeGroupMirror;
 import org.onosproject.drivers.p4runtime.mirror.TimedEntry;
+import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.group.DefaultGroup;
 import org.onosproject.net.group.DefaultGroupDescription;
@@ -76,6 +77,7 @@
     // the ONOS store.
     private static final String READ_ACTION_GROUPS_FROM_MIRROR = "actionGroupReadFromMirror";
     private static final boolean DEFAULT_READ_ACTION_GROUPS_FROM_MIRROR = false;
+    private static final String MAX_MEM_SIZE = "maxMemSize";
 
     protected GroupStore groupStore;
     private P4RuntimeGroupMirror groupMirror;
@@ -84,6 +86,7 @@
 
     // Needed to synchronize operations over the same group.
     private static final Striped<Lock> STRIPED_LOCKS = Striped.lock(30);
+    private static final int GROUP_MEMBERS_BUFFER_SIZE = 3;
 
     @Override
     protected boolean setupBehaviour() {
@@ -342,20 +345,40 @@
     }
 
     private boolean applyGroup(PiActionGroup group, PiActionGroupHandle handle) {
-        final P4RuntimeClient.WriteOperationType opType =
+        final int currentMemberSize = group.members().size();
+        if (groupMirror.get(handle) != null) {
+            String maxMemSize = "";
+            if (groupMirror.annotations(handle) != null &&
+                    groupMirror.annotations(handle).value(MAX_MEM_SIZE) != null) {
+                maxMemSize = groupMirror.annotations(handle).value(MAX_MEM_SIZE);
+            }
+            if (maxMemSize == "" || currentMemberSize > Integer.parseInt(maxMemSize)) {
+                deleteGroup(group, handle);
+            }
+        }
+
+        P4RuntimeClient.WriteOperationType opType =
                 groupMirror.get(handle) == null ? INSERT : MODIFY;
+        int currentMaxMemberSize = opType == INSERT ? (currentMemberSize + GROUP_MEMBERS_BUFFER_SIZE) : 0;
+
         final boolean success = getFutureWithDeadline(
-                client.writeActionGroup(group, opType, pipeconf),
+                client.writeActionGroup(group, opType, pipeconf, currentMaxMemberSize),
                 "performing action profile group " + opType, false);
         if (success) {
             groupMirror.put(handle, group);
+            if (opType == INSERT) {
+                groupMirror.putAnnotations(handle, DefaultAnnotations
+                        .builder()
+                        .set(MAX_MEM_SIZE, Integer.toString(currentMaxMemberSize))
+                        .build());
+            }
         }
         return success;
     }
 
     private boolean deleteGroup(PiActionGroup group, PiActionGroupHandle handle) {
         final boolean success = getFutureWithDeadline(
-                client.writeActionGroup(group, DELETE, pipeconf),
+                client.writeActionGroup(group, DELETE, pipeconf, 0),
                 "performing action profile group " + DELETE, false);
         if (success) {
             groupMirror.remove(handle);
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeTableStatisticsDiscovery.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeTableStatisticsDiscovery.java
new file mode 100644
index 0000000..f130732
--- /dev/null
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeTableStatisticsDiscovery.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.drivers.p4runtime;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.TableStatisticsDiscovery;
+import org.onosproject.net.flow.FlowRuleService;
+import org.onosproject.net.flow.FlowEntry;
+import org.onosproject.net.flow.TableId;
+import org.onosproject.net.flow.IndexTableId;
+import org.onosproject.net.flow.TableStatisticsEntry;
+import org.onosproject.net.flow.DefaultTableStatisticsEntry;
+import org.onosproject.net.pi.model.PiPipelineModel;
+import org.onosproject.net.pi.model.PiPipelineInterpreter;
+import org.onosproject.net.pi.model.PiTableId;
+import org.onosproject.net.pi.model.PiTableModel;
+
+import java.util.List;
+import java.util.Collections;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+/**
+ * Implementation of behaviour TableStatisticsDiscovery for P4Runtime.
+ */
+public class P4RuntimeTableStatisticsDiscovery extends AbstractP4RuntimeHandlerBehaviour
+        implements TableStatisticsDiscovery {
+
+    @Override
+    public List<TableStatisticsEntry> getTableStatistics() {
+        if (!setupBehaviour()) {
+            return Collections.emptyList();
+        }
+        FlowRuleService flowService = handler().get(FlowRuleService.class);
+        PiPipelineInterpreter interpreter = getInterpreter();
+        PiPipelineModel model = pipeconf.pipelineModel();
+        List<TableStatisticsEntry> tableStatsList;
+
+        List<FlowEntry> rules = newArrayList(flowService.getFlowEntries(deviceId));
+        Map<PiTableId, Integer> piTableFlowCount = piFlowRuleCounting(model, interpreter, rules);
+        Map<PiTableId, Long> piTableMatchCount = piMatchedCounting(model, interpreter, rules);
+        tableStatsList = generatePiFlowTableStatistics(piTableFlowCount, piTableMatchCount, model, deviceId);
+
+        return tableStatsList;
+    }
+
+    /**
+     * Returns the number of added flows in each table.
+     *
+     * @param model pipeline model
+     * @param interpreter pipeline interpreter
+     * @param rules flow rules in this device
+     * @return hashmap containing matched packet counting for each table
+     */
+    private Map<PiTableId, Integer> piFlowRuleCounting(PiPipelineModel model, PiPipelineInterpreter interpreter,
+                                                       List<FlowEntry> rules) {
+        Map<PiTableId, Integer> piTableFlowCount = new HashMap<>();
+        for (PiTableModel tableModel : model.tables()) {
+            piTableFlowCount.put(tableModel.id(), 0);
+        }
+        for (FlowEntry f : rules) {
+            if (f.state() == FlowEntry.FlowEntryState.ADDED) {
+                PiTableId piTableId = getPiTableId(f, interpreter);
+                if (piTableId != null) {
+                    piTableFlowCount.put(piTableId, piTableFlowCount.get(piTableId) + 1);
+                }
+            }
+        }
+        return piTableFlowCount;
+    }
+
+    /**
+     * Returns the number of matched packets for each table.
+     *
+     * @param model pipeline model
+     * @param interpreter pipeline interpreter
+     * @param rules flow rules in this device
+     * @return hashmap containing flow rule counting for each table
+     */
+    private Map<PiTableId, Long> piMatchedCounting(PiPipelineModel model, PiPipelineInterpreter interpreter,
+                                                   List<FlowEntry> rules) {
+        Map<PiTableId, Long> piTableMatchCount = new HashMap<>();
+        for (PiTableModel tableModel : model.tables()) {
+            piTableMatchCount.put(tableModel.id(), (long) 0);
+        }
+        for (FlowEntry f : rules) {
+            if (f.state() == FlowEntry.FlowEntryState.ADDED) {
+                PiTableId piTableId = getPiTableId(f, interpreter);
+                if (piTableId != null) {
+                    piTableMatchCount.put(piTableId, piTableMatchCount.get(piTableId) + f.packets());
+                }
+            }
+        }
+        return piTableMatchCount;
+    }
+
+    /**
+     * Returns the PiTableId of the pipeline independent table that contains the flow rule. If null is returned, it
+     * means that the given flow rule's table ID is index table ID without a mapping with a pipeline independent table
+     * ID.
+     *
+     * @param flowEntry flow rule
+     * @param interpreter pipeline interpreter
+     * @return PiTableId of the table containing input FlowEntry or null
+     */
+    private PiTableId getPiTableId(FlowEntry flowEntry, PiPipelineInterpreter interpreter) {
+        return flowEntry.table().type() == TableId.Type.PIPELINE_INDEPENDENT ?  (PiTableId) flowEntry.table() :
+                interpreter.mapFlowRuleTableId(((IndexTableId) flowEntry.table()).id()).orElse(null);
+    }
+
+    /**
+     * Returns the list of table statistics for P4 switch.
+     *
+     * @param piTableFlowCount hashmap containing the number of flow rules for each table
+     * @param piTableMatchCount hashmap containing the number of matched packets for each table
+     * @param model pipeline model
+     * @param deviceId device ID
+     * @return list of table statistics for P4 switch
+     */
+    private List<TableStatisticsEntry> generatePiFlowTableStatistics(Map<PiTableId, Integer> piTableFlowCount,
+                                                                       Map<PiTableId, Long> piTableMatchCount,
+                                                                       PiPipelineModel model, DeviceId deviceId) {
+        List<TableStatisticsEntry> tableStatsList;
+        Iterator it = piTableFlowCount.entrySet().iterator();
+        tableStatsList = new ArrayList<>();
+        while (it.hasNext()) {
+            Map.Entry pair = (Map.Entry) it.next();
+            TableStatisticsEntry tableStat = DefaultTableStatisticsEntry.builder()
+                    .withDeviceId(deviceId)
+                    .withTableId((PiTableId) pair.getKey())
+                    .withActiveFlowEntries(piTableFlowCount.get(pair.getKey()))
+                    .withPacketsMatchedCount(piTableMatchCount.get(pair.getKey()))
+                    .withMaxSize(model.table((PiTableId) pair.getKey()).get().maxSize()).build();
+            tableStatsList.add(tableStat);
+            it.remove();
+        }
+        return tableStatsList;
+    }
+}
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java
index caa72fe..b98e7ec 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java
@@ -26,6 +26,7 @@
 
 import org.onlab.util.KryoNamespace;
 import org.onlab.util.SharedExecutors;
+import org.onosproject.net.Annotations;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.pi.runtime.PiEntity;
 import org.onosproject.net.pi.runtime.PiHandle;
@@ -70,6 +71,8 @@
 
     private EventuallyConsistentMap<H, TimedEntry<E>> mirrorMap;
 
+    private EventuallyConsistentMap<H, Annotations> annotationsMap;
+
     private final PiPipeconfWatchdogListener pipeconfListener =
             new InternalPipeconfWatchdogListener();
 
@@ -81,6 +84,14 @@
                 .withSerializer(storeSerializer())
                 .withTimestampProvider((k, v) -> new WallClockTimestamp())
                 .build();
+
+        annotationsMap = storageService
+                .<H, Annotations>eventuallyConsistentMapBuilder()
+                .withName(mapName() + "-annotations")
+                .withSerializer(storeSerializer())
+                .withTimestampProvider((k, v) -> new WallClockTimestamp())
+                .build();
+
         pipeconfWatchdogService.addListener(pipeconfListener);
         log.info("Started");
     }
@@ -133,6 +144,20 @@
     public void remove(H handle) {
         checkNotNull(handle);
         mirrorMap.remove(handle);
+        annotationsMap.remove(handle);
+    }
+
+    @Override
+    public void putAnnotations(H handle, Annotations annotations) {
+        checkNotNull(handle);
+        checkNotNull(annotations);
+        annotationsMap.put(handle, annotations);
+    }
+
+    @Override
+    public Annotations annotations(H handle) {
+        checkNotNull(handle);
+        return annotationsMap.get(handle);
     }
 
     @Override
@@ -191,7 +216,7 @@
     private void removeAll(DeviceId deviceId) {
         checkNotNull(deviceId);
         Collection<H> handles = getHandlesForDevice(deviceId);
-        handles.forEach(mirrorMap::remove);
+        handles.forEach(this::remove);
     }
 
     public class InternalPipeconfWatchdogListener implements PiPipeconfWatchdogListener {
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeMirror.java
index d1c9cdd..51b31aa 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeMirror.java
@@ -17,6 +17,7 @@
 package org.onosproject.drivers.p4runtime.mirror;
 
 import com.google.common.annotations.Beta;
+import org.onosproject.net.Annotations;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.pi.runtime.PiEntity;
 import org.onosproject.net.pi.runtime.PiHandle;
@@ -74,6 +75,23 @@
     void remove(H handle);
 
     /**
+     * Stores the given annotations associating it to the given handle.
+     *
+     * @param handle handle
+     * @param annotations  entry
+     */
+    void putAnnotations(H handle, Annotations annotations);
+
+    /**
+     * Returns annotations associated to the given handle, if present, otherwise
+     * null.
+     *
+     * @param handle handle
+     * @return PI table annotations
+     */
+    Annotations annotations(H handle);
+
+    /**
      * Synchronizes the state of the given device ID with the given handle map.
      *
      * @param deviceId  device ID
diff --git a/drivers/p4runtime/src/main/resources/p4runtime-drivers.xml b/drivers/p4runtime/src/main/resources/p4runtime-drivers.xml
index 7464e14..78188a7 100644
--- a/drivers/p4runtime/src/main/resources/p4runtime-drivers.xml
+++ b/drivers/p4runtime/src/main/resources/p4runtime-drivers.xml
@@ -16,6 +16,8 @@
   -->
 <drivers>
     <driver name="p4runtime" manufacturer="p4.org" hwVersion="master" swVersion="master">
+        <behaviour api="org.onosproject.net.behaviour.TableStatisticsDiscovery"
+                   impl="org.onosproject.drivers.p4runtime.P4RuntimeTableStatisticsDiscovery"/>
         <behaviour api="org.onosproject.net.device.DeviceHandshaker"
                    impl="org.onosproject.drivers.p4runtime.P4RuntimeHandshaker"/>
         <behaviour api="org.onosproject.net.packet.PacketProgrammable"
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDevicesDiscovery.java b/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDevicesDiscovery.java
index ca4e809..b4440e8 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDevicesDiscovery.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDevicesDiscovery.java
@@ -352,7 +352,7 @@
         RestServerSBDevice dev = new DefaultRestServerSBDevice(
             device.ip(), device.port(), device.username(),
             device.password(), device.protocol(), device.url(),
-            device.isActive(), device.testUrl().toString(),
+            device.isActive(), device.testUrl().orElse(""),
             vendor, hw, sw, AuthenticationScheme.BASIC, "",
             cpuSet, nicSet
         );
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultRestServerSBDevice.java b/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultRestServerSBDevice.java
index cc2e541..b43c2ec 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultRestServerSBDevice.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/impl/devices/DefaultRestServerSBDevice.java
@@ -126,11 +126,11 @@
         return MoreObjects.toStringHelper(this)
                 .omitNullValues()
                 .add("url", url())
-                .add("testUrl", testUrl())
                 .add("protocol", protocol())
                 .add("username", username())
-                .add("port", port())
                 .add("ip", ip())
+                .add("port", port())
+                .add("testUrl", testUrl().orElse(null))
                 .add("manufacturer", manufacturer().orElse(null))
                 .add("hwVersion", hwVersion().orElse(null))
                 .add("swVersion", swVersion().orElse(null))
diff --git a/models/tapi/src/main/java/org/onosproject/models/tapi/TapiModelRegistrator.java b/models/tapi/src/main/java/org/onosproject/models/tapi/TapiModelRegistrator.java
index a38e6de..15fb319 100644
--- a/models/tapi/src/main/java/org/onosproject/models/tapi/TapiModelRegistrator.java
+++ b/models/tapi/src/main/java/org/onosproject/models/tapi/TapiModelRegistrator.java
@@ -22,10 +22,11 @@
 import com.google.common.collect.ImmutableMap;
 import org.osgi.service.component.annotations.Component;
 import org.onosproject.yang.AbstractYangModelRegistrator;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.TapiCommon;
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.TapiConnectivity;
-import org.onosproject.yang.gen.v1.tapipathcomputation.rev20180307.TapiPathComputation;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.TapiTopology;
+import org.onosproject.yang.gen.v1.tapicommon.rev20181016.TapiCommon;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.TapiConnectivity;
+import org.onosproject.yang.gen.v1.tapipathcomputation.rev20181016.TapiPathComputation;
+import org.onosproject.yang.gen.v1.tapiphotonicmedia.rev20181016.TapiPhotonicMedia;
+import org.onosproject.yang.gen.v1.tapitopology.rev20181016.TapiTopology;
 import org.onosproject.yang.model.DefaultYangModuleId;
 import org.onosproject.yang.model.YangModuleId;
 import org.onosproject.yang.runtime.AppModuleInfo;
@@ -48,16 +49,19 @@
     private static Map<YangModuleId, AppModuleInfo> getAppInfo() {
         Map<YangModuleId, AppModuleInfo> appInfo = new HashMap<>();
 
-        appInfo.put(new DefaultYangModuleId("tapi-connectivity", "2018-03-07"),
+        appInfo.put(new DefaultYangModuleId("tapi-connectivity", "2018-10-16"),
                     new DefaultAppModuleInfo(TapiConnectivity.class, null));
 
-        appInfo.put(new DefaultYangModuleId("tapi-common", "2018-03-07"),
+        appInfo.put(new DefaultYangModuleId("tapi-common", "2018-10-16"),
                     new DefaultAppModuleInfo(TapiCommon.class, null));
 
-        appInfo.put(new DefaultYangModuleId("tapi-topology", "2018-03-07"),
+        appInfo.put(new DefaultYangModuleId("tapi-topology", "2018-10-16"),
                     new DefaultAppModuleInfo(TapiTopology.class, null));
 
-        appInfo.put(new DefaultYangModuleId("tapi-path-computation", "2018-03-07"),
+        appInfo.put(new DefaultYangModuleId("tapi-photonic-media", "2018-10-16"),
+                    new DefaultAppModuleInfo(TapiPhotonicMedia.class, null));
+
+        appInfo.put(new DefaultYangModuleId("tapi-path-computation", "2018-10-16"),
                     new DefaultAppModuleInfo(TapiPathComputation.class, null));
 
         return ImmutableMap.copyOf(appInfo);
diff --git a/models/tapi/src/main/yang/tapi-common@2018-03-07.yang b/models/tapi/src/main/yang/tapi-common@2018-10-16.yang
similarity index 83%
rename from models/tapi/src/main/yang/tapi-common@2018-03-07.yang
rename to models/tapi/src/main/yang/tapi-common@2018-10-16.yang
index 9569c14..0d68ca6 100644
--- a/models/tapi/src/main/yang/tapi-common@2018-03-07.yang
+++ b/models/tapi/src/main/yang/tapi-common@2018-10-16.yang
@@ -2,36 +2,53 @@
     namespace "urn:onf:otcc:yang:tapi-common";

     prefix tapi-common;

     organization "ONF OTCC (Open Transport Configuration & Control) Project";

-    contact "
-        Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-        Project List: <mailto:transport-api@opennetworking.org>
-        Editor: Karthik Sethuraman
-                <mailto:karthik.sethuraman@necam.com>";

+    contact "

+         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>

+         Project List: <mailto:transport-api@opennetworking.org>

+         Editor: Karthik Sethuraman

+                 <mailto:karthik.sethuraman@necam.com>";

     description "

         This module contains TAPI Common Model definitions.

         Source: TapiCommon.uml

         Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

         License: This module is distributed under the Apache License 2.0

         ";

+    revision 2018-10-16 {

+        description "ONF Transport API version 2.1.0.

+          - The TAPI YANG models included in this TAPI release (v2.1.0) are a *normative* part of the TAPI SDK.

+          - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]

+            <https://github.com/OpenNetworkingFoundation/EagleUmlYang>

+            and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]

+            <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>

+          - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.

+            As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.

+          - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.

+            The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.

+            YANG models included in this release are not backward compatible with previous TAPI releases.

+          - Changes included in this TAPI release (v2.1.0) are listed in

+            <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";

+    }

     revision 2018-03-07 {

-        description "ONF Transport API version 2.0.2

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.2
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

     }

     revision 2018-02-16 {

-        description "ONF Transport API version 2.0.1

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.1
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

     }

     revision 2018-01-02 {

-        description "ONF Transport API version 2.0.0

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.0
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

     }

 

@@ -39,7 +56,7 @@
     * definitions of refrences

     *************************/

     grouping service-interface-point-ref {

-        leaf service-interface-point-id {

+        leaf service-interface-point-uuid {

             type leafref {

                 path '/tapi-common:context/tapi-common:service-interface-point/tapi-common:uuid';

             }

@@ -124,7 +141,6 @@
         grouping tapi-context {

             list service-interface-point {

                 key 'uuid';

-                min-elements 2;

                 uses service-interface-point;

                 description "none";

             }

@@ -140,12 +156,17 @@
             description "none";

         }

         grouping service-interface-point {

-            leaf-list layer-protocol-name {

+            leaf layer-protocol-name {

                 type layer-protocol-name;

                 config false;

-                min-elements 1;

                 description "Usage of layerProtocolName [>1]  in the ServiceInterfacePoint should be considered experimental";

             }

+            leaf-list supported-layer-protocol-qualifier {

+                type layer-protocol-qualifier;

+                config false;

+                min-elements 1;

+                description "none";

+            }

             uses resource-spec;

             uses admin-state-pac;

             uses capacity-pac;

@@ -192,6 +213,9 @@
     /***********************

     * package type-definitions

     **********************/ 

+        identity LAYER_PROTOCOL_QUALIFIER {

+            description "none";

+        }

         typedef administrative-state {

             type enumeration {

                 enum LOCKED {

@@ -255,27 +279,18 @@
         }

         typedef layer-protocol-name {

             type enumeration {

-                enum OTSiA {

-                    description "Models the OTSiA layer as per ITU-T G.872 (2017) version 4";

-                }

-                enum OCH {

-                    description "Models the legacy OCH layer as per ITU-T G.872";

-                }

-                enum OTU {

-                    description "Models the OTU layer as per ITU-T G.872";

-                }

                 enum ODU {

                     description "Models the ODU layer as per ITU-T G.872";

                 }

                 enum ETH {

                     description "Models the ETH layer as per ITU-T G.8010";

                 }

-                enum ETY {

-                    description "Models the ETY layer as per ITU-T G.8010";

-                }

                 enum DSR {

                     description "Models a Digital Signal of an unspecified rate. This value can be used when the intent is to respresent an generic digital layer signal without making any statement on its format or overhead (processing) capabilities.";

                 }

+                enum PHOTONIC_MEDIA {

+                    description "Models the OCH, OTSi, OTSiA, OTSiG, OMS, OTS and Media channels as per ITU-T G.872 (2017) version 4";

+                }

             }

             description "Provides a controlled list of layer protocol names and indicates the naming authority.

                 Note that it is expected that attributes will be added to this structure to convey the naming authority name, the name of the layer protocol using a human readable string and any particular standard reference.

@@ -509,6 +524,12 @@
                 enum KBPS {

                     description "Indicates that the integer CapacityValue is in Kilobit-per-second";

                 }

+                enum GHz {

+                    description "none";

+                }

+                enum MHz {

+                    description "none";

+                }

             }

             description "none";

         }

@@ -540,6 +561,76 @@
             }

             description "none";

         }

+        grouping time-period {

+            leaf value {

+                type uint64;

+                description "none";

+            }

+            leaf unit {

+                type time-unit;

+                description "none";

+            }

+            description "none";

+        }

+        typedef time-unit {

+            type enumeration {

+                enum YEARS {

+                    description "none";

+                }

+                enum MONTHS {

+                    description "none";

+                }

+                enum DAYS {

+                    description "none";

+                }

+                enum HOURS {

+                    description "none";

+                }

+                enum MINUTES {

+                    description "none";

+                }

+                enum SECONDS {

+                    description "none";

+                }

+                enum MILLISECONDS {

+                    description "none";

+                }

+                enum MICROSECONDS {

+                    description "none";

+                }

+                enum NANOSECONDS {

+                    description "none";

+                }

+                enum PICOSECONDS {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        grouping time-interval {

+            list period {

+                min-elements 1;

+                max-elements 5;

+                uses time-period;

+                description "none";

+            }

+            description "none";

+        }

+        typedef layer-protocol-qualifier {

+            type identityref {

+                base LAYER_PROTOCOL_QUALIFIER;

+            }

+            description "This enumeration is used to qualify the sub-layers (if applicable) for a specific LayerProtocol.

+                This extensible enumeration is intentionally empty in the common module and will be augmented with layer-specific values in the respective technology-specific modules.

+                Examples:

+                - LayerProtocolName := OPTICAL_DATA_UNIT

+                LayerProtocolQualifier := 'ODU_FLEX', 'ODU_0', 'ODU_1', 'ODU_2', 'ODU_2E', 'ODU_3', 'ODU_4'', 'ODU_CBR'', 'ODU_GFP'', 'ODU_GFP_HAO', etc

+                - LayerProtocolName := DIGITAL_SIGNAL_RATE

+                LayerProtocolQualifier := 'GBE', '10_GBE_WAN', '10_GBE_LAN', '100_GBE', 'FC_100', 'FC_200', 'FC_400', 'FC_800', 'FC_1200', 'FC_1600', 'FC_3200', 'STM_1', 'STM_4', 'STM_16', 'STM_64', 'STM_256', 'OC_3', 'OC_12', 'OC_48', 'OC_192', 'OC_768', 'OTU_1', 'OTU_2', 'OTU_2E', 'OTU_3', 'OTU_4', 'GPON', 'XGPON', 'IB_SDR', 'IB_DDR', 'IB_QDR', 'SBCON_ESCON', 'DVB_ASI', 'SDI', 'SDI_1G5', 'SDI_3G', etc

+                - LayerProtocolName := PHOTONIC_MEDIA

+                LayerProtocolQualifier := OCH, OTSi, OTSiA, NMC, NMCA, SMC, SMCA, OMS, OTS

+                ";

+        }

 

     /***********************

     * package interfaces

diff --git a/models/tapi/src/main/yang/tapi-connectivity@2018-03-07.yang b/models/tapi/src/main/yang/tapi-connectivity@2018-10-16.yang
similarity index 79%
rename from models/tapi/src/main/yang/tapi-connectivity@2018-03-07.yang
rename to models/tapi/src/main/yang/tapi-connectivity@2018-10-16.yang
index 75c0231..f4c0606 100644
--- a/models/tapi/src/main/yang/tapi-connectivity@2018-03-07.yang
+++ b/models/tapi/src/main/yang/tapi-connectivity@2018-10-16.yang
@@ -11,43 +11,66 @@
         prefix tapi-path-computation;

     }

     organization "ONF OTCC (Open Transport Configuration & Control) Project";

-    contact "
-        Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-        Project List: <mailto:transport-api@opennetworking.org>
-        Editor: Karthik Sethuraman
-                <mailto:karthik.sethuraman@necam.com>";

+    contact "

+         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>

+         Project List: <mailto:transport-api@opennetworking.org>

+         Editor: Karthik Sethuraman

+                 <mailto:karthik.sethuraman@necam.com>";

     description "

         This module contains TAPI Connectivity Model definitions.

         Source: TapiConnectivity.uml

         Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

         License: This module is distributed under the Apache License 2.0";

+    revision 2018-10-16 {

+        description "ONF Transport API version 2.1.0.

+          - The TAPI YANG models included in this TAPI release (v2.1.0) are a *normative* part of the TAPI SDK.

+          - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]

+            <https://github.com/OpenNetworkingFoundation/EagleUmlYang>

+            and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]

+            <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>

+          - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.

+            As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.

+          - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.

+            The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.

+            YANG models included in this release are not backward compatible with previous TAPI releases.

+          - Changes included in this TAPI release (v2.1.0) are listed in

+            <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";

+    }

     revision 2018-03-07 {

-        description "ONF Transport API version 2.0.2

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.2
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

     }

     revision 2018-02-16 {

-        description "ONF Transport API version 2.0.1

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.1
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

     }

     revision 2018-01-02 {

-        description "ONF Transport API version 2.0.0

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.0
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

     }

     augment "/tapi-common:context" {

-        uses connectivity-context;

+        container connectivity-context {

+            uses connectivity-context;

+            description "Augments the base TAPI Context with ConnectivityService information";

+        }

         description "Augments the base TAPI Context with ConnectivityService information";

     }

-    augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {

-        uses cep-list;

+    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {

+    	container cep-list {

+            uses cep-list;

+            description "none";

+        }

         description "none";

     }

 

@@ -55,9 +78,9 @@
     * definitions of references

     *************************/

     grouping connectivity-service-ref {

-        leaf connectivity-service-id {

+        leaf connectivity-service-uuid {

             type leafref {

-                path '/tapi-common:context/tapi-connectivity:connectivity-service/tapi-connectivity:uuid';

+                path '/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connectivity-service/tapi-connectivity:uuid';

             }

             description "none";

         }

@@ -66,19 +89,19 @@
 

     grouping connectivity-service-end-point-ref {

     	uses connectivity-service-ref;

-    	leaf connectivity-service-end-point-id {

+    	leaf connectivity-service-end-point-local-id {

 	    	type leafref {

-	            path '/tapi-common:context/tapi-connectivity:connectivity-service/tapi-connectivity:end-point/tapi-connectivity:local-id';

+	            path '/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connectivity-service/tapi-connectivity:end-point/tapi-connectivity:local-id';

 	        }

 	    	description "none";

     	}

     	description "none";

     }

     grouping connection-end-point-ref {

-        uses tapi-topology:owned-node-edge-point-ref;

-        leaf connection-end-point-id {

+        uses tapi-topology:node-edge-point-ref;

+        leaf connection-end-point-uuid {

             type leafref {

-                path '/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point/tapi-connectivity:uuid';

+                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point/tapi-connectivity:uuid';

             }

             description "none";

         }

@@ -86,9 +109,9 @@
     }

 

     grouping connection-ref {

-        leaf connection-id {

+        leaf connection-uuid {

             type leafref {

-                path '/tapi-common:context/tapi-connectivity:connection/tapi-connectivity:uuid';

+                path '/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connection/tapi-connectivity:uuid';

             }

             description "none";

         }

@@ -97,9 +120,9 @@
 

     grouping switch-control-ref {

         uses connection-ref;

-        leaf switch-control-id {

+        leaf switch-control-uuid {

             type leafref {

-                path '/tapi-common:context/tapi-connectivity:connection/tapi-connectivity:switch-control/tapi-connectivity:uuid';

+                path '/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connection/tapi-connectivity:switch-control/tapi-connectivity:uuid';

             }

             description "none";

         }

@@ -108,9 +131,9 @@
     

     grouping route-ref {

     	uses connection-ref;

-        leaf route-id {

+        leaf route-local-id {

             type leafref {

-                path '/tapi-common:context/tapi-connectivity:connection/tapi-connectivity:route/tapi-connectivity:local-id';

+                path '/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connection/tapi-connectivity:route/tapi-connectivity:local-id';

             }

             description "none";

         }

@@ -123,19 +146,26 @@
         grouping connection {

             list connection-end-point {

                 uses connection-end-point-ref;

-                key 'topology-id node-id owned-node-edge-point-id connection-end-point-id';

+                key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid';

                 config false;

                 min-elements 2;

                 description "none";

             }

             list lower-connection {

                 uses connection-ref;

-                key 'connection-id';

+                key 'connection-uuid';

+                config false;

                 description "An Connection object supports a recursive aggregation relationship such that the internal construction of an Connection can be exposed as multiple lower level Connection objects (partitioning).

                     Aggregation is used as for the Node/Topology  to allow changes in hierarchy. 

                     Connection aggregation reflects Node/Topology aggregation. 

                     The FC represents a Cross-Connection in an NE. The Cross-Connection in an NE is not necessarily the lowest level of FC partitioning.";

             }

+            list supported-client-link {

+            	uses tapi-topology:link-ref;

+                key 'topology-uuid link-uuid';

+                config false;

+                description "none";

+            }

             list route {

                 key 'local-id';

                 config false;

@@ -169,20 +199,25 @@
                 config false;

                 description "none";

             }

-            container connectivity-service-end-point {

-                uses connectivity-service-end-point-ref;

+            leaf layer-protocol-qualifier {

+                type tapi-common:layer-protocol-qualifier;

+                config false;

                 description "none";

             }

-            list parent-node-edge-point {

-                uses tapi-topology:owned-node-edge-point-ref;

-                key 'topology-id node-id owned-node-edge-point-id';

+            container parent-node-edge-point {

+            	uses tapi-topology:node-edge-point-ref;

                 config false;

-                min-elements 1;

                 description "none";

             }

             list client-node-edge-point {

-                uses tapi-topology:owned-node-edge-point-ref;

-                key 'topology-id node-id owned-node-edge-point-id';

+                uses tapi-topology:node-edge-point-ref;

+                key 'topology-uuid node-uuid node-edge-point-uuid';

+                config false;

+                description "none";

+            }

+            list aggregated-connection-end-point {

+                uses connection-end-point-ref;

+                key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid';

                 config false;

                 description "none";

             }

@@ -203,6 +238,10 @@
                 The structure of LTP supports all transport protocols including circuit and packet forms.";

         }

         grouping connectivity-constraint {

+            leaf service-layer {

+                type tapi-common:layer-protocol-name;

+                description "none";

+            }

             leaf service-type {

                 type service-type;

                 description "none";

@@ -211,39 +250,27 @@
                 type string;

                 description "An abstract value the meaning of which is mutually agreed – typically represents metrics such as - Class of service, priority, resiliency, availability";

             }

-            leaf is-exclusive {

-                type boolean;

-                default "true";

-                description "To distinguish if the resources are exclusive to the service  - for example between EPL(isExclusive=true) and EVPL (isExclusive=false), or between EPLAN (isExclusive=true) and EVPLAN (isExclusive=false)";

-            }

             container requested-capacity {

                 uses tapi-common:capacity;

                 description "none";

             }

+            leaf connectivity-direction {

+                type tapi-common:forwarding-direction;

+                description "none";

+            }

             container schedule {

                 uses tapi-common:time-range;

                 description "none";

             }

-            list cost-characteristic {

-                key 'cost-name';

-                uses tapi-topology:cost-characteristic;

-                description "The list of costs where each cost relates to some aspect of the TopologicalEntity.";

-            }

-            list latency-characteristic {

-                key 'traffic-property-name';

-                uses tapi-topology:latency-characteristic;

-                description "The effect on the latency of a queuing process. This only has significant effect for packet based systems and has a complex characteristic.";

-            }

             container coroute-inclusion {

-                uses connectivity-service-ref;

+            	uses connectivity-service-ref;

                 description "none";

             }

             list diversity-exclusion {

-                uses connectivity-service-ref;

-                key 'connectivity-service-id';

+            	uses connectivity-service-ref;

+                key 'connectivity-service-uuid';

                 description "none";

             }

-            uses route-compute-policy;

             description "none";

         }

         grouping connectivity-service {

@@ -255,23 +282,16 @@
             }

             list connection {

                 uses connection-ref;

-                key 'connection-id';

+                key 'connection-uuid';

                 config false;

                 description "none";

             }

-            leaf direction {

-                type tapi-common:forwarding-direction;

-                description "none";

-            }

-            leaf layer-protocol-name {

-                type tapi-common:layer-protocol-name;

-                description "none";

-            }

             uses tapi-common:service-spec;

             uses connectivity-constraint;

-            uses topology-constraint;

-            uses tapi-common:admin-state-pac;

+            uses tapi-path-computation:routing-constraint;

+            uses tapi-path-computation:topology-constraint;

             uses resilience-constraint;

+            uses tapi-common:admin-state-pac;

             description "The ForwardingConstruct (FC) object class models enabled potential for forwarding between two or more LTPs and like the LTP supports any transport protocol including all circuit and packet forms.

                 At the lowest level of recursion, a FC represents a cross-connection within an NE.";

         }

@@ -280,10 +300,20 @@
                 type tapi-common:layer-protocol-name;

                 description "none";

             }

+            leaf layer-protocol-qualifier {

+                type tapi-common:layer-protocol-qualifier;

+                description "none";

+            }

             container service-interface-point {

                 uses tapi-common:service-interface-point-ref;

                 description "none";

             }

+            list connection-end-point {

+            	uses connection-end-point-ref;

+                key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid';

+                config false;

+                description "none";

+            }

             container capacity {

                 uses tapi-common:capacity;

                 description "none";

@@ -313,7 +343,7 @@
         grouping route {

             list connection-end-point {

                 uses connection-end-point-ref;

-                key 'topology-id node-id owned-node-edge-point-id connection-end-point-id';

+                key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid';

                 config false;

                 min-elements 2;

                 description "none";

@@ -340,13 +370,13 @@
         grouping switch {

             list selected-connection-end-point {

                 uses connection-end-point-ref;

-                key 'topology-id node-id owned-node-edge-point-id connection-end-point-id';

+                key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid';

                 min-elements 1;

                 description "none";

             }

             list selected-route {

                 uses route-ref;

-                key 'connection-id route-id';

+                key 'connection-uuid route-local-id';

                 min-elements 1;

                 description "none";

             }

@@ -380,7 +410,7 @@
         grouping switch-control {

             list sub-switch-control {

                 uses switch-control-ref;

-                key 'connection-id switch-control-id';

+                key 'connection-uuid switch-control-uuid';

                 description "none";

             }

             list switch {

@@ -439,68 +469,12 @@
                 type uint64;

                 description "Used to limit the maximum swtich times. When work fault disappears , and traffic return to the original work path, switch counter reset.";

             }

-            leaf layer-protocol {

+            leaf-list preferred-restoration-layer {

                 type tapi-common:layer-protocol-name;

                 description "Indicate which layer this resilience parameters package configured for.";

             }

             description "A list of control parameters to apply to a switch.";

         }

-        grouping topology-constraint {

-            list include-topology {

-                uses tapi-topology:topology-ref;

-                key 'topology-id';

-                config false;

-                description "none";

-            }

-            list avoid-topology {

-                uses tapi-topology:topology-ref;

-                key 'topology-id';

-                config false;

-                description "none";

-            }

-            list include-path {

-                uses tapi-path-computation:path-ref;

-                key 'path-id';

-                config false;

-                description "none";

-            }

-            list exclude-path {

-                uses tapi-path-computation:path-ref;

-                key 'path-id';

-                config false;

-                description "none";

-            }

-            list include-link {

-                uses tapi-topology:link-ref;

-                key 'topology-id link-id';

-                config false;

-                description "This is a loose constraint - that is it is unordered and could be a partial list ";

-            }

-            list exclude-link {

-                uses tapi-topology:link-ref;

-                key 'topology-id link-id';

-                config false;

-                description "none";

-            }

-            list include-node {

-                uses tapi-topology:node-ref;

-                key 'topology-id node-id';

-                config false;

-                description "This is a loose constraint - that is it is unordered and could be a partial list";

-            }

-            list exclude-node {

-                uses tapi-topology:node-ref;

-                key 'topology-id node-id';

-                config false;

-                description "none";

-            }

-            leaf-list preferred-transport-layer {

-                type tapi-common:layer-protocol-name;

-                config false;

-                description "soft constraint requested by client to indicate the layer(s) of transport connection that it prefers to carry the service. This could be same as the service layer or one of the supported server layers";

-            }

-            description "none";

-        }

         grouping cep-list {

             list connection-end-point {

                 key 'uuid';

@@ -509,17 +483,6 @@
             }

             description "none";

         }

-        grouping route-compute-policy {

-            leaf route-objective-function {

-                type route-objective-function;

-                description "none";

-            }

-            leaf diversity-policy {

-                type diversity-policy;

-                description "none";

-            }

-            description "none";

-        }

 

     /***********************

     * package type-definitions

@@ -612,52 +575,6 @@
             }

             description "none";

         }

-        typedef route-objective-function {

-            type enumeration {

-                enum MIN_WORK_ROUTE_HOP {

-                    description "none";

-                }

-                enum MIN_WORK_ROUTE_COST {

-                    description "none";

-                }

-                enum MIN_WORK_ROUTE_LATENCY {

-                    description "none";

-                }

-                enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_HOP {

-                    description "none";

-                }

-                enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_COST {

-                    description "none";

-                }

-                enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_LATENCY {

-                    description "none";

-                }

-                enum LOAD_BALANCE_MAX_UNUSED_CAPACITY {

-                    description "none";

-                }

-            }

-            description "none";

-        }

-        typedef diversity-policy {

-            type enumeration {

-                enum SRLG {

-                    description "none";

-                }

-                enum SRNG {

-                    description "none";

-                }

-                enum SNG {

-                    description "none";

-                }

-                enum NODE {

-                    description "none";

-                }

-                enum LINK {

-                    description "none";

-                }

-            }

-            description "none";

-        }

         typedef protection-role {

             type enumeration {

                 enum WORK {

@@ -737,12 +654,16 @@
                     uses connectivity-service-end-point;

                     description "none";

                 }

-                container conn-constraint {

+                container connectivity-constraint {

                     uses connectivity-constraint;

                     description "none";

                 }

-                container topo-constraint {

-                    uses topology-constraint;

+                container routing-constraint {

+                    uses tapi-path-computation:routing-constraint;

+                    description "none";

+                }

+                container topology-constraint {

+                    uses tapi-path-computation:topology-constraint;

                     description "none";

                 }

                 list resilience-constraint {

@@ -772,12 +693,16 @@
                     uses connectivity-service-end-point;

                     description "none";

                 }

-                container conn-constraint {

+                container connectivity-constraint {

                     uses connectivity-constraint;

                     description "none";

                 }

-                container topo-constraint {

-                    uses topology-constraint;

+                container routing-constraint {

+                    uses tapi-path-computation:routing-constraint;

+                    description "none";

+                }

+                container topology-constraint {

+                    uses tapi-path-computation:topology-constraint;

                     description "none";

                 }

                 list resilience-constraint {

@@ -804,12 +729,6 @@
                     description "none";

                 }

             }

-            output {

-                container service {

-                    uses connectivity-service;

-                    description "none";

-                }

-            }

         }

 

 }

diff --git a/models/tapi/src/main/yang/tapi-dsr@2018-10-16.yang b/models/tapi/src/main/yang/tapi-dsr@2018-10-16.yang
new file mode 100644
index 0000000..362ab4e
--- /dev/null
+++ b/models/tapi/src/main/yang/tapi-dsr@2018-10-16.yang
@@ -0,0 +1,214 @@
+module tapi-dsr {

+    namespace "urn:onf:otcc:yang:tapi-dsr";

+    prefix tapi-dsr;

+    import tapi-common {

+        prefix tapi-common;

+    }

+    organization "ONF OTCC (Open Transport Configuration & Control) Project";

+    contact "

+         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>

+         Project List: <mailto:transport-api@opennetworking.org>

+         Editor: Karthik Sethuraman

+                 <mailto:karthik.sethuraman@necam.com>";

+    description "none";

+    revision 2018-10-16 {

+        description "ONF Transport API version 2.1.0.

+          - The TAPI YANG models included in this TAPI release (v2.1.0) are a *normative* part of the TAPI SDK.

+          - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]

+            <https://github.com/OpenNetworkingFoundation/EagleUmlYang>

+            and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]

+            <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>

+          - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.

+            As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.

+          - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.

+            The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.

+            YANG models included in this release are not backward compatible with previous TAPI releases.

+          - Changes included in this TAPI release (v2.1.0) are listed in

+            <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";

+    }

+    revision 2018-03-07 {

+        description "ONF Transport API version 2.0.2
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

+    }

+    revision 2018-02-16 {

+        description "ONF Transport API version 2.0.1
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

+    }

+    revision 2018-01-02 {

+        description "ONF Transport API version 2.0.0
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

+    }

+    /***********************

+    * package type-definitions

+    **********************/ 

+        identity DIGITAL_SIGNAL_TYPE {

+        	base tapi-common:LAYER_PROTOCOL_QUALIFIER;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_GigE {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_10_GigE_LAN {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_10_GigE_WAN {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_40_GigE {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_100_GigE {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_FC_100 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_FC_200 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_FC_400 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_FC_800 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_FC_1200 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_FC_1600 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_FC_3200 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_STM_1 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_STM_4 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_STM_16 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_STM_64 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_STM_256 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_OC_3 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_OC_12 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_OC_48 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_OC_192 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_OC_768 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_OTU_1 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_OTU_2 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_OTU_2E {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_OTU_3 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_OTU_4 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_GPON {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_XGPON {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_IB_SDR {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_IB_DDR {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_IB_QDR {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_SBCON_ESCON {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_DVB_ASI {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_SDI {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_SDI_1G5 {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        identity DIGITAL_SIGNAL_TYPE_SDI_3G {

+            base DIGITAL_SIGNAL_TYPE;

+            description "none";

+        }

+        typedef digital-signal-type {

+            type identityref {

+                base DIGITAL_SIGNAL_TYPE;

+            }

+            description "none";

+        }

+

+}

diff --git a/models/tapi/src/main/yang/tapi-eth@2018-03-07.yang b/models/tapi/src/main/yang/tapi-eth@2018-03-07.yang
deleted file mode 100644
index 0de1f8d..0000000
--- a/models/tapi/src/main/yang/tapi-eth@2018-03-07.yang
+++ /dev/null
@@ -1,802 +0,0 @@
-module tapi-eth {

-    namespace "urn:onf:otcc:yang:tapi-eth";

-    prefix tapi-eth;

-    import tapi-common {

-        prefix tapi-common;

-    }

-    import tapi-topology {

-        prefix tapi-topology;

-    }

-    import tapi-connectivity {

-        prefix tapi-connectivity;

-    }

-    organization "ONF OTCC (Open Transport Configuration & Control) Project";

-    contact "
-        Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-        Project List: <mailto:transport-api@opennetworking.org>
-        Editor: Karthik Sethuraman
-                <mailto:karthik.sethuraman@necam.com>";

-    description "

-        This module contains TAPI ETH Model definitions.

-        Source: TapiEth.uml

-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

-        License: This module is distributed under the Apache License 2.0";

-    revision 2018-03-07 {

-        description "ONF Transport API version 2.0.2

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

-    }

-    revision 2018-02-16 {

-        description "ONF Transport API version 2.0.1

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

-    }

-    revision 2018-01-02 {

-        description "ONF Transport API version 2.0.0

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

-    }

-    augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {

-        uses eth-node-edge-point-spec;

-        description "Augments the base LayerProtocol information in NodeEndPoint with ETH-specific information";

-    }

-    augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {

-        uses eth-connection-end-point-spec;

-        description "Augments the base LayerProtocol information in ConnectionEndPoint with ETH-specific information";

-    }

-    /***********************

-    * package object-classes

-    **********************/ 

-        grouping eth-ctp-pac {

-            leaf-list auxiliary-function-position-sequence {

-                type uint64;

-                description "This attribute indicates the positions (i.e., the relative order) of all the MEP, MIP, and TCS objects which are associated with the CTP.";

-            }

-            leaf vlan-config {

-                type uint64;

-                description "This attribute models the ETHx/ETH-m_A_So_MI_Vlan_Config information defined in G.8021.

-                    range of type : -1, 0, 1..4094";

-            }

-            leaf csf-rdi-fdi-enable {

-                type boolean;

-                description "This attribute models the MI_CSFrdifdiEnable information defined in G.8021.";

-            }

-            leaf csf-report {

-                type boolean;

-                description "This attribute models the MI_CSF_Reported information defined in G.8021.

-                    range of type : true, false";

-            }

-            leaf-list filter-config-snk {

-                type mac-address;

-                description "This attribute models the FilteConfig MI defined in 8.3/G.8021. It indicates the configured filter action for each of the 33 group MAC addresses for control frames. The 33 MAC addresses are:

-                    01-80-C2-00-00-10, 

-                    01-80-C2-00-00-00 to 01-80-C2-00-00-0F, and 

-                    01-80-C2-00-00-20 to 01-80-C2-00-00-2F.

-                    The filter action is Pass or Block. 

-                    If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action. 

-                    If none of the above addresses match, the ETH_CI_D is passed.";

-            }

-            leaf mac-length {

-                type uint64;

-                default "2000";

-                description "This attribute models the MAC_Lenght MI defined in 8.6/G.8021 for the MAC Length Check process. It indicates the allowed maximum frame length in bytes.

-                    range of type : 1518, 1522, 2000";

-            }

-            container filter-config {

-                uses control-frame-filter;

-                description "This attribute models the FilterConfig MI defined in section 8.3/G.8021. It indicates the configured filter action for each of the 33 group MAC addresses for control frames. The 33 MAC addresses are:

-                    - All bridges address: 01-80-C2-00-00-10,

-                    - Reserved addresses: 01-80-C2-00-00-00 to 01-80-C2-00-00-0F,

-                    - GARP Application addresses: 01-80-C2-00-00-20 to 01-80-C2-00-00-2F.

-                    The filter action is Pass or Block. 

-                    If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action. 

-                    If none of the above addresses match, the ETH_CI_D is passed.";

-            }

-            leaf is-ssf-reported {

-                type boolean;

-                description "This attribute provisions whether the SSF defect should be reported as fault cause or not.

-                    It models the ETH-LAG_FT_Sk_MI_SSF_Reported defined in G.8021.";

-            }

-            leaf pll-thr {

-                type uint64;

-                description "This attribute provisions the threshold for the number of active ports. If the number of active ports is more than zero but less than the provisioned threshold, a cPLL (Partial Link Loss) is raised. See section 9.7.1.2 of G.8021.

-                    range of type : 0..number of ports";

-            }

-            leaf actor-oper-key {

-                type uint64;

-                config false;

-                description "See 802.1AX:

-                    The current operational value of the Key for the Aggregator. The administrative Key value may differ from the operational Key value for the reasons discussed in 5.6.2.

-                    The meaning of particular Key values is of local significance.

-                    range of type : 16 bit";

-            }

-            leaf actor-system-id {

-                type mac-address;

-                description "See 802.1AX:

-                    A MAC address used as a unique identifier for the System that contains this Aggregator.";

-            }

-            leaf actor-system-priority {

-                type uint64;

-                description "See 802.1AX:

-                    Indicating the priority associated with the Actor’s System ID.

-                    range of type : 2-octet";

-            }

-            leaf collector-max-delay {

-                type uint64;

-                description "See 802.1AX:

-                    The value of this attribute defines the maximum delay, in tens of microseconds, that may be imposed by the Frame Collector between receiving a frame from an Aggregator Parser, and either delivering the frame to its MAC Client or discarding the frame (see IEEE 802.1AX clause 5.2.3.1.1).

-                    range of type : 16-bit";

-            }

-            leaf data-rate {

-                type uint64;

-                config false;

-                description "See 802.1AX:

-                    The current data rate, in bits per second, of the aggregate link. The value is calculated as N times the data rate of a single link in the aggregation, where N is the number of active links.";

-            }

-            leaf partner-oper-key {

-                type uint64;

-                config false;

-                description "See 802.1AX:

-                    The current operational value of the Key for the Aggregator’s current protocol Partner. If the aggregation is manually configured, this Key value will be a value assigned by the local System.

-                    range of type : 16-bit";

-            }

-            leaf partner-system-id {

-                type mac-address;

-                config false;

-                description "See 802.1AX:

-                    A MAC address consisting of the unique identifier for the current protocol Partner of this Aggregator. A value of zero indicates that there is no known Partner. If the aggregation is manually configured, this System ID value will be a value assigned by the local System.";

-            }

-            leaf partner-system-priority {

-                type uint64;

-                config false;

-                description "See 802.1AX:

-                    Indicates the priority associated with the Partner’s System ID. If the aggregation is manually configured, this System Priority value will be a value assigned by the local System.

-                    range of type : 2-octet";

-            }

-            leaf csf-config {

-                type csf-config;

-                description "This attribute models the combination of all CSF related MI signals (MI_CSF_Enable, MI_CSFrdifdi_Enable, MI_CSFdci_Enable) as defined in G.8021.

-                    range of type : true, false";

-            }

-            container traffic-shaping {

-                uses traffic-shaping-pac;

-                description "none";

-            }

-            container traffic-conditioning {

-                uses traffic-conditioning-pac;

-                description "none";

-            }

-            description "none";

-        }

-        grouping eth-connection-end-point-spec {

-            container eth-term {

-                uses eth-termination-pac;

-                description "none";

-            }

-            container eth-ctp {

-                uses eth-ctp-pac;

-                description "none";

-            }

-            description "none";

-        }

-        grouping eth-termination-pac {

-            container priority-regenerate {

-                uses priority-mapping;

-                description "This attribute models the ETHx/ETH-m _A_Sk_MI_P_Regenerate information defined in G.8021.";

-            }

-            leaf ether-type {

-                type vlan-type;

-                description "This attribute models the ETHx/ETH-m _A_Sk_MI_Etype information defined in G.8021.";

-            }

-            leaf-list filter-config-1 {

-                type mac-address;

-                description "This attribute models the ETHx/ETH-m_A_Sk_MI_Filter_Config information defined in G.8021.

-                    It indicates the configured filter action for each of the 33 group MAC addresses for control frames.

-                    The 33 MAC addresses are:

-                    01-80-C2-00-00-10, 

-                    01-80-C2-00-00-00 to 01-80-C2-00-00-0F, and 

-                    01-80-C2-00-00-20 to 01-80-C2-00-00-2F.

-                    The filter action is Pass or Block. 

-                    If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action. 

-                    If none of the above addresses match, the ETH_CI_D is passed.

-                    range of type : MacAddress: 

-                    01-80-C2-00-00-10, 

-                    01-80-C2-00-00-00 to 

-                    01-80-C2-00-00-0F, and 

-                    01-80-C2-00-00-20 to 

-                    01-80-C2-00-00-2F;

-                    ActionEnum:

-                    PASS, BLOCK";

-            }

-            leaf frametype-config {

-                type frame-type;

-                description "This attribute models the ETHx/ETH-m_A_Sk_MI_Frametype_Config information defined in G.8021.

-                    range of type : see Enumeration";

-            }

-            leaf port-vid {

-                type vid;

-                default "1";

-                description "This attribute models the ETHx/ETH-m _A_Sk_MI_PVID information defined in G.8021.";

-            }

-            leaf priority-code-point-config {

-                type pcp-coding;

-                description "This attribute models the ETHx/ETH-m _A_Sk_MI_PCP_Config information defined in G.8021.

-                    range of type : see Enumeration";

-            }

-            description "This object class models the Ethernet Flow Termination function located at a layer boundary.";

-        }

-        grouping ety-termination-pac {

-            leaf is-fts-enabled {

-                type boolean;

-                description "This attribute indicates whether Forced Transmitter Shutdown (FTS) is enabled or not. It models the ETYn_TT_So_MI_FTSEnable information.";

-            }

-            leaf is-tx-pause-enabled {

-                type boolean;

-                description "This attribute identifies whether the Transmit Pause process is enabled or not. It models the MI_TxPauseEnable defined in G.8021.";

-            }

-            leaf phy-type {

-                type ety-phy-type;

-                config false;

-                description "This attribute identifies the PHY type of the ETY trail termination. See IEEE 802.3 clause 30.3.2.1.2.";

-            }

-            leaf-list phy-type-list {

-                type ety-phy-type;

-                config false;

-                description "This attribute identifies the possible PHY types that could be supported at the ETY trail termination. See IEEE 802.3 clause 30.3.2.1.3.";

-            }

-            description "none";

-        }

-        grouping traffic-conditioning-pac {

-            list prio-config-list {

-                config false;

-                uses priority-configuration;

-                description "This attribute indicates the Priority Splitter function for the mapping of the Ethernet frame priority (ETH_CI_P) values to the output queue.";

-            }

-            list cond-config-list {

-                config false;

-                uses traffic-conditioning-configuration;

-                description "This attribute indicates for the conditioner process the conditioning parameters:

-                    - Queue ID: Indicates the Queue ID

-                    - Committed Information Rate (CIR): number of bits per second

-                    - Committed Burst Size (CBS): number of bytes

-                    - Excess Information Rate (EIR): number of bits per second

-                    - Excess Burst Size (EBS): number of bytes

-                    - Coupling flag (CF): 0 or 1

-                    - Color mode (CM): color-blind and color-aware.";

-            }

-            leaf codirectional {

-                type boolean;

-                config false;

-                description "This attribute indicates the direction of the conditioner. The value of true means that the conditioner (modeled as a TCS Sink according to G.8021) is associated with the sink part of the containing CTP. The value of false means that the conditioner (modeled as a TCS Sink according to G.8021) is associated with the source part of the containing CTP.";

-            }

-            description "This object class models the ETH traffic conditioning function as defined in G.8021.

-                Basic attributes: codirectional, condConfigList, prioConfigList";

-        }

-        grouping traffic-shaping-pac {

-            list prio-config-list {

-                config false;

-                uses priority-configuration;

-                description "This attribute configures the Priority Splitter function for the mapping of the Ethernet frame priority (ETH_CI_P) values to the output queue.";

-            }

-            list queue-config-list {

-                config false;

-                uses queue-configuration;

-                description "This attribute configures the Queue depth and Dropping threshold parameters of the Queue process. The Queue depth sets the maximum size of the queue in bytes. An incoming ETH_CI traffic unit is dropped if there is insufficient space in the queue to hold the whole unit. The Dropping threshold sets the threshold of the queue. If the queue is filled beyond this threshold, incoming ETH_CI traffic units accompanied by the ETH_CI_DE signal set are dropped.";

-            }

-            leaf sched-config {

-                type scheduling-configuration;

-                config false;

-                description "This attribute configures the scheduler process. The value of this attribute is for further study because it is for further study in G.8021.

-                    Scheduler is a pointer to a Scheduler object, which is to be defined in the future (because in G.8021, this is FFS).

-                    Note that the only significance of the GTCS function defined in G.8021 is the use of a common scheduler for shaping. Given that, G.8052 models the common scheduler feature by having a common value for this attribute.";

-            }

-            leaf codirectional {

-                type boolean;

-                config false;

-                description "This attribute indicates the direction of the shaping function. The value of true means that the shaping (modeled as a TCS Source according to G.8021) is associated with the source part of the containing CTP. The value of false means that the shaping (modeled as a TCS Source according to G.8021) is associated with the sink part of the containing CTP.";

-            }

-            description "This object class models the ETH traffic shaping function as defined in G.8021.

-                Basic attribute: codirectional, prioConfigList, queueConfigList, schedConfig";

-        }

-        grouping eth-node-edge-point-spec {

-            container ety-term {

-                uses ety-termination-pac;

-                description "none";

-            }

-            description "none";

-        }

-

-    /***********************

-    * package type-definitions

-    **********************/ 

-        grouping priority-configuration {

-            leaf priority {

-                type uint64 {

-                    range "0..7";

-                }

-                description "none";

-            }

-            leaf queue-id {

-                type uint64 {

-                    range "1..8";

-                }

-                description "none";

-            }

-            description "none";

-        }

-        grouping queue-configuration {

-            leaf queue-id {

-                type uint64;

-                description "This attribute indicates the queue id.";

-            }

-            leaf queue-depth {

-                type uint64;

-                description "This attribute defines the depth of the queue in bytes.";

-            }

-            leaf queue-threshold {

-                type uint64;

-                description "This attribute defines the threshold of the queue in bytes.";

-            }

-            description "none";

-        }

-        grouping traffic-conditioning-configuration {

-            leaf cir {

-                type uint64;

-                description "This attribute indicates the Committed Information Rate in bits/s.";

-            }

-            leaf cbs {

-                type uint64;

-                description "This attribute indicates the Committed Burst Size in bytes.";

-            }

-            leaf eir {

-                type uint64;

-                description "This attribute indicates the Excess Information Rate in bits/s.";

-            }

-            leaf ebs {

-                type uint64;

-                description "This attribute indicates the Excess Burst Size in bytes.";

-            }

-            leaf coupling-flag {

-                type boolean;

-                description "This attribute indicates the coupling flag.";

-            }

-            leaf colour-mode {

-                type colour-mode;

-                description "This attribute indicates the colour mode.";

-            }

-            leaf queue-id {

-                type uint64 {

-                    range "1..8";

-                }

-                description "This attribute indicates the queue id.";

-            }

-            description "none";

-        }

-        typedef mac-address {

-            type string;

-            description "This primitive data type contains an Ethernet MAC address defined by IEEE 802a. The format of the address consists of 12 hexadecimal characters, grouped in pairs and separated by '-' (e.g., 03-27-AC-75-3E-1D).";

-        }

-        grouping priority-mapping {

-            leaf priority-0 {

-                type uint64 {

-                    range "0..7";

-                }

-                description "This attribute defines the new priority value for the old priority value 0.";

-            }

-            leaf priority-1 {

-                type uint64 {

-                    range "0..7";

-                }

-                default "1";

-                description "This attribute defines the new priority value for the old priority value 1.";

-            }

-            leaf priority-2 {

-                type uint64 {

-                    range "0..7";

-                }

-                default "2";

-                description "This attribute defines the new priority value for the old priority value 2.";

-            }

-            leaf priority-3 {

-                type uint64 {

-                    range "0..7";

-                }

-                default "3";

-                description "This attribute defines the new priority value for the old priority value 3.";

-            }

-            leaf priority-4 {

-                type uint64 {

-                    range "0..7";

-                }

-                default "4";

-                description "This attribute defines the new priority value for the old priority value 4.";

-            }

-            leaf priority-5 {

-                type uint64 {

-                    range "0..7";

-                }

-                default "5";

-                description "This attribute defines the new priority value for the old priority value 5.";

-            }

-            leaf priority-6 {

-                type uint64 {

-                    range "0..7";

-                }

-                default "6";

-                description "This attribute defines the new priority value for the old priority value 6.";

-            }

-            leaf priority-7 {

-                type uint64 {

-                    range "0..7";

-                }

-                default "7";

-                description "This attribute defines the new priority value for the old priority value 7.";

-            }

-            description "This data type provides the priority mapping done in the 'P Regenerate' process defined in G.8021.";

-        }

-        typedef vid {

-            type string;

-            description "This primitive type models the 12 Bit VLAN identifier of a VLAN tag.";

-        }

-        typedef modify-cross-connection-data {

-            type string;

-            description "none";

-        }

-        grouping address-tuple {

-            leaf address {

-                type mac-address;

-                description "This attribute contains the MAC address of the address tuple.";

-            }

-            leaf-list port-list {

-                type mac-address;

-                description "This attribute contains the ports associated to the MAC address in the address tuple.";

-            }

-            description "This data type contains an address tuple consisting of a MAC address and a corresponding port list.";

-        }

-        typedef scheduling-configuration {

-            type string;

-            description "The syntax of this dataType is pending on the specification in G.8021, which is for further study.";

-        }

-        grouping control-frame-filter {

-            leaf c-2-00-00-10 {

-                type boolean;

-                description "This attribute identifies the 'All LANs Bridge Management Group Address'.";

-            }

-            leaf c-2-00-00-00 {

-                type boolean;

-                description "This attribute identifies the STP/RSTP/MSTP protocol address.";

-            }

-            leaf c-2-00-00-01 {

-                type boolean;

-                description "This attribute identifies the IEEE MAC-specific Control Protocols group address (PAUSE protocol).";

-            }

-            leaf c-2-00-00-02 {

-                type boolean;

-                description "This attribute identifies the IEEE 802.3 Slow_Protocols_Multicast address (LACP/LAMP or Link OAM protocols).";

-            }

-            leaf c-2-00-00-03 {

-                type boolean;

-                description "This attribute identifies the Nearest non-TPMR Bridge group address (Port Authentication protocol).";

-            }

-            leaf c-2-00-00-04 {

-                type boolean;

-                description "This attribute identifies the IEEE MAC-specific Control Protocols group address.";

-            }

-            leaf c-2-00-00-05 {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-06 {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-07 {

-                type boolean;

-                description "This attribute identifies the Metro Ethernet Forum E-LMI protocol group address.";

-            }

-            leaf c-2-00-00-08 {

-                type boolean;

-                description "This attribute identifies the Provider Bridge Group address.";

-            }

-            leaf c-2-00-00-09 {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-0-a {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-0-b {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-0-c {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-0-d {

-                type boolean;

-                description "This attribute identifies the Provider Bridge MVRP address.";

-            }

-            leaf c-2-00-00-0-e {

-                type boolean;

-                description "This attribute identifies the Individual LAN Scope group address, Nearest Bridge group address (LLDP protocol).";

-            }

-            leaf c-2-00-00-0-f {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-20 {

-                type boolean;

-                description "This attribute identifies the Customer and Provider Bridge MMRP address.";

-            }

-            leaf c-2-00-00-21 {

-                type boolean;

-                description "This attribute identifies the Customer Bridge MVRP address.";

-            }

-            leaf c-2-00-00-22 {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-23 {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-24 {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-25 {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-26 {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-27 {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-28 {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-29 {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-2-a {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-2-b {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-2-c {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-2-d {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-2-e {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            leaf c-2-00-00-2-f {

-                type boolean;

-                description "Reserved for future standardization.";

-            }

-            description "This data type identifies the filter action for each of the 33 group MAC addresses (control frames).

-                Value 'false' means block: The frame is discarded by the filter process.

-                Value 'true' means pass: The frame is passed unchanged through the filter process.";

-        }

-        grouping bandwidth-report {

-            leaf source-mac-address {

-                type mac-address;

-                description "The sourceMacAddress is the address from the far end.";

-            }

-            leaf port-id {

-                type uint64;

-                description "This attribute returns the far end port identifier.";

-            }

-            leaf nominal-bandwidth {

-                type uint64;

-                description "This attribute returns the configured bandwidth";

-            }

-            leaf current-bandwidth {

-                type uint64;

-                description "This attribute returns the current bandwidth.";

-            }

-            description "Data type for the bandwidth report.";

-        }

-        typedef admin-state {

-            type enumeration {

-                enum LOCK {

-                    description "none";

-                }

-                enum NORMAL {

-                    description "none";

-                }

-            }

-            description "none";

-        }

-        typedef colour-mode {

-            type enumeration {

-                enum COLOUR_BLIND {

-                    description "none";

-                }

-                enum COLOUR_AWARE {

-                    description "none";

-                }

-            }

-            description "none";

-        }

-        typedef csf-config {

-            type enumeration {

-                enum DISABLED {

-                    description "This literal covers the following states of the CSF related MI informations:

-                        - MI_CSF_Enable is false

-                        - MI_CSFrdifdi_Enable is false

-                        - MI_CSFdci_Enable is false.";

-                }

-                enum ENABLED {

-                    description "This literal covers the following states of the CSF related MI informations:

-                        - MI_CSF_Enable is true

-                        - MI_CSFrdifdi_Enable is false

-                        - MI_CSFdci_Enable is false.";

-                }

-                enum ENABLED_WITH_RDI_FDI {

-                    description "This literal covers the following states of the CSF related MI informations:

-                        - MI_CSF_Enable is true

-                        - MI_CSFrdifdi_Enable is true

-                        - MI_CSFdci_Enable is false.";

-                }

-                enum ENABLED_WITH_RDI_FDI_DCI {

-                    description "This literal covers the following states of the CSF related MI informations:

-                        - MI_CSF_Enable is true

-                        - MI_CSFrdifdi_Enable is true

-                        - MI_CSFdci_Enable is true.";

-                }

-                enum ENABLED_WITH_DCI {

-                    description "This literal covers the following states of the CSF related MI informations:

-                        - MI_CSF_Enable is true

-                        - MI_CSFrdifdi_Enable is false

-                        - MI_CSFdci_Enable is true.";

-                }

-            }

-            description "none";

-        }

-        typedef ety-phy-type {

-            type enumeration {

-                enum OTHER {

-                    description "none";

-                }

-                enum UNKNOWN {

-                    description "none";

-                }

-                enum NONE {

-                    description "none";

-                }

-                enum 2BASE_TL {

-                    description "none";

-                }

-                enum 10MBIT_S {

-                    description "none";

-                }

-                enum 10PASS_TS {

-                    description "none";

-                }

-                enum 100BASE_T4 {

-                    description "none";

-                }

-                enum 100BASE_X {

-                    description "none";

-                }

-                enum 100BASE_T2 {

-                    description "none";

-                }

-                enum 1000BASE_X {

-                    description "none";

-                }

-                enum 1000BASE_T {

-                    description "none";

-                }

-                enum 10GBASE-X {

-                    description "none";

-                }

-                enum 10GBASE_R {

-                    description "none";

-                }

-                enum 10GBASE_W {

-                    description "none";

-                }

-            }

-            description "none";

-        }

-        typedef frame-type {

-            type enumeration {

-                enum ADMIT_ONLY_VLAN_TAGGED_FRAMES {

-                    description "none";

-                }

-                enum ADMIT_ONLY_UNTAGGED_AND_PRIORITY_TAGGED_FRAMES {

-                    description "none";

-                }

-                enum ADMIT_ALL_FRAMES {

-                    description "none";

-                }

-            }

-            description "none";

-        }

-        typedef oam-period {

-            type enumeration {

-                enum 3_33MS {

-                    description "Default for protection.";

-                }

-                enum 10MS {

-                    description "none";

-                }

-                enum 100MS {

-                    description "none";

-                }

-                enum 1S {

-                    description "none";

-                }

-                enum 10S {

-                    description "none";

-                }

-                enum 1MIN {

-                    description "none";

-                }

-                enum 10MIN {

-                    description "none";

-                }

-            }

-            description "Provides the frequency for the OAM PDU insertion.";

-        }

-        typedef pcp-coding {

-            type enumeration {

-                enum 8P0D {

-                    description "none";

-                }

-                enum 7P1D {

-                    description "none";

-                }

-                enum 6P2D {

-                    description "none";

-                }

-                enum 5P3D {

-                    description "none";

-                }

-                enum DEI {

-                    description "This enumeration value means that all priorities should be drop eligible.

-                        DEI = Drop Eligibility Indicator";

-                }

-            }

-            description "This enum models the coding of the Priority Code Point as defined in section 'Priority Code Point encoding' of IEEE 802.1Q.";

-        }

-        typedef vlan-type {

-            type enumeration {

-                enum C_Tag {

-                    description "0x8100";

-                }

-                enum S_Tag {

-                    description "0x88a8";

-                }

-                enum I_Tag {

-                    description "88-e7";

-                }

-            }

-            description "This enumeration contains the Ethertypes defined in IEEE 802.1Q.";

-        }

-

-}

diff --git a/models/tapi/src/main/yang/tapi-eth@2018-10-16.yang b/models/tapi/src/main/yang/tapi-eth@2018-10-16.yang
new file mode 100644
index 0000000..e4cd3f3
--- /dev/null
+++ b/models/tapi/src/main/yang/tapi-eth@2018-10-16.yang
@@ -0,0 +1,1892 @@
+module tapi-eth {

+    namespace "urn:onf:otcc:yang:tapi-eth";

+    prefix tapi-eth;

+    import tapi-common {

+        prefix tapi-common;

+    }

+    import tapi-topology {

+        prefix tapi-topology;

+    }

+    import tapi-connectivity {

+        prefix tapi-connectivity;

+    }

+    import tapi-oam {

+        prefix tapi-oam;

+    }

+    organization "ONF OTCC (Open Transport Configuration & Control) Project";

+    contact "

+         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>

+         Project List: <mailto:transport-api@opennetworking.org>

+         Editor: Karthik Sethuraman

+                 <mailto:karthik.sethuraman@necam.com>";

+    description "This module contains TAPI ETH Model definitions.

+        Source: TapiEth.uml

+        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

+        License: This module is distributed under the Apache License 2.0";

+    revision 2018-10-16 {

+        description "ONF Transport API version 2.1.0.

+          - The TAPI YANG models included in this TAPI release (v2.1.0) are a *normative* part of the TAPI SDK.

+          - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]

+            <https://github.com/OpenNetworkingFoundation/EagleUmlYang>

+            and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]

+            <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>

+          - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.

+            As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.

+          - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.

+            The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.

+            YANG models included in this release are not backward compatible with previous TAPI releases.

+          - Changes included in this TAPI release (v2.1.0) are listed in

+            <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";

+    }

+    revision 2018-03-07 {

+        description "ONF Transport API version 2.0.2
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

+    }

+    revision 2018-02-16 {

+        description "ONF Transport API version 2.0.1
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

+    }

+    revision 2018-01-02 {

+        description "ONF Transport API version 2.0.0
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

+    }

+    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {

+        container eth-connection-end-point-spec {

+            uses eth-connection-end-point-spec;

+            description "Augments the base LayerProtocol information in ConnectionEndPoint with ETH-specific information";

+        }

+        description "Augments the base LayerProtocol information in ConnectionEndPoint with ETH-specific information";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {

+        container eth-loopback-job {

+            uses eth-loopback-job;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg" {

+        container eth-meg-spec {

+            uses eth-meg-spec;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mep" {

+        container eth-mep-spec {

+            uses eth-mep-spec;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mip" {

+        container eth-mip-spec {

+            uses eth-mip-spec;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {

+        container eth-pro-active-2way-measurement-job {

+            uses eth-pro-active-2way-measurement-job;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {

+        container eth-link-trace-job {

+            uses eth-link-trace-job;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {

+        container eth-test-job {

+            uses eth-test-job;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {

+        container eth-pro-active-1way-measurement-job {

+            uses eth-pro-active-1way-measurement-job;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {

+        container eth-pro-active-dm-performance-data {

+            uses eth-pro-active-dm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {

+        container eth-pro-active-dm-performance-data {

+            uses eth-pro-active-dm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {

+        container eth-pro-active-lm-performance-data {

+            uses eth-pro-active-lm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {

+        container eth-pro-active-lm-performance-data {

+            uses eth-pro-active-lm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {

+        container eth-on-demand-dm-performance-data {

+            uses eth-on-demand-dm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {

+        container eth-on-demand-1-lm-performance-data {

+            uses eth-on-demand-1-lm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {

+        container eth-on-demand-1-dm-performance-data {

+            uses eth-on-demand-1-dm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {

+        container eth-pro-active-1-dm-performance-data {

+            uses eth-pro-active-1-dm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {

+        container eth-pro-active-1-dm-performance-data {

+            uses eth-pro-active-1-dm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {

+        container eth-pro-active-1-lm-performance-data {

+            uses eth-pro-active-1-lm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {

+        container eth-pro-active-1-lm-performance-data {

+            uses eth-pro-active-1-lm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {

+        container eth-on-demand-1way-measurement-job {

+            uses eth-on-demand-1way-measurement-job;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {

+        container eth-on-demand-2way-measurement-job {

+            uses eth-on-demand-2way-measurement-job;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {

+        container eth-on-demand-1-dm-performance-data {

+            uses eth-on-demand-1-dm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {

+        container eth-on-demand-1-lm-performance-data {

+            uses eth-on-demand-1-lm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {

+        container eth-on-demand-dm-performance-data {

+            uses eth-on-demand-dm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {

+        container eth-on-demand-lm-performance-data {

+            uses eth-on-demand-lm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {

+        container eth-on-demand-lm-performance-data {

+            uses eth-on-demand-lm-performance-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {

+        container eth-1-dm-threshold-data {

+            uses eth-1-dm-threshold-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {

+        container eth-1-lm-threshold-data {

+            uses eth-1-lm-threshold-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {

+        container eth-dm-threshold-data {

+            uses eth-dm-threshold-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {

+        container eth-lm-threshold-data {

+            uses eth-lm-threshold-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {

+        container eth-link-trace-result-data {

+            uses eth-link-trace-result-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {

+        container eth-test-result-data {

+            uses eth-test-result-data;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {

+        container eth-loopback-result-data {

+            uses eth-loopback-result-data;

+            description "none";

+        }

+        description "none";

+    }

+    /***********************

+    * package object-classes

+    **********************/ 

+        grouping eth-ctp-pac {

+            leaf-list auxiliary-function-position-sequence {

+                type uint64;

+                description "This attribute indicates the positions (i.e., the relative order) of all the MEP, MIP, and TCS objects which are associated with the CTP.";

+            }

+            leaf vlan-config {

+                type uint64;

+                description "This attribute models the ETHx/ETH-m_A_So_MI_Vlan_Config information defined in G.8021.

+                    range of type : -1, 0, 1..4094";

+            }

+            leaf csf-rdi-fdi-enable {

+                type boolean;

+                description "This attribute models the MI_CSFrdifdiEnable information defined in G.8021.";

+            }

+            leaf csf-report {

+                type boolean;

+                description "This attribute models the MI_CSF_Reported information defined in G.8021.

+                    range of type : true, false";

+            }

+            leaf-list filter-config-snk {

+                type mac-address;

+                description "This attribute models the FilteConfig MI defined in 8.3/G.8021. It indicates the configured filter action for each of the 33 group MAC addresses for control frames. The 33 MAC addresses are:

+                    01-80-C2-00-00-10, 

+                    01-80-C2-00-00-00 to 01-80-C2-00-00-0F, and 

+                    01-80-C2-00-00-20 to 01-80-C2-00-00-2F.

+                    The filter action is Pass or Block. 

+                    If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action. 

+                    If none of the above addresses match, the ETH_CI_D is passed.";

+            }

+            leaf mac-length {

+                type uint64;

+                default "2000";

+                description "This attribute models the MAC_Lenght MI defined in 8.6/G.8021 for the MAC Length Check process. It indicates the allowed maximum frame length in bytes.

+                    range of type : 1518, 1522, 2000";

+            }

+            container filter-config {

+                uses control-frame-filter;

+                description "This attribute models the FilterConfig MI defined in section 8.3/G.8021. It indicates the configured filter action for each of the 33 group MAC addresses for control frames. The 33 MAC addresses are:

+                    - All bridges address: 01-80-C2-00-00-10,

+                    - Reserved addresses: 01-80-C2-00-00-00 to 01-80-C2-00-00-0F,

+                    - GARP Application addresses: 01-80-C2-00-00-20 to 01-80-C2-00-00-2F.

+                    The filter action is Pass or Block. 

+                    If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action. 

+                    If none of the above addresses match, the ETH_CI_D is passed.";

+            }

+            leaf is-ssf-reported {

+                type boolean;

+                description "This attribute provisions whether the SSF defect should be reported as fault cause or not.

+                    It models the ETH-LAG_FT_Sk_MI_SSF_Reported defined in G.8021.";

+            }

+            leaf pll-thr {

+                type uint64;

+                description "This attribute provisions the threshold for the number of active ports. If the number of active ports is more than zero but less than the provisioned threshold, a cPLL (Partial Link Loss) is raised. See section 9.7.1.2 of G.8021.

+                    range of type : 0..number of ports";

+            }

+            leaf actor-oper-key {

+                type uint64;

+                config false;

+                description "See 802.1AX:

+                    The current operational value of the Key for the Aggregator. The administrative Key value may differ from the operational Key value for the reasons discussed in 5.6.2.

+                    The meaning of particular Key values is of local significance.

+                    range of type : 16 bit";

+            }

+            leaf actor-system-id {

+                type mac-address;

+                description "See 802.1AX:

+                    A MAC address used as a unique identifier for the System that contains this Aggregator.";

+            }

+            leaf actor-system-priority {

+                type uint64;

+                description "See 802.1AX:

+                    Indicating the priority associated with the Actors System ID.

+                    range of type : 2-octet";

+            }

+            leaf collector-max-delay {

+                type uint64;

+                description "See 802.1AX:

+                    The value of this attribute defines the maximum delay, in tens of microseconds, that may be imposed by the Frame Collector between receiving a frame from an Aggregator Parser, and either delivering the frame to its MAC Client or discarding the frame (see IEEE 802.1AX clause 5.2.3.1.1).

+                    range of type : 16-bit";

+            }

+            leaf data-rate {

+                type uint64;

+                config false;

+                description "See 802.1AX:

+                    The current data rate, in bits per second, of the aggregate link. The value is calculated as N times the data rate of a single link in the aggregation, where N is the number of active links.";

+            }

+            leaf partner-oper-key {

+                type uint64;

+                config false;

+                description "See 802.1AX:

+                    The current operational value of the Key for the Aggregators current protocol Partner. If the aggregation is manually configured, this Key value will be a value assigned by the local System.

+                    range of type : 16-bit";

+            }

+            leaf partner-system-id {

+                type mac-address;

+                config false;

+                description "See 802.1AX:

+                    A MAC address consisting of the unique identifier for the current protocol Partner of this Aggregator. A value of zero indicates that there is no known Partner. If the aggregation is manually configured, this System ID value will be a value assigned by the local System.";

+            }

+            leaf partner-system-priority {

+                type uint64;

+                config false;

+                description "See 802.1AX:

+                    Indicates the priority associated with the Partners System ID. If the aggregation is manually configured, this System Priority value will be a value assigned by the local System.

+                    range of type : 2-octet";

+            }

+            leaf csf-config {

+                type csf-config;

+                description "This attribute models the combination of all CSF related MI signals (MI_CSF_Enable, MI_CSFrdifdi_Enable, MI_CSFdci_Enable) as defined in G.8021.

+                    range of type : true, false";

+            }

+            container traffic-shaping {

+                uses traffic-shaping-pac;

+                description "none";

+            }

+            container traffic-conditioning {

+                uses traffic-conditioning-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping eth-connection-end-point-spec {

+            container ety-term {

+                uses ety-termination-pac;

+                description "none";

+            }

+            container eth-term {

+                uses eth-termination-pac;

+                description "none";

+            }

+            container eth-ctp {

+                uses eth-ctp-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping eth-termination-pac {

+            container priority-regenerate {

+                uses priority-mapping;

+                description "This attribute models the ETHx/ETH-m _A_Sk_MI_P_Regenerate information defined in G.8021.";

+            }

+            leaf ether-type {

+                type vlan-type;

+                description "This attribute models the ETHx/ETH-m _A_Sk_MI_Etype information defined in G.8021.";

+            }

+            leaf-list filter-config-1 {

+                type mac-address;

+                description "This attribute models the ETHx/ETH-m_A_Sk_MI_Filter_Config information defined in G.8021.

+                    It indicates the configured filter action for each of the 33 group MAC addresses for control frames.

+                    The 33 MAC addresses are:

+                    01-80-C2-00-00-10, 

+                    01-80-C2-00-00-00 to 01-80-C2-00-00-0F, and 

+                    01-80-C2-00-00-20 to 01-80-C2-00-00-2F.

+                    The filter action is Pass or Block. 

+                    If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action. 

+                    If none of the above addresses match, the ETH_CI_D is passed.

+                    range of type : MacAddress: 

+                    01-80-C2-00-00-10, 

+                    01-80-C2-00-00-00 to 

+                    01-80-C2-00-00-0F, and 

+                    01-80-C2-00-00-20 to 

+                    01-80-C2-00-00-2F;

+                    ActionEnum:

+                    PASS, BLOCK";

+            }

+            leaf frametype-config {

+                type frame-type;

+                description "This attribute models the ETHx/ETH-m_A_Sk_MI_Frametype_Config information defined in G.8021.

+                    range of type : see Enumeration";

+            }

+            leaf port-vid {

+                type vid;

+                default "1";

+                description "This attribute models the ETHx/ETH-m _A_Sk_MI_PVID information defined in G.8021.";

+            }

+            leaf priority-code-point-config {

+                type pcp-coding;

+                description "This attribute models the ETHx/ETH-m _A_Sk_MI_PCP_Config information defined in G.8021.

+                    range of type : see Enumeration";

+            }

+            description "This object class models the Ethernet Flow Termination function located at a layer boundary.";

+        }

+        grouping ety-termination-pac {

+            leaf is-fts-enabled {

+                type boolean;

+                description "This attribute indicates whether Forced Transmitter Shutdown (FTS) is enabled or not. It models the ETYn_TT_So_MI_FTSEnable information.";

+            }

+            leaf is-tx-pause-enabled {

+                type boolean;

+                description "This attribute identifies whether the Transmit Pause process is enabled or not. It models the MI_TxPauseEnable defined in G.8021.";

+            }

+            leaf phy-type {

+                type ety-phy-type;

+                config false;

+                description "This attribute identifies the PHY type of the ETY trail termination. See IEEE 802.3 clause 30.3.2.1.2.";

+            }

+            leaf-list phy-type-list {

+                type ety-phy-type;

+                config false;

+                description "This attribute identifies the possible PHY types that could be supported at the ETY trail termination. See IEEE 802.3 clause 30.3.2.1.3.";

+            }

+            description "none";

+        }

+        grouping traffic-conditioning-pac {

+            list prio-config-list {

+                config false;

+                uses priority-configuration;

+                description "This attribute indicates the Priority Splitter function for the mapping of the Ethernet frame priority (ETH_CI_P) values to the output queue.";

+            }

+            list cond-config-list {

+                config false;

+                uses traffic-conditioning-configuration;

+                description "This attribute indicates for the conditioner process the conditioning parameters:

+                    - Queue ID: Indicates the Queue ID

+                    - Committed Information Rate (CIR): number of bits per second

+                    - Committed Burst Size (CBS): number of bytes

+                    - Excess Information Rate (EIR): number of bits per second

+                    - Excess Burst Size (EBS): number of bytes

+                    - Coupling flag (CF): 0 or 1

+                    - Color mode (CM): color-blind and color-aware.";

+            }

+            leaf codirectional {

+                type boolean;

+                config false;

+                description "This attribute indicates the direction of the conditioner. The value of true means that the conditioner (modeled as a TCS Sink according to G.8021) is associated with the sink part of the containing CTP. The value of false means that the conditioner (modeled as a TCS Sink according to G.8021) is associated with the source part of the containing CTP.";

+            }

+            description "This object class models the ETH traffic conditioning function as defined in G.8021.

+                Basic attributes: codirectional, condConfigList, prioConfigList";

+        }

+        grouping traffic-shaping-pac {

+            list prio-config-list {

+                config false;

+                uses priority-configuration;

+                description "This attribute configures the Priority Splitter function for the mapping of the Ethernet frame priority (ETH_CI_P) values to the output queue.";

+            }

+            list queue-config-list {

+                config false;

+                uses queue-configuration;

+                description "This attribute configures the Queue depth and Dropping threshold parameters of the Queue process. The Queue depth sets the maximum size of the queue in bytes. An incoming ETH_CI traffic unit is dropped if there is insufficient space in the queue to hold the whole unit. The Dropping threshold sets the threshold of the queue. If the queue is filled beyond this threshold, incoming ETH_CI traffic units accompanied by the ETH_CI_DE signal set are dropped.";

+            }

+            leaf sched-config {

+                type scheduling-configuration;

+                config false;

+                description "This attribute configures the scheduler process. The value of this attribute is for further study because it is for further study in G.8021.

+                    Scheduler is a pointer to a Scheduler object, which is to be defined in the future (because in G.8021, this is FFS).

+                    Note that the only significance of the GTCS function defined in G.8021 is the use of a common scheduler for shaping. Given that, G.8052 models the common scheduler feature by having a common value for this attribute.";

+            }

+            leaf codirectional {

+                type boolean;

+                config false;

+                description "This attribute indicates the direction of the shaping function. The value of true means that the shaping (modeled as a TCS Source according to G.8021) is associated with the source part of the containing CTP. The value of false means that the shaping (modeled as a TCS Source according to G.8021) is associated with the sink part of the containing CTP.";

+            }

+            description "This object class models the ETH traffic shaping function as defined in G.8021.

+                Basic attribute: codirectional, prioConfigList, queueConfigList, schedConfig";

+        }

+        grouping eth-meg-spec {

+            leaf client-mel {

+                type uint64;

+                description "none";

+            }

+            description "none";

+        }

+        grouping eth-mep-spec {

+            container eth-mep-common {

+                uses eth-mep-common;

+                description "none";

+            }

+            container eth-mep-source-pac {

+                uses eth-mep-source;

+                description "none";

+            }

+            container eth-mep-sink {

+                uses eth-mep-sink;

+                description "none";

+            }

+            description "none";

+        }

+        grouping eth-mip-spec {

+            leaf mip-mac {

+                type mac-address;

+                config false;

+                description "This attribute contains the MAC address of the MIP instance.";

+            }

+            leaf is-full-mip {

+                type boolean;

+                config false;

+                description "This attribute indicates whether the MIP is a full MIP (true) or a down-half MIP (false).";

+            }

+            description "none";

+        }

+        grouping eth-loopback-job {

+            container eth-lb-msg {

+                uses eth-oam-msg-common-pac;

+                description "none";

+            }

+            leaf number {

+                type uint64;

+                description "G.8052: This parameter specifies how many LB messages to be sent for the LB_Series process.";

+            }

+            description "This class represents the Loopback (LB) process (send a series of LB messages carrying a test pattern to a particular MEP). The termination occurs at specified stop time (schedule attribute of OamJob).

+                This class models also the 'loopback discover' process, when destinationAddress is multicast.

+                When number is greater than 1, then the process is to perform a Loopback (LB) Series process (send a series of N LB messages to a particular MEP/MIP. ";

+        }

+        grouping eth-mep-common {

+            leaf mep-mac {

+                type mac-address;

+                config false;

+                description "This attribute contains the MAC Address of the MEP.";

+            }

+            leaf is-cc-enabled {

+                type boolean;

+                description "This attribute models the MI_CC_Enable signal defined in G.8021 and configured as specified in G8051.";

+            }

+            leaf cc-period {

+                type oam-period;

+                description "This attribute models the MI_CC_Period signal defined in G.8021 and configured as specified in G8051. 

+                    It is the period at which the CCM message should be sent. 

+                    Default values are: 3.33 ms for PS, 100 ms for PM, 1 s for FM.";

+            }

+            leaf cc-priority {

+                type uint64 {

+                    range "0..7";

+                }

+                default "7";

+                description "This attribute models the MI_CC_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the CCM message should be sent.";

+            }

+            leaf lck-period {

+                type oam-period;

+                description "This attribute models the MI_LCK_Period signal defined in G.8021 and configured as specified in G8051. It is the frequency at which the LCK messages should be sent.

+                    range of type : 1s, 1min";

+            }

+            leaf lck-priority {

+                type uint64 {

+                    range "0..7";

+                }

+                default "7";

+                description "This attribute models the MI_LCK_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the LCK messages should be sent.";

+            }

+            description "Basic attributes: adminState, clientMel, megIdentifier, mepMac

+                Continuity Check Process related attributes: ccPeriod, ccPriority, isCcEnabled

+                Lock Process related attributes: lckPeriod, lckPriority

+                This object class models the MEP functions that are common to MEP Sink and MEP Source.";

+        }

+        grouping eth-mep-sink {

+            leaf-list dm-1-priority {

+                type uint64;

+                description "This attribute indicates the list of 1DM priorities for the MepSink.";

+            }

+            leaf ais-priority {

+                type uint64 {

+                    range "0..7";

+                }

+                default "7";

+                description "This attribute models the MI_AIS_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the AIS messages should be sent.";

+            }

+            leaf ais-period {

+                type oam-period;

+                description "This attribute models the MI_AIS_Period signal defined in G.8021 and configured as specified in G8051. It is the frequency at which the AIS messages should be sent.

+                    range of type : 1s, 1min";

+            }

+            leaf is-csf-reported {

+                type boolean;

+                default "true";

+                description "This attribute models the MI_CSF_Reported signal defined in G.8021 and configured as specified in G8051. It configures whether the secondary failure CSF should be reported or not.";

+            }

+            leaf is-csf-rdi-fdi-enabled {

+                type boolean;

+                default "true";

+                description "This attribute models the MI_CSFrdifdiEnable signal defined in G.8021 and configured as specified in G8051.";

+            }

+            container bandwidth-report {

+                config false;

+                uses bandwidth-report;

+                description "This attribute models the content of the bandwidth report received by the MEP Sink from the peer MEP Source.";

+            }

+            leaf lm-degm {

+                type uint64;

+                default "10";

+                description "This attribute defines the number of consecutive bad seconds necessary for the 'degraded' detection. See also section 'Degraded signal defect (dDEG)' in G.8021.";

+            }

+            leaf lm-deg-thr {

+                type uint64;

+                default "30";

+                description "This attribute defines the threshold for declaring a 'bad second'. See also section 'Degraded signal defect (dDEG)' in G.8021.";

+            }

+            leaf lm-m {

+                type uint64 {

+                    range "2..10";

+                }

+                default "10";

+                description "This attribute defines the number of consecutive good seconds necessary for the clearing of 'degraded'. See also section 'Degraded signal defect (dDEG)' in G.8021.";

+            }

+            leaf lm-tf-min {

+                type uint64;

+                description "This attribute defines the necessary number of transmitted frames to enable the detection of 'bad seconds'. See also section 'Degraded signal defect (dDEG)' in G.8021.";

+            }

+            description "1DM related attribute: 1DmPriority

+                AIS Process related attributes: aisPeriod, aisPriority

+                Bandwidth notification Process related attribute: bandwidthReport

+                Basic attribute: peerMepRefList

+                CSF Process related attributes: isCsfRdiFdiEnabled, isCsfReported

+                Defect correlation Process related attribute: currentProblemList

+                This object class models the MEP sink function. Instance of this object class can be created and contained by ETH CTP or TTP objects.

+                It also provides the management of the dual-ended maintenance job, such as test.

+                This object contains the configuration parameters for detecting 'degraded signal' (DEG).";

+        }

+        grouping eth-mep-source {

+            leaf aps-priority {

+                type uint64 {

+                    range "0..7";

+                }

+                default "7";

+                description "This attribute specifies the priority of the APS messages.

+                    See section 8.1.5    APS insert process in G.8021.";

+            }

+            leaf csf-priority {

+                type uint64 {

+                    range "0..7";

+                }

+                default "7";

+                description "This attribute models the MI_CSF_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the CSF messages should be sent";

+            }

+            leaf csf-period {

+                type oam-period;

+                description "This attribute models the MI_CSF_Period signal defined in G.8021 and configured as specified in G8051. It is the period at which the CSF messages should be sent.

+                    range of type : 1s, 1min";

+            }

+            leaf csf-config {

+                type csf-config;

+                description "This attribute models the combination of all CSF related MI signals (MI_CSF_Enable, MI_CSFrdifdi_Enable, MI_CSFdci_Enable) as defined in G.8021.";

+            }

+            description "APS Process related attribute: apsPriority

+                Basic attribute: mepIdentifier

+                CSF Process related attributes: csfConfig, csfPeriod, csfPriority

+                Link trace related operation: linkTrace

+                Loopback related operations: loopbackDiscover, loopbackSeries, loopbackTest, loopbackTestTerminate

+                On demand measurement job control related operation: establishOnDemandDualEndedMeasurementJobSource

+                Proactive measurement job control related operation: establishProActiveDualEndedMeasurementJobSource

+                Test related operations: testInitiatorStart, testInitiatorTerminate

+                This object class models the MEP source function. Instance of this object class can be created and contained by ETH CTP or TTP objects.

+                It also provides the management of single-ended maintenance jobs, such as loopback test, loopback discover, loopback series, link trace, and dual-ended maintenance job, such as test.";

+        }

+        grouping eth-link-trace-job {

+            container eth-lt-msg {

+                uses eth-oam-operation-common-pac;

+                description "none";

+            }

+            leaf time-to-live {

+                type uint64;

+                description "G.8052: This parameter provides the Time To Live (TTL) parameter of the Link Track protocol.

+                    The TTL parameter allows the receiver (MIP or MEP) of the LTM frame to determine if the frame can be terminated. TTL is decremented every time the LTM frame is relayed. LTM frame with TTL<=1 is terminated and not relayed.";

+            }

+            description "This class represents the Link Trace (LT) process for fault localization or for discovering the intermediate MIPs along the link from the MEP Source to a target MEP or MIP. An LTM frame will be sent from the MEP source to the target MEP/MIP.

+                The termination occurs at specified stop time (schedule attribute of OamJob).";

+        }

+        grouping eth-test-job {

+            container eth-test-msg {

+                uses eth-oam-msg-common-pac;

+                description "none";

+            }

+            description "This class represents the 1-way on-demand in-service or out-of-service diagnostic test. The diagnostic test includes verifying bandwidth throughput, frame loss, bit errors, etc. TST frames are transmitted.

+                The termination occurs at specified stop time (schedule attribute of OamJob).";

+        }

+        grouping eth-on-demand-measurement-job-control-sink {

+            leaf responder-mep-id {

+                type string;

+                description "none";

+            }

+            leaf source-address {

+                type mac-address;

+                description "This attribute contains the MAC address of the peer MEP. See G.8013 for details.";

+            }

+            leaf priority {

+                type uint64;

+                default "7";

+                description "This attribute contains the priority of the OAM PDU frames.

+                    range of type : 0, 1, 2, 3, 4, 5, 6, 7";

+            }

+            leaf test-identifier {

+                type uint64;

+                description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.

+                    range of type : 0..(2^32) - 1";

+            }

+            description "This object class represents an on-demand measurement job controller sink for 1-way measurements. It is created as a result of an establishOnDemandDualEndedMeasurementJobSink() operation. It is deleted either automatically after the measurement job has completed (stop time reached) and the performance data AVC notification has been sent, or by an explicit abortOnDemandMeasurementJob() operation when the measurement job is running.";

+        }

+        grouping eth-on-demand-measurement-job-control-source {

+            leaf controller-mep-id {

+                type string;

+                description "none";

+            }

+            leaf oam-pdu-generation-type {

+                type oam-pdu-generation-type;

+                description "This attribute contains the pattern that is used for the generation of OAM PDUs.";

+            }

+            leaf destination-address {

+                type mac-address;

+                description "This attribute contains the MAC address of the peer MEP. See G.8013 for details.";

+            }

+            leaf priority {

+                type uint64;

+                default "7";

+                description "This attribute contains the priority of the OAM PDU frames.

+                    range of type : 0, 1, 2, 3, 4, 5, 6, 7";

+            }

+            leaf message-period {

+                type message-period;

+                description "This attribute contains the frequency of the OAM message (PDU) generation within a series. 

+                    Note that the value 0 means that only one OAM message per measurement interval is generated.

+                    range of type : See corresponding Enum.";

+            }

+            leaf repetition-period {

+                type repetition-period;

+                description "This attribute contains the time between the start of two measurement intervals. This IS applicable for the repetitive instance type and MAY be applicable for the repetitive series type. 

+                    Note that a value of 0 means not applicable (NA), which is for the cases of single instance, single series, or repetitive series without extra gap in between the measurement intervals (i.e., also as known as continuous series).";

+            }

+            leaf measurement-interval {

+                type uint64;

+                description "This attribute contains the discrete non overlapping periods of time (in seconds) during which measurements are performed (i.e., OAM messages are generated) and reports are gathered at the end of the measurement intervals. Note that the value 0 means a degenerated measurement interval with a single OAM message and the report is sent as immediately as possible.

+                    range of type : Non-negative";

+            }

+            leaf test-identifier {

+                type uint64;

+                description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.

+                    Note: The attribute is not used in case of LMM/LMR measurement.

+                    range of type : 0..(2^32) - 1";

+            }

+            leaf data-tlv-length {

+                type uint64;

+                description "This parameter provides the size of the optional data TLV.

+                    Non-negative integer represents the number of bytes for the length of the padding TLV.

+                    Notes:

+                    When configuring this parameter one should be aware of the maximum allowed total frame size limitation.

+                    The attribute is not used in case of 2-way loss measurement.

+                    range of type : Depends on the allowed MTU size.";

+            }

+            description "Basic attributes: destinationAddress, priority

+                Measurement configuration related attributes: oamPduGenerationType, startTime, stopTime, messagePeriod, repetitionPeriod, measurementInterval

+                Optional attributes: dataTlvLength, testIdentifier

+                This object class represents an on-demand measurement job controller source for 1-way measurements. It is created as a result of an establishOnDemandDualEndedMeasurementJobSource() operation. It is deleted either automatically after the measurement job has completed (stop time reached), or by an explicit abortOnDemandMeasurementJob() operation while the measurement job is running.";

+        }

+        grouping eth-pro-active-measurement-job-control-sink {

+            leaf responder-mep-id {

+                type string;

+                description "none";

+            }

+            leaf is-enabled {

+                type boolean;

+                default "true";

+                description "This attribute identifies the state of the measurement job. If set to TRUE, the MEP performs proactive Performance Measurement.";

+            }

+            leaf source-address {

+                type mac-address;

+                description "This attribute contains the MAC address of the peer MEP. See G.8013 for details.";

+            }

+            leaf test-identifier {

+                type uint64;

+                description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.

+                    range of type : 0..(2^32) - 1";

+            }

+            description "This object class allows the control of the proactive 1-way measurement. It is created as a part of an establishProActiveDualEndedMeasurementJobSink() operation. Lifecycle: A pre-condition of deleting the object is that the Enable attribute should have the value FALSE.";

+        }

+        grouping eth-pro-active-measurement-job-control-source {

+            leaf controller-mep-id {

+                type string;

+                description "none";

+            }

+            leaf is-enabled {

+                type boolean;

+                default "true";

+                description "This attribute identifies the state of the measurement job. If set to TRUE, the MEP performs proactive Performance Measurement.";

+            }

+            leaf destination-address {

+                type mac-address;

+                description "This attribute provides the Unicast MAC address of the intented destination.";

+            }

+            leaf priority {

+                type uint64 {

+                    range "0..7";

+                }

+                default "7";

+                description "This attribute contains the priority value on which the MEP performs the measurement. When the measurement is enabled, the MEP should use this value to encode the priority of generated measurement frames. The EMF usese this value to assign the P parameter of the measurement operation.";

+            }

+            leaf period {

+                type oam-period;

+                description "This attribute indicates the period (frequency) of the measurement frame transmission.

+                    range of type : 100ms, 1s, 10s";

+            }

+            leaf test-identifier {

+                type uint64;

+                description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.

+                    Note: The attribute is not used in case of 2-way loss measurement. 

+                    range of type : 0..(2^32) - 1";

+            }

+            leaf data-tlv-length {

+                type uint64;

+                description "This parameter provides the size of the optional data TLV.

+                    Non-negative integer represents the number of bytes for the length of the padding TLV.

+                    Notes:

+                    When configuring this parameter one should be aware of the maximum allowed total frame size limitation.

+                    The attribute is not used in case of 2-way loss measurement.

+                    range of type : Depends on the allowed MTU size.";

+            }

+            description "This object class represents a proactive measurement job controller source for 1way measurements. It is created as a part of an establishProactiveDualEndedMeasurementJobSource() operation.";

+        }

+        grouping eth-pro-active-1-dm-performance-data {

+            container pro-active-near-end-1-dm-parameters {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the statistical near end performnace parameters.";

+            }

+            description "This object class represents the PM current data collected in a pro-active delay measurement job (using 1DM).";

+        }

+        grouping eth-pro-active-1-lm-performance-data {

+            container pro-active-near-end-1-lm-parameters {

+                uses statistical-lm-performance-parameters;

+                description "This attribute contains the statistical near end performnace parameters.";

+            }

+            description "This object class represents the PM current data collected in a pro-active loss measurement job (using 1SL).";

+        }

+        grouping eth-pro-active-dm-performance-data {

+            container pro-active-bi-dir-dm-parameters {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the statistical bidirectional performnace parameters.";

+            }

+            container pro-active-far-end-dm-parameters {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the statistical far end performnace parameters.";

+            }

+            container pro-active-near-end-dm-parameters {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the statistical near end performnace parameters.";

+            }

+            description "This object class represents the PM current data collected in a pro-active delay measurement job (using DMM/DMR).";

+        }

+        grouping eth-pro-active-lm-performance-data {

+            container pro-active-far-end-lm-parameters {

+                uses statistical-lm-performance-parameters;

+                description "This attribute contains the statistical far end performnace parameters.";

+            }

+            container pro-active-near-end-lm-parameters {

+                uses statistical-lm-performance-parameters;

+                description "This attribute contains the statistical near end performnace parameters.";

+            }

+            leaf bidirectional-uas {

+                type uint64;

+                description "This attribute contains the bidirectional UAS (unavailable seconds) detected in the monitoring interval.

+                    range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval.";

+            }

+            description "This object class represents the PM current data collected in a pro-active loss measurement job (using LMM/LMR or SLM/SLR).";

+        }

+        grouping eth-on-demand-1-dm-performance-data {

+            container on-demand-near-end-1-dm-parameters {

+                uses on-demand-dm-performance-parameters;

+                description "This attribute contains the results of an on-demand frame delay measurement job in the ingress direction.";

+            }

+            description "none";

+        }

+        grouping eth-on-demand-1-lm-performance-data {

+            container on-demand-near-end-1-lm-parameters {

+                uses on-demand-lm-performance-parameters;

+                description "This attribute contains the results of an on-demand synthetic loss measurement job in the ingress direction.";

+            }

+            description "none";

+        }

+        grouping eth-on-demand-dm-performance-data {

+            container on-demand-far-end-dm-parameters {

+                uses on-demand-dm-performance-parameters;

+                description "This attribute contains the results of an on-demand frame delay measurement job in the ingress direction.";

+            }

+            container on-demand-near-end-dm-parameters {

+                uses on-demand-dm-performance-parameters;

+                description "This attribute contains the results of an on-demand frame delay measurement job in the ingress direction.";

+            }

+            description "none";

+        }

+        grouping eth-on-demand-lm-performance-data {

+            container on-demand-far-end-lm-parameters {

+                uses on-demand-lm-performance-parameters;

+                description "This attribute contains the results of an on-demand synthetic loss measurement job in the egress direction.";

+            }

+            container on-demand-near-end-lm-parameters {

+                uses on-demand-lm-performance-parameters;

+                description "This attribute contains the results of an on-demand synthetic loss measurement job in the ingress direction.";

+            }

+            description "none";

+        }

+        grouping eth-pro-active-1way-measurement-job {

+            container pro-active-control-1way-source {

+                uses eth-pro-active-measurement-job-control-source;

+                description "none";

+            }

+            container pro-active-control-1way-sink {

+                uses eth-pro-active-measurement-job-control-sink;

+                description "none";

+            }

+            description "none";

+        }

+        grouping eth-pro-active-2way-measurement-job {

+            container pro-active-control-2way-source {

+                uses eth-pro-active-measurement-job-control-source;

+                description "none";

+            }

+            description "none";

+        }

+        grouping eth-on-demand-2way-measurement-job {

+            container on-demand-control-2way-source {

+                uses eth-on-demand-measurement-job-control-source;

+                description "none";

+            }

+            description "none";

+        }

+        grouping eth-on-demand-1way-measurement-job {

+            container on-demand-control-1way-source {

+                uses eth-on-demand-measurement-job-control-source;

+                description "none";

+            }

+            container on-demand-control-1way-sink {

+                uses eth-on-demand-measurement-job-control-sink;

+                description "none";

+            }

+            description "none";

+        }

+        grouping eth-1-dm-threshold-data {

+            container near-end-1-dm-cross-threshold {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the near end cross threshold values of the delay measurements.";

+            }

+            container near-end-1-dm-clear-threshold {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the near end clear threshold values of the delay measurements.";

+            }

+            description "This data type contains the threshold values for frame delay related 1-way measurements.";

+        }

+        grouping eth-1-lm-threshold-data {

+            container near-end-1-lm-cross-threshold {

+                uses statistical-lm-performance-parameters;

+                description "This attribute contains the near end cross threshold values of the loss measurements.";

+            }

+            container near-end-1-lm-clear-threshold {

+                uses statistical-lm-performance-parameters;

+                description "This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the near end clear threshold values of the loss measurements.";

+            }

+            description "This data type contains the threshold values for frame loss related 1-way measurements.";

+        }

+        grouping eth-dm-threshold-data {

+            container near-end-dm-cross-threshold {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the near end cross threshold values of the delay measurements.";

+            }

+            container near-end-dm-clear-threshold {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the near end clear threshold values of the delay measurements.";

+            }

+            container far-end-dm-cross-threshold {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the far end cross threshold values of the delay measurements.";

+            }

+            container far-end-dm-clear-threshold {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the far end clear threshold values of the delay measurements.";

+            }

+            container bi-dir-dm-cross-threshold {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the bidirectional cross threshold values of the delay measurements.";

+            }

+            container bi-dir-dm-clear-threshold {

+                uses statistical-dm-performance-parameters;

+                description "This attribute contains the bidirectional clear threshold values of the delay measurements.";

+            }

+            description "This data type contains the threshold values for frame delay related 2-way measurements.";

+        }

+        grouping eth-lm-threshold-data {

+            container near-end-lm-cross-threshold {

+                uses statistical-lm-performance-parameters;

+                description "This attribute contains the near end cross threshold values of the loss measurements.";

+            }

+            container near-end-lm-clear-threshold {

+                uses statistical-lm-performance-parameters;

+                description "This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the near end clear threshold values of the loss measurements.";

+            }

+            container far-end-lm-cross-threshold {

+                uses statistical-lm-performance-parameters;

+                description "This attribute contains the far end cross threshold values of the loss measurements.";

+            }

+            container far-end-lm-clear-threshold {

+                uses statistical-lm-performance-parameters;

+                description "This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the far end clear threshold values of the loss measurements.";

+            }

+            leaf bi-dir-lm-uas-cross-threshold {

+                type uint64;

+                description "This attribute contains the bidirectional cross threshold value of the UAS loss measurement.";

+            }

+            leaf bi-dir-lm-uas-clear-threshold {

+                type uint64;

+                description "This attribute is only valid for the UAS parameter working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the bidirectional clear threshold value of the UAS loss measurement.";

+            }

+            description "This data type contains the threshold values for frame loss related 2-way measurements.";

+        }

+        grouping eth-loopback-result-data {

+            leaf rec-lbr-frames {

+                type uint64;

+                config false;

+                description "G.8052: This parameter returns the total number of received LBR messages, including the out of order LBR frames.";

+            }

+            leaf out-of-order-lbr-frames {

+                type uint64;

+                config false;

+                description "G.8052: This parameter returns the number of LBR traffic unites (messages) that were received out of order (OO).";

+            }

+            leaf sent-lbm-frames {

+                type uint64;

+                config false;

+                description "G.8052: This parameter returns the total number of sent LBM frames.";

+            }

+            leaf crc-lbr-frames {

+                type uint64;

+                config false;

+                description "G.8052: This parameter returns the number of LBR frames where the CRC in the pattern failed.";

+            }

+            leaf ber-lbr-frames {

+                type uint64;

+                config false;

+                description "G.8052: This parameter returns the number of LBR frames where there was a bit error in the pattern.";

+            }

+            leaf-list detected-peer-mep {

+                type mac-address;

+                config false;

+                description "G.8052: This parameter returns the MAC addresses of the discovered peer MEPs of the subject MEP.";

+            }

+            description "none";

+        }

+        grouping eth-link-trace-result-data {

+            list result-list {

+                config false;

+                uses link-trace-result;

+                description "G.8052: This parameter returns the results of the LT process. It contains a list of the result received from the individual LTR frames.

+                    The result from the individual LTR frame include the Source Mac Address, the TTL, and TLV.";

+            }

+            description "none";

+        }

+        grouping eth-test-result-data {

+            leaf sent-tst-frames {

+                type uint64;

+                config false;

+                description "G.8052: This parameter returns the total number of sent TST frames.";

+            }

+            description "none";

+        }

+        grouping eth-oam-operation-common-pac {

+            leaf destination-address {

+                type mac-address;

+                description "G.8052: This parameter provides the destination address, i.e., the MAC Address of the target MEP or MIP.";

+            }

+            leaf priority {

+                type uint64;

+                default "7";

+                description "G.8052: This parameter provides the priority to be used in the LBM frame.";

+            }

+            description "none";

+        }

+        grouping eth-oam-msg-common-pac {

+            leaf period {

+                type oam-period;

+                description "G.8052: This parameter provides the periodicity of the TST OAM messages.";

+            }

+            leaf drop-eligibility {

+                type boolean;

+                description "G.8052: This parameter provides the eligibility of frames with unicast ETH-TST information to be discarded when congestion conditions are encountered.";

+            }

+            leaf data-tlv-length {

+                type uint64;

+                description "G.8052: This parameter provides the length (in number of octet) of the optional Data TLV to be included in the TST frame.";

+            }

+            leaf test-pattern {

+                type uint64;

+                description "G.8052: This parameter provides the test pattern to be used in the optional Data TLV.

+                    Examples of test patterns include pseudo-random bit sequence (PRBS) 2^31-1 as specified in clause 5.8 of [ITU-T O.150], all '0' pattern, etc.

+                    The following values of pattern types are defined:

+                    0: 'Null signal without CRC-32'

+                    1: 'Null signal with CRC-32'

+                    2: 'PRBS 2^31-1 without CRC-32'

+                    3: 'PRBS 2^31-1 with CRC-32'.";

+            }

+            uses eth-oam-operation-common-pac;

+            description "none";

+        }

+

+    /***********************

+    * package type-definitions

+    **********************/ 

+        identity ETH_OAM_JOB_TYPE {

+        	base tapi-oam:OAM_JOB_TYPE;

+            description "none";

+        }

+        identity ETH_OAM_JOB_TYPE_ETH_1DM {

+            base ETH_OAM_JOB_TYPE;

+            description "none";

+        }

+        identity ETH_OAM_JOB_TYPE_ETH_1SLM {

+            base ETH_OAM_JOB_TYPE;

+            description "none";

+        }

+        identity ETH_OAM_JOB_TYPE_ETH_LM_CCM {

+            base ETH_OAM_JOB_TYPE;

+            description "none";

+        }

+        identity ETH_OAM_JOB_TYPE_ETH_LM_LMM {

+            base ETH_OAM_JOB_TYPE;

+            description "none";

+        }

+        identity ETH_OAM_JOB_TYPE_ETH_SLM {

+            base ETH_OAM_JOB_TYPE;

+            description "none";

+        }

+        identity ETH_OAM_JOB_TYPE_ETH_DM {

+            base ETH_OAM_JOB_TYPE;

+            description "none";

+        }

+        identity ETH_OAM_JOB_TYPE_ETH_LTC {

+            base ETH_OAM_JOB_TYPE;

+            description "none";

+        }

+        identity ETH_OAM_JOB_TYPE_ETH_LBK {

+            base ETH_OAM_JOB_TYPE;

+            description "none";

+        }

+        identity ETH_OAM_JOB_TYPE_ETH_TEST {

+            base ETH_OAM_JOB_TYPE;

+            description "none";

+        }

+        grouping priority-configuration {

+            leaf priority {

+                type uint64 {

+                    range "0..7";

+                }

+                description "none";

+            }

+            leaf queue-id {

+                type uint64 {

+                    range "1..8";

+                }

+                description "none";

+            }

+            description "none";

+        }

+        grouping queue-configuration {

+            leaf queue-id {

+                type uint64;

+                description "This attribute indicates the queue id.";

+            }

+            leaf queue-depth {

+                type uint64;

+                description "This attribute defines the depth of the queue in bytes.";

+            }

+            leaf queue-threshold {

+                type uint64;

+                description "This attribute defines the threshold of the queue in bytes.";

+            }

+            description "none";

+        }

+        grouping traffic-conditioning-configuration {

+            leaf cir {

+                type uint64;

+                description "This attribute indicates the Committed Information Rate in bits/s.";

+            }

+            leaf cbs {

+                type uint64;

+                description "This attribute indicates the Committed Burst Size in bytes.";

+            }

+            leaf eir {

+                type uint64;

+                description "This attribute indicates the Excess Information Rate in bits/s.";

+            }

+            leaf ebs {

+                type uint64;

+                description "This attribute indicates the Excess Burst Size in bytes.";

+            }

+            leaf coupling-flag {

+                type boolean;

+                description "This attribute indicates the coupling flag.";

+            }

+            leaf colour-mode {

+                type colour-mode;

+                description "This attribute indicates the colour mode.";

+            }

+            leaf queue-id {

+                type uint64 {

+                    range "1..8";

+                }

+                description "This attribute indicates the queue id.";

+            }

+            description "none";

+        }

+        typedef mac-address {

+            type string;

+            description "This primitive data type contains an Ethernet MAC address defined by IEEE 802a. The format of the address consists of 12 hexadecimal characters, grouped in pairs and separated by '-' (e.g., 03-27-AC-75-3E-1D).";

+        }

+        grouping priority-mapping {

+            leaf priority-0 {

+                type uint64 {

+                    range "0..7";

+                }

+                description "This attribute defines the new priority value for the old priority value 0.";

+            }

+            leaf priority-1 {

+                type uint64 {

+                    range "0..7";

+                }

+                default "1";

+                description "This attribute defines the new priority value for the old priority value 1.";

+            }

+            leaf priority-2 {

+                type uint64 {

+                    range "0..7";

+                }

+                default "2";

+                description "This attribute defines the new priority value for the old priority value 2.";

+            }

+            leaf priority-3 {

+                type uint64 {

+                    range "0..7";

+                }

+                default "3";

+                description "This attribute defines the new priority value for the old priority value 3.";

+            }

+            leaf priority-4 {

+                type uint64 {

+                    range "0..7";

+                }

+                default "4";

+                description "This attribute defines the new priority value for the old priority value 4.";

+            }

+            leaf priority-5 {

+                type uint64 {

+                    range "0..7";

+                }

+                default "5";

+                description "This attribute defines the new priority value for the old priority value 5.";

+            }

+            leaf priority-6 {

+                type uint64 {

+                    range "0..7";

+                }

+                default "6";

+                description "This attribute defines the new priority value for the old priority value 6.";

+            }

+            leaf priority-7 {

+                type uint64 {

+                    range "0..7";

+                }

+                default "7";

+                description "This attribute defines the new priority value for the old priority value 7.";

+            }

+            description "This data type provides the priority mapping done in the 'P Regenerate' process defined in G.8021.";

+        }

+        typedef vid {

+            type string;

+            description "This primitive type models the 12 Bit VLAN identifier of a VLAN tag.";

+        }

+        typedef modify-cross-connection-data {

+            type string;

+            description "none";

+        }

+        grouping address-tuple {

+            leaf address {

+                type mac-address;

+                description "This attribute contains the MAC address of the address tuple.";

+            }

+            leaf-list port-list {

+                type mac-address;

+                description "This attribute contains the ports associated to the MAC address in the address tuple.";

+            }

+            description "This data type contains an address tuple consisting of a MAC address and a corresponding port list.";

+        }

+        typedef scheduling-configuration {

+            type string;

+            description "The syntax of this dataType is pending on the specification in G.8021, which is for further study.";

+        }

+        grouping control-frame-filter {

+            leaf c-2-00-00-10 {

+                type boolean;

+                description "This attribute identifies the 'All LANs Bridge Management Group Address'.";

+            }

+            leaf c-2-00-00-00 {

+                type boolean;

+                description "This attribute identifies the STP/RSTP/MSTP protocol address.";

+            }

+            leaf c-2-00-00-01 {

+                type boolean;

+                description "This attribute identifies the IEEE MAC-specific Control Protocols group address (PAUSE protocol).";

+            }

+            leaf c-2-00-00-02 {

+                type boolean;

+                description "This attribute identifies the IEEE 802.3 Slow_Protocols_Multicast address (LACP/LAMP or Link OAM protocols).";

+            }

+            leaf c-2-00-00-03 {

+                type boolean;

+                description "This attribute identifies the Nearest non-TPMR Bridge group address (Port Authentication protocol).";

+            }

+            leaf c-2-00-00-04 {

+                type boolean;

+                description "This attribute identifies the IEEE MAC-specific Control Protocols group address.";

+            }

+            leaf c-2-00-00-05 {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-06 {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-07 {

+                type boolean;

+                description "This attribute identifies the Metro Ethernet Forum E-LMI protocol group address.";

+            }

+            leaf c-2-00-00-08 {

+                type boolean;

+                description "This attribute identifies the Provider Bridge Group address.";

+            }

+            leaf c-2-00-00-09 {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-0-a {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-0-b {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-0-c {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-0-d {

+                type boolean;

+                description "This attribute identifies the Provider Bridge MVRP address.";

+            }

+            leaf c-2-00-00-0-e {

+                type boolean;

+                description "This attribute identifies the Individual LAN Scope group address, Nearest Bridge group address (LLDP protocol).";

+            }

+            leaf c-2-00-00-0-f {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-20 {

+                type boolean;

+                description "This attribute identifies the Customer and Provider Bridge MMRP address.";

+            }

+            leaf c-2-00-00-21 {

+                type boolean;

+                description "This attribute identifies the Customer Bridge MVRP address.";

+            }

+            leaf c-2-00-00-22 {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-23 {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-24 {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-25 {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-26 {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-27 {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-28 {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-29 {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-2-a {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-2-b {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-2-c {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-2-d {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-2-e {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            leaf c-2-00-00-2-f {

+                type boolean;

+                description "Reserved for future standardization.";

+            }

+            description "This data type identifies the filter action for each of the 33 group MAC addresses (control frames).

+                Value 'false' means block: The frame is discarded by the filter process.

+                Value 'true' means pass: The frame is passed unchanged through the filter process.";

+        }

+        grouping bandwidth-report {

+            leaf source-mac-address {

+                type mac-address;

+                description "The sourceMacAddress is the address from the far end.";

+            }

+            leaf port-id {

+                type uint64;

+                description "This attribute returns the far end port identifier.";

+            }

+            leaf nominal-bandwidth {

+                type uint64;

+                description "This attribute returns the configured bandwidth";

+            }

+            leaf current-bandwidth {

+                type uint64;

+                description "This attribute returns the current bandwidth.";

+            }

+            description "Data type for the bandwidth report.";

+        }

+        typedef admin-state {

+            type enumeration {

+                enum LOCK {

+                    description "none";

+                }

+                enum NORMAL {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        typedef colour-mode {

+            type enumeration {

+                enum COLOUR_BLIND {

+                    description "none";

+                }

+                enum COLOUR_AWARE {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        typedef csf-config {

+            type enumeration {

+                enum DISABLED {

+                    description "This literal covers the following states of the CSF related MI informations:

+                        - MI_CSF_Enable is false

+                        - MI_CSFrdifdi_Enable is false

+                        - MI_CSFdci_Enable is false.";

+                }

+                enum ENABLED {

+                    description "This literal covers the following states of the CSF related MI informations:

+                        - MI_CSF_Enable is true

+                        - MI_CSFrdifdi_Enable is false

+                        - MI_CSFdci_Enable is false.";

+                }

+                enum ENABLED_WITH_RDI_FDI {

+                    description "This literal covers the following states of the CSF related MI informations:

+                        - MI_CSF_Enable is true

+                        - MI_CSFrdifdi_Enable is true

+                        - MI_CSFdci_Enable is false.";

+                }

+                enum ENABLED_WITH_RDI_FDI_DCI {

+                    description "This literal covers the following states of the CSF related MI informations:

+                        - MI_CSF_Enable is true

+                        - MI_CSFrdifdi_Enable is true

+                        - MI_CSFdci_Enable is true.";

+                }

+                enum ENABLED_WITH_DCI {

+                    description "This literal covers the following states of the CSF related MI informations:

+                        - MI_CSF_Enable is true

+                        - MI_CSFrdifdi_Enable is false

+                        - MI_CSFdci_Enable is true.";

+                }

+            }

+            description "none";

+        }

+        typedef ety-phy-type {

+            type enumeration {

+                enum OTHER {

+                    description "none";

+                }

+                enum UNKNOWN {

+                    description "none";

+                }

+                enum NONE {

+                    description "none";

+                }

+                enum 2BASE_TL {

+                    description "none";

+                }

+                enum 10MBIT_S {

+                    description "none";

+                }

+                enum 10PASS_TS {

+                    description "none";

+                }

+                enum 100BASE_T4 {

+                    description "none";

+                }

+                enum 100BASE_X {

+                    description "none";

+                }

+                enum 100BASE_T2 {

+                    description "none";

+                }

+                enum 1000BASE_X {

+                    description "none";

+                }

+                enum 1000BASE_T {

+                    description "none";

+                }

+                enum 10GBASE-X {

+                    description "none";

+                }

+                enum 10GBASE_R {

+                    description "none";

+                }

+                enum 10GBASE_W {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        typedef frame-type {

+            type enumeration {

+                enum ADMIT_ONLY_VLAN_TAGGED_FRAMES {

+                    description "none";

+                }

+                enum ADMIT_ONLY_UNTAGGED_AND_PRIORITY_TAGGED_FRAMES {

+                    description "none";

+                }

+                enum ADMIT_ALL_FRAMES {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        typedef oam-period {

+            type enumeration {

+                enum 3_33MS {

+                    description "Default for protection.";

+                }

+                enum 10MS {

+                    description "none";

+                }

+                enum 100MS {

+                    description "none";

+                }

+                enum 1S {

+                    description "none";

+                }

+                enum 10S {

+                    description "none";

+                }

+                enum 1MIN {

+                    description "none";

+                }

+                enum 10MIN {

+                    description "none";

+                }

+            }

+            description "Provides the frequency for the OAM PDU insertion.";

+        }

+        typedef pcp-coding {

+            type enumeration {

+                enum 8P0D {

+                    description "none";

+                }

+                enum 7P1D {

+                    description "none";

+                }

+                enum 6P2D {

+                    description "none";

+                }

+                enum 5P3D {

+                    description "none";

+                }

+                enum DEI {

+                    description "This enumeration value means that all priorities should be drop eligible.

+                        DEI = Drop Eligibility Indicator";

+                }

+            }

+            description "This enum models the coding of the Priority Code Point as defined in section 'Priority Code Point encoding' of IEEE 802.1Q.";

+        }

+        typedef vlan-type {

+            type enumeration {

+                enum C_Tag {

+                    description "0x8100";

+                }

+                enum S_Tag {

+                    description "0x88a8";

+                }

+                enum I_Tag {

+                    description "88-e7";

+                }

+            }

+            description "This enumeration contains the Ethertypes defined in IEEE 802.1Q.";

+        }

+        typedef repetition-period {

+            type enumeration {

+                enum 1MIN {

+                    description "none";

+                }

+                enum 1S {

+                    description "none";

+                }

+                enum 10S {

+                    description "none";

+                }

+                enum 0 {

+                    description "none";

+                }

+            }

+            description "This enumeration defines the allowed values for the repetition period in on-demand measurements.

+                Note: The value 0 means that the value is not relevant.";

+        }

+        typedef message-period {

+            type enumeration {

+                enum 10MS {

+                    description "none";

+                }

+                enum 100MS {

+                    description "none";

+                }

+                enum 1S {

+                    description "none";

+                }

+                enum 10S {

+                    description "none";

+                }

+                enum 0 {

+                    description "none";

+                }

+            }

+            description "This enumeration defines the allowed values for the message period in on-demand measurements.

+                Notes:

+                The value 10ms is only used in synthetic loss measurements.

+                The value 0 means that the value is not relevant.";

+        }

+        typedef oam-pdu-generation-type {

+            type enumeration {

+                enum SINGLE_INSTANCE {

+                    description "none";

+                }

+                enum REPETITIVE_INSTANCE {

+                    description "none";

+                }

+                enum SINGLE_SERIES {

+                    description "none";

+                }

+                enum REPETITIVE_SERIES {

+                    description "none";

+                }

+            }

+            description "This enumeration defines the generation pattern of the on-demand OAM PDUs (messages). ";

+        }

+        grouping on-demand-dm-performance-parameters {

+            leaf number-of-samples {

+                type uint64;

+                description "This attribute contains the number of received DM frames (successful samples) used for this frame delay measurement.

+                    range of type : non-negative";

+            }

+            leaf-list frame-delay-list {

+                type uint64;

+                description "This attribute contains the frame delays measured in ns (nano second, 1x10e-9 seconds). The multiplicity is defined by the numberOfSamples attribute.";

+            }

+            leaf-list frame-delay-variation-list {

+                type uint64;

+                description "This attribute contains the frame delay variations measured in ns (nano second).  The multiplicity is defined by (numberOfSamples - 1, for numberOfSamples > 0).";

+            }

+            description "This data type contains the results of an on-demand delay measurement job.";

+        }

+        grouping on-demand-lm-performance-parameters {

+            leaf total-transmitted-frames {

+                type uint64;

+                description "This attribute contains the total number of frames transmitted.";

+            }

+            leaf total-lost-frames {

+                type uint64;

+                description "This attribute contains the total number of frames lost.";

+            }

+            leaf total-frame-loss-ratio {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "This attribute contains the frame loss ratio (number of lost frames divided by the number of total frames (N_LF / N_TF)).

+                    The accuracy of the value is for further study.";

+            }

+            description "This data type contains the results of an on-demand loss measurement job.";

+        }

+        grouping statistical-dm-performance-parameters {

+            leaf minimum-frame-delay {

+                type uint64;

+                description "This attribute contains the minimum frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds).";

+            }

+            leaf average-frame-delay {

+                type uint64;

+                description "This attribute contains the average frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds).";

+            }

+            leaf maximum-frame-delay {

+                type uint64;

+                description "This attribute contains the maximum frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds).";

+            }

+            leaf minimum-frame-delay-variation {

+                type uint64;

+                description "This attribute contains the minimum frame delay variation measured in units of ns (nano second, 1x10e-9 seconds).";

+            }

+            leaf average-frame-delay-variation {

+                type uint64;

+                description "This attribute contains the average frame delay variation measured in units of ns (nano second, 1x10e-9 seconds).";

+            }

+            leaf maximum-frame-delay-variation {

+                type uint64;

+                description "This attribute contains the maximum frame delay variation measured in units of ns (nano second, 1x10e-9 seconds).";

+            }

+            description "This data type contains the statistical delay measurement performance parameters.";

+        }

+        grouping statistical-lm-performance-parameters {

+            leaf minimum-frame-loss-ratio {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "This attribute contains the minimum frame loss ratio calculated over a period of time.

+                    The accuracy of the value is for further study.";

+            }

+            leaf average-frame-loss-ratio {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "This attribute contains the average frame loss ratio calculated over a period of time.

+                    The accuracy of the value is for further study.";

+            }

+            leaf maximum-frame-loss-ratio {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "This attribute contains the maximum frame loss ratio calculated over a period of time.

+                    The accuracy of the value is for further study.";

+            }

+            leaf ses {

+                type uint64;

+                description "This attribute contains the SES detected in the monitoring interval.

+                    range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval.";

+            }

+            leaf uas {

+                type uint64;

+                description "This attribute contains UAS (unavailable seconds) detected in the monitoring interval.

+                    range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval.";

+            }

+            description "This data type contains the statistical loss measurement performance parameters.";

+        }

+        typedef eth-oam-job-type {

+            type identityref {

+                base ETH_OAM_JOB_TYPE;

+            }

+            description "none";

+        }

+        grouping link-trace-result {

+            leaf source-address {

+                type mac-address;

+                description "G.8052: This attribute contains the source MAC Address of an individual LTR frame result.";

+            }

+            leaf time-to-live {

+                type uint64;

+                description "G.8052: This attribute contains the Time To Live (TTL) value of an individual LTR frame result.";

+            }

+            leaf data-tlv-length {

+                type uint64;

+                description "G.8052: This attribute contains the length (in number of octets) of the Data TLV of an individual LTR frame result.";

+            }

+            description "G.8052: This data type contains the result from an individual LTR frame.";

+        }

+

+}

diff --git a/models/tapi/src/main/yang/tapi-notification@2018-03-07.yang b/models/tapi/src/main/yang/tapi-notification@2018-10-16.yang
similarity index 86%
rename from models/tapi/src/main/yang/tapi-notification@2018-03-07.yang
rename to models/tapi/src/main/yang/tapi-notification@2018-10-16.yang
index 4447e29..b4a5bc7 100644
--- a/models/tapi/src/main/yang/tapi-notification@2018-03-07.yang
+++ b/models/tapi/src/main/yang/tapi-notification@2018-10-16.yang
@@ -5,39 +5,59 @@
         prefix tapi-common;

     }

     organization "ONF OTCC (Open Transport Configuration & Control) Project";

-    contact "
-        Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-        Project List: <mailto:transport-api@opennetworking.org>
-        Editor: Karthik Sethuraman
-                <mailto:karthik.sethuraman@necam.com>";

+    contact "

+         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>

+         Project List: <mailto:transport-api@opennetworking.org>

+         Editor: Karthik Sethuraman

+                 <mailto:karthik.sethuraman@necam.com>";

     description "

         This module contains TAPI Notification Model definitions.

         Source: TapiNotification.uml

         Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

         License: This module is distributed under the Apache License 2.0";

+    revision 2018-10-16 {

+        description "ONF Transport API version 2.1.0.

+          - The TAPI YANG models included in this TAPI release (v2.1.0) are a *normative* part of the TAPI SDK.

+          - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]

+            <https://github.com/OpenNetworkingFoundation/EagleUmlYang>

+            and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]

+            <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>

+          - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.

+            As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.

+          - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.

+            The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.

+            YANG models included in this release are not backward compatible with previous TAPI releases.

+          - Changes included in this TAPI release (v2.1.0) are listed in

+            <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";

+    }

     revision 2018-03-07 {

-        description "ONF Transport API version 2.0.2

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.2
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

     }

     revision 2018-02-16 {

-        description "ONF Transport API version 2.0.1

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.1
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

     }

     revision 2018-01-02 {

-        description "ONF Transport API version 2.0.0

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.0
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

     }

     augment "/tapi-common:context" {

-        uses notification-context;

+        container notification-context {

+            uses notification-context;

+            description "Augments the base TAPI Context with NotificationService information";

+        }

         description "Augments the base TAPI Context with NotificationService information";

     }

     /***********************

@@ -207,8 +227,8 @@
                 config false;

                 description "none";

             }

-            leaf pervceived-severity {

-                type perceived-serverity-type;

+            leaf perceived-severity {

+                type perceived-severity-type;

                 config false;

                 description "none";

             }

@@ -243,6 +263,18 @@
                 config false;

                 description "none";

             }

+            leaf perceived-severity {

+                type perceived-tca-severity;

+                description "none";

+            }

+            leaf measurement-interval {

+                type tapi-common:date-and-time;

+                description "none";

+            }

+            leaf suspect-interval-flag {

+                type boolean;

+                description "none";

+            }

             description "none";

         }

 

@@ -349,6 +381,9 @@
                 enum RULE {

                     description "none";

                 }

+                enum OAM_JOB {

+                    description "none";

+                }

             }

             description "The list of TAPI Global Object Class types on which Notifications can be raised.";

         }

@@ -377,7 +412,7 @@
             }

             description "none";

         }

-        typedef perceived-serverity-type {

+        typedef perceived-severity-type {

             type enumeration {

                 enum CRITICAL {

                     description "none";

@@ -425,6 +460,17 @@
             }

             description "none";

         }

+        typedef perceived-tca-severity {

+            type enumeration {

+                enum WARNING {

+                    description "none";

+                }

+                enum CLEAR {

+                    description "none";

+                }

+            }

+            description "none";

+        }

 

     /***********************

     * package interfaces

diff --git a/models/tapi/src/main/yang/tapi-oam@2018-03-07.yang b/models/tapi/src/main/yang/tapi-oam@2018-03-07.yang
deleted file mode 100644
index 261f5f0..0000000
--- a/models/tapi/src/main/yang/tapi-oam@2018-03-07.yang
+++ /dev/null
@@ -1,341 +0,0 @@
-module tapi-oam {

-    namespace "urn:onf:otcc:yang:tapi-oam";

-    prefix tapi-oam;

-    import tapi-common {

-        prefix tapi-common;

-    }

-    import tapi-connectivity {

-        prefix tapi-connectivity;

-    }

-    import tapi-topology {

-        prefix tapi-topology;

-    }

-    organization "ONF OTCC (Open Transport Configuration & Control) Project";

-    contact "
-        Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-        Project List: <mailto:transport-api@opennetworking.org>
-        Editor: Karthik Sethuraman
-                <mailto:karthik.sethuraman@necam.com>";

-    description "

-        This module contains TAPI OAM Model definitions.

-        Source: TapiOam.uml

-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

-        License: This module is distributed under the Apache License 2.0";

-    revision 2018-03-07 {

-        description "ONF Transport API version 2.0.2

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

-    }

-    revision 2018-02-16 {

-        description "ONF Transport API version 2.0.1

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

-    }

-    revision 2018-01-02 {

-        description "ONF Transport API version 2.0.0

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

-    }

-    augment "/tapi-common:context" {

-        uses oam-context;

-        description "Augments the base TAPI Context with OamService information";

-    }

-    augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {

-        uses mep-mip-list;

-        description "none";

-    }

-    augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {

-        uses mep-mip-list;

-        description "none";

-    }

-    

-    /*************************

-    * definitions of references

-    *************************/

-    grouping oam-service-ref {

-        leaf oam-service-id {

-            type leafref {

-                path '/tapi-common:context/tapi-oam:oam-service/tapi-oam:uuid';

-            }

-            description "none";

-        }

-        description "none";

-    }

-

-    grouping oam-service-end-point-ref {

-    	uses oam-service-ref;

-    	leaf oam-service-end-point-id {

-	    	type leafref {

-	            path '/tapi-common:context/tapi-oam:oam-service/tapi-oam:end-point/tapi-oam:local-id';

-	        }

-	    	description "none";

-    	}

-    	description "none";

-    }

-    grouping meg-ref {

-        leaf meg-id {

-            type leafref {

-            	path '/tapi-common:context/tapi-oam:meg/tapi-oam:uuid';

-            }

-            description "none";

-        }

-        description "none";

-    }

-

-    grouping mep-ref {

-    	uses meg-ref;

-        leaf mep-id {

-            type leafref {

-            	path '/tapi-common:context/tapi-oam:meg/tapi-oam:mep/tapi-oam:local-id';

-            }

-            description "none";

-        }

-        description "none";

-    }

-    

-    grouping mip-ref {

-    	uses meg-ref;

-        leaf mip-id {

-            type leafref {

-            	path '/tapi-common:context/tapi-oam:meg/tapi-oam:mip/tapi-oam:local-id';

-            }

-            description "none";

-        }

-        description "none";

-    }

-    

-    grouping me-ref {

-    	uses meg-ref;

-        leaf me-id {

-            type leafref {

-            	path '/tapi-common:context/tapi-oam:meg/tapi-oam:me/tapi-oam:local-id';

-            }

-            description "none";

-        }

-        description "none";

-    }

-    

-    /***********************

-    * package object-classes

-    **********************/ 

-        grouping mep {

-            leaf-list on-demand-measurement-job {

-                type leafref {

-                    path '/tapi-common:context/tapi-oam:oam-service/tapi-oam:end-point/tapi-oam:on-demand-measurement-job/tapi-oam:local-id';

-                }

-                config false;

-                description "none";

-            }

-            leaf-list pro-active-measurement-job {

-                type leafref {

-                    path '/tapi-common:context/tapi-oam:oam-service/tapi-oam:end-point/tapi-oam:pro-active-measurement-job/tapi-oam:local-id';

-                }

-                config false;

-                description "none";

-            }

-            leaf layer-protocol-name {

-                type tapi-common:layer-protocol-name;

-                config false;

-                description "none";

-            }

-            leaf meg-identifier {

-                type string;

-                config false;

-                description "none";

-            }

-            leaf mep-identifier {

-                type string;

-                config false;

-                description "none";

-            }

-            leaf-list peer-mep-identifier {

-                type string;

-                config false;

-                min-elements 1;

-                description "none";

-            }

-            leaf monitored-direction {

-                type tapi-common:termination-direction;

-                description "none";

-            }

-            uses tapi-common:local-class;

-            description "none";

-        }

-        grouping on-demand-measurement-job {

-            uses tapi-common:local-class;

-            uses tapi-common:admin-state-pac;

-            description "none";

-        }

-        grouping pro-active-measurement-job {

-            uses tapi-common:local-class;

-            uses tapi-common:admin-state-pac;

-            description "none";

-        }

-        grouping meg {

-            list me {

-                key 'local-id';

-                config false;

-                min-elements 1;

-                uses me;

-                description "none";

-            }

-            list mep {

-                key 'local-id';

-                config false;

-                uses mep;

-                description "1. ME may have 0 MEPs (case of transit domains where at least 1 MIP is present)

-                    2. ME may have 1 MEP (case of edge domaind, where the peer MEP is ouside the managed domain)

-                    3. ME may have 2 MEPs";

-            }

-            list mip {

-                key 'local-id';

-                config false;

-                uses mip;

-                description "ME may 0, 1, or more MIPs";

-            }

-            leaf meg-level {

-                type uint64;

-                config false;

-                description "none";

-            }

-            uses tapi-common:resource-spec;

-            description "none";

-        }

-        grouping me {

-            list mep {

-                uses mep-ref;

-                key 'meg-id mep-id';

-                config false;

-                max-elements 2;

-                description "none";

-            }

-            list mip {

-            	uses mip-ref;

-                key 'meg-id mip-id';

-                config false;

-                description "none";

-            }

-            container connection-route {

-            	uses tapi-connectivity:route-ref;

-                config false;

-                description "none";

-            }

-            uses tapi-common:local-class;

-            description "none";

-        }

-        grouping mip {

-            leaf layer-protocol-name {

-                type tapi-common:layer-protocol-name;

-                config false;

-                description "none";

-            }

-            uses tapi-common:local-class;

-            description "none";

-        }

-        grouping oam-service {

-            container meg {

-            	uses meg-ref;

-                config false;

-                description "none";

-            }

-            list end-point {

-                key 'local-id';

-                min-elements 1;

-                uses oam-service-end-point;

-                description "none";

-            }

-            uses tapi-common:service-spec;

-            description "none";

-        }

-        grouping oam-context {

-            list oam-service {

-                key 'uuid';

-                uses oam-service;

-                description "none";

-            }

-            list meg {

-                key 'uuid';

-                config false;

-                uses meg;

-                description "none";

-            }

-            description "none";

-        }

-        grouping oam-service-end-point {

-        	container service-interface-point {

-                uses tapi-common:service-interface-point-ref;

-                description "none";

-            }

-        	container connectivity-service-end-point {

-                uses tapi-connectivity:connectivity-service-end-point-ref;

-                description "none";

-            }

-            list pro-active-measurement-job {

-                key 'local-id';

-                uses pro-active-measurement-job;

-                description "none";

-            }

-            list on-demand-measurement-job {

-                key 'local-id';

-                uses on-demand-measurement-job;

-                description "none";

-            }

-            container associated-mep {

-                uses mep-ref;

-                config false;

-                description "none";

-            }

-            leaf direction {

-                type tapi-common:port-direction;

-                config false;

-                description "none";

-            }

-            uses tapi-common:local-class;

-            description "none";

-        }

-        grouping mep-mip-list {

-            list mip {

-            	uses mip-ref;

-                key 'meg-id mip-id';

-                description "none";

-            }

-            list mep {

-            	uses mep-ref;

-                key 'meg-id mep-id';

-                description "none";

-            }

-            description "none";

-        }

-

-    /***********************

-    * package interfaces

-    **********************/ 

-        rpc abort-measurement-job {

-            description "none";

-        }

-        rpc disable-pro-active-measurement-job {

-            description "none";

-        }

-        rpc enable-pro-active-measurement-job {

-            description "none";

-        }

-        rpc establish-measurement-job {

-            description "none";

-        }

-        rpc get-contained-measurement-jobs {

-            description "none";

-        }

-        rpc terminate-measurement-job {

-            description "none";

-        }

-        rpc get-all-contained-meg {

-            description "none";

-        }

-

-}

diff --git a/models/tapi/src/main/yang/tapi-oam@2018-10-16.yang b/models/tapi/src/main/yang/tapi-oam@2018-10-16.yang
new file mode 100644
index 0000000..baadabf
--- /dev/null
+++ b/models/tapi/src/main/yang/tapi-oam@2018-10-16.yang
@@ -0,0 +1,826 @@
+module tapi-oam {

+    namespace "urn:onf:otcc:yang:tapi-oam";

+    prefix tapi-oam;

+    import tapi-common {

+        prefix tapi-common;

+    }

+    import tapi-connectivity {

+        prefix tapi-connectivity;

+    }

+    import tapi-topology {

+        prefix tapi-topology;

+    }

+    organization "ONF OTCC (Open Transport Configuration & Control) Project";

+    contact "

+         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>

+         Project List: <mailto:transport-api@opennetworking.org>

+         Editor: Karthik Sethuraman

+                 <mailto:karthik.sethuraman@necam.com>";

+    description "

+        This module contains TAPI OAM Model definitions.

+        Source: TapiOam.uml

+        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

+        License: This module is distributed under the Apache License 2.0";

+    revision 2018-10-16 {

+        description "ONF Transport API version 2.1.0.

+          - The TAPI YANG models included in this TAPI release (v2.1.0) are a *normative* part of the TAPI SDK.

+          - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]

+            <https://github.com/OpenNetworkingFoundation/EagleUmlYang>

+            and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]

+            <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>

+          - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.

+            As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.

+          - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.

+            The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.

+            YANG models included in this release are not backward compatible with previous TAPI releases.

+          - Changes included in this TAPI release (v2.1.0) are listed in

+            <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";

+    }

+    revision 2018-03-07 {

+        description "ONF Transport API version 2.0.2
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

+    }

+    revision 2018-02-16 {

+        description "ONF Transport API version 2.0.1
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

+    }

+    revision 2018-01-02 {

+        description "ONF Transport API version 2.0.0
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

+    }

+    augment "/tapi-common:context" {

+        container oam-context {

+            uses oam-context;

+            description "Augments the base TAPI Context with OamService information";

+        }

+        description "Augments the base TAPI Context with OamService information";

+    }

+    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {

+    	container mep-mip-list {

+            uses mep-mip-list;

+            description "none";

+        }

+        description "none";

+    }

+    

+    /*************************

+    * definitions of references

+    *************************/

+    grouping oam-service-ref {

+        leaf oam-service-uuid {

+            type leafref {

+                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-service/tapi-oam:uuid';

+            }

+            description "none";

+        }

+        description "none";

+    }

+

+    grouping oam-service-end-point-ref {

+    	uses oam-service-ref;

+    	leaf oam-service-end-point-local-id {

+	    	type leafref {

+	            path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-service/tapi-oam:end-point/tapi-oam:local-id';

+	        }

+	    	description "none";

+    	}

+    	description "none";

+    }

+    

+    grouping meg-ref {

+        leaf meg-uuid {

+            type leafref {

+                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:uuid';

+            }

+            description "none";

+        }

+        description "none";

+    }

+    

+    grouping maintenance-entity-ref {

+    	uses meg-ref;

+    	leaf maintenance-entity-local-id {

+	    	type leafref {

+	            path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:me/tapi-oam:local-id';

+	        }

+	    	description "none";

+    	}

+    	description "none";

+    }

+    

+    grouping mep-ref {

+    	uses meg-ref;

+    	leaf mep-local-id {

+	    	type leafref {

+	            path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mep/tapi-oam:local-id';

+	        }

+	    	description "none";

+    	}

+    	description "none";

+    }

+    

+    grouping mip-ref {

+    	uses meg-ref;

+    	leaf mip-local-id {

+	    	type leafref {

+	            path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mip/tapi-oam:local-id';

+	        }

+	    	description "none";

+    	}

+    	description "none";

+    }

+    

+    grouping oam-job-ref {

+        leaf oam-job-uuid {

+            type leafref {

+                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:uuid';

+            }

+            description "none";

+        }

+        description "none";

+    }

+    

+    grouping pm-current-data-ref {

+    	uses oam-job-ref;

+    	leaf pm-current-data-local-id {

+	    	type leafref {

+	            path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:local-id';

+	        }

+	    	description "none";

+    	}

+    	description "none";

+    }

+    

+    grouping pm-history-data-ref {

+    	uses pm-current-data-ref;

+    	leaf pm-history-data-local-id {

+	    	type leafref {

+	            path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data/tapi-oam:local-id';

+	        }

+	    	description "none";

+    	}

+    	description "none";

+    }

+    

+    grouping oam-profile-ref {

+        leaf oam-profile-uuid {

+            type leafref {

+                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:uuid';

+            }

+            description "none";

+        }

+        description "none";

+    }

+    

+    grouping pm-threshold-data-ref {

+    	uses oam-profile-ref;

+    	leaf pm-threshold-data-local-id {

+	    	type leafref {

+	            path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data/tapi-oam:local-id';

+	        }

+	    	description "none";

+    	}

+    	description "none";

+    }

+    

+    grouping pm-bin-data-ref {

+    	uses oam-profile-ref;

+    	leaf pm-bin-data-local-id {

+	    	type leafref {

+	            path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-bin-data/tapi-oam:local-id';

+	        }

+	    	description "none";

+    	}

+    	description "none";

+    }

+    

+    /***********************

+    * package object-classes

+    **********************/ 

+        grouping mep {

+            leaf layer-protocol-name {

+                type tapi-common:layer-protocol-name;

+                config false;

+                description "none";

+            }

+            leaf direction {

+                type tapi-common:termination-direction;

+                config false;

+                description "none";

+            }

+            leaf mep-identifier {

+                type string;

+                config false;

+                description "none";

+            }

+            leaf-list peer-mep-identifier {

+                type string;

+                config false;

+                min-elements 1;

+                description "none";

+            }

+            uses tapi-common:local-class;

+            uses tapi-common:operational-state-pac;

+            description "none";

+        }

+        grouping oam-job {

+            list oam-service-end-point {

+            	uses oam-service-end-point-ref;

+            	key 'oam-service-uuid oam-service-end-point-local-id';

+            	min-elements 1;

+                description "none";

+            }

+            container oam-profile {

+                uses oam-profile-ref;

+                description "none";

+            }

+            list pm-current-data {

+                key 'local-id';

+                config false;

+                uses pm-current-data;

+                description "Granularity period of the CurrentData identifies the specific CurrentData instance in the scope of this OamJob.

+                    For example, typically at least

+                    one 15min and

+                    one 24hr;

+                    optionally one additional configurable (< 15min)";

+            }

+            leaf oam-job-type {

+                type oam-job-type;

+                description "none";

+            }

+            container schedule {

+                uses tapi-common:time-range;

+                description "none";

+            }

+            leaf creation-time {

+                type tapi-common:date-and-time;

+                config false;

+                description "none";

+            }

+            uses tapi-common:global-class;

+            uses tapi-common:admin-state-pac;

+            description "none";

+        }

+        grouping meg {

+            list mep {

+                key 'local-id';

+                config false;

+                uses mep;

+                description "1. ME may have 0 MEPs (case of transit domains where at least 1 MIP is present)

+                    2. ME may have 1 MEP (case of edge domaind, where the peer MEP is ouside the managed domain)

+                    3. ME may have 2 MEPs";

+            }

+            list mip {

+                key 'local-id';

+                config false;

+                uses mip;

+                description "ME may 0, 1, or more MIPs";

+            }

+            leaf layer-protocol-name {

+                type tapi-common:layer-protocol-name;

+                config false;

+                description "none";

+            }

+            leaf direction {

+                type tapi-common:forwarding-direction;

+                config false;

+                description "none";

+            }

+            leaf meg-level {

+                type uint64;

+                config false;

+                description "none";

+            }

+            leaf meg-identifier {

+                type string;

+                config false;

+                description "none";

+            }

+            uses tapi-common:resource-spec;

+            uses tapi-common:operational-state-pac;

+            description "none";

+        }

+        grouping mip {

+            leaf layer-protocol-name {

+                type tapi-common:layer-protocol-name;

+                config false;

+                description "none";

+            }

+            uses tapi-common:local-class;

+            description "none";

+        }

+        grouping oam-service {

+            list end-point {

+                key 'local-id';

+                min-elements 2;

+                uses oam-service-end-point;

+                description "none";

+            }

+            container meg {

+                uses meg-ref;

+                config false;

+                description "none";

+            }

+            container oam-profile {

+                uses oam-profile-ref;

+                description "none";

+            }

+            uses tapi-common:service-spec;

+            uses tapi-common:admin-state-pac;

+            uses oam-constraint;

+            description "none";

+        }

+        grouping oam-context {

+            list oam-service {

+                key 'uuid';

+                uses oam-service;

+                description "none";

+            }

+            list meg {

+                key 'uuid';

+                config false;

+                uses meg;

+                description "none";

+            }

+            list oam-job {

+                key 'uuid';

+                uses oam-job;

+                description "none";

+            }

+            list oam-profile {

+                key 'uuid';

+                uses oam-profile;

+                description "none";

+            }

+            description "none";

+        }

+        grouping oam-service-end-point {

+            container service-interface-point {

+                uses tapi-common:service-interface-point-ref;

+                description "none";

+            }

+            container connectivity-service-end-point {

+                uses tapi-connectivity:connectivity-service-end-point-ref;

+                description "none";

+            }

+            container mep {

+                uses mep-ref;

+                config false;

+                description "none";

+            }

+            container mip {

+                uses mip-ref;

+                config false;

+                description "none";

+            }

+            leaf layer-protocol-name {

+                type tapi-common:layer-protocol-name;

+                description "none";

+            }

+            leaf direction {

+                type tapi-common:port-direction;

+                description "none";

+            }

+            leaf mep-identifier {

+                type string;

+                description "This attribute contains the identifier of the MEP.

+                    This attribute is empty in case the OSEP relates to the provisioing of an MIP.

+                    ";

+            }

+            leaf-list peer-mep-identifier {

+                type string;

+                description "This attribute models the MI_PeerMEP_ID[i] defined in G.8021 and configured as specified in G.8051. It provides the identifiers of the MEPs which are peer to the subject MEP.

+                    This attribute is not specified in case the OSEP relates to the provisioing of an MIP.

+                    In case of P2P, there is only one peer";

+            }

+            uses tapi-common:local-class;

+            uses tapi-common:admin-state-pac;

+            description "none";

+        }

+        grouping mep-mip-list {

+            list mip {

+                uses mip-ref;

+                key 'meg-uuid mip-local-id';

+                description "none";

+            }

+            list mep {

+                uses mep-ref;

+                key 'meg-uuid mep-local-id';

+                description "none";

+            }

+            description "none";

+        }

+        grouping oam-constraint {

+            leaf layer-protocol-name {

+                type tapi-common:layer-protocol-name;

+                description "none";

+            }

+            leaf direction {

+                type tapi-common:forwarding-direction;

+                description "none";

+            }

+            leaf meg-level {

+                type uint64;

+                description "none";

+            }

+            description "none";

+        }

+        grouping pm-current-data {

+            list pm-history-data {

+                key 'local-id';

+                config false;

+                uses pm-history-data;

+                description "in case of 24hr Current Data, at least 1 History Data.

+                    In case of 15min Current Data, at least 16 History Data.

+                    In case of <15min, the number of History Data shall be able to cover a span of 4 hours.";

+            }

+            container granularity-period {

+                uses tapi-common:time-period;

+                description "none";

+            }

+            leaf timestamp {

+                type tapi-common:date-and-time;

+                config false;

+                description "This attribute indicates the start of the current monitoring interval.

+                    The value is bound to the quarter of an hour in case of a 15 minute interval and bound to the hour in case of a 24 hour interval.";

+            }

+            container elapsed-time {

+                uses tapi-common:time-interval;

+                description "none";

+            }

+            leaf suspect-interval-flag {

+                type boolean;

+                description "This attribute is used to indicate that the performance data for the current period may not be reliable. Some reasons for this to occur are:

+                    – Suspect data were detected by the actual resource doing data collection.

+                    – Transition of the administrativeState attribute to/from the 'lock' state.

+                    – Transition of the operationalState to/from the 'disabled' state.

+                    – Scheduler setting that inhibits the collection function.

+                    – The performance counters were reset during the interval.

+                    – The currentData (or subclass) object instance was created during the monitoring period.";

+            }

+            uses tapi-common:local-class;

+            description "none";

+        }

+        grouping pm-history-data {

+            container granularity-period {

+                uses tapi-common:time-period;

+                description "none";

+            }

+            leaf period-end-time {

+                type tapi-common:date-and-time;

+                description "none";

+            }

+            leaf suspect-interval-flag {

+                type boolean;

+                config false;

+                description "This attribute indicates that the performance data may not be reliable.";

+            }

+            uses tapi-common:local-class;

+            description "none";

+        }

+        grouping oam-profile {

+            list pm-threshold-data {

+                key 'local-id';

+                min-elements 1;

+                uses pm-threshold-data;

+                description "none";

+            }

+            list pm-bin-data {

+                key 'local-id';

+                min-elements 1;

+                uses pm-bin-data;

+                description "none";

+            }

+            uses tapi-common:global-class;

+            description "none";

+        }

+        grouping pm-threshold-data {

+            container granularity-period {

+                uses tapi-common:time-period;

+                description "none";

+            }

+            leaf is-transient {

+                type boolean;

+                description "none";

+            }

+            uses tapi-common:local-class;

+            description "none";

+        }

+        grouping pm-bin-data {

+            container granularity-period {

+                uses tapi-common:time-period;

+                description "none";

+            }

+            uses tapi-common:local-class;

+            description "none";

+        }

+

+    /***********************

+    * package type-definitions

+    **********************/ 

+        identity OAM_JOB_TYPE {

+            description "none";

+        }

+        typedef oam-job-type {

+            type identityref {

+                base OAM_JOB_TYPE;

+            }

+            description "none";

+        }

+

+    /***********************

+    * package interfaces

+    **********************/ 

+        rpc create-oam-service {

+            description "none";

+            input {

+                list end-point {

+                    min-elements 2;

+                    uses oam-service-end-point;

+                    description "none";

+                }

+                container oam-constraint {

+                    uses oam-constraint;

+                    description "none";

+                }

+                leaf state {

+                    type string;

+                    description "none";

+                }

+            }

+            output {

+                container service {

+                    uses oam-service;

+                    description "none";

+                }

+            }

+        }

+        rpc delete-oam-service {

+            description "none";

+            input {

+                leaf service-id {

+                    type string;

+                    description "none";

+                }

+            }

+        }

+        rpc get-oam-service {

+            description "none";

+            input {

+                leaf service-id {

+                    type string;

+                    description "none";

+                }

+            }

+            output {

+                container service {

+                    uses oam-service;

+                    description "none";

+                }

+            }

+        }

+        rpc create-oam-job {

+            description "none";

+            input {

+                leaf oam-job-type {

+                    type oam-job-type;

+                    description "none";

+                }

+                list oam-service-end-point {

+                    min-elements 2;

+                    uses oam-service-end-point;

+                    description "none";

+                }

+                container oam-profile {

+                    uses oam-profile;

+                    description "none";

+                }

+                leaf state {

+                    type string;

+                    description "none";

+                }

+                leaf schedule {

+                    type string;

+                    description "none";

+                }

+            }

+            output {

+                container oam-job {

+                    uses oam-job;

+                    description "none";

+                }

+            }

+        }

+        rpc get-oam-job {

+            description "none";

+            input {

+                leaf job-id {

+                    type string;

+                    description "none";

+                }

+            }

+            output {

+                container oam-job {

+                    uses oam-job;

+                    description "none";

+                }

+            }

+        }

+        rpc get-oam-service-list {

+            description "none";

+            output {

+                list service {

+                    uses oam-service;

+                    description "none";

+                }

+            }

+        }

+        rpc get-meg {

+            description "none";

+            input {

+                leaf service-id {

+                    type string;

+                    description "none";

+                }

+            }

+            output {

+                container meg {

+                    uses meg;

+                    description "none";

+                }

+            }

+        }

+        rpc update-oam-service {

+            description "none";

+            input {

+                leaf service-id {

+                    type string;

+                    description "none";

+                }

+                list end-point {

+                    uses oam-service-end-point;

+                    description "none";

+                }

+                container oam-constraint {

+                    uses oam-constraint;

+                    description "none";

+                }

+                leaf state {

+                    type string;

+                    description "none";

+                }

+            }

+            output {

+                container service {

+                    uses oam-service;

+                    description "none";

+                }

+            }

+        }

+        rpc delete-oam-job {

+            description "none";

+            input {

+                leaf job-id {

+                    type string;

+                    description "none";

+                }

+            }

+        }

+        rpc update-oam-job {

+            description "none";

+            input {

+                leaf job-id {

+                    type string;

+                    description "none";

+                }

+                container oam-profile {

+                    uses oam-profile;

+                    description "none";

+                }

+                leaf state {

+                    type string;

+                    description "none";

+                }

+                leaf schedule {

+                    type string;

+                    description "none";

+                }

+            }

+            output {

+                container oam-job {

+                    uses oam-job;

+                    description "none";

+                }

+            }

+        }

+        rpc create-oam-service-end-point {

+            description "none";

+            input {

+                leaf service-id {

+                    type string;

+                    description "none";

+                }

+                leaf sip-id {

+                    type string;

+                    description "none";

+                }

+                leaf c-sep-id {

+                    type string;

+                    description "none";

+                }

+                leaf layer {

+                    type string;

+                    description "none";

+                }

+                leaf direction {

+                    type string;

+                    description "none";

+                }

+                leaf state {

+                    type string;

+                    description "none";

+                }

+                leaf mep-identifier {

+                    type string;

+                    description "none";

+                }

+                leaf-list peer-mep-identifier {

+                    type string;

+                    description "none";

+                }

+            }

+            output {

+                container end-point {

+                    uses oam-service-end-point;

+                    description "none";

+                }

+            }

+        }

+        rpc delete-oam-service-end-point {

+            description "none";

+            input {

+                leaf service-id {

+                    type string;

+                    description "none";

+                }

+                leaf o-sep-id {

+                    type string;

+                    description "none";

+                }

+            }

+        }

+        rpc update-oam-service-end-point {

+            description "none";

+            input {

+                leaf service-id {

+                    type string;

+                    description "none";

+                }

+                leaf o-sep-id {

+                    type string;

+                    description "none";

+                }

+                leaf state {

+                    type string;

+                    description "none";

+                }

+            }

+            output {

+                container end-point {

+                    uses oam-service-end-point;

+                    description "none";

+                }

+            }

+        }

+        rpc get-oam-service-end-point {

+            description "none";

+            input {

+                leaf service-id {

+                    type string;

+                    description "none";

+                }

+                leaf o-sep-id {

+                    type string;

+                    description "none";

+                }

+            }

+            output {

+                container end-point {

+                    uses oam-service-end-point;

+                    description "none";

+                }

+            }

+        }

+

+}

diff --git a/models/tapi/src/main/yang/tapi-odu@2018-03-07.yang b/models/tapi/src/main/yang/tapi-odu@2018-10-16.yang
similarity index 87%
rename from models/tapi/src/main/yang/tapi-odu@2018-03-07.yang
rename to models/tapi/src/main/yang/tapi-odu@2018-10-16.yang
index dfde5d4..68d5dea 100644
--- a/models/tapi/src/main/yang/tapi-odu@2018-03-07.yang
+++ b/models/tapi/src/main/yang/tapi-odu@2018-10-16.yang
@@ -13,52 +13,84 @@
     import tapi-oam {

         prefix tapi-oam;

     }

+    import tapi-dsr {

+        prefix tapi-dsr;

+    }

     organization "ONF OTCC (Open Transport Configuration & Control) Project";

-    contact "
-        Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-        Project List: <mailto:transport-api@opennetworking.org>
-        Editor: Karthik Sethuraman
-                <mailto:karthik.sethuraman@necam.com>";

+    contact "

+         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>

+         Project List: <mailto:transport-api@opennetworking.org>

+         Editor: Karthik Sethuraman

+                 <mailto:karthik.sethuraman@necam.com>";

     description "

         This module contains TAPI Odu Model definitions.

         Source: TapiOdu.uml

         Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

         License: This module is distributed under the Apache License 2.0";

+    revision 2018-10-16 {

+        description "ONF Transport API version 2.1.0.

+          - The TAPI YANG models included in this TAPI release (v2.1.0) are a *normative* part of the TAPI SDK.

+          - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]

+            <https://github.com/OpenNetworkingFoundation/EagleUmlYang>

+            and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]

+            <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>

+          - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.

+            As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.

+          - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.

+            The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.

+            YANG models included in this release are not backward compatible with previous TAPI releases.

+          - Changes included in this TAPI release (v2.1.0) are listed in

+            <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";

+    }

     revision 2018-03-07 {

-        description "ONF Transport API version 2.0.2

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.2
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

     }

     revision 2018-02-16 {

-        description "ONF Transport API version 2.0.1

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.1
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

     }

     revision 2018-01-02 {

-        description "ONF Transport API version 2.0.0

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.0
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

     }

-    augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {

-        uses odu-node-edge-point-spec;

+    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {

+        container odu-node-edge-point-spec {

+            uses odu-node-edge-point-spec;

+            description "Augments the base LayerProtocol information in NodeEdgePoint with ODU-specific information";

+        }

         description "Augments the base LayerProtocol information in NodeEdgePoint with ODU-specific information";

     }

-    augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {

-        uses odu-connection-end-point-spec;

+    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {

+        container odu-connection-end-point-spec {

+            uses odu-connection-end-point-spec;

+            description "none";

+        }

         description "none";

     }

-    augment "/tapi-common:context/tapi-oam:meg/tapi-oam:mep" {

-        uses odu-connection-end-point-spec;

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mep" {

+        container odu-connection-end-point-spec {

+            uses odu-connection-end-point-spec;

+            description "none";

+        }

         description "none";

     }

-    augment "/tapi-common:context/tapi-oam:meg/tapi-oam:mip" {

-        uses odu-mip-spec;

+    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mip" {

+        container odu-mip-spec {

+            uses odu-mip-spec;

+            description "none";

+        }

         description "none";

     }

     /***********************

@@ -76,7 +108,7 @@
                 description "This attribute is applicable when the ODU CTP object instance represents a lower order ODU CTP Source at the client layer of the ODUP/ODUj-21 adaptation function. The value of true of this attribute configures that the adaptation source function shall fall back to the payload type PT=20 if the conditions specified in 14.3.10.1/G.798 are satisfied. ";

             }

             leaf configured-client-type {

-                type string;

+                type tapi-dsr:digital-signal-type;

                 config false;

                 description "This attribute configures the type of the client CTP of the server ODU TTP.";

             }

@@ -421,32 +453,45 @@
     /***********************

     * package type-definitions

     **********************/ 

+        identity ODU_TYPE {

+        	base tapi-common:LAYER_PROTOCOL_QUALIFIER;

+            description "none";

+        }

+        identity ODU_TYPE_ODU0 {

+            base ODU_TYPE;

+            description "none";

+        }

+        identity ODU_TYPE_ODU1 {

+            base ODU_TYPE;

+            description "none";

+        }

+        identity ODU_TYPE_ODU2 {

+            base ODU_TYPE;

+            description "none";

+        }

+        identity ODU_TYPE_ODU2E {

+            base ODU_TYPE;

+            description "none";

+        }

+        identity ODU_TYPE_ODU3 {

+            base ODU_TYPE;

+            description "none";

+        }

+        identity ODU_TYPE_ODU4 {

+            base ODU_TYPE;

+            description "none";

+        }

+        identity ODU_TYPE_ODU_FLEX {

+            base ODU_TYPE;

+            description "none";

+        }

+        identity ODU_TYPE_ODU_CN {

+            base ODU_TYPE;

+            description "none";

+        }

         typedef odu-type {

-            type enumeration {

-                enum ODU0 {

-                    description "none";

-                }

-                enum ODU1 {

-                    description "none";

-                }

-                enum ODU2 {

-                    description "none";

-                }

-                enum ODU2E {

-                    description "none";

-                }

-                enum ODU3 {

-                    description "none";

-                }

-                enum ODU4 {

-                    description "none";

-                }

-                enum ODU_FLEX {

-                    description "none";

-                }

-                enum ODU_CN {

-                    description "none";

-                }

+            type identityref {

+                base ODU_TYPE;

             }

             description "none";

         }

diff --git a/models/tapi/src/main/yang/tapi-otsi@2018-03-07.yang b/models/tapi/src/main/yang/tapi-otsi@2018-03-07.yang
deleted file mode 100644
index a4b7355..0000000
--- a/models/tapi/src/main/yang/tapi-otsi@2018-03-07.yang
+++ /dev/null
@@ -1,278 +0,0 @@
-module tapi-otsi {

-    namespace "urn:onf:otcc:yang:tapi-otsi";

-    prefix tapi-otsi;

-    import tapi-common {

-        prefix tapi-common;

-    }

-    import tapi-connectivity {

-        prefix tapi-connectivity;

-    }

-    import tapi-topology {

-        prefix tapi-topology;

-    }

-    organization "ONF OTCC (Open Transport Configuration & Control) Project";

-    contact "
-        Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-        Project List: <mailto:transport-api@opennetworking.org>
-        Editor: Karthik Sethuraman
-                <mailto:karthik.sethuraman@necam.com>";

-    description "

-        This module contains TAPI OTSi Model definitions.

-        Source: TapiOtsi.uml

-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

-        License: This module is distributed under the Apache License 2.0";

-    revision 2018-03-07 {

-        description "ONF Transport API version 2.0.2

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

-    }

-    revision 2018-02-16 {

-        description "ONF Transport API version 2.0.1

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

-    }

-    revision 2018-01-02 {

-        description "ONF Transport API version 2.0.0

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

-    }

-    augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {

-        uses otsi-connection-end-point-spec;

-        description "Augments the base LayerProtocol information in ConnectionEndPoint with OCH-specific information";

-    }

-    augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {

-        uses otsi-node-edge-point-spec;

-        description "Augments the base LayerProtocol information in NodeEdgePoint with OCH-specific information";

-    }

-    /***********************

-    * package object-classes

-    **********************/ 

-        grouping otsi-client-adaptation-pac {

-            description "none";

-        }

-        grouping otsi-connection-end-point-spec {

-            container otsi-adapter {

-                config false;

-                uses otsi-client-adaptation-pac;

-                description "none";

-            }

-            container otsi-termination {

-                config false;

-                uses otsi-termination-pac;

-                description "none";

-            }

-            container otsi-ctp {

-                config false;

-                uses otsi-ctp-pac;

-                description "none";

-            }

-            description "none";

-        }

-        grouping otsi-termination-pac {

-            list selected-nominal-central-frequency {

-                config false;

-                uses nominal-central-frequency-or-wavelength;

-                description "This attribute indicates the nominal central frequency or wavelength of the optical channel associated with the OCh Trail Termination function. The value of this attribute is a pair {LinkType, Integer}, in which LinkType is DWDM, or CWDM, or NO_WDM. When LinkType is DWDM, the integer represents the nominal central frequency in unit of MHz. When LinkType is CWDM, the integer represents the nominal central wavelength in unit of pm (picometer). When LinkType is NO_WDM, the Integer field is null. For frequency and wavelength, the value shall be within the range of the maximum and minimum central frequencies or wavelengths specified for the corresponding application code used at the OCh Trail Termination.

-                    This attribute is required for the OCh Trial Termination Point Source at the transmitter.  For the OCh Trail Termination Point Sink at the receiver, this attribute may not be needed since the receiver is required to operate at any frequency/wavelength between the maximum and minimum range for the standard application code.

-                    ";

-            }

-            list supportable-lower-nominal-central-frequency {

-                config false;

-                uses nominal-central-frequency-or-wavelength;

-                description "none";

-            }

-            list supportable-upper-nominal-central-frequency {

-                config false;

-                uses nominal-central-frequency-or-wavelength;

-                description "none";

-            }

-            list selected-application-identifier {

-                config false;

-                uses application-identifier;

-                description "This attribute indicates the selected Application Identifier that is used by the OCh trail termination function. The syntax of ApplicationIdentifier is a pair {ApplicationIdentifierType, PrintableString}. The value of ApplicationIdentifierType is either STANDARD or PROPRIETARY. The value of PrintableString represents the standard application code as defined in the ITU-T Recommendations or a vendor-specific proprietary code. If the ApplicationIdentifierType is STANDARD the value of PrintableString represents a standard application code as defined in the ITU-T Recommendations. If the ApplicationIdentifierType is PROPRIETARY, the first six characters of the PrintableString must contain the Hexadecimal representation of an OUI assigned to the vendor whose implementation generated the Application Identifier; the remaining octets of the PrintableString are unspecified. The value of this attribute of an object instance has to be one of the values identified in the attribute SupportableApplicationIdentifierList of the same object instance. The values and value ranges of the optical interface parameters of a standard application code must be consistent with those values specified in the ITU-T Recommendation for that application code.";

-            }

-            list supportable-application-identifier {

-                config false;

-                uses application-identifier;

-                description "none";

-            }

-            description "none";

-        }

-        grouping otsi-pool-pac {

-            list available-frequency-slot {

-                config false;

-                uses frequency-slot;

-                description "none";

-            }

-            list occupied-frequency-slot {

-                config false;

-                uses frequency-slot;

-                description "none";

-            }

-            description "none";

-        }

-        grouping otsi-node-edge-point-spec {

-            container otsi-pool {

-                config false;

-                uses otsi-pool-pac;

-                description "none";

-            }

-            description "none";

-        }

-        grouping otsi-routing-spec {

-            leaf optical-routing-strategy {

-                type optical-routing-strategy;

-                description "none";

-            }

-            description "none";

-        }

-        grouping otsi-ctp-pac {

-            list selected-frequency-slot {

-                config false;

-                uses frequency-slot;

-                description "none";

-            }

-            description "none";

-        }

-

-    /***********************

-    * package type-definitions

-    **********************/ 

-        grouping application-identifier {

-            leaf application-identifier-type {

-                type application-identifier-type;

-                description "none";

-            }

-            leaf application-identifier-value {

-                type string;

-                description "none";

-            }

-            description "none";

-        }

-        grouping nominal-central-frequency-or-wavelength {

-            leaf grid-type {

-                type grid-type;

-                description "Specifies the frequency grid standard used to determine the nominal central frequency and frequency slot width";

-            }

-            leaf adjustment-granularity {

-                type adjustment-granularity;

-                description "Adjustment granularity in Gigahertz. As per ITU-T G.694.1, it is used to calculate nominal central frequency (in THz)";

-            }

-            leaf channel-number {

-                type uint64;

-                description "As per ITU-T G.694.1, this attribute is denoted as 'n' and is used to calculate the nominal central frequency (in THz) as follows:

-                    193.1 + <channelNumber> × <adjustmentGranularity> where channelNumber is a positive or negative integer including 0 and adjustment_granularity is the nominal central frequency granularity in THz";

-            }

-            description "This data-type holds the information to determine the nominal central frequency of a FIXED grid (DWDM or CWDM) and FLEX grid type systems.

-                As per ITU-T G.694.1, the nominal central frequency (in THz) is calculated as follows:

-                193.1 + <channelNumber> × <adjustmentGranularity> where channelNumber is a positive or negative integer including 0 and <adjustment_granularity> is the nominal central frequency granularity in THz

-                For FIXED grid types, the adjustmentGranularity is one of (0.1/0.05/0.025/0.0125) THz corresponding to channel spacing of one of (100/50/25/12.5) GHz

-                For FLEX grid type, the adjusmentGranularity is 0.00625 THz and the slot width is variable in increments of 12.5 GHz";

-        }

-        typedef optical-routing-strategy {

-            type enumeration {

-                enum OPTIMAL_OSNR {

-                    description "none";

-                }

-                enum NO_RELAY {

-                    description "none";

-                }

-                enum MIN_RELAY {

-                    description "none";

-                }

-                enum PREFERRED_NO_CHANGE_WAVELENGTH_AS_RESTORE {

-                    description "none";

-                }

-                enum PREFERRED_NO_SKIPPING_WAVELENGTH {

-                    description "none";

-                }

-            }

-            description "none";

-        }

-        typedef application-identifier-type {

-            type enumeration {

-                enum PROPRIETARY {

-                    description "none";

-                }

-                enum ITUT_G959_1 {

-                    description "none";

-                }

-                enum ITUT_G698_1 {

-                    description "none";

-                }

-                enum ITUT_G698_2 {

-                    description "none";

-                }

-                enum ITUT_G696_1 {

-                    description "none";

-                }

-                enum ITUT_G695 {

-                    description "none";

-                }

-            }

-            description "none";

-        }

-        typedef grid-type {

-            type enumeration {

-                enum DWDM {

-                    description "Fixed frequency grid in C & L bands as specified in ITU-T G.694.1

-                        ";

-                }

-                enum CWDM {

-                    description "Fixed frequency grid as specified in ITU-T G.694.2";

-                }

-                enum FLEX {

-                    description "Flexible frequency grid as specified in ITU-T G.694.1. In this case,

-                        - the allowed frequency slots have a nominal central frequency (in THz) defined by:

-                        193.1 + n × 0.00625 where n is a positive or negative integer including 0 and 0.00625 is the nominal central frequency granularity in THz

-                        - and a slot width defined by:

-                        12.5 × m where m is a positive integer and 12.5 is the slot width granularity in GHz.

-                        Any combination of frequency slots is allowed as long as no two frequency slots overlap.";

-                }

-                enum UNSPECIFIED {

-                    description "Unspecified/proprietary frequency grid";

-                }

-            }

-            description "The frequency grid standard that specify reference set of frequencies used to denote allowed nominal central frequencies that may be used for defining applications.";

-        }

-        typedef adjustment-granularity {

-            type enumeration {

-                enum G_100GHZ {

-                    description "0.1 THz";

-                }

-                enum G_50GHZ {

-                    description "0.05 THz";

-                }

-                enum G_25GHZ {

-                    description "0.025 THz";

-                }

-                enum G_12_5GHZ {

-                    description "0.0125 THz";

-                }

-                enum G_6_25GHZ {

-                    description "0.00625 THz";

-                }

-            }

-            description "Adjustment granularity in Gigahertz. As per ITU-T G.694.1, it is used to calculate nominal central frequency (in THz)";

-        }

-        grouping frequency-slot {

-            container nominal-central-frequency {

-                uses nominal-central-frequency-or-wavelength;

-                description "none";

-            }

-            leaf slot-width-number {

-                type uint64;

-                description "As per ITU-T G.694.1, this attribute is denoted as 'm' and is used to calculate the slot width (in GHz) as follows:

-                    12.5 × m where m is a positive integer and 12.5 is the slot width granularity in GHz.";

-            }

-            description "The frequency range allocated to a slot and unavailable to other slots within a flexible grid. A frequency slot is defined by its nominal central frequency. As per ITU-T G.694.1  the slot width is calculated as follows:

-                12.5 × <slotWidthNumber> where slotWidthNumber is a positive integer and 12.5 is the slot width granularity in GHz";

-        }

-

-}

diff --git a/models/tapi/src/main/yang/tapi-path-computation@2018-03-07.yang b/models/tapi/src/main/yang/tapi-path-computation@2018-10-16.yang
similarity index 61%
rename from models/tapi/src/main/yang/tapi-path-computation@2018-03-07.yang
rename to models/tapi/src/main/yang/tapi-path-computation@2018-10-16.yang
index ad933c5..d85aff5 100644
--- a/models/tapi/src/main/yang/tapi-path-computation@2018-03-07.yang
+++ b/models/tapi/src/main/yang/tapi-path-computation@2018-10-16.yang
@@ -8,39 +8,59 @@
         prefix tapi-common;

     }

     organization "ONF OTCC (Open Transport Configuration & Control) Project";

-    contact "
-        Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-        Project List: <mailto:transport-api@opennetworking.org>
-        Editor: Karthik Sethuraman
-                <mailto:karthik.sethuraman@necam.com>";

+    contact "

+         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>

+         Project List: <mailto:transport-api@opennetworking.org>

+         Editor: Karthik Sethuraman

+                 <mailto:karthik.sethuraman@necam.com>";

     description "

         This module contains TAPI Path Computation Model definitions.

         Source: TapiPathComputation.uml

         Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

         License: This module is distributed under the Apache License 2.0";

+    revision 2018-10-16 {

+        description "ONF Transport API version 2.1.0.

+          - The TAPI YANG models included in this TAPI release (v2.1.0) are a *normative* part of the TAPI SDK.

+          - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]

+            <https://github.com/OpenNetworkingFoundation/EagleUmlYang>

+            and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]

+            <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>

+          - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.

+            As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.

+          - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.

+            The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.

+            YANG models included in this release are not backward compatible with previous TAPI releases.

+          - Changes included in this TAPI release (v2.1.0) are listed in

+            <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";

+    }

     revision 2018-03-07 {

-        description "ONF Transport API version 2.0.2

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.2
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

     }

     revision 2018-02-16 {

-        description "ONF Transport API version 2.0.1

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.1
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

     }

     revision 2018-01-02 {

-        description "ONF Transport API version 2.0.0

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.0
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

     }

     augment "/tapi-common:context" {

-        uses path-computation-context;

+        container path-computation-context {

+            uses path-computation-context;

+            description "Augments the base TAPI Context with PathComputationService information";

+        }

         description "Augments the base TAPI Context with PathComputationService information";

     }

 

@@ -48,9 +68,9 @@
     * definitions of refrences

     *************************/

     grouping path-ref {

-        leaf path-id {

+        leaf path-uuid {

             type leafref {

-                path '/tapi-common:context/tapi-path-computation:path/tapi-path-computation:uuid';

+                path '/tapi-common:context/tapi-path-computation:path-computation-context/tapi-path-computation:path/tapi-path-computation:uuid';

             }

             description "none";

         }

@@ -63,7 +83,7 @@
         grouping path {

             list link {

                 uses tapi-topology:link-ref;

-                key 'topology-id link-id';

+                key 'topology-uuid link-uuid';

                 config false;

                 min-elements 1;

                 description "none";

@@ -73,6 +93,15 @@
                 uses routing-constraint;

                 description "none";

             }

+            leaf direction {

+                type tapi-common:forwarding-direction;

+                description "none";

+            }

+            leaf layer-protocol-name {

+                type tapi-common:layer-protocol-name;

+                config false;

+                description "none";

+            }

             uses tapi-common:resource-spec;

             description "Path is described by an ordered list of TE Links. A TE Link is defined by a pair of Node/NodeEdgePoint IDs. A Connection is realized by concatenating link resources (associated with a Link) and the lower-level connections (cross-connections) in the different nodes";

         }

@@ -82,6 +111,19 @@
                 config false;

                 description "none";

             }

+            leaf layer-protocol-name {

+                type tapi-common:layer-protocol-name;

+                config false;

+                description "none";

+            }

+            leaf layer-protocol-qualifier {

+                type tapi-common:layer-protocol-qualifier;

+                description "none";

+            }

+            container capacity {

+                uses tapi-common:capacity;

+                description "none";

+            }

             leaf role {

                 type tapi-common:port-role;

                 config false;

@@ -92,11 +134,6 @@
                 config false;

                 description "The orientation of defined flow at the EndPoint.";

             }

-            leaf service-layer {

-                type tapi-common:layer-protocol-name;

-                config false;

-                description "none";

-            }

             uses tapi-common:local-class;

             description "The association of the FC to LTPs is made via EndPoints.

                 The EndPoint (EP) object class models the access to the FC function. 

@@ -109,7 +146,7 @@
         grouping path-computation-service {

             list path {

                 uses path-ref;

-                key 'path-id';

+                key 'path-uuid';

                 config false;

                 min-elements 1;

                 description "none";

@@ -125,6 +162,10 @@
                 uses routing-constraint;

                 description "none";

             }

+            container topology-constraint {

+                uses topology-constraint;

+                description "none";

+            }

             container objective-function {

                 uses path-objective-function;

                 description "none";

@@ -175,46 +216,38 @@
             description "none";

         }

         grouping routing-constraint {

-            container requested-capacity {

-                config false;

-                uses tapi-common:capacity;

-                description "none";

-            }

-            leaf service-level {

-                type string;

-                config false;

-                description "An abstract value the meaning of which is mutually agreed – typically represents metrics such as - Class of service, priority, resiliency, availability";

-            }

-            leaf-list path-layer {

-                type tapi-common:layer-protocol-name;

-                config false;

-                description "none";

-            }

             list cost-characteristic {

                 key 'cost-name';

-                config false;

                 uses tapi-topology:cost-characteristic;

                 description "The list of costs where each cost relates to some aspect of the TopologicalEntity.";

             }

             list latency-characteristic {

                 key 'traffic-property-name';

-                config false;

                 uses tapi-topology:latency-characteristic;

                 description "The effect on the latency of a queuing process. This only has significant effect for packet based systems and has a complex characteristic.";

             }

-            list include-topology {

-                uses tapi-topology:topology-ref;

-                key 'topology-id';

-                config false;

+            list risk-diversity-characteristic {

+                key 'risk-characteristic-name';

+                uses tapi-topology:risk-characteristic;

                 description "none";

             }

-            list avoid-topology {

-                uses tapi-topology:topology-ref;

-                key 'topology-id';

-                config false;

+            leaf diversity-policy {

+                type diversity-policy;

                 description "none";

             }

-            uses tapi-common:local-class;

+            leaf route-objective-function {

+                type route-objective-function;

+                description "none";

+            }

+            leaf route-direction {

+                type tapi-common:forwarding-direction;

+                description "none";

+            }

+            leaf is-exclusive {

+                type boolean;

+                default "true";

+                description "To distinguish if the resources are to be exclusive to the service";

+            }

             description "none";

         }

         grouping path-computation-context {

@@ -231,6 +264,112 @@
             }

             description "none";

         }

+        grouping topology-constraint {

+            list include-topology {

+                uses tapi-topology:topology-ref;

+                key 'topology-uuid';

+                config false;

+                description "none";

+            }

+            list avoid-topology {

+                uses tapi-topology:topology-ref;

+                key 'topology-uuid';

+                config false;

+                description "none";

+            }

+            list include-path {

+                uses tapi-path-computation:path-ref;

+                key 'path-uuid';

+                config false;

+                description "none";

+            }

+            list exclude-path {

+                uses tapi-path-computation:path-ref;

+                key 'path-uuid';

+                config false;

+                description "none";

+            }

+            list include-link {

+                uses tapi-topology:link-ref;

+                key 'topology-uuid link-uuid';

+                config false;

+                description "This is a loose constraint - that is it is unordered and could be a partial list ";

+            }

+            list exclude-link {

+                uses tapi-topology:link-ref;

+                key 'topology-uuid link-uuid';

+                config false;

+                description "none";

+            }

+            list include-node {

+                uses tapi-topology:node-ref;

+                key 'topology-uuid node-uuid';

+                config false;

+                description "This is a loose constraint - that is it is unordered and could be a partial list";

+            }

+            list exclude-node {

+                uses tapi-topology:node-ref;

+                key 'topology-uuid node-uuid';

+                config false;

+                description "none";

+            }

+            leaf-list preferred-transport-layer {

+                type tapi-common:layer-protocol-name;

+                config false;

+                description "soft constraint requested by client to indicate the layer(s) of transport connection that it prefers to carry the service. This could be same as the service layer or one of the supported server layers";

+            }

+            description "none";

+        }

+

+    /***********************

+    * package type-definitions

+    **********************/ 

+        typedef route-objective-function {

+            type enumeration {

+                enum MIN_WORK_ROUTE_HOP {

+                    description "none";

+                }

+                enum MIN_WORK_ROUTE_COST {

+                    description "none";

+                }

+                enum MIN_WORK_ROUTE_LATENCY {

+                    description "none";

+                }

+                enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_HOP {

+                    description "none";

+                }

+                enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_COST {

+                    description "none";

+                }

+                enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_LATENCY {

+                    description "none";

+                }

+                enum LOAD_BALANCE_MAX_UNUSED_CAPACITY {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        typedef diversity-policy {

+            type enumeration {

+                enum SRLG {

+                    description "none";

+                }

+                enum SRNG {

+                    description "none";

+                }

+                enum SNG {

+                    description "none";

+                }

+                enum NODE {

+                    description "none";

+                }

+                enum LINK {

+                    description "none";

+                }

+            }

+            description "none";

+        }

 

     /***********************

     * package interfaces

@@ -248,6 +387,10 @@
                     uses routing-constraint;

                     description "none";

                 }

+                container topology-constraint {

+                    uses topology-constraint;

+                    description "none";

+                }

                 container objective-function {

                     uses path-objective-function;

                     description "none";

diff --git a/models/tapi/src/main/yang/tapi-photonic-media@2018-10-16.yang b/models/tapi/src/main/yang/tapi-photonic-media@2018-10-16.yang
new file mode 100644
index 0000000..3ac2932
--- /dev/null
+++ b/models/tapi/src/main/yang/tapi-photonic-media@2018-10-16.yang
@@ -0,0 +1,771 @@
+module tapi-photonic-media {

+    namespace "urn:onf:otcc:yang:tapi-photonic-media";

+    prefix tapi-photonic-media;

+    import tapi-common {

+        prefix tapi-common;

+    }

+    import tapi-connectivity {

+        prefix tapi-connectivity;

+    }

+    import tapi-topology {

+        prefix tapi-topology;

+    }

+    organization "ONF OTCC (Open Transport Configuration & Control) Project";

+    contact "

+         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>

+         Project List: <mailto:transport-api@opennetworking.org>

+         Editor: Karthik Sethuraman

+                 <mailto:karthik.sethuraman@necam.com>";

+    description "

+        This module contains TAPI PhotonicMedia Model definitions.

+        Source: TapiPhotonicMedia.uml

+        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

+        License: This module is distributed under the Apache License 2.0";

+    revision 2018-10-16 {

+        description "ONF Transport API version 2.1.0.

+          - The TAPI YANG models included in this TAPI release (v2.1.0) are a *normative* part of the TAPI SDK.

+          - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]

+            <https://github.com/OpenNetworkingFoundation/EagleUmlYang>

+            and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]

+            <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>

+          - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.

+            As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.

+          - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.

+            The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.

+            YANG models included in this release are not backward compatible with previous TAPI releases.

+          - Changes included in this TAPI release (v2.1.0) are listed in

+            <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";

+    }

+    revision 2018-03-07 {

+        description "ONF Transport API version 2.0.2
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

+    }

+    revision 2018-02-16 {

+        description "ONF Transport API version 2.0.1
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

+    }

+    revision 2018-01-02 {

+        description "ONF Transport API version 2.0.0
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

+    }

+    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {

+        container otsi-connection-end-point-spec {

+            uses otsi-connection-end-point-spec;

+            description "Augments the base LayerProtocol information in ConnectionEndPoint with OCH-specific information";

+        }

+        description "Augments the base LayerProtocol information in ConnectionEndPoint with OCH-specific information";

+    }

+    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {

+        container media-channel-node-edge-point-spec {

+            uses media-channel-node-edge-point-spec;

+            description "Augments the base LayerProtocol information in NodeEdgePoint with OCH-specific information";

+        }

+        description "Augments the base LayerProtocol information in NodeEdgePoint with OCH-specific information";

+    }

+    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {

+        container otsi-assembly-connection-end-point-spec {

+            uses otsi-assembly-connection-end-point-spec;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-common:service-interface-point" {

+        container otsi-service-interface-point-spec {

+            uses otsi-service-interface-point-spec;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connectivity-service/tapi-connectivity:end-point" {

+        container otsi-connectivity-service-end-point-spec {

+            uses otsi-connectivity-service-end-point-spec;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-common:service-interface-point" {

+        container media-channel-service-interface-point-spec {

+            uses media-channel-service-interface-point-spec;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connectivity-service/tapi-connectivity:end-point" {

+        container media-channel-service-interface-point-spec {

+            uses media-channel-service-interface-point-spec;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {

+        container media-channel-connection-end-point-spec {

+            uses media-channel-connection-end-point-spec;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {

+        container ots-connection-end-point-spec {

+            uses ots-connection-end-point-spec;

+            description "none";

+        }

+        description "none";

+    }

+    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {

+        container media-channel-assembly-spec {

+            uses media-channel-assembly-spec;

+            description "none";

+        }

+        description "none";

+    }

+    /***********************

+    * package object-classes

+    **********************/ 

+        grouping otsi-gserver-adaptation-pac {

+            leaf number-of-otsi {

+                type uint64;

+                config false;

+                description "none";

+            }

+            description "none";

+        }

+        grouping otsi-connection-end-point-spec {

+            container otsi-termination {

+                config false;

+                uses otsi-termination-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping otsi-termination-pac {

+            container selected-central-frequency {

+                config false;

+                uses central-frequency;

+                description "none";

+            }

+            container selected-application-identifier {

+                config false;

+                uses application-identifier;

+                description "This attribute indicates the selected Application Identifier that is used by the OCh trail termination function. The syntax of ApplicationIdentifier is a pair {ApplicationIdentifierType, PrintableString}. The value of ApplicationIdentifierType is either STANDARD or PROPRIETARY. The value of PrintableString represents the standard application code as defined in the ITU-T Recommendations or a vendor-specific proprietary code. If the ApplicationIdentifierType is STANDARD the value of PrintableString represents a standard application code as defined in the ITU-T Recommendations. If the ApplicationIdentifierType is PROPRIETARY, the first six characters of the PrintableString must contain the Hexadecimal representation of an OUI assigned to the vendor whose implementation generated the Application Identifier; the remaining octets of the PrintableString are unspecified. The value of this attribute of an object instance has to be one of the values identified in the attribute SupportableApplicationIdentifierList of the same object instance. The values and value ranges of the optical interface parameters of a standard application code must be consistent with those values specified in the ITU-T Recommendation for that application code.";

+            }

+            leaf selected-modulation {

+                type modulation-technique;

+                default "UNDEFINED";

+                config false;

+                description "This parameter defines the modulation used at the source";

+            }

+            container selected-spectrum {

+                config false;

+                uses spectrum-band;

+                description "none";

+            }

+            container transmited-power {

+                config false;

+                uses power-properties-pac;

+                description "Measured power at the Transmitter.";

+            }

+            container received-power {

+                uses power-properties-pac;

+                description "none";

+            }

+            container laser-properties {

+                config false;

+                uses laser-properties-pac;

+                description "Laser properties.";

+            }

+            description "Provides status information only.";

+        }

+        grouping media-channel-pool-capability-pac {

+            list supportable-spectrum {

+                config false;

+                uses spectrum-band;

+                description "none";

+            }

+            list available-spectrum {

+                config false;

+                uses spectrum-band;

+                description "none";

+            }

+            list occupied-spectrum {

+                config false;

+                uses spectrum-band;

+                description "none";

+            }

+            description "none";

+        }

+        grouping media-channel-node-edge-point-spec {

+            container mc-pool {

+                config false;

+                uses media-channel-pool-capability-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping otsi-routing-spec {

+            leaf optical-routing-strategy {

+                type optical-routing-strategy;

+                description "none";

+            }

+            description "none";

+        }

+        grouping media-channel-properties-pac {

+            container occupied-spectrum {

+                config false;

+                uses spectrum-band;

+                description "none";

+            }

+            container measured-power-ingress {

+                config false;

+                uses power-properties-pac;

+                description "none";

+            }

+            container measured-power-egress {

+                uses power-properties-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping otsi-assembly-connection-end-point-spec {

+            container otsi-adapter {

+                config false;

+                uses otsi-gserver-adaptation-pac;

+                description "none";

+            }

+            container fec-parameters {

+                config false;

+                uses fec-properties-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping otsi-capability-pac {

+            list supportable-lower-central-frequency {

+                config false;

+                uses central-frequency;

+                description "The lower frequency of the channel spectrum";

+            }

+            list supportable-upper-central-frequency {

+                config false;

+                uses central-frequency;

+                description "The Upper frequency of the channel spectrum";

+            }

+            list supportable-application-identifier {

+                config false;

+                uses application-identifier;

+                description "The list of supportable ApplicationIdentifiers.";

+            }

+            leaf-list supportable-modulation {

+                type modulation-technique;

+                config false;

+                description "This parameter defines the modulation used at the source";

+            }

+            container total-power-warn-threshold {

+                config false;

+                uses total-power-threshold-pac;

+                description "none";

+            }

+            description "Can read the status of the warning for the upper value that the power can reach.";

+        }

+        grouping otsi-service-interface-point-spec {

+            container otsi-capability {

+                config false;

+                uses otsi-capability-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping otsi-connectivity-service-end-point-spec {

+            container otsi-config {

+                uses otsi-termination-config-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping otsi-termination-config-pac {

+            container central-frequency {

+                uses central-frequency;

+                description "The central frequency of the laser. It is the oscillation frequency of the corresponding electromagnetic wave";

+            }

+            container spectrum {

+                uses spectrum-band;

+                description "none";

+            }

+            container application-identifier {

+                uses application-identifier;

+                description "This attribute indicates the selected Application Identifier.";

+            }

+            leaf modulation {

+                type modulation-technique;

+                description "The modulation techniqu selected at the source.";

+            }

+            leaf laser-control {

+                type laser-control-type;

+                description "Laser control can be FORCED-ON, FORCED-OFF or LASER-SHUTDOWN";

+            }

+            container transmit-power {

+                uses power-properties-pac;

+                description "Transmit power as requested.";

+            }

+            leaf total-power-warn-threshold-upper {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "Allows to configure the Upper power threshold which is expected to be different from Default, but within the Min and Max values specified as OTSi SIP capability.";

+            }

+            leaf total-power-warn-threshold-lower {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "Allows to configure the Lowerpower threshold which is expected to be different from Default, but within the Min and Max values specified as OTSi SIP capability.";

+            }

+            description "none";

+        }

+        grouping fec-properties-pac {

+            leaf pre-fec-ber {

+                type uint64;

+                config false;

+                description "counter: bit error rate before correction by FEC";

+            }

+            leaf post-fec-ber {

+                type uint64;

+                config false;

+                description "counter: bit error rate after correction by FEC";

+            }

+            leaf corrected-bytes {

+                type uint64;

+                config false;

+                description "Bytes corrected between those that were received corrupted";

+            }

+            leaf corrected-bits {

+                type uint64;

+                config false;

+                description "Bits corrected between those that were received corrupted";

+            }

+            leaf uncorrectable-bytes {

+                type uint64;

+                config false;

+                description "Bytes that could not be corrected by FEC";

+            }

+            leaf uncorrectable-bits {

+                type uint64;

+                config false;

+                description "Bits that could not be corrected by FEC";

+            }

+            description "none";

+        }

+        grouping media-channel-service-interface-point-spec {

+            container mc-pool {

+                config false;

+                uses media-channel-pool-capability-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping media-channel-connectivity-service-end-point-spec {

+            container mc-config {

+                uses media-channel-config-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping media-channel-config-pac {

+            container spectrum {

+                uses spectrum-band;

+                description "none";

+            }

+            description "none";

+        }

+        grouping media-channel-connection-end-point-spec {

+            container media-channel {

+                config false;

+                uses media-channel-properties-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping ots-connection-end-point-spec {

+            container ots-media-channel {

+                config false;

+                uses media-channel-properties-pac;

+                description "none";

+            }

+            description "none";

+        }

+        grouping media-channel-assembly-spec {

+            description "none";

+        }

+        grouping laser-properties-pac {

+            leaf laser-status {

+                type laser-control-status-type;

+                config false;

+                description "none";

+            }

+            leaf laser-application-type {

+                type laser-type;

+                config false;

+                description "The type of laser, its operational wavelengths, and its applications. String size 255.";

+            }

+            leaf laser-bias-current {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                config false;

+                description "The Bias current of the laser that is the medium polarization current of the laser.";

+            }

+            leaf laser-temperature {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                config false;

+                description "The temperature of the laser";

+            }

+            description "none";

+        }

+        grouping power-properties-pac {

+            leaf total-power {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "The total power at any point in a channel specified in dBm.";

+            }

+            leaf power-spectral-density {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                config false;

+                description "This describes how power of a signal  is distributed over frequency specified in nW/MHz";

+            }

+            description "Indication with severity warning raised when a total power value measured is above the threshold.";

+        }

+        grouping total-power-threshold-pac {

+            leaf total-power-upper-warn-threshold-default {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "Can read the value of the default  threshold that was set";

+            }

+            leaf total-power-upper-warn-threshold-min {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "Can read the value of the lower threshold that was set";

+            }

+            leaf total-power-upper-warn-threshold-max {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "Can  read the value of the upper threshold that was set";

+            }

+            leaf total-power-lower-warn-threshold-default {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "Can read the value of the default  threshold that was set";

+            }

+            leaf total-power-lower-warn-threshold-max {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "Can  read the value of the upper threshold that was set";

+            }

+            leaf total-power-lower-warn-threshold-min {

+                type decimal64 {

+                    fraction-digits 7;

+                }

+                description "Can read the value of the lower threshold that was set";

+            }

+            description "none";

+        }

+

+    /***********************

+    * package type-definitions

+    **********************/ 

+        identity PHOTONIC_LAYER_QUALIFIER {

+        	base tapi-common:LAYER_PROTOCOL_QUALIFIER;

+            description "none";

+        }

+        identity PHOTONIC_LAYER_QUALIFIER_OTSi {

+            base PHOTONIC_LAYER_QUALIFIER;

+            description "none";

+        }

+        identity PHOTONIC_LAYER_QUALIFIER_OTSiA {

+            base PHOTONIC_LAYER_QUALIFIER;

+            description "none";

+        }

+        identity PHOTONIC_LAYER_QUALIFIER_OTSiG {

+            base PHOTONIC_LAYER_QUALIFIER;

+            description "none";

+        }

+        identity PHOTONIC_LAYER_QUALIFIER_NMC {

+            base PHOTONIC_LAYER_QUALIFIER;

+            description "none";

+        }

+        identity PHOTONIC_LAYER_QUALIFIER_NMCA {

+            base PHOTONIC_LAYER_QUALIFIER;

+            description "none";

+        }

+        identity PHOTONIC_LAYER_QUALIFIER_SMC {

+            base PHOTONIC_LAYER_QUALIFIER;

+            description "none";

+        }

+        identity PHOTONIC_LAYER_QUALIFIER_SMCA {

+            base PHOTONIC_LAYER_QUALIFIER;

+            description "none";

+        }

+        identity PHOTONIC_LAYER_QUALIFIER_OCH {

+            base PHOTONIC_LAYER_QUALIFIER;

+            description "none";

+        }

+        identity PHOTONIC_LAYER_QUALIFIER_OMS {

+            base PHOTONIC_LAYER_QUALIFIER;

+            description "none";

+        }

+        identity PHOTONIC_LAYER_QUALIFIER_OTS {

+            base PHOTONIC_LAYER_QUALIFIER;

+            description "none";

+        }

+        grouping application-identifier {

+            leaf application-identifier-type {

+                type application-identifier-type;

+                description "The ITU-T recommendation which defines the application code format.";

+            }

+            leaf application-code {

+                type string;

+                description "none";

+            }

+            description "The syntax of ApplicationIdentifier is a pair {ApplicationIdentifierType, PrintableString}. The value of ApplicationIdentifierType is either STANDARD or PROPRIETARY. The value of PrintableString represents the standard application code as defined in the ITU-T Recommendations or a vendor-specific proprietary code. If the ApplicationIdentifierType is STANDARD the value of PrintableString represents a standard application code as defined in the ITU-T Recommendations. If the ApplicationIdentifierType is PROPRIETARY, the first six characters of the PrintableString must contain the Hexadecimal representation of an OUI assigned to the vendor whose implementation generated the Application Identifier; the remaining octets of the PrintableString are unspecified. The value of this attribute of an object instance has to be one of the values identified in the attribute SupportableApplicationIdentifierList of the same object instance. The values and value ranges of the optical interface parameters of a standard application code must be consistent with those values specified in the ITU-T Recommendation for that application code.";

+        }

+        grouping central-frequency {

+            container frequency-constraint {

+                uses frequency-constraint;

+                description "none";

+            }

+            leaf central-frequency {

+                type uint64;

+                description "The central frequency of the laser specified in MHz. It is the oscillation frequency of the corresponding electromagnetic wave. ";

+            }

+            description "This data-type holds the central frequency information as well frequency constraints in terms of GridType ( FIXED grid (DWDM or CWDM) or FLEX grid) and AdjustmentGranularity.";

+        }

+        typedef optical-routing-strategy {

+            type enumeration {

+                enum OPTIMAL_OSNR {

+                    description "none";

+                }

+                enum NO_RELAY {

+                    description "none";

+                }

+                enum MIN_RELAY {

+                    description "none";

+                }

+                enum PREFERRED_NO_CHANGE_WAVELENGTH_AS_RESTORE {

+                    description "none";

+                }

+                enum PREFERRED_NO_SKIPPING_WAVELENGTH {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        typedef application-identifier-type {

+            type enumeration {

+                enum PROPRIETARY {

+                    description "none";

+                }

+                enum ITUT_G959_1 {

+                    description "none";

+                }

+                enum ITUT_G698_1 {

+                    description "none";

+                }

+                enum ITUT_G698_2 {

+                    description "none";

+                }

+                enum ITUT_G696_1 {

+                    description "none";

+                }

+                enum ITUT_G695 {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        typedef grid-type {

+            type enumeration {

+                enum DWDM {

+                    description "Fixed frequency grid in C & L bands as specified in ITU-T G.694.1

+                        ";

+                }

+                enum CWDM {

+                    description "Fixed frequency grid as specified in ITU-T G.694.2";

+                }

+                enum FLEX {

+                    description "Flexible frequency grid as specified in ITU-T G.694.1. In this case,

+                        - the allowed frequency slots have a nominal central frequency (in THz) defined by:

+                        193.1 + n × 0.00625 where n is a positive or negative integer including 0 and 0.00625 is the nominal central frequency granularity in THz

+                        - and a slot width defined by:

+                        12.5 × m where m is a positive integer and 12.5 is the slot width granularity in GHz.

+                        Any combination of frequency slots is allowed as long as no two frequency slots overlap.";

+                }

+                enum GRIDLESS {

+                    description "none";

+                }

+                enum UNSPECIFIED {

+                    description "Unspecified/proprietary frequency grid";

+                }

+            }

+            description "The frequency grid standard that specify reference set of frequencies used to denote allowed nominal central frequencies that may be used for defining applications.";

+        }

+        typedef adjustment-granularity {

+            type enumeration {

+                enum G_100GHZ {

+                    description "100000 MHz";

+                }

+                enum G_50GHZ {

+                    description "50000 MHz";

+                }

+                enum G_25GHZ {

+                    description "25000 MHz";

+                }

+                enum G_12_5GHZ {

+                    description "12500 MHz";

+                }

+                enum G_6_25GHZ {

+                    description "6250 MHz";

+                }

+                enum G_3_125GHZ {

+                    description "3125 MHz";

+                }

+                enum UNCONSTRAINED {

+                    description "none";

+                }

+            }

+            description "Adjustment granularity in Gigahertz. As per ITU-T G.694.1, it is used to calculate nominal central frequency";

+        }

+        grouping spectrum-band {

+            leaf upper-frequency {

+                type uint64;

+                description "The upper frequency bound of the media channel spectrum specified in MHz";

+            }

+            leaf lower-frequency {

+                type uint64;

+                description "The lower frequency bound of the media channel spectrum specified in MHz";

+            }

+            container frequency-constraint {

+                uses frequency-constraint;

+                description "none";

+            }

+            description "This data-type holds the spectrum information in termsof upper/lower frequency directly or optionally the information to determin this in terms of the nominal central frequency and spectral width for a FIXED grid (DWDM or CWDM) and FLEX grid type systems.";

+        }

+        typedef modulation-technique {

+            type enumeration {

+                enum RZ {

+                    description "none";

+                }

+                enum NRZ {

+                    description "none";

+                }

+                enum BPSK {

+                    description "none";

+                }

+                enum DPSK {

+                    description "none";

+                }

+                enum QPSK {

+                    description "none";

+                }

+                enum 8QAM {

+                    description "none";

+                }

+                enum 16QAM {

+                    description "none";

+                }

+                enum PAM4 {

+                    description "none";

+                }

+                enum PAM8 {

+                    description "none";

+                }

+                enum UNDEFINED {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        typedef laser-type {

+            type enumeration {

+                enum PUMP {

+                    description "none";

+                }

+                enum MODULATED {

+                    description "none";

+                }

+                enum PULSE {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        typedef photonic-layer-qualifier {

+            type identityref {

+                base PHOTONIC_LAYER_QUALIFIER;

+            }

+            description "none";

+        }

+        typedef laser-control-type {

+            type enumeration {

+                enum FORCED-ON {

+                    description "none";

+                }

+                enum FORCED-OFF {

+                    description "none";

+                }

+                enum AUTOMATIC-LASER-SHUTDOWN {

+                    description "none";

+                }

+                enum UNDEFINED {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        typedef laser-control-status-type {

+            type enumeration {

+                enum ON {

+                    description "none";

+                }

+                enum OFF {

+                    description "none";

+                }

+                enum PULSING {

+                    description "none";

+                }

+                enum UNDEFINED {

+                    description "none";

+                }

+            }

+            description "none";

+        }

+        grouping frequency-constraint {

+            leaf adjustment-granularity {

+                type adjustment-granularity;

+                description "Adjustment granularity in Gigahertz. As per ITU-T G.694.1, it is used to calculate nominal central frequency (in THz)";

+            }

+            leaf grid-type {

+                type grid-type;

+                description "Specifies the frequency grid standard used to determine the nominal central frequency and frequency slot width";

+            }

+            description "This data-type holds the frequency constraint information in terms of GridType ( FIXED grid (DWDM or CWDM) or FLEX grid) and AdjustmentGranularity.";

+        }

+

+}

diff --git a/models/tapi/src/main/yang/tapi-topology@2018-03-07.yang b/models/tapi/src/main/yang/tapi-topology@2018-10-16.yang
similarity index 89%
rename from models/tapi/src/main/yang/tapi-topology@2018-03-07.yang
rename to models/tapi/src/main/yang/tapi-topology@2018-10-16.yang
index 3a21d94..4b7c9f2 100644
--- a/models/tapi/src/main/yang/tapi-topology@2018-03-07.yang
+++ b/models/tapi/src/main/yang/tapi-topology@2018-10-16.yang
@@ -5,39 +5,59 @@
         prefix tapi-common;

     }

     organization "ONF OTCC (Open Transport Configuration & Control) Project";

-    contact "
-        Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-        Project List: <mailto:transport-api@opennetworking.org>
-        Editor: Karthik Sethuraman
-                <mailto:karthik.sethuraman@necam.com>";

+    contact "

+         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>

+         Project List: <mailto:transport-api@opennetworking.org>

+         Editor: Karthik Sethuraman

+                 <mailto:karthik.sethuraman@necam.com>";

     description "

         This module contains TAPI Topology Model definitions.

         Source: TapiTopology.uml

         Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

         License: This module is distributed under the Apache License 2.0";

+    revision 2018-10-16 {

+        description "ONF Transport API version 2.1.0.

+          - The TAPI YANG models included in this TAPI release (v2.1.0) are a *normative* part of the TAPI SDK.

+          - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]

+            <https://github.com/OpenNetworkingFoundation/EagleUmlYang>

+            and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]

+            <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>

+          - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.

+            As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.

+          - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.

+            The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.

+            YANG models included in this release are not backward compatible with previous TAPI releases.

+          - Changes included in this TAPI release (v2.1.0) are listed in

+            <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";

+    }

     revision 2018-03-07 {

-        description "ONF Transport API version 2.0.2

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.2
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

     }

     revision 2018-02-16 {

-        description "ONF Transport API version 2.0.1

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.1
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

     }

     revision 2018-01-02 {

-        description "ONF Transport API version 2.0.0

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.0
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

     }

     augment "/tapi-common:context" {

-        uses topology-context;

+        container topology-context {

+            uses topology-context;

+            description "Augments the base TAPI Context with TopologyService information";

+        }

         description "Augments the base TAPI Context with TopologyService information";

     }

 

@@ -46,9 +66,9 @@
     *************************/

 

     grouping topology-ref {

-        leaf topology-id {

+        leaf topology-uuid {

             type leafref {

-                path '/tapi-common:context/tapi-topology:topology/tapi-topology:uuid';

+                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:uuid';

             }

             description "none";

         }

@@ -57,9 +77,9 @@
 

     grouping link-ref {

         uses topology-ref;

-        leaf link-id {

+        leaf link-uuid {

             type leafref {

-                path '/tapi-common:context/tapi-topology:topology/tapi-topology:link/tapi-topology:uuid';

+                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:link/tapi-topology:uuid';

             }

             description "none";

         }

@@ -68,20 +88,20 @@
 

     grouping node-ref {

         uses topology-ref;

-        leaf node-id {

+        leaf node-uuid {

             type leafref {

-                path '/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:uuid';

+                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:uuid';

             }

             description "none";

         }

         description "none";

     }

 

-    grouping owned-node-edge-point-ref {

+    grouping node-edge-point-ref {

         uses node-ref;

-        leaf owned-node-edge-point-id {

+        leaf node-edge-point-uuid {

             type leafref {

-                path '/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-topology:uuid';

+                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-topology:uuid';

             }

             description "none";

         }

@@ -90,9 +110,9 @@
 

     grouping node-rule-group-ref {

         uses node-ref;

-        leaf node-rule-group-id {

+        leaf node-rule-group-uuid {

             type leafref {

-                path '/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:node-rule-group/tapi-topology:uuid';

+                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:node-rule-group/tapi-topology:uuid';

             }

             description "none";

         }

@@ -104,8 +124,8 @@
     **********************/ 

         grouping link {

             list node-edge-point {

-                uses owned-node-edge-point-ref;

-                key 'topology-id node-id owned-node-edge-point-id';

+                uses node-edge-point-ref;

+                key 'topology-uuid node-uuid node-edge-point-uuid';

                 config false;

                 min-elements 2;

                 description "none";

@@ -146,8 +166,8 @@
                 description "none";

             }

             list aggregated-node-edge-point {

-            	uses owned-node-edge-point-ref;

-                key 'topology-id node-id owned-node-edge-point-id';

+            	uses node-edge-point-ref;

+                key 'topology-uuid node-uuid node-edge-point-uuid';

                 config false;

                 description "none";

             }

@@ -217,15 +237,20 @@
                 config false;

                 description "none";

             }

+            leaf-list supported-cep-layer-protocol-qualifier {

+                type tapi-common:layer-protocol-qualifier;

+                min-elements 1;

+                description "none";

+            }

             list aggregated-node-edge-point {

-            	uses owned-node-edge-point-ref;

-                key 'topology-id node-id owned-node-edge-point-id';

+            	uses node-edge-point-ref;

+                key 'topology-uuid node-uuid node-edge-point-uuid';

                 config false;

                 description "none";

             }

             list mapped-service-interface-point {

                 uses tapi-common:service-interface-point-ref;

-                key 'service-interface-point-id';

+                key 'service-interface-point-uuid';

                 config false;

                 description "NodeEdgePoint mapped to more than ServiceInterfacePoint (slicing/virtualizing) or a ServiceInterfacePoint mapped to more than one NodeEdgePoint (load balancing/Resilience) should be considered experimental";

             }

@@ -342,7 +367,7 @@
         grouping network-topology-service {

             list topology {

                 uses topology-ref;

-                key 'topology-id';

+                key 'topology-uuid';

                 config false;

                 description "none";

             }

@@ -372,7 +397,7 @@
             }

             list associated-node-rule-group {

                 uses node-rule-group-ref;

-                key 'topology-id node-id node-rule-group-id';

+                key 'topology-uuid node-uuid node-rule-group-uuid';

                 min-elements 2;

                 description "none";

             }

@@ -391,14 +416,14 @@
                 description "none";

             }

             list node-edge-point {

-            	uses owned-node-edge-point-ref;

-                key 'topology-id node-id owned-node-edge-point-id';

+            	uses node-edge-point-ref;

+                key 'topology-uuid node-uuid node-edge-point-uuid';

                 min-elements 1;

                 description "none";

             }

             list composed-rule-group {

                 uses node-rule-group-ref;

-                key 'topology-id node-id node-rule-group-id';

+                key 'topology-uuid node-uuid node-rule-group-uuid';

                 description "none";

             }

             list inter-rule-group {

diff --git a/models/tapi/src/main/yang/tapi-virtual-network@2018-03-07.yang b/models/tapi/src/main/yang/tapi-virtual-network@2018-10-16.yang
similarity index 81%
rename from models/tapi/src/main/yang/tapi-virtual-network@2018-03-07.yang
rename to models/tapi/src/main/yang/tapi-virtual-network@2018-10-16.yang
index 3bea4fb..25f33d8 100644
--- a/models/tapi/src/main/yang/tapi-virtual-network@2018-03-07.yang
+++ b/models/tapi/src/main/yang/tapi-virtual-network@2018-10-16.yang
@@ -8,48 +8,68 @@
         prefix tapi-common;

     }

     organization "ONF OTCC (Open Transport Configuration & Control) Project";

-    contact "
-        Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-        Project List: <mailto:transport-api@opennetworking.org>
-        Editor: Karthik Sethuraman
-                <mailto:karthik.sethuraman@necam.com>";

+    contact "

+         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>

+         Project List: <mailto:transport-api@opennetworking.org>

+         Editor: Karthik Sethuraman

+                 <mailto:karthik.sethuraman@necam.com>";

     description "

         This module contains TAPI Virtual Network Model definitions.

         Source: TapiVirtualNetwork.uml

         Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.

         License: This module is distributed under the Apache License 2.0";

+    revision 2018-10-16 {

+        description "ONF Transport API version 2.1.0.

+          - The TAPI YANG models included in this TAPI release (v2.1.0) are a *normative* part of the TAPI SDK.

+          - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]

+            <https://github.com/OpenNetworkingFoundation/EagleUmlYang>

+            and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]

+            <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>

+          - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.

+            As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.

+          - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.

+            The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.

+            YANG models included in this release are not backward compatible with previous TAPI releases.

+          - Changes included in this TAPI release (v2.1.0) are listed in

+            <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";

+    }

     revision 2018-03-07 {

-        description "ONF Transport API version 2.0.2

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.2
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";

     }

     revision 2018-02-16 {

-        description "ONF Transport API version 2.0.1

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.1
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";

     }

     revision 2018-01-02 {

-        description "ONF Transport API version 2.0.0

-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.

+        description "ONF Transport API version 2.0.0
+        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
         Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";

-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model

+        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
                   <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";

     }

     augment "/tapi-common:context" {

-        uses virtual-network-context;

+        container virtual-network-context {

+            uses virtual-network-context;

+            description "Augments the base TAPI Context with VirtualNetworkService information";

+        }

         description "Augments the base TAPI Context with VirtualNetworkService information";

     }

     /*************************

      * definitions of refrences

      *************************/

      grouping virtual-nw-service-ref {

-         leaf virtual-nw-service-id {

+         leaf virtual-nw-service-uuid {

              type leafref {

-                 path '/tapi-common:context/tapi-virtual-network:virtual-nw-service/tapi-virtual-network:uuid';

+                 path '/tapi-common:context/tapi-virtual-network:virtual-network-context/tapi-virtual-network:virtual-nw-service/tapi-virtual-network:uuid';

              }

              description "none";

          }

@@ -72,7 +92,7 @@
             }

             list diversity-exclusion {

                 uses virtual-nw-service-ref;

-                key 'virtual-nw-service-id';

+                key 'virtual-nw-service-uuid';

                 config false;

                 description "none";

             }

diff --git a/modules.bzl b/modules.bzl
index d601885..26a5da4 100644
--- a/modules.bzl
+++ b/modules.bzl
@@ -288,7 +288,8 @@
     "//apps/dhcp/app:onos-apps-dhcp-app",
     "//apps/imr/api:onos-apps-imr-api",
     "//apps/imr/app:onos-apps-imr-app",
-    "//apps/dhcprelay:onos-apps-dhcprelay",
+    "//apps/dhcprelay/app:onos-apps-dhcprelay-app",
+    "//apps/dhcprelay/web:onos-apps-dhcprelay-web",
     "//apps/fwd:onos-apps-fwd",
     "//apps/iptopology-api:onos-apps-iptopology-api",
     "//apps/routing/common:onos-apps-routing-common",
diff --git a/pipelines/fabric/src/main/resources/include/header.p4 b/pipelines/fabric/src/main/resources/include/header.p4
index 46fa022..df29408 100644
--- a/pipelines/fabric/src/main/resources/include/header.p4
+++ b/pipelines/fabric/src/main/resources/include/header.p4
@@ -209,7 +209,9 @@
     int_egress_tstamp_t int_egress_tstamp;
     int_q_congestion_t int_q_congestion;
     int_egress_port_tx_util_t int_egress_tx_util;
+#ifdef WITH_INT_SINK
     int_data_t int_data;
+#endif // WITH_INT_SINK
     intl4_tail_t intl4_tail;
 #endif //WITH_INT
 }
diff --git a/pipelines/fabric/src/main/resources/include/int/int_header.p4 b/pipelines/fabric/src/main/resources/include/int/int_header.p4
index 4e352ee..9b1f0e4 100644
--- a/pipelines/fabric/src/main/resources/include/int/int_header.p4
+++ b/pipelines/fabric/src/main/resources/include/int/int_header.p4
@@ -62,11 +62,13 @@
     bit<6> dscp;
 }
 
+#ifdef WITH_INT_SINK
 header int_data_t {
     // Maximum int metadata stack size in bits:
     // (0xFF -4) * 32 (excluding INT shim header, tail header and INT header)
     varbit<8032> data;
 }
+#endif // WITH_INT_SINK
 
 #ifdef WITH_INT_TRANSIT
 // INT meta-value headers - 4 bytes each
diff --git a/pipelines/fabric/src/main/resources/include/parser.p4 b/pipelines/fabric/src/main/resources/include/parser.p4
index 3f77df9..6aef63b 100644
--- a/pipelines/fabric/src/main/resources/include/parser.p4
+++ b/pipelines/fabric/src/main/resources/include/parser.p4
@@ -263,7 +263,9 @@
         packet.emit(hdr.int_q_congestion);
         packet.emit(hdr.int_egress_tx_util);
 #endif // WITH_INT_TRANSIT
+#ifdef WITH_INT_SINK
         packet.emit(hdr.int_data);
+#endif // WITH_INT_SINK
         packet.emit(hdr.intl4_tail);
 #endif // WITH_INT
     }
diff --git a/pipelines/fabric/src/main/resources/p4c-out/fabric-int/bmv2/default/bmv2.json b/pipelines/fabric/src/main/resources/p4c-out/fabric-int/bmv2/default/bmv2.json
index 4f390ee..9f51572 100644
--- a/pipelines/fabric/src/main/resources/p4c-out/fabric-int/bmv2/default/bmv2.json
+++ b/pipelines/fabric/src/main/resources/p4c-out/fabric-int/bmv2/default/bmv2.json
@@ -257,16 +257,8 @@
       ]
     },
     {
-      "name" : "int_data_t",
-      "id" : 22,
-      "fields" : [
-        ["data", "*"]
-      ],
-      "max_length" : 1004
-    },
-    {
       "name" : "intl4_tail_t",
-      "id" : 23,
+      "id" : 22,
       "fields" : [
         ["next_proto", 8, false],
         ["dest_port", 16, false],
@@ -276,7 +268,7 @@
     },
     {
       "name" : "int_metadata_t",
-      "id" : 24,
+      "id" : 23,
       "fields" : [
         ["source", 1, 0],
         ["transit", 1, 0],
@@ -446,22 +438,15 @@
       "pi_omit" : true
     },
     {
-      "name" : "int_data",
-      "id" : 22,
-      "header_type" : "int_data_t",
-      "metadata" : false,
-      "pi_omit" : true
-    },
-    {
       "name" : "intl4_tail",
-      "id" : 23,
+      "id" : 22,
       "header_type" : "intl4_tail_t",
       "metadata" : false,
       "pi_omit" : true
     },
     {
       "name" : "userMetadata.int_meta",
-      "id" : 24,
+      "id" : 23,
       "header_type" : "int_metadata_t",
       "metadata" : true,
       "pi_omit" : true
@@ -1017,7 +1002,7 @@
         "column" : 8,
         "source_fragment" : "FabricDeparser"
       },
-      "order" : ["packet_in", "ethernet", "vlan_tag", "mpls", "arp", "ipv4", "tcp", "udp", "icmp", "intl4_shim", "int_header", "int_switch_id", "int_port_ids", "int_hop_latency", "int_q_occupancy", "int_ingress_tstamp", "int_egress_tstamp", "int_q_congestion", "int_egress_tx_util", "int_data", "intl4_tail"]
+      "order" : ["packet_in", "ethernet", "vlan_tag", "mpls", "arp", "ipv4", "tcp", "udp", "icmp", "intl4_shim", "int_header", "int_switch_id", "int_port_ids", "int_hop_latency", "int_q_occupancy", "int_ingress_tstamp", "int_egress_tstamp", "int_q_congestion", "int_egress_tx_util", "intl4_tail"]
     }
   ],
   "meter_arrays" : [],
diff --git a/pipelines/fabric/src/main/resources/p4c-out/fabric-spgw-int/bmv2/default/bmv2.json b/pipelines/fabric/src/main/resources/p4c-out/fabric-spgw-int/bmv2/default/bmv2.json
index a4cce10..5672dc8 100644
--- a/pipelines/fabric/src/main/resources/p4c-out/fabric-spgw-int/bmv2/default/bmv2.json
+++ b/pipelines/fabric/src/main/resources/p4c-out/fabric-spgw-int/bmv2/default/bmv2.json
@@ -277,16 +277,8 @@
       ]
     },
     {
-      "name" : "int_data_t",
-      "id" : 23,
-      "fields" : [
-        ["data", "*"]
-      ],
-      "max_length" : 1004
-    },
-    {
       "name" : "intl4_tail_t",
-      "id" : 24,
+      "id" : 23,
       "fields" : [
         ["next_proto", 8, false],
         ["dest_port", 16, false],
@@ -296,7 +288,7 @@
     },
     {
       "name" : "spgw_meta_t",
-      "id" : 25,
+      "id" : 24,
       "fields" : [
         ["direction", 2, false],
         ["ipv4_len", 16, false],
@@ -308,7 +300,7 @@
     },
     {
       "name" : "int_metadata_t",
-      "id" : 26,
+      "id" : 25,
       "fields" : [
         ["source", 1, 0],
         ["transit", 1, 0],
@@ -513,29 +505,22 @@
       "pi_omit" : true
     },
     {
-      "name" : "int_data",
-      "id" : 27,
-      "header_type" : "int_data_t",
-      "metadata" : false,
-      "pi_omit" : true
-    },
-    {
       "name" : "intl4_tail",
-      "id" : 28,
+      "id" : 27,
       "header_type" : "intl4_tail_t",
       "metadata" : false,
       "pi_omit" : true
     },
     {
       "name" : "userMetadata.spgw",
-      "id" : 29,
+      "id" : 28,
       "header_type" : "spgw_meta_t",
       "metadata" : true,
       "pi_omit" : true
     },
     {
       "name" : "userMetadata.int_meta",
-      "id" : 30,
+      "id" : 29,
       "header_type" : "int_metadata_t",
       "metadata" : true,
       "pi_omit" : true
@@ -1285,7 +1270,7 @@
         "column" : 8,
         "source_fragment" : "FabricDeparser"
       },
-      "order" : ["packet_in", "ethernet", "vlan_tag", "mpls", "arp", "gtpu_ipv4", "gtpu_udp", "gtpu", "ipv4", "tcp", "udp", "icmp", "intl4_shim", "int_header", "int_switch_id", "int_port_ids", "int_hop_latency", "int_q_occupancy", "int_ingress_tstamp", "int_egress_tstamp", "int_q_congestion", "int_egress_tx_util", "int_data", "intl4_tail"]
+      "order" : ["packet_in", "ethernet", "vlan_tag", "mpls", "arp", "gtpu_ipv4", "gtpu_udp", "gtpu", "ipv4", "tcp", "udp", "icmp", "intl4_shim", "int_header", "int_switch_id", "int_port_ids", "int_hop_latency", "int_q_occupancy", "int_ingress_tstamp", "int_egress_tstamp", "int_q_congestion", "int_egress_tx_util", "intl4_tail"]
     }
   ],
   "meter_arrays" : [],
diff --git a/protocols/p4runtime/api/src/main/java/org/onosproject/p4runtime/api/P4RuntimeClient.java b/protocols/p4runtime/api/src/main/java/org/onosproject/p4runtime/api/P4RuntimeClient.java
index f30ec28..f44c629 100644
--- a/protocols/p4runtime/api/src/main/java/org/onosproject/p4runtime/api/P4RuntimeClient.java
+++ b/protocols/p4runtime/api/src/main/java/org/onosproject/p4runtime/api/P4RuntimeClient.java
@@ -212,10 +212,13 @@
      * @param group    the action group
      * @param opType   write operation type
      * @param pipeconf the pipeconf currently deployed on the device
+     * @param maxMemberSize the maximum number of members that can be added to the group.
+     *                      This is meaningful only if it's an INSERT operation, otherwise
+     *                      its value should be 0
      * @return true if the operation was successful, false otherwise
      */
     CompletableFuture<Boolean> writeActionGroup(
-            PiActionGroup group, WriteOperationType opType, PiPipeconf pipeconf);
+            PiActionGroup group, WriteOperationType opType, PiPipeconf pipeconf, int maxMemberSize);
 
     /**
      * Dumps all groups currently installed for the given action profile.
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileGroupEncoder.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileGroupEncoder.java
index 709b92e..cb0735d 100644
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileGroupEncoder.java
+++ b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileGroupEncoder.java
@@ -36,8 +36,6 @@
  */
 final class ActionProfileGroupEncoder {
 
-    private static final int GROUP_SIZE_ADDITIONAL_MEMBERS = 10;
-
     private ActionProfileGroupEncoder() {
         // hide default constructor
     }
@@ -47,13 +45,14 @@
      *
      * @param piActionGroup the action profile group
      * @param pipeconf      the pipeconf
+     * @param maxMemberSize the max member size of action group
      * @return a action profile group encoded from PI action group
      * @throws P4InfoBrowser.NotFoundException if can't find action profile from
      *                                         P4Info browser
      * @throws EncodeException                 if can't find P4Info from
      *                                         pipeconf
      */
-    static ActionProfileGroup encode(PiActionGroup piActionGroup, PiPipeconf pipeconf)
+    static ActionProfileGroup encode(PiActionGroup piActionGroup, PiPipeconf pipeconf, int maxMemberSize)
             throws P4InfoBrowser.NotFoundException, EncodeException {
         P4InfoBrowser browser = PipeconfHelper.getP4InfoBrowser(pipeconf);
 
@@ -78,15 +77,9 @@
             actionProfileGroupBuilder.addMembers(member);
         });
 
-        // FIXME: ONOS-7797 Make this configurable, or find a different way of
-        // supporting group modify. In P4Runtime, group size cannot be modified
-        // once the group is created. To allow adding members to an existing
-        // group we set max_size to support an additional number of members
-        // other than the one already defined in the PI group. Clearly, this
-        // will break if we try to add more than GROUP_SIZE_ADDITIONAL_MEMBERS
-        // to the same group.
-        actionProfileGroupBuilder.setMaxSize(
-                piActionGroup.members().size() + GROUP_SIZE_ADDITIONAL_MEMBERS);
+        if (maxMemberSize > 0) {
+            actionProfileGroupBuilder.setMaxSize(maxMemberSize);
+        }
 
         return actionProfileGroupBuilder.build();
     }
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java
index a06d67e..821e744 100644
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java
+++ b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java
@@ -306,8 +306,9 @@
     @Override
     public CompletableFuture<Boolean> writeActionGroup(PiActionGroup group,
                                                        WriteOperationType opType,
-                                                       PiPipeconf pipeconf) {
-        return supplyInContext(() -> doWriteActionGroup(group, opType, pipeconf),
+                                                       PiPipeconf pipeconf,
+                                                       int maxMemberSize) {
+        return supplyInContext(() -> doWriteActionGroup(group, opType, pipeconf, maxMemberSize),
                                "writeActionGroup-" + opType.name());
     }
 
@@ -950,10 +951,15 @@
                 "action profile members");
     }
 
-    private boolean doWriteActionGroup(PiActionGroup group, WriteOperationType opType, PiPipeconf pipeconf) {
+    private boolean doWriteActionGroup(PiActionGroup group, WriteOperationType opType, PiPipeconf pipeconf,
+                                       int maxMemberSize) {
         final ActionProfileGroup actionProfileGroup;
+        if (opType == P4RuntimeClient.WriteOperationType.INSERT && maxMemberSize < group.members().size()) {
+            log.warn("Unable to encode group, since group member larger than maximum member size");
+            return false;
+        }
         try {
-            actionProfileGroup = ActionProfileGroupEncoder.encode(group, pipeconf);
+            actionProfileGroup = ActionProfileGroupEncoder.encode(group, pipeconf, maxMemberSize);
         } catch (EncodeException | P4InfoBrowser.NotFoundException e) {
             log.warn("Unable to encode group, aborting {} operation: {}", e.getMessage(), opType.name());
             return false;
diff --git a/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java b/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java
index 60913ed..36e60ea 100644
--- a/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java
+++ b/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java
@@ -161,7 +161,7 @@
     @Test
     public void testInsertPiActionGroup() throws Exception {
         CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(1);
-        client.writeActionGroup(GROUP, INSERT, PIPECONF);
+        client.writeActionGroup(GROUP, INSERT, PIPECONF, 3);
         complete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
         WriteRequest result = p4RuntimeServerImpl.getWriteReqs().get(0);
         assertEquals(1, result.getDeviceId());
diff --git a/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/DefaultRestSBDevice.java b/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/DefaultRestSBDevice.java
index 18ed537..7513009 100644
--- a/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/DefaultRestSBDevice.java
+++ b/protocols/rest/api/src/main/java/org/onosproject/protocol/rest/DefaultRestSBDevice.java
@@ -200,13 +200,13 @@
         return MoreObjects.toStringHelper(this)
                 .omitNullValues()
                 .add("url", url)
-                .add("testUrl", testUrl)
                 .add("protocol", protocol)
                 .add("username", username)
-                .add("port", port)
                 .add("ip", ip)
+                .add("port", port)
                 .add("authentication", authenticationScheme.name())
                 .add("token", token)
+                .add("testUrl", testUrl.orElse(null))
                 .add("manufacturer", manufacturer.orElse(null))
                 .add("hwVersion", hwVersion.orElse(null))
                 .add("swVersion", swVersion.orElse(null))
diff --git a/tools/package/bin/onos-form-cluster b/tools/package/bin/onos-form-cluster
deleted file mode 100755
index 4e3645c..0000000
--- a/tools/package/bin/onos-form-cluster
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright 2015-present Open Networking Foundation
-#
-# 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.
-#
-
-# -----------------------------------------------------------------------------
-# Forms ONOS cluster using REST API of each separate instance.
-# -----------------------------------------------------------------------------
-function usage() {
-    echo "usage: $(basename $0)[-x] [-P port] [-u user] [-p password] [-s partitionSize] ip1 ip2..." && exit 1
-}
-
-ONOS_WEB_USER=${ONOS_WEB_USER:-onos}  # ONOS WEB User defaults to 'onos'
-ONOS_WEB_PASS=${ONOS_WEB_PASS:-rocks} # ONOS WEB Password defaults to 'rocks'
-ONOS_WEB_PORT=${ONOS_WEB_PORT:-8181}  # REST API port defaults to '8181'
-
-port=${ONOS_WEB_PORT}
-user=${ONOS_WEB_USER}
-password=${ONOS_WEB_PASS}
-
-# Scan arguments for user/password or other options...
-while getopts P:u:p:s: o; do
-    case "$o" in
-        P) port=$OPTARG;;
-        u) user=$OPTARG;;
-        p) password=$OPTARG;;
-        s) partitionsize=$OPTARG;;
-        *) usage;;
-    esac
-done
-
-let OPC=$OPTIND-1
-shift $OPC
-
-[ $# -lt 2 ] && usage
-
-ip=$1
-shift
-nodes=$*
-
-ipPrefix=${ip%.*}
-
-aux=/tmp/${ipPrefix}.cluster.json
-trap "rm -f $aux" EXIT
-
-echo "{ \"nodes\": [ { \"ip\": \"$ip\" }" > $aux
-for node in $nodes; do
-    echo ", { \"ip\": \"$node\" }" >> $aux
-done
-echo "], \"ipPrefix\": \"$ipPrefix.*\"" >> $aux
-if ! [ -z ${partitionsize} ]; then
-    echo ", \"partitionSize\": $partitionsize" >> $aux
-fi
-echo " }" >> $aux
-
-for node in $ip $nodes; do
-    echo "Forming cluster on $node..."
-    curl --fail -sSL --user $user:$password -X POST \
-        http://$node:$port/onos/v1/cluster/configuration -d @$aux
-done
diff --git a/tools/package/runtime/bin/onos-diagnostics b/tools/package/runtime/bin/onos-diagnostics
index 8aba732..39d2c06 100755
--- a/tools/package/runtime/bin/onos-diagnostics
+++ b/tools/package/runtime/bin/onos-diagnostics
@@ -99,12 +99,16 @@
     "sr-ecmp-spg"
     "sr-should-program"
     "sr-link-state"
-    "sr-mcast-next"
     "sr-mcast-tree"
     "sr-mcast-leader"
     "sr-mcast-role"
-    "sr-next-hops"
     "sr-pw-list"
+    "sr-next-mcast"
+    "sr-next-dst"
+    "sr-next-port"
+    "sr-next-vlan"
+    "sr-next-pw"
+    "sr-next-xconnect"
     "dhcp-relay"
 
     "mcast-host-routes"
diff --git a/tools/test/bin/atomix-install b/tools/test/bin/atomix-install
index af210ae..a076d00 100755
--- a/tools/test/bin/atomix-install
+++ b/tools/test/bin/atomix-install
@@ -47,8 +47,7 @@
     [ -f $ATOMIX_INSTALL_DIR/bin/atomix-agent ] && echo \"Atomix is already installed\" && exit 1
 
     sudo mkdir -p $ATOMIX_INSTALL_DIR && sudo chown ${ONOS_USER}:${ONOS_GROUP} $ATOMIX_INSTALL_DIR
-    sudo wget -O $ATOMIX_INSTALL_DIR/atomix-dist.tar.gz https://oss.sonatype.org/content/repositories/releases/io/atomix/atomix-dist/3.0.7/atomix-dist-3.0.7.tar.gz
-    tar -xvf $ATOMIX_INSTALL_DIR/atomix-dist.tar.gz -C $ATOMIX_INSTALL_DIR
+    tar -xvf /tmp/atomix.tar.gz -C $ATOMIX_INSTALL_DIR
 "
 
 # Configure the ONOS installation
diff --git a/tools/test/bin/atomix-push-bits b/tools/test/bin/atomix-push-bits
new file mode 100755
index 0000000..6b5d68b
--- /dev/null
+++ b/tools/test/bin/atomix-push-bits
@@ -0,0 +1,64 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Remotely pushes bits to a remote node in preparation for install.
+# -----------------------------------------------------------------------------
+function _usage () {
+cat << _EOF_
+usage:
+ $(basename $0) [node]
+
+options:
+- [node] : the target node to prime for installation
+
+summary:
+ Remotely pushes Atomix bits to a remote node in preparation for install.
+
+ $(basename $0) is invoked as part of 'atomix-install', and shouldn't be
+ directly invoked for the most part.
+
+_EOF_
+}
+
+[ $# -gt 1 ] || [ "$1" = "-h" ] && _usage && exit 0
+[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT isn't set correctly" >&2 && exit 1
+
+set -e
+
+. $ONOS_ROOT/tools/build/envDefaults
+
+ATOMIX_VERSION=${ATOMIX_VERSION:-3.0.7}
+ATOMIX_MAVEN=~/.m2/repository/io/atomix/atomix-dist/$ATOMIX_VERSION/atomix-dist-$ATOMIX_VERSION.tar.gz
+ATOMIX_LOCAL=/tmp/atomix-$ATOMIX_VERSION.tar.gz
+ATOMIX_REMOTE=https://oss.sonatype.org/content/repositories/releases/io/atomix/atomix-dist/$ATOMIX_VERSION/atomix-dist-$ATOMIX_VERSION.tar.gz
+
+node=${1:-$OCI}
+remote=$ONOS_USER@$node
+remote_with_bracket=$ONOS_USER@[$node]
+SSH_OPTIONS=" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
+ -o ControlMaster=auto -o ControlPath=~/.ssh/mux-%r@%h:%p \
+ -o ControlPersist=300 "
+
+if [ ! -z "$ATOMIX_ROOT" ]; then
+  echo "Pushing to $node from $ATOMIX_ROOT"
+  ATOMIX_TAR=$ATOMIX_ROOT/dist/target/atomix.tar.gz
+elif [ -e $ATOMIX_MAVEN ]; then
+  echo "Pushing to $node from $ATOMIX_MAVEN"
+  ATOMIX_TAR=$ATOMIX_MAVEN
+else
+  echo "Pushing to $node from $ATOMIX_LOCAL"
+  rm $ATOMIX_LOCAL
+  wget -O $ATOMIX_LOCAL $ATOMIX_REMOTE
+  ATOMIX_TAR=$ATOMIX_LOCAL
+fi
+
+echo "Using scp"
+
+locHash=$(cksum $ATOMIX_TAR | cut -d' ' -f1,2)
+remHash=$(ssh $remote cksum /tmp/atomix.tar.gz 2>/dev/null | cut -d' ' -f1,2)
+
+if [ -n "$locHash" ] && [ "$locHash" = "$remHash" ]; then
+  echo "Atomix bits /tmp/atomix.tar.gz already up-to-date on $node..."
+else
+  ssh $remote rm -f $ATOMIX_TAR
+  scp -q $ATOMIX_TAR $remote_with_bracket:/tmp/atomix.tar.gz
+fi
diff --git a/tools/test/bin/atomix-push-bits-through-proxy b/tools/test/bin/atomix-push-bits-through-proxy
new file mode 100755
index 0000000..24e2174
--- /dev/null
+++ b/tools/test/bin/atomix-push-bits-through-proxy
@@ -0,0 +1,27 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Remotely pushes Atomix bits to all remote nodes in preparation for install.
+# -----------------------------------------------------------------------------
+
+[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
+. $ONOS_ROOT/tools/build/envDefaults
+
+OCT=${OCT:-$OCI}
+node=${1:-$OCT}
+remote=$ONOS_USER@$node
+shift
+
+echo "Pushing to proxy $node..."
+atomix-push-bits $node
+
+others=$(env | sort | egrep "^OCC[0-9]+" | cut -d= -f2 | grep -vE "^$OCT\$")
+
+ssh $remote "
+  for other in ${others//$'\n'/ } ; do
+    echo \"Pushing to \$other ...\";
+    ssh -o StrictHostKeyChecking=no $ONOS_USER@\$other rm -rf /tmp/atomix.tar.gz &&
+    scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
+        /tmp/atomix.tar.gz \
+        $ONOS_USER@[\$other]:/tmp/atomix.tar.gz
+  done
+"
diff --git a/tools/test/bin/onos-form-cluster b/tools/test/bin/onos-form-cluster
deleted file mode 100755
index a9f6a5b..0000000
--- a/tools/test/bin/onos-form-cluster
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-# -----------------------------------------------------------------------------
-# Forms ONOS cluster using REST API.
-# -----------------------------------------------------------------------------
-
-[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
-. $ONOS_ROOT/tools/build/envDefaults
-
-# Scan arguments for user/password or other options...
-while getopts u:p:s: o; do
-    case "$o" in
-        u) user=$OPTARG;;
-        p) password=$OPTARG;;
-        s) partitionsize=$OPTARG;;
-    esac
-done
-ONOS_WEB_USER=${ONOS_WEB_USER:-onos} # ONOS WEB User defaults to 'onos'
-ONOS_WEB_PASS=${ONOS_WEB_PASS:-rocks} # ONOS WEB Password defaults to 'rocks'
-user=${user:-$ONOS_WEB_USER}
-password=${password:-$ONOS_WEB_PASS}
-let OPC=$OPTIND-1
-shift $OPC
-
-node=${1:-$OCI}
-
-if [ $node = "cell" ]; then
-    nodes=${ONOS_INSTANCES}
-    node=${OCI}
-else
-    nodes="$@"
-fi
-
-if ! [ -z ${partitionsize} ]; then
-    partitionarg="-s ${partitionsize}"
-else
-    partitionarg=
-fi
-
-set -x
-
-ssh $ONOS_USER@$node $ONOS_INSTALL_DIR/bin/onos-form-cluster -u $user -p $partitionarg $password $nodes
diff --git a/tools/test/scenarios/setup.xml b/tools/test/scenarios/setup.xml
index ab31d66..41eb65d 100644
--- a/tools/test/scenarios/setup.xml
+++ b/tools/test/scenarios/setup.xml
@@ -15,14 +15,16 @@
   -->
 <scenario name="setup" description="ONOS cluster setup">
     <group name="Setup">
-        <step name="Push-Bits" exec="onos-push-bits-through-proxy" if="${OCT}"/>
+        <step name="Push-Atomix-Bits" exec="atomix-push-bits-through-proxy" if="${OCT}"/>
+        <step name="Push-ONOS-Bits" exec="onos-push-bits-through-proxy" if="${OCT}"/>
+
         <step name="Enable-Flow-Objective-Intents" if="${ONOS_USE_FOI}"
               exec="onos ${OC1} cfg set org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator useFlowObjectives true"/>
 
         <group name="Cleanup">
             <group name="Cleanup-ONOS">
                 <parallel var="${OC#}">
-                    <step name="Push-Bits-${#}" exec="onos-push-bits ${OC#}"
+                    <step name="Push-ONOS-Bits-${#}" exec="onos-push-bits ${OC#}"
                           unless="${OCT}"/>
                     <step name="Uninstall-${#}" exec="onos-uninstall ${OC#}"/>
                     <step name="Kill-${#}" env="~" exec="onos-kill ${OC#}"
@@ -31,6 +33,8 @@
             </group>
             <group name="Cleanup-Atomix-OC" unless="${OCC1}">
                 <parallel var="${OC#}">
+                    <step name="Push-Atomix-Bits-${#}" exec="atomix-push-bits ${OC#}"
+                          unless="${OCT}"/>
                     <step name="Atomix-Kill-${#}"
                           env="~"
                           exec="atomix-kill ${OC#}"/>
@@ -41,6 +45,8 @@
             </group>
             <group name="Cleanup-Atomix-OCC" if="${OCC1}">
                 <parallel var="${OCC#}">
+                    <step name="Push-Atomix-Bits-${#}" exec="atomix-push-bits ${OC#}"
+                          unless="${OCT}"/>
                     <step name="Atomix-Kill-${#}"
                           env="~"
                           exec="atomix-kill ${OCC#}"/>
@@ -58,7 +64,7 @@
                 <group name="Parallel-Install-Atomix">
                     <parallel var="${OC#}">
                         <step name="Parallel-Install-Atomix-${#}" exec="atomix-install ${OC#}"
-                              requires="Generate-Cluster-Key,Push-Bits-${#},Push-Bits,Cleanup"/>
+                              requires="Generate-Cluster-Key,Push-Atomix-Bits-${#},Push-Atomix-Bits,Cleanup"/>
                     </parallel>
                 </group>
             </group>
@@ -67,7 +73,7 @@
                 <group name="Parallel-Install-Atomix">
                     <parallel var="${OCC#}">
                         <step name="Parallel-Install-Atomix-${#}" exec="atomix-install ${OCC#}"
-                              requires="Generate-Cluster-Key,Push-Bits-${#},Push-Bits,Cleanup"/>
+                              requires="Generate-Cluster-Key,Push-Atomix-Bits-${#},Push-Atomix-Bits,Cleanup"/>
                     </parallel>
                 </group>
             </group>
@@ -79,14 +85,14 @@
                             starts="Sequential-Install-${#}"
                             ends="Sequential-Install-${#-1}">
                     <step name="Sequential-Install-${#}" exec="onos-install ${OC#}"
-                          requires="Generate-Cluster-Key,Push-Bits-${#},Push-Bits,Cleanup,Install-Atomix"/>
+                          requires="Generate-Cluster-Key,Push-ONOS-Bits-${#},Push-ONOS-Bits,Cleanup,Install-Atomix"/>
                 </sequential>
             </group>
 
             <group name="Parallel-Install-ONOS" unless="${ONOS_STC_SEQ_START}">
                 <parallel var="${OC#}">
                     <step name="Parallel-Install-${#}" exec="onos-install ${OC#}"
-                          requires="Generate-Cluster-Key,Push-Bits-${#},Push-Bits,Cleanup,Install-Atomix"/>
+                          requires="Generate-Cluster-Key,Push-ONOS-Bits-${#},Push-ONOS-Bits,Cleanup,Install-Atomix"/>
                 </parallel>
             </group>
         </group>
diff --git a/utils/misc/src/main/java/org/onlab/packet/EAPOL.java b/utils/misc/src/main/java/org/onlab/packet/EAPOL.java
index 741d302..3d7d7c4 100644
--- a/utils/misc/src/main/java/org/onlab/packet/EAPOL.java
+++ b/utils/misc/src/main/java/org/onlab/packet/EAPOL.java
@@ -29,7 +29,8 @@
  */
 public class EAPOL extends BasePacket {
 
-    private byte version = 0x01;
+    // private byte version = 0x01;
+    private byte version = 0x03;
     private byte eapolType;
     private short packetLength;
 
@@ -37,12 +38,13 @@
 
     // EAPOL Packet Type
     public static final byte EAPOL_PACKET = 0x0;
-    public static final byte EAPOL_START  = 0x1;
+    public static final byte EAPOL_START = 0x1;
     public static final byte EAPOL_LOGOFF = 0x2;
-    public static final byte EAPOL_KEY    = 0x3;
-    public static final byte EAPOL_ASF    = 0x4;
+    public static final byte EAPOL_KEY = 0x3;
+    public static final byte EAPOL_ASF = 0x4;
+    public static final byte EAPOL_MKA = 0X5;
 
-    public static final MacAddress PAE_GROUP_ADDR = MacAddress.valueOf(new byte[] {
+    public static final MacAddress PAE_GROUP_ADDR = MacAddress.valueOf(new byte[]{
             (byte) 0x01, (byte) 0x80, (byte) 0xc2, (byte) 0x00, (byte) 0x00, (byte) 0x03
     });
 
@@ -187,13 +189,16 @@
 
             if (eapol.packetLength > 0) {
                 checkHeaderLength(length, HEADER_LENGTH + eapol.packetLength);
-                // deserialize the EAP Payload
-                eapol.payload = EAP.deserializer().deserialize(data,
-                        bb.position(), bb.limit() - bb.position());
-
+                if (eapol.getEapolType() == EAPOL_MKA) {
+                    eapol.payload = EAPOLMkpdu.deserializer().deserialize(data,
+                            bb.position(), bb.limit() - bb.position());
+                } else {
+                    // deserialize the EAP Payload
+                    eapol.payload = EAP.deserializer().deserialize(data,
+                            bb.position(), bb.limit() - bb.position());
+                }
                 eapol.payload.setParent(eapol);
             }
-
             return eapol;
         };
     }
diff --git a/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpdu.java b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpdu.java
new file mode 100644
index 0000000..fb67401
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpdu.java
@@ -0,0 +1,226 @@
+
+/*
+ * 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.onlab.packet;
+
+import java.nio.ByteBuffer;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+
+/**
+ * EAPOL MKA (EAPOL MAC Key Agreement Protocol) header.
+ */
+public class EAPOLMkpdu extends BasePacket {
+
+    // Parameter Sets.
+    protected Map<Byte, IPacket> parameterSets = new LinkedHashMap<>();
+
+    /*
+     * Parameter Serialization Order.
+     * IEEE 802.1x Clause 11.11.3.
+     */
+    public static byte[] parametersetSerializerKeyList = new byte[]{
+            EAPOLMkpduParameterSet.PARAMETERSET_TYPE_BASIC,
+            EAPOLMkpduParameterSet.PARAMETERSET_TYPE_LIVE_PEER_LIST,
+            EAPOLMkpduParameterSet.PARAMETERSET_TYPE_POTENTIAL_PEER_LIST,
+            EAPOLMkpduParameterSet.PARAMETERSET_TYPE_MACSEC_SAK_USE,
+            EAPOLMkpduParameterSet.PARAMETERSET_TYPE_DISTRIBUTED_SAK,
+            // TODO: Fill other types.
+            EAPOLMkpduParameterSet.PARAMETERSET_TYPE_ICV_INDICATOR
+    };
+
+
+     // Various Parameter Set Deserializers.
+
+    public static final Map<Byte, Deserializer<? extends IPacket>> PARAMETERSET_DESERIALIZER_MAP =
+            new LinkedHashMap<>();
+
+    static {
+        EAPOLMkpdu.PARAMETERSET_DESERIALIZER_MAP.put(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_BASIC,
+                EAPOLMkpduBasicParameterSet.deserializer());
+        EAPOLMkpdu.PARAMETERSET_DESERIALIZER_MAP.put(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_LIVE_PEER_LIST,
+                EAPOLMkpduPeerListParameterSet.deserializer());
+        EAPOLMkpdu.PARAMETERSET_DESERIALIZER_MAP.put(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_POTENTIAL_PEER_LIST,
+                EAPOLMkpduPeerListParameterSet.deserializer());
+        EAPOLMkpdu.PARAMETERSET_DESERIALIZER_MAP.put(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_MACSEC_SAK_USE,
+                EAPOLMkpduMACSecUseParameterSet.deserializer());
+        EAPOLMkpdu.PARAMETERSET_DESERIALIZER_MAP.put(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_DISTRIBUTED_SAK,
+                EAPOLMkpduDistributedSAKParameterSet.deserializer());
+        EAPOLMkpdu.PARAMETERSET_DESERIALIZER_MAP.put(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_ICV_INDICATOR,
+                EAPOLMkpduICVIndicatorParameterSet.deserializer());
+    }
+
+    @Override
+    public byte[] serialize() {
+        int payloadLength = packetLength();
+        ByteBuffer payload = ByteBuffer.wrap(new byte[payloadLength]);
+
+
+        //Serialize Parameter Sets.
+        for (byte b : parametersetSerializerKeyList) {
+            IPacket packet = parameterSets.get(b);
+            if (packet != null) {
+                byte[] data = packet.serialize();
+                if (data != null) {
+                    payload.put(data);
+                }
+            }
+        }
+        return payload.array();
+    }
+
+    /**
+     * Static deserializer for EAPOL-MKA packets.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<EAPOLMkpdu> deserializer() {
+        return (data, offset, length) -> {
+            byte parameterSetType;
+            final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+            EAPOLMkpdu mkpdu = new EAPOLMkpdu();
+
+                /* Extract Basic ParameterSet;
+                   Special care needed, MKA Version & Peer Type difficult to distinguish. */
+            Deserializer<? extends IPacket> psDeserializer =
+                    EAPOLMkpdu.PARAMETERSET_DESERIALIZER_MAP.get(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_BASIC);
+            EAPOLMkpduParameterSet ps = (EAPOLMkpduParameterSet) (psDeserializer.deserialize(bb.array(),
+                    bb.position(), bb.remaining()));
+            if (!mkpdu.addParameterSet(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_BASIC, ps)) {
+                throw new DeserializationException("Error in deserializing packets");
+            }
+                // Update buffer position.
+            bb.position(bb.position() + ps.getTotalLength());
+
+                // Extract various remaining Parameter Sets.
+            while (bb.hasRemaining()) {
+                parameterSetType = bb.get();
+                psDeserializer = EAPOLMkpdu.PARAMETERSET_DESERIALIZER_MAP.get(parameterSetType);
+                ps = (EAPOLMkpduParameterSet) (psDeserializer.deserialize(bb.array(), bb.position(),
+                        bb.remaining()));
+                    // Specially handle Peer List Parameter Sets .
+                if ((parameterSetType == EAPOLMkpduParameterSet.PARAMETERSET_TYPE_LIVE_PEER_LIST) ||
+                        (parameterSetType == EAPOLMkpduParameterSet.PARAMETERSET_TYPE_POTENTIAL_PEER_LIST)) {
+                    EAPOLMkpduPeerListParameterSet peerList =
+                            (EAPOLMkpduPeerListParameterSet) ps;
+                    peerList.setPeerListType(parameterSetType);
+                }
+                if (!mkpdu.addParameterSet(parameterSetType, ps)) {
+                    throw new DeserializationException("Error in deserializing packets");
+                }
+
+                    // Update buffer.
+                short consumed = ps.getTotalLength();
+                short remaining = (short) bb.remaining();
+                    // Already one byte shifted, only "consumed-1" is to be shifted.
+                bb.position(bb.position() + ((remaining > consumed) ? (consumed - 1) : remaining));
+            }
+            return mkpdu;
+        };
+    }
+
+    /**
+     * Populate various Parameter Sets to store.
+     *
+     * @param type short
+     * @param ps EAPOLMkpduParameterSet
+     * @return boolean
+     */
+    public boolean addParameterSet(short type, EAPOLMkpduParameterSet ps) {
+        if (ps == null) {
+            return false;
+        }
+
+        // Ensure type is valid.
+        if (!((EAPOLMkpduParameterSet.PARAMETERSET_TYPE_BASIC <= type &&
+                type <= EAPOLMkpduParameterSet.PARAMETERSET_TYPE_DISTRIBUTED_SAK) ||
+                (type == EAPOLMkpduParameterSet.PARAMETERSET_TYPE_ICV_INDICATOR))) {
+            return false;
+        }
+
+
+        // Update store.
+        parameterSets.put((byte) type, (IPacket) ps);
+
+        return true;
+    }
+
+    /**
+     * Provide Basic Parameter Set details.
+     *
+     * @return EAPOLMkpduBasicParameterSet
+     */
+    public EAPOLMkpduBasicParameterSet getBasicParameterSet() {
+        IPacket parameterSet = null;
+        if (parameterSets.containsKey(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_BASIC)) {
+            parameterSet = parameterSets.get(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_BASIC);
+        }
+        return (EAPOLMkpduBasicParameterSet) parameterSet;
+    }
+
+    /**
+     * Provide Live/Potential Peer List details.
+     *
+     * @return EAPOLMkpduPeerListParameterSet
+     */
+    public EAPOLMkpduPeerListParameterSet getPeerListParameterSet() {
+        IPacket parameterSet;
+        if (parameterSets.containsKey(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_LIVE_PEER_LIST)) {
+            parameterSet = parameterSets.get(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_LIVE_PEER_LIST);
+        } else {
+            parameterSet = parameterSets.get(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_POTENTIAL_PEER_LIST);
+        }
+        return (EAPOLMkpduPeerListParameterSet) parameterSet;
+    }
+
+    /**
+     * Total EAPOL-MKPDU packet length. Cumulative length of Parameter Sets.
+     *
+     * @return length
+     */
+    public short packetLength() {
+        short length = 0;
+        for (byte k : parameterSets.keySet()) {
+            EAPOLMkpduParameterSet p = (EAPOLMkpduParameterSet) parameterSets.get(k);
+            length += p.getTotalLength();
+        }
+        return length;
+    }
+
+    /**
+     * Retrieve Parameter Set based on type.
+     *
+     * @param type byte
+     * @return EAPOLMkpduParameterSet
+     */
+    public EAPOLMkpduParameterSet getParameterSet(byte type) {
+        EAPOLMkpduParameterSet ps = null;
+        Map.Entry<Byte, IPacket> entry = parameterSets.entrySet().stream()
+                .filter((i) -> {
+                    return i.getKey().equals(new Byte(type));
+                })
+                .findFirst()
+                .orElse(null);
+        if (entry != null) {
+            ps = (EAPOLMkpduParameterSet) entry.getValue();
+        }
+        return ps;
+    }
+
+}
+
diff --git a/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduBasicParameterSet.java b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduBasicParameterSet.java
new file mode 100644
index 0000000..9efe64b
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduBasicParameterSet.java
@@ -0,0 +1,548 @@
+/*
+ * 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.onlab.packet;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+/**
+ * Class representing EAPOL MKPDU Basic Parameter Set.
+ * IEEE 802.1X Clause 11; Figure 11-8
+ */
+public class EAPOLMkpduBasicParameterSet extends BasePacket implements EAPOLMkpduParameterSet {
+
+    // Parameter Set fields.
+    private byte mkaVersion;
+    private byte keyServerPriority;
+    private boolean keyServer;
+    private boolean macSecDesired;
+    private byte capability;
+    private short bodyLength;
+    private SCI sci;
+    private byte[] mi;
+    private int mn;
+    private byte[] algAgility;
+    private byte[] ckn;
+    private byte[] padding;
+
+    // Various fixed parameter widths. IEEE 802.1X Table 11-6.
+    public static final int FIELD_ALGAG_LENGTH = 4;
+    public static final int TOTAL_BPS_BODY_LENGTH = 32;
+
+
+    // Basic Parameter Set field masks.
+    public static final byte KEYSERVER_MASK = (byte) 0x80;
+    public static final byte KEYSERVER_OFFSET = (byte) 0x07;
+    public static final byte MACSEC_DESIRED_MASK = (byte) 0x70;
+    public static final byte MACSEC_DESIRED_OFFSET = (byte) 0x06;
+    public static final byte MACSEC_CAPABILITY_MASK = (byte) 0x30;
+    public static final byte MACSEC_CAPABILITY_OFFSET = (byte) 0x04;
+
+    /**
+     * MKA Secure Channel Identifier.
+     */
+    public static class SCI {
+        private byte[] address;
+        private short port;
+
+        public static final int SYSTEM_IDENTIFIER_LENGTH = 6;
+        public static final int PORT_OFFSET = 6;
+
+
+        /**
+         * Validate SCI has <MAC (6 bytes)><Port (2 bytes)> length.
+         *
+         * @param sci ,byte[]
+         * @return true ,boolean
+         */
+        private boolean validateSCI(byte[] sci) {
+            if (sci != null && sci.length < EAPOLMkpduBasicParameterSet.FIELD_SCI_LENGTH) {
+                throw new IllegalArgumentException(
+                        "Invalid SCI argument. Enough bytes are not provided."
+                );
+            }
+            return true;
+        }
+
+        /**
+         * Validate System Identifier.
+         *
+         * @param address , byte[]
+         * @return true , boolean
+         */
+        private boolean validateAddress(byte[] address) {
+            if (address != null && address.length < SCI.SYSTEM_IDENTIFIER_LENGTH) {
+                throw new IllegalArgumentException(
+                        "Invalid System Identifier argument. Expects 6 bytes eg. MAC address.");
+            }
+            return true;
+        }
+
+        /**
+         * To set SCI from MAC address and port stream.
+         *
+         * @param sci , type byte[]
+         */
+
+        public SCI(byte[] sci) {
+            validateSCI(sci);
+            address = Arrays.copyOfRange(sci, 0, SYSTEM_IDENTIFIER_LENGTH);
+            port = (short) ((((short) (sci[PORT_OFFSET] & 0xFF)) << 8)
+                    | ((short) (sci[PORT_OFFSET + 1] & 0xFF)));
+        }
+
+        /**
+         * To set SCI from MAC address and port number.
+         *
+         * @param address ,type byte[]
+         * @param port    ,type short
+         * @throws IllegalArgumentException Exceptions
+         */
+        public SCI(byte[] address, short port) throws IllegalArgumentException {
+            validateAddress(address);
+            this.address = address;
+            this.port = port;
+        }
+
+        /**
+         * To set address.
+         *
+         * @param address , type byte[]
+         * @throws IllegalArgumentException if address is not set
+         */
+        public void setAdddress(byte[] address) throws IllegalArgumentException {
+            validateAddress(address);
+            this.address = address;
+        }
+
+        /**
+         * To return address.
+         *
+         * @return address , type byte[]
+         */
+        public byte[] address() {
+            return address;
+        }
+
+        /**
+         * TO set Port.
+         *
+         * @param port , type short
+         */
+        public void setPort(short port) {
+            this.port = port;
+        }
+
+        /**
+         * To return Port.
+         *
+         * @return port , type short
+         */
+        public short port() {
+            return port;
+        }
+
+        /**
+         * Convert to byte array.
+         *
+         * @return bb.array() ,type byte[]
+         */
+        public byte[] array() {
+            byte[] data = new byte[address.length + 2];
+            ByteBuffer bb = ByteBuffer.wrap(data);
+            bb.put(address);
+            bb.putShort(port);
+            return bb.array();
+        }
+    }
+
+    // Basic Parameter Set fixed header portion size.
+    public static final short BPS_FIXED_PART_SIZE_UPTO_LENGTH_FIELD = 4;
+    public static final short BPS_FIXED_PART_TOTAL_SIZE = 32;
+
+    /**
+     * To set MKA Version.
+     *
+     * @param version , type byte
+     */
+    public void setMkaVersion(byte version) {
+        this.mkaVersion = version;
+    }
+
+    /**
+     * To get MKA Version.
+     *
+     * @return mkaVersion , type byte
+     */
+    public byte getMkaVersion() {
+        return mkaVersion;
+    }
+
+    /**
+     * To set Key Server Priority.
+     *
+     * @param priority  , type byte
+     */
+
+    public void setKeyServerPriority(byte priority) {
+        this.keyServerPriority = priority;
+    }
+
+    /**
+     * To get Key Server Priority.
+     *
+     * @return keyServerPriority, type byte
+     */
+    public byte getKeyServerPriority() {
+        return keyServerPriority;
+    }
+
+    /**
+     * To set Key Server.
+     *
+     * @param isKeyServer , type boolean
+     */
+    public void setKeyServer(boolean isKeyServer) {
+        this.keyServer = isKeyServer;
+    }
+
+    /**
+     * To get Key Server.
+     *
+     * @return keyServer, type boolean
+     */
+    public boolean getKeyServer() {
+        return keyServer;
+    }
+
+    /**
+     * To set MACSec Desired.
+     *
+     * @param desired , type boolean
+     */
+    public void setMacSecDesired(boolean desired) {
+        this.macSecDesired = desired;
+    }
+
+    /**
+     * To get MACSec Desired.
+     *
+     * @return macSecDesired , type boolean
+     */
+    public boolean getMacSecDesired() {
+        return macSecDesired;
+    }
+
+    /**
+     * To set MACSec Capacity.
+     *
+     * @param capability ,type byte
+     */
+    public void setMacSecCapability(byte capability) {
+        this.capability = capability;
+    }
+
+    /**
+     * To get MACSec Capacity.
+     *
+     * @return capability, type byte
+     */
+    public byte getMacSecCapacity() {
+        return capability;
+    }
+
+    /**
+     * To set body length.
+     *
+     * @param length , type short
+     */
+    public void setBodyLength(short length) {
+        this.bodyLength = length;
+    }
+
+    public short getBodyLength() {
+        return bodyLength;
+    }
+
+    /**
+     * To set SCI.
+     *
+     * @param sci , byte[]
+     */
+    public void setSci(byte[] sci) {
+        this.sci = new SCI(sci);
+    }
+
+    /**
+     * To set SCI.
+     *
+     * @param sci , SCI
+     */
+    public void setSci(SCI sci) {
+        // TODO: Ensure sci valid.
+        this.sci = sci;
+    }
+
+    /**
+     * To get SCI.
+     *
+     * @return sci, type SCI
+     */
+    public SCI getSci() {
+        return sci;
+    }
+
+    /**
+     * To set Member Identifier.
+     *
+     * @param mi , type byte[]
+     * @throws IllegalArgumentException if mi is not set.
+     */
+
+    public void setActorMI(byte[] mi) throws IllegalArgumentException {
+        if (mi != null && mi.length < EAPOLMkpduParameterSet.FIELD_MI_LENGTH) {
+            throw new IllegalArgumentException("Actor Message Identifier doesn't have enough length.");
+        }
+        this.mi = mi;
+    }
+
+    /**
+     * To get Member Identifier.
+     *
+     * @return mi, type byte[]
+     */
+    public byte[] getActorMI() {
+        return mi;
+    }
+
+    /**
+     * To set Member Identifier.
+     *
+     * @param mn , type byte[]
+     * @throws IllegalArgumentException if mn is not set.
+     */
+    public void setActorMN(byte[] mn) throws IllegalArgumentException {
+        if (mn != null && mn.length < EAPOLMkpduParameterSet.FIELD_MN_LENGTH) {
+            throw new IllegalArgumentException("Actor Message Number doesn't have enough length.");
+        }
+        final ByteBuffer bf = ByteBuffer.wrap(mn);
+        this.mn = bf.getInt();
+    }
+
+    /**
+     * To set Member Identifier.
+     *
+     * @param mn , type int
+     */
+    public void setActorMN(int mn) {
+        this.mn = mn;
+    }
+
+    /**
+     * To get Member Identifier.
+     *
+     * @return mn, type int
+     */
+    public int getActorMN() {
+        return mn;
+    }
+
+    /**
+     * To set Algorithm Agility.
+     *
+     * @param algAgility , type byte[]
+     * @throws IllegalArgumentException if algAgility is not set or in incorrect format
+     */
+    public void setAlgAgility(byte[] algAgility) throws IllegalArgumentException {
+        if (algAgility != null && algAgility.length < EAPOLMkpduBasicParameterSet.FIELD_ALGAG_LENGTH) {
+            throw new IllegalArgumentException("Algorithm Agility doesn't have enough length.");
+        }
+        this.algAgility = algAgility;
+    }
+
+    /**
+     * To get Algorithm Agility.
+     *
+     * @return algAgility, type byte[]
+     */
+    public byte[] getAlgAgility() {
+        return algAgility;
+    }
+
+    /**
+     * To set CAK name.
+     *
+     * @param ckn , type byte[]
+     */
+    public void setCKN(byte[] ckn) {
+        int cakNameLength = bodyLength - EAPOLMkpduBasicParameterSet.TOTAL_BPS_BODY_LENGTH;
+        if (ckn != null && ckn.length < cakNameLength) {
+            throw new IllegalArgumentException("CAK name doesn't have enough length.");
+        }
+        this.ckn = ckn;
+    }
+
+    /**
+     * To get CAK name.
+     *
+     * @return ckn , type byte[]
+     */
+    public byte[] getCKN() {
+        return ckn;
+    }
+
+    /**
+     * To set padding.
+     *
+     * @param padding , type byte[]
+     */
+    public void setPadding(byte[] padding) {
+        this.padding = padding;
+    }
+
+    /**
+     * Deserializer function for Basic Parameter Set.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<EAPOLMkpduBasicParameterSet> deserializer() {
+        return (data, offset, length) -> {
+
+            // Ensure buffer has enough details.
+            if (length < TOTAL_BPS_BODY_LENGTH) {
+                return null;
+            }
+
+            // Various tools for deserialization.
+            final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+            EAPOLMkpduBasicParameterSet basicParameterSet = new EAPOLMkpduBasicParameterSet();
+
+            // Deserialize Basic Parameter Set fields.
+            basicParameterSet.setMkaVersion(bb.get());
+            basicParameterSet.setKeyServerPriority(bb.get());
+
+            byte[] mbField = new byte[1];
+            mbField[0] = bb.get();
+            basicParameterSet.setKeyServer(((mbField[0] & EAPOLMkpduBasicParameterSet.KEYSERVER_MASK) > 0) ?
+                    true : false);
+            basicParameterSet.setMacSecDesired(((mbField[0]
+                    & EAPOLMkpduBasicParameterSet.MACSEC_DESIRED_MASK) > 0) ?
+                    true : false);
+            basicParameterSet.setMacSecCapability((byte) ((mbField[0]
+                    & EAPOLMkpduBasicParameterSet.MACSEC_CAPABILITY_MASK)
+                    >> EAPOLMkpduBasicParameterSet.MACSEC_CAPABILITY_OFFSET));
+
+            short bodyLength = (short) (((short) (mbField[0] & EAPOLMkpduParameterSet.BODY_LENGTH_MSB_MASK))
+                    << EAPOLMkpduBasicParameterSet.BODY_LENGTH_MSB_SHIFT);
+            bodyLength |= (short) (bb.get());
+            basicParameterSet.setBodyLength(bodyLength);
+
+            mbField = new byte[EAPOLMkpduParameterSet.FIELD_SCI_LENGTH];
+            bb.get(mbField, 0, EAPOLMkpduParameterSet.FIELD_SCI_LENGTH);
+            basicParameterSet.setSci(mbField);
+
+            mbField = new byte[EAPOLMkpduParameterSet.FIELD_MI_LENGTH];
+            bb.get(mbField, 0, EAPOLMkpduParameterSet.FIELD_MI_LENGTH);
+            basicParameterSet.setActorMI(mbField);
+
+            mbField = new byte[EAPOLMkpduParameterSet.FIELD_MN_LENGTH];
+            bb.get(mbField, 0, EAPOLMkpduParameterSet.FIELD_MN_LENGTH);
+            basicParameterSet.setActorMN(mbField);
+
+            mbField = new byte[EAPOLMkpduBasicParameterSet.FIELD_ALGAG_LENGTH];
+            bb.get(mbField, 0, EAPOLMkpduBasicParameterSet.FIELD_ALGAG_LENGTH);
+            basicParameterSet.setAlgAgility(mbField);
+
+            int cakNameLength = basicParameterSet.getBodyLength() + EAPOLMkpduParameterSet.BODY_LENGTH_OCTET_OFFSET -
+                    EAPOLMkpduBasicParameterSet.TOTAL_BPS_BODY_LENGTH;
+            mbField = new byte[cakNameLength];
+            bb.get(mbField, 0, cakNameLength);
+            basicParameterSet.setCKN(mbField);
+
+            int padLength = basicParameterSet.getBodyLength() + EAPOLMkpduParameterSet.BODY_LENGTH_OCTET_OFFSET -
+                    (EAPOLMkpduBasicParameterSet.TOTAL_BPS_BODY_LENGTH + cakNameLength);
+            if (padLength > 0) {
+                mbField = new byte[padLength];
+                bb.get(mbField, 0, padLength);
+                basicParameterSet.setPadding(mbField);
+            }
+            return basicParameterSet;
+        };
+    }
+
+    @Override
+    public byte[] serialize() {
+        short paddedLength = getTotalLength();
+
+        // Serialize Basic Parameter Set. IEEE 802.1x, Figure 11.8
+        ByteBuffer data = ByteBuffer.wrap(new byte[paddedLength]);
+
+        // Octet 1,2
+        data.put(mkaVersion);
+        data.put(keyServerPriority);
+
+        // Octet 3
+        byte octet3 = (byte) ((byte) ((keyServer) ? 0x01 : 0x00) << KEYSERVER_OFFSET);
+        octet3 |= (byte) ((byte) ((macSecDesired) ? 0x01 : 0x00) << MACSEC_DESIRED_OFFSET);
+        octet3 |= capability << MACSEC_CAPABILITY_OFFSET;
+
+        // Remove header length upto "Length" field from total packet length.
+        paddedLength -= BPS_FIXED_PART_SIZE_UPTO_LENGTH_FIELD;
+        octet3 |= (byte) (paddedLength >> BODY_LENGTH_MSB_SHIFT & BODY_LENGTH_MSB_MASK);
+        data.put(octet3);
+
+        // Octet 4
+        data.put((byte) paddedLength);
+
+        // Octet 5-12
+        data.put(sci.array());
+
+        // Octet 13-24
+        data.put(mi);
+
+        // Octet 25-28
+        data.putInt(mn);
+
+        // Octet 29-32
+        data.put(algAgility);
+
+        // Octet 33-
+        data.put(ckn);
+
+        // TODO: Filling Padding if needed.
+
+        return data.array();
+    }
+
+
+    @Override
+    public byte getParameterSetType() {
+        return PARAMETERSET_TYPE_BASIC;
+    }
+
+    @Override
+    public short getTotalLength() {
+        /*
+         *  Total size calculation.
+         *    4 byte aligned padded length calculation.
+         *    ie. padded_length = (length + 3) & ~3
+         */
+        short paddedLength = (short) (((BPS_FIXED_PART_TOTAL_SIZE + ckn.length) + 0x03) & ~0x03);
+        return paddedLength;
+    }
+
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduDistributedSAKParameterSet.java b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduDistributedSAKParameterSet.java
new file mode 100644
index 0000000..a893e40
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduDistributedSAKParameterSet.java
@@ -0,0 +1,172 @@
+/*
+ * 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.onlab.packet;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Class representing MKPDU MACSec SAK Use Parameter Set (GCM-AES 128).
+ * IEEE 802.1X Clause 11; Figure 11-11
+ */
+public class EAPOLMkpduDistributedSAKParameterSet extends BasePacket implements EAPOLMkpduParameterSet {
+
+    // Various fields.
+    private byte distributedAN;
+    private byte confidentialityOffset;
+    private int keyNumber;
+    private byte[] sak;
+
+    /* Body Length is fixed in Distribute SAK Parameter Set.
+     * Still variable kept for de-serialization purpose.
+     */
+    private short bodyLength;
+
+    // Various Constants.
+    public static final short TOTAL_DSAKPS_BODY_LENGTH = 32;
+    public static final short SAK_FIELD_LENGTH = 24;
+    public static final byte DSAKPS_GENERAL_MASK = 0x03;
+    public static final byte DISTRIBUTED_AN_OFFSET = (byte) 0x06;
+    public static final byte CONFIDENTIALITY_OFFSET = (byte) 0x04;
+
+    // Key wrapping support.
+    @FunctionalInterface
+    public interface KeyWrapper {
+        byte[] wrap(byte[] message);
+    }
+
+    KeyWrapper sakWrapper;
+
+    @Override
+    public byte getParameterSetType() {
+        return PARAMETERSET_TYPE_DISTRIBUTED_SAK;
+    }
+
+    @Override
+    public short getTotalLength() {
+        return TOTAL_DSAKPS_BODY_LENGTH;
+    }
+
+    @Override
+    public short getBodyLength() {
+        return bodyLength;
+    }
+
+    public void setBodyLength(short bodyLength) {
+        this.bodyLength = bodyLength;
+    }
+
+    @Override
+    public byte[] serialize() {
+        short length = getTotalLength();
+
+        // Serialize Distribute SAK Parameter Set. IEEE 802.1x, Figure 11.10
+        ByteBuffer data = ByteBuffer.wrap(new byte[length]);
+
+        /*
+         *Populate fields
+         * Octet 1
+         */
+        data.put(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_DISTRIBUTED_SAK);
+
+        // Octet 2
+        byte octet = 0x00;
+        octet = (byte) ((DSAKPS_GENERAL_MASK & distributedAN) << DISTRIBUTED_AN_OFFSET);
+        octet |= (byte) ((DSAKPS_GENERAL_MASK & confidentialityOffset) << CONFIDENTIALITY_OFFSET);
+        data.put(octet);
+
+        // Octet 3 & 4
+        length -= EAPOLMkpduParameterSet.BODY_LENGTH_OCTET_OFFSET;
+        octet |= (byte) (length >> BODY_LENGTH_MSB_SHIFT & BODY_LENGTH_MSB_MASK);
+        data.put(octet);
+        data.put((byte) length);
+
+        // Octet 5
+        data.putInt(keyNumber);
+
+        // AES Key Wrap of SAK
+        data.put(sakWrapper.wrap(sak));
+
+        return data.array();
+    }
+
+    /**
+     * Deserializer function for Distributed SAK Parameter Set.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<EAPOLMkpduDistributedSAKParameterSet> deserializer() {
+        return (data, offset, length) -> {
+
+            // Needed components.
+            final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+            EAPOLMkpduDistributedSAKParameterSet dps = new EAPOLMkpduDistributedSAKParameterSet();
+
+            /*
+             * Extract fields.
+             * Octet 2
+             */
+            byte[] mbField = new byte[1];
+            mbField[0] = bb.get();
+            dps.setDistributedAN((byte) ((mbField[0] >> DISTRIBUTED_AN_OFFSET) & DSAKPS_GENERAL_MASK));
+            dps.setConfidentialityOffset((byte) ((mbField[0] >> CONFIDENTIALITY_OFFSET) & DSAKPS_GENERAL_MASK));
+
+            // Octet 3 & 4
+            mbField[0] = bb.get();
+            short bodyLength = (short) (((short) (mbField[0] & EAPOLMkpduParameterSet.BODY_LENGTH_MSB_MASK))
+                    << EAPOLMkpduParameterSet.BODY_LENGTH_MSB_SHIFT);
+            bodyLength |= (short) (bb.get());
+            dps.setBodyLength(bodyLength);
+
+            // Octet 5
+            dps.setKeyNumber(bb.getInt());
+
+            // SAK
+            mbField = new byte[EAPOLMkpduDistributedSAKParameterSet.SAK_FIELD_LENGTH];
+            bb.get(mbField, 0, EAPOLMkpduDistributedSAKParameterSet.SAK_FIELD_LENGTH);
+            dps.setSAK(mbField);
+
+            return dps;
+        };
+    }
+
+    // Distributed AN
+    public void setDistributedAN(byte distributedAN) {
+        this.distributedAN = distributedAN;
+    }
+
+    // Confidentiality Offset
+    public void setConfidentialityOffset(byte confidentialityOffset) {
+        this.confidentialityOffset = confidentialityOffset;
+    }
+
+    // Key Number
+    public void setKeyNumber(int keyNumber) {
+        this.keyNumber = keyNumber;
+    }
+
+    // SAK
+    public void setSAK(byte[] sak) {
+        this.sak = sak;
+    }
+
+    // Key Wrapper
+    public void setKeyWrapper(KeyWrapper sakWrapper) {
+        this.sakWrapper = sakWrapper;
+    }
+
+}
+
diff --git a/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduICVIndicatorParameterSet.java b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduICVIndicatorParameterSet.java
new file mode 100644
index 0000000..8ae1705
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduICVIndicatorParameterSet.java
@@ -0,0 +1,135 @@
+/*
+ * 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.onlab.packet;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Class representing MKPDU ICV Indicator.
+ * IEEE 802.1X Clause 11; Figure 11-16
+ */
+public class EAPOLMkpduICVIndicatorParameterSet extends BasePacket implements EAPOLMkpduParameterSet {
+
+    // Variables for Hash Generation.
+    private byte[] icv;
+
+    /*
+     * Body Length is fixed in SAK Use Parameter Set.
+     * Still variable kept for de-serialization purpose.
+     */
+    private short bodyLength;
+
+    // Total packet length. Currently only 128bit ICV is supported.
+    public static final short TOTAL_ICVPS_BODY_LENGTH = 20;
+
+
+    @Override
+    public byte[] serialize() {
+        short length = getTotalLength();
+
+        // Serialize ICV Indicator Parameter Set. IEEE 802.1x, Figure 11.16 .
+        ByteBuffer data = ByteBuffer.wrap(new byte[length]);
+
+        /*
+         * Populate fields
+         * Octet 1
+         */
+        data.put(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_ICV_INDICATOR);
+
+        // Octet 2. Reserved.
+        byte octet = 0x00;
+        data.put(octet);
+
+        // Octet 3
+        length -= EAPOLMkpduParameterSet.BODY_LENGTH_OCTET_OFFSET;
+        octet |= (byte) (length >> BODY_LENGTH_MSB_SHIFT & BODY_LENGTH_MSB_MASK);
+        data.put(octet);
+
+        // Octet 4
+        data.put((byte) length);
+
+        // Note : ICV generation excluded from serialization.
+        //        Should be done at the level where ethernet packet is being created.
+
+        return data.array();
+    }
+
+    /**
+     * Deserializer function for ICV Indicator Parameter Set.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<EAPOLMkpduICVIndicatorParameterSet> deserializer() {
+        return (data, offset, length) -> {
+            // TODO : Ensure buffer has enough details.
+
+            // Deserialize Basic Parameter Set.
+            final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+            EAPOLMkpduICVIndicatorParameterSet icvps = new EAPOLMkpduICVIndicatorParameterSet();
+
+            // Extract fields. Skip type, reserved fields.
+            byte[] mbField = new byte[2];
+            bb.get(mbField, 0, 2);
+            short bodyLength = (short) (((short) (mbField[1] & EAPOLMkpduParameterSet.BODY_LENGTH_MSB_MASK))
+                    << EAPOLMkpduParameterSet.BODY_LENGTH_MSB_SHIFT);
+            bodyLength |= (short) (bb.get());
+            icvps.setBodyLength(bodyLength);
+
+            // SAK
+            byte[] icv = new byte[bodyLength];
+            bb.get(icv);
+            icvps.setICV(icv);
+
+            return icvps;
+        };
+    }
+
+    @Override
+    public byte getParameterSetType() {
+        return PARAMETERSET_TYPE_ICV_INDICATOR;
+    }
+
+    @Override
+    public short getTotalLength() {
+        return TOTAL_ICVPS_BODY_LENGTH;
+    }
+
+    @Override
+    public short getBodyLength() {
+        return TOTAL_ICVPS_BODY_LENGTH - BODY_LENGTH_OCTET_OFFSET;
+    }
+
+    /**
+     * To set body length.
+     *
+     * @param bodyLength  ,type short
+     */
+    public void setBodyLength(short bodyLength) {
+        this.bodyLength = bodyLength;
+    }
+
+    /**
+     * To set ICV.
+     *
+     * @param icv , type byte[]
+     */
+    public void setICV(byte[] icv) {
+        this.icv = icv;
+    }
+
+}
+
diff --git a/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduMACSecUseParameterSet.java b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduMACSecUseParameterSet.java
new file mode 100644
index 0000000..2085c27
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduMACSecUseParameterSet.java
@@ -0,0 +1,317 @@
+/*
+ * 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.onlab.packet;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Class representing MKPDU MACSec SAK Use Parameter Set.
+ * IEEE 802.1X Clause 11; Figure 11-10
+ */
+public class EAPOLMkpduMACSecUseParameterSet extends BasePacket implements EAPOLMkpduParameterSet {
+
+    // Various Header Fields
+    private boolean delayProtect = false;
+    private boolean plainTX = false;
+    private boolean plainRX = false;
+    private byte[] latestKI;
+    private int latestKN;
+    private byte latestAN;
+    private int latestLAPN;
+    private boolean latestTX;
+    private boolean latestRX;
+    private byte[] oldKI;
+    private int oldKN;
+    private byte oldAN;
+    private int oldLAPN;
+    private boolean oldTX;
+    private boolean oldRX;
+
+    /* Body Length is fixed in SAK Use Parameter Set.
+     * Still variable kept for de-serialization purpose.
+     * */
+    private short bodyLength;
+
+    // Various constants.
+    public static final short TOTAL_SUPS_BODY_LENGTH = 44;
+    public static final short LATEST_KEY_AN_OFFSET = 6;
+    public static final short OLD_KEY_AN_OFFSET = 2;
+
+    public static final byte LATEST_KEY_RX_MASK = 0x10;
+    public static final byte LATEST_KEY_TX_MASK = 0X20;
+    public static final byte OLD_KEY_RX_MASK = 0x01;
+    public static final byte OLD_KEY_TX_MASK = 0x02;
+    public static final byte KEY_AN_MASK = 0x02;
+    public static final byte PLAIN_TX_MASK = (byte) 0x80;
+    public static final byte PLAIN_RX_MASK = 0x40;
+    public static final byte DELAY_PROTECT_MASK = 0x10;
+    public static final short SUPS_FIXED_PART_TOTAL_SIZE = 44;
+
+    @Override
+    public byte[] serialize() {
+        short length = getTotalLength();
+
+        // Serialize SAK Use Parameter Set. IEEE 802.1x, Figure 11.10
+        ByteBuffer data = ByteBuffer.wrap(new byte[length]);
+
+        /*
+         *Populate fields
+         * Octet 1
+         * */
+        data.put(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_MACSEC_SAK_USE);
+
+        // Octet 2
+        byte octet = 0x00;
+        octet = (byte) ((latestRX) ? octet | LATEST_KEY_RX_MASK : octet & (byte) (~LATEST_KEY_RX_MASK));
+        octet = (byte) ((latestTX) ? octet | LATEST_KEY_TX_MASK : octet & (byte) (~LATEST_KEY_TX_MASK));
+        octet = (byte) ((oldRX) ? octet | OLD_KEY_RX_MASK : octet & (byte) (~OLD_KEY_RX_MASK));
+        octet = (byte) ((oldTX) ? octet | OLD_KEY_TX_MASK : octet & (byte) (~OLD_KEY_TX_MASK));
+        octet |= latestAN << LATEST_KEY_AN_OFFSET;
+        octet |= oldAN << OLD_KEY_AN_OFFSET;
+        data.put(octet);
+
+        // Octet 3
+        octet = 0x00;
+        octet = (byte) ((plainTX) ? octet | (byte) PLAIN_TX_MASK : octet & (byte) (~PLAIN_TX_MASK));
+        octet = (byte) ((plainRX) ? octet | (byte) PLAIN_RX_MASK : octet & (byte) (~PLAIN_RX_MASK));
+        octet = (byte) ((delayProtect) ? octet | DELAY_PROTECT_MASK : octet & (byte) (~DELAY_PROTECT_MASK));
+        length -= EAPOLMkpduParameterSet.BODY_LENGTH_OCTET_OFFSET;
+        octet |= (byte) (length >> BODY_LENGTH_MSB_SHIFT & BODY_LENGTH_MSB_MASK);
+        data.put(octet);
+
+        // Octet 4
+        data.put((byte) length);
+
+        // Latest & Old Key Server Details
+        data.put(latestKI);
+        data.putInt(latestKN);
+        data.putInt(latestLAPN);
+        data.put(oldKI);
+        data.putInt(oldKN);
+        data.putInt(oldLAPN);
+
+        return data.array();
+    }
+
+    /**
+     * Deserializer function for MACSec SAK Use Parameter Set.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<EAPOLMkpduMACSecUseParameterSet> deserializer() {
+        return (data, offset, length) -> {
+
+            // Needed components.
+            final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+            EAPOLMkpduMACSecUseParameterSet macSecUsePS = new EAPOLMkpduMACSecUseParameterSet();
+
+            /*
+             *Extract fields.
+             *Octet 2
+            **/
+            byte[] mbField = new byte[1];
+            mbField[0] = bb.get();
+            macSecUsePS.setOldRX((mbField[0] & OLD_KEY_RX_MASK) != 0);
+            macSecUsePS.setOldTX((mbField[0] & OLD_KEY_TX_MASK) != 0);
+            macSecUsePS.setLatestRX((mbField[0] & OLD_KEY_RX_MASK) != 0);
+            macSecUsePS.setLatestTX((mbField[0] & OLD_KEY_TX_MASK) != 0);
+            macSecUsePS.setLatestAN((byte) ((mbField[0] >> LATEST_KEY_AN_OFFSET) & KEY_AN_MASK));
+            macSecUsePS.setOldAN((byte) ((mbField[0] >> OLD_KEY_AN_OFFSET) & KEY_AN_MASK));
+
+            // Octet 3 & 4
+            mbField[0] = bb.get();
+            macSecUsePS.setPlainRX((mbField[0] & PLAIN_RX_MASK) != 0);
+            macSecUsePS.setPlainTX((mbField[0] & PLAIN_TX_MASK) != 0);
+            macSecUsePS.setDelayProtect((mbField[0] & DELAY_PROTECT_MASK) != 0);
+
+            short bodyLength = (short) (((short) (mbField[0] & EAPOLMkpduParameterSet.BODY_LENGTH_MSB_MASK))
+                    << EAPOLMkpduParameterSet.BODY_LENGTH_MSB_SHIFT);
+            bodyLength |= (short) (bb.get());
+            macSecUsePS.setBodyLength(bodyLength);
+
+            // Latest Key Server details.
+            mbField = new byte[EAPOLMkpduParameterSet.FIELD_MI_LENGTH];
+            bb.get(mbField, 0, EAPOLMkpduParameterSet.FIELD_MI_LENGTH);
+            macSecUsePS.setLatestKI(mbField);
+            macSecUsePS.setLatestKN(bb.getInt());
+            macSecUsePS.setLatestLAPN(bb.getInt());
+
+            // Old Key Server details.
+            mbField = new byte[EAPOLMkpduParameterSet.FIELD_MI_LENGTH];
+            bb.get(mbField, 0, EAPOLMkpduParameterSet.FIELD_MI_LENGTH);
+            macSecUsePS.setOldKI(mbField);
+            macSecUsePS.setOldKN(bb.getInt());
+            macSecUsePS.setOldLAPN(bb.getInt());
+
+            return macSecUsePS;
+        };
+    }
+
+    @Override
+    public byte getParameterSetType() {
+        return PARAMETERSET_TYPE_MACSEC_SAK_USE;
+    }
+
+    @Override
+    public short getTotalLength() {
+        return TOTAL_SUPS_BODY_LENGTH;
+    }
+
+    @Override
+    public short getBodyLength() {
+        return bodyLength;
+    }
+
+    public void setBodyLength(short bodyLength) {
+        this.bodyLength = bodyLength;
+    }
+
+    /**
+     * To set Delay Protect.
+     *
+     * @param delayProtect , type boolean
+     */
+    public void setDelayProtect(boolean delayProtect) {
+        this.delayProtect = delayProtect;
+    }
+
+    /**
+     * To set Plain TX supported or not.
+     *
+     * @param plainTX , type boolean
+     */
+    public void setPlainTX(boolean plainTX) {
+        this.plainTX = plainTX;
+    }
+
+    /**
+     * Plain RX supported or not.
+     *
+     * @param plainRX , type boolean
+     */
+    public void setPlainRX(boolean plainRX) {
+        this.plainRX = plainRX;
+    }
+
+    /**
+     * Lowest Acceptable Packet Number for Latest Key Server.
+     *
+     * @param latestLAPN ,type int
+     */
+    public void setLatestLAPN(int latestLAPN) {
+        this.latestLAPN = latestLAPN;
+    }
+
+    /**
+     * Latest Key Server Association Number.
+     *
+     * @param latestAN , type byte
+     */
+    public void setLatestAN(byte latestAN) {
+        this.latestAN = latestAN;
+    }
+
+    /**
+     * Latest Key Server Identifier.
+     *
+     * @param latestKI ,type byte[]
+     */
+    public void setLatestKI(byte[] latestKI) {
+        this.latestKI = latestKI;
+    }
+
+    /**
+     * Latest Key Server Key Number.
+     *
+     * @param latestKN ,type int
+     */
+    public void setLatestKN(int latestKN) {
+        this.latestKN = latestKN;
+    }
+
+    /**
+     * Latest Key Server used for TX protection.
+     *
+     * @param latestTX ,type boolean
+     */
+    public void setLatestTX(boolean latestTX) {
+        this.latestTX = latestTX;
+    }
+
+    /**
+     * Latest Key Server used for RX protection .
+     *
+     * @param latestRX ,type boolean.
+     */
+    public void setLatestRX(boolean latestRX) {
+        this.latestRX = latestRX;
+    }
+
+    /**
+     * Lowest Acceptable Packet Number for Old Key Server.
+     *
+     * @param oldLAPN , type int
+     */
+    public void setOldLAPN(int oldLAPN) {
+        this.oldLAPN = oldLAPN;
+    }
+
+    /**
+     * Old Key Server Association Number.
+     *
+     * @param oldAN , type byte
+     */
+    public void setOldAN(byte oldAN) {
+        this.oldAN = oldAN;
+    }
+
+    /**
+     * Old Key Server Identifier.
+     *
+     * @param oldKI , type byte[]
+     */
+    public void setOldKI(byte[] oldKI) {
+        this.oldKI = oldKI;
+    }
+
+    /**
+     * Old Key Server Number.
+     *
+     * @param oldKN , type int
+     */
+    public void setOldKN(int oldKN) {
+        this.oldKN = oldKN;
+    }
+
+    /**
+     * Old Key Server used for TX protection.
+     *
+     * @param oldTX ,type boolean
+     */
+    public void setOldTX(boolean oldTX) {
+        this.oldTX = oldTX;
+    }
+
+    /**
+     * Old Key Server used for RX protection.
+     *
+     * @param oldRX , type boolean
+     */
+    public void setOldRX(boolean oldRX) {
+        this.oldRX = oldRX;
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduParameterSet.java b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduParameterSet.java
new file mode 100644
index 0000000..ba630d2
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduParameterSet.java
@@ -0,0 +1,71 @@
+/*
+ * 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.onlab.packet;
+
+/**
+ * Class representing EAPOL MKPDU Parameter Set.
+ * IEEE 802.1X Clause 11; Figure 11-7, Table 11-6
+ */
+public interface EAPOLMkpduParameterSet {
+    // Parameter Set Types.
+    public static final byte PARAMETERSET_TYPE_BASIC = 0;
+    public static final byte PARAMETERSET_TYPE_LIVE_PEER_LIST = 1;
+    public static final byte PARAMETERSET_TYPE_POTENTIAL_PEER_LIST = 2;
+    public static final byte PARAMETERSET_TYPE_MACSEC_SAK_USE = 3;
+    public static final byte PARAMETERSET_TYPE_DISTRIBUTED_SAK = 4;
+    public static final byte PARAMETERSET_TYPE_ICV_INDICATOR = (byte) 255;
+
+    // Member Identifier & Number fields.
+    public static final int FIELD_MI_LENGTH = 12;
+    public static final int FIELD_MN_LENGTH = 4;
+
+    // SCI field details.
+    public static final int FIELD_SCI_LENGTH = 8;
+
+    // Body Length field details.
+    public static final byte BODY_LENGTH_MSB_MASK = (byte) 0x0F;
+    public static final byte BODY_LENGTH_MSB_SHIFT = (byte) 0x08;
+    public static final byte BODY_LENGTH_OCTET_OFFSET = (byte) 0x04;
+
+    /**
+     * Retrieve Type of Parameter Set.
+     *
+     * @return parameter set type.
+     */
+    public byte getParameterSetType();
+
+    /**
+     * Total length; ie. including header and body length.
+     *
+     * @return short value.
+     */
+    public short getTotalLength();
+
+    /**
+     * Retrieve Body Length field of Parameter Set.
+     *
+     * @return body length of parameter set.
+     */
+    public short getBodyLength();
+
+    /**
+     * Utility function for Serializing Parameter Set.
+     *
+     * @return byte[] value
+     */
+    public byte[] serialize();
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduPeerListParameterSet.java b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduPeerListParameterSet.java
new file mode 100644
index 0000000..793b638
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/EAPOLMkpduPeerListParameterSet.java
@@ -0,0 +1,218 @@
+/*
+ * 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.onlab.packet;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Class representing MKPDU Live/Potential Peer List Parameter Set.
+ * IEEE 802.1X Clause 11; Figure 11-9
+ */
+public class EAPOLMkpduPeerListParameterSet extends BasePacket implements EAPOLMkpduParameterSet {
+
+    // Member Details
+    public static class MemberDetails {
+        byte[] memberID;
+        int messageNo;
+
+        public MemberDetails(byte[] memberID, int messageNo) {
+            this.memberID = memberID;
+            this.messageNo = messageNo;
+        }
+
+        public byte[] getMemberID() {
+            return memberID;
+        }
+
+        public int getMessageNo() {
+            return messageNo;
+        }
+    }
+
+    // Peer List Types
+    public static byte peerListTypeLive = 1;
+    public static byte peerListTypePotential = 2;
+
+    // Type for distinguishing Live & Potential Lists.
+    protected byte peerListType = 1;
+    protected short bodyLength;
+
+    //Members
+    protected List<MemberDetails> members = new ArrayList<>();
+
+    @Override
+    public byte[] serialize() {
+
+        // Don't Serialize if no members are available.
+        if (members.size() == 0) {
+            return null;
+        }
+
+        // Serialize PeerList Parameter Set. IEEE 802.1x, Figure 11.9
+        short length = getTotalLength();
+        ByteBuffer data = ByteBuffer.wrap(new byte[length]);
+
+        /*
+         *Populate fields
+         * Octet 1
+         */
+        data.put(peerListType);
+
+        // Octet 2. Reserved.
+        byte octet = 0x00;
+        data.put(octet);
+
+        // Octet 3
+        length -= EAPOLMkpduParameterSet.BODY_LENGTH_OCTET_OFFSET;
+        octet |= (byte) (length >> BODY_LENGTH_MSB_SHIFT & BODY_LENGTH_MSB_MASK);
+        data.put(octet);
+
+        // Octet 4
+        data.put((byte) length);
+
+        // Member details.
+        members.forEach(a -> {
+                    data.put(a.getMemberID());
+                    data.putInt(a.getMessageNo());
+                }
+        );
+
+        return data.array();
+    }
+
+
+    /**
+     * Deserializer function for Peer List Parameter Set.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<EAPOLMkpduPeerListParameterSet> deserializer() {
+        return (data, offset, length) -> {
+
+            // Ensure buffer has enough details.
+            if (data == null) {
+                return null;
+            }
+
+            // Deserialize Basic Parameter Set.
+            final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+            EAPOLMkpduPeerListParameterSet peerListParameterSet =
+                    new EAPOLMkpduPeerListParameterSet();
+
+            // Parse Peer List Fields/
+            byte[] mbField = new byte[1];
+            // mbField[0] = bb.get(); // Skip Type. Already processed in EAPOL-MKPDU de-serializer.
+            bb.get(); // Skip Reserved.
+
+            // Length
+            mbField[0] = bb.get();
+            short bodyLength = (short) (((short) (mbField[0] & EAPOLMkpduParameterSet.BODY_LENGTH_MSB_MASK))
+                    << EAPOLMkpduParameterSet.BODY_LENGTH_OCTET_OFFSET);
+            bodyLength |= (short) (bb.get());
+            peerListParameterSet.setBodyLength(bodyLength);
+
+            // Member details
+            while (bodyLength > 0) {
+                mbField = new byte[FIELD_MI_LENGTH];
+                bb.get(mbField, 0, FIELD_MI_LENGTH);
+                peerListParameterSet.addMember(mbField, bb.getInt());
+                bodyLength -= FIELD_MI_LENGTH + FIELD_MN_LENGTH;
+            }
+            return peerListParameterSet;
+        };
+    }
+
+    /**
+     * Setting List Type.
+     *
+     * @param peerListType type - PEERLIST_TYPE_LIVE or PEERLIST_TYPE_POTENTIAL for live
+     *                     and potential peer lists
+     */
+    public void setPeerListType(byte peerListType) {
+        if ((peerListType != EAPOLMkpduPeerListParameterSet.peerListTypeLive) &&
+                (peerListType != EAPOLMkpduPeerListParameterSet.peerListTypePotential)) {
+            throw new IllegalArgumentException("Unknown PeerList Type specified.");
+        }
+        this.peerListType = peerListType;
+    }
+
+    /**
+     * Member details adding.
+     *
+     * @param mi ,type byte[]
+     * @param mn , type int
+     */
+    public void addMember(byte[] mi, int mn) {
+        if (mi != null) {
+            members.add(new MemberDetails(mi, mn));
+        }
+        return;
+    }
+
+    /**
+     * Searching Member details.
+     *
+     * @param mi ,type byte[]
+     * @return boolean based on the value of member.
+     */
+    public boolean memberExists(byte[] mi) {
+        MemberDetails member = members.stream()
+                .filter(m -> Arrays.equals(m.getMemberID(), mi))
+                .findAny()
+                .orElse(null);
+        return (member != null) ? true : false;
+    }
+
+    /**
+     * Member details.
+     *
+     * @return members
+     */
+    public List<MemberDetails> getMembers() {
+        return members;
+    }
+
+    @Override
+    public byte getParameterSetType() {
+        return peerListType;
+    }
+
+    @Override
+    public short getTotalLength() {
+        return (short) (EAPOLMkpduParameterSet.BODY_LENGTH_OCTET_OFFSET +
+                members.size() * (EAPOLMkpduParameterSet.FIELD_MI_LENGTH +
+                        EAPOLMkpduParameterSet.FIELD_MN_LENGTH));
+    }
+
+    @Override
+    public short getBodyLength() {
+        return bodyLength;
+    }
+
+    /**
+     * Body Length.
+     *
+     * @param length ,type short
+     */
+    public void setBodyLength(short length) {
+        this.bodyLength = length;
+    }
+}
+
diff --git a/utils/misc/src/main/java/org/onlab/packet/EthType.java b/utils/misc/src/main/java/org/onlab/packet/EthType.java
index 6976a15..c69ed145e 100644
--- a/utils/misc/src/main/java/org/onlab/packet/EthType.java
+++ b/utils/misc/src/main/java/org/onlab/packet/EthType.java
@@ -38,6 +38,7 @@
         MPLS_UNICAST(0x8847, "mpls_unicast", org.onlab.packet.MPLS.deserializer()),
         MPLS_MULTICAST(0x8848, "mpls_multicast", org.onlab.packet.MPLS.deserializer()),
         EAPOL(0x888e, "eapol", org.onlab.packet.EAPOL.deserializer()),
+        SLOW(0x8809, "slow", org.onlab.packet.Slow.deserializer()),
         UNKNOWN(0, "unknown", null);
 
 
diff --git a/utils/misc/src/main/java/org/onlab/packet/MacAddress.java b/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
index 945254d..db74bf0 100644
--- a/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
+++ b/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
@@ -74,6 +74,10 @@
             MacAddress.valueOf("01:80:c2:00:00:00"),
             MacAddress.valueOf("01:80:c2:00:00:03"),
             MacAddress.valueOf("01:80:c2:00:00:0e"));
+    /**
+     * LACP MAC address.
+     */
+    public static final MacAddress LACP = valueOf("01:80:C2:00:00:02");
 
     public static final int MAC_ADDRESS_LENGTH = 6;
     private byte[] address = new byte[MacAddress.MAC_ADDRESS_LENGTH];
diff --git a/utils/misc/src/main/java/org/onlab/packet/Slow.java b/utils/misc/src/main/java/org/onlab/packet/Slow.java
new file mode 100644
index 0000000..ded5185
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/Slow.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.onlab.packet;
+
+import com.google.common.collect.ImmutableMap;
+import org.onlab.packet.lacp.Lacp;
+
+import java.nio.ByteBuffer;
+import java.util.Map;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.packet.PacketUtils.checkInput;
+
+/**
+ * Implements ethernet slow protocols.
+ */
+public class Slow extends BasePacket {
+    public static final int HEADER_LENGTH = 1;
+
+    public static final byte SUBTYPE_LACP = 0x1;
+    // Subtypes below has not been implemented yet
+    // public static final byte SUBTYPE_LAMP = 0x2;
+    // public static final byte SUBTYPE_OAM = 0x3;
+    // public static final byte SUBTYPE_OSSP = 0xa;
+
+    public static final Map<Byte, Deserializer<? extends IPacket>> PROTOCOL_DESERIALIZER_MAP =
+            ImmutableMap.<Byte, Deserializer<? extends IPacket>>builder()
+                    .put(Slow.SUBTYPE_LACP, Lacp.deserializer())
+                    .build();
+
+    private byte subtype;
+
+    /**
+     * Gets subtype.
+     *
+     * @return subtype
+     */
+    public byte getSubtype() {
+        return subtype;
+    }
+
+    /**
+     * Sets subtype.
+     *
+     * @param subtype the subtype to set
+     * @return this
+     */
+    public Slow setSubtype(byte subtype) {
+        this.subtype = subtype;
+        return this;
+    }
+
+    /**
+     * Deserializer function for Slow packets.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<Slow> deserializer() {
+        return (data, offset, length) -> {
+            checkInput(data, offset, length, HEADER_LENGTH);
+
+            Slow slow = new Slow();
+            ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+            slow.setSubtype(bb.get());
+
+            Deserializer<? extends IPacket> deserializer;
+            if (Slow.PROTOCOL_DESERIALIZER_MAP.containsKey(slow.subtype)) {
+                deserializer = Slow.PROTOCOL_DESERIALIZER_MAP.get(slow.subtype);
+            } else {
+                throw new DeserializationException("Unsupported slow protocol subtype " + Byte.toString(slow.subtype));
+            }
+
+            int remainingLength = bb.limit() - bb.position();
+            slow.payload = deserializer.deserialize(data, bb.position(), remainingLength);
+            slow.payload.setParent(slow);
+
+            return slow;
+        };
+    }
+
+    @Override
+    public byte[] serialize() {
+        int length = HEADER_LENGTH;
+        byte[] payloadData = null;
+        if (this.payload != null) {
+            this.payload.setParent(this);
+            payloadData = this.payload.serialize();
+            length += payloadData.length;
+        }
+
+        final byte[] data = new byte[length];
+
+        final ByteBuffer bb = ByteBuffer.wrap(data);
+        bb.put(this.subtype);
+        if (payloadData != null) {
+            bb.put(payloadData);
+        }
+
+        return data;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), subtype);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (!(obj instanceof Slow)) {
+            return false;
+        }
+        final Slow other = (Slow) obj;
+
+        return this.subtype == other.subtype;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("subtype", Byte.toString(subtype))
+                .toString();
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/Lacp.java b/utils/misc/src/main/java/org/onlab/packet/lacp/Lacp.java
new file mode 100644
index 0000000..0124b7f
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/Lacp.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.onlab.packet.lacp;
+
+import com.google.common.collect.ImmutableMap;
+import org.onlab.packet.BasePacket;
+import org.onlab.packet.DeserializationException;
+import org.onlab.packet.Deserializer;
+
+import java.nio.ByteBuffer;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.packet.PacketUtils.checkInput;
+
+public class Lacp extends BasePacket {
+    public static final int HEADER_LENGTH = 1;
+    public static final byte TYPE_ACTOR = 1;
+    public static final byte TYPE_PARTNER = 2;
+    public static final byte TYPE_COLLECTOR = 3;
+    public static final byte TYPE_TERMINATOR = 0;
+
+    private static final Map<Byte, Deserializer<? extends LacpTlv>> PROTOCOL_DESERIALIZER_MAP =
+            ImmutableMap.<Byte, Deserializer<? extends LacpTlv>>builder()
+                    .put(TYPE_ACTOR, LacpBaseTlv.deserializer())
+                    .put(TYPE_PARTNER, LacpBaseTlv.deserializer())
+                    .put(TYPE_COLLECTOR, LacpCollectorTlv.deserializer())
+                    .put(TYPE_TERMINATOR, LacpTerminatorTlv.deserializer())
+                    .build();
+
+    private byte lacpVersion;
+    private Map<Byte, LacpTlv> tlv = new ConcurrentHashMap<>();
+
+    /**
+     * Gets LACP version.
+     *
+     * @return LACP version
+     */
+    public byte getLacpVersion() {
+        return this.lacpVersion;
+    }
+
+    /**
+     * Sets LACP version.
+     *
+     * @param lacpVersion LACP version
+     * @return this
+     */
+    public Lacp setLacpVersion(byte lacpVersion) {
+        this.lacpVersion = lacpVersion;
+        return this;
+    }
+
+    /**
+     * Gets LACP TLV.
+     *
+     * @return LACP TLV
+     */
+    public Map<Byte, LacpTlv> getTlv() {
+        return this.tlv;
+    }
+
+    /**
+     * Sets LACP TLV.
+     *
+     * @param tlv LACP TLV
+     * @return this
+     */
+    public Lacp setTlv(Map<Byte, LacpTlv> tlv) {
+        this.tlv = tlv;
+        return this;
+    }
+
+    /**
+     * Deserializer function for LACP packets.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<Lacp> deserializer() {
+        return (data, offset, length) -> {
+            checkInput(data, offset, length, HEADER_LENGTH);
+
+            Lacp lacp = new Lacp();
+            ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+            lacp.setLacpVersion(bb.get());
+
+            while (bb.limit() - bb.position() > 0) {
+                byte nextType = bb.get();
+                int nextLength = Byte.toUnsignedInt(bb.get());
+                int parseLength = nextLength == 0 ?
+                        LacpTerminatorTlv.PADDING_LENGTH : // Special case for LacpTerminatorTlv
+                        nextLength - 2;
+
+                Deserializer<? extends LacpTlv> deserializer;
+                if (Lacp.PROTOCOL_DESERIALIZER_MAP.containsKey(nextType)) {
+                    deserializer = Lacp.PROTOCOL_DESERIALIZER_MAP.get(nextType);
+                } else {
+                    throw new DeserializationException("Unsupported LACP subtype " + Byte.toString(nextType));
+                }
+
+                LacpTlv tlv = deserializer.deserialize(data, bb.position(), parseLength);
+                LacpTlv previousTlv = lacp.tlv.put(nextType, tlv);
+                if (previousTlv != null) {
+                    throw new DeserializationException("Duplicated type " + Byte.toString(nextType)
+                            + "in LACP TLV");
+                }
+
+                bb.position(bb.position() + parseLength);
+            }
+
+            return lacp;
+        };
+    }
+
+    @Override
+    public byte[] serialize() {
+        byte[] actorInfo = Optional.ofNullable(tlv.get(TYPE_ACTOR)).map(LacpTlv::serialize)
+                .orElse(new byte[0]);
+        byte[] partnerInfo = Optional.ofNullable(tlv.get(TYPE_PARTNER)).map(LacpTlv::serialize)
+                .orElse(new byte[0]);
+        byte[] collectorInfo = Optional.ofNullable(tlv.get(TYPE_COLLECTOR)).map(LacpTlv::serialize)
+                .orElse(new byte[0]);
+        byte[] terminatorInfo = Optional.ofNullable(tlv.get(TYPE_TERMINATOR)).map(LacpTlv::serialize)
+                .orElse(new byte[0]);
+
+        final byte[] data = new byte[HEADER_LENGTH
+                + LacpTlv.HEADER_LENGTH + actorInfo.length
+                + LacpTlv.HEADER_LENGTH + partnerInfo.length
+                + LacpTlv.HEADER_LENGTH + collectorInfo.length
+                + LacpTlv.HEADER_LENGTH + terminatorInfo.length];
+
+        final ByteBuffer bb = ByteBuffer.wrap(data);
+        bb.put(lacpVersion);
+        bb.put(TYPE_ACTOR);
+        bb.put(LacpBaseTlv.LENGTH);
+        bb.put(actorInfo);
+        bb.put(TYPE_PARTNER);
+        bb.put(LacpBaseTlv.LENGTH);
+        bb.put(partnerInfo);
+        bb.put(TYPE_COLLECTOR);
+        bb.put(LacpCollectorTlv.LENGTH);
+        bb.put(collectorInfo);
+        bb.put(TYPE_TERMINATOR);
+        bb.put(LacpTerminatorTlv.LENGTH);
+        bb.put(terminatorInfo);
+
+        return data;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), lacpVersion, tlv);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (!(obj instanceof Lacp)) {
+            return false;
+        }
+        final Lacp other = (Lacp) obj;
+
+        return this.lacpVersion == other.lacpVersion &&
+                Objects.equals(this.tlv, other.tlv);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("lacpVersion", Byte.toString(lacpVersion))
+                .add("tlv", tlv)
+                .toString();
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/LacpBaseTlv.java b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpBaseTlv.java
new file mode 100644
index 0000000..5a4a0c9
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpBaseTlv.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.onlab.packet.lacp;
+
+import org.onlab.packet.Deserializer;
+import org.onlab.packet.MacAddress;
+
+import java.nio.ByteBuffer;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.packet.PacketUtils.checkInput;
+
+/**
+ * Represents LACP ActorInfo or PartnerInfo information.
+ */
+public class LacpBaseTlv extends LacpTlv {
+    public static final byte LENGTH = 20;
+    private static final byte[] RESERVED = new byte[3];
+
+    private short systemPriority;
+    private MacAddress systemMac;
+    private short key;
+    private short portPriority;
+    private short port;
+    private LacpState state;
+
+    /**
+     * Gets system priority.
+     *
+     * @return system priority
+     */
+    public short getSystemPriority() {
+        return systemPriority;
+    }
+
+    /**
+     * Sets system priority.
+     *
+     * @param systemPriority system priority
+     * @return this
+     */
+    public LacpBaseTlv setSystemPriority(short systemPriority) {
+        this.systemPriority = systemPriority;
+        return this;
+    }
+
+    /**
+     * Gets system MAC address.
+     *
+     * @return system MAC address
+     */
+    public MacAddress getSystemMac() {
+        return systemMac;
+    }
+
+    /**
+     * Sets system MAC address.
+     *
+     * @param systemMac system MAC
+     * @return this
+     */
+    public LacpBaseTlv setSystemMac(MacAddress systemMac) {
+        this.systemMac = systemMac;
+        return this;
+    }
+
+    /**
+     * Gets key.
+     *
+     * @return key
+     */
+    public short getKey() {
+        return key;
+    }
+
+    /**
+     * Sets key.
+     *
+     * @param key key
+     * @return this
+     */
+    public LacpBaseTlv setKey(short key) {
+        this.key = key;
+        return this;
+    }
+
+    /**
+     * Gets port priority.
+     *
+     * @return port priority
+     */
+    public short getPortPriority() {
+        return portPriority;
+    }
+
+    /**
+     * Sets port priority.
+     *
+     * @param portPriority port priority
+     * @return this
+     */
+    public LacpBaseTlv setPortPriority(short portPriority) {
+        this.portPriority = portPriority;
+        return this;
+    }
+
+    /**
+     * Gets port.
+     *
+     * @return port
+     */
+    public short getPort() {
+        return port;
+    }
+
+    /**
+     * Sets port.
+     *
+     * @param port port
+     * @return this
+     */
+    public LacpBaseTlv setPort(short port) {
+        this.port = port;
+        return this;
+    }
+
+    /**
+     * Gets state.
+     *
+     * @return state
+     */
+    public LacpState getState() {
+        return state;
+    }
+
+    /**
+     * Sets state.
+     *
+     * @param state state
+     * @return this
+     */
+    public LacpBaseTlv setState(byte state) {
+        this.state = new LacpState(state);
+        return this;
+    }
+
+    /**
+     * Deserializer function for LacpBaseTlv packets.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<LacpBaseTlv> deserializer() {
+        return (data, offset, length) -> {
+            checkInput(data, offset, length, LENGTH - HEADER_LENGTH);
+
+            LacpBaseTlv lacpBaseTlv = new LacpBaseTlv();
+            ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+
+            lacpBaseTlv.setSystemPriority(bb.getShort());
+            byte[] mac = new byte[6];
+            bb.get(mac);
+            lacpBaseTlv.setSystemMac(MacAddress.valueOf(mac));
+            lacpBaseTlv.setKey(bb.getShort());
+            lacpBaseTlv.setPortPriority(bb.getShort());
+            lacpBaseTlv.setPort(bb.getShort());
+            lacpBaseTlv.setState(bb.get());
+
+            return lacpBaseTlv;
+        };
+    }
+
+    @Override
+    public byte[] serialize() {
+        final byte[] data = new byte[LENGTH - HEADER_LENGTH];
+
+        final ByteBuffer bb = ByteBuffer.wrap(data);
+        bb.putShort(this.systemPriority);
+        bb.put(this.systemMac.toBytes());
+        bb.putShort(this.key);
+        bb.putShort(this.portPriority);
+        bb.putShort(this.port);
+        bb.put(this.state.toByte());
+        bb.put(RESERVED);
+
+        return data;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (!(obj instanceof LacpBaseTlv)) {
+            return false;
+        }
+        final LacpBaseTlv other = (LacpBaseTlv) obj;
+        return systemPriority == other.systemPriority &&
+                key == other.key &&
+                portPriority == other.portPriority &&
+                port == other.port &&
+                Objects.equals(state, other.state) &&
+                Objects.equals(systemMac, other.systemMac);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), systemPriority, systemMac, key,
+                portPriority, port, state);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("systemPriority", Short.toString(systemPriority))
+                .add("systemMac", systemMac.toString())
+                .add("key", Short.toString(key))
+                .add("portPriority", Short.toString(portPriority))
+                .add("port", Short.toString(port))
+                .add("state", state.toString())
+                .toString();
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/LacpCollectorTlv.java b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpCollectorTlv.java
new file mode 100644
index 0000000..e2d7039
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpCollectorTlv.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.onlab.packet.lacp;
+
+import com.google.common.base.Objects;
+import org.onlab.packet.Deserializer;
+
+import java.nio.ByteBuffer;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.packet.PacketUtils.checkInput;
+
+/**
+ * Represents LACP collector information.
+ */
+public class LacpCollectorTlv extends LacpTlv {
+    public static final byte LENGTH = 16;
+    private static final byte[] RESERVED = new byte[12];
+
+    private short collectorMaxDelay;
+
+    /**
+     * Gets collector max delay.
+     *
+     * @return collector max delay
+     */
+    public short getCollectorMaxDelay() {
+        return collectorMaxDelay;
+    }
+
+    /**
+     * Sets collector max delay.
+     *
+     * @param collectorMaxDelay collector max delay
+     * @return this
+     */
+    public LacpCollectorTlv setCollectorMaxDelay(short collectorMaxDelay) {
+        this.collectorMaxDelay = collectorMaxDelay;
+        return this;
+    }
+
+    /**
+     * Deserializer function for LacpCollectorTlv packets.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<LacpCollectorTlv> deserializer() {
+        return (data, offset, length) -> {
+            checkInput(data, offset, length, LENGTH - HEADER_LENGTH);
+
+            LacpCollectorTlv lacpCollectorTlv = new LacpCollectorTlv();
+            ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+
+            lacpCollectorTlv.setCollectorMaxDelay(bb.getShort());
+
+            return lacpCollectorTlv;
+        };
+    }
+
+    @Override
+    public byte[] serialize() {
+        final byte[] data = new byte[LENGTH - HEADER_LENGTH];
+
+        final ByteBuffer bb = ByteBuffer.wrap(data);
+        bb.putShort(this.collectorMaxDelay);
+        bb.put(RESERVED);
+
+        return data;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (!(obj instanceof LacpCollectorTlv)) {
+            return false;
+        }
+        final LacpCollectorTlv other = (LacpCollectorTlv) obj;
+        return this.collectorMaxDelay == other.collectorMaxDelay;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(super.hashCode(), collectorMaxDelay);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("collectorMaxDelay", Short.toString(collectorMaxDelay))
+                .toString();
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/LacpState.java b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpState.java
new file mode 100644
index 0000000..bd3a5ae
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpState.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.onlab.packet.lacp;
+
+import java.util.Objects;
+
+/**
+ * LACP state.
+ */
+public class LacpState {
+    private static final byte MASK_ACTIVE = 0x1;
+    private static final byte MASK_TIMEOUT = 0x2;
+    private static final byte MASK_AGG = 0x4;
+    private static final byte MASK_SYNC = 0x8;
+    private static final byte MASK_COLLECTING = 0x10;
+    private static final byte MASK_DISTRIBUTING = 0x20;
+    private static final byte MASK_DEFAULT = 0x40;
+    private static final byte MASK_EXPIRED = (byte) 0x80;
+
+    private byte state;
+
+    /**
+     * Constructs LACP state with zero value.
+     */
+    public LacpState() {
+        this.state = 0;
+    }
+
+    /**
+     * Constructs LACP state with given value.
+     *
+     * @param state state in byte.
+     */
+    public LacpState(byte state) {
+        this.state = state;
+    }
+
+    /**
+     * Gets LACP state in byte.
+     *
+     * @return LACP state
+     */
+    public byte toByte() {
+        return state;
+    }
+
+    /**
+     * Checks if this state has the active flag set.
+     *
+     * @return true if this state has the active flag set.
+     */
+    public boolean isActive() {
+        return (state & MASK_ACTIVE) != 0;
+    }
+
+    /**
+     * Sets active bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setActive(boolean value) {
+        setBit(MASK_ACTIVE, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the timeout flag set. Timeout flag indicates short timeout if set.
+     *
+     * @return true if this state has the timeout flag set.
+     */
+    public boolean isTimeout() {
+        return (state & MASK_TIMEOUT) != 0;
+    }
+
+    /**
+     * Sets timeout bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setTimeout(boolean value) {
+        setBit(MASK_TIMEOUT, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the aggregatable flag set.
+     *
+     * @return true if this state has the aggregatable flag set.
+     */
+    public boolean isAggregatable() {
+        return (state & MASK_AGG) != 0;
+    }
+
+    /**
+     * Sets aggregatable bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setAggregatable(boolean value) {
+        setBit(MASK_AGG, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the synchronization flag set.
+     *
+     * @return true if this state has the synchronization flag set.
+     */
+    public boolean isSync() {
+        return (state & MASK_SYNC) != 0;
+    }
+
+    /**
+     * Sets sync bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setSync(boolean value) {
+        setBit(MASK_SYNC, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the collecting flag set.
+     *
+     * @return true if this state has the collecting flag set.
+     */
+    public boolean isCollecting() {
+        return (state & MASK_COLLECTING) != 0;
+    }
+
+    /**
+     * Sets collecting bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setCollecting(boolean value) {
+        setBit(MASK_COLLECTING, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the distributing flag set.
+     *
+     * @return true if this state has the distributing flag set.
+     */
+    public boolean isDistributing() {
+        return (state & MASK_DISTRIBUTING) != 0;
+    }
+
+    /**
+     * Sets distributing bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setDistributing(boolean value) {
+        setBit(MASK_DISTRIBUTING, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the default flag set.
+     *
+     * @return true if this state has the default flag set.
+     */
+    public boolean isDefault() {
+        return (state & MASK_DEFAULT) != 0;
+    }
+
+    /**
+     * Sets default bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setDefault(boolean value) {
+        setBit(MASK_DEFAULT, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the expired flag set.
+     *
+     * @return true if this state has the expired flag set.
+     */
+    public boolean isExpired() {
+        return (state & MASK_EXPIRED) != 0;
+    }
+
+    /**
+     * Sets expired bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setExpired(boolean value) {
+        setBit(MASK_EXPIRED, value);
+        return this;
+    }
+
+    /**
+     * Sets the bit masked by given mask in the state to desired value.
+     *
+     * @param mask bit to mask
+     * @param value desire value
+     */
+    private void setBit(byte mask, boolean value) {
+        state = (byte) (value ? state | mask : state & ~mask);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof LacpState)) {
+            return false;
+        }
+        final LacpState other = (LacpState) obj;
+
+        return this.state == other.state;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(state);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("{ ");
+        if (isActive()) {
+            builder.append("ACT ");
+        }
+        if (isTimeout()) {
+            builder.append("STO ");
+        }
+        if (isAggregatable()) {
+            builder.append("AGG ");
+        }
+        if (isSync()) {
+            builder.append("SYN ");
+        }
+        if (isCollecting()) {
+            builder.append("COL ");
+        }
+        if (isDistributing()) {
+            builder.append("DIS ");
+        }
+        if (isDefault()) {
+            builder.append("DEF ");
+        }
+        if (isExpired()) {
+            builder.append("EXP ");
+        }
+        builder.append("}");
+        return builder.toString();
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/LacpTerminatorTlv.java b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpTerminatorTlv.java
new file mode 100644
index 0000000..2afd50a
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpTerminatorTlv.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.onlab.packet.lacp;
+
+import org.onlab.packet.Deserializer;
+
+import java.nio.ByteBuffer;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.packet.PacketUtils.checkInput;
+
+/**
+ * Represents LACP terminator information.
+ */
+public class LacpTerminatorTlv extends LacpTlv {
+    public static final byte LENGTH = 0;
+    static final byte PADDING_LENGTH = 50;
+    private static final byte[] PADDING = new byte[PADDING_LENGTH];
+
+    /**
+     * Deserializer function for LacpTerminatorTlv packets.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<LacpTerminatorTlv> deserializer() {
+        return (data, offset, length) -> {
+            checkInput(data, offset, length, LENGTH);
+
+            return new LacpTerminatorTlv();
+        };
+    }
+
+    @Override
+    public byte[] serialize() {
+        final byte[] data = new byte[LENGTH + PADDING_LENGTH];
+
+        final ByteBuffer bb = ByteBuffer.wrap(data);
+        bb.put(PADDING);
+
+        return data;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass()).toString();
+    }
+}
\ No newline at end of file
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpTlv.java
similarity index 77%
copy from web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
copy to utils/misc/src/main/java/org/onlab/packet/lacp/LacpTlv.java
index fca0dc7..dedb095 100644
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpTlv.java
@@ -14,6 +14,10 @@
  * limitations under the License.
  */
 
-/**
- * ONOS GUI -- Topology Zoom Layer -- CSS file
- */
\ No newline at end of file
+package org.onlab.packet.lacp;
+
+import org.onlab.packet.BasePacket;
+
+public abstract class LacpTlv extends BasePacket {
+    public static final byte HEADER_LENGTH = 2;
+}
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css b/utils/misc/src/main/java/org/onlab/packet/lacp/package-info.java
similarity index 87%
copy from web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
copy to utils/misc/src/main/java/org/onlab/packet/lacp/package-info.java
index fca0dc7..f7f7bfe 100644
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/package-info.java
@@ -15,5 +15,6 @@
  */
 
 /**
- * ONOS GUI -- Topology Zoom Layer -- CSS file
- */
\ No newline at end of file
+ * Utilities for decoding and encoding LACP packets.
+ */
+package org.onlab.packet.lacp;
\ No newline at end of file
diff --git a/utils/misc/src/test/java/org/onlab/packet/lacp/LacpBaseTlvTest.java b/utils/misc/src/test/java/org/onlab/packet/lacp/LacpBaseTlvTest.java
new file mode 100644
index 0000000..874d5c1
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/lacp/LacpBaseTlvTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.onlab.packet.lacp;
+
+import com.google.common.io.Resources;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.MacAddress;
+
+import static org.junit.Assert.*;
+
+public class LacpBaseTlvTest {
+    private static final String PACKET_DUMP = "baseinfo.bin";
+
+    private byte[] data;
+
+    private static final short SYS_PRIORITY = (short) 32768;
+    private static final MacAddress SYS_MAC = MacAddress.valueOf("a4:23:05:00:11:22");
+    private static final short KEY = (short) 13;
+    private static final short PORT_PRIORITY = (short) 32768;
+    private static final short PORT = 22;
+    private static final byte STATE = (byte) 0x85;
+
+    static final LacpBaseTlv BASE_TLV = new LacpBaseTlv()
+            .setSystemPriority(SYS_PRIORITY)
+            .setSystemMac(SYS_MAC)
+            .setKey(KEY)
+            .setPortPriority(PORT_PRIORITY)
+            .setPort(PORT)
+            .setState(STATE);
+
+    @Before
+    public void setUp() throws Exception {
+         data = Resources.toByteArray(LacpBaseTlvTest.class.getResource(PACKET_DUMP));
+    }
+
+    @Test
+    public void deserializer() throws Exception {
+        LacpBaseTlv actorInfo = LacpBaseTlv.deserializer().deserialize(data, 0, data.length);
+        assertEquals(SYS_PRIORITY, actorInfo.getSystemPriority());
+        assertEquals(SYS_MAC, actorInfo.getSystemMac());
+        assertEquals(KEY, actorInfo.getKey());
+        assertEquals(PORT_PRIORITY, actorInfo.getPortPriority());
+        assertEquals(PORT, actorInfo.getPort());
+        assertEquals(STATE, actorInfo.getState().toByte());
+    }
+
+    @Test
+    public void serialize() {
+        assertArrayEquals(data, BASE_TLV.serialize());
+    }
+}
\ No newline at end of file
diff --git a/utils/misc/src/test/java/org/onlab/packet/lacp/LacpCollectorTlvTest.java b/utils/misc/src/test/java/org/onlab/packet/lacp/LacpCollectorTlvTest.java
new file mode 100644
index 0000000..1e098ee
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/lacp/LacpCollectorTlvTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.onlab.packet.lacp;
+
+import com.google.common.io.Resources;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+public class LacpCollectorTlvTest {
+    private static final String PACKET_DUMP = "collectorinfo.bin";
+
+    private byte[] data;
+
+    private static final short COLLECTOR_MAX_DELAY = (short) 32768;
+
+    static final LacpCollectorTlv COLLECTOR_TLV = new LacpCollectorTlv()
+            .setCollectorMaxDelay(COLLECTOR_MAX_DELAY);
+
+    @Before
+    public void setUp() throws Exception {
+         data = Resources.toByteArray(LacpCollectorTlvTest.class.getResource(PACKET_DUMP));
+    }
+
+    @Test
+    public void deserializer() throws Exception {
+        LacpCollectorTlv lacpCollectorTlv = LacpCollectorTlv.deserializer().deserialize(data, 0, data.length);
+        assertEquals(COLLECTOR_MAX_DELAY, lacpCollectorTlv.getCollectorMaxDelay());
+
+    }
+
+    @Test
+    public void serialize() {
+        assertArrayEquals(data, COLLECTOR_TLV.serialize());
+    }
+}
\ No newline at end of file
diff --git a/utils/misc/src/test/java/org/onlab/packet/lacp/LacpStateTest.java b/utils/misc/src/test/java/org/onlab/packet/lacp/LacpStateTest.java
new file mode 100644
index 0000000..4645664
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/lacp/LacpStateTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.onlab.packet.lacp;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class LacpStateTest {
+
+    @Test
+    public void toByte() {
+        LacpState state = new LacpState((byte) 0x15);
+        assertEquals((byte) 0x15, state.toByte());
+    }
+
+    @Test
+    public void isActive() {
+        LacpState state = new LacpState((byte) 0x1);
+        assertTrue(state.isActive());
+    }
+
+    @Test
+    public void isTimeout() {
+        LacpState state = new LacpState((byte) 0x2);
+        assertTrue(state.isTimeout());
+    }
+
+    @Test
+    public void isAggregatable() {
+        LacpState state = new LacpState((byte) 0x4);
+        assertTrue(state.isAggregatable());
+    }
+
+    @Test
+    public void isSync() {
+        LacpState state = new LacpState((byte) 0x8);
+        assertTrue(state.isSync());
+    }
+
+    @Test
+    public void isCollecting() {
+        LacpState state = new LacpState((byte) 0x10);
+        assertTrue(state.isCollecting());
+    }
+
+    @Test
+    public void isDistributing() {
+        LacpState state = new LacpState((byte) 0x20);
+        assertTrue(state.isDistributing());
+    }
+
+    @Test
+    public void isDefault() {
+        LacpState state = new LacpState((byte) 0x40);
+        assertTrue(state.isDefault());
+    }
+
+    @Test
+    public void isExpired() {
+        LacpState state = new LacpState((byte) 0x80);
+        assertTrue(state.isExpired());
+    }
+
+    @Test
+    public void equals() {
+        LacpState state1 = new LacpState((byte) 0x15);
+        LacpState state2 = new LacpState((byte) 0x15);
+        LacpState state3 = new LacpState((byte) 0x51);
+
+        assertEquals(state1, state2);
+        assertNotEquals(state1, state3);
+
+    }
+}
\ No newline at end of file
diff --git a/utils/misc/src/test/java/org/onlab/packet/lacp/LacpTerminatorTlvTest.java b/utils/misc/src/test/java/org/onlab/packet/lacp/LacpTerminatorTlvTest.java
new file mode 100644
index 0000000..6f84a5a
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/lacp/LacpTerminatorTlvTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.onlab.packet.lacp;
+
+import com.google.common.io.Resources;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertArrayEquals;
+
+public class LacpTerminatorTlvTest {
+    private static final String PACKET_DUMP = "terminatorinfo.bin";
+
+    private byte[] data;
+
+    static final LacpTerminatorTlv TERMINATOR_TLV = new LacpTerminatorTlv();
+
+    @Before
+    public void setUp() throws Exception {
+         data = Resources.toByteArray(LacpTerminatorTlvTest.class.getResource(PACKET_DUMP));
+    }
+
+    @Test
+    public void deserializer() throws Exception {
+        LacpTerminatorTlv lacpTerminatorTlv = LacpTerminatorTlv.deserializer().deserialize(data, 0, data.length);
+    }
+
+    @Test
+    public void serialize() {
+        assertArrayEquals(data, TERMINATOR_TLV.serialize());
+    }
+}
\ No newline at end of file
diff --git a/utils/misc/src/test/java/org/onlab/packet/lacp/LacpTest.java b/utils/misc/src/test/java/org/onlab/packet/lacp/LacpTest.java
new file mode 100644
index 0000000..810799c
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/lacp/LacpTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.onlab.packet.lacp;
+
+import com.google.common.collect.Maps;
+import com.google.common.io.Resources;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.junit.Assert.*;
+
+public class LacpTest {
+    private static final String PACKET_DUMP = "lacp.bin";
+
+    private static final byte LACP_VERSION = 1;
+    private static final Map<Byte, LacpTlv> LACP_TLV = Maps.newHashMap();
+    private static final Lacp LACP = new Lacp();
+
+    static {
+        LACP_TLV.put(Lacp.TYPE_ACTOR, LacpBaseTlvTest.BASE_TLV);
+        LACP_TLV.put(Lacp.TYPE_PARTNER, LacpBaseTlvTest.BASE_TLV);
+        LACP_TLV.put(Lacp.TYPE_COLLECTOR, LacpCollectorTlvTest.COLLECTOR_TLV);
+        LACP_TLV.put(Lacp.TYPE_TERMINATOR, LacpTerminatorTlvTest.TERMINATOR_TLV);
+
+        LACP.setLacpVersion(LACP_VERSION)
+                .setTlv(LACP_TLV);
+    }
+
+    private byte[] data;
+
+    @Before
+    public void setUp() throws Exception {
+        data = Resources.toByteArray(LacpBaseTlvTest.class.getResource(PACKET_DUMP));
+    }
+
+    @Test
+    public void deserializer() throws Exception {
+        Lacp lacp = Lacp.deserializer().deserialize(data, 0, data.length);
+        assertEquals(LACP_VERSION, lacp.getLacpVersion());
+        assertEquals(LACP_TLV, lacp.getTlv());
+    }
+
+    @Test
+    public void serialize() {
+        assertArrayEquals(data, LACP.serialize());
+    }
+}
\ No newline at end of file
diff --git a/utils/misc/src/test/resources/org/onlab/packet/lacp/baseinfo.bin b/utils/misc/src/test/resources/org/onlab/packet/lacp/baseinfo.bin
new file mode 100644
index 0000000..cf9e8cf
--- /dev/null
+++ b/utils/misc/src/test/resources/org/onlab/packet/lacp/baseinfo.bin
Binary files differ
diff --git a/utils/misc/src/test/resources/org/onlab/packet/lacp/collectorinfo.bin b/utils/misc/src/test/resources/org/onlab/packet/lacp/collectorinfo.bin
new file mode 100644
index 0000000..59f08bc
--- /dev/null
+++ b/utils/misc/src/test/resources/org/onlab/packet/lacp/collectorinfo.bin
Binary files differ
diff --git a/utils/misc/src/test/resources/org/onlab/packet/lacp/lacp.bin b/utils/misc/src/test/resources/org/onlab/packet/lacp/lacp.bin
new file mode 100644
index 0000000..d3e13b6
--- /dev/null
+++ b/utils/misc/src/test/resources/org/onlab/packet/lacp/lacp.bin
Binary files differ
diff --git a/utils/misc/src/test/resources/org/onlab/packet/lacp/terminatorinfo.bin b/utils/misc/src/test/resources/org/onlab/packet/lacp/terminatorinfo.bin
new file mode 100644
index 0000000..445c896
--- /dev/null
+++ b/utils/misc/src/test/resources/org/onlab/packet/lacp/terminatorinfo.bin
Binary files differ
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/ClusterWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/ClusterWebResource.java
index 664f0eb..47570c9 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/ClusterWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/ClusterWebResource.java
@@ -15,30 +15,19 @@
  */
 package org.onosproject.rest.resources;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.cluster.ClusterAdminService;
-import org.onosproject.cluster.ClusterService;
-import org.onosproject.cluster.ControllerNode;
-import org.onosproject.cluster.NodeId;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.rest.AbstractWebResource;
-
 import javax.ws.rs.GET;
-import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashSet;
-import java.util.List;
+
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.ControllerNode;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.rest.AbstractWebResource;
 
 import static org.onlab.util.Tools.nullIsNotFound;
-import static org.onlab.util.Tools.readTreeFromStream;
 
 /**
  * Manage cluster of ONOS instances.
@@ -78,35 +67,4 @@
                                              NODE_NOT_FOUND);
         return ok(codec(ControllerNode.class).encode(node, this)).build();
     }
-
-    /**
-     * Forms cluster of ONOS instances.
-     * Forms ONOS cluster using the uploaded JSON definition.
-     *
-     * @param config cluster definition
-     * @return 200 OK
-     * @throws IOException to signify bad request
-     * @onos.rsModel ClusterPost
-     */
-    @POST
-    @Path("configuration")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response formCluster(InputStream config) throws IOException {
-        JsonCodec<ControllerNode> codec = codec(ControllerNode.class);
-        ObjectNode root = readTreeFromStream(mapper(), config);
-
-        List<ControllerNode> nodes = codec.decode((ArrayNode) root.path("nodes"), this);
-        JsonNode partitionSizeNode = root.get("partitionSize");
-        if (partitionSizeNode != null) {
-            int partitionSize = partitionSizeNode.asInt();
-            if (partitionSize == 0) {
-                return Response.notAcceptable(null).build();
-            }
-            get(ClusterAdminService.class).formCluster(new HashSet<>(nodes), partitionSize);
-        } else {
-            get(ClusterAdminService.class).formCluster(new HashSet<>(nodes));
-        }
-
-        return Response.ok().build();
-    }
 }
diff --git a/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/glyph.service.ts b/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/glyph.service.ts
index 56d62ab..c51af7a 100644
--- a/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/glyph.service.ts
+++ b/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/glyph.service.ts
@@ -190,19 +190,22 @@
     }
 
     addGlyph(elem: any, glyphId: string, size: number, overlay: any, trans: any) {
-        const sz = size || 40,
-            ovr = !!overlay,
-            xns = this.fs.isA(trans),
-            atr = {
-                width: sz,
-                height: sz,
-                'class': 'glyph',
-                'xlink:href': '#' + glyphId,
-            };
+        const sz = size || 40;
+        const ovr = !!overlay;
+        const xns = this.fs.isA(trans);
+
+        const glyphUse = elem
+            .append('use')
+            .attr('width', sz)
+            .attr('height', sz)
+            .attr('class', 'glyph')
+            .attr('xlink:href', '#' + glyphId)
+            .classed('overlay', ovr);
 
         if (xns) {
-            atr.class = this.sus.translate(trans);
+            glyphUse.attr('transform', this.sus.translate(trans));
         }
-        return elem.append('use').attr(atr).classed('overlay', ovr);
+
+        return glyphUse;
     }
 }
diff --git a/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/svgutil.service.ts b/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/svgutil.service.ts
index 6107d16..7510486 100644
--- a/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/svgutil.service.ts
+++ b/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/svgutil.service.ts
@@ -18,6 +18,34 @@
 import { LogService } from '../log.service';
 import * as d3 from 'd3';
 
+
+// --- Ordinal scales for 7 values.
+// TODO: migrate these colors to the theme service.
+
+// Colors per Mojo-Design's color palette.. (version one)
+//               blue       red        dk grey    steel      lt blue    lt red     lt grey
+// var lightNorm = ['#5b99d2', '#d05a55', '#716b6b', '#7e9aa8', '#66cef6', '#db7773', '#aeada8' ],
+//     lightMute = ['#a8cceb', '#f1a7a7', '#b9b5b5', '#bdcdd5', '#a8e9fd', '#f8c9c9', '#d7d6d4' ],
+
+// Colors per Mojo-Design's color palette.. (version two)
+//               blue       lt blue    red        green      brown      teal       lime
+const lightNorm: string[] = ['#5b99d2', '#66cef6', '#d05a55', '#0f9d58', '#ba7941', '#3dc0bf', '#56af00'];
+const lightMute: string[] = ['#9ebedf', '#abdef5', '#d79a96', '#7cbe99', '#cdab8d', '#96d5d5', '#a0c96d'];
+
+const darkNorm: string[] = ['#5b99d2', '#66cef6', '#d05a55', '#0f9d58', '#ba7941', '#3dc0bf', '#56af00'];
+const darkMute: string[] = ['#9ebedf', '#abdef5', '#d79a96', '#7cbe99', '#cdab8d', '#96d5d5', '#a0c96d'];
+
+const colors = {
+    light: {
+        norm: d3.scaleOrdinal().range(lightNorm),
+        mute: d3.scaleOrdinal().range(lightMute),
+    },
+    dark: {
+        norm: d3.scaleOrdinal().range(darkNorm),
+        mute: d3.scaleOrdinal().range(darkMute),
+    },
+};
+
 /**
  * ONOS GUI -- SVG -- Util Service
  *
@@ -27,44 +55,13 @@
     providedIn: 'root',
 })
 export class SvgUtilService {
-    lightNorm: string[];
-    lightMute: string[];
-    darkNorm: string[];
-    darkMute: string[];
-    colors: any;
 
     constructor(
         private fs: FnService,
         private log: LogService
     ) {
 
-        // --- Ordinal scales for 7 values.
-        // TODO: migrate these colors to the theme service.
 
-        // Colors per Mojo-Design's color palette.. (version one)
-        //               blue       red        dk grey    steel      lt blue    lt red     lt grey
-        // var lightNorm = ['#5b99d2', '#d05a55', '#716b6b', '#7e9aa8', '#66cef6', '#db7773', '#aeada8' ],
-        //     lightMute = ['#a8cceb', '#f1a7a7', '#b9b5b5', '#bdcdd5', '#a8e9fd', '#f8c9c9', '#d7d6d4' ],
-
-        // Colors per Mojo-Design's color palette.. (version two)
-        //               blue       lt blue    red        green      brown      teal       lime
-        this.lightNorm = ['#5b99d2', '#66cef6', '#d05a55', '#0f9d58', '#ba7941', '#3dc0bf', '#56af00'];
-        this.lightMute = ['#9ebedf', '#abdef5', '#d79a96', '#7cbe99', '#cdab8d', '#96d5d5', '#a0c96d'];
-
-        this.darkNorm = ['#5b99d2', '#66cef6', '#d05a55', '#0f9d58', '#ba7941', '#3dc0bf', '#56af00'];
-        this.darkMute = ['#9ebedf', '#abdef5', '#d79a96', '#7cbe99', '#cdab8d', '#96d5d5', '#a0c96d'];
-
-
-        this.colors = {
-            light: {
-                norm: d3.scaleOrdinal().range(this.lightNorm),
-                mute: d3.scaleOrdinal().range(this.lightMute),
-            },
-            dark: {
-                norm: d3.scaleOrdinal().range(this.darkNorm),
-                mute: d3.scaleOrdinal().range(this.darkMute),
-            },
-        };
 
         this.log.debug('SvgUtilService constructed');
     }
@@ -95,10 +92,10 @@
             // NOTE: since we are lazily assigning domain ids, we need to
             //       get the color from all 4 scales, to keep the domains
             //       in sync.
-            const ln = this.colors.light.norm(id);
-            const lm = this.colors.light.mute(id);
-            const dn = this.colors.dark.norm(id);
-            const dm = this.colors.dark.mute(id);
+            const ln = colors.light.norm(id);
+            const lm = colors.light.mute(id);
+            const dn = colors.dark.norm(id);
+            const dm = colors.dark.mute(id);
             if (theme === 'dark') {
                 return muted ? dm : dn;
             } else {
@@ -126,32 +123,27 @@
                     muted = k % 2;
                     what = muted ? ' muted' : ' normal';
                     theme = k < 2 ? 'light' : 'dark';
-                    dom.forEach(function (id, i) {
+                    dom.forEach((id, i) => {
                         const x = i * 20;
                         const y = k * 20;
-                        const f = getColor(id, muted, theme);
-                        g.append('circle').attr({
-                            cx: x,
-                            cy: y,
-                            r: 5,
-                            fill: f,
-                        });
+                        g.append('circle')
+                            .attr('cx', x)
+                            .attr('cy', y)
+                            .attr('r', 5)
+                            .attr('fill', getColor(id, muted, theme));
                     });
-                    g.append('rect').attr({
-                        x: 140,
-                        y: k * 20 - 5,
-                        width: 32,
-                        height: 10,
-                        rx: 2,
-                        fill: '#888',
-                    });
+                    g.append('rect')
+                        .attr('x', 140)
+                        .attr('y', k * 20 - 5)
+                        .attr('width', 32)
+                        .attr('height', 10)
+                        .attr('rx', 2)
+                        .attr('fill', '#888');
                     g.append('text').text(theme + what)
-                        .attr({
-                            x: 142,
-                            y: k * 20 + 2,
-                            fill: 'white',
-                        })
-                        .style('font-size', '4pt');
+                        .attr('x', 142)
+                        .attr('y', k * 20 + 2)
+                        .attr('fill', 'white');
+                        // .style('font-size', '4pt');
                 }
             }
         }
diff --git a/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/zoom.service.ts b/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/zoom.service.ts
index fdf08f9..8cbca5a 100644
--- a/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/zoom.service.ts
+++ b/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/svg/zoom.service.ts
@@ -117,7 +117,7 @@
 */
         // Remove zoom on double click (prevents a
         // false zoom navigating regions)
-        this.settings.svg.on('dblclick.zoom', null);
+        // this.settings.svg.on('dblclick.zoom', null);
 
         return this.zoomer;
     }
diff --git a/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/widget/panel.base.ts b/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/widget/panel.base.ts
index 0377c47..628f84f 100644
--- a/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/widget/panel.base.ts
+++ b/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/widget/panel.base.ts
@@ -37,10 +37,10 @@
 
     on: boolean;
 
-    constructor(
+    protected constructor(
         protected fs: FnService,
         protected ls: LoadingService,
-        protected log: LogService,
+        protected log: LogService
     ) {
 //        this.log.debug('Panel base class constructed');
     }
diff --git a/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/widget/table.base.ts b/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/widget/table.base.ts
index 41ce239..e011057 100644
--- a/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/widget/table.base.ts
+++ b/web/gui2-fw-lib/projects/gui2-fw-lib/src/lib/widget/table.base.ts
@@ -91,13 +91,13 @@
     autoRefresh: boolean = true;
     autoRefreshTip: string = 'Toggle auto refresh'; // TODO: get LION string
 
-    private root: string;
-    private req: string;
-    private resp: string;
+    readonly root: string;
+    readonly req: string;
+    readonly resp: string;
     private refreshPromise: any = null;
     private handlers: string[] = [];
 
-    constructor(
+    protected constructor(
         protected fs: FnService,
         protected ls: LoadingService,
         protected log: LogService,
diff --git a/web/gui2/BUILD b/web/gui2/BUILD
index 28b0624..0702802 100644
--- a/web/gui2/BUILD
+++ b/web/gui2/BUILD
@@ -93,7 +93,7 @@
             ":src/main/webapp/login.html",
             ":src/main/webapp/nav.html",
             ":src/main/webapp/not-ready.html",
-            ":src/main/webapp/onos.theme.css",
+            ":src/main/webapp/onos.global.css",
         ],
 )
 
diff --git a/web/gui2/angular.json b/web/gui2/angular.json
index 3563d9e..579fbf4 100644
--- a/web/gui2/angular.json
+++ b/web/gui2/angular.json
@@ -20,7 +20,7 @@
               "src/main/webapp/data",
               "src/main/webapp/app/fw/layer/loading.service.css"
             ],
-            "styles": ["src/main/webapp/onos.theme.css"],
+            "styles": ["src/main/webapp/onos.global.css"],
             "scripts": []
           },
           "configurations": {
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.html b/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.html
deleted file mode 100644
index 6f1bb4b..0000000
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!--
-~ Copyright 2018-present Open Networking Foundation
-~
-~ 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.
--->
-<svg:g id="topo-zoomlayer">
-    <svg:g onos-backgroundsvg/>
-    <svg:g onos-forcesvg/>
-</svg:g>
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.spec.ts b/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.spec.ts
deleted file mode 100644
index 60a1997..0000000
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.spec.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * 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.
- */
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
-import { ActivatedRoute, Params } from '@angular/router';
-import { of } from 'rxjs';
-
-import { ZoomLayerSvgComponent } from './zoomlayersvg.component';
-import {
-    FnService,
-    LogService,
-    ZoomService
-} from 'gui2-fw-lib';
-
-class MockActivatedRoute extends ActivatedRoute {
-    constructor(params: Params) {
-        super();
-        this.queryParams = of(params);
-    }
-}
-
-class MockZoomService {}
-
-/**
- * ONOS GUI -- Topology View Zoom Layer -- Unit Tests
- */
-describe('ZoomLayerSvgComponent', () => {
-    let fs: FnService;
-    let ar: MockActivatedRoute;
-    let windowMock: Window;
-    let logServiceSpy: jasmine.SpyObj<LogService>;
-    let component: ZoomLayerSvgComponent;
-    let fixture: ComponentFixture<ZoomLayerSvgComponent>;
-
-    beforeEach(async(() => {
-        const logSpy = jasmine.createSpyObj('LogService', ['info', 'debug', 'warn', 'error']);
-        ar = new MockActivatedRoute({ 'debug': 'txrx' });
-
-        windowMock = <any>{
-            location: <any>{
-                hostname: 'foo',
-                host: 'foo',
-                port: '80',
-                protocol: 'http',
-                search: { debug: 'true' },
-                href: 'ws://foo:123/onos/ui/websock/path',
-                absUrl: 'ws://foo:123/onos/ui/websock/path'
-            }
-        };
-        fs = new FnService(ar, logSpy, windowMock);
-
-        TestBed.configureTestingModule({
-            declarations: [ ZoomLayerSvgComponent ],
-            providers: [
-                { provide: FnService, useValue: fs },
-                { provide: LogService, useValue: logSpy },
-                { provide: 'Window', useValue: windowMock },
-                { provide: ZoomService, useClass: MockZoomService }
-            ]
-        })
-        .compileComponents();
-        logServiceSpy = TestBed.get(LogService);
-    }));
-
-    beforeEach(() => {
-        fixture = TestBed.createComponent(ZoomLayerSvgComponent);
-        component = fixture.componentInstance;
-        fixture.detectChanges();
-    });
-
-    it('should create', () => {
-        expect(component).toBeTruthy();
-    });
-});
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.ts b/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.ts
deleted file mode 100644
index e0c85ed..0000000
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.ts
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * 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.
- */
-import { Component, OnInit } from '@angular/core';
-import {
-    FnService,
-    LogService,
-    ZoomService, Zoomer, ZoomOpts
-} from 'gui2-fw-lib';
-
-/**
- * ONOS GUI -- Topology Zoom Layer View.
- * View that contains the 'Force graph' message
- *
- * This component is an SVG snippet that expects to be in an SVG element with a view box of 1000x1000
- *
- * It should be added to a template with a tag like <svg:g onos-zoomlayer />
- */
-@Component({
-  selector: '[onos-zoomlayer]',
-  templateUrl: './zoomlayersvg.component.html',
-  styleUrls: ['./zoomlayersvg.component.css']
-})
-export class ZoomLayerSvgComponent implements OnInit {
-    zoomer: Zoomer;
-    zoomEventListeners: any[];
-
-    constructor(
-        protected fs: FnService,
-        protected log: LogService,
-        protected zs: ZoomService
-    ) {
-        this.log.debug('ZoomLayerSvgComponent constructed');
-    }
-
-    ngOnInit() {
-
-    }
-
-    createZoomer(options: ZoomOpts) {
-        // need to wrap the original zoom callback to extend its behavior
-        const origCallback = this.fs.isF(options.zoomCallback) ? options.zoomCallback : () => {};
-
-        options.zoomCallback = () => {
-            origCallback([0, 0], 1);
-
-            this.zoomEventListeners.forEach((ev) => ev(this.zoomer));
-        };
-
-        this.zoomer = this.zs.createZoomer(options);
-        return this.zoomer;
-    }
-
-    getZoomer() {
-        return this.zoomer;
-    }
-
-    findZoomEventListener(ev) {
-        for (let i = 0, len = this.zoomEventListeners.length; i < len; i++) {
-            if (this.zoomEventListeners[i] === ev) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    addZoomEventListener(callback) {
-        this.zoomEventListeners.push(callback);
-    }
-
-    removeZoomEventListener(callback) {
-        const evIndex = this.findZoomEventListener(callback);
-
-        if (evIndex !== -1) {
-            this.zoomEventListeners.splice(evIndex);
-        }
-    }
-
-    adjustmentScale(min: number, max: number): number {
-        let _scale = 1;
-        const size = (min + max) / 2;
-
-        if (size * this.scale() < max) {
-            _scale = min / (size * this.scale());
-        } else if (size * this.scale() > max) {
-            _scale = min / (size * this.scale());
-        }
-
-        return _scale;
-    }
-
-    scale(): number {
-        return this.zoomer.scale();
-    }
-
-    panAndZoom(translate: number[], scale: number, transition?: number) {
-        this.zoomer.panZoom(translate, scale, transition);
-    }
-
-}
diff --git a/web/gui2/src/main/webapp/app/view/topology/panel/details/details.component.html b/web/gui2/src/main/webapp/app/view/topology/panel/details/details.component.html
index 1ff43e6..af8f6a0 100644
--- a/web/gui2/src/main/webapp/app/view/topology/panel/details/details.component.html
+++ b/web/gui2/src/main/webapp/app/view/topology/panel/details/details.component.html
@@ -14,7 +14,7 @@
 ~ limitations under the License.
 -->
 <div id="topo2-p-detail" class="floatpanel topo2-p"
-     style="opacity: 1; right: 20px; width: 260px; top: 350px;" [@detailsPanelState]="!on">
+     style="opacity: 1; right: 20px; width: 260px; top: 350px;" [@detailsPanelState]="on">
     <div class="header">
         <div class="icon clickable">
             <svg>
diff --git a/web/gui2/src/main/webapp/app/view/topology/panel/details/details.component.ts b/web/gui2/src/main/webapp/app/view/topology/panel/details/details.component.ts
index c8bf95b..0fcf179 100644
--- a/web/gui2/src/main/webapp/app/view/topology/panel/details/details.component.ts
+++ b/web/gui2/src/main/webapp/app/view/topology/panel/details/details.component.ts
@@ -63,6 +63,7 @@
     }
 
     ngOnInit() {
+        this.on = false;
     }
 
 }
diff --git a/web/gui2/src/main/webapp/app/view/topology/panel/summary/summary.component.html b/web/gui2/src/main/webapp/app/view/topology/panel/summary/summary.component.html
index e71b58d..d781418 100644
--- a/web/gui2/src/main/webapp/app/view/topology/panel/summary/summary.component.html
+++ b/web/gui2/src/main/webapp/app/view/topology/panel/summary/summary.component.html
@@ -14,63 +14,7 @@
 ~ limitations under the License.
 -->
 <div id="topo2-p-summary" class="floatpanel topo2-p"
-     style="opacity: 1; right: 20px; width: 260px;" [@summaryPanelState]="!on">
-    <div class="header">
-        <div class="icon">
-            <svg>
-                <use width="24" height="24" class="glyph" xlink:href="#bird"
-                     transform="translate(1,1)"></use>
-            </svg>
-        </div>
-        <h2>ONOS Summary</h2>
-    </div>
-    <div class="body">
-        <table>
-            <tbody>
-            <tr>
-                <td class="label">Version :</td>
-                <td class="value">1.15.0.a18e6e1</td>
-            </tr>
-            <tr>
-                <td colspan="2">
-                    <hr>
-                </td>
-            </tr>
-            <tr>
-                <td class="label">Devices :</td>
-                <td class="value">2</td>
-            </tr>
-            <tr>
-                <td class="label">Links :</td>
-                <td class="value">0</td>
-            </tr>
-            <tr>
-                <td class="label">Hosts :</td>
-                <td class="value">0</td>
-            </tr>
-            <tr>
-                <td class="label">Topology SCCs :</td>
-                <td class="value">2</td>
-            </tr>
-            <tr>
-                <td colspan="2">
-                    <hr>
-                </td>
-            </tr>
-            <tr>
-                <td class="label">Intents :</td>
-                <td class="value">0</td>
-            </tr>
-            <tr>
-                <td class="label">Tunnels :</td>
-                <td class="value">0</td>
-            </tr>
-            <tr>
-                <td class="label">Flows :</td>
-                <td class="value">8</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-    <div class="footer"></div>
+     style="opacity: 1; right: 20px; width: 260px;" [@summaryPanelState]="on">
+    <!-- everything else is filled in dynamically by listProps() and the
+    response showSummary received from the server -->
 </div>
\ No newline at end of file
diff --git a/web/gui2/src/main/webapp/app/view/topology/panel/summary/summary.component.ts b/web/gui2/src/main/webapp/app/view/topology/panel/summary/summary.component.ts
index d314528..7de5e89 100644
--- a/web/gui2/src/main/webapp/app/view/topology/panel/summary/summary.component.ts
+++ b/web/gui2/src/main/webapp/app/view/topology/panel/summary/summary.component.ts
@@ -13,15 +13,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import { Component, OnInit } from '@angular/core';
+import {Component, OnDestroy, OnInit, ViewEncapsulation} from '@angular/core';
 import { animate, state, style, transition, trigger } from '@angular/animations';
+import * as d3 from 'd3';
+import { TopoPanelBaseImpl } from '../topopanel.base';
 import {
     LogService,
     LoadingService,
     FnService,
-    PanelBaseImpl
+    WebSocketService,
+    GlyphService
 } from 'gui2-fw-lib';
 
+export interface SummaryResponse {
+    title: string;
+}
 /*
  ONOS GUI -- Topology Summary Module.
  Defines modeling of ONOS Summary Panel.
@@ -31,9 +37,10 @@
     templateUrl: './summary.component.html',
     styleUrls: [
         './summary.component.css',
-        '../../topology.common.css',
+        '../../topology.common.css', '../../topology.theme.css',
         '../../../../fw/widget/panel.css', '../../../../fw/widget/panel-theme.css'
     ],
+    encapsulation: ViewEncapsulation.None,
     animations: [
         trigger('summaryPanelState', [
             state('true', style({
@@ -49,19 +56,62 @@
         ])
     ]
 })
-export class SummaryComponent extends PanelBaseImpl implements OnInit {
+export class SummaryComponent extends TopoPanelBaseImpl implements OnInit, OnDestroy {
+    private handlers: string[] = [];
+    private resp: string = 'showSummary';
+    private summaryData: SummaryResponse;
 
     constructor(
         protected fs: FnService,
         protected log: LogService,
         protected ls: LoadingService,
+        protected wss: WebSocketService,
+        protected gs: GlyphService
     ) {
-        super(fs, ls, log);
+        super(fs, ls, log, 'summary');
+        this.summaryData = <SummaryResponse>{};
         this.log.debug('SummaryComponent constructed');
     }
 
 
     ngOnInit() {
+        this.wss.bindHandlers(new Map<string, (data) => void>([
+            [this.resp, (data) => this.handleSummaryData(data)]
+        ]));
+        this.handlers.push(this.resp);
+
+        this.init(d3.select('#topo2-p-summary'));
+        this.on = true;
+
+        this.wss.sendEvent('requestSummary', {});
     }
 
+    ngOnDestroy() {
+        this.wss.sendEvent('cancelSummary', {});
+        this.wss.unbindHandlers(this.handlers);
+    }
+
+    handleSummaryData(data: SummaryResponse) {
+        this.summaryData = data;
+        this.render();
+        this.log.debug('Summary', data);
+    }
+
+    private render() {
+        let endedWithSeparator;
+
+        this.emptyRegions();
+
+        const svg = this.appendToHeader('div')
+                .classed('icon', true)
+                .append('svg');
+        const title = this.appendToHeader('h2');
+        const table = this.appendToBody('table');
+        const tbody = table.append('tbody');
+
+        title.text(this.summaryData.title);
+        this.gs.addGlyph(svg, 'bird', 24, 0, [1, 1]);
+        endedWithSeparator = this.listProps(tbody, this.summaryData);
+        // TODO : review whether we need to use/store end-with-sep state
+    }
 }
diff --git a/web/gui2/src/main/webapp/app/view/topology/panel/topopanel.base.ts b/web/gui2/src/main/webapp/app/view/topology/panel/topopanel.base.ts
new file mode 100644
index 0000000..48aa2ed
--- /dev/null
+++ b/web/gui2/src/main/webapp/app/view/topology/panel/topopanel.base.ts
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.
+ */
+import {
+    FnService,
+    LoadingService,
+    LogService,
+    PanelBaseImpl
+} from 'gui2-fw-lib';
+
+/**
+ * Base model of panel view - implemented by Topology Panel components
+ */
+export abstract class TopoPanelBaseImpl extends PanelBaseImpl {
+
+    protected header: any;
+    protected body: any;
+    protected footer: any;
+
+    protected constructor(
+        protected fs: FnService,
+        protected ls: LoadingService,
+        protected log: LogService,
+        protected id: string
+    ) {
+        super(fs, ls, log);
+    }
+
+    protected init(el: any) {
+        this.header = el.append('div').classed('header', true);
+        this.body = el.append('div').classed('body', true);
+        this.footer = el.append('div').classed('footer', true);
+    }
+
+    /**
+     * Decode lists of props sent back through Web Socket
+     *
+     * Means that panels do not have to know property names in advance
+     * Driven by PropertyPanel on Server side
+     */
+    listProps(el, data) {
+        let sepLast: boolean = false;
+
+        // note: track whether we end with a separator or not...
+        data.propOrder.forEach((p) => {
+            if (p === '-') {
+                this.addSep(el);
+                sepLast = true;
+            } else {
+                this.addProp(el, data.propLabels[p], data.propValues[p]);
+                sepLast = false;
+            }
+        });
+        return sepLast;
+    }
+
+    addProp(el, label, value) {
+        const tr = el.append('tr');
+        let lab;
+
+        if (typeof label === 'string') {
+            lab = label.replace(/_/g, ' ');
+        } else {
+            lab = label;
+        }
+
+        function addCell(cls, txt) {
+            tr.append('td').attr('class', cls).text(txt);
+        }
+
+        addCell('label', lab + ' :');
+        addCell('value', value);
+    }
+
+    addSep(el) {
+        el.append('tr').append('td').attr('colspan', 2).append('hr');
+    }
+
+    appendToHeader(x) {
+        return this.header.append(x);
+    }
+
+    appendToBody(x) {
+        return this.body.append(x);
+    }
+
+    appendToFooter(x) {
+        return this.footer.append(x);
+    }
+
+    emptyRegions() {
+        this.header.selectAll('*').remove();
+        this.body.selectAll('*').remove();
+        this.footer.selectAll('*').remove();
+    }
+
+}
diff --git a/web/gui2/src/main/webapp/app/view/topology/topology.module.ts b/web/gui2/src/main/webapp/app/view/topology/topology.module.ts
index cc03053..a26f3ec 100644
--- a/web/gui2/src/main/webapp/app/view/topology/topology.module.ts
+++ b/web/gui2/src/main/webapp/app/view/topology/topology.module.ts
@@ -19,7 +19,6 @@
 import { TopologyComponent } from './topology/topology.component';
 import { NoDeviceConnectedSvgComponent } from './layer/nodeviceconnectedsvg/nodeviceconnectedsvg.component';
 import { LayoutComponent } from './layer/layout/layout.component';
-import { ZoomLayerSvgComponent } from './layer/zoomlayersvg/zoomlayersvg.component';
 import { InstanceComponent } from './panel/instance/instance.component';
 import { SummaryComponent } from './panel/summary/summary.component';
 import { ToolbarComponent } from './panel/toolbar/toolbar.component';
@@ -45,7 +44,6 @@
         TopologyComponent,
         NoDeviceConnectedSvgComponent,
         LayoutComponent,
-        ZoomLayerSvgComponent,
         InstanceComponent,
         SummaryComponent,
         ToolbarComponent,
diff --git a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css b/web/gui2/src/main/webapp/app/view/topology/topology.theme.css
similarity index 61%
copy from web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
copy to web/gui2/src/main/webapp/app/view/topology/topology.theme.css
index fca0dc7..caa6199 100644
--- a/web/gui2/src/main/webapp/app/view/topology/layer/zoomlayersvg/zoomlayersvg.component.css
+++ b/web/gui2/src/main/webapp/app/view/topology/topology.theme.css
@@ -15,5 +15,32 @@
  */
 
 /**
- * ONOS GUI -- Topology Zoom Layer -- CSS file
- */
\ No newline at end of file
+ * ONOS GUI -- Topology Common styles -- CSS file
+ */
+
+.topo2-p h2 {
+    display: inline-block;
+    padding: 6px;
+}
+
+.topo2-p svg {
+    background: #c0242b;
+    width: 28px;
+    height: 28px;
+}
+
+.topo2-p svg .glyph {
+    fill: #ffffff;
+}
+
+.topo2-p hr {
+    background-color: #cccccc;
+}
+
+#topo2-p-detail svg {
+    background: none;
+}
+
+#topo2-p-detail .header svg .glyph {
+    fill: #c0242b;
+}
\ No newline at end of file
diff --git a/web/gui2/src/main/webapp/app/view/topology/topology/topology.component.html b/web/gui2/src/main/webapp/app/view/topology/topology/topology.component.html
index 7347cb5..0db2c82 100644
--- a/web/gui2/src/main/webapp/app/view/topology/topology/topology.component.html
+++ b/web/gui2/src/main/webapp/app/view/topology/topology/topology.component.html
@@ -21,11 +21,12 @@
 <onos-details #details></onos-details>
 
 <div id="ov-topo2">
-    <svg viewBox="0 0 1000 1000" id="topo2"
-        resize offset-height="56" offset-width="12"
-        notifier="notifyResize()">
+    <svg viewBox="0 0 1000 1000" id="topo2">
         <svg:g onos-nodeviceconnected />
-        <svg:g onos-zoomlayer />
+        <svg:g id="topo-zoomlayer">
+            <svg:g onos-backgroundsvg/>
+            <svg:g onos-forcesvg/>
+        </svg:g>
     </svg>
 </div>
 
diff --git a/web/gui2/src/main/webapp/app/view/topology/topology/topology.component.ts b/web/gui2/src/main/webapp/app/view/topology/topology/topology.component.ts
index 5ed744b..bf46637 100644
--- a/web/gui2/src/main/webapp/app/view/topology/topology/topology.component.ts
+++ b/web/gui2/src/main/webapp/app/view/topology/topology/topology.component.ts
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 import { Component, OnInit, ViewChild } from '@angular/core';
+import * as d3 from 'd3';
 import {
     FnService,
     KeysService, KeysToken,
     LogService, PrefsService,
-    SvgUtilService, WebSocketService
+    SvgUtilService, WebSocketService, Zoomer, ZoomOpts, ZoomService
 } from 'gui2-fw-lib';
 import {InstanceComponent} from '../panel/instance/instance.component';
 import {SummaryComponent} from '../panel/summary/summary.component';
@@ -60,16 +61,19 @@
 
     flashMsg: string = '';
     prefsState = {};
-    svg: any;
     hostLabelIdx: number = 1;
 
+    zoomer: Zoomer;
+    zoomEventListeners: any[];
+
     constructor(
         protected log: LogService,
         protected fs: FnService,
         protected ks: KeysService,
         protected sus: SvgUtilService,
         protected ps: PrefsService,
-        protected wss: WebSocketService
+        protected wss: WebSocketService,
+        protected zs: ZoomService
     ) {
 
         this.log.debug('Topology component constructed');
@@ -77,6 +81,15 @@
 
     ngOnInit() {
         this.bindCommands();
+        this.zoomer = this.createZoomer(<ZoomOpts>{
+            svg: d3.select('svg#topo2'),
+            zoomLayer: d3.select('g#topo-zoomlayer'),
+            zoomEnabled: () => true,
+            zoomMin: 0.25,
+            zoomMax: 10.0,
+            zoomCallback: (() => { return; })
+        });
+        this.zoomEventListeners = [];
         this.log.debug('Topology component initialized');
     }
 
@@ -88,6 +101,8 @@
             I: [(token) => {this.toggleInstancePanel(token); }, 'Toggle ONOS Instance Panel'],
             O: [() => {this.toggleSummary(); }, 'Toggle the Summary Panel'],
             R: [() => {this.resetZoom(); }, 'Reset pan / zoom'],
+            'shift-Z': [() => {this.panAndZoom([0, 0], this.zoomer.scale() * 2); }, 'Zoom x2'],
+            'alt-Z': [() => {this.panAndZoom([0, 0], this.zoomer.scale() / 2); }, 'Zoom x0.5'],
             P: [(token) => {this.togglePorts(token); }, 'Toggle Port Highlighting'],
             E: [() => {this.equalizeMasters(); }, 'Equalize mastership roles'],
             X: [() => {this.resetNodeLocation(); }, 'Reset Node Location'],
@@ -98,8 +113,8 @@
             'shift-L': [() => {this.cycleHostLabels(); }, 'Cycle host labels'],
 
             // -- instance color palette debug
-            9: function () {
-                this.sus.cat7().testCard(this.svg);
+            9: () => {
+                this.sus.cat7().testCard(d3.select('svg#topo2'));
             },
 
             esc: this.handleEscape,
@@ -249,6 +264,7 @@
     }
 
     protected resetZoom() {
+        this.zoomer.reset();
         this.log.debug('resetting zoom');
         // TODO: Reinstate with components
         // t2bgs.resetZoom();
@@ -332,4 +348,65 @@
         return this.fs.isA(entry) || [entry, ''];
     }
 
+
+
+    protected createZoomer(options: ZoomOpts) {
+        // need to wrap the original zoom callback to extend its behavior
+        const origCallback = this.fs.isF(options.zoomCallback) ? options.zoomCallback : () => {};
+
+        options.zoomCallback = () => {
+            origCallback([0, 0], 1);
+
+            this.zoomEventListeners.forEach((ev) => ev(this.zoomer));
+        };
+
+        return this.zs.createZoomer(options);
+    }
+
+    getZoomer() {
+        return this.zoomer;
+    }
+
+    findZoomEventListener(ev) {
+        for (let i = 0, len = this.zoomEventListeners.length; i < len; i++) {
+            if (this.zoomEventListeners[i] === ev) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    addZoomEventListener(callback) {
+        this.zoomEventListeners.push(callback);
+    }
+
+    removeZoomEventListener(callback) {
+        const evIndex = this.findZoomEventListener(callback);
+
+        if (evIndex !== -1) {
+            this.zoomEventListeners.splice(evIndex);
+        }
+    }
+
+    adjustmentScale(min: number, max: number): number {
+        let _scale = 1;
+        const size = (min + max) / 2;
+
+        if (size * this.scale() < max) {
+            _scale = min / (size * this.scale());
+        } else if (size * this.scale() > max) {
+            _scale = min / (size * this.scale());
+        }
+
+        return _scale;
+    }
+
+    scale(): number {
+        return this.zoomer.scale();
+    }
+
+    panAndZoom(translate: number[], scale: number, transition?: number) {
+        this.zoomer.panZoom(translate, scale, transition);
+    }
+
 }
diff --git a/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-300.woff b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-300.woff
new file mode 100644
index 0000000..38328c4
--- /dev/null
+++ b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-300.woff
Binary files differ
diff --git a/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-300.woff2 b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-300.woff2
new file mode 100644
index 0000000..4af4545
--- /dev/null
+++ b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-300.woff2
Binary files differ
diff --git a/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-600.woff b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-600.woff
new file mode 100644
index 0000000..5a604b3
--- /dev/null
+++ b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-600.woff
Binary files differ
diff --git a/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-600.woff2 b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-600.woff2
new file mode 100644
index 0000000..a0965b7
--- /dev/null
+++ b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-600.woff2
Binary files differ
diff --git a/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-700.woff b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-700.woff
new file mode 100644
index 0000000..2523e95
--- /dev/null
+++ b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-700.woff
Binary files differ
diff --git a/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-700.woff2 b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-700.woff2
new file mode 100644
index 0000000..2b04b15
--- /dev/null
+++ b/web/gui2/src/main/webapp/fonts/open-sans-v15-latin-700.woff2
Binary files differ
diff --git a/web/gui2/src/main/webapp/index.html b/web/gui2/src/main/webapp/index.html
index 780634c..f50331b 100644
--- a/web/gui2/src/main/webapp/index.html
+++ b/web/gui2/src/main/webapp/index.html
@@ -24,10 +24,6 @@
     <meta name="apple-mobile-web-app-status-bar-style" content="black">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 
-    <!-- Needs investigation - should not have any external dependencies -->
-    <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,700'
-          rel='stylesheet' type='text/css'>
-    <link href="onos.theme.css" type='text/css'>
     <link href="app/fw/layer/loading.service.css" rel='stylesheet' type='text/css'>
     <base href="/">
     <title>ONOS</title>
diff --git a/web/gui2/src/main/webapp/onos.theme.css b/web/gui2/src/main/webapp/onos.global.css
similarity index 69%
rename from web/gui2/src/main/webapp/onos.theme.css
rename to web/gui2/src/main/webapp/onos.global.css
index 8a09e16..36f107e 100644
--- a/web/gui2/src/main/webapp/onos.theme.css
+++ b/web/gui2/src/main/webapp/onos.global.css
@@ -18,12 +18,48 @@
  ONOS GUI -- core (theme) -- CSS file
  */
 
+/**
+ * Offline cache - see
+ * https://google-webfonts-helper.herokuapp.com/fonts/open-sans?subsets=latin
+ */
+/* open-sans-300 - latin */
+@font-face {
+    font-family: 'Open Sans';
+    font-style: normal;
+    font-weight: 300;
+    src: local('Open Sans Light'), local('OpenSans-Light'),
+    url('./fonts/open-sans-v15-latin-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+    url('./fonts/open-sans-v15-latin-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+}
+
+/* open-sans-600 - latin */
+@font-face {
+    font-family: 'Open Sans';
+    font-style: normal;
+    font-weight: 600;
+    src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'),
+    url('./fonts/open-sans-v15-latin-600.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+    url('./fonts/open-sans-v15-latin-600.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+}
+
+/* open-sans-700 - latin */
+@font-face {
+    font-family: 'Open Sans';
+    font-style: normal;
+    font-weight: 700;
+    src: local('Open Sans Bold'), local('OpenSans-Bold'),
+    url('./fonts/open-sans-v15-latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
+    url('./fonts/open-sans-v15-latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+}
+
+
+
 body {
     background-color: white;
 }
 
 html {
-    font-family: 'Open Sans', sans-serif;
+    font-family: 'Open Sans', normal;
     -webkit-text-size-adjust: 100%;
     -ms-text-size-adjust: 100%;
     height: 100%;
@@ -41,7 +77,7 @@
 
 #view h2 {
     color: #3c3a3a;
-    margin: 32px 0 4px 16px;
+    /*margin: 32px 0 4px 16px;*/
     padding: 0;
     font-size: 18pt;
     font-weight: lighter;