diff --git a/build.xml b/build.xml
index c59305d2f2d01311e3eaf5f5333a6da458caf6f4..24429ec04d85f64a84db0176c981b01b69d491c9 100644
--- a/build.xml
+++ b/build.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project basedir="." default="all" name="i2p">
-    
+   
     <target name="all" >
         <echo message="Useful targets: " />
         <echo message="  dist:      distclean then package everything up (installer, clean tarball, update tarball)" />
@@ -28,6 +28,7 @@
         <ant dir="apps/routerconsole/java/" target="jar" />
         <ant dir="apps/addressbook/" target="war" />
         <ant dir="apps/susimail/" target="war" />
+        <ant dir="apps/syndie/java/" target="jar" /> <!-- not pushed in the update... yet -->
     </target>
     <target name="buildWEB">
         <ant dir="apps/jetty" target="fetchJettylib" />
@@ -58,6 +59,8 @@
         <copy file="installer/lib/jbigi/jbigi.jar" todir="build" />
         <copy file="apps/addressbook/dist/addressbook.war" todir="build/" />
         <copy file="apps/susimail/susimail.war" todir="build/" />
+        <copy file="apps/syndie/java/build/syndie.jar" todir="build/" />
+        <copy file="apps/syndie/syndie.war" todir="build/" />
     </target>
     <target name="javadoc">
         <mkdir dir="./build" />
diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java
index eadcefde588e102d5b549f8dbea265571e8761a4..e8fea5eee38c26b8d26b5639f62eb83af7a86be1 100644
--- a/core/java/src/net/i2p/CoreVersion.java
+++ b/core/java/src/net/i2p/CoreVersion.java
@@ -14,8 +14,8 @@ package net.i2p;
  *
  */
 public class CoreVersion {
-    public final static String ID = "$Revision: 1.37 $ $Date: 2005/08/03 13:58:12 $";
-    public final static String VERSION = "0.6.0.2";
+    public final static String ID = "$Revision: 1.38 $ $Date: 2005/08/08 15:35:50 $";
+    public final static String VERSION = "0.6.0.3";
 
     public static void main(String args[]) {
         System.out.println("I2P Core version: " + VERSION);
diff --git a/history.txt b/history.txt
index 16bbfab2a8d56721743e8432b7cb01fe6140e05d..8dc717584be9faf2f0f4b0ccebf4df0a30ae9722 100644
--- a/history.txt
+++ b/history.txt
@@ -1,4 +1,10 @@
-$Id: history.txt,v 1.226 2005/08/12 18:54:47 jrandom Exp $
+$Id: history.txt,v 1.227 2005/08/17 15:05:03 jrandom Exp $
+
+* 2005-08-21  0.6.0.3 released
+
+2005-08-21  jrandom
+    * If we already have an established SSU session with the Charlie helping 
+      test us, cancel the test with the status of "unknown".
 
 2005-08-17  jrandom
     * Revise the SSU peer testing protocol so that Bob verifies Charlie's 
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 6e514e95d0ebc9724ab7e1cb5ba80f51185a5de6..babaaa0a23b2c8d0e825c040ce75e6e0ba8107d6 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
  *
  */
 public class RouterVersion {
-    public final static String ID = "$Revision: 1.215 $ $Date: 2005/08/12 18:54:47 $";
-    public final static String VERSION = "0.6.0.2";
-    public final static long BUILD = 3;
+    public final static String ID = "$Revision: 1.216 $ $Date: 2005/08/17 15:05:03 $";
+    public final static String VERSION = "0.6.0.3";
+    public final static long BUILD = 0;
     public static void main(String args[]) {
         System.out.println("I2P Router version: " + VERSION);
         System.out.println("Router ID: " + RouterVersion.ID);
diff --git a/router/java/src/net/i2p/router/StatisticsManager.java b/router/java/src/net/i2p/router/StatisticsManager.java
index c8d4dd336aa69b1dc194b6e7ea0606f832352f8b..ccbce2b836685c6d8c9ce970b5817e58fe6839dd 100644
--- a/router/java/src/net/i2p/router/StatisticsManager.java
+++ b/router/java/src/net/i2p/router/StatisticsManager.java
@@ -127,6 +127,7 @@ public class StatisticsManager implements Service {
             includeRate("udp.statusDifferent", stats, new long[] { 20*60*1000 });
             includeRate("udp.statusReject", stats, new long[] { 20*60*1000 });
             includeRate("udp.statusUnknown", stats, new long[] { 20*60*1000 });
+            includeRate("udp.statusKnownharlie", stats, new long[] { 1*60*1000, 10*60*1000 });
             includeRate("udp.addressUpdated", stats, new long[] { 1*60*1000 });
             includeRate("udp.addressTestInsteadOfUpdate", stats, new long[] { 1*60*1000 });
 
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
index 14d46825768079100ddd353b926fcfd8a9734760..b57c36bc47d98ea3ccd10c874024939b7f067f03 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
@@ -43,6 +43,7 @@ class PeerTestManager {
         _recentTests = Collections.synchronizedList(new ArrayList(16));
         _packetBuilder = new PacketBuilder(context);
         _currentTest = null;
+        _context.statManager().createRateStat("udp.statusKnownCharlie", "How often the bob we pick passes us to a charlie we already have a session with?", "udp", new long[] { 60*1000, 20*60*1000, 60*60*1000 });
     }
     
     private static final int RESEND_TIMEOUT = 5*1000;
@@ -149,6 +150,17 @@ class PeerTestManager {
                     _log.error("Unable to get our IP from bob's reply: " + from + ", " + testInfo, uhe);
             }
         } else {
+            PeerState charlieSession = _transport.getPeerState(from);
+            if (charlieSession != null) {
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn("Bob chose a charlie we already have a session to, cancelling the test and rerunning (bob: " 
+                              + _currentTest + ", charlie: " + from + ")");
+                _currentTest = null;
+                _context.statManager().addRateData("udp.statusKnownCharlie", 1, 0);
+                honorStatus(CommSystemFacade.STATUS_UNKNOWN);
+                return;
+            }
+            
             if (test.getReceiveCharlieTime() > 0) {
                 // this is our second charlie, yay!
                 test.setAlicePortFromCharlie(testInfo.readPort());