diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
index 4daa490691cad95d5cd31198944863bd02bf180f..0585c240f83be6680d1b2a634215cc78184cb575 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
@@ -27,6 +27,7 @@
  * not obligated to do so. If you do not wish to do so, delete this
  * exception statement from your version.
  */
+
 package net.i2p.i2ptunnel;
 
 import java.io.BufferedReader;
@@ -288,8 +289,8 @@ public class I2PTunnel implements Logging, EventDispatcher {
         l.log("textserver <host> <port> <privkey>");
         l.log("genkeys <privkeyfile> [<pubkeyfile>]");
         l.log("gentextkeys");
-        l.log("client <port> <pubkey>[,<pubkey,...]|file:<pubkeyfile>");
-        l.log("httpclient <port>");
+        l.log("client <port> <pubkey>[,<pubkey,...]|file:<pubkeyfile> [<sharedClient>]");
+        l.log("httpclient <port> [<sharedClient>] [<proxy>]");
         l.log("lookup <name>");
         l.log("quit");
         l.log("close [forced] <jobnumber>|all");
@@ -486,12 +487,16 @@ public class I2PTunnel implements Logging, EventDispatcher {
      * Also sets the event "openClientResult" = "error" or "ok" (before setting the value to "ok" it also
      * adds "Ready! Port #" to the logger as well).  In addition, it will also set "clientLocalPort" =
      * Integer port number if the client is listening
+     * sharedClient parameter is a String "true" or "false"
      *
-     * @param args {portNumber, destinationBase64 or "file:filename"}
+     * @param args {portNumber, destinationBase64 or "file:filename"[, sharedClient]}
      * @param l logger to receive events and output
      */
     public void runClient(String args[], Logging l) {
-        if (args.length == 2) {
+        boolean isShared = true;
+        if (args.length == 3)
+            isShared = Boolean.valueOf(args[2].trim()).booleanValue();
+        if ( (args.length == 2) || (args.length == 3) ) {
             int portNum = -1;
             try {
                 portNum = Integer.parseInt(args[0]);
@@ -502,6 +507,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
                 return;
             }
             I2PTunnelTask task;
+            ownDest = !isShared;
             try {
                 task = new I2PTunnelClient(portNum, args[1], l, ownDest, (EventDispatcher) this, this);
                 addtask(task);
@@ -512,11 +518,12 @@ public class I2PTunnel implements Logging, EventDispatcher {
                 notifyEvent("clientTaskId", new Integer(-1));
             }
         } else {
-            l.log("client <port> <pubkey>[,<pubkey>]|file:<pubkeyfile>");
+            l.log("client <port> <pubkey>[,<pubkey>]|file:<pubkeyfile>[ <sharedClient>]");
             l.log("  creates a client that forwards port to the pubkey.\n"
                   + "  use 0 as port to get a free port assigned.  If you specify\n"
                   + "  a comma delimited list of pubkeys, it will rotate among them\n"
-                  + "  randomlyl");
+                  + "  randomlyl. sharedClient indicates if this client shares \n"
+                  + "   with other clients (true of false)");
             notifyEvent("clientTaskId", new Integer(-1));
         }
     }
@@ -526,12 +533,13 @@ public class I2PTunnel implements Logging, EventDispatcher {
      *
      * Sets the event "httpclientTaskId" = Integer(taskId) after the tunnel has been started (or -1 on error).
      * Also sets "httpclientStatus" = "ok" or "error" after the client tunnel has started.
+     * parameter sharedClient is a String, either "true" or "false"
      *
-     * @param args {portNumber and (optionally) proxy to be used for the WWW}
+     * @param args {portNumber[, sharedClient][, proxy to be used for the WWW]}
      * @param l logger to receive events and output
      */
     public void runHttpClient(String args[], Logging l) {
-        if (args.length >= 1 && args.length <= 2) {
+        if (args.length >= 1 && args.length <= 3) {
             int port = -1;
             try {
                 port = Integer.parseInt(args[0]);
@@ -541,12 +549,32 @@ public class I2PTunnel implements Logging, EventDispatcher {
                 notifyEvent("httpclientTaskId", new Integer(-1));
                 return;
             }
-
+            
             String proxy = "squid.i2p";
-            if (args.length == 2) {
-                proxy = args[1];
+            boolean isShared = true;
+            if (args.length > 1) {
+                if ("true".equalsIgnoreCase(args[1].trim())) {
+                    isShared = true;
+                    if (args.length == 3)
+                        proxy = args[2];
+                } else if ("false".equalsIgnoreCase(args[1].trim())) {
+                    _log.warn("args[1] == [" + args[1] + "] and rejected explicitly");
+                    isShared = false;
+                    if (args.length == 3)
+                        proxy = args[2];
+                } else if (args.length == 3) {
+                    isShared = false; // not "true"
+                    proxy = args[2];
+                    _log.warn("args[1] == [" + args[1] + "] but rejected");
+                } else {
+                    // isShared not specified, default to true
+                    isShared = true;
+                    proxy = args[1];
+                }
             }
+
             I2PTunnelTask task;
+            ownDest = !isShared;
             try {
                 task = new I2PTunnelHTTPClient(port, l, ownDest, proxy, (EventDispatcher) this, this);
                 addtask(task);
@@ -557,8 +585,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
                 notifyEvent("httpclientTaskId", new Integer(-1));
             }
         } else {
-            l.log("httpclient <port> [<proxy>]");
+            l.log("httpclient <port> [<sharedClient>] [<proxy>]");
             l.log("  creates a client that distributes HTTP requests.");
+            l.log("  <sharedClient> (optional) indicates if this client shares tunnels with other clients (true of false)");
             l.log("  <proxy> (optional) indicates a proxy server to be used");
             l.log("  when trying to access an address out of the .i2p domain");
             l.log("  (the default proxy is squid.i2p).");
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
index ec86e18d83a26bea6eb498fb9b5ba627435a90d8..3d216e06ff49b0d873dd783342227589917246e8 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
@@ -153,10 +153,11 @@ public class TunnelController implements Logging {
         setListenOn();
         String listenPort = getListenPort();
         String proxyList = getProxyList();
+        String sharedClient = getSharedClient();
         if (proxyList == null)
-            _tunnel.runHttpClient(new String[] { listenPort }, this);
+            _tunnel.runHttpClient(new String[] { listenPort, sharedClient }, this);
         else
-            _tunnel.runHttpClient(new String[] { listenPort, proxyList }, this);
+            _tunnel.runHttpClient(new String[] { listenPort, sharedClient, proxyList }, this);
         acquire();
         _running = true;
     }
@@ -199,7 +200,8 @@ public class TunnelController implements Logging {
         setListenOn();
         String listenPort = getListenPort(); 
         String dest = getTargetDestination();
-        _tunnel.runClient(new String[] { listenPort, dest }, this);
+        String sharedClient = getSharedClient();
+        _tunnel.runClient(new String[] { listenPort, dest, sharedClient }, this);
         acquire();
         _running = true;
     }
@@ -331,6 +333,7 @@ public class TunnelController implements Logging {
     public String getListenPort() { return _config.getProperty("listenPort"); }
     public String getTargetDestination() { return _config.getProperty("targetDestination"); }
     public String getProxyList() { return _config.getProperty("proxyList"); }
+    public String getSharedClient() { return _config.getProperty("sharedClient", "true"); }
     public boolean getStartOnLoad() { return "true".equalsIgnoreCase(_config.getProperty("startOnLoad", "true")); }
     public String getMyDestination() {
         if (_tunnel != null) {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelManager.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelManager.java
index 4fe8053833640fb438dc6a782c1c6274dbb66943..3b76c5e32c501088284f505c24cbb3a1c9926908 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelManager.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelManager.java
@@ -1,6 +1,7 @@
 /* I2PTunnel is GPL'ed (with the exception mentioned in I2PTunnel.java)
  * (c) 2003 - 2004 mihi
  */
+
 package net.i2p.i2ptunnel;
 
 import java.io.IOException;
@@ -55,7 +56,7 @@ import net.i2p.util.Log;
  *  Sets the ip address clients will listen on. By default this is the
  *  localhost (127.0.0.1)
  * -------------------------------------------------
- * openclient &lt;listenPort&gt; &lt;peer&gt;\n
+ * openclient &lt;listenPort&gt; &lt;peer&gt;[ &lt;sharedClient&gt;]\n
  * --
  * ok [&lt;jobId&gt;]\n
  *  or
@@ -70,8 +71,10 @@ import net.i2p.util.Log;
  *  specified as 'file:&lt;filename&gt;' or the name of a destination listed in
  *  hosts.txt. The &lt;jobId&gt; returned together with "ok" and &lt;listenport&gt; can
  *  later be used as argument for the "close" command.
+ *  &lt;sharedClient&gt; indicates if this httpclient shares tunnels with other
+ *  clients or not (just use 'true' and 'false'
  * -------------------------------------------------
- * openhttpclient &lt;listenPort&gt; [&lt;proxy&gt;]\n
+ * openhttpclient &lt;listenPort&gt; [&lt;sharedClient&gt;] [&lt;proxy&gt;]\n
  * --
  * ok [&lt;jobId&gt;]\n
  *  or
@@ -90,6 +93,8 @@ import net.i2p.util.Log;
  *  hosts.txt. The &lt;jobId&gt; returned together with "ok" and
  *  &lt;listenport&gt; can later be used as argument for the "close"
  *  command.
+ *  &lt;sharedClient&gt; indicates if this httpclient shares tunnels with other
+ *  clients or not (just use 'true' and 'false'
  * -------------------------------------------------
  * opensockstunnel &lt;listenPort&gt;\n
  * --
@@ -145,6 +150,11 @@ import net.i2p.util.Log;
  *  description depends on the type of job.
  * -------------------------------------------------
  * </pre>
+ *
+ *
+ * @deprecated this isn't run by default, and no one seems to use it, and has
+ *             lots of things to maintain.  so, at some point this may dissapear
+ *             unless someone pipes up ;)
  */
 public class TunnelManager implements Runnable {
     private final static Log _log = new Log(TunnelManager.class);
@@ -322,9 +332,9 @@ public class TunnelManager implements Runnable {
         buf.ignoreFurtherActions();
     }
 
-    public void processOpenClient(int listenPort, String peer, OutputStream out) throws IOException {
+    public void processOpenClient(int listenPort, String peer, String sharedClient, OutputStream out) throws IOException {
         BufferLogger buf = new BufferLogger();
-        _tunnel.runCommand("client " + listenPort + " " + peer, buf);
+        _tunnel.runCommand("client " + listenPort + " " + peer + " " + sharedClient, buf);
         Integer taskId = (Integer) _tunnel.waitEventValue("clientTaskId");
         if (taskId.intValue() < 0) {
             out.write("error\n".getBytes());
@@ -348,9 +358,9 @@ public class TunnelManager implements Runnable {
         buf.ignoreFurtherActions();
     }
 
-    public void processOpenHTTPClient(int listenPort, String proxy, OutputStream out) throws IOException {
+    public void processOpenHTTPClient(int listenPort, String sharedClient, String proxy, OutputStream out) throws IOException {
         BufferLogger buf = new BufferLogger();
-        _tunnel.runCommand("httpclient " + listenPort + " " + proxy, buf);
+        _tunnel.runCommand("httpclient " + listenPort + " " + sharedClient + " " + proxy, buf);
         Integer taskId = (Integer) _tunnel.waitEventValue("httpclientTaskId");
         if (taskId.intValue() < 0) {
             out.write("error\n".getBytes());
@@ -432,4 +442,4 @@ public class TunnelManager implements Runnable {
         out.write(command.getBytes());
         out.write("\n".getBytes());
     }
-}
\ No newline at end of file
+}
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelManagerClientRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelManagerClientRunner.java
index c62928eb627ffc83377f3f8c7725d406c5213947..6bd9bb730df47faa1d8d124cc6c8b93b6ceaa3e2 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelManagerClientRunner.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelManagerClientRunner.java
@@ -1,6 +1,7 @@
 /* I2PTunnel is GPL'ed (with the exception mentioned in I2PTunnel.java)
  * (c) 2003 - 2004 mihi
  */
+
 package net.i2p.i2ptunnel;
 
 import java.io.BufferedReader;
@@ -102,45 +103,53 @@ class TunnelManagerClientRunner implements Runnable {
             } else if ("openclient".equalsIgnoreCase(cmd)) {
                 int listenPort = 0;
                 String peer = null;
-                if (!tok.hasMoreTokens()) {
-                    _mgr.error("Usage: openclient <listenPort> <peer>", out);
+                String sharedClient = null;
+                int numTokens = tok.countTokens();
+                if (numTokens < 2 || numTokens > 3) {
+                    _mgr.error("Usage: openclient <listenPort> <peer> <sharedClient>", out);
                     return;
                 }
                 try {
-                    String portStr = tok.nextToken();
-                    listenPort = Integer.parseInt(portStr);
+                    listenPort = Integer.parseInt(tok.nextToken());
+                    peer = tok.nextToken();
+                    if (tok.hasMoreTokens())
+                        sharedClient = tok.nextToken();
+                    else
+                        sharedClient = "true";
+                    _mgr.processOpenClient(listenPort, peer, sharedClient, out);
                 } catch (NumberFormatException nfe) {
                     _mgr.error("Bad listen port", out);
                     return;
                 }
-                if (!tok.hasMoreTokens()) {
-                    _mgr.error("Usage: openclient <listenport> <peer>", out);
-                    return;
-                }
-                peer = tok.nextToken();
-                _mgr.processOpenClient(listenPort, peer, out);
             } else if ("openhttpclient".equalsIgnoreCase(cmd)) {
                 int listenPort = 0;
                 String proxy = "squid.i2p";
-                if (!tok.hasMoreTokens()) {
-                    _mgr.error("Usage: openhttpclient <listenPort> [<proxy>]", out);
+                String sharedClient = "true";
+                int numTokens = tok.countTokens();
+                if (numTokens < 1 || numTokens > 3) {
+                    _mgr.error("Usage: openhttpclient <listenPort> [<sharedClient>] [<proxy>]", out);
                     return;
                 }
                 try {
-                    String portStr = tok.nextToken();
-                    listenPort = Integer.parseInt(portStr);
+                    listenPort = Integer.parseInt(tok.nextToken());
+                    if (tok.hasMoreTokens()) {
+                        String val = tok.nextToken();
+                        if (tok.hasMoreTokens()) {
+                            sharedClient = val;
+                            proxy = tok.nextToken();
+                        } else {
+                            if ( ("true".equals(val)) || ("false".equals(val)) ) {
+                                sharedClient = val;
+                            } else {
+                                proxy = val;
+                            }
+                        }
+                    }
+                    _mgr.processOpenHTTPClient(listenPort, sharedClient, proxy, out);
                 } catch (NumberFormatException nfe) {
                     _mgr.error("Bad listen port", out);
                     return;
                 }
-                if (tok.hasMoreTokens()) {
-                    proxy = tok.nextToken();
-                }
-                if (tok.hasMoreTokens()) {
-                    _mgr.error("Usage: openclient <listenport> [<proxy>]", out);
-                    return;
-                }
-                _mgr.processOpenHTTPClient(listenPort, proxy, out);
             } else if ("opensockstunnel".equalsIgnoreCase(cmd)) {
                 int listenPort = 0;
                 if (!tok.hasMoreTokens()) {
@@ -191,4 +200,4 @@ class TunnelManagerClientRunner implements Runnable {
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
index 9e87082e714f133e36660505f8b2e14aab13313d..3e8ad4ea1ababd8e561e3b1ea4d0c3662bff1c28 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
@@ -73,6 +73,14 @@ public class EditBean extends IndexBean {
             return false;
     }
     
+    public boolean isSharedClient(int tunnel) {
+        TunnelController tun = getController(tunnel);
+        if (tun != null)
+            return "true".equalsIgnoreCase(tun.getSharedClient());
+        else
+            return true;
+    }
+    
     public boolean shouldDelay(int tunnel) {
         TunnelController tun = getController(tunnel);
         if (tun != null) {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
index cff2cd67076c23f02c2b03ffb4c3ea6e5b52ea6d..cadcd544a640612c56749e73f70dc9d38b003947 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
@@ -52,6 +52,7 @@ public class IndexBean {
     private String _privKeyFile;
     private String _profile;
     private boolean _startOnLoad;
+    private boolean _sharedClient;
     private boolean _privKeyGenerate;
     private boolean _removeConfirmed;
     
@@ -204,7 +205,8 @@ public class IndexBean {
             for (int i = 0; i < controllers.size(); i++) {
                 TunnelController c = (TunnelController)controllers.get(i);
                 if (c == cur) continue;
-                if ("httpclient".equals(c.getType()) || "client".equals(c.getType())) {
+                //only change when they really are declared of beeing a sharedClient
+                if (("httpclient".equals(c.getType()) || "client".equals(c.getType())) && "true".equalsIgnoreCase(c.getSharedClient())) {
                     Properties cOpt = c.getConfig("");
                     if (_tunnelCount != null) {
                         cOpt.setProperty("option.inbound.quantity", _tunnelCount);
@@ -343,6 +345,14 @@ public class IndexBean {
             return "";
     }
     
+    public String getSharedClient(int tunnel) {
+    	TunnelController tun = getController(tunnel);
+    	if (tun != null)
+    		return tun.getSharedClient();
+    	else
+    		return "";
+    }
+    
     public String getClientDestination(int tunnel) {
         TunnelController tun = getController(tunnel);
         if (tun == null) return "";
@@ -469,6 +479,9 @@ public class IndexBean {
     public void setStartOnLoad(String moo) {
         _startOnLoad = true;
     }
+    public void setSharedClient(String moo) {
+    	_sharedClient=true;
+    }
     public void setConnectDelay(String moo) {
         _connectDelay = true;
     }
@@ -496,8 +509,14 @@ public class IndexBean {
             if (_proxyList != null)
                 config.setProperty("proxyList", _proxyList);
 
-            config.setProperty("option.inbound.nickname", CLIENT_NICKNAME);
-            config.setProperty("option.outbound.nickname", CLIENT_NICKNAME);
+        	config.setProperty("option.inbound.nickname", CLIENT_NICKNAME);
+        	config.setProperty("option.outbound.nickname", CLIENT_NICKNAME);
+            if (_name != null && !_sharedClient) {
+                 config.setProperty("option.inbound.nickname", _name);
+                 config.setProperty("option.outbound.nickname", _name);
+            }
+
+            config.setProperty("sharedClient", _sharedClient + "");
         } else if ("client".equals(_type)) {
             if (_port != null)
                 config.setProperty("listenPort", _port);
@@ -510,6 +529,11 @@ public class IndexBean {
             
             config.setProperty("option.inbound.nickname", CLIENT_NICKNAME);
             config.setProperty("option.outbound.nickname", CLIENT_NICKNAME);
+            if (_name != null && !_sharedClient) {
+                config.setProperty("option.inbound.nickname", _name);
+                config.setProperty("option.outbound.nickname", _name);
+           }
+            config.setProperty("sharedClient", _sharedClient + "");
         } else if ("server".equals(_type)) {
             if (_targetHost != null)
                 config.setProperty("targetHost", _targetHost);
@@ -567,7 +591,7 @@ public class IndexBean {
         }
 
         config.setProperty("startOnLoad", _startOnLoad + "");
-        
+
         if (_tunnelCount != null) {
             config.setProperty("option.inbound.quantity", _tunnelCount);
             config.setProperty("option.outbound.quantity", _tunnelCount);
@@ -581,7 +605,7 @@ public class IndexBean {
         else
             config.setProperty("option.i2p.streaming.connectDelay", "0");
         if (_name != null) {
-            if ( (!"client".equals(_type)) && (!"httpclient".equals(_type)) ) {
+            if ( ((!"client".equals(_type)) && (!"httpclient".equals(_type))) || (!_sharedClient) ) {
                 config.setProperty("option.inbound.nickname", _name);
                 config.setProperty("option.outbound.nickname", _name);
             } else {
diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp
index 882a6941705cd5988c80c7a64bee5f0b9ce0f502..9f22cbcfa39c6bab3e5aba4788ff5a3dae7ac5fe 100644
--- a/apps/i2ptunnel/jsp/editClient.jsp
+++ b/apps/i2ptunnel/jsp/editClient.jsp
@@ -161,10 +161,23 @@ if (curTunnel >= 0) {
 </td>
 </tr>
 <tr>
+<td>
+<b>Shared Client</b>
+</td>
+<td>
+<% if (editBean.isSharedClient(curTunnel)) { %>
+<input type="checkbox" value="true" name="sharedClient" checked="true" />
+<% } else { %>
+<input type="checkbox" value="true" name="sharedClient" />
+<% } %>
+<i>(Share tunnels with other clients and httpclients? Change requires restart of client proxy)</i>
+</td>
+</tr>
+<tr>
 <td colspan="2" align="center">
 <b><hr size="1">
 Advanced networking options<br />
-<span style="color:#dd0000;">(Those are shared between ALL your Client proxies!)</span></b>
+<span style="color:#dd0000;">(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)</span></b>
 </td>
 </tr>
 <tr>
diff --git a/history.txt b/history.txt
index c49f4563eb8995b14c717e26b19ffb804691febf..34c75003e77e182b0adcc627b188f4065bb5a098 100644
--- a/history.txt
+++ b/history.txt
@@ -1,4 +1,15 @@
-$Id: history.txt,v 1.193 2005/04/16 19:59:51 jrandom Exp $
+$Id: history.txt,v 1.194 2005/04/17 18:23:21 jrandom Exp $
+
+2005-04-17  sirup
+    * Added the possibility for i2ptunnel client and httpclient instances to 
+      have their own i2p session (and hence, destination and tunnels).  By 
+      default, tunnels are shared, but that can be changed on the web 
+      interface or with the sharedClient config option in i2ptunnel.config.
+
+2005-04-17  jrandom
+    * Marked the net.i2p.i2ptunnel.TunnelManager as deprecated.  Anyone use
+      this?  If not, I want to drop it (lots of tiny details with lots of 
+      duplicated semantics).
 
 2005-04-17  zzz
     * Added new user-editable eepproxy error page templates.
diff --git a/installer/resources/i2ptunnel.config b/installer/resources/i2ptunnel.config
index 2a075455ad5d67c27198c8ec51050ee4edb20aa5..45edb086100abf163a7f349f1a4b56e0e1c693bf 100644
--- a/installer/resources/i2ptunnel.config
+++ b/installer/resources/i2ptunnel.config
@@ -2,13 +2,14 @@
 tunnel.0.name=eepProxy
 tunnel.0.description=HTTP proxy for browsing eepsites and the web
 tunnel.0.type=httpclient
+tunnel.0.sharedClient=true
 tunnel.0.interface=127.0.0.1
 tunnel.0.listenPort=4444
 tunnel.0.proxyList=squid.i2p,www1.squid.i2p
 tunnel.0.i2cpHost=127.0.0.1
 tunnel.0.i2cpPort=7654
-tunnel.0.option.inbound.nickname=eepProxy
-tunnel.0.option.outbound.nickname=eepProxy
+tunnel.0.option.inbound.nickname=shared clients
+tunnel.0.option.outbound.nickname=shared clients
 tunnel.0.option.i2p.streaming.connectDelay=1000
 tunnel.0.startOnLoad=true
 
@@ -16,13 +17,14 @@ tunnel.0.startOnLoad=true
 tunnel.1.name=ircProxy
 tunnel.1.description=IRC proxy to access the anonymous irc net
 tunnel.1.type=client
+tunnel.1.sharedClient=true
 tunnel.1.interface=127.0.0.1
 tunnel.1.listenPort=6668
 tunnel.1.targetDestination=irc.duck.i2p,irc.baffled.i2p,irc.postman.i2p
 tunnel.1.i2cpHost=127.0.0.1
 tunnel.1.i2cpPort=7654
-tunnel.1.option.inbound.nickname=ircProxy
-tunnel.1.option.outbound.nickname=ircProxy
+tunnel.1.option.inbound.nickname=shared clients
+tunnel.1.option.outbound.nickname=shared clients
 tunnel.1.option.i2p.streaming.connectDelay=1000
 tunnel.1.option.i2p.maxWindowSize=1
 tunnel.1.startOnLoad=true
@@ -31,13 +33,14 @@ tunnel.1.startOnLoad=true
 tunnel.2.name=cvs.i2p
 tunnel.2.description=I2P CVS pserver
 tunnel.2.type=client
+tunnel.2.sharedClient=true
 tunnel.2.interface=127.0.0.1
 tunnel.2.listenPort=2401
 tunnel.2.targetDestination=cvs.i2p
 tunnel.2.i2cpHost=127.0.0.1
 tunnel.2.i2cpPort=7654
-tunnel.2.option.inbound.nickname=cvsProxy
-tunnel.2.option.outbound.nickname=cvsProxy
+tunnel.2.option.inbound.nickname=shared clients
+tunnel.2.option.outbound.nickname=shared clients
 tunnel.2.startOnLoad=false
 
 # local eepserver
@@ -61,12 +64,13 @@ tunnel.4.i2cpPort=7654
 tunnel.4.interface=127.0.0.1
 tunnel.4.listenPort=7659
 tunnel.4.name=smtp.postman.i2p
-tunnel.4.option.inbound.nickname=smtp
-tunnel.4.option.outbound.nickname=smtp
+tunnel.4.option.inbound.nickname=shared clients
+tunnel.4.option.outbound.nickname=shared clients
 tunnel.4.option.i2p.streaming.connectDelay=1000
 tunnel.4.startOnLoad=true
 tunnel.4.targetDestination=smtp.postman.i2p
 tunnel.4.type=client
+tunnel.4.sharedClient=true
 
 # postman's POP3 server - see www.postman.i2p
 tunnel.5.name=pop3.postman.i2p
@@ -75,8 +79,8 @@ tunnel.5.i2cpHost=127.0.0.1
 tunnel.5.i2cpPort=7654
 tunnel.5.interface=127.0.0.1
 tunnel.5.listenPort=7660
-tunnel.5.option.inbound.nickname=pop3
-tunnel.5.option.outbound.nickname=pop3
+tunnel.5.option.inbound.nickname=shared clients
+tunnel.5.option.outbound.nickname=shared clients
 tunnel.5.option.i2p.streaming.connectDelay=1000
 tunnel.5.startOnLoad=true
 tunnel.5.targetDestination=pop.postman.i2p
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 352ae7679e80db5945178011455b59179cfaa29d..6fdf15706736f06a9d19c83668f2ae3f0c07b5f3 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.185 $ $Date: 2005/04/16 19:59:51 $";
+    public final static String ID = "$Revision: 1.186 $ $Date: 2005/04/17 18:23:20 $";
     public final static String VERSION = "0.5.0.6";
-    public final static long BUILD = 3;
+    public final static long BUILD = 4;
     public static void main(String args[]) {
         System.out.println("I2P Router version: " + VERSION);
         System.out.println("Router ID: " + RouterVersion.ID);