diff --git a/apps/desktopgui/build.xml b/apps/desktopgui/build.xml
index e4af843935bcb0d4fa19e959462630dd54b1334e..f5de9ff4f23d969da5a5fda991c67f4a9a4ba3ec 100644
--- a/apps/desktopgui/build.xml
+++ b/apps/desktopgui/build.xml
@@ -45,10 +45,8 @@
         <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="true" >
-            <arg value="/c" />
-			<!-- no leading ./ here, windoz complains about it. -->
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
         </exec>
 		<jar basedir="${build}" destfile="${dist}/${jar}">
 			<manifest>
@@ -82,10 +80,8 @@
             <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="true" >
-            <arg value="/c" />
-			<!-- no leading ./ here, windoz complains about it. -->
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
     </target>
diff --git a/apps/desktopgui/bundle-messages.sh b/apps/desktopgui/bundle-messages.sh
index 4762e9a8bf53c9e6ef90be3eebd008329ba8e6f6..acd52a35339c2d01fac2a760296722b7641f7909 100644
--- a/apps/desktopgui/bundle-messages.sh
+++ b/apps/desktopgui/bundle-messages.sh
@@ -19,6 +19,17 @@ then
 	POUPDATE=1
 fi
 
+# on windows, one must specify the path of commnad find
+# since windows has its own retarded version of find.
+if which find|grep -q -i windows ; then
+	export PATH=.:/bin:/usr/local/bin:$PATH
+fi
+# Fast mode - update ondemond
+echo Placing a file named messages_{LangCode}.only in locale folder,
+echo will limit .po file update to the language specified by {LangCode}.
+LG2=$(find locale -iname messages_*.only|tail -1)
+[ LG2 ] && LG2=${LG2#locale/messages_} && LG2=${LG2%.only}
+
 # add ../java/ so the refs will work in the po file
 JPATHS="src"
 for i in locale/messages_*.po
@@ -26,6 +37,11 @@ do
 	# get language
 	LG=${i#locale/messages_}
 	LG=${LG%.po}
+	
+	# skip, if specified
+	if [ $LG2 ]; then
+		[ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only.
+	fi
 
 	if [ "$POUPDATE" = "1" ]
 	then
@@ -33,7 +49,6 @@ do
 		find $JPATHS -name *.java -newer $i > $TMPFILE
 	fi
 
-    echo $LG
 	if [ -s build/net/i2p/desktopgui/messages_$LG.class -a \
 	     build/net/i2p/desktopgui/messages_$LG.class -nt $i -a \
 	     ! -s $TMPFILE ]
diff --git a/apps/i2psnark/java/bmsg.sh b/apps/i2psnark/java/bmsg.sh
deleted file mode 100644
index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000
--- a/apps/i2psnark/java/bmsg.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Update messages_xx.po and messages_xx.class files,
-# from both java and jsp sources.
-# Requires installed programs xgettext, msgfmt, msgmerge, and find.
-# zzz - public domain
-#
-
-## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\
-## need to cd into our orignal path - where we call sh.exe from.
-
-cd $CALLFROM
-## echo $PWD
-
-## except this everything is the same with bundle-message.sh
-## walking - public domain :-D
-
-source bundle-messages.sh $PARAS
\ No newline at end of file
diff --git a/apps/i2psnark/java/build.xml b/apps/i2psnark/java/build.xml
index 90f5cd6fe8f3c5c8b6ec2649f17016d1f7abad9b..2fbc2f507be10fc90ed4d5c20bc87201dd7e557a 100644
--- a/apps/i2psnark/java/build.xml
+++ b/apps/i2psnark/java/build.xml
@@ -59,15 +59,14 @@
     <target name="bundle" depends="compile">
         <!-- Update the messages_*.po files.
              We need to supply the bat file for windows, and then change the fail property to true -->
-        <exec executable="sh" osfamily="unix" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="sh" osfamily="mac" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="false" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
         </exec>
     </target>
 
@@ -81,9 +80,8 @@
             <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="true" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
     </target>
diff --git a/apps/i2psnark/java/bundle-messages.bat b/apps/i2psnark/java/bundle-messages.bat
deleted file mode 100644
index cb72cc5d1df763105159fa62ae3930796fef2fed..0000000000000000000000000000000000000000
--- a/apps/i2psnark/java/bundle-messages.bat
+++ /dev/null
@@ -1,28 +0,0 @@
-@echo off
-set Callfrom=%cd%
-set Paras=%1
-
-rem before calling make sure you have msys and mingw 's "bin" path 
-rem in your current searching path
-rem type "set path" to check 
-if not exist ..\locale\*.only goto updateALL
-
-rem put a messages_xx.only(eg messages_zh.only) into locale folder
-rem this script will only touch the po file(eg zh) you specified, leaving other po files untact.
-echo [tip] Puting a messages_{LangCode}.only (eg messages_zh.only) 
-echo   into locale folder will restrict the PO file update
-echo   process to your choosen language ONLY.
-for %%i in (..\locale\*.only) do set PO=%%~ni
-echo [info] %PO%.only found, will ONLY update file : %PO%.po
-for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po-
-
-call sh --login %cd%\bmsg.sh
-
-for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po
-goto end
-
-:updateALL
-call sh --login %cd%\bmsg.sh
-
-:end
-echo End of Message Bundling
\ No newline at end of file
diff --git a/apps/i2psnark/java/bundle-messages.sh b/apps/i2psnark/java/bundle-messages.sh
index c09aa811f94817e645cbc5b37c37870b058c2d31..d5d116ac31a103cfd1747a27f8890fbf7c10fb3b 100755
--- a/apps/i2psnark/java/bundle-messages.sh
+++ b/apps/i2psnark/java/bundle-messages.sh
@@ -18,6 +18,17 @@ then
 	POUPDATE=1
 fi
 
+# on windows, one must specify the path of commnad find
+# since windows has its own retarded version of find.
+if which find|grep -q -i windows ; then
+	export PATH=.:/bin:/usr/local/bin:$PATH
+fi
+# Fast mode - update ondemond
+echo Placing a file named messages_{LangCode}.only in locale folder,
+echo will limit .po file update to the language specified by {LangCode}.
+LG2=$(find ../locale -iname messages_*.only|tail -1)
+[ LG2 ] && LG2=${LG2#../locale/messages_} && LG2=${LG2%.only}
+
 # add ../java/ so the refs will work in the po file
 JPATHS="../java/src"
 for i in ../locale/messages_*.po
@@ -26,6 +37,11 @@ do
 	LG=${i#../locale/messages_}
 	LG=${LG%.po}
 
+	# skip, if specified
+	if [ $LG2 ]; then
+		[ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only.
+	fi
+
 	if [ "$POUPDATE" = "1" ]
 	then
 		# make list of java files newer than the .po file
diff --git a/apps/i2ptunnel/java/bmsg.sh b/apps/i2ptunnel/java/bmsg.sh
deleted file mode 100644
index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000
--- a/apps/i2ptunnel/java/bmsg.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Update messages_xx.po and messages_xx.class files,
-# from both java and jsp sources.
-# Requires installed programs xgettext, msgfmt, msgmerge, and find.
-# zzz - public domain
-#
-
-## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\
-## need to cd into our orignal path - where we call sh.exe from.
-
-cd $CALLFROM
-## echo $PWD
-
-## except this everything is the same with bundle-message.sh
-## walking - public domain :-D
-
-source bundle-messages.sh $PARAS
\ No newline at end of file
diff --git a/apps/i2ptunnel/java/build.xml b/apps/i2ptunnel/java/build.xml
index 163de669681a344c06a3aba1331fde1c760ac86e..6ff5111002589af771bb522ba2da7706ea7fc274 100644
--- a/apps/i2ptunnel/java/build.xml
+++ b/apps/i2ptunnel/java/build.xml
@@ -48,15 +48,14 @@
     <target name="bundle" depends="compile, precompilejsp">
         <!-- Update the messages_*.po files.
              We need to supply the bat file for windows, and then change the fail property to true -->
-        <exec executable="sh" osfamily="unix" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="sh" osfamily="mac" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="false" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
         </exec>
     </target>
 
@@ -70,9 +69,8 @@
             <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="true" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
     </target>
diff --git a/apps/i2ptunnel/java/bundle-messages.bat b/apps/i2ptunnel/java/bundle-messages.bat
deleted file mode 100644
index 20b42773ba007fa290d2074d408fa70d4d34acfb..0000000000000000000000000000000000000000
--- a/apps/i2ptunnel/java/bundle-messages.bat
+++ /dev/null
@@ -1,28 +0,0 @@
-@echo off
-set Callfrom=%cd%
-set Paras=%1
-
-rem before calling make sure you have msys and mingw 's "bin" path 
-rem in your current searching path
-rem type "set path" to check 
-if not exist ..\locale\*.only goto updateALL
-
-rem put a messages_xx.only(eg messages_zh.only) into locale folder
-rem this script will only touch the po file(eg zh) you specified, leaving other po files untact.
-echo [tip] Puting a messages_{LangCode}.only (eg messages_zh.only) 
-echo   into locale folder will restrict the PO file update
-echo   process to your choosen language ONLY.
-for %%i in (..\locale\*.only) do set PO=%%~ni
-echo [info] %PO%.po found, will ONLY update file : %PO%.po
-for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po-
-
-call sh --login %cd%\bmsg.sh
-
-for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po
-goto end
-
-:updateALL
-call sh --login %cd%\bmsg.sh
-
-:end
-echo End of Message Bundling
\ No newline at end of file
diff --git a/apps/i2ptunnel/java/bundle-messages.sh b/apps/i2ptunnel/java/bundle-messages.sh
index 236b0ad0114d1ca9cfcf7903e4f31ed08e8dd4b7..6b3f09dbd6c286cd95b4d6bdca639c0a03f67fd8 100755
--- a/apps/i2ptunnel/java/bundle-messages.sh
+++ b/apps/i2ptunnel/java/bundle-messages.sh
@@ -18,6 +18,17 @@ then
 	POUPDATE=1
 fi
 
+# on windows, one must specify the path of commnad find
+# since windows has its own retarded version of find.
+if which find|grep -q -i windows ; then
+	export PATH=.:/bin:/usr/local/bin:$PATH
+fi
+# Fast mode - update ondemond
+echo Placing a file named messages_{LangCode}.only in locale folder,
+echo will limit .po file update to the language specified by {LangCode}.
+LG2=$(find ../locale -iname messages_*.only|tail -1)
+[ LG2 ] && LG2=${LG2#../locale/messages_} && LG2=${LG2%.only}
+
 # add ../java/ so the refs will work in the po file
 JPATHS="../java/src ../jsp/WEB-INF"
 for i in ../locale/messages_*.po
@@ -26,6 +37,11 @@ do
 	LG=${i#../locale/messages_}
 	LG=${LG%.po}
 
+	# skip, if specified
+	if [ $LG2 ]; then
+		[ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only.
+	fi
+
 	if [ "$POUPDATE" = "1" ]
 	then
 		# make list of java files newer than the .po file
diff --git a/apps/routerconsole/java/bmsg.sh b/apps/routerconsole/java/bmsg.sh
deleted file mode 100644
index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000
--- a/apps/routerconsole/java/bmsg.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Update messages_xx.po and messages_xx.class files,
-# from both java and jsp sources.
-# Requires installed programs xgettext, msgfmt, msgmerge, and find.
-# zzz - public domain
-#
-
-## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\
-## need to cd into our orignal path - where we call sh.exe from.
-
-cd $CALLFROM
-## echo $PWD
-
-## except this everything is the same with bundle-message.sh
-## walking - public domain :-D
-
-source bundle-messages.sh $PARAS
\ No newline at end of file
diff --git a/apps/routerconsole/java/build.xml b/apps/routerconsole/java/build.xml
index fdb976fbec30332479d829c8bd75e55a7a459b6b..4135215867140bb7ac4f0fb1a6fc746693e163ec 100644
--- a/apps/routerconsole/java/build.xml
+++ b/apps/routerconsole/java/build.xml
@@ -80,13 +80,13 @@
 
         <!-- Update the messages_*.po files.
              We need to supply the bat file for windows, and then change the fail property to true -->
-        <exec executable="sh" osfamily="unix" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="sh" osfamily="mac" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="sh" osfamily="windows" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
         <!-- jar again to get the latest messages_*.class files -->
diff --git a/apps/routerconsole/java/bundle-messages.bat b/apps/routerconsole/java/bundle-messages.bat
deleted file mode 100644
index cb72cc5d1df763105159fa62ae3930796fef2fed..0000000000000000000000000000000000000000
--- a/apps/routerconsole/java/bundle-messages.bat
+++ /dev/null
@@ -1,28 +0,0 @@
-@echo off
-set Callfrom=%cd%
-set Paras=%1
-
-rem before calling make sure you have msys and mingw 's "bin" path 
-rem in your current searching path
-rem type "set path" to check 
-if not exist ..\locale\*.only goto updateALL
-
-rem put a messages_xx.only(eg messages_zh.only) into locale folder
-rem this script will only touch the po file(eg zh) you specified, leaving other po files untact.
-echo [tip] Puting a messages_{LangCode}.only (eg messages_zh.only) 
-echo   into locale folder will restrict the PO file update
-echo   process to your choosen language ONLY.
-for %%i in (..\locale\*.only) do set PO=%%~ni
-echo [info] %PO%.only found, will ONLY update file : %PO%.po
-for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po-
-
-call sh --login %cd%\bmsg.sh
-
-for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po
-goto end
-
-:updateALL
-call sh --login %cd%\bmsg.sh
-
-:end
-echo End of Message Bundling
\ No newline at end of file
diff --git a/apps/susidns/src/bmsg.sh b/apps/susidns/src/bmsg.sh
deleted file mode 100644
index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000
--- a/apps/susidns/src/bmsg.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Update messages_xx.po and messages_xx.class files,
-# from both java and jsp sources.
-# Requires installed programs xgettext, msgfmt, msgmerge, and find.
-# zzz - public domain
-#
-
-## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\
-## need to cd into our orignal path - where we call sh.exe from.
-
-cd $CALLFROM
-## echo $PWD
-
-## except this everything is the same with bundle-message.sh
-## walking - public domain :-D
-
-source bundle-messages.sh $PARAS
\ No newline at end of file
diff --git a/apps/susidns/src/build.xml b/apps/susidns/src/build.xml
index 8244d37cfb7dc2d1ebad4a1e3390ec64cb7e6bf1..ad20ad49a3059bb8b4fb7da03ca129bf63f19efc 100644
--- a/apps/susidns/src/build.xml
+++ b/apps/susidns/src/build.xml
@@ -80,15 +80,14 @@
     <target name="bundle" depends="compile, precompilejsp">
         <!-- Update the messages_*.po files.
              We need to supply the bat file for windows, and then change the fail property to true -->
-        <exec executable="sh" osfamily="unix" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="unix" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="sh" osfamily="mac" failifexecutionfails="false" >
+        <exec executable="sh" osfamily="mac" failifexecutionfails="true" >
             <arg value="./bundle-messages.sh" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="false" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
         </exec>
     </target>
 
@@ -102,9 +101,8 @@
             <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
-        <exec executable="cmd" osfamily="windows" failifexecutionfails="true" >
-            <arg value="/c" />
-            <arg value="bundle-messages.bat" />
+        <exec executable="sh" osfamily="windows" failifexecutionfails="true" >
+            <arg value="./bundle-messages.sh" />
             <arg value="-p" />
         </exec>
     </target>
diff --git a/apps/susidns/src/bundle-messages.bat b/apps/susidns/src/bundle-messages.bat
deleted file mode 100644
index cb72cc5d1df763105159fa62ae3930796fef2fed..0000000000000000000000000000000000000000
--- a/apps/susidns/src/bundle-messages.bat
+++ /dev/null
@@ -1,28 +0,0 @@
-@echo off
-set Callfrom=%cd%
-set Paras=%1
-
-rem before calling make sure you have msys and mingw 's "bin" path 
-rem in your current searching path
-rem type "set path" to check 
-if not exist ..\locale\*.only goto updateALL
-
-rem put a messages_xx.only(eg messages_zh.only) into locale folder
-rem this script will only touch the po file(eg zh) you specified, leaving other po files untact.
-echo [tip] Puting a messages_{LangCode}.only (eg messages_zh.only) 
-echo   into locale folder will restrict the PO file update
-echo   process to your choosen language ONLY.
-for %%i in (..\locale\*.only) do set PO=%%~ni
-echo [info] %PO%.only found, will ONLY update file : %PO%.po
-for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po-
-
-call sh --login %cd%\bmsg.sh
-
-for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po
-goto end
-
-:updateALL
-call sh --login %cd%\bmsg.sh
-
-:end
-echo End of Message Bundling
\ No newline at end of file
diff --git a/apps/susidns/src/bundle-messages.sh b/apps/susidns/src/bundle-messages.sh
index b1cd377b3ff9511229b49b14cd43370047f48973..3d0aa9d37911832282b136c77d548430eaac8964 100755
--- a/apps/susidns/src/bundle-messages.sh
+++ b/apps/susidns/src/bundle-messages.sh
@@ -18,6 +18,17 @@ then
 	POUPDATE=1
 fi
 
+# on windows, one must specify the path of commnad find
+# since windows has its own retarded version of find.
+if which find|grep -q -i windows ; then
+	export PATH=.:/bin:/usr/local/bin:$PATH
+fi
+# Fast mode - update ondemond
+echo Placing a file named messages_{LangCode}.only in locale folder,
+echo will limit .po file update to the language specified by {LangCode}.
+LG2=$(find ../locale -iname messages_*.only|tail -1)
+[ LG2 ] && LG2=${LG2#../locale/messages_} && LG2=${LG2%.only}
+
 # add ../src/ so the refs will work in the po file
 JPATHS="../src/java/ ../src/tmp/"
 for i in ../locale/messages_*.po
@@ -26,6 +37,11 @@ do
 	LG=${i#../locale/messages_}
 	LG=${LG%.po}
 
+	# skip, if specified
+	if [ $LG2 ]; then
+		[ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only.
+	fi
+
 	if [ "$POUPDATE" = "1" ]
 	then
 		# make list of java files newer than the .po file