diff --git a/src/common.c b/src/common.c
index 28cf769..2bf7b07 100644
--- a/src/common.c
+++ b/src/common.c
@@ -41,7 +41,6 @@
 #endif
 
 #include "common.h"
-#include "plibc.h"
 
 /* daemon(3) exists only in 4.4BSD or later, and in GNU libc */
 #if !defined(WINDOWS32) && !(defined(BSD) && (BSD >= 199306)) && !defined(__GLIBC__)
@@ -114,20 +113,20 @@ open_dns(int localport, in_addr_t listen_ip)
 	/* listen_ip already in network byte order from inet_addr, or 0 */
 	addr.sin_addr.s_addr = listen_ip; 
 
-	if ((fd = SOCKET(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
+	if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
 		printf("got fd %d\n", fd);
 		err(1, "socket");
 	}
 
 	flag = 1;
 #ifdef SO_REUSEPORT
-	SETSOCKOPT(fd, SOL_SOCKET, SO_REUSEPORT, (const void*) &flag, sizeof(flag));
+	setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, (const void*) &flag, sizeof(flag));
 #endif
-	SETSOCKOPT(fd, SOL_SOCKET, SO_REUSEADDR, (const void*) &flag, sizeof(flag));
+	setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void*) &flag, sizeof(flag));
 
 #ifndef WINDOWS32
 	/* To get destination address from each UDP datagram, see iodined.c:read_dns() */
-	SETSOCKOPT(fd, IPPROTO_IP, DSTADDR_SOCKOPT, (const void*) &flag, sizeof(flag));
+	setsockopt(fd, IPPROTO_IP, DSTADDR_SOCKOPT, (const void*) &flag, sizeof(flag));
 #endif
 
 	if(bind(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) 
diff --git a/src/iodine.c b/src/iodine.c
index 93d25ec..3664996 100644
--- a/src/iodine.c
+++ b/src/iodine.c
@@ -43,7 +43,6 @@
 #include <netdb.h>
 #endif
 
-#include "plibc.h"
 #include "common.h"
 #include "encoding.h"
 #include "base32.h"
@@ -172,13 +171,13 @@ read_dns(int fd, char *buf, int buflen)
 {
 	struct sockaddr_in from;
 	char data[64*1024];
-	int addrlen;
+	socklen_t addrlen;
 	struct query q;
 	int rv;
 	int r;
 
 	addrlen = sizeof(struct sockaddr);
-	if ((r = RECVFROM(fd, data, sizeof(data), 0, 
+	if ((r = recvfrom(fd, data, sizeof(data), 0, 
 			  (struct sockaddr*)&from, &addrlen)) == -1) {
 		warn("recvfrom");
 		return 0;
@@ -315,7 +314,7 @@ tunnel(int tun_fd, int dns_fd)
 		}
 		FD_SET(dns_fd, &fds);
 
-		i = SELECT(MAX(tun_fd, dns_fd) + 1, &fds, NULL, NULL, &tv);
+		i = select(MAX(tun_fd, dns_fd) + 1, &fds, NULL, NULL, &tv);
 		
 		if (running == 0)
 			break;
@@ -907,10 +906,6 @@ main(int argc, char **argv)
 	b32 = get_base32_encoder();
 	dataenc = get_base32_encoder();
 	
-#ifdef WINDOWS32
-	plibc_init("Kryo", "iodine");
-#endif
-	
 #if !defined(BSD) && !defined(__GLIBC__)
 	__progname = strrchr(argv[0], '/');
 	if (__progname == NULL)
diff --git a/src/iodined.c b/src/iodined.c
index 9a10ace..7c405dd 100644
--- a/src/iodined.c
+++ b/src/iodined.c
@@ -48,7 +48,6 @@
 #include <netdb.h>
 #endif
 
-#include "plibc.h"
 #include "common.h"
 #include "dns.h"
 #include "encoding.h"
@@ -780,7 +779,7 @@ static int
 read_dns(int fd, struct query *q)
 {
 	struct sockaddr_in from;
-	int addrlen;
+	socklen_t addrlen;
 	char packet[64*1024];
 	int r;
 #ifndef WINDOWS32
@@ -804,7 +803,7 @@ read_dns(int fd, struct query *q)
 	r = recvmsg(fd, &msg, 0);
 #else
 	addrlen = sizeof(struct sockaddr);
-	r = RECVFROM(fd, packet, sizeof(packet), 0, (struct sockaddr*)&from, &addrlen);
+	r = recvfrom(fd, packet, sizeof(packet), 0, (struct sockaddr*)&from, &addrlen);
 #endif /* !WINDOWS32 */
 
 	if (r > 0) {
diff --git a/src/osflags b/src/osflags
index 0b9c3d3..c88174a 100755
--- a/src/osflags
+++ b/src/osflags
@@ -14,13 +14,13 @@ link)
 			echo '-lnetwork';
 		;;
 		windows32)
-			echo '-lplibc -lws2_32';
+			echo '-lws2_32';
 		;;
 	esac
 	;;
 cflags)
 	case $1 in
-		BeOS)
+		BeOS | windows32)
 			echo '-Dsocklen_t=int';
 		;;
 	esac
diff --git a/src/tun.c b/src/tun.c
index bf5899a..61b79b0 100644
--- a/src/tun.c
+++ b/src/tun.c
@@ -50,7 +50,6 @@ struct tun_data data;
 char if_name[50];
 #endif
 
-#include "plibc.h"
 #include "tun.h"
 #include "common.h"
 
@@ -354,11 +353,10 @@ write_tun(int tun_fd, char *data, size_t len)
 ssize_t
 read_tun(int tun_fd, char *buf, size_t len) 
 {
-#ifndef WINDOWS32
-#if defined (FREEBSD) || defined (DARWIN) || defined(NETBSD)
+#if defined (FREEBSD) || defined (DARWIN) || defined(NETBSD) || defined(WINDOWS32)
 	/* FreeBSD/Darwin/NetBSD has no header */
 	int bytes;
-	bytes = read(tun_fd, buf + 4, len - 4);
+	bytes = recv(tun_fd, buf + 4, len, 0);
 	if (bytes < 0) {
 		return bytes;
 	} else {
@@ -367,15 +365,6 @@ read_tun(int tun_fd, char *buf, size_t len)
 #else /* !FREEBSD */
 	return read(tun_fd, buf, len);
 #endif /* !FREEBSD */
-#else /* !WINDOWS32 */
-	int bytes;
-	bytes = RECV(tun_fd, buf + 4, len, 0);
-	if (bytes < 0) {
-		return bytes;
-	} else {
-		return bytes + 4;
-	}
-#endif
 }
 
 int