diff --git a/alib2/src/automaton/AutomatonFromXMLParser.cpp b/alib2/src/automaton/AutomatonFromXMLParser.cpp
index 6cb8129d328868da478c07d541fcf73f04cb8c8a..26a3da3e79d3e1fc8312ea9954c7abadbfbb3846 100644
--- a/alib2/src/automaton/AutomatonFromXMLParser.cpp
+++ b/alib2/src/automaton/AutomatonFromXMLParser.cpp
@@ -140,14 +140,42 @@ EpsilonNFA AutomatonFromXMLParser::parseEpsilonNFA(std::list<sax::Token>& input)
 
 CompactNFA AutomatonFromXMLParser::parseCompactNFA(std::list<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "CompactNFA");
+	
+	std::set<State> states = parseStates(input);
+	std::set<alphabet::Symbol> inputSymbols = parseInputAlphabet(input);
+	std::set<State> initialStates = parseInitialStates(input);
+	std::set<State> finalStates = parseFinalStates(input);
+
+	CompactNFA automaton;
+	automaton.setStates(states);
+	automaton.setInputSymbols(inputSymbols);
+	automaton.setInitialStates(initialStates);
+	automaton.setFinalStates(finalStates);
+
+	parseTransitions<CompactNFA>(input, automaton);
 
 	popToken(input, sax::Token::TokenType::END_ELEMENT, "CompactNFA");
+	return automaton;
 }
 
 ExtendedNFA AutomatonFromXMLParser::parseExtendedNFA(std::list<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "ExtendedNFA");
 
+	std::set<State> states = parseStates(input);
+	std::set<alphabet::Symbol> inputSymbols = parseInputAlphabet(input);
+	std::set<State> initialStates = parseInitialStates(input);
+	std::set<State> finalStates = parseFinalStates(input);
+
+	ExtendedNFA automaton;
+	automaton.setStates(states);
+	automaton.setInputSymbols(inputSymbols);
+	automaton.setInitialStates(initialStates);
+	automaton.setFinalStates(finalStates);
+
+	parseTransitions<ExtendedNFA>(input, automaton);
+
 	popToken(input, sax::Token::TokenType::END_ELEMENT, "ExtendedNFA");
+	return automaton;
 }
 
 NPDA AutomatonFromXMLParser::parseNPDA(std::list<sax::Token>& input) const {
@@ -178,13 +206,49 @@ NPDA AutomatonFromXMLParser::parseNPDA(std::list<sax::Token>& input) const {
 SinglePopNPDA AutomatonFromXMLParser::parseSinglePopNPDA(std::list<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "SinglePopNPDA");
 
+	std::set<State> states = parseStates(input);
+	std::set<alphabet::Symbol> inputSymbols = parseInputAlphabet(input);
+	std::set<alphabet::Symbol> stackSymbols = parseStackAlphabet(input);
+	std::set<State> initialStates = parseInitialStates(input);
+	std::set<alphabet::Symbol> initialStackSymbols = parseInitialStackSymbols(input);
+	std::set<State> finalStates = parseFinalStates(input);
+
+	SinglePopNPDA automaton;
+	automaton.setStates(states);
+	automaton.setInputSymbols(inputSymbols);
+	automaton.setStackSymbols(stackSymbols);
+	automaton.setInitialStates(initialStates);
+	automaton.setFinalStates(finalStates);
+	automaton.setInitialSymbols(initialStackSymbols);
+
+	parseTransitions<SinglePopNPDA>(input, automaton);
+
 	popToken(input, sax::Token::TokenType::END_ELEMENT, "SinglePopNPDA");
+
+	return automaton;
 }
 
 OneTapeDTM AutomatonFromXMLParser::parseOneTapeDTM(std::list<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "OneTapeTM");
 
+	std::set<State> states = parseStates(input);
+	std::set<alphabet::Symbol> inputSymbols = parseInputAlphabet(input);
+	std::set<alphabet::Symbol> tapeSymbols = parseTapeAlphabet(input);
+	alphabet::Symbol blank = parseBlankSymbol(input);
+	State initialState = parseInitialState(input);
+	std::set<State> finalStates = parseFinalStates(input);
+
+	OneTapeDTM automaton(initialState, blank);
+	automaton.setStates(states);
+	automaton.setInputSymbols(inputSymbols);
+	automaton.setTapeSymbols(tapeSymbols);
+	automaton.setInitialState(initialState);
+	automaton.setFinalStates(finalStates);
+	
+	parseTransitions<OneTapeDTM>(input, automaton);
+
 	popToken(input, sax::Token::TokenType::END_ELEMENT, "OneTapeTM");
+	return automaton;
 }
 
 std::set<State> AutomatonFromXMLParser::parseStates(std::list<sax::Token> &input) const {
@@ -313,6 +377,22 @@ void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, Epsil
 	automaton.addTransition(from, inputVariant, to);
 }
 
+void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, CompactNFA& automaton) const {
+	State from = parseTransitionFrom(input);
+	string::String inputString = parseTransitionInputString(input);
+	State to = parseTransitionTo(input);
+
+	automaton.addTransition(from, inputString, to);
+}
+
+void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, ExtendedNFA& automaton) const {
+	State from = parseTransitionFrom(input);
+	regexp::RegExp inputRegexp = parseTransitionInputRegexp(input);
+	State to = parseTransitionTo(input);
+
+	automaton.addTransition(from, inputRegexp, to);
+}
+
 void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, NPDA& automaton) const {
 	State from = parseTransitionFrom(input);
 	std::variant<string::Epsilon, alphabet::Symbol> inputSymbol = parseTransitionInputEpsilonSymbol(input);
@@ -323,6 +403,26 @@ void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, NPDA&
 	automaton.addTransition(from, inputSymbol, pop, to, push);
 }
 
+void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, SinglePopNPDA& automaton) const {
+	State from = parseTransitionFrom(input);
+	std::variant<string::Epsilon, alphabet::Symbol> inputSymbol = parseTransitionInputEpsilonSymbol(input);
+	State to = parseTransitionFrom(input);
+	alphabet::Symbol pop = parseTransitionSinglePop(input);
+	std::vector<alphabet::Symbol> push = parseTransitionPush(input);
+
+	automaton.addTransition(from, inputSymbol, pop, to, push);
+}
+
+void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, OneTapeDTM& automaton) const {
+	State from = parseTransitionFrom(input);
+	alphabet::Symbol inputSymbol = parseTransitionInputSymbol(input);
+	State to = parseTransitionFrom(input);
+	alphabet::Symbol outputSymbol = parseTransitionOutputSymbol(input);
+	Shift shift = parseTransitionShift(input);
+
+	automaton.addTransition(from, inputSymbol, to, outputSymbol, shift);
+}
+
 void AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input, UnknownAutomaton& automaton) const {
 	UnknownTransition transition;
 
@@ -392,6 +492,13 @@ std::vector<alphabet::Symbol> AutomatonFromXMLParser::parseTransitionPop(std::li
 	return pops;
 }
 
+alphabet::Symbol AutomatonFromXMLParser::parseTransitionSinglePop(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "pop");
+	alphabet::Symbol pop = alib::FromXMLParsers::symbolParser.parse(input);
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "pop");
+	return pop;
+}
+
 std::vector<alphabet::Symbol> AutomatonFromXMLParser::parseTransitionPush(std::list<sax::Token>& input) const {
 	std::vector<alphabet::Symbol> pushes;
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "push");
@@ -450,5 +557,19 @@ std::variant<string::Epsilon, alphabet::Symbol> AutomatonFromXMLParser::parseTra
 	return result;
 }
 
+string::String AutomatonFromXMLParser::parseTransitionInputString(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "input");
+	string::String result(alib::FromXMLParsers::stringParser.parse(input));
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "input");
+	return result;
+}
+
+regexp::RegExp AutomatonFromXMLParser::parseTransitionInputRegexp(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "input");
+	regexp::RegExp result(alib::FromXMLParsers::regexpParser.parse(input));
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "input");
+	return result;
+}
+
 } /* namespace automaton */
 
diff --git a/alib2/src/automaton/AutomatonFromXMLParser.h b/alib2/src/automaton/AutomatonFromXMLParser.h
index 7704c1adbca493b106d0f20c06e5df86a5708915..24e135f2f937bb971a359b919f7e0acf662b2f3c 100644
--- a/alib2/src/automaton/AutomatonFromXMLParser.h
+++ b/alib2/src/automaton/AutomatonFromXMLParser.h
@@ -48,6 +48,7 @@ protected:
 	State parseTransitionTo(std::list<sax::Token>& input) const;
 	Shift parseTransitionShift(std::list<sax::Token>& input) const;
 	std::vector<alphabet::Symbol> parseTransitionPop(std::list<sax::Token>& input) const;
+	alphabet::Symbol parseTransitionSinglePop(std::list<sax::Token>& input) const;
 	std::vector<alphabet::Symbol> parseTransitionPush(std::list<sax::Token>& input) const;
 
 	template<class T>
@@ -59,10 +60,15 @@ protected:
 	void parseTransition(std::list<sax::Token>& input, CompactNFA& automaton) const;
 	void parseTransition(std::list<sax::Token>& input, ExtendedNFA& automaton) const;
 	void parseTransition(std::list<sax::Token>& input, NPDA& automaton) const;
+	void parseTransition(std::list<sax::Token>& input, SinglePopNPDA& automaton) const;
+	void parseTransition(std::list<sax::Token>& input, OneTapeDTM& automaton) const;
 
 	alphabet::Symbol parseTransitionInputSymbol(std::list<sax::Token> &input) const;
 	std::variant<string::Epsilon, alphabet::Symbol> parseTransitionInputEpsilonSymbol(std::list<sax::Token> &input) const;
 	std::variant<string::Epsilon, alphabet::Symbol> parseTransitionInputBlankEpsilonSymbol(std::list<sax::Token> &input) const;
+	string::String parseTransitionInputString(std::list<sax::Token> &input) const;
+	regexp::RegExp parseTransitionInputRegexp(std::list<sax::Token> &input) const;
+
 	alphabet::Symbol parseTransitionOutputSymbol(std::list<sax::Token> &input) const;
 	std::variant<string::Epsilon, alphabet::Symbol> parseTransitionOutputEpsilonSymbol(std::list<sax::Token> &input) const;
 	std::variant<string::Epsilon, alphabet::Symbol> parseTransitionOutputBlankEpsilonSymbol(std::list<sax::Token> &input) const;
diff --git a/alib2/src/regexp/RegExpFromXMLParser.h b/alib2/src/regexp/RegExpFromXMLParser.h
index 2fa7c7e846927dcab6850b09c7d23d563deeffdc..0d8cb5f87602ce036fe21ad0dd4d059e28a157b6 100644
--- a/alib2/src/regexp/RegExpFromXMLParser.h
+++ b/alib2/src/regexp/RegExpFromXMLParser.h
@@ -15,6 +15,12 @@
 #include "../sax/Token.h"
 #include "../alphabet/Symbol.h"
 
+namespace automaton {
+
+class AutomatonFromXMLParser;
+
+} /* namespace automaton */
+
 namespace regexp {
 
 /**
@@ -35,6 +41,8 @@ class RegExpFromXMLParser : public alib::FromXMLParser<RegExp, FEATURES> {
 	virtual RegExp parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const;
 public:
 	virtual bool first(std::list<sax::Token>& input) const;
+
+	friend class automaton::AutomatonFromXMLParser;
 };
 
 } /* namespace regexp */
diff --git a/alib2/src/string/StringFromXMLParser.h b/alib2/src/string/StringFromXMLParser.h
index 8c45a48670da0cfb81013e88baf542e31df31710..abd34b58ff68e56a3eef7cd80cf862d90571f336 100644
--- a/alib2/src/string/StringFromXMLParser.h
+++ b/alib2/src/string/StringFromXMLParser.h
@@ -16,6 +16,12 @@
 #include "../sax/Token.h"
 #include "../alphabet/Symbol.h"
 
+namespace automaton {
+
+class AutomatonFromXMLParser;
+
+} /* namespace automaton */
+
 namespace string {
 
 /**
@@ -30,6 +36,8 @@ class StringFromXMLParser : public alib::FromXMLParser<String, FEATURES> {
 	virtual String parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const;
 public:
 	virtual bool first(std::list<sax::Token>& input) const;
+
+	friend class automaton::AutomatonFromXMLParser;
 };
 
 } /* namespace string */