[ONOS-3804] [ONOS-3805] Initial L3 flowrules setup for Compute/Gateway nodes and PNAT Handler for OpenstackRouting

 - Performs app refactoring (openstackrouting and openstackswitching)
 - Implements L3 REST call corresponding openstackRouter and openstackRouterInterface.
 - Implements initail L3 rules population to compute/gateway node.
 - Implements PNAT rules population corresponding packet-in event.
 - Fixs comments and javadocs.
 - Rebases on master.

Change-Id: I5ad68810f50dc977737d30c43150c892b978b7cb
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java
index 8f1e741..4005f88 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.openstacknetworking;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import org.onlab.packet.Ip4Address;
 import java.util.Map;
@@ -60,7 +61,7 @@
      * @return External fixed IP informations
      */
     public Map<String, Ip4Address> externalFixedIps() {
-        return externalFixedIps;
+        return ImmutableMap.copyOf(externalFixedIps);
     }
 
     @Override
@@ -137,7 +138,7 @@
          * @return OpenstackExternalGateway object
          */
         public OpenstackExternalGateway build() {
-            return new OpenstackExternalGateway(networkId, enablePnat, externalFixedIps);
+            return new OpenstackExternalGateway(networkId, enablePnat, ImmutableMap.copyOf(externalFixedIps));
         }
     }
 
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java
index bed0289..569c885 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java
@@ -19,12 +19,14 @@
 
 import java.util.Objects;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  *  An Openstack Neutron Floating IP Model.
  */
 public final class OpenstackFloatingIP {
 
-    public enum FloatingIPStatus {
+    public enum FloatingIpStatus {
         UP,
         DOWN,
         ACTIVE,
@@ -33,13 +35,13 @@
     private final String tenantId;
     private final String networkId;
     private final Ip4Address fixedIpAddress;
-    private final String portId;
-    private final String routerId;
+    private String portId;
+    private String routerId;
     private final String id;
     private final Ip4Address floatingIpAddress;
-    private final FloatingIPStatus status;
+    private final FloatingIpStatus status;
 
-    private OpenstackFloatingIP(FloatingIPStatus status, String id, String tenantId,
+    private OpenstackFloatingIP(FloatingIpStatus status, String id, String tenantId,
                                 String networkId, Ip4Address fixedIpAddress, String portId,
                                 String routerId, Ip4Address floatingIpAddress) {
         this.status = status;
@@ -57,7 +59,7 @@
      *
      * @return floating IP status
      */
-    public FloatingIPStatus status() {
+    public FloatingIpStatus status() {
         return status;
     }
 
@@ -107,6 +109,15 @@
     }
 
     /**
+     * Updates port ID.
+     *
+     * @param portId Updated port ID
+     */
+    public void updatePortId(String portId) {
+        this.portId = portId;
+    }
+
+    /**
      * Returns router ID.
      *
      * @return router ID
@@ -116,6 +127,15 @@
     }
 
     /**
+     * Updates router ID.
+     *
+     * @param routerId Updated router ID
+     */
+    public void updateRouterId(String routerId) {
+        this.routerId = routerId;
+    }
+
+    /**
      * Returns floating IP address.
      *
      * @return Floating IP address
@@ -162,7 +182,7 @@
         private String routerId;
         private String id;
         private Ip4Address floatingIpAddress;
-        private FloatingIPStatus status;
+        private FloatingIpStatus status;
 
         /**
          * Sets tenant ID.
@@ -181,7 +201,7 @@
          * @param status Floating IP status
          * @return Builder object
          */
-        public Builder status(FloatingIPStatus status) {
+        public Builder status(FloatingIpStatus status) {
             this.status = status;
             return this;
         }
@@ -258,8 +278,9 @@
          * @return OpenstackFloatingIP object
          */
         public OpenstackFloatingIP build() {
-            return new OpenstackFloatingIP(status, id, tenantId, networkId,
-                    fixedIpAddress, portId, routerId, floatingIpAddress);
+            return new OpenstackFloatingIP(checkNotNull(status), checkNotNull(id), checkNotNull(tenantId),
+                    checkNotNull(networkId), fixedIpAddress, portId,
+                    routerId, checkNotNull(floatingIpAddress));
 
         }
     }
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java
index 8e513f1..5230c18 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java
@@ -16,6 +16,7 @@
 package org.onosproject.openstacknetworking;
 
 import java.util.Objects;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * An Openstack Neutron Router Model.
@@ -31,9 +32,9 @@
     private final String tenantId;
     private final String id;
     private final String name;
-    private final RouterStatus status;
-    private final boolean adminStateUp;
-    private final OpenstackExternalGateway gatewayExternalInfo;
+    private RouterStatus status;
+    private boolean adminStateUp;
+    private OpenstackExternalGateway gatewayExternalInfo;
 
     private OpenstackRouter(String id, String tenantId, String name, RouterStatus status,
                            boolean adminStateUp, OpenstackExternalGateway gatewayExternalInfo) {
@@ -209,8 +210,8 @@
          * @return OpenstasckRouter object
          */
         public OpenstackRouter build() {
-            return new OpenstackRouter(id, tenantId, name, status,
-                    adminStateUp, gatewayExternalInfo);
+            return new OpenstackRouter(checkNotNull(id), checkNotNull(tenantId), name, checkNotNull(status),
+                    checkNotNull(adminStateUp), gatewayExternalInfo);
         }
     }
 
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java
index 972e6c5..78ab815 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java
@@ -99,12 +99,12 @@
      * An Openstack Router Interface Builder class.
      */
     public static final class Builder {
-         private String id;
-         private String tenantId;
-         private String subnetId;
-         private String portId;
+        private String id;
+        private String tenantId;
+        private String subnetId;
+        private String portId;
 
-         /**
+        /**
          * Sets Router Interface ID.
          *
          * @param id router interface ID
@@ -148,14 +148,14 @@
             return this;
         }
 
-
         /**
          * Builds an Openstack Router Interface object.
          *
          * @return OpenstackRouterInterface object
          */
         public OpenstackRouterInterface build() {
-            return new OpenstackRouterInterface(id, tenantId, subnetId, portId);
+            return new OpenstackRouterInterface(checkNotNull(id), checkNotNull(tenantId),
+                    checkNotNull(subnetId), checkNotNull(portId));
         }
 
     }
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
index 40eed7f..65b8a5f 100644
--- a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
@@ -17,24 +17,29 @@
 
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
+import org.onlab.packet.Ip4Address;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.TCP;
 import org.onlab.packet.UDP;
 import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
+import org.onosproject.net.Port;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.InboundPacket;
 import org.onosproject.net.packet.PacketContext;
 import org.onosproject.net.packet.PacketService;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
 import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackRouter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.nio.ByteBuffer;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
 
 
 /**
@@ -50,13 +55,20 @@
     private final OpenstackRoutingRulePopulator rulePopulator;
     private final int portNum;
     private final OpenstackPort openstackPort;
+    private final Port port;
+
+    private static final String DEVICE_OWNER_ROUTER_INTERFACE = "network:router_interface";
+    // TODO: This will be replaced to get the information from openstacknetworkingservice.
+    private static final MacAddress GATEWAYMAC = MacAddress.valueOf("1f:1f:1f:1f:1f:1f");
+    private static final MacAddress EXTERNAL_INTERFACE_MAC = MacAddress.valueOf("00:00:00:00:00:11");
 
     OpenstackPnatHandler(OpenstackRoutingRulePopulator rulePopulator, PacketContext context,
-                         int portNum, OpenstackPort openstackPort) {
+                         int portNum, OpenstackPort openstackPort, Port port) {
         this.rulePopulator = checkNotNull(rulePopulator);
         this.context = checkNotNull(context);
         this.portNum = checkNotNull(portNum);
         this.openstackPort = checkNotNull(openstackPort);
+        this.port = checkNotNull(port);
     }
 
     @Override
@@ -70,14 +82,41 @@
             return;
         }
 
-        packetOut(inboundPacket, portNum);
+        OpenstackRouter router = getOpenstackRouter(openstackPort);
 
         rulePopulator.populatePnatFlowRules(inboundPacket, openstackPort, portNum,
-                getExternalInterfaceMacAddress(), getExternalRouterMacAddress());
+                getExternalIp(router), getExternalInterfaceMacAddress(), getExternalRouterMacAddress());
+
+        packetOut((Ethernet) ethernet.clone(), inboundPacket.receivedFrom().deviceId(), portNum, router);
     }
 
-    private void packetOut(InboundPacket inboundPacket, int portNum) {
-        Ethernet ethernet = checkNotNull(inboundPacket.parsed());
+    private OpenstackRouter getOpenstackRouter(OpenstackPort openstackPort) {
+        OpenstackNetworkingService networkingService = getService(OpenstackNetworkingService.class);
+        OpenstackNetwork network = networkingService.network(openstackPort.networkId());
+
+        OpenstackPort port = networkingService.ports()
+                .stream()
+                .filter(p -> p.deviceOwner().equals(DEVICE_OWNER_ROUTER_INTERFACE))
+                .filter(p -> checkSameSubnet(p, openstackPort))
+                .findAny()
+                .orElse(null);
+
+        return checkNotNull(networkingService.router(port.deviceId()));
+    }
+
+    private boolean checkSameSubnet(OpenstackPort p, OpenstackPort openstackPort) {
+        String key1 = checkNotNull(p.fixedIps().keySet().stream().findFirst().orElse(null)).toString();
+        String key2 = checkNotNull(openstackPort.fixedIps().keySet().stream().findFirst().orElse(null)).toString();
+        return key1.equals(key2) ? true : false;
+    }
+
+    private Ip4Address getExternalIp(OpenstackRouter router) {
+        return router.gatewayExternalInfo().externalFixedIps().values().stream().findAny().orElse(null);
+    }
+
+    private void packetOut(Ethernet ethernet, DeviceId deviceId, int portNum, OpenstackRouter router) {
+        PacketService packetService = getService(PacketService.class);
+
         IPv4 iPacket = (IPv4) ethernet.getPayload();
 
         TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
@@ -98,31 +137,27 @@
                 iPacket.setPayload(udpPacket);
                 break;
             default:
-                break;
+                log.error("Temporally, this method can process UDP and TCP protocol.");
+                return;
         }
 
+        iPacket.setSourceAddress(getExternalIp(router).toString());
         iPacket.resetChecksum();
-        iPacket.setPayload(ethernet);
+        iPacket.setParent(ethernet);
         ethernet.setSourceMACAddress(getExternalInterfaceMacAddress())
                 .setDestinationMACAddress(getExternalRouterMacAddress());
         ethernet.resetChecksum();
 
-        treatment.setOutput(getExternalPort(inboundPacket.receivedFrom().deviceId()));
+        treatment.setOutput(port.number());
 
-        packetService.emit(new DefaultOutboundPacket(inboundPacket.receivedFrom().deviceId(),
-                treatment.build(), ByteBuffer.wrap(ethernet.serialize())));
+        packetService.emit(new DefaultOutboundPacket(deviceId, treatment.build(),
+                ByteBuffer.wrap(ethernet.serialize())));
     }
 
-    private PortNumber getExternalPort(DeviceId deviceId) {
-        // TODO
-        return null;
-    }
     private MacAddress getExternalInterfaceMacAddress() {
-        // TODO
-        return null;
+        return EXTERNAL_INTERFACE_MAC;
     }
     private MacAddress getExternalRouterMacAddress() {
-        // TODO
-        return null;
+        return GATEWAYMAC;
     }
 }
\ No newline at end of file
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
index 2ea5935..ab8c386 100644
--- a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
@@ -29,6 +29,8 @@
 import org.onlab.packet.MacAddress;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
@@ -55,14 +57,14 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.util.Tools.groupedThreads;
 
-@Service
 @Component(immediate = true)
+@Service
 /**
  * Populates flow rules about L3 functionality for VMs in Openstack.
  */
 public class OpenstackRoutingManager implements OpenstackRoutingService {
-    private final Logger log = LoggerFactory
-            .getLogger(getClass());
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CoreService coreService;
@@ -86,6 +88,12 @@
     private Map<String, OpenstackRouterInterface> routerInterfaceMap = Maps.newHashMap();
     private Map<Integer, String> portNumMap = initPortNumMap();
     private static final String APP_ID = "org.onosproject.openstackrouting";
+    private static final String PORT_NAME = "portName";
+    private static final String DEVICE_OWNER_ROUTER_INTERFACE = "network:router_interface";
+
+    // TODO: This will be replaced to get the information from openstackswitchingservice.
+    private static final String EXTERNAL_INTERFACE_NAME = "veth0";
+
     private Map<Integer, String> initPortNumMap() {
         Map<Integer, String> map = Maps.newHashMap();
         for (int i = 1024; i < 65535; i++) {
@@ -104,7 +112,7 @@
     protected void activate() {
         appId = coreService.registerApplication(APP_ID);
         packetService.addProcessor(internalPacketProcessor, PacketProcessor.director(1));
-
+        reloadInitL3Rules();
         log.info("onos-openstackrouting started");
     }
 
@@ -150,7 +158,7 @@
         routerInterfaceMap.putIfAbsent(routerInterface.portId(), routerInterface);
         List<OpenstackRouterInterface> routerInterfaces = Lists.newArrayList();
         routerInterfaces.add(routerInterface);
-        checkExternalConnection(getOpenstackRouter(routerInterface.tenantId()), routerInterfaces);
+        checkExternalConnection(getOpenstackRouter(routerInterface.portId()), routerInterfaces);
     }
 
     @Override
@@ -160,6 +168,27 @@
         rulePopulator.removeExternalRules(routerInterface);
         routerInterfaceMap.remove(routerInterface.portId());
     }
+
+    private void reloadInitL3Rules() {
+        openstackService.ports()
+                .stream()
+                .filter(p -> p.deviceOwner().equals(DEVICE_OWNER_ROUTER_INTERFACE))
+                .forEach(p -> {
+                    OpenstackRouterInterface routerInterface = portToRouterInterface(p);
+                    updateRouterInterface(routerInterface);
+                });
+    }
+
+    private OpenstackRouterInterface portToRouterInterface(OpenstackPort p) {
+        OpenstackRouterInterface.Builder osBuilder = new OpenstackRouterInterface.Builder()
+                .id(checkNotNull(p.id()))
+                .tenantId(checkNotNull(openstackService.network(p.networkId()).tenantId()))
+                .subnetId(checkNotNull(p.fixedIps().keySet().stream().findFirst().orElse(null)).toString())
+                .portId(checkNotNull(p.deviceId()));
+
+        return osBuilder.build();
+    }
+
     private class InternalPacketProcessor implements PacketProcessor {
 
         @Override
@@ -183,10 +212,15 @@
                         break;
                     default:
                         int portNum = getPortNum(ethernet.getSourceMAC(), iPacket.getDestinationAddress());
+                        Port port = getExternalPort(pkt.receivedFrom().deviceId(), EXTERNAL_INTERFACE_NAME);
+                        if (port == null) {
+                            log.warn("There`s no external interface");
+                            break;
+                        }
                         OpenstackPort openstackPort = getOpenstackPort(ethernet.getSourceMAC(),
                                 Ip4Address.valueOf(iPacket.getSourceAddress()));
                         l3EventExecutorService.execute(new OpenstackPnatHandler(rulePopulator, context,
-                                portNum, openstackPort));
+                                portNum, openstackPort, port));
                         break;
                 }
 
@@ -201,24 +235,30 @@
         }
     }
 
+    private Port getExternalPort(DeviceId deviceId, String interfaceName) {
+        return deviceService.getPorts(deviceId)
+                .stream()
+                .filter(p -> p.annotations().value(PORT_NAME).equals(interfaceName))
+                .findAny()
+                .orElse(null);
+    }
+
     private void checkExternalConnection(OpenstackRouter router,
                                          Collection<OpenstackRouterInterface> routerInterfaces) {
         checkNotNull(router, "Router can not be null");
-        checkNotNull(routerInterfaces, "RouterInterfaces can not be null");
+        checkNotNull(routerInterfaces, "routerInterfaces can not be null");
         Ip4Address externalIp = router.gatewayExternalInfo().externalFixedIps()
                 .values().stream().findFirst().orElse(null);
         if ((externalIp == null) || (!router.gatewayExternalInfo().isEnablePnat())) {
-            log.debug("Failed to set pnat configuration");
+            log.debug("Not satisfied to set pnat configuration");
             return;
         }
-        routerInterfaces.forEach(routerInterface -> {
-            initiateL3Rule(router, routerInterface);
-        });
+        routerInterfaces.forEach(routerInterface -> initiateL3Rule(router, routerInterface));
     }
 
     private void initiateL3Rule(OpenstackRouter router, OpenstackRouterInterface routerInterface) {
         long vni = Long.parseLong(openstackService.network(openstackService
-                .port(routerInterface.portId()).networkId()).segmentId());
+                .port(routerInterface.id()).networkId()).segmentId());
         OpenstackRoutingRulePopulator rulePopulator = new OpenstackRoutingRulePopulator(appId,
                 openstackService, flowObjectiveService, deviceService, driverService);
         rulePopulator.populateExternalRules(vni, router, routerInterface);
@@ -229,15 +269,15 @@
                 .collect(Collectors.toList());
     }
 
-    private OpenstackRouter getOpenstackRouter(String tenantId) {
+    private OpenstackRouter getOpenstackRouter(String id) {
         return openstackService.routers().stream().filter(r ->
-                r.tenantId().equals(tenantId)).findFirst().orElse(null);
+                r.id().equals(id)).findAny().orElse(null);
     }
 
     private OpenstackPort getOpenstackPort(MacAddress sourceMac, Ip4Address ip4Address) {
-        OpenstackPort openstackPort = openstackService.ports("").stream()
+        OpenstackPort openstackPort = openstackService.ports().stream()
                 .filter(p -> p.macAddress().equals(sourceMac)).findFirst().orElse(null);
-        return openstackPort.fixedIps().values().stream().findFirst().orElse(null)
+        return checkNotNull(openstackPort.fixedIps().values().stream().findFirst().orElse(null))
                 .equals(ip4Address) ? openstackPort : null;
     }
 
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java
index dc10216..cc0fecd 100644
--- a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java
@@ -51,6 +51,7 @@
 import org.onosproject.openstacknetworking.OpenstackPort;
 import org.onosproject.openstacknetworking.OpenstackRouter;
 import org.onosproject.openstacknetworking.OpenstackRouterInterface;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,19 +64,22 @@
  */
 public class OpenstackRoutingRulePopulator {
 
-    private static Logger log = LoggerFactory
-            .getLogger(OpenstackRoutingRulePopulator.class);
-    private ApplicationId appId;
-    private FlowObjectiveService flowObjectiveService;
-    private OpenstackNetworkingService openstackService;
-    private DeviceService deviceService;
-    private DriverService driverService;
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
-    public static final String PORTNAME_PREFIX_VM = "tap";
-    public static final String PORTNAME_PREFIX_ROUTER = "qr";
-    public static final String PORTNAME_PREFIX_TUNNEL = "vxlan";
-    public static final String PORTNAME = "portName";
+    private final ApplicationId appId;
+    private final FlowObjectiveService flowObjectiveService;
+    private final OpenstackNetworkingService openstackService;
+    private final DeviceService deviceService;
+    private final DriverService driverService;
 
+    private static final String PORTNAME_PREFIX_VM = "tap";
+    private static final String PORTNAME_PREFIX_ROUTER = "qr";
+    private static final String PORTNAME_PREFIX_TUNNEL = "vxlan";
+    private static final String PORTNAME = "portName";
+
+    private static final String PORTNOTNULL = "Port can not be null";
+    private static final String TUNNEL_DESTINATION = "tunnelDst";
+    private static final String DEVICE_ANNOTATION_CHANNELID = "channelId";
     private static final int ROUTING_RULE_PRIORITY = 25000;
     private static final int PNAT_RULE_PRIORITY = 24000;
     private static final int PNAT_TIMEOUT = 120;
@@ -90,8 +94,17 @@
     private OpenstackRouterInterface routerInterface;
 
     // TODO: This will be replaced to get the information from openstackswitchingservice.
-    private static final String EXTERNAL_INTERFACE_NAME = "eth3";
+    private static final String EXTERNAL_INTERFACE_NAME = "veth0";
 
+    /**
+     * The constructor of openstackRoutingRulePopulator.
+     *
+     * @param appId Caller`s appId
+     * @param openstackService OpenstackNetworkingService
+     * @param flowObjectiveService FlowObjectiveService
+     * @param deviceService DeviceService
+     * @param driverService DriverService
+     */
     public OpenstackRoutingRulePopulator(ApplicationId appId, OpenstackNetworkingService openstackService,
                                          FlowObjectiveService flowObjectiveService,
                                          DeviceService deviceService, DriverService driverService) {
@@ -102,8 +115,18 @@
         this.driverService = driverService;
     }
 
+    /**
+     * Populates flow rules for Pnat configurations.
+     *  @param inboundPacket Packet-in event packet
+     * @param openstackPort Target VM information
+     * @param portNum Pnat port number
+     * @param externalIp
+     * @param externalInterfaceMacAddress Gateway external interface macaddress
+     * @param externalRouterMacAddress Outer(physical) router`s macaddress
+     */
     public void populatePnatFlowRules(InboundPacket inboundPacket, OpenstackPort openstackPort, int portNum,
-                                      MacAddress externalInterfaceMacAddress, MacAddress externalRouterMacAddress) {
+                                      Ip4Address externalIp, MacAddress externalInterfaceMacAddress,
+                                      MacAddress externalRouterMacAddress) {
         this.inboundPacket = inboundPacket;
         this.openstackPort = openstackPort;
         this.portNum = portNum;
@@ -112,11 +135,11 @@
 
         long vni = getVni(openstackPort);
 
-        populatePnatIncomingFlowRules(vni);
-        populatePnatOutgoingFlowRules(vni);
+        populatePnatIncomingFlowRules(vni, externalIp);
+        populatePnatOutgoingFlowRules(vni, externalIp);
     }
 
-    private void populatePnatOutgoingFlowRules(long vni) {
+    private void populatePnatOutgoingFlowRules(long vni, Ip4Address externalIp) {
         IPv4 iPacket = (IPv4) inboundPacket.parsed().getPayload();
 
         TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
@@ -128,27 +151,27 @@
 
         TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
         tBuilder.setEthSrc(externalInterface)
-                .setEthDst(externalRouter);
+                .setEthDst(externalRouter)
+                .setIpSrc(externalIp);
 
         switch (iPacket.getProtocol()) {
             case IPv4.PROTOCOL_TCP:
                 TCP tcpPacket = (TCP) iPacket.getPayload();
                 sBuilder.matchTcpSrc(TpPort.tpPort(tcpPacket.getSourcePort()))
                         .matchTcpDst(TpPort.tpPort(tcpPacket.getDestinationPort()));
-                tBuilder.setTcpDst(TpPort.tpPort(portNum));
+                tBuilder.setTcpSrc(TpPort.tpPort(portNum));
                 break;
             case IPv4.PROTOCOL_UDP:
                 UDP udpPacket = (UDP) iPacket.getPayload();
-                sBuilder.matchUdpDst(TpPort.tpPort(udpPacket.getSourcePort()))
+                sBuilder.matchUdpSrc(TpPort.tpPort(udpPacket.getSourcePort()))
                         .matchUdpDst(TpPort.tpPort(udpPacket.getDestinationPort()));
-                tBuilder.setUdpDst(TpPort.tpPort(portNum));
+                tBuilder.setUdpSrc(TpPort.tpPort(portNum));
                 break;
             default:
                 break;
         }
 
-        Port port = getPortNumOfExternalInterface();
-        checkNotNull(port, "Port can not be null");
+        Port port = checkNotNull(getPortNumOfExternalInterface(), PORTNOTNULL);
         tBuilder.setOutput(port.number());
 
         ForwardingObjective fo = DefaultForwardingObjective.builder()
@@ -165,18 +188,19 @@
 
     private Port getPortNumOfExternalInterface() {
         return deviceService.getPorts(inboundPacket.receivedFrom().deviceId()).stream()
-                .filter(p -> p.annotations().value("portName").equals(EXTERNAL_INTERFACE_NAME))
+                .filter(p -> p.annotations().value(PORTNAME).equals(EXTERNAL_INTERFACE_NAME))
                 .findAny().orElse(null);
     }
 
 
-    private void populatePnatIncomingFlowRules(long vni) {
+    private void populatePnatIncomingFlowRules(long vni, Ip4Address externalIp) {
         IPv4 iPacket = (IPv4) inboundPacket.parsed().getPayload();
         DeviceId deviceId = inboundPacket.receivedFrom().deviceId();
 
         TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
         sBuilder.matchEthType(Ethernet.TYPE_IPV4)
                 .matchIPProtocol(iPacket.getProtocol())
+                .matchIPDst(IpPrefix.valueOf(externalIp, 32))
                 .matchIPSrc(IpPrefix.valueOf(iPacket.getDestinationAddress(), 32));
 
         TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
@@ -225,7 +249,7 @@
                         ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST.type());
 
         try {
-            extensionInstruction.setPropertyValue("tunnelDst", hostIp);
+            extensionInstruction.setPropertyValue(TUNNEL_DESTINATION, hostIp);
         } catch (ExtensionPropertyException e) {
             log.error("Error setting Nicira extension setting {}", e);
         }
@@ -235,7 +259,7 @@
 
     private PortNumber getTunnelPort(DeviceId deviceId) {
         Port port = deviceService.getPorts(deviceId).stream()
-                .filter(p -> p.annotations().value("portName").equals(PORTNAME_PREFIX_TUNNEL))
+                .filter(p -> p.annotations().value(PORTNAME).equals(PORTNAME_PREFIX_TUNNEL))
                 .findAny().orElse(null);
 
         if (port == null) {
@@ -246,6 +270,13 @@
 
     }
 
+    /**
+     * Populates flow rules from openstackComputeNode to GatewayNode.
+     *
+     * @param vni Target network
+     * @param router corresponding router
+     * @param routerInterface corresponding routerInterface
+     */
     public void populateExternalRules(long vni, OpenstackRouter router,
                                       OpenstackRouterInterface routerInterface) {
         this.router = router;
@@ -284,11 +315,6 @@
         StreamSupport.stream(deviceService.getAvailableDevices().spliterator(), false)
                 .filter(d -> !checkGatewayNode(d.id()))
                 .forEach(d -> populateRuleToGateway(d, gatewayDevice, vni));
-        /*deviceService.getAvailableDevices().forEach(d -> {
-            if (!checkGatewayNode(d.id())) {
-                populateRuleToGateway(d, gatewayDevice, vni);
-            }
-        });*/
     }
 
     private void populateRuleToGateway(Device d, Device gatewayDevice, long vni) {
@@ -313,34 +339,40 @@
     }
 
     private Ip4Address getIPAddressforDevice(Device device) {
-        return Ip4Address.valueOf(device.annotations().value("channelId").split(":")[0]);
+        return Ip4Address.valueOf(device.annotations().value(DEVICE_ANNOTATION_CHANNELID).split(":")[0]);
     }
 
     private Device getGatewayNode() {
-        final Device[] device = new Device[1];
-        deviceService.getAvailableDevices().forEach(d -> {
-            if (checkGatewayNode(d.id())) {
-                device[0] = d;
-            }
-        });
-        return device[0];
+        return checkNotNull(StreamSupport.stream(deviceService.getAvailableDevices().spliterator(), false)
+                .filter(d -> checkGatewayNode(d.id()))
+                .findAny()
+                .orElse(null));
     }
 
     private boolean checkGatewayNode(DeviceId deviceId) {
         return !deviceService.getPorts(deviceId).stream().anyMatch(port ->
-                port.annotations().value("portName").startsWith(PORTNAME_PREFIX_ROUTER) ||
-                        port.annotations().value("portName").startsWith(PORTNAME_PREFIX_VM));
+                port.annotations().value(PORTNAME).startsWith(PORTNAME_PREFIX_ROUTER) ||
+                        port.annotations().value(PORTNAME).startsWith(PORTNAME_PREFIX_VM));
     }
 
     private long getVni(OpenstackPort openstackPort) {
         return Long.parseLong(openstackService.network(openstackPort.networkId()).segmentId());
     }
 
+    private long getVni(OpenstackSubnet openstackSubnet) {
+        return Long.parseLong(openstackService.network(openstackSubnet.networkId()).segmentId());
+    }
+
+    /**
+     * Remove flow rules for external connection.
+     *
+     * @param routerInterface Corresponding routerInterface
+     */
     public void removeExternalRules(OpenstackRouterInterface routerInterface) {
-        OpenstackPort openstackPort = openstackService.port(routerInterface.portId());
+        OpenstackSubnet openstackSubnet = openstackService.subnet(routerInterface.subnetId());
         TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
         sBuilder.matchEthType(Ethernet.TYPE_IPV4)
-                .matchTunnelId(getVni(openstackPort))
+                .matchTunnelId(getVni(openstackSubnet))
                 .matchEthDst(GATEWAYMAC);
 
         StreamSupport.stream(deviceService.getAvailableDevices().spliterator(), false)
diff --git a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackExternalGateway.java b/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackExternalGateway.java
deleted file mode 100644
index ac70701..0000000
--- a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackExternalGateway.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstackrouting;
-
-import com.google.common.collect.ImmutableMap;
-import org.onlab.packet.Ip4Address;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A configurable external gateway modes extension model in openstack router.
- */
-public final class OpenstackExternalGateway {
-
-    private String networkId;
-    private boolean enablePnat;
-    private Map<String, Ip4Address> externalFixedIps;
-
-    private OpenstackExternalGateway(String networkId, boolean enablePnat,
-                                     Map<String, Ip4Address> externalFixedIps) {
-        this.networkId = networkId;
-        this.enablePnat = enablePnat;
-        this.externalFixedIps = externalFixedIps;
-    }
-
-    public static OpenstackExternalGateway.Builder builder() {
-        return new Builder();
-    }
-    /**
-     * Returns network ID.
-     *
-     * @return Network ID
-     */
-    public String networkId() {
-        return networkId;
-    }
-
-    /**
-     * Returns the PNAT status for external gateway.
-     *
-     * @return PNAT status
-     */
-    public boolean isEnablePnat() {
-        return enablePnat;
-    }
-
-    public Map<String, Ip4Address> externalFixedIps() {
-        return ImmutableMap.copyOf(externalFixedIps);
-    }
-
-    /**
-     * An Openstack External Gateway Builder class.
-     */
-    public static final class Builder {
-        private String networkId;
-        private boolean enablePnat;
-        private Map<String, Ip4Address> externalFixedIps;
-
-        Builder() {
-            externalFixedIps = new HashMap<>();
-        }
-
-        /**
-         * Sets network ID.
-         *
-         * @param networkId Network ID
-         * @return Builder object
-         */
-        public Builder networkId(String networkId) {
-            this.networkId = networkId;
-            return this;
-        }
-
-        /**
-         * Sets whether PNAT status is enabled or not.
-         *
-         * @param enablePnat true if PNAT status is enabled, false otherwise
-         * @return Builder object
-         */
-        public Builder enablePnat(boolean enablePnat) {
-            this.enablePnat = enablePnat;
-            return this;
-        }
-
-        /**
-         * Sets external fixed IP address information.
-         *
-         * @param externalFixedIps External fixed IP information
-         * @return Builder object
-         */
-
-        public Builder externalFixedIps(Map<String, Ip4Address> externalFixedIps) {
-            this.externalFixedIps.putAll(externalFixedIps);
-            return this;
-        }
-
-        /**
-         * Builds an OpenstackExternalGateway object.
-         *
-         * @return OpenstackExternalGateway object
-         */
-        public OpenstackExternalGateway build() {
-            return new OpenstackExternalGateway(networkId, enablePnat, externalFixedIps);
-        }
-    }
-
-}
diff --git a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackFloatingIP.java b/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackFloatingIP.java
deleted file mode 100644
index feb05f9..0000000
--- a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackFloatingIP.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstackrouting;
-
-import org.onlab.packet.Ip4Address;
-
-/**
- *  An Openstack Neutron Floating IP Model.
- */
-public final class OpenstackFloatingIP {
-
-    public enum FloatingIPStatus {
-        UP,
-        DOWN,
-        ACTIVE,
-    }
-
-    private String tenantId;
-    private String networkId;
-    private Ip4Address fixedIpAddress;
-    private String portId;
-    private String routerId;
-    private String id;
-    private Ip4Address floatingIpAddress;
-    private FloatingIPStatus status;
-
-    private OpenstackFloatingIP(FloatingIPStatus status, String id, String tenantId,
-                                String networkId, Ip4Address fixedIpAddress, String portId,
-                                String routerId, Ip4Address floatingIpAddress) {
-        this.status = status;
-        this.id = id;
-        this.tenantId = tenantId;
-        this.networkId = networkId;
-        this.fixedIpAddress = fixedIpAddress;
-        this.portId = portId;
-        this.routerId = routerId;
-        this.floatingIpAddress = floatingIpAddress;
-    }
-
-    /**
-     * Returns floating ip status.
-     *
-     * @return floating ip status
-     */
-    public FloatingIPStatus status() {
-        return status;
-    }
-
-    /**
-     * Returns floating ip`s ID.
-     *
-     * @return floating ip`s ID
-     */
-    public String id() {
-        return id;
-    }
-
-    /**
-     * Returns tenant ID.
-     *
-     * @return tenant ID
-     */
-    public String tenantId() {
-        return tenantId;
-    }
-
-    /**
-     * Returns network ID.
-     *
-     * @return network ID
-     */
-    public String networkId() {
-        return networkId;
-    }
-
-    /**
-     * Returns fixed IP Address.
-     *
-     * @return fixed IP Address
-     */
-    public Ip4Address fixedIpAddress() {
-        return fixedIpAddress;
-    }
-
-    /**
-     * Returns port ID.
-     *
-     * @return port ID
-     */
-    public String portId() {
-        return portId;
-    }
-
-    /**
-     * Returns router ID.
-     *
-     * @return router ID
-     */
-    public String routerId() {
-        return routerId;
-    }
-
-    /**
-     * Returns floating IP address.
-     *
-     * @return Floating IP address
-     */
-    public Ip4Address floatingIpAddress() {
-        return floatingIpAddress;
-    }
-
-    /**
-     * An Openstack Floating IP Builder class.
-     */
-    public static final class Builder {
-        private String tenantId;
-        private String networkId;
-        private Ip4Address fixedIpAddress;
-        private String portId;
-        private String routerId;
-        private String id;
-        private Ip4Address floatingIpAddress;
-        private FloatingIPStatus status;
-
-        /**
-         * Sets tenant ID.
-         *
-         * @param tenantId tenant ID
-         * @return Builder object
-         */
-        public Builder tenantId(String tenantId) {
-            this.tenantId = tenantId;
-            return this;
-        }
-
-        /**
-         * Sets floating IP status.
-         *
-         * @param status Floating IP status
-         * @return Builder object
-         */
-        public Builder status(FloatingIPStatus status) {
-            this.status = status;
-            return this;
-        }
-
-        /**
-         * Sets Floating IP`s ID.
-         *
-         * @param id Floating IP`s ID
-         * @return Builder object
-         */
-        public Builder id(String id) {
-            this.id = id;
-            return this;
-        }
-
-        /**
-         * Sets network ID.
-         *
-         * @param networkId Network ID
-         * @return Builder object
-         */
-        public Builder networkId(String networkId) {
-            this.networkId = networkId;
-            return this;
-        }
-
-        /**
-         * Sets fixed IP address.
-         *
-         * @param fixedIpAddress Fixed IP address
-         * @return Builder object
-         */
-        public Builder fixedIpAddress(Ip4Address fixedIpAddress) {
-            this.fixedIpAddress = fixedIpAddress;
-            return this;
-        }
-
-        /**
-         * Sets port ID.
-         *
-         * @param portId port ID
-         * @return Builder object
-         */
-        public Builder portId(String portId) {
-            this.portId = portId;
-            return this;
-        }
-
-        /**
-         * Sets router ID.
-         *
-         * @param routerId router ID
-         * @return Builder object
-         */
-        public Builder routerId(String routerId) {
-            this.routerId = routerId;
-            return this;
-        }
-
-        /**
-         * Sets floating IP address.
-         *
-         * @param floatingIpAddress Floating IP address
-         * @return Builder object
-         */
-        public Builder floatingIpAddress(Ip4Address floatingIpAddress) {
-            this.floatingIpAddress = floatingIpAddress;
-            return this;
-        }
-
-        /**
-         * Builds an OpenstackFloatingIP object.
-         *
-         * @return OpenstackFloatingIP object
-         */
-        public OpenstackFloatingIP build() {
-            return new OpenstackFloatingIP(status, id, tenantId, networkId,
-                    fixedIpAddress, portId, routerId, floatingIpAddress);
-
-        }
-    }
-}
diff --git a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackFloatingIPHandler.java b/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackFloatingIPHandler.java
deleted file mode 100644
index 4255f50..0000000
--- a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackFloatingIPHandler.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstackrouting;
-
-import org.onosproject.event.AbstractEvent;
-
-/**
- * Handle FloatingIP Event for Managing Flow Rules In Openstack Nodes.
- */
-public class OpenstackFloatingIPHandler implements Runnable {
-
-    volatile AbstractEvent event;
-    OpenstackFloatingIPHandler(AbstractEvent event) {
-        this.event = event;
-    }
-
-    @Override
-    public void run() {
-
-    }
-}
diff --git a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackIcmpHandler.java b/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackIcmpHandler.java
deleted file mode 100644
index 67c6724..0000000
--- a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackIcmpHandler.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstackrouting;
-
-import org.onosproject.net.packet.PacketContext;
-
-/**
- * Handle ICMP packet processing for Managing Flow Rules In Openstack Nodes.
- */
-public class OpenstackIcmpHandler implements Runnable {
-
-    volatile PacketContext context;
-    OpenstackIcmpHandler(PacketContext context) {
-        this.context = context;
-    }
-
-    @Override
-    public void run() {
-
-    }
-}
\ No newline at end of file
diff --git a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackPnatHandler.java b/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackPnatHandler.java
deleted file mode 100644
index e1c9df8..0000000
--- a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackPnatHandler.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstackrouting;
-
-import org.onosproject.net.packet.PacketContext;
-
-/**
- * Handle NAT packet processing for Managing Flow Rules In Openstack Nodes.
- */
-public class OpenstackPnatHandler implements Runnable {
-
-    volatile PacketContext context;
-    OpenstackPnatHandler(PacketContext context) {
-        this.context = context;
-    }
-
-    @Override
-    public void run() {
-
-    }
-}
\ No newline at end of file
diff --git a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRouter.java b/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRouter.java
deleted file mode 100644
index fc858fc..0000000
--- a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRouter.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstackrouting;
-
-/**
- * An Openstack Neutron Router Model.
- */
-public final class OpenstackRouter {
-
-    public enum RouterStatus {
-        UP,
-        DOWN,
-        ACTIVE,
-    }
-
-    private String tenantId;
-    private String id;
-    private String name;
-    private RouterStatus status;
-    private boolean adminStateUp;
-    private OpenstackExternalGateway gatewayExternalInfo;
-
-    private OpenstackRouter(String id, String tenantId, String name, RouterStatus status,
-                           boolean adminStateUp, OpenstackExternalGateway gatewayExternalInfo) {
-        this.id = id;
-        this.tenantId = tenantId;
-        this.name = name;
-        this.status = status;
-        this.adminStateUp = adminStateUp;
-        this.gatewayExternalInfo = gatewayExternalInfo;
-
-    }
-
-    public static OpenstackRouter.Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * Returns tenant ID.
-     *
-     * @return tenant ID
-     */
-    public String tenantId() {
-        return tenantId;
-    }
-
-    /**
-     * Returns router ID.
-     *
-     * @return router ID
-     */
-    public String id() {
-        return id;
-    }
-
-    /**
-     * Returns router name.
-     *
-     * @return router name
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Returns router status.
-     *
-     * @return router stauts
-     */
-    public RouterStatus status() {
-        return status;
-    }
-
-    /**
-     * Returns whether admin state up or not.
-     *
-     * @return true if admin state up, false otherwise
-     */
-    public boolean adminStateUp() {
-        return adminStateUp;
-    }
-
-    /**
-     * Returns external gateway information.
-     *
-     * @return external gateway information
-     */
-    public OpenstackExternalGateway gatewayExternalInfo() {
-        return gatewayExternalInfo;
-    }
-
-    /**
-     * An Openstack Router Builder class.
-     */
-    public static final class Builder {
-
-        private String tenantId;
-        private String id;
-        private String name;
-        private RouterStatus status;
-        private Boolean adminStateUp;
-        private OpenstackExternalGateway gatewayExternalInfo;
-
-        /**
-         * Sets router ID.
-         *
-         * @param id router ID
-         * @return Builder object
-         */
-        public Builder id(String id) {
-            this.id = id;
-            return this;
-        }
-
-        /**
-         * Sets router name.
-         *
-         * @param name router name
-         * @return Builder object
-         */
-        public Builder name(String name) {
-            this.name = name;
-            return this;
-        }
-
-        /**
-         * Sets router status.
-         *
-         * @param status router status
-         * @return Builder object
-         */
-        public Builder status(RouterStatus status) {
-            this.status = status;
-            return this;
-        }
-
-        /**
-         * Sets tenant ID.
-         *
-         * @param tenantId Tenant ID
-         * @return Builder object
-         */
-        public Builder tenantId(String tenantId) {
-            this.tenantId = tenantId;
-            return this;
-        }
-
-        /**
-         * Sets whether admin state up or not.
-         *
-         * @param adminStateUp true if admin state is up, false otherwise
-         * @return Builder object
-         */
-        public Builder adminStateUp(boolean adminStateUp) {
-            this.adminStateUp = adminStateUp;
-            return this;
-        }
-
-        /**
-         * Sets external gateway information.
-         *
-         * @param gatewayExternalInfo external gateway information
-         * @return Builder object
-         */
-        public Builder gatewayExternalInfo(OpenstackExternalGateway gatewayExternalInfo) {
-            this.gatewayExternalInfo = gatewayExternalInfo;
-            return this;
-        }
-
-        /**
-         * Builds an OpenstackRouter object.
-         *
-         * @return OpenstasckRouter object
-         */
-        public OpenstackRouter build() {
-            return new OpenstackRouter(id, tenantId, name, status,
-                    adminStateUp, gatewayExternalInfo);
-        }
-    }
-
-
-}
diff --git a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRouterInterface.java b/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRouterInterface.java
deleted file mode 100644
index 8404ea0..0000000
--- a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRouterInterface.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstackrouting;
-
-/**
- * An Openstack Neutron Router Interface Model.
- */
-public final class OpenstackRouterInterface {
-    private String id;
-    private String tenantId;
-    private String subnetId;
-    private String portId;
-
-    private OpenstackRouterInterface(String id, String tenantId,
-                                     String subnetId, String portId) {
-        this.id = id;
-        this.tenantId = tenantId;
-        this.subnetId = subnetId;
-        this.portId = portId;
-    }
-
-    /**
-     * Returns Router Interface ID.
-     *
-     * @return router interface ID
-     */
-    public String id() {
-        return id;
-    }
-
-    /**
-     * Returns tenant ID.
-     *
-     * @return tenant ID
-     */
-    public String tenantId() {
-        return tenantId;
-    }
-
-    /**
-     * Returns subnet ID.
-     *
-     * @return subnet ID
-     */
-    public String subnetId() {
-        return subnetId;
-    }
-
-    /**
-     * Returns port ID.
-     *
-     * @return port ID
-     */
-    public String portId() {
-        return portId;
-    }
-
-    /**
-     * An Openstack Router Interface Builder class.
-     */
-    public static final class Builder {
-        private String id;
-        private String tenantId;
-        private String subnetId;
-        private String portId;
-
-        /**
-         * Sets Router Interface ID.
-         *
-         * @param id router interface ID
-         * @return Builder object
-         */
-        public Builder id(String id) {
-            this.id = id;
-            return this;
-        }
-
-        /**
-         * Sets tenant ID.
-         *
-         * @param tenantId tenant ID
-         * @return Builder object
-         */
-        public Builder tenantId(String tenantId) {
-            this.tenantId = tenantId;
-            return this;
-        }
-
-        /**
-         * Sets subnet ID.
-         *
-         * @param subnetId subnet ID
-         * @return Builder object
-         */
-        public Builder subnetId(String subnetId) {
-            this.subnetId = subnetId;
-            return this;
-        }
-
-        /**
-         * Sets port ID.
-         *
-         * @param portId port ID
-         * @return Builder object
-         */
-        public Builder portId(String portId) {
-            this.portId = portId;
-            return this;
-        }
-
-
-        /**
-         * Builds an Openstack Router Interface object.
-         *
-         * @return OpenstackRouterInterface object
-         */
-        public OpenstackRouterInterface build() {
-            return new OpenstackRouterInterface(id, tenantId, subnetId, portId);
-        }
-
-    }
-}
diff --git a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRoutingManager.java b/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRoutingManager.java
deleted file mode 100644
index 5bfc5ea..0000000
--- a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRoutingManager.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstackrouting;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.packet.Ethernet;
-import org.onlab.packet.IPv4;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.driver.DriverService;
-import org.onosproject.net.packet.InboundPacket;
-import org.onosproject.net.packet.PacketContext;
-import org.onosproject.net.packet.PacketProcessor;
-import org.onosproject.net.packet.PacketService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import static org.onlab.util.Tools.groupedThreads;
-
-@Service
-@Component(immediate = true)
-/**
- * Populates flow rules about L3 functionality for VMs in Openstack.
- */
-public class OpenstackRoutingManager implements OpenstackRoutingService {
-    private static Logger log = LoggerFactory
-            .getLogger(OpenstackRoutingManager.class);
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected PacketService packetService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DriverService driverService;
-
-    private ApplicationId appId;
-    private OpenstackIcmpHandler icmpHandler;
-    private OpenstackPnatHandler natHandler;
-    private OpenstackFloatingIPHandler floatingIPHandler;
-    private OpenstackRoutingRulePopulator openstackRoutingRulePopulator;
-
-    private InternalPacketProcessor internalPacketProcessor = new InternalPacketProcessor();
-    private ExecutorService l3EventExcutorService =
-            Executors.newSingleThreadExecutor(groupedThreads("onos/openstackrouting", "L3-event"));
-    private ExecutorService icmpEventExcutorService =
-            Executors.newSingleThreadExecutor(groupedThreads("onos/openstackrouting", "icmp-event"));
-
-    @Activate
-    protected void activate() {
-        appId = coreService.registerApplication("org.onosproject.openstackrouting");
-        packetService.addProcessor(internalPacketProcessor, PacketProcessor.director(1));
-
-        log.info("onos-openstackrouting started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        packetService.removeProcessor(internalPacketProcessor);
-        log.info("onos-openstackrouting stopped");
-    }
-
-
-    @Override
-    public void createFloatingIP(OpenstackFloatingIP openstackFloatingIP) {
-
-    }
-
-    @Override
-    public void updateFloatingIP(OpenstackFloatingIP openstackFloatingIP) {
-
-    }
-
-    @Override
-    public void deleteFloatingIP(String id) {
-
-    }
-
-    @Override
-    public void createRouter(OpenstackRouter openstackRouter) {
-
-    }
-
-    @Override
-    public void updateRouter(OpenstackRouter openstackRouter) {
-
-    }
-
-    @Override
-    public void deleteRouter(String id) {
-
-    }
-
-    @Override
-    public void createRouterInterface(OpenstackRouterInterface openstackRouterInterface) {
-
-    }
-
-    @Override
-    public void updateRouterInterface(OpenstackRouterInterface openstackRouterInterface) {
-
-    }
-
-    @Override
-    public void removeRouterInterface(OpenstackRouterInterface openstackRouterInterface) {
-
-    }
-    private class InternalPacketProcessor implements PacketProcessor {
-
-        @Override
-        public void process(PacketContext context) {
-
-            if (context.isHandled()) {
-                return;
-            }
-
-            InboundPacket pkt = context.inPacket();
-            Ethernet ethernet = pkt.parsed();
-
-            if (ethernet != null && ethernet.getEtherType() == Ethernet.TYPE_IPV4) {
-                IPv4 iPacket = (IPv4) ethernet.getPayload();
-                switch (iPacket.getProtocol()) {
-                    case IPv4.PROTOCOL_ICMP:
-                        icmpEventExcutorService.execute(new OpenstackIcmpHandler(context));
-                        break;
-                    default:
-                        l3EventExcutorService.execute(new OpenstackPnatHandler(context));
-                        break;
-                }
-
-            }
-
-
-        }
-    }
-
-}
diff --git a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRoutingRulePopulator.java b/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRoutingRulePopulator.java
deleted file mode 100644
index 10a41ec..0000000
--- a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRoutingRulePopulator.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstackrouting;
-
-/**
- * Populates Routing Flow Rules.
- */
-public class OpenstackRoutingRulePopulator {
-}
diff --git a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRoutingService.java b/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRoutingService.java
deleted file mode 100644
index 3840cb2..0000000
--- a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/OpenstackRoutingService.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstackrouting;
-
-/**
- * The Interface of Openstack Routing.
- */
-public interface OpenstackRoutingService {
-
-    /**
-     * Stores the Floating IP information created by Openstack.
-     *
-     * @param openstackFloatingIP Floating IP information
-     */
-    void createFloatingIP(OpenstackFloatingIP openstackFloatingIP);
-
-    /**
-     * Updates flow rules corresponding to the Floating IP information updated by Openstack.
-     *
-     * @param openstackFloatingIP Floating IP information
-     */
-    void updateFloatingIP(OpenstackFloatingIP openstackFloatingIP);
-
-    /**
-     * Removes flow rules corresponding to Floating IP information deleted by Openstack.
-     *
-     * @param id Deleted Floating IP`s ID
-     */
-    void deleteFloatingIP(String id);
-
-    /**
-     * Stores the router information created by Openstack.
-     *
-     * @param openstackRouter Floating IP information
-     */
-    void createRouter(OpenstackRouter openstackRouter);
-
-    /**
-     * Updates flow rules corresponding to the router information updated by Openstack.
-     *
-     * @param openstackRouter Router information
-     */
-    void updateRouter(OpenstackRouter openstackRouter);
-
-    /**
-     * Removes flow rules corresponding to the router information deleted by Openstack.
-     *
-     * @param id Deleted router`s ID
-     */
-    void deleteRouter(String id);
-
-    /**
-     * Stores the router information created by Openstack.
-     *
-     * @param openstackRouterInterface Floating IP information
-     */
-    void createRouterInterface(OpenstackRouterInterface openstackRouterInterface);
-
-    /**
-     * Updates flow rules corresponding to the router information updated by Openstack.
-     *
-     * @param openstackRouterInterface Router information
-     */
-    void updateRouterInterface(OpenstackRouterInterface openstackRouterInterface);
-
-    /**
-     * Removes flow rules corresponding to the router information removed by Openstack.
-     *
-     * @param openstackRouterInterface Router information
-     */
-    void removeRouterInterface(OpenstackRouterInterface openstackRouterInterface);
-
-
-}
diff --git a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/package-info.java b/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/package-info.java
deleted file mode 100644
index 1079f4e..0000000
--- a/apps/openstackrouting/src/main/java/org/onosproject/openstackrouting/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Application for OpenstackRouting.
- */
-package org.onosproject.openstackrouting;
\ No newline at end of file
diff --git a/apps/openstackswitching/pom.xml b/apps/openstackswitching/pom.xml
index 459ec61..4692d61 100644
--- a/apps/openstackswitching/pom.xml
+++ b/apps/openstackswitching/pom.xml
@@ -39,7 +39,7 @@
     <dependencies>
         <dependency>
             <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-openstackrouting</artifactId>
+            <artifactId>onos-app-openstackrouting-api</artifactId>
             <version>${project.version}</version>
         </dependency>
     </dependencies>