diff --git a/alib2algo/src/regexp/convert/ToAutomaton.cpp b/alib2algo/src/regexp/convert/ToAutomaton.cpp
index 9bb07eb141806a5e9a260a8ab917dc559eb56a01..ba158c333f40dd6d7450b310ed547d4719d94218 100644
--- a/alib2algo/src/regexp/convert/ToAutomaton.cpp
+++ b/alib2algo/src/regexp/convert/ToAutomaton.cpp
@@ -12,8 +12,8 @@ namespace regexp {
 
 namespace convert {
 
-auto ToAutomatonFormalRegExp = registration::AbstractRegister < ToAutomaton, automaton::NFA < >, const regexp::FormalRegExp < > & > ( ToAutomaton::convert );
-auto ToAutomatonUnboundedRegExp = registration::AbstractRegister < ToAutomaton, automaton::NFA < >, const regexp::UnboundedRegExp < > & > ( ToAutomaton::convert );
+auto ToAutomatonFormalRegExp = registration::AbstractRegister < ToAutomaton, automaton::NFA < DefaultSymbolType, ext::pair < DefaultSymbolType, unsigned > >, const regexp::FormalRegExp < > & > ( ToAutomaton::convert );
+auto ToAutomatonUnboundedRegExp = registration::AbstractRegister < ToAutomaton, automaton::NFA < DefaultSymbolType, ext::pair < DefaultSymbolType, unsigned > >, const regexp::UnboundedRegExp < > & > ( ToAutomaton::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/convert/ToAutomaton.h b/alib2algo/src/regexp/convert/ToAutomaton.h
index 5e226063be9be59a116fd732211133bb93be4214..ea03a2028e894d336da2abb6e27f4b45a936dc4b 100644
--- a/alib2algo/src/regexp/convert/ToAutomaton.h
+++ b/alib2algo/src/regexp/convert/ToAutomaton.h
@@ -24,20 +24,20 @@ public:
 	 * @return FSM equivalent to original regular expression.
 	 */
 	template < class SymbolType >
-	static automaton::NFA < > convert(const regexp::FormalRegExp < SymbolType > & regexp);
+	static automaton::NFA < SymbolType, ext::pair < SymbolType, unsigned > > convert ( const regexp::FormalRegExp < SymbolType > & regexp );
 	template < class SymbolType >
-	static automaton::NFA < > convert(const regexp::UnboundedRegExp < SymbolType > & regexp);
+	static automaton::NFA < SymbolType, ext::pair < SymbolType, unsigned > > convert ( const regexp::UnboundedRegExp < SymbolType > & regexp );
 
 };
 
 template < class SymbolType >
-automaton::NFA < > ToAutomaton::convert(const regexp::FormalRegExp < SymbolType > & regexp) {
-	return ToAutomatonGlushkov::convert(regexp);
+automaton::NFA < SymbolType, ext::pair < SymbolType, unsigned > > ToAutomaton::convert ( const regexp::FormalRegExp < SymbolType > & regexp ) {
+	return ToAutomatonGlushkov::convert ( regexp );
 }
 
 template < class SymbolType >
-automaton::NFA < > ToAutomaton::convert(const regexp::UnboundedRegExp < SymbolType > & regexp) {
-	return ToAutomatonGlushkov::convert(regexp);
+automaton::NFA < SymbolType, ext::pair < SymbolType, unsigned > > ToAutomaton::convert ( const regexp::UnboundedRegExp < SymbolType > & regexp ) {
+	return ToAutomatonGlushkov::convert ( regexp );
 }
 
 } /* namespace convert */
diff --git a/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp b/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp
index 6c7c9262fc44a12c059cb168cbf7573728d4eb3a..8e8b4d6b2838531d7e161e4c051179240b2e876a 100644
--- a/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp
+++ b/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp
@@ -6,83 +6,14 @@
  */
 
 #include "ToAutomatonGlushkov.h"
-
-#include <common/DefaultStatesPairType.h>
-
-#include <global/GlobalData.h>
-
-#include "../glushkov/GlushkovFirst.h"
-#include "../glushkov/GlushkovFollow.h"
-#include "../glushkov/GlushkovIndexate.h"
-#include "../glushkov/GlushkovLast.h"
-
-#include <regexp/properties/RegExpEpsilon.h>
-#include <exception/CommonException.h>
 #include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
 namespace convert {
 
-automaton::NFA < > ToAutomatonGlushkov::convert ( const regexp::UnboundedRegExp < > & regexp ) {
-	DefaultStateType q0 ( DefaultStatesPairType ( ext::make_pair ( DefaultStateType ( 'q' ), DefaultStateType ( 0 ) ) ) );
-	automaton::NFA < > automaton ( q0 );
-
-	 // step 1
-	automaton.setInputAlphabet ( regexp.getAlphabet ( ) );
-
-	regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, int > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
-
-	 // steps 2, 3, 4
-	const ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > first = regexp::GlushkovFirst::first ( indexedRegExp );
-	const ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > last = regexp::GlushkovLast::last ( indexedRegExp );
-
-	// \e in q0 check is in step 7
-
-	 // step 5
-	for ( const ext::pair < DefaultSymbolType, int > & symbol : indexedRegExp.getAlphabet ( ) )
-		automaton.addState ( DefaultStateType ( container::ObjectsPair < DefaultSymbolType, int > ( symbol ) ) );
-
-	 // step 6
-	for ( const regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > & symbol : first )
-		automaton.addTransition ( q0, symbol.getSymbol ( ).first, DefaultStateType ( container::ObjectsPair < DefaultSymbolType, int > ( symbol.getSymbol ( ) ) ) );
-
-	for ( const ext::pair < DefaultSymbolType, int > & x : indexedRegExp.getAlphabet ( ) )
-		for ( const auto & f : regexp::GlushkovFollow::follow ( indexedRegExp, UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > ( x ) ) ) {
-			const ext::pair < DefaultSymbolType, int > & p = x;
-			const ext::pair < DefaultSymbolType, int > & q = f.getSymbol ( );
-
-			automaton.addTransition ( DefaultStateType ( container::ObjectsPair < DefaultSymbolType, int > ( p ) ), q.first, DefaultStateType ( container::ObjectsPair < DefaultSymbolType, int > ( q ) ) );
-		}
-
-	// step 7
-
-	for ( const regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > & symbol : last )
-		automaton.addFinalState ( DefaultStateType ( container::ObjectsPair < DefaultSymbolType, int > ( symbol.getSymbol ( ) ) ) );
-
-	if ( regexp::properties::RegExpEpsilon::languageContainsEpsilon ( regexp ) )
-		automaton.addFinalState ( q0 );
-
-	if ( common::GlobalData::verbose ) {
-		common::Streams::log << "First:" << first << std::endl;
-		common::Streams::log << "Last: " << last << std::endl;
-
-		if ( regexp::properties::RegExpEpsilon::languageContainsEpsilon ( regexp ) )
-			common::Streams::log << "      q0 because #E in L(RE)" << std::endl;
-
-		for ( const ext::pair < DefaultSymbolType, int > & x : indexedRegExp.getAlphabet ( ) )
-			common::Streams::log << "Follow(" << x << ") = " << regexp::GlushkovFollow::follow ( indexedRegExp, UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > ( x ) ) << std::endl;
-	}
-
-	return automaton;
-}
-
-automaton::NFA < > ToAutomatonGlushkov::convert ( const regexp::FormalRegExp < > & regexp ) {
-	return ToAutomatonGlushkov::convert ( regexp::UnboundedRegExp < > ( regexp ) );
-}
-
-auto ToAutomatonGlushkovUnboundedRegExp = registration::AbstractRegister < ToAutomatonGlushkov, automaton::NFA < >, const regexp::UnboundedRegExp < > & > ( ToAutomatonGlushkov::convert );
-auto ToAutomatonGlushkovFormalRegExp = registration::AbstractRegister < ToAutomatonGlushkov, automaton::NFA < >, const regexp::FormalRegExp < > & > ( ToAutomatonGlushkov::convert );
+auto ToAutomatonGlushkovUnboundedRegExp = registration::AbstractRegister < ToAutomatonGlushkov, automaton::NFA < DefaultSymbolType, ext::pair < DefaultSymbolType, unsigned > >, const regexp::UnboundedRegExp < > & > ( ToAutomatonGlushkov::convert );
+auto ToAutomatonGlushkovFormalRegExp = registration::AbstractRegister < ToAutomatonGlushkov, automaton::NFA < DefaultSymbolType, ext::pair < DefaultSymbolType, unsigned > >, const regexp::FormalRegExp < > & > ( ToAutomatonGlushkov::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/convert/ToAutomatonGlushkov.h b/alib2algo/src/regexp/convert/ToAutomatonGlushkov.h
index 76a692d5fbdd2fc7eac8121f52bbb4299edf319b..51950b4183480134a80e428295a3153eee0947d7 100644
--- a/alib2algo/src/regexp/convert/ToAutomatonGlushkov.h
+++ b/alib2algo/src/regexp/convert/ToAutomatonGlushkov.h
@@ -8,10 +8,23 @@
 #ifndef TO_AUTOMATON_GLUSHKOV_H_
 #define TO_AUTOMATON_GLUSHKOV_H_
 
-#include <automaton/FSM/NFA.h>
 #include <regexp/formal/FormalRegExp.h>
 #include <regexp/unbounded/UnboundedRegExp.h>
 
+#include <automaton/FSM/NFA.h>
+
+#include <global/GlobalData.h>
+
+#include "../glushkov/GlushkovFirst.h"
+#include "../glushkov/GlushkovFollow.h"
+#include "../glushkov/GlushkovIndexate.h"
+#include "../glushkov/GlushkovLast.h"
+
+#include <regexp/properties/RegExpEpsilon.h>
+#include <exception/CommonException.h>
+
+#include <label/InitialStateLabel.h>
+
 namespace regexp {
 
 namespace convert {
@@ -27,11 +40,76 @@ public:
 	 * @param re Original regular expression.
 	 * @return NFA equivalent to original regular expression.
 	 */
-	static automaton::NFA < > convert(const regexp::UnboundedRegExp < > & re);
-	static automaton::NFA < > convert(const regexp::FormalRegExp < > & re);
+	template < class SymbolType >
+	static automaton::NFA < SymbolType, ext::pair < SymbolType, unsigned > > convert ( const regexp::UnboundedRegExp < SymbolType > & regexp );
+
+	/**
+	 * \overload
+	 */
+	template < class SymbolType >
+	static automaton::NFA < SymbolType, ext::pair < SymbolType, unsigned > > convert ( const regexp::FormalRegExp < SymbolType > & regexp );
 
 };
 
+template < class SymbolType >
+automaton::NFA < SymbolType, ext::pair < SymbolType, unsigned > > ToAutomatonGlushkov::convert ( const regexp::UnboundedRegExp < SymbolType > & regexp ) {
+	ext::pair < SymbolType, unsigned > q0 ( label::InitialStateLabel::instance < SymbolType > ( ), 0 );
+	automaton::NFA < SymbolType, ext::pair < SymbolType, unsigned > > automaton ( q0 );
+
+	 // step 1
+	automaton.setInputAlphabet ( regexp.getAlphabet ( ) );
+
+	regexp::UnboundedRegExp < ext::pair < SymbolType, unsigned > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
+
+	 // steps 2, 3, 4
+	const ext::set < regexp::UnboundedRegExpSymbol < ext::pair < SymbolType, unsigned > > > first = regexp::GlushkovFirst::first ( indexedRegExp );
+	const ext::set < regexp::UnboundedRegExpSymbol < ext::pair < SymbolType, unsigned > > > last = regexp::GlushkovLast::last ( indexedRegExp );
+
+	// \e in q0 check is in step 7
+
+	 // step 5
+	for ( const ext::pair < SymbolType, unsigned > & symbol : indexedRegExp.getAlphabet ( ) )
+		automaton.addState ( symbol );
+
+	 // step 6
+	for ( const regexp::UnboundedRegExpSymbol < ext::pair < SymbolType, unsigned > > & symbol : first )
+		automaton.addTransition ( q0, symbol.getSymbol ( ).first, symbol.getSymbol ( ) );
+
+	for ( const ext::pair < SymbolType, unsigned > & x : indexedRegExp.getAlphabet ( ) )
+		for ( const auto & f : regexp::GlushkovFollow::follow ( indexedRegExp, UnboundedRegExpSymbol < ext::pair < SymbolType, unsigned > > ( x ) ) ) {
+			const ext::pair < SymbolType, unsigned > & p = x;
+			const ext::pair < SymbolType, unsigned > & q = f.getSymbol ( );
+
+			automaton.addTransition ( p, q.first, q );
+		}
+
+	// step 7
+
+	for ( const regexp::UnboundedRegExpSymbol < ext::pair < SymbolType, unsigned > > & symbol : last )
+		automaton.addFinalState ( symbol.getSymbol ( ) );
+
+	if ( regexp::properties::RegExpEpsilon::languageContainsEpsilon ( regexp ) )
+		automaton.addFinalState ( q0 );
+
+	if ( common::GlobalData::verbose ) {
+		common::Streams::log << "First:" << first << std::endl;
+		common::Streams::log << "Last: " << last << std::endl;
+
+		if ( regexp::properties::RegExpEpsilon::languageContainsEpsilon ( regexp ) )
+			common::Streams::log << "      q0 because #E in L(RE)" << std::endl;
+
+		for ( const ext::pair < SymbolType, unsigned > & x : indexedRegExp.getAlphabet ( ) )
+			common::Streams::log << "Follow(" << x << ") = " << regexp::GlushkovFollow::follow ( indexedRegExp, UnboundedRegExpSymbol < ext::pair < SymbolType, unsigned > > ( x ) ) << std::endl;
+	}
+
+	return automaton;
+}
+
+template < class SymbolType >
+automaton::NFA < SymbolType, ext::pair < SymbolType, unsigned > > ToAutomatonGlushkov::convert ( const regexp::FormalRegExp < SymbolType > & regexp ) {
+	return ToAutomatonGlushkov::convert ( regexp::UnboundedRegExp < > ( regexp ) );
+}
+
 } /* namespace convert */
 
 } /* namespace regexp */
diff --git a/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp b/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp
index 348121a9a19c3cef8b8bb34c38187aa4dbb20841..5b1db35cb0758ae5d289b0a0bcd17281ca448339 100644
--- a/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp
+++ b/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp
@@ -33,28 +33,28 @@ grammar::RightRG < > ToGrammarRightRGGlushkov::convert ( const regexp::Unbounded
 	 // step 1
 	grammar.setTerminalAlphabet ( regexp.getAlphabet ( ) );
 
-	regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, int > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
+	regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, unsigned > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
 
 	 // steps 2, 3, 4
-	const ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > first = regexp::GlushkovFirst::first ( indexedRegExp );
-	const ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > last = regexp::GlushkovLast::last ( indexedRegExp );
+	const ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > first = regexp::GlushkovFirst::first ( indexedRegExp );
+	const ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > last = regexp::GlushkovLast::last ( indexedRegExp );
 
 	// \e in q0 check is in step 7
 
 	 // step 5
-	for ( const ext::pair < DefaultSymbolType, int > & symbol : indexedRegExp.getAlphabet ( ) )
-		grammar.addNonterminalSymbol ( DefaultSymbolType ( container::ObjectsPair < DefaultSymbolType, int > ( symbol ) ) );
+	for ( const ext::pair < DefaultSymbolType, unsigned > & symbol : indexedRegExp.getAlphabet ( ) )
+		grammar.addNonterminalSymbol ( DefaultSymbolType ( container::ObjectsPair < DefaultSymbolType, unsigned > ( symbol ) ) );
 
 	 // step 6
-	for ( const regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > & symbol : first )
-		grammar.addRule ( S, ext::make_pair ( symbol.getSymbol ( ).first, DefaultSymbolType ( container::ObjectsPair < DefaultSymbolType, int > ( symbol.getSymbol ( ) ) ) ) );
+	for ( const regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > & symbol : first )
+		grammar.addRule ( S, ext::make_pair ( symbol.getSymbol ( ).first, DefaultSymbolType ( container::ObjectsPair < DefaultSymbolType, unsigned > ( symbol.getSymbol ( ) ) ) ) );
 
-	for ( const ext::pair < DefaultSymbolType, int > & x : indexedRegExp.getAlphabet ( ) )
-		for ( const regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > & f : regexp::GlushkovFollow::follow ( indexedRegExp, UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > ( x ) ) ) {
-			const ext::pair < DefaultSymbolType, int > & a = x;
-			const ext::pair < DefaultSymbolType, int > & b = f.getSymbol ( );
+	for ( const ext::pair < DefaultSymbolType, unsigned > & x : indexedRegExp.getAlphabet ( ) )
+		for ( const regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > & f : regexp::GlushkovFollow::follow ( indexedRegExp, UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > ( x ) ) ) {
+			const ext::pair < DefaultSymbolType, unsigned > & a = x;
+			const ext::pair < DefaultSymbolType, unsigned > & b = f.getSymbol ( );
 
-			grammar.addRule ( DefaultSymbolType ( container::ObjectsPair < DefaultSymbolType, int > ( a ) ), ext::make_pair ( b.first, DefaultSymbolType ( container::ObjectsPair < DefaultSymbolType, int > ( b ) ) ) );
+			grammar.addRule ( DefaultSymbolType ( container::ObjectsPair < DefaultSymbolType, unsigned > ( a ) ), ext::make_pair ( b.first, DefaultSymbolType ( container::ObjectsPair < DefaultSymbolType, unsigned > ( b ) ) ) );
 		}
 
 	// step 7
@@ -66,11 +66,11 @@ grammar::RightRG < > ToGrammarRightRGGlushkov::convert ( const regexp::Unbounded
 	 */
 	for ( const auto & rule : grammar.getRawRules ( ) ) {
 		for ( const auto & rhs : rule.second )
-			for ( const regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > & symbol : last ) {
+			for ( const regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > & symbol : last ) {
 
-				const ext::pair < DefaultSymbolType, int > & a = symbol.getSymbol ( );
+				const ext::pair < DefaultSymbolType, unsigned > & a = symbol.getSymbol ( );
 
-				if ( std::find ( rhs.begin ( ), rhs.end ( ), DefaultSymbolType ( container::ObjectsPair < DefaultSymbolType, int > ( a ) ) ) != rhs.end ( ) )
+				if ( std::find ( rhs.begin ( ), rhs.end ( ), DefaultSymbolType ( container::ObjectsPair < DefaultSymbolType, unsigned > ( a ) ) ) != rhs.end ( ) )
 					grammar.addRule ( rule.first, rhs.at ( 0 ) );
 			}
 
diff --git a/alib2algo/src/regexp/glushkov/GlushkovIndexate.h b/alib2algo/src/regexp/glushkov/GlushkovIndexate.h
index 9659d1dab1ad7e28997ad55983d5ff8a12b98830..b800ff6f18cdad19f3deb28d6f20c2a08a5b7f1c 100644
--- a/alib2algo/src/regexp/glushkov/GlushkovIndexate.h
+++ b/alib2algo/src/regexp/glushkov/GlushkovIndexate.h
@@ -31,65 +31,65 @@ public:
 	 * @return UnboundedRegExp with indexed elements
 	 */
 	template < class SymbolType >
-	static regexp::UnboundedRegExp < ext::pair < SymbolType, int > > index ( const regexp::UnboundedRegExp < SymbolType > & re );
+	static regexp::UnboundedRegExp < ext::pair < SymbolType, unsigned > > index ( const regexp::UnboundedRegExp < SymbolType > & re );
 
 	template < class SymbolType >
 	class Unbounded {
 	public:
-		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > visit(const regexp::UnboundedRegExpAlternation < SymbolType > & alternation, int & i);
-		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > visit(const regexp::UnboundedRegExpConcatenation < SymbolType > & concatenation, int & i);
-		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > visit(const regexp::UnboundedRegExpIteration < SymbolType > & iteration, int & i);
-		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > visit(const regexp::UnboundedRegExpSymbol < SymbolType > & symbol, int & i);
-		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > visit(const regexp::UnboundedRegExpEpsilon < SymbolType > & epsilon, int & i);
-		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > visit(const regexp::UnboundedRegExpEmpty < SymbolType > & empty, int & i);
+		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > visit(const regexp::UnboundedRegExpAlternation < SymbolType > & alternation, unsigned & i);
+		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > visit(const regexp::UnboundedRegExpConcatenation < SymbolType > & concatenation, unsigned & i);
+		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > visit(const regexp::UnboundedRegExpIteration < SymbolType > & iteration, unsigned & i);
+		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > visit(const regexp::UnboundedRegExpSymbol < SymbolType > & symbol, unsigned & i);
+		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > visit(const regexp::UnboundedRegExpEpsilon < SymbolType > & epsilon, unsigned & i);
+		static ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > visit(const regexp::UnboundedRegExpEmpty < SymbolType > & empty, unsigned & i);
 	};
 };
 
 template < class SymbolType >
-UnboundedRegExp < ext::pair < SymbolType, int > > GlushkovIndexate::index ( const regexp::UnboundedRegExp < SymbolType > & re ) {
-	int i = 1;
+UnboundedRegExp < ext::pair < SymbolType, unsigned > > GlushkovIndexate::index ( const regexp::UnboundedRegExp < SymbolType > & re ) {
+	unsigned i = 1;
 
-	return UnboundedRegExp < ext::pair < SymbolType, int > > ( regexp::UnboundedRegExpStructure < ext::pair < SymbolType, int > > ( re.getRegExp ( ).getStructure ( ).template accept < ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > >, GlushkovIndexate::Unbounded < SymbolType > > ( i ) ) );
+	return UnboundedRegExp < ext::pair < SymbolType, unsigned > > ( regexp::UnboundedRegExpStructure < ext::pair < SymbolType, unsigned > > ( re.getRegExp ( ).getStructure ( ).template accept < ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > >, GlushkovIndexate::Unbounded < SymbolType > > ( i ) ) );
 }
 
 template < class SymbolType >
-ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpAlternation < SymbolType > & alternation, int & i) {
-	UnboundedRegExpAlternation < ext::pair < SymbolType, int > > alt;
+ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpAlternation < SymbolType > & alternation, unsigned & i) {
+	UnboundedRegExpAlternation < ext::pair < SymbolType, unsigned > > alt;
 
 	for ( const UnboundedRegExpElement < SymbolType > & element : alternation.getElements ( ) )
-		alt.appendElement ( element.template accept < ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > >, GlushkovIndexate::Unbounded < SymbolType > > ( i ) );
+		alt.appendElement ( element.template accept < ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > >, GlushkovIndexate::Unbounded < SymbolType > > ( i ) );
 
-	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, int > > > ( std::move ( alt ) );
+	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > ( std::move ( alt ) );
 }
 
 template < class SymbolType >
-ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpConcatenation < SymbolType > & concatenation, int & i) {
-	UnboundedRegExpConcatenation < ext::pair < SymbolType, int > > con;
+ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpConcatenation < SymbolType > & concatenation, unsigned & i) {
+	UnboundedRegExpConcatenation < ext::pair < SymbolType, unsigned > > con;
 
 	for ( const UnboundedRegExpElement < SymbolType > & element : concatenation.getElements ( ) )
-		con.appendElement ( element.template accept < ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > >, GlushkovIndexate::Unbounded < SymbolType > > ( i ) );
+		con.appendElement ( element.template accept < ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > >, GlushkovIndexate::Unbounded < SymbolType > > ( i ) );
 
-	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, int > > > ( std::move ( con ) );
+	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > ( std::move ( con ) );
 }
 
 template < class SymbolType >
-ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpIteration < SymbolType > & iteration, int & i) {
-	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, int > > > ( UnboundedRegExpIteration < ext::pair < SymbolType, int > > ( iteration.getElement ( ).template accept < ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < DefaultSymbolType, int > > >, GlushkovIndexate::Unbounded < SymbolType > > ( i ) ) );
+ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpIteration < SymbolType > & iteration, unsigned & i) {
+	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > ( UnboundedRegExpIteration < ext::pair < SymbolType, unsigned > > ( iteration.getElement ( ).template accept < ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < DefaultSymbolType, unsigned > > >, GlushkovIndexate::Unbounded < SymbolType > > ( i ) ) );
 }
 
 template < class SymbolType >
-ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpSymbol < SymbolType > & symbol, int & i) {
-	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, int > > > ( UnboundedRegExpSymbol < ext::pair < SymbolType, int > > ( ext::make_pair ( symbol.getSymbol ( ), i++ ) ) );
+ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpSymbol < SymbolType > & symbol, unsigned & i) {
+	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > ( UnboundedRegExpSymbol < ext::pair < SymbolType, unsigned > > ( ext::make_pair ( symbol.getSymbol ( ), i++ ) ) );
 }
 
 template < class SymbolType >
-ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpEpsilon < SymbolType > &, int &) {
-	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, int > > > ( UnboundedRegExpEpsilon < ext::pair < SymbolType, int > > ( ) );
+ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpEpsilon < SymbolType > &, unsigned &) {
+	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > ( UnboundedRegExpEpsilon < ext::pair < SymbolType, unsigned > > ( ) );
 }
 
 template < class SymbolType >
-ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, int > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpEmpty < SymbolType > &, int &) {
-	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, int > > > ( UnboundedRegExpEmpty < ext::pair < SymbolType, int > > ( ) );
+ext::ptr_value < regexp::UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Unbounded < SymbolType >::visit(const regexp::UnboundedRegExpEmpty < SymbolType > &, unsigned &) {
+	return ext::ptr_value < UnboundedRegExpElement < ext::pair < SymbolType, unsigned > > > ( UnboundedRegExpEmpty < ext::pair < SymbolType, unsigned > > ( ) );
 }
 
 } /* namespace regexp */
diff --git a/alib2algo/test-src/regexp/RegExpTest.cpp b/alib2algo/test-src/regexp/RegExpTest.cpp
index 5e888267eeaee69fc24f8ebc858838937ceacc8a..bc4b8eae43245845f013cbea5a22a6e440161739 100644
--- a/alib2algo/test-src/regexp/RegExpTest.cpp
+++ b/alib2algo/test-src/regexp/RegExpTest.cpp
@@ -28,18 +28,18 @@ void RegExpTest::testFirst ( ) {
 	{
 		std::string input = "#E* #0*";
 		regexp::UnboundedRegExp < > regexp = factory::StringDataFactory::fromString ( input );
-		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, int > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
+		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, unsigned > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
 
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > first = regexp::GlushkovFirst::first ( indexedRegExp );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > first = regexp::GlushkovFirst::first ( indexedRegExp );
 
 		CPPUNIT_ASSERT ( first.size ( ) == 0 );
 	}
 	{
 		std::string input = "#E* a";
 		regexp::UnboundedRegExp < > regexp = factory::StringDataFactory::fromString ( input );
-		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, int > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
+		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, unsigned > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
 
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > first = regexp::GlushkovFirst::first ( indexedRegExp );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > first = regexp::GlushkovFirst::first ( indexedRegExp );
 
 		CPPUNIT_ASSERT ( first.size ( ) == 1 );
 	}
@@ -49,18 +49,18 @@ void RegExpTest::testLast ( ) {
 	{
 		std::string input = "a+a";
 		regexp::UnboundedRegExp < > regexp = factory::StringDataFactory::fromString ( input );
-		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, int > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
+		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, unsigned > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
 
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > last = regexp::GlushkovLast::last ( indexedRegExp );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > last = regexp::GlushkovLast::last ( indexedRegExp );
 
 		CPPUNIT_ASSERT ( last.size ( ) == 2 );
 	}
 	{
 		std::string input = "(a+a)b";
 		regexp::UnboundedRegExp < > regexp = factory::StringDataFactory::fromString ( input );
-		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, int > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
+		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, unsigned > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
 
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > last = regexp::GlushkovLast::last ( indexedRegExp );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > last = regexp::GlushkovLast::last ( indexedRegExp );
 
 		std::cout << last << std::endl;
 		CPPUNIT_ASSERT ( last.size ( ) == 1 );
@@ -71,52 +71,52 @@ void RegExpTest::testFollow ( ) {
 	{
 		std::string input = "(a+a)b";
 		regexp::UnboundedRegExp < > regexp = factory::StringDataFactory::fromString ( input );
-		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, int > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
+		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, unsigned > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
 
 		auto symbolsIter = indexedRegExp.getAlphabet ( ).begin ( );
 
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > follow1 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > ( * symbolsIter ) );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > follow1 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > ( * symbolsIter ) );
 
 		CPPUNIT_ASSERT ( follow1.size ( ) == 1 );
 
 		symbolsIter++;
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > follow2 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > ( * symbolsIter ) );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > follow2 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > ( * symbolsIter ) );
 
 		CPPUNIT_ASSERT ( follow2.size ( ) == 1 );
 
 		symbolsIter++;
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > follow3 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > ( * symbolsIter ) );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > follow3 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > ( * symbolsIter ) );
 
 		CPPUNIT_ASSERT ( follow3.size ( ) == 0 );
 	}
 	{
 		std::string input = "a+a* (b+a)* c";
 		regexp::UnboundedRegExp < > regexp = factory::StringDataFactory::fromString ( input );
-		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, int > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
+		regexp::UnboundedRegExp < ext::pair < DefaultSymbolType, unsigned > > indexedRegExp = regexp::GlushkovIndexate::index ( regexp );
 
 		auto symbolsIter = indexedRegExp.getAlphabet ( ).begin ( );
 
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > follow1 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > ( * symbolsIter ) );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > follow1 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > ( * symbolsIter ) );
 
 		CPPUNIT_ASSERT ( follow1.size ( ) == 0 );
 
 		symbolsIter++;
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > follow2 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > ( * symbolsIter ) );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > follow2 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > ( * symbolsIter ) );
 
 		CPPUNIT_ASSERT ( follow2.size ( ) == 4 );
 
 		symbolsIter++;
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > follow3 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > ( * symbolsIter ) );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > follow3 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > ( * symbolsIter ) );
 
 		CPPUNIT_ASSERT ( follow3.size ( ) == 3 );
 
 		symbolsIter++;
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > follow4 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > ( * symbolsIter ) );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > follow4 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > ( * symbolsIter ) );
 
 		CPPUNIT_ASSERT ( follow4.size ( ) == 3 );
 
 		symbolsIter++;
-		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > > follow5 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, int > > ( * symbolsIter ) );
+		ext::set < regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > > follow5 = regexp::GlushkovFollow::follow ( indexedRegExp, regexp::UnboundedRegExpSymbol < ext::pair < DefaultSymbolType, unsigned > > ( * symbolsIter ) );
 
 		CPPUNIT_ASSERT ( follow5.size ( ) == 0 );
 	}
diff --git a/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp b/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
index 507c9d787b7779ebb1d2e0e84181de07ecfd1295..0ba7685992762086ec4db005964fc970cf2faa2b 100644
--- a/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
+++ b/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
@@ -51,17 +51,17 @@ void re2faTest::testGlushkov() {
 	std::string input = "a+a*b*";
 	regexp::UnboundedRegExp < > regexp1 = factory::StringDataFactory::fromString ( input );
 
-	automaton::NFA < > nfa1 = regexp::convert::ToAutomatonGlushkov::convert ( regexp1 );
+	automaton::NFA < DefaultSymbolType, ext::pair < DefaultSymbolType, unsigned > > nfa1 = regexp::convert::ToAutomatonGlushkov::convert ( regexp1 );
 
 	regexp::UnboundedRegExp < > regexp2 = automaton::convert::ToRegExpAlgebraic::convert ( nfa1 );
 
 	std::cout << regexp1 << std::endl;
 	std::cout << regexp2 << std::endl;
 
-	automaton::NFA < > nfa2 = regexp::convert::ToAutomatonGlushkov::convert(regexp2);
+	automaton::NFA < DefaultSymbolType, ext::pair < DefaultSymbolType, unsigned > > nfa2 = regexp::convert::ToAutomatonGlushkov::convert(regexp2);
 
-	automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > > dfa1 = automaton::determinize::Determinize::determinize(nfa1);
-	automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > > dfa2 = automaton::determinize::Determinize::determinize(nfa2);
+	automaton::DFA < DefaultSymbolType, ext::set < ext::pair < DefaultSymbolType, unsigned > > > dfa1 = automaton::determinize::Determinize::determinize(nfa1);
+	automaton::DFA < DefaultSymbolType, ext::set < ext::pair < DefaultSymbolType, unsigned > > > dfa2 = automaton::determinize::Determinize::determinize(nfa2);
 
 	automaton::DFA< DefaultSymbolType, unsigned > mdfa1 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa1));
 	automaton::DFA< DefaultSymbolType, unsigned > mdfa2 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa2));