diff --git a/aconversions2/src/ConversionHandler.cpp b/aconversions2/src/ConversionHandler.cpp
index 26cee600864052786d13011fa8a68cf9b9945772..0e90d271fbfc9f7f94443ca38f0d815b004b3ffc 100644
--- a/aconversions2/src/ConversionHandler.cpp
+++ b/aconversions2/src/ConversionHandler.cpp
@@ -352,7 +352,7 @@ void ConversionHandler::convertRTEtoPDA ( void ) {
 		break;
 	}
 	case GLUSHKOV_RTE_V3: {
-		automaton::NPDA < > automaton = rte::convert::ToPostfixPushdownAutomatonGlushkovV3::convert ( rte );
+		automaton::Automaton automaton = rte::convert::ToPostfixPushdownAutomatonGlushkovV3::convert ( rte );
 
 		measurements::end ( );
 		measurements::start ( "Output write", measurements::Type::AUXILIARY );
diff --git a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovV3.cpp b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovV3.cpp
index 6dcaeb5deb957c238c7f850d9ebb75933067bb30..86dd2065403a09ed2d0d114a78fa9473b5866bfb 100644
--- a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovV3.cpp
+++ b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovV3.cpp
@@ -7,17 +7,16 @@
 
 #include "ToPostfixPushdownAutomatonGlushkovV3.h"
 
-#include "alphabet/BottomOfTheStackSymbol.h"
-#include "alphabet/EndSymbol.h"
-
 #include <automaton/Automaton.h>
+#include <alphabet/BottomOfTheStackSymbol.h>
+#include <alphabet/EndSymbol.h>
 
-#include "global/GlobalData.h"
+#include <global/GlobalData.h>
+#include <registration/AlgoRegistration.hpp>
 
 #include "../glushkov/GlushkovFollowV3.h"
 #include "../glushkov/GlushkovIndexate.h"
 #include "../glushkov/GlushkovFirst.h"
-#include <registration/AlgoRegistration.hpp>
 
 namespace rte {
 
@@ -27,13 +26,6 @@ automaton::Automaton ToPostfixPushdownAutomatonGlushkovV3::convert ( const rte::
 	return dispatch ( rte.getData ( ) );
 }
 
-/*
-std::vector < DefaultSymbolType > phi ( const std::vector < std::ranked_symbol < > > & follow ) {
-	return std::transform < DefaultSymbolType > ( follow, []( const std::ranked_symbol < > & symbol ) { return DefaultSymbolType ( alphabet::RankedSymbol < > ( symbol ) ); } );
-}
-
-*/
-
 template < class SymbolType, class RankType >
 bool ToPostfixPushdownAutomatonGlushkovV3::isSubstSymbolPresent ( const std::set < std::ranked_symbol < SymbolType, RankType > > & container, const TAlphabet < SymbolType, RankType > & substAlphabet ) {
 	std::vector < std::ranked_symbol < > > intersection;
@@ -75,8 +67,8 @@ ToPostfixPushdownAutomatonGlushkovV3::convert ( const rte::FormalRTE < > & rte )
 	DefaultStateType q = DefaultStateType ( 'q' );
 	DefaultStateType f = DefaultStateType ( 'f' );
 
-	auto bots = std::variant < alphabet::BottomOfTheStackSymbol, std::set < std::ranked_symbol < SymbolType, RankType > > >::template from < alphabet::BottomOfTheStackSymbol > ( );
-	automaton::NPDA < SymbolType, DefaultEpsilonType, std::variant < alphabet::BottomOfTheStackSymbol, std::set < std::ranked_symbol < SymbolType, RankType > > >, DefaultStateType > automaton ( q, bots );
+	auto BotS = std::variant < alphabet::BottomOfTheStackSymbol, std::set < std::ranked_symbol < SymbolType, RankType > > >::template from < alphabet::BottomOfTheStackSymbol > ( );
+	automaton::NPDA < SymbolType, DefaultEpsilonType, std::variant < alphabet::BottomOfTheStackSymbol, std::set < std::ranked_symbol < SymbolType, RankType > > >, DefaultStateType > automaton ( q, BotS );
 
 	automaton.addState ( f );
 	automaton.addFinalState ( f );
@@ -86,13 +78,22 @@ ToPostfixPushdownAutomatonGlushkovV3::convert ( const rte::FormalRTE < > & rte )
 
 	automaton.addInputSymbol ( alphabet::EndSymbol::instance < DefaultSymbolType > ( ) );
 
-	 // step 4; create pushdown store alphabet; it consists of elements of indexed RTE alphabet and BotS symbol
-	/*
+	// step 4; create pushdown store alphabet;
+
+	// simple
 	for ( const std::ranked_symbol < > & symb : indexedRTE.getAlphabet ( ) )
-		automaton.addPushdownStoreSymbol ( DefaultSymbolType ( alphabet::RankedSymbol < > ( symb ) ) );
-	*/
+		automaton.addPushdownStoreSymbol ( std::variant < alphabet::BottomOfTheStackSymbol, std::set < std::ranked_symbol < SymbolType, RankType > > > ( { symb } ) );
 
-	 /* DEBUG */
+	// complex
+	for ( const std::pair < const std::ranked_symbol < >, std::set < GlushkovFollowV3::TFollowTuple < SymbolType, RankType > > >& kv : followSet ) {
+		for ( const GlushkovFollowV3::TFollowTuple < SymbolType, RankType > & followTuple : kv.second ) {
+			for ( const std::set < std::ranked_symbol < > > & symb : followTuple ) {
+				automaton.addPushdownStoreSymbol ( std::variant < alphabet::BottomOfTheStackSymbol, std::set < std::ranked_symbol < SymbolType, RankType > > > ( symb ) );
+			}
+		}
+	}
+
+	/* DEBUG */
 	if ( common::GlobalData::verbose ) {
 		std::cerr << "RTE:" << std::endl;
 
@@ -108,46 +109,177 @@ ToPostfixPushdownAutomatonGlushkovV3::convert ( const rte::FormalRTE < > & rte )
 
 		std::cerr << std::endl;
 
-		for ( const auto & kv : followSet ) {
+		// std::map < std::ranked_symbol < >, std::set < GlushkovFollowV3::TFollowTuple < SymbolType, RankType > > > followSet;
+		for ( const std::pair < const std::ranked_symbol < >, std::set < GlushkovFollowV3::TFollowTuple < SymbolType, RankType > > >& kv : followSet ) {
 			std::cerr << "Follow(RTE, " << kv.first << "):" << std::endl;
 
 			if ( kv.second.empty ( ) )
 				std::cerr << "\t" << "{}" << std::endl;
 
-			for ( const auto & follow : kv.second ) {
-				for ( const auto & symbol : follow )
-					std::cerr << "\t" << symbol << std::endl;
+			for ( const GlushkovFollowV3::TFollowTuple < SymbolType, RankType > & followTuple : kv.second ) { // TFollowTuple = vector < set < ranked_symbol > >
+				std::cerr << " \t - FollowTuple:" << std::endl;
+				for ( const std::set < std::ranked_symbol < > > & child : followTuple )
+					std::cerr << "\t\t - " << child << std::endl;
 
 				std::cerr << std::endl;
 			}
 
 			std::cerr << std::endl;
 		}
+
+		std::cerr << "---------------------------------------------------------" << std::endl;
+		std::cerr << "PDA:" << std::endl;
+		std::cerr << "pds symbols" << std::endl;
+
+		for ( const auto & symb : automaton.getPushdownStoreAlphabet ( ) )
+			std::cerr << "\t" << symb << std::endl;
+		std::cerr << std::endl;
 	}
 	/* DEBUG END */
 
-	/*
+
+	/* TRANSITIONS */
+	// Pattern 3
+	for ( const std::ranked_symbol < > & symb : indexedRTE.getAlphabet ( ) ) {
+		if ( symb.getRank ( ) == primitive::Unsigned ( 0 ) ) {
+			std::vector < std::variant < alphabet::BottomOfTheStackSymbol, std::set < std::ranked_symbol < SymbolType, RankType > > > > push;
+			push.push_back( std::set < std::ranked_symbol < SymbolType, RankType > > { symb } );
+
+			automaton.addTransition ( q, rte::GlushkovIndexate::getSymbolFromGlushkovPair ( symb ).getSymbol ( ), { }, q, push );
+			if ( common::GlobalData::verbose ) {
+				std::cerr << "1: " << rte::GlushkovIndexate::getSymbolFromGlushkovPair ( symb ).getSymbol ( ) << " | " << std::endl <<
+					"\t" << "[]" << std::endl <<
+					"\t ->" << std::endl <<
+					"\t" << push << std::endl << std::endl;
+			}
+		}
+	}
+
+
+	// Pattern 2
 	for ( const std::ranked_symbol < > & symb : indexedRTE.getAlphabet ( ) ) {
-		if ( symb.getRank ( ) == primitive::Unsigned ( 0 ) )
-			automaton.addTransition ( q, rte::GlushkovIndexate::getSymbolFromGlushkovPair ( symb ).getSymbol ( ), { }, q, { DefaultSymbolType ( alphabet::RankedSymbol < > ( symb ) ) } );
-		else;
-			//for ( const std::vector < std::ranked_symbol < > > & follow : followSet[symb] ) {
-				//std::vector < DefaultSymbolType > fstring = phi ( follow );
-				//std::reverse ( fstring.begin ( ), fstring.end ( ) );
-				//automaton.addTransition ( q, rte::GlushkovIndexate::getSymbolFromGlushkovPair ( symb ).getSymbol ( ), fstring, q, { DefaultSymbolType ( alphabet::RankedSymbol < > ( symb ) ) } );
-			//}
+		if ( symb.getRank ( ) != primitive::Unsigned ( 0 ) ) {
+			for ( const GlushkovFollowV3::TFollowTuple < SymbolType, RankType > & followTuple : followSet [ symb ] ) { //tuple = vector < set < symb > >
+				std::vector < std::variant < alphabet::BottomOfTheStackSymbol, std::set < std::ranked_symbol < SymbolType, RankType > > > > pop, push;
+
+				/*
+				   for ( const auto & e : symbFollowTuple )
+				   pop.push_back ( e );
+				   std::reverse ( pop.begin ( ), pop.end ( ) ); // <------------ WTF. CRASHES HERE
+				   */
+				for ( const auto & e : followTuple )
+					pop.insert ( pop.begin ( ), e );
+
+				push.push_back( std::set < std::ranked_symbol < SymbolType, RankType > > { symb } );
+
+				automaton.addTransition ( q, rte::GlushkovIndexate::getSymbolFromGlushkovPair ( symb ).getSymbol ( ), pop, q, push );
+				if ( common::GlobalData::verbose ) {
+					std::cerr << "2: " << rte::GlushkovIndexate::getSymbolFromGlushkovPair ( symb ).getSymbol ( ) << " | " << std::endl <<
+						"\t" << pop << std::endl <<
+						"\t ->" << std::endl <<
+						"\t" << push << std::endl << std::endl;
+				}
+			}
+		}
+	}
 
+	// Pattern 1
+	for ( const std::ranked_symbol < > & symb : indexedRTE.getAlphabet ( ) ) {
+		// 1a
+		if ( symb.getRank ( ) == primitive::Unsigned ( 0 ) ) {
+			/* If symb \in some symbolSet of followSet [ i ], then    symb | \varepsilon -> symbolSet  */
+
+			for ( const std::pair < const std::ranked_symbol < >, std::set < GlushkovFollowV3::TFollowTuple < SymbolType, RankType > > >& kv : followSet ) {
+				for ( const GlushkovFollowV3::TFollowTuple < SymbolType, RankType > & followTuple : kv.second ) { // TFollowTuple = vector < set < ranked_symbol > >
+					for ( const std::set < std::ranked_symbol < > > & symbolSet : followTuple ) {
+						if ( symbolSet.count ( symb ) ) {
+							std::vector < std::variant < alphabet::BottomOfTheStackSymbol, std::set < std::ranked_symbol < SymbolType, RankType > > > > push;
+							push.push_back( symbolSet );
+							automaton.addTransition ( q, rte::GlushkovIndexate::getSymbolFromGlushkovPair ( symb ).getSymbol ( ), { }, q, push );
+
+							if ( common::GlobalData::verbose ) {
+								std::cerr << "1a: " << rte::GlushkovIndexate::getSymbolFromGlushkovPair ( symb ).getSymbol ( ) << " | " << std::endl <<
+									"\t" << "[ ]" << std::endl <<
+									"\t ->" << std::endl <<
+									"\t" << push << std::endl << std::endl;
+							}
+						}
+					}
+				}
+			}
+		} else { // 1b
+			/* If symb \in some symbolSet of followSet [ i ], then    symb | followTuple -> symbolSet  */
+			for ( const std::pair < const std::ranked_symbol < >, std::set < GlushkovFollowV3::TFollowTuple < SymbolType, RankType > > >& kv : followSet ) {
+				for ( const GlushkovFollowV3::TFollowTuple < SymbolType, RankType > & followTuple : kv.second ) { // TFollowTuple = vector < set < ranked_symbol > >
+					for ( const std::set < std::ranked_symbol < > > & symbolSet : followTuple ) {
+						if ( symbolSet.count ( symb ) ) {
+							std::vector < std::variant < alphabet::BottomOfTheStackSymbol, std::set < std::ranked_symbol < SymbolType, RankType > > > > pop, push;
+
+							for ( const GlushkovFollowV3::TFollowTuple < SymbolType, RankType > & symbFollowTuple : followSet [ symb ] ) {
+								/*
+								for ( const auto & e : symbFollowTuple )
+									pop.push_back ( e );
+								std::reverse ( pop.begin ( ), pop.end ( ) ); // <------------ WTF. CRASHES HERE
+								*/
+								for ( const auto & e : symbFollowTuple )
+									pop.insert ( pop.begin ( ), e );
+
+								push.push_back( symbolSet );
+								automaton.addTransition ( q, rte::GlushkovIndexate::getSymbolFromGlushkovPair ( symb ).getSymbol ( ), pop, q, push );
+
+								if ( common::GlobalData::verbose ) {
+									std::cerr << "1b: " << rte::GlushkovIndexate::getSymbolFromGlushkovPair ( symb ).getSymbol ( ) << " | " << std::endl <<
+										"\t" << pop << std::endl <<
+										"\t ->" << std::endl <<
+										"\t" << push << std::endl << std::endl;
+								}
+							}
+						}
+					}
+				}
+			}
+		}
 	}
-	*/
 
-	/*
+	if ( common::GlobalData::verbose ) {
+		std::cerr << "transitions:" << std::endl;
+
+		for ( const auto & transitionKV : automaton.getTransitions ( ) ) {
+			// const std::map <
+			//	std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >,
+			//	std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > >
+			//	>
+
+			const auto & input = std::get < 1 > ( transitionKV.first );
+			const auto & pop = std::get < 2 > ( transitionKV.first );
+
+			for ( const auto & transitionRHS : transitionKV.second ) {
+				const auto & push = transitionRHS.second;
+
+				std::cerr << "\t" << input << "  |  " << std::endl;
+				if ( pop.size( ) == 0 )
+					std::cerr << "\t\t" << "[]" << std::endl;
+				for ( const auto & e : pop )
+					std::cerr << "\t\t" << e << std::endl;
+				std::cerr << "\t\t" << " --> " << std::endl;
+				for ( const auto & e : push )
+					std::cerr << "\t\t" << e << std::endl;
+			}
+
+		}
+		std::cerr << std::endl;
+	}
+
+	// Final
 	for ( const std::ranked_symbol < > & symb : firstSet ) {
-		std::vector < DefaultSymbolType > pop;
-		pop.push_back ( DefaultSymbolType ( alphabet::RankedSymbol < > ( symb ) ) );
-		pop.push_back ( alphabet::BottomOfTheStackSymbol::instance < DefaultSymbolType > ( ) );
+		std::vector < std::variant < alphabet::BottomOfTheStackSymbol, std::set < std::ranked_symbol < SymbolType, RankType > > > > pop;
+		pop.push_back ( std::set < std::ranked_symbol < SymbolType, RankType > > { symb } );
+		pop.push_back ( BotS );
 		automaton.addTransition ( q, alphabet::EndSymbol::instance < DefaultSymbolType > ( ), pop, f, { } );
 	}
-	*/
+
+
+	/* TRANSITIONS END */
 
 	return automaton;
 }
diff --git a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovV3.h b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovV3.h
index 2be717f8d4749118eb3c44dbb026434ace9c1149..f6f888faff4599166ba9b5061294a7130f6ab568 100644
--- a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovV3.h
+++ b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovV3.h
@@ -16,7 +16,8 @@
 #include <rte/RTE.h>
 #include <rte/formal/FormalRTE.h>
 
-// #include <rte/unbounded/UnboundedRegExp.h>
+#include <container/ObjectsVariant.h>
+#include <container/ObjectsSet.h>
 
 namespace rte {