diff --git a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmConfiguration.java b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..39c5d70f066d65525a2310b6817469e6bfbdfe17
--- /dev/null
+++ b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmConfiguration.java
@@ -0,0 +1,87 @@
+package it.unibz.inf.isochrone.network;
+
+import it.unibz.inf.isochrone.algorithm.Isochrone;
+
+public class AlgorithmConfiguration {
+	private final Class<? extends Isochrone> algorithmClass;
+	private final TestParameters params;
+	private final boolean expireNodes;
+
+	public AlgorithmConfiguration(final Class<? extends Isochrone> algorithmClass, final TestParameters params, final boolean expireNodes) {
+		this.algorithmClass = algorithmClass;
+		this.params = params;
+		this.expireNodes = expireNodes;
+	}
+
+	public AlgorithmConfiguration(final Class<? extends Isochrone> algorithmClass, final TestParameters params) {
+		this(algorithmClass, params, true);
+	}
+
+	// Getters
+
+	public Class<? extends Isochrone> getAlgorithmClass() {
+		return algorithmClass;
+	}
+
+	public TestParameters getTestParameter() {
+		return params;
+	}
+
+	public boolean isExpireNodes() {
+		return expireNodes;
+	}
+
+	// Public methods
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		// CHECKSTYLE:OFF MagicNumber
+		result = prime * result + ((algorithmClass == null) ? 0 : algorithmClass.hashCode());
+		result = prime * result + (expireNodes ? 1231 : 1237);
+		result = prime * result + ((params == null) ? 0 : params.hashCode());
+		// CHECKSTYLE:ON MagicNumber
+		return result;
+	}
+
+	@Override
+	public boolean equals(final Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+
+		final AlgorithmConfiguration other = (AlgorithmConfiguration) obj;
+		if (algorithmClass == null) {
+			if (other.algorithmClass != null) {
+				return false;
+			}
+		} else if (!algorithmClass.equals(other.algorithmClass)) {
+			return false;
+		}
+		if (expireNodes != other.expireNodes) {
+			return false;
+		}
+		if (params == null) {
+			if (other.params != null) {
+				return false;
+			}
+		} else if (!params.equals(other.params)) {
+			return false;
+		}
+
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		return "CachingKey [class=" + algorithmClass.getSimpleName() + ", duration=" + params.getDuration() + ", expireNodes=" + expireNodes + "]";
+	}
+
+}
diff --git a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmHelper.java b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmHelper.java
index 62eb2458e7611abac6c6d21c61b4af34261cb370..d34e73a9aa72c0771708eb4b8cecfc3a9717c612 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmHelper.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmHelper.java
@@ -49,22 +49,19 @@ final class AlgorithmHelper {
 		return i1;
 	}
 
-	public static AlgorithmResult run(final Class<? extends Isochrone> algorithmClass, final TestParameters params) {
-		return run(algorithmClass, params, true);
-	}
-
-	public static AlgorithmResult run(final Class<? extends Isochrone> algorithmClass, final TestParameters params, final boolean expireNodes) {
+	public static AlgorithmResult run(final AlgorithmConfiguration config) {
+		final TestParameters params = config.getTestParameter();
 		final ConfigDataset c = ConfigDataset.getInstance(params.getDataset());
 		if (c == null) {
 			Assert.fail("Could not create dataset from configuration");
 		}
 
-		final Query query = new Query(params.getDirection(), params.getWalkingSpeed(), params.getDuration(), params.getDate(), expireNodes, params.getMode());
+		final Query query = new Query(params.getDirection(), params.getWalkingSpeed(), params.getDuration(), params.getDate(), config.isExpireNodes(), params.getMode());
 		query.setStartNodeIds(params.getStartNodeId());
 
 		Isochrone algorithm = null;
 		try {
-			algorithm = algorithmClass.getConstructor(ConfigDataset.class, Query.class).newInstance(c, query);
+			algorithm = config.getAlgorithmClass().getConstructor(ConfigDataset.class, Query.class).newInstance(c, query);
 		} catch (final InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
 			Assert.fail(e.getMessage());
 		}
diff --git a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmRuntimeTest.java b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmRuntimeTest.java
index c7c71b098af8758b6fd9a78806d7dd9fbf48ad3f..c6100e99c0d6ec9da77375fe6547f12ffdd155e3 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmRuntimeTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmRuntimeTest.java
@@ -203,7 +203,7 @@ public final class AlgorithmRuntimeTest {
 			for (final TestParameters params : dsParams) {
 				LOGGER.debug(" - executing for isochrone duration: " + params.getDuration());
 				final long startTime = Calendar.getInstance().getTimeInMillis();
-				AlgorithmHelper.run(clazz, params);
+				AlgorithmHelper.run(new AlgorithmConfiguration(clazz, params));
 
 				final long runTime = Calendar.getInstance().getTimeInMillis() - startTime;
 				LOGGER.debug(" - runtime \"" + params.getDuration() + "\": " + runTime + "msec");
diff --git a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java
index 635b4f21c724ce0f0b29e532e64c5f29a671ed54..85b404302680ea1e6ffcc2bf55baed32c90fc2e3 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java
@@ -92,7 +92,7 @@ public class AlgorithmTest {
 	private static void run(final Class<? extends Isochrone> algorithmClass, final TestParameters params, final boolean expireNodes) {
 		LOGGER.info("Executing \"" + algorithmClass.getSimpleName() + "\"" + ((expireNodes) ? " (with node expiration)" : ""));
 		final long startTime = Calendar.getInstance().getTimeInMillis();
-		AlgorithmHelper.run(algorithmClass, params, expireNodes);
+		AlgorithmHelper.run(new AlgorithmConfiguration(algorithmClass, params, expireNodes));
 		final long runTime = Calendar.getInstance().getTimeInMillis() - startTime;
 		LOGGER.info(" - runtime: \"" + params.getDuration() + "\": " + runTime + "msec");
 		LOGGER.info("-----------------------------");
diff --git a/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java b/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
index d55494e24e7617fe87c8c499f5a0e1ff7bd6e9f1..814fc838bdec43d15162f4eecd88437d42547962 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
@@ -42,6 +42,7 @@ public final class ComparisonTest {
 		2, 		// every 2 hours
 		1		// every day
 	};
+	private static Map<AlgorithmConfiguration, Collection<Integer>> cache = new HashMap<>();
 	private static Map<String, List<TestParameters>> datasets = new HashMap<>();
 	private static Map<String, InitParams> datasetParams;
 	private static Set<Integer> times;
@@ -118,6 +119,18 @@ public final class ComparisonTest {
 		datasets.put(datasetName, dsParams);
 	}
 
+	private static Collection<Integer> getResult(final AlgorithmConfiguration key) {
+		Collection<Integer> result = cache.get(key);
+		if (result == null) {
+			final MemoryOutput o1 = AlgorithmHelper.run(key).getOutput();
+			result = AlgorithmHelper.getDistinctIds(o1.getLinks());
+
+			cache.put(key, result);
+		}
+
+		return result;
+	}
+
 	private static synchronized void initDatasets() {
 		if (datasetParams != null) {
 			return;
@@ -171,11 +184,9 @@ public final class ComparisonTest {
 			final Collection<TestParameters> dsParams = datasets.get(dsName);
 			for (final TestParameters params : dsParams) {
 				LOGGER.debug(" - comparing for isochrone duration: " + params.getDuration());
-				final MemoryOutput o1 = AlgorithmHelper.run(clazz1, params, expireNodes).getOutput();
-				final MemoryOutput o2 = AlgorithmHelper.run(clazz2, params, expireNodes).getOutput();
-				final Collection<Integer> l1 = AlgorithmHelper.getDistinctIds(o1.getLinks());
-				final Collection<Integer> l2 = AlgorithmHelper.getDistinctIds(o2.getLinks());
-				Assert.assertEquals(l1, l2,  "Links for class \"" + n1 + "\"" + " != links for class \"" + n2 + "\"");
+				final Collection<Integer> l1 = getResult(new AlgorithmConfiguration(clazz1, params, expireNodes));
+				final Collection<Integer> l2 = getResult(new AlgorithmConfiguration(clazz2, params, expireNodes));
+				Assert.assertEquals(l1, l2,  "Links from algorithm \"" + n1 + "\"" + " are not equal to links from algorithm \"" + n2 + "\"");
 			}
 			LOGGER.info("-----------------------------");
 		}
diff --git a/src/test/java/it/unibz/inf/isochrone/network/ExpirationTest.java b/src/test/java/it/unibz/inf/isochrone/network/ExpirationTest.java
index d21771f1e6c6f31325a03e4b6a9e291cc88e0183..e4d6a105a22bcacc107f78c9dd08d61ca00e5331 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/ExpirationTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/ExpirationTest.java
@@ -59,7 +59,7 @@ public class ExpirationTest {
 	private static int run(final Class<? extends Isochrone> algorithmClass, final boolean expireNodes) {
 		LOGGER.info("Executing \"" + algorithmClass.getSimpleName() + "\"" + ((expireNodes) ? " (with node expiration)" : ""));
 		final long startTime = Calendar.getInstance().getTimeInMillis();
-		final AlgorithmResult result = AlgorithmHelper.run(algorithmClass, TEST_PARAMETER, expireNodes);
+		final AlgorithmResult result = AlgorithmHelper.run(new AlgorithmConfiguration(algorithmClass, TEST_PARAMETER, expireNodes));
 		final long runTime = Calendar.getInstance().getTimeInMillis() - startTime;
 		final int nrNodesMemory = result.getAlgorithm().getNodes().size();
 
diff --git a/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java b/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java
index 4619ab334df26d19aed56233d10b66d3d3f3c623..91c0b5d6ef892aedc0ba8dcdd724bbdf356cac3c 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java
@@ -46,7 +46,7 @@ public class ReachabilityTest {
 		final int nodeIdToCheck = 5117; // bus station id = 5117; Defregger Str./Fagenstraße (reachable by bus route 1)
 
 		LOGGER.info("Checking nodes from FUB (15min isncoming isochrone)");
-		final AlgorithmResult result = AlgorithmHelper.run(MineX.class, PARAM_LOCAL, true);
+		final AlgorithmResult result = AlgorithmHelper.run(new AlgorithmConfiguration(MineX.class, PARAM_LOCAL, true));
 		final Collection<Node> resultNodes = result.getOutput().getNodes();
 		LOGGER.info(" - found " + resultNodes.size() + " reachable nodes");
 
@@ -66,7 +66,7 @@ public class ReachabilityTest {
 		final int nodeIdToCheck = 5117; // bus station id = 5117; Defregger Str./Fagenstraße (reachable by bus route 1)
 
 		LOGGER.info("Checking nodes from FUB (15min isncoming isochrone)");
-		final AlgorithmResult result = AlgorithmHelper.run(MineX.class, PARAM_LOCAL, true);
+		final AlgorithmResult result = AlgorithmHelper.run(new AlgorithmConfiguration(MineX.class, PARAM_LOCAL, true));
 		final Collection<Link> resultLinks = result.getOutput().getLinks();
 		LOGGER.info(" - found " + resultLinks.size() + " links");