diff --git a/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResource.java b/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResource.java
index de57311..25d239c 100644
--- a/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResource.java
+++ b/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResource.java
@@ -15,7 +15,6 @@
  */
 package org.onosproject.openstacknetworking.web;
 
-import org.onlab.osgi.DefaultServiceDirectory;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
 import org.onosproject.rest.AbstractWebResource;
 import org.openstack4j.openstack.networking.domain.NeutronNetwork;
@@ -52,7 +51,7 @@
     private static final String NETWORKS = "networks";
 
     private final OpenstackNetworkAdminService adminService =
-            DefaultServiceDirectory.getService(OpenstackNetworkAdminService.class);
+                                        get(OpenstackNetworkAdminService.class);
 
     @Context
     private UriInfo uriInfo;
diff --git a/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java b/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
index 79d6ddd..730eb46 100644
--- a/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
+++ b/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
@@ -15,7 +15,6 @@
  */
 package org.onosproject.openstacknetworking.web;
 
-import org.onlab.osgi.DefaultServiceDirectory;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
 import org.onosproject.rest.AbstractWebResource;
 import org.openstack4j.openstack.networking.domain.NeutronPort;
@@ -52,7 +51,7 @@
     private static final String PORTS = "ports";
 
     private final OpenstackNetworkAdminService adminService =
-            DefaultServiceDirectory.getService(OpenstackNetworkAdminService.class);
+                                        get(OpenstackNetworkAdminService.class);
 
     @Context
     private UriInfo uriInfo;
diff --git a/apps/openstacknetworking/src/test/java/org/onosproject/openstacknetworking/web/OpenstackFloatingIpWebResourceTest.java b/apps/openstacknetworking/src/test/java/org/onosproject/openstacknetworking/web/OpenstackFloatingIpWebResourceTest.java
index edc562d..3e98a5d 100644
--- a/apps/openstacknetworking/src/test/java/org/onosproject/openstacknetworking/web/OpenstackFloatingIpWebResourceTest.java
+++ b/apps/openstacknetworking/src/test/java/org/onosproject/openstacknetworking/web/OpenstackFloatingIpWebResourceTest.java
@@ -192,7 +192,7 @@
      * Tests the results of the REST API DELETE with deletion operation.
      */
     @Test
-    public void testDeleteFloatingIpDeletionOperation() {
+    public void testDeleteFloatingIpWithDeletionOperation() {
         mockOpenstackRouterAdminService.removeFloatingIp(anyString());
         replay(mockOpenstackRouterAdminService);
 
diff --git a/apps/openstacknetworking/src/test/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResourceTest.java b/apps/openstacknetworking/src/test/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResourceTest.java
new file mode 100644
index 0000000..bbac93b
--- /dev/null
+++ b/apps/openstacknetworking/src/test/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResourceTest.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacknetworking.web;
+
+import org.glassfish.jersey.server.ResourceConfig;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.osgi.TestServiceDirectory;
+import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
+import org.onosproject.rest.resources.ResourceTest;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.anyString;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test for openstack network REST API.
+ */
+public class OpenstackNetworkWebResourceTest extends ResourceTest {
+
+    final OpenstackNetworkAdminService mockOpenstackNetworkAdminService =
+            createMock(OpenstackNetworkAdminService.class);
+    private static final String PATH = "networks";
+
+    /**
+     * Constructs an openstack network test instance.
+     */
+    public OpenstackNetworkWebResourceTest() {
+        super(ResourceConfig.forApplicationClass(OpenstackNetworkingWebApplication.class));
+    }
+
+    /**
+     * Sets up the global values for all tests.
+     */
+    @Before
+    public void setUpTest() {
+        ServiceDirectory testDirectory =
+                new TestServiceDirectory()
+                        .add(OpenstackNetworkAdminService.class,
+                                mockOpenstackNetworkAdminService);
+        setServiceDirectory(testDirectory);
+    }
+
+    /**
+     * Tests the results of the REST API POST with creation operation.
+     */
+    @Test
+    public void testCreateNetworkWithCreationOperation() {
+        mockOpenstackNetworkAdminService.createNetwork(anyObject());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-network.json");
+
+        Response response = wt.path(PATH).request(MediaType.APPLICATION_JSON_TYPE)
+                .post(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(201));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API POST with incorrect input.
+     */
+    @Test
+    public void testCreateNetworkWithIncorrectInput() {
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("dummy.json");
+
+        Response response = wt.path(PATH).request(MediaType.APPLICATION_JSON_TYPE)
+                .post(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(400));
+    }
+
+    /**
+     * Tests the results of the REST API POST with duplicated network ID.
+     */
+    @Test
+    public void testCreateNetworkWithDuplicatedId() {
+        mockOpenstackNetworkAdminService.createNetwork(anyObject());
+        expectLastCall().andThrow(new IllegalArgumentException());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-network.json");
+
+        Response response = wt.path(PATH).request(MediaType.APPLICATION_JSON_TYPE)
+                .post(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(400));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API PUT with updating operation.
+     */
+    @Test
+    public void testUpdateNetworkWithUpdatingOperation() {
+        mockOpenstackNetworkAdminService.updateNetwork(anyObject());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-network.json");
+
+        Response response = wt.path(PATH + "/396f12f8-521e-4b91-8e21-2e003500433a")
+                .request(MediaType.APPLICATION_JSON_TYPE)
+                .put(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(200));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API PUT with incorrect input.
+     */
+    @Test
+    public void testUpdateNetworkWithIncorrectInput() {
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("dummy.json");
+
+        Response response = wt.path(PATH + "/396f12f8-521e-4b91-8e21-2e003500433a")
+                .request(MediaType.APPLICATION_JSON_TYPE)
+                .put(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(400));
+    }
+
+    /**
+     * Tests the results of the REST API PUT with non-existing network ID.
+     */
+    @Test
+    public void testUpdateNetworkWithNonexistId() {
+        mockOpenstackNetworkAdminService.updateNetwork(anyObject());
+        expectLastCall().andThrow(new IllegalArgumentException());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-network.json");
+
+        Response response = wt.path(PATH + "/396f12f8-521e-4b91-8e21-2e003500433a")
+                .request(MediaType.APPLICATION_JSON_TYPE)
+                .put(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(400));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API DELETE with deletion operation.
+     */
+    @Test
+    public void testDeleteNetworkWithDeletionOperation() {
+        mockOpenstackNetworkAdminService.removeNetwork(anyString());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+
+        Response response = wt.path(PATH + "/396f12f8-521e-4b91-8e21-2e003500433a")
+                .request(MediaType.APPLICATION_JSON_TYPE)
+                .delete();
+        final int status = response.getStatus();
+
+        assertThat(status, is(204));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API DELETE with non-existing network ID.
+     */
+    @Test
+    public void testDeleteNetworkWithNonexistId() {
+        mockOpenstackNetworkAdminService.removeNetwork(anyString());
+        expectLastCall().andThrow(new IllegalArgumentException());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+
+        Response response = wt.path(PATH + "/non-exist-id")
+                .request(MediaType.APPLICATION_JSON_TYPE)
+                .delete();
+        final int status = response.getStatus();
+
+        assertThat(status, is(400));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+}
diff --git a/apps/openstacknetworking/src/test/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResourceTest.java b/apps/openstacknetworking/src/test/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResourceTest.java
new file mode 100644
index 0000000..e3f4bf0
--- /dev/null
+++ b/apps/openstacknetworking/src/test/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResourceTest.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacknetworking.web;
+
+import org.glassfish.jersey.server.ResourceConfig;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.osgi.TestServiceDirectory;
+import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
+import org.onosproject.rest.resources.ResourceTest;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.anyString;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test for openstack port REST API.
+ */
+public class OpenstackPortWebResourceTest extends ResourceTest {
+
+    final OpenstackNetworkAdminService mockOpenstackNetworkAdminService =
+            createMock(OpenstackNetworkAdminService.class);
+    private static final String PATH = "ports";
+
+    /**
+     * Constructs an openstack port test instance.
+     */
+    public OpenstackPortWebResourceTest() {
+        super(ResourceConfig.forApplicationClass(OpenstackNetworkingWebApplication.class));
+    }
+
+    /**
+     * Sets up the global values for all tests.
+     */
+    @Before
+    public void setUpTest() {
+        ServiceDirectory testDirectory =
+                new TestServiceDirectory()
+                        .add(OpenstackNetworkAdminService.class,
+                                mockOpenstackNetworkAdminService);
+        setServiceDirectory(testDirectory);
+
+    }
+
+    /**
+     * Tests the results of the REST API POST with creation operation.
+     */
+    @Test
+    public void testCreatePortWithCreationOperation() {
+        mockOpenstackNetworkAdminService.createPort(anyObject());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port.json");
+
+        Response response = wt.path(PATH).request(MediaType.APPLICATION_JSON_TYPE)
+                .post(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(201));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API POST with incorrect input.
+     */
+    @Test
+    public void testCreatePortWithIncorrectInput() {
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackPortWebResourceTest.class
+                .getResourceAsStream("dummy.json");
+
+        Response response = wt.path(PATH).request(MediaType.APPLICATION_JSON_TYPE)
+                .post(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(400));
+    }
+
+    /**
+     * Tests the results of the REST API POST with duplicated port ID.
+     */
+    @Test
+    public void testCreatePortWithDuplicatedId() {
+        mockOpenstackNetworkAdminService.createPort(anyObject());
+        expectLastCall().andThrow(new IllegalArgumentException());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port.json");
+
+        Response response = wt.path(PATH).request(MediaType.APPLICATION_JSON_TYPE)
+                .post(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(400));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API PUT with updating operation.
+     */
+    @Test
+    public void testUpdatePortWithUpdatingOperation() {
+        mockOpenstackNetworkAdminService.updatePort(anyObject());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port.json");
+
+        Response response = wt.path(PATH + "/65c0ee9f-d634-4522-8954-51021b570b0d")
+                .request(MediaType.APPLICATION_JSON_TYPE)
+                .put(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(200));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API PUT with incorrect input.
+     */
+    @Test
+    public void testUpdatePortWithIncorrectInput() {
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("dummy.json");
+
+        Response response = wt.path(PATH + "/65c0ee9f-d634-4522-8954-51021b570b0d")
+                .request(MediaType.APPLICATION_JSON_TYPE)
+                .put(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(400));
+    }
+
+    /**
+     * Tests the results of the REST API PUT with non-existing port ID.
+     */
+    @Test
+    public void testUpdatePortWithNonexistId() {
+        mockOpenstackNetworkAdminService.updatePort(anyObject());
+        expectLastCall().andThrow(new IllegalArgumentException());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port.json");
+
+        Response response = wt.path(PATH + "/65c0ee9f-d634-4522-8954-51021b570b0d")
+                .request(MediaType.APPLICATION_JSON_TYPE)
+                .put(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(400));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API DELETE with deletion operation.
+     */
+    @Test
+    public void testDeletePortWithDeletionOperation() {
+        mockOpenstackNetworkAdminService.removePort(anyString());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+
+        Response response = wt.path(PATH + "/65c0ee9f-d634-4522-8954-51021b570b0d")
+                .request(MediaType.APPLICATION_JSON_TYPE)
+                .delete();
+        final int status = response.getStatus();
+
+        assertThat(status, is(204));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API DELETE with non-existing port ID.
+     */
+    @Test
+    public void testDeletePortWithNonexistId() {
+        mockOpenstackNetworkAdminService.removePort(anyString());
+        expectLastCall().andThrow(new IllegalArgumentException());
+        replay(mockOpenstackNetworkAdminService);
+
+        final WebTarget wt = target();
+
+        Response response = wt.path(PATH + "/non-exist-id")
+                .request(MediaType.APPLICATION_JSON_TYPE)
+                .delete();
+        final int status = response.getStatus();
+
+        assertThat(status, is(400));
+
+        verify(mockOpenstackNetworkAdminService);
+    }
+}
diff --git a/apps/openstacknetworking/src/test/resources/org/onosproject/openstacknetworking/web/openstack-network.json b/apps/openstacknetworking/src/test/resources/org/onosproject/openstacknetworking/web/openstack-network.json
new file mode 100644
index 0000000..2f4cd93
--- /dev/null
+++ b/apps/openstacknetworking/src/test/resources/org/onosproject/openstacknetworking/web/openstack-network.json
@@ -0,0 +1,20 @@
+{
+  "network": {
+    "id": "396f12f8-521e-4b91-8e21-2e003500433a",
+    "subnets": [
+      "10.10.0.0/24"
+    ],
+    "provider:physical_network": "physnet1",
+    "admin_state_up": true,
+    "tenant_id": "20bd52ff3e1b40039c312395b04683cf",
+    "provider:network_type": "vlan",
+    "router:external": true,
+    "provider:segmentation_id": "1002",
+    "availability_zone_hints": [
+      "1"
+    ],
+    "availability_zones": [
+      "nova"
+    ]
+  }
+}
diff --git a/apps/openstacknetworking/src/test/resources/org/onosproject/openstacknetworking/web/openstack-port.json b/apps/openstacknetworking/src/test/resources/org/onosproject/openstacknetworking/web/openstack-port.json
new file mode 100644
index 0000000..4dcb704
--- /dev/null
+++ b/apps/openstacknetworking/src/test/resources/org/onosproject/openstacknetworking/web/openstack-port.json
@@ -0,0 +1,39 @@
+{
+  "port": {
+    "id": "65c0ee9f-d634-4522-8954-51021b570b0d",
+    "admin_state_up": true,
+    "device_id": "1",
+    "device_owner": "compute:nova",
+    "fixed_ips": [
+      {
+        "ip_address": "10.0.0.2",
+        "subnet_id": "a0304c3a-4f08-4c43-88af-d796509c97d2"
+      }
+    ],
+    "allowed_address_pairs": [
+      {
+        "ip_address": "12.12.11.12",
+        "mac_address": "fa:14:2a:b3:cb:f0"
+      }
+    ],
+    "mac_address": "fa:16:3e:c9:cb:f0",
+    "network_id": "a87cc70a-3e15-4acf-8205-9b711a3531b7",
+    "status": "ACTIVE",
+    "tenant_id": "d6700c0c9ffa4f1cb322cd4a1f3906fa",
+    "security_groups": [
+      "f0ac4394-7e4a-4409-9701-ba8be283dbc3"
+    ],
+    "extra_dhcp_opts": [
+      {
+        "opt_value": "pxelinux.0",
+        "opt_name": "bootfile-name"
+      }
+    ],
+    "port_security_enabled": true,
+    "binding:host_id": "4df8d9ff-6f6f-438f-90a1-ef660d4586ad",
+    "binding:vif_type": "unbound",
+    "binding:vif_details": {},
+    "binding:vnic_type": "other",
+    "binding:profile": {}
+  }
+}
