diff --git a/net/freehaven/tor/control/Bytes.java b/net/freehaven/tor/control/Bytes.java
index 6166e449bc211d1c97b4933002b0fa0d6fd73573..f093535b0d3c52e1c522349aef806b4c4e04dfe4 100644
--- a/net/freehaven/tor/control/Bytes.java
+++ b/net/freehaven/tor/control/Bytes.java
@@ -111,3 +111,4 @@ final class Bytes {
 
     private Bytes() {};
 }
+
diff --git a/net/freehaven/tor/control/PasswordDigest.java b/net/freehaven/tor/control/PasswordDigest.java
index f632e9d40001f9318c4fe46da9a98bd5a74cc338..6707b1814bd78b3e364ffa4f08b4806278a6238d 100644
--- a/net/freehaven/tor/control/PasswordDigest.java
+++ b/net/freehaven/tor/control/PasswordDigest.java
@@ -56,7 +56,6 @@ public class PasswordDigest {
         return hashedKey;
     }
 
-
     /** Parameter used by RFC2440's s2k algorithm. */
     private static final int EXPBIAS = 6;
 
@@ -100,4 +99,5 @@ public class PasswordDigest {
         return Bytes.hex(ba);
     }
 
-}
\ No newline at end of file
+}
+
diff --git a/net/freehaven/tor/control/TorControlCommands.java b/net/freehaven/tor/control/TorControlCommands.java
index fae6bd64d073fbb9c3ba4a876ee911101de95b8c..c6f4737c80d8a4f959daf3b2c323612573c368a8 100644
--- a/net/freehaven/tor/control/TorControlCommands.java
+++ b/net/freehaven/tor/control/TorControlCommands.java
@@ -130,4 +130,5 @@ public interface TorControlCommands {
         "No such OR",
     };
 
-}
\ No newline at end of file
+}
+
diff --git a/net/freehaven/tor/control/TorControlConnection.java b/net/freehaven/tor/control/TorControlConnection.java
index daf9d8f16e25a79bf74d74371d9cbe9f166d46df..8eb8bac366bd6dc2b5deee14ba4c0cfe3d173961 100644
--- a/net/freehaven/tor/control/TorControlConnection.java
+++ b/net/freehaven/tor/control/TorControlConnection.java
@@ -37,6 +37,41 @@ public abstract class TorControlConnection// implements TorControlCommands {
         }
     }
 
+    protected static int detectVersion(java.io.InputStream input,
+                                       java.io.OutputStream output)
+        throws IOException
+    {
+        java.io.DataInputStream dInput = new java.io.DataInputStream(input);
+        byte out[] = { 0, 0, 13, 10 };
+        output.write(out);
+
+        int len = dInput.readUnsignedShort();
+        int tp = dInput.readUnsignedShort();
+        if (tp == 0) {
+            byte err[] = new byte[len];
+            dInput.readFully(err);
+            return 0;
+        } else if ((len & 0xff00) != 0x0a00 &&
+                   (len & 0x00ff) != 0x000a &&
+                   (tp  & 0xff00) != 0x0a00 &&
+                   (tp  & 0x00ff) != 0x000a) {
+            while (input.read() != '\n')
+                ;
+        }
+        return 1;
+    }
+
+    public static TorControlConnection getConnection(java.net.Socket sock)
+        throws IOException
+    {
+        int version = detectVersion(sock.getInputStream(),
+                                    sock.getOutputStream());
+        if (version == 0)
+            return new TorControlConnection0(sock);
+        else
+            return new TorControlConnection1(sock);
+    }
+
     protected TorControlConnection() {
         this.waiters = new LinkedList();
     }
@@ -71,7 +106,6 @@ public abstract class TorControlConnection// implements TorControlCommands {
 
     protected abstract void react() throws IOException;
 
-
     /** Change the value of the configuration option 'key' to 'val'.
      */
     public void setConf(String key, String value) throws IOException {
@@ -180,3 +214,4 @@ public abstract class TorControlConnection// implements TorControlCommands {
     public abstract void closeCircuit(String circID, boolean ifUnused) throws IOException;
 
 }
+
diff --git a/net/freehaven/tor/control/TorControlConnection0.java b/net/freehaven/tor/control/TorControlConnection0.java
index d3171b260953ec3a9ecab21707051395987caccb..bc752ce256a06953189eec46dcae743c38342600 100644
--- a/net/freehaven/tor/control/TorControlConnection0.java
+++ b/net/freehaven/tor/control/TorControlConnection0.java
@@ -166,7 +166,6 @@ public class TorControlConnection0 extends TorControlConnection
         return sendAndWaitForResponse(type, cmd, CMD_DONE, CMD_DONE, CMD_DONE, CMD_DONE);
     }
 
-
     protected Cmd sendAndWaitForResponse(short type, byte[] cmd, short exType1)
         throws IOException {
         return sendAndWaitForResponse(type, cmd, exType1, exType1, exType1,
@@ -180,7 +179,6 @@ public class TorControlConnection0 extends TorControlConnection
                                       exType2);
     }
 
-
     protected Cmd sendAndWaitForResponse(short type, byte[] cmd,
                                    short exType1, short exType2, short exType3)
         throws IOException {
@@ -250,7 +248,6 @@ public class TorControlConnection0 extends TorControlConnection
         sendAndWaitForResponse(CMD_SETCONF, b.toString().getBytes());
     }
 
-
     public Map getConf(Collection keys) throws IOException {
         StringBuffer s = new StringBuffer();
         for (Iterator it = keys.iterator(); it.hasNext(); ) {
@@ -360,7 +357,7 @@ public class TorControlConnection0 extends TorControlConnection
         return Integer.toString(Bytes.getU32(c.body, 0));
     }
 
-    public void attachStream(String streamID, String circID) 
+    public void attachStream(String streamID, String circID)
         throws IOException {
         byte[] ba = new byte[8];
         Bytes.setU32(ba, 0, (int)Long.parseLong(streamID));
@@ -406,3 +403,4 @@ public class TorControlConnection0 extends TorControlConnection
     }
 
 }
+
diff --git a/net/freehaven/tor/control/TorControlConnection1.java b/net/freehaven/tor/control/TorControlConnection1.java
index ed72bdb05872474e751867f2a98ab40b9e7b4c8c..ac3a96c5868ea587c7480aa3775d4ddb0a82917f 100644
--- a/net/freehaven/tor/control/TorControlConnection1.java
+++ b/net/freehaven/tor/control/TorControlConnection1.java
@@ -120,7 +120,6 @@ public class TorControlConnection1 extends TorControlConnection
         return reply;
     }
 
-
     /** helper: implement the main background loop. */
     protected void react() throws IOException {
         while (true) {
@@ -142,6 +141,7 @@ public class TorControlConnection1 extends TorControlConnection
         Waiter w = new Waiter();
         synchronized (waiters) {
             output.write(s);
+            output.flush();
             if (rest != null)
                 writeEscaped(rest);
             waiters.addLast(w);
@@ -227,7 +227,7 @@ public class TorControlConnection1 extends TorControlConnection
         ArrayList lst = sendAndWaitForResponse(sb.toString(), null);
         Map result = new HashMap();
         for (Iterator it = lst.iterator(); it.hasNext(); ) {
-            String kv = (String) it.next();
+            String kv = ((ReplyLine) it.next()).msg;
             int idx = kv.indexOf('=');
             result.put(kv.substring(0, idx),
                        kv.substring(idx+1));
@@ -344,3 +344,4 @@ public class TorControlConnection1 extends TorControlConnection
     }
 
 }
+
diff --git a/net/freehaven/tor/control/TorControlError.java b/net/freehaven/tor/control/TorControlError.java
index 1d04c80a24cec9cc481fb2446eaf763a8f5121da..5e0185a1a802901ca3e0db8433d58bb5b6907090 100644
--- a/net/freehaven/tor/control/TorControlError.java
+++ b/net/freehaven/tor/control/TorControlError.java
@@ -27,4 +27,5 @@ public class TorControlError extends RuntimeException {
             return "Unrecongized error #"+errorType;
         }
     }
-}
\ No newline at end of file
+}
+
diff --git a/net/freehaven/tor/control/TorControlSyntaxError.java b/net/freehaven/tor/control/TorControlSyntaxError.java
index 7d89ba863621223952cccca659328084b7b3b499..ffe154a72fb97df173d47ad2e6fa78972bb44682 100644
--- a/net/freehaven/tor/control/TorControlSyntaxError.java
+++ b/net/freehaven/tor/control/TorControlSyntaxError.java
@@ -5,4 +5,5 @@ package net.freehaven.tor.control;
  */
 public class TorControlSyntaxError extends RuntimeException {
     public TorControlSyntaxError(String s) { super(s); }
-}
\ No newline at end of file
+}
+
diff --git a/net/freehaven/tor/control/examples/DebuggingEventHandler.java b/net/freehaven/tor/control/examples/DebuggingEventHandler.java
index 2720eb7b27dd0b54494633ecc9af5eec75e780b1..34ff9654426c57f6ee10ef40903430fa099f3ca0 100644
--- a/net/freehaven/tor/control/examples/DebuggingEventHandler.java
+++ b/net/freehaven/tor/control/examples/DebuggingEventHandler.java
@@ -41,4 +41,5 @@ public class DebuggingEventHandler implements EventHandler {
         out.println("unrecognized event ["+type+"] "+msg.trim());
     }
 
-}
\ No newline at end of file
+}
+
diff --git a/net/freehaven/tor/control/examples/Main.java b/net/freehaven/tor/control/examples/Main.java
index f83438da71035177ff2f3b5b7c35b244b27866c0..4feabdaca5a281d051ba0790e16cffb40cc8739d 100644
--- a/net/freehaven/tor/control/examples/Main.java
+++ b/net/freehaven/tor/control/examples/Main.java
@@ -49,8 +49,8 @@ public class Main implements TorControlCommands {
     private static TorControlConnection getConnection(String[] args,
                                                       boolean daemon)
         throws IOException {
-        TorControlConnection conn =
-            new TorControlConnection(new java.net.Socket("127.0.0.1", 9100));
+        TorControlConnection conn = TorControlConnection.getConnection(
+                                    new java.net.Socket("127.0.0.1", 9100));
         Thread th = conn.launchThread(daemon);
         conn.authenticate(new byte[0]);
         return conn;
@@ -84,18 +84,20 @@ public class Main implements TorControlCommands {
         // Usage: get-config key key key
         TorControlConnection conn = getConnection(args);
         Map m = conn.getConf(Arrays.asList(args).subList(1,args.length));
-        for (int i = 1; i < args.length; ++i) {
-            System.out.println("KEY: "+args[i]);
-            System.out.println("VAL: "+m.get(args[i]));
+        for (Iterator i = m.entrySet().iterator(); i.hasNext(); ) {
+            Map.Entry e = (Map.Entry) i.next();
+            System.out.println("KEY: "+e.getKey());
+            System.out.println("VAL: "+e.getValue());
         }
     }
 
     public static void getInfo(String[] args) throws IOException {
         TorControlConnection conn = getConnection(args);
         Map m = conn.getInfo(Arrays.asList(args).subList(1,args.length));
-        for (int i = 1; i < args.length; ++i) {
-            System.out.println("KEY: "+args[i]);
-            System.out.println("VAL: "+m.get(args[i]));
+        for (Iterator i = m.entrySet().iterator(); i.hasNext(); ) {
+            Map.Entry e = (Map.Entry) i.next();
+            System.out.println("KEY: "+e.getKey());
+            System.out.println("VAL: "+e.getValue());
         }
     }
 
@@ -145,16 +147,17 @@ public class Main implements TorControlCommands {
 
         PasswordDigest pwd = PasswordDigest.generateDigest();
         java.net.Socket s = new java.net.Socket("127.0.0.1", 9100);
-        TorControlConnection conn = new TorControlConnection(s);
+        TorControlConnection conn = TorControlConnection.getConnection(s);
         conn.launchThread(true);
         conn.authenticate(new byte[0]);
 
         conn.setConf("HashedControlPassword", pwd.getHashedPassword());
 
-        conn =
-            new TorControlConnection(new java.net.Socket("127.0.0.1", 9100));
+        conn = TorControlConnection.getConnection(
+                                    new java.net.Socket("127.0.0.1", 9100));
         conn.launchThread(true);
         conn.authenticate(pwd.getSecret());
     }
 
-}
\ No newline at end of file
+}
+