diff --git a/apps/i2psnark/java/build.xml b/apps/i2psnark/java/build.xml
index 4d7fbbe942072dcb9d55b75e01c0cf3184bb7264..90f5cd6fe8f3c5c8b6ec2649f17016d1f7abad9b 100644
--- a/apps/i2psnark/java/build.xml
+++ b/apps/i2psnark/java/build.xml
@@ -3,9 +3,7 @@
     <target name="all" depends="clean, build" />
     <target name="build" depends="builddep, jar, war" />
     <target name="builddep">
-        <ant dir="../../jetty/" target="build" />
-        <ant dir="../../streaming/java/" target="build" />
-	<!-- streaming will build ministreaming and core -->
+        <!-- run from top level build.xml to get dependencies built -->
     </target>
     <condition property="depend.available">
         <typefound name="depend" />
diff --git a/apps/i2ptunnel/java/build.xml b/apps/i2ptunnel/java/build.xml
index b17e8d9f38901bc3c90ff87546b2eaa352e49bf7..f50fadd3e17a6aea43abd6aedc651ca34c7a3e4c 100644
--- a/apps/i2ptunnel/java/build.xml
+++ b/apps/i2ptunnel/java/build.xml
@@ -3,9 +3,7 @@
     <target name="all" depends="clean, build" />
     <target name="build" depends="builddep, jar, war" />
     <target name="builddep">
-        <ant dir="../../ministreaming/java/" target="build" />
-        <ant dir="../../jetty/" target="build" />
-	<!-- ministreaming will build core -->
+        <!-- run from top level build.xml to get dependencies built -->
     </target>
     <condition property="depend.available">
         <typefound name="depend" />
diff --git a/apps/ministreaming/java/build.xml b/apps/ministreaming/java/build.xml
index ca0889042cda1bd90f0e47ad3b6d5b05b95a0951..c22676d264b54b39d0768eee5c6972472be4d043 100644
--- a/apps/ministreaming/java/build.xml
+++ b/apps/ministreaming/java/build.xml
@@ -3,7 +3,7 @@
     <target name="all" depends="clean, build" />
     <target name="build" depends="builddep, jar" />
     <target name="builddep">
-        <ant dir="../../../core/java/" target="build" />
+        <!-- run from top level build.xml to get dependencies built -->
     </target>
     <condition property="depend.available">
         <typefound name="depend" />
@@ -45,9 +45,7 @@
         <delete dir="./build" />
     </target>
     <target name="cleandep" depends="clean">
-        <ant dir="../../../core/java/" target="cleandep" />
     </target>
     <target name="distclean" depends="clean">
-        <ant dir="../../../core/java/" target="distclean" />
     </target>
 </project>
diff --git a/apps/routerconsole/java/build.xml b/apps/routerconsole/java/build.xml
index 8b08c0de8640cd5d2e797522380bf3984ff65bb1..d544e59aca580f961ad5bbf2d8d24d570bba654b 100644
--- a/apps/routerconsole/java/build.xml
+++ b/apps/routerconsole/java/build.xml
@@ -3,12 +3,10 @@
     <target name="all" depends="clean, build" />
     <target name="build" depends="builddep, jar" />
     <target name="builddep">
-        <ant dir="../../../router/java/" target="build" />
-        <ant dir="../../systray/java/" target="build" />
-	<!-- router will build core -->
+        <!-- run from top level build.xml to get dependencies built -->
     </target>
     <target name="prepare">
-        <ant dir="../../jetty/" target="build" />
+        <!-- run from top level build.xml to get dependencies built -->
     </target>
     <condition property="depend.available">
         <typefound name="depend" />
@@ -235,13 +233,7 @@
         <delete file="../jsp/web-out.xml" />
     </target>
     <target name="cleandep" depends="clean">
-	<!-- router will clean core -->
-        <ant dir="../../../router/java/" target="cleandep" />
-        <ant dir="../../systray/java/" target="cleandep" />
     </target>
     <target name="distclean" depends="clean">
-	<!-- router will clean core -->
-        <ant dir="../../../router/java/" target="distclean" />
-        <ant dir="../../systray/java/" target="distclean" />
     </target>
 </project>
diff --git a/apps/sam/java/build.xml b/apps/sam/java/build.xml
index 6a987b3411587e724d4b9049ded9d6c8e96ac88b..57aeff9947071c36fc7877cc0d89c236c0ee59f2 100644
--- a/apps/sam/java/build.xml
+++ b/apps/sam/java/build.xml
@@ -3,9 +3,7 @@
     <target name="all" depends="clean, build" />
     <target name="build" depends="builddep, jar" />
     <target name="builddep">
-        <ant dir="../../ministreaming/java/" target="build" />
-        <ant dir="../../streaming/java/" target="build" />
-	<!-- ministreaming will build core -->
+        <!-- run from top level build.xml to get dependencies built -->
     </target>
     <condition property="depend.available">
         <typefound name="depend" />
@@ -69,13 +67,7 @@
         <delete dir="./build" />
     </target>
     <target name="cleandep" depends="clean">
-	<!-- ministreaming will clean core -->
-        <ant dir="../../ministreaming/java/" target="distclean" />
-        <ant dir="../../streaming/java/" target="distclean" />
     </target>
     <target name="distclean" depends="clean">
-	<!-- ministreaming will clean core -->
-        <ant dir="../../ministreaming/java/" target="distclean" />
-        <ant dir="../../streaming/java/" target="distclean" />
     </target>
 </project>
diff --git a/apps/streaming/java/build.xml b/apps/streaming/java/build.xml
index 7740a60226169b9facff377f6d00c040373004c2..dff6fbf1d55989a5774d762d0cbfd72f3c328709 100644
--- a/apps/streaming/java/build.xml
+++ b/apps/streaming/java/build.xml
@@ -3,8 +3,7 @@
     <target name="all" depends="clean, build" />
     <target name="build" depends="builddep, jar" />
     <target name="builddep">
-        <ant dir="../../ministreaming/java/" target="build" />
-	<!-- ministreaming will build core -->
+        <!-- run from top level build.xml to get dependencies built -->
     </target>
     <condition property="depend.available">
         <typefound name="depend" />
@@ -62,11 +61,7 @@
         <delete dir="./build" />
     </target>
     <target name="cleandep" depends="clean">
-	<!-- ministreaming will clean core -->
-        <ant dir="../../ministreaming/java/" target="distclean" />
     </target>
     <target name="distclean" depends="clean">
-	<!-- ministreaming will clean core -->
-        <ant dir="../../ministreaming/java/" target="distclean" />
     </target>
 </project>
diff --git a/apps/susimail/build.xml b/apps/susimail/build.xml
index fb437161447213e59f855104977da02a648f7615..9ab38ce42e60e352ced5472c0fe28b2c60c9362e 100644
--- a/apps/susimail/build.xml
+++ b/apps/susimail/build.xml
@@ -3,7 +3,7 @@
     <target name="all" depends="clean, build" />
     <target name="build" depends="builddep, jar" />
     <target name="builddep">
-        <ant dir="../jetty/" target="build" />
+        <!-- run from top level build.xml to get dependencies built -->
     </target>
     <property name="javac.compilerargs" value="" />
     <target name="compile">
diff --git a/apps/systray/java/build.xml b/apps/systray/java/build.xml
index 1597f20b359a24ec9d940c847cd2057b1fef1df3..9d48f902cbbf0bcafe163927deb50d91b93d8fbd 100644
--- a/apps/systray/java/build.xml
+++ b/apps/systray/java/build.xml
@@ -3,7 +3,7 @@
     <target name="all" depends="clean, build" />
     <target name="build" depends="builddep, jar" />
     <target name="builddep">
-        <ant dir="../../../core/java/" target="build" />
+        <!-- run from top level build.xml to get dependencies built -->
     </target>
     <property name="javac.compilerargs" value="" />
     <target name="compile">
@@ -55,10 +55,7 @@
         <delete dir="./build" />
     </target>
     <target name="cleandep" depends="clean">
-	<!-- router will clean core -->
-        <ant dir="../../../core/java/" target="cleandep" />
     </target>
     <target name="distclean" depends="clean">
-        <ant dir="../../../core/java/" target="distclean" />
     </target>
 </project>
diff --git a/build.xml b/build.xml
index de35251916ff3d0be7c238b65e12675c70dba454..f0c1c49739a42f5bb5aa5dfcce86d3d48f33acfb 100644
--- a/build.xml
+++ b/build.xml
@@ -62,33 +62,79 @@
     <target name="build2" depends="builddep, jar, buildWEB" />
     <target name="buildSmall" depends="builddepSmall, jarSmall, buildWEB" />
     <target name="buildclean" depends="distclean, build" />
-    <target name="builddep" depends="builddepSmall">
-	<!-- build *everything* here, but only once -->
+
+    <target name="builddep" depends="builddepSmall, buildBOB, buildSAM, buildSusiMail, buildSusiDNS, buildI2PSnark" />
+
+    <target name="builddepSmall" depends="buildrouter, buildSystray, buildRouterConsole, buildStreaming, buildI2PTunnel, buildAddressbook" />
+
+    <!-- start of buildX, one for each sub-build.xml.
+         Do not put ant tasks in the sub-build.xmls anymore,
+         so the build will go faster.
+      -->
+
+    <!-- TODO remove I2PTunnel dependency in BOB -->
+    <target name="buildBOB" depends="buildStreaming, buildI2PTunnel" >
         <ant dir="apps/BOB/" target="jar" />
+    </target>
+
+    <target name="buildSAM" depends="buildStreaming" >
         <ant dir="apps/sam/java/" target="jar" />
+    </target>
+
+    <target name="buildSusiMail" depends="buildCore, buildJetty" >
         <ant dir="apps/susimail/" target="war" />
+    </target>
+
+    <target name="buildSusiDNS" depends="buildCore, buildJetty" >
         <ant dir="apps/susidns/src" target="all" />
+    </target>
+
+    <target name="buildI2PSnark" depends="buildStreaming, buildJetty" >
         <ant dir="apps/i2psnark/java/" target="war" />
     </target>
-    <target name="builddepSmall">
-        <ant dir="core/java/" target="jar" />
-        <ant dir="router/java/" target="jar" />
-        <ant dir="apps/systray/java/" target="jar" />
+
+    <target name="buildAddressbook" depends="buildCore, buildJetty" >
+        <ant dir="apps/addressbook/" target="war" />
+    </target>
+
+    <target name="buildI2PTunnel" depends="buildStreaming, buildJetty" >
+        <ant dir="apps/i2ptunnel/java/" target="build" />
+    </target>
+
+    <target name="buildRouterConsole" depends="buildrouter, buildSystray, buildJetty" >
         <ant dir="apps/routerconsole/java/" target="jar" />
-        <ant dir="apps/ministreaming/java/" target="jar" />
+    </target>
+
+    <target name="buildJetty" >
+        <ant dir="apps/jetty" target="build" />
+    </target>
+
+    <target name="buildSystray" depends="buildCore" >
+        <ant dir="apps/systray/java/" target="jar" />
+    </target>
+
+    <target name="buildStreaming" depends="buildMinistreaming" >
         <ant dir="apps/streaming/java/" target="jar" />
-        <ant dir="apps/i2ptunnel/java/" target="build" />
-        <ant dir="apps/addressbook/" target="war" />
     </target>
-    <target name="buildrouter">
-        <ant dir="core/java/" target="jar" />
+
+    <target name="buildMinistreaming" depends="buildCore" >
+        <ant dir="apps/ministreaming/java/" target="jar" />
+    </target>
+
+    <target name="buildRouter" depends="buildrouter" />
+    <target name="buildrouter" depends="buildCore" >
         <ant dir="router/java/" target="jar" />
-        <copy file="core/java/build/i2p.jar" todir="build/" />
         <copy file="router/java/build/router.jar" todir="build/" />
     </target>
-    <target name="buildWEB">
-        <ant dir="apps/jetty" target="ensureJettylib" />
-        <ant dir="apps/routerconsole/java" target="build" />
+
+    <target name="buildCore" >
+        <ant dir="core/java/" target="jar" />
+        <copy file="core/java/build/i2p.jar" todir="build/" />
+    </target>
+
+    <!-- end of sub-build.xml targets -->
+
+    <target name="buildWEB" depends="buildRouterConsole" >
         <copy file="apps/routerconsole/java/build/routerconsole.jar" todir="build/" />
         <copy file="apps/routerconsole/java/build/routerconsole.war" todir="build/" />
         <copy file="apps/jetty/jettylib/org.mortbay.jetty.jar" todir="build/" />
@@ -98,6 +144,7 @@
         <copy file="apps/jetty/jettylib/commons-el.jar" todir="build/" />
         <copy file="apps/jetty/jettylib/javax.servlet.jar" todir="build/" />
     </target>
+
     <target name="buildexe">
         <condition property="noExe">
 	    <os arch="x86_64" />
diff --git a/router/java/build.xml b/router/java/build.xml
index efb0b3091a186ba9fae972b813f8e2f7a3ee6046..69f6b410946b8d74bab6cab22054a8073b49a9fa 100644
--- a/router/java/build.xml
+++ b/router/java/build.xml
@@ -3,7 +3,7 @@
     <target name="all" depends="clean, build" />
     <target name="build" depends="builddep, jar" />
     <target name="builddep">
-        <ant dir="../../core/java/" target="build" />
+        <!-- run from top level build.xml to get dependencies built -->
     </target>
     <target name="builddeptest">
         <ant dir="../../core/java/" target="jarTest" />
@@ -131,9 +131,7 @@
         <delete dir="./build" />
     </target>
     <target name="cleandep" depends="clean">
-        <ant dir="../../core/java/" target="cleandep" />
     </target>
     <target name="distclean" depends="clean">
-        <ant dir="../../core/java/" target="distclean" />
     </target>
 </project>