diff --git a/smi/CMakeLists.txt b/smi/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1e37cca124201d8a357c029f50863775ec4ed6b8
--- /dev/null
+++ b/smi/CMakeLists.txt
@@ -0,0 +1,84 @@
+cmake_minimum_required (VERSION 2.6)
+project (smi C)
+
+if("$ENV{MACHTYPE}" STREQUAL "x86_64")
+SET(NRTCFLAGS "-D_NRT -O2  -Wall -std=gnu90")
+if($ENV{RTAI})
+# RTAI
+SET(RTCFLAGS "$(shell rtai-config --lxrt-cflags) -D_RTAI  -Wall -std=gnu90")
+SET(RTLIB rtsmirtai)
+SET(NRTLIB nrtsmirtai)
+else()
+# PREEMPT_RT
+SET(RTCFLAGS "-O2  -Wall -fno-stack-protector -std=gnu90")
+SET(RTLIB rtsmi)
+SET(NRTLIB nrtsmi)
+endif()
+else ()
+if($ENV{GNU90})
+SET(NRTCFLAGS "-D_NRT -O2 -m32 -Wall -std=gnu90")
+if($ENV{RTAI})
+# RTAI
+SET(RTCFLAGS "$(shell rtai-config --lxrt-cflags) -D_RTAI -m32 -Wall -std=gnu90")
+SET(RTLIB rtsmirtai)
+SET(NRTLIB nrtsmirtai)
+else()
+# PREEMPT_RT
+SET(RTCFLAGS "-O2 -m32 -Wall -fno-stack-protector -std=gnu90")
+SET(RTLIB rtsmi)
+SET(NRTLIB nrtsmi)
+endif()
+else()
+SET(NRTCFLAGS "-D_NRT -O2 -m32 -Wall")
+if($ENV{RTAI})
+# RTAI
+SET(RTCFLAGS "$(shell rtai-config --lxrt-cflags) -D_RTAI -m32 -Wall")
+SET(RTLIB rtsmirtai)
+SET(NRTLIB nrtsmirtai)
+else()
+# PREEMPT_RT
+SET(RTCFLAGS "-O2 -m32 -Wall -fno-stack-protector")
+SET(RTLIB rtsmi)
+SET(NRTLIB nrtsmi)
+endif()
+endif()
+endif()
+
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../bin)
+
+include_directories(src)
+
+set(RTSOURCES 
+src/rt_system.c
+src/shm.c
+src/smi.c
+src/taskdisp.c
+)
+
+set(NRTSOURCES
+src/nrt_system.c
+src/shm.c
+src/smi_nrt.c
+src/smiplay_nrt.c
+src/taskdisp_nrt.c
+)
+
+if($ENV{RTAI})
+add_library(rtsmirtai STATIC ${RTSOURCES})
+add_library(nrtsmirtai STATIC ${NRTSOURCES})
+SET_TARGET_PROPERTIES(rtsmirtai PROPERTIES COMPILE_FLAGS "${RTCFLAGS} ${DEBUGFLAGS}")
+SET_TARGET_PROPERTIES(nrtsmirtai PROPERTIES COMPILE_FLAGS "${NRTCFLAGS} ${DEBUGFLAGS}")
+else()
+add_library(rtsmi STATIC ${RTSOURCES})
+add_library(nrtsmi STATIC ${NRTSOURCES})
+SET_TARGET_PROPERTIES(rtsmi PROPERTIES COMPILE_FLAGS "${RTCFLAGS} ${DEBUGFLAGS}")
+SET_TARGET_PROPERTIES(nrtsmi PROPERTIES COMPILE_FLAGS "${NRTCFLAGS} ${DEBUGFLAGS}")
+endif()
+
+if($ENV{RTAI})
+add_custom_target(
+   rtaicheck.sh
+   COMMAND ../bin/rtaicheck.sh
+)
+add_dependencies(rtsmirtai rtaicheck.sh)
+endif()
diff --git a/smi/src/smi_def.h b/smi/src/smi_def.h
index e46b632701872366aeeb9b9e999a61d3201c4982..f5b67912ab6dd71113bd4b6b7d4c794402f2a600 100644
--- a/smi/src/smi_def.h
+++ b/smi/src/smi_def.h
@@ -10,7 +10,7 @@
 
 #define SMI_LOG_BUF_SIZE (1*1024)
 
-#define MAX_NUMBER_OF_CONCURRENT_STATES 80
+#define MAX_NUMBER_OF_CONCURRENT_STATES 100
 #define MAX_NUMBER_OF_REGIONS_PER_SUPERSTATE 32
 #define MAX_NUMBER_OF_TRANSITIONS_PER_STATE 16 //8
 #define MAX_NUMBER_OF_TRANSITIONS (MAX_NUMBER_OF_ESM_STATES*4)
diff --git a/smi/src/smiplay_nrt.c b/smi/src/smiplay_nrt.c
index f373fb0994ac0ed01b3bb1be642e88dc175ee5f5..7d472a032c52a0d1c3b2b05ac538984301b19c8b 100644
--- a/smi/src/smiplay_nrt.c
+++ b/smi/src/smiplay_nrt.c
@@ -10,6 +10,7 @@
 
 #include "smi_def.h"
 
+int printOnce=0;
 
 // UDP socket related
 unsigned short usiGUIUDPPort, usiLocalUDPPort;
@@ -28,8 +29,11 @@ int initUDPSocket(int *UDP_socket, struct sockaddr_in *UDPRemote_addr, unsigned
 	UDPRemote_addr->sin_port        = htons( (u_short) *usiUDPRemote_port );
 
 	if ((he=gethostbyname(rgcHostName))==0){
+if (printOnce&1==0) {	
 		printf("\n[initUDPSocket] Couldn't resolve \"%s\" host name\n",rgcHostName);
 		fflush(stdout);
+printOnce|=1;		
+}		
 		return (-1);
 	}
 	UDPRemote_addr->sin_addr = *((struct in_addr *)he->h_addr);
@@ -62,8 +66,10 @@ int initIPC(char *rgcHostName){
 	usiGUIUDPPort = 7070;
 	
 	sprintf(rgcGUIHostName,"%s",rgcHostName);	
+if (printOnce&2==0) {
 	printf("[initIPC] %s\n",rgcGUIHostName);
-
+printOnce|=2;
+}
 	return initUDPSocket(&iGUIUDPSocket,
 				&addrGUIUDP,
 				&usiGUIUDPPort,