protected static void start() throws Exception {
    agent = new SSHAgent();

    if (agent.isCreatedCorrectly()) {

      File settingsFile =
          new File(
              System.getProperty("user.home") + File.separator + AgentConstants.SETTINGS_FILE_NAME);

      if (!settingsFile.exists()) {
        try {
          settings = AgentUtils.initSettingsFile(settingsFile); // create default settings file
          Logger.getLogger(TrayProcess.class.getName())
              .log(
                  Level.INFO,
                  "New settings file created: {0}",
                  new Object[] {settingsFile.getPath()});
        } catch (Exception ex) {
          TrayProcess.createError(
              LocalizedLogger.getLocalizedMessage(
                  "INIT_SETTINGS_FILE_ERROR", ex.getLocalizedMessage()),
              false,
              ex);
          // Logger.getLogger(TrayProcess.class.getName()).log(Level.SEVERE, null, ex);
        }
      } else {
        settings = new Properties();
        try (FileInputStream fileIn = new FileInputStream(settingsFile)) {
          settings.load(fileIn);
        }
        Logger.getLogger(TrayProcess.class.getName())
            .log(
                Level.INFO,
                "Existing settings file loaded: {0}",
                new Object[] {settingsFile.getPath()});
      }

      // start device USB service depending on device type
      String deviceTypeProperty =
          AgentUtils.readSetting(
              settings, AgentConstants.SETTINGS_KEY_DEVICE, AgentConstants.TREZOR_LABEL);
      switch (deviceTypeProperty.toLowerCase()) {
        case (AgentConstants.SETTINGS_KEEPKEY_DEVICE):
          deviceType = AgentConstants.KEEPKEY_LABEL;
          deviceService = KeepKeyService.startKeepKeyService();
          break;
        default:
          deviceType = AgentConstants.TREZOR_LABEL;
          deviceService = TrezorService.startTrezorService();
      }

      initSessionTimer(); // start timer to control session (PIN+Passphrase) expiration

      SwingUtilities.invokeLater(
          new Runnable() { // start GUI
            @Override
            public void run() {
              TrayProcess.createAndShowGUI();
            }
          });

      agent.startMainLoop(); // start SSH Agent emulating Pageant and listening Windows requests
    }
  }