diff --git a/src/main/java/org.onosproject.xran/rest/CellWebResource.java b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
index 336f67a..c62cd0e 100644
--- a/src/main/java/org.onosproject.xran/rest/CellWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
@@ -21,8 +21,6 @@
 import org.onosproject.rest.AbstractWebResource;
 import org.onosproject.xran.XranStore;
 import org.onosproject.xran.annotations.Patch;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.EUTRANCellIdentifier;
 import org.onosproject.xran.controller.XranController;
 import org.onosproject.xran.entities.RnibCell;
 import org.slf4j.Logger;
@@ -37,8 +35,8 @@
 import javax.ws.rs.core.Response;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Optional;
 import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Cell web resource.
@@ -59,25 +57,24 @@
     @Path("{cellid}")
     @Produces(MediaType.APPLICATION_JSON)
     public Response getCell(@PathParam("cellid") String eciHex) {
-        log.debug("GET CELLID {}", eciHex);
-
         RnibCell cell = get(XranStore.class).getCell(eciHex);
 
-        ObjectNode rootNode = mapper().createObjectNode();
-
         if (cell != null) {
             try {
+                ObjectNode rootNode = mapper().createObjectNode();
+
                 JsonNode jsonNode = mapper().readTree(cell.toString());
                 rootNode.put("cell", jsonNode);
             } catch (IOException e) {
                 log.error(ExceptionUtils.getFullStackTrace(e));
                 e.printStackTrace();
+                return Response.serverError()
+                        .entity(ExceptionUtils.getFullStackTrace(e))
+                        .build();
             }
-        } else {
-            rootNode.put("error", "not found");
         }
 
-        return ok(rootNode.toString()).build();
+        return Response.serverError().entity("cell not found").build();
     }
 
     /**
@@ -91,31 +88,41 @@
     @Path("{cellid}")
     @Consumes(MediaType.APPLICATION_JSON)
     public Response patchCell(@PathParam("cellid") String eciHex, InputStream stream) {
-        log.debug("PATCH CELLID {}", eciHex);
-
-        boolean b;
-
         RnibCell cell = get(XranStore.class).getCell(eciHex);
-        // Check if a cell with that ECI exists. If it does, then modify its contents.
 
-        try {
-            ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+        if (cell != null) {
+            try {
+                ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
-            JsonNode rrmConf = jsonTree.get("RRMConf");
-            if (rrmConf != null) {
-                final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
-                b = get(XranStore.class).modifyCellRrmConf(cell, rrmConf);
-                if (b) {
-                    queue[0] = get(XranController.class).sendModifiedRRMConf(cell);
-                    return Response.ok().entity(queue[0].take()).build();
+                JsonNode rrmConf = jsonTree.get("RRMConf");
+                if (rrmConf != null) {
+                    final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
+                    get(XranStore.class).modifyCellRrmConf(cell, rrmConf);
+
+                    queue[0] = get(XranController.class).sendModifiedRRMConf(cell.getRrmConfig(),
+                            cell.getVersion().equals("3"));
+                    String poll = queue[0].poll(5, TimeUnit.SECONDS);
+
+                    if (poll != null) {
+                        return Response.ok()
+                                .entity(poll)
+                                .build();
+                    } else {
+                        return Response.serverError()
+                                .entity("did not receive response in time")
+                                .build();
+                    }
                 }
+            } catch (Exception e) {
+                log.error(ExceptionUtils.getFullStackTrace(e));
+                e.printStackTrace();
+                return Response.serverError()
+                        .entity(ExceptionUtils.getFullStackTrace(e))
+                        .build();
             }
-        } catch (Exception e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
-            e.printStackTrace();
-            return Response.serverError().entity(ExceptionUtils.getFullStackTrace(e)).build();
         }
-        return Response.noContent().build();
+
+        return Response.serverError().entity("cell not found").build();
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
index 370755f..3640a1d 100644
--- a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
@@ -43,6 +43,7 @@
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Link web resource.
@@ -63,9 +64,7 @@
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public Response getLinksBetween(@DefaultValue("") @QueryParam("cell") String eciHex,
-                             @DefaultValue("-1") @QueryParam("ue") long ue) {
-        log.debug("GET LINKS CELL {} AND UE {}", eciHex, ue);
-
+                                    @DefaultValue("-1") @QueryParam("ue") long ue) {
         List<RnibLink> list = Lists.newArrayList();
         if (!eciHex.isEmpty() && ue != -1) {
             RnibLink link = get(XranStore.class).getLinkBetweenCellIdUeId(eciHex, ue);
@@ -80,17 +79,18 @@
             list.addAll(get(XranStore.class).getLinks());
         }
 
-        ObjectNode rootNode = mapper().createObjectNode();
-
         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();
         }
-
-        return ok(rootNode.toString()).build();
     }
 
     /**
@@ -105,12 +105,9 @@
     @Path("{src},{dst}")
     @Consumes(MediaType.APPLICATION_JSON)
     public Response patchLinks(@PathParam("src") String src, @PathParam("dst") long dst, InputStream stream) {
-        log.debug("Patch LINKS FROM {} to {}", src, dst);
-
-        try {
-            RnibLink link = get(XranStore.class).getLinkBetweenCellIdUeId(src, dst);
-            if (link != null) {
-
+        RnibLink link = get(XranStore.class).getLinkBetweenCellIdUeId(src, dst);
+        if (link != null) {
+            try {
                 ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
                 JsonNode type = jsonTree.get("type");
@@ -124,7 +121,17 @@
                                 .findFirst();
                         if (primary.isPresent()) {
                             queue[0] = get(XranController.class).sendHORequest(link, primary.get());
-                            return Response.ok().entity(queue[0].take()).build();
+                            String poll = queue[0].poll(5, TimeUnit.SECONDS);
+
+                            if (poll != null) {
+                                return Response.ok()
+                                        .entity(poll)
+                                        .build();
+                            } else {
+                                return Response.serverError()
+                                        .entity("did not receive response in time")
+                                        .build();
+                            }
                         }
                     }
                 }
@@ -139,16 +146,35 @@
                     if (jsonNode != null) {
                         link.getTrafficPercent().setTrafficPercentUl(new BerInteger(jsonNode.asInt()));
                     }
-                    return Response.ok().build();
+                    return Response.ok("trafficpercent changed successfully").build();
                 }
-            }
-        } catch (Exception e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
-            e.printStackTrace();
-            return Response.serverError().entity(ExceptionUtils.getFullStackTrace(e)).build();
-        }
 
-        return Response.noContent().build();
+                JsonNode rrmConf = jsonTree.get("RRMConf");
+                if (rrmConf != null) {
+                    final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
+                    get(XranStore.class).modifyLinkRrmConf(link, rrmConf);
+                    queue[0] = get(XranController.class).sendModifiedRRMConf(link.getRrmParameters(),
+                            link.getLinkId().getCell().getVersion().equals("3"));
+                    String poll = queue[0].poll(5, TimeUnit.SECONDS);
+
+                    if (poll != null) {
+                        return Response.ok()
+                                .entity(poll)
+                                .build();
+                    } else {
+                        return Response.serverError()
+                                .entity("did not receive response in time")
+                                .build();
+                    }
+                }
+
+            } catch (Exception e) {
+                log.error(ExceptionUtils.getFullStackTrace(e));
+                e.printStackTrace();
+                return Response.serverError().entity(ExceptionUtils.getFullStackTrace(e)).build();
+            }
+        }
+        return Response.serverError().entity("link not found").build();
     }
 
     /**
@@ -163,23 +189,25 @@
     @Path("{src},{dst}")
     @Consumes(MediaType.APPLICATION_JSON)
     public Response postLinks(@PathParam("src") String src, @PathParam("dst") long dst, InputStream stream) {
-        log.debug("POST LINKS FROM {} to {}", src, dst);
-
-        boolean b = false;
         try {
             ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
             JsonNode type = jsonTree.get("type");
 
             if (type != null) {
+                boolean b;
                 b = get(XranStore.class).createLinkBetweenCellIdUeId(src, dst, type.asText());
+                return ok(b).build();
             }
         } catch (Exception e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
             e.printStackTrace();
+            return Response.serverError()
+                    .entity(ExceptionUtils.getFullStackTrace(e))
+                    .build();
         }
 
-        return ok(b).build();
+        return Response.serverError().entity("unreachable code").build();
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/rest/NodeWebResource.java b/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
index 1a70ccc..7b54177 100644
--- a/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
@@ -55,8 +55,6 @@
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public Response getNodes(@DefaultValue("") @QueryParam("type") String type) {
-        log.debug("GET NODES " + type);
-
         ObjectNode rootNode = mapper().createObjectNode();
 
         try {
@@ -85,6 +83,9 @@
         } catch (IOException e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
             e.printStackTrace();
+            return Response.serverError()
+                    .entity(ExceptionUtils.getFullStackTrace(e))
+                    .build();
         }
 
         return ok(rootNode.toString()).build();
@@ -100,25 +101,24 @@
     @Path("{nodeid}")
     @Produces(MediaType.APPLICATION_JSON)
     public Response getNodeid(@PathParam("nodeid") String nodeid) {
-        log.debug("GET NODEID {}", nodeid);
-
         Object node = get(XranStore.class).getByNodeId(nodeid);
 
-        ObjectNode rootNode = mapper().createObjectNode();
-
         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));
                 e.printStackTrace();
+                return Response.serverError()
+                        .entity(ExceptionUtils.getFullStackTrace(e))
+                        .build();
             }
-        } else {
-            rootNode.put("error", "not found");
         }
 
-        return ok(rootNode.toString()).build();
+        return Response.serverError().entity("node not found").build();
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/rest/SliceWebResource.java b/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
index 2fe8385..e895d55 100644
--- a/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
@@ -54,25 +54,24 @@
     @Path("{sliceid}")
     @Produces(MediaType.APPLICATION_JSON)
     public Response getSlice(@PathParam("sliceid") long sliceid) {
-        log.debug("GET SLICE {}", sliceid);
-
         RnibSlice slice = get(XranStore.class).getSlice(sliceid);
 
-        ObjectNode rootNode = mapper().createObjectNode();
-
         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));
                 e.printStackTrace();
+                return Response.serverError()
+                        .entity(ExceptionUtils.getFullStackTrace(e))
+                        .build();
             }
-        } else {
-            rootNode.put("error", "not found");
         }
 
-        return ok(rootNode.toString()).build();
+        return Response.serverError().entity("slice not found").build();
     }
 
     /**
@@ -84,19 +83,19 @@
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
     public Response postSlice(InputStream stream) {
-        log.debug("POST SLICE");
-
-        boolean b = false;
         try {
+            boolean b;
             ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
             b = get(XranStore.class).createSlice(jsonTree);
+            return ok(b).build();
         } catch (Exception e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
             e.printStackTrace();
+            return Response.serverError()
+                    .entity(ExceptionUtils.getFullStackTrace(e))
+                    .build();
         }
-
-        return ok(b).build();
     }
 
 }
