diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ResourceNameCompleter.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ResourceNameCompleter.java
index 07e669e..a87cf6e 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ResourceNameCompleter.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ResourceNameCompleter.java
@@ -80,7 +80,7 @@
 
             SortedSet<String> strings = delegate.getStrings();
 
-            if (set.size() != 0) {
+            if (!set.isEmpty()) {
                 set.forEach(strings::add);
             }
         }
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java
index a5f220d..58a8ba1 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java
@@ -35,14 +35,11 @@
 import org.onosproject.ui.UiMessageHandler;
 import org.onosproject.ui.chart.ChartModel;
 import org.onosproject.ui.chart.ChartRequestHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.util.Collection;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.LongStream;
 
@@ -54,8 +51,6 @@
  */
 public class CpmanViewMessageHandler extends UiMessageHandler {
 
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
     private static final String CPMAN_DATA_REQ = "cpmanDataRequest";
     private static final String CPMAN_DATA_RESP = "cpmanDataResponse";
     private static final String CPMANS = "cpmans";
@@ -131,16 +126,10 @@
                                                                    ClusterService cs, DeviceId deviceId) {
             Map<ControlMetricType, Long> data = Maps.newHashMap();
             for (ControlMetricType cmt : CONTROL_MESSAGE_METRICS) {
-                ControlLoadSnapshot cls;
-                try {
-                    cls = cpms.getLoad(cs.getLocalNode().id(),
-                            cmt, NUM_OF_DATA_POINTS, TimeUnit.MINUTES,
-                            Optional.of(deviceId)).get();
-                    data.put(cmt, Math.round(LongStream.of(cls.recent()).average().getAsDouble()));
-                    timestamp = cls.time();
-                } catch (InterruptedException | ExecutionException e) {
-                    log.warn(e.getMessage());
-                }
+                ControlLoadSnapshot cls = cpms.getLoadSync(cs.getLocalNode().id(),
+                        cmt, NUM_OF_DATA_POINTS, TimeUnit.MINUTES, Optional.of(deviceId));
+                data.put(cmt, Math.round(LongStream.of(cls.recent()).average().getAsDouble()));
+                timestamp = cls.time();
             }
             return data;
         }
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/DefaultMetricsDatabase.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/DefaultMetricsDatabase.java
index 1edf159..6ff46ba 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/DefaultMetricsDatabase.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/DefaultMetricsDatabase.java
@@ -94,7 +94,7 @@
             sample.setValue(metricType, value);
             sample.update();
         } catch (IOException e) {
-            log.error("Failed to update metric value due to {}", e.getMessage());
+            log.error("Failed to update metric value due to {}", e);
         }
     }
 
@@ -112,12 +112,12 @@
                     checkArgument(rrdDb.containsDs(k), NON_EXIST_METRIC);
                     sample.setValue(k, v);
                 } catch (IOException e) {
-                    log.error("Failed to update metric value due to {}", e.getMessage());
+                    log.error("Failed to update metric value due to {}", e);
                 }
             });
             sample.update();
         } catch (IOException e) {
-            log.error("Failed to update metric values due to {}", e.getMessage());
+            log.error("Failed to update metric values due to {}", e);
         }
     }
 
@@ -127,7 +127,7 @@
             checkArgument(rrdDb.containsDs(metricType), NON_EXIST_METRIC);
             return rrdDb.getDatasource(metricType).getLastValue();
         } catch (IOException e) {
-            log.error("Failed to obtain metric value due to {}", e.getMessage());
+            log.error("Failed to obtain metric value due to {}", e);
             return 0D;
         }
     }
@@ -146,7 +146,7 @@
                 return new double[0];
             }
         } catch (IOException e) {
-            log.error("Failed to obtain metric values due to {}", e.getMessage());
+            log.error("Failed to obtain metric values due to {}", e);
             return new double[0];
         }
     }
@@ -159,7 +159,7 @@
             long startTime = endTime - SECONDS_OF_DAY + 1;
             return minMetric(metricType, startTime, endTime);
         } catch (IOException e) {
-            log.error("Failed to obtain metric value due to {}", e.getMessage());
+            log.error("Failed to obtain metric value due to {}", e);
             return 0D;
         }
     }
@@ -172,7 +172,7 @@
             long startTime = endTime - SECONDS_OF_DAY;
             return maxMetric(metricType, startTime, endTime);
         } catch (IOException e) {
-            log.error("Failed to obtain metric value due to {}", e.getMessage());
+            log.error("Failed to obtain metric value due to {}", e);
             return 0D;
         }
     }
@@ -185,7 +185,7 @@
             long startTime = endTime - SECONDS_OF_DAY;
             return metrics(metricType, startTime, endTime);
         } catch (IOException e) {
-            log.error("Failed to obtain metric values due to {}", e.getMessage());
+            log.error("Failed to obtain metric values due to {}", e);
             return new double[0];
         }
     }
@@ -202,7 +202,7 @@
                 return new double[0];
             }
         } catch (IOException e) {
-            log.error("Failed to obtain metric values due to {}", e.getMessage());
+            log.error("Failed to obtain metric values due to {}", e);
             return new double[0];
         }
     }
@@ -213,7 +213,7 @@
             checkArgument(rrdDb.containsDs(metricType), NON_EXIST_METRIC);
             return rrdDb.getLastUpdateTime();
         } catch (IOException e) {
-            log.error("Failed to obtain last update time due to {}", e.getMessage());
+            log.error("Failed to obtain last update time due to {}", e);
             return 0L;
         }
     }
@@ -296,7 +296,7 @@
         public MetricsDatabase build() {
             checkNotNull(metricName, METRIC_NAME_MSG);
             checkNotNull(resourceName, RESOURCE_NAME_MSG);
-            checkArgument(dsDefs.size() != 0, METRIC_TYPE_MSG);
+            checkArgument(!dsDefs.isEmpty(), METRIC_TYPE_MSG);
 
             // define the resolution of monitored metrics
             rrdDef = new RrdDef(DB_PATH + SPLITTER + metricName +
@@ -317,7 +317,7 @@
                 // always store the metric data in memory...
                 rrdDb = new RrdDb(rrdDef, RrdBackendFactory.getFactory(STORING_METHOD));
             } catch (IOException e) {
-                log.warn("Failed to create a new round-robin database due to {}", e.getMessage());
+                log.warn("Failed to create a new round-robin database due to {}", e);
             }
 
             return new DefaultMetricsDatabase(metricName, resourceName, rrdDb);
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/SystemMetricsCollectorWebResource.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/SystemMetricsCollectorWebResource.java
index 5dd9413..37d39cb 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/SystemMetricsCollectorWebResource.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/SystemMetricsCollectorWebResource.java
@@ -27,8 +27,8 @@
 import org.onosproject.cpman.MetricValue;
 import org.onosproject.cpman.SystemInfo;
 import org.onosproject.cpman.impl.DefaultSystemInfo;
-import org.onosproject.cpman.impl.SystemMetricsAggregator;
 import org.onosproject.cpman.impl.SystemInfoFactory;
+import org.onosproject.cpman.impl.SystemMetricsAggregator;
 import org.onosproject.rest.AbstractWebResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,7 +36,6 @@
 import javax.ws.rs.Consumes;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.io.IOException;
@@ -87,7 +86,6 @@
     @POST
     @Path("cpu_metrics")
     @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
     public Response cpuMetrics(InputStream stream) {
         ObjectNode root = mapper().createObjectNode();
         ControlMetric cm;
@@ -134,7 +132,7 @@
             aggregator.increment(ControlMetricType.CPU_IDLE_TIME, cpuIdleTime);
 
         } catch (IOException e) {
-            throw new IllegalArgumentException(e.getMessage());
+            throw new IllegalArgumentException(e);
         }
         return ok(root).build();
     }
@@ -149,7 +147,6 @@
     @POST
     @Path("memory_metrics")
     @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
     public Response memoryMetrics(InputStream stream) {
         ObjectNode root = mapper().createObjectNode();
         ControlMetric cm;
@@ -190,7 +187,7 @@
             aggregator.increment(ControlMetricType.MEMORY_FREE, memFree);
 
         } catch (IOException e) {
-            throw new IllegalArgumentException(e.getMessage());
+            throw new IllegalArgumentException(e);
         }
         return ok(root).build();
     }
@@ -205,7 +202,6 @@
     @POST
     @Path("disk_metrics")
     @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
     public Response diskMetrics(InputStream stream) {
         ObjectNode root = mapper().createObjectNode();
         ControlMetric cm;
@@ -237,7 +233,7 @@
                         ControlMetricType.DISK_WRITE_BYTES, writeBytes);
             }
         } catch (IOException e) {
-            throw new IllegalArgumentException(e.getMessage());
+            throw new IllegalArgumentException(e);
         }
         return ok(root).build();
     }
@@ -252,7 +248,6 @@
     @POST
     @Path("network_metrics")
     @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
     public Response networkMetrics(InputStream stream) {
         ObjectNode root = mapper().createObjectNode();
         ControlMetric cm;
@@ -299,7 +294,7 @@
                         ControlMetricType.NW_OUTGOING_PACKETS, outPackets);
             }
         } catch (IOException e) {
-            throw new IllegalArgumentException(e.getMessage());
+            throw new IllegalArgumentException(e);
         }
         return ok(root).build();
     }
@@ -316,7 +311,6 @@
     @POST
     @Path("system_info")
     @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
     public Response systemInfo(InputStream stream) {
         ObjectNode root = mapper().createObjectNode();
 
@@ -343,7 +337,7 @@
             }
 
         } catch (IOException e) {
-            throw new IllegalArgumentException(e.getMessage());
+            throw new IllegalArgumentException(e);
         }
         return ok(root).build();
     }
