diff --git a/apps/BOB/src/net/i2p/BOB/doCMDS.java b/apps/BOB/src/net/i2p/BOB/doCMDS.java
index 9e4cdce88a64265b4dd9ad667373a3db1b4237e9..ea0b681a8bdf892ccdfaeb3951377caf3609c9a9 100644
--- a/apps/BOB/src/net/i2p/BOB/doCMDS.java
+++ b/apps/BOB/src/net/i2p/BOB/doCMDS.java
@@ -46,7 +46,7 @@ public class doCMDS implements Runnable {
 
 	// FIX ME
 	// I need a better way to do versioning, but this will do for now.
-	public static final String BMAJ = "00",  BMIN = "00",  BREV = "01",  BEXT = "-6";
+	public static final String BMAJ = "00",  BMIN = "00",  BREV = "01",  BEXT = "-8pre";
 	public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT;
 	private Socket server;
 	private Properties props;
@@ -58,6 +58,7 @@ public class doCMDS implements Runnable {
 	private nickname nickinfo;
 	private Log _log;
 	/* database strings */
+	private static final String P_DEST = "DESTINATION";
 	private static final String P_INHOST = "INHOST";
 	private static final String P_INPORT = "INPORT";
 	private static final String P_KEYS = "KEYS";
@@ -72,12 +73,14 @@ public class doCMDS implements Runnable {
 	/* command strings */
 	private static final String C_help = "help";
 	private static final String C_clear = "clear";
+	private static final String C_getdest = "getdest";
 	private static final String C_getkeys = "getkeys";
 	private static final String C_getnick = "getnick";
 	private static final String C_inhost = "inhost";
 	private static final String C_inport = "inport";
 	private static final String C_list = "list";
 	private static final String C_newkeys = "newkeys";
+	private static final String C_option = "option";
 	private static final String C_outhost = "outhost";
 	private static final String C_outport = "outport";
 	private static final String C_quiet = "quiet";
@@ -93,15 +96,17 @@ public class doCMDS implements Runnable {
 	private static final String C_ALL[][] = {
 		{C_help, C_help + " <command> * Get help on a command."},
 		{C_clear, C_clear + " * Clear the current nickname out of the list."},
+		{C_getdest, C_getdest + " * Return the destination for the current nickname."},
 		{C_getkeys, C_getkeys + " * Return the keypair for the current nickname."},
 		{C_getnick, C_getnick + " tunnelname * Set the nickname from the database."},
 		{C_inhost, C_inhost + " hostname | IP * Set the inbound hostname or IP."},
 		{C_inport, C_inport + " port_number * Set the inbound port number nickname listens on."},
 		{C_list, C_list + " * List all tunnels."},
 		{C_newkeys, C_newkeys + " * Generate a new keypair for the current nickname."},
+		{C_option, C_option + " I2CPoption=something * Set an I2CP option. NOTE: Don't use any spaces."},
 		{C_outhost, C_outhost + " hostname | IP * Set the outbound hostname or IP."},
 		{C_outport, C_outport + " port_number * Set the outbound port that nickname contacts."},
-		{C_quiet, C_quiet + " *"},
+		{C_quiet, C_quiet + " True | False * Don't send to the application the incoming destination."},
 		{C_quit, C_quit + " * Quits this session with BOB."},
 		{C_setkeys, C_setkeys + " BASE64_keypair * Sets the keypair for the current nickname."},
 		{C_setnick, C_setnick + " nickname * Create a new nickname."},
@@ -112,12 +117,14 @@ public class doCMDS implements Runnable {
 		{"", "COMMANDS: " + // this is ugly, but...
 			C_help + " " +
 			C_clear + " " +
+			C_getdest + " " +
 			C_getkeys + " " +
 			C_getnick + " " +
 			C_inhost + " " +
 			C_inport + " " +
 			C_list + " " +
 			C_newkeys + " " +
+			C_option + " " +
 			C_outhost + " " +
 			C_outport + " " +
 			C_quiet + " " +
@@ -133,7 +140,7 @@ public class doCMDS implements Runnable {
 	};
 
 	/**
-	 * 
+	 *
 	 * @param server
 	 * @param props
 	 * @param database
@@ -146,9 +153,9 @@ public class doCMDS implements Runnable {
 		this._log = _log;
 	}
 
-	/** 
+	/**
 	 * Try to print info from the database
-	 * 
+	 *
 	 * @param out
 	 * @param info
 	 * @param key
@@ -164,7 +171,7 @@ public class doCMDS implements Runnable {
 
 	/**
 	 * Print true or false if an object exists
-	 * 
+	 *
 	 * @param out
 	 * @param info
 	 * @param key
@@ -176,7 +183,7 @@ public class doCMDS implements Runnable {
 
 	/**
 	 * Print an error message
-	 * 
+	 *
 	 * @param out
 	 */
 	public void nns(PrintStream out) {
@@ -185,7 +192,7 @@ public class doCMDS implements Runnable {
 
 	/**
 	 * Dump various information from the database
-	 * 
+	 *
 	 * @param out
 	 * @param info
 	 */
@@ -219,7 +226,7 @@ public class doCMDS implements Runnable {
 
 	/**
 	 * Is this nickname's tunnel active?
-	 * 
+	 *
 	 * @param Arg
 	 * @return true if the tunnel is active
 	 */
@@ -232,7 +239,7 @@ public class doCMDS implements Runnable {
 
 	/**
 	 * Does the base64 information look OK
-	 * 
+	 *
 	 * @param data
 	 * @return
 	 */
@@ -247,7 +254,7 @@ public class doCMDS implements Runnable {
 	/**
 	 * The actual parser.
 	 * It probabbly needs a rewrite into functions, but I kind-of like inline code.
-	 * 
+	 *
 	 */
 	public void run() {
 		dk = ns = ip = op = false;
@@ -283,7 +290,16 @@ public class doCMDS implements Runnable {
 								out.println("OK " + C_ALL[i][1]);
 							}
 						}
-
+					} else if(Command.equals(C_getdest)) {
+						if(ns) {
+							if(dk) {
+								out.println("OK " + nickinfo.get(P_DEST));
+							} else {
+								out.println("ERROR keys not set.");
+							}
+						} else {
+							nns(out);
+						}
 					} else if(Command.equals(C_list)) {
 						// Produce a formatted list of all nicknames
 						for(int i = 0; i < database.getcount(); i++) {
@@ -311,8 +327,9 @@ public class doCMDS implements Runnable {
 									d = I2PClientFactory.createClient().createDestination(prikey);
 									dk = true;
 									nickinfo.add(P_KEYS, prikey.toByteArray());
+									nickinfo.add(P_DEST, d.toBase64());
 									// System.out.println(prikey.toByteArray().length);
-									out.println("OK " + d.toBase64());
+									out.println("OK " + nickinfo.get(P_DEST));
 								} catch(IOException ioe) {
 									BOB.error("Error generating keys" + ioe);
 									out.println("ERROR generating keys");
@@ -395,6 +412,26 @@ public class doCMDS implements Runnable {
 						} else {
 							out.println("ERROR tunnel is active");
 						}
+					} else if(Command.equals(C_option)) {
+						if(ns) {
+							if(tunnelactive(nickinfo)) {
+								out.println("ERROR tunnel is active");
+							} else {
+								StringTokenizer otoken = new StringTokenizer(Arg, "="); // use a space as a delimiter
+								if(otoken.countTokens() != 2) {
+									out.println("ERROR to many or no options.");
+								} else {
+									String pname = otoken.nextToken();
+									String pval = otoken.nextToken();
+									Properties Q = (Properties)nickinfo.get(P_PROPERTIES);
+									Q.setProperty(pname, pval);
+									nickinfo.add(P_PROPERTIES, Q);
+									out.println("OK " + pname + " set to " + pval);
+								} 
+							}
+						} else {
+							nns(out);
+						}
 					} else if(Command.equals(C_getnick)) {
 						// Get the nickname to work with...
 						try {
@@ -504,8 +541,8 @@ public class doCMDS implements Runnable {
 								try {
 									tunnel = new MUXlisten(nickinfo, _log);
 									Thread t = new Thread(tunnel);
-									t.start();
 									nickinfo.add(P_STARTING, true);
+									t.start();
 									out.println("OK tunnel starting");
 								} catch(I2PException e) {
 									out.println("ERROR starting tunnel: " + e);