diff --git a/alib2algo/src/automaton/run/Result.h b/alib2algo/src/automaton/run/Result.h
index e54648d735cac2d34b7b7934c7dd9d9f941ee249..88751a71d8c0ec7aef9cd7f904f5b158b21bc4dd 100644
--- a/alib2algo/src/automaton/run/Result.h
+++ b/alib2algo/src/automaton/run/Result.h
@@ -15,6 +15,7 @@
 #include <object/Object.h>
 #include <label/Label.h>
 #include <tree/ranked/RankedTree.h>
+#include <label/FailStateLabel.h>
 
 namespace automaton {
 
@@ -26,14 +27,14 @@ public:
 	 * Performs conversion.
 	 * @return left regular grammar equivalent to source automaton.
 	 */
-	static label::Label result ( const automaton::Automaton & automaton, const alib::Object & object, const label::Label & failLabel = label::labelFrom ( "fail" ) );
-
-	static label::Label result ( const automaton::DFA & automaton, const string::LinearString & string, const label::Label & failLabel = label::labelFrom ( "fail" ) );
-	static label::Label result ( const automaton::DFTA & automaton, const tree::RankedTree & tree, const label::Label & failLabel = label::labelFrom ( "fail" ) );
-	static label::Label result ( const automaton::InputDrivenDPDA & automaton, const string::LinearString & string, const label::Label & failLabel = label::labelFrom ( "fail" ) );
-	static label::Label result ( const automaton::VisiblyPushdownDPDA & automaton, const string::LinearString & string, const label::Label & failLabel = label::labelFrom ( "fail" ) );
-	static label::Label result ( const automaton::RealTimeHeightDeterministicDPDA & automaton, const string::LinearString & string, const label::Label & failLabel = label::labelFrom ( "fail" ) );
-	static label::Label result ( const automaton::DPDA & automaton, const string::LinearString & string, const label::Label & failLabel = label::labelFrom ( "fail" ) );
+	static label::Label result ( const automaton::Automaton & automaton, const alib::Object & object, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL );
+
+	static label::Label result ( const automaton::DFA & automaton, const string::LinearString & string, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL );
+	static label::Label result ( const automaton::DFTA & automaton, const tree::RankedTree & tree, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL );
+	static label::Label result ( const automaton::InputDrivenDPDA & automaton, const string::LinearString & string, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL );
+	static label::Label result ( const automaton::VisiblyPushdownDPDA & automaton, const string::LinearString & string, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL );
+	static label::Label result ( const automaton::RealTimeHeightDeterministicDPDA & automaton, const string::LinearString & string, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL );
+	static label::Label result ( const automaton::DPDA & automaton, const string::LinearString & string, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL );
 
 };
 
diff --git a/alib2algo/src/automaton/run/Run.cpp b/alib2algo/src/automaton/run/Run.cpp
index 4c07b2a8fb0918cb20c91d4a8d90180b62eb6000..14f31619118ce3c371d60aab209110488c06768a 100644
--- a/alib2algo/src/automaton/run/Run.cpp
+++ b/alib2algo/src/automaton/run/Run.cpp
@@ -17,6 +17,8 @@
 #include <automaton/PDA/NPDTA.h>
 #include <global/GlobalData.h>
 
+#include <label/FailStateLabel.h>
+
 #include <deque>
 #include <algorithm>
 #include <iterator>
@@ -123,11 +125,11 @@ std::pair < bool, label::Label > Run::calculateState ( const automaton::DFTA & a
 			states.push_back ( res.second );
 	}
 
-	if ( !sign ) return std::make_pair ( false, label::labelFrom ( "fail" ) );
+	if ( !sign ) return std::make_pair ( false, label::FailStateLabel::FAIL_STATE_LABEL );
 
 	const auto & it = automaton.getTransitions ( ).find ( std::make_pair ( node.getSymbol ( ), states ) );
 
-	if ( it == automaton.getTransitions ( ).end ( ) ) return std::make_pair ( false, label::labelFrom ( "fail" ) );
+	if ( it == automaton.getTransitions ( ).end ( ) ) return std::make_pair ( false, label::FailStateLabel::FAIL_STATE_LABEL );
 
 	label::Label state = it->second;
 
diff --git a/alib2algo/src/automaton/simplify/Minimize.cpp b/alib2algo/src/automaton/simplify/Minimize.cpp
index b4fc6b7c360019ed99da07810815a807adb30579..f4027e87c3b24849d053565c699ae16f38704c77 100644
--- a/alib2algo/src/automaton/simplify/Minimize.cpp
+++ b/alib2algo/src/automaton/simplify/Minimize.cpp
@@ -26,7 +26,7 @@ automaton::Automaton Minimize::minimize(const automaton::Automaton& automaton) {
 
 automaton::DFA Minimize::minimize(const automaton::DFA& dfa) {
 	if(dfa.getFinalStates().size() == 0) {
-		automaton::DFA result(label::labelFrom(0));
+		automaton::DFA result(dfa.getInitialState());
 		result.setInputAlphabet(dfa.getInputAlphabet());
 		return result;
 	}
diff --git a/alib2algo/src/automaton/simplify/Total.cpp b/alib2algo/src/automaton/simplify/Total.cpp
index 03d4f5dfb847a3695d925dd6cc464321054c0795..34c3244647131e7aeb4c384835bdec2a66e0ff2d 100644
--- a/alib2algo/src/automaton/simplify/Total.cpp
+++ b/alib2algo/src/automaton/simplify/Total.cpp
@@ -11,6 +11,7 @@
 
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
+#include <label/FailStateLabel.h>
 
 namespace automaton {
 
@@ -26,7 +27,7 @@ automaton::NFA Total::total(const automaton::NFA& automaton) {
 	}
 
 	automaton::NFA res(automaton);
-	label::Label nullState = label::createUniqueLabel(label::labelFrom("q0"), automaton.getStates());
+	label::Label nullState = label::createUniqueLabel(label::FailStateLabel::FAIL_STATE_LABEL, automaton.getStates());
 	res.addState(nullState);
 
 	for(const auto& q : res.getStates()) {
@@ -44,7 +45,7 @@ auto TotalNFA = Total::RegistratorWrapper<automaton::NFA, automaton::NFA>(Total:
 
 automaton::DFA Total::total(const automaton::DFA& automaton) {
 	automaton::DFA res(automaton);
-	label::Label nullState = label::createUniqueLabel(label::labelFrom("q0"), automaton.getStates());
+	label::Label nullState = label::createUniqueLabel(label::FailStateLabel::FAIL_STATE_LABEL, automaton.getStates());
 	res.addState(nullState);
 
 	for(const auto& q : res.getStates()) {
diff --git a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
index b2a6c77e5e426c4e7e610a372b2e990618dd8c12..48b69b3fa7bc61665ca74f79465da7864430607f 100644
--- a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
+++ b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
@@ -7,6 +7,7 @@
 
 #include "AutomataUnionEpsilonTransition.h"
 #include "common/PairLabel.h"
+#include <label/InitialStateLabel.h>
 
 #define AUTOMATON_FIRST  1
 #define AUTOMATON_SECOND 2
@@ -26,7 +27,7 @@ automaton::EpsilonNFA AutomataUnionEpsilonTransition::unification(const automato
 	for(const auto& q : second.getStates())
 		states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q));
 
-	label::Label q0 = label::createUniqueLabel(label::labelFrom("q0"), states);
+	label::Label q0 = label::createUniqueLabel(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
 	automaton::EpsilonNFA res(q0);
 
 	for(const auto& a : first.getInputAlphabet())
@@ -65,7 +66,7 @@ automaton::EpsilonNFA AutomataUnionEpsilonTransition::unification(const automato
 	for(const auto& q : second.getStates())
 		states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q));
 
-	label::Label q0 = label::createUniqueLabel(label::labelFrom("q0"), states);
+	label::Label q0 = label::createUniqueLabel(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
 	automaton::EpsilonNFA res(q0);
 
 	for(const auto& a : first.getInputAlphabet())
@@ -104,7 +105,7 @@ automaton::EpsilonNFA AutomataUnionEpsilonTransition::unification(const automato
 	for(const auto& q : second.getStates())
 		states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q));
 
-	label::Label q0 = label::createUniqueLabel(label::labelFrom("q0"), states);
+	label::Label q0 = label::createUniqueLabel(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
 	automaton::EpsilonNFA res(q0);
 
 	for(const auto& a : first.getInputAlphabet())
diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
index b0630b64a06060de57ad305310bdbc7abbedb0ef..11f8692ed855e3891a052b7ae5a09d0187fac91b 100644
--- a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
+++ b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
@@ -18,6 +18,7 @@
 #include <map>
 #include <queue>
 #include <iterator>
+#include <label/InitialStateLabel.h>
 
 namespace automaton {
 
@@ -34,7 +35,7 @@ automaton::RealTimeHeightDeterministicNPDA PDAToRHPDA::convert ( const automaton
 auto PDAToRHPDARealTimeHeightDeterministicNPDA = PDAToRHPDA::RegistratorWrapper < automaton::RealTimeHeightDeterministicNPDA, automaton::RealTimeHeightDeterministicNPDA > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicDPDA PDAToRHPDA::convert ( const automaton::DPDA & pda ) {
-	label::Label q0 = label::createUniqueLabel ( label::labelFrom ( "q0" ), pda.getStates ( ) );
+	label::Label q0 = label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, pda.getStates ( ) );
 
 	RealTimeHeightDeterministicDPDA res ( q0, alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
 
@@ -119,7 +120,7 @@ automaton::RealTimeHeightDeterministicNPDA PDAToRHPDA::convert ( const automaton
 	pushdownStoreAlphabet.insert ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
 	res.setPushdownStoreAlphabet ( pushdownStoreAlphabet );
 
-	label::Label q0 = label::createUniqueLabel ( label::labelFrom ( "q0" ), res.getStates ( ) );
+	label::Label q0 = label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, res.getStates ( ) );
 	res.addState ( q0 );
 	res.addInitialState ( q0 );
 
diff --git a/alib2algo/src/grammar/convert/ToAutomaton.cpp b/alib2algo/src/grammar/convert/ToAutomaton.cpp
index 803386be1256ef2580e8b25c682f7cc55a1139ce..686f755d4c995908909cc832c8d591a07b335bd7 100644
--- a/alib2algo/src/grammar/convert/ToAutomaton.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomaton.cpp
@@ -8,6 +8,8 @@
 
 #include <label/ObjectLabel.h>
 #include <label/Label.h>
+#include <label/InitialStateLabel.h>
+#include <label/FinalStateLabel.h>
 
 namespace grammar {
 
@@ -29,7 +31,7 @@ automaton::NFA ToAutomaton::convert(const grammar::LeftRG& grammar) {
 	}
 
 	// step 1, 4
-	label::Label q0 = label::createUniqueLabel(label::labelFrom("q0"), states);
+	label::Label q0 = label::createUniqueLabel(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
 	states.insert(q0);
 	automaton::NFA automaton(q0);
 	automaton.setInputAlphabet(grammar.getTerminalAlphabet());
@@ -72,7 +74,7 @@ automaton::NFA ToAutomaton::convert(const grammar::RightRG& grammar) {
 	}
 
 	// step 1, 4
-	label::Label AState = label::createUniqueLabel(label::labelFrom("A"), states);
+	label::Label AState = label::createUniqueLabel(label::FinalStateLabel::FINAL_STATE_LABEL, states);
 	states.insert(AState);
 	automaton::NFA automaton(stateMap.find(grammar.getInitialSymbol())->second);
 	automaton.setStates(states);
@@ -106,7 +108,7 @@ auto ToAutomatonRightRG = ToAutomaton::RegistratorWrapper<automaton::NFA, gramma
 
 template <class T>
 automaton::NPDA ToAutomaton::convert(const T& grammar) {
-	automaton::NPDA automaton(label::labelFrom('q'), grammar.getInitialSymbol());
+	automaton::NPDA automaton(label::InitialStateLabel::INITIAL_STATE_LABEL, grammar.getInitialSymbol());
 
 	automaton.setInputAlphabet(grammar.getTerminalAlphabet());
 
diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
index 50c31463517df7cbc85fb66957b35a5619b0344d..137872c6ea7a77d97d1a1ffd69d1cc034136b1dd 100644
--- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
@@ -8,6 +8,8 @@
 
 #include <alphabet/BottomOfTheStackSymbol.h>
 #include <alphabet/LabeledSymbol.h>
+#include <label/InitialStateLabel.h>
+#include <label/FinalStateLabel.h>
 
 namespace grammar {
 
@@ -19,8 +21,8 @@ automaton::Automaton ToAutomatonBottomUp::convert(const grammar::Grammar& gramma
 
 template <class T>
 automaton::NPDA ToAutomatonBottomUp::convert(const T& grammar) {
-	label::Label q = label::labelFrom('q');
-	label::Label r = label::labelFrom('r');
+	label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL;
+	label::Label r = label::FinalStateLabel::FINAL_STATE_LABEL;
 
 	automaton::NPDA automaton(q, alphabet::Symbol(alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK));
 	automaton.addState(r);
diff --git a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
index ebf1e87483989743498da405e65014431f6d3f98..11edf4e63ed011c341d6a298cc759367a689d6b8 100644
--- a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
+++ b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
@@ -8,6 +8,9 @@
 
 #include <factory/XmlDataFactory.hpp>
 
+#include <label/InitialStateLabel.h>
+#include <label/FinalStateLabel.h>
+
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( GrammarCFGtoPDATest, "grammar" );
 CPPUNIT_TEST_SUITE_REGISTRATION( GrammarCFGtoPDATest );
 
@@ -41,7 +44,7 @@ void GrammarCFGtoPDATest::testTopDown()
 		grammar.addRule(nF, std::vector<alphabet::Symbol>{tA});
 
 
-		label::Label q = label::labelFrom('q');
+		label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL;
 
 		automaton::NPDA pda(q, nE);
 		pda.setStates(std::set<label::Label>{q});
@@ -86,8 +89,8 @@ void GrammarCFGtoPDATest::testBottomUp()
 		grammar.addRule(nF, std::vector<alphabet::Symbol>{tA});
 
 
-		label::Label q = label::labelFrom('q');
-		label::Label r = label::labelFrom('r');
+		label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL;
+		label::Label r = label::FinalStateLabel::FINAL_STATE_LABEL;
 		alphabet::Symbol bots(alphabet::Symbol{alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK});
 
 		automaton::NPDA pda(q, bots);
diff --git a/alib2data/src/automaton/FSM/CompactNFA.cpp b/alib2data/src/automaton/FSM/CompactNFA.cpp
index 83d6712e7bb4bf06e7d81216816c4a2394c1ba6d..c7264183a0bfbf07a31f7ad3e0df7b0f8097455a 100644
--- a/alib2data/src/automaton/FSM/CompactNFA.cpp
+++ b/alib2data/src/automaton/FSM/CompactNFA.cpp
@@ -21,6 +21,7 @@
 #include <object/Object.h>
 #include <XmlApi.hpp>
 #include <cast/CastApi.hpp>
+#include "../../label/InitialStateLabel.h"
 
 namespace automaton {
 
@@ -42,7 +43,7 @@ CompactNFA::CompactNFA ( const EpsilonNFA & other ) : CompactNFA ( other.getStat
 	}
 }
 
-CompactNFA::CompactNFA ( const MultiInitialStateNFA & other ) : CompactNFA ( other.getStates ( ) + std::set < label::Label > { label::createUniqueLabel ( label::labelFrom ( "q0" ), other.getStates ( ) ) }, other.getInputAlphabet ( ), label::createUniqueLabel ( label::labelFrom ( "q0" ), other.getStates ( ) ), other.getFinalStates ( ) ) {
+CompactNFA::CompactNFA ( const MultiInitialStateNFA & other ) : CompactNFA ( other.getStates ( ) + std::set < label::Label > { label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
 	for ( const auto & transition : other.getTransitions ( ) ) {
 		std::pair < label::Label, string::LinearString > key = std::make_pair ( transition.first.first, string::LinearString ( std::vector < alphabet::Symbol > { transition.first.second } ) );
 		transitions[key] = transition.second;
diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.cpp b/alib2data/src/automaton/FSM/EpsilonNFA.cpp
index a888b666ebb0b024e9092eba1de77a3fb0bbad6f..14acc6af9fc5107d9bc5ad43695d7782c707c91a 100644
--- a/alib2data/src/automaton/FSM/EpsilonNFA.cpp
+++ b/alib2data/src/automaton/FSM/EpsilonNFA.cpp
@@ -19,6 +19,7 @@
 #include <object/Object.h>
 #include <XmlApi.hpp>
 #include <cast/CastApi.hpp>
+#include "../../label/InitialStateLabel.h"
 
 namespace automaton {
 
@@ -28,7 +29,7 @@ EpsilonNFA::EpsilonNFA ( std::set < label::Label > states, std::set < alphabet::
 EpsilonNFA::EpsilonNFA ( label::Label initialState ) : EpsilonNFA ( std::set < label::Label > { initialState }, std::set < alphabet::Symbol > { }, initialState, std::set < label::Label > { } ) {
 }
 
-EpsilonNFA::EpsilonNFA ( const MultiInitialStateNFA & other ) : EpsilonNFA ( other.getStates ( ) + std::set < label::Label > { label::createUniqueLabel ( label::labelFrom ( "q0" ), other.getStates ( ) ) }, other.getInputAlphabet ( ), label::createUniqueLabel ( label::labelFrom ( "q0" ), other.getStates ( ) ), other.getFinalStates ( ) ) {
+EpsilonNFA::EpsilonNFA ( const MultiInitialStateNFA & other ) : EpsilonNFA ( other.getStates ( ) + std::set < label::Label > { label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
 	for ( const auto & transition : other.getTransitions ( ) ) {
 		std::pair < label::Label, std::variant < string::Epsilon, alphabet::Symbol > > key = std::make_pair ( transition.first.first, std::variant < string::Epsilon, alphabet::Symbol > ( transition.first.second ) );
 		transitions[key] = transition.second;
diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.cpp b/alib2data/src/automaton/FSM/ExtendedNFA.cpp
index e700710c1e254cba18b24eaac6905fa4a4db0a1b..c0e8dd76c68e1e0666dea358149b28c9b9a8c7e5 100644
--- a/alib2data/src/automaton/FSM/ExtendedNFA.cpp
+++ b/alib2data/src/automaton/FSM/ExtendedNFA.cpp
@@ -23,6 +23,7 @@
 #include <object/Object.h>
 #include <XmlApi.hpp>
 #include <cast/CastApi.hpp>
+#include "../../label/InitialStateLabel.h"
 
 namespace automaton {
 
@@ -51,7 +52,7 @@ ExtendedNFA::ExtendedNFA ( const EpsilonNFA & other ) : ExtendedNFA ( other.getS
 	}
 }
 
-ExtendedNFA::ExtendedNFA ( const MultiInitialStateNFA & other ) : ExtendedNFA ( other.getStates ( ) + std::set < label::Label > { label::createUniqueLabel ( label::labelFrom ( "q0" ), other.getStates ( ) ) }, other.getInputAlphabet ( ), label::createUniqueLabel ( label::labelFrom ( "q0" ), other.getStates ( ) ), other.getFinalStates ( ) ) {
+ExtendedNFA::ExtendedNFA ( const MultiInitialStateNFA & other ) : ExtendedNFA ( other.getStates ( ) + std::set < label::Label > { label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
 	for ( const auto & transition : other.getTransitions ( ) ) {
 		std::pair < label::Label, regexp::RegExp > key = std::make_pair ( transition.first.first, regexp::RegExp ( regexp::regexpFrom ( transition.first.second ) ) );
 		transitions[key] = transition.second;
diff --git a/alib2data/src/label/FailStateLabel.cpp b/alib2data/src/label/FailStateLabel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fee70a5d5b3064c6926566559c15e1531de4285b
--- /dev/null
+++ b/alib2data/src/label/FailStateLabel.cpp
@@ -0,0 +1,70 @@
+/*
+ * FailStateLabel.cpp
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travicek
+ */
+
+#include "FailStateLabel.h"
+#include <sax/FromXMLParserHelper.h>
+#include "Label.h"
+#include <object/Object.h>
+#include <XmlApi.hpp>
+#include "UniqueLabel.h"
+
+namespace label {
+
+FailStateLabel::FailStateLabel() {
+
+}
+
+LabelBase* FailStateLabel::clone() const {
+	return new FailStateLabel(*this);
+}
+
+LabelBase* FailStateLabel::plunder() && {
+	return new FailStateLabel(std::move(*this));
+}
+
+int FailStateLabel::compare(const FailStateLabel&) const {
+	return 0;
+}
+
+void FailStateLabel::operator>>(std::ostream& out) const {
+	out << "(FailStateLabel)";
+}
+
+FailStateLabel::operator std::string() const {
+	return "fail";
+}
+
+FailStateLabel FailStateLabel::FAIL_STATE = FailStateLabel ( );
+Label FailStateLabel::FAIL_STATE_LABEL = Label ( FailStateLabel ( ) );
+
+FailStateLabel FailStateLabel::parse(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, FailStateLabel::getXmlTagName());
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, FailStateLabel::getXmlTagName());
+	return FailStateLabel();
+}
+
+void FailStateLabel::compose(std::deque<sax::Token>& out) const {
+	out.emplace_back(FailStateLabel::getXmlTagName(), sax::Token::TokenType::START_ELEMENT);
+	out.emplace_back(FailStateLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
+}
+
+LabelBase* FailStateLabel::next() const {
+	return new UniqueLabel(Label(*this), primitive::Integer(0));
+}
+
+LabelBase* FailStateLabel::inc() && {
+	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
+}
+
+} /* namespace label */
+
+namespace alib {
+
+auto failStateLabelParserRegister = xmlApi<label::Label>::ParserRegister<label::FailStateLabel>();
+auto failStateLabelParserRegister2 = xmlApi<alib::Object>::ParserRegister<label::FailStateLabel>();
+
+} /* namespace alib */
diff --git a/alib2data/src/label/FailStateLabel.h b/alib2data/src/label/FailStateLabel.h
new file mode 100644
index 0000000000000000000000000000000000000000..a7acb6519d082a9d10bebdd39cc3f5d33d57fc19
--- /dev/null
+++ b/alib2data/src/label/FailStateLabel.h
@@ -0,0 +1,62 @@
+/*
+ * FailStateLabel.h
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travnicek
+ */
+
+#ifndef FAIL_STATE_LABEL_H_
+#define FAIL_STATE_LABEL_H_
+
+#include "LabelBase.h"
+#include "Label.h"
+
+namespace label {
+
+/**
+ * Represents symbol in an alphabet.
+ */
+class FailStateLabel : public LabelBase {
+public:
+	/**
+	 * Creates new symbol with given name.
+	 * @param symbol name of the symbol
+	 */
+	explicit FailStateLabel ( );
+
+	virtual LabelBase * clone ( ) const;
+
+	virtual LabelBase * plunder ( ) &&;
+
+	virtual int compare ( const ObjectBase & other ) const {
+		if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other );
+
+		return std::type_index ( typeid ( * this ) ) - std::type_index ( typeid ( other ) );
+	}
+
+	virtual int compare ( const FailStateLabel & other ) const;
+
+	virtual void operator >>( std::ostream & ) const;
+
+	virtual explicit operator std::string ( ) const;
+
+	static FailStateLabel FAIL_STATE;
+	static Label FAIL_STATE_LABEL;
+
+	static const std::string & getXmlTagName() {
+		static std::string xmlTagName = "FailStateLabel";
+
+		return xmlTagName;
+	}
+
+	static FailStateLabel parse ( std::deque < sax::Token >::iterator & input );
+
+	void compose ( std::deque < sax::Token > & out ) const;
+
+	virtual LabelBase * next ( ) const;
+	virtual LabelBase * inc ( ) &&;
+};
+
+} /* namespace label */
+
+#endif /* FAIL_STATE_LABEL_H_ */
diff --git a/alib2data/src/label/FinalStateLabel.cpp b/alib2data/src/label/FinalStateLabel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..26e99a22ea66790e9bf5fbb2774572845dda8529
--- /dev/null
+++ b/alib2data/src/label/FinalStateLabel.cpp
@@ -0,0 +1,70 @@
+/*
+ * FinalStateLabel.cpp
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travicek
+ */
+
+#include "FinalStateLabel.h"
+#include <sax/FromXMLParserHelper.h>
+#include "Label.h"
+#include <object/Object.h>
+#include <XmlApi.hpp>
+#include "UniqueLabel.h"
+
+namespace label {
+
+FinalStateLabel::FinalStateLabel() {
+
+}
+
+LabelBase* FinalStateLabel::clone() const {
+	return new FinalStateLabel(*this);
+}
+
+LabelBase* FinalStateLabel::plunder() && {
+	return new FinalStateLabel(std::move(*this));
+}
+
+int FinalStateLabel::compare(const FinalStateLabel&) const {
+	return 0;
+}
+
+void FinalStateLabel::operator>>(std::ostream& out) const {
+	out << "(FinalStateLabel)";
+}
+
+FinalStateLabel::operator std::string() const {
+	return "f";
+}
+
+FinalStateLabel FinalStateLabel::FINAL_STATE = FinalStateLabel ( );
+Label FinalStateLabel::FINAL_STATE_LABEL = Label ( FinalStateLabel ( ) );
+
+FinalStateLabel FinalStateLabel::parse(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, FinalStateLabel::getXmlTagName());
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, FinalStateLabel::getXmlTagName());
+	return FinalStateLabel();
+}
+
+void FinalStateLabel::compose(std::deque<sax::Token>& out) const {
+	out.emplace_back(FinalStateLabel::getXmlTagName(), sax::Token::TokenType::START_ELEMENT);
+	out.emplace_back(FinalStateLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
+}
+
+LabelBase* FinalStateLabel::next() const {
+	return new UniqueLabel(Label(*this), primitive::Integer(0));
+}
+
+LabelBase* FinalStateLabel::inc() && {
+	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
+}
+
+} /* namespace label */
+
+namespace alib {
+
+auto finalStateLabelParserRegister = xmlApi<label::Label>::ParserRegister<label::FinalStateLabel>();
+auto finalStateLabelParserRegister2 = xmlApi<alib::Object>::ParserRegister<label::FinalStateLabel>();
+
+} /* namespace alib */
diff --git a/alib2data/src/label/FinalStateLabel.h b/alib2data/src/label/FinalStateLabel.h
new file mode 100644
index 0000000000000000000000000000000000000000..cb2b69a17a0b87da1e19a75ec255049001eb81f0
--- /dev/null
+++ b/alib2data/src/label/FinalStateLabel.h
@@ -0,0 +1,62 @@
+/*
+ * FinalStateLabel.h
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travnicek
+ */
+
+#ifndef FINAL_STATE_LABEL_H_
+#define FINAL_STATE_LABEL_H_
+
+#include "LabelBase.h"
+#include "Label.h"
+
+namespace label {
+
+/**
+ * Represents symbol in an alphabet.
+ */
+class FinalStateLabel : public LabelBase {
+public:
+	/**
+	 * Creates new symbol with given name.
+	 * @param symbol name of the symbol
+	 */
+	explicit FinalStateLabel ( );
+
+	virtual LabelBase * clone ( ) const;
+
+	virtual LabelBase * plunder ( ) &&;
+
+	virtual int compare ( const ObjectBase & other ) const {
+		if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other );
+
+		return std::type_index ( typeid ( * this ) ) - std::type_index ( typeid ( other ) );
+	}
+
+	virtual int compare ( const FinalStateLabel & other ) const;
+
+	virtual void operator >>( std::ostream & ) const;
+
+	virtual explicit operator std::string ( ) const;
+
+	static FinalStateLabel FINAL_STATE;
+	static Label FINAL_STATE_LABEL;
+
+	static const std::string & getXmlTagName() {
+		static std::string xmlTagName = "FinalStateLabel";
+
+		return xmlTagName;
+	}
+
+	static FinalStateLabel parse ( std::deque < sax::Token >::iterator & input );
+
+	void compose ( std::deque < sax::Token > & out ) const;
+
+	virtual LabelBase * next ( ) const;
+	virtual LabelBase * inc ( ) &&;
+};
+
+} /* namespace label */
+
+#endif /* FINAL_STATE_LABEL_H_ */
diff --git a/alib2data/src/label/InitialStateLabel.cpp b/alib2data/src/label/InitialStateLabel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b114f48394d8ad8b6678f148ec28fe35ebed4b8d
--- /dev/null
+++ b/alib2data/src/label/InitialStateLabel.cpp
@@ -0,0 +1,70 @@
+/*
+ * InitialStateLabel.cpp
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travicek
+ */
+
+#include "InitialStateLabel.h"
+#include <sax/FromXMLParserHelper.h>
+#include "Label.h"
+#include <object/Object.h>
+#include <XmlApi.hpp>
+#include "UniqueLabel.h"
+
+namespace label {
+
+InitialStateLabel::InitialStateLabel() {
+
+}
+
+LabelBase* InitialStateLabel::clone() const {
+	return new InitialStateLabel(*this);
+}
+
+LabelBase* InitialStateLabel::plunder() && {
+	return new InitialStateLabel(std::move(*this));
+}
+
+int InitialStateLabel::compare(const InitialStateLabel&) const {
+	return 0;
+}
+
+void InitialStateLabel::operator>>(std::ostream& out) const {
+	out << "(InitialStateLabel)";
+}
+
+InitialStateLabel::operator std::string() const {
+	return "q0";
+}
+
+InitialStateLabel InitialStateLabel::INITIAL_STATE = InitialStateLabel ( );
+Label InitialStateLabel::INITIAL_STATE_LABEL = Label ( InitialStateLabel ( ) );
+
+InitialStateLabel InitialStateLabel::parse(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, InitialStateLabel::getXmlTagName());
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, InitialStateLabel::getXmlTagName());
+	return InitialStateLabel();
+}
+
+void InitialStateLabel::compose(std::deque<sax::Token>& out) const {
+	out.emplace_back(InitialStateLabel::getXmlTagName(), sax::Token::TokenType::START_ELEMENT);
+	out.emplace_back(InitialStateLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
+}
+
+LabelBase* InitialStateLabel::next() const {
+	return new UniqueLabel(Label(*this), primitive::Integer(0));
+}
+
+LabelBase* InitialStateLabel::inc() && {
+	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
+}
+
+} /* namespace label */
+
+namespace alib {
+
+auto initialStateLabelParserRegister = xmlApi<label::Label>::ParserRegister<label::InitialStateLabel>();
+auto initialStateLabelParserRegister2 = xmlApi<alib::Object>::ParserRegister<label::InitialStateLabel>();
+
+} /* namespace alib */
diff --git a/alib2data/src/label/InitialStateLabel.h b/alib2data/src/label/InitialStateLabel.h
new file mode 100644
index 0000000000000000000000000000000000000000..d5ea7a506838224793f04261ba98fd6e2b9fb534
--- /dev/null
+++ b/alib2data/src/label/InitialStateLabel.h
@@ -0,0 +1,62 @@
+/*
+ * InitialStateLabel.h
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travnicek
+ */
+
+#ifndef INITIAL_STATE_LABEL_H_
+#define INITIAL_STATE_LABEL_H_
+
+#include "LabelBase.h"
+#include "Label.h"
+
+namespace label {
+
+/**
+ * Represents symbol in an alphabet.
+ */
+class InitialStateLabel : public LabelBase {
+public:
+	/**
+	 * Creates new symbol with given name.
+	 * @param symbol name of the symbol
+	 */
+	explicit InitialStateLabel ( );
+
+	virtual LabelBase * clone ( ) const;
+
+	virtual LabelBase * plunder ( ) &&;
+
+	virtual int compare ( const ObjectBase & other ) const {
+		if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other );
+
+		return std::type_index ( typeid ( * this ) ) - std::type_index ( typeid ( other ) );
+	}
+
+	virtual int compare ( const InitialStateLabel & other ) const;
+
+	virtual void operator >>( std::ostream & ) const;
+
+	virtual explicit operator std::string ( ) const;
+
+	static InitialStateLabel INITIAL_STATE;
+	static Label INITIAL_STATE_LABEL;
+
+	static const std::string & getXmlTagName() {
+		static std::string xmlTagName = "InitialStateLabel";
+
+		return xmlTagName;
+	}
+
+	static InitialStateLabel parse ( std::deque < sax::Token >::iterator & input );
+
+	void compose ( std::deque < sax::Token > & out ) const;
+
+	virtual LabelBase * next ( ) const;
+	virtual LabelBase * inc ( ) &&;
+};
+
+} /* namespace label */
+
+#endif /* INITIAL_STATE_LABEL_H_ */