diff --git a/alib2algo/src/string/generate/RandomSubstringFactory.cpp b/alib2algo/src/string/generate/RandomSubstringFactory.cpp
index 2e89b51746ec9ac40527f3a86f7a8bc5e78218af..69964684be1c23cc78529211f1425aeb119109dc 100644
--- a/alib2algo/src/string/generate/RandomSubstringFactory.cpp
+++ b/alib2algo/src/string/generate/RandomSubstringFactory.cpp
@@ -17,6 +17,10 @@ namespace string {
 
 namespace generate {
 
+string::String RandomSubstringFactory::generateSubstring ( size_t size, const string::String & v ) {
+	return getInstance ( ).dispatch ( size, v.getData ( ) );
+}
+
 string::LinearString RandomSubstringFactory::generateSubstring ( size_t size, const string::LinearString & string ) {
 	if ( size > string.getContent ( ).size ( ) )
 		throw exception::AlibException ( "String not long enough" );
diff --git a/alib2algo/src/string/generate/RandomSubstringFactory.h b/alib2algo/src/string/generate/RandomSubstringFactory.h
index 182d1da35b345f5e560198b1952f12ff013e0a66..9d3895fda27a86c1a19b1ecc82d60dae2e0e8b7f 100644
--- a/alib2algo/src/string/generate/RandomSubstringFactory.h
+++ b/alib2algo/src/string/generate/RandomSubstringFactory.h
@@ -16,8 +16,10 @@ namespace string {
 
 namespace generate {
 
-class RandomSubstringFactory : public std::SingleDispatchFirstStaticParam < string::LinearString, size_t, string::StringBase > {
+class RandomSubstringFactory : public std::SingleDispatchFirstStaticParam < string::String, size_t, string::StringBase > {
 public:
+	static string::String generateSubstring ( size_t size, const string::String & );
+
 	static string::LinearString generateSubstring ( size_t size, const string::LinearString & );
 
 	static RandomSubstringFactory & getInstance ( ) {
diff --git a/arand2/src/arand.cpp b/arand2/src/arand.cpp
index 2972586cf2747c735d466b5b5217e3d20f27f980..0d796fd892943f5b6bab531b1633eb32007feeb3 100644
--- a/arand2/src/arand.cpp
+++ b/arand2/src/arand.cpp
@@ -8,12 +8,15 @@
 #include <tclap/CmdLine.h>
 #include <global/GlobalData.h>
 #include <measure>
+#include <sax/FromXMLParserHelper.h>
 
+#include <string/String.h>
 #include <factory/XmlDataFactory.hpp>
 #include "automaton/generate/RandomAutomatonFactory.h"
 #include "grammar/generate/RandomGrammarFactory.h"
 #include "regexp/generate/RandomRegExpFactory.h"
 #include "string/generate/RandomStringFactory.h"
+#include "string/generate/RandomSubstringFactory.h"
 #include "tree/generate/RandomTreeFactory.h"
 
 int main ( int argc, char * argv[] ) {
@@ -25,6 +28,7 @@ int main ( int argc, char * argv[] ) {
 		allowed.push_back ( "CFG" );
 		allowed.push_back ( "RE" );
 		allowed.push_back ( "ST" );
+		allowed.push_back ( "SST" );
 		allowed.push_back ( "UT" );
 		allowed.push_back ( "UP" );
 		allowed.push_back ( "RT" );
@@ -64,6 +68,9 @@ int main ( int argc, char * argv[] ) {
 		TCLAP::ValueArg < int > maxRank ( "", "rank", "Maximal rank of tree nodes", false, 5, "integer" );
 		cmd.add ( maxRank );
 
+		TCLAP::ValueArg < std::string > input ( "i", "input", "Input to use in generation", false, "-", "file" );
+		cmd.add ( input );
+
 		TCLAP::SwitchArg measure ( "m", "measure", "Measure times", false );
 		cmd.add ( measure );
 
@@ -72,9 +79,10 @@ int main ( int argc, char * argv[] ) {
 
 		cmd.parse ( argc, argv );
 
-		if(verbose.isSet())
+		if ( verbose.isSet ( ) )
 			common::GlobalData::verbose = true;
-		if(measure.isSet())
+
+		if ( measure.isSet ( ) )
 			common::GlobalData::measure = true;
 
 		measurements::start ( "Overal", measurements::Type::OVERALL );
@@ -124,6 +132,17 @@ int main ( int argc, char * argv[] ) {
 			measurements::end ( );
 			measurements::start ( "Output write", measurements::Type::AUXILIARY );
 
+			alib::XmlDataFactory::toStdout ( res );
+		} else if ( type.getValue ( ) == "SST" ) {
+			string::String baseString = alib::XmlDataFactory::fromTokens < string::String > ( sax::FromXMLParserHelper::parseInput ( input ) );
+
+			measurements::start ( "Algorithm", measurements::Type::MAIN );
+
+			string::String res = string::generate::RandomSubstringFactory::generateSubstring ( length.getValue ( ), baseString );
+
+			measurements::end ( );
+			measurements::start ( "Output write", measurements::Type::AUXILIARY );
+
 			alib::XmlDataFactory::toStdout ( res );
 		} else if ( type.getValue ( ) == "UT" ) {
 			measurements::start ( "Algorithm", measurements::Type::MAIN );