diff --git a/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift b/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift
index 051206c004a1d398d7459e2d2f46aad361998f68..4bbacd093b4415a9a2a258a934e645e1d1524059 100644
--- a/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift
+++ b/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift
@@ -8,6 +8,7 @@
 
 import Foundation
 
+
 @objc class DetectJava : NSObject {
   
   static var hasJRE : Bool = false
diff --git a/launchers/macosx/I2PLauncher/routermgmt/RouterManager.swift b/launchers/macosx/I2PLauncher/routermgmt/RouterManager.swift
index 4776b84a377cd64c707a9a48f747ab67d28a14ec..6cb58a9f488a9a3d093cd9ab3f4d1b40a94a74f2 100644
--- a/launchers/macosx/I2PLauncher/routermgmt/RouterManager.swift
+++ b/launchers/macosx/I2PLauncher/routermgmt/RouterManager.swift
@@ -19,13 +19,14 @@ class RouterManager : NSObject {
   
   // MARK: - Properties
   
-  static let packedVersion : String = "0.9.37"
+  static let packedVersion : String = NSDEF_I2P_VERSION
   
   let eventManager = EventManager()
   let routerRunner = RouterRunner()
   
   var logViewStorage: NSTextStorage?
   var lastRouterPid : String? = nil
+  private var canRouterStart : Bool = false
   
   private static func handleRouterException(information:Any?) {
     Logger.MLog(level:1,"event! - handle router exception")
@@ -93,7 +94,7 @@ class RouterManager : NSObject {
     routerManager.eventManager.listenTo(eventName: "router_version", action: handleRouterVersion)
     routerManager.eventManager.listenTo(eventName: "router_exception", action: handleRouterException)
     routerManager.eventManager.listenTo(eventName: "router_already_running", action: handleRouterAlreadyStarted)
-    routerManager.eventManager.listenTo(eventName: "router_can_start", action: routerManager.routerRunner.StartAgent)
+    routerManager.eventManager.listenTo(eventName: "router_can_start", action: routerManager.setLauncherReadyToStartRouter)
     routerManager.eventManager.listenTo(eventName: "router_can_setup", action: routerManager.routerRunner.SetupAgent)
     
     //routerManager.eventManager.listenTo(eventName: "launch_agent_running", action: routerManager.routerRunner.onLoadedAgent)
@@ -151,6 +152,22 @@ class RouterManager : NSObject {
     return sharedRouterManager
   }
   
+  func setLauncherReadyToStartRouter(_ information: Any?) {
+    self.canRouterStart = true
+    if (Preferences.shared().startRouterOnLauncherStart) {
+      // Trigger the actual start at launch time
+      print("Start router on launch preference is enabled - Starting")
+      self.routerRunner.StartAgent(information)
+    } else {
+      print("Start router on launch preference is disabled - Router ready when user are!")
+      SBridge.sendUserNotification("I2P Router Ready", formattedMsg: "The I2P Router is ready to be launched, however the autostart is disabled and require user input to start.")
+    }
+  }
+  
+  func checkIfRouterCanStart() -> Bool {
+    return self.canRouterStart
+  }
+  
   func setRouterTask(router: I2PRouterTask) {
     self.routerInstance = router
   }
diff --git a/launchers/macosx/I2PLauncher/routermgmt/RouterProcessStatus.swift b/launchers/macosx/I2PLauncher/routermgmt/RouterProcessStatus.swift
index ca1abd0b83dd1c9e14a2156ae7fe9968eab37e3b..618190176654cc34892ac57347b77ae4f8e6ed4e 100644
--- a/launchers/macosx/I2PLauncher/routermgmt/RouterProcessStatus.swift
+++ b/launchers/macosx/I2PLauncher/routermgmt/RouterProcessStatus.swift
@@ -51,7 +51,7 @@ extension RouterProcessStatus {
   static var isRouterChildProcess : Bool = (RouterManager.shared().getRouterTask() != nil)
   static var routerVersion : String? = Optional.none
   static var routerStartedAt : Date? = Optional.none
-  static var i2pDirectoryPath : String = NSHomeDirectory() + "/Library/I2P"
+  static var i2pDirectoryPath : String = Preferences.shared().i2pBaseDirectory
   
   
 }
diff --git a/launchers/macosx/I2PLauncher/routermgmt/RouterRunner.swift b/launchers/macosx/I2PLauncher/routermgmt/RouterRunner.swift
index 3f11a0c9a9b4f364380e78b3fad2fd492ab75f63..22c2730a1c93ec3486fa2609fcd8f3ec933af141 100644
--- a/launchers/macosx/I2PLauncher/routermgmt/RouterRunner.swift
+++ b/launchers/macosx/I2PLauncher/routermgmt/RouterRunner.swift
@@ -20,20 +20,11 @@ class RouterRunner: NSObject {
   var currentRunningProcess: Subprocess?
   var currentProcessResults: ExecutionResult?
   
-  let domainLabel = "net.i2p.macosx.I2PRouter"
+  let domainLabel = String(NSString(format: "%@.I2PRouter", APPDOMAIN))
   
-  let plistName = "net.i2p.macosx.I2PRouter.plist"
+  let plistName = String(NSString(format: "%@.I2PRouter.plist", APPDOMAIN))
   
-  let defaultStartupCommand:String = "/usr/libexec/java_home"
-  
-  let defaultJavaHomeArgs:[String] = [
-    "-v",
-    "1.7+",
-    "--exec",
-    "java",
-  ]
-  
-  let appSupportPath = FileManager.default.urls(for: FileManager.SearchPathDirectory.applicationSupportDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)
+  //let appSupportPath = FileManager.default.urls(for: FileManager.SearchPathDirectory.applicationSupportDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)
   
   override init() {
     super.init()
@@ -59,22 +50,24 @@ class RouterRunner: NSObject {
   
   func SetupAndReturnAgent() -> LaunchAgent {
     
+    let applicationsSupportPath: URL = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
+    
     let defaultStartupFlags:[String] = [
-      "-Xmx512M",
-      "-Xms128m",
       "-Djava.awt.headless=true",
-      "".appendingFormat("-Di2p.base.dir=%@", NSHomeDirectory()+"/Library/I2P"),
-      "".appendingFormat("-Dwrapper.logfile=%@/Library/I2P/router.log", NSHomeDirectory()),
-      "-Dwrapper.logfile.loglevel=DEBUG",
-      "".appendingFormat("-Dwrapper.java.pidfile=%@/i2p/router.pid", appSupportPath.description),
+      "".appendingFormat("-Di2p.base.dir=%@", Preferences.shared().i2pBaseDirectory),
+      "".appendingFormat("-Dwrapper.logfile=%@/i2p/router.log", applicationsSupportPath.absoluteString),
+      "".appendingFormat("-Dwrapper.java.pidfile=%@/i2p/router.pid", applicationsSupportPath.absoluteString),
+      "-Dwrapper.logfile.loglevel=DEBUG", // TODO: Allow loglevel to be set from Preferences?
       "-Dwrapper.console.loglevel=DEBUG",
       "net.i2p.router.Router"
     ]
     
-    self.daemonPath = self.defaultStartupCommand
+    let javaCliArgs = Preferences.shared().javaCommandPath.splitByWhitespace()
+    
+    self.daemonPath = javaCliArgs[0]
     self.arguments = defaultStartupFlags.joined(separator: " ")
     
-    let basePath = NSHomeDirectory()+"/Library/I2P"
+    let basePath = Preferences.shared().i2pBaseDirectory
     
     let jars = try! FileManager.default.contentsOfDirectory(atPath: basePath+"/lib")
     var classpath:String = "."
@@ -85,19 +78,21 @@ class RouterRunner: NSObject {
     var cliArgs:[String] = [
       self.daemonPath!,
       ]
-    cliArgs.append(contentsOf: self.defaultJavaHomeArgs)
+    cliArgs.append(contentsOf: javaCliArgs.dropFirst())
     cliArgs.append(contentsOf: [
       "-cp",
       classpath,
       ])
+    // This allow java arguments to be passed from the settings
+    cliArgs.append(contentsOf: Preferences.shared().javaCommandOptions.splitByWhitespace())
     cliArgs.append(contentsOf: defaultStartupFlags)
     let agent = LaunchAgent(label: self.domainLabel,program: cliArgs)
     agent.launchOnlyOnce = false
     agent.keepAlive = false
     agent.workingDirectory = basePath
     agent.userName = NSUserName()
-    agent.standardErrorPath = NSHomeDirectory()+"/Library/Logs/I2P/router.stderr.log"
-    agent.standardOutPath = NSHomeDirectory()+"/Library/Logs/I2P/router.stdout.log"
+    agent.standardErrorPath = NSString(format: "%@/router.stderr.log", Preferences.shared().i2pLogDirectory) as String
+    agent.standardOutPath = NSString(format: "%@/router.stdout.log", Preferences.shared().i2pLogDirectory) as String
     agent.environmentVariables = [
       "PATH": "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin",
       "I2PBASE": basePath,
@@ -106,12 +101,12 @@ class RouterRunner: NSObject {
     agent.processType = ProcessType.adaptive
     RouterRunner.launchAgent = agent
     
-    let userPreferences = UserDefaults.standard
-    let shouldStartupAtLogin = userPreferences.bool(forKey: "startRouterAtLogin")
-    agent.runAtLoad = shouldStartupAtLogin
+    // NOTE: I suspect this is better to solve in the application
+    agent.runAtLoad = false //Preferences.shared().startRouterOnLauncherStart
     agent.keepAlive = true
     DispatchQueue(label: "background_starter").async {
       do {
+        // TODO: Find a better way than sleep
         try LaunchAgentManager.shared.write(agent, called: self.plistName)
         sleep(1)
         try LaunchAgentManager.shared.load(agent)
@@ -140,11 +135,15 @@ class RouterRunner: NSObject {
   
   
   func StartAgent(_ information:Any? = nil) {
-    let agent = RouterRunner.launchAgent ?? information as! LaunchAgent
-    DispatchQueue(label: "background_block").async {
-      LaunchAgentManager.shared.start(agent, { (proc) in
-        NSLog("Will call onLaunchdStarted")
-      })
+    if (RouterManager.shared().checkIfRouterCanStart()) {
+      let agent = RouterRunner.launchAgent ?? information as! LaunchAgent
+      DispatchQueue(label: "background_block").async {
+        LaunchAgentManager.shared.start(agent, { (proc) in
+          NSLog("Will call onLaunchdStarted")
+        })
+      }
+    } else {
+      SBridge.sendUserNotification("Whops! Please wait", formattedMsg: "I'm sorry but it's still something unresolved before we can start the I2P router. Please wait.")
     }
   }