diff --git a/apps/pce/src/main/java/org/onosproject/pce/web/PceCodecRegistrator.java b/apps/pce/src/main/java/org/onosproject/pce/web/PceCodecRegistrator.java
new file mode 100644
index 0000000..5554e64
--- /dev/null
+++ b/apps/pce/src/main/java/org/onosproject/pce/web/PceCodecRegistrator.java
@@ -0,0 +1,49 @@
+/*
+ * 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.pce.web;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.codec.CodecService;
+import org.onosproject.pce.pceservice.PcePath;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of the json codec brokering service for pce app.
+ */
+@Component(immediate = true)
+public class PceCodecRegistrator {
+
+    private static Logger log = LoggerFactory.getLogger(PceCodecRegistrator.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CodecService codecService;
+
+    @Activate
+    public void activate() {
+        codecService.registerCodec(PcePath.class, new PcePathCodec());
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        log.info("Stopped");
+    }
+}
diff --git a/apps/pce/src/main/java/org/onosproject/pce/web/PcePathCodec.java b/apps/pce/src/main/java/org/onosproject/pce/web/PcePathCodec.java
new file mode 100644
index 0000000..9c16bd0
--- /dev/null
+++ b/apps/pce/src/main/java/org/onosproject/pce/web/PcePathCodec.java
@@ -0,0 +1,123 @@
+/*
+ * 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.pce.web;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.pce.pceservice.PcePath;
+import org.onosproject.pce.pceservice.DefaultPcePath;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.JsonNode;
+
+/**
+ * PCE path json codec.
+ */
+public final class PcePathCodec extends JsonCodec<PcePath> {
+    private final Logger log = LoggerFactory.getLogger(PcePathCodec.class);
+    private static final String SOURCE = "source";
+    private static final String DESTINATION = "destination";
+    private static final String LSP_TYPE = "pathType";
+    private static final String SYMBOLIC_PATH_NAME = "name";
+    private static final String CONSTRAINT = "constraint";
+    private static final String COST = "cost";
+    private static final String BANDWIDTH = "bandwidth";
+    private static final String PATH_ID = "pathId";
+    private static final String MISSING_MEMBER_MESSAGE = " member is required in pce-path";
+
+    @Override
+    public PcePath decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            log.error("Empty json input");
+            return null;
+        }
+
+        // build pce-path
+        PcePath.Builder resultBuilder = new DefaultPcePath.Builder();
+
+        // retrieve source
+        JsonNode jNode = json.get(SOURCE);
+        if (jNode != null) {
+            String src = jNode.asText();
+            resultBuilder.source(src);
+        }
+
+        // retrieve destination
+        jNode = json.get(DESTINATION);
+        if (jNode != null) {
+            String dst = jNode.asText();
+            resultBuilder.destination(dst);
+        }
+
+        // retrieve lsp-type
+        jNode = json.get(LSP_TYPE);
+        if (jNode != null) {
+            String lspType = jNode.asText();
+            resultBuilder.lspType(lspType);
+        }
+
+        // retrieve symbolic-path-name
+        jNode = json.get(SYMBOLIC_PATH_NAME);
+        if (jNode != null) {
+            String name = jNode.asText();
+            resultBuilder.name(name);
+        }
+
+        // retrieve constraint
+        JsonNode constraintJNode = (JsonNode) json.path(CONSTRAINT);
+        if ((constraintJNode != null) && (!constraintJNode.isMissingNode())) {
+            // retrieve cost
+            jNode = constraintJNode.get(COST);
+            if (jNode != null) {
+                String cost = jNode.asText();
+                resultBuilder.bandwidthConstraint(cost);
+            }
+
+            // retrieve bandwidth
+            jNode = constraintJNode.get(BANDWIDTH);
+            if (jNode != null) {
+                String bandwidth = jNode.asText();
+                resultBuilder.bandwidthConstraint(bandwidth);
+            }
+        }
+
+        return resultBuilder.build();
+    }
+
+    @Override
+    public ObjectNode encode(PcePath path, CodecContext context) {
+        checkNotNull(path, "path output cannot be null");
+        ObjectNode result = context.mapper()
+                .createObjectNode()
+                .put(PATH_ID, path.id().id())
+                .put(SOURCE, path.source())
+                .put(DESTINATION, path.destination())
+                .put(LSP_TYPE, path.lspType().type())
+                .put(SYMBOLIC_PATH_NAME, path.name());
+
+        ObjectNode constraintNode = context.mapper()
+                .createObjectNode()
+                .put(COST, path.costConstraint().toString())
+                .put(BANDWIDTH, path.bandwidthConstraint().toString());
+
+        result.set(CONSTRAINT, constraintNode);
+        return result;
+    }
+}
diff --git a/apps/pce/src/main/java/org/onosproject/pce/web/PcePathWebResource.java b/apps/pce/src/main/java/org/onosproject/pce/web/PcePathWebResource.java
new file mode 100644
index 0000000..19244f7
--- /dev/null
+++ b/apps/pce/src/main/java/org/onosproject/pce/web/PcePathWebResource.java
@@ -0,0 +1,207 @@
+/*
+ * 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.pce.web;
+
+import static javax.ws.rs.core.Response.Status.OK;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.LinkedList;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+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.incubator.net.tunnel.Tunnel;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.intent.Constraint;
+import org.onosproject.pce.pceservice.PcePath;
+import org.onosproject.pce.pceservice.DefaultPcePath;
+import org.onosproject.pce.pceservice.LspType;
+import org.onosproject.rest.AbstractWebResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * Query and program pce path.
+ */
+
+@Path("path")
+public class PcePathWebResource extends AbstractWebResource {
+
+    private final Logger log = LoggerFactory.getLogger(PcePathWebResource.class);
+    public static final String PCE_PATH_NOT_FOUND = "Path not found";
+    public static final String PCE_PATH_ID_EXIST = "Path exists";
+    public static final String PCE_PATH_ID_NOT_EXIST = "Path does not exist for the identifier";
+
+    /**
+     * Retrieve details of all paths created.
+     *
+     * @return 200 OK
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response queryAllPath() {
+        log.debug("Query all paths.");
+        //TODO: need to uncomment below line once queryAllPath method is added to PceService
+        Iterable<Tunnel> tunnels = null; // = get(PceService.class).queryAllPath();
+        ObjectNode result = mapper().createObjectNode();
+        ArrayNode pathEntry = result.putArray("paths");
+        if (tunnels != null) {
+            for (final Tunnel tunnel : tunnels) {
+                PcePath path = DefaultPcePath.builder().of(tunnel).build();
+                pathEntry.add(codec(PcePath.class).encode(path, this));
+            }
+        }
+        return ok(result.toString()).build();
+    }
+
+    /**
+     * Retrieve details of a specified path id.
+     *
+     * @param id path id
+     * @return 200 OK, 404 if given identifier does not exist
+     */
+    @GET
+    @Path("{path_id}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response queryPath(@PathParam("path_id") String id) {
+        log.debug("Query path by identifier {}.", id);
+        //TODO: need to uncomment below lines once queryPath method is added to PceService
+        Tunnel tunnel = null; // = nullIsNotFound(get(PceService.class).queryPath(PcePathId.of(id)),
+                //PCE_PATH_NOT_FOUND);
+        PcePath path = DefaultPcePath.builder().of(tunnel).build();
+        ObjectNode result = mapper().createObjectNode();
+        result.set("path", codec(PcePath.class).encode(path, this));
+        return ok(result.toString()).build();
+    }
+
+    /**
+     * Creates a new path.
+     *
+     * @param stream pce path from json
+     * @return status of the request
+     */
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response setupPath(InputStream stream) {
+        log.debug("Setup path.");
+        try {
+            ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+            JsonNode port = jsonTree.get("path");
+            PcePath path = codec(PcePath.class).decode((ObjectNode) port, this);
+
+            DeviceId srcDevice = DeviceId.deviceId(path.source());
+            DeviceId dstDevice = DeviceId.deviceId(path.destination());
+            LspType lspType = path.lspType();
+            List<Constraint> listConstrnt = new LinkedList<Constraint>();
+
+            // add cost
+            //TODO: need to uncomment below lines once Bandwidth and Cost constraint classes are ready
+            //CostConstraint.Type costType = CostConstraint.Type.values()[Integer.valueOf(path.constraint().cost())];
+            //listConstrnt.add(CostConstraint.of(costType));
+
+            // add bandwidth. Data rate unit is in BPS.
+            //listConstrnt.add(LocalBandwidthConstraint.of(Double.valueOf(path.constraint().bandwidth()), DataRateUnit
+            //        .valueOf("BPS")));
+
+            //TODO: need to uncomment below lines once setupPath method is modified in PceService
+            Boolean issuccess = true; // = (null != get(PceService.class)
+                    //.setupPath(srcDevice, dstDevice, path.name(), listConstrnt, lspType)) ? true : false;
+            return Response.status(OK).entity(issuccess.toString()).build();
+        } catch (IOException e) {
+            log.error("Exception while creating path {}.", e.toString());
+            throw new IllegalArgumentException(e);
+        }
+    }
+
+    /**
+     * Update details of a specified path id.
+     *
+     * @param id path id
+     * @param stream pce path from json
+     * @return 200 OK, 404 if given identifier does not exist
+     */
+    @PUT
+    @Path("{path_id}")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response updatePath(@PathParam("path_id") String id,
+            final InputStream stream) {
+        log.debug("Update path by identifier {}.", id);
+        try {
+            ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+            JsonNode pathNode = jsonTree.get("path");
+            PcePath path = codec(PcePath.class).decode((ObjectNode) pathNode, this);
+            // Assign cost
+            List<Constraint> constrntList = new LinkedList<Constraint>();
+            //TODO: need to uncomment below lines once CostConstraint class is ready
+            if (path.costConstraint() != null) {
+                //CostConstraint.Type costType = CostConstraint.Type.values()[path.constraint().cost()];
+                //constrntList.add(CostConstraint.of(costType));
+            }
+
+            // Assign bandwidth. Data rate unit is in BPS.
+            if (path.bandwidthConstraint() != null) {
+                //TODO: need to uncomment below lines once BandwidthConstraint class is ready
+                //constrntList.add(LocalBandwidthConstraint
+                //        .of(path.constraint().bandwidth(), DataRateUnit.valueOf("BPS")));
+            }
+
+            //TODO: need to uncomment below line once updatePath is added to PceService
+            Boolean result = true; // = (null != (get(PceService.class).updatePath(PcePathId.of(id), constrntList)))
+                                      //? true : false;
+            return Response.status(OK).entity(result.toString()).build();
+        } catch (IOException e) {
+            log.error("Update path failed because of exception {}.", e.toString());
+            throw new IllegalArgumentException(e);
+        }
+    }
+
+    /**
+     * Release a specified path.
+     *
+     * @param id path id
+     * @return 200 OK, 404 if given identifier does not exist
+     */
+    @Path("{path_id}")
+    @DELETE
+    public Response releasePath(@PathParam("path_id") String id) {
+        log.debug("Deletes path by identifier {}.", id);
+
+        //TODO: need to uncomment below lines once releasePath method is added to PceService
+        Boolean isSuccess = true; // = nullIsNotFound(get(PceService.class).releasePath(PcePathId.of(id)),
+                //PCE_PATH_NOT_FOUND);
+        if (!isSuccess) {
+            log.debug("Path identifier {} does not exist", id);
+        }
+
+        return Response.status(OK).entity(isSuccess.toString()).build();
+    }
+}
diff --git a/apps/pce/src/main/java/org/onosproject/pce/web/PceWebApplication.java b/apps/pce/src/main/java/org/onosproject/pce/web/PceWebApplication.java
new file mode 100644
index 0000000..9cae9b3
--- /dev/null
+++ b/apps/pce/src/main/java/org/onosproject/pce/web/PceWebApplication.java
@@ -0,0 +1,32 @@
+/*
+ * 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.pce.web;
+
+import org.onlab.rest.AbstractWebApplication;
+
+import java.util.Set;
+
+/**
+ * PCE rest api web application.
+ */
+public class PceWebApplication extends AbstractWebApplication {
+    @Override
+    public Set<Class<?>> getClasses() {
+        return getClasses(PcePathWebResource.class);
+    }
+}
+
diff --git a/apps/pce/src/main/java/org/onosproject/pce/web/package-info.java b/apps/pce/src/main/java/org/onosproject/pce/web/package-info.java
new file mode 100644
index 0000000..08a1b6b
--- /dev/null
+++ b/apps/pce/src/main/java/org/onosproject/pce/web/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * PCE rest application.
+ */
+package org.onosproject.pce.web;
