diff --git a/src/main/java/org.onosproject.xran/rest/CellWebResource.java b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
index 86438d5..54accd3 100644
--- a/src/main/java/org.onosproject.xran/rest/CellWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * Copyright 2016-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.
@@ -22,17 +22,16 @@
 import org.onosproject.xran.XranStore;
 import org.onosproject.xran.annotations.Patch;
 import org.onosproject.xran.controller.XranController;
-import org.onosproject.xran.controller.XranControllerImpl;
 import org.onosproject.xran.entities.RnibCell;
-import org.onosproject.xran.rest.ResponseHelper.statusCode;
+import org.onosproject.xran.rest.ResponseHelper.StatusCode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-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.Consumes;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.io.InputStream;
@@ -52,10 +51,10 @@
     }
 
     /**
-     * test.
+     * Lists the cell with {cellid}.
      *
-     * @param eciHex test
-     * @return test
+     * @param eciHex EutranCellIdentifier in binary
+     * @return Response
      */
     @GET
     @Path("{cellid}")
@@ -69,7 +68,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        statusCode.OK,
+                        StatusCode.OK,
                         jsonNode
                 );
 
@@ -80,7 +79,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        statusCode.INTERNAL_SERVER_ERROR,
+                        StatusCode.INTERNAL_SERVER_ERROR,
                         "Exception",
                         fullStackTrace
                 );
@@ -89,18 +88,18 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                statusCode.NOT_FOUND,
+                StatusCode.NOT_FOUND,
                 "Not Found",
                 "Cell with " + eciHex + " was not found"
         );
     }
 
     /**
-     * test.
+     * Modify the RRMConfig parameters of the cell.
      *
-     * @param eciHex test
-     * @param stream test (body of request)
-     * @return test
+     * @param eciHex EutranCellIdentifier in binary
+     * @param stream Parameters that you want to modify
+     * @return Response
      */
     @Patch
     @Path("{cellid}")
@@ -116,23 +115,24 @@
                 JsonNode rrmConf = jsonTree.path("RRMConf");
                 if (!rrmConf.isMissingNode()) {
                     final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
-                    get(XranStore.class).modifyCellRrmConf(cell, rrmConf);
+                    get(XranStore.class).modifycellrrmconf(cell, rrmConf);
 
-                    queue[0] = get(XranController.class).sendModifiedRRMConf(cell.getRrmConfig(),
+                    queue[0] = get(XranController.class).sendmodifiedrrmconf(cell.getRrmConfig(),
                             cell.getVersion() <= 3);
-                    String poll = queue[0].poll(get(XranController.class).getNorthbound_timeout(), TimeUnit.MILLISECONDS);
+                    String poll = queue[0].poll(get(XranController.class)
+                            .getNorthboundTimeout(), TimeUnit.MILLISECONDS);
 
                     if (poll != null) {
                         return ResponseHelper.getResponse(
                                 mapper(),
-                                statusCode.OK,
+                                StatusCode.OK,
                                 "Handoff Response",
                                 poll
                         );
                     } else {
                         return ResponseHelper.getResponse(
                                 mapper(),
-                                statusCode.REQUEST_TIMEOUT,
+                                StatusCode.REQUEST_TIMEOUT,
                                 "Handoff Timeout",
                                 "eNodeB did not send a HOComplete/HOFailure on time"
                         );
@@ -141,7 +141,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.BAD_REQUEST,
+                        StatusCode.BAD_REQUEST,
                         "Bad Request",
                         "The command you specified is not implemented or doesn't exist. We support " +
                                 "RRMConf commands."
@@ -153,7 +153,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        statusCode.INTERNAL_SERVER_ERROR,
+                        StatusCode.INTERNAL_SERVER_ERROR,
                         "Exception",
                         fullStackTrace
                 );
@@ -162,7 +162,7 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                statusCode.NOT_FOUND,
+                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 20780b3..420d7b4 100644
--- a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * Copyright 2016-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.
@@ -15,7 +15,6 @@
  */
 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;
@@ -23,23 +22,22 @@
 import org.onosproject.rest.AbstractWebResource;
 import org.onosproject.xran.XranStore;
 import org.onosproject.xran.annotations.Patch;
+import org.onosproject.xran.codecs.ber.types.BerInteger;
 import org.onosproject.xran.controller.XranController;
-import org.onosproject.xran.controller.XranControllerImpl;
 import org.onosproject.xran.entities.RnibCell;
 import org.onosproject.xran.entities.RnibLink;
 import org.onosproject.xran.entities.RnibUe;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-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.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.POST;
+import javax.ws.rs.PathParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.io.InputStream;
@@ -62,11 +60,11 @@
     }
 
     /**
-     * test.
+     * List all the links originating or terminating at cell/UE OR list the link connecting between cell and UE.
      *
-     * @param eciHex test
-     * @param ue     test
-     * @return test
+     * @param eciHex EutranCellIdentifier in binary
+     * @param ue     UE ID
+     * @return Response
      */
     @GET
     @Produces(MediaType.APPLICATION_JSON)
@@ -74,14 +72,14 @@
                                     @DefaultValue("-1") @QueryParam("ue") long ue) {
         List<RnibLink> list = Lists.newArrayList();
         if (!eciHex.isEmpty() && ue != -1) {
-            RnibLink link = get(XranStore.class).getLinkBetweenCellIdUeId(eciHex, ue);
+            RnibLink link = get(XranStore.class).getlinkbetweencellidueid(eciHex, ue);
             if (link != null) {
                 list.add(link);
             }
         } else if (!eciHex.isEmpty()) {
-            list.addAll(get(XranStore.class).getLinksByCellId(eciHex));
+            list.addAll(get(XranStore.class).getlinksbycellid(eciHex));
         } else if (ue != -1) {
-            list.addAll(get(XranStore.class).getLinksByUeId(ue));
+            list.addAll(get(XranStore.class).getlinksbyueid(ue));
         } else {
             list.addAll(get(XranStore.class).getLinks());
         }
@@ -92,7 +90,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.OK,
+                        ResponseHelper.StatusCode.OK,
                         jsonNode
                 );
             } catch (Exception e) {
@@ -102,7 +100,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
                         "Exception",
                         fullStackTrace
                 );
@@ -111,49 +109,52 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.statusCode.NOT_FOUND,
+                ResponseHelper.StatusCode.NOT_FOUND,
                 "Not Found",
                 "Specified links not found"
         );
     }
 
     /**
-     * test.
+     * Modify the link.
      *
-     * @param src    test
-     * @param dst    test
-     * @param stream test
-     * @return test
+     * @param src    CELL ECI in binary
+     * @param dst    UE ID
+     * @param stream Parameter on basis of which link is to be modified
+     * @return Response
      */
     @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);
+        RnibLink link = get(XranStore.class).getlinkbetweencellidueid(src, dst);
         if (link != null) {
             try {
                 ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
+                // Modify link based on Type
                 JsonNode type = jsonTree.path("type");
                 if (!type.isMissingNode()) {
                     RnibLink.Type anEnum = RnibLink.Type.getEnum(type.asText());
                     return handleTypeChange(link, anEnum);
                 }
 
+                // Modify link based on traffic percent
                 JsonNode trafficpercent = jsonTree.path("trafficpercent");
                 if (!trafficpercent.isMissingNode()) {
                     return handleTrafficChange(link, trafficpercent);
                 }
 
+                // Modify link based on RRMConf
                 JsonNode rrmConf = jsonTree.path("RRMConf");
                 if (!rrmConf.isMissingNode()) {
-                    return handleRRMChange(link, rrmConf);
+                    return handleRrmChange(link, rrmConf);
                 }
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.NOT_IMPLEMENTED,
+                        ResponseHelper.StatusCode.NOT_IMPLEMENTED,
                         "Not Implemented",
                         "The command you specified is not implemented or doesn't exist. We support " +
                                 "type/RRMConf/traficpercent commands."
@@ -166,7 +167,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
                         "Exception",
                         fullStackTrace
                 );
@@ -175,19 +176,19 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.statusCode.NOT_FOUND,
+                ResponseHelper.StatusCode.NOT_FOUND,
                 "Not Found",
                 "Link not found use POST request"
         );
     }
 
     /**
-     * test.
+     * Create link based on Type of the link.
      *
-     * @param src    test
-     * @param dst    test
-     * @param stream test
-     * @return test
+     * @param src    CELL ECI in binary
+     * @param dst    UE ID
+     * @param stream LinkType
+     * @return Response
      */
     @POST
     @Path("{src},{dst}")
@@ -200,7 +201,7 @@
         if (cell == null) {
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.statusCode.NOT_FOUND,
+                    ResponseHelper.StatusCode.NOT_FOUND,
                     "Not Found",
                     "Cell " + src + " was not found"
             );
@@ -209,7 +210,7 @@
         if (ue == null) {
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.statusCode.NOT_FOUND,
+                    ResponseHelper.StatusCode.NOT_FOUND,
                     "Not Found",
                     "Ue with " + dst + " was not found"
             );
@@ -218,7 +219,7 @@
         if (get(XranStore.class).getLink(cell.getEcgi(), ue.getId()) != null) {
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.statusCode.BAD_REQUEST,
+                    ResponseHelper.StatusCode.BAD_REQUEST,
                     "Bad Request",
                     "Link already exists use PATCH to modify"
             );
@@ -243,7 +244,7 @@
 
             JsonNode rrmConf = jsonTree.path("RRMConf");
             if (!rrmConf.isMissingNode()) {
-                return handleRRMChange(link, rrmConf);
+                return handleRrmChange(link, rrmConf);
             }
 
         } catch (Exception e) {
@@ -253,7 +254,7 @@
 
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                    ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
                     "Exception",
                     fullStackTrace
             );
@@ -261,22 +262,34 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.statusCode.BAD_REQUEST,
+                ResponseHelper.StatusCode.BAD_REQUEST,
                 "Bad Request",
-                "The command you specified is not implemented or doesn't exist. We support " +
+                "The command you specified is not implemented " +
+                        "or doesn't exist. We support " +
                         "type/RRMConf/traficpercent commands."
         );
     }
 
-    private Response handleTypeChange(RnibLink link, RnibLink.Type newType) throws InterruptedException {
+
+    /**
+     * Change link based on type of the link.
+     *
+     * @param link    Link
+     * @param newType LinkType
+     * @return Response
+     * @throws InterruptedException Interrupted queue
+     */
+    private Response handleTypeChange(RnibLink link, RnibLink.Type newType)
+            throws InterruptedException {
         final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
 
+
         if (newType.equals(RnibLink.Type.SERVING_PRIMARY)) {
             switch (link.getType()) {
                 case SERVING_PRIMARY: {
                     return ResponseHelper.getResponse(
                             mapper(),
-                            ResponseHelper.statusCode.BAD_REQUEST,
+                            ResponseHelper.StatusCode.BAD_REQUEST,
                             "Bad Request",
                             "Link is already a primary link"
                     );
@@ -284,26 +297,28 @@
                 case SERVING_SECONDARY_CA:
                 case SERVING_SECONDARY_DC:
                 case NON_SERVING: {
-                    List<RnibLink> linksByUeId = get(XranStore.class).getLinksByUeId(link.getLinkId().getUeId());
+                    List<RnibLink> linksByUeId = get(XranStore.class)
+                            .getlinksbyueid(link.getLinkId().getUeId());
 
                     Optional<RnibLink> primary = linksByUeId.stream()
                             .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
                             .findFirst();
                     if (primary.isPresent()) {
                         queue[0] = get(XranController.class).sendHORequest(link, primary.get());
-                        String poll = queue[0].poll(get(XranController.class).getNorthbound_timeout(), TimeUnit.MILLISECONDS);
+                        String poll = queue[0].poll(get(XranController.class)
+                                .getNorthboundTimeout(), TimeUnit.MILLISECONDS);
 
                         if (poll != null) {
                             return ResponseHelper.getResponse(
                                     mapper(),
-                                    ResponseHelper.statusCode.OK,
+                                    ResponseHelper.StatusCode.OK,
                                     "Handoff Response",
                                     poll
                             );
                         } else {
                             return ResponseHelper.getResponse(
                                     mapper(),
-                                    ResponseHelper.statusCode.REQUEST_TIMEOUT,
+                                    ResponseHelper.StatusCode.REQUEST_TIMEOUT,
                                     "Handoff Timeout",
                                     "eNodeB did not send a HOComplete/HOFailure on time"
                             );
@@ -312,93 +327,110 @@
                         link.setType(RnibLink.Type.SERVING_PRIMARY);
                         return ResponseHelper.getResponse(
                                 mapper(),
-                                ResponseHelper.statusCode.OK,
+                                ResponseHelper.StatusCode.OK,
                                 "OK",
                                 "Link set to primary"
                         );
                     }
                 }
+                default:
             }
         } else if (newType.equals(RnibLink.Type.NON_SERVING)) {
             switch (link.getType()) {
-                case NON_SERVING:
+                case NON_SERVING: {
                     return ResponseHelper.getResponse(
                             mapper(),
-                            ResponseHelper.statusCode.BAD_REQUEST,
+                            ResponseHelper.StatusCode.BAD_REQUEST,
                             "Bad Request",
                             "Link is already a primary link"
                     );
-                case SERVING_PRIMARY:
+                }
+                case SERVING_PRIMARY: {
                     return ResponseHelper.getResponse(
                             mapper(),
-                            ResponseHelper.statusCode.BAD_REQUEST,
+                            ResponseHelper.StatusCode.BAD_REQUEST,
                             "Bad Request",
                             "Cannot modify a primary link"
                     );
+                }
                 case SERVING_SECONDARY_CA:
-                case SERVING_SECONDARY_DC:
+                case SERVING_SECONDARY_DC: {
                     if (get(XranController.class).sendScellDelete(link)) {
                         return ResponseHelper.getResponse(
                                 mapper(),
-                                ResponseHelper.statusCode.OK,
+                                ResponseHelper.StatusCode.OK,
                                 "OK",
                                 "Link set to non-serving"
                         );
                     } else {
                         return ResponseHelper.getResponse(
                                 mapper(),
-                                ResponseHelper.statusCode.NOT_FOUND,
+                                ResponseHelper.StatusCode.NOT_FOUND,
                                 "Not Found",
                                 "Could not find cell config report to construct Scell Delete"
                         );
                     }
+                }
+                default:
             }
         } else if (newType.equals(RnibLink.Type.SERVING_SECONDARY_CA)) {
             switch (link.getType()) {
-                case SERVING_PRIMARY:
+                case SERVING_PRIMARY: {
                     return ResponseHelper.getResponse(
                             mapper(),
-                            ResponseHelper.statusCode.BAD_REQUEST,
+                            ResponseHelper.StatusCode.BAD_REQUEST,
                             "Bad Request",
                             "Cannot modify a primary link"
                     );
+                }
                 case SERVING_SECONDARY_DC:
-                case NON_SERVING:
+                case NON_SERVING: {
                     queue[0] = get(XranController.class).sendScellAdd(link);
-                    String poll = queue[0].poll(get(XranController.class).getNorthbound_timeout(), TimeUnit.MILLISECONDS);
+                    String poll = queue[0].poll(get(XranController.class)
+                            .getNorthboundTimeout(), TimeUnit.MILLISECONDS);
                     if (poll != null) {
                         return ResponseHelper.getResponse(
                                 mapper(),
-                                ResponseHelper.statusCode.OK,
+                                ResponseHelper.StatusCode.OK,
                                 "ScellAdd Response",
                                 poll
                         );
                     } else {
                         return ResponseHelper.getResponse(
                                 mapper(),
-                                ResponseHelper.statusCode.REQUEST_TIMEOUT,
+                                ResponseHelper.StatusCode.REQUEST_TIMEOUT,
                                 "ScellAdd Timeout",
                                 "eNodeB did not send a ScellAddStatus on time"
                         );
                     }
-                case SERVING_SECONDARY_CA:
+                }
+                case SERVING_SECONDARY_CA: {
                     return ResponseHelper.getResponse(
                             mapper(),
-                            ResponseHelper.statusCode.BAD_REQUEST,
+                            ResponseHelper.StatusCode.BAD_REQUEST,
                             "Bad Request",
                             "Link is already a secondary CA link"
                     );
+                }
+                default:
             }
         }
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.statusCode.BAD_REQUEST,
+                ResponseHelper.StatusCode.BAD_REQUEST,
                 "Bad Request",
                 "The command you specified is not implemented or doesn't exist."
         );
     }
 
+    /**
+     * Modify link based on the traffic percent.
+     *
+     * @param link           Link
+     * @param trafficpercent Traffic Percent of the link to be modified
+     * @return Response
+     */
     private Response handleTrafficChange(RnibLink link, JsonNode trafficpercent) {
         JsonNode jsonNode = trafficpercent.path("traffic-percent-dl");
         if (!jsonNode.isMissingNode()) {
@@ -412,41 +444,49 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.statusCode.OK,
+                ResponseHelper.StatusCode.OK,
                 "OK",
                 "Traffic Percent changed"
         );
     }
 
-    private Response handleRRMChange(RnibLink link, JsonNode rrmConf) throws InterruptedException {
+    /**
+     * Modify link based on RRMConf parameters.
+     *
+     * @param link    Link
+     * @param rrmConf RRMConfig of the Link to be modified
+     * @return Response
+     * @throws InterruptedException Interrupted queue
+     */
+    private Response handleRrmChange(RnibLink link, JsonNode rrmConf) throws InterruptedException {
         final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
-        get(XranStore.class).modifyLinkRrmConf(link, rrmConf);
-        boolean isxICIC = link.getLinkId().getCell().getVersion() <= 3;
+        get(XranStore.class).modifylinkrrmconf(link, rrmConf);
+        boolean isxicic = link.getLinkId().getCell().getVersion() <= 3;
 
-        queue[0] = get(XranController.class).sendModifiedRRMConf(link.getRrmParameters(),
-                isxICIC);
+        queue[0] = get(XranController.class).sendmodifiedrrmconf(link.getRrmParameters(),
+                isxicic);
 
-        if (isxICIC) {
+        if (isxicic) {
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.statusCode.OK,
+                    ResponseHelper.StatusCode.OK,
                     "OK",
                     "xICIC was sent successfully"
             );
         } else {
-            String poll = queue[0].poll(get(XranController.class).getNorthbound_timeout(), TimeUnit.MILLISECONDS);
+            String poll = queue[0].poll(get(XranController.class).getNorthboundTimeout(), TimeUnit.MILLISECONDS);
 
             if (poll != null) {
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.OK,
+                        ResponseHelper.StatusCode.OK,
                         "RRMConfig Response",
                         poll
                 );
             } else {
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.REQUEST_TIMEOUT,
+                        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 2b9124c..961ed19 100644
--- a/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * Copyright 2016-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.
@@ -15,24 +15,20 @@
  */
 package org.onosproject.xran.rest;
 
-import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.collect.Lists;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.rest.AbstractWebResource;
 import org.onosproject.xran.XranStore;
-import org.onosproject.xran.entities.RnibCell;
-import org.onosproject.xran.entities.RnibUe;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
 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.util.List;
@@ -51,10 +47,10 @@
     }
 
     /**
-     * test.
+     * List all the nodes in the R-NIB.
      *
-     * @param type test
-     * @return test
+     * @param type Type of node (cell/ue)
+     * @return Response
      */
     @GET
     @Produces(MediaType.APPLICATION_JSON)
@@ -62,16 +58,17 @@
         JsonNode jsonNode;
         try {
             List<Object> nodes;
+            // List cell type of nodes or UE type of nodes.
             if (StringUtils.isBlank(type)) {
                 nodes = get(XranStore.class).getNodes();
             } else if (type.equals("cell")) {
-                nodes = get(XranStore.class).getCellNodes();
+                nodes = get(XranStore.class).getcellnodes();
             } else if (type.equals("ue")) {
-                nodes = get(XranStore.class).getUeNodes();
+                nodes = get(XranStore.class).getuenodes();
             } else {
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.NOT_FOUND,
+                        ResponseHelper.StatusCode.NOT_FOUND,
                         "Not Found",
                         "Type of node was not found"
                 );
@@ -80,7 +77,7 @@
             if (nodes.size() == 0) {
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.NOT_FOUND,
+                        ResponseHelper.StatusCode.NOT_FOUND,
                         "Not Found",
                         "No nodes found"
                 );
@@ -94,7 +91,7 @@
 
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                    ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
                     "Exception",
                     fullStackTrace
             );
@@ -102,22 +99,22 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.statusCode.OK,
+                ResponseHelper.StatusCode.OK,
                 jsonNode
         );
     }
 
     /**
-     * test.
+     * List the node with a specific node id.
      *
-     * @param nodeid test
-     * @return test
+     * @param nodeid ID of the node
+     * @return Response
      */
     @GET
     @Path("{nodeid}")
     @Produces(MediaType.APPLICATION_JSON)
     public Response getNodeid(@PathParam("nodeid") String nodeid) {
-        Object node = get(XranStore.class).getByNodeId(nodeid);
+        Object node = get(XranStore.class).getbynodeid(nodeid);
 
         if (node != null) {
             try {
@@ -125,7 +122,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.OK,
+                        ResponseHelper.StatusCode.OK,
                         jsonNode
                 );
             } catch (Exception e) {
@@ -135,7 +132,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
                         "Exception",
                         fullStackTrace
                 );
@@ -144,7 +141,7 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.statusCode.NOT_FOUND,
+                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
index 5e2f1dd..f037cee 100644
--- a/src/main/java/org.onosproject.xran/rest/ResponseHelper.java
+++ b/src/main/java/org.onosproject.xran/rest/ResponseHelper.java
@@ -23,9 +23,15 @@
 
 import javax.ws.rs.core.Response;
 
-public class ResponseHelper {
+/**
+ * Various types of responses.
+ */
+public final class ResponseHelper {
 
-    public static Response getResponse(ObjectMapper mapper, statusCode status, String title, String detail) {
+    private ResponseHelper() {
+    }
+
+    public static Response getResponse(ObjectMapper mapper, StatusCode status, String title, String detail) {
         ObjectNode rootNode = mapper.createObjectNode();
 
         switch (status) {
@@ -58,7 +64,7 @@
         }
     }
 
-    public static Response getResponse(ObjectMapper mapper, statusCode status, JsonNode node) {
+    public static Response getResponse(ObjectMapper mapper, StatusCode status, JsonNode node) {
         ObjectNode rootNode = mapper.createObjectNode();
 
         switch (status) {
@@ -79,7 +85,7 @@
         }
     }
 
-    public enum statusCode {
+    public enum StatusCode {
         OK(200),
         BAD_REQUEST(400),
         NOT_FOUND(404),
@@ -89,7 +95,7 @@
 
         public int status;
 
-        statusCode(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 58b4bef..8817be8 100644
--- a/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * Copyright 2016-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.
@@ -15,7 +15,6 @@
  */
 package org.onosproject.xran.rest;
 
-import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.rest.AbstractWebResource;
@@ -32,7 +31,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;
 
 /**
@@ -49,10 +47,10 @@
     }
 
     /**
-     * test.
+     * List the slice with the given slice ID.
      *
-     * @param sliceid test
-     * @return test
+     * @param sliceid ID of the slice
+     * @return Response
      */
     @GET
     @Path("{sliceid}")
@@ -66,7 +64,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.OK,
+                        ResponseHelper.StatusCode.OK,
                         jsonNode
                 );
             } catch (Exception e) {
@@ -76,7 +74,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                        ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
                         "Exception",
                         fullStackTrace
                 );
@@ -85,17 +83,17 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.statusCode.NOT_FOUND,
+                ResponseHelper.StatusCode.NOT_FOUND,
                 "Not Found",
                 "Slice " + sliceid + " not found"
         );
     }
 
     /**
-     * test.
+     * Create slice with the corresponding attributes.
      *
-     * @param stream test
-     * @return test
+     * @param stream Attributes to create slice
+     * @return Response
      */
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
@@ -108,7 +106,7 @@
             // FIXME: change when implemented
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.statusCode.NOT_IMPLEMENTED,
+                    ResponseHelper.StatusCode.NOT_IMPLEMENTED,
                     "Not Implemented",
                     "POST Slice not implemented"
             );
@@ -119,7 +117,7 @@
 
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.statusCode.INTERNAL_SERVER_ERROR,
+                    ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
                     "Exception",
                     fullStackTrace
             );
diff --git a/src/main/java/org.onosproject.xran/rest/XranWebApplication.java b/src/main/java/org.onosproject.xran/rest/XranWebApplication.java
index 30f584b..fff752f 100644
--- a/src/main/java/org.onosproject.xran/rest/XranWebApplication.java
+++ b/src/main/java/org.onosproject.xran/rest/XranWebApplication.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * Copyright 2016-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.
diff --git a/src/main/java/org.onosproject.xran/rest/package-info.java b/src/main/java/org.onosproject.xran/rest/package-info.java
index 16f0c2f..c08814c 100644
--- a/src/main/java/org.onosproject.xran/rest/package-info.java
+++ b/src/main/java/org.onosproject.xran/rest/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * Copyright 2016-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.
