diff --git a/alib2str/src/automaton/AutomatonFromStringLexer.cpp b/alib2str/src/automaton/AutomatonFromStringLexer.cpp
index 839fe6ec8f0c50a1fea5644119d289d2cc8bb752..8e1401147ebc72904dfc8fbda057c91f26e769ce 100644
--- a/alib2str/src/automaton/AutomatonFromStringLexer.cpp
+++ b/alib2str/src/automaton/AutomatonFromStringLexer.cpp
@@ -6,6 +6,8 @@
  */
 
 #include "AutomatonFromStringLexer.h"
+#include <exception/CommonException.h>
+#include <iterator>
 
 namespace automaton {
 
@@ -75,7 +77,7 @@ L0:
 		return token;
 	} else {
 		in.clear();
-		putback(in, std::move(token));
+		putback(in, token);
 		token.type = TokenType::ERROR;
 		return token;
 	}
@@ -92,19 +94,46 @@ L1:
 	} else {
 		in.clear ( );
 		in.unget ( );
-		putback(in, std::move(token));
+		putback(in, token);
 		token.type = TokenType::ERROR;
 		return token;
 	}
 }
 
-void AutomatonFromStringLexer::putback(std::istream& in, AutomatonFromStringLexer::Token token) {
+AutomatonFromStringLexer::Token AutomatonFromStringLexer::peek ( std::istream & in ) {
+	Token token = next ( in );
+	putback ( in, token );
+	return token;
+}
+
+void AutomatonFromStringLexer::putback ( std::istream& in, const std::string & data ) {
 	in.clear();
 
-	while(!token.raw.empty()) {
-		in.putback(token.raw.back());
-		token.raw.pop_back();
+	for ( char character : ext::make_reverse ( data ) )
+		in.putback ( character );
+}
+
+void AutomatonFromStringLexer::putback ( std::istream& in, const Token & token ) {
+	putback ( in, token.raw );
+}
+
+bool AutomatonFromStringLexer::test ( std::istream & in, const std::string & value ) {
+	if ( testAndConsume ( in, value ) ) {
+		in.clear ( );
+		putback ( in, value );
+		return true;
+	} else {
+		return false;
 	}
 }
 
+bool AutomatonFromStringLexer::testAndConsume ( std::istream & in, const std::string & value ) {
+	return ( bool ) ( in >> ext::string ( value ) );
+}
+
+void AutomatonFromStringLexer::consume ( std::istream & in, const std::string & value ) {
+	if ( ! testAndConsume ( in, value ) )
+		throw exception::CommonException ( "Can't consume " + value + " from input stream." );
+}
+
 } /* namespace automaton */
diff --git a/alib2str/src/automaton/AutomatonFromStringLexer.h b/alib2str/src/automaton/AutomatonFromStringLexer.h
index cca67001b485573fba355fb6c66a4e2785bee0cc..077480a67a50ebc75864871b29139da93b7e1f6c 100644
--- a/alib2str/src/automaton/AutomatonFromStringLexer.h
+++ b/alib2str/src/automaton/AutomatonFromStringLexer.h
@@ -36,8 +36,14 @@ public:
 		std::string raw;
 	};
 
-	static Token next(std::istream& input);
-	static void putback(std::istream&, Token token);
+	static Token next(std::istream & input);
+	static Token peek(std::istream & input);
+	static void putback ( std::istream&, const std::string & token);
+	static void putback ( std::istream&, const Token & token);
+
+	static bool test ( std::istream & input, const std::string & value );
+	static void consume ( std::istream & input, const std::string & value );
+	static bool testAndConsume ( std::istream & input, const std::string & value );
 };
 
 } /* namepsace automaton */
diff --git a/alib2str/src/automaton/string/FSM/DFA.h b/alib2str/src/automaton/string/FSM/DFA.h
index 145846aa13adc4facb184aa8e13a8157e89da5df..3bfae51c1d8e44d3ab0135485cbe0b4f67734b82 100644
--- a/alib2str/src/automaton/string/FSM/DFA.h
+++ b/alib2str/src/automaton/string/FSM/DFA.h
@@ -123,10 +123,7 @@ void stringApi < automaton::DFA < SymbolType, StateType > >::parseTransition(std
 
 template<class SymbolType, class StateType >
 bool stringApi < automaton::DFA < SymbolType, StateType > >::first ( std::istream & input ) {
-	automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next ( input );
-	bool res = token.type == automaton::AutomatonFromStringLexer::TokenType::DFA;
-	automaton::AutomatonFromStringLexer::putback ( input, token );
-	return res;
+	return automaton::AutomatonFromStringLexer::peek ( input ).type == automaton::AutomatonFromStringLexer::TokenType::DFA;
 }
 
 template<class SymbolType, class StateType >
diff --git a/alib2str/src/automaton/string/FSM/EpsilonNFA.h b/alib2str/src/automaton/string/FSM/EpsilonNFA.h
index 71e93d520ace8b39e777dc24a65bde6416ef5e8e..ae651b06258273e28ea30d19358c099ca69364fd 100644
--- a/alib2str/src/automaton/string/FSM/EpsilonNFA.h
+++ b/alib2str/src/automaton/string/FSM/EpsilonNFA.h
@@ -132,10 +132,7 @@ void stringApi < automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > >:
 
 template<class SymbolType, class EpsilonType, class StateType >
 bool stringApi < automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > >::first ( std::istream & input ) {
-	automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next ( input );
-	bool res = token.type == automaton::AutomatonFromStringLexer::TokenType::EPSILON_NFA;
-	automaton::AutomatonFromStringLexer::putback ( input, token );
-	return res;
+	return automaton::AutomatonFromStringLexer::peek ( input ).type == automaton::AutomatonFromStringLexer::TokenType::EPSILON_NFA;
 }
 
 template<class SymbolType, class EpsilonType, class StateType >
diff --git a/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h b/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h
index f1e6c1d895faa430a454d05fec7637ee2677aa78..d680cbf1f297695a1f8a1b581904e97780f6d9eb 100644
--- a/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h
+++ b/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h
@@ -104,10 +104,7 @@ void stringApi < automaton::MultiInitialStateNFA < SymbolType, StateType > >::pa
 
 template<class SymbolType, class StateType >
 bool stringApi < automaton::MultiInitialStateNFA < SymbolType, StateType > >::first ( std::istream & input ) {
-	automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next ( input );
-	bool res = token.type == automaton::AutomatonFromStringLexer::TokenType::MULTI_INITIAL_STATE_NFA;
-	automaton::AutomatonFromStringLexer::putback ( input, token );
-	return res;
+	return automaton::AutomatonFromStringLexer::peek ( input ).type == automaton::AutomatonFromStringLexer::TokenType::MULTI_INITIAL_STATE_NFA;
 }
 
 template<class SymbolType, class StateType >
diff --git a/alib2str/src/automaton/string/FSM/NFA.h b/alib2str/src/automaton/string/FSM/NFA.h
index f490f74fb0ae962947b57602b2433e7c9c0db36f..1934aae330619af1a6f0a6c261a2c7ac902ef42b 100644
--- a/alib2str/src/automaton/string/FSM/NFA.h
+++ b/alib2str/src/automaton/string/FSM/NFA.h
@@ -124,10 +124,7 @@ void stringApi < automaton::NFA < SymbolType, StateType > >::parseTransition(std
 
 template<class SymbolType, class StateType >
 bool stringApi < automaton::NFA < SymbolType, StateType > >::first ( std::istream & input ) {
-	automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next ( input );
-	bool res = token.type == automaton::AutomatonFromStringLexer::TokenType::NFA;
-	automaton::AutomatonFromStringLexer::putback ( input, token );
-	return res;
+	return automaton::AutomatonFromStringLexer::peek ( input ).type == automaton::AutomatonFromStringLexer::TokenType::NFA;
 }
 
 template<class SymbolType, class StateType >