diff --git a/info4/kapitel-8/GOTO-Programme.ipynb b/info4/kapitel-8/GOTO-Programme.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..6aa8827b23c3542d9953fde1038339a255767c7b
--- /dev/null
+++ b/info4/kapitel-8/GOTO-Programme.ipynb
@@ -0,0 +1,141 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# GOTO-Programme\n",
+    "\n",
+    "Die letzte Programmiersprache, die wir betrachten ist GOTO.\n",
+    "Die Syntax eines GOTO-Programms ist wie folgt definiert:\n",
+    "* Ein GOTO-Programm besteht aus Markierten Anweisungen $M_1: A_1; M_2: A_2; ...  M_m: A_m;$\n",
+    "* Die Markierungen beginnen bei 1 und steigen immer um 1 an.\n",
+    "* Jede Anweisung wird durch 1 Semicolon abgeschlossen (ein GOTO-Programm endet immer mit einem Semicolon)\n",
+    "* Anweisungen $A_i$ dürfen dabei sein:\n",
+    "    * Zuweisung $x_i:=x_j+c$, $x_i:=x_j-c$ und $x_i:=c$ für $c\\in\\mathbb{N}$\n",
+    "    * Unbedingter Sprung $GOTO\\ M_i$\n",
+    "    * Bedingter Sprung $IF\\ x_i=c\\ THEN\\ GOTO\\ M_j$\n",
+    "    * Abbruchanweisung $HALT$"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Die Semantik eines GOTO-Programms lässt sich wie folgt verstehen:\n",
+    "Das Programm startet an der mit $M_1$ markierten Anweisung und führt diese aus.\n",
+    "Ist diese eine Zuweisung oder ein bedingter Sprung, dessen Bedingung nicht erfüllt ist, so wird mit der nächsten Anweisung weiter gemacht.\n",
+    "Wenn ein unbedingter Sprung oder ein bedingter Sprung miterfüllter Bedingung ausgeführt wird, wird an der entsprechenden Markierung fortgefahren.\n",
+    "Bei einer Abbruchanweisung hält das Programm sofort an und der Wert von $x_0$ wird zurück gegeben.\n",
+    "\n",
+    "Da ein GOTO-Programm stets von einem $HALT$ beendet wird, ist die letze Anweisung in einem GOTO-Programm immer $HALT$ oder $GOTO$."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Eine Funktion heißt GOTO-berechenbar, falls es ein GOTO-Programm gibt, das mit $n_1,...,n_k$ in den Variablen $x_1,...,x_k$ gestartet wird und mit $f(n_1,n_2,...,n_k)$ in der Variablen $x_0$ endet, falls $f(n_1,n_2,...,n_k)$ definiert ist. Andernfalls stoppt das GOTO-Programm nicht.\n",
+    "Ein Beispiel dafür ist die 2er-Potenz $f(n) = n^2$:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Help on function interpret in module __main__:\n",
+      "\n",
+      "interpret(program, timeout=60)\n",
+      "    Funktion zum Ausführen eines GOTO-Programms.\n",
+      "    :param program: GOTO-Programm als String 'M1: A1; M2: A2; ... Mn: An;'\n",
+      "    :param timeout: Zeit nach der die Ausführung eines Programms pausiert wird.\n",
+      "                    Gibt eine Möglichkeit zum Abbrechen bei einer Endlosschleife.\n",
+      "                    Ein Wert von 0 deaktiviert den Timeout.\n",
+      "    :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem GOTO-Programm zurück.\n",
+      "    :usage interpret('M1: x0 := x0 + 1; M2: IF x0 = 10 THEN GOTO M4; M3: GOTO M1; M4: HALT;')\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "%run ./Interpreter/gotointerpreter.py"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "14"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "interpret('''\n",
+    "M1:x1:=6;\n",
+    "M2:x2:=8;\n",
+    "M3:x0:=x1+0;\n",
+    "M4:IF x2=0 THEN GOTO M8;\n",
+    "M5:x0:=x0 + 1;\n",
+    "M6:x2:=x2 − 1;\n",
+    "M7:GOTO M4;\n",
+    "M8:HALT;''')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "10"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "interpret('M1: x0 := x0 + 1; M2: IF x0 = 10 THEN GOTO M4; M3: GOTO M1; M4: HALT;')"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.8.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/info4/kapitel-8/Interpreter/gotointerpreter.py b/info4/kapitel-8/Interpreter/gotointerpreter.py
index 040b4d36fa4f44b6f92738e6e805d7cb227563b8..1fbeaf031db79fe600c309a56b19c65b47540987 100644
--- a/info4/kapitel-8/Interpreter/gotointerpreter.py
+++ b/info4/kapitel-8/Interpreter/gotointerpreter.py
@@ -283,5 +283,16 @@ class GOTOInterpreter:
 
 
 def interpret(program, timeout=60):
+    """Funktion zum Ausführen eines GOTO-Programms.
+    :param program: GOTO-Programm als String 'M1: A1; M2: A2; ... Mn: An;'
+    :param timeout: Zeit nach der die Ausführung eines Programms pausiert wird.
+                    Gibt eine Möglichkeit zum Abbrechen bei einer Endlosschleife.
+                    Ein Wert von 0 deaktiviert den Timeout.
+    :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem GOTO-Programm zurück.
+    :usage interpret('M1: x0 := x0 + 1; M2: IF x0 = 10 THEN GOTO M4; M3: GOTO M1; M4: HALT;')"""
     interpreter = GOTOInterpreter(timeout)
     return interpreter.interpret(program)
+
+
+if __name__ == '__main__':
+    help(interpret)
diff --git a/info4/kapitel-8/Interpreter/loopinterpreter.py b/info4/kapitel-8/Interpreter/loopinterpreter.py
index d04ad9337460c227933d7462da97065d30d229fd..36c7c2c68d4c56e942c280a50bca8828b5e8ec5b 100644
--- a/info4/kapitel-8/Interpreter/loopinterpreter.py
+++ b/info4/kapitel-8/Interpreter/loopinterpreter.py
@@ -2,6 +2,7 @@ import lexer
 import sys
 import operator
 import re
+from IPython.display import clear_output
 
 
 class ErrorHandler:
@@ -21,6 +22,7 @@ class ErrorHandler:
         self.line_number += value
 
     def handle_break(self):
+        clear_output(wait=True)
         print('BREAK in Zeile ' + str(self.line_number))
         print('Aktueller Zustand:')
         for k, v in self.interpreter.values.items():
@@ -249,5 +251,13 @@ class LOOPInterpreter:
 
 
 def interpret(program):
+    """Funktion zum Ausführen eines LOOP-Programms.
+        :param program: LOOP-Programm als String 'x1 := 4; LOOP x1 DO x0:=x0+1 END'
+        :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem LOOP-Programm zurück.
+        :usage interpret('x1:=10; x2:=8; x0:=x2+0; LOOP x1 DO x0:=x0+1 END')"""
     interpreter = LOOPInterpreter()
     return interpreter.interpret(program)
+
+
+if __name__ == '__main__':
+    help(interpret)
diff --git a/info4/kapitel-8/Interpreter/whileinterpreter.py b/info4/kapitel-8/Interpreter/whileinterpreter.py
index ad491e35efca2426ff81df81894766c1a9034a10..d5193eeaf35ddc29a44cfb094ee858a32f68ed03 100644
--- a/info4/kapitel-8/Interpreter/whileinterpreter.py
+++ b/info4/kapitel-8/Interpreter/whileinterpreter.py
@@ -2,6 +2,7 @@ import lexer
 from loopinterpreter import LOOPInterpreter, ErrorHandler
 import re
 import signal
+from IPython.display import clear_output
 
 
 class Timeout:
@@ -18,6 +19,7 @@ class Timeout:
 
     def interrupt(self, sig_num, stack_frame):
         try:
+            clear_output(wait=True)
             abort = input('''Die Funktion rechnet relativ lange.
 Vielleicht liegt eine Endlosschleife vor.
 Möchten sie abbrechen? [J,n]:''')
@@ -184,5 +186,16 @@ class WHILEInterpreter(LOOPInterpreter):
 
 
 def interpret(program, timeout=60):
+    """Funktion zum Ausführen eines WHILE-Programms.
+    :param program: WHILE-Programm als String 'x1:=10; x2:=8; x0:=x2+0; WHILE x1 /=0 DO x0:=x0+1; x1:=x1-1 END'
+    :param timeout: Zeit nach der die Ausführung eines Programms pausiert wird.
+                    Gibt eine Möglichkeit zum Abbrechen bei einer Endlosschleife.
+                    Ein Wert von 0 deaktiviert den Timeout.
+    :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem WHILE-Programm zurück.
+    :usage interpret('x1:=10; x2:=8; x0:=x2+0; WHILE x1 /=0 DO x0:=x0+1; x1:=x1-1 END')"""
     interpreter = WHILEInterpreter(timeout)
     return interpreter.interpret(program)
+
+
+if __name__ == '__main__':
+    help(interpret)
diff --git a/info4/kapitel-8/LOOP-Programme.ipynb b/info4/kapitel-8/LOOP-Programme.ipynb
index 2f7295e6c282d082e4b9db9d2b4cd904c4886fcd..884e03c7887d155d2be5d4aa4a71300b0be8e64a 100644
--- a/info4/kapitel-8/LOOP-Programme.ipynb
+++ b/info4/kapitel-8/LOOP-Programme.ipynb
@@ -40,7 +40,22 @@
    "metadata": {
     "scrolled": false
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Help on function interpret in module __main__:\n",
+      "\n",
+      "interpret(program)\n",
+      "    Funktion zum Ausführen eines LOOP-Programms.\n",
+      "    :param program: LOOP-Programm als String 'x1 := 4; LOOP x1 DO x0:=x0+1 END'\n",
+      "    :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem LOOP-Programm zurück.\n",
+      "    :usage interpret('x1:=10; x2:=8; x0:=x2+0; LOOP x1 DO x0:=x0+1 END')\n",
+      "\n"
+     ]
+    }
+   ],
    "source": [
     "%run Interpreter/loopinterpreter.py"
    ]
diff --git a/info4/kapitel-8/WHILE-Programme.ipynb b/info4/kapitel-8/WHILE-Programme.ipynb
index 11c0634656a76e8a81c899132a2316ea1c2c35d7..4dcdb7d2137168ab04d9a623103c651a73301d5c 100644
--- a/info4/kapitel-8/WHILE-Programme.ipynb
+++ b/info4/kapitel-8/WHILE-Programme.ipynb
@@ -36,7 +36,25 @@
    "cell_type": "code",
    "execution_count": 1,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Help on function interpret in module __main__:\n",
+      "\n",
+      "interpret(program, timeout=60)\n",
+      "    Funktion zum Ausführen eines WHILE-Programms.\n",
+      "    :param program: WHILE-Programm als String 'x1:=10; x2:=8; x0:=x2+0; WHILE x1 /=0 DO x0:=x0+1; x1:=x1-1 END'\n",
+      "    :param timeout: Zeit nach der die Ausführung eines Programms pausiert wird.\n",
+      "                    Gibt eine Möglichkeit zum Abbrechen bei einer Endlosschleife.\n",
+      "                    Ein Wert von 0 deaktiviert den Timeout.\n",
+      "    :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem WHILE-Programm zurück.\n",
+      "    :usage interpret('x1:=10; x2:=8; x0:=x2+0; WHILE x1 /=0 DO x0:=x0+1; x1:=x1-1 END')\n",
+      "\n"
+     ]
+    }
+   ],
    "source": [
     "%run Interpreter/whileinterpreter.py"
    ]