diff --git a/aconvert2/src/DotConverter.cpp b/aconvert2/src/DotConverter.cpp
index 1745ebd72cdc693777553b90c59267104d8cfe75..8ffa92711346f72100b2571521b0d94a2b6c040a 100644
--- a/aconvert2/src/DotConverter.cpp
+++ b/aconvert2/src/DotConverter.cpp
@@ -10,6 +10,7 @@
 
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/EpsilonNFA.h>
+#include <automaton/FSM/MultiInitialStateNFA.h>
 #include <automaton/FSM/DFA.h>
 #include <automaton/FSM/ExtendedNFA.h>
 #include <automaton/FSM/CompactNFA.h>
@@ -67,6 +68,39 @@ void DotConverter::convert(const automaton::EpsilonNFA& a, std::ostream& out) {
 		}
 	}
 
+	//Mark initial states
+	out << "node [shape = plaintext, label=\"start\"]; 0; \n";
+	out << "0 -> " << states.find(a.getInitialState())->second << ";\n";
+
+	transitions(a, states, out);
+	out << "}";
+}
+
+void DotConverter::convert(const automaton::MultiInitialStateNFA& a, std::ostream& out) {
+	label::LabelToStringComposer composer;
+
+	out << "digraph automaton {\n";
+	out << "rankdir=LR;\n";
+	int cnt = 1;
+
+	//Map states to indices
+	std::map<automaton::State, int> states;
+	for (const automaton::State& state : a.getStates()) {
+		states.insert(std::make_pair(state, cnt++));
+	}
+
+	//Print final states
+	for (const automaton::State& state : a.getFinalStates()) {
+		out << "node [shape = doublecircle, label=\"" << composer.compose(state.getName()) << "\"]; " << states.find(state)->second << ";\n";
+	}
+
+	//Print nonfinal states
+	for (const auto& state : states) {
+		if (!a.getFinalStates().count(state.first)) {
+			out << "node [shape = circle, label=\"" << composer.compose(state.first.getName()) << "\" ]; " << state.second << ";\n";
+		}
+	}
+
 	//Mark initial states
 	out << "node [shape = plaintext, label=\"start\"]; 0; \n";
 	for (const automaton::State& state : a.getInitialStates()) {
@@ -104,9 +138,7 @@ void DotConverter::convert(const automaton::NFA& a, std::ostream& out) {
 
 	//Mark initial states
 	out << "node [shape = plaintext, label=\"start\"]; 0; \n";
-	for (const automaton::State& state : a.getInitialStates()) {
-		out << "0 -> " << states.find(state)->second << ";\n";
-	}
+	out << "0 -> " << states.find(a.getInitialState())->second << ";\n";
 
 	transitions(a, states, out);
 	out << "}";
@@ -172,9 +204,7 @@ void DotConverter::convert(const automaton::ExtendedNFA& a, std::ostream& out) {
 
 	//Mark initial states
 	out << "node [shape = plaintext, label=\"start\"]; 0; \n";
-	for (const automaton::State& state : a.getInitialStates()) {
-		out << "0 -> " << states.find(state)->second << ";\n";
-	}
+	out << "0 -> " << states.find(a.getInitialState())->second << ";\n";
 
 	transitions(a, states, out);
 	out << "}";
@@ -207,9 +237,7 @@ void DotConverter::convert(const automaton::CompactNFA& a, std::ostream& out) {
 
 	//Mark initial states
 	out << "node [shape = plaintext, label=\"start\"]; 0; \n";
-	for (const automaton::State& state : a.getInitialStates()) {
-		out << "0 -> " << states.find(state)->second << ";\n";
-	}
+	out << "0 -> " << states.find(a.getInitialState())->second << ";\n";
 
 	transitions(a, states, out);
 	out << "}";
@@ -587,6 +615,33 @@ void DotConverter::transitions(const automaton::EpsilonNFA& fsm, const std::map<
 	}
 }
 
+void DotConverter::transitions(const automaton::MultiInitialStateNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out) {
+	std::map<std::pair<int, int>, std::string> transitions;
+
+	//put transitions from automaton to "transitions"
+	for (const auto& transition : fsm.getTransitions()) {
+		alphabet::SymbolToStringComposer composer;
+		std::string symbol = composer.compose(transition.first.second);
+
+		for(const automaton::State& to : transition.second) {
+			std::pair<int, int> key(states.find(transition.first.first)->second, states.find(to)->second);
+			std::map<std::pair<int, int>, std::string>::iterator mapit = transitions.find(key);
+
+			if (mapit == transitions.end()) {
+				transitions.insert(std::make_pair(key, symbol));
+			} else {
+				mapit->second += ", " + symbol;
+			}
+		}
+	}
+
+	//print the map
+	for (const std::pair<std::pair<int, int>, std::string>& transition : transitions) {
+		out << transition.first.first << " -> " << transition.first.second;
+		out << "[label=\"" << transition.second << "\"]\n";
+	}
+}
+
 void DotConverter::transitions(const automaton::NFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out) {
 	std::map<std::pair<int, int>, std::string> transitions;
 
@@ -1428,6 +1483,10 @@ void DotConverter::Visit(void* data, const automaton::EpsilonNFA& automaton) con
 	DotConverter::convert(automaton, *((std::ostream*) data));
 }
 
+void DotConverter::Visit(void* data, const automaton::MultiInitialStateNFA& automaton) const {
+	DotConverter::convert(automaton, *((std::ostream*) data));
+}
+
 void DotConverter::Visit(void* data, const automaton::NFA& automaton) const {
 	DotConverter::convert(automaton, *((std::ostream*) data));
 }
diff --git a/aconvert2/src/DotConverter.h b/aconvert2/src/DotConverter.h
index bdbfcf0c86ff4845e58b9a0a5491d3e4343dc110..256c0765829872adb38d763aada2c442a54a4abc 100644
--- a/aconvert2/src/DotConverter.h
+++ b/aconvert2/src/DotConverter.h
@@ -17,6 +17,7 @@
 
 class DotConverter : public automaton::VisitableAutomatonBase::const_visitor_type {
 	void Visit(void*, const automaton::EpsilonNFA& automaton) const;
+	void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const;
 	void Visit(void*, const automaton::NFA& automaton) const;
 	void Visit(void*, const automaton::DFA& automaton) const;
 	void Visit(void*, const automaton::ExtendedNFA& automaton) const;
@@ -33,6 +34,7 @@ class DotConverter : public automaton::VisitableAutomatonBase::const_visitor_typ
 	void Visit(void*, const automaton::OneTapeDTM& automaton) const;
 
 	static void transitions(const automaton::EpsilonNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out);
+	static void transitions(const automaton::MultiInitialStateNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out);
 	static void transitions(const automaton::NFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out);
 	static void transitions(const automaton::DFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out);
 	static void transitions(const automaton::ExtendedNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out);
@@ -53,6 +55,7 @@ public:
 	static void convert(const automaton::Automaton& a, std::ostream& out);
 
 	static void convert(const automaton::EpsilonNFA& a, std::ostream& out);
+	static void convert(const automaton::MultiInitialStateNFA& a, std::ostream& out);
 	static void convert(const automaton::NFA& a, std::ostream& out);
 	static void convert(const automaton::DFA& a, std::ostream& out);
 	static void convert(const automaton::ExtendedNFA& a, std::ostream& out);
diff --git a/aconvert2/src/GasTexConverter.cpp b/aconvert2/src/GasTexConverter.cpp
index c9ea59df0bf1c062960d10ca32a17c5c5c8a3031..d02190f7c6cccf2ebe4559181af118cfb303fd81 100644
--- a/aconvert2/src/GasTexConverter.cpp
+++ b/aconvert2/src/GasTexConverter.cpp
@@ -8,6 +8,7 @@
 #include "GasTexConverter.h"
 
 #include <automaton/FSM/NFA.h>
+#include <automaton/FSM/MultiInitialStateNFA.h>
 #include <automaton/FSM/EpsilonNFA.h>
 #include <automaton/FSM/DFA.h>
 #include <automaton/FSM/ExtendedNFA.h>
@@ -40,6 +41,45 @@ void GasTexConverter::convert(const automaton::EpsilonNFA& a, std::ostream& out)
 	out << "\\begin{center}\n";
 	out << "\\begin{picture}(,)(,)\n";
 
+	for (auto& state : a.getStates()) {
+		bool initial = false;
+		bool final = false;
+
+		if(a.getInitialState() == state){
+			initial = true;
+		}
+		if(a.getFinalStates().count(state)){
+			final = true;
+		}
+
+		if(initial || final) {
+			out << "\\node[Nmarks=";
+			if(initial){
+				out << "i";
+			}
+			if(final){
+				out << "r";
+			}
+			out<<"](";
+		} else {
+			out <<"\\node(";
+		}
+
+		out << state.getName();
+		out << ")(,){";
+		out << state.getName();
+		out << "}\n";
+	}
+
+	transitions(a, out);
+	out << "\\end{center}\n";
+	out << "\\end{picture}\n";
+}
+
+void GasTexConverter::convert(const automaton::MultiInitialStateNFA& a, std::ostream& out) {
+	out << "\\begin{center}\n";
+	out << "\\begin{picture}(,)(,)\n";
+
 	for (auto& state : a.getStates()) {
 		bool initial = false;
 		bool final = false;
@@ -83,7 +123,7 @@ void GasTexConverter::convert(const automaton::NFA& a, std::ostream& out) {
 		bool initial = false;
 		bool final = false;
 
-		if(a.getInitialStates().count(state)){
+		if(a.getInitialState() == state){
 			initial = true;
 		}
 		if(a.getFinalStates().count(state)){
@@ -161,7 +201,7 @@ void GasTexConverter::convert(const automaton::ExtendedNFA& a, std::ostream& out
 		bool initial = false;
 		bool final = false;
 
-		if(a.getInitialStates().count(state)){
+		if(a.getInitialState() == state){
 			initial = true;
 		}
 		if(a.getFinalStates().count(state)){
@@ -200,7 +240,7 @@ void GasTexConverter::convert(const automaton::CompactNFA& a, std::ostream& out)
 		bool initial = false;
 		bool final = false;
 
-		if(a.getInitialStates().count(state)){
+		if(a.getInitialState() == state){
 			initial = true;
 		}
 		if(a.getFinalStates().count(state)){
@@ -686,6 +726,25 @@ void GasTexConverter::transitions(const automaton::EpsilonNFA& fsm, std::ostream
 	printTransitionMap(transitionMap, out);
 }
 
+void GasTexConverter::transitions(const automaton::MultiInitialStateNFA& fsm, std::ostream& out) {
+	std::map<std::pair<std::string, std::string>, std::string> transitionMap;
+	for (const auto& transition : fsm.getTransitions()) {
+		for(const auto& to : transition.second) {
+			std::pair<std::string, std::string> key(transition.first.first.getName(), to.getName());
+
+			std::string symbol = (std::string) transition.first.second;
+
+			auto mapIterator = transitionMap.find(key);
+			if (mapIterator == transitionMap.end()) {
+				transitionMap.insert(make_pair(key, symbol));
+			} else {
+				mapIterator->second += ", " + symbol;
+			}
+		}
+	}
+	printTransitionMap(transitionMap, out);
+}
+
 void GasTexConverter::transitions(const automaton::NFA& fsm, std::ostream& out) {
 	std::map<std::pair<std::string, std::string>, std::string> transitionMap;
 	for (const auto& transition : fsm.getTransitions()) {
@@ -1264,6 +1323,10 @@ void GasTexConverter::Visit(void* data, const automaton::EpsilonNFA& automaton)
 	GasTexConverter::convert(automaton, *((std::ostream*) data));
 }
 
+void GasTexConverter::Visit(void* data, const automaton::MultiInitialStateNFA& automaton) const {
+	GasTexConverter::convert(automaton, *((std::ostream*) data));
+}
+
 void GasTexConverter::Visit(void* data, const automaton::NFA& automaton) const {
 	GasTexConverter::convert(automaton, *((std::ostream*) data));
 }
diff --git a/aconvert2/src/GasTexConverter.h b/aconvert2/src/GasTexConverter.h
index 6d8032fbc834d5154f6b63486bdd29708b88075a..6f3f1f9192849bc76fd492449ae090993fde2f66 100644
--- a/aconvert2/src/GasTexConverter.h
+++ b/aconvert2/src/GasTexConverter.h
@@ -17,6 +17,7 @@
 
 class GasTexConverter : public automaton::VisitableAutomatonBase::const_visitor_type {
 	void Visit(void*, const automaton::EpsilonNFA& automaton) const;
+	void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const;
 	void Visit(void*, const automaton::NFA& automaton) const;
 	void Visit(void*, const automaton::DFA& automaton) const;
 	void Visit(void*, const automaton::ExtendedNFA& automaton) const;
@@ -36,6 +37,7 @@ class GasTexConverter : public automaton::VisitableAutomatonBase::const_visitor_
 	static std::string getStackSymbols(const std::vector<alphabet::Symbol>& stackSymbols);
 
 	static void transitions(const automaton::EpsilonNFA& fsm, std::ostream& out);
+	static void transitions(const automaton::MultiInitialStateNFA& fsm, std::ostream& out);
 	static void transitions(const automaton::NFA& fsm, std::ostream& out);
 	static void transitions(const automaton::DFA& fsm, std::ostream& out);
 	static void transitions(const automaton::ExtendedNFA& fsm, std::ostream& out);
@@ -56,6 +58,7 @@ public:
 	static void convert(const automaton::Automaton& a, std::ostream& out);
 
 	static void convert(const automaton::EpsilonNFA& a, std::ostream& out);
+	static void convert(const automaton::MultiInitialStateNFA& a, std::ostream& out);
 	static void convert(const automaton::NFA& a, std::ostream& out);
 	static void convert(const automaton::DFA& a, std::ostream& out);
 	static void convert(const automaton::ExtendedNFA& a, std::ostream& out);
diff --git a/adiff2/src/AutomatonDiff.cpp b/adiff2/src/AutomatonDiff.cpp
index a403c97be0e9c80dbe27367a5e0859625b769421..028602b3463b677d7945c069e23e0cbedb46eb8d 100644
--- a/adiff2/src/AutomatonDiff.cpp
+++ b/adiff2/src/AutomatonDiff.cpp
@@ -21,6 +21,7 @@
 
 #include "automaton/FSM/DFA.h"
 #include "automaton/FSM/NFA.h"
+#include "automaton/FSM/MultiInitialStateNFA.h"
 #include "automaton/FSM/EpsilonNFA.h"
 #include "automaton/FSM/ExtendedNFA.h"
 #include "automaton/FSM/CompactNFA.h"
@@ -38,7 +39,7 @@ bool AutomatonDiff::testDiff(const automaton::DFA& a, const automaton::DFA& b) {
 			a.getTransitions()    == b.getTransitions()    ;
 }
 
-bool AutomatonDiff::testDiff(const automaton::NFA& a, const automaton::NFA& b) {
+bool AutomatonDiff::testDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b) {
 	return  	a.getFinalStates()    == b.getFinalStates()    &&
 			a.getInitialStates()  == b.getInitialStates()  &&
 //			a.getInputAlphabet()  == b.getInputAlphabet()  &&
@@ -46,9 +47,17 @@ bool AutomatonDiff::testDiff(const automaton::NFA& a, const automaton::NFA& b) {
 			a.getTransitions()    == b.getTransitions()    ;
 }
 
+bool AutomatonDiff::testDiff(const automaton::NFA& a, const automaton::NFA& b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialState()   == b.getInitialState()   &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
 bool AutomatonDiff::testDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b) {
 	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialStates()  == b.getInitialStates()  &&
+			a.getInitialState()   == b.getInitialState()   &&
 //			a.getInputAlphabet()  == b.getInputAlphabet()  &&
 			a.getStates()         == b.getStates()         &&
 			a.getTransitions()    == b.getTransitions()    ;
@@ -56,7 +65,7 @@ bool AutomatonDiff::testDiff(const automaton::EpsilonNFA& a, const automaton::Ep
 
 bool AutomatonDiff::testDiff(const automaton::ExtendedNFA& a, const automaton::ExtendedNFA& b) {
 	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialStates()  == b.getInitialStates()  &&
+			a.getInitialState()   == b.getInitialState()   &&
 //			a.getInputAlphabet()  == b.getInputAlphabet()  &&
 			a.getStates()         == b.getStates()         &&
 			a.getTransitions()    == b.getTransitions()    ;
@@ -64,7 +73,7 @@ bool AutomatonDiff::testDiff(const automaton::ExtendedNFA& a, const automaton::E
 
 bool AutomatonDiff::testDiff(const automaton::CompactNFA& a, const automaton::CompactNFA& b) {
 	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialStates()  == b.getInitialStates()  &&
+			a.getInitialState()   == b.getInitialState()   &&
 //			a.getInputAlphabet()  == b.getInputAlphabet()  &&
 			a.getStates()         == b.getStates()         &&
 			a.getTransitions()    == b.getTransitions()    ;
@@ -184,7 +193,7 @@ void AutomatonDiff::printDiff(const automaton::DFA& a, const automaton::DFA& b)
 	}
 }
 
-void AutomatonDiff::printDiff(const automaton::NFA& a, const automaton::NFA& b) {
+void AutomatonDiff::printDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b) {
 	std::cout << "AutomataDiffer" << std::endl;
 
 	if(a.getFinalStates() != b.getFinalStates()){
@@ -218,6 +227,42 @@ void AutomatonDiff::printDiff(const automaton::NFA& a, const automaton::NFA& b)
 	}
 }
 
+void AutomatonDiff::printDiff(const automaton::NFA& a, const automaton::NFA& b) {
+	std::cout << "AutomataDiffer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonDiff::setDiff(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonDiff::setDiff(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonDiff::mapDiff(a.getTransitions(), b.getTransitions());
+	}
+}
+
 void AutomatonDiff::printDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b) {
 	std::cout << "AutomataDiffer" << std::endl;
 
@@ -227,10 +272,12 @@ void AutomatonDiff::printDiff(const automaton::EpsilonNFA& a, const automaton::E
 		AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates());
 	}
 
-	if(a.getInitialStates() != b.getInitialStates()) {
-		std::cout << "InitialStates" << std::endl;
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
 
-		AutomatonDiff::setDiff(a.getInitialStates(), b.getInitialStates());
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
 	}
 
 	if(a.getInputAlphabet() != b.getInputAlphabet()) {
@@ -261,10 +308,12 @@ void AutomatonDiff::printDiff(const automaton::ExtendedNFA& a, const automaton::
 		AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates());
 	}
 
-	if(a.getInitialStates() != b.getInitialStates()) {
-		std::cout << "InitialStates" << std::endl;
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
 
-		AutomatonDiff::setDiff(a.getInitialStates(), b.getInitialStates());
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
 	}
 
 	if(a.getInputAlphabet() != b.getInputAlphabet()) {
@@ -295,10 +344,12 @@ void AutomatonDiff::printDiff(const automaton::CompactNFA& a, const automaton::C
 		AutomatonDiff::setDiff(a.getFinalStates(), b.getFinalStates());
 	}
 
-	if(a.getInitialStates() != b.getInitialStates()) {
-		std::cout << "InitialStates" << std::endl;
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
 
-		AutomatonDiff::setDiff(a.getInitialStates(), b.getInitialStates());
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
 	}
 
 	if(a.getInputAlphabet() != b.getInputAlphabet()) {
@@ -480,6 +531,15 @@ int AutomatonDiff::diff(const automaton::NFA& a, const automaton::NFA& b) {
 	}
 }
 
+int AutomatonDiff::diff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b) {
+	if(!AutomatonDiff::testDiff(a, b)) {
+	  AutomatonDiff::printDiff(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
 int AutomatonDiff::diff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b) {
 	if(!AutomatonDiff::testDiff(a, b)) {
 	  AutomatonDiff::printDiff(a, b);
@@ -561,6 +621,10 @@ int AutomatonDiff::diff(const automaton::Automaton& a, const automaton::Automato
 	if(res == 0) return 0;
 	if(res == 1) return 1;
 
+	res = dynamicDiff<automaton::MultiInitialStateNFA>(a, b);
+	if(res == 0) return 0;
+	if(res == 1) return 1;
+
 	res = dynamicDiff<automaton::EpsilonNFA>(a, b);
 	if(res == 0) return 0;
 	if(res == 1) return 1;
diff --git a/adiff2/src/AutomatonDiff.h b/adiff2/src/AutomatonDiff.h
index 2ef119b116feca89698429795c295a842908e4ba..e9a52c9a5256518edbe2c83311a1d34036352e0b 100644
--- a/adiff2/src/AutomatonDiff.h
+++ b/adiff2/src/AutomatonDiff.h
@@ -23,6 +23,9 @@ class AutomatonDiff {
 	static bool testDiff(const automaton::NFA& a, const automaton::NFA& b);
 	static void printDiff(const automaton::NFA& a, const automaton::NFA& b);
 
+	static bool testDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b);
+	static void printDiff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b);
+
 	static bool testDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b);
 	static void printDiff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b);
 
@@ -47,6 +50,7 @@ class AutomatonDiff {
 public:
 	static int diff(const automaton::DFA& a, const automaton::DFA& b);
 	static int diff(const automaton::NFA& a, const automaton::NFA& b);
+	static int diff(const automaton::MultiInitialStateNFA& a, const automaton::MultiInitialStateNFA& b);
 	static int diff(const automaton::EpsilonNFA& a, const automaton::EpsilonNFA& b);
 	static int diff(const automaton::ExtendedNFA& a, const automaton::ExtendedNFA& b);
 	static int diff(const automaton::CompactNFA& a, const automaton::CompactNFA& b);
diff --git a/alib2algo/src/conversions/rg2fa/RGtoFA.cpp b/alib2algo/src/conversions/rg2fa/RGtoFA.cpp
index 30000b2512a1864c784cdd11c231672a82624653..48ca974f641b4356239007780d05bb313f7014ed 100644
--- a/alib2algo/src/conversions/rg2fa/RGtoFA.cpp
+++ b/alib2algo/src/conversions/rg2fa/RGtoFA.cpp
@@ -87,7 +87,7 @@ automaton::NFA RGtoFA::convert(const grammar::RightRG& grammar)
     // step 1, 4
     const automaton::State AState = automaton::createUniqueState(automaton::State("A"), states);
     states.insert(AState);
-    automaton::NFA automaton(AState);
+    automaton::NFA automaton(stateMap.find(grammar.getInitialSymbol())->second);
     automaton.setStates(states);
 
     automaton.setInputSymbols(grammar.getTerminalAlphabet());
diff --git a/astat2/src/AutomataStat.cpp b/astat2/src/AutomataStat.cpp
index 878c07bad497a6fe875981400b770394cb65ce95..64a10629b85a128ee53e0f3c17f65e61021729b7 100644
--- a/astat2/src/AutomataStat.cpp
+++ b/astat2/src/AutomataStat.cpp
@@ -51,14 +51,14 @@ void AutomataStat::stat(const automaton::NFA& automaton, const Settings& setting
 
 	switch(settings.initialStates) {
 	case PrintOptions::PRINT:
-		alib::DataFactory::toStdout(automaton.getInitialStates());
+		alib::DataFactory::toStdout(automaton.getInitialState());
 		break;
 	case PrintOptions::QUANTITY:
-		std::cout << automaton.getInitialStates().size() << std::endl;
+		std::cout << 1 << std::endl;
 		break;
 	case PrintOptions::BOTH:
-		std::cout << automaton.getInitialStates().size() << std::endl;
-		alib::DataFactory::toStdout(automaton.getInitialStates());
+		std::cout << 1 << std::endl;
+		alib::DataFactory::toStdout(automaton.getInitialState());
 		break;
 	case PrintOptions::NOOP:
 		break;
@@ -176,6 +176,10 @@ void AutomataStat::Visit(void*, const automaton::EpsilonNFA&) const {
 	throw exception::AlibException("Unsupported automaton type EpsilonNFA");
 }
 
+void AutomataStat::Visit(void*, const automaton::MultiInitialStateNFA&) const {
+	throw exception::AlibException("Unsupported automaton type EpsilonNFA");
+}
+
 void AutomataStat::Visit(void* data, const automaton::NFA& automaton) const {
 	const Settings& in = *((const Settings*) data);
 	this->stat(automaton, in);
diff --git a/astat2/src/AutomataStat.h b/astat2/src/AutomataStat.h
index 29bd64bb8c97578b6773043409fe9d2e9b9cd728..c481f06f59a44cc816230f6f8e74d9a0caae7bca 100644
--- a/astat2/src/AutomataStat.h
+++ b/astat2/src/AutomataStat.h
@@ -26,6 +26,7 @@ public:
 
 private:
 	void Visit(void*, const automaton::EpsilonNFA& automaton) const;
+	void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const;
 	void Visit(void*, const automaton::NFA& automaton) const;
 	void Visit(void*, const automaton::DFA& automaton) const;
 	void Visit(void*, const automaton::ExtendedNFA& automaton) const;
diff --git a/examples2/automaton/aconversion.test.22.xml b/examples2/automaton/aconversion.test.22.xml
index 0defdb8514db2b78e383c97ddab5042dcaf1148b..2debc8d58377d936fed10338343f70ca6d0e59bb 100644
--- a/examples2/automaton/aconversion.test.22.xml
+++ b/examples2/automaton/aconversion.test.22.xml
@@ -12,9 +12,9 @@
 		<LabeledSymbol><PrimitiveLabel><Character>b</Character></PrimitiveLabel></LabeledSymbol>
 		<LabeledSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel></LabeledSymbol>
 	</inputAlphabet>
-	<initialStates>
+	<initialState>
 		<PrimitiveLabel><String>0</String></PrimitiveLabel>
-	</initialStates>
+	</initialState>
 	<finalStates>
 		<PrimitiveLabel><String>1</String></PrimitiveLabel>
 		<PrimitiveLabel><String>3</String></PrimitiveLabel>