diff --git a/src/de/stups/probkodkod/KodkodAnalysis.java b/src/de/stups/probkodkod/KodkodAnalysis.java
index 11f3793293e18e8ed6b5bebb4b603600c5ef7d6d..3b01b5687270cacf336e3637ae1771630c202c9e 100644
--- a/src/de/stups/probkodkod/KodkodAnalysis.java
+++ b/src/de/stups/probkodkod/KodkodAnalysis.java
@@ -93,6 +93,7 @@ import de.stups.probkodkod.parser.node.ARelInnerformula;
 import de.stups.probkodkod.parser.node.ARelation;
 import de.stups.probkodkod.parser.node.ARelrefInnerexpression;
 import de.stups.probkodkod.parser.node.ARequest;
+import de.stups.probkodkod.parser.node.AReset;
 import de.stups.probkodkod.parser.node.ASetMultiplicity;
 import de.stups.probkodkod.parser.node.ASomeMultiplicity;
 import de.stups.probkodkod.parser.node.AStandardType;
@@ -308,6 +309,11 @@ public class KodkodAnalysis extends DepthFirstAdapter {
 		session.stop();
 	}
 
+	@Override
+	public void outAReset(final AReset node) {
+		session.reset();
+	}
+
 	private Map<String, TupleSet> extractArguments(final List<PArgument> args,
 			final ImmutableProblem problem) {
 		final Map<String, TupleSet> result = new HashMap<String, TupleSet>();
diff --git a/src/de/stups/probkodkod/KodkodSession.java b/src/de/stups/probkodkod/KodkodSession.java
index 059492f39c9f83d8243ff5e1b9536e0defdf635f..f618ec94360dc9aef2d909e48680846997620fe3 100644
--- a/src/de/stups/probkodkod/KodkodSession.java
+++ b/src/de/stups/probkodkod/KodkodSession.java
@@ -90,6 +90,18 @@ public class KodkodSession {
 		this.stopped = true;
 	}
 
+	public void reset() {
+		long before = Runtime.getRuntime().freeMemory();
+		this.problems.clear();
+		this.solvers.clear();
+		this.currentRequests.clear();
+		System.gc();
+		long after = Runtime.getRuntime().freeMemory();
+		logger.info("session reseted (" + before
+				+ " bytes of free memory before and " + after
+				+ " bytes after reset (diff: " + (after - before) + " bytes)");
+	}
+
 	private void info(final ImmutableProblem problem, final String info) {
 		if (logger.isLoggable(Level.INFO)) {
 			logger.info("problem '" + problem.getId() + "': " + info);
diff --git a/src/problem.grammar b/src/problem.grammar
index d32d2959a6867009fcc49249f4752162ac42597b..ff4ed488be658662883b0f66e6ae5cfc85f21aab 100644
--- a/src/problem.grammar
+++ b/src/problem.grammar
@@ -59,6 +59,7 @@ Tokens
   keyword_varref = 'varref';
   keyword_request = 'request';
   keyword_stop = 'stop';
+  keyword_reset = 'reset';
   keyword_list = 'list';
   keyword_positive = 'pos';
   keyword_negative = 'neg';
@@ -93,6 +94,7 @@ Productions
     | {request} request
     | {list}    list
     | {stop}    stop
+    | {reset}   reset
     | {none};
 
   problem = keyword_problem [id]:identifier
@@ -208,3 +210,6 @@ Productions
   list = keyword_list [problem]:identifier [size]:number;
 
   stop = keyword_stop;
+  
+  reset = keyword_reset;
+