diff --git a/iodine.c b/iodine.c
index 5dee29d..7ea0440 100644
--- a/iodine.c
+++ b/iodine.c
@@ -110,15 +110,16 @@ tunnel(int tun_fd, int dns_fd)
 static int
 handshake(int dns_fd)
 {
+	struct timeval tv;
+	char server[128];
+	char client[128];
+	char in[4096];
+	int timeout;
+	fd_set fds;
+	int read;
+	int mtu;
 	int i;
 	int r;
-	char *p;
-	int mtu;
-	int read;
-	fd_set fds;
-	int timeout;
-	char in[4096];
-	struct timeval tv;
 
 	timeout = 1;
 	
@@ -142,12 +143,10 @@ handshake(int dns_fd)
 			}
 
 			if (read > 0) {
-				p = strchr(in, '-');
-				if (p) {
-					*p++ = '\0';
-					mtu = atoi(p);
+				if (sscanf(in, "%[^-]-%[^-]-%d", server, client, &mtu) == 3) {
+					printf("%s %s %d\n", server, client, mtu);
 
-					if (tun_setip(in) == 0 && tun_setmtu(atoi(p)) == 0)
+					if (tun_setip(client) == 0 && tun_setmtu(mtu) == 0)
 						return 0;
 					else 
 						warn("Received handshake but b0rk");
@@ -161,10 +160,10 @@ handshake(int dns_fd)
 	return 1;
 }
 
-extern char *__progname;
-
 static void
 usage() {
+	extern char *__progname;
+
 	printf("Usage: %s [-v] [-h] [-f] [-u user] [-t chrootdir] [-d device] "
 			"nameserver topdomain\n", __progname);
 	exit(2);
@@ -172,6 +171,8 @@ usage() {
 
 static void
 help() {
+	extern char *__progname;
+
 	printf("iodine IP over DNS tunneling client\n");
 	printf("Usage: %s [-v] [-h] [-f] [-u user] [-t chrootdir] [-d device] "
 			"nameserver topdomain\n", __progname);
@@ -197,17 +198,17 @@ version() {
 int
 main(int argc, char **argv)
 {
-	int choice;
-	char *newroot;
-	char *username;
-	char *device;
-	int foreground;
 	struct passwd *pw;
+	char *username;
+	int foreground;
+	char *newroot;
+	char *device;
+	int choice;
 
-	newroot = NULL;
 	username = NULL;
-	device = NULL;
 	foreground = 0;
+	newroot = NULL;
+	device = NULL;
 	
 	while ((choice = getopt(argc, argv, "vfhu:t:d:")) != -1) {
 		switch(choice) {
diff --git a/iodined.c b/iodined.c
index e3bc1ee..bf48f94 100644
--- a/iodined.c
+++ b/iodined.c
@@ -58,17 +58,18 @@ sigint(int sig) {
 static int
 tunnel(int tun_fd, int dns_fd)
 {
-	int i;
+	struct in_addr clientip;
+	struct in_addr myip;
+	struct timeval tv;
+	char out[64*1024];
+	char in[64*1024];
+	char *tmp[2];
+	long outlen;
+	fd_set fds;
 	int read;
 	int code;
-	int ipadder;
-	struct in_addr nextip;
-	fd_set fds;
-	struct timeval tv;
-	char in[64*1024];
-	long outlen;
-	char out[64*1024];
-	
+	int i;
+
 	while (running) {
 		if (q.id != 0) {
 			tv.tv_sec = 0;
@@ -114,17 +115,20 @@ tunnel(int tun_fd, int dns_fd)
 			   		continue;
 
 				if(in[0] == 'H' || in[0] == 'h') {
-					ipadder = htonl(my_ip); // To get the last byte last
-					if ((ipadder & 0xFF) == 0xFF) {
-						// IP ends with 255.
-						ipadder--;
-					} else {
-						ipadder++;
-					}
-					nextip.s_addr = ntohl(ipadder);
-					read = snprintf(out, sizeof(out), "%s-%d", inet_ntoa(nextip), my_mtu);
+					myip.s_addr = my_ip;	
+					clientip.s_addr = my_ip + inet_addr("0.0.0.1");
+
+					tmp[0] = strdup(inet_ntoa(myip));
+					tmp[1] = strdup(inet_ntoa(clientip));
+					
+					read = snprintf(out, sizeof(out), "%s-%s-%d", 
+							tmp[0], tmp[1], my_mtu);
+
 					dnsd_send(dns_fd, &q, out, read);
 					q.id = 0;
+
+					free(tmp[1]);
+					free(tmp[0]);
 				} else if((in[0] >= '0' && in[0] <= '9')
 						|| (in[0] >= 'a' && in[0] <= 'f')
 						|| (in[0] >= 'A' && in[0] <= 'F')) {