diff --git a/alib2algo/src/automaton/generate/RandomizeAutomaton.h b/alib2algo/src/automaton/generate/RandomizeAutomaton.h
index d2274c1fc8f0165454f20d2f36f4b2ac349bb361..5ede196ddc40da5d6fda41439a5dcf3926a19d5b 100644
--- a/alib2algo/src/automaton/generate/RandomizeAutomaton.h
+++ b/alib2algo/src/automaton/generate/RandomizeAutomaton.h
@@ -16,31 +16,13 @@
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
 
-#include <algorithm>
-#include <foreach>
+#include <common/Permutation.hpp>
 
 namespace automaton {
 
 namespace generate {
 
 class RandomizeAutomaton : public std::SingleDispatch < RandomizeAutomaton, automaton::Automaton, const automaton::AutomatonBase & > {
-
-	template < class T >
-	static std::map < T, T > permutationMap ( const std::set < T > & data ) {
-		std::vector < T > dataVector ( data.begin ( ), data.end ( ) );
-
-		std::shuffle ( dataVector.begin ( ), dataVector.end ( ), std::random_devices::semirandom );
-		std::map < T, T > permutation;
-		for ( const std::tuple < const T &, const T & > & fromToPair : std::make_tuple_foreach ( data, dataVector ) ) {
-			permutation.insert ( std::make_pair ( std::get < 0 > ( fromToPair ), std::get < 1 > ( fromToPair ) ) );
-		}
-
-		if(common::GlobalData::verbose)
-			std::clog << "permutation map: " << permutation << std::endl;
-
-		return permutation;
-	}
-
 public:
 	static automaton::Automaton randomize ( const automaton::Automaton & automaton );
 
@@ -56,7 +38,7 @@ public:
 
 template < class SymbolType, class StateType >
 automaton::DFA < SymbolType, StateType > RandomizeAutomaton::randomize(const automaton::DFA < SymbolType, StateType > & origFSM) {
-	std::map < StateType, StateType > statePermutationMap = permutationMap ( origFSM.getStates ( ) );
+	std::map < StateType, StateType > statePermutationMap = common::Permutation::permutationMap ( origFSM.getStates ( ) );
 
 	automaton::DFA < SymbolType, StateType > res ( statePermutationMap.find ( origFSM.getInitialState ( ) )->second );
 
@@ -74,7 +56,7 @@ automaton::DFA < SymbolType, StateType > RandomizeAutomaton::randomize(const aut
 
 template < class SymbolType, class StateType >
 automaton::MultiInitialStateNFA < SymbolType, StateType > RandomizeAutomaton::randomize(const automaton::MultiInitialStateNFA < SymbolType, StateType > & origFSM) {
-	std::map < StateType, StateType > statePermutationMap = permutationMap ( origFSM.getStates ( ) );
+	std::map < StateType, StateType > statePermutationMap = common::Permutation::permutationMap ( origFSM.getStates ( ) );
 
 	automaton::MultiInitialStateNFA < SymbolType, StateType > res;
 
@@ -96,7 +78,7 @@ automaton::MultiInitialStateNFA < SymbolType, StateType > RandomizeAutomaton::ra
 
 template < class SymbolType, class StateType >
 automaton::NFA < SymbolType, StateType > RandomizeAutomaton::randomize(const automaton::NFA < SymbolType, StateType > & origFSM) {
-	std::map < StateType, StateType > statePermutationMap = permutationMap ( origFSM.getStates ( ) );
+	std::map < StateType, StateType > statePermutationMap = common::Permutation::permutationMap ( origFSM.getStates ( ) );
 
 	automaton::NFA < SymbolType, StateType > res ( statePermutationMap.find ( origFSM.getInitialState ( ) )->second );
 
@@ -115,7 +97,7 @@ automaton::NFA < SymbolType, StateType > RandomizeAutomaton::randomize(const aut
 
 template < class SymbolType, class EpsilonType, class StateType >
 automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > RandomizeAutomaton::randomize( const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & origFSM ) {
-	std::map < StateType, StateType > statePermutationMap = permutationMap ( origFSM.getStates ( ) );
+	std::map < StateType, StateType > statePermutationMap = common::Permutation::permutationMap ( origFSM.getStates ( ) );
 
 	automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > res ( statePermutationMap.find ( origFSM.getInitialState ( ) )->second );
 
diff --git a/alib2algo/src/common/Permutation.hpp b/alib2algo/src/common/Permutation.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..ab4b2786679d3738e252231a65b926be288618ed
--- /dev/null
+++ b/alib2algo/src/common/Permutation.hpp
@@ -0,0 +1,43 @@
+/*
+ * Permutation.h
+ *
+ *  Created on: 10. 2. 2017
+ *      Author: Jan Travnicek
+ */
+
+#ifndef PERMUTATION_H_
+#define PERMUTATION_H_
+
+#include <set>
+#include <vector>
+#include <map>
+#include <random>
+#include <algorithm>
+#include <foreach>
+
+#include <global/GlobalData.h>
+
+namespace common {
+
+class Permutation {
+public:
+	template < class T >
+	static std::map < T, T > permutationMap ( const std::set < T > & data ) {
+		std::vector < T > dataVector ( data.begin ( ), data.end ( ) );
+
+		std::shuffle ( dataVector.begin ( ), dataVector.end ( ), std::random_devices::semirandom );
+		std::map < T, T > permutation;
+		for ( const std::tuple < const T &, const T & > & fromToPair : std::make_tuple_foreach ( data, dataVector ) ) {
+			permutation.insert ( std::make_pair ( std::get < 0 > ( fromToPair ), std::get < 1 > ( fromToPair ) ) );
+		}
+
+		if(common::GlobalData::verbose)
+			std::clog << "permutation map: " << permutation << std::endl;
+
+		return permutation;
+	}
+};
+
+} /* namespace common */
+
+#endif /* PERMUTATION_H_ */
diff --git a/alib2algo/src/grammar/generate/RandomizeGrammar.h b/alib2algo/src/grammar/generate/RandomizeGrammar.h
index e02737598af7f5021c78aff570bbf4baabbfcc5f..e1c1818ca5e3f4abfef89affeddbedc9d2c81d81 100644
--- a/alib2algo/src/grammar/generate/RandomizeGrammar.h
+++ b/alib2algo/src/grammar/generate/RandomizeGrammar.h
@@ -13,31 +13,13 @@
 #include <grammar/Grammar.h>
 #include <grammar/Regular/LeftRG.h>
 
-#include <algorithm>
-#include <foreach>
+#include <common/Permutation.hpp>
 
 namespace grammar {
 
 namespace generate {
 
 class RandomizeGrammar : public std::SingleDispatch < RandomizeGrammar, grammar::Grammar, const grammar::GrammarBase & > {
-
-	template < class T >
-	static std::map < T, T > permutationMap ( const std::set < T > & data ) {
-		std::vector < T > dataVector ( data.begin ( ), data.end ( ) );
-
-		std::shuffle ( dataVector.begin ( ), dataVector.end ( ), std::random_devices::semirandom );
-		std::map < T, T > permutation;
-		for ( const std::tuple < const T &, const T & > & fromToPair : std::make_tuple_foreach ( data, dataVector ) ) {
-			permutation.insert ( std::make_pair ( std::get < 0 > ( fromToPair ), std::get < 1 > ( fromToPair ) ) );
-		}
-
-		if(common::GlobalData::verbose)
-			std::clog << "permutation map: " << permutation << std::endl;
-
-		return permutation;
-	}
-
 public:
 	static grammar::Grammar randomize ( const grammar::Grammar & grammar );
 
@@ -47,7 +29,7 @@ public:
 
 template < class SymbolType >
 grammar::LeftRG < SymbolType > RandomizeGrammar::randomize(const grammar::LeftRG < SymbolType > & gram ) {
-	std::map < SymbolType, SymbolType > symbolPermutationMap = permutationMap ( gram.getNonterminalAlphabet ( ) );
+	std::map < SymbolType, SymbolType > symbolPermutationMap = common::Permutation::permutationMap ( gram.getNonterminalAlphabet ( ) );
 
 	grammar::LeftRG < SymbolType > res ( symbolPermutationMap.find ( gram.getInitialSymbol ( ) )->second );