Refactoring of OpenstackSwitching and OpenstackRouting

Change-Id: Ib7caea98006274dcdfebfe27c07e3533730ab23e
diff --git a/apps/cordvtn/pom.xml b/apps/cordvtn/pom.xml
index bb0895a..560bdc0 100644
--- a/apps/cordvtn/pom.xml
+++ b/apps/cordvtn/pom.xml
@@ -103,7 +103,7 @@
         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-openstackswitching-api</artifactId>
+            <artifactId>onos-app-openstacknetworking-api</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordService.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordService.java
index 97651b7..d661966 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordService.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordService.java
@@ -19,8 +19,8 @@
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onosproject.net.Host;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackSubnet;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
 
 import java.util.Map;
 import java.util.Objects;
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
index 7503c08..400c6ce 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
@@ -62,10 +62,10 @@
 import org.onosproject.net.packet.PacketService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackSubnet;
-import org.onosproject.openstackswitching.OpenstackSwitchingService;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
 import org.slf4j.Logger;
 
 import java.util.List;
@@ -123,7 +123,7 @@
     protected GroupService groupService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected OpenstackSwitchingService openstackService;
+    protected OpenstackNetworkingService openstackService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DhcpService dhcpService;
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnRuleInstaller.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnRuleInstaller.java
index afd6b2c..f6c23b4 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnRuleInstaller.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnRuleInstaller.java
@@ -71,8 +71,8 @@
 import org.onosproject.net.group.GroupDescription;
 import org.onosproject.net.group.GroupKey;
 import org.onosproject.net.group.GroupService;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackSubnet;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
 import org.slf4j.Logger;
 
 import java.util.ArrayList;
diff --git a/apps/openstackswitching/api/pom.xml b/apps/openstacknetworking/api/pom.xml
similarity index 79%
rename from apps/openstackswitching/api/pom.xml
rename to apps/openstacknetworking/api/pom.xml
index 2fdab70..b4ad7c1 100644
--- a/apps/openstackswitching/api/pom.xml
+++ b/apps/openstacknetworking/api/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Copyright 2015 Open Networking Laboratory
+  ~ 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.
@@ -16,35 +16,34 @@
   -->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
         <groupId>org.onosproject</groupId>
-        <artifactId>onos-openstackswitching</artifactId>
+        <artifactId>onos-app-openstacknetworking</artifactId>
         <version>1.5.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>onos-app-openstackswitching-api</artifactId>
+    <artifactId>onos-app-openstacknetworking-api</artifactId>
     <packaging>bundle</packaging>
 
-    <description>SONA Openstack Switching  application API</description>
-
     <dependencies>
         <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-core-serializers</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
 </project>
+
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
new file mode 100644
index 0000000..8f1e741
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java
@@ -0,0 +1,144 @@
+/*
+ * 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.openstacknetworking;
+
+import com.google.common.collect.Maps;
+import org.onlab.packet.Ip4Address;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * A configurable external gateway modes extension model in openstack router.
+ */
+public final class OpenstackExternalGateway {
+
+    private final String networkId;
+    private final boolean enablePnat;
+    private final Map<String, Ip4Address> externalFixedIps;
+
+    private OpenstackExternalGateway(String networkId, boolean enablePnat,
+                                     Map<String, Ip4Address> externalFixedIps) {
+        this.networkId = networkId;
+        this.enablePnat = enablePnat;
+        this.externalFixedIps = externalFixedIps;
+    }
+
+    /**
+     * 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;
+    }
+
+    /**
+     * Returns external fixed IP informations.
+     *
+     * @return External fixed IP informations
+     */
+    public Map<String, Ip4Address> externalFixedIps() {
+        return externalFixedIps;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o instanceof OpenstackExternalGateway) {
+            OpenstackExternalGateway that = (OpenstackExternalGateway) o;
+
+            return this.networkId.equals(that.networkId) &&
+                    this.enablePnat == that.enablePnat &&
+                    this.externalFixedIps.equals(that.externalFixedIps);
+        }
+
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(networkId, enablePnat, externalFixedIps);
+    }
+
+    /**
+     * An Openstack External Gateway Builder class.
+     */
+    public static final class Builder {
+        private String networkId;
+        private boolean enablePnat;
+        private Map<String, Ip4Address> externalFixedIps;
+
+        public Builder() {
+            externalFixedIps = Maps.newHashMap();
+        }
+
+        /**
+         * 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/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java
new file mode 100644
index 0000000..bed0289
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java
@@ -0,0 +1,266 @@
+/*
+ * 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.openstacknetworking;
+
+import org.onlab.packet.Ip4Address;
+
+import java.util.Objects;
+
+/**
+ *  An Openstack Neutron Floating IP Model.
+ */
+public final class OpenstackFloatingIP {
+
+    public enum FloatingIPStatus {
+        UP,
+        DOWN,
+        ACTIVE,
+    }
+
+    private final String tenantId;
+    private final String networkId;
+    private final Ip4Address fixedIpAddress;
+    private final String portId;
+    private final String routerId;
+    private final String id;
+    private final Ip4Address floatingIpAddress;
+    private final 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;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o instanceof  OpenstackFloatingIP) {
+            OpenstackFloatingIP that = (OpenstackFloatingIP) o;
+
+            return this.status.equals(that.status) &&
+                    this.id.equals(that.id) &&
+                    this.tenantId.equals(that.tenantId) &&
+                    this.networkId.equals(that.networkId) &&
+                    this.fixedIpAddress.equals(that.fixedIpAddress) &&
+                    this.floatingIpAddress.equals(that.floatingIpAddress) &&
+                    this.portId.equals(that.portId) &&
+                    this.routerId.equals(that.routerId);
+        }
+
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(status, id, tenantId, networkId, floatingIpAddress, fixedIpAddress, portId, routerId);
+    }
+
+    /**
+     * 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/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackNetwork.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetwork.java
similarity index 98%
rename from apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackNetwork.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetwork.java
index c760146..23a0674 100644
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackNetwork.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetwork.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching;
+package org.onosproject.openstacknetworking;
 
 import java.util.Collection;
 
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingConfig.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingConfig.java
similarity index 96%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingConfig.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingConfig.java
index 11eff61..37e9c06 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingConfig.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingConfig.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking;
 
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.config.Config;
@@ -22,7 +22,7 @@
 /**
  * Handles configuration for OpenstackSwitching app.
  */
-public class OpenstackSwitchingConfig extends Config<ApplicationId> {
+public class OpenstackNetworkingConfig extends Config<ApplicationId> {
     public static final String DONOTPUSH = "do_not_push_flows";
     public static final String NEUTRON_SERVER = "neutron_server";
     public static final String KEYSTONE_SERVER = "keystone_server";
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingService.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingService.java
new file mode 100644
index 0000000..6bd6bf8
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingService.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2015-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.openstacknetworking;
+
+import org.onosproject.net.Port;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * Handles port management REST API from Openstack for VMs.
+ */
+public interface OpenstackNetworkingService {
+
+    /**
+     * Returns port information list for the network ID given.
+     *
+     * @param networkId Network ID of the ports
+     * @return port information list
+     */
+    Collection<OpenstackPort> ports(String networkId);
+
+    /**
+     * Returns port information list.
+     *
+     * @return port information list
+     */
+    Collection<OpenstackPort> ports();
+    /**
+     * Returns port information for the port given.
+     *
+     * @param port port reference
+     * @return port information
+     */
+    OpenstackPort port(Port port);
+
+    /**
+     * Returns port information for the port ID given.
+     *
+     * @param portId Port ID
+     * @return port information
+     */
+    OpenstackPort port(String portId);
+
+    /**
+     * Returns network information list for the network ID given.
+     *
+     * @param networkId Network ID
+     * @return network information, or null if not present
+     */
+    OpenstackNetwork network(String networkId);
+
+    /**
+     * Returns the information of all openstack networks.
+     *
+     * @return collection of network information
+     */
+    Collection<OpenstackNetwork> networks();
+
+    /**
+     * Returns subnet information for the subnet ID give.
+     *
+     * @param subnetId Subnet ID
+     * @return subnet information, or null if not present
+     */
+    OpenstackSubnet subnet(String subnetId);
+
+    /**
+     * Returns collection of openstack subnet information.
+     *
+     * @return collection of openststack subnet information
+     */
+    Collection<OpenstackSubnet> subnets();
+
+    /**
+     * Returns the router information list.
+     *
+     * @return router information list
+     */
+    Collection<OpenstackRouter> routers();
+
+    /**
+     * Returns the router information for the router ID given.
+     *
+     * @param routerId router ID
+     * @return router information
+     */
+    OpenstackRouter router(String routerId);
+
+    /**
+     * Retruns OpenstackPortInfo map.
+     *
+     * @return OpenstackPortInfo map
+     */
+    Map<String, OpenstackPortInfo> openstackPortInfo();
+
+    /**
+     * Sets configurations specified by net-config.xml file.
+     *
+     * @param neutronUrl neutron server url
+     * @param keystoneUrl keystone server url
+     * @param userName horizon user name
+     * @param pass horizon passowrd
+     */
+    void setConfigurations(String neutronUrl, String keystoneUrl, String userName, String pass);
+
+    /**
+     * Returns Security Group information of the security groupd id given.
+     *
+     * @param id security group id
+     * @return security group information
+     */
+    OpenstackSecurityGroup getSecurityGroup(String id);
+
+}
diff --git a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPort.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPort.java
similarity index 99%
rename from apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPort.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPort.java
index a7ae7cb..13bcb0e 100644
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPort.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPort.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching;
+package org.onosproject.openstacknetworking;
 
 import com.google.common.collect.Maps;
 import org.onlab.packet.Ip4Address;
diff --git a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPortInfo.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPortInfo.java
similarity index 98%
rename from apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPortInfo.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPortInfo.java
index 45b6f59..0099ea9 100644
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPortInfo.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPortInfo.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching;
+package org.onosproject.openstacknetworking;
 
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.MacAddress;
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
new file mode 100644
index 0000000..8e513f1
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java
@@ -0,0 +1,218 @@
+/*
+ * 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.openstacknetworking;
+
+import java.util.Objects;
+
+/**
+ * An Openstack Neutron Router Model.
+ */
+public final class OpenstackRouter {
+
+    public enum RouterStatus {
+        UP,
+        DOWN,
+        ACTIVE,
+    }
+
+    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 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;
+
+    }
+
+    /**
+     * 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;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o instanceof OpenstackRouter) {
+            OpenstackRouter that = (OpenstackRouter) o;
+
+            return this.adminStateUp == that.adminStateUp &&
+                    this.gatewayExternalInfo.equals(that.gatewayExternalInfo) &&
+                    this.id.equals(that.id) &&
+                    this.name.equals(that.name) &&
+                    this.status.equals(that.status) &&
+                    this.tenantId.equals(that.tenantId);
+        }
+
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(adminStateUp, gatewayExternalInfo, id, name, status, tenantId);
+    }
+
+    /**
+     * 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/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java
new file mode 100644
index 0000000..972e6c5
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java
@@ -0,0 +1,162 @@
+/*
+ * 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.openstacknetworking;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * An Openstack Neutron Router Interface Model.
+ */
+public final class OpenstackRouterInterface {
+    private final String id;
+    private final String tenantId;
+    private final String subnetId;
+    private final String portId;
+
+    private OpenstackRouterInterface(String id, String tenantId,
+                                     String subnetId, String portId) {
+        this.id = checkNotNull(id);
+        this.tenantId = checkNotNull(tenantId);
+        this.subnetId = checkNotNull(subnetId);
+        this.portId = checkNotNull(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;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o instanceof OpenstackRouterInterface) {
+            OpenstackRouterInterface that = (OpenstackRouterInterface)  o;
+
+            return this.id.equals(that.id) &&
+                    this.portId.equals(that.portId) &&
+                    this.subnetId.equals(that.subnetId) &&
+                    this.tenantId.equals(that.tenantId);
+        }
+
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, portId, subnetId, tenantId);
+    }
+
+    /**
+     * 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/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRoutingService.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRoutingService.java
new file mode 100644
index 0000000..101059a
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRoutingService.java
@@ -0,0 +1,80 @@
+/*
+ * 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.openstacknetworking;
+
+/**
+ * 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 removed 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 removed by Openstack.
+     *
+     * @param id Deleted router`s ID
+     */
+    void deleteRouter(String id);
+
+    /**
+     * 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/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroup.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroup.java
similarity index 98%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroup.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroup.java
index 756989f..358b92b 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroup.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroup.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -112,7 +112,7 @@
                     this.rules.containsAll(that.rules);
         }
 
-        return true;
+        return false;
     }
 
     @Override
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroupRule.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroupRule.java
similarity index 78%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroupRule.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroupRule.java
index 8a738e6..8b9da8f 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroupRule.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroupRule.java
@@ -13,23 +13,27 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Represents Openstack Security Group Rules.
  */
 public final class OpenstackSecurityGroupRule {
 
-    private String direction;
-    private String ethertype;
-    private String id;
-    private String portRangeMax;
-    private String portRangeMin;
-    private String protocol;
-    private String remoteGroupId;
-    private String remoteIpPrefix;
-    private String secuityGroupId;
-    private String tenantId;
+    private final String direction;
+    private final String ethertype;
+    private final String id;
+    private final String portRangeMax;
+    private final String portRangeMin;
+    private final String protocol;
+    private final String remoteGroupId;
+    private final String remoteIpPrefix;
+    private final String secuityGroupId;
+    private final String tenantId;
 
     private OpenstackSecurityGroupRule(String direction,
                                        String ethertype,
@@ -43,7 +47,7 @@
                                        String tenantId) {
         this.direction = direction;
         this.ethertype = ethertype;
-        this.id = id;
+        this.id = checkNotNull(id);
         this.portRangeMax = portRangeMax;
         this.portRangeMin = portRangeMin;
         this.protocol = protocol;
@@ -53,15 +57,6 @@
         this.tenantId = tenantId;
     }
 
-    /**
-     * Returns the builder object for the OpenstackSecurityGroupRule.
-     *
-     * @return OpenstackSecurityGroupRule builder object
-     */
-    public static OpenstackSecurityGroupRule.Builder builder() {
-        return new Builder();
-    }
-
     @Override
     public String toString() {
         return new StringBuilder(" [")
@@ -78,6 +73,35 @@
                 .toString();
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (this instanceof OpenstackSecurityGroupRule) {
+            OpenstackSecurityGroupRule that = (OpenstackSecurityGroupRule) o;
+            return this.direction.equals(that.direction) &&
+                    this.ethertype.equals(that.direction) &&
+                    this.id.equals(that.id) &&
+                    this.portRangeMax.equals(that.portRangeMax) &&
+                    this.portRangeMin.equals(that.portRangeMin) &&
+                    this.protocol.equals(that.protocol) &&
+                    this.remoteGroupId.equals(that.remoteGroupId) &&
+                    this.secuityGroupId.equals(that.secuityGroupId) &&
+                    this.remoteIpPrefix.equals(that.remoteIpPrefix) &&
+                    this.tenantId.equals(that.tenantId);
+        }
+
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(direction, ethertype, id, portRangeMax, portRangeMin, protocol,
+                remoteGroupId, remoteIpPrefix, secuityGroupId, tenantId);
+    }
+
     /**
      * Represents a security group rule builder object.
      */
diff --git a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSubnet.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSubnet.java
similarity index 98%
rename from apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSubnet.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSubnet.java
index f832768..8223711 100644
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSubnet.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSubnet.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching;
+package org.onosproject.openstacknetworking;
 
 import org.onlab.packet.Ip4Address;
 
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSwitchingService.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSwitchingService.java
new file mode 100644
index 0000000..9f70a00
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSwitchingService.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2015-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.openstacknetworking;
+
+import java.util.Map;
+
+/**
+ * Handles port management REST API from Openstack for VMs.
+ */
+public interface OpenstackSwitchingService {
+
+    /**
+     * Store the port information created by Openstack.
+     *
+     * @param openstackPort port information
+     */
+    void createPorts(OpenstackPort openstackPort);
+
+    /**
+     * Removes flow rules corresponding to the port removed by Openstack.
+     *
+     * @param uuid UUID
+     */
+    void removePort(String uuid);
+
+    /**
+     * Updates flow rules corresponding to the port information updated by Openstack.
+     *
+     * @param openstackPort OpenStack port
+     */
+    void updatePort(OpenstackPort openstackPort);
+
+    /**
+     * Stores the network information created by openstack.
+     *
+     * @param openstackNetwork network information
+     */
+    void createNetwork(OpenstackNetwork openstackNetwork);
+
+    /**
+     * Stores the subnet information created by openstack.
+     *
+     * @param openstackSubnet subnet information
+     */
+    void createSubnet(OpenstackSubnet openstackSubnet);
+
+    /**
+     * Retruns OpenstackPortInfo map.
+     *
+     * @return OpenstackPortInfo map
+     */
+    Map<String, OpenstackPortInfo> openstackPortInfo();
+
+}
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/package-info.java
similarity index 81%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/package-info.java
index 91e19c6..bf6a8cc 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Open Networking Laboratory
+ * 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.
@@ -15,6 +15,6 @@
  */
 
 /**
- * OpenStack switching REST API.
+ * Application for OpenstackRouting.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking;
\ No newline at end of file
diff --git a/apps/openstackswitching/app/app.xml b/apps/openstacknetworking/app/app.xml
similarity index 75%
rename from apps/openstackswitching/app/app.xml
rename to apps/openstacknetworking/app/app.xml
index 2043d94..c016e85 100644
--- a/apps/openstackswitching/app/app.xml
+++ b/apps/openstacknetworking/app/app.xml
@@ -14,12 +14,15 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<app name="org.onosproject.openstackswitching" origin="ON.Lab" version="${project.version}"
+<app name="org.onosproject.openstacknetworking" origin="ON.Lab" version="${project.version}"
      category="default" url="http://onosproject.org"
      featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
      features="${project.artifactId}">
     <description>${project.description}</description>
+    <artifact>mvn:${project.groupId}/onos-app-openstacknetworking-api/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-app-openstacknetworking-web/${project.version}</artifact>
     <artifact>mvn:${project.groupId}/onos-app-openstackswitching/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-app-openstackrouting/${project.version}</artifact>
     <artifact>mvn:${project.groupId}/onos-app-dhcp-api/${project.version}</artifact>
     <artifact>mvn:${project.groupId}/onos-app-dhcp/${project.version}</artifact>
 </app>
diff --git a/apps/openstackswitching/app/features.xml b/apps/openstacknetworking/app/features.xml
similarity index 87%
rename from apps/openstackswitching/app/features.xml
rename to apps/openstacknetworking/app/features.xml
index a4e2639..7a69ffd 100644
--- a/apps/openstackswitching/app/features.xml
+++ b/apps/openstacknetworking/app/features.xml
@@ -18,7 +18,8 @@
     <feature name="${project.artifactId}" version="${project.version}"
              description="${project.description}">
         <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-app-openstackswitching-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-openstacknetworking-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-openstacknetworking-web/${project.version}</bundle>
         <bundle>mvn:${project.groupId}/onos-app-openstackswitching/${project.version}</bundle>
         <bundle>mvn:${project.groupId}/onos-app-dhcp-api/${project.version}</bundle>
         <bundle>mvn:${project.groupId}/onos-app-dhcp/${project.version}</bundle>
diff --git a/apps/openstacknetworking/app/pom.xml b/apps/openstacknetworking/app/pom.xml
new file mode 100644
index 0000000..acf7e22
--- /dev/null
+++ b/apps/openstacknetworking/app/pom.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2016 Open Networking Laboratory
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-app-openstacknetworking</artifactId>
+        <version>1.5.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-app-openstacknetworking-app</artifactId>
+    <packaging>pom</packaging>
+
+    <properties>
+        <onos.app.name>org.onosproject.openstacknetworking</onos.app.name>
+        <onos.app.category>default</onos.app.category>
+        <onos.app.url>http://onosproject.org</onos.app.url>
+        <onos.app.readme>Openstack Networking Application.</onos.app.readme>
+    </properties>
+
+    <description>SONA Openstack Networking main Application</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-openstackswitching</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-openstackrouting</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-openstacknetworking-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-openstacknetworking-web</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/apps/openstacknetworking/network-cfg.json b/apps/openstacknetworking/network-cfg.json
new file mode 100644
index 0000000..170d482
--- /dev/null
+++ b/apps/openstacknetworking/network-cfg.json
@@ -0,0 +1,51 @@
+{
+    "apps" : {
+      "org.onosproject.openstackswitching" : {
+          "openstackswitching" : {
+                "do_not_push_flows" : "false",
+                "neutron_server" : "http://192.168.56.103:9696/v2.0/",
+                "keystone_server" : "http://192.168.56.103:5000/v2.0/",
+                "user_name" : "admin",
+                "password" : "nova",
+                "physicalRouterMac" : "00:00:00:00:00:20",
+                "nodes" : [
+                  {
+                      "hostname" : "compute-01",
+                                  "ovsdbIp" : "192.168.56.102",
+                                  "ovsdbPort" : "6640",
+                                  "bridgeId" : "of:0000000000000001",
+                                  "openstackNodeType" : "COMPUTENODE"
+                              },
+                              {
+                                  "hostname" : "compute-02",
+                                  "ovsdbIp" : "192.168.56.101",
+                                  "ovsdbPort" : "6640",
+                                  "bridgeId" : "of:0000000000000002",
+                                  "openstackNodeType" : "COMPUTENODE"
+                              },
+                              {
+                                  "hostname" : "network",
+                                  "ovsdbIp" : "192.168.56.106",
+                                  "ovsdbPort" : "6640",
+                                  "bridgeId" : "of:0000000000000003",
+                                  "openstackNodeType" : "GATEWAYNODE",
+                                  "externalIfName" : "eth3",
+                                  "externalIfMacAddress" : "00:00:00:00:00:11"
+                              }
+                ]
+              }
+          }
+    },
+    "devices" : {
+        "of:0000000000000001" : {
+            "basic" : {
+                "driver" : "sona"
+            }
+        },
+        "of:0000000000000002" : {
+            "basic" : {
+                "driver" : "sona"
+            }
+        }
+    }
+}
diff --git a/apps/openstackswitching/api/pom.xml b/apps/openstacknetworking/openstackrouting/pom.xml
similarity index 73%
copy from apps/openstackswitching/api/pom.xml
copy to apps/openstacknetworking/openstackrouting/pom.xml
index 2fdab70..54a3a5a 100644
--- a/apps/openstackswitching/api/pom.xml
+++ b/apps/openstacknetworking/openstackrouting/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Copyright 2015 Open Networking Laboratory
+  ~ 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.
@@ -16,35 +16,39 @@
   -->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
         <groupId>org.onosproject</groupId>
-        <artifactId>onos-openstackswitching</artifactId>
+        <artifactId>onos-app-openstacknetworking</artifactId>
         <version>1.5.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>onos-app-openstackswitching-api</artifactId>
+    <artifactId>onos-app-openstackrouting</artifactId>
     <packaging>bundle</packaging>
 
-    <description>SONA Openstack Switching  application API</description>
-
     <dependencies>
         <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-core-serializers</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-openstacknetworking-api</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
 </project>
+
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackFloatingIPHandler.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackFloatingIPHandler.java
new file mode 100644
index 0000000..3ef1c88
--- /dev/null
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackFloatingIPHandler.java
@@ -0,0 +1,34 @@
+/*
+ * 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.openstacknetworking.routing;
+
+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/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackIcmpHandler.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackIcmpHandler.java
new file mode 100644
index 0000000..3cc11f0
--- /dev/null
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackIcmpHandler.java
@@ -0,0 +1,35 @@
+/*
+ * 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.openstacknetworking.routing;
+
+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;
+    private OpenstackRoutingRulePopulator rulePopulator;
+    OpenstackIcmpHandler(OpenstackRoutingRulePopulator rulePopulator, PacketContext context) {
+        this.context = context;
+        this.rulePopulator = rulePopulator;
+    }
+
+    @Override
+    public void run() {
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..40eed7f
--- /dev/null
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
@@ -0,0 +1,128 @@
+/*
+ * 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.openstacknetworking.routing;
+
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.IPv4;
+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.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.OpenstackPort;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.nio.ByteBuffer;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+
+/**
+ * Handle NAT packet processing for Managing Flow Rules In Openstack Nodes.
+ */
+public class OpenstackPnatHandler implements Runnable {
+
+    volatile PacketContext context;
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    protected PacketService packetService;
+
+    private final OpenstackRoutingRulePopulator rulePopulator;
+    private final int portNum;
+    private final OpenstackPort openstackPort;
+
+    OpenstackPnatHandler(OpenstackRoutingRulePopulator rulePopulator, PacketContext context,
+                         int portNum, OpenstackPort openstackPort) {
+        this.rulePopulator = checkNotNull(rulePopulator);
+        this.context = checkNotNull(context);
+        this.portNum = checkNotNull(portNum);
+        this.openstackPort = checkNotNull(openstackPort);
+    }
+
+    @Override
+    public void run() {
+        InboundPacket inboundPacket = context.inPacket();
+        Ethernet ethernet = checkNotNull(inboundPacket.parsed());
+
+        //TODO: Considers IPV6
+        if (ethernet.getEtherType() != Ethernet.TYPE_IPV4) {
+            log.warn("Now, we just consider IP version 4");
+            return;
+        }
+
+        packetOut(inboundPacket, portNum);
+
+        rulePopulator.populatePnatFlowRules(inboundPacket, openstackPort, portNum,
+                getExternalInterfaceMacAddress(), getExternalRouterMacAddress());
+    }
+
+    private void packetOut(InboundPacket inboundPacket, int portNum) {
+        Ethernet ethernet = checkNotNull(inboundPacket.parsed());
+        IPv4 iPacket = (IPv4) ethernet.getPayload();
+
+        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+
+        switch (iPacket.getProtocol()) {
+            case IPv4.PROTOCOL_TCP:
+                TCP tcpPacket = (TCP) iPacket.getPayload();
+                tcpPacket.setSourcePort(portNum);
+                tcpPacket.resetChecksum();
+                tcpPacket.setParent(iPacket);
+                iPacket.setPayload(tcpPacket);
+                break;
+            case IPv4.PROTOCOL_UDP:
+                UDP udpPacket = (UDP) iPacket.getPayload();
+                udpPacket.setSourcePort(portNum);
+                udpPacket.resetChecksum();
+                udpPacket.setParent(iPacket);
+                iPacket.setPayload(udpPacket);
+                break;
+            default:
+                break;
+        }
+
+        iPacket.resetChecksum();
+        iPacket.setPayload(ethernet);
+        ethernet.setSourceMACAddress(getExternalInterfaceMacAddress())
+                .setDestinationMACAddress(getExternalRouterMacAddress());
+        ethernet.resetChecksum();
+
+        treatment.setOutput(getExternalPort(inboundPacket.receivedFrom().deviceId()));
+
+        packetService.emit(new DefaultOutboundPacket(inboundPacket.receivedFrom().deviceId(),
+                treatment.build(), ByteBuffer.wrap(ethernet.serialize())));
+    }
+
+    private PortNumber getExternalPort(DeviceId deviceId) {
+        // TODO
+        return null;
+    }
+    private MacAddress getExternalInterfaceMacAddress() {
+        // TODO
+        return null;
+    }
+    private MacAddress getExternalRouterMacAddress() {
+        // TODO
+        return null;
+    }
+}
\ 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
new file mode 100644
index 0000000..2ea5935
--- /dev/null
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
@@ -0,0 +1,244 @@
+/*
+ * 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.openstacknetworking.routing;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+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.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DriverService;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
+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.onosproject.openstacknetworking.OpenstackFloatingIP;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackRouter;
+import org.onosproject.openstacknetworking.OpenstackRouterInterface;
+import org.onosproject.openstacknetworking.OpenstackRoutingService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+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 final Logger log = LoggerFactory
+            .getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected PacketService packetService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DeviceService deviceService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected OpenstackNetworkingService openstackService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected FlowObjectiveService flowObjectiveService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DriverService driverService;
+
+    private ApplicationId appId;
+    private Map<String, OpenstackRouterInterface> routerInterfaceMap = Maps.newHashMap();
+    private Map<Integer, String> portNumMap = initPortNumMap();
+    private static final String APP_ID = "org.onosproject.openstackrouting";
+    private Map<Integer, String> initPortNumMap() {
+        Map<Integer, String> map = Maps.newHashMap();
+        for (int i = 1024; i < 65535; i++) {
+            map.put(i, "");
+        }
+        return map;
+    }
+
+    private InternalPacketProcessor internalPacketProcessor = new InternalPacketProcessor();
+    private ExecutorService l3EventExecutorService =
+            Executors.newSingleThreadExecutor(groupedThreads("onos/openstackrouting", "L3-event"));
+    private ExecutorService icmpEventExecutorService =
+            Executors.newSingleThreadExecutor(groupedThreads("onos/openstackrouting", "icmp-event"));
+
+    @Activate
+    protected void activate() {
+        appId = coreService.registerApplication(APP_ID);
+        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) {
+        checkExternalConnection(openstackRouter, getOpenstackRouterInterface(openstackRouter));
+    }
+
+    @Override
+    public void updateRouter(OpenstackRouter openstackRouter) {
+        checkExternalConnection(openstackRouter, getOpenstackRouterInterface(openstackRouter));
+    }
+
+    @Override
+    public void deleteRouter(String id) {
+        //TODO
+    }
+
+    @Override
+    public void updateRouterInterface(OpenstackRouterInterface routerInterface) {
+        routerInterfaceMap.putIfAbsent(routerInterface.portId(), routerInterface);
+        List<OpenstackRouterInterface> routerInterfaces = Lists.newArrayList();
+        routerInterfaces.add(routerInterface);
+        checkExternalConnection(getOpenstackRouter(routerInterface.tenantId()), routerInterfaces);
+    }
+
+    @Override
+    public void removeRouterInterface(OpenstackRouterInterface routerInterface) {
+        OpenstackRoutingRulePopulator rulePopulator = new OpenstackRoutingRulePopulator(appId,
+                openstackService, flowObjectiveService, deviceService, driverService);
+        rulePopulator.removeExternalRules(routerInterface);
+        routerInterfaceMap.remove(routerInterface.portId());
+    }
+    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();
+                OpenstackRoutingRulePopulator rulePopulator = new OpenstackRoutingRulePopulator(appId,
+                        openstackService, flowObjectiveService, deviceService,
+                        driverService);
+                switch (iPacket.getProtocol()) {
+                    case IPv4.PROTOCOL_ICMP:
+                        icmpEventExecutorService.execute(new OpenstackIcmpHandler(rulePopulator, context));
+                        break;
+                    default:
+                        int portNum = getPortNum(ethernet.getSourceMAC(), iPacket.getDestinationAddress());
+                        OpenstackPort openstackPort = getOpenstackPort(ethernet.getSourceMAC(),
+                                Ip4Address.valueOf(iPacket.getSourceAddress()));
+                        l3EventExecutorService.execute(new OpenstackPnatHandler(rulePopulator, context,
+                                portNum, openstackPort));
+                        break;
+                }
+
+            }
+        }
+
+        private int getPortNum(MacAddress sourceMac, int destinationAddress) {
+            int portNum = portNumMap.keySet().stream()
+                    .filter(k -> portNumMap.get(k).equals("")).findFirst().orElse(0);
+            portNumMap.replace(portNum, sourceMac.toString().concat(":").concat(String.valueOf(destinationAddress)));
+            return portNum;
+        }
+    }
+
+    private void checkExternalConnection(OpenstackRouter router,
+                                         Collection<OpenstackRouterInterface> routerInterfaces) {
+        checkNotNull(router, "Router 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");
+            return;
+        }
+        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());
+        OpenstackRoutingRulePopulator rulePopulator = new OpenstackRoutingRulePopulator(appId,
+                openstackService, flowObjectiveService, deviceService, driverService);
+        rulePopulator.populateExternalRules(vni, router, routerInterface);
+    }
+
+    private Collection<OpenstackRouterInterface> getOpenstackRouterInterface(OpenstackRouter router) {
+        return routerInterfaceMap.values().stream().filter(i -> i.id().equals(router.id()))
+                .collect(Collectors.toList());
+    }
+
+    private OpenstackRouter getOpenstackRouter(String tenantId) {
+        return openstackService.routers().stream().filter(r ->
+                r.tenantId().equals(tenantId)).findFirst().orElse(null);
+    }
+
+    private OpenstackPort getOpenstackPort(MacAddress sourceMac, Ip4Address ip4Address) {
+        OpenstackPort openstackPort = openstackService.ports("").stream()
+                .filter(p -> p.macAddress().equals(sourceMac)).findFirst().orElse(null);
+        return 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
new file mode 100644
index 0000000..dc10216
--- /dev/null
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java
@@ -0,0 +1,371 @@
+/*
+ * 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.openstacknetworking.routing;
+
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.IPv4;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.TCP;
+import org.onlab.packet.TpPort;
+import org.onlab.packet.UDP;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DefaultDriverData;
+import org.onosproject.net.driver.DefaultDriverHandler;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
+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.instructions.ExtensionPropertyException;
+import org.onosproject.net.flow.instructions.ExtensionTreatment;
+import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
+import org.onosproject.net.flowobjective.DefaultForwardingObjective;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
+import org.onosproject.net.flowobjective.ForwardingObjective;
+import org.onosproject.net.packet.InboundPacket;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackRouter;
+import org.onosproject.openstacknetworking.OpenstackRouterInterface;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.stream.StreamSupport;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Populates Routing Flow Rules.
+ */
+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;
+
+    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 static final int ROUTING_RULE_PRIORITY = 25000;
+    private static final int PNAT_RULE_PRIORITY = 24000;
+    private static final int PNAT_TIMEOUT = 120;
+    private static final MacAddress GATEWAYMAC = MacAddress.valueOf("1f:1f:1f:1f:1f:1f");
+
+    private InboundPacket inboundPacket;
+    private OpenstackPort openstackPort;
+    private int portNum;
+    private MacAddress externalInterface;
+    private MacAddress externalRouter;
+    private OpenstackRouter router;
+    private OpenstackRouterInterface routerInterface;
+
+    // TODO: This will be replaced to get the information from openstackswitchingservice.
+    private static final String EXTERNAL_INTERFACE_NAME = "eth3";
+
+    public OpenstackRoutingRulePopulator(ApplicationId appId, OpenstackNetworkingService openstackService,
+                                         FlowObjectiveService flowObjectiveService,
+                                         DeviceService deviceService, DriverService driverService) {
+        this.appId = appId;
+        this.flowObjectiveService = flowObjectiveService;
+        this.openstackService = openstackService;
+        this.deviceService = deviceService;
+        this.driverService = driverService;
+    }
+
+    public void populatePnatFlowRules(InboundPacket inboundPacket, OpenstackPort openstackPort, int portNum,
+                                      MacAddress externalInterfaceMacAddress, MacAddress externalRouterMacAddress) {
+        this.inboundPacket = inboundPacket;
+        this.openstackPort = openstackPort;
+        this.portNum = portNum;
+        this.externalInterface = externalInterfaceMacAddress;
+        this.externalRouter = externalRouterMacAddress;
+
+        long vni = getVni(openstackPort);
+
+        populatePnatIncomingFlowRules(vni);
+        populatePnatOutgoingFlowRules(vni);
+    }
+
+    private void populatePnatOutgoingFlowRules(long vni) {
+        IPv4 iPacket = (IPv4) inboundPacket.parsed().getPayload();
+
+        TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+        sBuilder.matchEthType(Ethernet.TYPE_IPV4)
+                .matchIPProtocol(iPacket.getProtocol())
+                .matchTunnelId(vni)
+                .matchIPSrc(IpPrefix.valueOf(iPacket.getSourceAddress(), 32))
+                .matchIPDst(IpPrefix.valueOf(iPacket.getDestinationAddress(), 32));
+
+        TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+        tBuilder.setEthSrc(externalInterface)
+                .setEthDst(externalRouter);
+
+        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));
+                break;
+            case IPv4.PROTOCOL_UDP:
+                UDP udpPacket = (UDP) iPacket.getPayload();
+                sBuilder.matchUdpDst(TpPort.tpPort(udpPacket.getSourcePort()))
+                        .matchUdpDst(TpPort.tpPort(udpPacket.getDestinationPort()));
+                tBuilder.setUdpDst(TpPort.tpPort(portNum));
+                break;
+            default:
+                break;
+        }
+
+        Port port = getPortNumOfExternalInterface();
+        checkNotNull(port, "Port can not be null");
+        tBuilder.setOutput(port.number());
+
+        ForwardingObjective fo = DefaultForwardingObjective.builder()
+                .withSelector(sBuilder.build())
+                .withTreatment(tBuilder.build())
+                .withFlag(ForwardingObjective.Flag.VERSATILE)
+                .withPriority(PNAT_RULE_PRIORITY)
+                .makeTemporary(PNAT_TIMEOUT)
+                .fromApp(appId)
+                .add();
+
+        flowObjectiveService.forward(inboundPacket.receivedFrom().deviceId(), fo);
+    }
+
+    private Port getPortNumOfExternalInterface() {
+        return deviceService.getPorts(inboundPacket.receivedFrom().deviceId()).stream()
+                .filter(p -> p.annotations().value("portName").equals(EXTERNAL_INTERFACE_NAME))
+                .findAny().orElse(null);
+    }
+
+
+    private void populatePnatIncomingFlowRules(long vni) {
+        IPv4 iPacket = (IPv4) inboundPacket.parsed().getPayload();
+        DeviceId deviceId = inboundPacket.receivedFrom().deviceId();
+
+        TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+        sBuilder.matchEthType(Ethernet.TYPE_IPV4)
+                .matchIPProtocol(iPacket.getProtocol())
+                .matchIPSrc(IpPrefix.valueOf(iPacket.getDestinationAddress(), 32));
+
+        TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+        tBuilder.setTunnelId(vni)
+                .setIpDst(IpAddress.valueOf(iPacket.getSourceAddress()));
+
+        switch (iPacket.getProtocol()) {
+            case IPv4.PROTOCOL_TCP:
+                TCP tcpPacket = (TCP) iPacket.getPayload();
+                sBuilder.matchTcpSrc(TpPort.tpPort(tcpPacket.getDestinationPort()))
+                        .matchTcpDst(TpPort.tpPort(portNum));
+                tBuilder.setTcpDst(TpPort.tpPort(tcpPacket.getSourcePort()));
+                break;
+            case IPv4.PROTOCOL_UDP:
+                UDP udpPacket = (UDP) iPacket.getPayload();
+                sBuilder.matchUdpSrc(TpPort.tpPort(udpPacket.getDestinationPort()))
+                        .matchUdpDst(TpPort.tpPort(portNum));
+                tBuilder.setUdpDst(TpPort.tpPort(udpPacket.getSourcePort()));
+                break;
+            default:
+                break;
+        }
+
+        tBuilder.extension(buildNiciraExtenstion(deviceId, Ip4Address.valueOf(iPacket.getSourceAddress())), deviceId)
+                .setOutput(getTunnelPort(deviceId));
+
+        ForwardingObjective fo = DefaultForwardingObjective.builder()
+                .withSelector(sBuilder.build())
+                .withTreatment(tBuilder.build())
+                .withFlag(ForwardingObjective.Flag.VERSATILE)
+                .withPriority(PNAT_RULE_PRIORITY)
+                .makeTemporary(PNAT_TIMEOUT)
+                .fromApp(appId)
+                .add();
+
+        flowObjectiveService.forward(inboundPacket.receivedFrom().deviceId(), fo);
+    }
+
+    private ExtensionTreatment buildNiciraExtenstion(DeviceId id, Ip4Address hostIp) {
+        Driver driver = driverService.getDriver(id);
+        DriverHandler driverHandler = new DefaultDriverHandler(new DefaultDriverData(driver, id));
+        ExtensionTreatmentResolver resolver = driverHandler.behaviour(ExtensionTreatmentResolver.class);
+
+        ExtensionTreatment extensionInstruction =
+                resolver.getExtensionInstruction(
+                        ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST.type());
+
+        try {
+            extensionInstruction.setPropertyValue("tunnelDst", hostIp);
+        } catch (ExtensionPropertyException e) {
+            log.error("Error setting Nicira extension setting {}", e);
+        }
+
+        return extensionInstruction;
+    }
+
+    private PortNumber getTunnelPort(DeviceId deviceId) {
+        Port port = deviceService.getPorts(deviceId).stream()
+                .filter(p -> p.annotations().value("portName").equals(PORTNAME_PREFIX_TUNNEL))
+                .findAny().orElse(null);
+
+        if (port == null) {
+            log.error("No TunnelPort was created.");
+            return null;
+        }
+        return port.number();
+
+    }
+
+    public void populateExternalRules(long vni, OpenstackRouter router,
+                                      OpenstackRouterInterface routerInterface) {
+        this.router = router;
+        this.routerInterface = routerInterface;
+
+        // 1. computeNode to gateway
+        populateComputeNodeRules(vni);
+        // 2. gatewayNode to controller
+        populateRuleGatewaytoController(vni);
+    }
+
+    private void populateRuleGatewaytoController(long vni) {
+        Device gatewayDevice = getGatewayNode();
+        TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+        TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+
+        sBuilder.matchEthType(Ethernet.TYPE_IPV4)
+                .matchTunnelId(vni)
+                .matchEthDst(GATEWAYMAC);
+        tBuilder.setOutput(PortNumber.CONTROLLER);
+
+        ForwardingObjective fo = DefaultForwardingObjective.builder()
+                .withSelector(sBuilder.build())
+                .withTreatment(tBuilder.build())
+                .withFlag(ForwardingObjective.Flag.VERSATILE)
+                .withPriority(ROUTING_RULE_PRIORITY)
+                .fromApp(appId)
+                .add();
+
+        flowObjectiveService.forward(gatewayDevice.id(), fo);
+    }
+
+    private void populateComputeNodeRules(long vni) {
+        Device gatewayDevice = getGatewayNode();
+
+        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) {
+        TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+        TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+
+        sBuilder.matchEthType(Ethernet.TYPE_IPV4)
+                .matchTunnelId(vni)
+                .matchEthDst(GATEWAYMAC);
+        tBuilder.extension(buildNiciraExtenstion(d.id(), getIPAddressforDevice(gatewayDevice)), d.id())
+                .setOutput(getTunnelPort(d.id()));
+
+        ForwardingObjective fo = DefaultForwardingObjective.builder()
+                .withSelector(sBuilder.build())
+                .withTreatment(tBuilder.build())
+                .withFlag(ForwardingObjective.Flag.SPECIFIC)
+                .withPriority(ROUTING_RULE_PRIORITY)
+                .fromApp(appId)
+                .add();
+
+        flowObjectiveService.forward(d.id(), fo);
+    }
+
+    private Ip4Address getIPAddressforDevice(Device device) {
+        return Ip4Address.valueOf(device.annotations().value("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];
+    }
+
+    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));
+    }
+
+    private long getVni(OpenstackPort openstackPort) {
+        return Long.parseLong(openstackService.network(openstackPort.networkId()).segmentId());
+    }
+
+    public void removeExternalRules(OpenstackRouterInterface routerInterface) {
+        OpenstackPort openstackPort = openstackService.port(routerInterface.portId());
+        TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+        sBuilder.matchEthType(Ethernet.TYPE_IPV4)
+                .matchTunnelId(getVni(openstackPort))
+                .matchEthDst(GATEWAYMAC);
+
+        StreamSupport.stream(deviceService.getAvailableDevices().spliterator(), false)
+                .forEach(d -> {
+                    if (checkGatewayNode(d.id())) {
+                        removeExternalRule(d.id(), sBuilder, ForwardingObjective.Flag.VERSATILE);
+                    } else {
+                        removeExternalRule(d.id(), sBuilder, ForwardingObjective.Flag.SPECIFIC);
+                    }
+                });
+
+    }
+
+    private void removeExternalRule(DeviceId id, TrafficSelector.Builder sBuilder, ForwardingObjective.Flag flag) {
+        TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+
+        ForwardingObjective fo = DefaultForwardingObjective.builder()
+                .withSelector(sBuilder.build())
+                .withTreatment(tBuilder.build())
+                .withFlag(flag)
+                .withPriority(ROUTING_RULE_PRIORITY)
+                .fromApp(appId)
+                .remove();
+
+        flowObjectiveService.forward(id, fo);
+    }
+
+}
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/package-info.java
similarity index 80%
copy from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java
copy to apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/package-info.java
index 91e19c6..9592065 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Open Networking Laboratory
+ * 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.
@@ -15,6 +15,6 @@
  */
 
 /**
- * OpenStack switching REST API.
+ * Application for OpenstackRouting.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.routing;
\ No newline at end of file
diff --git a/apps/openstackswitching/network-cfg.json b/apps/openstacknetworking/openstackswitching/network-cfg.json
similarity index 100%
rename from apps/openstackswitching/network-cfg.json
rename to apps/openstacknetworking/openstackswitching/network-cfg.json
diff --git a/apps/openstacknetworking/openstackswitching/pom.xml b/apps/openstacknetworking/openstackswitching/pom.xml
new file mode 100644
index 0000000..b5b6d65
--- /dev/null
+++ b/apps/openstacknetworking/openstackswitching/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2015-2016 Open Networking Laboratory
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-app-openstacknetworking</artifactId>
+        <version>1.5.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-app-openstackswitching</artifactId>
+    <packaging>bundle</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-openstacknetworking-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-dhcp</artifactId>
+            <version>1.5.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-dhcp-api</artifactId>
+            <version>1.5.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-rest</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-rest</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-misc</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+
+</project>
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackArpHandler.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackArpHandler.java
similarity index 89%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackArpHandler.java
rename to apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackArpHandler.java
index 7fb489a..415b6d2 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackArpHandler.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackArpHandler.java
@@ -13,7 +13,7 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking.switching;
 
 import org.onlab.packet.ARP;
 import org.onlab.packet.Ethernet;
@@ -27,8 +27,9 @@
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.InboundPacket;
 import org.onosproject.net.packet.PacketService;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackPortInfo;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackPortInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import java.nio.ByteBuffer;
@@ -45,19 +46,19 @@
             .getLogger(OpenstackArpHandler.class);
     private static final MacAddress GATEWAY_MAC = MacAddress.valueOf("1f:1f:1f:1f:1f:1f");
     private PacketService packetService;
-    private OpenstackRestHandler restHandler;
+    private OpenstackNetworkingService openstackService;
     private HostService hostService;
 
     /**
      * Returns OpenstackArpHandler reference.
      *
-     * @param restHandler rest API handler reference
+     * @param openstackService OpenstackNetworkingService reference
      * @param packetService PacketService reference
      * @param hostService host service
      */
-    public OpenstackArpHandler(OpenstackRestHandler restHandler, PacketService packetService,
+    public OpenstackArpHandler(OpenstackNetworkingService openstackService, PacketService packetService,
                                HostService hostService) {
-        this.restHandler = checkNotNull(restHandler);
+        this.openstackService = openstackService;
         this.packetService = packetService;
         this.hostService = hostService;
     }
@@ -123,7 +124,7 @@
     private MacAddress getMacFromOpenstack(IpAddress targetIp) {
         checkNotNull(targetIp);
 
-        OpenstackPort openstackPort = restHandler.getPorts()
+        OpenstackPort openstackPort = openstackService.ports()
                 .stream()
                 .filter(port -> port.fixedIps().containsValue(targetIp))
                 .findFirst()
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingManager.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
similarity index 73%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingManager.java
rename to apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
index 572e204..52b0436 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingManager.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
@@ -13,8 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking.switching;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -50,29 +51,26 @@
 import org.onosproject.net.packet.PacketContext;
 import org.onosproject.net.packet.PacketProcessor;
 import org.onosproject.net.packet.PacketService;
-import org.onosproject.openstackrouting.OpenstackRouter;
-import org.onosproject.openstackrouting.OpenstackRouterInterface;
-import org.onosproject.openstackrouting.OpenstackRoutingService;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackPortInfo;
-import org.onosproject.openstackswitching.OpenstackSubnet;
-import org.onosproject.openstackswitching.OpenstackSwitchingService;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackNetworkingConfig;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackPortInfo;
+import org.onosproject.openstacknetworking.OpenstackSecurityGroup;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
+import org.onosproject.openstacknetworking.OpenstackSwitchingService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import java.util.List;
 import java.util.Collection;
 import java.util.Map;
-import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.stream.Collectors;
 
 import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
 import static org.onlab.util.Tools.groupedThreads;
 
-@SuppressWarnings("ALL")
 @Service
 @Component(immediate = true)
 /**
@@ -80,8 +78,8 @@
  */
 public class OpenstackSwitchingManager implements OpenstackSwitchingService {
 
-    private static Logger log = LoggerFactory
-            .getLogger(OpenstackSwitchingManager.class);
+    private final Logger log = LoggerFactory
+            .getLogger(getClass());
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CoreService coreService;
@@ -108,7 +106,7 @@
     protected DriverService driverService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected OpenstackRoutingService openstackRoutingService;
+    protected OpenstackNetworkingService openstackService;
 
     public static final String PORTNAME_PREFIX_VM = "tap";
     public static final String PORTNAME_PREFIX_ROUTER = "qr-";
@@ -125,7 +123,6 @@
     private String password;
     private String physicalRouterMac;
     private OpenstackArpHandler arpHandler;
-    private OpenstackRestHandler restHandler;
 
     private ExecutorService deviceEventExcutorService =
             Executors.newSingleThreadExecutor(groupedThreads("onos/openstackswitching", "device-event"));
@@ -136,17 +133,20 @@
     private InternalDeviceListener internalDeviceListener = new InternalDeviceListener();
     private InternalConfigListener internalConfigListener = new InternalConfigListener();
     private InternalHostListener internalHostListener = new InternalHostListener();
+
+
     private final Set<ConfigFactory> factories = ImmutableSet.of(
-            new ConfigFactory<ApplicationId, OpenstackSwitchingConfig>(APP_SUBJECT_FACTORY,
-                    OpenstackSwitchingConfig.class,
+            new ConfigFactory<ApplicationId, OpenstackNetworkingConfig>(APP_SUBJECT_FACTORY,
+                    OpenstackNetworkingConfig.class,
                     "openstackswitching") {
                 @Override
-                public OpenstackSwitchingConfig createConfig() {
-                    return new OpenstackSwitchingConfig();
+                public OpenstackNetworkingConfig createConfig() {
+                    return new OpenstackNetworkingConfig();
                 }
             }
     );
 
+
     private Map<String, OpenstackPortInfo> openstackPortInfoMap = Maps.newHashMap();
 
     @Activate
@@ -189,14 +189,14 @@
 
         if (!openstackPort.securityGroups().isEmpty()) {
             openstackPort.securityGroups().forEach(sgId -> {
-                OpenstackSecurityGroup sg = restHandler.getSecurityGroup(sgId);
+                OpenstackSecurityGroup sg = openstackService.getSecurityGroup(sgId);
                 log.debug("SecurityGroup : {}", sg.toString());
             });
         }
     }
 
     @Override
-    public void deletePort(String uuid) {
+    public void removePort(String uuid) {
         // When VMs are remvoed, the flow rules for the VMs are removed using ONOS port update event.
         // But, when router is removed, no ONOS port event occurs and we need to use Neutron port event.
         // Here we should not touch any rules for VMs.
@@ -212,7 +212,7 @@
                     if (pName.equals(routerPortName)) {
                         OpenstackSwitchingRulePopulator rulePopulator =
                                 new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
-                                        deviceService, restHandler, driverService);
+                                        deviceService, openstackService, driverService);
 
                         rulePopulator.removeSwitchingRules(doNotPushFlows, port, openstackPortInfoMap);
                         openstackPortInfoMap.remove(routerPortName);
@@ -236,125 +236,8 @@
     }
 
     @Override
-    public Collection<OpenstackPort> ports(String networkId) {
-        Collection<OpenstackPort> ports = restHandler.getPorts();
-        List<OpenstackPort> portList = ports.stream()
-                .filter(p -> p.networkId().equals(networkId))
-                .collect(Collectors.toList());
-
-        return portList;
-    }
-
-    @Override
-    public Collection<OpenstackPort> ports() {
-        return restHandler.getPorts();
-    }
-
-    @Override
-    public OpenstackPort port(Port port) {
-        Collection<OpenstackPort> ports = restHandler.getPorts();
-        String uuid = port.annotations().value(PORTNAME).substring(3);
-        return ports.stream()
-                .filter(p -> p.id().startsWith(uuid))
-                .findFirst().orElse(null);
-    }
-
-    @Override
-    public OpenstackPort port(String portId) {
-        Collection<OpenstackPort> ports = restHandler.getPorts();
-        return ports.stream()
-                .filter(p -> p.id().equals(portId))
-                .findFirst().orElse(null);
-    }
-
-    @Override
-    public OpenstackNetwork network(String networkId) {
-        try {
-            Collection<OpenstackSubnet> subnets = restHandler.getSubnets().stream()
-                    .filter(s -> s.networkId().equals(networkId))
-                    .collect(Collectors.toList());
-
-            Collection<OpenstackNetwork> networks = restHandler.getNetworks();
-            OpenstackNetwork openstackNetwork = networks.stream()
-                    .filter(n -> n.id().equals(networkId))
-                    .findFirst().get();
-
-            return OpenstackNetwork.builder()
-                    .id(openstackNetwork.id())
-                    .name(openstackNetwork.name())
-                    .networkType(openstackNetwork.networkType())
-                    .segmentId(openstackNetwork.segmentId())
-                    .tenantId(openstackNetwork.tenantId())
-                    .subnets(subnets)
-                    .build();
-        } catch (NoSuchElementException e) {
-            log.warn("There is no network infor for net ID {}", networkId);
-            return null;
-        }
-    }
-
-    @Override
-    public OpenstackSubnet subnet(String subnetId) {
-        Collection<OpenstackSubnet> subnets = restHandler.getSubnets();
-        try {
-            return subnets.stream()
-                    .filter(s -> s.id().equals(subnetId))
-                    .findFirst().get();
-        } catch (NoSuchElementException e) {
-            log.warn("There is no subnet info for subnet ID {}", subnetId);
-            return null;
-        }
-    }
-
-    @Override
-    public void createRouter(OpenstackRouter openstackRouter) {
-        openstackRoutingService.createRouter(openstackRouter);
-    }
-    @Override
-    public void updateRouter(String routerId) {
-        openstackRoutingService.updateRouter(router(routerId));
-    }
-
-    @Override
-    public void removeRouterInterface(OpenstackRouterInterface openstackRouterInterface) {
-        openstackRoutingService.removeRouterInterface(openstackRouterInterface);
-    }
-    @Override
-    public void deleteRouter(String id) {
-        openstackRoutingService.deleteRouter(id);
-    }
-
-    @Override
-    public void updateRouterInterface(OpenstackRouterInterface openstackRouterInterface) {
-        openstackRoutingService.updateRouterInterface(openstackRouterInterface);
-    }
-
-    @Override
-    public OpenstackRouter router(String routerId) {
-        Collection<OpenstackRouter> openstackRouters = restHandler.getRouters();
-        try {
-            return openstackRouters.stream()
-                    .filter(r -> r.id().equals(routerId))
-                    .findAny().get();
-        } catch (NoSuchElementException e) {
-            log.warn("There is no router info for subnet ID {}", routerId);
-            return null;
-        }
-    }
-
-    @Override
-    public Collection<OpenstackRouter> routers() {
-        return restHandler.getRouters();
-    }
-
-    @Override
-    public Collection<OpenstackPortInfo> portInfos() {
-        return openstackPortInfoMap.values();
-    }
-
-    @Override
-    public String physicalRouterMac() {
-        return physicalRouterMac;
+    public Map<String, OpenstackPortInfo> openstackPortInfo() {
+        return ImmutableMap.copyOf(this.openstackPortInfoMap);
     }
 
     private void processDeviceAdded(Device device) {
@@ -366,10 +249,10 @@
             if (port.isEnabled() || port.annotations().value(PORTNAME).startsWith(PORTNAME_PREFIX_ROUTER)) {
                 OpenstackSwitchingRulePopulator rulePopulator =
                         new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
-                                deviceService, restHandler, driverService);
+                                deviceService, openstackService, driverService);
 
                 rulePopulator.populateSwitchingRules(doNotPushFlows, device, port);
-                updatePortMap(device.id(), port, restHandler.getNetworks(), restHandler.getSubnets(),
+                updatePortMap(device.id(), port, openstackService.networks(), openstackService.subnets(),
                         rulePopulator.openstackPort(port));
 
                 //In case portupdate event is driven by vm shutoff from openstack
@@ -377,7 +260,7 @@
                 log.debug("Flowrules according to the port {} were removed", port.number().toString());
                 OpenstackSwitchingRulePopulator rulePopulator =
                         new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
-                                deviceService, restHandler, driverService);
+                                deviceService, openstackService, driverService);
 
                 rulePopulator.removeSwitchingRules(doNotPushFlows, port, openstackPortInfoMap);
                 dhcpService.removeStaticMapping(openstackPortInfoMap.get(port.annotations().value(PORTNAME)).mac());
@@ -393,10 +276,10 @@
     private void initializeFlowRules() {
         OpenstackSwitchingRulePopulator rulePopulator =
                 new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
-                        deviceService, restHandler, driverService);
+                        deviceService, openstackService, driverService);
 
-        Collection<OpenstackNetwork> networks = restHandler.getNetworks();
-        Collection<OpenstackSubnet> subnets = restHandler.getSubnets();
+        Collection<OpenstackNetwork> networks = openstackService.networks();
+        Collection<OpenstackSubnet> subnets = openstackService.subnets();
 
         deviceService.getDevices().forEach(device -> {
                     log.debug("device {} num of ports {} ", device.id(),
@@ -458,7 +341,7 @@
 
         ip4Address = (Ip4Address) openstackPort.fixedIps().values().stream().findFirst().orElse(null);
 
-        openstackSubnet = restHandler.getSubnets().stream()
+        openstackSubnet = openstackService.subnets().stream()
                 .filter(n -> n.networkId().equals(openstackPort.networkId()))
                 .findFirst().get();
 
@@ -579,16 +462,18 @@
     private class InternalConfigListener implements NetworkConfigListener {
 
         public void configureNetwork() {
-            OpenstackSwitchingConfig cfg =
-                    cfgService.getConfig(appId, OpenstackSwitchingConfig.class);
+            OpenstackNetworkingConfig cfg =
+                    cfgService.getConfig(appId, OpenstackNetworkingConfig.class);
             if (cfg == null) {
                 log.error("There is no openstack server information in config.");
                 return;
             }
+
             doNotPushFlows = cfg.doNotPushFlows();
             physicalRouterMac = cfg.physicalRouterMac();
-            restHandler = new OpenstackRestHandler(cfg);
-            arpHandler = new OpenstackArpHandler(restHandler, packetService, hostService);
+            openstackService.setConfigurations(cfg.neutronServer(), cfg.keystoneServer(),
+                    cfg.userName(), cfg.password());
+            arpHandler = new OpenstackArpHandler(openstackService, packetService, hostService);
             initializeFlowRules();
         }
 
@@ -596,8 +481,10 @@
         public void event(NetworkConfigEvent event) {
             if (((event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
             event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)) &&
-                    event.configClass().equals(OpenstackSwitchingConfig.class)) {
-               networkEventExcutorService.execute(this::configureNetwork);
+                    event.configClass().equals(OpenstackNetworkingConfig.class)) {
+
+                log.info("Network configuration changed");
+                networkEventExcutorService.execute(this::configureNetwork);
             }
         }
     }
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingRulePopulator.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingRulePopulator.java
similarity index 96%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingRulePopulator.java
rename to apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingRulePopulator.java
index 0ebfe19..258b24c 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingRulePopulator.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingRulePopulator.java
@@ -14,7 +14,7 @@
 * limitations under the License.
 */
 
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking.switching;
 
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.Ip4Address;
@@ -40,9 +40,10 @@
 import org.onosproject.net.flowobjective.DefaultForwardingObjective;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
 import org.onosproject.net.flowobjective.ForwardingObjective;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackPortInfo;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackPortInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,7 +64,6 @@
     private FlowObjectiveService flowObjectiveService;
     private DriverService driverService;
     private DeviceService deviceService;
-    private OpenstackRestHandler restHandler;
     private ApplicationId appId;
 
     private Collection<OpenstackNetwork> openstackNetworkList;
@@ -75,22 +75,20 @@
      * @param appId application id
      * @param flowObjectiveService FlowObjectiveService reference
      * @param deviceService DeviceService reference
-     * @param restHandler OpenstackRestHandler reference
      * @param driverService DriverService reference
      */
     public OpenstackSwitchingRulePopulator(ApplicationId appId,
                                            FlowObjectiveService flowObjectiveService,
                                            DeviceService deviceService,
-                                           OpenstackRestHandler restHandler,
+                                           OpenstackNetworkingService openstackService,
                                            DriverService driverService) {
         this.flowObjectiveService = flowObjectiveService;
         this.deviceService = deviceService;
         this.driverService = driverService;
-        this.restHandler = restHandler;
         this.appId = appId;
 
-        openstackNetworkList = restHandler.getNetworks();
-        openstackPortList = restHandler.getPorts();
+        openstackNetworkList = openstackService.networks();
+        openstackPortList = openstackService.ports();
     }
 
 
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/package-info.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/package-info.java
similarity index 91%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/package-info.java
rename to apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/package-info.java
index 77a322d..6dc1996 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/package-info.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/package-info.java
@@ -17,4 +17,4 @@
 /**
  * OpenStack switch implementation.
  */
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking.switching;
diff --git a/apps/openstacknetworking/pom.xml b/apps/openstacknetworking/pom.xml
new file mode 100644
index 0000000..cdf3a1c
--- /dev/null
+++ b/apps/openstacknetworking/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2016 Open Networking Laboratory
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-apps</artifactId>
+        <version>1.5.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-app-openstacknetworking</artifactId>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>app</module>
+        <module>web</module>
+        <module>api</module>
+        <module>openstackswitching</module>
+        <module>openstackrouting</module>
+    </modules>
+
+
+    <description>SONA Openstack Networking XXXX Application</description>
+
+    <dependencies>
+    </dependencies>
+</project>
diff --git a/apps/openstackswitching/app/features.xml b/apps/openstacknetworking/web/features.xml
similarity index 69%
copy from apps/openstackswitching/app/features.xml
copy to apps/openstacknetworking/web/features.xml
index a4e2639..5aa4f15 100644
--- a/apps/openstackswitching/app/features.xml
+++ b/apps/openstacknetworking/web/features.xml
@@ -18,11 +18,8 @@
     <feature name="${project.artifactId}" version="${project.version}"
              description="${project.description}">
         <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-app-openstackswitching-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-app-openstackswitching/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-app-dhcp-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-app-dhcp/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-app-openstackrouting/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-openstacknetworking-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-openstacknetworking-web/${project.version}</bundle>
         <bundle>mvn:com.sun.jersey/jersey-client/1.19</bundle>
     </feature>
 </features>
diff --git a/apps/openstackswitching/app/pom.xml b/apps/openstacknetworking/web/pom.xml
similarity index 90%
rename from apps/openstackswitching/app/pom.xml
rename to apps/openstacknetworking/web/pom.xml
index fadcec4..3db71f6 100644
--- a/apps/openstackswitching/app/pom.xml
+++ b/apps/openstacknetworking/web/pom.xml
@@ -21,31 +21,28 @@
 
     <parent>
         <groupId>org.onosproject</groupId>
-        <artifactId>onos-openstackswitching</artifactId>
+        <artifactId>onos-app-openstacknetworking</artifactId>
         <version>1.5.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>onos-app-openstackswitching</artifactId>
+    <artifactId>onos-app-openstacknetworking-web</artifactId>
     <packaging>bundle</packaging>
 
-    <description>SONA Openstack Switching  applications</description>
     <properties>
         <web.context>/onos/openstackswitching</web.context>
         <api.version>1.0.0</api.version>
-        <api.title>ONOS OpenStack Switching REST API</api.title>
+        <api.title>ONOS Openstack Networking REST API</api.title>
         <api.description>
-            APIs for receiving Neutron information.
+            APIs for interacting with Openstack Neutron Plugin.
         </api.description>
-        <api.package>org.onosproject.openstackswitching.web</api.package>
-        <onos.app.origin>SKT, Inc.</onos.app.origin>
+        <api.package>org.onosproject.openstacknetworking.web</api.package>
     </properties>
 
-
     <dependencies>
         <dependency>
             <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-openstackswitching-api</artifactId>
+            <artifactId>onos-app-openstacknetworking-api</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpensatckRouterWebResource.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpensatckRouterWebResource.java
similarity index 77%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpensatckRouterWebResource.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpensatckRouterWebResource.java
index aa9dfe4..d7d6b6d 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpensatckRouterWebResource.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpensatckRouterWebResource.java
@@ -13,13 +13,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.openstackrouting.OpenstackRouter;
-import org.onosproject.openstackrouting.OpenstackRouterInterface;
-import org.onosproject.openstackswitching.OpenstackSwitchingService;
+import org.onosproject.openstacknetworking.OpenstackRouter;
+import org.onosproject.openstacknetworking.OpenstackRouterInterface;
+import org.onosproject.openstacknetworking.OpenstackRoutingService;
 import org.onosproject.rest.AbstractWebResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,8 +42,7 @@
 
 @Path("routers")
 public class OpensatckRouterWebResource extends AbstractWebResource {
-    protected static final Logger log = LoggerFactory
-            .getLogger(OpenstackNetworkWebResource.class);
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final OpenstackRouterInterfaceCodec ROUTER_INTERFACE_CODEC
             = new OpenstackRouterInterfaceCodec();
@@ -62,9 +61,9 @@
             OpenstackRouter openstackRouter
                     = ROUTER_CODEC.decode(routerNode, this);
 
-            OpenstackSwitchingService switchingService
-                    = getService(OpenstackSwitchingService.class);
-            switchingService.createRouter(openstackRouter);
+            OpenstackRoutingService routingService
+                    = getService(OpenstackRoutingService.class);
+            routingService.createRouter(openstackRouter);
 
             log.debug("REST API CREATE router is called {}", input.toString());
             return Response.status(Response.Status.OK).build();
@@ -80,14 +79,20 @@
     @Path("{id}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    public Response updateRouter(@PathParam("id") String id) {
-        checkNotNull(id);
+    public Response updateRouter(InputStream input) {
+        checkNotNull(input);
         try {
-            OpenstackSwitchingService switchingService
-                    = getService(OpenstackSwitchingService.class);
-            switchingService.updateRouter(id);
+            ObjectMapper mapper = new ObjectMapper();
+            ObjectNode routerNode = (ObjectNode) mapper.readTree(input);
 
-            log.debug("REST API UPDATE router is called from router {}", id);
+            OpenstackRouter openstackRouter
+                    = ROUTER_CODEC.decode(routerNode, this);
+
+            OpenstackRoutingService routingService
+                    = getService(OpenstackRoutingService.class);
+            routingService.updateRouter(openstackRouter);
+
+            log.debug("REST API UPDATE router is called from router {}", input.toString());
             return Response.status(Response.Status.OK).build();
         } catch (Exception e) {
             log.error("Updates Router failed because of exception {}",
@@ -110,9 +115,9 @@
             OpenstackRouterInterface openstackRouterInterface
                     = ROUTER_INTERFACE_CODEC.decode(routerIfNode, this);
 
-            OpenstackSwitchingService switchingService
-                    = getService(OpenstackSwitchingService.class);
-            switchingService.updateRouterInterface(openstackRouterInterface);
+            OpenstackRoutingService routingService
+                    = getService(OpenstackRoutingService.class);
+            routingService.updateRouterInterface(openstackRouterInterface);
 
             log.debug("REST API AddRouterInterface is called from router {} portId: {}, subnetId: {}, tenantId: {}",
                     openstackRouterInterface.id(), openstackRouterInterface.portId(),
@@ -129,11 +134,12 @@
 
     @DELETE
     @Path("{id}")
+    @Produces(MediaType.APPLICATION_JSON)
     public Response deleteRouter(@PathParam("id") String id) {
         checkNotNull(id);
-        OpenstackSwitchingService switchingService =
-                getService(OpenstackSwitchingService.class);
-        switchingService.deleteRouter(id);
+        OpenstackRoutingService routingService
+                = getService(OpenstackRoutingService.class);
+        routingService.deleteRouter(id);
 
         log.debug("REST API DELETE routers is called {}", id);
         return Response.status(Response.Status.OK).build();
@@ -153,9 +159,9 @@
             OpenstackRouterInterface openstackRouterInterface
                     = ROUTER_INTERFACE_CODEC.decode(routerIfNode, this);
 
-            OpenstackSwitchingService switchingService
-                    = getService(OpenstackSwitchingService.class);
-            switchingService.removeRouterInterface(openstackRouterInterface);
+            OpenstackRoutingService routingService
+                    = getService(OpenstackRoutingService.class);
+            routingService.removeRouterInterface(openstackRouterInterface);
 
             log.debug("REST API RemoveRouterInterface is called from router {} portId: {}, subnetId: {}," +
                     "tenantId: {}", openstackRouterInterface.id(), openstackRouterInterface.portId(),
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkCodec.java
similarity index 91%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkCodec.java
index 9203321..8e5d3af 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkCodec.java
@@ -13,13 +13,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackswitching.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -29,8 +29,7 @@
  */
 public class OpenstackNetworkCodec extends JsonCodec<OpenstackNetwork> {
 
-    protected static final Logger log = LoggerFactory
-            .getLogger(OpenstackNetworkCodec.class);
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final String NETWORK = "network";
     private static final String NAME = "name";
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkWebResource.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResource.java
similarity index 92%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkWebResource.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResource.java
index bf04cc4..5555266 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkWebResource.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResource.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
 
 import org.onosproject.rest.AbstractWebResource;
 import org.slf4j.Logger;
@@ -35,8 +35,7 @@
 @Path("networks")
 public class OpenstackNetworkWebResource extends AbstractWebResource {
 
-    protected static final Logger log = LoggerFactory
-            .getLogger(OpenstackNetworkWebResource.class);
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackRestHandler.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkingManager.java
similarity index 67%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackRestHandler.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkingManager.java
index ad8328e..093d0c1 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackRestHandler.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkingManager.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking.web;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -21,21 +21,32 @@
 import com.google.common.collect.Lists;
 import com.sun.jersey.api.client.Client;
 import com.sun.jersey.api.client.WebResource;
-import org.onosproject.openstackrouting.OpenstackRouter;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackSubnet;
-import org.onosproject.openstackswitching.web.OpenstackNetworkCodec;
-import org.onosproject.openstackswitching.web.OpenstackPortCodec;
-import org.onosproject.openstackswitching.web.OpenstackSecurityGroupCodec;
-import org.onosproject.openstackswitching.web.OpenstackRouterCodec;
-import org.onosproject.openstackswitching.web.OpenstackSubnetCodec;
+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.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.Port;
+import org.onosproject.net.driver.DriverService;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackPortInfo;
+import org.onosproject.openstacknetworking.OpenstackRouter;
+import org.onosproject.openstacknetworking.OpenstackSecurityGroup;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
+import org.onosproject.openstacknetworking.OpenstackSwitchingService;
 import org.slf4j.Logger;
 import javax.ws.rs.core.MediaType;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.net.MediaType.JSON_UTF_8;
@@ -45,7 +56,9 @@
  * Handles REST Calls to Openstack Neutron.
  *
  */
-public class OpenstackRestHandler {
+@Service
+@Component(immediate = true)
+public class OpenstackNetworkingManager implements OpenstackNetworkingService {
 
     private static final String URI_NETWORKS = "networks";
     private static final String URI_PORTS = "ports";
@@ -70,16 +83,29 @@
     private String userName;
     private String pass;
 
-    /**
-     * Creates OpenstackRestHandler instance.
-     *
-     * @param cfg OpenstackSwitchingConfig reference
-     */
-    public OpenstackRestHandler(OpenstackSwitchingConfig cfg) {
-        this.neutronUrl = checkNotNull(cfg.neutronServer());
-        this.keystoneUrl = checkNotNull(cfg.keystoneServer());
-        this.userName = checkNotNull(cfg.userName());
-        this.pass = checkNotNull(cfg.password());
+    private static final String PORT_NAME = "portName";
+
+    private ApplicationId appId;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DriverService driverService;
+
+    protected OpenstackSwitchingService openstackSwitchingService;
+
+    @Activate
+    protected void activate() {
+        appId = coreService
+                .registerApplication("org.onosproject.openstacknetworking");
+
+        log.info("started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        log.info("stopped");
     }
 
     /**
@@ -249,4 +275,79 @@
         return true;
     }
 
-}
+    @Override
+    public Collection<OpenstackPort> ports(String networkId) {
+        return getPorts().stream()
+                .filter(port -> port.networkId().equals(networkId))
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public Collection<OpenstackPort> ports() {
+        return getPorts();
+    }
+
+    @Override
+    public OpenstackPort port(Port port) {
+        String uuid = port.annotations().value(PORT_NAME).substring(3);
+        return getPorts().stream()
+                .filter(p -> p.id().startsWith(uuid))
+                .findAny().orElse(null);
+    }
+
+    @Override
+    public OpenstackPort port(String portId) {
+        return getPorts().stream()
+                .filter(p -> p.id().equals(portId))
+                .findAny().orElse(null);
+    }
+
+    @Override
+    public OpenstackNetwork network(String networkId) {
+        return getNetworks().stream()
+                .filter(n -> n.id().equals(networkId))
+                .findAny().orElse(null);
+    }
+
+    @Override
+    public Collection<OpenstackNetwork> networks() {
+        return getNetworks();
+    }
+
+    @Override
+    public OpenstackSubnet subnet(String subnetId) {
+        return getSubnets().stream()
+                .filter(subnet -> subnet.id().equals(subnetId))
+                .findAny().orElse(null);
+    }
+
+    @Override
+    public Collection<OpenstackSubnet> subnets() {
+        return getSubnets();
+    }
+
+    @Override
+    public Collection<OpenstackRouter> routers() {
+        return getRouters();
+    }
+
+    @Override
+    public OpenstackRouter router(String routerId) {
+        return getRouters().stream()
+                .filter(router -> router.id().equals(routerId))
+                .findAny().orElse(null);
+    }
+
+    @Override
+    public Map<String, OpenstackPortInfo> openstackPortInfo() {
+        return openstackSwitchingService.openstackPortInfo();
+    }
+
+    @Override
+    public void setConfigurations(String neutronUrl, String keystoneUrl, String userName, String pass) {
+        this.neutronUrl = checkNotNull(neutronUrl);
+        this.keystoneUrl = checkNotNull(keystoneUrl);
+        this.userName = checkNotNull(userName);
+        this.pass = checkNotNull(pass);
+    }
+}
\ No newline at end of file
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortCodec.java
similarity index 94%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortCodec.java
index b29b389..1ac3127 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortCodec.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -25,7 +25,7 @@
 import org.onlab.packet.MacAddress;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackswitching.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackPort;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,13 +33,14 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * Encodes and decodes the OpenstackPort.
  */
 public class OpenstackPortCodec extends JsonCodec<OpenstackPort> {
 
-    private static Logger log = LoggerFactory
-            .getLogger(OpenstackPortCodec.class);
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     // JSON field names
     private static final String PORT = "port";
@@ -62,6 +63,7 @@
     @Override
     public OpenstackPort decode(ObjectNode json, CodecContext context) {
 
+        checkNotNull(json);
         HashMap<String, Ip4Address> fixedIpMap = new HashMap<>();
         JsonNode portInfo = json.get(PORT);
         if (portInfo == null) {
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortWebResource.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
similarity index 89%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortWebResource.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
index 206e4b1..a60d81a 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortWebResource.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
@@ -13,12 +13,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackSwitchingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackSwitchingService;
 import org.onosproject.rest.AbstractWebResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,8 +40,7 @@
 @Path("ports")
 public class OpenstackPortWebResource extends AbstractWebResource {
 
-    protected static final Logger log = LoggerFactory
-            .getLogger(OpenstackPortWebResource.class);
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final OpenstackPortCodec PORT_CODEC = new OpenstackPortCodec();
 
@@ -70,11 +69,12 @@
     }
 
     @Path("{portUUID}")
+    @Produces(MediaType.APPLICATION_JSON)
     @DELETE
     public Response deletePorts(@PathParam("portUUID") String id) {
         OpenstackSwitchingService switchingService =
                 getService(OpenstackSwitchingService.class);
-        switchingService.deletePort(id);
+        switchingService.removePort(id);
         return Response.status(Response.Status.OK).build();
     }
 
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterCodec.java
similarity index 91%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterCodec.java
index afcf560..60600bf 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterCodec.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -22,8 +22,8 @@
 import org.onlab.packet.Ip4Address;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackrouting.OpenstackExternalGateway;
-import org.onosproject.openstackrouting.OpenstackRouter;
+import org.onosproject.openstacknetworking.OpenstackExternalGateway;
+import org.onosproject.openstacknetworking.OpenstackRouter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -33,8 +33,7 @@
  * Implementation of the OpenstackRouter Codec.
  */
 public class OpenstackRouterCodec extends JsonCodec<OpenstackRouter> {
-    protected static final Logger log = LoggerFactory
-            .getLogger(OpenstackNetworkCodec.class);
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final String ROUTER = "router";
     private static final String TENANT_ID = "tenant_id";
@@ -72,7 +71,7 @@
         String status = checkNotNull(routerInfo.path(STATUS).asText());
         String adminStateUp = checkNotNull(routerInfo.path(ADMIN_STATE_UP).asText());
 
-        OpenstackExternalGateway.Builder osExtBuiler = OpenstackExternalGateway.builder();
+        OpenstackExternalGateway.Builder osExtBuiler = new OpenstackExternalGateway.Builder();
 
         if (!routerInfo.path(EXTERNAL_GW_INFO).isMissingNode()) {
             String externalGatewayNetId = checkNotNull(routerInfo.path(EXTERNAL_GW_INFO).path(NETWORK_ID).asText());
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterInterfaceCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterInterfaceCodec.java
similarity index 90%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterInterfaceCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterInterfaceCodec.java
index 88de443..5be664f 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterInterfaceCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterInterfaceCodec.java
@@ -13,13 +13,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackrouting.OpenstackRouterInterface;
+import org.onosproject.openstacknetworking.OpenstackRouterInterface;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -27,8 +27,7 @@
  * Implementation of the OpenstackRouterInterface Codec.
  */
 public class OpenstackRouterInterfaceCodec extends JsonCodec<OpenstackRouterInterface> {
-    protected static final Logger log = LoggerFactory
-            .getLogger(OpenstackNetworkCodec.class);
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final String ID = "id";
     private static final String TENANT_ID = "tenant_id";
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSecurityGroupCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSecurityGroupCodec.java
similarity index 91%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSecurityGroupCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSecurityGroupCodec.java
index ae9847e..c9519a7 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSecurityGroupCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSecurityGroupCodec.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -21,8 +21,8 @@
 import com.google.common.collect.Lists;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackswitching.impl.OpenstackSecurityGroup;
-import org.onosproject.openstackswitching.impl.OpenstackSecurityGroupRule;
+import org.onosproject.openstacknetworking.OpenstackSecurityGroup;
+import org.onosproject.openstacknetworking.OpenstackSecurityGroupRule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,8 +33,7 @@
  */
 public class OpenstackSecurityGroupCodec extends JsonCodec<OpenstackSecurityGroup> {
 
-    private static Logger log = LoggerFactory
-            .getLogger(OpenstackSecurityGroupCodec.class);
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final String SECURITY_GROUP = "security_group";
     private static final String DESCRIPTION = "description";
@@ -66,7 +65,7 @@
         Collection<OpenstackSecurityGroupRule> rules = Lists.newArrayList();
         for (JsonNode ruleInfo: ruleInfoList) {
             OpenstackSecurityGroupRule openstackSecurityGroupRule =
-                    OpenstackSecurityGroupRule.builder()
+                    new OpenstackSecurityGroupRule.Builder()
                         .direction(ruleInfo.path(DIRECTION).asText())
                         .etherType(ruleInfo.path(EHTERTYPE).asText())
                         .id(ruleInfo.path(ID).asText())
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetCodec.java
similarity index 91%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetCodec.java
index 2a7af82..4bcb494 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetCodec.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
 
 import com.fasterxml.jackson.databind.JsonNode;
 
@@ -24,18 +24,19 @@
 import org.onlab.packet.Ip4Address;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackswitching.OpenstackSubnet;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.List;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * Encodes and decodes the OpenstackSubnet.
  */
 public class OpenstackSubnetCodec extends JsonCodec<OpenstackSubnet> {
-    private static Logger log = LoggerFactory
-            .getLogger(OpenstackSubnetCodec.class);
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     // JSON Field names
     private static final String SUBNET = "subnet";
@@ -50,6 +51,7 @@
 
     @Override
     public OpenstackSubnet decode(ObjectNode json, CodecContext context) {
+        checkNotNull(json);
         JsonNode subnetInfo = json.get(SUBNET);
         if (subnetInfo == null) {
             subnetInfo = json;
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetWebResource.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetWebResource.java
similarity index 84%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetWebResource.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetWebResource.java
index 43205ea..1b8f47e 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetWebResource.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetWebResource.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
 
 /**
  * Handles Rest API call from Neutron ML2 plugin.
@@ -47,21 +47,18 @@
 
 
     @PUT
-    @Path("{subnetUUID}")
+    @Path("{subnetId}")
     @Produces(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateSubnet(@PathParam("id") String id,
+    public Response updateSubnet(@PathParam("subnetId") String id,
                                  final InputStream input) {
         return Response.status(Response.Status.OK).build();
-
     }
 
     @DELETE
-    @Path("{subnetUUID}")
+    @Path("{subnetId}")
     @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response deleteSubnet(@PathParam("id") String id,
-                                 final InputStream input) {
+    public Response deleteSubnet(@PathParam("subnetId") String id) {
         return Response.status(Response.Status.OK).build();
     }
 
diff --git a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/package-info.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/package-info.java
similarity index 87%
rename from apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/package-info.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/package-info.java
index ff21937..987a22e 100644
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/package-info.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * OpenStack switch API.
+ * OpenStack networking implementation.
  */
-package org.onosproject.openstackswitching;
+package org.onosproject.openstacknetworking.web;
diff --git a/apps/openstackswitching/app/src/main/webapp/WEB-INF/web.xml b/apps/openstacknetworking/web/src/main/webapp/WEB-INF/web.xml
similarity index 84%
rename from apps/openstackswitching/app/src/main/webapp/WEB-INF/web.xml
rename to apps/openstacknetworking/web/src/main/webapp/WEB-INF/web.xml
index 923eff6..edb555b 100644
--- a/apps/openstackswitching/app/src/main/webapp/WEB-INF/web.xml
+++ b/apps/openstacknetworking/web/src/main/webapp/WEB-INF/web.xml
@@ -30,10 +30,10 @@
         <init-param>
             <param-name>com.sun.jersey.config.property.classnames</param-name>
             <param-value>
-                org.onosproject.openstackswitching.web.OpenstackPortWebResource,
-                org.onosproject.openstackswitching.web.OpenstackNetworkWebResource,
-                org.onosproject.openstackswitching.web.OpenstackSubnetWebResource,
-                org.onosproject.openstackswitching.web.OpensatckRouterWebResource
+                org.onosproject.openstacknetworking.web.OpenstackPortWebResource,
+                org.onosproject.openstacknetworking.web.OpenstackNetworkWebResource,
+                org.onosproject.openstacknetworking.web.OpenstackSubnetWebResource,
+                org.onosproject.openstacknetworking.web.OpensatckRouterWebResource
             </param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
diff --git a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSwitchingService.java b/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSwitchingService.java
deleted file mode 100644
index f81ddae..0000000
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSwitchingService.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright 2015-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.openstackswitching;
-
-import org.onosproject.net.Port;
-import org.onosproject.openstackrouting.OpenstackRouter;
-import org.onosproject.openstackrouting.OpenstackRouterInterface;
-
-import java.util.Collection;
-
-/**
- * Handles port management REST API from Openstack for VMs.
- */
-public interface OpenstackSwitchingService {
-
-    /**
-     * Store the port information created by Openstack.
-     *
-     * @param openstackPort port information
-     */
-    void createPorts(OpenstackPort openstackPort);
-
-    /**
-     * Removes flow rules corresponding to the port removed by Openstack.
-     *
-     * @param uuid UUID
-     */
-    void deletePort(String uuid);
-
-    /**
-     * Updates flow rules corresponding to the port information updated by Openstack.
-     *
-     * @param openstackPort OpenStack port
-     */
-    void updatePort(OpenstackPort openstackPort);
-
-    /**
-     * Stores the network information created by openstack.
-     *
-     * @param openstackNetwork network information
-     */
-    void createNetwork(OpenstackNetwork openstackNetwork);
-
-    /**
-     * Stores the subnet information created by openstack.
-     *
-     * @param openstackSubnet subnet information
-     */
-    void createSubnet(OpenstackSubnet openstackSubnet);
-
-    /**
-     * Returns port information list for the network ID given.
-     *
-     * @param networkId Network ID of the ports
-     * @return port information list
-     */
-    Collection<OpenstackPort> ports(String networkId);
-
-    /**
-     * Returns port information list.
-     *
-     * @return port information list
-     */
-    Collection<OpenstackPort> ports();
-    /**
-     * Returns port information for the port given.
-     *
-     * @param port port reference
-     * @return port information
-     */
-    OpenstackPort port(Port port);
-
-    /**
-     * Returns port information for the port ID given.
-     *
-     * @param portId Port ID
-     * @return port information
-     */
-    OpenstackPort port(String portId);
-
-    /**
-     * Returns network information list for the network ID given.
-     *
-     * @param networkId Network ID
-     * @return network information list, or null if not present
-     */
-    OpenstackNetwork network(String networkId);
-
-
-    /**
-     * Returns subnet information for the subnet ID give.
-     *
-     * @param subnetId Subnet ID
-     * @return subnet information, or null if not present
-     */
-    OpenstackSubnet subnet(String subnetId);
-
-    /**
-     * Sends the created router information to OpenstackRouting service.
-     *
-     * @param openstackRouter Router Information
-     */
-    void createRouter(OpenstackRouter openstackRouter);
-    /**
-     * Sends the updated router information to OpenstackRouting service.
-     *
-     * @param routerId Router ID
-     */
-    void updateRouter(String  routerId);
-    /**
-     * Sends the removed router information to OpenstackRouting service.
-     *
-     * @param routerId Router ID
-     */
-    void deleteRouter(String routerId);
-
-    /**
-     * Sends the updated router interface information to OpenstackRouting service.
-     *
-     * @param openstackRouterInterface Router interface information
-     */
-    void updateRouterInterface(OpenstackRouterInterface openstackRouterInterface);
-
-    /**
-     * Sends the removed router interface information to OpenstackRouting service.
-     *
-     * @param openstackRouterInterface Router interface information
-     */
-    void removeRouterInterface(OpenstackRouterInterface openstackRouterInterface);
-
-    /**
-     * Returns the router information list.
-     *
-     * @return router information list
-     */
-    Collection<OpenstackRouter> routers();
-
-    /**
-     * Returns the router information for the router ID given.
-     *
-     * @param routerId router ID
-     * @return router information
-     */
-    OpenstackRouter router(String routerId);
-
-    /**
-     * Returns the OpensatckPortInfo list.
-     *
-     * @return OpensatckPortInfo list
-     */
-    Collection<OpenstackPortInfo> portInfos();
-
-    /**
-     * Returns the MacAddress for physical router.
-     *
-     * @return physical router mac
-     */
-    String physicalRouterMac();
-
-
-}
diff --git a/apps/pom.xml b/apps/pom.xml
index 3e3aebe..0aa0716 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -59,16 +59,15 @@
         <module>igmp</module>
         <module>pim</module>
         <module>mlb</module>
-        <module>openstackswitching</module>
         <module>pathpainter</module>
         <module>drivermatrix</module>
         <module>cpman</module>
         <module>events</module>
         <module>vrouter</module>
-        <module>openstackrouting</module>
         <module>cordmcast</module>
         <module>vpls</module>
         <module>openstacknode</module>
+        <module>openstacknetworking</module>
   </modules>
 
     <properties>