diff --git a/alib2algo/src/grammar/parsing/SLR1ParseTable.cpp b/alib2algo/src/grammar/parsing/SLR1ParseTable.cpp
index 0b3025d18bab07596196d4098a204f6a6d92c4d8..fd16f200e7f849cb760960351e41d64341fe5673 100644
--- a/alib2algo/src/grammar/parsing/SLR1ParseTable.cpp
+++ b/alib2algo/src/grammar/parsing/SLR1ParseTable.cpp
@@ -67,6 +67,23 @@ LRActionTable SLR1ParseTable::getActionTable ( grammar::CFG originalGrammar ) {
 	return actionTable;
 }
 
+LRGotoTable SLR1ParseTable::getGotoTable ( grammar::CFG originalGrammar ) {
+	LRGotoTable gotoTable;
+	grammar::CFG augmentedGrammar = LRParser::getAugmentedGrammar ( originalGrammar );
+	automaton::DFA parsingAutomaton = LR0Parser::getAutomaton ( originalGrammar );
+	for ( const automaton::State & state : parsingAutomaton.getStates ( ) ) {
+		std::map < std::pair < automaton::State, alphabet::Symbol >, automaton::State > transitionsFromCurrentState = parsingAutomaton.getTransitionsFromState ( state );
+		for ( const alphabet::Symbol & nonterminal : augmentedGrammar.getNonterminalAlphabet ( ) ) {
+			std::map < std::pair<automaton::State, alphabet::Symbol >, automaton::State >::iterator transitionIterator = transitionsFromCurrentState.find ( { state, nonterminal } );
+			if ( transitionIterator != transitionsFromCurrentState.end ( ) ) {
+				gotoTable.insert ( { { state, nonterminal }, transitionIterator->second } );
+			}
+		}
+	}
+
+	return gotoTable;
+}
+
 } /* namespace parsing */
 
 } /* namespace grammar */
diff --git a/alib2algo/src/grammar/parsing/SLR1ParseTable.h b/alib2algo/src/grammar/parsing/SLR1ParseTable.h
index 3f4c6a4b5a8c5d5843939c7f434e588db16f0e05..34cfabd1a68d48afb56493a8582d2892a4761706 100644
--- a/alib2algo/src/grammar/parsing/SLR1ParseTable.h
+++ b/alib2algo/src/grammar/parsing/SLR1ParseTable.h
@@ -22,6 +22,8 @@ class SLR1ParseTable {
 
 public:
 	static LRActionTable getActionTable ( grammar::CFG originalGrammar );
+
+	static LRGotoTable getGotoTable ( grammar::CFG originalGrammar );
 };
 
 } /* namespace parsing */