diff --git a/notebooks/tests/eval.ipynb b/notebooks/tests/eval.ipynb
index a3ca672857192e2bb8f566b06919f8eedcd6d47d..e67c8daa02e77bac6688d7c7b5886f7c8121ee6c 100644
--- a/notebooks/tests/eval.ipynb
+++ b/notebooks/tests/eval.ipynb
@@ -242,18 +242,21 @@
    "metadata": {},
    "outputs": [
     {
-     "ename": "ProBError",
-     "evalue": "ERROR\nProB returned error messages:\nError: Unknown identifier \"unknown\" (:1:0 to 1:7)",
+     "ename": "WithSourceCodeException",
+     "evalue": "de.prob.exception.ProBError: ERROR\nProB returned error messages:\nError: Unknown identifier \"unknown\" (:1:0 to 1:7)\nError: Unknown identifier \"nonsense\" (:1:11 to 1:19)",
      "output_type": "error",
      "traceback": [
       "\u001b[1m\u001b[30mError from ProB: \u001b[0m\u001b[1m\u001b[31mERROR\u001b[0m",
+      "\u001b[1m\u001b[30m2 errors:\u001b[0m",
       "\u001b[1m\u001b[31mError: Unknown identifier \"unknown\" (:1:0 to 1:7)\u001b[0m",
-      "\u001b[1m\u001b[30m// Source code not known\u001b[0m"
+      "\u001b[1m\u001b[30m\u001b[0m\u001b[1m\u001b[30m\u001b[41munknown\u001b[0m\u001b[1m\u001b[30m \\/ nonsense\u001b[0m",
+      "\u001b[1m\u001b[31mError: Unknown identifier \"nonsense\" (:1:11 to 1:19)\u001b[0m",
+      "\u001b[1m\u001b[30munknown \\/ \u001b[0m\u001b[1m\u001b[30m\u001b[41mnonsense\u001b[0m\u001b[1m\u001b[30m\u001b[0m"
      ]
     }
    ],
    "source": [
-    "unknown"
+    "unknown \\/ nonsense"
    ]
   },
   {
@@ -262,8 +265,8 @@
    "metadata": {},
    "outputs": [
     {
-     "ename": "ProBError",
-     "evalue": "UNKNOWN (enumeration warning)",
+     "ename": "WithSourceCodeException",
+     "evalue": "de.prob.exception.ProBError: UNKNOWN (enumeration warning)",
      "output_type": "error",
      "traceback": [
       "\u001b[1m\u001b[30mError from ProB: \u001b[0m\u001b[1m\u001b[31mUNKNOWN (enumeration warning)\u001b[0m"
@@ -280,18 +283,18 @@
    "metadata": {},
    "outputs": [
     {
-     "ename": "ProBError",
-     "evalue": "NOT-WELL-DEFINED\nProB returned error messages:\nError: mod not defined for negative numbers: 2 mod-1 (:1:0 to 1:8)",
+     "ename": "WithSourceCodeException",
+     "evalue": "de.prob.exception.ProBError: NOT-WELL-DEFINED\nProB returned error messages:\nError: mod not defined for negative numbers: 2 mod-1 (:1:5 to 1:13)",
      "output_type": "error",
      "traceback": [
       "\u001b[1m\u001b[30mError from ProB: \u001b[0m\u001b[1m\u001b[31mNOT-WELL-DEFINED\u001b[0m",
-      "\u001b[1m\u001b[31mError: mod not defined for negative numbers: 2 mod-1 (:1:0 to 1:8)\u001b[0m",
-      "\u001b[1m\u001b[30m// Source code not known\u001b[0m"
+      "\u001b[1m\u001b[31mError: mod not defined for negative numbers: 2 mod-1 (:1:5 to 1:13)\u001b[0m",
+      "\u001b[1m\u001b[30m1 + (\u001b[0m\u001b[1m\u001b[30m\u001b[41m2 mod -1\u001b[0m\u001b[1m\u001b[30m)\u001b[0m"
      ]
     }
    ],
    "source": [
-    "2 mod -1"
+    "1 + (2 mod -1)"
    ]
   },
   {
diff --git a/notebooks/tests/let.ipynb b/notebooks/tests/let.ipynb
index 7739a36fd1ac45f7bafc1d9698ae4f7efce2497f..41a510017afd6d15691af680ce345650257cec7e 100644
--- a/notebooks/tests/let.ipynb
+++ b/notebooks/tests/let.ipynb
@@ -200,11 +200,15 @@
    "metadata": {},
    "outputs": [
     {
-     "ename": "CommandExecutionException",
-     "evalue": ":eval: Computation not completed: Unknown identifier \"n\", did you mean \"IN\"?",
+     "ename": "WithSourceCodeException",
+     "evalue": "de.prob.exception.ProBError: ERROR\nProB returned error messages:\nError: Unknown identifier \"n\", did you mean \"IN\"? (:2:0 to 2:1)",
      "output_type": "error",
      "traceback": [
-      "\u001b[1m\u001b[31m:eval: Computation not completed: Unknown identifier \"n\", did you mean \"IN\"?\u001b[0m"
+      "\u001b[1m\u001b[30mError from ProB: \u001b[0m\u001b[1m\u001b[31mERROR\u001b[0m",
+      "\u001b[1m\u001b[31mError: Unknown identifier \"n\", did you mean \"IN\"? (:2:0 to 2:1)\u001b[0m",
+      "\u001b[1m\u001b[30mLET hello BE hello={1,2,3,4,5,10} IN(\u001b[0m",
+      "\u001b[1m\u001b[30m\u001b[0m\u001b[1m\u001b[30m\u001b[41mn\u001b[0m\u001b[1m\u001b[30m\u001b[0m",
+      "\u001b[1m\u001b[30m)END\u001b[0m"
      ]
     }
    ],
@@ -346,11 +350,13 @@
    "metadata": {},
    "outputs": [
     {
-     "ename": "CommandExecutionException",
-     "evalue": ":eval: Computation not completed: Unknown identifier \"hello\"",
+     "ename": "WithSourceCodeException",
+     "evalue": "de.prob.exception.ProBError: ERROR\nProB returned error messages:\nError: Unknown identifier \"hello\" (:1:0 to 1:5)",
      "output_type": "error",
      "traceback": [
-      "\u001b[1m\u001b[31m:eval: Computation not completed: Unknown identifier \"hello\"\u001b[0m"
+      "\u001b[1m\u001b[30mError from ProB: \u001b[0m\u001b[1m\u001b[31mERROR\u001b[0m",
+      "\u001b[1m\u001b[31mError: Unknown identifier \"hello\" (:1:0 to 1:5)\u001b[0m",
+      "\u001b[1m\u001b[30m\u001b[0m\u001b[1m\u001b[30m\u001b[41mhello\u001b[0m\u001b[1m\u001b[30m\u001b[0m"
      ]
     }
    ],
diff --git a/notebooks/tests/solve.ipynb b/notebooks/tests/solve.ipynb
index 067057bb9c9f040354ff8849bd29989ce7e2a702..1f1f91baacfcf6f28d4cba907111078d22afd073 100644
--- a/notebooks/tests/solve.ipynb
+++ b/notebooks/tests/solve.ipynb
@@ -125,11 +125,11 @@
    "metadata": {},
    "outputs": [
     {
-     "ename": "PrologException",
-     "evalue": "Unhandled exception thrown from Prolog: (error(existence_error(procedure,:(z3interface,/(pop_frame,0))),existence_error($@(:(z3interface,pop_frame),4427626972),0,procedure,:(z3interface,/(pop_frame,0)),0)))\n",
+     "ename": "WithSourceCodeException",
+     "evalue": "de.prob.exception.PrologException: Unhandled exception thrown from Prolog: (error(existence_error(procedure,:(z3interface,/(pop_frame,0))),existence_error($@(:(z3interface,pop_frame),4545727948),0,procedure,:(z3interface,/(pop_frame,0)),0)))\n",
      "output_type": "error",
      "traceback": [
-      "\u001b[1m\u001b[30mError from ProB: \u001b[0m\u001b[1m\u001b[31mUnhandled exception thrown from Prolog: (error(existence_error(procedure,:(z3interface,/(pop_frame,0))),existence_error($@(:(z3interface,pop_frame),4427626972),0,procedure,:(z3interface,/(pop_frame,0)),0)))",
+      "\u001b[1m\u001b[30mError from ProB: \u001b[0m\u001b[1m\u001b[31mUnhandled exception thrown from Prolog: (error(existence_error(procedure,:(z3interface,/(pop_frame,0))),existence_error($@(:(z3interface,pop_frame),4545727948),0,procedure,:(z3interface,/(pop_frame,0)),0)))",
       "\u001b[0m"
      ]
     }
@@ -144,8 +144,8 @@
    "metadata": {},
    "outputs": [
     {
-     "ename": "ProBError",
-     "evalue": "ProB reported Errors\nProB returned error messages:\nInternal error: Call for event start_solving failed. init_smt_supported_interpreter",
+     "ename": "WithSourceCodeException",
+     "evalue": "de.prob.exception.ProBError: ProB reported Errors\nProB returned error messages:\nInternal error: Call for event start_solving failed. init_smt_supported_interpreter",
      "output_type": "error",
      "traceback": [
       "\u001b[1m\u001b[30mError from ProB: \u001b[0m\u001b[1m\u001b[31mProB reported Errors\u001b[0m",
@@ -195,11 +195,12 @@
    "metadata": {},
    "outputs": [
     {
-     "ename": "CommandExecutionException",
-     "evalue": ":eval: NOT-INITIALISED",
+     "ename": "WithSourceCodeException",
+     "evalue": "de.prob.exception.ProBError: NOT-INITIALISED\nProB returned no error messages.",
      "output_type": "error",
      "traceback": [
-      "\u001b[1m\u001b[31m:eval: NOT-INITIALISED\u001b[0m"
+      "\u001b[1m\u001b[30mError from ProB: \u001b[0m\u001b[1m\u001b[31mNOT-INITIALISED\u001b[0m",
+      "\u001b[1m\u001b[30mProB returned no error messages.\u001b[0m"
      ]
     }
    ],
diff --git a/src/main/java/de/prob2/jupyter/commands/EvalCommand.java b/src/main/java/de/prob2/jupyter/commands/EvalCommand.java
index 1693bf04369403e5b9178e56e1b24810b6c037c3..ae399d3d5de98941bacd22c21924c0f7f5d1e4e8 100644
--- a/src/main/java/de/prob2/jupyter/commands/EvalCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/EvalCommand.java
@@ -5,6 +5,7 @@ import java.util.Collections;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 
+import de.prob.animator.domainobjects.AbstractEvalResult;
 import de.prob.animator.domainobjects.FormulaExpand;
 import de.prob.animator.domainobjects.IEvalElement;
 import de.prob.statespace.AnimationSelector;
@@ -65,9 +66,10 @@ public final class EvalCommand implements Command {
 	public @NotNull DisplayData run(final @NotNull ParsedArguments args) {
 		final ProBKernel kernel = this.injector.getInstance(ProBKernel.class);
 		final IEvalElement formula = kernel.parseFormula(args.get(FORMULA_PARAM), FormulaExpand.EXPAND);
-		return CommandUtils.displayDataForEvalResult(CommandUtils.withSourceCode(formula, () ->
-			kernel.postprocessEvalResult(this.animationSelector.getCurrentTrace().evalCurrent(formula))
-		));
+		return CommandUtils.withSourceCode(formula, () -> {
+			final AbstractEvalResult aer = this.animationSelector.getCurrentTrace().evalCurrent(formula);
+			return CommandUtils.displayDataForEvalResult(kernel.postprocessEvalResult(aer));
+		});
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/LetCommand.java b/src/main/java/de/prob2/jupyter/commands/LetCommand.java
index fb7c44ddbfb8375649f99566169854b75b49cf84..84b288cddf975fc2440f08808be32da87fc67852 100644
--- a/src/main/java/de/prob2/jupyter/commands/LetCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/LetCommand.java
@@ -85,7 +85,7 @@ public final class LetCommand implements Command {
 		if (evaluated instanceof EvalResult) {
 			kernel.getVariables().put(name, ((EvalResult)evaluated).getValue());
 		}
-		return CommandUtils.displayDataForEvalResult(evaluated);
+		return CommandUtils.withSourceCode(formula, () -> CommandUtils.displayDataForEvalResult(evaluated));
 	}
 	
 	@Override
diff --git a/src/main/java/de/prob2/jupyter/commands/SolveCommand.java b/src/main/java/de/prob2/jupyter/commands/SolveCommand.java
index d8e59a3d098db2040e68fe60c1d80be60f1cdc9a..d3df74c08939f3579d4cbc452ea6771543e51d48 100644
--- a/src/main/java/de/prob2/jupyter/commands/SolveCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/SolveCommand.java
@@ -89,8 +89,10 @@ public final class SolveCommand implements Command {
 		final IEvalElement predicate = kernel.parseFormula(args.get(PREDICATE_PARAM), FormulaExpand.EXPAND);
 		
 		final CbcSolveCommand cmd = new CbcSolveCommand(predicate, solver, this.animationSelector.getCurrentTrace().getCurrentState());
-		trace.getStateSpace().execute(cmd);
-		return CommandUtils.displayDataForEvalResult(kernel.postprocessEvalResult(cmd.getValue()));
+		return CommandUtils.withSourceCode(predicate, () -> {
+			trace.getStateSpace().execute(cmd);
+			return CommandUtils.displayDataForEvalResult(kernel.postprocessEvalResult(cmd.getValue()));
+		});
 	}
 	
 	@Override