diff --git a/python/loom/rview/report.py b/python/loom/rview/report.py
index d7ca596682ba982120973d03d65788bc49799ebd..734b28d2e67b9793b88013a9281dc4f4965b8464 100644
--- a/python/loom/rview/report.py
+++ b/python/loom/rview/report.py
@@ -241,25 +241,41 @@ class Report:
                 task_start_ts.pop(event.id)
         return data
 
-    def get_ctransfer_data(self):
+    def get_ctransfer_data(self, intra):
         SEND_START = loomcomm.Event.SEND_START
         TASK_END = loomcomm.Event.TASK_END
-        intra = ([0], [0])
-        results = ([0], [0])
         sizes = {}
+        label_groups, group_names = self.collect_labels()
+        symbols = self.symbols
+
+        group_names.append("SUM")
+        results = []
+        for name in group_names:
+            results.append(([0], [0], name))
+
+        total = results[-1]
 
         for event in self.report_msg.events:
             if event.type == TASK_END:
                 sizes[event.id] = event.size
             elif event.type == SEND_START:
-                if event.target_worker_id == -1:
-                    data = results
+                if (intra and event.target_worker_id == -1) or \
+                   (not intra and event.target_worker_id != -1):
+                    continue
+                task_id = event.id
+                total[0].append(event.time)
+                total[1].append(total[1][-1] + sizes[task_id])
+
+                task = self.report_msg.plan.tasks[task_id]
+                if task.label:
+                    label = task.label
                 else:
-                    data = intra
+                    label = symbols[task.task_type]
+                group = label_groups[label]
+                data = results[group]
                 data[0].append(event.time)
                 data[1].append(data[1][-1] + sizes[event.id])
-
-        return intra, results
+        return results
 
     def get_btime_data(self):
         TASK_START = loomcomm.Event.TASK_START
diff --git a/python/loom/rview/rview.py b/python/loom/rview/rview.py
index 96eb80525dc7bdd70402d9a45287ceed7e718a2d..f70dc3359d8cbeb723aaeaff2051233cecf5ad20 100644
--- a/python/loom/rview/rview.py
+++ b/python/loom/rview/rview.py
@@ -120,10 +120,28 @@ def show_trace(report):
 
 
 def show_ctransfer(report):
-    intra, results = report.get_ctransfer_data()
-    plt.plot(intra[0], intra[1], label="Intra worker")
-    plt.plot(results[0], results[1], label="Results")
-    plt.legend(loc='upper left')
+    results1 = report.get_ctransfer_data(True)
+    results2 = report.get_ctransfer_data(False)
+
+    f, (c1, c2, c3) = plt.subplots(3, sharex=True)
+    assert f  # silence nonused f
+
+    c1.set_title("Total transfers")
+    c1.plot(results1[-1][0], results1[-1][1], label="Intra")
+    c1.plot(results2[-1][0], results2[-1][1], label="Results")
+
+    c2.set_title("Intra transfers per label")
+    for data0, data1, label in results1[:-1]:
+        c2.plot(data0, data1, label=label)
+
+    c3.set_title("Result transfers per label")
+    for data0, data1, label in results2[:-1]:
+        c3.plot(data0, data1, label=label)
+
+    c1.legend(loc='upper left')
+    c2.legend(loc='upper left')
+
+
     plt.show(block=True)