diff --git a/main.c b/main.c
index 99b85fa..723cc63 100644
--- a/main.c
+++ b/main.c
@@ -22,7 +22,8 @@
     #define close(fd) closesocket(fd)
 #endif
 
-#define VERSION 8
+#define VERSION "0.8.1"
+
 #define MPOOL_INC 16
 
 char oob_char[1] = "a";
@@ -396,7 +397,7 @@ int main(int argc, char **argv)
             clear_params();
             return 0;
         case 'v':
-            printf("%d\n", VERSION);
+            printf("%s\n", VERSION);
             clear_params();
             return 0;
         
diff --git a/proxy.c b/proxy.c
index ab1e1f6..48634cf 100644
--- a/proxy.c
+++ b/proxy.c
@@ -497,27 +497,34 @@ static inline int on_tunnel(struct poolhd *pool, struct eval *val,
 int mode_add_get(struct sockaddr_ina *dst, int m)
 {
     // m < 0: get, m > 0: set, m == 0: delete
-    char *data;
     int len;
     time_t t;
-    struct elem *val;    
+    struct elem *val;
+    
+    struct {
+        uint16_t port;
+        union {
+            struct in_addr  ip4;
+            struct in6_addr ip6;
+        };
+    } str = { .port = dst->in.sin_port };
     
     if (dst->sa.sa_family == AF_INET) {
-        data = (char *)(&dst->in.sin_addr);
-        len = sizeof(dst->in.sin_addr);
+        str.ip4 = dst->in.sin_addr;
+        len = sizeof(str.port) + sizeof(str.ip4);
     }
     else {
-        data = (char *)(&dst->in6.sin6_addr);
-        len = sizeof(dst->in6.sin6_addr);
+        str.ip6 = dst->in6.sin6_addr;
+        len = sizeof(str);
     }
-    int i = mem_index(params.mempool, data, len);
+    int i = mem_index(params.mempool, (char *)&str, len);
     if (m == 0 && i >= 0) {
         mem_delete(params.mempool, i);
         return 0;
     }
     else if (m > 0) {
         time(&t);
-        val = mem_add(params.mempool, data, len, i);
+        val = mem_add(params.mempool, (char *)&str, len, i);
         if (!val) {
             uniperror("mem_add");
             return -1;