diff --git a/alib2algo/src/stringology/indexing/SuffixTrie.cpp b/alib2algo/src/stringology/indexing/SuffixTrie.cpp
index a4f550b70a6569dddbe68b7638b0017039ad6361..2de37e1db2a0365c1ee590fc0732d3b493e9772e 100644
--- a/alib2algo/src/stringology/indexing/SuffixTrie.cpp
+++ b/alib2algo/src/stringology/indexing/SuffixTrie.cpp
@@ -9,6 +9,7 @@
 
 #include <exception/AlibException.h>
 #include <string/LinearString.h>
+#include <string/LinearStringTerminatingSymbol.h>
 #include <string/Epsilon.h>
 #include <alphabet/EndSymbol.h>
 
@@ -31,9 +32,8 @@ indexes::SuffixTrieFinalMark SuffixTrie::construct ( const string::LinearString
 		while ( k < w.getContent ( ).size ( ) && n->hasChild ( w.getContent ( )[k] ) )
 			n = & n->getChild ( w.getContent ( )[k++] );
 
-		for ( ; k < w.getContent ( ).size ( ); k++ ) {
+		for ( ; k < w.getContent ( ).size ( ); k++ )
 			n = & n->addChild ( w.getContent ( )[k], indexes::SuffixTrieNodeFinalMark ( { }, false ) );
-		}
 
 		n->setFinalMark ( true );
 	}
@@ -41,27 +41,28 @@ indexes::SuffixTrieFinalMark SuffixTrie::construct ( const string::LinearString
 	return res;
 }
 
-/*indexes::SuffixTrieTerminatingSymbol SuffixTrie::construct ( const string::TerminatedLinearString & w ) {
- *  indexes::SuffixTrieTerminatingSymbol res ( w.getAlphabet ( ), w.getTerminatingSymbol() );
- *
- *  for ( unsigned int i = 0; i < w.getContent ( ).size ( ); i++ ) {
- *      unsigned int k = i;
- *      indexes::SuffixTrieNodeTerminatingSymbol * n = & res.getRoot ( );
- *
- *      // inlined slow_find_one from MI-EVY lectures
- *      while ( k < w.getContent ( ).size ( ) && n->hasChild ( w.getContent ( )[k] ) )
- *          n = & n->getChild ( w.getContent ( )[k++] );
- *
- *      for ( ; k < w.getContent ( ).size ( ); k++ ) {
- *          n = & n->addChild ( w.getContent ( )[k], indexes::SuffixTrieNodeTerminatingSymbol ( { } ) );
- *      }
- *  }
- *
- *  return res;
- * }*/
-
 auto SuffixTrieLinearString = SuffixTrie::RegistratorWrapper < indexes::SuffixTrieFinalMark, string::LinearString > ( SuffixTrie::getInstance ( ), SuffixTrie::construct );
 
+indexes::SuffixTrieTerminatingSymbol SuffixTrie::construct ( const string::LinearStringTerminatingSymbol & w ) {
+	indexes::SuffixTrieTerminatingSymbol res ( w.getAlphabet ( ), w.getTerminatingSymbol ( ) );
+
+	for ( unsigned int i = 0; i < w.getContent ( ).size ( ); i++ ) {
+		unsigned int k = i;
+		indexes::SuffixTrieNodeTerminatingSymbol * n = & res.getRoot ( );
+
+		 // inlined slow_find_one from MI-EVY lectures
+		while ( k < w.getContent ( ).size ( ) && n->hasChild ( w.getContent ( )[k] ) )
+			n = & n->getChild ( w.getContent ( )[k++] );
+
+		for ( ; k < w.getContent ( ).size ( ); k++ )
+			n = & n->addChild ( w.getContent ( )[k], indexes::SuffixTrieNodeTerminatingSymbol ( { } ) );
+	}
+
+	return res;
+}
+
+auto SuffixTrieTerminatingSymbolLinearStringTerminatingSymbol = SuffixTrie::RegistratorWrapper < indexes::SuffixTrieTerminatingSymbol, string::LinearStringTerminatingSymbol > ( SuffixTrie::getInstance ( ), SuffixTrie::construct );
+
 } /* namespace indexing */
 
 } /* namespace stringology */
diff --git a/alib2algo/src/stringology/indexing/SuffixTrie.h b/alib2algo/src/stringology/indexing/SuffixTrie.h
index f208afdb686bae185967878881202c8513ff284d..54f95be6c72eb76105d196f5e7cb57ff90200fc1 100644
--- a/alib2algo/src/stringology/indexing/SuffixTrie.h
+++ b/alib2algo/src/stringology/indexing/SuffixTrie.h
@@ -9,8 +9,10 @@
 #define SUFFIX_TRIE_H_
 
 #include <indexes/suffixTrie/SuffixTrieFinalMark.h>
+#include <indexes/suffixTrie/SuffixTrieTerminatingSymbol.h>
 #include <string/String.h>
 #include <string/LinearString.h>
+#include <string/LinearStringTerminatingSymbol.h>
 #include <common/multipleDispatch.hpp>
 
 namespace stringology {
@@ -33,6 +35,7 @@ public:
 	static indexes::SuffixTrieFinalMark construct ( const string::String & string );
 
 	static indexes::SuffixTrieFinalMark construct ( const string::LinearString & string );
+	static indexes::SuffixTrieTerminatingSymbol construct ( const string::LinearStringTerminatingSymbol & string );
 
 public:
 	static SuffixTrie & getInstance ( ) {
diff --git a/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.cpp b/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.cpp
index c93ba8fd13ee7c1a0dcd101002003afda715c1ed..bf5248d27a264aa4dd4a47500c3a33c31a5cb788 100644
--- a/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.cpp
+++ b/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "SuffixTrieFinalMark.h"
+#include "SuffixTrieTerminatingSymbol.h"
 #include "../../exception/AlibException.h"
 
 #include <iostream>
@@ -37,6 +38,13 @@ SuffixTrieFinalMark::SuffixTrieFinalMark ( SuffixTrieNodeFinalMark tree ) {
 	setTree ( std::move ( tree ) );
 }
 
+SuffixTrieFinalMark::SuffixTrieFinalMark ( const SuffixTrieTerminatingSymbol & other ) {
+	this->alphabet = other.getAlphabet ( );
+	this->alphabet.erase ( other.getTerminatingSymbol ( ) );
+	this->tree = NULL;
+	setTree ( SuffixTrieNodeFinalMark ( other.getRoot ( ), other.getTerminatingSymbol ( ) ) );
+}
+
 SuffixTrieFinalMark::SuffixTrieFinalMark ( const SuffixTrieFinalMark & other ) : tree ( other.tree->clone ( ) ) {
 	alphabet = other.alphabet;
 	this->tree->attachTree ( this );
diff --git a/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.h b/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.h
index 74f676f7bd5baba87bead2f5255cee58c3929c1e..3ac0cd7f2c43e9bf1e4f966eaaebec9d71296176 100644
--- a/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.h
+++ b/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.h
@@ -18,6 +18,8 @@
 
 namespace indexes {
 
+class SuffixTrieTerminatingSymbol;
+
 /**
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of RegExpElement.
@@ -41,6 +43,8 @@ public:
 	explicit SuffixTrieFinalMark ( std::set < alphabet::Symbol > alphabet, SuffixTrieNodeFinalMark tree );
 	explicit SuffixTrieFinalMark ( SuffixTrieNodeFinalMark tree );
 
+	explicit SuffixTrieFinalMark ( const SuffixTrieTerminatingSymbol & tree );
+
 	/**
 	 * Copy constructor.
 	 * @param other tree to copy
diff --git a/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.cpp b/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.cpp
index 445ca0eb5b51b5ec7ed1451db13e1f2453fec45b..01fd5b6e3f71ffb616bb02e6d05325001a629b77 100644
--- a/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.cpp
+++ b/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "SuffixTrieNodeFinalMark.h"
+#include "SuffixTrieNodeTerminatingSymbol.h"
 #include "SuffixTrieFinalMark.h"
 #include "../../exception/AlibException.h"
 #include <sstream>
@@ -20,6 +21,20 @@ SuffixTrieNodeFinalMark::SuffixTrieNodeFinalMark ( std::map < alphabet::Symbol,
 	this->parent = NULL;
 }
 
+SuffixTrieNodeFinalMark::SuffixTrieNodeFinalMark ( const SuffixTrieNodeTerminatingSymbol & other, const alphabet::Symbol & terminatingSymbol ) : finalMark ( false ), parentTree ( NULL ) {
+	for ( auto & element : other.getChildren ( ) )
+		if ( element.first == terminatingSymbol )
+			this->finalMark = true;
+		else
+			this->children.insert ( std::make_pair ( element.first, new SuffixTrieNodeFinalMark ( * element.second, terminatingSymbol ) ) );
+
+	for ( auto & element : this->children )
+		element.second->parent = this;
+
+	this->attachTree ( NULL );
+	this->parent = NULL;
+}
+
 SuffixTrieNodeFinalMark::SuffixTrieNodeFinalMark ( const SuffixTrieNodeFinalMark & other ) : finalMark ( other.finalMark ), parentTree ( NULL ) {
 	for ( const auto & element : other.children )
 		children.insert ( std::make_pair ( element.first, element.second->clone ( ) ) );
diff --git a/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.h b/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.h
index 22cea8bad1c55079d1374321a3caf046dbb02350..dedd2259f357f801a9d491ee827c6d012ef0f912 100644
--- a/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.h
+++ b/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.h
@@ -16,6 +16,8 @@
 
 namespace indexes {
 
+class SuffixTrieNodeTerminatingSymbol;
+
 /**
  * Represents a node in the ranked tree. Contains name of the symbol.
  */
@@ -50,6 +52,8 @@ protected:
 public:
 	explicit SuffixTrieNodeFinalMark ( std::map < alphabet::Symbol, SuffixTrieNodeFinalMark * > children, bool finalMark );
 
+	explicit SuffixTrieNodeFinalMark ( const SuffixTrieNodeTerminatingSymbol & other, const alphabet::Symbol & terminatingSymbol );
+
 	SuffixTrieNodeFinalMark ( const SuffixTrieNodeFinalMark & other );
 	SuffixTrieNodeFinalMark ( SuffixTrieNodeFinalMark && other ) noexcept;
 	SuffixTrieNodeFinalMark & operator =( const SuffixTrieNodeFinalMark & other );