diff --git a/src/main/java/de/tudresden/inf/st/mg/Main.java b/src/main/java/de/tudresden/inf/st/mg/Main.java
index 60829c7299a3b4b1d1083fc996484de2ffc35427..de555c72af11836d788b5276ff4d18759792af6f 100644
--- a/src/main/java/de/tudresden/inf/st/mg/Main.java
+++ b/src/main/java/de/tudresden/inf/st/mg/Main.java
@@ -13,6 +13,8 @@ import de.tudresden.inf.st.mg.jastadd.model.JastAddList;
 import de.tudresden.inf.st.mg.jastadd.model.RobotWorld;
 import de.tudresden.inf.st.mg.jastadd.model.Table;
 import de.tudresden.inf.st.mg.jastadd.model.World;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
@@ -21,9 +23,12 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
 import java.util.Random;
+import java.util.concurrent.TimeUnit;
 
 public class Main {
 
+  private static final Logger logger = LoggerFactory.getLogger(Main.class);
+
   public static final Path TIDY_AST_DIAGRAM_DIR = Path.of("src", "gen", "resources", "diagrams", "parsing", "tidy");
 
   private final RobotWorld world;
@@ -85,28 +90,44 @@ public class Main {
 
   }
 
-  private Thread parse;
+  private ParseThread parse;
 
-  public void startParse() {
-    if (parse != null && parse.isAlive()) {
-      parse.interrupt(); // if not working replace by stop()
+  class ParseThread extends Thread {
+
+    private RobotParser parser;
+
+    @Override
+    public void run() {
+      logger.info("starting to parse");
+      // create a parser using the world
+      parser = new RobotParser(world);
+
+      // parse (synchronously, long-running)
+      try {
+        var result = parser.parse();
+        logger.info("parsing completed!");
+      } catch (MotionGrammarParser.ParseException e) {
+        throw new RuntimeException(e);
+      } catch (MotionGrammarParser.ParsingStoppedException ignored) {
+        logger.info("Parsing stopped");
+      }
     }
-    parse = new Thread(this::parse);
-    parse.start();
-  }
 
-  public void parse() {
-    System.out.println("starting to parse");
-    // create a parser using the world
-    RobotParser parser = new RobotParser(world);
+    void stopParsing() {
+      parser.setShouldStopParsing(true);
+    }
+  }
 
-    // parse (synchronously, long-running)
-    try {
-      var result = parser.parse();
-    } catch (MotionGrammarParser.ParseException e) {
-      throw new RuntimeException(e);
+  public void startParse() {
+    if (parse != null && parse.isAlive()) {
+      parse.stopParsing();
+      try {
+        parse.join();
+      } catch (InterruptedException e) {
+      }
     }
-    System.out.println("parsing completed!");
+    parse = new ParseThread();
+    parse.start();
   }
 
   public void resetSelections() {
diff --git a/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java
index 6a536e5c3cef1072d2891b9120f9aaa8e3cf36b8..194af22edd8119619b171c86946300fba18b3a1f 100644
--- a/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java
+++ b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java
@@ -12,6 +12,7 @@ import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
@@ -20,12 +21,19 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
   protected ASTNode<T> rootContainer_;
   private int timeStep_;
 
-  protected static void waitSomeTime() {
+  private boolean shouldStopParsing = false;
+
+  public void setShouldStopParsing(boolean value) {
+    shouldStopParsing = value;
+  }
+
+  protected void waitSomeTime() {
+    if (shouldStopParsing) {
+      throw new ParsingStoppedException();
+    }
     try {
-      Thread.sleep(100/*ms*/);
+      TimeUnit.MILLISECONDS.sleep(100);
     } catch(InterruptedException e) {
-      System.err.println("received interruption while parsing");
-      Thread.currentThread().stop();
     }
   }
 
@@ -113,4 +121,8 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
       super("Unable to parse token " + expectedToken.name() + ".");
     }
   }
+
+  public static class ParsingStoppedException extends RuntimeException {
+    /* empty */
+  }
 }