diff --git a/arand/.cproject b/arand/.cproject
new file mode 100644
index 0000000000000000000000000000000000000000..d6822d6d1c01ab6a56eaea4afd2e3bf0199b5496
--- /dev/null
+++ b/arand/.cproject
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+	<storageModule moduleId="org.eclipse.cdt.core.settings">
+		<cconfiguration id="cdt.managedbuild.config.gnu.exe.debug.1347379834">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.1347379834" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.debug.1347379834" name="Debug" parent="cdt.managedbuild.config.gnu.exe.debug">
+					<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.1347379834." name="/" resourcePath="">
+						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.1037317409" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug">
+							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.debug.407260051" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/>
+							<builder buildPath="${workspace_loc:/arand}/Debug" id="cdt.managedbuild.target.gnu.builder.exe.debug.416085715" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/>
+							<tool id="cdt.managedbuild.tool.gnu.archiver.base.279472182" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1293763556" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
+								<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.2045452562" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.64560657" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.option.include.paths.1076344051" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/alib/src}&quot;"/>
+								</option>
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.2067765930" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.2147099707" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug">
+								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.1243142714" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/>
+								<option id="gnu.c.compiler.exe.debug.option.debugging.level.531873162" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.937644576" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.1415733224" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.1194801805" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug">
+								<option id="gnu.cpp.link.option.paths.574169805" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/alib/lib}&quot;"/>
+								</option>
+								<option id="gnu.cpp.link.option.libs.721858332" superClass="gnu.cpp.link.option.libs" valueType="libs">
+									<listOptionValue builtIn="false" value="alib"/>
+								</option>
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.970809293" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.debug.1254231993" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug">
+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1930820005" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+		<cconfiguration id="cdt.managedbuild.config.gnu.exe.release.704467708">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.release.704467708" moduleId="org.eclipse.cdt.core.settings" name="Release">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.release.704467708" name="Release" parent="cdt.managedbuild.config.gnu.exe.release">
+					<folderInfo id="cdt.managedbuild.config.gnu.exe.release.704467708." name="/" resourcePath="">
+						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.release.1394755595" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.release">
+							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.release.2114857339" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.release"/>
+							<builder buildPath="${workspace_loc:/arand}/Release" id="cdt.managedbuild.target.gnu.builder.exe.release.2109254102" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.release"/>
+							<tool id="cdt.managedbuild.tool.gnu.archiver.base.1613941558" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.241824921" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release">
+								<option id="gnu.cpp.compiler.exe.release.option.optimization.level.1841009953" name="Optimization Level" superClass="gnu.cpp.compiler.exe.release.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.exe.release.option.debugging.level.1268025949" name="Debug Level" superClass="gnu.cpp.compiler.exe.release.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1103994779" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.release.2075844729" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.release">
+								<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.exe.release.option.optimization.level.1520715057" name="Optimization Level" superClass="gnu.c.compiler.exe.release.option.optimization.level" valueType="enumerated"/>
+								<option id="gnu.c.compiler.exe.release.option.debugging.level.1147277409" name="Debug Level" superClass="gnu.c.compiler.exe.release.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1797236551" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.release.1766793166" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.release"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.release.672843959" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.release">
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.632440208" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.release.294954190" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.release">
+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1436051183" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+	</storageModule>
+	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+		<project id="arand.cdt.managedbuild.target.gnu.exe.1797865662" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/>
+	</storageModule>
+	<storageModule moduleId="scannerConfiguration">
+		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.704467708;cdt.managedbuild.config.gnu.exe.release.704467708.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.2075844729;cdt.managedbuild.tool.gnu.c.compiler.input.1797236551">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1347379834;cdt.managedbuild.config.gnu.exe.debug.1347379834.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.2147099707;cdt.managedbuild.tool.gnu.c.compiler.input.937644576">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1347379834;cdt.managedbuild.config.gnu.exe.debug.1347379834.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1293763556;cdt.managedbuild.tool.gnu.cpp.compiler.input.2067765930">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.704467708;cdt.managedbuild.config.gnu.exe.release.704467708.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.241824921;cdt.managedbuild.tool.gnu.cpp.compiler.input.1103994779">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+</cproject>
diff --git a/arand/.project b/arand/.project
new file mode 100644
index 0000000000000000000000000000000000000000..2294098a2b2b4aa37a5a4a1345b4828da47f6ccf
--- /dev/null
+++ b/arand/.project
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>arand</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.core.ccnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/arand/makefile b/arand/makefile
new file mode 100644
index 0000000000000000000000000000000000000000..adfea096a5e0111c88e4c02c7c2ac569d822e38b
--- /dev/null
+++ b/arand/makefile
@@ -0,0 +1,20 @@
+CC=g++
+EXECUTABLE=arand
+CCFLAGS= -std=c++11 -O2 -g -c -Wall -I../alib/src 
+LDFLAGS= -L../alib/lib -lalib -Wl,-rpath,.
+
+SOURCES=$(shell find src/ -name *cpp)
+OBJECTS=$(patsubst src/%.cpp, obj/%.o, $(SOURCES))
+
+all: $(SOURCES) bin/$(EXECUTABLE)
+
+bin/$(EXECUTABLE): $(OBJECTS)
+	mkdir -p bin
+	$(CC) $(OBJECTS) -o $@ $(LDFLAGS)
+
+obj/%.o: src/%.cpp
+	mkdir -p $(dir $@)
+	$(CC) $(CCFLAGS) $< -o $@
+
+clean:
+	$(RM) -r *.o *.d bin obj
diff --git a/arand/src/RandomAutomatonFactory.cpp b/arand/src/RandomAutomatonFactory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c530569cf14562884cdee750a5e68925fbc47611
--- /dev/null
+++ b/arand/src/RandomAutomatonFactory.cpp
@@ -0,0 +1,159 @@
+/*
+ * RandomAutomatonFactory.cpp
+ *
+ *  Created on: 27. 3. 2014
+ *      Author: tomas
+ */
+
+#include "RandomAutomatonFactory.h"
+
+using namespace alib;
+using namespace alphabet;
+using namespace automaton;
+using namespace std;
+
+FSM RandomAutomatonFactory::generateNFA( size_t statesCount, set<Symbol> alphabet, double density )
+{
+    deque<Symbol> alphabet2;
+    for( const auto & s : alphabet )
+        alphabet2.push_back( s );
+    return RandomAutomatonFactory::LeslieConnectedNFA( statesCount, alphabet2, density );
+}
+
+FSM RandomAutomatonFactory::generateNFA( size_t statesCount, size_t alphabetSize, double density )
+{
+    srand( time( NULL ) );
+
+    deque<Symbol> alphabet;
+    while( alphabet.size( ) < alphabetSize )
+    {
+        string s( 1, rand() % 26 + 'a' );
+        if( find( alphabet.begin( ), alphabet.end( ), Symbol( s ) ) == alphabet.end( ) )
+            alphabet.push_back( Symbol( s ) );
+    }
+
+    return RandomAutomatonFactory::LeslieConnectedNFA( statesCount, alphabet, density );
+}
+
+FSM RandomAutomatonFactory::LeslieConnectedNFA( size_t n, const deque<Symbol> & alphabet, double density )
+{
+    if( alphabet.size( ) <= 0 )
+        throw AlibException( "Alphabet size must be greater than 0." );
+
+
+    srand( time( NULL ) );
+
+    FSM automata;
+
+    deque<bool> VStates;
+    deque<State> Q;
+    int unvisited;
+
+
+    for( const auto & s : alphabet )
+        automata.addInputSymbol( s );
+
+    for( size_t i = 0; i < n; i ++ )
+    {
+        VStates.push_back( false );
+        Q.push_back( State( to_string( i ) ) );
+        automata.addState( Q[ i ] );
+    }
+
+    if( n == 0 )
+    {
+        return automata;
+    }
+    else if( n == 1 )
+    {
+        automata.addTransition( Q[ 0 ], alphabet[ rand( ) % alphabet.size( ) ], Q[ 0 ] );
+
+        unvisited = 0;
+        VStates[ 0 ] = true;
+    }
+    else
+    {
+        int x = ( rand( ) % ( n - 1 ) ) + 1;
+        automata.addTransition( Q[ 0 ], alphabet[ rand( ) % alphabet.size( ) ], Q[ x ] );
+        unvisited = n - 2;
+
+        VStates[ 0 ] = true;
+        VStates[ x ] = true;
+    }
+
+    automata.addInitialState( Q [ 0 ] );
+
+    while( unvisited != 0 )
+    {
+        size_t y = rand() % ( n - unvisited ) + 1; // select y-th   accessible state
+        size_t z = rand() % unvisited + 1;         // select z-th inaccessible state
+        int a = -1, b = -1;
+
+        for( size_t i = 0, cnt = 0; i < n; i++ )
+        {
+            if( VStates[ i ] == true )
+                cnt ++;
+
+            if( cnt == y )
+            {
+                a = i;
+                break;
+            }
+        }
+        for( size_t i = 0, cnt = 0; i < n; i++ )
+        {
+            if( VStates[ i ] == false )
+                cnt ++;
+
+            if( cnt == z )
+            {
+                b = i;
+                break;
+            }
+        }
+
+        int c = rand() % alphabet.size( );
+        automata.addTransition( Q[ a ], alphabet[ c ], Q[ b ] );
+
+
+        unvisited -= 1;
+        VStates[ b ] = true;
+
+        // ---------
+    }
+
+    for( State q : Q )
+    {
+        if( automata.getTransitionsFromState( q ).size( ) == 0 && rand( ) % 100 < 90 )
+            automata.addFinalState( q );
+        else if( automata.getTransitionsFromState( q ).size( ) > 0 && rand( ) % 100 < 10 )
+            automata.addFinalState( q );
+    }
+
+    if( n == 1 )
+        automata.addFinalState( * automata.getInitialStates( ).begin( ) );
+
+    double mnn100 = 100.0 / alphabet.size( ) / n / n;
+    while( automata.getTransitions( ).size( ) * mnn100 < density )
+    {
+        int y = rand( ) % n;
+        int z = rand( ) % n;
+        int a = rand( ) % alphabet.size();
+
+        TransitionFSM t ( Q[ y ], alphabet [ a ], Q[ z ] );
+        if( ! isInSet( t, automata.getTransitions( ) ) )
+            automata.addTransition( t );
+    }
+
+    map<Symbol, bool> alphabetUsage;
+    for( const auto & a : automata.getInputAlphabet( ) )
+        alphabetUsage[ a ] = false;
+    for( const auto & t : automata.getTransitions( ) )
+        alphabetUsage[ t.getInput( ) ] = true;
+
+    for( const auto & kv : alphabetUsage )
+        if( kv.second == false )
+            automata.removeInputSymbol( kv.first );
+
+    return automata;
+}
diff --git a/arand/src/RandomAutomatonFactory.h b/arand/src/RandomAutomatonFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..87221ba151a6b2dc5df9574b535e95bf9bd32053
--- /dev/null
+++ b/arand/src/RandomAutomatonFactory.h
@@ -0,0 +1,31 @@
+/*
+ * RandomAutomatonFactory.h
+ *
+ *  Created on: 27. 3. 2014
+ *      Author: tomas
+ */
+
+#ifndef RANDOMAUTOMATONFACTORY_H_
+#define RANDOMAUTOMATONFACTORY_H_
+
+#include <deque>
+#include <map>
+#include <set>
+#include <algorithm>
+
+#include <AlibException.h>
+#include <automaton/FSM/FSM.h>
+
+#define isInSet(x,set) ((set).find((x)) != (set).end( ) )
+
+class RandomAutomatonFactory
+{
+public:
+    static automaton::FSM generateNFA( size_t statesCount, std::set<alphabet::Symbol> alphabet, double density );
+    static automaton::FSM generateNFA( size_t statesCount, size_t alphabetSize, double density );
+
+private:
+    static automaton::FSM LeslieConnectedNFA( size_t n, const std::deque<alphabet::Symbol> & alphabet, double density );
+};
+
+#endif /* RANDOMAUTOMATONFACTORY_H_ */
diff --git a/arand/src/arand.cpp b/arand/src/arand.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f7fbdb386adef63d4bbb64e55e16499abdb2ae4f
--- /dev/null
+++ b/arand/src/arand.cpp
@@ -0,0 +1,106 @@
+/*
+ * arand.cpp
+ *
+ *  Created on: 26. 3. 2014
+ *      Author: tomas
+ */
+
+#include <iostream>
+#include <cstdlib>
+#include <climits>
+#include <cfloat>
+#include <getopt.h>
+
+#include <automaton/FSM/FSM.h>
+
+#include "RandomAutomatonFactory.h"
+
+using namespace automaton;
+using namespace std;
+
+void help( void )
+{
+    cout << "arand" << endl;
+    cout << "Generates random automaton." << endl;
+    cout << "Usage: arand -n=N -d=D -a=A" << endl << endl;
+    cout << "  -n, --nodes=N \t Number of nodes of automata." << endl;
+    cout << "  -d, --density=D \t Percentage of transitions to generate. 1.0 = automata graph is tree, 100.0 = every possible transition." << endl;
+    cout << "  -a, --alphabet=A \t Alphabet size." << endl;
+}
+
+
+int main(int argc, char* argv[])
+{
+    static struct option long_options[] = {
+      // common
+      {"help",              no_argument,        NULL, 'h'},
+//      {"type",              required_argument,  NULL, 't'},
+
+      // automaton options
+      {"density",           required_argument,  NULL, 'd'},
+      {"nodes",             required_argument,  NULL, 'n'},
+      {"alphabet",          required_argument,  NULL, 'a'},
+
+      {0, 0, 0, 0}
+    };
+
+    int long_index = 0, opt = 0;
+
+    // string type;
+    int statesCount = INT_MAX, alphabetSize = INT_MAX;
+    double density = DBL_MAX;
+
+    while( ( opt = getopt_long( argc, argv,"ht:d:n:a:", long_options, & long_index ) )  != -1 )
+    {
+        switch( opt )
+        {
+        /*
+        case 't':
+            type.assign( optarg, strlen( optarg ) );
+            break;
+         */
+
+        case 'n':
+            statesCount = stoi( optarg, nullptr, 10 );
+            break;
+
+        case 'd':
+            density = stod( optarg, nullptr );
+            break;
+
+        case 'a':
+            alphabetSize = stoi( optarg, nullptr, 10 );
+            break;
+
+        case 'v':
+        case 'h':
+        default:
+            help( );
+            return 0;
+        }
+    }
+
+    if( density < 1 || density > 100 )
+    {
+        //TODO: floating point arithmetic
+        cerr << "You must specify density as a number between 1 and 100." << endl;
+        return 1;
+
+    }
+
+    if( statesCount == INT_MAX )
+    {
+        cerr << "You must specify number of states." << endl;
+        return 1;
+    }
+
+    if( alphabetSize == INT_MAX )
+    {
+        cerr << "You must specify alphabet or at least its size." << endl;
+        return 1;
+    }
+
+    RandomAutomatonFactory::generateNFA( statesCount, alphabetSize, density ).toXML( cout );
+
+    return 0;
+}
diff --git a/makefile b/makefile
index 872e5214dfeea3d391e46dd39b681902e8597d34..5ac98ba644ffdbf791472c55ba53347539793257 100644
--- a/makefile
+++ b/makefile
@@ -14,7 +14,8 @@ SUBDIRS_BINS = acat \
                anormalize \
                aconversions \
                aderivation aintegral \
-               aoptimize.regexp
+               aoptimize.regexp \
+               arand
 SUBDIRS_WITH_MAKE = $(dir $(wildcard */makefile))
 
 .PHONY: $(CORE_LIB) $(SUBDIRS_LIBS) $(SUBDIRS_BINS)