diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/PortPairGroupCodec.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/PortPairGroupCodec.java
new file mode 100644
index 0000000..ef0f3ed
--- /dev/null
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/PortPairGroupCodec.java
@@ -0,0 +1,95 @@
+/*
+ * 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.vtnweb.web;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
+
+import java.util.List;
+
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.core.CoreService;
+import org.onosproject.vtnrsc.DefaultPortPairGroup;
+import org.onosproject.vtnrsc.PortPairGroup;
+import org.onosproject.vtnrsc.PortPairGroupId;
+import org.onosproject.vtnrsc.PortPairId;
+import org.onosproject.vtnrsc.TenantId;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Lists;
+
+/**
+ * Port Pair Group JSON codec.
+ */
+public final class PortPairGroupCodec extends JsonCodec<PortPairGroup> {
+
+    private static final String ID = "id";
+    private static final String TENANT_ID = "tenant_id";
+    private static final String NAME = "name";
+    private static final String DESCRIPTION = "description";
+    private static final String PORT_PAIRS = "port_pairs";
+    private static final String MISSING_MEMBER_MESSAGE =
+            " member is required in PortPairGroup";
+
+    @Override
+    public PortPairGroup decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        PortPairGroup.Builder resultBuilder = new DefaultPortPairGroup.Builder();
+
+        CoreService coreService = context.getService(CoreService.class);
+
+        String id = nullIsIllegal(json.get(ID),
+                                  ID + MISSING_MEMBER_MESSAGE).asText();
+        resultBuilder.setId(PortPairGroupId.portPairGroupId(id));
+
+        String tenantId = nullIsIllegal(json.get(TENANT_ID),
+                                        TENANT_ID + MISSING_MEMBER_MESSAGE).asText();
+        resultBuilder.setTenantId(TenantId.tenantId(tenantId));
+
+        String name = nullIsIllegal(json.get(NAME),
+                                    NAME + MISSING_MEMBER_MESSAGE).asText();
+        resultBuilder.setName(name);
+
+        String description = nullIsIllegal(json.get(DESCRIPTION),
+                                           DESCRIPTION + MISSING_MEMBER_MESSAGE).asText();
+        resultBuilder.setDescription(description);
+
+        List<PortPairId> list = Lists.newArrayList();
+        ArrayNode arrayNode = (ArrayNode) json.path(PORT_PAIRS);
+        arrayNode.forEach(i -> list.add(PortPairId.portPairId(i.asText())));
+        resultBuilder.setPortPairs(list);
+
+        return resultBuilder.build();
+    }
+
+    @Override
+    public ObjectNode encode(PortPairGroup portPairGroup, CodecContext context) {
+        checkNotNull(portPairGroup, "port pair group cannot be null");
+        ObjectNode result = context.mapper().createObjectNode()
+                .put(ID, portPairGroup.portPairGroupId().toString())
+                .put(TENANT_ID, portPairGroup.tenantId().toString())
+                .put(NAME, portPairGroup.name())
+                .put(DESCRIPTION, portPairGroup.description())
+                .put(PORT_PAIRS, portPairGroup.portPairs().toString());
+        return result;
+    }
+}
