diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/PolicyCodec.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/PolicyCodec.java
new file mode 100644
index 0000000..1f9e576
--- /dev/null
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/PolicyCodec.java
@@ -0,0 +1,120 @@
+/*
+ * 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.segmentrouting.web;
+
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.cli.net.IpProtocol;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.criteria.Criterion;
+import org.onosproject.net.flow.criteria.IPCriterion;
+import org.onosproject.net.flow.criteria.IPProtocolCriterion;
+import org.onosproject.segmentrouting.Policy;
+import org.onosproject.segmentrouting.TunnelPolicy;
+
+public final class PolicyCodec extends JsonCodec<Policy> {
+
+    // JSON field names
+    private static final String POLICY_ID = "policy_id";
+    private static final String PRIORITY = "priority";
+    private static final String TYPE = "policy_type";
+    private static final String TUNNEL_ID = "tunnel_id";
+    private static final String DST_IP = "dst_ip";
+    private static final String SRC_IP = "src_ip";
+    private static final String PROTO_TYPE = "proto_type";
+
+    @Override
+    public ObjectNode encode(Policy policy, CodecContext context) {
+        final ObjectNode result = context.mapper().createObjectNode()
+                .put(POLICY_ID, policy.id());
+
+        result.put(PRIORITY, policy.priority());
+        result.put(TYPE, policy.type().toString());
+
+        if (policy.selector().getCriterion(Criterion.Type.IPV4_DST) != null) {
+            IPCriterion criterion = (IPCriterion) policy.selector().getCriterion(
+                    Criterion.Type.IPV4_DST);
+            result.put(DST_IP, criterion.ip().toString());
+        }
+        if (policy.selector().getCriterion(Criterion.Type.IPV4_SRC) != null) {
+            IPCriterion criterion = (IPCriterion) policy.selector().getCriterion(
+                    Criterion.Type.IPV4_SRC);
+            result.put(SRC_IP, criterion.ip().toString());
+        }
+        if (policy.selector().getCriterion(Criterion.Type.IP_PROTO) != null) {
+            IPProtocolCriterion protocolCriterion =
+                    (IPProtocolCriterion) policy.selector().getCriterion(Criterion.Type.IP_PROTO);
+            result.put(PROTO_TYPE, protocolCriterion.toString());
+        }
+
+        if (policy.type() == Policy.Type.TUNNEL_FLOW) {
+            result.put(TUNNEL_ID, ((TunnelPolicy) policy).tunnelId());
+        }
+
+        return result;
+    }
+
+    @Override
+    public Policy decode(ObjectNode json, CodecContext context) {
+
+        String pid = json.path(POLICY_ID).asText();
+        String type = json.path(TYPE).asText();
+        int priority = json.path(PRIORITY).asInt();
+        String dstIp = json.path(DST_IP).asText();
+        String srcIp = json.path(SRC_IP).asText();
+        String tunnelId = json.path(TUNNEL_ID).asText();
+        String protoType = json.path(PROTO_TYPE).asText();
+
+        if (tunnelId != null) {
+            TrafficSelector.Builder tsb = DefaultTrafficSelector.builder();
+            tsb.matchEthType(Ethernet.TYPE_IPV4);
+            if (dstIp != null && !dstIp.isEmpty()) {
+                tsb.matchIPDst(IpPrefix.valueOf(dstIp));
+            }
+            if (srcIp != null && !srcIp.isEmpty()) {
+                tsb.matchIPSrc(IpPrefix.valueOf(srcIp));
+            }
+            if (protoType != null && !protoType.isEmpty()) {
+                Short ipProto = Short.valueOf(IpProtocol.valueOf(protoType).value());
+                tsb.matchIPProtocol(ipProto.byteValue());
+            }
+
+            TunnelPolicy.Builder tpb = TunnelPolicy.builder().setPolicyId(pid);
+            if (tunnelId != null) {
+                tpb.setTunnelId(tunnelId);
+            }
+            if (!json.path(PRIORITY).isMissingNode()) {
+                tpb.setPriority(priority);
+            }
+            if (!json.path(TYPE).isMissingNode()) {
+                tpb.setType(Policy.Type.valueOf(type));
+            }
+            tpb.setSelector(tsb.build());
+
+            return tpb.build();
+        } else {
+            // TODO: handle more policy types
+            return null;
+        }
+
+
+    }
+
+}
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/PolicyWebResource.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/PolicyWebResource.java
new file mode 100644
index 0000000..97e836a
--- /dev/null
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/PolicyWebResource.java
@@ -0,0 +1,85 @@
+/*
+ * 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.segmentrouting.web;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.segmentrouting.Policy;
+import org.onosproject.segmentrouting.SegmentRoutingManager;
+import org.onosproject.segmentrouting.SegmentRoutingService;
+import org.onosproject.segmentrouting.TunnelPolicy;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+@Path("policy")
+public class PolicyWebResource extends AbstractWebResource {
+
+    private static final PolicyCodec POLICY_CODEC = new PolicyCodec();
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getPolicy() {
+        SegmentRoutingService srService = get(SegmentRoutingService.class);
+        List<Policy> policies = srService.getPolicies();
+        ObjectNode result = new ObjectMapper().createObjectNode();
+        result.set("policy", new PolicyCodec().encode(policies, this));
+
+        return ok(result.toString()).build();
+    }
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response createPolicy(InputStream input) throws IOException {
+        ObjectMapper mapper = new ObjectMapper();
+        ObjectNode policyJson = (ObjectNode) mapper.readTree(input);
+        SegmentRoutingService srService = get(SegmentRoutingService.class);
+        Policy policyInfo = POLICY_CODEC.decode(policyJson, this);
+        if (policyInfo.type() == Policy.Type.TUNNEL_FLOW) {
+            TunnelPolicy policy = new TunnelPolicy((SegmentRoutingManager) srService, (TunnelPolicy) policyInfo);
+            srService.createPolicy(policy);
+
+            return Response.ok().build();
+        } else {
+            return Response.serverError().build();
+        }
+    }
+
+    @DELETE
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response removePolicy(InputStream input) throws IOException {
+        ObjectMapper mapper = new ObjectMapper();
+        ObjectNode policyJson = (ObjectNode) mapper.readTree(input);
+        SegmentRoutingService srService = get(SegmentRoutingService.class);
+        Policy policyInfo = POLICY_CODEC.decode(policyJson, this);
+        // TODO: Check the result
+        srService.removePolicy(policyInfo);
+        return Response.ok().build();
+
+    }
+
+}
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/TunnelCodec.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/TunnelCodec.java
new file mode 100644
index 0000000..2f85afd
--- /dev/null
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/TunnelCodec.java
@@ -0,0 +1,66 @@
+/*
+ * 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.segmentrouting.web;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.segmentrouting.DefaultTunnel;
+import org.onosproject.segmentrouting.Tunnel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public final class TunnelCodec extends JsonCodec<Tunnel> {
+
+    // JSON field names
+    private static final String TUNNEL_ID = "tunnel_id";
+    private static final String GROUP_ID = "group_id";
+    private static final String LABEL_PATH = "label_path";
+
+    @Override
+    public ObjectNode encode(Tunnel tunnel, CodecContext context) {
+        final ObjectNode result = context.mapper().createObjectNode()
+                .put(TUNNEL_ID, tunnel.id());
+
+        result.put(GROUP_ID, tunnel.groupId());
+
+        final ArrayNode jsonLabelIds = result.putArray(LABEL_PATH);
+
+        tunnel.labelIds().forEach(label -> jsonLabelIds.add(label.intValue()));
+
+        return result;
+    }
+
+    @Override
+    public DefaultTunnel decode(ObjectNode json, CodecContext context) {
+
+        String tid = json.path(TUNNEL_ID).asText();
+        List<Integer> labels = new ArrayList<>();
+
+        if (!json.path(LABEL_PATH).isMissingNode()) {
+            ArrayNode labelArray = (ArrayNode) json.path(LABEL_PATH);
+            for (JsonNode o : labelArray) {
+                labels.add(o.asInt());
+            }
+        }
+
+        return new DefaultTunnel(tid, labels);
+    }
+
+}
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/TunnelWebResource.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/TunnelWebResource.java
new file mode 100644
index 0000000..c531e3f
--- /dev/null
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/web/TunnelWebResource.java
@@ -0,0 +1,81 @@
+/*
+ * 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.segmentrouting.web;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.segmentrouting.DefaultTunnel;
+import org.onosproject.segmentrouting.SegmentRoutingManager;
+import org.onosproject.segmentrouting.SegmentRoutingService;
+import org.onosproject.segmentrouting.Tunnel;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+@Path("tunnel")
+public class TunnelWebResource extends AbstractWebResource {
+
+    private static final TunnelCodec TUNNEL_CODEC = new TunnelCodec();
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getTunnel() {
+        SegmentRoutingService srService = get(SegmentRoutingService.class);
+        List<Tunnel> tunnels = srService.getTunnels();
+        ObjectNode result = new ObjectMapper().createObjectNode();
+        result.set("tunnel", new TunnelCodec().encode(tunnels, this));
+
+        return ok(result.toString()).build();
+    }
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response createTunnel(InputStream input) throws IOException {
+        ObjectMapper mapper = new ObjectMapper();
+        ObjectNode tunnelJson = (ObjectNode) mapper.readTree(input);
+        SegmentRoutingService srService = get(SegmentRoutingService.class);
+        Tunnel tunnelInfo = TUNNEL_CODEC.decode(tunnelJson, this);
+        Tunnel tunnel = new DefaultTunnel((SegmentRoutingManager) srService,
+                tunnelInfo.id(), tunnelInfo.labelIds());
+        srService.createTunnel(tunnel);
+
+        return Response.ok().build();
+    }
+
+    @DELETE
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response removeTunnel(InputStream input) throws IOException {
+        ObjectMapper mapper = new ObjectMapper();
+        ObjectNode tunnelJson = (ObjectNode) mapper.readTree(input);
+        SegmentRoutingService srService = get(SegmentRoutingService.class);
+        Tunnel tunnelInfo = TUNNEL_CODEC.decode(tunnelJson, this);
+        srService.removeTunnel(tunnelInfo);
+
+        return Response.ok().build();
+    }
+
+}
