diff --git a/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp b/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..459e1325d77fbb27c10f412ee8c7cfce9e3bb60a
--- /dev/null
+++ b/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp
@@ -0,0 +1,60 @@
+/*
+ * Author: Radovan Cerveny
+ */
+
+#include "ExactFactorOracleAutomaton.h"
+#include <string/LinearString.h>
+
+namespace stringology {
+
+namespace indexing {
+
+automaton::Automaton ExactFactorOracleAutomaton::construct ( const string::String & pattern ) {
+	return dispatch ( pattern.getData ( ) );
+}
+
+automaton::DFA < > ExactFactorOracleAutomaton::construct ( const string::LinearString < > & pattern ) {
+	automaton::DFA < > oracle ( DefaultStateType ( 0 ) );
+
+	oracle.addFinalState ( oracle.getInitialState ( ) );
+
+	std::map < DefaultStateType, DefaultStateType > supplyFunction { { DefaultStateType ( 0 ), DefaultStateType ( -1 ) } };
+
+	oracle.setInputAlphabet ( pattern.getAlphabet ( ) );
+
+	for ( const DefaultSymbolType & symbol : pattern.getContent ( ) )
+		oracleAddLetter ( oracle, symbol, supplyFunction );
+
+	return oracle;
+}
+
+void ExactFactorOracleAutomaton::oracleAddLetter ( automaton::DFA < > & oracle, const DefaultSymbolType & symbol, std::map < DefaultStateType, DefaultStateType > & supplyFunction ) {
+	int m = ( int ) oracle.getStates ( ).size ( ) - 1;
+
+	DefaultStateType lastState = DefaultStateType ( m );
+	DefaultStateType newState = DefaultStateType ( m + 1 );
+
+	oracle.addState ( newState );
+	oracle.addFinalState ( newState );
+
+	oracle.addTransition ( lastState, symbol, newState );
+	DefaultStateType kState = supplyFunction.find( lastState ) -> second;
+
+	while ( kState != DefaultStateType ( -1 ) && oracle.getTransitions ( ).find ( { kState, symbol } ) == oracle.getTransitions ( ).end ( ) ) {
+		oracle.addTransition ( kState, symbol, newState );
+		kState = supplyFunction.find( kState ) -> second;
+	}
+
+	DefaultStateType supplyState = DefaultStateType ( 0 );
+
+	if ( kState != DefaultStateType ( -1 ) )
+		supplyState = oracle.getTransitions ( ).find( { kState, symbol } ) -> second;
+
+	supplyFunction.insert( { newState, supplyState } );
+}
+
+auto FactorOracleAutomatonLinearString = ExactFactorOracleAutomaton::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( ExactFactorOracleAutomaton::construct );
+
+} /* namespace indexing */
+
+} /* namespace stringology */
diff --git a/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.h b/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.h
new file mode 100644
index 0000000000000000000000000000000000000000..8bb6bbc7aefe010c79a5fb0bcd1eebb4bdc0378d
--- /dev/null
+++ b/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.h
@@ -0,0 +1,37 @@
+/*
+ * Author: Radovan Cerveny
+ */
+
+#ifndef EXACT_FACTOR_ORACLE_AUTOMATON_H_
+#define EXACT_FACTOR_ORACLE_AUTOMATON_H_
+
+#include <automaton/Automaton.h>
+#include <automaton/FSM/DFA.h>
+#include <string/LinearString.h>
+#include <string/String.h>
+#include <core/multipleDispatch.hpp>
+
+namespace stringology {
+
+namespace indexing {
+
+class ExactFactorOracleAutomaton : public std::SingleDispatch < ExactFactorOracleAutomaton, automaton::Automaton, const string::StringBase & > {
+private:
+	static void oracleAddLetter ( automaton::DFA < > & oracle, const DefaultSymbolType & symbol, std::map < DefaultStateType, DefaultStateType > & supplyFunction );
+
+public:
+	/**
+	 * Constructs factor oracle automaton for given pattern.
+	 * @return factor oracle automaton for given pattern
+	 */
+	static automaton::Automaton construct ( const string::String & pattern );
+
+	static automaton::DFA < > construct ( const string::LinearString < > & pattern );
+
+};
+
+} /* namespace indexing */
+
+} /* namespace stringology */
+
+#endif /* EXACT_FACTOR_ORACLE_AUTOMATON_H_ */
diff --git a/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp b/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp
index 2ccae37ac0c8e7d93804dc9f13dbf280229c0e05..1a5268690eaec6b7585f0bee5ff5dcd6c24016f7 100644
--- a/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp
+++ b/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp
@@ -21,7 +21,7 @@ automaton::DFA < > DAWGMatcherConstruction::construct ( const string::LinearStri
 	return stringology::indexing::ExactSuffixAutomaton::construct ( reversedPattern );
 }
 
-auto SuffixAutomatonLinearString = DAWGMatcherConstruction::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( DAWGMatcherConstruction::construct );
+auto DAWGMatcherConstructionLinearString = DAWGMatcherConstruction::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( DAWGMatcherConstruction::construct );
 
 } /* namespace matching */
 
diff --git a/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp b/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp
index bf55f3ce2cc9cca29c4c545b7d87817cf724a69f..c9f139a74279f500e2da0d1e4b000b23fa07d107 100644
--- a/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp
+++ b/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp
@@ -27,7 +27,7 @@ automaton::DFA < DefaultSymbolType, std::set < unsigned > > NaiveDAWGMatcherCons
 
 }
 
-auto SuffixAutomatonNaiveLinearString = NaiveDAWGMatcherConstruction::RegistratorWrapper < automaton::DFA < DefaultSymbolType, std::set < unsigned > >, string::LinearString < > > ( NaiveDAWGMatcherConstruction::naiveConstruct );
+auto NaiveDAWGMatcherConstructionLinearString = NaiveDAWGMatcherConstruction::RegistratorWrapper < automaton::DFA < DefaultSymbolType, std::set < unsigned > >, string::LinearString < > > ( NaiveDAWGMatcherConstruction::naiveConstruct );
 
 } /* namespace matching */
 
diff --git a/alib2algo/src/stringology/matching/OracleMatcherConstruction.cpp b/alib2algo/src/stringology/matching/OracleMatcherConstruction.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..aa9b1f24dd03e7e317976bdc4a0d95c468089402
--- /dev/null
+++ b/alib2algo/src/stringology/matching/OracleMatcherConstruction.cpp
@@ -0,0 +1,28 @@
+/*
+ * Author: Radovan Cerveny
+ */
+
+#include "OracleMatcherConstruction.h"
+#include <stringology/indexing/ExactSuffixAutomaton.h>
+
+namespace stringology {
+
+namespace matching {
+
+automaton::Automaton OracleMatcherConstruction::construct ( const string::String & pattern ) {
+	return dispatch ( pattern.getData ( ) );
+}
+
+automaton::DFA < > OracleMatcherConstruction::construct ( const string::LinearString < > & pattern ) {
+	auto patternData = pattern.getContent ( );
+	reverse ( patternData.begin ( ), patternData.end ( ) );
+	string::LinearString < > reversedPattern ( pattern.getAlphabet ( ), std::move ( patternData ) );
+
+	return stringology::indexing::ExactSuffixAutomaton::construct ( reversedPattern );
+}
+
+auto OracleMatcherConstructionLinearString = OracleMatcherConstruction::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( OracleMatcherConstruction::construct );
+
+} /* namespace matching */
+
+} /* namespace stringology */
diff --git a/alib2algo/src/stringology/matching/OracleMatcherConstruction.h b/alib2algo/src/stringology/matching/OracleMatcherConstruction.h
new file mode 100644
index 0000000000000000000000000000000000000000..cfeb8e4de4b088caa77bf5b91fffd5e7bd8b18b8
--- /dev/null
+++ b/alib2algo/src/stringology/matching/OracleMatcherConstruction.h
@@ -0,0 +1,35 @@
+/*
+ * Author: Radovan Cerveny
+ */
+
+#ifndef ORACLE_MATCHER_CONSTRUCTION_H_
+#define ORACLE_MATCHER_CONSTRUCTION_H_
+
+#include <automaton/Automaton.h>
+#include <automaton/FSM/DFA.h>
+#include <automaton/FSM/EpsilonNFA.h>
+#include <string/LinearString.h>
+#include <string/String.h>
+#include <core/multipleDispatch.hpp>
+
+namespace stringology {
+
+namespace matching {
+
+class OracleMatcherConstruction : public std::SingleDispatch < OracleMatcherConstruction, automaton::Automaton, const string::StringBase & > {
+public:
+	 /**
+	 * Linear time on-line construction of minimal suffix automaton for given pattern.
+	 * @return minimal suffix automaton for given pattern.
+	 */
+	static automaton::Automaton construct ( const string::String & pattern );
+
+	static automaton::DFA < > construct ( const string::LinearString < > & pattern );
+
+};
+
+} /* namespace matching */
+
+} /* namespace stringology */
+
+#endif /* ORACLE_MATCHER_CONSTRUCTION_H_ */
diff --git a/alib2algo/test-src/stringology/matching/ExactSuffixAutomatonTest.cpp b/alib2algo/test-src/stringology/indexing/ExactSuffixAutomatonTest.cpp
similarity index 95%
rename from alib2algo/test-src/stringology/matching/ExactSuffixAutomatonTest.cpp
rename to alib2algo/test-src/stringology/indexing/ExactSuffixAutomatonTest.cpp
index ea92de7003b296726fdcf2a628ae0c090243c2e8..3427482ec267531e99b92bd099d3e30da6c421f4 100644
--- a/alib2algo/test-src/stringology/matching/ExactSuffixAutomatonTest.cpp
+++ b/alib2algo/test-src/stringology/indexing/ExactSuffixAutomatonTest.cpp
@@ -3,9 +3,6 @@
 #include "string/LinearString.h"
 #include "stringology/indexing/ExactSuffixAutomaton.h"
 
-#include "string/generate/RandomStringFactory.h"
-#include "string/generate/RandomSubstringFactory.h"
-
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION ( ExactSuffixAutomatonTest, "stringology" );
 CPPUNIT_TEST_SUITE_REGISTRATION ( ExactSuffixAutomatonTest );
 
diff --git a/alib2algo/test-src/stringology/matching/ExactSuffixAutomatonTest.h b/alib2algo/test-src/stringology/indexing/ExactSuffixAutomatonTest.h
similarity index 100%
rename from alib2algo/test-src/stringology/matching/ExactSuffixAutomatonTest.h
rename to alib2algo/test-src/stringology/indexing/ExactSuffixAutomatonTest.h
diff --git a/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.cpp b/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..168cea6598bdda01eb7bf6a6e7721cb613008859
--- /dev/null
+++ b/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.cpp
@@ -0,0 +1,43 @@
+#include "FactorOracleAutomatonTest.h"
+
+#include "string/LinearString.h"
+#include "stringology/indexing/ExactFactorOracleAutomaton.h"
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION ( FactorOracleAutomatonTest, "stringology" );
+CPPUNIT_TEST_SUITE_REGISTRATION ( FactorOracleAutomatonTest );
+
+void FactorOracleAutomatonTest::setUp ( ) {
+}
+
+void FactorOracleAutomatonTest::tearDown ( ) {
+}
+
+void FactorOracleAutomatonTest::testFactorOracleConstruction ( ) {
+	string::LinearString < > pattern ( "atatac" );
+
+	automaton::DFA<> oracle = stringology::indexing::ExactFactorOracleAutomaton::construct ( pattern );
+
+	automaton::DFA<> refOracle ( DefaultStateType ( 0 ) );
+
+	refOracle.addFinalState ( DefaultStateType ( 0 ) );
+
+	refOracle.setInputAlphabet ( pattern.getAlphabet ( ) );
+
+	for ( int i = 1; i <= 6; ++i ) {
+		refOracle.addState ( DefaultStateType ( i ) );
+		refOracle.addFinalState ( DefaultStateType ( i ) );
+	}
+
+	refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 1 ) );
+	refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 't' ), DefaultStateType ( 2 ) );
+	refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) );
+	refOracle.addTransition ( DefaultStateType ( 1 ), DefaultSymbolType ( 't' ), DefaultStateType ( 2 ) );
+	refOracle.addTransition ( DefaultStateType ( 1 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) );
+	refOracle.addTransition ( DefaultStateType ( 2 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 3 ) );
+	refOracle.addTransition ( DefaultStateType ( 3 ), DefaultSymbolType ( 't' ), DefaultStateType ( 4 ) );
+	refOracle.addTransition ( DefaultStateType ( 3 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) );
+	refOracle.addTransition ( DefaultStateType ( 4 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 5 ) );
+	refOracle.addTransition ( DefaultStateType ( 5 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) );
+
+	CPPUNIT_ASSERT ( oracle == refOracle );
+}
diff --git a/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.h b/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..3252d2be457893c52dfa2562bb8e0d92a0a08726
--- /dev/null
+++ b/alib2algo/test-src/stringology/indexing/FactorOracleAutomatonTest.h
@@ -0,0 +1,18 @@
+#ifndef FACTOR_ORACLE_AUTOMATON_TEST_HPP_
+#define FACTOR_ORACLE_AUTOMATON_TEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+class FactorOracleAutomatonTest : public CppUnit::TestFixture {
+	CPPUNIT_TEST_SUITE ( FactorOracleAutomatonTest );
+	CPPUNIT_TEST ( testFactorOracleConstruction );
+	CPPUNIT_TEST_SUITE_END ( );
+
+public:
+	void setUp ( );
+	void tearDown ( );
+
+	void testFactorOracleConstruction ( );
+};
+
+#endif // FACTOR_ORACLE_AUTOMATON_TEST_HPP_
diff --git a/alib2algo_experimental/src/stringology/exact/BackwardOracleMatching.cpp b/alib2algo_experimental/src/stringology/exact/BackwardOracleMatching.cpp
index 7fdf0a981fb5a7f920ed0b923704b7bb0aab542b..7fdff5229889b37250481a84569b2292650d5bbd 100644
--- a/alib2algo_experimental/src/stringology/exact/BackwardOracleMatching.cpp
+++ b/alib2algo_experimental/src/stringology/exact/BackwardOracleMatching.cpp
@@ -3,7 +3,7 @@
  */
 
 #include "BackwardOracleMatching.h"
-#include "FactorOracleAutomaton.h"
+#include "stringology/matching/OracleMatcherConstruction.h"
 
 #include <string/LinearString.h>
 #include <alphabet/Symbol.h>
@@ -26,13 +26,7 @@ std::set < unsigned > BackwardOracleMatching::match ( const string::LinearString
 
     measurements::start ( "Preprocess", measurements::Type::PREPROCESS );
 
-    auto patternData = pattern.getContent ( );
-
-    reverse ( patternData.begin ( ), patternData.end ( ) );
-
-    const string::LinearString < > reversedPattern ( std::move ( patternData ) );
-
-    automaton::DFA<> factorOracle = FactorOracleAutomaton::construct ( reversedPattern );
+    automaton::DFA<> factorOracle = stringology::matching::OracleMatcherConstruction::construct ( pattern );
 
     measurements::end ( );
 
@@ -46,7 +40,7 @@ std::set < unsigned > BackwardOracleMatching::match ( const string::LinearString
 
         DefaultStateType currentState = factorOracle.getInitialState ( );
 
-        size_t posInPattern = reversedPattern.getContent ( ).size ( );
+        size_t posInPattern = pattern.getContent ( ).size ( );
 
         while ( posInPattern > 0 && currentState != failState ) {
             auto transition = factorOracle.getTransitions ( ).find ( { currentState, subject.getContent ( ).at ( posInSubject + posInPattern - 1 ) } );
diff --git a/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.cpp b/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.cpp
deleted file mode 100644
index 17283f481acc0c1286a1dfa6424010a3a90f2d04..0000000000000000000000000000000000000000
--- a/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Author: Radovan Cerveny
- */
-
-#include "FactorOracleAutomaton.h"
-#include <string/LinearString.h>
-
-namespace stringology {
-
-namespace exact {
-
-automaton::Automaton FactorOracleAutomaton::construct ( const string::String & pattern ) {
-    return dispatch ( pattern.getData ( ) );
-}
-
-automaton::DFA<> FactorOracleAutomaton::construct ( const string::LinearString < > & pattern ) {
-    automaton::DFA<> oracle ( DefaultStateType ( 0 ) );
-
-    oracle.addFinalState ( oracle.getInitialState ( ) );
-
-    std::map < DefaultStateType, DefaultStateType > supplyFunction { { DefaultStateType ( 0 ), DefaultStateType ( -1 ) } };
-
-    oracle.setInputAlphabet ( pattern.getAlphabet ( ) );
-
-    for ( const DefaultSymbolType & symbol : pattern.getContent ( ) )
-        oracleAddLetter ( oracle, symbol, supplyFunction );
-
-    return oracle;
-}
-
-void FactorOracleAutomaton::oracleAddLetter ( automaton::DFA<> & oracle, const DefaultSymbolType & symbol, std::map < DefaultStateType, DefaultStateType > & supplyFunction ) {
-    int m = ( int ) oracle.getStates ( ).size ( ) - 1;
-
-    DefaultStateType lastState = DefaultStateType ( m );
-    DefaultStateType newState = DefaultStateType ( m + 1 );
-
-    oracle.addState ( newState );
-    oracle.addFinalState ( newState );
-
-    oracle.addTransition ( lastState, symbol, newState );
-    DefaultStateType kState = supplyFunction.find( lastState ) -> second;
-
-    while ( kState != DefaultStateType ( -1 ) && oracle.getTransitions ( ).find ( { kState, symbol } ) == oracle.getTransitions ( ).end ( ) ) {
-        oracle.addTransition ( kState, symbol, newState );
-        kState = supplyFunction.find( kState ) -> second;
-    }
-
-    DefaultStateType supplyState = DefaultStateType ( 0 );
-
-    if ( kState != DefaultStateType ( -1 ) )
-        supplyState = oracle.getTransitions ( ).find( { kState, symbol } ) -> second;
-
-    supplyFunction.insert( { newState, supplyState } );
-}
-
-auto FactorOracleAutomatonLinearString = FactorOracleAutomaton::RegistratorWrapper < automaton::DFA<>, string::LinearString < > > ( FactorOracleAutomaton::construct );
-
-} /* namespace exact */
-
-} /* namespace stringology */
diff --git a/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.h b/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.h
deleted file mode 100644
index 62971aeef030e6b495f369b476f34dd49fb28569..0000000000000000000000000000000000000000
--- a/alib2algo_experimental/src/stringology/exact/FactorOracleAutomaton.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Author: Radovan Cerveny
- */
-
-#ifndef FACTOR_ORACLE_AUTOMATON_H__
-#define FACTOR_ORACLE_AUTOMATON_H__
-
-#include <automaton/Automaton.h>
-#include <automaton/FSM/DFA.h>
-#include <string/LinearString.h>
-#include <string/String.h>
-#include <core/multipleDispatch.hpp>
-
-namespace stringology {
-
-namespace exact {
-
-class FactorOracleAutomaton : public std::SingleDispatch < FactorOracleAutomaton, automaton::Automaton, const string::StringBase & > {
-private:
-    static void oracleAddLetter ( automaton::DFA<> & oracle, const DefaultSymbolType & symbol, std::map < DefaultStateType, DefaultStateType > & supplyFunction );
-
-public:
-    /**
-     * Constructs factor oracle automaton for given pattern.
-     * @return factor oracle automaton for given pattern
-     */
-    static automaton::Automaton construct ( const string::String & pattern );
-
-    static automaton::DFA<> construct ( const string::LinearString < > & pattern );
-
-};
-
-} /* namespace exact */
-
-} /* namespace stringology */
-
-#endif /* FACTOR_ORACLE_AUTOMATON_H__ */
diff --git a/alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.h b/alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.h
deleted file mode 100644
index b3b4bb947fe0819897488c23b459e430449af3be..0000000000000000000000000000000000000000
--- a/alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef FACTOR_ORACLE_AUTOMATON_TEST_HPP_
-#define FACTOR_ORACLE_AUTOMATON_TEST_HPP_
-
-#include <cppunit/extensions/HelperMacros.h>
-
-class FactorOracleAutomatonTest : public CppUnit::TestFixture {
-    CPPUNIT_TEST_SUITE ( FactorOracleAutomatonTest );
-    CPPUNIT_TEST ( testFactorOracleConstruction );
-    CPPUNIT_TEST ( testBackwardOracleMatching );
-    CPPUNIT_TEST_SUITE_END ( );
-
-public:
-    void setUp ( );
-    void tearDown ( );
-
-    void testFactorOracleConstruction ( );
-    void testBackwardOracleMatching ( );
-};
-
-#endif // FACTOR_ORACLE_AUTOMATON_TEST_HPP_
diff --git a/alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.cpp b/alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.cpp
similarity index 56%
rename from alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.cpp
rename to alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.cpp
index e71878e082582419854a7be80eb86eb99fbbb613..b0c3a7d4e614abab98d427faa1e27720f30e094c 100644
--- a/alib2algo_experimental/test-src/stringology/exact/FactorOracleAutomatonTest.cpp
+++ b/alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.cpp
@@ -1,54 +1,22 @@
-#include "FactorOracleAutomatonTest.h"
+#include "OracleMatcherTest.h"
 
 #include "string/LinearString.h"
-#include "stringology/exact/FactorOracleAutomaton.h"
 #include "stringology/exact/BackwardOracleMatching.h"
 #include "stringology/exact/ExactFactorMatch.h"
 
 #include "string/generate/RandomStringFactory.h"
 #include "string/generate/RandomSubstringFactory.h"
 
-CPPUNIT_TEST_SUITE_NAMED_REGISTRATION ( FactorOracleAutomatonTest, "stringology" );
-CPPUNIT_TEST_SUITE_REGISTRATION ( FactorOracleAutomatonTest );
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION ( OracleMatcherTest, "stringology" );
+CPPUNIT_TEST_SUITE_REGISTRATION ( OracleMatcherTest );
 
-void FactorOracleAutomatonTest::setUp ( ) {
+void OracleMatcherTest::setUp ( ) {
 }
 
-void FactorOracleAutomatonTest::tearDown ( ) {
+void OracleMatcherTest::tearDown ( ) {
 }
 
-void FactorOracleAutomatonTest::testFactorOracleConstruction ( ) {
-
-    string::LinearString < > pattern ( "atatac" );
-
-    automaton::DFA<> oracle = stringology::exact::FactorOracleAutomaton::construct ( pattern );
-
-    automaton::DFA<> refOracle ( DefaultStateType ( 0 ) );
-
-    refOracle.addFinalState ( DefaultStateType ( 0 ) );
-
-    refOracle.setInputAlphabet ( pattern.getAlphabet ( ) );
-
-    for ( int i = 1; i <= 6; ++i ) {
-        refOracle.addState ( DefaultStateType ( i ) );
-        refOracle.addFinalState ( DefaultStateType ( i ) );
-    }
-
-    refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 1 ) );
-    refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 't' ), DefaultStateType ( 2 ) );
-    refOracle.addTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) );
-    refOracle.addTransition ( DefaultStateType ( 1 ), DefaultSymbolType ( 't' ), DefaultStateType ( 2 ) );
-    refOracle.addTransition ( DefaultStateType ( 1 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) );
-    refOracle.addTransition ( DefaultStateType ( 2 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 3 ) );
-    refOracle.addTransition ( DefaultStateType ( 3 ), DefaultSymbolType ( 't' ), DefaultStateType ( 4 ) );
-    refOracle.addTransition ( DefaultStateType ( 3 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) );
-    refOracle.addTransition ( DefaultStateType ( 4 ), DefaultSymbolType ( 'a' ), DefaultStateType ( 5 ) );
-    refOracle.addTransition ( DefaultStateType ( 5 ), DefaultSymbolType ( 'c' ), DefaultStateType ( 6 ) );
-
-    CPPUNIT_ASSERT ( oracle == refOracle );
-}
-
-void FactorOracleAutomatonTest::testBackwardOracleMatching ( ) {
+void OracleMatcherTest::testBackwardOracleMatching ( ) {
     std::vector<std::string> subjects;
     std::vector<std::string> patterns;
     std::vector<std::set<unsigned>> expectedOccs;
diff --git a/alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.h b/alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..f1d49809082866ccaea6362dc886920f9d1604cb
--- /dev/null
+++ b/alib2algo_experimental/test-src/stringology/exact/OracleMatcherTest.h
@@ -0,0 +1,19 @@
+#ifndef ORACLE_MATCHER_TEST_H_
+#define ORACLE_MATCHER_TEST_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+class OracleMatcherTest : public CppUnit::TestFixture {
+    CPPUNIT_TEST_SUITE ( OracleMatcherTest );
+    CPPUNIT_TEST ( testBackwardOracleMatching );
+    CPPUNIT_TEST_SUITE_END ( );
+
+public:
+    void setUp ( );
+    void tearDown ( );
+
+    void testFactorOracleConstruction ( );
+    void testBackwardOracleMatching ( );
+};
+
+#endif // ORACLE_MATCHER_TEST_H_
diff --git a/astringology2/src/astringology.cpp b/astringology2/src/astringology.cpp
index 2b585b858034be908bb89cbb4898e3a7c2094c61..3f3159f4fe50aa3d6d7e78b6356e32653a93a06b 100644
--- a/astringology2/src/astringology.cpp
+++ b/astringology2/src/astringology.cpp
@@ -32,7 +32,7 @@
 #include <stringology/indexing/ExactSubsequenceAutomaton.h>
 #include <stringology/indexing/ExactNondeterministicSubsequenceAutomaton.h>
 #include <stringology/indexing/ExactMultiNondeterministicSubsequenceAutomaton.h>
-#include <stringology/exact/FactorOracleAutomaton.h>
+#include <stringology/indexing/ExactFactorOracleAutomaton.h>
 #include <stringology/indexing/NondeterministicExactSuffixAutomaton.h>
 #include <string/properties/BorderArray.h>
 #include <stringology/indexing/SuffixTrieNaive.h>
@@ -55,7 +55,7 @@ int main ( int argc, char * argv[] ) {
 		allowed.push_back ( "exactSubsequenceAutomaton" );
 		allowed.push_back ( "exactNondeterministicSubsequenceAutomaton" );
 		allowed.push_back ( "exactMultiNondeterministicSubsequenceAutomaton" );
-		allowed.push_back ( "factorOracleAutomaton" );
+		allowed.push_back ( "exactFactorOracleAutomaton" );
 		allowed.push_back ( "exactNondeterministicSuffixAutomaton" );
 		allowed.push_back ( "exactFactorMatch" );
 		allowed.push_back ( "boyerMooreHorspool" );
@@ -271,13 +271,13 @@ int main ( int argc, char * argv[] ) {
 			measurements::start ( "Output write", measurements::Type::AUXILIARY );
 
 			alib::XmlDataFactory::toStdout ( automaton );
-		} else if ( algorithm.getValue ( ) == "factorOracleAutomaton" ) {
+		} else if ( algorithm.getValue ( ) == "exactFactorOracleAutomaton" ) {
 			string::String pattern = alib::XmlDataFactory::fromTokens ( std::move ( sax::FromXMLParserHelper::parseInput(true, patternInput).front ( ) ) );
 
 			measurements::end ( );
 			measurements::start ( "Algorithm", measurements::Type::MAIN );
 
-			automaton::Automaton automaton = stringology::exact::FactorOracleAutomaton::construct ( pattern );
+			automaton::Automaton automaton = stringology::indexing::ExactFactorOracleAutomaton::construct ( pattern );
 
 			measurements::end ( );
 			measurements::start ( "Output write", measurements::Type::AUXILIARY );