diff --git a/alib2/src/automaton/AutomatonToXMLComposer.cpp b/alib2/src/automaton/AutomatonToXMLComposer.cpp
index f4ea9fe7b00a80dbba73cdbbc5d290b4bdbdb689..ddbda3d42b587b86e0d3e0db9cfd0a2394c75deb 100644
--- a/alib2/src/automaton/AutomatonToXMLComposer.cpp
+++ b/alib2/src/automaton/AutomatonToXMLComposer.cpp
@@ -168,6 +168,95 @@ void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, cons
 	out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT));
 }
 
+void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, const CompactNFA& automaton) const {
+	out.push_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT));
+	for(const auto& transition : automaton.getTransitions()) {
+		for(const auto& targetState: transition.second) {
+			out.push_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT));
+
+			composeTransitionFrom(out, transition.first.first);
+			composeTransitionInputString(out, transition.first.second);
+			composeTransitionTo(out, targetState);
+
+			out.push_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT));
+		}
+	}
+
+	out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT));
+}
+
+void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, const ExtendedNFA& automaton) const {
+	out.push_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT));
+	for(const auto& transition : automaton.getTransitions()) {
+		for(const auto& targetState: transition.second) {
+			out.push_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT));
+
+			composeTransitionFrom(out, transition.first.first);
+			composeTransitionInputRegexp(out, transition.first.second);
+			composeTransitionTo(out, targetState);
+
+			out.push_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT));
+		}
+	}
+
+	out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT));
+}
+
+void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, const NPDA& automaton) const {
+	out.push_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT));
+	for(const auto& transition : automaton.getTransitions()) {
+		for(const auto& target: transition.second) {
+			out.push_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT));
+
+			composeTransitionFrom(out, std::get<0>(transition.first));
+			composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first));
+			composeTransitionPop(out, std::get<2>(transition.first));
+			composeTransitionTo(out, target.first);
+			composeTransitionPush(out, target.second);
+
+			out.push_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT));
+		}
+	}
+
+	out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT));
+}
+
+void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, const SinglePopNPDA& automaton) const {
+	out.push_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT));
+	for(const auto& transition : automaton.getTransitions()) {
+		for(const auto& target: transition.second) {
+			out.push_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT));
+
+			composeTransitionFrom(out, std::get<0>(transition.first));
+			composeTransitionInputEpsilonSymbol(out, std::get<1>(transition.first));
+			composeTransitionSinglePop(out, std::get<2>(transition.first));
+			composeTransitionTo(out, target.first);
+			composeTransitionPush(out, target.second);
+
+			out.push_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT));
+		}
+	}
+
+	out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT));
+}
+
+void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, const OneTapeDTM& automaton) const {
+	out.push_back(sax::Token("transitions", sax::Token::TokenType::START_ELEMENT));
+	for(const auto& transition : automaton.getTransitions()) {
+		out.push_back(sax::Token("transition", sax::Token::TokenType::START_ELEMENT));
+
+		composeTransitionFrom(out, transition.first.first);
+		composeTransitionInputSymbol(out, transition.first.second);
+		composeTransitionTo(out, std::get<0>(transition.second));
+		composeTransitionOutputSymbol(out, std::get<1>(transition.second));
+		composeTransitionShift(out, std::get<2>(transition.second));
+
+		out.push_back(sax::Token("transition", sax::Token::TokenType::END_ELEMENT));
+	}
+
+	out.push_back(sax::Token("transitions", sax::Token::TokenType::END_ELEMENT));
+}
+
 void AutomatonToXMLComposer::composeTransitionTo(std::list<sax::Token>& out, const State& state) const {
 	out.push_back(sax::Token("to", sax::Token::TokenType::START_ELEMENT));
 	out.splice(out.end(), alib::ToXMLComposers::labelComposer.compose(state.getName()));
@@ -194,6 +283,12 @@ void AutomatonToXMLComposer::composeTransitionPop(std::list<sax::Token>& out, co
 	out.push_back(sax::Token("pop", sax::Token::TokenType::END_ELEMENT));
 }
 
+void AutomatonToXMLComposer::composeTransitionSinglePop(std::list<sax::Token>& out, const alphabet::Symbol& symbol) const {
+	out.push_back(sax::Token("pop", sax::Token::TokenType::START_ELEMENT));
+	out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol));
+	out.push_back(sax::Token("pop", sax::Token::TokenType::END_ELEMENT));
+}
+
 void AutomatonToXMLComposer::composeTransitionPush(std::list<sax::Token>& out, const std::vector<alphabet::Symbol>& symbols) const {
 	out.push_back(sax::Token("push", sax::Token::TokenType::START_ELEMENT));
 	for (const auto& symbol : symbols) {
@@ -236,6 +331,18 @@ void AutomatonToXMLComposer::composeTransitionOutputEpsilonSymbol(std::list<sax:
 	out.push_back(sax::Token("output", sax::Token::TokenType::END_ELEMENT));
 }
 
+void AutomatonToXMLComposer::composeTransitionInputString(std::list<sax::Token>& out, const string::String& string) const {
+	out.push_back(sax::Token("input", sax::Token::TokenType::START_ELEMENT));
+	out.splice(out.end(), alib::ToXMLComposers::stringComposer.compose(string));
+	out.push_back(sax::Token("input", sax::Token::TokenType::END_ELEMENT));
+}
+
+void AutomatonToXMLComposer::composeTransitionInputRegexp(std::list<sax::Token>& out, const regexp::RegExp& regexp) const {
+	out.push_back(sax::Token("input", sax::Token::TokenType::START_ELEMENT));
+	out.splice(out.end(), alib::ToXMLComposers::regexpComposer.compose(regexp));
+	out.push_back(sax::Token("input", sax::Token::TokenType::END_ELEMENT));
+}
+
 std::list<sax::Token> AutomatonToXMLComposer::compose(const AutomatonBase& automaton) const {
 	std::list<sax::Token> out;
 	automaton.Accept((void*) &out, *this);
@@ -321,26 +428,77 @@ std::list<sax::Token> AutomatonToXMLComposer::compose(const EpsilonNFA& automato
 
 std::list<sax::Token> AutomatonToXMLComposer::compose(const ExtendedNFA& automaton) const {
 	std::list<sax::Token> out;
+	out.push_back(sax::Token("ExtendedNFA", sax::Token::TokenType::START_ELEMENT));
+
+	composeStates(out, automaton.getStates());
+	composeInputAlphabet(out, automaton.getInputAlphabet());
+	composeInitialStates(out, automaton.getInitialStates());
+	composeFinalStates(out, automaton.getFinalStates());
+	composeTransitions(out, automaton);
+
+	out.push_back(sax::Token("ExtendedNFA", sax::Token::TokenType::END_ELEMENT));
 	return out;
 }
 
 std::list<sax::Token> AutomatonToXMLComposer::compose(const CompactNFA& automaton) const {
 	std::list<sax::Token> out;
+	out.push_back(sax::Token("CompactNFA", sax::Token::TokenType::START_ELEMENT));
+
+	composeStates(out, automaton.getStates());
+	composeInputAlphabet(out, automaton.getInputAlphabet());
+	composeInitialStates(out, automaton.getInitialStates());
+	composeFinalStates(out, automaton.getFinalStates());
+	composeTransitions(out, automaton);
+
+	out.push_back(sax::Token("CompactNFA", sax::Token::TokenType::END_ELEMENT));
 	return out;
 }
 
 std::list<sax::Token> AutomatonToXMLComposer::compose(const NPDA& automaton) const {
 	std::list<sax::Token> out;
+	out.push_back(sax::Token("NPDA", sax::Token::TokenType::START_ELEMENT));
+
+	composeStates(out, automaton.getStates());
+	composeInputAlphabet(out, automaton.getInputAlphabet());
+	composeStackAlphabet(out, automaton.getStackAlphabet());
+	composeInitialStates(out, automaton.getInitialStates());
+	composeFinalStates(out, automaton.getFinalStates());
+	composeInitialStackSymbols(out, automaton.getInitialSymbols());
+	composeTransitions(out, automaton);
+
+	out.push_back(sax::Token("NPDA", sax::Token::TokenType::END_ELEMENT));
 	return out;
 }
 
 std::list<sax::Token> AutomatonToXMLComposer::compose(const SinglePopNPDA& automaton) const {
 	std::list<sax::Token> out;
+	out.push_back(sax::Token("SinglePopNPDA", sax::Token::TokenType::START_ELEMENT));
+
+	composeStates(out, automaton.getStates());
+	composeInputAlphabet(out, automaton.getInputAlphabet());
+	composeStackAlphabet(out, automaton.getStackAlphabet());
+	composeInitialStates(out, automaton.getInitialStates());
+	composeFinalStates(out, automaton.getFinalStates());
+	composeInitialStackSymbols(out, automaton.getInitialSymbols());
+	composeTransitions(out, automaton);
+
+	out.push_back(sax::Token("SinglePopNPDA", sax::Token::TokenType::END_ELEMENT));
 	return out;
 }
 
 std::list<sax::Token> AutomatonToXMLComposer::compose(const OneTapeDTM& automaton) const {
 	std::list<sax::Token> out;
+	out.push_back(sax::Token("OneTapeDTM", sax::Token::TokenType::START_ELEMENT));
+
+	composeStates(out, automaton.getStates());
+	composeInputAlphabet(out, automaton.getInputAlphabet());
+	composeTapeAlphabet(out, automaton.getTapeAlphabet());
+	composeBlankSymbol(out, automaton.getBlankSymbol());
+	composeInitialState(out, automaton.getInitialState());
+	composeFinalStates(out, automaton.getFinalStates());
+	composeTransitions(out, automaton);
+
+	out.push_back(sax::Token("OneTapeDTM", sax::Token::TokenType::END_ELEMENT));
 	return out;
 }
 
diff --git a/alib2/src/automaton/AutomatonToXMLComposer.h b/alib2/src/automaton/AutomatonToXMLComposer.h
index 6eebcea11b7e1206636c3081ed68df89cba53015..a9d328cdb3b5a8a0593213275328724d841fcec3 100644
--- a/alib2/src/automaton/AutomatonToXMLComposer.h
+++ b/alib2/src/automaton/AutomatonToXMLComposer.h
@@ -53,18 +53,26 @@ protected:
 
 	void composeTransitions(std::list<sax::Token>&, const UnknownAutomaton& automaton) const;
 	void composeTransitions(std::list<sax::Token>&, const EpsilonNFA& automaton) const;
+	void composeTransitions(std::list<sax::Token>&, const CompactNFA& automaton) const;
+	void composeTransitions(std::list<sax::Token>&, const ExtendedNFA& automaton) const;
 	void composeTransitions(std::list<sax::Token>&, const NFA& automaton) const;
 	void composeTransitions(std::list<sax::Token>&, const DFA& automaton) const;
+	void composeTransitions(std::list<sax::Token>&, const NPDA& automaton) const;
+	void composeTransitions(std::list<sax::Token>&, const SinglePopNPDA& automaton) const;
+	void composeTransitions(std::list<sax::Token>&, const OneTapeDTM& automaton) const;
 
 	void composeTransitionTo(std::list<sax::Token>&, const State& state) const;
 	void composeTransitionFrom(std::list<sax::Token>&, const State& state) const;
 	void composeTransitionShift(std::list<sax::Token>&, const Shift shift) const;
 	void composeTransitionPop(std::list<sax::Token>&, const std::vector<alphabet::Symbol>& symbols) const;
+	void composeTransitionSinglePop(std::list<sax::Token>&, const alphabet::Symbol& symbol) const;
 	void composeTransitionPush(std::list<sax::Token>&, const std::vector<alphabet::Symbol>& symbols) const;
 	void composeTransitionInputSymbol(std::list<sax::Token>&, const alphabet::Symbol& symbol) const;
 	void composeTransitionInputEpsilonSymbol(std::list<sax::Token>&, const std::variant<string::Epsilon, alphabet::Symbol>&) const;
 	void composeTransitionOutputSymbol(std::list<sax::Token>&, const alphabet::Symbol& symbol) const;
 	void composeTransitionOutputEpsilonSymbol(std::list<sax::Token>&, const std::variant<string::Epsilon, alphabet::Symbol>&) const;
+	void composeTransitionInputString(std::list<sax::Token>&, const string::String& string) const;
+	void composeTransitionInputRegexp(std::list<sax::Token>&, const regexp::RegExp& regexp) const;
 
 public:
 	/**