diff --git a/web/api/src/main/java/org/onosproject/rest/FlowsWebResource.java b/web/api/src/main/java/org/onosproject/rest/FlowsWebResource.java
index 24ee73a..36afcce 100644
--- a/web/api/src/main/java/org/onosproject/rest/FlowsWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/FlowsWebResource.java
@@ -65,7 +65,7 @@
             }
         }
 
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 
     /**
@@ -87,7 +87,7 @@
         for (final FlowEntry entry : deviceEntries) {
             flowsNode.add(flowEntryCodec.encode(entry, this));
         }
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 
     /**
@@ -113,6 +113,6 @@
                 flowsNode.add(flowEntryCodec.encode(entry, this));
             }
         }
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 }
diff --git a/web/api/src/main/java/org/onosproject/rest/GreetResource.java b/web/api/src/main/java/org/onosproject/rest/GreetResource.java
index f3db807..374ce28 100644
--- a/web/api/src/main/java/org/onosproject/rest/GreetResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/GreetResource.java
@@ -39,7 +39,7 @@
         ObjectMapper mapper = new ObjectMapper();
         ObjectNode root = mapper.createObjectNode();
         root.put("greeting", "Yo!!!!");
-        return Response.ok(root.toString()).build();
+        return Response.ok(root).build();
     }
 
 }
diff --git a/web/api/src/main/java/org/onosproject/rest/HostsWebResource.java b/web/api/src/main/java/org/onosproject/rest/HostsWebResource.java
index 6a0f44a..925df13 100644
--- a/web/api/src/main/java/org/onosproject/rest/HostsWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/HostsWebResource.java
@@ -42,7 +42,7 @@
     public Response getHosts() {
         final Iterable<Host> hosts = get(HostService.class).getHosts();
         final ObjectNode root = encodeArray(Host.class, "hosts", hosts);
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 
     @GET
@@ -52,7 +52,7 @@
         final Host host = nullIsNotFound(get(HostService.class).getHost(hostId(id)),
                 HOST_NOT_FOUND);
         final ObjectNode root = codec(Host.class).encode(host, this);
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 
     @GET
@@ -63,7 +63,7 @@
         final Host host = nullIsNotFound(get(HostService.class).getHost(hostId(mac + "/" + vlan)),
                 HOST_NOT_FOUND);
         final ObjectNode root = codec(Host.class).encode(host, this);
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 }
 
diff --git a/web/api/src/main/java/org/onosproject/rest/IntentsWebResource.java b/web/api/src/main/java/org/onosproject/rest/IntentsWebResource.java
index 4a2639f..75287e0 100644
--- a/web/api/src/main/java/org/onosproject/rest/IntentsWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/IntentsWebResource.java
@@ -48,7 +48,7 @@
     public Response getIntents() {
         final Iterable<Intent> intents = get(IntentService.class).getIntents();
         final ObjectNode root = encodeArray(Intent.class, "intents", intents);
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 
     /**
@@ -72,6 +72,6 @@
         } else {
             root = codec(Intent.class).encode(intent, this);
         }
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 }
diff --git a/web/api/src/main/java/org/onosproject/rest/JsonBodyWriter.java b/web/api/src/main/java/org/onosproject/rest/JsonBodyWriter.java
index 3305f7d..e693544 100644
--- a/web/api/src/main/java/org/onosproject/rest/JsonBodyWriter.java
+++ b/web/api/src/main/java/org/onosproject/rest/JsonBodyWriter.java
@@ -22,6 +22,8 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+
 import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.annotation.Annotation;
@@ -30,6 +32,7 @@
 /**
  * JAX-RS Response message body writer.
  */
+@Provider
 @Produces("application/json")
 public class JsonBodyWriter implements MessageBodyWriter<ObjectNode> {
 
diff --git a/web/api/src/main/java/org/onosproject/rest/TopologyWebResource.java b/web/api/src/main/java/org/onosproject/rest/TopologyWebResource.java
index 92fc23b..a10232c 100644
--- a/web/api/src/main/java/org/onosproject/rest/TopologyWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/TopologyWebResource.java
@@ -57,7 +57,7 @@
         Topology topology = get(TopologyService.class).currentTopology();
         ObjectNode root =
                 codec(Topology.class).encode(topology, this);
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 
     /**
@@ -74,7 +74,7 @@
                 get(TopologyService.class).getClusters(topology);
         ObjectNode root =
                 encodeArray(TopologyCluster.class, "clusters", clusters);
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 
     /**
@@ -96,7 +96,7 @@
                         CLUSTER_NOT_FOUND);
         ObjectNode root =
                 codec(TopologyCluster.class).encode(cluster, this);
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 
     /**
@@ -127,7 +127,7 @@
         for (DeviceId deviceId : deviceIds) {
             devicesNode.add(deviceId.toString());
         }
-        return ok(root.toString()).build();
+        return ok(root).build();
     }
 
     /**
@@ -150,7 +150,7 @@
                 Lists.newArrayList(get(TopologyService.class)
                         .getClusterLinks(topology, cluster));
 
-        return ok(encodeArray(Link.class, "links", links).toString()).build();
+        return ok(encodeArray(Link.class, "links", links)).build();
     }
 
     /**
@@ -203,8 +203,7 @@
 
         return ok(mapper()
                 .createObjectNode()
-                .put("broadcast", isBroadcast)
-                .toString())
+                .put("broadcast", isBroadcast))
                 .build();
     }
 
@@ -230,7 +229,7 @@
 
         return ok(mapper()
                 .createObjectNode()
-                .put("infrastructure", isInfrastructure).toString())
+                .put("infrastructure", isInfrastructure))
                 .build();
     }
 
