int CmdQuit(const char *Cmd)
 {
   exit(0);
-  return 0;
+  return 99;
 }
 
 int CmdRev(const char *Cmd)
 // Entry point into our code: called whenever the user types a command and
 // then presses Enter, which the full command line that they typed.
 //-----------------------------------------------------------------------------
-void CommandReceived(char *Cmd) {
-  CmdsParse(CommandTable, Cmd);
+int CommandReceived(char *Cmd) {
+       return CmdsParse(CommandTable, Cmd);
 }
 
 //-----------------------------------------------------------------------------
 
 #include "usb_cmd.h"
 #include "cmdparser.h"
 void UsbCommandReceived(UsbCommand *UC);
-void CommandReceived(char *Cmd);
+int CommandReceived(char *Cmd);
 bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout);
 bool WaitForResponse(uint32_t cmd, UsbCommand* response);
 void clearCommandBuffer();
 
   }
 }
 
-void CmdsParse(const command_t Commands[], const char *Cmd)
+int CmdsParse(const command_t Commands[], const char *Cmd)
 {
   if(strcmp( Cmd, "XX_internal_command_dump_XX") == 0)
   {// Help dump children
       dumpCommandsRecursive(Commands, 0);
-      return;
+               return 0;
   }
   if(strcmp( Cmd, "XX_internal_command_dump_markdown_XX") == 0)
   {// Markdown help dump children
       dumpCommandsRecursive(Commands, 1);
-      return;
+               return 0;
   }
   char cmd_name[32];
   int len = 0;
   if (Commands[i].Name) {
     while (Cmd[len] == ' ')
       ++len;
-    Commands[i].Parse(Cmd + len);
+       return Commands[i].Parse(Cmd + len);
   } else {
     // show help for selected hierarchy or if command not recognised
     CmdsHelp(Commands);
   }
+
+       return 0;
 }
 
 char pparent[512] = {0};
 
 // Print each command in the command array without help
 void CmdsLS(const command_t Commands[]);
 // Parse a command line
-void CmdsParse(const command_t Commands[], const char *Cmd);
+int CmdsParse(const command_t Commands[], const char *Cmd);
 void dumpCommandsRecursive(const command_t cmds[], int markdown);
 
 #endif
 
         cmd[strlen(cmd) - 1] = 0x00;
                        
                        if (cmd[0] != 0x00) {
-                               if (strncmp(cmd, "quit", 4) == 0) {
-                                       exit(0);
+                               int ret = CommandReceived(cmd);
+                               add_history(cmd);
+                               if (ret == 99) {  // exit or quit
                                        break;
                                }
-                               CommandReceived(cmd);
-                               add_history(cmd);
                        }
                        free(cmd);
                } else {
                .usb_present = 0,
                .script_cmds_file = NULL
        };
-       pthread_t main_loop_t;
+       pthread_t main_loop_threat;
 
   
        sp = uart_open(argv[1]);
        // create a mutex to avoid interlacing print commands from our different threads
        pthread_mutex_init(&print_lock, NULL);
 
-       pthread_create(&main_loop_t, NULL, &main_loop, &marg);
+       pthread_create(&main_loop_threat, NULL, &main_loop, &marg);
        InitGraphics(argc, argv);
 
        MainGraphics();
 
-       pthread_join(main_loop_t, NULL);
+       pthread_join(main_loop_threat, NULL);
 
        // Clean up the port
+       if (offline == 0) {
        uart_close(sp);
+       }
   
        // clean up mutex
        pthread_mutex_destroy(&print_lock);
   
-  return 0;
+       exit(0);
 }