diff --git a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp
index daed1b36a1806a2f38767d01dbb6a6afaa2ffcdb..a854e54b0b940222de9da402ad802a83a7494ad8 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp
+++ b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp
@@ -14,11 +14,16 @@
 #include <tree/ranked/RankedPattern.h>
 #include <tree/ranked/PrefixRankedTree.h>
 #include <tree/ranked/PrefixRankedPattern.h>
+#include <tree/ranked/PrefixRankedBarTree.h>
+#include <tree/ranked/PrefixRankedBarPattern.h>
 
 #include <automaton/PDA/InputDrivenNPDA.h>
+#include <automaton/PDA/VisiblyPushdownNPDA.h>
 #include <automaton/PDA/NPDA.h>
 #include <automaton/TA/NFTA.h>
 
+#include <alphabet/BottomOfTheStackSymbol.h>
+
 #include <deque>
 
 namespace arbology {
@@ -62,6 +67,8 @@ automaton::NPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRan
 	automaton::NPDA res ( automaton::State ( 0 ), alphabet::symbolFrom ( 'T' ) );
 
 	for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
+		if ( symbol == pattern.getSubtreeWildcard ( ) ) continue;
+
 		res.addInputSymbol ( alphabet::Symbol { symbol } );
 	}
 
@@ -111,6 +118,79 @@ automaton::NPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRan
 
 auto ExactPatternMatchingAutomatonPrefixRankedPattern = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::NPDA, tree::PrefixRankedPattern > ( ExactPatternMatchingAutomaton::getInstance ( ), ExactPatternMatchingAutomaton::construct );
 
+automaton::InputDrivenNPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarTree & pattern ) {
+	return ExactSubtreeMatchingAutomaton::construct ( pattern );
+}
+
+auto ExactPatternMatchingAutomatonPrefixRankedBarTree = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA, tree::PrefixRankedBarTree > ( ExactPatternMatchingAutomaton::getInstance ( ), ExactPatternMatchingAutomaton::construct );
+
+automaton::VisiblyPushdownNPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarPattern & pattern ) {
+	automaton::VisiblyPushdownNPDA res ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
+
+	res.addState ( automaton::State ( 0 ) );
+	res.addInitialState ( automaton::State ( 0 ) );
+
+	for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
+		if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue;
+
+		if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) )
+			res.addReturnInputSymbol ( alphabet::Symbol { symbol } );
+		else
+			res.addCallInputSymbol ( alphabet::Symbol { symbol } );
+	}
+
+	res.setStackAlphabet ( { alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK }, alphabet::symbolFrom ( 'T' ), alphabet::symbolFrom ( 'R' ) } );
+
+	for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
+		if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue;
+
+		if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) )
+			res.addReturnTransition ( automaton::State ( 0 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'T' ), automaton::State ( 0 ) );
+		else
+			res.addCallTransition ( automaton::State ( 0 ), alphabet::Symbol { symbol }, automaton::State ( 0 ), alphabet::symbolFrom ( 'T' ) );
+	}
+
+	int i = 1;
+
+	for ( const alphabet::RankedSymbol & symbol : pattern.getContent ( ) ) {
+		res.addState ( automaton::State ( i ) );
+
+		if ( symbol == pattern.getSubtreeWildcard ( ) ) {
+			for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
+				if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) || ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) ) continue;
+
+				res.addCallTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i ), alphabet::symbolFrom ( 'R' ) );
+			}
+		} else if ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) {
+			for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
+				if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue;
+
+				if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) )
+					res.addReturnTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'T' ), automaton::State ( i - 1 ) );
+				else
+					res.addCallTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i - 1 ), alphabet::symbolFrom ( 'T' ) );
+			}
+
+			for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
+				if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) || ( symbol.getSymbol ( ) != pattern.getBarSymbol ( ) ) ) continue;
+
+				res.addReturnTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'R' ), automaton::State ( i ) );
+			}
+		} else if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) {
+			res.addReturnTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'T' ), automaton::State ( i ) );
+		} else {
+			res.addCallTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i ), alphabet::symbolFrom ( 'T' ) );
+		}
+
+		i++;
+	}
+
+	res.addFinalState ( automaton::State ( i - 1 ) );
+	return res;
+}
+
+auto ExactPatternMatchingAutomatonPrefixRankedBarPattern = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::VisiblyPushdownNPDA, tree::PrefixRankedBarPattern > ( ExactPatternMatchingAutomaton::getInstance ( ), ExactPatternMatchingAutomaton::construct );
+
 automaton::NFTA ExactPatternMatchingAutomaton::construct ( const tree::RankedTree & pattern ) {
 	return ExactSubtreeMatchingAutomaton::construct ( pattern );
 }
diff --git a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h
index 45595dd7d6f659d0f0ed2838c33e180622746c96..2b20255f07b773531cbefd12641a569a0535b4aa 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h
+++ b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h
@@ -30,6 +30,8 @@ public:
 
 	static automaton::NPDA construct ( const tree::PrefixRankedPattern & pattern );
 	static automaton::InputDrivenNPDA construct ( const tree::PrefixRankedTree & pattern );
+	static automaton::VisiblyPushdownNPDA construct ( const tree::PrefixRankedBarPattern & pattern );
+	static automaton::InputDrivenNPDA construct ( const tree::PrefixRankedBarTree & pattern );
 	static automaton::NFTA construct ( const tree::RankedTree & pattern );
 	static automaton::NFTA construct ( const tree::RankedPattern & pattern );
 
diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp
index f624c50fe52678cec32c6d6c344def5965ea3df1..7ec04894153ac964f6cbf378d7f72ed059f63719 100644
--- a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp
+++ b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp
@@ -7,12 +7,15 @@
 
 #include "ExactSubtreeMatchingAutomaton.h"
 #include <exception/AlibException.h>
+#include <tree/ranked/PrefixRankedBarTree.h>
 #include <tree/ranked/PrefixRankedTree.h>
 #include <tree/ranked/RankedTree.h>
 
 #include <automaton/PDA/InputDrivenNPDA.h>
 #include <automaton/TA/NFTA.h>
 
+#include <alphabet/BottomOfTheStackSymbol.h>
+
 #include <deque>
 
 namespace arbology {
@@ -49,6 +52,38 @@ automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct ( const tree
 
 auto ExactSubtreeMatchingAutomatonPrefixRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA, tree::PrefixRankedTree > ( ExactSubtreeMatchingAutomaton::getInstance ( ), ExactSubtreeMatchingAutomaton::construct );
 
+automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct ( const tree::PrefixRankedBarTree & pattern ) {
+	automaton::InputDrivenNPDA res ( automaton::State ( 0 ), alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
+
+	res.setStackAlphabet ( { alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK }, alphabet::symbolFrom ( 'S' ) } );
+
+	for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
+		res.addInputSymbol ( alphabet::Symbol { symbol } );
+
+		if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) )
+			res.setPushdownStoreOperation ( alphabet::Symbol { symbol }, std::vector < alphabet::Symbol > { 1, alphabet::symbolFrom ( 'S' ) }, std::vector < alphabet::Symbol > { } );
+		else
+			res.setPushdownStoreOperation ( alphabet::Symbol { symbol }, std::vector < alphabet::Symbol > { }, std::vector < alphabet::Symbol > { 1, alphabet::symbolFrom ( 'S' ) } );
+	}
+
+	for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
+		res.addTransition ( automaton::State ( 0 ), alphabet::Symbol { symbol }, automaton::State ( 0 ) );
+	}
+
+	int i = 1;
+
+	for ( const alphabet::RankedSymbol & symbol : pattern.getContent ( ) ) {
+		res.addState ( automaton::State ( i ) );
+		res.addTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i ) );
+		i++;
+	}
+
+	res.addFinalState ( automaton::State ( i - 1 ) );
+	return res;
+}
+
+auto ExactSubtreeMatchingAutomatonPrefixRankedBarTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA, tree::PrefixRankedBarTree > ( ExactSubtreeMatchingAutomaton::getInstance ( ), ExactSubtreeMatchingAutomaton::construct );
+
 automaton::State constructRecursive ( const tree::RankedNode & node, automaton::NFTA & res, int & nextState ) {
 	std::vector < automaton::State > states;
 
diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h
index 24cc730c379de5d19848813a61786fdf1e9579f5..f3c28a4d19df3dfcdca8523009a620092130ef58 100644
--- a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h
+++ b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h
@@ -29,6 +29,7 @@ public:
 	static automaton::Automaton construct ( const tree::Tree & pattern );
 
 	static automaton::InputDrivenNPDA construct ( const tree::PrefixRankedTree & pattern );
+	static automaton::InputDrivenNPDA construct ( const tree::PrefixRankedBarTree & pattern );
 	static automaton::NFTA construct ( const tree::RankedTree & pattern );
 
 	static ExactSubtreeMatchingAutomaton & getInstance ( ) {