diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainDeviceMapWebResource.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainDeviceMapWebResource.java
new file mode 100644
index 0000000..b391ae4
--- /dev/null
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainDeviceMapWebResource.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2014-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.resources;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsNotFound;
+
+import java.util.Set;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.onosproject.codec.CodecContext;
+import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.vtnrsc.LoadBalanceId;
+import org.onosproject.vtnrsc.PortChain;
+import org.onosproject.vtnrsc.PortChainId;
+import org.onosproject.vtnrsc.portchain.PortChainService;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * Query and program port chain.
+ */
+
+@Path("portChainDeviceMap")
+public class PortChainDeviceMapWebResource extends AbstractWebResource {
+
+    public static final String PORT_CHAIN_NOT_FOUND = "Port chain not found";
+    public static final String PORT_CHAIN_ID_EXIST = "Port chain exists";
+    public static final String PORT_CHAIN_ID_NOT_EXIST = "Port chain does not exist with identifier";
+
+    private static final String NAME = "name";
+    private static final String ID = "id";
+    private static final String CLASSIFIERS = "classifiers";
+    private static final String FORWARDERS = "forwarders";
+    private static final String LOADBALANCEID = "loadBalanceId";
+
+    /**
+     * Get details of a specified port chain id.
+     *
+     * @param id port chain id
+     * @return 200 OK, 404 if given identifier does not exist
+     */
+    @GET
+    @Path("{chain_id}")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response getPortChainDeviceMap(@PathParam("chain_id") String id) {
+
+        PortChain portChain = nullIsNotFound(get(PortChainService.class).getPortChain(PortChainId.of(id)),
+                                             PORT_CHAIN_NOT_FOUND);
+        ObjectNode result = mapper().createObjectNode();
+        result.set("portChainDeviceMap", encode(portChain, this));
+
+        return ok(result.toString()).build();
+    }
+
+    private ObjectNode encode(PortChain portChain, CodecContext context) {
+        checkNotNull(portChain, "portChain cannot be null");
+        ObjectNode result = context.mapper().createObjectNode();
+        result.put(ID, portChain.portChainId().toString())
+        .put(NAME, portChain.name());
+
+        Set<LoadBalanceId> loadBalanceIds = portChain.getLoadBalancePathMapKeys();
+        for (LoadBalanceId id : loadBalanceIds) {
+            result.put(LOADBALANCEID, id.toString())
+            .put(CLASSIFIERS, portChain.getSfcClassifiers(id).toString())
+            .put(FORWARDERS, portChain.getSfcForwarders(id).toString());
+        }
+        return result;
+    }
+}
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainSfMapWebResource.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainSfMapWebResource.java
new file mode 100644
index 0000000..b644786
--- /dev/null
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainSfMapWebResource.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2016-present 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.resources;
+
+import static org.onlab.util.Tools.nullIsNotFound;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.vtnrsc.PortChainId;
+import org.onosproject.vtnrsc.ServiceFunctionGroup;
+import org.onosproject.vtnrsc.portchainsfmap.PortChainSfMapService;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * Query service function and load details by port chain.
+ */
+
+@Path("portChainSfMap")
+public class PortChainSfMapWebResource extends AbstractWebResource {
+
+    public static final String PORT_CHAIN_NOT_FOUND = "Port chain not found";
+    public static final String PORT_CHAIN_ID_EXIST = "Port chain exists";
+    public static final String PORT_CHAIN_ID_NOT_EXIST = "Port chain does not exist with identifier";
+
+    /**
+     * Get service function details of a specified port chain id.
+     *
+     * @param id port chain id
+     * @return 200 OK, 404 if given identifier does not exist
+     */
+    @GET
+    @Path("{chainId}")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response getPortChainSfMap(@PathParam("chainId") String id) {
+
+        Iterable<ServiceFunctionGroup> serviceFunctionGroups = nullIsNotFound(get(PortChainSfMapService.class)
+                .getServiceFunctions(PortChainId.of(id)),
+                                                                              PORT_CHAIN_NOT_FOUND);
+        ObjectNode result = mapper().createObjectNode();
+        ArrayNode portChainSfMap = result.putArray("portChainSfMap");
+        if (serviceFunctionGroups != null) {
+            for (final ServiceFunctionGroup serviceFunctionGroup : serviceFunctionGroups) {
+                portChainSfMap.add(codec(ServiceFunctionGroup.class).encode(serviceFunctionGroup, this));
+            }
+        }
+        return ok(result.toString()).build();
+    }
+}
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/VtnWebApplication.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/VtnWebApplication.java
index f22f6df..142be79 100644
--- a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/VtnWebApplication.java
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/VtnWebApplication.java
@@ -35,7 +35,9 @@
                           PortPairWebResource.class,
                           FloatingIpWebResource.class,
                           RouterWebResource.class,
-                          ClassifierWebResource.class);
+                          ClassifierWebResource.class,
+                          PortChainSfMapWebResource.class,
+                          PortChainDeviceMapWebResource.class);
     }
 }
 
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java
index 94e02db..e4d4b93 100644
--- a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java
@@ -80,8 +80,10 @@
             resultBuilder.setProtocol(protocol);
         }
 
-        int priority = (json.get(PRIORITY)).asInt();
-        resultBuilder.setPriority(priority);
+        if (json.get(PRIORITY) != null && !(json.get(PRIORITY)).asText().equals("null")) {
+            int priority = (json.get(PRIORITY)).asInt();
+            resultBuilder.setPriority(priority);
+        }
 
         int minSrcPortRange = (json.get(MIN_SRC_PORT_RANGE)).asInt();
         resultBuilder.setMinSrcPortRange(minSrcPortRange);
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/ServiceFunctionCodec.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/ServiceFunctionCodec.java
new file mode 100644
index 0000000..f847b10
--- /dev/null
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/ServiceFunctionCodec.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2016 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 org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.vtnrsc.ServiceFunctionGroup;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * Service function JSON codec.
+ */
+public final class ServiceFunctionCodec extends JsonCodec<ServiceFunctionGroup> {
+
+    private static final String NAME = "name";
+    private static final String DESCRIPTION = "description";
+    private static final String PORT_PAIR_LOAD = "port_pair_load";
+    @Override
+    public ObjectNode encode(ServiceFunctionGroup serviceFunction, CodecContext context) {
+        checkNotNull(serviceFunction, "service cannot be null");
+        ObjectNode result = context.mapper().createObjectNode()
+                .put(NAME, serviceFunction.name())
+                .put(DESCRIPTION, serviceFunction.description())
+                .put(PORT_PAIR_LOAD, serviceFunction.portPairLoadMap().toString());
+        return result;
+    }
+}
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java
index 3330c25..84ac4a8 100644
--- a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java
@@ -25,6 +25,7 @@
 import org.onosproject.vtnrsc.PortChain;
 import org.onosproject.vtnrsc.PortPair;
 import org.onosproject.vtnrsc.PortPairGroup;
+import org.onosproject.vtnrsc.ServiceFunctionGroup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,7 +46,7 @@
         codecService.registerCodec(PortPairGroup.class, new PortPairGroupCodec());
         codecService.registerCodec(FlowClassifier.class, new FlowClassifierCodec());
         codecService.registerCodec(PortChain.class, new PortChainCodec());
-
+        codecService.registerCodec(ServiceFunctionGroup.class, new ServiceFunctionCodec());
         log.info("Started");
     }
 
diff --git a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainDeviceMapResourceTest.java b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainDeviceMapResourceTest.java
new file mode 100644
index 0000000..e173051
--- /dev/null
+++ b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainDeviceMapResourceTest.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright 2016-present 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.resources;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+import javax.ws.rs.client.WebTarget;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.osgi.TestServiceDirectory;
+import org.onlab.rest.BaseResource;
+import org.onosproject.codec.CodecService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.vtnrsc.FiveTuple;
+import org.onosproject.vtnrsc.FlowClassifierId;
+import org.onosproject.vtnrsc.LoadBalanceId;
+import org.onosproject.vtnrsc.PortChain;
+import org.onosproject.vtnrsc.PortChainId;
+import org.onosproject.vtnrsc.PortPairGroupId;
+import org.onosproject.vtnrsc.PortPairId;
+import org.onosproject.vtnrsc.TenantId;
+import org.onosproject.vtnrsc.portchain.PortChainService;
+import org.onosproject.vtnweb.web.SfcCodecContext;
+
+import com.eclipsesource.json.Json;
+import com.eclipsesource.json.JsonObject;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+
+/**
+ * Unit tests for port chain device map REST APIs.
+ */
+public class PortChainDeviceMapResourceTest extends VtnResourceTest {
+
+    final PortChainService portChainService = createMock(PortChainService.class);
+
+    PortChainId portChainId1 = PortChainId.of("78dcd363-fc23-aeb6-f44b-56dc5e2fb3ae");
+    TenantId tenantId1 = TenantId.tenantId("d382007aa9904763a801f68ecf065cf5");
+    private final List<PortPairGroupId> portPairGroupList1 = Lists.newArrayList();
+    private final List<FlowClassifierId> flowClassifierList1 = Lists.newArrayList();
+
+    final MockPortChain portChain1 = new MockPortChain(portChainId1, tenantId1, "portChain1",
+                                                       "Mock port chain", portPairGroupList1,
+                                                       flowClassifierList1);
+
+    /**
+     * Mock class for a port chain.
+     */
+    private static class MockPortChain implements PortChain {
+
+        private final PortChainId portChainId;
+        private final TenantId tenantId;
+        private final String name;
+        private final String description;
+        private final List<PortPairGroupId> portPairGroupList;
+        private final List<FlowClassifierId> flowClassifierList;
+
+        public MockPortChain(PortChainId portChainId, TenantId tenantId,
+                String name, String description,
+                List<PortPairGroupId> portPairGroupList,
+                List<FlowClassifierId> flowClassifierList) {
+
+            this.portChainId = portChainId;
+            this.tenantId = tenantId;
+            this.name = name;
+            this.description = description;
+            this.portPairGroupList = portPairGroupList;
+            this.flowClassifierList = flowClassifierList;
+        }
+
+        @Override
+        public PortChainId portChainId() {
+            return portChainId;
+        }
+
+        @Override
+        public TenantId tenantId() {
+            return tenantId;
+        }
+
+        @Override
+        public String name() {
+            return name;
+        }
+
+        @Override
+        public String description() {
+            return description;
+        }
+
+        @Override
+        public List<PortPairGroupId> portPairGroups() {
+            return ImmutableList.copyOf(portPairGroupList);
+        }
+
+        @Override
+        public List<FlowClassifierId> flowClassifiers() {
+            return ImmutableList.copyOf(flowClassifierList);
+        }
+
+        @Override
+        public boolean exactMatch(PortChain portChain) {
+            return this.equals(portChain) &&
+                    Objects.equals(this.portChainId, portChain.portChainId()) &&
+                    Objects.equals(this.tenantId, portChain.tenantId());
+        }
+
+        @Override
+        public void addLoadBalancePath(FiveTuple fiveTuple, LoadBalanceId id, List<PortPairId> path) {
+        }
+
+        @Override
+        public LoadBalanceId getLoadBalanceId(FiveTuple fiveTuple) {
+            return null;
+        }
+
+        @Override
+        public Set<FiveTuple> getLoadBalanceIdMapKeys() {
+            return null;
+        }
+
+        @Override
+        public List<PortPairId> getLoadBalancePath(LoadBalanceId id) {
+            return null;
+        }
+
+        @Override
+        public List<PortPairId> getLoadBalancePath(FiveTuple fiveTuple) {
+            return null;
+        }
+
+        @Override
+        public LoadBalanceId matchPath(List<PortPairId> path) {
+            return null;
+        }
+
+        @Override
+        public int getLoadBalancePathSize() {
+            return 0;
+        }
+
+        @Override
+        public void addSfcClassifiers(LoadBalanceId id, List<DeviceId> classifierList) {
+        }
+
+        @Override
+        public void addSfcForwarders(LoadBalanceId id, List<DeviceId> forwarderList) {
+        }
+
+        @Override
+        public void removeSfcClassifiers(LoadBalanceId id, List<DeviceId> classifierList) {
+        }
+
+        @Override
+        public void removeSfcForwarders(LoadBalanceId id, List<DeviceId> forwarderList) {
+        }
+
+        @Override
+        public List<DeviceId> getSfcClassifiers(LoadBalanceId id) {
+            DeviceId deviceId1 = DeviceId.deviceId("of:000000000000001");
+            List<DeviceId> classifierList = Lists.newArrayList();
+            classifierList.add(deviceId1);
+            return classifierList;
+        }
+
+        @Override
+        public List<DeviceId> getSfcForwarders(LoadBalanceId id) {
+            DeviceId deviceId1 = DeviceId.deviceId("of:000000000000002");
+            DeviceId deviceId2 = DeviceId.deviceId("of:000000000000003");
+            List<DeviceId> forwarderList = Lists.newArrayList();
+            forwarderList.add(deviceId1);
+            forwarderList.add(deviceId2);
+            return forwarderList;
+        }
+
+        @Override
+        public Set<LoadBalanceId> getLoadBalancePathMapKeys() {
+            LoadBalanceId id = LoadBalanceId.of((byte) 1);
+            Set<LoadBalanceId> set = new HashSet<LoadBalanceId>();
+            set.add(id);
+            return set;
+        }
+
+        @Override
+        public PortChain oldPortChain() {
+            return null;
+        }
+    }
+
+    /**
+     * Sets up the global values for all the tests.
+     */
+    @Before
+    public void setUpTest() {
+        SfcCodecContext context = new SfcCodecContext();
+        ServiceDirectory testDirectory = new TestServiceDirectory()
+        .add(PortChainService.class, portChainService)
+        .add(CodecService.class, context.codecManager());
+        BaseResource.setServiceDirectory(testDirectory);
+    }
+
+    /**
+     * Cleans up.
+     */
+    @After
+    public void tearDownTest() {
+    }
+
+    /**
+     * Tests the result of a rest api GET for port chain id.
+     */
+    @Test
+    public void testGetPortChainDeviceMap() {
+
+        expect(portChainService.getPortChain(anyObject())).andReturn(portChain1).anyTimes();
+        replay(portChainService);
+
+        final WebTarget wt = target();
+        final String response = wt.path("portChainDeviceMap/1278dcd4-459f-62ed-754b-87fc5e4a6751").request()
+                .get(String.class);
+        final JsonObject result = Json.parse(response).asObject();
+        assertThat(result, notNullValue());
+        assertThat(result.names().get(0), is("portChainDeviceMap"));
+
+    }
+}
diff --git a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainResourceTest.java b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainResourceTest.java
index deac05f..8e96a3f 100644
--- a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainResourceTest.java
+++ b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainResourceTest.java
@@ -15,10 +15,29 @@
  */
 package org.onosproject.vtnweb.resources;
 
-import com.eclipsesource.json.Json;
-import com.eclipsesource.json.JsonObject;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+import javax.ws.rs.NotFoundException;
+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 org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -38,28 +57,10 @@
 import org.onosproject.vtnrsc.portchain.PortChainService;
 import org.onosproject.vtnweb.web.SfcCodecContext;
 
-import javax.ws.rs.NotFoundException;
-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 java.net.HttpURLConnection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
+import com.eclipsesource.json.Json;
+import com.eclipsesource.json.JsonObject;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 
 /**
  * Unit tests for port chain REST APIs.
@@ -165,7 +166,7 @@
         }
 
         @Override
-        public Optional<LoadBalanceId> matchPath(List<PortPairId> path) {
+        public LoadBalanceId matchPath(List<PortPairId> path) {
             return null;
         }
 
@@ -204,6 +205,11 @@
         public Set<LoadBalanceId> getLoadBalancePathMapKeys() {
             return null;
         }
+
+        @Override
+        public PortChain oldPortChain() {
+            return null;
+        }
     }
 
     /**
diff --git a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainSfMapResourceTest.java b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainSfMapResourceTest.java
new file mode 100644
index 0000000..b95817c
--- /dev/null
+++ b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainSfMapResourceTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2016-present 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.resources;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.ws.rs.client.WebTarget;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.osgi.TestServiceDirectory;
+import org.onlab.rest.BaseResource;
+import org.onosproject.codec.CodecService;
+import org.onosproject.vtnrsc.PortPairId;
+import org.onosproject.vtnrsc.ServiceFunctionGroup;
+import org.onosproject.vtnrsc.portchainsfmap.PortChainSfMapService;
+import org.onosproject.vtnweb.web.SfcCodecContext;
+
+import com.eclipsesource.json.Json;
+import com.eclipsesource.json.JsonObject;
+import com.google.common.collect.Lists;
+
+/**
+ * Unit tests for port chain sf map REST APIs.
+ */
+public class PortChainSfMapResourceTest extends VtnResourceTest {
+
+    final PortChainSfMapService portChainSfMapService = createMock(PortChainSfMapService.class);
+
+    String name1 = "Firewall";
+    String description1 = "Firewall service function";
+    Map<PortPairId, Integer> portPairLoadMap1 = new ConcurrentHashMap<>();
+
+    ServiceFunctionGroup serviceFunction1 = new ServiceFunctionGroup(name1, description1,
+                                                                     portPairLoadMap1);
+
+    /**
+     * Sets up the global values for all the tests.
+     */
+    @Before
+    public void setUpTest() {
+        SfcCodecContext context = new SfcCodecContext();
+        ServiceDirectory testDirectory = new TestServiceDirectory()
+                .add(PortChainSfMapService.class, portChainSfMapService)
+                .add(CodecService.class, context.codecManager());
+        BaseResource.setServiceDirectory(testDirectory);
+    }
+
+    /**
+     * Cleans up.
+     */
+    @After
+    public void tearDownTest() {
+    }
+
+    /**
+     * Tests the result of a rest api GET for port chain id.
+     */
+    @Test
+    public void testGetPortChainId() {
+
+        final List<ServiceFunctionGroup> serviceFunctions = Lists.newArrayList();
+        serviceFunctions.add(serviceFunction1);
+
+        expect(portChainSfMapService.getServiceFunctions(anyObject())).andReturn(serviceFunctions).anyTimes();
+        replay(portChainSfMapService);
+
+        final WebTarget wt = target();
+        final String response = wt.path("portChainSfMap/1278dcd4-459f-62ed-754b-87fc5e4a6751").request()
+                .get(String.class);
+        final JsonObject result = Json.parse(response).asObject();
+        assertThat(result, notNullValue());
+        assertThat(result.names().get(0), is("portChainSfMap"));
+    }
+}
diff --git a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortPairGroupResourceTest.java b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortPairGroupResourceTest.java
index c33d929..94aab56 100644
--- a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortPairGroupResourceTest.java
+++ b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortPairGroupResourceTest.java
@@ -136,6 +136,10 @@
                     Objects.equals(this.portPairGroupId, portPairGroup.portPairGroupId()) &&
                     Objects.equals(this.tenantId, portPairGroup.tenantId());
         }
+
+        @Override
+        public void resetLoad() {
+        }
     }
 
     /**
