diff --git a/alib2algo/src/automaton/run/Result.h b/alib2algo/src/automaton/run/Result.h
index 81761062fa1a7670937e6fc65c48058248ff7ca7..26117df7b745f05c0af3d563f73381efd4e4f162 100644
--- a/alib2algo/src/automaton/run/Result.h
+++ b/alib2algo/src/automaton/run/Result.h
@@ -27,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::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 );
+	static label::Label result ( const automaton::Automaton & automaton, const alib::Object & object, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) );
+
+	static label::Label result ( const automaton::DFA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) );
+	static label::Label result ( const automaton::DFTA < > & automaton, const tree::RankedTree < > & tree, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) );
+	static label::Label result ( const automaton::InputDrivenDPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) );
+	static label::Label result ( const automaton::VisiblyPushdownDPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) );
+	static label::Label result ( const automaton::RealTimeHeightDeterministicDPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) );
+	static label::Label result ( const automaton::DPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) );
 
 };
 
diff --git a/alib2algo/src/automaton/run/Run.cpp b/alib2algo/src/automaton/run/Run.cpp
index cc897cb58fda3313beb36f48fe7da768c338ce3f..0feabbfb5d03b23cd6551949ffac3ce4f460b889 100644
--- a/alib2algo/src/automaton/run/Run.cpp
+++ b/alib2algo/src/automaton/run/Run.cpp
@@ -125,11 +125,11 @@ std::pair < bool, label::Label > Run::calculateState ( const automaton::DFTA < >
 			states.push_back ( res.second );
 	}
 
-	if ( !sign ) return std::make_pair ( false, label::FailStateLabel::FAIL_STATE_LABEL );
+	if ( !sign ) return std::make_pair ( false, label::FailStateLabel::instance < label::Label > ( ) );
 
 	const auto & it = automaton.getTransitions ( ).find ( std::make_pair ( node.getData ( ), states ) );
 
-	if ( it == automaton.getTransitions ( ).end ( ) ) return std::make_pair ( false, label::FailStateLabel::FAIL_STATE_LABEL );
+	if ( it == automaton.getTransitions ( ).end ( ) ) return std::make_pair ( false, label::FailStateLabel::instance < label::Label > ( ) );
 
 	label::Label state = it->second;
 
diff --git a/alib2algo/src/automaton/simplify/Total.cpp b/alib2algo/src/automaton/simplify/Total.cpp
index 99c8ac5fa9cd5f7cfd14bb6a222f09f7382057a4..a2669c68e2e6678ce79bbbb00d028e68a909944a 100644
--- a/alib2algo/src/automaton/simplify/Total.cpp
+++ b/alib2algo/src/automaton/simplify/Total.cpp
@@ -28,7 +28,7 @@ automaton::NFA < > Total::total(const automaton::NFA < > & automaton) {
 	}
 
 	automaton::NFA < > res(automaton);
-	label::Label nullState = common::createUnique(label::FailStateLabel::FAIL_STATE_LABEL, automaton.getStates());
+	label::Label nullState = common::createUnique(label::FailStateLabel::instance < label::Label > ( ), automaton.getStates());
 	res.addState(nullState);
 
 	for(const auto& q : res.getStates()) {
@@ -46,7 +46,7 @@ auto TotalNFA = Total::RegistratorWrapper<automaton::NFA < > , automaton::NFA <
 
 automaton::DFA < > Total::total(const automaton::DFA < > & automaton) {
 	automaton::DFA < > res(automaton);
-	label::Label nullState = common::createUnique(label::FailStateLabel::FAIL_STATE_LABEL, automaton.getStates());
+	label::Label nullState = common::createUnique(label::FailStateLabel::instance < label::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 e4f8c7b6da16238322f25a538234dce468cee98c..044f6cbb7a4dabbd6dbc128e0d6137a76666898f 100644
--- a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
+++ b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
@@ -28,7 +28,7 @@ automaton::EpsilonNFA < > AutomataUnionEpsilonTransition::unification(const auto
 	for(const auto& q : second.getStates())
 		states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q));
 
-	label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
+	label::Label q0 = common::createUnique(label::InitialStateLabel::instance < label::Label > ( ), states);
 	automaton::EpsilonNFA < > res(q0);
 
 	for(const auto& a : first.getInputAlphabet())
@@ -67,7 +67,7 @@ automaton::EpsilonNFA < > AutomataUnionEpsilonTransition::unification(const auto
 	for(const auto& q : second.getStates())
 		states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q));
 
-	label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
+	label::Label q0 = common::createUnique(label::InitialStateLabel::instance < label::Label > ( ), states);
 	automaton::EpsilonNFA < > res(q0);
 
 	for(const auto& a : first.getInputAlphabet())
@@ -106,7 +106,7 @@ automaton::EpsilonNFA < > AutomataUnionEpsilonTransition::unification(const auto
 	for(const auto& q : second.getStates())
 		states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q));
 
-	label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
+	label::Label q0 = common::createUnique(label::InitialStateLabel::instance < label::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 3ac0e4571c9592baaded7809649e5d8cd4569263..f9f45d7bb1581896d882cfdc878b84f2cd183b51 100644
--- a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
+++ b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
@@ -36,7 +36,7 @@ automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const autom
 auto PDAToRHPDARealTimeHeightDeterministicNPDA = PDAToRHPDA::RegistratorWrapper < automaton::RealTimeHeightDeterministicNPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const automaton::DPDA < > & pda ) {
-	label::Label q0 = common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, pda.getStates ( ) );
+	label::Label q0 = common::createUnique ( label::InitialStateLabel::instance < label::Label > ( ), pda.getStates ( ) );
 
 	RealTimeHeightDeterministicDPDA < > res ( q0, alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 
@@ -121,7 +121,7 @@ automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const autom
 	pushdownStoreAlphabet.insert ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 	res.setPushdownStoreAlphabet ( pushdownStoreAlphabet );
 
-	label::Label q0 = common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, res.getStates ( ) );
+	label::Label q0 = common::createUnique ( label::InitialStateLabel::instance < label::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 e1c7aab5beb6076bf9d6334521ad347e163a227a..628809810e19b82c92d3367c0e9f88e57f017e1e 100644
--- a/alib2algo/src/grammar/convert/ToAutomaton.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomaton.cpp
@@ -33,7 +33,7 @@ automaton::NFA < > ToAutomaton::convert(const grammar::LeftRG < > & grammar) {
 	}
 
 	// step 1, 4
-	label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
+	label::Label q0 = common::createUnique(label::InitialStateLabel::instance < label::Label > ( ), states);
 	states.insert(q0);
 	automaton::NFA < > automaton(q0);
 	automaton.setInputAlphabet(grammar.getTerminalAlphabet());
@@ -76,7 +76,7 @@ automaton::NFA < > ToAutomaton::convert(const grammar::RightRG < > & grammar) {
 	}
 
 	// step 1, 4
-	label::Label AState = common::createUnique(label::FinalStateLabel::FINAL_STATE_LABEL, states);
+	label::Label AState = common::createUnique(label::FinalStateLabel::instance < label::Label > ( ), states);
 	states.insert(AState);
 	automaton::NFA < > automaton(stateMap.find(grammar.getInitialSymbol())->second);
 	automaton.setStates(states);
@@ -110,7 +110,7 @@ auto ToAutomatonRightRG = ToAutomaton::RegistratorWrapper<automaton::NFA < > , g
 
 template <class T>
 automaton::NPDA < > ToAutomaton::convert(const T& grammar) {
-	automaton::NPDA < > automaton(label::InitialStateLabel::INITIAL_STATE_LABEL, grammar.getInitialSymbol());
+	automaton::NPDA < > automaton(label::InitialStateLabel::instance < label::Label > ( ), grammar.getInitialSymbol());
 
 	automaton.setInputAlphabet(grammar.getTerminalAlphabet());
 
diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
index 6bd1e388d960309a562aebbe0f8e4afe85928abd..1801a727ecf653451d1dff6d9e2881dc275800b4 100644
--- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
@@ -21,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::InitialStateLabel::INITIAL_STATE_LABEL;
-	label::Label r = label::FinalStateLabel::FINAL_STATE_LABEL;
+	label::Label q = label::InitialStateLabel::instance < label::Label > ( );
+	label::Label r = label::FinalStateLabel::instance < label::Label > ( );
 
 	automaton::NPDA < > automaton(q, alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 	automaton.addState(r);
diff --git a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
index b755827c35af3a515ca77e186a4c5c0ff8d54403..db2e48cfe84719848cfce7a026ac55f8f9901442 100644
--- a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
+++ b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
@@ -44,7 +44,7 @@ void GrammarCFGtoPDATest::testTopDown()
 		grammar.addRule(nF, std::vector<alphabet::Symbol>{tA});
 
 
-		label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL;
+		label::Label q = label::InitialStateLabel::instance < label::Label > ( );
 
 		automaton::NPDA < > pda(q, nE);
 		pda.setStates(std::set<label::Label>{q});
@@ -89,8 +89,8 @@ void GrammarCFGtoPDATest::testBottomUp()
 		grammar.addRule(nF, std::vector<alphabet::Symbol>{tA});
 
 
-		label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL;
-		label::Label r = label::FinalStateLabel::FINAL_STATE_LABEL;
+		label::Label q = label::InitialStateLabel::instance < label::Label > ( );
+		label::Label r = label::FinalStateLabel::instance < label::Label > ( );
 		alphabet::Symbol bots( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 
 		automaton::NPDA < > pda(q, bots);
diff --git a/alib2data/src/automaton/FSM/CompactNFA.h b/alib2data/src/automaton/FSM/CompactNFA.h
index 24f460cc6cb0fcc3f4e0b39fe9b1f172e741cb6c..0de2fc7652ea287cbd77c7ad8e2534011738fe00 100644
--- a/alib2data/src/automaton/FSM/CompactNFA.h
+++ b/alib2data/src/automaton/FSM/CompactNFA.h
@@ -200,7 +200,7 @@ CompactNFA < SymbolType, StateType >::CompactNFA ( const EpsilonNFA < > & other
 }
 
 template < class SymbolType, class StateType >
-CompactNFA < SymbolType, StateType >::CompactNFA ( const MultiInitialStateNFA < > & other ) : CompactNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
+CompactNFA < SymbolType, StateType >::CompactNFA ( const MultiInitialStateNFA < > & other ) : CompactNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::instance < StateType > ( ), other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::instance < StateType > ( ), other.getStates ( ) ), other.getFinalStates ( ) ) {
 	for ( const auto & transition : other.getTransitions ( ) ) {
 		std::pair < StateType, std::vector < SymbolType > > key = std::make_pair ( transition.first.first, std::vector < SymbolType > { transition.first.second } );
 		transitions[key] = transition.second;
diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.h b/alib2data/src/automaton/FSM/EpsilonNFA.h
index 98a82fab026c1d15b1c6aa520efd9337a6c5baf6..5ca3f7b7cfb42bd64c81aef6b5b493af9c9550ef 100644
--- a/alib2data/src/automaton/FSM/EpsilonNFA.h
+++ b/alib2data/src/automaton/FSM/EpsilonNFA.h
@@ -264,7 +264,7 @@ EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( StateType initia
 
 
 template<class SymbolType, class EpsilonType, class StateType >
-EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const MultiInitialStateNFA < > & other ) : EpsilonNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
+EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const MultiInitialStateNFA < > & other ) : EpsilonNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::instance < StateType > ( ), other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::instance < StateType > ( ), other.getStates ( ) ), other.getFinalStates ( ) ) {
 	for ( const auto & transition : other.getTransitions ( ) ) {
 		std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( transition.first.first, std::variant < EpsilonType, SymbolType > ( transition.first.second ) );
 		transitions[key] = transition.second;
diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.h b/alib2data/src/automaton/FSM/ExtendedNFA.h
index ea66f192aa40026dcaa8bae074db5b74ce010925..4e08dcf8ac9ba89ac6979714e79866cab18c296f 100644
--- a/alib2data/src/automaton/FSM/ExtendedNFA.h
+++ b/alib2data/src/automaton/FSM/ExtendedNFA.h
@@ -218,7 +218,7 @@ ExtendedNFA < SymbolType, StateType >::ExtendedNFA ( const EpsilonNFA < > & othe
 }
 
 template<class SymbolType, class StateType >
-ExtendedNFA < SymbolType, StateType >::ExtendedNFA ( const MultiInitialStateNFA < > & other ) : ExtendedNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
+ExtendedNFA < SymbolType, StateType >::ExtendedNFA ( const MultiInitialStateNFA < > & other ) : ExtendedNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::instance < StateType > ( ), other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::instance < StateType > ( ), other.getStates ( ) ), other.getFinalStates ( ) ) {
 	for ( const auto & transition : other.getTransitions ( ) ) {
 		std::pair < StateType, regexp::UnboundedRegExpStructure < SymbolType > > key = std::make_pair ( transition.first.first, regexp::UnboundedRegExpStructure < SymbolType > ( regexp::UnboundedRegExpSymbol < SymbolType > ( transition.first.second ) ) );
 		transitions[key] = transition.second;
diff --git a/alib2data/src/label/FailStateLabel.cpp b/alib2data/src/label/FailStateLabel.cpp
index 50567d717d5fb3594ef03dc844e5c0a46fbb32b0..b68fa76dc09327ad9be757771d027230321e20eb 100644
--- a/alib2data/src/label/FailStateLabel.cpp
+++ b/alib2data/src/label/FailStateLabel.cpp
@@ -35,12 +35,9 @@ void FailStateLabel::operator>>(std::ostream& out) const {
 }
 
 FailStateLabel::operator std::string() const {
-	return "fail";
+	return FailStateLabel::instance < std::string > ( );
 }
 
-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());
diff --git a/alib2data/src/label/FailStateLabel.h b/alib2data/src/label/FailStateLabel.h
index e5ec06158c7b32769564eced44397de22999d6ae..815f7dd1551c84ae79e64796b1153a99354008fc 100644
--- a/alib2data/src/label/FailStateLabel.h
+++ b/alib2data/src/label/FailStateLabel.h
@@ -10,6 +10,7 @@
 
 #include "LabelBase.h"
 #include "Label.h"
+#include <object/Object.h>
 
 namespace label {
 
@@ -40,8 +41,10 @@ public:
 
 	virtual explicit operator std::string ( ) const;
 
-	static FailStateLabel FAIL_STATE;
-	static Label FAIL_STATE_LABEL;
+	template < typename Base >
+	static inline typename std::enable_if <   std::is_integral < Base >::value, Base >::type instance ( );
+	template < typename Base >
+	static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( );
 
 	static const std::string & getXmlTagName() {
 		static std::string xmlTagName = "FailStateLabel";
@@ -56,6 +59,31 @@ public:
 	virtual LabelBase * inc ( ) &&;
 };
 
+template < typename Base >
+inline typename std::enable_if < std::is_integral < Base >::value, Base >::type FailStateLabel::instance ( ) {
+	return -1;
+}
+
+template < >
+inline std::string FailStateLabel::instance < std::string > ( ) {
+	return std::string ( "fail" );
+}
+
+template < >
+inline FailStateLabel FailStateLabel::instance < FailStateLabel > ( ) {
+	return FailStateLabel ( );
+}
+
+template < >
+inline Label FailStateLabel::instance < Label > ( ) {
+	return Label ( FailStateLabel ( ) );
+}
+
+template < >
+inline alib::Object FailStateLabel::instance < alib::Object > ( ) {
+	return alib::Object ( FailStateLabel ( ) );
+}
+
 } /* namespace label */
 
 #endif /* FAIL_STATE_LABEL_H_ */
diff --git a/alib2data/src/label/FinalStateLabel.cpp b/alib2data/src/label/FinalStateLabel.cpp
index a7e2b97032e6344045b098768607877d3618977a..69b6a35f39fad7a1ec3546313b13bdadc8134ec5 100644
--- a/alib2data/src/label/FinalStateLabel.cpp
+++ b/alib2data/src/label/FinalStateLabel.cpp
@@ -35,12 +35,9 @@ void FinalStateLabel::operator>>(std::ostream& out) const {
 }
 
 FinalStateLabel::operator std::string() const {
-	return "f";
+	return FinalStateLabel::instance < std::string > ( );
 }
 
-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());
diff --git a/alib2data/src/label/FinalStateLabel.h b/alib2data/src/label/FinalStateLabel.h
index 037c26a618f56f76502bf0f62f93c2d12254ade6..81b39a2b330d6c1d6fa8a0a649f01370a831772d 100644
--- a/alib2data/src/label/FinalStateLabel.h
+++ b/alib2data/src/label/FinalStateLabel.h
@@ -10,6 +10,8 @@
 
 #include "LabelBase.h"
 #include "Label.h"
+#include <object/Object.h>
+#include <limits>
 
 namespace label {
 
@@ -40,8 +42,10 @@ public:
 
 	virtual explicit operator std::string ( ) const;
 
-	static FinalStateLabel FINAL_STATE;
-	static Label FINAL_STATE_LABEL;
+	template < typename Base >
+	static inline typename std::enable_if <   std::is_integral < Base >::value, Base >::type instance ( );
+	template < typename Base >
+	static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( );
 
 	static const std::string & getXmlTagName() {
 		static std::string xmlTagName = "FinalStateLabel";
@@ -56,6 +60,31 @@ public:
 	virtual LabelBase * inc ( ) &&;
 };
 
+template < typename Base >
+inline typename std::enable_if < std::is_integral < Base >::value, Base >::type FinalStateLabel::instance ( ) {
+	return std::numeric_limits < Base >::max();
+}
+
+template < >
+inline std::string FinalStateLabel::instance < std::string > ( ) {
+	return std::string ( "final" );
+}
+
+template < >
+inline FinalStateLabel FinalStateLabel::instance < FinalStateLabel > ( ) {
+	return FinalStateLabel ( );
+}
+
+template < >
+inline Label FinalStateLabel::instance < Label > ( ) {
+	return Label ( FinalStateLabel ( ) );
+}
+
+template < >
+inline alib::Object FinalStateLabel::instance < alib::Object > ( ) {
+	return alib::Object ( FinalStateLabel ( ) );
+}
+
 } /* namespace label */
 
 #endif /* FINAL_STATE_LABEL_H_ */
diff --git a/alib2data/src/label/InitialStateLabel.cpp b/alib2data/src/label/InitialStateLabel.cpp
index 92a5f7a75d065781836f715621530d3b5acf648e..3e668edd0df67ecfc5989a22f5bb379f148b32d6 100644
--- a/alib2data/src/label/InitialStateLabel.cpp
+++ b/alib2data/src/label/InitialStateLabel.cpp
@@ -35,12 +35,9 @@ void InitialStateLabel::operator>>(std::ostream& out) const {
 }
 
 InitialStateLabel::operator std::string() const {
-	return "q0";
+	return InitialStateLabel::instance < std::string > ( );
 }
 
-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());
diff --git a/alib2data/src/label/InitialStateLabel.h b/alib2data/src/label/InitialStateLabel.h
index 0db1bc89a7bc9589961caf9559a509077df8cf5c..7dce852e83e62b86540290b1907cf3d394b49775 100644
--- a/alib2data/src/label/InitialStateLabel.h
+++ b/alib2data/src/label/InitialStateLabel.h
@@ -10,6 +10,7 @@
 
 #include "LabelBase.h"
 #include "Label.h"
+#include <object/Object.h>
 
 namespace label {
 
@@ -40,8 +41,10 @@ public:
 
 	virtual explicit operator std::string ( ) const;
 
-	static InitialStateLabel INITIAL_STATE;
-	static Label INITIAL_STATE_LABEL;
+	template < typename Base >
+	static inline typename std::enable_if <   std::is_integral < Base >::value, Base >::type instance ( );
+	template < typename Base >
+	static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( );
 
 	static const std::string & getXmlTagName() {
 		static std::string xmlTagName = "InitialStateLabel";
@@ -56,6 +59,31 @@ public:
 	virtual LabelBase * inc ( ) &&;
 };
 
+template < typename Base >
+inline typename std::enable_if < std::is_integral < Base >::value, Base >::type InitialStateLabel::instance ( ) {
+	return 0;
+}
+
+template < >
+inline std::string InitialStateLabel::instance < std::string > ( ) {
+	return std::string ( "initial" );
+}
+
+template < >
+inline InitialStateLabel InitialStateLabel::instance < InitialStateLabel > ( ) {
+	return InitialStateLabel ( );
+}
+
+template < >
+inline Label InitialStateLabel::instance < Label > ( ) {
+	return Label ( InitialStateLabel ( ) );
+}
+
+template < >
+inline alib::Object InitialStateLabel::instance < alib::Object > ( ) {
+	return alib::Object ( InitialStateLabel ( ) );
+}
+
 } /* namespace label */
 
 #endif /* INITIAL_STATE_LABEL_H_ */