diff --git a/preprocessor/tools/jastadd2.jar b/preprocessor/tools/jastadd2.jar
index f9c004f2f312f45848968530ca2e5c2de8db881c..2796ca1608038a32a5b9173fdd07248207b5a192 100644
Binary files a/preprocessor/tools/jastadd2.jar and b/preprocessor/tools/jastadd2.jar differ
diff --git a/trainbenchmark/trainbenchmark-reporting/individual.R b/trainbenchmark/trainbenchmark-reporting/individual.R
index 9d9a1f67a5f3c3949cd8c37a4cde2b466006cdf2..bdd70e34084e80b7b43860bed746d137e624ab73 100644
--- a/trainbenchmark/trainbenchmark-reporting/individual.R
+++ b/trainbenchmark/trainbenchmark-reporting/individual.R
@@ -29,10 +29,12 @@ sizes[["Repair"]] = c("8k", "15k", "33k", "66k", "135k", "271k", "566k", "1.1M",
 
 toolList = read.csv("tool-list.csv")
 
+dir.create("../diagrams/recent")
 for (scenario in c("inject", "repair")) {
+  dir.create(file.path("../diagrams/recent", scenario))
 
   # load the data
-  tsvs = list.files("../results/merged/individual", pattern = paste("times-.*", scenario, ".*\\.csv", sep=""), full.names = T, recursive = T)
+  tsvs = list.files(paste("../results/merged/individual", scenario, sep="/"), pattern = "times-.*\\.csv", full.names = T, recursive = T)
 
   l = lapply(tsvs, read.csv)
   times = rbindlist(l)
@@ -181,4 +183,4 @@ for (scenario in c("inject", "repair")) {
     }
 
   }
-}
\ No newline at end of file
+}
diff --git a/trainbenchmark/trainbenchmark-reporting/merge_results.py b/trainbenchmark/trainbenchmark-reporting/merge_results.py
index 537299a1d8300c651827c459ee9ff8dea6e23d01..dfe5e7344a565ec570f5c52532d17a11a8a1bcd6 100755
--- a/trainbenchmark/trainbenchmark-reporting/merge_results.py
+++ b/trainbenchmark/trainbenchmark-reporting/merge_results.py
@@ -1,6 +1,5 @@
 #!/usr/bin/env python
 import argparse
-import csv
 import glob
 import json
 import logging
@@ -51,11 +50,11 @@ def include_file_config(args):
 
 
 def create_link(fileToLink, linkName, dry_run):
+    (logger.info if args.dry_run else logger.debug)('Linking %s to %s', fileToLink, linkName)
     if dry_run:
         return
     if os.path.lexists(linkName):
         os.unlink(linkName)
-    (logger.info if args.dry_run else logger.debug)('Linking %s to %s', fileToLink, linkName)
     os.symlink(fileToLink, linkName)
 
 
@@ -89,6 +88,10 @@ def copy_replace(fileTocopy, all_runs_dir, tool_name, run, dry_run):
     run_name = new_run_name(run)
     targetFile = os.path.join(
         all_runs_dir, os.path.basename(fileTocopy).replace(tool_name, run_name))
+    if dry_run:
+        logger.info('Would copy "%s" to "%s"', fileTocopy, targetFile)
+        return
+    logger.debug('Copying "%s" to "%s"', fileTocopy, targetFile)
     first = True
     with open(fileTocopy) as fdr_source, open(targetFile, 'w') as fdr_target:
         for line in fdr_source:
@@ -116,9 +119,12 @@ def main(args):
         run1/                       -> global_run_dir
         merged/                     -> merged_dir
             individual/             -> merged_dir_individual
-                times.csv@          -
-            combined/               -> merged_dir_benchmark
-                times.csv@          -
+                inject/             -> merged_dir_individual_inject
+                    times.csv@      - (only newest measurements of inject)
+                repair/             -> merged_dir_individual_repair
+                    times.csv@      - (only newest measurements of repair)
+            benchmark/              -> merged_dir_benchmark
+                times.csv@          - (only newest measurements of benchmark)
     """
     log_action = logger.info if args.dry_run else logger.debug
 
@@ -127,22 +133,19 @@ def main(args):
     merged_dir = os.path.join(result_dir, 'merged')
     merged_dir_benchmark = os.path.join(merged_dir, 'benchmark')
     merged_dir_individual = os.path.join(merged_dir, 'individual')
-    for dir_name in (merged_dir, merged_dir_benchmark, merged_dir_individual):
+    merged_dir_individual_inject = os.path.join(merged_dir_individual, 'inject')
+    merged_dir_individual_repair = os.path.join(merged_dir_individual, 'repair')
+    for dir_name in (merged_dir, merged_dir_benchmark, merged_dir_individual,
+                     merged_dir_individual_inject, merged_dir_individual_repair):
         ensure_directory(dir_name, args.dry_run)
 
-    # Gathering tools
-    tools = []
-    reader = csv.reader(args.tools)
-    next(reader)
-    for row in reader:
-        if not row:
-            continue
-        tools.append(row[0])
-    logger.debug('result_dir: %s, tools: %s', result_dir, tools)
+    # Using tools from config
+    logger.debug('result_dir: %s, tools: %s', result_dir, args.tools)
 
     # Clean symlinks if requested or max_size is set
     if (args.clean or args.max_size) and not args.dry_run:
-        for dir_to_clean in [merged_dir, merged_dir_benchmark, merged_dir_individual]:
+        for dir_to_clean in [merged_dir, merged_dir_benchmark, merged_dir_individual,
+                             merged_dir_individual_inject, merged_dir_individual_inject]:
             for link in os.listdir(dir_to_clean):
                 linkName = os.path.join(dir_to_clean, link)
                 if os.path.islink(linkName):
@@ -152,7 +155,7 @@ def main(args):
             os.remove(linkName)
 
     # Merge results
-    for tool in tools:
+    for tool in args.tools:
         if tool.startswith('#'):
             logger.debug('Ignoring tool "%s"', tool[1:])
             continue
@@ -182,7 +185,7 @@ def main(args):
             ensure_directory(global_run_dir, args.dry_run)
             for csvFile in os.listdir(run_dir):
                 # link file in run directory
-                fileToLink = os.path.join(tool_dir, run, csvFile)
+                fileToLink = os.path.join(run_dir, csvFile)
                 linkName = os.path.join(global_run_dir, csvFile)
                 create_link(fileToLink, linkName, args.dry_run)
                 # skip if max-size is set and size is exceeded
@@ -199,8 +202,16 @@ def main(args):
                         logging.warn('file did not match pattern: %s', csvFile)
                 # link file in merged directory
                 if csvFile not in already_merged:
-                    linkName = os.path.join(merged_dir_benchmark if BENCHMARK_PATTERN.match(csvFile)
-                                            else merged_dir_individual, csvFile)
+                    if BENCHMARK_PATTERN.match(csvFile):
+                        target_dir = merged_dir_benchmark
+                    elif 'inject' in csvFile:
+                        target_dir = merged_dir_individual_inject
+                    elif 'repair' in csvFile:
+                        target_dir = merged_dir_individual_repair
+                    else:
+                        # this file has a strange name
+                        logger.warn('Ignoring file "%s" with unknown pattern', fileToLink)
+                    linkName = os.path.join(target_dir, csvFile)
                     create_link(fileToLink, linkName, args.dry_run)
                     already_merged.append(csvFile)
                 else:
diff --git a/trainbenchmark/trainbenchmark-tool-jastadd-base/libs/jastadd2.jar b/trainbenchmark/trainbenchmark-tool-jastadd-base/libs/jastadd2.jar
index e25dc7f37bcebab5edcf1bb845dda0adf4aeb3ef..2796ca1608038a32a5b9173fdd07248207b5a192 100644
Binary files a/trainbenchmark/trainbenchmark-tool-jastadd-base/libs/jastadd2.jar and b/trainbenchmark/trainbenchmark-tool-jastadd-base/libs/jastadd2.jar differ