diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java
index 8683f3f..a979b65 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java
@@ -37,10 +37,8 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 
-import static org.onlab.util.Tools.groupedThreads;
+import static org.onlab.util.SharedExecutors.getPoolThreadExecutor;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -78,18 +76,13 @@
     private Map<NodeId, Integer> nodeToIndex;
 
     private NodeId nodeId;
-    private ExecutorService messageHandlingExecutor;
 
     @Activate
     public void activate() {
         nodeId = clusterService.getLocalNode().id();
 
-        // TODO: replace with shared executor
-        messageHandlingExecutor = Executors.newSingleThreadExecutor(
-                groupedThreads("onos/perf", "message-handler"));
-
         communicationService.addSubscriber(SAMPLE, new InternalSampleCollector(),
-                                           messageHandlingExecutor);
+                                           getPoolThreadExecutor());
 
         nodes = clusterService.getNodes().toArray(new ControllerNode[]{});
         Arrays.sort(nodes, (a, b) -> a.id().toString().compareTo(b.id().toString()));
@@ -99,14 +92,13 @@
             nodeToIndex.put(nodes[i].id(), i);
         }
 
-        ui.setHeaders(getSampleHeaders());
         clearSamples();
+        ui.setCollector(this);
         log.info("Started");
     }
 
     @Deactivate
     public void deactivate() {
-        messageHandlingExecutor.shutdown();
         communicationService.removeSubscriber(SAMPLE);
         log.info("Stopped");
     }
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
index 96f2b32..909f3a5 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
@@ -156,7 +156,7 @@
     private ExecutorService workers;
     private ApplicationId appId;
     private Listener listener;
-    private boolean stopped;
+    private boolean stopped = true;
 
     private Timer reportTimer;
 
@@ -247,13 +247,18 @@
     }
 
     public void start() {
-        communicationService.broadcast(new ClusterMessage(nodeId, CONTROL, START.getBytes()));
-        startTestRun();
+        if (stopped) {
+            stopped = false;
+            communicationService.broadcast(new ClusterMessage(nodeId, CONTROL, START.getBytes()));
+            startTestRun();
+        }
     }
 
     public void stop() {
-        communicationService.broadcast(new ClusterMessage(nodeId, CONTROL, STOP.getBytes()));
-        stopTestRun();
+        if (!stopped) {
+            communicationService.broadcast(new ClusterMessage(nodeId, CONTROL, STOP.getBytes()));
+            stopTestRun();
+        }
     }
 
     private void logConfig(String prefix) {
@@ -282,7 +287,6 @@
     }
 
     private void stopTestRun() {
-        stopped = true;
         if (reporterTask != null) {
             reporterTask.cancel();
             reporterTask = null;
@@ -293,6 +297,11 @@
         } catch (InterruptedException e) {
             log.warn("Failed to stop worker", e);
         }
+
+        sampleCollector.recordSample(0, 0);
+        sampleCollector.recordSample(0, 0);
+        stopped = true;
+
         log.info("Stopped test run");
     }
 
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
index f50ed3b..5d7132d 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
@@ -36,9 +36,7 @@
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Random;
 import java.util.Set;
-import java.util.TimerTask;
 
 import static java.util.Collections.synchronizedSet;
 
@@ -58,25 +56,11 @@
     private UiExtension uiExtension = new UiExtension(views, this::newHandlers,
                                                       getClass().getClassLoader());
 
-    private List<String> headers = ImmutableList.of("One", "Two", "Three", "Four", "Five");
-
-    private Random random = new Random();
-    private TimerTask task;
+    private IntentPerfCollector collector;
 
     @Activate
     protected void activate() {
         uiExtensionService.register(uiExtension);
-//        task = new TimerTask() {
-//            @Override
-//            public void run() {
-//                Sample sample = new Sample(System.currentTimeMillis(), headers.size());
-//                for (int i = 0; i < headers.size(); i++) {
-//                    sample.data[i] = 25_000 + random.nextInt(20_000) - 5_000;
-//                }
-//                reportSample(sample);
-//            }
-//        };
-//        SharedExecutors.getTimer().scheduleAtFixedRate(task, 1000, 1000);
     }
 
     @Deactivate
@@ -96,12 +80,12 @@
     }
 
     /**
-     * Sets the headers for the subsequently reported samples.
+     * Binds the sample collector.
      *
-     * @param headers list of headers for future samples
+     * @param collector list of headers for future samples
      */
-    public void setHeaders(List<String> headers) {
-        this.headers = headers;
+    public void setCollector(IntentPerfCollector collector) {
+        this.collector = collector;
     }
 
     // Creates and returns session specific message handler.
@@ -122,22 +106,10 @@
         public void process(ObjectNode message) {
             streamingEnabled = message.path("event").asText("unknown").equals("intentPerfStart");
             if (streamingEnabled) {
-                sendHeaders();
+                sendInitData();
             }
         }
 
-        private void sendHeaders() {
-            ArrayNode an = mapper.createArrayNode();
-            for (String header : headers) {
-                an.add(header);
-            }
-
-            ObjectNode sn = mapper.createObjectNode();
-            sn.set("headers", an);
-
-            connection().sendMessage("intentPerfHeaders", 0, sn);
-        }
-
         @Override
         public void init(UiConnection connection, ServiceDirectory directory) {
             super.init(connection, directory);
@@ -152,18 +124,34 @@
 
         private void send(Sample sample) {
             if (streamingEnabled) {
-                ArrayNode an = mapper.createArrayNode();
-                for (double d : sample.data) {
-                    an.add(d);
-                }
-
-                ObjectNode sn = mapper.createObjectNode();
-                sn.put("time", sample.time);
-                sn.set("data", an);
-
-                connection().sendMessage("intentPerfSample", 0, sn);
+                connection().sendMessage("intentPerfSample", 0, sampleNode(sample));
             }
         }
+
+        private void sendInitData() {
+            ObjectNode rootNode = mapper.createObjectNode();
+            ArrayNode an = mapper.createArrayNode();
+            ArrayNode sn = mapper.createArrayNode();
+            rootNode.set("headers", an);
+            rootNode.set("samples", sn);
+
+            collector.getSampleHeaders().forEach(an::add);
+            collector.getSamples().forEach(s -> sn.add(sampleNode(s)));
+            connection().sendMessage("intentPerfInit", 0, rootNode);
+        }
+
+        private ObjectNode sampleNode(Sample sample) {
+            ObjectNode sampleNode = mapper.createObjectNode();
+            ArrayNode an = mapper.createArrayNode();
+            sampleNode.put("time", sample.time);
+            sampleNode.set("data", an);
+
+            for (double d : sample.data) {
+                an.add(d);
+            }
+            return sampleNode;
+        }
+
     }
 
 }
