diff --git a/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/portpair/impl/PortPairManagerTest.java b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/portpair/impl/PortPairManagerTest.java
new file mode 100644
index 0000000..c936d7c
--- /dev/null
+++ b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/portpair/impl/PortPairManagerTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2015 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.vtnrsc.portpair.impl;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+import org.junit.Test;
+
+import org.onosproject.vtnrsc.PortPair;
+import org.onosproject.vtnrsc.PortPairId;
+import org.onosproject.vtnrsc.TenantId;
+import org.onosproject.vtnrsc.DefaultPortPair;
+import org.onosproject.vtnrsc.util.VtnStorageServiceTest;
+
+/**
+ * Unit tests for PortPairManager class.
+ */
+public class PortPairManagerTest {
+    final PortPairId portPairId = PortPairId.of("78888888-fc23-aeb6-f44b-56dc5e2fb3ae");
+    final TenantId tenantId = TenantId.tenantId("1");
+    final String name = "PortPair";
+    final String description = "PortPair";
+    final String ingress = "d3333333-24fc-4fae-af4b-321c5e2eb3d1";
+    final String egress = "a4444444-4a56-2a6e-cd3a-9dee4e2ec345";
+    DefaultPortPair.Builder portPairBuilder = new DefaultPortPair.Builder();
+    PortPairManager portPairMgr = new PortPairManager();
+    PortPair portPair = null;
+    private final VtnStorageServiceTest storageService = new VtnStorageServiceTest();
+
+    /**
+     * Checks the operation of createPortPair() method.
+     */
+    @Test
+    public void testCreatePortPair() {
+        // initialize port pair manager
+        portPairMgr.storageService = storageService;
+        portPairMgr.activate();
+
+        // create port pair
+        portPair = portPairBuilder.setId(portPairId).setTenantId(tenantId).setName(name)
+                .setDescription(description).setIngress(ingress).setEgress(egress).build();
+        assertThat(portPairMgr.createPortPair(portPair), is(true));
+    }
+
+    /**
+     * Checks the operation of exists() method.
+     */
+    @Test
+    public void testExists() {
+        testCreatePortPair();
+        assertThat(portPairMgr.exists(portPairId), is(true));
+    }
+
+    /**
+     * Checks the operation of getPortPairCount() method.
+     */
+    @Test
+    public void testGetPortPairCount() {
+        testCreatePortPair();
+        assertThat(portPairMgr.getPortPairCount(), is(1));
+    }
+
+    /**
+     * Checks the operation of getPortPairs() method.
+     */
+    @Test
+    public void testGetPortPairs() {
+        testCreatePortPair();
+        final Iterable<PortPair> portPairList = portPairMgr.getPortPairs();
+        assertThat(portPairList, is(notNullValue()));
+        assertThat(portPairList.iterator().hasNext(), is(true));
+    }
+
+    /**
+     * Checks the operation of getPortPair() method.
+     */
+    @Test
+    public void testGetPortPair() {
+        testCreatePortPair();
+        assertThat(portPair, is(notNullValue()));
+        assertThat(portPairMgr.getPortPair(portPairId), is(portPair));
+    }
+
+    /**
+     * Checks the operation of updatePortPair() method.
+     */
+    @Test
+    public void testUpdatePortPair() {
+        // create a port pair
+        testCreatePortPair();
+
+        // new updates
+        final TenantId tenantId2 = TenantId.tenantId("2");
+        final String name2 = "PortPair2";
+        final String description2 = "PortPair2";
+        final String ingress2 = "d5555555-24fc-4fae-af4b-321c5e2eb3d1";
+        final String egress2 = "a6666666-4a56-2a6e-cd3a-9dee4e2ec345";
+        portPair = portPairBuilder.setId(portPairId).setTenantId(tenantId2).setName(name2)
+                .setDescription(description2).setIngress(ingress2).setEgress(egress2).build();
+        assertThat(portPairMgr.updatePortPair(portPair), is(true));
+    }
+
+    /**
+     * Checks the operation of removePortPair() method.
+     */
+    @Test
+    public void testRemovePortPair() {
+        testCreatePortPair();
+        assertThat(portPairMgr.removePortPair(portPairId), is(true));
+    }
+}
