def quit(self, exitCode=0):
     if self.mainWindow is not None:
         self.mainWindow.close()
     if self.settingsWindow is not None:
         self.settingsWindow.close()
     
     if self.serverThread != None and not sip.isdeleted(self.serverThread) and self.serverThread.isRunning():
         self.serverThread.finished.disconnect(self.serverFinishedUnexpectedly)
         get_server().stop_server()
         getCoreLogger().info("Waiting maximal 30s for server to stop...")
         # wait maximal 30s 
         if self.serverThread.wait(30000):
             getCoreLogger().info("server stopped")
         else:
             getCoreLogger().warning("server not stopped properly")
     else:
         getCoreLogger().info("server not running")
     
     if self.running:
         if get_settings().get_plugins_enabled():
             get_plugin_manager().deactivatePlugins(get_plugin_manager().getAllPlugins(), save_state=False)
             getCoreLogger().info("all plug-ins deactivated")
         if self.mainWindow is not None:
             self.mainWindow.finish()
         if self.settingsWindow is not None:
             self.settingsWindow.finish()
         self.running = False
         
     finalExitCode = 0
     if exitCode != 0:
         finalExitCode = exitCode
     elif self.exitCode != 0:
         finalExitCode = self.exitCode
     else:
         finalExitCode = get_server().exitCode
         
     get_settings().write_config_to_hd()
     DataReceiverThread.cleanup()
         
     self.exitCode = finalExitCode
     
     self._coldShutdown(finalExitCode)
     return finalExitCode