diff --git a/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp b/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp
index b35fbd55d450138cf2734e6d054133c147b22ba1..e5917860750cadd29278926ec13b8efbc6374136 100644
--- a/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp
+++ b/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp
@@ -7,13 +7,6 @@
 
 #include "SubtreeJumpTable.h"
 
-#include <tree/ranked/PrefixRankedTree.h>
-#include <tree/ranked/PrefixRankedPattern.h>
-#include <tree/ranked/PrefixRankedBarTree.h>
-#include <tree/ranked/PrefixRankedBarPattern.h>
-
-#include <map>
-
 namespace arbology {
 
 namespace exact {
@@ -22,90 +15,11 @@ std::vector < int > SubtreeJumpTable::compute ( const tree::RankedTreeWrapper &
 	return dispatch ( subject.getData ( ) );
 }
 
-std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedBarTree < > & subject ) {
-	std::vector < int > res;
-
-	buildDataPointersBar ( res, subject, 0 );
-
-	return res;
-}
-
 auto SubtreeSizesPrefixRankedBarTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedBarTree < > > ( SubtreeJumpTable::compute );
-
-std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedBarPattern < > & pattern ) {
-	std::vector < int > res;
-
-	buildDataPointersBar ( res, pattern, 0 );
-
-	return res;
-}
-
 auto SubtreeSizesPrefixRankedBarPattern = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedBarPattern < > > ( SubtreeJumpTable::compute );
-
-std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedTree < > & subject ) {
-	std::vector < int > res;
-
-	buildDataPointersPrefixRanked ( res, subject, 0 );
-
-	return res;
-}
-
 auto SubtreeSizesPrefixRankedTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedTree < > > ( SubtreeJumpTable::compute );
-
-std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedPattern < > & pattern ) {
-	std::vector < int > res;
-
-	buildDataPointersPrefixRanked ( res, pattern, 0 );
-
-	return res;
-}
-
 auto SubtreeSizesPrefixRankedPattern = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedPattern < > > ( SubtreeJumpTable::compute );
 
-/**
- * used to compute subtree jump table.
- * @param begin - index of a root node of a complete subtree to process
- * @return index, increased by one, of the last node in the subtree starting at index begin
- */
-template < class T >
-int SubtreeJumpTable::buildDataPointersBar ( std::vector < int > & res, const T & subject, int begin ) {
-	res.push_back ( 0 );
-	int index = begin + 1;
-
-	if ( ! subject.getBars ( ).count ( subject.getContent ( )[begin] ) )
-		for ( unsigned i = 0; i < ( unsigned ) subject.getContent ( )[begin].getRank ( ); i++ )
-			index = buildDataPointersBar ( res, subject, index );
-
-	index++;
-	res[begin] = index;
-	res.push_back ( begin - 1 );
-	return index;
-}
-
-/**
- * used to compute subtree jump table.
- * @param begin - index of a root node of a complete subtree to process
- * @return index, increased by one, of the last node in the subtree starting at index begin
- */
-template < class T >
-int SubtreeJumpTable::buildDataPointersPrefixRanked ( std::vector < int > & res, const T & subject, int begin ) {
-	for ( unsigned i = 0; i < subject.getContent ( ).size ( ); i++ )
-		res.push_back ( 0 );
-
-	return buildDataPointersPrefixRankedInternal ( res, subject, begin );
-}
-
-template < class T >
-int SubtreeJumpTable::buildDataPointersPrefixRankedInternal ( std::vector < int > & res, const T & subject, int begin ) {
-	int index = begin + 1;
-
-	for ( unsigned i = 0; i < ( unsigned ) subject.getContent ( )[begin].getRank ( ); i++ )
-		index = buildDataPointersPrefixRankedInternal ( res, subject, index );
-
-	res[begin] = index;
-	return index;
-}
-
 } /* namespace exact */
 
 } /* namespace arbology */
diff --git a/alib2algo/src/arbology/exact/SubtreeJumpTable.h b/alib2algo/src/arbology/exact/SubtreeJumpTable.h
index 770b8814773d18690f8f312034b6edf1c197b1ba..9bf88690b9096265646c2de44d9b8a0fb3e8f384 100644
--- a/alib2algo/src/arbology/exact/SubtreeJumpTable.h
+++ b/alib2algo/src/arbology/exact/SubtreeJumpTable.h
@@ -8,11 +8,16 @@
 #ifndef _SUBTREE_JUMP_TABLE_H_
 #define _SUBTREE_JUMP_TABLE_H_
 
+#include <vector>
+
 #include <tree/RankedTreeWrapper.h>
 #include <tree/TreeFeatures.h>
 #include <core/multipleDispatch.hpp>
 
-#include <vector>
+#include <tree/ranked/PrefixRankedTree.h>
+#include <tree/ranked/PrefixRankedPattern.h>
+#include <tree/ranked/PrefixRankedBarTree.h>
+#include <tree/ranked/PrefixRankedBarPattern.h>
 
 namespace arbology {
 
@@ -29,13 +34,97 @@ class SubtreeJumpTable : public std::SingleDispatch < SubtreeJumpTable, std::vec
 public:
 	static std::vector < int > compute ( const tree::RankedTreeWrapper & subject );
 
-	static std::vector < int > compute ( const tree::PrefixRankedBarTree < > & subject );
-	static std::vector < int > compute ( const tree::PrefixRankedBarPattern < > & pattern );
-	static std::vector < int > compute ( const tree::PrefixRankedTree < > & subject );
-	static std::vector < int > compute ( const tree::PrefixRankedPattern < > & pattern );
+	template < class SymbolType, class RankType >
+	static std::vector < int > compute ( const tree::PrefixRankedBarTree < SymbolType, RankType > & subject );
+	template < class SymbolType, class RankType >
+	static std::vector < int > compute ( const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern );
+	template < class SymbolType, class RankType >
+	static std::vector < int > compute ( const tree::PrefixRankedTree < SymbolType, RankType > & subject );
+	template < class SymbolType, class RankType >
+	static std::vector < int > compute ( const tree::PrefixRankedPattern < SymbolType, RankType > & pattern );
 
 };
 
+template < class SymbolType, class RankType >
+std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedBarTree < SymbolType, RankType > & subject ) {
+	std::vector < int > res;
+
+	buildDataPointersBar ( res, subject, 0 );
+
+	return res;
+}
+
+template < class SymbolType, class RankType >
+std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern ) {
+	std::vector < int > res;
+
+	buildDataPointersBar ( res, pattern, 0 );
+
+	return res;
+}
+
+template < class SymbolType, class RankType >
+std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedTree < SymbolType, RankType > & subject ) {
+	std::vector < int > res;
+
+	buildDataPointersPrefixRanked ( res, subject, 0 );
+
+	return res;
+}
+
+template < class SymbolType, class RankType >
+std::vector < int > SubtreeJumpTable::compute ( const tree::PrefixRankedPattern < SymbolType, RankType > & pattern ) {
+	std::vector < int > res;
+
+	buildDataPointersPrefixRanked ( res, pattern, 0 );
+
+	return res;
+}
+
+/**
+ * used to compute subtree jump table.
+ * @param begin - index of a root node of a complete subtree to process
+ * @return index, increased by one, of the last node in the subtree starting at index begin
+ */
+template < class T >
+int SubtreeJumpTable::buildDataPointersBar ( std::vector < int > & res, const T & subject, int begin ) {
+	res.push_back ( 0 );
+	int index = begin + 1;
+
+	if ( ! subject.getBars ( ).count ( subject.getContent ( )[begin] ) )
+		for ( unsigned i = 0; i < ( unsigned ) subject.getContent ( )[begin].getRank ( ); i++ )
+			index = buildDataPointersBar ( res, subject, index );
+
+	index++;
+	res[begin] = index;
+	res.push_back ( begin - 1 );
+	return index;
+}
+
+/**
+ * used to compute subtree jump table.
+ * @param begin - index of a root node of a complete subtree to process
+ * @return index, increased by one, of the last node in the subtree starting at index begin
+ */
+template < class T >
+int SubtreeJumpTable::buildDataPointersPrefixRanked ( std::vector < int > & res, const T & subject, int begin ) {
+	for ( unsigned i = 0; i < subject.getContent ( ).size ( ); i++ )
+		res.push_back ( 0 );
+
+	return buildDataPointersPrefixRankedInternal ( res, subject, begin );
+}
+
+template < class T >
+int SubtreeJumpTable::buildDataPointersPrefixRankedInternal ( std::vector < int > & res, const T & subject, int begin ) {
+	int index = begin + 1;
+
+	for ( unsigned i = 0; i < ( unsigned ) subject.getContent ( )[begin].getRank ( ); i++ )
+		index = buildDataPointersPrefixRankedInternal ( res, subject, index );
+
+	res[begin] = index;
+	return index;
+}
+
 } /* namespace exact */
 
 } /* namespace arbology */
diff --git a/alib2algo/src/arbology/transform/BeginToEndIndex.cpp b/alib2algo/src/arbology/transform/BeginToEndIndex.cpp
index c3f5487a7d43b0a7947d0522e441d147ec0746d7..06031a5e833f911ec7ea780f3afef1bb00c3fcf6 100644
--- a/alib2algo/src/arbology/transform/BeginToEndIndex.cpp
+++ b/alib2algo/src/arbology/transform/BeginToEndIndex.cpp
@@ -6,13 +6,6 @@
  */
 
 #include "BeginToEndIndex.h"
-#include "../exact/SubtreeJumpTable.h"
-
-#include <tree/Tree.h>
-#include <tree/ranked/PrefixRankedBarTree.h>
-#include <tree/ranked/PrefixRankedTree.h>
-
-#include <map>
 
 namespace arbology {
 
@@ -22,28 +15,7 @@ std::set < unsigned > BeginToEndIndex::transform ( const tree::Tree & subject, c
 	return dispatch ( subject.getData ( ), indexes );
 }
 
-std::set < unsigned > BeginToEndIndex::transform ( const tree::PrefixRankedBarTree < > & subject, const std::set < unsigned > & indexes ) {
-	std::vector < int > subjectSubtreeJumpTable = exact::SubtreeJumpTable::compute ( subject );
-	std::set < unsigned > res;
-
-	for ( unsigned index : indexes )
-		res.insert ( subjectSubtreeJumpTable[index] );
-
-	return res;
-}
-
 auto BeginToEndIndexPrefixRankedBarTreePrefixRankedBarTree = BeginToEndIndex::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < > > ( BeginToEndIndex::transform );
-
-std::set < unsigned > BeginToEndIndex::transform ( const tree::PrefixRankedTree < > & subject, const std::set < unsigned > & indexes ) {
-	std::vector < int > subjectSubtreeJumpTable = exact::SubtreeJumpTable::compute ( subject );
-	std::set < unsigned > res;
-
-	for ( unsigned index : indexes )
-		res.insert ( subjectSubtreeJumpTable[index] );
-
-	return res;
-}
-
 auto BeginToEndIndexPrefixRankedBarTreePrefixRankedBarPattern = BeginToEndIndex::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < > > ( BeginToEndIndex::transform );
 
 } /* namespace transform */
diff --git a/alib2algo/src/arbology/transform/BeginToEndIndex.h b/alib2algo/src/arbology/transform/BeginToEndIndex.h
index 6af6a473a48daa37a87bcb39cd85b43c3816a131..a44e3880f3d67b69266cc60a92333d5686de52cd 100644
--- a/alib2algo/src/arbology/transform/BeginToEndIndex.h
+++ b/alib2algo/src/arbology/transform/BeginToEndIndex.h
@@ -12,6 +12,12 @@
 #include <core/multipleDispatch.hpp>
 #include <tree/TreeFeatures.h>
 
+#include <arbology/exact/SubtreeJumpTable.h>
+
+#include <tree/Tree.h>
+#include <tree/ranked/PrefixRankedBarTree.h>
+#include <tree/ranked/PrefixRankedTree.h>
+
 namespace arbology {
 
 namespace transform {
@@ -26,11 +32,35 @@ public:
 	 */
 	static std::set < unsigned > transform ( const tree::Tree & subject, const std::set < unsigned > & indexes );
 
-	static std::set < unsigned > transform ( const tree::PrefixRankedBarTree < > & subject, const std::set < unsigned > & indexes );
-	static std::set < unsigned > transform ( const tree::PrefixRankedTree < > & subject, const std::set < unsigned > & indexes );
+	template < class SymbolType, class RankType >
+	static std::set < unsigned > transform ( const tree::PrefixRankedBarTree < SymbolType, RankType > & subject, const std::set < unsigned > & indexes );
+	template < class SymbolType, class RankType >
+	static std::set < unsigned > transform ( const tree::PrefixRankedTree < SymbolType, RankType > & subject, const std::set < unsigned > & indexes );
 
 };
 
+template < class SymbolType, class RankType >
+std::set < unsigned > BeginToEndIndex::transform ( const tree::PrefixRankedBarTree < SymbolType, RankType > & subject, const std::set < unsigned > & indexes ) {
+	std::vector < int > subjectSubtreeJumpTable = exact::SubtreeJumpTable::compute ( subject );
+	std::set < unsigned > res;
+
+	for ( unsigned index : indexes )
+		res.insert ( subjectSubtreeJumpTable[index] );
+
+	return res;
+}
+
+template < class SymbolType, class RankType >
+std::set < unsigned > BeginToEndIndex::transform ( const tree::PrefixRankedTree < SymbolType, RankType > & subject, const std::set < unsigned > & indexes ) {
+	std::vector < int > subjectSubtreeJumpTable = exact::SubtreeJumpTable::compute ( subject );
+	std::set < unsigned > res;
+
+	for ( unsigned index : indexes )
+		res.insert ( subjectSubtreeJumpTable[index] );
+
+	return res;
+}
+
 } /* namespace transform */
 
 } /* namespace arbology */