diff --git a/apps/desktopgui/build.gradle b/apps/desktopgui/build.gradle
index 70e41381254da7fb50e40f1fadf79554da49645b..86d37253ebe86412adf02ced98569d44ceb2e22d 100644
--- a/apps/desktopgui/build.gradle
+++ b/apps/desktopgui/build.gradle
@@ -2,6 +2,7 @@ sourceSets {
     main {
         java {
             srcDir 'src'
+            srcDir 'build/messages-src'
         }
     }
 }
@@ -12,3 +13,13 @@ dependencies {
     compile project(':installer')
     compile project(':apps:systray')
 }
+
+// Create the java files from the po files. The jar task will compile them.
+// This requires gettext 0.19 or higher.
+// We don't support the "slow way"
+task bundle {
+    doLast {
+        println "apps/desktopgui/bundle-messages.sh".execute().text
+    }
+}
+jar.dependsOn bundle
diff --git a/apps/desktopgui/bundle-messages.sh b/apps/desktopgui/bundle-messages.sh
old mode 100644
new mode 100755
index 6a3caa7d44466f7c9a6f34fb8560137960f9802c..5e747a0abfe68946266d323a2a030472f14e4161
--- a/apps/desktopgui/bundle-messages.sh
+++ b/apps/desktopgui/bundle-messages.sh
@@ -11,6 +11,7 @@
 # zzz - public domain
 # Mathiasdm - modifications for desktopgui
 #
+cd `dirname $0`
 CLASS=net.i2p.desktopgui.messages
 TMPFILE=build/javafiles.txt
 export TZ=UTC
diff --git a/apps/i2ptunnel/build.gradle b/apps/i2ptunnel/build.gradle
index 8b9259bd4220078aae2e82fc3e355e9eec5f26f6..5dc1d89d19f83f2d9b3dad4c61d937a101940e38 100644
--- a/apps/i2ptunnel/build.gradle
+++ b/apps/i2ptunnel/build.gradle
@@ -6,6 +6,7 @@ sourceSets {
     main {
         java {
             srcDir 'java/src'
+            srcDir 'java/build/messages-proxy-src'
         }
     }
     test {
@@ -22,6 +23,15 @@ dependencies {
     providedCompile project(':apps:jetty')
 }
 
+// Create the java files from the po files. The jar task will compile them.
+// This requires gettext 0.19 or higher.
+// We don't support the "slow way"
+task bundleProxy {
+    doLast {
+        println "apps/i2ptunnel/java/bundle-messages-proxy.sh".execute().text
+    }
+}
+
 task i2ptunnelJar(type: Jar) {
     from sourceSets.main.output 
     exclude '**/ui/*.class'
@@ -42,6 +52,7 @@ task i2ptunnelJar(type: Jar) {
         into "net/i2p/i2ptunnel/resources"
     })
 }
+i2ptunnelJar.dependsOn bundleProxy
 
 task tempBeansJar(type: Jar) {
     from sourceSets.main.output
diff --git a/apps/i2ptunnel/java/bundle-messages-proxy.sh b/apps/i2ptunnel/java/bundle-messages-proxy.sh
index e3fe5bb229a9b5df29d9502e1782f74740fc2193..860ceb9eced0134a27c198844e190b0f7d05d28e 100755
--- a/apps/i2ptunnel/java/bundle-messages-proxy.sh
+++ b/apps/i2ptunnel/java/bundle-messages-proxy.sh
@@ -10,6 +10,7 @@
 #
 # zzz - public domain
 #
+cd `dirname $0`
 CLASS=net.i2p.i2ptunnel.proxy.messages
 TMPFILE=build/javafiles-proxy.txt
 export TZ=UTC
diff --git a/apps/i2ptunnel/java/bundle-messages.sh b/apps/i2ptunnel/java/bundle-messages.sh
index e12d79049395f49d9fb718be501a77a2ccc6012d..d10e2d89c742b707663213a7e22761135a1f39fa 100755
--- a/apps/i2ptunnel/java/bundle-messages.sh
+++ b/apps/i2ptunnel/java/bundle-messages.sh
@@ -10,6 +10,7 @@
 #
 # zzz - public domain
 #
+cd `dirname $0`
 CLASS=net.i2p.i2ptunnel.web.messages
 TMPFILE=build/javafiles.txt
 export TZ=UTC
diff --git a/apps/ministreaming/build.gradle b/apps/ministreaming/build.gradle
index 6eb49bb3ad7b8ad2014c4e24017214caf337e6a5..5fddfc419d049d1d6b6545d375167232868bf83a 100644
--- a/apps/ministreaming/build.gradle
+++ b/apps/ministreaming/build.gradle
@@ -8,6 +8,7 @@ sourceSets {
     main {
         java {
             srcDir 'java/src'
+            srcDir 'java/build/messages-src'
         }
     }
     test {
@@ -21,6 +22,16 @@ dependencies {
     api project(':core')
 }
 
+// Create the java files from the po files. The jar task will compile them.
+// This requires gettext 0.19 or higher.
+// We don't support the "slow way"
+task bundle {
+    doLast {
+        println "apps/ministreaming/java/bundle-messages.sh".execute().text
+    }
+}
+jar.dependsOn bundle
+
 jar {
     manifest {
         attributes 'Specification-Title': 'I2P Streaming API'
diff --git a/apps/ministreaming/java/bundle-messages.sh b/apps/ministreaming/java/bundle-messages.sh
index 3092be3aa0c26eac7a9a7ce8bdbd67abd7203912..cdc4e3c2ecbd92aec9a264da81413dfd80abfa94 100755
--- a/apps/ministreaming/java/bundle-messages.sh
+++ b/apps/ministreaming/java/bundle-messages.sh
@@ -10,6 +10,7 @@
 #
 # zzz - public domain
 #
+cd `dirname $0`
 CLASS=net.i2p.client.streaming.messages
 TMPFILE=build/javafiles.txt
 export TZ=UTC
diff --git a/apps/routerconsole/build.gradle b/apps/routerconsole/build.gradle
index 48f37c4612978e21ca63068c648e2159d928d9ff..af6eeb7c6ba64dafbfa4205cfd6e1b7df9e53f7e 100644
--- a/apps/routerconsole/build.gradle
+++ b/apps/routerconsole/build.gradle
@@ -7,6 +7,8 @@ sourceSets {
     main {
         java {
             srcDir 'java/src'
+            srcDir 'java/build/messages-countries-src'
+            srcDir 'java/build/messages-news-src'
         }
     }
 }
@@ -40,6 +42,16 @@ if (System.getenv("TARGET_JAVA_HOME") == null && JavaVersion.current() != JavaVe
     test.dependsOn scalaTest
 }
 
+// Create the java files from the po files. The jar task will compile them.
+// This requires gettext 0.19 or higher.
+// We don't support the "slow way"
+task bundleJar {
+    doLast {
+        println "apps/routerconsole/java/bundle-messages-countries.sh".execute().text
+        println "apps/routerconsole/java/bundle-messages-news.sh".execute().text
+    }
+}
+
 task consoleJar(type: Jar) {
     from sourceSets.main.output
     exclude 'net/i2p/router/web/helpers/**'
@@ -56,6 +68,7 @@ task consoleJar(type: Jar) {
         into "net/i2p/router/news/resources"
     })
 }
+consoleJar.dependsOn bundleJar
 
 artifacts {
     archives consoleJar
diff --git a/apps/routerconsole/java/bundle-messages-countries.sh b/apps/routerconsole/java/bundle-messages-countries.sh
index d851802f1553f6f22f0c9a54f95828043a3faa46..ca9067012868f1dc5d89ce37706d03ad388bda89 100755
--- a/apps/routerconsole/java/bundle-messages-countries.sh
+++ b/apps/routerconsole/java/bundle-messages-countries.sh
@@ -10,6 +10,7 @@
 #
 # zzz - public domain
 #
+cd `dirname $0`
 CLASS=net.i2p.router.countries.messages
 TMPFILE=build/javafiles-countries.txt
 export TZ=UTC
diff --git a/apps/routerconsole/java/bundle-messages-news.sh b/apps/routerconsole/java/bundle-messages-news.sh
index bf502dd23fee6d8bcc027429c16cd89862f2d9df..b43641b024e28fefd1802e8a1c0bdd08a4053708 100755
--- a/apps/routerconsole/java/bundle-messages-news.sh
+++ b/apps/routerconsole/java/bundle-messages-news.sh
@@ -10,6 +10,7 @@
 #
 # zzz - public domain
 #
+cd `dirname $0`
 CLASS=net.i2p.router.news.messages
 TMPFILE=build/javafiles-news.txt
 export TZ=UTC
diff --git a/apps/routerconsole/java/bundle-messages.sh b/apps/routerconsole/java/bundle-messages.sh
index 70ebd9d4c4fc5d2d56a2950e08f2d0bd0cb9b505..6f062912107c2bdcfb92ed26b31f1ea27a39bb4b 100755
--- a/apps/routerconsole/java/bundle-messages.sh
+++ b/apps/routerconsole/java/bundle-messages.sh
@@ -10,6 +10,7 @@
 #
 # zzz - public domain
 #
+cd `dirname $0`
 CLASS=net.i2p.router.web.messages
 TMPFILE=build/javafiles.txt
 export TZ=UTC
diff --git a/apps/susimail/bundle-messages.sh b/apps/susimail/bundle-messages.sh
old mode 100644
new mode 100755
diff --git a/core/build.gradle b/core/build.gradle
index 338a61ec6a935bf0003eec1349ff3e7f5a3d110f..5bf12a70ed6ba24ee6d7e765ec200d7f1f2a305d 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -10,6 +10,7 @@ sourceSets {
     main {
         java {
             srcDir 'java/src'
+            srcDir 'java/build/messages-src'
             exclude 'gnu/getopt'
             exclude 'gnu/gettext'
         }
@@ -67,6 +68,16 @@ if (System.getenv("TARGET_JAVA_HOME") == null && JavaVersion.current() != JavaVe
     test.dependsOn scalaTest
 }
 
+// Create the java files from the po files. The jar task will compile them.
+// This requires gettext 0.19 or higher.
+// We don't support the "slow way"
+task bundle {
+    doLast {
+        println "core/java/bundle-messages.sh".execute().text
+    }
+}
+jar.dependsOn bundle
+
 jar {
     manifest {
         attributes 'Specification-Title': 'I2P Core API'
diff --git a/core/java/bundle-messages.sh b/core/java/bundle-messages.sh
index 2c58e625d599d6ed06dcee60bc673613ccd9c541..167a481ca9fb6dc0bd2fd1c4afc705af68eb8ec3 100755
--- a/core/java/bundle-messages.sh
+++ b/core/java/bundle-messages.sh
@@ -10,6 +10,7 @@
 #
 # zzz - public domain
 #
+cd `dirname $0`
 CLASS=net.i2p.util.messages
 TMPFILE=build/javafiles.txt
 export TZ=UTC
diff --git a/router/build.gradle b/router/build.gradle
index 43387ce2e45d368f023d32f71125ccce1d3ce77d..223d7a64941cdd96f38bfff2b4043b4e25ed9d5a 100644
--- a/router/build.gradle
+++ b/router/build.gradle
@@ -6,6 +6,7 @@ sourceSets {
     main {
         java {
             srcDir 'java/src'
+            srcDir 'java/build/messages-src'
         }
     }
     test {
@@ -26,6 +27,16 @@ dependencies {
     testImplementation project(path: ':core', configuration: 'tests')
 }
 
+// Create the java files from the po files. The jar task will compile them.
+// This requires gettext 0.19 or higher.
+// We don't support the "slow way"
+task bundle {
+    doLast {
+        println "router/java/bundle-messages.sh".execute().text
+    }
+}
+jar.dependsOn bundle
+
 jar {
     manifest {
         attributes 'Specification-Title': 'I2P Router'
diff --git a/router/java/bundle-messages.sh b/router/java/bundle-messages.sh
index 5690e69c2b84617d7bc1c38ccee5f0c99f8b98ab..96a8c6e70c37cde4d0072e17411680795490f05c 100755
--- a/router/java/bundle-messages.sh
+++ b/router/java/bundle-messages.sh
@@ -10,6 +10,7 @@
 #
 # zzz - public domain
 #
+cd `dirname $0`
 CLASS=net.i2p.router.util.messages
 TMPFILE=build/javafiles.txt
 export TZ=UTC