diff --git a/apps/sam/java/src/net/i2p/sam/SAMBridge.java b/apps/sam/java/src/net/i2p/sam/SAMBridge.java
index 58fa4bd4d4d76075242eac17c79f5134bdfff54b..114f9dd6015857672328666c7db28f3a4b24e447 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMBridge.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMBridge.java
@@ -35,20 +35,20 @@ import net.i2p.util.Log;
  */
 public class SAMBridge implements Runnable {
     private final static Log _log = new Log(SAMBridge.class);
-    private ServerSocketChannel serverSocket;
-    private Properties i2cpProps;
+    private final ServerSocketChannel serverSocket;
+    private final Properties i2cpProps;
     /** 
      * filename in which the name to private key mapping should 
      * be stored (and loaded from) 
      */
-    private String persistFilename;
+    private final String persistFilename;
     /** 
      * app designated destination name to the base64 of the I2P formatted 
      * destination keys (Destination+PrivateKey+SigningPrivateKey)
      */
-    private Map<String,String> nameToPrivKeys;
+    private final Map<String,String> nameToPrivKeys;
 
-    private boolean acceptConnections = true;
+    private volatile boolean acceptConnections = true;
 
     private static final int SAM_LISTENPORT = 7656;
     
@@ -64,8 +64,6 @@ public class SAMBridge implements Runnable {
     protected static final String DEFAULT_DATAGRAM_PORT = "7655";
 
     
-    private SAMBridge() {}
-    
     /**
      * Build a new SAM bridge.
      *
@@ -73,6 +71,7 @@ public class SAMBridge implements Runnable {
      * @param listenPort port number to listen for SAM connections on
      * @param i2cpProps set of I2CP properties for finding and communicating with the router
      * @param persistFile location to store/load named keys to/from
+     * @throws RuntimeException if a server socket can't be opened
      */
     public SAMBridge(String listenHost, int listenPort, Properties i2cpProps, String persistFile) {
         persistFilename = persistFile;
@@ -96,6 +95,7 @@ public class SAMBridge implements Runnable {
                 _log.error("Error starting SAM bridge on "
                            + (listenHost == null ? "0.0.0.0" : listenHost)
                            + ":" + listenPort, e);
+            throw new RuntimeException(e);
         }
         
         this.i2cpProps = i2cpProps;
diff --git a/apps/sam/java/src/net/i2p/sam/SAMDatagramSession.java b/apps/sam/java/src/net/i2p/sam/SAMDatagramSession.java
index c8d31b489d145f0f811013ad37ce874514368a33..74a700c36a181711502d07213f0c0f4bc17980e2 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMDatagramSession.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMDatagramSession.java
@@ -30,10 +30,11 @@ public class SAMDatagramSession extends SAMMessageSession {
     private final static Log _log = new Log(SAMDatagramSession.class);
     public static int DGRAM_SIZE_MAX = 31*1024;
 
-    protected SAMDatagramReceiver recv = null;
+    // FIXME make final after fixing SAMv3DatagramSession override
+    protected SAMDatagramReceiver recv;
 
-    private I2PDatagramMaker dgramMaker;
-    private I2PDatagramDissector dgramDissector = new I2PDatagramDissector();
+    private final I2PDatagramMaker dgramMaker;
+    private final I2PDatagramDissector dgramDissector = new I2PDatagramDissector();
     /**
      * Create a new SAM DATAGRAM session.
      *
diff --git a/apps/sam/java/src/net/i2p/sam/SAMHandler.java b/apps/sam/java/src/net/i2p/sam/SAMHandler.java
index cc36bef8279f011c7147273961f2c87cfdb75252..5bba374d69dbf889eec54c9ed64030525d2aa305 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMHandler.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMHandler.java
@@ -30,17 +30,17 @@ public abstract class SAMHandler implements Runnable {
     protected I2PAppThread thread = null;
     protected SAMBridge bridge = null;
 
-    private Object socketWLock = new Object(); // Guards writings on socket
-    protected SocketChannel socket = null;
+    private final Object socketWLock = new Object(); // Guards writings on socket
+    protected final SocketChannel socket;
 
-    protected int verMajor = 0;
-    protected int verMinor = 0;
+    protected final int verMajor;
+    protected final int verMinor;
     
     /** I2CP options configuring the I2CP connection (port, host, numHops, etc) */
-    protected Properties i2cpProps = null;
+    protected final Properties i2cpProps;
 
-    private Object  stopLock = new Object();
-    private boolean stopHandler = false;
+    private final Object stopLock = new Object();
+    private volatile boolean stopHandler;
 
     /**
      * SAMHandler constructor (to be called by subclasses)
@@ -148,9 +148,7 @@ public abstract class SAMHandler implements Runnable {
      * @throws IOException 
      */
     protected final void closeClientSocket() throws IOException {
-        if (socket != null)
             socket.close();
-        socket = null;
     }
 
     /**
diff --git a/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java b/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java
index 2c8ed2756bec07c5c2f644d4bef9902a097c716e..f4c4dc5b2964494f53547276b9e358f24e10bbd1 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java
@@ -159,8 +159,8 @@ public abstract class SAMMessageSession {
      */
     public class SAMMessageSessionHandler implements Runnable, I2PSessionListener {
 
-        private Object runningLock = new Object();
-        private boolean stillRunning = true;
+        private final Object runningLock = new Object();
+        private volatile boolean stillRunning = true;
                 
         /**
          * Create a new SAM message-based session handler
diff --git a/apps/sam/java/src/net/i2p/sam/SAMRawSession.java b/apps/sam/java/src/net/i2p/sam/SAMRawSession.java
index 92bf4960dd7bd36bfd51f0a45e016e759b5622a5..4da333ab26acf7417dde49c83436b75a2aabb92b 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMRawSession.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMRawSession.java
@@ -26,7 +26,9 @@ public class SAMRawSession extends SAMMessageSession {
     private final static Log _log = new Log(SAMRawSession.class);
     public static final int RAW_SIZE_MAX = 32*1024;
 
-    protected SAMRawReceiver recv = null;
+    // FIXME make final after fixing SAMv3DatagramSession override
+    protected SAMRawReceiver recv;
+
     /**
      * Create a new SAM RAW session.
      *
diff --git a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java
index ab5d9068b751aa4ccc8692ea652a694c5eb030b4..63122eb82eb69c4a56ff24776493b529eb9cf341 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java
@@ -51,19 +51,19 @@ public class SAMStreamSession {
 
     protected final static int SOCKET_HANDLER_BUF_SIZE = 32768;
 
-    protected SAMStreamReceiver recv = null;
+    protected final SAMStreamReceiver recv;
 
-    protected SAMStreamSessionServer server = null;
+    protected final SAMStreamSessionServer server;
 
-    protected I2PSocketManager socketMgr = null;
+    protected final I2PSocketManager socketMgr;
 
-    private Object handlersMapLock = new Object();
+    private final Object handlersMapLock = new Object();
     /** stream id (Long) to SAMStreamSessionSocketReader */
-    private HashMap<Integer,SAMStreamSessionSocketReader> handlersMap = new HashMap<Integer,SAMStreamSessionSocketReader>();
+    private final HashMap<Integer,SAMStreamSessionSocketReader> handlersMap = new HashMap<Integer,SAMStreamSessionSocketReader>();
     /** stream id (Long) to StreamSender */
-    private HashMap<Integer,StreamSender> sendersMap = new HashMap<Integer,StreamSender>();
+    private final HashMap<Integer,StreamSender> sendersMap = new HashMap<Integer,StreamSender>();
 
-    private Object idLock = new Object();
+    private final Object idLock = new Object();
     private int lastNegativeId = 0;
 
     // Can we create outgoing connections?
@@ -73,15 +73,11 @@ public class SAMStreamSession {
      * should we flush every time we get a STREAM SEND, or leave that up to
      * the streaming lib to decide? 
      */
-    protected boolean forceFlush = false;
+    protected final boolean forceFlush;
 
     public static String PROP_FORCE_FLUSH = "sam.forceFlush";
     public static String DEFAULT_FORCE_FLUSH = "false";
     
-    public SAMStreamSession() {
-    	
-    }
-    
     /**
      * Create a new SAM STREAM session.
      *
@@ -95,11 +91,7 @@ public class SAMStreamSession {
      */
     public SAMStreamSession(String dest, String dir, Properties props,
                             SAMStreamReceiver recv) throws IOException, DataFormatException, SAMException {
-        ByteArrayInputStream bais;
-
-        bais = new ByteArrayInputStream(Base64.decode(dest));
-
-        initSAMStreamSession(bais, dir, props, recv);
+        this(new ByteArrayInputStream(Base64.decode(dest)), dir, props, recv);
     }
 
     /**
@@ -115,11 +107,6 @@ public class SAMStreamSession {
      */
     public SAMStreamSession(InputStream destStream, String dir,
                             Properties props,  SAMStreamReceiver recv) throws IOException, DataFormatException, SAMException {
-        initSAMStreamSession(destStream, dir, props, recv);
-    }
-
-    private void initSAMStreamSession(InputStream destStream, String dir,
-                                      Properties props, SAMStreamReceiver recv) throws IOException, DataFormatException, SAMException{
         this.recv = recv;
 
         _log.debug("SAM STREAM session instantiated");
@@ -168,6 +155,8 @@ public class SAMStreamSession {
             Thread t = new I2PAppThread(server, "SAMStreamSessionServer");
 
             t.start();
+        } else {
+            server = null;
         }
     }
     
@@ -417,10 +406,10 @@ public class SAMStreamSession {
      */
     public class SAMStreamSessionServer implements Runnable {
 
-        private Object runningLock = new Object();
-        private boolean stillRunning = true;
+        private final Object runningLock = new Object();
+        private volatile boolean stillRunning = true;
 
-        private I2PServerSocket serverSocket = null;
+        private final I2PServerSocket serverSocket;
 
         /**
          * Create a new SAM STREAM session server
@@ -511,9 +500,9 @@ public class SAMStreamSession {
         
         protected I2PSocket i2pSocket = null;
 
-        protected Object runningLock = new Object();
+        protected final Object runningLock = new Object();
 
-        protected boolean stillRunning = true;
+        protected volatile boolean stillRunning = true;
 
         protected int id;
 
@@ -660,8 +649,8 @@ public class SAMStreamSession {
         private int _id;
         private ByteCache _cache;
         private OutputStream _out = null;
-        private boolean _stillRunning, _shuttingDownGracefully;
-        private Object runningLock = new Object();
+        private volatile boolean _stillRunning, _shuttingDownGracefully;
+        private final Object runningLock = new Object();
         private I2PSocket i2pSocket = null;
         
 	public v1StreamSender ( I2PSocket s, int id ) throws IOException {
diff --git a/apps/sam/java/src/net/i2p/sam/SAMUtils.java b/apps/sam/java/src/net/i2p/sam/SAMUtils.java
index ebf99cb3ae807bbd9e4482c84d067eb5a2dbef8c..dfc08a58d509dcdffdb08a7690595399eb3efada 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMUtils.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMUtils.java
@@ -206,6 +206,7 @@ public class SAMUtils {
         return msg;
     }
     
+/****
     public static void main(String args[]) {
         try {
             test("a=b c=d e=\"f g h\"");
@@ -220,4 +221,5 @@ public class SAMUtils {
         Properties p = parseParams(tok);
         System.out.println(p);
     }
+****/
 }
diff --git a/apps/sam/java/src/net/i2p/sam/SAMv1Handler.java b/apps/sam/java/src/net/i2p/sam/SAMv1Handler.java
index 487f8fdf1fd5a9484ba86247e16f880ba1e2621c..c5b5d2b1b78a1e925030821c4538aef47f1b9260 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMv1Handler.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMv1Handler.java
@@ -46,7 +46,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag
     protected SAMDatagramSession getDatagramSession() {return datagramSession ;}	
     protected SAMStreamSession getStreamSession() {return streamSession ;}
 
-    protected long _id;
+    protected final long _id;
     protected static volatile long __id = 0;
     
     /**
diff --git a/apps/sam/java/src/net/i2p/sam/SAMv2StreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMv2StreamSession.java
index 0cfb42660d53322124e4c1a59fb3ce74751bae75..76dc595f0b706d9e3c5ab9361722765b87501bd8 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMv2StreamSession.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMv2StreamSession.java
@@ -244,14 +244,14 @@ public class SAMv2StreamSession extends SAMStreamSession
 		protected class v2StreamSender extends StreamSender
 
 		{
-				private List<ByteArray> _data;
+				private final List<ByteArray> _data;
 				private int _dataSize;
-				private int _id;
-				private ByteCache _cache;
-				private OutputStream _out = null;
-				private boolean _stillRunning, _shuttingDownGracefully;
-				private Object runningLock = new Object();
-				private I2PSocket i2pSocket = null;
+				private final int _id;
+				private final ByteCache _cache;
+				private final OutputStream _out;
+				private volatile boolean _stillRunning, _shuttingDownGracefully;
+				private final Object runningLock = new Object();
+				private final I2PSocket i2pSocket;
 
 				public v2StreamSender ( I2PSocket s, int id ) throws IOException
 				{
diff --git a/apps/sam/java/src/net/i2p/sam/SAMv3DatagramSession.java b/apps/sam/java/src/net/i2p/sam/SAMv3DatagramSession.java
index 918fa1fc07448353daa4621f9a027fa517528e1c..d395cddd329bd90a57e389b5a57b685240ae276c 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMv3DatagramSession.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMv3DatagramSession.java
@@ -21,10 +21,10 @@ public class SAMv3DatagramSession extends SAMDatagramSession implements SAMv3Han
 	
 	private final static Log _log = new Log ( SAMv3DatagramSession.class );
 
-	SAMv3Handler handler = null ;
-	SAMv3Handler.DatagramServer server = null ;
-	String nick = null ;
-	SocketAddress clientAddress = null ;
+	final SAMv3Handler handler;
+	final SAMv3Handler.DatagramServer server;
+	final String nick;
+	final SocketAddress clientAddress;
 	
 	public String getNick() { return nick; }
 
@@ -41,10 +41,10 @@ public class SAMv3DatagramSession extends SAMDatagramSession implements SAMv3Han
 		
 		super(SAMv3Handler.sSessionsHash.get(nick).getDest(),
 				SAMv3Handler.sSessionsHash.get(nick).getProps(),
-				null
+				null  // to be replaced by this
 				);
 		this.nick = nick ;
-		this.recv = this ;
+		this.recv = this ;  // replacement
 		this.server = SAMv3Handler.DatagramServer.getInstance() ;
 
 		SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick);
@@ -56,6 +56,7 @@ public class SAMv3DatagramSession extends SAMDatagramSession implements SAMv3Han
     	String portStr = props.getProperty("PORT") ;
     	if ( portStr==null ) {
     		_log.debug("receiver port not specified. Current socket will be used.");
+    		this.clientAddress = null;
     	}
     	else {
     		int port = Integer.parseInt(portStr);
diff --git a/apps/sam/java/src/net/i2p/sam/SAMv3Handler.java b/apps/sam/java/src/net/i2p/sam/SAMv3Handler.java
index 80fa7cf63cd4514e8899082266691de98b311673..2612218d8eef826a1d0612cf05e20e05a37f4da5 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMv3Handler.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMv3Handler.java
@@ -142,7 +142,7 @@ public class SAMv3Handler extends SAMv1Handler
 		
 		class Listener implements Runnable {
 			
-			DatagramChannel server = null;
+			final DatagramChannel server;
 			
 			public Listener(DatagramChannel server)
 			{
@@ -172,7 +172,7 @@ public class SAMv3Handler extends SAMv1Handler
 
 	public static class MessageDispatcher implements Runnable
 	{
-		ByteArrayInputStream is = null ;
+		final ByteArrayInputStream is;
 		
 		public MessageDispatcher(byte[] buf)
 		{
@@ -210,10 +210,10 @@ public class SAMv3Handler extends SAMv1Handler
 	
 	public class SessionRecord
 	{
-		protected String m_dest ;
-		protected Properties m_props ;
+		protected final String m_dest ;
+		protected final Properties m_props ;
 		protected ThreadGroup m_threadgroup ;
-		protected SAMv3Handler m_handler ;
+		protected final SAMv3Handler m_handler ;
 
 		public SessionRecord( String dest, Properties props, SAMv3Handler handler )
 		{
@@ -268,7 +268,7 @@ public class SAMv3Handler extends SAMv1Handler
 			static final long serialVersionUID = 0x1 ;
 		}
 		
-		HashMap<String, SessionRecord> map ;
+		final HashMap<String, SessionRecord> map;
 
 		public SessionsDB() {
 			map = new HashMap<String, SessionRecord>() ;
@@ -578,6 +578,9 @@ public class SAMv3Handler extends SAMv1Handler
 		}
 	}
 
+	/**
+	 * @throws NPE if login nickname is not registered
+	 */
 	SAMv3StreamSession newSAMStreamSession(String login )
 	throws IOException, DataFormatException, SAMException
 	{
diff --git a/apps/sam/java/src/net/i2p/sam/SAMv3RawSession.java b/apps/sam/java/src/net/i2p/sam/SAMv3RawSession.java
index 3695bf3ddaf8294f85841f4ff4c3bef2bab650e0..1f45777e7811b3c63d4b1beaef7689e793021891 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMv3RawSession.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMv3RawSession.java
@@ -20,11 +20,11 @@ import net.i2p.util.Log;
  */
 public class SAMv3RawSession extends SAMRawSession  implements SAMv3Handler.Session, SAMRawReceiver {
 	
-	String nick = null ;
-	SAMv3Handler handler = null ;
-	SAMv3Handler.DatagramServer server ;
+	final String nick;
+	final SAMv3Handler handler;
+	final SAMv3Handler.DatagramServer server;
 	private final static Log _log = new Log ( SAMv3DatagramSession.class );
-	SocketAddress clientAddress = null ;
+	final SocketAddress clientAddress;
 
 	public String getNick() { return nick; }
 
@@ -42,10 +42,10 @@ public class SAMv3RawSession extends SAMRawSession  implements SAMv3Handler.Sess
 		
 		super(SAMv3Handler.sSessionsHash.get(nick).getDest(),
 				SAMv3Handler.sSessionsHash.get(nick).getProps(),
-				SAMv3Handler.sSessionsHash.get(nick).getHandler()
+				SAMv3Handler.sSessionsHash.get(nick).getHandler()  // to be replaced by this
 				);
 		this.nick = nick ;
-		this.recv = this ;
+		this.recv = this ;  // replacement
 		this.server = SAMv3Handler.DatagramServer.getInstance() ;
 
 		SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick);
@@ -59,6 +59,7 @@ public class SAMv3RawSession extends SAMRawSession  implements SAMv3Handler.Sess
     	String portStr = props.getProperty("PORT") ;
     	if ( portStr==null ) {
     		_log.debug("receiver port not specified. Current socket will be used.");
+    		this.clientAddress = null;
     	}
     	else {
     		int port = Integer.parseInt(portStr);
diff --git a/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java
index 159798f601c6387bf58777482d39c68c85de5e42..40e049b9be0b584d6e52ecd3dc83254b89665f02 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java
@@ -45,10 +45,10 @@ public class SAMv3StreamSession  extends SAMStreamSession implements SAMv3Handle
 		
 		protected final int BUFFER_SIZE = 1024 ;
 		
-		protected Object socketServerLock = new Object();
+		protected final Object socketServerLock = new Object();
 		protected I2PServerSocket socketServer = null;
 	
-		protected String nick ;
+		protected final String nick ;
 		
 		public String getNick() {
 			return nick ;
@@ -62,11 +62,15 @@ public class SAMv3StreamSession  extends SAMStreamSession implements SAMv3Handle
 	     * @throws IOException
 	     * @throws DataFormatException
 	     * @throws SAMException 
+	     * @throws NPE if login nickname is not registered
 	     */
 	    public SAMv3StreamSession(String login)
 	    		throws IOException, DataFormatException, SAMException
 	    {
-	    	initSAMStreamSession(login);
+                super(getDB().get(login).getDest(), "CREATE",
+                      getDB().get(login).getProps(),
+                      getDB().get(login).getHandler());
+	    	this.nick = login ;
 	    }
 
 	    public static SAMv3Handler.SessionsDB getDB()
@@ -74,42 +78,6 @@ public class SAMv3StreamSession  extends SAMStreamSession implements SAMv3Handle
 	    	return SAMv3Handler.sSessionsHash ;
 	    }
 
-	    private void initSAMStreamSession(String login)
-	    	throws IOException, DataFormatException, SAMException {
-
-	        SAMv3Handler.SessionRecord rec = getDB().get(login);
-	        String dest = rec.getDest() ;
-	        ByteArrayInputStream ba_dest = new ByteArrayInputStream(Base64.decode(dest));
-
-	        this.recv = rec.getHandler();
-
-	    	_log.debug("SAM STREAM session instantiated");
-
-	        Properties allprops = (Properties) System.getProperties().clone();
-	    	allprops.putAll(rec.getProps());
-	    	
-	    	String i2cpHost = allprops.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1");
-	    	int i2cpPort ;
-	    	String port = allprops.getProperty(I2PClient.PROP_TCP_PORT, "7654");
-	    	try {
-	    		i2cpPort = Integer.parseInt(port);
-	    	} catch (NumberFormatException nfe) {
-	    		throw new SAMException("Invalid I2CP port specified [" + port + "]");
-	    	}
-
-	    	_log.debug("Creating I2PSocketManager...");
-	    	socketMgr = I2PSocketManagerFactory.createManager(ba_dest,
-	    			i2cpHost,
-	    			i2cpPort, 
-	    			allprops);
-	    	if (socketMgr == null) {
-	    		throw new SAMException("Error creating I2PSocketManager towards "+i2cpHost+":"+i2cpPort);
-	    	}
-
-	    	socketMgr.addDisconnectListener(new DisconnectListener());
-	    	this.nick = login ;
-	    }
-
 	    /**
 	     * Connect the SAM STREAM session to the specified Destination
 	     *
@@ -248,10 +216,10 @@ public class SAMv3StreamSession  extends SAMStreamSession implements SAMv3Handle
 	    
 	    public class SocketForwarder extends Thread
 	    {
-	    	String host = null ;
-	    	int port = 0 ;
-	    	SAMv3StreamSession session;
-	    	boolean verbose;
+	    	final String host;
+	    	final int port;
+	    	final SAMv3StreamSession session;
+	    	final boolean verbose;
 	    	
 	    	SocketForwarder(String host, int port, SAMv3StreamSession session, boolean verbose) {
 	    		this.host = host ;
@@ -317,9 +285,9 @@ public class SAMv3StreamSession  extends SAMStreamSession implements SAMv3Handle
 	    }
 	    public class Pipe extends Thread
 	    {
-	    	ReadableByteChannel in  ;
-	    	WritableByteChannel out ;
-	    	ByteBuffer buf ;
+	    	final ReadableByteChannel in  ;
+	    	final WritableByteChannel out ;
+	    	final ByteBuffer buf ;
 	    	
 	    	public Pipe(ReadableByteChannel in, WritableByteChannel out, String name)
 	    	{