diff --git a/src/main/java/org.onosproject.xran/rest/CellWebResource.java b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
index 25825a9..ac2806d 100644
--- a/src/main/java/org.onosproject.xran/rest/CellWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.xran.rest;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.commons.lang.exception.ExceptionUtils;
@@ -23,6 +24,7 @@
 import org.onosproject.xran.annotations.Patch;
 import org.onosproject.xran.controller.XranController;
 import org.onosproject.xran.entities.RnibCell;
+import org.onosproject.xran.rest.ResponseHelper.statusCode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,7 +35,6 @@
 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.concurrent.SynchronousQueue;
 import java.util.concurrent.TimeUnit;
@@ -47,6 +48,9 @@
     private static final Logger log =
             LoggerFactory.getLogger(CellWebResource.class);
 
+    public CellWebResource() {
+    }
+
     /**
      * test.
      *
@@ -61,20 +65,34 @@
 
         if (cell != null) {
             try {
-                ObjectNode rootNode = mapper().createObjectNode();
+                JsonNode jsonNode = mapper().valueToTree(cell);
 
-                JsonNode jsonNode = mapper().readTree(cell.toString());
-                rootNode.put("cell", jsonNode);
-            } catch (IOException e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        statusCode.OK,
+                        jsonNode
+                );
+
+            } catch (Exception e) {
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
                 e.printStackTrace();
-                return Response.serverError()
-                        .entity(ExceptionUtils.getFullStackTrace(e))
-                        .build();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
             }
         }
 
-        return Response.serverError().entity("cell not found").build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                statusCode.NOT_FOUND,
+                "Not Found",
+                "Cell with " + eciHex + " was not found"
+        );
     }
 
     /**
@@ -87,6 +105,7 @@
     @Patch
     @Path("{cellid}")
     @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
     public Response patchCell(@PathParam("cellid") String eciHex, InputStream stream) {
         RnibCell cell = get(XranStore.class).getCell(eciHex);
 
@@ -104,27 +123,41 @@
                     String poll = queue[0].poll(5, TimeUnit.SECONDS);
 
                     if (poll != null) {
-                        return Response.ok()
-                                .entity(poll)
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                statusCode.OK,
+                                "Handoff Response",
+                                poll
+                        );
                     } else {
-                        return Response.serverError()
-                                .entity("did not receive response in time")
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                statusCode.REQUEST_TIMEOUT,
+                                "Handoff Timeout",
+                                "eNodeB did not send a HOComplete/HOFailure on time"
+                        );
                     }
                 }
             } catch (Exception e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
                 e.printStackTrace();
-                return Response.serverError()
-                        .entity(ExceptionUtils.getFullStackTrace(e))
-                        .build();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
             }
         }
 
-        return Response.serverError()
-                .entity("cell not found")
-                .build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                statusCode.NOT_FOUND,
+                "Not Found",
+                "Cell " + eciHex + " was not found"
+        );
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
index 8a85941..4d8dc11 100644
--- a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.xran.rest;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
@@ -26,14 +27,20 @@
 import org.onosproject.xran.entities.RnibCell;
 import org.onosproject.xran.entities.RnibLink;
 import org.onosproject.xran.entities.RnibUe;
-import org.openmuc.jasn1.ber.types.BerInteger;
+import org.onosproject.xran.codecs.ber.types.BerInteger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.ws.rs.*;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 import java.util.Optional;
@@ -49,6 +56,10 @@
     private static final Logger log =
             LoggerFactory.getLogger(LinkWebResource.class);
 
+    public LinkWebResource() {
+
+    }
+
     /**
      * test.
      *
@@ -74,18 +85,35 @@
             list.addAll(get(XranStore.class).getLinks());
         }
 
-        try {
-            ObjectNode rootNode = mapper().createObjectNode();
-            JsonNode jsonNode = mapper().readTree(list.toString());
-            rootNode.put("links", jsonNode);
-            return Response.ok(rootNode.toString()).build();
-        } catch (IOException e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
-            e.printStackTrace();
-            return Response.serverError()
-                    .entity(ExceptionUtils.getFullStackTrace(e))
-                    .build();
+        if (list.size() > 0) {
+            try {
+                JsonNode jsonNode = mapper().valueToTree(list);
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.OK,
+                        jsonNode
+                );
+            } catch (Exception e) {
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
+                e.printStackTrace();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
+            }
         }
+
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_FOUND,
+                "Not Found",
+                "Specified links not found"
+        );
     }
 
     /**
@@ -99,6 +127,7 @@
     @Patch
     @Path("{src},{dst}")
     @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
     public Response patchLinks(@PathParam("src") String src, @PathParam("dst") long dst, InputStream stream) {
         RnibLink link = get(XranStore.class).getLinkBetweenCellIdUeId(src, dst);
         if (link != null) {
@@ -122,12 +151,25 @@
                 }
 
             } catch (Exception e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
                 e.printStackTrace();
-                return Response.serverError().entity(ExceptionUtils.getFullStackTrace(e)).build();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
             }
         }
-        return Response.serverError().entity("link not found use POST request").build();
+
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_FOUND,
+                "Not Found",
+                "Link not found use POST request"
+        );
     }
 
     /**
@@ -141,26 +183,36 @@
     @POST
     @Path("{src},{dst}")
     @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
     public Response postLinks(@PathParam("src") String src, @PathParam("dst") long dst, InputStream stream) {
         RnibCell cell = get(XranStore.class).getCell(src);
         RnibUe ue = get(XranStore.class).getUe(dst);
 
         if (cell == null) {
-            return Response.serverError()
-                    .entity("cell not found")
-                    .build();
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.NOT_FOUND,
+                    "Not Found",
+                    "Cell " + src + " was not found"
+            );
         }
 
         if (ue == null) {
-            return Response.serverError()
-                    .entity("ue not found")
-                    .build();
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.NOT_FOUND,
+                    "Not Found",
+                    "Ue with " + dst + " was not found"
+            );
         }
 
         if (get(XranStore.class).getLink(cell.getEcgi(), ue.getMmeS1apId()) != null) {
-            return Response.serverError()
-                    .entity("link exists use PATCH request")
-                    .build();
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.BAD_REQUEST,
+                    "Bad Request",
+                    "Link already exists use PATCH to modify"
+            );
         }
 
         try {
@@ -186,16 +238,24 @@
             }
 
         } catch (Exception e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
+            String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+            log.error(fullStackTrace);
             e.printStackTrace();
-            return Response.serverError()
-                    .entity(ExceptionUtils.getFullStackTrace(e))
-                    .build();
+
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                    "Exception",
+                    fullStackTrace
+            );
         }
 
-        return Response.serverError()
-                .entity("unreachable code")
-                .build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_IMPLEMENTED,
+                "Not Implemented",
+                "This request is not implemented"
+        );
     }
 
     private Response handleTypeChange(RnibLink link, RnibLink.Type newType) throws InterruptedException {
@@ -204,9 +264,12 @@
         if (newType.equals(RnibLink.Type.SERVING_PRIMARY)) {
             switch (link.getType()) {
                 case SERVING_PRIMARY: {
-                    return Response.serverError()
-                            .entity("link already a primary")
-                            .build();
+                    return ResponseHelper.getResponse(
+                            mapper(),
+                            ResponseHelper.statusCode.BAD_REQUEST,
+                            "Bad Request",
+                            "Link is already a primary link"
+                    );
                 }
                 case SERVING_SECONDARY_CA:
                 case SERVING_SECONDARY_DC:
@@ -221,73 +284,109 @@
                         String poll = queue[0].poll(5, TimeUnit.SECONDS);
 
                         if (poll != null) {
-                            return Response.ok()
-                                    .entity(poll)
-                                    .build();
+                            return ResponseHelper.getResponse(
+                                    mapper(),
+                                    ResponseHelper.statusCode.OK,
+                                    "Handoff Response",
+                                    poll
+                            );
                         } else {
-                            return Response.serverError()
-                                    .entity("did not receive response in time")
-                                    .build();
+                            return ResponseHelper.getResponse(
+                                    mapper(),
+                                    ResponseHelper.statusCode.REQUEST_TIMEOUT,
+                                    "Handoff Timeout",
+                                    "eNodeB did not send a HOComplete/HOFailure on time"
+                            );
                         }
                     } else {
                         link.setType(RnibLink.Type.SERVING_PRIMARY);
-                        return Response.ok()
-                                .entity("there was not another primary link")
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                ResponseHelper.statusCode.OK,
+                                "OK",
+                                "Link set to primary"
+                        );
                     }
                 }
             }
         } else if (newType.equals(RnibLink.Type.NON_SERVING)) {
             switch (link.getType()) {
                 case NON_SERVING:
-                    return Response.ok()
-                            .entity("It's already a non serving link!" + link)
-                            .build();
+                    return ResponseHelper.getResponse(
+                            mapper(),
+                            ResponseHelper.statusCode.BAD_REQUEST,
+                            "Bad Request",
+                            "Link is already a primary link"
+                    );
                 case SERVING_PRIMARY:
-                    return Response.serverError()
-                            .entity("Cannot change a Primary link.")
-                            .build();
+                    return ResponseHelper.getResponse(
+                            mapper(),
+                            ResponseHelper.statusCode.BAD_REQUEST,
+                            "Bad Request",
+                            "Cannot modify a primary link"
+                    );
                 case SERVING_SECONDARY_CA:
                 case SERVING_SECONDARY_DC:
                     if (get(XranController.class).sendScellDelete(link)) {
-                        return Response.ok()
-                                .entity("Successfully changed link type to " + link.getType())
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                ResponseHelper.statusCode.OK,
+                                "OK",
+                                "Link set to non-serving"
+                        );
                     } else {
-                        return Response.serverError()
-                                .entity("Could not change link type.")
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                ResponseHelper.statusCode.NOT_FOUND,
+                                "Not Found",
+                                "Could not find cell config report to construct Scell Delete"
+                        );
                     }
             }
         } else if (newType.equals(RnibLink.Type.SERVING_SECONDARY_CA)) {
             switch (link.getType()) {
                 case SERVING_PRIMARY:
-                    return Response.serverError()
-                            .entity("Cannot change a Primary link.")
-                            .build();
+                    return ResponseHelper.getResponse(
+                            mapper(),
+                            ResponseHelper.statusCode.BAD_REQUEST,
+                            "Bad Request",
+                            "Cannot modify a primary link"
+                    );
                 case SERVING_SECONDARY_DC:
                 case NON_SERVING:
                     queue[0] = get(XranController.class).sendScellAdd(link);
                     String poll = queue[0].poll(5, TimeUnit.SECONDS);
                     if (poll != null) {
-                        return Response.ok()
-                                .entity("Successfully changed link type to " + link.getType())
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                ResponseHelper.statusCode.OK,
+                                "ScellAdd Response",
+                                poll
+                        );
                     } else {
-                        return Response.serverError()
-                                .entity("did not receive response in time")
-                                .build();
+                        return ResponseHelper.getResponse(
+                                mapper(),
+                                ResponseHelper.statusCode.REQUEST_TIMEOUT,
+                                "ScellAdd Timeout",
+                                "eNodeB did not send a ScellAddStatus on time"
+                        );
                     }
                 case SERVING_SECONDARY_CA:
-                    return Response.ok()
-                            .entity("It's already a service secondary ca link!")
-                            .build();
+                    return ResponseHelper.getResponse(
+                            mapper(),
+                            ResponseHelper.statusCode.BAD_REQUEST,
+                            "Bad Request",
+                            "Link is already a secondary CA link"
+                    );
             }
         }
 
-        return Response.serverError()
-                .entity("Unknown type")
-                .build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_IMPLEMENTED,
+                "Not Implemented",
+                "This request is not implemented"
+        );
     }
 
     private Response handleTrafficChange(RnibLink link, JsonNode trafficpercent) {
@@ -301,7 +400,12 @@
             link.getTrafficPercent().setTrafficPercentUl(new BerInteger(jsonNode.asInt()));
         }
 
-        return Response.ok("trafficpercent changed successfully").build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.OK,
+                "OK",
+                "Traffic Percent changed"
+        );
     }
 
     private Response handleRRMChange(RnibLink link, JsonNode rrmConf) throws InterruptedException {
@@ -312,13 +416,19 @@
         String poll = queue[0].poll(5, TimeUnit.SECONDS);
 
         if (poll != null) {
-            return Response.ok()
-                    .entity(poll)
-                    .build();
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.OK,
+                    "RRMConfig Response",
+                    poll
+            );
         } else {
-            return Response.serverError()
-                    .entity("did not receive response in time")
-                    .build();
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.REQUEST_TIMEOUT,
+                    "RRMConfig Timeout",
+                    "eNodeB did not send a RRMConfingStatus on time"
+            );
         }
     }
 }
diff --git a/src/main/java/org.onosproject.xran/rest/NodeWebResource.java b/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
index 7b54177..2b9124c 100644
--- a/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.xran.rest;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Lists;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.rest.AbstractWebResource;
@@ -34,7 +35,6 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import java.io.IOException;
 import java.util.List;
 
 /**
@@ -46,6 +46,10 @@
     private static final Logger log =
             LoggerFactory.getLogger(NodeWebResource.class);
 
+    public NodeWebResource() {
+
+    }
+
     /**
      * test.
      *
@@ -55,40 +59,52 @@
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public Response getNodes(@DefaultValue("") @QueryParam("type") String type) {
-        ObjectNode rootNode = mapper().createObjectNode();
-
+        JsonNode jsonNode;
         try {
+            List<Object> nodes;
             if (StringUtils.isBlank(type)) {
-                List<Object> nodes = get(XranStore.class).getNodes();
-
-                JsonNode jsonNode = mapper().readTree(nodes.get(0).toString());
-                JsonNode jsonNode2 = mapper().readTree(nodes.get(1).toString());
-
-                ObjectNode arrayNode = rootNode.putObject("nodes");
-                arrayNode.put("cells", jsonNode);
-                arrayNode.put("ues", jsonNode2);
+                nodes = get(XranStore.class).getNodes();
             } else if (type.equals("cell")) {
-                List<RnibCell> cellNodes = get(XranStore.class).getCellNodes();
-                JsonNode jsonNode = mapper().readTree(cellNodes.toString());
-
-                ObjectNode arrayNode = rootNode.putObject("nodes");
-                arrayNode.put("cells", jsonNode);
+                nodes = get(XranStore.class).getCellNodes();
             } else if (type.equals("ue")) {
-                List<RnibUe> ueNodes = get(XranStore.class).getUeNodes();
-                JsonNode jsonNode = mapper().readTree(ueNodes.toString());
-
-                ObjectNode arrayNode = rootNode.putObject("nodes");
-                arrayNode.put("ues", jsonNode);
+                nodes = get(XranStore.class).getUeNodes();
+            } else {
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.NOT_FOUND,
+                        "Not Found",
+                        "Type of node was not found"
+                );
             }
-        } catch (IOException e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
+
+            if (nodes.size() == 0) {
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.NOT_FOUND,
+                        "Not Found",
+                        "No nodes found"
+                );
+            }
+
+            jsonNode = mapper().valueToTree(nodes);
+        } catch (Exception e) {
+            String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+            log.error(fullStackTrace);
             e.printStackTrace();
-            return Response.serverError()
-                    .entity(ExceptionUtils.getFullStackTrace(e))
-                    .build();
+
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                    "Exception",
+                    fullStackTrace
+            );
         }
 
-        return ok(rootNode.toString()).build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.OK,
+                jsonNode
+        );
     }
 
     /**
@@ -105,20 +121,33 @@
 
         if (node != null) {
             try {
-                ObjectNode rootNode = mapper().createObjectNode();
-                JsonNode jsonNode = mapper().readTree(node.toString());
-                rootNode.put("node", jsonNode);
-                return ok(rootNode.toString()).build();
-            } catch (IOException e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
+                JsonNode jsonNode = mapper().valueToTree(node);
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.OK,
+                        jsonNode
+                );
+            } catch (Exception e) {
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
                 e.printStackTrace();
-                return Response.serverError()
-                        .entity(ExceptionUtils.getFullStackTrace(e))
-                        .build();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
             }
         }
 
-        return Response.serverError().entity("node not found").build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_FOUND,
+                "Not Found",
+                "Node " + nodeid + " was not found"
+        );
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/rest/ResponseHelper.java b/src/main/java/org.onosproject.xran/rest/ResponseHelper.java
new file mode 100644
index 0000000..826adc1
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/rest/ResponseHelper.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * 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.xran.rest;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import javax.ws.rs.core.Response;
+
+public class ResponseHelper {
+
+    public static Response getResponse(ObjectMapper mapper, statusCode status, String title, String detail) {
+        ObjectNode rootNode = mapper.createObjectNode();
+
+        switch (status) {
+            case OK:
+            case BAD_REQUEST:
+            case NOT_IMPLEMENTED:
+            case REQUEST_TIMEOUT:
+            case INTERNAL_SERVER_ERROR:
+            case NOT_FOUND: {
+                ArrayNode errors = rootNode.putArray("errors");
+                ObjectNode addObject = errors.addObject();
+                addObject.put("status", status.status);
+                addObject.put("title", title);
+                addObject.put("detail", detail);
+                return Response.status(status.status)
+                        .entity(rootNode.toString())
+                        .build();
+            }
+            default:
+                return Response.noContent().build();
+        }
+    }
+
+    public static Response getResponse(ObjectMapper mapper, statusCode status, JsonNode node) {
+        ObjectNode rootNode = mapper.createObjectNode();
+
+        switch (status) {
+            case OK:
+            case BAD_REQUEST:
+            case NOT_IMPLEMENTED:
+            case REQUEST_TIMEOUT:
+            case INTERNAL_SERVER_ERROR:
+            case NOT_FOUND: {
+                ArrayNode data = rootNode.putArray("data");
+                data.add(node);
+                return Response.status(status.status)
+                        .entity(rootNode.toString())
+                        .build();
+            }
+            default:
+                return Response.noContent().build();
+        }
+    }
+
+    public enum statusCode {
+        OK(200),
+        BAD_REQUEST(400),
+        NOT_FOUND(404),
+        REQUEST_TIMEOUT(408),
+        INTERNAL_SERVER_ERROR(500),
+        NOT_IMPLEMENTED(501);
+
+        public int status;
+
+        statusCode(int status) {
+            this.status = status;
+        }
+    }
+}
diff --git a/src/main/java/org.onosproject.xran/rest/SliceWebResource.java b/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
index e895d55..58b4bef 100644
--- a/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
@@ -15,8 +15,8 @@
  */
 package org.onosproject.xran.rest;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.rest.AbstractWebResource;
 import org.onosproject.xran.XranStore;
@@ -44,6 +44,10 @@
     private static final Logger log =
             LoggerFactory.getLogger(SliceWebResource.class);
 
+    public SliceWebResource() {
+
+    }
+
     /**
      * test.
      *
@@ -58,20 +62,33 @@
 
         if (slice != null) {
             try {
-                ObjectNode rootNode = mapper().createObjectNode();
-                JsonNode jsonNode = mapper().readTree(slice.toString());
-                rootNode.put("slice", jsonNode);
-                return ok(rootNode.toString()).build();
-            } catch (IOException e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
+                JsonNode jsonNode = mapper().valueToTree(slice);
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.OK,
+                        jsonNode
+                );
+            } catch (Exception e) {
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
                 e.printStackTrace();
-                return Response.serverError()
-                        .entity(ExceptionUtils.getFullStackTrace(e))
-                        .build();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
             }
         }
 
-        return Response.serverError().entity("slice not found").build();
+        return ResponseHelper.getResponse(
+                mapper(),
+                ResponseHelper.statusCode.NOT_FOUND,
+                "Not Found",
+                "Slice " + sliceid + " not found"
+        );
     }
 
     /**
@@ -82,19 +99,30 @@
      */
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
     public Response postSlice(InputStream stream) {
         try {
-            boolean b;
-            ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+//            ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+//            get(XranStore.class).createSlice(jsonTree);
 
-            b = get(XranStore.class).createSlice(jsonTree);
-            return ok(b).build();
+            // FIXME: change when implemented
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.NOT_IMPLEMENTED,
+                    "Not Implemented",
+                    "POST Slice not implemented"
+            );
         } catch (Exception e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
+            String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+            log.error(fullStackTrace);
             e.printStackTrace();
-            return Response.serverError()
-                    .entity(ExceptionUtils.getFullStackTrace(e))
-                    .build();
+
+            return ResponseHelper.getResponse(
+                    mapper(),
+                    ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                    "Exception",
+                    fullStackTrace
+            );
         }
     }
 
