diff --git a/alib2algo/src/grammar/generate/RandomizeGrammar.cpp b/alib2algo/src/grammar/generate/RandomizeGrammar.cpp
index 4d342a3ae50b481c49cc24ddabe7365f724917d7..993b6476d836a93a854bc01de9b6949199d0c67f 100644
--- a/alib2algo/src/grammar/generate/RandomizeGrammar.cpp
+++ b/alib2algo/src/grammar/generate/RandomizeGrammar.cpp
@@ -16,6 +16,7 @@ auto RandomizeGrammarLeftRG = RandomizeGrammar::RegistratorWrapper < grammar::Le
 auto RandomizeGrammarLeftLG = RandomizeGrammar::RegistratorWrapper < grammar::LeftLG < >, grammar::LeftLG < > > ( RandomizeGrammar::randomize );
 auto RandomizeGrammarRightRG = RandomizeGrammar::RegistratorWrapper < grammar::RightRG < >, grammar::RightRG < > > ( RandomizeGrammar::randomize );
 auto RandomizeGrammarRightLG = RandomizeGrammar::RegistratorWrapper < grammar::RightLG < >, grammar::RightLG < > > ( RandomizeGrammar::randomize );
+auto RandomizeGrammarCFG = RandomizeGrammar::RegistratorWrapper < grammar::CFG < >, grammar::CFG < > > ( RandomizeGrammar::randomize );
 
 grammar::Grammar RandomizeGrammar::randomize ( const grammar::Grammar & grammar ) {
 	return dispatch ( grammar.getData ( ) );
diff --git a/alib2algo/src/grammar/generate/RandomizeGrammar.h b/alib2algo/src/grammar/generate/RandomizeGrammar.h
index 4e65db928d15fe4e78f5fed3a5541aadb66a228f..75099f256c778020b25065b04d249a2babb328cf 100644
--- a/alib2algo/src/grammar/generate/RandomizeGrammar.h
+++ b/alib2algo/src/grammar/generate/RandomizeGrammar.h
@@ -15,6 +15,7 @@
 #include <grammar/Regular/LeftRG.h>
 #include <grammar/Regular/RightLG.h>
 #include <grammar/Regular/RightRG.h>
+#include <grammar/ContextFree/CFG.h>
 
 #include <common/Permutation.hpp>
 
@@ -34,6 +35,9 @@ public:
 	static grammar::RightRG < SymbolType > randomize ( const grammar::RightRG < SymbolType > & gram );
 	template < class SymbolType >
 	static grammar::RightLG < SymbolType > randomize ( const grammar::RightLG < SymbolType > & gram );
+	template < class SymbolType >
+	static grammar::CFG < SymbolType > randomize ( const grammar::CFG < SymbolType > & gram );
+
 };
 
 template < class SymbolType >
@@ -112,6 +116,27 @@ grammar::RightLG < SymbolType > RandomizeGrammar::randomize ( const grammar::Rig
 	return res;
 }
 
+template < class SymbolType >
+grammar::CFG < SymbolType > RandomizeGrammar::randomize ( const grammar::CFG < SymbolType > & gram ) {
+	std::map < SymbolType, SymbolType > symbolPermutationMap = common::Permutation::permutationMap ( gram.getNonterminalAlphabet ( ) );
+
+	grammar::CFG < SymbolType > res ( symbolPermutationMap.find ( gram.getInitialSymbol ( ) )->second );
+
+	res.setNonterminalAlphabet ( gram.getNonterminalAlphabet ( ) );
+	res.setTerminalAlphabet ( gram.getTerminalAlphabet ( ) );
+
+	for ( const std::pair < SymbolType, std::set < std::vector < SymbolType > > > & rule : gram.getRules ( ) )
+		for ( const std::vector < SymbolType > & rhs : rule.second )
+			res.addRule ( symbolPermutationMap.find ( rule.first )->second, std::transform < SymbolType > ( rhs, [ & ] ( const SymbolType & elem ) {
+						if ( gram.getNonterminalAlphabet ( ).count ( elem ) )
+							return symbolPermutationMap.find ( elem )->second;
+						else
+							return elem;
+					} ) );
+
+	return res;
+}
+
 } /* namespace generate */
 
 } /* namespace grammar */