diff --git a/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/portchain/impl/PortChainManagerTest.java b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/portchain/impl/PortChainManagerTest.java
new file mode 100644
index 0000000..0831ec9
--- /dev/null
+++ b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/portchain/impl/PortChainManagerTest.java
@@ -0,0 +1,155 @@
+/*
+ * 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.portchain.impl;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+import org.junit.Test;
+import java.util.List;
+import java.util.LinkedList;
+
+import org.onosproject.vtnrsc.PortChainId;
+import org.onosproject.vtnrsc.PortPairGroupId;
+import org.onosproject.vtnrsc.TenantId;
+import org.onosproject.vtnrsc.FlowClassifierId;
+import org.onosproject.vtnrsc.PortChain;
+import org.onosproject.vtnrsc.DefaultPortChain;
+import org.onosproject.vtnrsc.DefaultFlowClassifier;
+import org.onosproject.vtnrsc.util.VtnStorageServiceTest;
+
+/**
+ * Unit tests for PortChainManager class.
+ */
+public class PortChainManagerTest {
+    final PortChainId portChainId = PortChainId.of("78888888-fc23-aeb6-f44b-56dc5e2fb3ae");
+    final TenantId tenantId = TenantId.tenantId("1");
+    final String name = "PortChain";
+    final String description = "PortChain";
+    final List<PortPairGroupId> portPairGroupList = new LinkedList<PortPairGroupId>();
+    final List<FlowClassifierId> flowClassifierList = new LinkedList<FlowClassifierId>();
+    DefaultPortChain.Builder portChainBuilder = new DefaultPortChain.Builder();
+    DefaultFlowClassifier.Builder flowClassifierBuilder = new DefaultFlowClassifier.Builder();
+    PortChainManager portChainMgr = new PortChainManager();
+    PortChain portChain = null;
+    private final VtnStorageServiceTest storageService = new VtnStorageServiceTest();
+
+    /**
+     * Checks the operation of createPortChain() method.
+     */
+    @Test
+    public void testCreatePortChain() {
+        // initialize port chain manager
+        portChainMgr.storageService = storageService;
+        portChainMgr.activate();
+
+        // create list of Port Pair Groups.
+        PortPairGroupId portPairGroupId = PortPairGroupId.of("73333333-fc23-aeb6-f44b-56dc5e2fb3ae");
+        portPairGroupList.add(portPairGroupId);
+        portPairGroupId = PortPairGroupId.of("73333333-fc23-aeb6-f44b-56dc5e2fb3af");
+        portPairGroupList.add(portPairGroupId);
+
+        // create list of Flow classifiers.
+        FlowClassifierId flowClassifierId = FlowClassifierId.of("74444444-fc23-aeb6-f44b-56dc5e2fb3ae");
+        flowClassifierList.add(flowClassifierId);
+        flowClassifierId = FlowClassifierId.of("74444444-fc23-aeb6-f44b-56dc5e2fb3af");
+        flowClassifierList.add(flowClassifierId);
+
+        // create port chain
+        portChain = portChainBuilder.setId(portChainId).setTenantId(tenantId).setName(name).setDescription(description)
+                .setPortPairGroups(portPairGroupList).setFlowClassifiers(flowClassifierList).build();
+        assertThat(portChainMgr.createPortChain(portChain), is(true));
+    }
+
+    /**
+     * Checks the operation of exists() method.
+     */
+    @Test
+    public void testExists() {
+        testCreatePortChain();
+        assertThat(portChainMgr.exists(portChainId), is(true));
+    }
+
+    /**
+     * Checks the operation of getPortChainCount() method.
+     */
+    @Test
+    public void testGetPortChainCount() {
+        testCreatePortChain();
+        assertThat(portChainMgr.getPortChainCount(), is(1));
+    }
+
+    /**
+     * Checks the operation of getPortChains() method.
+     */
+    @Test
+    public void testGetPortChains() {
+        testCreatePortChain();
+        final Iterable<PortChain> portChainList = portChainMgr.getPortChains();
+        assertThat(portChainList, is(notNullValue()));
+        assertThat(portChainList.iterator().hasNext(), is(true));
+    }
+
+    /**
+     * Checks the operation of getPortChain() method.
+     */
+    @Test
+    public void testGetPortChain() {
+        testCreatePortChain();
+        assertThat(portChain, is(notNullValue()));
+        assertThat(portChainMgr.getPortChain(portChainId), is(portChain));
+    }
+
+    /**
+     * Checks the operation of updatePortChain() method.
+     */
+    @Test
+    public void testUpdatePortChain() {
+        // create a port chain
+        testCreatePortChain();
+
+        // new updates
+        final TenantId tenantId2 = TenantId.tenantId("2");
+        final String name2 = "PortChain2";
+        final String description2 = "PortChain2";
+        // create list of Port Pair Groups.
+        final List<PortPairGroupId> portPairGroupList = new LinkedList<PortPairGroupId>();
+        PortPairGroupId portPairGroupId = PortPairGroupId.of("75555555-fc23-aeb6-f44b-56dc5e2fb3ae");
+        portPairGroupList.add(portPairGroupId);
+        portPairGroupId = PortPairGroupId.of("75555555-fc23-aeb6-f44b-56dc5e2fb3af");
+        portPairGroupList.add(portPairGroupId);
+        // create list of Flow classifiers.
+        final List<FlowClassifierId> flowClassifierList = new LinkedList<FlowClassifierId>();
+        FlowClassifierId flowClassifierId = FlowClassifierId.of("76666666-fc23-aeb6-f44b-56dc5e2fb3ae");
+        flowClassifierList.add(flowClassifierId);
+        flowClassifierId = FlowClassifierId.of("76666666-fc23-aeb6-f44b-56dc5e2fb3af");
+        flowClassifierList.add(flowClassifierId);
+        portChain = portChainBuilder.setId(portChainId).setTenantId(tenantId2).setName(name2)
+                .setDescription(description2).setPortPairGroups(portPairGroupList)
+                .setFlowClassifiers(flowClassifierList).build();
+        assertThat(portChainMgr.updatePortChain(portChain), is(true));
+    }
+
+    /**
+     * Checks the operation of removePortChain() method.
+     */
+    @Test
+    public void testRemovePortChain() {
+        testCreatePortChain();
+        assertThat(portChainMgr.removePortChain(portChainId), is(true));
+    }
+}
