diff --git a/examples/plot_tasks.py b/examples/plot_tasks.py
index 6295c81a5f2fdb1e726cdf0a8fb43713004800f1..978448b3cd049c6ff31a92c7255851390ccc700c 100755
--- a/examples/plot_tasks.py
+++ b/examples/plot_tasks.py
@@ -55,40 +55,44 @@ PLOT_PARAMS = {"axes.labelsize": 10,
 pl.rcParams.update(PLOT_PARAMS)
 
 #  Tasks and subtypes. Indexed as in tasks.h.
-TASKTYPES = ["none", "sort", "self", "pair", "sub_self", "sub_pair", "init", "ghost",
-             "extra_ghost", "kick", "send", "recv",
-             "grav_gather_m", "grav_fft", "grav_mm", "grav_up",
-             "grav_external", "cooling", "count"]
-
-TASKCOLOURS = {"none": "black",
-               "sort": "lightblue",
-               "self": "greenyellow",
-               "pair": "navy",
-               "sub_self": "greenyellow",
-               "sub_pair": "navy",
-               "init": "indigo",
-               "ghost": "cyan",
-               "extra_ghost": "cyan",
-               "kick": "green",
-               "send": "yellow",
-               "recv": "magenta",
-               "grav_gather_m": "mediumorchid",
-               "grav_fft": "mediumnightblue",
-               "grav_mm": "mediumturquoise",
-               "grav_up": "mediumvioletred",
-               "grav_external": "darkred",
-               "cooling": "darkblue",
-               "count": "powerblue"}
-
-SUBTYPES = ["none", "density", "gradient", "force", "grav", "tend", "count"]
-
-SUBCOLOURS = {"none": "black",
-              "density": "red",
-              "gradient": "powerblue",
-              "force": "blue",
-              "grav": "indigo",
-              "tend": "grey",
-              "count": "black"}
+TASKTYPES = ["none", "sort", "self", "pair", "sub_self", "sub_pair",
+             "init", "ghost", "extra_ghost", "drift", "kick1", "kick2",
+             "timestep", "send", "recv", "grav_gather_m", "grav_fft",
+             "grav_mm", "grav_up", "cooling", "sourceterms", "count"]
+SUBTYPES = ["none", "density", "gradient", "force", "grav", "external_grav",
+            "tend", "xv", "rho", "gpart", "count"]
+
+#  Task/subtypes of interest.
+FULLTYPES = ["self/force", "self/density", "sub_self/force",
+             "sub_self/density", "pair/force", "pair/density", "sub_pair/force",
+             "sub_pair/density", "recv/xv", "send/xv", "recv/rho", "send/rho",
+             "recv/tend", "send/tend"]
+
+#  Get a number of colours for the various types.
+colours = ["black", "gray", "rosybrown", "firebrick", "red", "darksalmon",
+           "sienna", "sandybrown", "bisque", "tan", "moccasin", "gold", "darkkhaki",
+           "lightgoldenrodyellow", "olivedrab", "chartreuse", "darksage", "lightgreen",
+           "green", "mediumseagreen", "mediumaquamarine", "mediumturquoise", "darkslategrey",
+           "cyan", "cadetblue", "skyblue", "dodgerblue", "slategray", "darkblue",
+           "slateblue", "blueviolet", "mediumorchid", "purple", "magenta", "hotpink",
+           "pink"]
+maxcolours = len(colours)
+
+#  Set colours of task/subtype.
+TASKCOLOURS = {}
+ncolours = 0
+for task in TASKTYPES:
+    TASKCOLOURS[task] = colours[ncolours]
+    ncolours = (ncolours + 1) % maxcolours
+
+SUBCOLOURS = {}
+for task in SUBTYPES:
+    SUBCOLOURS[task] = colours[ncolours]
+    ncolours = (ncolours + 1) % maxcolours
+
+for task in FULLTYPES:
+    SUBCOLOURS[task] = colours[ncolours]
+    ncolours = (ncolours + 1) % maxcolours
 
 #  Show docs if help is requested.
 if len( sys.argv ) == 2 and ( sys.argv[1][0:2] == "-h" or sys.argv[1][0:3] == "--h" ):
@@ -149,39 +153,26 @@ num_lines = pl.size(data) / 10
 for line in range(num_lines):
     thread = int(data[line,0])
     tasks[thread].append({})
-    tasks[thread][-1]["type"] = TASKTYPES[int(data[line,1])]
-    tasks[thread][-1]["subtype"] = SUBTYPES[int(data[line,2])]
+    tasktype = TASKTYPES[int(data[line,1])]
+    subtype = SUBTYPES[int(data[line,2])]
+    tasks[thread][-1]["type"] = tasktype
+    tasks[thread][-1]["subtype"] = subtype
     tic = int(data[line,4]) / CPU_CLOCK * 1000
     toc = int(data[line,5]) / CPU_CLOCK * 1000
     tasks[thread][-1]["tic"] = tic
     tasks[thread][-1]["toc"] = toc
     tasks[thread][-1]["t"] = (toc + tic)/ 2
+    if "self" in tasktype or "pair" in tasktype:
+        fulltype = tasktype + "/" + subtype
+        if fulltype in SUBCOLOURS:
+            tasks[thread][-1]["colour"] = SUBCOLOURS[fulltype]
+        else:
+            tasks[thread][-1]["colour"] = SUBCOLOURS[subtype]
+    else:
+        tasks[thread][-1]["colour"] = TASKCOLOURS[tasktype]
     
-combtasks = {}
-combtasks[-1] = []
-for i in range(nthread):
-    combtasks[i] = []
-
 for thread in range(nthread):
     tasks[thread] = sorted(tasks[thread], key=lambda l: l["t"])
-    lasttype = ""
-    types = []
-    for task in tasks[thread]:
-        if task["type"] not in types:
-            types.append(task["type"])
-        if lasttype == "" or not lasttype == task["type"]:
-            combtasks[thread].append({})
-            combtasks[thread][-1]["type"] = task["type"]
-            combtasks[thread][-1]["subtype"] = task["subtype"]
-            combtasks[thread][-1]["tic"] = task["tic"]
-            combtasks[thread][-1]["toc"] = task["toc"]
-            if task["type"] == "self" or task["type"] == "pair" or task["type"] == "sub":
-                combtasks[thread][-1]["colour"] = SUBCOLOURS[task["subtype"]]
-            else:
-                combtasks[thread][-1]["colour"] = TASKCOLOURS[task["type"]]
-            lasttype = task["type"]
-        else:
-            combtasks[thread][-1]["toc"] = task["toc"]
             
 typesseen = []
 fig = pl.figure()
@@ -192,11 +183,11 @@ tictoc = np.zeros(2)
 for i in range(nthread):
 
     #  Collect ranges and colours into arrays.
-    tictocs = np.zeros(len(combtasks[i])*2)
-    colours = np.empty(len(combtasks[i])*2, dtype='object')
+    tictocs = np.zeros(len(tasks[i])*2)
+    colours = np.empty(len(tasks[i])*2, dtype='object')
     coloursseen = []
     j = 0
-    for task in combtasks[i]:
+    for task in tasks[i]:
         tictocs[j] = task["tic"]
         tictocs[j+1] = task["toc"]
         colours[j] = task["colour"]
diff --git a/examples/plot_tasks_MPI.py b/examples/plot_tasks_MPI.py
index 734918b8cbf388ef8f1a064e014cfd28775edde2..c95bfa1fd2d087cc907b57201c1a1397cbeb1460 100755
--- a/examples/plot_tasks_MPI.py
+++ b/examples/plot_tasks_MPI.py
@@ -63,40 +63,44 @@ PLOT_PARAMS = {"axes.labelsize": 10,
 pl.rcParams.update(PLOT_PARAMS)
 
 #  Tasks and subtypes. Indexed as in tasks.h.
-TASKTYPES = ["none", "sort", "self", "pair", "sub_self", "sub_pair", "init",
-             "ghost", "extra_ghost", "kick", "send", "recv",
-             "grav_gather_m", "grav_fft", "grav_mm", "grav_up",
-             "grav_external", "cooling", "count"]
-
-TASKCOLOURS = {"none": "black",
-               "sort": "lightblue",
-               "self": "greenyellow",
-               "pair": "navy",
-               "sub_self": "greenyellow",
-               "sub_pair": "navy",
-               "init": "indigo",
-               "ghost": "cyan",
-               "extra_ghost": "cyan",
-               "kick": "green",
-               "send": "yellow",
-               "recv": "magenta",
-               "grav_gather_m": "mediumorchid",
-               "grav_fft": "mediumnightblue",
-               "grav_mm": "mediumturquoise",
-               "grav_up": "mediumvioletred",
-               "grav_external": "darkred",
-               "cooling": "darkblue",
-               "count": "powerblue"}
-
-SUBTYPES = ["none", "density", "gradient", "force", "grav", "tend", "count"]
-
-SUBCOLOURS = {"none": "black",
-              "density": "red",
-              "gradient": "powerblue",
-              "force": "blue",
-              "grav": "indigo",
-              "tend": "grey",
-              "count": "black"}
+TASKTYPES = ["none", "sort", "self", "pair", "sub_self", "sub_pair",
+             "init", "ghost", "extra_ghost", "drift", "kick1", "kick2",
+             "timestep", "send", "recv", "grav_gather_m", "grav_fft",
+             "grav_mm", "grav_up", "cooling", "sourceterms", "count"]
+SUBTYPES = ["none", "density", "gradient", "force", "grav", "external_grav",
+            "tend", "xv", "rho", "gpart", "count"]
+
+#  Task/subtypes of interest.
+FULLTYPES = ["self/force", "self/density", "sub_self/force",
+             "sub_self/density", "pair/force", "pair/density", "sub_pair/force",
+             "sub_pair/density", "recv/xv", "send/xv", "recv/rho", "send/rho",
+             "recv/tend", "send/tend"]
+
+#  Get a number of colours for the various types.
+colours = ["black", "gray", "rosybrown", "firebrick", "red", "darksalmon",
+           "sienna", "sandybrown", "bisque", "tan", "moccasin", "gold", "darkkhaki",
+           "lightgoldenrodyellow", "olivedrab", "chartreuse", "darksage", "lightgreen",
+           "green", "mediumseagreen", "mediumaquamarine", "mediumturquoise", "darkslategrey",
+           "cyan", "cadetblue", "skyblue", "dodgerblue", "slategray", "darkblue",
+           "slateblue", "blueviolet", "mediumorchid", "purple", "magenta", "hotpink",
+           "pink"]
+maxcolours = len(colours)
+
+#  Set colours of task/subtype.
+TASKCOLOURS = {}
+ncolours = 0
+for task in TASKTYPES:
+    TASKCOLOURS[task] = colours[ncolours]
+    ncolours = (ncolours + 1) % maxcolours
+
+SUBCOLOURS = {}
+for task in SUBTYPES:
+    SUBCOLOURS[task] = colours[ncolours]
+    ncolours = (ncolours + 1) % maxcolours
+
+for task in FULLTYPES:
+    SUBCOLOURS[task] = colours[ncolours]
+    ncolours = (ncolours + 1) % maxcolours
 
 #  Show docs if help is requested.
 if len( sys.argv ) == 2 and ( sys.argv[1][0:2] == "-h" or sys.argv[1][0:3] == "--h" ):
@@ -185,39 +189,26 @@ for rank in range(nranks):
         for line in range(num_lines):
             thread = int(data[line,1])
             tasks[thread].append({})
-            tasks[thread][-1]["type"] = TASKTYPES[int(data[line,2])]
-            tasks[thread][-1]["subtype"] = SUBTYPES[int(data[line,3])]
+            tasktype = TASKTYPES[int(data[line,2])]
+            subtype = SUBTYPES[int(data[line,3])]
+            tasks[thread][-1]["type"] = tasktype
+            tasks[thread][-1]["subtype"] = subtype
             tic = int(data[line,5]) / CPU_CLOCK * 1000
             toc = int(data[line,6]) / CPU_CLOCK * 1000
             tasks[thread][-1]["tic"] = tic
             tasks[thread][-1]["toc"] = toc
             tasks[thread][-1]["t"] = (toc + tic)/ 2
-
-        combtasks = {}
-        combtasks[-1] = []
-        for i in range(nthread):
-            combtasks[i] = []
+            if "self" in tasktype or "pair" in tasktype or "recv" in tasktype or "send" in tasktype:
+                fulltype = tasktype + "/" + subtype
+                if fulltype in SUBCOLOURS:
+                    tasks[thread][-1]["colour"] = SUBCOLOURS[fulltype]
+                else:
+                    tasks[thread][-1]["colour"] = SUBCOLOURS[subtype]
+            else:
+                tasks[thread][-1]["colour"] = TASKCOLOURS[tasktype]
 
         for thread in range(nthread):
             tasks[thread] = sorted(tasks[thread], key=lambda l: l["t"])
-            lasttype = ""
-            types = []
-            for task in tasks[thread]:
-                if task["type"] not in types:
-                    types.append(task["type"])
-                if lasttype == "" or not lasttype == task["type"]:
-                    combtasks[thread].append({})
-                    combtasks[thread][-1]["type"] = task["type"]
-                    combtasks[thread][-1]["subtype"] = task["subtype"]
-                    combtasks[thread][-1]["tic"] = task["tic"]
-                    combtasks[thread][-1]["toc"] = task["toc"]
-                    if task["type"] == "self" or task["type"] == "pair" or task["type"] == "sub":
-                        combtasks[thread][-1]["colour"] = SUBCOLOURS[task["subtype"]]
-                    else:
-                        combtasks[thread][-1]["colour"] = TASKCOLOURS[task["type"]]
-                    lasttype = task["type"]
-                else:
-                    combtasks[thread][-1]["toc"] = task["toc"]
 
         fig = pl.figure()
         ax = fig.add_subplot(1,1,1)
@@ -227,11 +218,11 @@ for rank in range(nranks):
         for i in range(nthread):
 
             #  Collect ranges and colours into arrays.
-            tictocs = np.zeros(len(combtasks[i])*2)
-            colours = np.empty(len(combtasks[i])*2, dtype='object')
+            tictocs = np.zeros(len(tasks[i])*2)
+            colours = np.empty(len(tasks[i])*2, dtype='object')
             coloursseen = []
             j = 0
-            for task in combtasks[i]:
+            for task in tasks[i]:
                 tictocs[j] = task["tic"]
                 tictocs[j+1] = task["toc"]
                 colours[j] = task["colour"]