diff --git a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/PortPairGroupManagerTestImpl.java b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/PortPairGroupManagerTestImpl.java
new file mode 100644
index 0000000..ba31cd6
--- /dev/null
+++ b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/PortPairGroupManagerTestImpl.java
@@ -0,0 +1,89 @@
+/*
+ * 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.sfc.util;
+
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.Collections;
+
+import org.onosproject.vtnrsc.PortPairGroup;
+import org.onosproject.vtnrsc.PortPairGroupId;
+import org.onosproject.vtnrsc.portpairgroup.PortPairGroupListener;
+import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService;
+
+/**
+ * Provides implementation of the portPairGroupService.
+ */
+public class PortPairGroupManagerTestImpl implements PortPairGroupService {
+
+    private ConcurrentMap<PortPairGroupId, PortPairGroup> portPairGroupStore = new ConcurrentHashMap<>();
+
+    @Override
+    public boolean exists(PortPairGroupId portPairGroupId) {
+        return portPairGroupStore.containsKey(portPairGroupId);
+    }
+
+    @Override
+    public int getPortPairGroupCount() {
+        return portPairGroupStore.size();
+    }
+
+    @Override
+    public Iterable<PortPairGroup> getPortPairGroups() {
+        return Collections.unmodifiableCollection(portPairGroupStore.values());
+    }
+
+    @Override
+    public PortPairGroup getPortPairGroup(PortPairGroupId portPairGroupId) {
+        return portPairGroupStore.get(portPairGroupId);
+    }
+
+    @Override
+    public boolean createPortPairGroup(PortPairGroup portPairGroup) {
+        portPairGroupStore.put(portPairGroup.portPairGroupId(), portPairGroup);
+        if (!portPairGroupStore.containsKey(portPairGroup.portPairGroupId())) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean updatePortPairGroup(PortPairGroup portPairGroup) {
+        if (!portPairGroupStore.containsKey(portPairGroup.portPairGroupId())) {
+            return false;
+        }
+
+        portPairGroupStore.put(portPairGroup.portPairGroupId(), portPairGroup);
+
+        if (!portPairGroup.equals(portPairGroupStore.get(portPairGroup.portPairGroupId()))) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean removePortPairGroup(PortPairGroupId portPairGroupId) {
+        return true;
+    }
+
+    @Override
+    public void addListener(PortPairGroupListener listener) {
+    }
+
+    @Override
+    public void removeListener(PortPairGroupListener listener) {
+    }
+}
diff --git a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/PortPairManagerTestImpl.java b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/PortPairManagerTestImpl.java
new file mode 100644
index 0000000..aff5882
--- /dev/null
+++ b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/PortPairManagerTestImpl.java
@@ -0,0 +1,89 @@
+/*
+ * 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.sfc.util;
+
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.Collections;
+
+import org.onosproject.vtnrsc.PortPair;
+import org.onosproject.vtnrsc.PortPairId;
+import org.onosproject.vtnrsc.portpair.PortPairListener;
+import org.onosproject.vtnrsc.portpair.PortPairService;
+
+/**
+ * Provides implementation of the portPairService.
+ */
+public class PortPairManagerTestImpl implements PortPairService {
+
+    private ConcurrentMap<PortPairId, PortPair> portPairStore = new ConcurrentHashMap<>();
+
+    @Override
+    public boolean exists(PortPairId portPairId) {
+        return portPairStore.containsKey(portPairId);
+    }
+
+    @Override
+    public int getPortPairCount() {
+        return portPairStore.size();
+    }
+
+    @Override
+    public Iterable<PortPair> getPortPairs() {
+        return Collections.unmodifiableCollection(portPairStore.values());
+    }
+
+    @Override
+    public PortPair getPortPair(PortPairId portPairId) {
+        return portPairStore.get(portPairId);
+    }
+
+    @Override
+    public boolean createPortPair(PortPair portPair) {
+        portPairStore.put(portPair.portPairId(), portPair);
+        if (!portPairStore.containsKey(portPair.portPairId())) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean updatePortPair(PortPair portPair) {
+        if (!portPairStore.containsKey(portPair.portPairId())) {
+            return false;
+        }
+
+        portPairStore.put(portPair.portPairId(), portPair);
+
+        if (!portPair.equals(portPairStore.get(portPair.portPairId()))) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean removePortPair(PortPairId portPairId) {
+        return true;
+    }
+
+    @Override
+    public void addListener(PortPairListener listener) {
+    }
+
+    @Override
+    public void removeListener(PortPairListener listener) {
+    }
+}
