diff --git a/aarbology2/src/aarbology.cpp b/aarbology2/src/aarbology.cpp
index 26d848d668fffa8fbd73863d85840c0060d7c325..e4eef2b9590f4041baa1ea0eea686f94e27dc908 100644
--- a/aarbology2/src/aarbology.cpp
+++ b/aarbology2/src/aarbology.cpp
@@ -15,6 +15,7 @@
 #include <container/ObjectsSet.h>
 
 #include <arbology/exact/ExactSubtreeMatch.h>
+#include <arbology/exact/ExactPatternMatch.h>
 #include <arbology/exact/BoyerMooreHorspool.h>
 #include <arbology/exact/ExactSubtreeMatchingAutomaton.h>
 #include <chrono>
@@ -25,6 +26,7 @@ int main ( int argc, char * argv[] ) {
 
 		std::vector < std::string > allowed;
 		allowed.push_back ( "exactSubtreeMatch" );
+		allowed.push_back ( "exactPatternMatch" );
 		allowed.push_back ( "boyerMooreHorspool" );
 		allowed.push_back ( "exactSubtreeMatchingAutomaton" );
 		TCLAP::ValuesConstraint < std::string > allowedVals ( allowed );
@@ -109,6 +111,19 @@ int main ( int argc, char * argv[] ) {
 			std::chrono::measurements::end ( );
 			std::chrono::measurements::start ( "Output write", std::chrono::measurements::Type::AUXILARY );
 
+			alib::XmlDataFactory::toStdout ( res );
+		} else if ( algorithm.getValue ( ) == "exactPatternMatch" ) {
+			tree::Tree subject = alib::XmlDataFactory::fromTokens < tree::Tree > ( subjectTokens.front ( ) );
+			tree::Tree pattern = alib::XmlDataFactory::fromTokens < tree::Tree > ( patternTokens.front ( ) );
+
+			std::chrono::measurements::end ( );
+			std::chrono::measurements::start ( "Algorithm", std::chrono::measurements::Type::MAIN );
+
+			std::set < unsigned > res = arbology::exact::ExactPatternMatch::match ( subject, pattern );
+
+			std::chrono::measurements::end ( );
+			std::chrono::measurements::start ( "Output write", std::chrono::measurements::Type::AUXILARY );
+
 			alib::XmlDataFactory::toStdout ( res );
 		} else if ( algorithm.getValue ( ) == "boyerMooreHorspool" ) {
 			tree::Tree subject = alib::XmlDataFactory::fromTokens < tree::Tree > ( subjectTokens.front ( ) );
diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
index 6e805a03560734169d32fd1b5295f592698c7993..5026d2f6d2cec241aa4b07efafcf0553702c19a9 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
+++ b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
@@ -24,105 +24,126 @@ namespace arbology {
 
 namespace exact {
 
-std::set<unsigned> ExactPatternMatch::match(const tree::Tree& subject, const tree::Tree& pattern) {
-	return getInstance().dispatch(subject.getData(), pattern.getData());
+std::set < unsigned > ExactPatternMatch::match ( const tree::Tree & subject, const tree::Tree & pattern ) {
+	return getInstance ( ).dispatch ( subject.getData ( ), pattern.getData ( ) );
 }
 
-bool ExactPatternMatch::matchHelper(const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern, const alphabet::Symbol& subtreeVariable) {
-	if(pattern.getSymbol() == subtreeVariable) return true;
-	if(subject.getSymbol() != pattern.getSymbol()) return false;
-	if(subject.getChildren().size() != pattern.getChildren().size()) return false;
-	for(const std::tuple<const tree::UnrankedNode*, const tree::UnrankedNode*>& childs : std::make_pair_foreach(subject.getChildren(), pattern.getChildren())) {
-		if(!matchHelper(*std::get<0>(childs), *std::get<1>(childs), subtreeVariable)) return false;
-	}
+bool ExactPatternMatch::matchHelper ( const tree::UnrankedNode & subject, const tree::UnrankedNode & pattern, const alphabet::Symbol & subtreeVariable ) {
+	if ( pattern.getSymbol ( ) == subtreeVariable ) return true;
+
+	if ( subject.getSymbol ( ) != pattern.getSymbol ( ) ) return false;
+
+	if ( subject.getChildren ( ).size ( ) != pattern.getChildren ( ).size ( ) ) return false;
+
+	for ( const std::tuple < const tree::UnrankedNode *, const tree::UnrankedNode * > & childs : std::make_pair_foreach ( subject.getChildren ( ), pattern.getChildren ( ) ) )
+		if ( !matchHelper ( * std::get < 0 > ( childs ), * std::get < 1 > ( childs ), subtreeVariable ) ) return false;
+
 	return true;
 }
 
-bool ExactPatternMatch::matchHelper(const tree::RankedNode& subject, const tree::RankedNode& pattern, const alphabet::RankedSymbol& subtreeVariable) {
-	if(pattern.getSymbol() == subtreeVariable) return true;
-	if(subject.getSymbol() != pattern.getSymbol()) return false;
-	// ranked symbols are the same; test for number of children is not needed
-	for(const std::tuple<const tree::RankedNode*, const tree::RankedNode*>& childs : std::make_pair_foreach(subject.getChildren(), pattern.getChildren())) {
-		if(!matchHelper(*std::get<0>(childs), *std::get<1>(childs), subtreeVariable)) return false;
-	}
+bool ExactPatternMatch::matchHelper ( const tree::RankedNode & subject, const tree::RankedNode & pattern, const alphabet::RankedSymbol & subtreeVariable ) {
+	if ( pattern.getSymbol ( ) == subtreeVariable ) return true;
+
+	if ( subject.getSymbol ( ) != pattern.getSymbol ( ) ) return false;
+
+	 // ranked symbols are the same; test for number of children is not needed
+	for ( const std::tuple < const tree::RankedNode *, const tree::RankedNode * > & childs : std::make_pair_foreach ( subject.getChildren ( ), pattern.getChildren ( ) ) )
+		if ( !matchHelper ( * std::get < 0 > ( childs ), * std::get < 1 > ( childs ), subtreeVariable ) ) return false;
+
 	return true;
 }
 
-void ExactPatternMatch::matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern, const alphabet::Symbol& subtreeVariable) {
-	if(matchHelper(subject, pattern, subtreeVariable)) occ.insert(index);
+void ExactPatternMatch::matchInternal ( unsigned & index, std::set < unsigned > & occ, const tree::UnrankedNode & subject, const tree::UnrankedNode & pattern, const alphabet::Symbol & subtreeVariable ) {
+	if ( matchHelper ( subject, pattern, subtreeVariable ) ) occ.insert ( index );
+
 	index++;
-	for(const tree::UnrankedNode* child : subject.getChildren()) {
-		matchInternal(index, occ, *child, pattern, subtreeVariable);
-	}
+
+	for ( const tree::UnrankedNode * child : subject.getChildren ( ) )
+		matchInternal ( index, occ, * child, pattern, subtreeVariable );
 }
 
-void ExactPatternMatch::matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::RankedNode& subject, const tree::RankedNode& pattern, const alphabet::RankedSymbol& subtreeVariable) {
-	if(matchHelper(subject, pattern, subtreeVariable)) occ.insert(index);
+void ExactPatternMatch::matchInternal ( unsigned & index, std::set < unsigned > & occ, const tree::RankedNode & subject, const tree::RankedNode & pattern, const alphabet::RankedSymbol & subtreeVariable ) {
+	if ( matchHelper ( subject, pattern, subtreeVariable ) ) occ.insert ( index );
+
 	index++;
-	for(const tree::RankedNode* child : subject.getChildren()) {
-		matchInternal(index, occ, *child, pattern, subtreeVariable);
-	}
+
+	for ( const tree::RankedNode * child : subject.getChildren ( ) )
+		matchInternal ( index, occ, * child, pattern, subtreeVariable );
 }
 
-std::set<unsigned> ExactPatternMatch::match(const tree::UnrankedTree& subject, const tree::UnrankedPattern& pattern) {
+std::set < unsigned > ExactPatternMatch::match ( const tree::UnrankedTree & subject, const tree::UnrankedPattern & pattern ) {
 	unsigned i = 0;
-	std::set<unsigned> occ;
-	matchInternal(i, occ, subject.getRoot(), pattern.getRoot(), pattern.getSubtreeWildcard());
+	std::set < unsigned > occ;
+
+	matchInternal ( i, occ, subject.getRoot ( ), pattern.getRoot ( ), pattern.getSubtreeWildcard ( ) );
 	return occ;
 }
 
-auto ExactPatternMatchUnrankedTree = ExactPatternMatch::RegistratorWrapper<std::set<unsigned>, tree::UnrankedTree, tree::UnrankedPattern>(ExactPatternMatch::getInstance(), ExactPatternMatch::match);
+auto ExactPatternMatchUnrankedTree = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::UnrankedTree, tree::UnrankedPattern > ( ExactPatternMatch::getInstance ( ), ExactPatternMatch::match );
 
-std::set<unsigned> ExactPatternMatch::match(const tree::RankedTree& subject, const tree::RankedPattern& pattern) {
+std::set < unsigned > ExactPatternMatch::match ( const tree::RankedTree & subject, const tree::RankedPattern & pattern ) {
 	unsigned i = 0;
-	std::set<unsigned> occ;
-	matchInternal(i, occ, subject.getRoot(), pattern.getRoot(), pattern.getSubtreeWildcard());
+	std::set < unsigned > occ;
+
+	matchInternal ( i, occ, subject.getRoot ( ), pattern.getRoot ( ), pattern.getSubtreeWildcard ( ) );
 	return occ;
 }
 
-auto ExactPatternMatchRankedTree = ExactPatternMatch::RegistratorWrapper<std::set<unsigned>, tree::RankedTree, tree::RankedPattern>(ExactPatternMatch::getInstance(), ExactPatternMatch::match);
+auto ExactPatternMatchRankedTree = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::RankedTree, tree::RankedPattern > ( ExactPatternMatch::getInstance ( ), ExactPatternMatch::match );
 
-std::set<unsigned> ExactPatternMatch::match(const tree::PrefixRankedTree& subject, const tree::PrefixRankedPattern& pattern) {
+std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedTree & subject, const tree::PrefixRankedPattern & pattern ) {
 	std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject );
 
-	std::set<unsigned> occ;
-	for(unsigned i = 0; i + pattern.getContent().size() <= subject.getContent().size(); i++) {
+	std::set < unsigned > occ;
+
+	for ( unsigned i = 0; i + pattern.getContent ( ).size ( ) <= subject.getContent ( ).size ( ); i++ ) {
 		unsigned j = 0;
 		unsigned offset = i;
-		for(; j < pattern.getContent().size(); j++) {
-			if(pattern.getContent()[j] == subject.getContent()[offset+j]) offset++;
-			else if(pattern.getContent()[j] == pattern.getSubtreeWildcard()) offset = subjectSubtreeJumpTable[offset];
-			else break;
+
+		for ( ; j < pattern.getContent ( ).size ( ); j++ ) {
+			if ( pattern.getContent ( )[j] == subject.getContent ( )[offset + j] )
+				offset++;
+			else if ( pattern.getContent ( )[j] == pattern.getSubtreeWildcard ( ) )
+				offset = subjectSubtreeJumpTable[offset];
+			else
+				break;
 		}
 
-		if( j == pattern.getContent().size() )
-			occ.insert(i);
+		if ( j == pattern.getContent ( ).size ( ) )
+			occ.insert ( i );
 	}
+
 	return occ;
 }
 
-auto ExactPatternMatchPrefixRankedTree = ExactPatternMatch::RegistratorWrapper<std::set<unsigned>, tree::PrefixRankedTree, tree::PrefixRankedPattern>(ExactPatternMatch::getInstance(), ExactPatternMatch::match);
+auto ExactPatternMatchPrefixRankedTree = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree, tree::PrefixRankedPattern > ( ExactPatternMatch::getInstance ( ), ExactPatternMatch::match );
 
-std::set<unsigned> ExactPatternMatch::match(const tree::PrefixRankedBarTree& subject, const tree::PrefixRankedBarPattern& pattern) {
+std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree & subject, const tree::PrefixRankedBarPattern & pattern ) {
 	std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject );
 
-	std::set<unsigned> occ;
-	for(unsigned i = 0; i + pattern.getContent().size() <= subject.getContent().size(); i++) {
+	std::set < unsigned > occ;
+
+	for ( unsigned i = 0; i + pattern.getContent ( ).size ( ) <= subject.getContent ( ).size ( ); i++ ) {
 		unsigned j = 0;
 		unsigned offset = i;
-		for(; j < pattern.getContent().size(); j++) {
-			if(pattern.getContent()[j] == subject.getContent()[offset+j]) offset++;
-			else if(pattern.getContent()[j] == pattern.getSubtreeWildcard()) offset = subjectSubtreeJumpTable[offset];
-			else break;
+
+		for ( ; j < pattern.getContent ( ).size ( ); j++ ) {
+			if ( pattern.getContent ( )[j] == subject.getContent ( )[offset + j] )
+				offset++;
+			else if ( pattern.getContent ( )[j] == pattern.getSubtreeWildcard ( ) )
+				offset = subjectSubtreeJumpTable[offset];
+			else
+				break;
 		}
 
-		if( j == pattern.getContent().size() )
-			occ.insert(i);
+		if ( j == pattern.getContent ( ).size ( ) )
+			occ.insert ( i );
 	}
+
 	return occ;
 }
 
-auto ExactPatternMatchPrefixRankedBarTree = ExactPatternMatch::RegistratorWrapper<std::set<unsigned>, tree::PrefixRankedBarTree, tree::PrefixRankedBarPattern>(ExactPatternMatch::getInstance(), ExactPatternMatch::match);
+auto ExactPatternMatchPrefixRankedBarTree = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree, tree::PrefixRankedBarPattern > ( ExactPatternMatch::getInstance ( ), ExactPatternMatch::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.h b/alib2algo/src/arbology/exact/ExactPatternMatch.h
index 099055afab1705044e7a07612a166cd641683af5..eb9f945e6f3a1de73fa9b8618d40b183f7f72666 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatch.h
+++ b/alib2algo/src/arbology/exact/ExactPatternMatch.h
@@ -19,30 +19,33 @@ namespace arbology {
 
 namespace exact {
 
-class ExactPatternMatch : public std::DoubleDispatch<std::set<unsigned>, tree::TreeBase, tree::TreeBase> {
+class ExactPatternMatch : public std::DoubleDispatch < std::set < unsigned >, tree::TreeBase, tree::TreeBase > {
 public:
 	/**
 	 * Performs conversion.
 	 * @return left regular grammar equivalent to source automaton.
 	 */
-	static std::set<unsigned> match(const tree::Tree& subject, const tree::Tree& pattern);
+	static std::set < unsigned > match ( const tree::Tree & subject, const tree::Tree & pattern );
+
+	static std::set < unsigned > match ( const tree::UnrankedTree & subject, const tree::UnrankedPattern & pattern );
+	static std::set < unsigned > match ( const tree::RankedTree & subject, const tree::RankedPattern & pattern );
+	static std::set < unsigned > match ( const tree::PrefixRankedTree & subject, const tree::PrefixRankedPattern & pattern );
+	static std::set < unsigned > match ( const tree::PrefixRankedBarTree & subject, const tree::PrefixRankedBarPattern & pattern );
 
-	static std::set<unsigned> match(const tree::UnrankedTree& subject, const tree::UnrankedPattern& pattern);
-	static std::set<unsigned> match(const tree::RankedTree& subject, const tree::RankedPattern& pattern);
-	static std::set<unsigned> match(const tree::PrefixRankedTree& subject, const tree::PrefixRankedPattern& pattern);
-	static std::set<unsigned> match(const tree::PrefixRankedBarTree& subject, const tree::PrefixRankedBarPattern& pattern);
 private:
-	static bool matchHelper(const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern, const alphabet::Symbol& subtreeVariable);
-	static bool matchHelper(const tree::RankedNode& subject, const tree::RankedNode& pattern, const alphabet::RankedSymbol& subtreeVariable);
+	static bool matchHelper ( const tree::UnrankedNode & subject, const tree::UnrankedNode & pattern, const alphabet::Symbol & subtreeVariable );
+	static bool matchHelper ( const tree::RankedNode & subject, const tree::RankedNode & pattern, const alphabet::RankedSymbol & subtreeVariable );
 
-	static void matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern, const alphabet::Symbol& subtreeVariable);
-	static void matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::RankedNode& subject, const tree::RankedNode& pattern, const alphabet::RankedSymbol& subtreeVariable);
+	static void matchInternal ( unsigned & index, std::set < unsigned > & occ, const tree::UnrankedNode & subject, const tree::UnrankedNode & pattern, const alphabet::Symbol & subtreeVariable );
+	static void matchInternal ( unsigned & index, std::set < unsigned > & occ, const tree::RankedNode & subject, const tree::RankedNode & pattern, const alphabet::RankedSymbol & subtreeVariable );
 
 public:
-	static ExactPatternMatch& getInstance() {
+	static ExactPatternMatch & getInstance ( ) {
 		static ExactPatternMatch res;
+
 		return res;
 	}
+
 };
 
 } /* namespace exact */
diff --git a/examples2/tree/aarbology.test1.pattern.xml b/examples2/tree/aarbology.test1.pattern.xml
index fab30bef1443f07b26d2147d6e3fa3608346cdd9..25e39bf7b5625f4321a4a9bfedcabaf7c6814c17 100644
--- a/examples2/tree/aarbology.test1.pattern.xml
+++ b/examples2/tree/aarbology.test1.pattern.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0"?>
-<RankedTree>
+<RankedPattern>
+  <subtreeWildcard>
+    <RankedSymbol>
+      <SubtreeWildcardSymbol />
+      <Unsigned>0</Unsigned>
+    </RankedSymbol>
+  </subtreeWildcard>
   <rankedAlphabet>
     <RankedSymbol>
 <LabeledSymbol>
@@ -18,11 +24,7 @@
       <Unsigned>1</Unsigned>
     </RankedSymbol>
     <RankedSymbol>
-<LabeledSymbol>
-      <PrimitiveLabel>
-        <Character>c</Character>
-      </PrimitiveLabel>
-</LabeledSymbol>
+      <SubtreeWildcardSymbol />
       <Unsigned>0</Unsigned>
     </RankedSymbol>
   </rankedAlphabet>
@@ -46,24 +48,16 @@
       </RankedSymbol>
       <rankedNode>
         <RankedSymbol>
-<LabeledSymbol>
-          <PrimitiveLabel>
-            <Character>c</Character>
-          </PrimitiveLabel>
-</LabeledSymbol>
+          <SubtreeWildcardSymbol />
           <Unsigned>0</Unsigned>
         </RankedSymbol>
       </rankedNode>
       <rankedNode>
         <RankedSymbol>
-<LabeledSymbol>
-          <PrimitiveLabel>
-            <Character>c</Character>
-          </PrimitiveLabel>
-</LabeledSymbol>
+          <SubtreeWildcardSymbol />
           <Unsigned>0</Unsigned>
         </RankedSymbol>
       </rankedNode>
     </rankedNode>
   </rankedNode>
-</RankedTree>
+</RankedPattern>
diff --git a/examples2/tree/aarbology.test1.subtree.xml b/examples2/tree/aarbology.test1.subtree.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fab30bef1443f07b26d2147d6e3fa3608346cdd9
--- /dev/null
+++ b/examples2/tree/aarbology.test1.subtree.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0"?>
+<RankedTree>
+  <rankedAlphabet>
+    <RankedSymbol>
+<LabeledSymbol>
+      <PrimitiveLabel>
+        <Character>a</Character>
+      </PrimitiveLabel>
+</LabeledSymbol>
+      <Unsigned>2</Unsigned>
+    </RankedSymbol>
+    <RankedSymbol>
+<LabeledSymbol>
+      <PrimitiveLabel>
+        <Character>b</Character>
+      </PrimitiveLabel>
+</LabeledSymbol>
+      <Unsigned>1</Unsigned>
+    </RankedSymbol>
+    <RankedSymbol>
+<LabeledSymbol>
+      <PrimitiveLabel>
+        <Character>c</Character>
+      </PrimitiveLabel>
+</LabeledSymbol>
+      <Unsigned>0</Unsigned>
+    </RankedSymbol>
+  </rankedAlphabet>
+  <rankedNode>
+    <RankedSymbol>
+<LabeledSymbol>
+      <PrimitiveLabel>
+        <Character>b</Character>
+      </PrimitiveLabel>
+</LabeledSymbol>
+      <Unsigned>1</Unsigned>
+    </RankedSymbol>
+    <rankedNode>
+      <RankedSymbol>
+<LabeledSymbol>
+        <PrimitiveLabel>
+          <Character>a</Character>
+        </PrimitiveLabel>
+</LabeledSymbol>
+        <Unsigned>2</Unsigned>
+      </RankedSymbol>
+      <rankedNode>
+        <RankedSymbol>
+<LabeledSymbol>
+          <PrimitiveLabel>
+            <Character>c</Character>
+          </PrimitiveLabel>
+</LabeledSymbol>
+          <Unsigned>0</Unsigned>
+        </RankedSymbol>
+      </rankedNode>
+      <rankedNode>
+        <RankedSymbol>
+<LabeledSymbol>
+          <PrimitiveLabel>
+            <Character>c</Character>
+          </PrimitiveLabel>
+</LabeledSymbol>
+          <Unsigned>0</Unsigned>
+        </RankedSymbol>
+      </rankedNode>
+    </rankedNode>
+  </rankedNode>
+</RankedTree>
diff --git a/tests.aarbology.sh b/tests.aarbology.sh
index 557917774c49355261f0e3a248049760887e71e1..46ae1378a311d7c7d59d1120ab079c1b2aaa2c78 100755
--- a/tests.aarbology.sh
+++ b/tests.aarbology.sh
@@ -54,6 +54,10 @@ function log {
 }
 
 function generatePattern {
+	./arand2 -t RP --nodes $RAND_SIZE_PATTERN --terminals $(( $RANDOM % $RAND_ALPHABET + 1 )) --height $RAND_HEIGHT_PATTERN 2>/dev/null
+}
+
+function generateSubtree {
 	./arand2 -t RT --nodes $RAND_SIZE_PATTERN --terminals $(( $RANDOM % $RAND_ALPHABET + 1 )) --height $RAND_HEIGHT_PATTERN 2>/dev/null
 }
 
@@ -126,7 +130,7 @@ function outputResults {
 }
 
 # $1 - aconversions2 sequence
-function runTest {
+function runTestSubtree {
 	echo $1
 	echo -ne "\t"
 
@@ -134,7 +138,7 @@ function runTest {
 
 	# predefined tests first
 	for SUBJECT_FILE in `ls $TESTS_DIR/aarbology.test*.subject.xml`; do
-		PATTERN_FILE=${SUBJECT_FILE%.subject.xml}.pattern.xml
+		PATTERN_FILE=${SUBJECT_FILE%.subject.xml}.subtree.xml
 		if [ -f  ]; then
 			Occs=`./aarbology2 -a exactSubtreeMatch -s "$SUBJECT_FILE" -p "$PATTERN_FILE" | ./astat2 -p quantity -s`
 
@@ -151,7 +155,7 @@ function runTest {
 	for i in $(seq 1 $TESTCASE_ITERATIONS );
 	do
 		cat <(generateSubject) > $SUBJECT_FILE
-		cat <(generatePattern) > $PATTERN_FILE
+		cat <(generateSubtree) > $PATTERN_FILE
 
 		Occs=`./aarbology2 -a exactSubtreeMatch -s "$SUBJECT_FILE" -p "$PATTERN_FILE" | ./astat2 -p quantity -s`
 
@@ -165,6 +169,47 @@ function runTest {
 	outputResults
 }
 
-runTest "Exact Boyer Moore Horspool" "./aarbology2 -a boyerMooreHorspool -s <( ./acast2 -t PrefixRankedBarTree -i \"\$SUBJECT_FILE\" ) -p <( ./acast2 -t PrefixRankedBarTree -i \"\$PATTERN_FILE\" ) | ./astat2 -p quantity -s"
-runTest "Exact Subtree Automaton" "./arun2 -t occurrences -a <(./aarbology2 -a exactSubtreeMatchingAutomaton -p \"\$PATTERN_FILE\" | ./adeterminize2) -i \"\$SUBJECT_FILE\" | ./astat2 -p quantity -s"
+# $1 - aconversions2 sequence
+function runTestPattern {
+	echo $1
+	echo -ne "\t"
+
+	clearResults
+
+	# predefined tests first
+	for SUBJECT_FILE in `ls $TESTS_DIR/aarbology.test*.subject.xml`; do
+		PATTERN_FILE=${SUBJECT_FILE%.subject.xml}.pattern.xml
+		if [ -f  ]; then
+			Occs=`./aarbology2 -a exactPatternMatch -s "$SUBJECT_FILE" -p "$PATTERN_FILE" | ./astat2 -p quantity -s`
+
+			runTest2 "$Occs" "$2" "$SUBJECT_FILE" "$PATTERN_FILE"
+			registerResult $?
+		fi
+	done
+
+	echo -n " | "
+
+	# random tests
+	SUBJECT_FILE=s.xml
+	PATTERN_FILE=p.xml
+	for i in $(seq 1 $TESTCASE_ITERATIONS );
+	do
+		cat <(generateSubject) > $SUBJECT_FILE
+		cat <(generatePattern) > $PATTERN_FILE
+
+		Occs=`./aarbology2 -a exactPatternMatch -s "$SUBJECT_FILE" -p "$PATTERN_FILE" | ./astat2 -p quantity -s`
+
+		runTest2 "$Occs" "$2" "$SUBJECT_FILE" "$PATTERN_FILE"
+		registerResult $?
+	done
+
+	rm $SUBJECT_FILE
+	rm $PATTERN_FILE
+
+	outputResults
+}
+
+runTestSubtree "Exact Boyer Moore Horspool" "./aarbology2 -a boyerMooreHorspool -s <( ./acast2 -t PrefixRankedBarTree -i \"\$SUBJECT_FILE\" ) -p <( ./acast2 -t PrefixRankedBarTree -i \"\$PATTERN_FILE\" ) | ./astat2 -p quantity -s"
+runTestSubtree "Exact Subtree Automaton" "./arun2 -t occurrences -a <(./aarbology2 -a exactSubtreeMatchingAutomaton -p \"\$PATTERN_FILE\" | ./adeterminize2) -i \"\$SUBJECT_FILE\" | ./astat2 -p quantity -s"
 
+runTestPattern "Exact Boyer Moore Horspool" "./aarbology2 -a boyerMooreHorspool -s <( ./acast2 -t PrefixRankedBarTree -i \"\$SUBJECT_FILE\" ) -p <( ./acast2 -t PrefixRankedBarPattern -i \"\$PATTERN_FILE\" ) | ./astat2 -p quantity -s"