diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4bfbd77fe..ad11545a3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,10 @@ All notable changes to this project will be documented in this file.
 This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
 
 ## [unreleased][unreleased]
-
+ - Changed proxmark command line parameter `flush` to `-f` or `-flush` (Merlok)
+ - Added to proxmark command line parameters `w` - wait 20s for serial port (Merlok)
+ - Added to proxmark command line parameters `c` and `l` - execute command and lua script from command line (Merlok)
+ - Added to proxmark ability to execute commands from stdin (pipe) (Merlok)
  - Added new standalone mode "HF Mifare ultra fast sniff/sim/clone - aka VIGIKPWN"  (@cjbrigato)
 
 ### Fixed
diff --git a/client/cmdhfmfhard.c b/client/cmdhfmfhard.c
index a4a8c11ee..6f19e778e 100644
--- a/client/cmdhfmfhard.c
+++ b/client/cmdhfmfhard.c
@@ -1628,8 +1628,8 @@ static inline bool remaining_bits_match(uint_fast8_t num_common_bits, uint_fast8
 }
 
 
-static pthread_mutex_t statelist_cache_mutex;
-static pthread_mutex_t book_of_work_mutex;
+static pthread_mutex_t statelist_cache_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t book_of_work_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 typedef enum {
diff --git a/client/proxgui.cpp b/client/proxgui.cpp
index ab4ff6bec..fefba9c50 100644
--- a/client/proxgui.cpp
+++ b/client/proxgui.cpp
@@ -15,7 +15,7 @@
 static ProxGuiQT *gui = NULL;
 static WorkerThread *main_loop_thread = NULL;
 
-WorkerThread::WorkerThread(char *script_cmds_file, bool usb_present) : script_cmds_file(script_cmds_file), usb_present(usb_present)
+WorkerThread::WorkerThread(char *script_cmds_file, char *script_cmd, bool usb_present) : script_cmds_file(script_cmds_file), script_cmd(script_cmd), usb_present(usb_present)
 {
 }
 
@@ -24,13 +24,14 @@ WorkerThread::~WorkerThread()
 }
 
 void WorkerThread::run() {
-	main_loop(script_cmds_file, usb_present);
+	main_loop(script_cmds_file, script_cmd, usb_present);
 }
 
 extern "C" void ShowGraphWindow(void)
 {
 	if (!gui)
 		return;
+
 	gui->ShowGraphWindow();
 }
 
@@ -38,6 +39,7 @@ extern "C" void HideGraphWindow(void)
 {
 	if (!gui)
 		return;
+
 	gui->HideGraphWindow();
 }
 
@@ -54,11 +56,10 @@ extern "C" void MainGraphics(void)
 	if (!gui)
 		return;
 
-	main_loop_thread->start();
 	gui->MainLoop();
 }
 
-extern "C" void InitGraphics(int argc, char **argv, char *script_cmds_file, bool usb_present)
+extern "C" void InitGraphics(int argc, char **argv, char *script_cmds_file, char *script_cmd, bool usb_present)
 {
 #ifdef Q_WS_X11
 	bool useGUI = getenv("DISPLAY") != 0;
@@ -68,13 +69,10 @@ extern "C" void InitGraphics(int argc, char **argv, char *script_cmds_file, bool
 	if (!useGUI)
 		return;
 
-	gui = new ProxGuiQT(argc, argv);
-	main_loop_thread = new WorkerThread(script_cmds_file, usb_present);
-	QObject::connect(main_loop_thread, SIGNAL(finished()), main_loop_thread, SLOT(deleteLater()));
-	QObject::connect(main_loop_thread, SIGNAL(finished()), gui, SLOT(_Exit()));
+	main_loop_thread = new WorkerThread(script_cmds_file, script_cmd, usb_present);
+	gui = new ProxGuiQT(argc, argv, main_loop_thread);
 }
 
-
 extern "C" void ExitGraphics(void)
 {
 	if (!gui)
diff --git a/client/proxgui.h b/client/proxgui.h
index abc6d839c..c1c826eb5 100644
--- a/client/proxgui.h
+++ b/client/proxgui.h
@@ -19,7 +19,7 @@ void ShowGraphWindow(void);
 void HideGraphWindow(void);
 void RepaintGraphWindow(void);
 void MainGraphics(void);
-void InitGraphics(int argc, char **argv, char *script_cmds_file, bool usb_present);
+void InitGraphics(int argc, char **argv, char *script_cmds_file, char *script_cmd, bool usb_present);
 void ExitGraphics(void);
 
 #define MAX_GRAPH_TRACE_LEN (40000 * 8)
diff --git a/client/proxguiqt.cpp b/client/proxguiqt.cpp
index b76fa29dd..3d8d68891 100644
--- a/client/proxguiqt.cpp
+++ b/client/proxguiqt.cpp
@@ -77,7 +77,19 @@ void ProxGuiQT::_Exit(void) {
 	delete this;
 }
 
-void ProxGuiQT::MainLoop() {
+void ProxGuiQT::_StartProxmarkThread(void) {
+	if (!proxmarkThread)
+		return;
+
+	// if thread finished delete self and delete application
+	QObject::connect(proxmarkThread, SIGNAL(finished()), proxmarkThread, SLOT(deleteLater()));
+	QObject::connect(proxmarkThread, SIGNAL(finished()), this, SLOT(_Exit()));
+	// start proxmark thread
+	proxmarkThread->start();
+}
+
+void ProxGuiQT::MainLoop()
+{
 	plotapp = new QApplication(argc, argv);
 
 	connect(this, SIGNAL(ShowGraphWindowSignal()), this, SLOT(_ShowGraphWindow()));
@@ -85,10 +97,16 @@ void ProxGuiQT::MainLoop() {
 	connect(this, SIGNAL(HideGraphWindowSignal()), this, SLOT(_HideGraphWindow()));
 	connect(this, SIGNAL(ExitSignal()), this, SLOT(_Exit()));
 
+	//start proxmark thread after starting event loop
+	QTimer::singleShot(200, this, SLOT(_StartProxmarkThread()));
+
 	plotapp->exec();
 }
 
-ProxGuiQT::ProxGuiQT(int argc, char **argv) : plotapp(NULL), plotwidget(NULL), argc(argc), argv(argv) {}
+ProxGuiQT::ProxGuiQT(int argc, char **argv, WorkerThread *wthread) : plotapp(NULL), plotwidget(NULL),
+	argc(argc), argv(argv), proxmarkThread(wthread)
+{
+}
 
 ProxGuiQT::~ProxGuiQT(void) {
 	if (plotapp) {
diff --git a/client/proxguiqt.h b/client/proxguiqt.h
index 267d4e746..91fd0e0d0 100644
--- a/client/proxguiqt.h
+++ b/client/proxguiqt.h
@@ -88,6 +88,18 @@ class ProxWidget : public QWidget
 		void vchange_dthr_down(int v);
 };
 
+class WorkerThread : public QThread {
+		Q_OBJECT;
+	public:
+		WorkerThread(char*, char*, bool);
+		~WorkerThread();
+		void run();
+	private:
+		char *script_cmds_file = NULL;
+		char *script_cmd = NULL;
+		bool usb_present;
+};
+
 class ProxGuiQT : public QObject
 {
 	Q_OBJECT;
@@ -98,9 +110,10 @@ class ProxGuiQT : public QObject
 		int argc;
 		char **argv;
 		void (*main_func)(void);
+		WorkerThread *proxmarkThread;
 		
 	public:
-		ProxGuiQT(int argc, char **argv);
+		ProxGuiQT(int argc, char **argv, WorkerThread *wthread);
 		~ProxGuiQT(void);
 		void ShowGraphWindow(void);
 		void RepaintGraphWindow(void);
@@ -113,7 +126,8 @@ class ProxGuiQT : public QObject
 		void _RepaintGraphWindow(void);
 		void _HideGraphWindow(void);
 		void _Exit(void);
-		
+		void _StartProxmarkThread(void);
+
 	signals:
 		void ShowGraphWindowSignal(void);
 		void RepaintGraphWindowSignal(void);
@@ -121,17 +135,4 @@ class ProxGuiQT : public QObject
 		void ExitSignal(void);
 };
 
-class WorkerThread : public QThread {
-	Q_OBJECT;
-
-	public:
-		WorkerThread(char*, bool);
-		~WorkerThread();
-		void run();
-		
-	private:
-		char *script_cmds_file = NULL;
-		bool usb_present;
-};
-
 #endif // PROXGUI_QT
diff --git a/client/proxmark3.c b/client/proxmark3.c
index 14e3f02b4..4add7f259 100644
--- a/client/proxmark3.c
+++ b/client/proxmark3.c
@@ -22,15 +22,27 @@
 #include "cmdmain.h"
 #include "uart.h"
 #include "ui.h"
+#include "util.h"
 #include "cmdparser.h"
 #include "cmdhw.h"
 #include "whereami.h"
 
+#if defined (_WIN32)
+#define SERIAL_PORT_H	"com3"
+#elif defined(__APPLE__)
+#define SERIAL_PORT_H   "/dev/cu.usbmodem888888"
+#else
+#define SERIAL_PORT_H	"/dev/ttyACM0"
+#endif
+
+
 // a global mutex to prevent interlaced printing from different threads
-extern pthread_mutex_t print_lock;
+//pthread_mutex_t print_lock = PTHREAD_MUTEX_INITIALIZER;
 static serial_port sp;
 static UsbCommand txcmd;
 static char comport[255];
+byte_t rx[sizeof(UsbCommand)];
+byte_t* prx = rx;
 
 volatile static bool txcmd_pending = false;
 
@@ -60,10 +72,7 @@ struct receiver_arg {
 	int run;
 };
 
-byte_t rx[sizeof(UsbCommand)];
-byte_t* prx = rx;
-
-#if defined(__linux__)
+#if defined(__linux__)	|| (__APPLE__)
 static void showBanner(void){
 	printf("\n\n");
 	printf("\e[34m██████╗ ███╗   ███╗ ████╗\e[0m     ...iceman fork\n");
@@ -90,7 +99,6 @@ static bool hookUpPM3() {
 		ret = false;
 		offline = 1;
 	} else {
-		//printf("OK: connected to serial port %s\n", comport);
 		ret = true;
 		offline = 0;
 	}
@@ -105,7 +113,7 @@ static void *uart_receiver(void *targ) {
 	
 	while (arg->run) {
 		rxlen = 0;
-		if (uart_receive(sp, prx, sizeof(UsbCommand) - (prx-rx), &rxlen)) {
+		if (uart_receive(sp, prx, sizeof(UsbCommand) - (prx-rx), &rxlen) && rxlen) {
 			
 			prx += rxlen;
 			if (prx-rx < sizeof(UsbCommand)) {
@@ -141,28 +149,28 @@ static void *uart_receiver(void *targ) {
 	return NULL;
 }
 
-void main_loop(char *script_cmds_file, bool usb_present) {
+void main_loop(char *script_cmds_file, char *script_cmd, bool usb_present) {
 
 	struct receiver_arg rarg;
-	pthread_t reader_thread;
 	char *cmd = NULL;
+	pthread_t reader_thread;
+	bool execCommand = (script_cmd != NULL);
+	bool stdinOnPipe = !isatty(STDIN_FILENO);
+	FILE *sf = NULL;
+	char script_cmd_buf[256] = {0x00};  // iceman, needs lua script the same file_path_buffer as the rest
 	
 	if (usb_present) {
 		rarg.run = 1;
-		//
 		pthread_create(&reader_thread, NULL, &uart_receiver, &rarg);
 		// cache Version information now:
 		CmdVersion(NULL);
 	}
 
-	FILE *script_file = NULL;
-	char script_cmd_buf[256] = {0x00};  // iceman, needs lua script the same file_path_buffer as the rest
-
 	if (script_cmds_file) {
-		script_file = fopen(script_cmds_file, "r");
+		sf = fopen(script_cmds_file, "r");
 		
-		if (script_file)
-			printf("using 'scripting' commands file %s\n", script_cmds_file);
+		if (sf)
+			printf("executing commands from file: %s\n", script_cmds_file);
 	}
 
 	read_history(".history");
@@ -186,69 +194,84 @@ void main_loop(char *script_cmds_file, bool usb_present) {
 		}
 
 		// If there is a script file
-		if (script_file) {
+		if (sf) {
 			
-			if (!fgets(script_cmd_buf, sizeof(script_cmd_buf), script_file)) {
-				fclose(script_file);
-				script_file = NULL;
+			memset(script_cmd_buf, 0, sizeof(script_cmd_buf));
+			if (!fgets(script_cmd_buf, sizeof(script_cmd_buf), sf)) {
+				fclose(sf);
+				sf = NULL;
 			} else {
-				char *nl;
-				nl = strrchr(script_cmd_buf, '\r');
-				if (nl)
-					*nl = '\0';
-				
-				nl = strrchr(script_cmd_buf, '\n');
-				
-				if (nl)
-					*nl = '\0';
-				
-				int newlen = strlen(script_cmd_buf);
-				if ((cmd = (char*) malloc( newlen + 1)) != NULL) {
-					memset(cmd, 0x00, newlen);
-					strcpy(cmd, script_cmd_buf);
-					
-					pthread_mutex_lock(&print_lock);
-					printf("%s\n", cmd);
-					pthread_mutex_unlock(&print_lock);
+				strcleanrn(script_cmd_buf, sizeof(script_cmd_buf));
+
+				if ((cmd = strmcopy(script_cmd_buf)) != NULL) {
+					printf(PROXPROMPT"%s\n", cmd);
 				}
 			}
 		} else {
-			cmd = readline(PROXPROMPT);
-		}
-		
-		// this one should pick up all non-null cmd...
-		// why is there a 
-		if (cmd) {
-			if (strlen(cmd) > 0) {
-				while(cmd[strlen(cmd) - 1] == ' ')
-					cmd[strlen(cmd) - 1] = 0x00;
-			}
+			// If there is a script command
+			if (execCommand){
+				if ((cmd = strmcopy(script_cmd)) != NULL) {
+					printf(PROXPROMPT"%s\n", cmd);
+				}
 
-			if (cmd[0] != 0x00) {
-				int ret = CommandReceived(cmd);
-				add_history(cmd);
-				
-				// exit or quit
-				if (ret == 99) 
+				execCommand = false;
+			} else {
+				// exit after exec command
+				if (script_cmd)
 					break;
+
+				// if there is a pipe from stdin
+				if (stdinOnPipe) {
+					memset(script_cmd_buf, 0, sizeof(script_cmd_buf));
+					if (!fgets(script_cmd_buf, sizeof(script_cmd_buf), stdin)) {
+						printf("\nstdin end, exit...\n");
+						break;
+					}
+					strcleanrn(script_cmd_buf, sizeof(script_cmd_buf));
+
+					if ((cmd = strmcopy(script_cmd_buf)) != NULL) {
+						printf(PROXPROMPT"%s\n", cmd);
+					}
+					
+				} else {		
+					// read command from command prompt
+					cmd = readline(PROXPROMPT);
+				}
+		
+				// execute command
+				if (cmd) {
+					if (strlen(cmd) > 0) {
+						while(cmd[strlen(cmd) - 1] == ' ')
+							cmd[strlen(cmd) - 1] = 0x00;
+					}
+
+					if (cmd[0] != 0x00) {
+						int ret = CommandReceived(cmd);
+						add_history(cmd);
+						
+						// exit or quit
+						if (ret == 99) 
+							break;
+					}
+					free(cmd);
+					cmd = NULL;
+				} else {
+					pthread_mutex_lock(&print_lock);
+					printf("\n");
+					pthread_mutex_unlock(&print_lock);
+					break;
+				}
 			}
-			free(cmd);
-			cmd = 0;
-		} else {
-			pthread_mutex_lock(&print_lock);
-			printf("\n");
-			pthread_mutex_unlock(&print_lock);
-			break;
 		}
 	}
-
-	if (script_file)
-		fclose(script_file);
+	
+	if (sf)
+		fclose(sf);
 	
 	write_history(".history");
 
 	free(cmd);
-	cmd = 0;
+	cmd = NULL;
 			
 	if (usb_present) {
 		rarg.run = 0;
@@ -257,8 +280,8 @@ void main_loop(char *script_cmds_file, bool usb_present) {
 }
 
 static void dumpAllHelp(int markdown) {
-	printf("\n%sProxmark3 command dump%s\n\n",markdown?"# ":"",markdown?"":"\n======================");
-	printf("Some commands are available only if a Proxmark is actually connected.%s\n",markdown?"  ":"");
+	printf("\n%sProxmark3 command dump%s\n\n", markdown ? "# " : "", markdown ? "" : "\n======================");
+	printf("Some commands are available only if a Proxmark is actually connected.%s\n", markdown ? "  " : "");
 	printf("Check column \"offline\" for their availability.\n");
 	printf("\n");
 	command_t *cmds = getTopLevelCommandTable();
@@ -290,64 +313,156 @@ static void set_my_executable_path(void) {
 	}
 }
 
+static void show_help(bool showFullHelp, char *command_line){
+	printf("syntax: %s <port> [-h|-help|-m|-f|-flush|-w|-wait|-c|-command|-l|-lua] [cmd_script_file_name] [command][lua_script_name]\n", command_line);
+	printf("\tLinux example:'%s /dev/ttyACM0'\n", command_line);
+	printf("\tWindows example:'%s com3'\n\n", command_line);
+	
+	if (showFullHelp){
+		printf("help: <-h|-help> Dump all interactive command's help at once.\n");
+		printf("\t%s  -h\n\n", command_line);
+		printf("markdown: <-m> Dump all interactive help at once in markdown syntax\n");
+		printf("\t%s -m\n\n", command_line);
+		printf("flush: <-f|-flush> Output will be flushed after every print.\n");
+		printf("\t%s -f\n\n", command_line);
+		printf("wait: <-w|-wait> 20sec waiting the serial port to appear in the OS\n");
+		printf("\t%s "SERIAL_PORT_H" -w\n\n", command_line);
+		printf("script: A script file with one proxmark3 command per line.\n\n");
+		printf("command: <-c|-command> Execute one proxmark3 command.\n");
+		printf("\t%s "SERIAL_PORT_H" -c \"hf mf chk 1* ?\"\n", command_line);
+		printf("\t%s "SERIAL_PORT_H" -command \"hf mf nested 1 *\"\n\n", command_line);
+		printf("lua: <-l|-lua> Execute lua script.\n");
+		printf("\t%s "SERIAL_PORT_H" -l hf_read\n\n", command_line);
+	}
+}
+
 int main(int argc, char* argv[]) {
 	srand(time(0));
   
+	bool usb_present = false;
+	bool waitCOMPort = false;
+	bool executeCommand = false;
+	bool addLuaExec = false;
+	char *script_cmds_file = NULL;
+	char *script_cmd = NULL;
+  
 	if (argc < 2) {
-		printf("syntax: %s <port>\n\n",argv[0]);
-		printf("\tLinux example:'%s /dev/ttyACM0'\n", argv[0]);
-		printf("\tWindows example:'%s com3'\n\n", argv[0]);
-		printf("help:   %s -h\n\n", argv[0]);
-		printf("\tDump all interactive help at once\n");
-		printf("markdown:   %s -m\n\n", argv[0]);
-		printf("\tDump all interactive help at once in markdown syntax\n");
+		show_help(true, argv[0]);
 		return 1;
 	}
-	if (strcmp(argv[1], "-h") == 0) {
-		printf("syntax: %s <port>\n\n",argv[0]);
-		printf("\tLinux example:'%s /dev/ttyACM0'\n", argv[0]);
-		printf("\tWindows example:'%s com3'\n\n", argv[0]);
-		dumpAllHelp(0);
-		return 0;
-	}
-	if (strcmp(argv[1], "-m") == 0) {
-		dumpAllHelp(1);
-		return 0;
-	}
 
-#if defined(__linux__)
+#if defined(__linux__) || (__APPLE__)
 // ascii art doesn't work well on mingw :( 
 	showBanner();  
 #endif
 	
-	set_my_executable_path();
-	
-	char *script_cmds_file = NULL;
-
 	// lets copy the comport string.
 	memset(comport, 0, sizeof(comport));
 	memcpy(comport, argv[1], strlen(argv[1]));
-	
-	// sets the global variable, SP and offline)
-	bool usb_present = hookUpPM3();
 
-	// If the user passed the filename of the 'script' to execute, get it
-	if (argc > 2 && argv[2]) {
+	for (int i = 1; i < argc; i++) {
+	
+		// helptext
+		if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i],"-help") == 0) {
+			show_help(false, argv[0]);
+			dumpAllHelp(0);
+			return 0;
+		}
 		
-		printf("Num of args: %d   -- %s\n", argc, argv[2]);
-		
-		if (argv[2][0] == 'f' &&  //buzzy, if a word 'flush' passed, flush the output after every log entry.
-			argv[2][1] == 'l' &&
-			argv[2][2] == 'u' &&
-			argv[2][3] == 's' &&
-			argv[2][4] == 'h')
-		{
+		// dump markup
+		if (strcmp(argv[i], "-m") == 0) {
+			dumpAllHelp(1);
+			return 0;
+		}	   
+
+		// flush output
+		if(strcmp(argv[i],"-f") == 0 || strcmp(argv[i],"-flush") == 0){
 			printf("Output will be flushed after every print.\n");
 			flushAfterWrite = 1;
 		}
-		else {
-			script_cmds_file = argv[2];
+		
+		// wait for comport
+		if(strcmp(argv[i],"-w") == 0 || strcmp(argv[i],"-wait") == 0){
+			waitCOMPort = true;
 		}
+
+		// execute pm3 command
+		if(strcmp(argv[i],"-c") == 0 || strcmp(argv[i],"-command") == 0){
+			executeCommand = true;
+		}
+
+		// execute lua script
+		if(strcmp(argv[i],"-l") == 0 || strcmp(argv[i],"-lua") == 0){
+			executeCommand = true;
+			addLuaExec = true;
+		}
+	}
+
+	// If the user passed the filename of the 'script' to execute, get it from last parameter
+	if (argc > 2 && argv[argc - 1] && argv[argc - 1][0] != '-') {
+		if (executeCommand){
+			script_cmd = argv[argc - 1];
+			
+			while(script_cmd[strlen(script_cmd) - 1] == ' ')
+				script_cmd[strlen(script_cmd) - 1] = 0x00;
+			
+			if (strlen(script_cmd) == 0) {
+				script_cmd = NULL;
+			} else {
+				if (addLuaExec){
+					// add "script run " to command
+					char *ctmp = NULL;
+					int len = strlen(script_cmd) + 11 + 1;
+					if ((ctmp = (char*) malloc(len)) != NULL) {
+						memset(ctmp, 0, len);
+						strcpy(ctmp, "script run ");
+						strcpy(&ctmp[11], script_cmd);
+						script_cmd = ctmp;
+					}
+				}
+				
+				printf("Execute command from commandline: %s\n", script_cmd);
+			}
+		} else {
+			script_cmds_file = argv[argc - 1];
+		}
+	}
+
+	// check command
+	if (executeCommand && (!script_cmd || strlen(script_cmd) == 0)){
+		printf("ERROR: execute command: command not found.\n");
+		return 2;
+	}
+	
+	// set global variables
+	set_my_executable_path();
+	
+	// open uart
+	if (!waitCOMPort) {
+		sp = uart_open(argv[1]);
+	} else {
+		printf("Waiting for Proxmark to appear on %s ", argv[1]);
+		int openCount = 0;
+		do {
+			sp = uart_open(argv[1]);
+			msleep(1000);
+			printf(".");
+		} while(++openCount < 20 && (sp == INVALID_SERIAL_PORT || sp == CLAIMED_SERIAL_PORT));
+		printf("\n");
+	}
+
+	// check result of uart opening
+	if (sp == INVALID_SERIAL_PORT) {
+		printf("ERROR: invalid serial port\n");
+		usb_present = false;
+		offline = 1;
+	} else if (sp == CLAIMED_SERIAL_PORT) {
+		printf("ERROR: serial port is claimed by another process\n");
+		usb_present = false;
+		offline = 1;
+	} else {
+		usb_present = true;
+		offline = 0;
 	}
 
 	// create a mutex to avoid interlacing print commands from our different threads
@@ -356,21 +471,21 @@ int main(int argc, char* argv[]) {
 #ifdef HAVE_GUI
 
 #  ifdef _WIN32
-	InitGraphics(argc, argv, script_cmds_file, usb_present);
+	InitGraphics(argc, argv, script_cmds_file, script_cmd, usb_present);
 	MainGraphics();
 #  else
 	// for *nix distro's,  check enviroment variable to verify a display
 	char* display = getenv("DISPLAY");
 	if (display && strlen(display) > 1) {
-		InitGraphics(argc, argv, script_cmds_file, usb_present);
+		InitGraphics(argc, argv, script_cmds_file, script_cmd, usb_present);
 		MainGraphics();
 	} else {
-		main_loop(script_cmds_file, usb_present);
+		main_loop(script_cmds_file, script_cmd, usb_present);
 	}
 #  endif
 	
 #else
-	main_loop(script_cmds_file, usb_present);
+	main_loop(script_cmds_file, script_cmd, usb_present);
 #endif	
  
 	// clean up mutex
diff --git a/client/proxmark3.h b/client/proxmark3.h
index 28572b79f..2afe018de 100644
--- a/client/proxmark3.h
+++ b/client/proxmark3.h
@@ -13,6 +13,7 @@
 #define PROXMARK3_H__
 
 #include "usb_cmd.h"
+#include "cmdscript.h"  // CmdScriptRun  
 
 #define PROXPROMPT "pm3 --> "
 #ifdef __cplusplus
@@ -22,7 +23,7 @@ extern "C" {
 void SendCommand(UsbCommand *c);
 const char *get_my_executable_path(void);
 const char *get_my_executable_directory(void);
-void main_loop(char *script_cmds_file, bool usb_present);
+void main_loop(char *script_cmds_file, char *script_cmd, bool usb_present);
 
 #ifdef __cplusplus
 }
diff --git a/client/ui.c b/client/ui.c
index 85ad66d3c..7ea529f8f 100644
--- a/client/ui.c
+++ b/client/ui.c
@@ -19,7 +19,7 @@ int GridOffset = 0;
 bool GridLocked = false;
 bool showDemod = true;
 
-pthread_mutex_t print_lock = PTHREAD_MUTEX_INITIALIZER;
+extern pthread_mutex_t print_lock = PTHREAD_MUTEX_INITIALIZER;
 
 static char *logfilename = "proxmark3.log";
 
diff --git a/client/ui.h b/client/ui.h
index 0cef6e2c8..5c50b55db 100644
--- a/client/ui.h
+++ b/client/ui.h
@@ -42,6 +42,8 @@ extern int flushAfterWrite;   //buzzy
 extern bool GridLocked;
 extern bool showDemod;
 
+extern pthread_mutex_t print_lock;
+
 extern void iceIIR_Butterworth(int * data, const size_t len);
 extern void iceSimple_Filter(int *data, const size_t len, uint8_t k);
 #endif