diff --git a/build.xml b/build.xml
index 2d785ae096..6d24ed4ffa 100644
--- a/build.xml
+++ b/build.xml
@@ -297,6 +297,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/launcher/README.md b/launcher/README.md
deleted file mode 100644
index 58c8222afb..0000000000
--- a/launcher/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# The Launcher
-
-This code won't really make any sense for other than in the portable i2p that's shipped with the browser bundle.
-
-Anyway, if you wanna build it and have fun, just do `./sbt`
-
-Scala isn't scary - it's java except the ;;;;;;;; ;)
-
-
diff --git a/launcher/build.sbt b/launcher/build.sbt
deleted file mode 100644
index 9c5599e420..0000000000
--- a/launcher/build.sbt
+++ /dev/null
@@ -1,46 +0,0 @@
-import sbtassembly.AssemblyPlugin.defaultShellScript
-import sbt.Keys._
-
-
-lazy val root = (project in file("."))
- .settings(
- name := "RouterLaunchApp",
- organization := "net.i2p",
- scalaVersion := "2.11.11", // We have to use Scala 11 as long as we're going to support JRE 1.7
- version := "0.1.0-SNAPSHOT",
- assemblyJarName in assembly := s"${name.value}-${version.value}.jar",
- mainClass in assembly := Some("net.i2p.RouterLauncherApp")
-
- // This will prepend shebang and become executable, however, it will only work on unix systems and not windows.
- //assemblyOption in assembly := (assemblyOption in assembly).value.copy(prependShellScript = Some(defaultShellScript))
- )
-
-resolvers ++= Seq(
- DefaultMavenRepository,
- Resolver.mavenLocal,
- Resolver.sonatypeRepo("releases"),
- Resolver.typesafeRepo("releases"),
- Resolver.sbtPluginRepo("releases")
-)
-
-libraryDependencies ++= Seq(
- "org.json4s" %% "json4s-native" % "3.5.3"
-)
-
-assemblyExcludedJars in assembly := {
- val donts = List("BOB.jar", "sam.jar", "desktopgui.jar", "i2ptunnel-ui.jar", "i2psnark.jar", "jetty-sslengine.jar")
- val cp = (fullClasspath in assembly).value
- cp filter { s => donts.contains(s.data.getName)}
-}
-
-fork := true
-
-run / javaOptions += "-Xmx512M"
-run / connectInput := true
-
-unmanagedBase := baseDirectory.value / ".." / "build"
-unmanagedClasspath in Compile ++= Seq(
- baseDirectory.value / ".." / "build" / "*.jar"
-)
-
-
diff --git a/launchers/README.md b/launchers/README.md
new file mode 100644
index 0000000000..379b30e36c
--- /dev/null
+++ b/launchers/README.md
@@ -0,0 +1,11 @@
+# The Launcher
+
+Here you'll find the code for the next generation Mac OS X launcher, as well as the Browser Bundle i2p launcher.
+
+Anyway, if you wanna build it and have fun, just do `./sbt`
+
+Scala isn't scary - it's java except the ;;;;;;;; ;)
+
+https://www.scala-lang.org/
+https://www.scala-sbt.org/
+
diff --git a/launchers/browserbundle/README.md b/launchers/browserbundle/README.md
new file mode 100644
index 0000000000..1b700698e1
--- /dev/null
+++ b/launchers/browserbundle/README.md
@@ -0,0 +1,5 @@
+# The browser bundle i2p launcher
+
+This code won't really make any sense for other than in the portable i2p that's shipped with the browser bundle.
+
+
diff --git a/launchers/browserbundle/build.sbt b/launchers/browserbundle/build.sbt
new file mode 100644
index 0000000000..ca570cb8fa
--- /dev/null
+++ b/launchers/browserbundle/build.sbt
@@ -0,0 +1,26 @@
+
+
+libraryDependencies ++= Seq(
+ "org.json4s" %% "json4s-native" % "3.5.3"
+)
+
+assemblyExcludedJars in assembly := {
+ val donts = List(
+ "BOB.jar",
+ "sam.jar",
+ "desktopgui.jar",
+ "i2ptunnel-ui.jar",
+ "i2psnark.jar",
+ "jetty-sslengine.jar"
+ )
+ val cp = (fullClasspath in assembly).value
+ cp filter { s => donts.contains(s.data.getName)}
+}
+
+// Unmanaged base will be included in a fat jar
+unmanagedBase := baseDirectory.value / ".." / ".." / "build"
+
+// Unmanaged classpath will be available at compile time
+unmanagedClasspath in Compile ++= Seq(
+ baseDirectory.value / ".." / ".." / "build" / "*.jar"
+)
diff --git a/launcher/src/main/resources/blocklist.txt b/launchers/browserbundle/src/main/resources/blocklist.txt
similarity index 100%
rename from launcher/src/main/resources/blocklist.txt
rename to launchers/browserbundle/src/main/resources/blocklist.txt
diff --git a/launcher/src/main/resources/clients.config b/launchers/browserbundle/src/main/resources/clients.config
similarity index 100%
rename from launcher/src/main/resources/clients.config
rename to launchers/browserbundle/src/main/resources/clients.config
diff --git a/launcher/src/main/resources/continents.txt b/launchers/browserbundle/src/main/resources/continents.txt
similarity index 100%
rename from launcher/src/main/resources/continents.txt
rename to launchers/browserbundle/src/main/resources/continents.txt
diff --git a/launcher/src/main/resources/countries.txt b/launchers/browserbundle/src/main/resources/countries.txt
similarity index 100%
rename from launcher/src/main/resources/countries.txt
rename to launchers/browserbundle/src/main/resources/countries.txt
diff --git a/launcher/src/main/resources/geoip.txt b/launchers/browserbundle/src/main/resources/geoip.txt
similarity index 100%
rename from launcher/src/main/resources/geoip.txt
rename to launchers/browserbundle/src/main/resources/geoip.txt
diff --git a/launcher/src/main/resources/hosts.txt b/launchers/browserbundle/src/main/resources/hosts.txt
similarity index 100%
rename from launcher/src/main/resources/hosts.txt
rename to launchers/browserbundle/src/main/resources/hosts.txt
diff --git a/launcher/src/main/resources/i2ptunnel.config b/launchers/browserbundle/src/main/resources/i2ptunnel.config
similarity index 100%
rename from launcher/src/main/resources/i2ptunnel.config
rename to launchers/browserbundle/src/main/resources/i2ptunnel.config
diff --git a/launcher/src/main/resources/logger.config b/launchers/browserbundle/src/main/resources/logger.config
similarity index 100%
rename from launcher/src/main/resources/logger.config
rename to launchers/browserbundle/src/main/resources/logger.config
diff --git a/launcher/src/main/resources/router.config b/launchers/browserbundle/src/main/resources/router.config
similarity index 100%
rename from launcher/src/main/resources/router.config
rename to launchers/browserbundle/src/main/resources/router.config
diff --git a/launcher/src/main/resources/webapps.config b/launchers/browserbundle/src/main/resources/webapps.config
similarity index 100%
rename from launcher/src/main/resources/webapps.config
rename to launchers/browserbundle/src/main/resources/webapps.config
diff --git a/launcher/src/main/scala/net/i2p/DeployProfile.scala b/launchers/browserbundle/src/main/scala/net/i2p/DeployProfile.scala
similarity index 100%
rename from launcher/src/main/scala/net/i2p/DeployProfile.scala
rename to launchers/browserbundle/src/main/scala/net/i2p/DeployProfile.scala
diff --git a/launcher/src/main/scala/net/i2p/RouterLauncherApp.scala b/launchers/browserbundle/src/main/scala/net/i2p/RouterLauncherApp.scala
similarity index 100%
rename from launcher/src/main/scala/net/i2p/RouterLauncherApp.scala
rename to launchers/browserbundle/src/main/scala/net/i2p/RouterLauncherApp.scala
diff --git a/launchers/build.sbt b/launchers/build.sbt
new file mode 100644
index 0000000000..c696c56809
--- /dev/null
+++ b/launchers/build.sbt
@@ -0,0 +1,44 @@
+import sbt.Keys._
+
+resolvers ++= Seq(
+ DefaultMavenRepository,
+ Resolver.mavenLocal,
+ Resolver.sonatypeRepo("releases"),
+ Resolver.typesafeRepo("releases"),
+ Resolver.sbtPluginRepo("releases")
+)
+
+lazy val commonSettings = Seq(
+ organization := "net.i2p",
+ scalaVersion := "2.11.11", // We have to use Scala 11 as long as we're going to support JRE 1.7
+ version := "0.1.0-SNAPSHOT"
+)
+
+
+lazy val browserbundle = (project in file("browserbundle"))
+ .settings(
+ commonSettings,
+ name := "RouterLaunchApp",
+ assemblyJarName in assembly := s"${name.value}-${version.value}.jar",
+ mainClass in assembly := Some("net.i2p.RouterLauncherApp")
+ )
+
+lazy val macosx = (project in file("macosx"))
+ .settings(
+ commonSettings,
+ name := "RouterLaunchApp",
+ assemblyJarName in assembly := s"${name.value}-${version.value}.jar",
+ mainClass in assembly := Some("net.i2p.MacOSXRouterLauncherApp")
+ )
+
+
+lazy val root = (project in file("."))
+ .aggregate(browserbundle, macosx)
+
+
+
+
+fork := true
+
+run / javaOptions += "-Xmx512M"
+run / connectInput := true
diff --git a/launchers/macosx/README.md b/launchers/macosx/README.md
new file mode 100644
index 0000000000..ca89b27a10
--- /dev/null
+++ b/launchers/macosx/README.md
@@ -0,0 +1,8 @@
+# The Mac OS X Launcher
+
+**Note** this project is WIP, cause Meeh has yet to merge in Obj-C/Swift code for GUI stuff in OSX.
+
+However, this is a thin wrapper launching both Mac OS X trayicon and the I2P router - and make them talk together.
+
+More code will be merged in, it's just a f* mess which Meeh needs to clean up and move into repo.
+
diff --git a/launchers/macosx/build.sbt b/launchers/macosx/build.sbt
new file mode 100644
index 0000000000..3311b34aaf
--- /dev/null
+++ b/launchers/macosx/build.sbt
@@ -0,0 +1,22 @@
+import sbtassembly.AssemblyPlugin.defaultShellScript
+
+lazy val i2pVersion = "0.9.34"
+
+// Unmanaged classpath will be available at compile time
+unmanagedClasspath in Compile ++= Seq(
+ baseDirectory.value / ".." / ".." / "build" / "*.jar",
+ baseDirectory.value / ".." / ".." / "router" / "java" / "src"
+)
+
+// Please note the difference between browserbundle, this has
+// the "in Compile" which limit it's scope to that.
+//unmanagedBase in Compile := baseDirectory.value / ".." / ".." / "build"
+
+libraryDependencies ++= Seq(
+ "net.i2p" % "router" % i2pVersion % Compile
+)
+
+
+assemblyOption in assembly := (assemblyOption in assembly).value.copy(prependShellScript = Some(defaultShellScript))
+
+assemblyJarName in assembly := s"${name.value}-${version.value}"
diff --git a/launchers/macosx/src/main/scala/net/i2p/MacOSXRouterLauncherApp.scala b/launchers/macosx/src/main/scala/net/i2p/MacOSXRouterLauncherApp.scala
new file mode 100644
index 0000000000..c363786ddc
--- /dev/null
+++ b/launchers/macosx/src/main/scala/net/i2p/MacOSXRouterLauncherApp.scala
@@ -0,0 +1,28 @@
+package net.i2p
+
+import net.i2p.router.Router
+
+/**
+ *
+ * For java developers:
+ * A scala object is like an instance of a class.
+ * If you define a method inside an object, it's equals to
+ * java's static methods.
+ *
+ * Also, in scala, the body of a class/object is executed as it's
+ * constructor.
+ *
+ * Also noteworthy;
+ * val is immutable
+ * var is mutable
+ *
+ *
+ * @author Meeh
+ * @version 0.0.1
+ * @since 0.9.35
+ */
+object MacOSXRouterLauncherApp extends App {
+
+
+ Router.main(args)
+}
diff --git a/launcher/project/build.properties b/launchers/project/build.properties
similarity index 100%
rename from launcher/project/build.properties
rename to launchers/project/build.properties
diff --git a/launcher/project/plugins.sbt b/launchers/project/plugins.sbt
similarity index 100%
rename from launcher/project/plugins.sbt
rename to launchers/project/plugins.sbt
diff --git a/launcher/sbt b/launchers/sbt
similarity index 100%
rename from launcher/sbt
rename to launchers/sbt