[tor-commits] [orbot/master] update to AndroidPT Obfs4 and use external JSocksAndroid module

n8fr8 at torproject.org n8fr8 at torproject.org
Fri Jul 5 12:40:01 UTC 2019


commit 5374ca86a9f714f1cc3fb75435ab296651c9b5ab
Author: n8fr8 <nathan at guardianproject.info>
Date:   Fri May 31 14:48:20 2019 -0400

    update to AndroidPT Obfs4 and use external JSocksAndroid module
---
 jsocksAndroid/build.gradle                         |  18 -
 jsocksAndroid/src/main/AndroidManifest.xml         |   5 -
 .../com/runjva/sourceforge/jsocks/main/SOCKS.java  | 267 --------
 .../jsocks/protocol/Authentication.java            |  35 --
 .../jsocks/protocol/AuthenticationNone.java        |  22 -
 .../sourceforge/jsocks/protocol/InetRange.java     | 492 ---------------
 .../sourceforge/jsocks/protocol/ProxyMessage.java  | 118 ----
 .../sourceforge/jsocks/protocol/ProxyServer.java   | 699 ---------------------
 .../sourceforge/jsocks/protocol/Socks4Message.java | 167 -----
 .../sourceforge/jsocks/protocol/Socks4Proxy.java   | 144 -----
 .../jsocks/protocol/Socks5DatagramSocket.java      | 480 --------------
 .../sourceforge/jsocks/protocol/Socks5Message.java | 325 ----------
 .../sourceforge/jsocks/protocol/Socks5Proxy.java   | 295 ---------
 .../jsocks/protocol/SocksException.java            | 111 ----
 .../jsocks/protocol/SocksProxyBase.java            | 543 ----------------
 .../jsocks/protocol/SocksServerSocket.java         | 235 -------
 .../sourceforge/jsocks/protocol/SocksSocket.java   | 385 ------------
 .../jsocks/protocol/UDPEncapsulation.java          |  33 -
 .../jsocks/protocol/UDPRelayServer.java            | 227 -------
 .../protocol/UserPasswordAuthentication.java       |  91 ---
 .../runjva/sourceforge/jsocks/server/Ident.java    | 171 -----
 .../jsocks/server/IdentAuthenticator.java          | 182 ------
 .../jsocks/server/ServerAuthenticator.java         | 126 ----
 .../jsocks/server/ServerAuthenticatorBase.java     | 187 ------
 .../jsocks/server/ServerAuthenticatorNone.java     |  16 -
 .../jsocks/server/UserPasswordAuthenticator.java   |  82 ---
 .../sourceforge/jsocks/server/UserValidation.java  |  24 -
 orbotservice/build.gradle                          |   6 +-
 .../org/torproject/android/service/TorService.java |  36 +-
 .../android/service/vpn/OrbotVpnManager.java       |   2 +-
 settings.gradle                                    |   3 +-
 31 files changed, 38 insertions(+), 5489 deletions(-)

diff --git a/jsocksAndroid/build.gradle b/jsocksAndroid/build.gradle
deleted file mode 100644
index a6215bf0..00000000
--- a/jsocksAndroid/build.gradle
+++ /dev/null
@@ -1,18 +0,0 @@
-apply plugin: 'com.android.library'
-
-android {
-    compileSdkVersion 28
-    buildToolsVersion '28.0.3'
-
-    defaultConfig {
-        minSdkVersion 16
-        targetSdkVersion 28
-    }
-
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
-        }
-    }
-}
diff --git a/jsocksAndroid/src/main/AndroidManifest.xml b/jsocksAndroid/src/main/AndroidManifest.xml
deleted file mode 100644
index fb20a650..00000000
--- a/jsocksAndroid/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.example.jsocksandroid" >
-
-
-</manifest>
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/main/SOCKS.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/main/SOCKS.java
deleted file mode 100644
index 9174c7ea..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/main/SOCKS.java
+++ /dev/null
@@ -1,267 +0,0 @@
-package com.runjva.sourceforge.jsocks.main;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Hashtable;
-import java.util.Properties;
-import java.util.StringTokenizer;
-
-import android.util.Log;
-
-import com.runjva.sourceforge.jsocks.protocol.InetRange;
-import com.runjva.sourceforge.jsocks.protocol.ProxyServer;
-import com.runjva.sourceforge.jsocks.protocol.SocksProxyBase;
-import com.runjva.sourceforge.jsocks.server.IdentAuthenticator;
-
-public class SOCKS {
-
-	private static final int DEFAULT_LISTENING_PORT = 1080;
-
-	static public void usage() {
-		System.out.println("Usage: java SOCKS [inifile1 inifile2 ...]\n"
-				+ "If none inifile is given, uses socks.properties.\n");
-	}
-
-	static public void main(String[] args) {
-
-		String[] file_names;
-		int port = DEFAULT_LISTENING_PORT;
-		String logFile = null;
-		String host = null;
-
-		final IdentAuthenticator auth = new IdentAuthenticator();
-
-		InetAddress localIP = null;
-
-		if (args.length == 0) {
-			file_names = new String[] { "socks.properties" };
-		} else {
-			file_names = args;
-		}
-
-		inform("Loading properties");
-		for (int i = 0; i < file_names.length; ++i) {
-
-			inform("Reading file " + file_names[i]);
-
-			final Properties pr = loadProperties(file_names[i]);
-			if (pr == null) {
-				System.err.println("Loading of properties from "
-						+ file_names[i] + "failed.");
-				usage();
-				return;
-			}
-			if (!addAuth(auth, pr)) {
-				System.err.println("Error in file " + file_names[i] + ".");
-				usage();
-				return;
-			}
-			// First file should contain all global settings,
-			// like port and host and log.
-			if (i == 0) {
-				final String port_s = (String) pr.get("port");
-				if (port_s != null) {
-					try {
-						port = Integer.parseInt(port_s);
-					} catch (final NumberFormatException nfe) {
-						System.err.println("Can't parse port: " + port_s);
-						return;
-					}
-				}
-
-				serverInit(pr);
-				logFile = (String) pr.get("log");
-				host = (String) pr.get("host");
-			}
-
-			// inform("Props:"+pr);
-		}
-
-		if (logFile != null) {
-			System.err.println("log property not supported anymore.");
-		}
-		if (host != null) {
-			try {
-				localIP = InetAddress.getByName(host);
-			} catch (final UnknownHostException uhe) {
-				System.err.println("Can't resolve local ip: " + host);
-				return;
-			}
-		}
-
-		inform("Using Ident Authentication scheme: " + auth);
-		final ProxyServer server = new ProxyServer(auth);
-		server.start(port, 5, localIP);
-	}
-
-	static Properties loadProperties(String file_name) {
-
-		final Properties pr = new Properties();
-
-		try {
-			final InputStream fin = new FileInputStream(file_name);
-			pr.load(fin);
-			fin.close();
-		} catch (final IOException ioe) {
-			return null;
-		}
-		return pr;
-	}
-
-	static boolean addAuth(IdentAuthenticator ident, Properties pr) {
-
-		InetRange irange;
-
-		final String range = (String) pr.get("range");
-		if (range == null) {
-			return false;
-		}
-		irange = parseInetRange(range);
-
-		final String users = (String) pr.get("users");
-
-		if (users == null) {
-			ident.add(irange, null);
-			return true;
-		}
-
-		final Hashtable<String, String> uhash = new Hashtable<String, String>();
-
-		final StringTokenizer st = new StringTokenizer(users, ";");
-		while (st.hasMoreTokens()) {
-			uhash.put(st.nextToken(), "");
-		}
-
-		ident.add(irange, uhash);
-		return true;
-	}
-
-	/**
-	 * Does server initialisation.
-	 */
-	static void serverInit(Properties props) {
-		int val;
-		val = readInt(props, "iddleTimeout");
-		if (val >= 0) {
-			ProxyServer.setIddleTimeout(val);
-			inform("Setting iddle timeout to " + val + " ms.");
-		}
-		val = readInt(props, "acceptTimeout");
-		if (val >= 0) {
-			ProxyServer.setAcceptTimeout(val);
-			inform("Setting accept timeout to " + val + " ms.");
-		}
-		val = readInt(props, "udpTimeout");
-		if (val >= 0) {
-			ProxyServer.setUDPTimeout(val);
-			inform("Setting udp timeout to " + val + " ms.");
-		}
-
-		val = readInt(props, "datagramSize");
-		if (val >= 0) {
-			ProxyServer.setDatagramSize(val);
-			inform("Setting datagram size to " + val + " bytes.");
-		}
-
-		proxyInit(props);
-
-	}
-
-	/**
-	 * Initialises proxy, if any specified.
-	 */
-	static void proxyInit(Properties props) {
-		String proxy_list;
-		SocksProxyBase proxy = null;
-		StringTokenizer st;
-
-		proxy_list = (String) props.get("proxy");
-		if (proxy_list == null) {
-			return;
-		}
-
-		st = new StringTokenizer(proxy_list, ";");
-		while (st.hasMoreTokens()) {
-			final String proxy_entry = st.nextToken();
-
-			final SocksProxyBase p = SocksProxyBase.parseProxy(proxy_entry);
-
-			if (p == null) {
-				exit("Can't parse proxy entry:" + proxy_entry);
-			}
-
-			inform("Adding Proxy:" + p);
-
-			if (proxy != null) {
-				p.setChainProxy(proxy);
-			}
-
-			proxy = p;
-
-		}
-		if (proxy == null) {
-			return; // Empty list
-		}
-
-		final String direct_hosts = (String) props.get("directHosts");
-		if (direct_hosts != null) {
-			final InetRange ir = parseInetRange(direct_hosts);
-			inform("Setting direct hosts:" + ir);
-			proxy.setDirect(ir);
-		}
-
-		ProxyServer.setProxy(proxy);
-	}
-
-	/**
-	 * Inits range from the string of semicolon separated ranges.
-	 */
-	static InetRange parseInetRange(String source) {
-		final InetRange irange = new InetRange();
-
-		final StringTokenizer st = new StringTokenizer(source, ";");
-		while (st.hasMoreTokens()) {
-			irange.add(st.nextToken());
-		}
-
-		return irange;
-	}
-
-	/**
-	 * Integer representaion of the property named name, or -1 if one is not
-	 * found.
-	 */
-	static int readInt(Properties props, String name) {
-		int result = -1;
-		final String val = (String) props.get(name);
-		if (val == null) {
-			return -1;
-		}
-		final StringTokenizer st = new StringTokenizer(val);
-		if (!st.hasMoreElements()) {
-			return -1;
-		}
-		try {
-			result = Integer.parseInt(st.nextToken());
-		} catch (final NumberFormatException nfe) {
-			inform("Bad value for " + name + ":" + val);
-		}
-		return result;
-	}
-
-	// Display functions
-	// /////////////////
-
-	static void inform(String s) {
-		Log.i("SOCKS",s);
-	}
-
-	static void exit(String msg) {
-		System.err.println("Error:" + msg);
-		System.err.println("Aborting operation");
-		System.exit(0);
-	}
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Authentication.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Authentication.java
deleted file mode 100644
index 7bc58d9d..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Authentication.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-/**
- * The Authentication interface provides for performing method specific
- * authentication for SOCKS5 connections.
- */
-public interface Authentication {
-	/**
-	 * This method is called when SOCKS5 server have selected a particular
-	 * authentication method, for whch an implementaion have been registered.
-	 * 
-	 * <p>
-	 * This method should return an array {inputstream,outputstream
-	 * [,UDPEncapsulation]}. The reason for that is that SOCKS5 protocol allows
-	 * to have method specific encapsulation of data on the socket for purposes
-	 * of integrity or security. And this encapsulation should be performed by
-	 * those streams returned from the method. It is also possible to
-	 * encapsulate datagrams. If authentication method supports such
-	 * encapsulation an instance of the UDPEncapsulation interface should be
-	 * returned as third element of the array, otherwise either null should be
-	 * returned as third element, or array should contain only 2 elements.
-	 * 
-	 * @param methodId
-	 *            Authentication method selected by the server.
-	 * @param proxySocket
-	 *            Socket used to conect to the proxy.
-	 * @return Two or three element array containing Input/Output streams which
-	 *         should be used on this connection. Third argument is optional and
-	 *         should contain an instance of UDPEncapsulation. It should be
-	 *         provided if the authentication method used requires any
-	 *         encapsulation to be done on the datagrams.
-	 */
-	Object[] doSocksAuthentication(int methodId, java.net.Socket proxySocket)
-			throws java.io.IOException;
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/AuthenticationNone.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/AuthenticationNone.java
deleted file mode 100644
index e6821545..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/AuthenticationNone.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * SOCKS5 none authentication. Dummy class does almost nothing.
- */
-public class AuthenticationNone implements Authentication {
-
-	public Object[] doSocksAuthentication(final int methodId,
-			final java.net.Socket proxySocket) throws java.io.IOException {
-
-		if (methodId != 0) {
-			return null;
-		}
-
-		InputStream in = proxySocket.getInputStream();
-		OutputStream out = proxySocket.getOutputStream();
-		return new Object[] { in, out };
-	}
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/InetRange.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/InetRange.java
deleted file mode 100644
index fae13587..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/InetRange.java
+++ /dev/null
@@ -1,492 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-/**
- * Class InetRange provides the means of defining the range of inetaddresses.
- * It's used by Proxy class to store and look up addresses of machines, that
- * should be contacted directly rather then through the proxy.
- * <P>
- * InetRange provides several methods to add either standalone addresses, or
- * ranges (e.g. 100.200.300.0:100.200.300.255, which covers all addresses on on
- * someones local network). It also provides methods for checking wether given
- * address is in this range. Any number of ranges and standalone addresses can
- * be added to the range.
- */
-public class InetRange implements Cloneable {
-
-	Hashtable<String, Object[]> host_names;
-	Vector<Object[]> all;
-	Vector<String> end_names;
-
-	boolean useSeparateThread = true;
-
-	/**
-	 * Creates the empty range.
-	 */
-	public InetRange() {
-		all = new Vector<Object[]>();
-		host_names = new Hashtable<String, Object[]>();
-		end_names = new Vector<String>();
-	}
-
-	/**
-	 * Adds another host or range to this range. The String can be one of those:
-	 * <UL>
-	 * <li>Host name. eg.(Athena.myhost.com or 45.54.56.65)
-	 * 
-	 * <li>Range in the form .myhost.net.au <BR>
-	 * In which case anything that ends with .myhost.net.au will be considered
-	 * in the range.
-	 * 
-	 * <li>Range in the form ddd.ddd.ddd. <BR>
-	 * This will be treated as range ddd.ddd.ddd.0 to ddd.ddd.ddd.255. It is not
-	 * necessary to specify 3 first bytes you can use just one or two. For
-	 * example 130. will cover address between 130.0.0.0 and 13.255.255.255.
-	 * 
-	 * <li>Range in the form host_from[: \t\n\r\f]host_to. <br>
-	 * That is two hostnames or ips separated by either whitespace or colon.
-	 * </UL>
-	 */
-	public synchronized boolean add(final String s0) {
-		if (s0 == null) {
-			return false;
-		}
-
-		String s = s0.trim();
-		if (s.length() == 0) {
-			return false;
-		}
-
-		Object[] entry;
-
-		if (s.endsWith(".")) {
-			// thing like: 111.222.33.
-			// it is being treated as range 111.222.33.000 - 111.222.33.255
-
-			final int[] addr = ip2intarray(s);
-			long from, to;
-			from = to = 0;
-
-			if (addr == null) {
-				return false;
-			}
-			for (int i = 0; i < 4; i++) {
-				if (addr[i] >= 0) {
-					from += (((long) addr[i]) << 8 * (3 - i));
-				} else {
-					to = from;
-					while (i < 4) {
-						to += 255l << 8 * (3 - i++);
-					}
-					break;
-				}
-			}
-			entry = new Object[] { s, null, new Long(from), new Long(to) };
-			all.addElement(entry);
-
-		} else if (s.startsWith(".")) {
-			// Thing like: .myhost.com
-
-			end_names.addElement(s);
-			all.addElement(new Object[] { s, null, null, null });
-		} else {
-			final StringTokenizer tokens = new StringTokenizer(s, " \t\r\n\f:");
-			if (tokens.countTokens() > 1) {
-				entry = new Object[] { s, null, null, null };
-				resolve(entry, tokens.nextToken(), tokens.nextToken());
-				all.addElement(entry);
-			} else {
-				entry = new Object[] { s, null, null, null };
-				all.addElement(entry);
-				host_names.put(s, entry);
-				resolve(entry);
-			}
-
-		}
-
-		return true;
-	}
-
-	/**
-	 * Adds another ip for this range.
-	 * 
-	 * @param ip
-	 *            IP os the host which should be added to this range.
-	 */
-	public synchronized void add(final InetAddress ip) {
-		long from, to;
-		from = to = ip2long(ip);
-		all.addElement(new Object[] { ip.getHostName(), ip, new Long(from),
-				new Long(to) });
-	}
-
-	/**
-	 * Adds another range of ips for this range.Any host with ip address greater
-	 * than or equal to the address of from and smaller than or equal to the
-	 * address of to will be included in the range.
-	 * 
-	 * @param from
-	 *            IP from where range starts(including).
-	 * @param to
-	 *            IP where range ends(including).
-	 */
-	public synchronized void add(final InetAddress from, final InetAddress to) {
-		all.addElement(new Object[] {
-				from.getHostAddress() + ":" + to.getHostAddress(), null,
-				new Long(ip2long(from)), new Long(ip2long(to)) });
-	}
-
-	/**
-	 * Checks wether the givan host is in the range. Attempts to resolve host
-	 * name if required.
-	 * 
-	 * @param host
-	 *            Host name to check.
-	 * @return true If host is in the range, false otherwise.
-	 * @see InetRange#contains(String,boolean)
-	 */
-	public synchronized boolean contains(final String host) {
-		return contains(host, true);
-	}
-
-	/**
-	 * Checks wether the given host is in the range.
-	 * <P>
-	 * Algorithm: <BR>
-	 * <ol>
-	 * <li>Look up if the hostname is in the range (in the Hashtable).
-	 * <li>Check if it ends with one of the speciefied endings.
-	 * <li>Check if it is ip(eg.130.220.35.98). If it is check if it is in the
-	 * range.
-	 * <li>If attemptResolve is true, host is name, rather than ip, and all
-	 * previous attempts failed, try to resolve the hostname, and check wether
-	 * the ip associated with the host is in the range.It also repeats all
-	 * previos steps with the hostname obtained from InetAddress, but the name
-	 * is not allways the full name,it is quite likely to be the same. Well it
-	 * was on my machine.
-	 * </ol>
-	 * 
-	 * @param host
-	 *            Host name to check.
-	 * @param attemptResolve
-	 *            Wether to lookup ip address which corresponds to the host,if
-	 *            required.
-	 * @return true If host is in the range, false otherwise.
-	 */
-	public synchronized boolean contains(final String host0,
-			final boolean attemptResolve) {
-		if (all.size() == 0) {
-			return false; // Empty range
-		}
-
-		String host = host0.trim();
-		if (host.length() == 0) {
-			return false;
-		}
-
-		if (checkHost(host)) {
-			return true;
-		}
-		if (checkHostEnding(host)) {
-			return true;
-		}
-
-		final long l = host2long(host);
-		if (l >= 0) {
-			return contains(l);
-		}
-
-		if (!attemptResolve) {
-			return false;
-		}
-
-		try {
-			final InetAddress ip = InetAddress.getByName(host);
-			return contains(ip);
-		} catch (final UnknownHostException uhe) {
-
-		}
-
-		return false;
-	}
-
-	/**
-	 * Checks wether the given ip is in the range.
-	 * 
-	 * @param ip
-	 *            Address of the host to check.
-	 * @return true If host is in the range, false otherwise.
-	 */
-	public synchronized boolean contains(final InetAddress ip) {
-		if (checkHostEnding(ip.getHostName())) {
-			return true;
-		}
-		if (checkHost(ip.getHostName())) {
-			return true;
-		}
-		return contains(ip2long(ip));
-	}
-
-	/**
-	 * Get all entries in the range as strings. <BR>
-	 * These strings can be used to delete entries from the range with remove
-	 * function.
-	 * 
-	 * @return Array of entries as strings.
-	 * @see InetRange#remove(String)
-	 */
-	public synchronized String[] getAll() {
-		final int size = all.size();
-		Object entry[];
-		final String all_names[] = new String[size];
-
-		for (int i = 0; i < size; ++i) {
-			entry = all.elementAt(i);
-			all_names[i] = (String) entry[0];
-		}
-		return all_names;
-	}
-
-	/**
-	 * Removes an entry from this range.<BR>
-	 * 
-	 * @param s
-	 *            Entry to remove.
-	 * @return true if successfull.
-	 */
-	public synchronized boolean remove(final String s) {
-		final Enumeration<Object[]> enumx = all.elements();
-		while (enumx.hasMoreElements()) {
-			final Object[] entry = enumx.nextElement();
-			if (s.equals(entry[0])) {
-				all.removeElement(entry);
-				end_names.removeElement(s);
-				host_names.remove(s);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/** Get string representaion of this Range. */
-	public String toString() {
-		final String all[] = getAll();
-		if (all.length == 0) {
-			return "";
-		}
-
-		String s = all[0];
-		for (int i = 1; i < all.length; ++i) {
-			s += "; " + all[i];
-		}
-		return s;
-	}
-
-	/** Creates a clone of this Object */
-
-	@SuppressWarnings("unchecked")
-	public Object clone() {
-		final InetRange new_range = new InetRange();
-		new_range.all = (Vector<Object[]>) all.clone();
-		new_range.end_names = (Vector<String>) end_names.clone();
-		new_range.host_names = (Hashtable<String, Object[]>) host_names.clone();
-		return new_range;
-	}
-
-	// Private methods
-	// ///////////////
-	/**
-	 * Same as previous but used internally, to avoid unnecessary convertion of
-	 * IPs, when checking subranges
-	 */
-	private synchronized boolean contains(final long ip) {
-		final Enumeration<Object[]> enumx = all.elements();
-		while (enumx.hasMoreElements()) {
-			final Object[] obj = enumx.nextElement();
-			final Long from = obj[2] == null ? null : (Long) obj[2];
-			final Long to = obj[3] == null ? null : (Long) obj[3];
-			if ((from != null) && (from.longValue() <= ip)
-					&& (to.longValue() >= ip)) {
-				return true;
-			}
-
-		}
-		return false;
-	}
-
-	private boolean checkHost(final String host) {
-		return host_names.containsKey(host);
-	}
-
-	private boolean checkHostEnding(final String host) {
-		final Enumeration<String> enumx = end_names.elements();
-		while (enumx.hasMoreElements()) {
-			if (host.endsWith(enumx.nextElement())) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private void resolve(final Object[] entry) {
-		// First check if it's in the form ddd.ddd.ddd.ddd.
-		final long ip = host2long((String) entry[0]);
-		if (ip >= 0) {
-			entry[2] = entry[3] = new Long(ip);
-		} else {
-			final InetRangeResolver res = new InetRangeResolver(entry);
-			res.resolve(useSeparateThread);
-		}
-	}
-
-	private void resolve(final Object[] entry, final String from,
-			final String to) {
-		long f, t;
-		if (((f = host2long(from)) >= 0) && ((t = host2long(to)) >= 0)) {
-			entry[2] = new Long(f);
-			entry[3] = new Long(t);
-		} else {
-			final InetRangeResolver res = new InetRangeResolver(entry, from, to);
-			res.resolve(useSeparateThread);
-		}
-	}
-
-	// Class methods
-	// /////////////
-
-	// Converts ipv4 to long value(unsigned int)
-	// /////////////////////////////////////////
-	static long ip2long(final InetAddress ip) {
-		long l = 0;
-		final byte[] addr = ip.getAddress();
-
-		if (addr.length == 4) { // IPV4
-			for (int i = 0; i < 4; ++i) {
-				l += (((long) addr[i] & 0xFF) << 8 * (3 - i));
-			}
-		} else { // IPV6
-			return 0; // Have no idea how to deal with those
-		}
-		return l;
-	}
-
-	long host2long(final String host) {
-		long ip = 0;
-
-		// check if it's ddd.ddd.ddd.ddd
-		if (!Character.isDigit(host.charAt(0))) {
-			return -1;
-		}
-
-		final int[] addr = ip2intarray(host);
-		if (addr == null) {
-			return -1;
-		}
-
-		for (int i = 0; i < addr.length; ++i) {
-			ip += ((long) (addr[i] >= 0 ? addr[i] : 0)) << 8 * (3 - i);
-		}
-
-		return ip;
-	}
-
-	static int[] ip2intarray(final String host) {
-		final int[] address = { -1, -1, -1, -1 };
-		int i = 0;
-		final StringTokenizer tokens = new StringTokenizer(host, ".");
-		if (tokens.countTokens() > 4) {
-			return null;
-		}
-		while (tokens.hasMoreTokens()) {
-			try {
-				address[i++] = Integer.parseInt(tokens.nextToken()) & 0xFF;
-			} catch (final NumberFormatException nfe) {
-				return null;
-			}
-
-		}
-		return address;
-	}
-
-	/*
-	 * //* This was the test main function //**********************************
-	 * 
-	 * public static void main(String args[])throws UnknownHostException{ int i;
-	 * 
-	 * InetRange ir = new InetRange();
-	 * 
-	 * 
-	 * for(i=0;i<args.length;++i){ System.out.println("Adding:" + args[i]);
-	 * ir.add(args[i]); }
-	 * 
-	 * String host; java.io.DataInputStream din = new
-	 * java.io.DataInputStream(System.in); try{ host = din.readLine();
-	 * while(host!=null){ if(ir.contains(host)){
-	 * System.out.println("Range contains ip:"+host); }else{
-	 * System.out.println(host+" is not in the range"); } host = din.readLine();
-	 * } }catch(java.io.IOException io_ex){ io_ex.printStackTrace(); } }
-	 * ******************
-	 */
-
-}
-
-class InetRangeResolver implements Runnable {
-
-	Object[] entry;
-
-	String from;
-	String to;
-
-	InetRangeResolver(final Object[] entry) {
-		this.entry = entry;
-		from = null;
-		to = null;
-	}
-
-	InetRangeResolver(final Object[] entry, final String from, final String to) {
-		this.entry = entry;
-		this.from = from;
-		this.to = to;
-	}
-
-	public final void resolve() {
-		resolve(true);
-	}
-
-	public final void resolve(final boolean inSeparateThread) {
-		if (inSeparateThread) {
-			final Thread t = new Thread(this);
-			t.start();
-		} else {
-			run();
-		}
-
-	}
-
-	public void run() {
-		try {
-			if (from == null) {
-				final InetAddress ip = InetAddress.getByName((String) entry[0]);
-				entry[1] = ip;
-				final Long l = new Long(InetRange.ip2long(ip));
-				entry[2] = l;
-				entry[3] = l;
-			} else {
-				final InetAddress f = InetAddress.getByName(from);
-				final InetAddress t = InetAddress.getByName(to);
-				entry[2] = new Long(InetRange.ip2long(f));
-				entry[3] = new Long(InetRange.ip2long(t));
-
-			}
-		} catch (final UnknownHostException uhe) {
-			// System.err.println("Resolve failed for "+from+','+to+','+entry[0]);
-		}
-	}
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyMessage.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyMessage.java
deleted file mode 100644
index e7721a1a..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyMessage.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * Abstract class which describes SOCKS4/5 response/request.
- */
-public abstract class ProxyMessage {
-
-	/** Host as an IP address */
-	public InetAddress ip = null;
-
-	/** SOCKS version, or version of the response for SOCKS4 */
-	public int version;
-
-	/** Port field of the request/response */
-	public int port;
-
-	/** Request/response code as an int */
-	public int command;
-
-	/** Host as string. */
-	public String host = null;
-
-	/** User field for SOCKS4 request messages */
-	public String user = null;
-
-	ProxyMessage(int command, InetAddress ip, int port) {
-		this.command = command;
-		this.ip = ip;
-		this.port = port;
-	}
-
-	ProxyMessage() {
-	}
-
-	/**
-	 * Initialises Message from the stream. Reads server response from given
-	 * stream.
-	 * 
-	 * @param in
-	 *            Input stream to read response from.
-	 * @throws SocksException
-	 *             If server response code is not SOCKS_SUCCESS(0), or if any
-	 *             error with protocol occurs.
-	 * @throws IOException
-	 *             If any error happens with I/O.
-	 */
-	public abstract void read(InputStream in) throws SocksException,
-			IOException;
-
-	/**
-	 * Initialises Message from the stream. Reads server response or client
-	 * request from given stream.
-	 * 
-	 * @param in
-	 *            Input stream to read response from.
-	 * @param clinetMode
-	 *            If true read server response, else read client request.
-	 * @throws SocksException
-	 *             If server response code is not SOCKS_SUCCESS(0) and reading
-	 *             in client mode, or if any error with protocol occurs.
-	 * @throws IOException
-	 *             If any error happens with I/O.
-	 */
-	public abstract void read(InputStream in, boolean client_mode)
-			throws SocksException, IOException;
-
-	/**
-	 * Writes the message to the stream.
-	 * 
-	 * @param out
-	 *            Output stream to which message should be written.
-	 */
-	public abstract void write(OutputStream out) throws SocksException,
-			IOException;
-
-	/**
-	 * Get the Address field of this message as InetAddress object.
-	 * 
-	 * @return Host address or null, if one can't be determined.
-	 */
-	public InetAddress getInetAddress() throws UnknownHostException {
-		return ip;
-	}
-
-	/**
-	 * Get string representaion of this message.
-	 * 
-	 * @return string representation of this message.
-	 */
-	public String toString() {
-		return "Proxy Message:\n" + "Version:" + version + "\n" + "Command:"
-				+ command + "\n" + "IP:     " + ip + "\n" + "Port:   " + port
-				+ "\n" + "User:   " + user + "\n";
-	}
-
-	// Package methods
-	// ////////////////
-
-	static final String bytes2IPV4(byte[] addr, int offset) {
-		String hostName = "" + (addr[offset] & 0xFF);
-		for (int i = offset + 1; i < offset + 4; i++) {
-			hostName += "." + (addr[i] & 0xFF);
-		}
-		return hostName;
-	}
-
-	static final String bytes2IPV6(byte[] addr, int offset) {
-		// Have no idea how they look like!
-		return null;
-	}
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyServer.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyServer.java
deleted file mode 100644
index c8067e88..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyServer.java
+++ /dev/null
@@ -1,699 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.io.OutputStream;
-import java.io.PushbackInputStream;
-import java.net.ConnectException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.NoRouteToHostException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.nio.channels.SocketChannel;
-
-import android.annotation.SuppressLint;
-import android.net.VpnService;
-import android.util.Log;
-
-import com.runjva.sourceforge.jsocks.server.ServerAuthenticator;
-
-/**
- * SOCKS4 and SOCKS5 proxy, handles both protocols simultaniously. Implements
- * all SOCKS commands, including UDP relaying.
- * <p>
- * In order to use it you will need to implement ServerAuthenticator interface.
- * There is an implementation of this interface which does no authentication
- * ServerAuthenticatorNone, but it is very dangerous to use, as it will give
- * access to your local network to anybody in the world. One should never use
- * this authentication scheme unless one have pretty good reason to do so. There
- * is a couple of other authentication schemes in socks.server package.
- * 
- * @see socks.server.ServerAuthenticator
- */
-public class ProxyServer implements Runnable {
-
-	ServerAuthenticator auth;
-	ProxyMessage msg = null;
-
-	Socket sock = null, remote_sock = null;
-	ServerSocket ss = null;
-	UDPRelayServer relayServer = null;
-	InputStream in, remote_in;
-	OutputStream out, remote_out;
-
-	int mode;
-	static final int START_MODE = 0;
-	static final int ACCEPT_MODE = 1;
-	static final int PIPE_MODE = 2;
-	static final int ABORT_MODE = 3;
-
-	static final int BUF_SIZE = 8192;
-
-	Thread pipe_thread1, pipe_thread2;
-	long lastReadTime;
-
-	static int iddleTimeout = 180000; // 3 minutes
-	static int acceptTimeout = 180000; // 3 minutes
-
-	static SocksProxyBase proxy;
-
-	static VpnService vpnService;
-
-	static boolean DEBUG = false;
-	
-	// Public Constructors
-	// ///////////////////
-
-	/**
-	 * Creates a proxy server with given Authentication scheme.
-	 * 
-	 * @param auth
-	 *            Authentication scheme to be used.
-	 */
-	public ProxyServer(final ServerAuthenticator auth) {
-		this.auth = auth;
-	}
-
-	// Other constructors
-	// //////////////////
-
-	ProxyServer(final ServerAuthenticator auth, final Socket s) {
-		this.auth = auth;
-		this.sock = s;
-		this.mode = START_MODE;
-	}
-
-	// Public methods
-	// ///////////////
-
-	/**
-	 * Set proxy.
-	 * <p>
-	 * Allows Proxy chaining so that one Proxy server is connected to another
-	 * and so on. If proxy supports SOCKSv4, then only some SOCKSv5 requests can
-	 * be handled, UDP would not work, however CONNECT and BIND will be
-	 * translated.
-	 * 
-	 * @param p
-	 *            Proxy which should be used to handle user requests.
-	 */
-	public static void setProxy(final SocksProxyBase p) {
-		proxy = p;
-		// FIXME: Side effect.
-		UDPRelayServer.proxy = proxy;
-	}
-
-	public static void setVpnService (final VpnService v)
-	{
-		vpnService = v;
-	}
-	/**
-	 * Get proxy.
-	 * 
-	 * @return Proxy wich is used to handle user requests.
-	 */
-	public static SocksProxyBase getProxy() {
-		return proxy;
-	}
-
-	/**
-	 * Sets the timeout for connections, how long shoud server wait for data to
-	 * arrive before dropping the connection.<br>
-	 * Zero timeout implies infinity.<br>
-	 * Default timeout is 3 minutes.
-	 */
-	public static void setIddleTimeout(final int timeout) {
-		iddleTimeout = timeout;
-	}
-
-	/**
-	 * Sets the timeout for BIND command, how long the server should wait for
-	 * the incoming connection.<br>
-	 * Zero timeout implies infinity.<br>
-	 * Default timeout is 3 minutes.
-	 */
-	public static void setAcceptTimeout(final int timeout) {
-		acceptTimeout = timeout;
-	}
-
-	/**
-	 * Sets the timeout for UDPRelay server.<br>
-	 * Zero timeout implies infinity.<br>
-	 * Default timeout is 3 minutes.
-	 */
-	public static void setUDPTimeout(final int timeout) {
-		UDPRelayServer.setTimeout(timeout);
-	}
-
-	/**
-	 * Sets the size of the datagrams used in the UDPRelayServer.<br>
-	 * Default size is 64K, a bit more than maximum possible size of the
-	 * datagram.
-	 */
-	public static void setDatagramSize(final int size) {
-		UDPRelayServer.setDatagramSize(size);
-	}
-
-	/**
-	 * Start the Proxy server at given port.<br>
-	 * This methods blocks.
-	 */
-	public void start(final int port) {
-		start(port, 5, null);
-	}
-
-	/**
-	 * Create a server with the specified port, listen backlog, and local IP
-	 * address to bind to. The localIP argument can be used on a multi-homed
-	 * host for a ServerSocket that will only accept connect requests to one of
-	 * its addresses. If localIP is null, it will default accepting connections
-	 * on any/all local addresses. The port must be between 0 and 65535,
-	 * inclusive. <br>
-	 * This methods blocks.
-	 */
-	public void start(final int port, final int backlog,
-			final InetAddress localIP) {
-		try {
-			ss = new ServerSocket(port, backlog, localIP);
-			final String address = ss.getInetAddress().getHostAddress();
-			final int localPort = ss.getLocalPort();
-			debug("Starting SOCKS Proxy on: {}:{}", address, localPort);
-
-			while (true) {
-				final Socket s = ss.accept();
-				final String hostName = s.getInetAddress().getHostName();
-				final int port2 = s.getPort();
-				debug("Accepted from:{}:{}", hostName, port2);
-
-				final ProxyServer ps = new ProxyServer(auth, s);
-				(new Thread(ps)).start();
-			}
-		} catch (final Exception ioe) {
-			ioe.printStackTrace();
-		} finally {
-		}
-	}
-
-	/**
-	 * Stop server operation.It would be wise to interrupt thread running the
-	 * server afterwards.
-	 */
-	public void stop() {
-		try {
-			if (ss != null) {
-				ss.close();
-			}
-		} catch (final IOException ioe) {
-		}
-	}
-
-	// Runnable interface
-	// //////////////////
-	public void run() {
-		switch (mode) {
-		case START_MODE:
-			try {
-				startSession();
-			} catch (final IOException ioe) {
-				handleException(ioe);
-				// ioe.printStackTrace();
-			} finally {
-				abort();
-				if (auth != null) {
-					auth.endSession();
-				}
-				debug("Main thread(client->remote)stopped.");
-			}
-			break;
-		case ACCEPT_MODE:
-			try {
-				doAccept();
-				mode = PIPE_MODE;
-				pipe_thread1.interrupt(); // Tell other thread that connection
-				// have
-				// been accepted.
-				pipe(remote_in, out);
-			} catch (final IOException ioe) {
-				// log("Accept exception:"+ioe);
-				handleException(ioe);
-			} finally {
-				abort();
-				debug("Accept thread(remote->client) stopped");
-			}
-			break;
-		case PIPE_MODE:
-			try {
-				pipe(remote_in, out);
-			} catch (final IOException ioe) {
-			} finally {
-				abort();
-				debug("Support thread(remote->client) stopped");
-			}
-			break;
-		case ABORT_MODE:
-			break;
-		default:
-			debug("Unexpected MODE " + mode);
-		}
-	}
-
-	// Private methods
-	// ///////////////
-	private void startSession() throws IOException {
-		sock.setSoTimeout(iddleTimeout);
-
-		try {
-			auth = auth.startSession(sock);
-		} catch (final IOException ioe) {
-			debug("Auth throwed exception:", ioe);
-			auth = null;
-			return;
-		}
-
-		if (auth == null) { // Authentication failed
-			debug("Authentication failed");
-			return;
-		}
-
-		in = auth.getInputStream();
-		out = auth.getOutputStream();
-
-		msg = readMsg(in);
-		handleRequest(msg);
-	}
-
-	private void handleRequest(final ProxyMessage msg) throws IOException {
-		if (!auth.checkRequest(msg)) {
-			throw new SocksException(SocksProxyBase.SOCKS_FAILURE);
-		}
-
-		if (msg.ip == null) {
-			if (msg instanceof Socks5Message) {
-				msg.ip = InetAddress.getByName(msg.host);
-			} else {
-				throw new SocksException(SocksProxyBase.SOCKS_FAILURE);
-			}
-		}
-		log(msg);
-
-		switch (msg.command) {
-		case SocksProxyBase.SOCKS_CMD_CONNECT:
-			onConnect(msg);
-			break;
-		case SocksProxyBase.SOCKS_CMD_BIND:
-			onBind(msg);
-			break;
-		case SocksProxyBase.SOCKS_CMD_UDP_ASSOCIATE:
-			onUDP(msg);
-			break;
-		default:
-			throw new SocksException(SocksProxyBase.SOCKS_CMD_NOT_SUPPORTED);
-		}
-	}
-
-	private void handleException(final IOException ioe) {
-		// If we couldn't read the request, return;
-		if (msg == null) {
-			return;
-		}
-		// If have been aborted by other thread
-		if (mode == ABORT_MODE) {
-			return;
-		}
-		// If the request was successfully completed, but exception happened
-		// later
-		if (mode == PIPE_MODE) {
-			return;
-		}
-
-		int error_code = SocksProxyBase.SOCKS_FAILURE;
-
-		if (ioe instanceof SocksException) {
-			error_code = ((SocksException) ioe).errCode;
-		} else if (ioe instanceof NoRouteToHostException) {
-			error_code = SocksProxyBase.SOCKS_HOST_UNREACHABLE;
-		} else if (ioe instanceof ConnectException) {
-			error_code = SocksProxyBase.SOCKS_CONNECTION_REFUSED;
-		} else if (ioe instanceof InterruptedIOException) {
-			error_code = SocksProxyBase.SOCKS_TTL_EXPIRE;
-		}
-
-		if ((error_code > SocksProxyBase.SOCKS_ADDR_NOT_SUPPORTED)
-				|| (error_code < 0)) {
-			error_code = SocksProxyBase.SOCKS_FAILURE;
-		}
-
-		sendErrorMessage(error_code);
-	}
-
-	@SuppressLint("NewApi")
-	private void onConnect(final ProxyMessage msg) throws IOException {
-		Socket s;
-
-		if (proxy == null) {
-			
-			s = SocketChannel.open().socket();
-			if ((null != s) && (null != vpnService)) {
-			    vpnService.protect(s);
-			}
-			
-			s.connect(new InetSocketAddress(msg.ip,msg.port));
-			
-		} else {
-			s = new SocksSocket(proxy, msg.ip, msg.port);
-
-			if (vpnService != null)
-				vpnService.protect(s);
-		}
-
-			
-		debug("Connected to " + s.getInetAddress() + ":" + s.getPort());
-
-		ProxyMessage response = null;
-		final InetAddress localAddress = s.getLocalAddress();
-		final int localPort = s.getLocalPort();
-
-		if (msg instanceof Socks5Message) {
-			final int cmd = SocksProxyBase.SOCKS_SUCCESS;
-			response = new Socks5Message(cmd, localAddress, localPort);
-		} else {
-			final int cmd = Socks4Message.REPLY_OK;
-			response = new Socks4Message(cmd, localAddress, localPort);
-
-		}
-		response.write(out);
-		startPipe(s);
-	}
-
-	private void onBind(final ProxyMessage msg) throws IOException {
-		ProxyMessage response = null;
-
-		if (proxy == null) {
-			ss = new ServerSocket(0);
-		} else {
-			ss = new SocksServerSocket(proxy, msg.ip, msg.port);
-		}
-
-		ss.setSoTimeout(acceptTimeout);
-
-		final InetAddress inetAddress = ss.getInetAddress();
-		final int localPort = ss.getLocalPort();
-		debug("Trying accept on {}:{}", inetAddress, localPort);
-
-		if (msg.version == 5) {
-			final int cmd = SocksProxyBase.SOCKS_SUCCESS;
-			response = new Socks5Message(cmd, inetAddress, localPort);
-		} else {
-			final int cmd = Socks4Message.REPLY_OK;
-			response = new Socks4Message(cmd, inetAddress, localPort);
-		}
-		response.write(out);
-
-		mode = ACCEPT_MODE;
-
-		pipe_thread1 = Thread.currentThread();
-		pipe_thread2 = new Thread(this);
-		pipe_thread2.start();
-
-		// Make timeout infinit.
-		sock.setSoTimeout(0);
-		int eof = 0;
-
-		try {
-			while ((eof = in.read()) >= 0) {
-				if (mode != ACCEPT_MODE) {
-					if (mode != PIPE_MODE) {
-						return;// Accept failed
-					}
-
-					remote_out.write(eof);
-					break;
-				}
-			}
-		} catch (final EOFException e) {
-			debug("Connection closed while we were trying to accept", e);
-			return;
-		} catch (final InterruptedIOException e) {
-			debug("Interrupted by unsucessful accept thread", e);
-			if (mode != PIPE_MODE) {
-				return;
-			}
-		} finally {
-			// System.out.println("Finnaly!");
-		}
-
-		if (eof < 0) {
-			return;
-		}
-
-		// Do not restore timeout, instead timeout is set on the
-		// remote socket. It does not make any difference.
-
-		pipe(in, remote_out);
-	}
-
-	private void onUDP(final ProxyMessage msg) throws IOException {
-		if (msg.ip.getHostAddress().equals("0.0.0.0")) {
-			msg.ip = sock.getInetAddress();
-		}
-		debug("Creating UDP relay server for {}:{}", msg.ip, msg.port);
-
-		relayServer = new UDPRelayServer(msg.ip, msg.port,
-				Thread.currentThread(), sock, auth);
-
-		ProxyMessage response;
-
-		response = new Socks5Message(SocksProxyBase.SOCKS_SUCCESS,
-				relayServer.relayIP, relayServer.relayPort);
-
-		response.write(out);
-
-		relayServer.start();
-
-		// Make timeout infinit.
-		sock.setSoTimeout(0);
-		try {
-			while (in.read() >= 0) {
-				/* do nothing */;
-				// FIXME: Consider a slight delay here?
-			}
-		} catch (final EOFException eofe) {
-		}
-	}
-
-	// Private methods
-	// ////////////////
-
-	private void doAccept() throws IOException {
-		Socket s = null;
-		final long startTime = System.currentTimeMillis();
-
-		while (true) {
-			s = ss.accept();
-			if (s.getInetAddress().equals(msg.ip)) {
-				// got the connection from the right host
-				// Close listenning socket.
-				ss.close();
-				break;
-			} else if (ss instanceof SocksServerSocket) {
-				// We can't accept more then one connection
-				s.close();
-				ss.close();
-				throw new SocksException(SocksProxyBase.SOCKS_FAILURE);
-			} else {
-				if (acceptTimeout != 0) { // If timeout is not infinit
-					final long passed = System.currentTimeMillis() - startTime;
-					final int newTimeout = acceptTimeout - (int) passed;
-
-					if (newTimeout <= 0) {
-						throw new InterruptedIOException("newTimeout <= 0");
-					}
-					ss.setSoTimeout(newTimeout);
-				}
-				s.close(); // Drop all connections from other hosts
-			}
-		}
-
-		// Accepted connection
-		remote_sock = s;
-		remote_in = s.getInputStream();
-		remote_out = s.getOutputStream();
-
-		// Set timeout
-		remote_sock.setSoTimeout(iddleTimeout);
-
-		final InetAddress inetAddress = s.getInetAddress();
-		final int port = s.getPort();
-		debug("Accepted from {}:{}", s.getInetAddress(), port);
-
-		ProxyMessage response;
-
-		if (msg.version == 5) {
-			final int cmd = SocksProxyBase.SOCKS_SUCCESS;
-			response = new Socks5Message(cmd, inetAddress, port);
-		} else {
-			final int cmd = Socks4Message.REPLY_OK;
-			response = new Socks4Message(cmd, inetAddress, port);
-		}
-		response.write(out);
-	}
-
-	private ProxyMessage readMsg(final InputStream in) throws IOException {
-		PushbackInputStream push_in;
-		if (in instanceof PushbackInputStream) {
-			push_in = (PushbackInputStream) in;
-		} else {
-			push_in = new PushbackInputStream(in);
-		}
-
-		final int version = push_in.read();
-		push_in.unread(version);
-
-		ProxyMessage msg;
-
-		if (version == 5) {
-			msg = new Socks5Message(push_in, false);
-		} else if (version == 4) {
-			msg = new Socks4Message(push_in, false);
-		} else {
-			throw new SocksException(SocksProxyBase.SOCKS_FAILURE);
-		}
-		return msg;
-	}
-
-	private void startPipe(final Socket s) {
-		mode = PIPE_MODE;
-		remote_sock = s;
-		try {
-			remote_in = s.getInputStream();
-			remote_out = s.getOutputStream();
-			pipe_thread1 = Thread.currentThread();
-			pipe_thread2 = new Thread(this);
-			pipe_thread2.start();
-			pipe(in, remote_out);
-		} catch (final IOException ioe) {
-		}
-	}
-
-	private void sendErrorMessage(final int error_code) {
-		ProxyMessage err_msg;
-		if (msg instanceof Socks4Message) {
-			err_msg = new Socks4Message(Socks4Message.REPLY_REJECTED);
-		} else {
-			err_msg = new Socks5Message(error_code);
-		}
-		try {
-			err_msg.write(out);
-		} catch (final IOException ioe) {
-		}
-	}
-
-	private synchronized void abort() {
-		if (mode == ABORT_MODE) {
-			return;
-		}
-		mode = ABORT_MODE;
-		try {
-			debug("Aborting operation");
-			if (remote_sock != null) {
-				remote_sock.close();
-			}
-			if (sock != null) {
-				sock.close();
-			}
-			if (relayServer != null) {
-				relayServer.stop();
-			}
-			if (ss != null) {
-				ss.close();
-			}
-			if (pipe_thread1 != null) {
-				pipe_thread1.interrupt();
-			}
-			if (pipe_thread2 != null) {
-				pipe_thread2.interrupt();
-			}
-		} catch (final IOException ioe) {
-		}
-	}
-
-	static final void log(final ProxyMessage msg) {
-		debug("Request version: {}, Command: ", msg.version,
-				command2String(msg.command));
-
-		final String user = msg.version == 4 ? ", User:" + msg.user : "";
-		debug("IP:" + msg.ip + ", Port:" + msg.port + user);
-	}
-
-	private void pipe(final InputStream in, final OutputStream out)
-			throws IOException {
-		lastReadTime = System.currentTimeMillis();
-		final byte[] buf = new byte[BUF_SIZE];
-		int len = 0;
-		while (len >= 0) {
-			try {
-				if (len != 0) {
-					out.write(buf, 0, len);
-					out.flush();
-				}
-				len = in.read(buf);
-				lastReadTime = System.currentTimeMillis();
-			} catch (final InterruptedIOException iioe) {
-				if (iddleTimeout == 0) {
-					return;// Other thread interrupted us.
-				}
-				final long timeSinceRead = System.currentTimeMillis()
-						- lastReadTime;
-
-				if (timeSinceRead >= iddleTimeout - 1000) {
-					return;
-				}
-				len = 0;
-
-			}
-		}
-	}
-
-	static final String command_names[] = { "CONNECT", "BIND", "UDP_ASSOCIATE" };
-
-	static final String command2String(int cmd) {
-		if ((cmd > 0) && (cmd < 4)) {
-			return command_names[cmd - 1];
-		} else {
-			return "Unknown Command " + cmd;
-		}
-	}
-	
-	public static void debug (String msg)
-	{
-		if (DEBUG)
-			Log.d("Proxy",msg);
-	}
-	
-	public static void debug (String msg, String host, int port)
-	{
-		if (DEBUG)
-			debug (msg + ": " + host + ":" + port);
-	}
-	
-	public static void debug (String msg, Exception e)
-	{
-		if (DEBUG)
-			Log.e("Proxy",msg,e);
-	}
-	
-	public static void debug (String msg, InetAddress addr, int port)
-	{
-		if (DEBUG)
-			debug (msg + ": " + addr.getHostAddress() + ": " + port);
-	}
-	
-	public static void debug (String msg, int type, String log)
-	{
-		if (DEBUG)
-			debug (msg + " type:" + type + "=" + log);
-	}
-}
\ No newline at end of file
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Message.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Message.java
deleted file mode 100644
index 484ad969..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Message.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * SOCKS4 Reply/Request message.
- */
-
-class Socks4Message extends ProxyMessage {
-
-	private byte[] msgBytes;
-	private int msgLength;
-
-	/**
-	 * Server failed reply, cmd command for failed request
-	 */
-	public Socks4Message(final int cmd) {
-		super(cmd, null, 0);
-		this.user = null;
-
-		msgLength = 2;
-		msgBytes = new byte[2];
-
-		msgBytes[0] = (byte) 0;
-		msgBytes[1] = (byte) command;
-	}
-
-	/**
-	 * Server successfull reply
-	 */
-	public Socks4Message(final int cmd, final InetAddress ip, final int port) {
-		this(0, cmd, ip, port, null);
-	}
-
-	/**
-	 * Client request
-	 */
-	public Socks4Message(final int cmd, final InetAddress ip, final int port,
-			final String user) {
-		this(SOCKS_VERSION, cmd, ip, port, user);
-	}
-
-	/**
-	 * Most general constructor
-	 */
-	public Socks4Message(final int version, final int cmd,
-			final InetAddress ip, final int port, final String user) {
-
-		super(cmd, ip, port);
-		this.user = user;
-		this.version = version;
-
-		msgLength = user == null ? 8 : 9 + user.length();
-		msgBytes = new byte[msgLength];
-
-		msgBytes[0] = (byte) version;
-		msgBytes[1] = (byte) command;
-		msgBytes[2] = (byte) (port >> 8);
-		msgBytes[3] = (byte) port;
-
-		byte[] addr;
-
-		if (ip != null) {
-			addr = ip.getAddress();
-		} else {
-			addr = new byte[4];
-			addr[0] = addr[1] = addr[2] = addr[3] = 0;
-		}
-		System.arraycopy(addr, 0, msgBytes, 4, 4);
-
-		if (user != null) {
-			final byte[] buf = user.getBytes();
-			System.arraycopy(buf, 0, msgBytes, 8, buf.length);
-			msgBytes[msgBytes.length - 1] = 0;
-		}
-	}
-
-	/**
-	 * Initialise from the stream If clientMode is true attempts to read a
-	 * server response otherwise reads a client request see read for more detail
-	 */
-	public Socks4Message(final InputStream in, final boolean clientMode)
-			throws IOException {
-		msgBytes = null;
-		read(in, clientMode);
-	}
-
-	public void read(final InputStream in) throws IOException {
-		read(in, true);
-	}
-
-	public void read(final InputStream in, final boolean clientMode)
-			throws IOException {
-		final DataInputStream d_in = new DataInputStream(in);
-		version = d_in.readUnsignedByte();
-		command = d_in.readUnsignedByte();
-		if (clientMode && (command != REPLY_OK)) {
-			String errMsg;
-			// FIXME: Range should be replaced with cases.
-			if ((command > REPLY_OK) && (command < REPLY_BAD_IDENTD)) {
-				errMsg = replyMessage[command - REPLY_OK];
-			} else {
-				errMsg = "Unknown Reply Code";
-			}
-			throw new SocksException(command, errMsg);
-		}
-		port = d_in.readUnsignedShort();
-		final byte[] addr = new byte[4];
-		d_in.readFully(addr);
-		ip = bytes2IP(addr);
-		host = ip.getHostName();
-		if (!clientMode) {
-			int b = in.read();
-			// FIXME: Hope there are no idiots with user name bigger than this
-			final byte[] userBytes = new byte[256];
-			int i = 0;
-			for (i = 0; (i < userBytes.length) && (b > 0); ++i) {
-				userBytes[i] = (byte) b;
-				b = in.read();
-			}
-			user = new String(userBytes, 0, i);
-		}
-	}
-
-	public void write(final OutputStream out) throws IOException {
-		if (msgBytes == null) {
-			final Socks4Message msg;
-			msg = new Socks4Message(version, command, ip, port, user);
-			msgBytes = msg.msgBytes;
-			msgLength = msg.msgLength;
-		}
-		out.write(msgBytes);
-	}
-
-	// Class methods
-	static InetAddress bytes2IP(final byte[] addr) {
-		final String s = bytes2IPV4(addr, 0);
-		try {
-			return InetAddress.getByName(s);
-		} catch (final UnknownHostException uh_ex) {
-			return null;
-		}
-	}
-
-	// Constants
-
-	static final String[] replyMessage = { "Request Granted",
-			"Request Rejected or Failed",
-			"Failed request, can't connect to Identd",
-			"Failed request, bad user name" };
-
-	static final int SOCKS_VERSION = 4;
-
-	public final static int REQUEST_CONNECT = 1;
-	public final static int REQUEST_BIND = 2;
-
-	public final static int REPLY_OK = 90;
-	public final static int REPLY_REJECTED = 91;
-	public final static int REPLY_NO_CONNECT = 92;
-	public final static int REPLY_BAD_IDENTD = 93;
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Proxy.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Proxy.java
deleted file mode 100644
index 5850b5e2..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Proxy.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * Proxy which describes SOCKS4 proxy.
- */
-
-public class Socks4Proxy extends SocksProxyBase implements Cloneable {
-
-	// Data members
-	String user;
-
-	// Public Constructors
-	// ====================
-
-	/**
-	 * Creates the SOCKS4 proxy
-	 * 
-	 * @param p
-	 *            Proxy to use to connect to this proxy, allows proxy chaining.
-	 * @param proxyHost
-	 *            Address of the proxy server.
-	 * @param proxyPort
-	 *            Port of the proxy server
-	 * @param user
-	 *            User name to use for identification purposes.
-	 * @throws UnknownHostException
-	 *             If proxyHost can't be resolved.
-	 */
-	public Socks4Proxy(SocksProxyBase p, String proxyHost, int proxyPort,
-			String user) throws UnknownHostException {
-		super(p, proxyHost, proxyPort);
-		this.user = new String(user);
-		version = 4;
-	}
-
-	/**
-	 * Creates the SOCKS4 proxy
-	 * 
-	 * @param proxyHost
-	 *            Address of the proxy server.
-	 * @param proxyPort
-	 *            Port of the proxy server
-	 * @param user
-	 *            User name to use for identification purposes.
-	 * @throws UnknownHostException
-	 *             If proxyHost can't be resolved.
-	 */
-	public Socks4Proxy(String proxyHost, int proxyPort, String user)
-			throws UnknownHostException {
-		this(null, proxyHost, proxyPort, user);
-	}
-
-	/**
-	 * Creates the SOCKS4 proxy
-	 * 
-	 * @param p
-	 *            Proxy to use to connect to this proxy, allows proxy chaining.
-	 * @param proxyIP
-	 *            Address of the proxy server.
-	 * @param proxyPort
-	 *            Port of the proxy server
-	 * @param user
-	 *            User name to use for identification purposes.
-	 */
-	public Socks4Proxy(SocksProxyBase p, InetAddress proxyIP, int proxyPort,
-			String user) {
-		super(p, proxyIP, proxyPort);
-		this.user = new String(user);
-		version = 4;
-	}
-
-	/**
-	 * Creates the SOCKS4 proxy
-	 * 
-	 * @param proxyIP
-	 *            Address of the proxy server.
-	 * @param proxyPort
-	 *            Port of the proxy server
-	 * @param user
-	 *            User name to use for identification purposes.
-	 */
-	public Socks4Proxy(InetAddress proxyIP, int proxyPort, String user) {
-		this(null, proxyIP, proxyPort, user);
-	}
-
-	// Public instance methods
-	// ========================
-
-	/**
-	 * Creates a clone of this proxy. Changes made to the clone should not
-	 * affect this object.
-	 */
-	public Object clone() {
-		final Socks4Proxy newProxy = new Socks4Proxy(proxyIP, proxyPort, user);
-		newProxy.directHosts = (InetRange) directHosts.clone();
-		newProxy.chainProxy = chainProxy;
-		return newProxy;
-	}
-
-	// Public Static(Class) Methods
-	// ==============================
-
-	// Protected Methods
-	// =================
-
-	protected SocksProxyBase copy() {
-		final Socks4Proxy copy = new Socks4Proxy(proxyIP, proxyPort, user);
-		copy.directHosts = this.directHosts;
-		copy.chainProxy = chainProxy;
-		return copy;
-	}
-
-	protected ProxyMessage formMessage(int cmd, InetAddress ip, int port) {
-		switch (cmd) {
-		case SOCKS_CMD_CONNECT:
-			cmd = Socks4Message.REQUEST_CONNECT;
-			break;
-		case SOCKS_CMD_BIND:
-			cmd = Socks4Message.REQUEST_BIND;
-			break;
-		default:
-			return null;
-		}
-		return new Socks4Message(cmd, ip, port, user);
-	}
-
-	protected ProxyMessage formMessage(int cmd, String host, int port)
-			throws UnknownHostException {
-
-		return formMessage(cmd, InetAddress.getByName(host), port);
-	}
-
-	protected ProxyMessage formMessage(InputStream in) throws SocksException,
-			IOException {
-
-		return new Socks4Message(in, true);
-	}
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5DatagramSocket.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5DatagramSocket.java
deleted file mode 100644
index 114d5906..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5DatagramSocket.java
+++ /dev/null
@@ -1,480 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-
-/**
- * Datagram socket to interract through the firewall.<BR>
- * Can be used same way as the normal DatagramSocket. One should be carefull
- * though with the datagram sizes used, as additional data is present in both
- * incomming and outgoing datagrams.
- * <p>
- * SOCKS5 protocol allows to send host address as either:
- * <ul>
- * <li>IPV4, normal 4 byte address. (10 bytes header size)
- * <li>IPV6, version 6 ip address (not supported by Java as for now). 22 bytes
- * header size.
- * <li>Host name,(7+length of the host name bytes header size).
- * </ul>
- * As with other Socks equivalents, direct addresses are handled transparently,
- * that is data will be send directly when required by the proxy settings.
- * <p>
- * <b>NOTE:</b><br>
- * Unlike other SOCKS Sockets, it <b>does not</b> support proxy chaining, and
- * will throw an exception if proxy has a chain proxy attached. The reason for
- * that is not my laziness, but rather the restrictions of the SOCKSv5 protocol.
- * Basicaly SOCKSv5 proxy server, needs to know from which host:port datagrams
- * will be send for association, and returns address to which datagrams should
- * be send by the client, but it does not inform client from which host:port it
- * is going to send datagrams, in fact there is even no guarantee they will be
- * send at all and from the same address each time.
- */
-public class Socks5DatagramSocket extends DatagramSocket {
-
-	InetAddress relayIP;
-	int relayPort;
-	Socks5Proxy proxy;
-	private boolean server_mode = false;
-	UDPEncapsulation encapsulation;
-	
-	/**
-	 * Construct Datagram socket for communication over SOCKS5 proxy server.
-	 * This constructor uses default proxy, the one set with
-	 * Proxy.setDefaultProxy() method. If default proxy is not set or it is set
-	 * to version4 proxy, which does not support datagram forwarding, throws
-	 * SocksException.
-	 */
-	public Socks5DatagramSocket() throws SocksException, IOException {
-		this(SocksProxyBase.defaultProxy, 0, null);
-	}
-
-	/**
-	 * Construct Datagram socket for communication over SOCKS5 proxy server. And
-	 * binds it to the specified local port. This constructor uses default
-	 * proxy, the one set with Proxy.setDefaultProxy() method. If default proxy
-	 * is not set or it is set to version4 proxy, which does not support
-	 * datagram forwarding, throws SocksException.
-	 */
-	public Socks5DatagramSocket(int port) throws SocksException, IOException {
-		this(SocksProxyBase.defaultProxy, port, null);
-	}
-
-	/**
-	 * Construct Datagram socket for communication over SOCKS5 proxy server. And
-	 * binds it to the specified local port and address. This constructor uses
-	 * default proxy, the one set with Proxy.setDefaultProxy() method. If
-	 * default proxy is not set or it is set to version4 proxy, which does not
-	 * support datagram forwarding, throws SocksException.
-	 */
-	public Socks5DatagramSocket(int port, InetAddress ip)
-			throws SocksException, IOException {
-		this(SocksProxyBase.defaultProxy, port, ip);
-	}
-
-	/**
-	 * Constructs datagram socket for communication over specified proxy. And
-	 * binds it to the given local address and port. Address of null and port of
-	 * 0, signify any availabale port/address. Might throw SocksException, if:
-	 * <ol>
-	 * <li>Given version of proxy does not support UDP_ASSOCIATE.
-	 * <li>Proxy can't be reached.
-	 * <li>Authorization fails.
-	 * <li>Proxy does not want to perform udp forwarding, for any reason.
-	 * </ol>
-	 * Might throw IOException if binding datagram socket to given address/port
-	 * fails. See java.net.DatagramSocket for more details.
-	 */
-	public Socks5DatagramSocket(SocksProxyBase p, int port, InetAddress ip)
-			throws SocksException, IOException {
-
-		super(port, ip);
-
-		if (p == null) {
-			throw new SocksException(SocksProxyBase.SOCKS_NO_PROXY);
-		}
-
-		if (!(p instanceof Socks5Proxy)) {
-			final String s = "Datagram Socket needs Proxy version 5";
-			throw new SocksException(-1, s);
-		}
-
-		if (p.chainProxy != null) {
-			final String s = "Datagram Sockets do not support proxy chaining.";
-			throw new SocksException(SocksProxyBase.SOCKS_JUST_ERROR, s);
-		}
-
-		proxy = (Socks5Proxy) p.copy();
-
-		final ProxyMessage msg = proxy.udpAssociate(super.getLocalAddress(),
-				super.getLocalPort());
-
-		relayIP = msg.ip;
-		if (relayIP.getHostAddress().equals("0.0.0.0")) {
-			// FIXME: What happens here?
-			relayIP = proxy.proxyIP;
-		}
-		relayPort = msg.port;
-
-		encapsulation = proxy.udp_encapsulation;
-
-		//log.debug("Datagram Socket:{}:{}", getLocalAddress(), getLocalPort());
-		//log.debug("Socks5Datagram: {}:{}", relayIP, relayPort);
-	}
-
-	/**
-	 * Used by UDPRelayServer.
-	 */
-	Socks5DatagramSocket(boolean server_mode, UDPEncapsulation encapsulation,
-			InetAddress relayIP, int relayPort) throws IOException {
-		super();
-		this.server_mode = server_mode;
-		this.relayIP = relayIP;
-		this.relayPort = relayPort;
-		this.encapsulation = encapsulation;
-		this.proxy = null;
-	}
-
-	/**
-	 * Sends the Datagram either through the proxy or directly depending on
-	 * current proxy settings and destination address. <BR>
-	 * 
-	 * <B> NOTE: </B> DatagramPacket size should be at least 10 bytes less than
-	 * the systems limit.
-	 * 
-	 * <P>
-	 * See documentation on java.net.DatagramSocket for full details on how to
-	 * use this method.
-	 * 
-	 * @param dp
-	 *            Datagram to send.
-	 * @throws IOException
-	 *             If error happens with I/O.
-	 */
-	public void send(DatagramPacket dp) throws IOException {
-		// If the host should be accessed directly, send it as is.
-		if (!server_mode && proxy.isDirect(dp.getAddress())) {
-			super.send(dp);
-			//log.debug("Sending datagram packet directly:");
-			return;
-		}
-
-		final byte[] head = formHeader(dp.getAddress(), dp.getPort());
-		byte[] buf = new byte[head.length + dp.getLength()];
-		final byte[] data = dp.getData();
-
-		// Merge head and data
-		System.arraycopy(head, 0, buf, 0, head.length);
-		// System.arraycopy(data,dp.getOffset(),buf,head.length,dp.getLength());
-		System.arraycopy(data, 0, buf, head.length, dp.getLength());
-
-		if (encapsulation != null) {
-			buf = encapsulation.udpEncapsulate(buf, true);
-		}
-
-		super.send(new DatagramPacket(buf, buf.length, relayIP, relayPort));
-	}
-
-	/**
-	 * This method allows to send datagram packets with address type DOMAINNAME.
-	 * SOCKS5 allows to specify host as names rather than ip addresses.Using
-	 * this method one can send udp datagrams through the proxy, without having
-	 * to know the ip address of the destination host.
-	 * <p>
-	 * If proxy specified for that socket has an option resolveAddrLocally set
-	 * to true host will be resolved, and the datagram will be send with address
-	 * type IPV4, if resolve fails, UnknownHostException is thrown.
-	 * 
-	 * @param dp
-	 *            Datagram to send, it should contain valid port and data
-	 * @param host
-	 *            Host name to which datagram should be send.
-	 * @throws IOException
-	 *             If error happens with I/O, or the host can't be resolved when
-	 *             proxy settings say that hosts should be resolved locally.
-	 * @see Socks5Proxy#resolveAddrLocally(boolean)
-	 */
-	public void send(DatagramPacket dp, String host) throws IOException {
-		if (proxy.isDirect(host)) {
-			dp.setAddress(InetAddress.getByName(host));
-			super.send(dp);
-			return;
-		}
-
-		if ((proxy).resolveAddrLocally) {
-			dp.setAddress(InetAddress.getByName(host));
-		}
-
-		final byte[] head = formHeader(host, dp.getPort());
-		byte[] buf = new byte[head.length + dp.getLength()];
-		final byte[] data = dp.getData();
-		// Merge head and data
-		System.arraycopy(head, 0, buf, 0, head.length);
-		// System.arraycopy(data,dp.getOffset(),buf,head.length,dp.getLength());
-		System.arraycopy(data, 0, buf, head.length, dp.getLength());
-
-		if (encapsulation != null) {
-			buf = encapsulation.udpEncapsulate(buf, true);
-		}
-
-		super.send(new DatagramPacket(buf, buf.length, relayIP, relayPort));
-	}
-
-	/**
-	 * Receives udp packet. If packet have arrived from the proxy relay server,
-	 * it is processed and address and port of the packet are set to the address
-	 * and port of sending host.<BR>
-	 * If the packet arrived from anywhere else it is not changed.<br>
-	 * <B> NOTE: </B> DatagramPacket size should be at least 10 bytes bigger
-	 * than the largest packet you expect (this is for IPV4 addresses). For
-	 * hostnames and IPV6 it is even more.
-	 * 
-	 * @param dp
-	 *            Datagram in which all relevent information will be copied.
-	 */
-	public void receive(DatagramPacket dp) throws IOException {
-		super.receive(dp);
-
-		if (server_mode) {
-			// Drop all datagrams not from relayIP/relayPort
-			final int init_length = dp.getLength();
-			final int initTimeout = getSoTimeout();
-			final long startTime = System.currentTimeMillis();
-
-			while (!relayIP.equals(dp.getAddress())
-					|| (relayPort != dp.getPort())) {
-
-				// Restore datagram size
-				dp.setLength(init_length);
-
-				// If there is a non-infinit timeout on this socket
-				// Make sure that it happens no matter how often unexpected
-				// packets arrive.
-				if (initTimeout != 0) {
-					final long passed = System.currentTimeMillis() - startTime;
-					final int newTimeout = initTimeout - (int) passed;
-
-					if (newTimeout <= 0) {
-						throw new InterruptedIOException(
-								"In Socks5DatagramSocket->receive()");
-					}
-					setSoTimeout(newTimeout);
-				}
-
-				super.receive(dp);
-			}
-
-			// Restore timeout settings
-			if (initTimeout != 0) {
-				setSoTimeout(initTimeout);
-			}
-
-		} else if (!relayIP.equals(dp.getAddress())
-				|| (relayPort != dp.getPort())) {
-			return; // Recieved direct packet
-			// If the datagram is not from the relay server, return it it as is.
-		}
-
-		byte[] data;
-		data = dp.getData();
-
-		if (encapsulation != null) {
-			data = encapsulation.udpEncapsulate(data, false);
-		}
-
-		// FIXME: What is this?
-		final int offset = 0; // Java 1.1
-		// int offset = dp.getOffset(); //Java 1.2
-
-		final ByteArrayInputStream bIn = new ByteArrayInputStream(data, offset,
-				dp.getLength());
-
-		final ProxyMessage msg = new Socks5Message(bIn);
-		dp.setPort(msg.port);
-		dp.setAddress(msg.getInetAddress());
-
-		// what wasn't read by the Message is the data
-		final int data_length = bIn.available();
-		// Shift data to the left
-		System.arraycopy(data, offset + dp.getLength() - data_length, data,
-				offset, data_length);
-
-		dp.setLength(data_length);
-	}
-
-	/**
-	 * Returns port assigned by the proxy, to which datagrams are relayed. It is
-	 * not the same port to which other party should send datagrams.
-	 * 
-	 * @return Port assigned by socks server to which datagrams are send for
-	 *         association.
-	 */
-	public int getLocalPort() {
-		if (server_mode) {
-			return super.getLocalPort();
-		}
-		return relayPort;
-	}
-
-	/**
-	 * Address assigned by the proxy, to which datagrams are send for relay. It
-	 * is not necesseraly the same address, to which other party should send
-	 * datagrams.
-	 * 
-	 * @return Address to which datagrams are send for association.
-	 */
-	public InetAddress getLocalAddress() {
-		if (server_mode) {
-			return super.getLocalAddress();
-		}
-		return relayIP;
-	}
-
-	/**
-	 * Closes datagram socket, and proxy connection.
-	 */
-	public void close() {
-		if (!server_mode) {
-			proxy.endSession();
-		}
-		super.close();
-	}
-
-	/**
-	 * This method checks wether proxy still runs udp forwarding service for
-	 * this socket.
-	 * <p>
-	 * This methods checks wether the primary connection to proxy server is
-	 * active. If it is, chances are that proxy continues to forward datagrams
-	 * being send from this socket. If it was closed, most likely datagrams are
-	 * no longer being forwarded by the server.
-	 * <p>
-	 * Proxy might decide to stop forwarding datagrams, in which case it should
-	 * close primary connection. This method allows to check, wether this have
-	 * been done.
-	 * <p>
-	 * You can specify timeout for which we should be checking EOF condition on
-	 * the primary connection. Timeout is in milliseconds. Specifying 0 as
-	 * timeout implies infinity, in which case method will block, until
-	 * connection to proxy is closed or an error happens, and then return false.
-	 * <p>
-	 * One possible scenario is to call isProxyactive(0) in separate thread, and
-	 * once it returned notify other threads about this event.
-	 * 
-	 * @param timeout
-	 *            For how long this method should block, before returning.
-	 * @return true if connection to proxy is active, false if eof or error
-	 *         condition have been encountered on the connection.
-	 */
-	public boolean isProxyAlive(int timeout) {
-		if (server_mode) {
-			return false;
-		}
-		if (proxy != null) {
-			try {
-				proxy.proxySocket.setSoTimeout(timeout);
-
-				final int eof = proxy.in.read();
-				if (eof < 0) {
-					return false; // EOF encountered.
-				} else {
-					//log.warn("This really should not happen");
-					return true; // This really should not happen
-				}
-
-			} catch (final InterruptedIOException iioe) {
-				return true; // read timed out.
-			} catch (final IOException ioe) {
-				return false;
-			}
-		}
-		return false;
-	}
-
-	// PRIVATE METHODS
-	// ////////////////
-
-	private byte[] formHeader(InetAddress ip, int port) {
-		final Socks5Message request = new Socks5Message(0, ip, port);
-		request.data[0] = 0;
-		return request.data;
-	}
-
-	private byte[] formHeader(String host, int port) {
-		final Socks5Message request = new Socks5Message(0, host, port);
-		request.data[0] = 0;
-		return request.data;
-	}
-
-	/*
-	 * ======================================================================
-	 * 
-	 * //Mainly Test functions //////////////////////
-	 * 
-	 * private String bytes2String(byte[] b){ String s=""; char[] hex_digit = {
-	 * '0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F'};
-	 * for(int i=0;i<b.length;++i){ int i1 = (b[i] & 0xF0) >> 4; int i2 = b[i] &
-	 * 0xF; s+=hex_digit[i1]; s+=hex_digit[i2]; s+=" "; } return s; } private
-	 * static final void debug(String s){ if(DEBUG) System.out.print(s); }
-	 * 
-	 * private static final boolean DEBUG = true;
-	 * 
-	 * 
-	 * public static void usage(){ System.err.print(
-	 * "Usage: java Socks.SocksDatagramSocket host port [socksHost socksPort]\n"
-	 * ); }
-	 * 
-	 * static final int defaultProxyPort = 1080; //Default Port static final
-	 * String defaultProxyHost = "www-proxy"; //Default proxy
-	 * 
-	 * public static void main(String args[]){ int port; String host; int
-	 * proxyPort; String proxyHost; InetAddress ip;
-	 * 
-	 * if(args.length > 1 && args.length < 5){ try{
-	 * 
-	 * host = args[0]; port = Integer.parseInt(args[1]);
-	 * 
-	 * proxyPort =(args.length > 3)? Integer.parseInt(args[3]) :
-	 * defaultProxyPort;
-	 * 
-	 * host = args[0]; ip = InetAddress.getByName(host);
-	 * 
-	 * proxyHost =(args.length > 2)? args[2] : defaultProxyHost;
-	 * 
-	 * Proxy.setDefaultProxy(proxyHost,proxyPort); Proxy p =
-	 * Proxy.getDefaultProxy(); p.addDirect("lux");
-	 * 
-	 * 
-	 * DatagramSocket ds = new Socks5DatagramSocket();
-	 * 
-	 * 
-	 * BufferedReader in = new BufferedReader( new
-	 * InputStreamReader(System.in)); String s;
-	 * 
-	 * System.out.print("Enter line:"); s = in.readLine();
-	 * 
-	 * while(s != null){ byte[] data = (s+"\r\n").getBytes(); DatagramPacket dp
-	 * = new DatagramPacket(data,0,data.length, ip,port);
-	 * System.out.println("Sending to: "+ip+":"+port); ds.send(dp); dp = new
-	 * DatagramPacket(new byte[1024],1024);
-	 * 
-	 * System.out.println("Trying to recieve on port:"+ ds.getLocalPort());
-	 * ds.receive(dp); System.out.print("Recieved:\n"+
-	 * "From:"+dp.getAddress()+":"+dp.getPort()+ "\n\n"+ new
-	 * String(dp.getData(),dp.getOffset(),dp.getLength())+"\n" );
-	 * System.out.print("Enter line:"); s = in.readLine();
-	 * 
-	 * } ds.close(); System.exit(1);
-	 * 
-	 * }catch(SocksException s_ex){ System.err.println("SocksException:"+s_ex);
-	 * s_ex.printStackTrace(); System.exit(1); }catch(IOException io_ex){
-	 * io_ex.printStackTrace(); System.exit(1); }catch(NumberFormatException
-	 * num_ex){ usage(); num_ex.printStackTrace(); System.exit(1); }
-	 * 
-	 * }else{ usage(); } }
-	 */
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Message.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Message.java
deleted file mode 100644
index 4d4b06d0..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Message.java
+++ /dev/null
@@ -1,325 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * SOCKS5 request/response message.
- */
-
-class Socks5Message extends ProxyMessage {
-	/** Address type of given message */
-	public int addrType;
-
-	byte[] data;
-
-	/**
-	 * Server error response.
-	 * 
-	 * @param cmd
-	 *            Error code.
-	 */
-	public Socks5Message(int cmd) {
-		super(cmd, null, 0);
-		data = new byte[3];
-		data[0] = SOCKS_VERSION; // Version.
-		data[1] = (byte) cmd; // Reply code for some kind of failure.
-		data[2] = 0; // Reserved byte.
-	}
-
-	/**
-	 * Construct client request or server response.
-	 * 
-	 * @param cmd
-	 *            - Request/Response code.
-	 * @param ip
-	 *            - IP field.
-	 * @paarm port - port field.
-	 */
-	public Socks5Message(int cmd, InetAddress ip, int port) {
-		super(cmd, ip, port);
-
-		if (ip == null) {
-			this.host = "0.0.0.0";
-		} else {
-			this.host = ip.getHostName();
-		}
-
-		this.version = SOCKS_VERSION;
-
-		byte[] addr;
-
-		if (ip == null) {
-			addr = new byte[4];
-			addr[0] = addr[1] = addr[2] = addr[3] = 0;
-		} else {
-			addr = ip.getAddress();
-		}
-
-		if (addr.length == 4) {
-			addrType = SOCKS_ATYP_IPV4;
-		} else {
-			addrType = SOCKS_ATYP_IPV6;
-		}
-
-		data = new byte[6 + addr.length];
-		data[0] = (byte) SOCKS_VERSION; // Version
-		data[1] = (byte) command; // Command
-		data[2] = (byte) 0; // Reserved byte
-		data[3] = (byte) addrType; // Address type
-
-		// Put Address
-		System.arraycopy(addr, 0, data, 4, addr.length);
-		// Put port
-		data[data.length - 2] = (byte) (port >> 8);
-		data[data.length - 1] = (byte) (port);
-	}
-
-	/**
-	 * Construct client request or server response.
-	 * 
-	 * @param cmd
-	 *            - Request/Response code.
-	 * @param hostName
-	 *            - IP field as hostName, uses ADDR_TYPE of HOSTNAME.
-	 * @paarm port - port field.
-	 */
-	public Socks5Message(int cmd, String hostName, int port) {
-		super(cmd, null, port);
-		this.host = hostName;
-		this.version = SOCKS_VERSION;
-
-		//log.debug("Doing ATYP_DOMAINNAME");
-
-		addrType = SOCKS_ATYP_DOMAINNAME;
-		final byte addr[] = hostName.getBytes();
-
-		data = new byte[7 + addr.length];
-		data[0] = (byte) SOCKS_VERSION; // Version
-		data[1] = (byte) command; // Command
-		data[2] = (byte) 0; // Reserved byte
-		data[3] = (byte) SOCKS_ATYP_DOMAINNAME; // Address type
-		data[4] = (byte) addr.length; // Length of the address
-
-		// Put Address
-		System.arraycopy(addr, 0, data, 5, addr.length);
-		// Put port
-		data[data.length - 2] = (byte) (port >> 8);
-		data[data.length - 1] = (byte) (port);
-	}
-
-	/**
-	 * Initialises Message from the stream. Reads server response from given
-	 * stream.
-	 * 
-	 * @param in
-	 *            Input stream to read response from.
-	 * @throws SocksException
-	 *             If server response code is not SOCKS_SUCCESS(0), or if any
-	 *             error with protocol occurs.
-	 * @throws IOException
-	 *             If any error happens with I/O.
-	 */
-	public Socks5Message(InputStream in) throws SocksException, IOException {
-		this(in, true);
-	}
-
-	/**
-	 * Initialises Message from the stream. Reads server response or client
-	 * request from given stream.
-	 * 
-	 * @param in
-	 *            Input stream to read response from.
-	 * @param clinetMode
-	 *            If true read server response, else read client request.
-	 * @throws SocksException
-	 *             If server response code is not SOCKS_SUCCESS(0) and reading
-	 *             in client mode, or if any error with protocol occurs.
-	 * @throws IOException
-	 *             If any error happens with I/O.
-	 */
-	public Socks5Message(InputStream in, boolean clientMode)
-			throws SocksException, IOException {
-
-		read(in, clientMode);
-	}
-
-	/**
-	 * Initialises Message from the stream. Reads server response from given
-	 * stream.
-	 * 
-	 * @param in
-	 *            Input stream to read response from.
-	 * @throws SocksException
-	 *             If server response code is not SOCKS_SUCCESS(0), or if any
-	 *             error with protocol occurs.
-	 * @throws IOException
-	 *             If any error happens with I/O.
-	 */
-	public void read(InputStream in) throws SocksException, IOException {
-		read(in, true);
-	}
-
-	/**
-	 * Initialises Message from the stream. Reads server response or client
-	 * request from given stream.
-	 * 
-	 * @param in
-	 *            Input stream to read response from.
-	 * @param clinetMode
-	 *            If true read server response, else read client request.
-	 * @throws SocksException
-	 *             If server response code is not SOCKS_SUCCESS(0) and reading
-	 *             in client mode, or if any error with protocol occurs.
-	 * @throws IOException
-	 *             If any error happens with I/O.
-	 */
-	public void read(InputStream in, boolean clientMode) throws SocksException,
-			IOException {
-
-		data = null;
-		ip = null;
-
-		final DataInputStream di = new DataInputStream(in);
-
-		version = di.readUnsignedByte();
-		command = di.readUnsignedByte();
-
-		if (clientMode && (command != 0)) {
-			throw new SocksException(command);
-		}
-
-		di.readUnsignedByte();
-		addrType = di.readUnsignedByte();
-
-		byte addr[];
-
-		switch (addrType) {
-		case SOCKS_ATYP_IPV4:
-			addr = new byte[4];
-			di.readFully(addr);
-			host = bytes2IPV4(addr, 0);
-			break;
-		case SOCKS_ATYP_IPV6:
-			addr = new byte[SOCKS_IPV6_LENGTH];// I believe it is 16 bytes,huge!
-			di.readFully(addr);
-			host = bytes2IPV6(addr, 0);
-			break;
-		case SOCKS_ATYP_DOMAINNAME:
-			//log.debug("Reading ATYP_DOMAINNAME");
-			addr = new byte[di.readUnsignedByte()];// Next byte shows the length
-			di.readFully(addr);
-			host = new String(addr);
-			break;
-		default:
-			throw (new SocksException(SocksProxyBase.SOCKS_JUST_ERROR));
-		}
-
-		port = di.readUnsignedShort();
-
-		if ((addrType != SOCKS_ATYP_DOMAINNAME) && doResolveIP) {
-			try {
-				ip = InetAddress.getByName(host);
-			} catch (final UnknownHostException uh_ex) {
-			}
-		}
-	}
-
-	/**
-	 * Writes the message to the stream.
-	 * 
-	 * @param out
-	 *            Output stream to which message should be written.
-	 */
-	public void write(OutputStream out) throws SocksException, IOException {
-		if (data == null) {
-			Socks5Message msg;
-
-			if (addrType == SOCKS_ATYP_DOMAINNAME) {
-				msg = new Socks5Message(command, host, port);
-			} else {
-				if (ip == null) {
-					try {
-						ip = InetAddress.getByName(host);
-					} catch (final UnknownHostException uh_ex) {
-						throw new SocksException(
-								SocksProxyBase.SOCKS_JUST_ERROR);
-					}
-				}
-				msg = new Socks5Message(command, ip, port);
-			}
-			data = msg.data;
-		}
-		out.write(data);
-	}
-
-	/**
-	 * Returns IP field of the message as IP, if the message was created with
-	 * ATYP of HOSTNAME, it will attempt to resolve the hostname, which might
-	 * fail.
-	 * 
-	 * @throws UnknownHostException
-	 *             if host can't be resolved.
-	 */
-	public InetAddress getInetAddress() throws UnknownHostException {
-		if (ip != null) {
-			return ip;
-		}
-
-		return (ip = InetAddress.getByName(host));
-	}
-
-	/**
-	 * Returns string representation of the message.
-	 */
-	public String toString() {
-		// FIXME: Single line version, please.
-		final String s = "Socks5Message:" + "\n" + "VN   " + version + "\n"
-				+ "CMD  " + command + "\n" + "ATYP " + addrType + "\n"
-				+ "ADDR " + host + "\n" + "PORT " + port + "\n";
-		return s;
-	}
-
-	/**
-	 *Wether to resolve hostIP returned from SOCKS server that is wether to
-	 * create InetAddress object from the hostName string
-	 */
-	static public boolean resolveIP() {
-		return doResolveIP;
-	}
-
-	/**
-	 *Wether to resolve hostIP returned from SOCKS server that is wether to
-	 * create InetAddress object from the hostName string
-	 * 
-	 * @param doResolve
-	 *            Wether to resolve hostIP from SOCKS server.
-	 *@return Previous value.
-	 */
-	static public boolean resolveIP(boolean doResolve) {
-		final boolean old = doResolveIP;
-		doResolveIP = doResolve;
-		return old;
-	}
-
-	/*
-	 * private static final void debug(String s){ if(DEBUG) System.out.print(s);
-	 * } private static final boolean DEBUG = false;
-	 */
-
-	// SOCKS5 constants
-	public static final int SOCKS_VERSION = 5;
-
-	public static final int SOCKS_ATYP_IPV4 = 0x1; // Where is 2??
-	public static final int SOCKS_ATYP_DOMAINNAME = 0x3; // !!!!rfc1928
-	public static final int SOCKS_ATYP_IPV6 = 0x4;
-
-	public static final int SOCKS_IPV6_LENGTH = 16;
-
-	static boolean doResolveIP = true;
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Proxy.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Proxy.java
deleted file mode 100644
index 7400aa6e..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Proxy.java
+++ /dev/null
@@ -1,295 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-/**
- * SOCKS5 Proxy.
- */
-
-public class Socks5Proxy extends SocksProxyBase implements Cloneable {
-
-	// Data members
-	private Hashtable<Integer, Authentication> authMethods = new Hashtable<Integer, Authentication>();
-	private int selectedMethod;
-
-	boolean resolveAddrLocally = true;
-	UDPEncapsulation udp_encapsulation = null;
-
-	// Public Constructors
-	// ====================
-
-	/**
-	 * Creates SOCKS5 proxy.
-	 * 
-	 * @param p
-	 *            Proxy to use to connect to this proxy, allows proxy chaining.
-	 * @param proxyHost
-	 *            Host on which a Proxy server runs.
-	 * @param proxyPort
-	 *            Port on which a Proxy server listens for connections.
-	 * @throws UnknownHostException
-	 *             If proxyHost can't be resolved.
-	 */
-	public Socks5Proxy(SocksProxyBase p, String proxyHost, int proxyPort)
-			throws UnknownHostException {
-
-		super(p, proxyHost, proxyPort);
-		version = 5;
-		setAuthenticationMethod(0, new AuthenticationNone());
-	}
-
-	/**
-	 * Creates SOCKS5 proxy.
-	 * 
-	 * @param proxyHost
-	 *            Host on which a Proxy server runs.
-	 * @param proxyPort
-	 *            Port on which a Proxy server listens for connections.
-	 * @throws UnknownHostException
-	 *             If proxyHost can't be resolved.
-	 */
-	public Socks5Proxy(String proxyHost, int proxyPort)
-			throws UnknownHostException {
-		this(null, proxyHost, proxyPort);
-	}
-
-	/**
-	 * Creates SOCKS5 proxy.
-	 * 
-	 * @param p
-	 *            Proxy to use to connect to this proxy, allows proxy chaining.
-	 * @param proxyIP
-	 *            Host on which a Proxy server runs.
-	 * @param proxyPort
-	 *            Port on which a Proxy server listens for connections.
-	 */
-	public Socks5Proxy(SocksProxyBase p, InetAddress proxyIP, int proxyPort) {
-		super(p, proxyIP, proxyPort);
-		version = 5;
-		setAuthenticationMethod(0, new AuthenticationNone());
-	}
-
-	/**
-	 * Creates SOCKS5 proxy.
-	 * 
-	 * @param proxyIP
-	 *            Host on which a Proxy server runs.
-	 * @param proxyPort
-	 *            Port on which a Proxy server listens for connections.
-	 */
-	public Socks5Proxy(InetAddress proxyIP, int proxyPort) {
-		this(null, proxyIP, proxyPort);
-	}
-
-	// Public instance methods
-	// ========================
-
-	/**
-	 * Wether to resolve address locally or to let proxy do so.
-	 * <p>
-	 * SOCKS5 protocol allows to send host names rather then IPs in the
-	 * requests, this option controls wether the hostnames should be send to the
-	 * proxy server as names, or should they be resolved locally.
-	 * 
-	 * @param doResolve
-	 *            Wether to perform resolution locally.
-	 * @return Previous settings.
-	 */
-	public boolean resolveAddrLocally(boolean doResolve) {
-		final boolean old = resolveAddrLocally;
-		resolveAddrLocally = doResolve;
-		return old;
-	}
-
-	/**
-	 * Get current setting on how the addresses should be handled.
-	 * 
-	 * @return Current setting for address resolution.
-	 * @see Socks5Proxy#resolveAddrLocally(boolean doResolve)
-	 */
-	public boolean resolveAddrLocally() {
-		return resolveAddrLocally;
-	}
-
-	/**
-	 * Adds another authentication method.
-	 * 
-	 * @param methodId
-	 *            Authentication method id, see rfc1928
-	 * @param method
-	 *            Implementation of Authentication
-	 * @see Authentication
-	 */
-	public boolean setAuthenticationMethod(int methodId, Authentication method) {
-		if ((methodId < 0) || (methodId > 255)) {
-			return false;
-		}
-		if (method == null) {
-			// Want to remove a particular method
-			return (authMethods.remove(new Integer(methodId)) != null);
-		} else {// Add the method, or rewrite old one
-			authMethods.put(new Integer(methodId), method);
-		}
-		return true;
-	}
-
-	/**
-	 * Get authentication method, which corresponds to given method id
-	 * 
-	 * @param methodId
-	 *            Authentication method id.
-	 * @return Implementation for given method or null, if one was not set.
-	 */
-	public Authentication getAuthenticationMethod(int methodId) {
-		final Object method = authMethods.get(new Integer(methodId));
-		if (method == null) {
-			return null;
-		}
-		return (Authentication) method;
-	}
-
-	/**
-	 * Creates a clone of this Proxy. clone() returns an
-	 */
-	@SuppressWarnings("unchecked")
-	public Object clone() {
-		final Socks5Proxy newProxy = new Socks5Proxy(proxyIP, proxyPort);
-
-		final Object o = this.authMethods.clone();
-		newProxy.authMethods = (Hashtable<Integer, Authentication>) o;
-
-		newProxy.directHosts = (InetRange) directHosts.clone();
-		newProxy.resolveAddrLocally = resolveAddrLocally;
-		newProxy.chainProxy = chainProxy;
-		return newProxy;
-	}
-
-	// Public Static(Class) Methods
-	// ==============================
-
-	// Protected Methods
-	// =================
-
-	protected SocksProxyBase copy() {
-		final Socks5Proxy copy = new Socks5Proxy(proxyIP, proxyPort);
-
-		copy.authMethods = this.authMethods; // same Hash, no copy
-		copy.directHosts = this.directHosts;
-		copy.chainProxy = this.chainProxy;
-		copy.resolveAddrLocally = this.resolveAddrLocally;
-		return copy;
-	}
-
-	/**
-    *
-    *
-    */
-	protected void startSession() throws SocksException {
-		super.startSession();
-		Authentication auth;
-		final Socket ps = proxySocket; // The name is too long
-
-		try {
-
-			final byte nMethods = (byte) authMethods.size(); // Number of
-			// methods
-
-			final byte[] buf = new byte[2 + nMethods]; // 2 is for VER,NMETHODS
-			buf[0] = (byte) version;
-			buf[1] = nMethods; // Number of methods
-			int i = 2;
-
-			final Enumeration<Integer> ids = authMethods.keys();
-			while (ids.hasMoreElements()) {
-				buf[i++] = (byte) ids.nextElement().intValue();
-			}
-
-			out.write(buf);
-			out.flush();
-
-			final int versionNumber = in.read();
-			selectedMethod = in.read();
-
-			if ((versionNumber < 0) || (selectedMethod < 0)) {
-				// EOF condition was reached
-				endSession();
-				final String s = "Connection to proxy lost.";
-				throw new SocksException(SOCKS_PROXY_IO_ERROR, s);
-			}
-
-			if (versionNumber < version) {
-				// What should we do??
-			}
-
-			if (selectedMethod == 0xFF) { // No method selected
-				ps.close();
-				throw (new SocksException(SOCKS_AUTH_NOT_SUPPORTED));
-			}
-
-			auth = getAuthenticationMethod(selectedMethod);
-			if (auth == null) {
-				// This shouldn't happen, unless method was removed by other
-				// thread, or the server stuffed up
-				final String s = "Specified Authentication not found!";
-				throw new SocksException(SOCKS_JUST_ERROR, s);
-			}
-
-			final Object[] in_out;
-			in_out = auth.doSocksAuthentication(selectedMethod, ps);
-
-			if (in_out == null) {
-				// Authentication failed by some reason
-				throw (new SocksException(SOCKS_AUTH_FAILURE));
-			}
-
-			/*
-			 * Most authentication methods are expected to return simply the
-			 * input/output streams associated with the socket. However if the
-			 * auth. method requires some kind of encryption/decryption being
-			 * done on the connection it should provide classes to handle I/O.
-			 */
-
-			in = (InputStream) in_out[0];
-			out = (OutputStream) in_out[1];
-			if (in_out.length > 2) {
-				udp_encapsulation = (UDPEncapsulation) in_out[2];
-			}
-
-		} catch (final SocksException s_ex) {
-			throw s_ex;
-		} catch (final UnknownHostException uh_ex) {
-			throw new SocksException(SOCKS_PROXY_NO_CONNECT, uh_ex);
-		} catch (final SocketException so_ex) {
-			throw new SocksException(SOCKS_PROXY_NO_CONNECT, so_ex);
-		} catch (final IOException io_ex) {
-			throw new SocksException(SOCKS_PROXY_IO_ERROR, io_ex);
-		}
-	}
-
-	protected ProxyMessage formMessage(int cmd, InetAddress ip, int port) {
-		return new Socks5Message(cmd, ip, port);
-	}
-
-	protected ProxyMessage formMessage(int cmd, String host, int port)
-			throws UnknownHostException {
-		if (resolveAddrLocally) {
-			return formMessage(cmd, InetAddress.getByName(host), port);
-		} else {
-			return new Socks5Message(cmd, host, port);
-		}
-	}
-
-	protected ProxyMessage formMessage(InputStream in) throws SocksException,
-			IOException {
-		return new Socks5Message(in);
-	}
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksException.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksException.java
deleted file mode 100644
index a6515974..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksException.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-/**
- * Exception thrown by various socks classes to indicate errors with protocol or
- * unsuccessfull server responses.
- */
-public class SocksException extends java.io.IOException {
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Construct a SocksException with given errorcode.
-	 * <p>
-	 * Tries to look up message which corresponds to this error code.
-	 * 
-	 * @param errCode
-	 *            Error code for this exception.
-	 */
-	public SocksException(int errCode) {
-		this.errCode = errCode;
-		lookupErrorString(errCode);
-	}
-
-	private void lookupErrorString(int errCode) {
-		if ((errCode >> 16) == 0) {
-			if (errCode <= serverReplyMessage.length) {
-				errString = serverReplyMessage[errCode];
-			} else {
-				errString = UNASSIGNED_ERROR_MESSAGE;
-			}
-		} else {
-			// Local error
-			errCode = (errCode >> 16) - 1;
-			if (errCode <= localErrorMessage.length) {
-				errString = localErrorMessage[errCode];
-			} else {
-				errString = UNASSIGNED_ERROR_MESSAGE;
-			}
-		}
-	}
-
-	/**
-	 * Construct a SocksException with given error code, and a Throwable cause
-	 * 
-	 * @param errCode
-	 * @param t
-	 *            Nested exception for debugging purposes.
-	 */
-	public SocksException(int errCode, Throwable t) {
-		super(t);  // Java 1.6+
-		this.errCode = errCode;
-		lookupErrorString(errCode);
-	}
-
-	/**
-	 * Constructs a SocksException with given error code and message.
-	 * 
-	 * @param errCode
-	 *            Error code.
-	 * @param errString
-	 *            Error Message.
-	 */
-	public SocksException(int errCode, String errString) {
-		this.errCode = errCode;
-		this.errString = errString;
-	}
-
-	public SocksException(int errCode, String string, Throwable t) {
-		super(string, t);  // Java 1.6+
-		this.errCode = errCode;
-		this.errString = string;
-	}
-
-	/**
-	 * Get the error code associated with this exception.
-	 * 
-	 * @return Error code associated with this exception.
-	 */
-	public int getErrorCode() {
-		return errCode;
-	}
-
-	/**
-	 * Get human readable representation of this exception.
-	 * 
-	 * @return String represntation of this exception.
-	 */
-	public String toString() {
-		return errString;
-	}
-
-	static final String UNASSIGNED_ERROR_MESSAGE = "Unknown error message";
-
-	static final String serverReplyMessage[] = { "Succeeded",
-			"General SOCKS server failure",
-			"Connection not allowed by ruleset", "Network unreachable",
-			"Host unreachable", "Connection refused", "TTL expired",
-			"Command not supported", "Address type not supported" };
-
-	static final String localErrorMessage[] = { "SOCKS server not specified",
-			"Unable to contact SOCKS server", "IO error",
-			"None of Authentication methods are supported",
-			"Authentication failed", "General SOCKS fault" };
-
-	String errString;
-	int errCode;
-
-}// End of SocksException class
-
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksProxyBase.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksProxyBase.java
deleted file mode 100644
index ebf4fdb8..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksProxyBase.java
+++ /dev/null
@@ -1,543 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.UnknownHostException;
-
-/**
- * Abstract class Proxy, base for classes Socks4Proxy and Socks5Proxy. Defines
- * methods for specifying default proxy, to be used by all classes of this
- * package.
- */
-
-public abstract class SocksProxyBase {
-
-	// Data members
-	protected InetRange directHosts = new InetRange();
-
-	protected InetAddress proxyIP = null;
-	protected String proxyHost = null;
-	protected int proxyPort;
-	protected Socket proxySocket = null;
-
-	protected InputStream in;
-	protected OutputStream out;
-
-	protected int version;
-
-	protected SocksProxyBase chainProxy = null;
-
-	// Protected static/class variables
-	protected static SocksProxyBase defaultProxy = null;
-
-	// Constructors
-	// ====================
-	SocksProxyBase(SocksProxyBase chainProxy, String proxyHost, int proxyPort)
-			throws UnknownHostException {
-		this.chainProxy = chainProxy;
-		this.proxyHost = proxyHost;
-
-		if (chainProxy == null) {
-			this.proxyIP = InetAddress.getByName(proxyHost);
-		}
-
-		this.proxyPort = proxyPort;
-	}
-
-	SocksProxyBase(String proxyHost, int proxyPort) throws UnknownHostException {
-		this(null, proxyHost, proxyPort);
-	}
-
-	SocksProxyBase(SocksProxyBase chainProxy, InetAddress proxyIP, int proxyPort) {
-		this.chainProxy = chainProxy;
-		this.proxyIP = proxyIP;
-		this.proxyPort = proxyPort;
-	}
-
-	SocksProxyBase(InetAddress proxyIP, int proxyPort) {
-		this(null, proxyIP, proxyPort);
-	}
-
-	SocksProxyBase(SocksProxyBase p) {
-		this.proxyIP = p.proxyIP;
-		this.proxyPort = p.proxyPort;
-		this.version = p.version;
-		this.directHosts = p.directHosts;
-	}
-
-	// Public instance methods
-	// ========================
-
-	/**
-	 * Get the port on which proxy server is running.
-	 * 
-	 * @return Proxy port.
-	 */
-	public int getPort() {
-		return proxyPort;
-	}
-
-	/**
-	 * Get the ip address of the proxy server host.
-	 * 
-	 * @return Proxy InetAddress.
-	 */
-	public InetAddress getInetAddress() {
-		return proxyIP;
-	}
-
-	/**
-	 * Adds given ip to the list of direct addresses. This machine will be
-	 * accessed without using proxy.
-	 */
-	public void addDirect(InetAddress ip) {
-		directHosts.add(ip);
-	}
-
-	/**
-	 * Adds host to the list of direct addresses. This machine will be accessed
-	 * without using proxy.
-	 */
-	public boolean addDirect(String host) {
-		return directHosts.add(host);
-	}
-
-	/**
-	 * Adds given range of addresses to the lsit of direct addresses, machines
-	 * within this range will be accessed without using proxy.
-	 */
-	public void addDirect(InetAddress from, InetAddress to) {
-		directHosts.add(from, to);
-	}
-
-	/**
-	 * Sets given InetRange as the list of direct address, previous list will be
-	 * discarded, any changes done previously with addDirect(Inetaddress) will
-	 * be lost. The machines in this range will be accessed without using proxy.
-	 * 
-	 * @param ir
-	 *            InetRange which should be used to look up direct addresses.
-	 * @see InetRange
-	 */
-	public void setDirect(InetRange ir) {
-		directHosts = ir;
-	}
-
-	/**
-	 * Get the list of direct hosts.
-	 * 
-	 * @return Current range of direct address as InetRange object.
-	 * @see InetRange
-	 */
-	public InetRange getDirect() {
-		return directHosts;
-	}
-
-	/**
-	 * Check wether the given host is on the list of direct address.
-	 * 
-	 * @param host
-	 *            Host name to check.
-	 * @return true if the given host is specified as the direct addresses.
-	 */
-	public boolean isDirect(String host) {
-		return directHosts.contains(host);
-	}
-
-	/**
-	 * Check wether the given host is on the list of direct addresses.
-	 * 
-	 * @param host
-	 *            Host address to check.
-	 * @return true if the given host is specified as the direct address.
-	 */
-	public boolean isDirect(InetAddress host) {
-		return directHosts.contains(host);
-	}
-
-	/**
-	 * Set the proxy which should be used to connect to given proxy.
-	 * 
-	 * @param chainProxy
-	 *            Proxy to use to connect to this proxy.
-	 */
-	public void setChainProxy(SocksProxyBase chainProxy) {
-		this.chainProxy = chainProxy;
-	}
-
-	/**
-	 * Get proxy which is used to connect to this proxy.
-	 * 
-	 * @return Proxy which is used to connect to this proxy, or null if proxy is
-	 *         to be contacted directly.
-	 */
-	public SocksProxyBase getChainProxy() {
-		return chainProxy;
-	}
-
-	/**
-	 * Get string representation of this proxy.
-	 * 
-	 * @returns string in the form:proxyHost:proxyPort \t Version versionNumber
-	 */
-	public String toString() {
-		return ("" + proxyIP.getHostName() + ":" + proxyPort + "\tVersion " + version);
-	}
-
-	// Public Static(Class) Methods
-	// ==============================
-
-	/**
-	 * Sets SOCKS4 proxy as default.
-	 * 
-	 * @param hostName
-	 *            Host name on which SOCKS4 server is running.
-	 * @param port
-	 *            Port on which SOCKS4 server is running.
-	 * @param user
-	 *            Username to use for communications with proxy.
-	 */
-	public static void setDefaultProxy(String hostName, int port, String user)
-			throws UnknownHostException {
-		defaultProxy = new Socks4Proxy(hostName, port, user);
-	}
-
-	/**
-	 * Sets SOCKS4 proxy as default.
-	 * 
-	 * @param ipAddress
-	 *            Host address on which SOCKS4 server is running.
-	 * @param port
-	 *            Port on which SOCKS4 server is running.
-	 * @param user
-	 *            Username to use for communications with proxy.
-	 */
-	public static void setDefaultProxy(InetAddress ipAddress, int port,
-			String user) {
-		defaultProxy = new Socks4Proxy(ipAddress, port, user);
-	}
-
-	/**
-	 * Sets SOCKS5 proxy as default. Default proxy only supports
-	 * no-authentication.
-	 * 
-	 * @param hostName
-	 *            Host name on which SOCKS5 server is running.
-	 * @param port
-	 *            Port on which SOCKS5 server is running.
-	 */
-	public static void setDefaultProxy(String hostName, int port)
-			throws UnknownHostException {
-		defaultProxy = new Socks5Proxy(hostName, port);
-	}
-
-	/**
-	 * Sets SOCKS5 proxy as default. Default proxy only supports
-	 * no-authentication.
-	 * 
-	 * @param ipAddress
-	 *            Host address on which SOCKS5 server is running.
-	 * @param port
-	 *            Port on which SOCKS5 server is running.
-	 */
-	public static void setDefaultProxy(InetAddress ipAddress, int port) {
-		defaultProxy = new Socks5Proxy(ipAddress, port);
-	}
-
-	/**
-	 * Sets default proxy.
-	 * 
-	 * @param p
-	 *            Proxy to use as default proxy.
-	 */
-	public static void setDefaultProxy(SocksProxyBase p) {
-		defaultProxy = p;
-	}
-
-	/**
-	 * Get current default proxy.
-	 * 
-	 * @return Current default proxy, or null if none is set.
-	 */
-	public static SocksProxyBase getDefaultProxy() {
-		return defaultProxy;
-	}
-
-	/**
-	 * Parses strings in the form: host[:port:user:password], and creates proxy
-	 * from information obtained from parsing.
-	 * <p>
-	 * Defaults: port = 1080.<br>
-	 * If user specified but not password, creates Socks4Proxy, if user not
-	 * specified creates Socks5Proxy, if both user and password are speciefied
-	 * creates Socks5Proxy with user/password authentication.
-	 * 
-	 * @param proxy_entry
-	 *            String in the form host[:port:user:password]
-	 * @return Proxy created from the string, null if entry was somehow
-	 *         invalid(host unknown for example, or empty string)
-	 */
-	public static SocksProxyBase parseProxy(String proxy_entry) {
-
-		String proxy_host;
-		int proxy_port = 1080;
-		String proxy_user = null;
-		String proxy_password = null;
-		SocksProxyBase proxy;
-
-		final java.util.StringTokenizer st = new java.util.StringTokenizer(
-				proxy_entry, ":");
-		if (st.countTokens() < 1) {
-			return null;
-		}
-
-		proxy_host = st.nextToken();
-		if (st.hasMoreTokens()) {
-			try {
-				proxy_port = Integer.parseInt(st.nextToken().trim());
-			} catch (final NumberFormatException nfe) {
-			}
-		}
-
-		if (st.hasMoreTokens()) {
-			proxy_user = st.nextToken();
-		}
-
-		if (st.hasMoreTokens()) {
-			proxy_password = st.nextToken();
-		}
-
-		try {
-			if (proxy_user == null) {
-				proxy = new Socks5Proxy(proxy_host, proxy_port);
-			} else if (proxy_password == null) {
-				proxy = new Socks4Proxy(proxy_host, proxy_port, proxy_user);
-			} else {
-				proxy = new Socks5Proxy(proxy_host, proxy_port);
-				final UserPasswordAuthentication upa = new UserPasswordAuthentication(
-						proxy_user, proxy_password);
-
-				((Socks5Proxy) proxy).setAuthenticationMethod(
-						UserPasswordAuthentication.METHOD_ID, upa);
-			}
-		} catch (final UnknownHostException uhe) {
-			return null;
-		}
-
-		return proxy;
-	}
-
-	// Protected Methods
-	// =================
-
-	protected void startSession() throws SocksException {
-		try {
-			if (chainProxy == null) {
-				proxySocket = new Socket(proxyIP, proxyPort);
-			} else if (proxyIP != null) {
-				proxySocket = new SocksSocket(chainProxy, proxyIP, proxyPort);
-			} else {
-				proxySocket = new SocksSocket(chainProxy, proxyHost, proxyPort);
-			}
-
-			in = proxySocket.getInputStream();
-			out = proxySocket.getOutputStream();
-		} catch (final SocksException se) {
-			throw se;
-		} catch (final IOException io_ex) {
-			throw new SocksException(SOCKS_PROXY_IO_ERROR, "" + io_ex);
-		}
-	}
-
-	/**
-	 * Create a copy of this proxy for use by individual threads.
-	 * 
-	 * @return proxy
-	 */
-	protected abstract SocksProxyBase copy();
-
-	protected abstract ProxyMessage formMessage(int cmd, InetAddress ip,
-			int port);
-
-	protected abstract ProxyMessage formMessage(int cmd, String host, int port)
-			throws UnknownHostException;
-
-	protected abstract ProxyMessage formMessage(InputStream in)
-			throws SocksException, IOException;
-
-	protected ProxyMessage connect(InetAddress ip, int port)
-			throws SocksException {
-		try {
-			startSession();
-			final ProxyMessage request = formMessage(SOCKS_CMD_CONNECT, ip,
-					port);
-			return exchange(request);
-		} catch (final SocksException se) {
-			endSession();
-			throw se;
-		}
-	}
-
-	protected ProxyMessage connect(String host, int port)
-			throws UnknownHostException, SocksException {
-		try {
-			startSession();
-			final ProxyMessage request = formMessage(SOCKS_CMD_CONNECT, host,
-					port);
-			return exchange(request);
-		} catch (final SocksException se) {
-			endSession();
-			throw se;
-		}
-	}
-
-	protected ProxyMessage bind(InetAddress ip, int port) throws SocksException {
-		try {
-			startSession();
-			final ProxyMessage request = formMessage(SOCKS_CMD_BIND, ip, port);
-			return exchange(request);
-		} catch (final SocksException se) {
-			endSession();
-			throw se;
-		}
-	}
-
-	protected ProxyMessage bind(String host, int port)
-			throws UnknownHostException, SocksException {
-		try {
-			startSession();
-			final ProxyMessage request = formMessage(SOCKS_CMD_BIND, host, port);
-			return exchange(request);
-		} catch (final SocksException se) {
-			endSession();
-			throw se;
-		}
-	}
-
-	protected ProxyMessage accept() throws IOException, SocksException {
-		ProxyMessage msg;
-		try {
-			msg = formMessage(in);
-		} catch (final InterruptedIOException iioe) {
-			throw iioe;
-		} catch (final IOException io_ex) {
-			endSession();
-			throw new SocksException(SOCKS_PROXY_IO_ERROR,
-					"While Trying accept:" + io_ex);
-		}
-		return msg;
-	}
-
-	protected ProxyMessage udpAssociate(InetAddress ip, int port)
-			throws SocksException {
-		try {
-			startSession();
-			final ProxyMessage request = formMessage(SOCKS_CMD_UDP_ASSOCIATE,
-					ip, port);
-			if (request != null) {
-				return exchange(request);
-			}
-		} catch (final SocksException se) {
-			endSession();
-			throw se;
-		}
-		// Only get here if request was null
-		endSession();
-		throw new SocksException(SOCKS_METHOD_NOTSUPPORTED,
-				"This version of proxy does not support UDP associate, use version 5");
-	}
-
-	protected ProxyMessage udpAssociate(String host, int port)
-			throws UnknownHostException, SocksException {
-		try {
-			startSession();
-			final ProxyMessage request = formMessage(SOCKS_CMD_UDP_ASSOCIATE,
-					host, port);
-			if (request != null) {
-				return exchange(request);
-			}
-		} catch (final SocksException se) {
-			endSession();
-			throw se;
-		}
-		// Only get here if request was null
-		endSession();
-		throw new SocksException(SOCKS_METHOD_NOTSUPPORTED,
-				"This version of proxy does not support UDP associate, use version 5");
-	}
-
-	protected void endSession() {
-		try {
-			if (proxySocket != null) {
-				proxySocket.close();
-			}
-			proxySocket = null;
-		} catch (final IOException io_ex) {
-		}
-	}
-
-	/**
-	 *Sends the request to SOCKS server
-	 */
-	protected void sendMsg(ProxyMessage msg) throws SocksException, IOException {
-		msg.write(out);
-	}
-
-	/**
-	 * Reads the reply from the SOCKS server
-	 */
-	protected ProxyMessage readMsg() throws SocksException, IOException {
-		return formMessage(in);
-	}
-
-	/**
-	 *Sends the request reads reply and returns it throws exception if
-	 * something wrong with IO or the reply code is not zero
-	 */
-	protected ProxyMessage exchange(ProxyMessage request) throws SocksException {
-		ProxyMessage reply;
-		try {
-			request.write(out);
-			reply = formMessage(in);
-		} catch (final SocksException s_ex) {
-			throw s_ex;
-		} catch (final IOException ioe) {
-			throw (new SocksException(SOCKS_PROXY_IO_ERROR, "" + ioe));
-		}
-		return reply;
-	}
-
-	// Private methods
-	// ===============
-
-	// Constants
-
-	public static final int SOCKS_SUCCESS = 0;
-	public static final int SOCKS_FAILURE = 1;
-	public static final int SOCKS_BADCONNECT = 2;
-	public static final int SOCKS_BADNETWORK = 3;
-	public static final int SOCKS_HOST_UNREACHABLE = 4;
-	public static final int SOCKS_CONNECTION_REFUSED = 5;
-	public static final int SOCKS_TTL_EXPIRE = 6;
-	public static final int SOCKS_CMD_NOT_SUPPORTED = 7;
-	public static final int SOCKS_ADDR_NOT_SUPPORTED = 8;
-
-	public static final int SOCKS_NO_PROXY = 1 << 16;
-	public static final int SOCKS_PROXY_NO_CONNECT = 2 << 16;
-	public static final int SOCKS_PROXY_IO_ERROR = 3 << 16;
-	public static final int SOCKS_AUTH_NOT_SUPPORTED = 4 << 16;
-	public static final int SOCKS_AUTH_FAILURE = 5 << 16;
-	public static final int SOCKS_JUST_ERROR = 6 << 16;
-
-	public static final int SOCKS_DIRECT_FAILED = 7 << 16;
-	public static final int SOCKS_METHOD_NOTSUPPORTED = 8 << 16;
-
-	static final int SOCKS_CMD_CONNECT = 0x1;
-	static final int SOCKS_CMD_BIND = 0x2;
-	static final int SOCKS_CMD_UDP_ASSOCIATE = 0x3;
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksServerSocket.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksServerSocket.java
deleted file mode 100644
index 8d009cbf..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksServerSocket.java
+++ /dev/null
@@ -1,235 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-
-/**
- * SocksServerSocket allows to accept connections from one particular host
- * through the SOCKS4 or SOCKS5 proxy.
- */
-public class SocksServerSocket extends ServerSocket {
-	// Data members
-	protected SocksProxyBase proxy;
-	protected String localHost;
-	protected InetAddress localIP;
-	protected int localPort;
-
-	boolean doing_direct = false;
-	InetAddress remoteAddr;
-
-	/**
-	 * Creates ServerSocket capable of accepting one connection through the
-	 * firewall, uses default Proxy.
-	 * 
-	 * @param host
-	 *            Host from which the connection should be recieved.
-	 *@param port
-	 *            Port number of the primary connection.
-	 */
-	public SocksServerSocket(String host, int port) throws SocksException,
-			UnknownHostException, IOException {
-		this(SocksProxyBase.defaultProxy, host, port);
-	}
-
-	/**
-	 *Creates ServerSocket capable of accepting one connection through the
-	 * firewall, uses given proxy.
-	 * 
-	 * @param p
-	 *            Proxy object to use.
-	 *@param host
-	 *            Host from which the connection should be recieved.
-	 *@param port
-	 *            Port number of the primary connection.
-	 */
-	public SocksServerSocket(SocksProxyBase p, String host, int port)
-			throws SocksException, UnknownHostException, IOException {
-
-		super(0);
-		if (p == null) {
-			throw new SocksException(SocksProxyBase.SOCKS_NO_PROXY);
-		}
-		// proxy=p;
-		proxy = p.copy();
-		if (proxy.isDirect(host)) {
-			remoteAddr = InetAddress.getByName(host);
-			proxy = null;
-			doDirect();
-		} else {
-			processReply(proxy.bind(host, port));
-		}
-	}
-
-	/**
-	 * Creates ServerSocket capable of accepting one connection through the
-	 * firewall, uses default Proxy.
-	 * 
-	 * @param ip
-	 *            Host from which the connection should be recieved.
-	 *@param port
-	 *            Port number of the primary connection.
-	 */
-	public SocksServerSocket(InetAddress ip, int port) throws SocksException,
-			IOException {
-		this(SocksProxyBase.defaultProxy, ip, port);
-	}
-
-	/**
-	 *Creates ServerSocket capable of accepting one connection through the
-	 * firewall, uses given proxy.
-	 * 
-	 * @param p
-	 *            Proxy object to use.
-	 *@param ip
-	 *            Host from which the connection should be recieved.
-	 *@param port
-	 *            Port number of the primary connection.
-	 */
-	public SocksServerSocket(SocksProxyBase p, InetAddress ip, int port)
-			throws SocksException, IOException {
-		super(0);
-
-		if (p == null) {
-			throw new SocksException(SocksProxyBase.SOCKS_NO_PROXY);
-		}
-		this.proxy = p.copy();
-
-		if (proxy.isDirect(ip)) {
-			remoteAddr = ip;
-			doDirect();
-		} else {
-			processReply(proxy.bind(ip, port));
-		}
-	}
-
-	/**
-	 * Accepts the incoming connection.
-	 */
-	public Socket accept() throws IOException {
-		Socket s;
-
-		if (!doing_direct) {
-			if (proxy == null) {
-				return null;
-			}
-
-			final ProxyMessage msg = proxy.accept();
-			s = msg.ip == null ? new SocksSocket(msg.host, msg.port, proxy)
-					: new SocksSocket(msg.ip, msg.port, proxy);
-			// Set timeout back to 0
-			proxy.proxySocket.setSoTimeout(0);
-		} else { // Direct Connection
-
-			// Mimic the proxy behaviour,
-			// only accept connections from the speciefed host.
-			while (true) {
-				s = super.accept();
-				if (s.getInetAddress().equals(remoteAddr)) {
-					// got the connection from the right host
-					// Close listenning socket.
-					break;
-				} else {
-					s.close(); // Drop all connections from other hosts
-				}
-			}
-
-		}
-		proxy = null;
-		// Return accepted socket
-		return s;
-	}
-
-	/**
-	 * Closes the connection to proxy if socket have not been accepted, if the
-	 * direct connection is used, closes direct ServerSocket. If the client
-	 * socket have been allready accepted, does nothing.
-	 */
-	public void close() throws IOException {
-		super.close();
-		if (proxy != null) {
-			proxy.endSession();
-		}
-		proxy = null;
-	}
-
-	/**
-	 * Get the name of the host proxy is using to listen for incoming
-	 * connection.
-	 * <P>
-	 * Usefull when address is returned by proxy as the hostname.
-	 * 
-	 * @return the hostname of the address proxy is using to listen for incoming
-	 *         connection.
-	 */
-	public String getHost() {
-		return localHost;
-	}
-
-	/**
-	 * Get address assigned by proxy to listen for incomming connections, or the
-	 * local machine address if doing direct connection.
-	 */
-	public InetAddress getInetAddress() {
-		if (localIP == null) {
-			try {
-				localIP = InetAddress.getByName(localHost);
-			} catch (final UnknownHostException e) {
-				return null;
-			}
-		}
-		return localIP;
-	}
-
-	/**
-	 * Get port assigned by proxy to listen for incoming connections, or the
-	 * port chosen by local system, if accepting directly.
-	 */
-	public int getLocalPort() {
-		return localPort;
-	}
-
-	/**
-	 * Set Timeout.
-	 * 
-	 * @param timeout
-	 *            Amount of time in milliseconds, accept should wait for
-	 *            incoming connection before failing with exception. Zero
-	 *            timeout implies infinity.
-	 */
-	public void setSoTimeout(int timeout) throws SocketException {
-		super.setSoTimeout(timeout);
-		if (!doing_direct) {
-			proxy.proxySocket.setSoTimeout(timeout);
-		}
-	}
-
-	// Private Methods
-	// ////////////////
-
-	private void processReply(ProxyMessage reply) throws SocksException {
-		localPort = reply.port;
-		/*
-		 * If the server have assigned same host as it was contacted on it might
-		 * return an address of all zeros
-		 */
-		if (reply.host.equals("0.0.0.0")) {
-			localIP = proxy.proxyIP;
-			localHost = localIP.getHostName();
-		} else {
-			localHost = reply.host;
-			localIP = reply.ip;
-		}
-	}
-
-	private void doDirect() {
-		doing_direct = true;
-		localPort = super.getLocalPort();
-		localIP = super.getInetAddress();
-		localHost = localIP.getHostName();
-	}
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksSocket.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksSocket.java
deleted file mode 100644
index 0e70c7ae..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksSocket.java
+++ /dev/null
@@ -1,385 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-
-/**
- * SocksSocket tryies to look very similar to normal Socket, while allowing
- * connections through the SOCKS4 or 5 proxy. To use this class you will have to
- * identify proxy you need to use, Proxy class allows you to set default proxy,
- * which will be used by all Socks aware sockets. You can also create either
- * Socks4Proxy or Socks5Proxy, and use them by passing to the appropriate
- * constructors.
- * <P>
- * Using Socks package can be as easy as that:
- * 
- * <pre>
- * <tt>
- * 
- *     import Socks.*;
- *     ....
- * 
- *     try{
- *        //Specify SOCKS5 proxy
- *        Proxy.setDefaultProxy("socks-proxy",1080);
- * 
- *        //OR you still use SOCKS4
- *        //Code below uses SOCKS4 proxy
- *        //Proxy.setDefaultProxy("socks-proxy",1080,userName);
- * 
- *        Socket s = SocksSocket("some.host.of.mine",13);
- *        readTimeFromSock(s);
- *     }catch(SocksException sock_ex){
- *        //Usually it will turn in more or less meaningfull message
- *        System.err.println("SocksException:"+sock_ex);
- *     }
- * 
- * </tt>
- * </pre>
- *<P>
- * However if the need exist for more control, like resolving addresses
- * remotely, or using some non-trivial authentication schemes, it can be done.
- */
-
-public class SocksSocket extends Socket {
-	// Data members
-	protected SocksProxyBase proxy;
-	protected String localHost, remoteHost;
-	protected InetAddress localIP, remoteIP;
-	protected int localPort, remotePort;
-
-	private Socket directSock = null;
-
-	/**
-	 * Tryies to connect to given host and port using default proxy. If no
-	 * default proxy speciefied it throws SocksException with error code
-	 * SOCKS_NO_PROXY.
-	 * 
-	 * @param host
-	 *            Machine to connect to.
-	 * @param port
-	 *            Port to which to connect.
-	 * @see SocksSocket#SocksSocket(SocksProxyBase,String,int)
-	 * @see Socks5Proxy#resolveAddrLocally
-	 */
-	public SocksSocket(String host, int port) throws SocksException,
-			UnknownHostException {
-		this(SocksProxyBase.defaultProxy, host, port);
-	}
-
-	/**
-	 * Connects to host port using given proxy server.
-	 * 
-	 * @param p
-	 *            Proxy to use.
-	 * @param host
-	 *            Machine to connect to.
-	 * @param port
-	 *            Port to which to connect.
-	 * @throws UnknownHostException
-	 *             If one of the following happens:
-	 *             <ol>
-	 * 
-	 *             <li>Proxy settings say that address should be resolved
-	 *             locally, but this fails.
-	 *             <li>Proxy settings say that the host should be contacted
-	 *             directly but host name can't be resolved.
-	 *             </ol>
-	 * @throws SocksException
-	 *             If one of the following happens:
-	 *             <ul>
-	 *             <li>Proxy is is null.
-	 *             <li>Proxy settings say that the host should be contacted
-	 *             directly but this fails.
-	 *             <li>Socks Server can't be contacted.
-	 *             <li>Authentication fails.
-	 *             <li>Connection is not allowed by the SOCKS proxy.
-	 *             <li>SOCKS proxy can't establish the connection.
-	 *             <li>Any IO error occured.
-	 *             <li>Any protocol error occured.
-	 *             </ul>
-	 * @throws IOexception
-	 *             if anything is wrong with I/O.
-	 * @see Socks5Proxy#resolveAddrLocally
-	 */
-	public SocksSocket(SocksProxyBase p, String host, int port)
-			throws SocksException, UnknownHostException {
-
-		if (p == null) {
-			throw new SocksException(SocksProxyBase.SOCKS_NO_PROXY);
-		}
-		// proxy=p;
-		proxy = p.copy();
-		remoteHost = host;
-		remotePort = port;
-		if (proxy.isDirect(host)) {
-			remoteIP = InetAddress.getByName(host);
-			doDirect();
-		} else {
-			processReply(proxy.connect(host, port));
-		}
-	}
-
-	/**
-	 * Tryies to connect to given ip and port using default proxy. If no default
-	 * proxy speciefied it throws SocksException with error code SOCKS_NO_PROXY.
-	 * 
-	 * @param ip
-	 *            Machine to connect to.
-	 * @param port
-	 *            Port to which to connect.
-	 * @see SocksSocket#SocksSocket(SocksProxyBase,String,int)
-	 */
-	public SocksSocket(InetAddress ip, int port) throws SocksException {
-		this(SocksProxyBase.defaultProxy, ip, port);
-	}
-
-	/**
-	 * Connects to given ip and port using given Proxy server.
-	 * 
-	 * @param p
-	 *            Proxy to use.
-	 * @param ip
-	 *            Machine to connect to.
-	 * @param port
-	 *            Port to which to connect.
-	 */
-	public SocksSocket(SocksProxyBase p, InetAddress ip, int port)
-			throws SocksException {
-		if (p == null) {
-			throw new SocksException(SocksProxyBase.SOCKS_NO_PROXY);
-		}
-		this.proxy = p.copy();
-		this.remoteIP = ip;
-		this.remotePort = port;
-		this.remoteHost = ip.getHostName();
-		if (proxy.isDirect(remoteIP)) {
-			doDirect();
-		} else {
-			processReply(proxy.connect(ip, port));
-		}
-	}
-
-	/**
-	 * These 2 constructors are used by the SocksServerSocket. This socket
-	 * simply overrides remoteHost, remotePort
-	 */
-	protected SocksSocket(String host, int port, SocksProxyBase proxy) {
-		this.remotePort = port;
-		this.proxy = proxy;
-		this.localIP = proxy.proxySocket.getLocalAddress();
-		this.localPort = proxy.proxySocket.getLocalPort();
-		this.remoteHost = host;
-	}
-
-	protected SocksSocket(InetAddress ip, int port, SocksProxyBase proxy) {
-		remoteIP = ip;
-		remotePort = port;
-		this.proxy = proxy;
-		this.localIP = proxy.proxySocket.getLocalAddress();
-		this.localPort = proxy.proxySocket.getLocalPort();
-		remoteHost = remoteIP.getHostName();
-	}
-
-	/**
-	 * Same as Socket
-	 */
-	public void close() throws IOException {
-		if (proxy != null) {
-			proxy.endSession();
-		}
-		proxy = null;
-	}
-
-	/**
-	 * Same as Socket
-	 */
-	public InputStream getInputStream() {
-		return proxy.in;
-	}
-
-	/**
-	 * Same as Socket
-	 */
-	public OutputStream getOutputStream() {
-		return proxy.out;
-	}
-
-	/**
-	 * Same as Socket
-	 */
-	public int getPort() {
-		return remotePort;
-	}
-
-	/**
-	 * Returns remote host name, it is usefull in cases when addresses are
-	 * resolved by proxy, and we can't create InetAddress object.
-	 * 
-	 * @return The name of the host this socket is connected to.
-	 */
-	public String getHost() {
-		return remoteHost;
-	}
-
-	/**
-	 * Get remote host as InetAddress object, might return null if addresses are
-	 * resolved by proxy, and it is not possible to resolve it locally
-	 * 
-	 * @return Ip address of the host this socket is connected to, or null if
-	 *         address was returned by the proxy as DOMAINNAME and can't be
-	 *         resolved locally.
-	 */
-	public InetAddress getInetAddress() {
-		if (remoteIP == null) {
-			try {
-				remoteIP = InetAddress.getByName(remoteHost);
-			} catch (final UnknownHostException e) {
-				return null;
-			}
-		}
-		return remoteIP;
-	}
-
-	/**
-	 * Get the port assigned by the proxy for the socket, not the port on locall
-	 * machine as in Socket.
-	 * 
-	 * @return Port of the socket used on the proxy server.
-	 */
-	public int getLocalPort() {
-		return localPort;
-	}
-
-	/**
-	 * Get address assigned by proxy to make a remote connection, it might be
-	 * different from the host specified for the proxy. Can return null if socks
-	 * server returned this address as hostname and it can't be resolved
-	 * locally, use getLocalHost() then.
-	 * 
-	 * @return Address proxy is using to make a connection.
-	 */
-	public InetAddress getLocalAddress() {
-		if (localIP == null) {
-			try {
-				localIP = InetAddress.getByName(localHost);
-			} catch (final UnknownHostException e) {
-				return null;
-			}
-		}
-		return localIP;
-	}
-
-	/**
-	 * Get name of the host, proxy has assigned to make a remote connection for
-	 * this socket. This method is usefull when proxy have returned address as
-	 * hostname, and we can't resolve it on this machine.
-	 * 
-	 * @return The name of the host proxy is using to make a connection.
-	 */
-	public String getLocalHost() {
-		return localHost;
-	}
-
-	/**
-	 * Same as socket.
-	 */
-	public void setSoLinger(boolean on, int val) throws SocketException {
-		proxy.proxySocket.setSoLinger(on, val);
-	}
-
-	/**
-	 * Same as socket.
-	 */
-	public int getSoLinger(int timeout) throws SocketException {
-		return proxy.proxySocket.getSoLinger();
-	}
-
-	/**
-	 * Same as socket.
-	 */
-	public void setSoTimeout(int timeout) throws SocketException {
-		proxy.proxySocket.setSoTimeout(timeout);
-	}
-
-	/**
-	 * Same as socket.
-	 */
-	public int getSoTimeout(int timeout) throws SocketException {
-		return proxy.proxySocket.getSoTimeout();
-	}
-
-	/**
-	 * Same as socket.
-	 */
-	public void setTcpNoDelay(boolean on) throws SocketException {
-		proxy.proxySocket.setTcpNoDelay(on);
-	}
-
-	/**
-	 * Same as socket.
-	 */
-	public boolean getTcpNoDelay() throws SocketException {
-		return proxy.proxySocket.getTcpNoDelay();
-	}
-
-	/**
-	 * Get string representation of the socket.
-	 */
-	public String toString() {
-		if (directSock != null) {
-			return "Direct connection:" + directSock;
-		}
-		StringBuffer sb = new StringBuffer();
-		sb.append("Proxy:");
-		sb.append(proxy);
-		sb.append(";");
-		sb.append("addr:");
-		sb.append(remoteHost);
-		sb.append(",port:");
-		sb.append(remotePort);
-		sb.append(",localport:");
-		sb.append(localPort);
-		return sb.toString();
-
-	}
-
-	// Private Methods
-	// ////////////////
-
-	private void processReply(ProxyMessage reply) throws SocksException {
-		localPort = reply.port;
-		/*
-		 * If the server have assigned same host as it was contacted on it might
-		 * return an address of all zeros
-		 */
-		if (reply.host.equals("0.0.0.0")) {
-			localIP = proxy.proxyIP;
-			localHost = localIP.getHostName();
-		} else {
-			localHost = reply.host;
-			localIP = reply.ip;
-		}
-	}
-
-	private void doDirect() throws SocksException {
-		try {
-			//log.debug("IP: {}_{}", remoteIP, remotePort);
-			directSock = new Socket(remoteIP, remotePort);
-			proxy.out = directSock.getOutputStream();
-			proxy.in = directSock.getInputStream();
-			proxy.proxySocket = directSock;
-			localIP = directSock.getLocalAddress();
-			localPort = directSock.getLocalPort();
-		} catch (final IOException io_ex) {
-			final int errCode = SocksProxyBase.SOCKS_DIRECT_FAILED;
-			throw new SocksException(errCode, "Direct connect failed:", io_ex);
-		}
-	}
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPEncapsulation.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPEncapsulation.java
deleted file mode 100644
index eaa46141..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPEncapsulation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-/**
- * This interface provides for datagram encapsulation for SOCKSv5 protocol.
- * <p>
- * SOCKSv5 allows for datagrams to be encapsulated for purposes of integrity
- * and/or authenticity. How it should be done is aggreed during the
- * authentication stage, and is authentication dependent. This interface is
- * provided to allow this encapsulation.
- * 
- * @see Authentication
- */
-public interface UDPEncapsulation {
-
-	/**
-	 * This method should provide any authentication depended transformation on
-	 * datagrams being send from/to the client.
-	 * 
-	 * @param data
-	 *            Datagram data (including any SOCKS related bytes), to be
-	 *            encapsulated/decapsulated.
-	 * @param out
-	 *            Wether the data is being send out. If true method should
-	 *            encapsulate/encrypt data, otherwise it should decapsulate/
-	 *            decrypt data.
-	 * @throw IOException if for some reason data can be transformed correctly.
-	 * @return Should return byte array containing data after transformation. It
-	 *         is possible to return same array as input, if transformation only
-	 *         involves bit mangling, and no additional data is being added or
-	 *         removed.
-	 */
-	byte[] udpEncapsulate(byte[] data, boolean out) throws java.io.IOException;
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPRelayServer.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPRelayServer.java
deleted file mode 100644
index 33ec4ed5..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPRelayServer.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.UnknownHostException;
-
-import com.runjva.sourceforge.jsocks.server.ServerAuthenticator;
-
-/**
- * UDP Relay server, used by ProxyServer to perform udp forwarding.
- */
-class UDPRelayServer implements Runnable {
-
-	DatagramSocket client_sock;
-	DatagramSocket remote_sock;
-
-	Socket controlConnection;
-
-	int relayPort;
-	InetAddress relayIP;
-
-	Thread pipe_thread1, pipe_thread2;
-	Thread master_thread;
-
-	ServerAuthenticator auth;
-
-	long lastReadTime;
-	
-	static SocksProxyBase proxy = null;
-	static int datagramSize = 0xFFFF;// 64K, a bit more than max udp size
-	static int iddleTimeout = 180000;// 3 minutes
-
-	/**
-	 * Constructs UDP relay server to communicate with client on given ip and
-	 * port.
-	 * 
-	 * @param clientIP
-	 *            Address of the client from whom datagrams will be recieved and
-	 *            to whom they will be forwarded.
-	 * @param clientPort
-	 *            Clients port.
-	 * @param master_thread
-	 *            Thread which will be interrupted, when UDP relay server
-	 *            stoppes for some reason.
-	 * @param controlConnection
-	 *            Socket which will be closed, before interrupting the master
-	 *            thread, it is introduced due to a bug in windows JVM which
-	 *            does not throw InterruptedIOException in threads which block
-	 *            in I/O operation.
-	 */
-	public UDPRelayServer(InetAddress clientIP, int clientPort,
-			Thread master_thread, Socket controlConnection,
-			ServerAuthenticator auth) throws IOException {
-
-		this.master_thread = master_thread;
-		this.controlConnection = controlConnection;
-		this.auth = auth;
-
-		client_sock = new Socks5DatagramSocket(true,
-				auth.getUdpEncapsulation(), clientIP, clientPort);
-
-		relayPort = client_sock.getLocalPort();
-		relayIP = client_sock.getLocalAddress();
-
-		if (relayIP.getHostAddress().equals("0.0.0.0")) {
-			relayIP = InetAddress.getLocalHost();
-		}
-
-		if (proxy == null) {
-			remote_sock = new DatagramSocket();
-		} else {
-			remote_sock = new Socks5DatagramSocket(proxy, 0, null);
-		}
-	}
-
-	// Public methods
-	// ///////////////
-
-	/**
-	 * Sets the timeout for UDPRelay server.<br>
-	 * Zero timeout implies infinity.<br>
-	 * Default timeout is 3 minutes.
-	 */
-
-	static public void setTimeout(int timeout) {
-		iddleTimeout = timeout;
-	}
-
-	/**
-	 * Sets the size of the datagrams used in the UDPRelayServer.<br>
-	 * Default size is 64K, a bit more than maximum possible size of the
-	 * datagram.
-	 */
-	static public void setDatagramSize(int size) {
-		datagramSize = size;
-	}
-
-	/**
-	 * Port to which client should send datagram for association.
-	 */
-	public int getRelayPort() {
-		return relayPort;
-	}
-
-	/**
-	 * IP address to which client should send datagrams for association.
-	 */
-	public InetAddress getRelayIP() {
-		return relayIP;
-	}
-
-	/**
-	 * Starts udp relay server. Spawns two threads of execution and returns.
-	 */
-	public void start() throws IOException {
-		remote_sock.setSoTimeout(iddleTimeout);
-		client_sock.setSoTimeout(iddleTimeout);
-
-		//log.info("Starting UDP relay server on {}:{}", relayIP, relayPort);
-		//log.info("Remote socket {}:{}", remote_sock.getLocalAddress(),
-			//	remote_sock.getLocalPort());
-
-		pipe_thread1 = new Thread(this, "pipe1");
-		pipe_thread2 = new Thread(this, "pipe2");
-
-		lastReadTime = System.currentTimeMillis();
-
-		pipe_thread1.start();
-		pipe_thread2.start();
-	}
-
-	/**
-	 * Stops Relay server.
-	 * <p>
-	 * Does not close control connection, does not interrupt master_thread.
-	 */
-	public synchronized void stop() {
-		master_thread = null;
-		controlConnection = null;
-		abort();
-	}
-
-	// Runnable interface
-	// //////////////////
-	public void run() {
-		try {
-			if (Thread.currentThread().getName().equals("pipe1")) {
-				pipe(remote_sock, client_sock, false);
-			} else {
-				pipe(client_sock, remote_sock, true);
-			}
-		} catch (final IOException ioe) {
-		} finally {
-			abort();
-			//log.info("UDP Pipe thread " + Thread.currentThread().getName()
-				//	+ " stopped.");
-		}
-
-	}
-
-	// Private methods
-	// ///////////////
-	private synchronized void abort() {
-		if (pipe_thread1 == null) {
-			return;
-		}
-
-		//log.info("Aborting UDP Relay Server");
-
-		remote_sock.close();
-		client_sock.close();
-
-		if (controlConnection != null) {
-			try {
-				controlConnection.close();
-			} catch (final IOException ioe) {
-			}
-		}
-
-		if (master_thread != null) {
-			master_thread.interrupt();
-		}
-
-		pipe_thread1.interrupt();
-		pipe_thread2.interrupt();
-
-		pipe_thread1 = null;
-	}
-
-	private void pipe(DatagramSocket from, DatagramSocket to, boolean out)
-			throws IOException {
-		final byte[] data = new byte[datagramSize];
-		final DatagramPacket dp = new DatagramPacket(data, data.length);
-
-		while (true) {
-			try {
-				from.receive(dp);
-				lastReadTime = System.currentTimeMillis();
-
-				if (auth.checkRequest(dp, out)) {
-					to.send(dp);
-				}
-
-			} catch (final UnknownHostException uhe) {
-				//log.info("Dropping datagram for unknown host");
-			} catch (final InterruptedIOException iioe) {
-				// log("Interrupted: "+iioe);
-				// If we were interrupted by other thread.
-				if (iddleTimeout == 0) {
-					return;
-				}
-
-				// If last datagram was received, long time ago, return.
-				final long timeSinceRead = System.currentTimeMillis()
-						- lastReadTime;
-				if (timeSinceRead >= iddleTimeout - 100) {
-					return;
-				}
-			}
-			dp.setLength(data.length);
-		}
-	}
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UserPasswordAuthentication.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UserPasswordAuthentication.java
deleted file mode 100644
index 2d5e6001..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UserPasswordAuthentication.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-/**
- * SOCKS5 User Password authentication scheme.
- */
-public class UserPasswordAuthentication implements Authentication {
-
-	/** SOCKS ID for User/Password authentication method */
-	public final static int METHOD_ID = 2;
-
-	String userName, password;
-	byte[] request;
-
-	/**
-	 * Create an instance of UserPasswordAuthentication.
-	 * 
-	 * @param userName
-	 *            User Name to send to SOCKS server.
-	 * @param password
-	 *            Password to send to SOCKS server.
-	 */
-	public UserPasswordAuthentication(String userName, String password) {
-		this.userName = userName;
-		this.password = password;
-		formRequest();
-	}
-
-	/**
-	 * Get the user name.
-	 * 
-	 * @return User name.
-	 */
-	public String getUser() {
-		return userName;
-	}
-
-	/**
-	 * Get password
-	 * 
-	 * @return Password
-	 */
-	public String getPassword() {
-		return password;
-	}
-
-	/**
-	 * Does User/Password authentication as defined in rfc1929.
-	 * 
-	 * @return An array containnig in, out streams, or null if authentication
-	 *         fails.
-	 */
-	public Object[] doSocksAuthentication(int methodId,
-			java.net.Socket proxySocket) throws java.io.IOException {
-
-		if (methodId != METHOD_ID) {
-			return null;
-		}
-
-		final java.io.InputStream in = proxySocket.getInputStream();
-		final java.io.OutputStream out = proxySocket.getOutputStream();
-
-		out.write(request);
-		final int version = in.read();
-		if (version < 0) {
-			return null; // Server closed connection
-		}
-		final int status = in.read();
-		if (status != 0) {
-			return null; // Server closed connection, or auth failed.
-		}
-
-		return new Object[] { in, out };
-	}
-
-	// Private methods
-	// ////////////////
-
-	/** Convert UserName password in to binary form, ready to be send to server */
-	private void formRequest() {
-		final byte[] user_bytes = userName.getBytes();
-		final byte[] password_bytes = password.getBytes();
-
-		request = new byte[3 + user_bytes.length + password_bytes.length];
-		request[0] = (byte) 1;
-		request[1] = (byte) user_bytes.length;
-		System.arraycopy(user_bytes, 0, request, 2, user_bytes.length);
-		request[2 + user_bytes.length] = (byte) password_bytes.length;
-		System.arraycopy(password_bytes, 0, request, 3 + user_bytes.length,
-				password_bytes.length);
-	}
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/Ident.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/Ident.java
deleted file mode 100644
index f2b16829..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/Ident.java
+++ /dev/null
@@ -1,171 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.InterruptedIOException;
-import java.net.ConnectException;
-import java.net.Socket;
-import java.util.StringTokenizer;
-
-/**
- * Class Ident provides means to obtain user name of the owner of the socket on
- * remote machine, providing remote machine runs identd daemon.
- * <p>
- * To use it: <tt><pre>
-   Socket s = ss.accept();
-   Ident id = new Ident(s);
-   if(id.successful) goUseUser(id.userName);
-   else handleIdentError(id.errorCode,id.errorMessage)
-   </pre></tt>
- */
-public class Ident {
-
-	/** Error Message can be null. */
-	public String errorMessage;
-
-	/** Host type as returned by daemon, can be null, if error happened */
-	public String hostType;
-
-	/** User name as returned by the identd daemon, or null, if it failed */
-	public String userName;
-
-	/**
-	 * If this is true then userName and hostType contain valid values. Else
-	 * errorCode contain the error code, and errorMessage contains the
-	 * corresponding message.
-	 */
-	public boolean successful;
-
-	/** Error code */
-	public int errorCode;
-
-	/** Identd on port 113 can't be contacted */
-	public static final int ERR_NO_CONNECT = 1;
-
-	/** Connection timed out */
-	public static final int ERR_TIMEOUT = 2;
-
-	/**
-	 * Identd daemon responded with ERROR, in this case errorMessage contains
-	 * the string explanation, as send by the daemon.
-	 */
-	public static final int ERR_PROTOCOL = 3;
-
-	/**
-	 * When parsing server response protocol error happened.
-	 */
-	public static final int ERR_PROTOCOL_INCORRECT = 4;
-
-	/**
-	 * Maximum amount of time we should wait before dropping the connection to
-	 * identd server.Setting it to 0 implies infinit timeout.
-	 */
-	public static final int connectionTimeout = 10000;
-
-	/**
-	 * Constructor tries to connect to Identd daemon on the host of the given
-	 * socket, and retrieve user name of the owner of given socket connection on
-	 * remote machine. After constructor returns public fields are initialised
-	 * to whatever the server returned.
-	 * <p>
-	 * If user name was successfully retrieved successful is set to true, and
-	 * userName and hostType are set to whatever server returned. If however for
-	 * some reason user name was not obtained, successful is set to false and
-	 * errorCode contains the code explaining the reason of failure, and
-	 * errorMessage contains human readable explanation.
-	 * <p>
-	 * Constructor may block, for a while.
-	 * 
-	 * @param s
-	 *            Socket whose ownership on remote end should be obtained.
-	 */
-	public Ident(Socket s) {
-		Socket sock = null;
-		successful = false; // We are pessimistic
-
-		try {
-			sock = new Socket(s.getInetAddress(), 113);
-			sock.setSoTimeout(connectionTimeout);
-			final byte[] request = ("" + s.getPort() + " , " + s.getLocalPort() + "\r\n")
-					.getBytes();
-
-			sock.getOutputStream().write(request);
-
-			final BufferedReader in = new BufferedReader(new InputStreamReader(
-					sock.getInputStream()));
-
-			parseResponse(in.readLine());
-
-		} catch (final InterruptedIOException iioe) {
-			errorCode = ERR_TIMEOUT;
-			errorMessage = "Connection to identd timed out.";
-		} catch (final ConnectException ce) {
-			errorCode = ERR_NO_CONNECT;
-			errorMessage = "Connection to identd server failed.";
-
-		} catch (final IOException ioe) {
-			errorCode = ERR_NO_CONNECT;
-			errorMessage = "" + ioe;
-		} finally {
-			try {
-				if (sock != null) {
-					sock.close();
-				}
-			} catch (final IOException ioe) {
-				//log.warn("Could not close socket", ioe);
-			}
-		}
-	}
-
-	private void parseResponse(String response) {
-		if (response == null) {
-			errorCode = ERR_PROTOCOL_INCORRECT;
-			errorMessage = "Identd server closed connection.";
-			return;
-		}
-
-		final StringTokenizer st = new StringTokenizer(response, ":");
-		if (st.countTokens() < 3) {
-			errorCode = ERR_PROTOCOL_INCORRECT;
-			errorMessage = "Can't parse server response.";
-			return;
-		}
-
-		st.nextToken(); // Discard first token, it's basically what we have send
-		final String command = st.nextToken().trim().toUpperCase();
-
-		if (command.equals("USERID") && (st.countTokens() >= 2)) {
-			successful = true;
-			hostType = st.nextToken().trim();
-			userName = st.nextToken("").substring(1);// Get all that is left
-		} else if (command.equals("ERROR")) {
-			errorCode = ERR_PROTOCOL;
-			errorMessage = st.nextToken();
-		} else {
-			errorCode = ERR_PROTOCOL_INCORRECT;
-			System.out.println("Opa!");
-			errorMessage = "Can't parse server response.";
-		}
-
-	}
-
-	// /////////////////////////////////////////////
-	// USED for Testing
-	/*
-	 * public static void main(String[] args) throws IOException{
-	 * 
-	 * Socket s = null; s = new Socket("gp101-16", 1391);
-	 * 
-	 * Ident id = new Ident(s); if(id.successful){
-	 * System.out.println("User: "+id.userName);
-	 * System.out.println("HostType: "+id.hostType); }else{
-	 * System.out.println("ErrorCode: "+id.errorCode);
-	 * System.out.println("ErrorMessage: "+id.errorMessage);
-	 * 
-	 * }
-	 * 
-	 * if(s!= null) s.close(); } //
-	 */
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/IdentAuthenticator.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/IdentAuthenticator.java
deleted file mode 100644
index 70e25936..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/IdentAuthenticator.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import com.runjva.sourceforge.jsocks.protocol.InetRange;
-import com.runjva.sourceforge.jsocks.protocol.ProxyMessage;
-
-/**
- * An implementation of socks.ServerAuthentication which provides simple
- * authentication based on the host from which the connection is made and the
- * name of the user on the remote machine, as reported by identd daemon on the
- * remote machine.
- * <p>
- * It can also be used to provide authentication based only on the contacting
- * host address.
- */
-
-public class IdentAuthenticator extends ServerAuthenticatorBase {
-	/** Vector of InetRanges */
-	Vector<InetRange> hosts;
-
-	/** Vector of user hashes */
-	Vector<Hashtable<?, ?>> users;
-
-	String user;
-
-	/**
-	 * Constructs empty IdentAuthenticator.
-	 */
-	public IdentAuthenticator() {
-		hosts = new Vector<InetRange>();
-		users = new Vector<Hashtable<?, ?>>();
-	}
-
-	/**
-	 * Used to create instances returned from startSession.
-	 * 
-	 * @param in
-	 *            Input stream.
-	 * @param out
-	 *            OutputStream.
-	 * @param user
-	 *            Username associated with this connection,could be null if name
-	 *            was not required.
-	 */
-	IdentAuthenticator(InputStream in, OutputStream out, String user) {
-		super(in, out);
-		this.user = user;
-	}
-
-	/**
-	 * Adds range of addresses from which connection is allowed. Hashtable users
-	 * should contain user names as keys and anything as values (value is not
-	 * used and will be ignored).
-	 * 
-	 * @param hostRange
-	 *            Range of ip addresses from which connection is allowed.
-	 * @param users
-	 *            Hashtable of users for whom connection is allowed, or null to
-	 *            indicate that anybody is allowed to connect from the hosts
-	 *            within given range.
-	 */
-	public synchronized void add(InetRange hostRange, Hashtable<?, ?> users) {
-		this.hosts.addElement(hostRange);
-		this.users.addElement(users);
-	}
-
-	/**
-	 * Grants permission only to those users, who connect from one of the hosts
-	 * registered with add(InetRange,Hashtable) and whose names, as reported by
-	 * identd daemon, are listed for the host the connection came from.
-	 */
-	public ServerAuthenticator startSession(Socket s) throws IOException {
-
-		final int ind = getRangeIndex(s.getInetAddress());
-		String user = null;
-
-		// System.out.println("getRangeReturned:"+ind);
-
-		if (ind < 0) {
-			return null; // Host is not on the list.
-		}
-
-		final ServerAuthenticator serverAuthenticator = super.startSession(s);
-		final ServerAuthenticatorBase auth = (ServerAuthenticatorBase) serverAuthenticator;
-
-		// System.out.println("super.startSession() returned:"+auth);
-		if (auth == null) {
-			return null;
-		}
-
-		// do the authentication
-
-		final Hashtable<?, ?> user_names = users.elementAt(ind);
-
-		if (user_names != null) { // If need to do authentication
-			Ident ident;
-			ident = new Ident(s);
-			// If can't obtain user name, fail
-			if (!ident.successful) {
-				return null;
-			}
-			// If user name is not listed for this address, fail
-			if (!user_names.containsKey(ident.userName)) {
-				return null;
-			}
-			user = ident.userName;
-		}
-		return new IdentAuthenticator(auth.in, auth.out, user);
-
-	}
-
-	/**
-	 * For SOCKS5 requests allways returns true. For SOCKS4 requests checks
-	 * wether the user name supplied in the request corresponds to the name
-	 * obtained from the ident daemon.
-	 */
-	public boolean checkRequest(ProxyMessage msg, java.net.Socket s) {
-		// If it's version 5 request, or if anybody is permitted, return true;
-		if ((msg.version == 5) || (user == null)) {
-			return true;
-		}
-
-		if (msg.version != 4) {
-			return false; // Who knows?
-		}
-
-		return user.equals(msg.user);
-	}
-
-	/** Get String representaion of the IdentAuthenticator. */
-	public String toString() {
-		String s = "";
-
-		for (int i = 0; i < hosts.size(); ++i) {
-			s += "(Range:" + hosts.elementAt(i) + "," + //
-					" Users:" + userNames(i) + ") ";
-		}
-		return s;
-	}
-
-	// Private Methods
-	// ////////////////
-	private int getRangeIndex(InetAddress ip) {
-		int index = 0;
-		final Enumeration<InetRange> enumx = hosts.elements();
-		while (enumx.hasMoreElements()) {
-			final InetRange ir = enumx.nextElement();
-			if (ir.contains(ip)) {
-				return index;
-			}
-			index++;
-		}
-		return -1; // Not found
-	}
-
-	private String userNames(int i) {
-		if (users.elementAt(i) == null) {
-			return "Everybody is permitted.";
-		}
-
-		final Enumeration<?> enumx = ((Hashtable<?, ?>) users.elementAt(i))
-				.keys();
-		if (!enumx.hasMoreElements()) {
-			return "";
-		}
-		String s = enumx.nextElement().toString();
-		while (enumx.hasMoreElements()) {
-			s += "; " + enumx.nextElement();
-		}
-
-		return s;
-	}
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticator.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticator.java
deleted file mode 100644
index 3014a92d..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticator.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.DatagramPacket;
-import java.net.Socket;
-
-import com.runjva.sourceforge.jsocks.protocol.ProxyMessage;
-import com.runjva.sourceforge.jsocks.protocol.UDPEncapsulation;
-
-/**
- * Classes implementing this interface should provide socks server with
- * authentication and authorization of users.
- **/
-public interface ServerAuthenticator {
-
-	/**
-	 * This method is called when a new connection accepted by the server.
-	 * <p>
-	 * At this point no data have been extracted from the connection. It is
-	 * responsibility of this method to ensure that the next byte in the stream
-	 * after this method have been called is the first byte of the socks request
-	 * message. For SOCKSv4 there is no authentication data and the first byte
-	 * in the stream is part of the request. With SOCKSv5 however there is an
-	 * authentication data first. It is expected that implementaions will
-	 * process this authentication data.
-	 * <p>
-	 * If authentication was successful an instance of ServerAuthentication
-	 * should be returned, it later will be used by the server to perform
-	 * authorization and some other things. If authentication fails null should
-	 * be returned, or an exception may be thrown.
-	 * 
-	 * @param s
-	 *            Accepted Socket.
-	 * @return An instance of ServerAuthenticator to be used for this connection
-	 *         or null
-	 */
-	ServerAuthenticator startSession(Socket s) throws IOException;
-
-	/**
-	 * This method should return input stream which should be used on the
-	 * accepted socket.
-	 * <p>
-	 * SOCKSv5 allows to have multiple authentication methods, and these methods
-	 * might require some kind of transformations being made on the data.
-	 * <p>
-	 * This method is called on the object returned from the startSession
-	 * function.
-	 */
-	InputStream getInputStream();
-
-	/**
-	 * This method should return output stream to use to write to the accepted
-	 * socket.
-	 * <p>
-	 * SOCKSv5 allows to have multiple authentication methods, and these methods
-	 * might require some kind of transformations being made on the data.
-	 * <p>
-	 * This method is called on the object returned from the startSession
-	 * function.
-	 */
-	OutputStream getOutputStream();
-
-	/**
-	 * This method should return UDPEncapsulation, which should be used on the
-	 * datagrams being send in/out.
-	 * <p>
-	 * If no transformation should be done on the datagrams, this method should
-	 * return null.
-	 * <p>
-	 * This method is called on the object returned from the startSession
-	 * function.
-	 */
-
-	UDPEncapsulation getUdpEncapsulation();
-
-	/**
-	 * This method is called when a request have been read.
-	 * <p>
-	 * Implementation should decide wether to grant request or not. Returning
-	 * true implies granting the request, false means request should be
-	 * rejected.
-	 * <p>
-	 * This method is called on the object returned from the startSession
-	 * function.
-	 * 
-	 * @param msg
-	 *            Request message.
-	 * @return true to grant request, false to reject it.
-	 */
-	boolean checkRequest(ProxyMessage msg);
-
-	/**
-	 * This method is called when datagram is received by the server.
-	 * <p>
-	 * Implementaions should decide wether it should be forwarded or dropped. It
-	 * is expecteed that implementation will use datagram address and port
-	 * information to make a decision, as well as anything else. Address and
-	 * port of the datagram are always correspond to remote machine. It is
-	 * either destination or source address. If out is true address is
-	 * destination address, else it is a source address, address of the machine
-	 * from which datagram have been received for the client.
-	 * <p>
-	 * Implementaions should return true if the datagram is to be forwarded, and
-	 * false if the datagram should be dropped.
-	 * <p>
-	 * This method is called on the object returned from the startSession
-	 * function.
-	 * 
-	 * @param out
-	 *            If true the datagram is being send out(from the client),
-	 *            otherwise it is an incoming datagram.
-	 * @return True to forward datagram false drop it silently.
-	 */
-	boolean checkRequest(DatagramPacket dp, boolean out);
-
-	/**
-	 * This method is called when session is completed. Either due to normal
-	 * termination or due to any error condition.
-	 * <p>
-	 * This method is called on the object returned from the startSession
-	 * function.
-	 */
-	void endSession();
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorBase.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorBase.java
deleted file mode 100644
index 79acd582..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorBase.java
+++ /dev/null
@@ -1,187 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PushbackInputStream;
-import java.net.Socket;
-
-import com.runjva.sourceforge.jsocks.protocol.ProxyMessage;
-import com.runjva.sourceforge.jsocks.protocol.UDPEncapsulation;
-
-/**
- * An implementation of ServerAuthenticator, which does <b>not</b> do any
- * authentication.
- * <P>
- * <FONT size="+3" color ="FF0000"> Warning!!</font><br>
- * Should not be used on machines which are not behind the firewall.
- * <p>
- * It is only provided to make implementing other authentication schemes easier.
- * <br>
- * For Example: <tt><pre>
-   class MyAuth extends socks.server.ServerAuthenticator{
-    ...
-    public ServerAuthenticator startSession(java.net.Socket s){
-      if(!checkHost(s.getInetAddress()) return null;
-      return super.startSession(s);
-    }
-
-    boolean checkHost(java.net.Inetaddress addr){
-      boolean allow;
-      //Do it somehow
-      return allow;
-    }
-   }
-</pre></tt>
- */
-public abstract class ServerAuthenticatorBase implements ServerAuthenticator {
-
-	static final byte[] socks5response = { 5, 0 };
-
-	InputStream in;
-	OutputStream out;
-
-	/**
-	 * Creates new instance of the ServerAuthenticatorNone.
-	 */
-	public ServerAuthenticatorBase() {
-		this.in = null;
-		this.out = null;
-	}
-
-	/**
-	 * Constructs new ServerAuthenticatorNone object suitable for returning from
-	 * the startSession function.
-	 * 
-	 * @param in
-	 *            Input stream to return from getInputStream method.
-	 * @param out
-	 *            Output stream to return from getOutputStream method.
-	 */
-	public ServerAuthenticatorBase(InputStream in, OutputStream out) {
-		this.in = in;
-		this.out = out;
-	}
-
-	/**
-	 * Grants access to everyone.Removes authentication related bytes from the
-	 * stream, when a SOCKS5 connection is being made, selects an authentication
-	 * NONE.
-	 */
-	public ServerAuthenticator startSession(Socket s) throws IOException {
-
-		final PushbackInputStream in = new PushbackInputStream(s
-				.getInputStream());
-		final OutputStream out = s.getOutputStream();
-
-		final int version = in.read();
-		if (version == 5) {
-			if (!selectSocks5Authentication(in, out, 0)) {
-				return null;
-			}
-		} else if (version == 4) {
-			// Else it is the request message already, version 4
-			in.unread(version);
-		} else {
-			return null;
-		}
-
-		return new ServerAuthenticatorNone(in, out);
-	}
-
-	/**
-	 * Get input stream.
-	 * 
-	 * @return Input stream speciefied in the constructor.
-	 */
-	public InputStream getInputStream() {
-		return in;
-	}
-
-	/**
-	 * Get output stream.
-	 * 
-	 * @return Output stream speciefied in the constructor.
-	 */
-	public OutputStream getOutputStream() {
-		return out;
-	}
-
-	/**
-	 * Allways returns null.
-	 * 
-	 * @return null
-	 */
-	public UDPEncapsulation getUdpEncapsulation() {
-		return null;
-	}
-
-	/**
-	 * Allways returns true.
-	 */
-	public boolean checkRequest(ProxyMessage msg) {
-		return true;
-	}
-
-	/**
-	 * Allways returns true.
-	 */
-	public boolean checkRequest(java.net.DatagramPacket dp, boolean out) {
-		return true;
-	}
-
-	/**
-	 * Does nothing.
-	 */
-	public void endSession() {
-	}
-
-	/**
-	 * Convinience routine for selecting SOCKSv5 authentication.
-	 * <p>
-	 * This method reads in authentication methods that client supports, checks
-	 * wether it supports given method. If it does, the notification method is
-	 * written back to client, that this method have been chosen for
-	 * authentication. If given method was not found, authentication failure
-	 * message is send to client ([5,FF]).
-	 * 
-	 * @param in
-	 *            Input stream, version byte should be removed from the stream
-	 *            before calling this method.
-	 * @param out
-	 *            Output stream.
-	 * @param methodId
-	 *            Method which should be selected.
-	 * @return true if methodId was found, false otherwise.
-	 */
-	static public boolean selectSocks5Authentication(InputStream in,
-			OutputStream out, int methodId) throws IOException {
-
-		final int num_methods = in.read();
-		if (num_methods <= 0) {
-			return false;
-		}
-		final byte method_ids[] = new byte[num_methods];
-		final byte response[] = new byte[2];
-		boolean found = false;
-
-		response[0] = (byte) 5; // SOCKS version
-		response[1] = (byte) 0xFF; // Not found, we are pessimistic
-
-		int bread = 0; // bytes read so far
-		while (bread < num_methods) {
-			bread += in.read(method_ids, bread, num_methods - bread);
-		}
-
-		for (int i = 0; i < num_methods; ++i) {
-			if (method_ids[i] == methodId) {
-				found = true;
-				response[1] = (byte) methodId;
-				break;
-			}
-		}
-
-		out.write(response);
-		return found;
-	}
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorNone.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorNone.java
deleted file mode 100644
index 0e976773..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorNone.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Simplest possible ServerAuthenticator implementation. Extends common base.
- * 
- */
-public class ServerAuthenticatorNone extends ServerAuthenticatorBase {
-
-	public ServerAuthenticatorNone(InputStream in, OutputStream out) {
-		super(in, out);
-	}
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserPasswordAuthenticator.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserPasswordAuthenticator.java
deleted file mode 100644
index 82980f29..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserPasswordAuthenticator.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-/**
- * This class implements SOCKS5 User/Password authentication scheme as defined
- * in rfc1929,the server side of it. (see docs/rfc1929.txt)
- */
-public class UserPasswordAuthenticator extends ServerAuthenticatorBase {
-
-	static final int METHOD_ID = 2;
-
-	UserValidation validator;
-
-	/**
-	 * Construct a new UserPasswordAuthentication object, with given
-	 * UserVlaidation scheme.
-	 * 
-	 * @param v
-	 *            UserValidation to use for validating users.
-	 */
-	public UserPasswordAuthenticator(UserValidation validator) {
-		this.validator = validator;
-	}
-
-	public ServerAuthenticator startSession(Socket s) throws IOException {
-		final InputStream in = s.getInputStream();
-		final OutputStream out = s.getOutputStream();
-
-		if (in.read() != 5) {
-			return null; // Drop non version 5 messages.
-		}
-
-		if (!selectSocks5Authentication(in, out, METHOD_ID)) {
-			return null;
-		}
-		if (!doUserPasswordAuthentication(s, in, out)) {
-			return null;
-		}
-
-		return new ServerAuthenticatorNone(in, out);
-	}
-
-	// Private Methods
-	// ////////////////
-
-	private boolean doUserPasswordAuthentication(Socket s, InputStream in,
-			OutputStream out) throws IOException {
-		final int version = in.read();
-		if (version != 1) {
-			return false;
-		}
-
-		final int ulen = in.read();
-		if (ulen < 0) {
-			return false;
-		}
-
-		final byte[] user = new byte[ulen];
-		in.read(user);
-		final int plen = in.read();
-		if (plen < 0) {
-			return false;
-		}
-		final byte[] password = new byte[plen];
-		in.read(password);
-
-		if (validator.isUserValid(new String(user), new String(password), s)) {
-			// System.out.println("user valid");
-			out.write(new byte[] { 1, 0 });
-		} else {
-			// System.out.println("user invalid");
-			out.write(new byte[] { 1, 1 });
-			return false;
-		}
-
-		return true;
-	}
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserValidation.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserValidation.java
deleted file mode 100644
index c4f77703..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserValidation.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-/**
- * Interface which provides for user validation, based on user name password and
- * where it connects from.
- */
-public interface UserValidation {
-	/**
-	 * Implementations of this interface are expected to use some or all of the
-	 * information provided plus any information they can extract from other
-	 * sources to decide wether given user should be allowed access to SOCKS
-	 * server, or whatever you use it for.
-	 * 
-	 * @return true to indicate user is valid, false otherwise.
-	 * @param username
-	 *            User whom implementation should validate.
-	 * @param password
-	 *            Password this user provided.
-	 * @param connection
-	 *            Socket which user used to connect to the server.
-	 */
-	boolean isUserValid(String username, String password,
-			java.net.Socket connection);
-}
diff --git a/orbotservice/build.gradle b/orbotservice/build.gradle
index 7160e29d..c416f6e9 100644
--- a/orbotservice/build.gradle
+++ b/orbotservice/build.gradle
@@ -27,8 +27,12 @@ android {
 }
 
 dependencies {
-    implementation project(':jsocksAndroid')
+   // implementation project(':jsocksAndroid')
     implementation 'org.torproject:tor-android-binary:0.4.0.4-rc'
+    implementation 'info.pluggabletransports.aptds:apt-dispatch-library:1.0.6'
+    implementation 'info.pluggabletransports.aptds:apt-meek-obfs4-legacy:1.0.6'
+    implementation 'info.pluggabletransports.aptds:jsocksAndroid:1.0.4'
+
     implementation 'com.android.support:appcompat-v7:28.0.0'
     implementation 'com.jaredrummler:android-shell:1.0.0'
     implementation fileTree(dir: 'libs', include: ['.so'])
diff --git a/orbotservice/src/main/java/org/torproject/android/service/TorService.java b/orbotservice/src/main/java/org/torproject/android/service/TorService.java
index 2561a132..4517a106 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/TorService.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/TorService.java
@@ -44,7 +44,6 @@ import org.torproject.android.control.TorControlConnection;
 import org.torproject.android.service.util.CustomShell;
 import org.torproject.android.service.util.CustomTorResourceInstaller;
 import org.torproject.android.service.util.DummyActivity;
-import org.torproject.android.service.vpn.PDNSDInstaller;
 import org.torproject.android.service.util.Prefs;
 import org.torproject.android.service.util.TorServiceUtils;
 import org.torproject.android.service.util.Utils;
@@ -76,6 +75,9 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeoutException;
 
+import info.pluggabletransports.dispatch.util.TransportListener;
+import info.pluggabletransports.dispatch.util.TransportManager;
+
 public class TorService extends Service implements TorServiceConstants, OrbotConstants
 {
 
@@ -516,8 +518,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
             if (!appCacheHome.exists())
                 appCacheHome.mkdirs();
 
-            fileTor= new File(appBinHome, TorServiceConstants.TOR_ASSET_KEY);
-            fileObfsclient = new File(appBinHome, TorServiceConstants.OBFSCLIENT_ASSET_KEY);
             fileTorRc = new File(appBinHome, TorServiceConstants.TORRC_ASSET_KEY);
             fileControlPort = new File(getFilesDir(), "control.txt");
 
@@ -549,6 +549,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
 
             torUpgradeAndConfig();
 
+            pluggableTransportInstall();
+
             new Thread(new Runnable ()
             {
                 public void run ()
@@ -582,6 +584,27 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
         return mCurrentStatus;
     }
 
+    private boolean pluggableTransportInstall () {
+
+        fileObfsclient = new TransportManager() {
+            @Override
+            public void startTransportSync(TransportListener transportListener) {
+            }
+        }.installTransport(this, OBFSCLIENT_ASSET_KEY);
+
+        if (fileObfsclient != null && fileObfsclient.exists()) {
+
+            fileObfsclient.setReadable(true);
+            fileObfsclient.setExecutable(true);
+            fileObfsclient.setWritable(false);
+            fileObfsclient.setWritable(true, true);
+
+            return fileObfsclient.canExecute();
+        }
+
+        return false;
+    }
+
     private boolean torUpgradeAndConfig() throws IOException, TimeoutException {
         if (isTorUpgradeAndConfigComplete)
             return true;
@@ -609,6 +632,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
         }
 
 
+
+
         return false;
     }
 
@@ -1534,8 +1559,9 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
         }
         else
         {
-
-            if (fileObfsclient.exists() && fileObfsclient.canExecute()) {
+            if (fileObfsclient != null
+                    && fileObfsclient.exists()
+                    && fileObfsclient.canExecute()) {
 
                 loadBridgeDefaults();
 
diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
index b5f294f4..2db02389 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
@@ -341,7 +341,7 @@ public class OrbotVpnManager implements Handler.Callback {
 			        }
 
 		        	mInterface = newInterface;
-			        
+
 		        	isRestart = false;
 
 					//start PDNSD daemon pointing to actual DNS
diff --git a/settings.gradle b/settings.gradle
index 9984a03e..c72325d7 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,2 +1 @@
-include ':jsocksAndroid', ':orbotservice'
-include ':app'
+include ':orbotservice',':app'





More information about the tor-commits mailing list