diff --git a/contrib/bind9/bin/named/lwresd.c b/contrib/bind9/bin/named/lwresd.c
index 9e434d9..4701ef1 100644
--- a/contrib/bind9/bin/named/lwresd.c
+++ b/contrib/bind9/bin/named/lwresd.c
@@ -556,16 +556,19 @@ listener_bind(ns_lwreslistener_t *listener, isc_sockaddr_t *address) {
 		return (ISC_R_FAMILYNOSUPPORT);
 
 	listener->address = *address;
-
-	if ((pf == AF_INET || pf == AF_INET6) && isc_sockaddr_getport(&listener->address) == 0) {
-		in_port_t port;
-		port = lwresd_g_listenport;
-		if (port == 0)
-			port = LWRES_UDP_PORT;
-		isc_sockaddr_setport(&listener->address, port);
+	
+	if(pf == AF_INET || pf == AF_INET6) {
+
+		if (isc_sockaddr_getport(&listener->address) == 0) {
+			in_port_t port;
+			port = lwresd_g_listenport;
+			if (port == 0)
+				port = LWRES_UDP_PORT;
+			isc_sockaddr_setport(&listener->address, port);
+		}
 		sock_type = isc_sockettype_udp;
 	} else {
-	        sock_type = isc_sockettype_unix;
+		sock_type = isc_sockettype_unix;
 	}
 
 	sock = NULL;
@@ -805,11 +808,21 @@ ns_lwresd_configure(isc_mem_t *mctx, const cfg_obj_t *config) {
 		listenerslist = NULL;
 		(void)cfg_map_get(lwres, "listen-on", &listenerslist);
 		if (listenerslist == NULL) {
+
+
+		  // #define USE_UDP
+#if defined(USE_UDP)
+		  struct in_addr localhost;
+		  isc_sockaddr_t address;
+		  localhost.s_addr = htonl(INADDR_LOOPBACK);
+		  isc_sockaddr_fromin(&address, &localhost, port);
+#else
 			isc_sockaddr_t address;
 			char UNIXSOCKET[] = "/tmp/lwresd.sock";
 			
 			unlink(UNIXSOCKET);
 			isc_sockaddr_frompath(&address, (const char*)&UNIXSOCKET);
+#endif
 			CHECK(configure_listener(&address, lwresd, mctx,
 						 &newlisteners));
 		} else {
diff --git a/contrib/bind9/lib/isc/unix/socket.c b/contrib/bind9/lib/isc/unix/socket.c
index c9aa454..55eab82 100644
--- a/contrib/bind9/lib/isc/unix/socket.c
+++ b/contrib/bind9/lib/isc/unix/socket.c
@@ -1300,8 +1300,13 @@ build_msghdr_send(isc__socket_t *sock, isc_socketevent_t *dev,
 	memset(msg, 0, sizeof(*msg));
 
 	if (!sock->connected) {
-		msg->msg_name = (void *)&dev->address.type.sa;
-		msg->msg_namelen = dev->address.length;
+		if(sock->type == isc_sockettype_udp || sock->type == isc_sockettype_tcp) {
+			msg->msg_name = (void *)&dev->address.type.sa;
+			msg->msg_namelen = dev->address.length;
+	  	} else if (sock->type == isc_sockettype_unix) {
+			msg->msg_name = (void *)&dev->address.type.sunix;
+			msg->msg_namelen = sizeof(dev->address.type.sunix);
+		}
 	} else {
 		msg->msg_name = NULL;
 		msg->msg_namelen = 0;
@@ -1436,7 +1441,7 @@ build_msghdr_recv(isc__socket_t *sock, isc_socketevent_t *dev,
 
 	memset(msg, 0, sizeof(struct msghdr));
 
-	if (sock->type == isc_sockettype_udp) {
+	if (sock->type == isc_sockettype_udp || sock->type == isc_sockettype_unix) {
 		memset(&dev->address, 0, sizeof(dev->address));
 #ifdef BROKEN_RECVMSG
 		if (sock->pf == AF_INET) {
@@ -1517,7 +1522,7 @@ build_msghdr_recv(isc__socket_t *sock, isc_socketevent_t *dev,
 	 * at the top of this function.
 	 */
 #ifdef ISC_NET_RECVOVERFLOW
-	if (sock->type == isc_sockettype_udp) {
+	if (sock->type == isc_sockettype_udp || sock->type == isc_sockettype_unix) {
 		iov[iovcount].iov_base = (void *)(&sock->overflow);
 		iov[iovcount].iov_len = 1;
 		iovcount++;
@@ -1532,7 +1537,7 @@ build_msghdr_recv(isc__socket_t *sock, isc_socketevent_t *dev,
 	msg->msg_controllen = 0;
 	msg->msg_flags = 0;
 #if defined(USE_CMSG)
-	if (sock->type == isc_sockettype_udp) {
+	if (sock->type == isc_sockettype_udp || sock->type == isc_sockettype_unix) {
 		msg->msg_control = sock->recvcmsgbuf;
 		msg->msg_controllen = sock->recvcmsgbuflen;
 	}
@@ -1558,7 +1563,11 @@ set_dev_address(isc_sockaddr_t *address, isc__socket_t *sock,
 	} else if (sock->type == isc_sockettype_tcp) {
 		INSIST(address == NULL);
 		dev->address = sock->peer_address;
+	} else if (sock->type == isc_sockettype_unix) {
+		INSIST(address != NULL);
+		dev->address = *address;
 	}
+
 }
 
 static void
@@ -1787,6 +1796,8 @@ doio_recv(isc__socket_t *sock, isc_socketevent_t *dev) {
 		}
 	}
 
+	/* XXX Should figure out why there is too high value for unix sockets */
+	dev->minimum = 1;
 	/*
 	 * If we read less than we expected, update counters,
 	 * and let the upper layer poke the descriptor.
@@ -1826,6 +1837,9 @@ doio_send(isc__socket_t *sock, isc_socketevent_t *dev) {
 	char strbuf[ISC_STRERRORSIZE];
 
 	build_msghdr_send(sock, dev, &msghdr, iov, &write_count);
+#if defined(ISC_SOCKET_DEBUG)
+	dump_msg(&msghdr);
+#endif
 
  resend:
 	cc = sendmsg(sock->fd, &msghdr, 0);
@@ -2243,7 +2257,7 @@ opensocket(isc__socketmgr_t *manager, isc__socket_t *sock) {
 		sock->fd = socket(sock->pf, SOCK_STREAM, IPPROTO_TCP);
 		break;
 	case isc_sockettype_unix:
-		sock->fd = socket(sock->pf, SOCK_STREAM, 0);
+		sock->fd = socket(sock->pf, SOCK_DGRAM, 0);
 		break;
 	case isc_sockettype_fdwatch:
 		/*
@@ -4497,7 +4511,7 @@ isc__socket_recvv(isc_socket_t *sock0, isc_bufferlist_t *buflist,
 	/*
 	 * UDP sockets are always partial read
 	 */
-	if (sock->type == isc_sockettype_udp)
+	if (sock->type == isc_sockettype_udp || sock->type == isc_sockettype_unix)
 		dev->minimum = 1;
 	else {
 		if (minimum == 0)
diff --git a/contrib/bind9/lib/lwres/context.c b/contrib/bind9/lib/lwres/context.c
index 642248d..7ba549e 100644
--- a/contrib/bind9/lib/lwres/context.c
+++ b/contrib/bind9/lib/lwres/context.c
@@ -130,6 +130,7 @@ do { \
 
 LIBLWRES_EXTERNAL_DATA lwres_uint16_t lwres_udp_port = LWRES_UDP_PORT;
 LIBLWRES_EXTERNAL_DATA const char *lwres_resolv_conf = LWRES_RESOLV_CONF;
+LIBLWRES_EXTERNAL_DATA int srv_unixsock = 0;
 
 static void *
 lwres_malloc(void *, size_t);
@@ -138,11 +139,31 @@ static void
 lwres_free(void *, void *, size_t);
 
 /*!
+ * lwres_socket_init
+ */
+lwres_result_t lwres_socket_init();
+
+/*!
  * lwres_result_t
  */
 static lwres_result_t
 context_connect(lwres_context_t *);
 
+
+lwres_result_t
+lwres_socket_init() {
+  lwres_context_t *ctx;
+  lwres_result_t res;
+  
+  ctx = NULL; 
+  res = lwres_context_create(&ctx, NULL, NULL, NULL, 0);
+  
+  if(res != LWRES_R_SUCCESS)
+    return res;
+  
+  return context_connect(ctx);
+}
+
 /*%
  * Creates a #lwres_context_t structure for use in
  *  lightweight resolver operations.
@@ -218,7 +239,7 @@ lwres_context_destroy(lwres_context_t **contextp) {
 	ctx = *contextp;
 	*contextp = NULL;
 
-	if (ctx->sock != -1) {
+	if (ctx->sock != -1 && srv_unixsock == 0) {
 #ifdef WIN32
 		DestroySockets();
 #endif
@@ -290,7 +311,7 @@ context_connect(lwres_context_t *ctx) {
 	int ret;
 	struct sockaddr_in sin;
 	struct sockaddr_in6 sin6;
-	struct sockaddr_un sun;
+	struct sockaddr_un sun, cl_sun;
 	struct sockaddr *sa;
 	LWRES_SOCKADDR_LEN_T salen;
 	int domain;
@@ -304,12 +325,14 @@ context_connect(lwres_context_t *ctx) {
 		memset(&ctx->address, 0, sizeof(ctx->address));
 		ctx->address.family = LWRES_ADDRTYPE_UNIXSOCK;
 
-		/*Should not be longer than LWRES_ADDR_MAXLEN, which is 16 now */
-		const char SOCKPATH[] = "/tmp/lwresd.sock";
-		int len;
-
-		len = strlen(SOCKPATH);
-		strcpy(ctx->address.address, SOCKPATH);
+		if(srv_unixsock == 0) {
+		  /*Should not be longer than LWRES_ADDR_MAXLEN, which is 16 now */
+		  const char SOCKPATH[] = "/tmp/lwresd.sock";
+		  int len;
+		  
+		  len = strlen(SOCKPATH);
+		  strcpy(ctx->address.address, SOCKPATH);
+		}
 #if 0
 		ctx->address.family = LWRES_ADDRTYPE_V4;
 		ctx->address.length = 4;
@@ -349,7 +372,18 @@ context_connect(lwres_context_t *ctx) {
 	InitSockets();
 #endif
 	if(ctx->address.family == LWRES_ADDRTYPE_UNIXSOCK) {
+	  if(srv_unixsock == 0) {
 		s = socket(domain, SOCK_DGRAM, 0);
+		/* We should create unix socket on our side
+		 * so server will be able to reply
+		 */
+		struct sockaddr_un cli_addr;
+		bzero(&cli_addr, sizeof(cli_addr));
+		cli_addr.sun_family = AF_UNIX;
+		strcpy(cli_addr.sun_path, tmpnam(NULL));
+		bind(s, (struct sockaddr *) &cli_addr, sizeof(cli_addr));
+		/* XXX When should we remove this socket? */
+	  }
 	} else
 		s = socket(domain, SOCK_DGRAM, IPPROTO_UDP);
 
@@ -360,26 +394,32 @@ context_connect(lwres_context_t *ctx) {
 		return (LWRES_R_IOERROR);
 	}
 
-	ret = connect(s, sa, salen);
-	if (ret != 0) {
+	if(srv_unixsock == 0) {
+	  ret = connect(s, sa, salen);
+	  if (ret != 0) {
 #ifdef WIN32
 		DestroySockets();
 #endif
 		(void)close(s);
 		return (LWRES_R_IOERROR);
-	}
-
-	MAKE_NONBLOCKING(s, ret);
-	if (ret < 0) {
+	  }
+	  
+	  MAKE_NONBLOCKING(s, ret);
+	  if (ret < 0) {
 #ifdef WIN32
 		DestroySockets();
 #endif
 		(void)close(s);
 		return (LWRES_R_IOERROR);
+	  }
+	  srv_unixsock = s;
+	} else {
+	  
+	  s = srv_unixsock;
 	}
-
+	
 	ctx->sock = s;
-
+	
 	return (LWRES_R_SUCCESS);
 }
 
@@ -417,12 +457,16 @@ lwres_context_recv(lwres_context_t *ctx,
 	LWRES_SOCKADDR_LEN_T fromlen;
 	struct sockaddr_in sin;
 	struct sockaddr_in6 sin6;
+	struct sockaddr_un sun;
 	struct sockaddr *sa;
 	int ret;
 
 	if (ctx->address.family == LWRES_ADDRTYPE_V4) {
 		sa = (struct sockaddr *)&sin;
 		fromlen = sizeof(sin);
+	} else if(ctx->address.family == LWRES_ADDRTYPE_UNIXSOCK) {
+		sa = (struct sockarr *) &sun;
+		fromlen = sizeof(sun);
 	} else {
 		sa = (struct sockaddr *)&sin6;
 		fromlen = sizeof(sin6);
@@ -447,7 +491,10 @@ lwres_context_recv(lwres_context_t *ctx,
 	 * wait for another packet.  This can happen if an old result
 	 * comes in, or if someone is sending us random stuff.
 	 */
-	if (ctx->address.family == LWRES_ADDRTYPE_V4) {
+	if(ctx->address.family == LWRES_ADDRTYPE_UNIXSOCK) {
+	  /* XXX What checks should be here? */
+	}
+	else if (ctx->address.family == LWRES_ADDRTYPE_V4) {
 		if (fromlen != sizeof(sin)
 		    || memcmp(&sin.sin_addr, ctx->address.address,
 			      sizeof(sin.sin_addr)) != 0
