diff --git a/linphone/console/linphonec.c b/linphone/console/linphonec.c
index 69742f09fb65e46ffc1763987a96154810bc4d31..7baa1fdcbd3bb935a1dd3d689b0e07e48ed646c6 100644
--- a/linphone/console/linphonec.c
+++ b/linphone/console/linphonec.c
@@ -58,8 +58,6 @@
 #define _(something)	(something)
 #endif
 
-#define DEFAULT_TCP_PORT 32333
-
 /***************************************************************************
  *
  *  Types
@@ -131,19 +129,17 @@ static bool_t display_enabled=FALSE;
 static bool_t preview_enabled=FALSE;
 static bool_t show_general_state=FALSE;
 static bool_t unix_socket=FALSE;
-static int tcp_port=0; /* see --tcp: tcp port to listen for commands */
 LPC_AUTH_STACK auth_stack;
 static int trace_level = 0;
 static char *logfile_name = NULL;
 static char configfile_name[PATH_MAX];
 static char *sipAddr = NULL; /* for autocall */
-static ortp_socket_t client_sock=-1;
+static ortp_pipe_t client_sock=ORTP_PIPE_INVALID;
 char prompt[PROMPT_MAX_LEN];
-char sock_unix_path[128]={0};
 
-static ortp_thread_t net_reader_th;
-static bool_t net_reader_run=FALSE;
-static ortp_socket_t server_sock;
+static ortp_thread_t pipe_reader_th;
+static bool_t pipe_reader_run=FALSE;
+static ortp_pipe_t server_sock;
 
 
 LinphoneCoreVTable linphonec_vtable = {
@@ -231,7 +227,7 @@ static void
 linphonec_prompt_for_auth(LinphoneCore *lc, const char *realm, const char *username)
 {
 	/* no prompt possible when using pipes or tcp mode*/
-	if (unix_socket || tcp_port){
+	if (unix_socket){
 		linphone_core_abort_authentication(lc,NULL);
 	}else{
 		LinphoneAuthInfo *pending_auth;
@@ -380,81 +376,38 @@ static void start_prompt_reader(void){
 	ortp_thread_create(&th,NULL,prompt_reader_thread,NULL);
 }
 
-static ortp_socket_t create_server_socket(int port){
-	ortp_socket_t sock;
-	if (!unix_socket){
-		char service[12];
-		/*setup the server socket */
-		struct addrinfo *ai=NULL;
-		struct addrinfo hints;
-		memset(&hints,0,sizeof(hints));
-		hints.ai_family=AF_INET;
-		snprintf(service,sizeof(service),"%i",port);
-	
-		getaddrinfo("127.0.0.1",service,&hints,&ai);
-		if (ai==NULL){
-			fprintf(stderr,"getaddrinfo failed on port %s",service);
-			exit(-1);
-		}
-		sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
-		if (bind(sock,ai->ai_addr,ai->ai_addrlen)!=0){
-			fprintf(stderr,"Failed to bind command socket.\n");
-			exit(-1);
-		}
-		listen(sock,1);
-	}else{
+static ortp_pipe_t create_server_socket(void){
+	char path[128];
 #ifndef WIN32
-		struct sockaddr_un sa;
-		sock=socket(AF_UNIX,SOCK_STREAM,0);
-		sa.sun_family=AF_UNIX;
-		snprintf(sock_unix_path,sizeof(sock_unix_path)-1,"/tmp/linphonec-%i",getuid());
-		strncpy(sa.sun_path,sock_unix_path,sizeof(sa.sun_path)-1);
-		unlink(sock_unix_path);/*in case we didn't finished properly previous time */
-		fchmod(sock,S_IRUSR|S_IWUSR);
-		if (bind(sock,(struct sockaddr*)&sa,sizeof(sa))!=0){
-			fprintf(stderr,"Failed to bind command unix socket.\n");
-			exit(-1);
-		}
-		listen(sock,1);
-		printf("Listening from unix socket %s\n",sock_unix_path);
+	snprintf(path,sizeof(path)-1,"linphonec-%i",getuid());
 #else
-		fprintf(stderr,"Window pipe implementation not written yet.\n");
-#endif
+	{
+		char username[128];
+		DWORD size=sizeof(username)-1;
+		GetUserName(username,&size);
+		snprintf(path,sizeof(path)-1,"linphonec-%s",username);
 	}
-	return sock;
+#endif
+	return ortp_server_pipe_create(path);
 }
 
-static void *net_thread(void*p){
+static void *pipe_thread(void*p){
 	char tmp[250];
-	struct sockaddr_storage ss;
-#ifndef WIN32
-	struct sockaddr_un su;
-#endif
-	socklen_t ssize;
-	
-	server_sock=create_server_socket(tcp_port);
-	if (server_sock==-1) return NULL;
-	while(net_reader_run){
-		while(client_sock!=-1){ /*sleep until the last command is finished*/
+	server_sock=create_server_socket();
+	if (server_sock==ORTP_PIPE_INVALID) return NULL;
+	while(pipe_reader_run){
+		while(client_sock!=ORTP_PIPE_INVALID){ /*sleep until the last command is finished*/
 #ifndef WIN32
 			usleep(20000);
 #else
 			Sleep(20);
 #endif
 		}
-		if (!unix_socket){
-			ssize=sizeof(ss);
-			client_sock=accept(server_sock,(struct sockaddr*)&ss,&ssize);
-		}else{
-#ifndef WIN32
-			ssize=sizeof(su);
-			client_sock=accept(server_sock,(struct sockaddr*)&su,&ssize);
-#endif
-		}
-		if (client_sock!=-1){
+		client_sock=ortp_server_pipe_accept_client(server_sock);
+		if (client_sock!=ORTP_PIPE_INVALID){
 			int len;
 			/*now read from the client */
-			if ((len=recv(client_sock,tmp,sizeof(tmp)-1,0))>0){
+			if ((len=ortp_pipe_read(client_sock,tmp,sizeof(tmp)-1))>0){
 				ortp_mutex_lock(&prompt_mutex);
 				tmp[len]='\0';
 				strcpy(received_prompt,tmp);
@@ -463,31 +416,29 @@ static void *net_thread(void*p){
 				ortp_mutex_unlock(&prompt_mutex);
 			}else{
 				printf("read nothing\n");fflush(stdout);
-				close_socket(client_sock);
-				client_sock=-1;
+				ortp_server_pipe_close_client(client_sock);
+				client_sock=ORTP_PIPE_INVALID;
 			}
 			
 		}else{
-			if (net_reader_run) fprintf(stderr,"accept() failed: %s\n",getSocketError());
+			if (pipe_reader_run) fprintf(stderr,"accept() failed: %s\n",strerror(errno));
 		}
 	}
-	
+	printf("Exiting pipe_reader_thread.");
+	fflush(stdout);
 	return NULL;
 }
 
-static void start_net_reader(void){
+static void start_pipe_reader(void){
 	ms_mutex_init(&prompt_mutex,NULL);
-	net_reader_run=TRUE;
-	ortp_thread_create(&net_reader_th,NULL,net_thread,NULL);
+	pipe_reader_run=TRUE;
+	ortp_thread_create(&pipe_reader_th,NULL,pipe_thread,NULL);
 }
 
-static void stop_net_reader(void){
-	net_reader_run=FALSE;
-	close(server_sock);
-	if (sock_unix_path[0]!=0){
-		unlink(sock_unix_path);
-	}
-	/*ortp_thread_join(net_reader_th,NULL);*/
+static void stop_pipe_reader(void){
+	pipe_reader_run=FALSE;
+	ortp_server_pipe_close(server_sock);
+	ortp_thread_join(pipe_reader_th,NULL);
 }
 
 #ifdef HAVE_READLINE
@@ -497,16 +448,16 @@ static void stop_net_reader(void){
 #endif
 
 char *linphonec_readline(char *prompt){
-	if (tcp_port ||unix_socket || !BOOL_HAVE_READLINE ){
+	if (unix_socket || !BOOL_HAVE_READLINE ){
 		static bool_t prompt_reader_started=FALSE;
-		static bool_t net_reader_started=FALSE;
+		static bool_t pipe_reader_started=FALSE;
 		if (!prompt_reader_started){
 			start_prompt_reader();
 			prompt_reader_started=TRUE;
 		}
-		if ((tcp_port>0 || unix_socket) && !net_reader_started){
-			start_net_reader();
-			net_reader_started=TRUE;
+		if (unix_socket && !pipe_reader_started){
+			start_pipe_reader();
+			pipe_reader_started=TRUE;
 		}
 		fprintf(stdout,"%s",prompt);
 		fflush(stdout);
@@ -539,19 +490,20 @@ void linphonec_out(const char *fmt,...){
 	va_start (args, fmt);
 	res=ortp_strdup_vprintf(fmt,args);
 	va_end (args);
-	printf("%s",res);fflush(stdout);
-	if (client_sock!=-1){
-		if (send(client_sock,res,strlen(res),0)==-1){
-			fprintf(stderr,"Fail to send output via socket: %s",getSocketError());
+	printf("%s",res);
+	fflush(stdout);
+	if (client_sock!=ORTP_PIPE_INVALID){
+		if (ortp_pipe_write(client_sock,res,strlen(res))==-1){
+			fprintf(stderr,"Fail to send output via pipe: %s",strerror(errno));
 		}
 	}
 	ortp_free(res);
 }
 
 void linphonec_command_finished(void){
-	if (client_sock!=-1){
-		close_socket(client_sock);
-		client_sock=-1;
+	if (client_sock!=ORTP_PIPE_INVALID){
+		ortp_server_pipe_close_client(client_sock);
+		client_sock=ORTP_PIPE_INVALID;
 	}
 }
 
@@ -689,8 +641,8 @@ linphonec_finish(int exit_status)
 #ifdef HAVE_READLINE
 	linphonec_finish_readline();
 #endif
-	if (net_reader_run)
-		stop_net_reader();
+	if (pipe_reader_run)
+		stop_pipe_reader();
 
 
 	linphone_core_uninit (&linphonec);
@@ -1061,14 +1013,6 @@ linphonec_parse_cmdline(int argc, char **argv)
 		{
 			show_general_state = TRUE;
 		}
-		else if (strncmp ("--tcp", argv[arg_num], 5) == 0)
-		{
-			if (arg_num+1 < argc){
-				tcp_port = atoi(argv[arg_num+1]);
-				if (tcp_port!=0) arg_num++;
-			}
-			if (tcp_port==0) tcp_port=DEFAULT_TCP_PORT;
-		}
 		else if (strncmp ("--pipe", argv[arg_num], 6) == 0)
 		{
 			unix_socket=1;
diff --git a/linphone/console/linphonec.dev b/linphone/console/linphonec.dev
index cf0619ef260160eaf60ed737a476eeeab2b2adda..3e824e6693fb4a72926c34428d736eefc0fb6573 100755
--- a/linphone/console/linphonec.dev
+++ b/linphone/console/linphonec.dev
@@ -57,7 +57,7 @@ Includes=../oRTP/include;../mediastreamer2/include;../../linphone-deps/include;.
 Libs=../oRTP/build/win32native;../mediastreamer2/build/win32native;../coreapi/;../../linphone-deps/lib
 ResourceIncludes=
 MakeIncludes=
-Compiler=-g -02_@@_-DIN_LINPHONE_@@_-D_WIN32_WINNT=0x0501 _@@_
+Compiler=-g -02_@@_-DIN_LINPHONE_@@_-D_WIN32_WINNT=0x0501 _@@_-Wall -Werror_@@_
 CppCompiler=
 Linker=-mwindows_@@_-Wl,--export-all-symbols_@@_-Wl,--add-stdcall-alias_@@_-llinphone_@@_-lmediastreamer2_@@_-lortp_@@_-losip2_@@_-losipparser2_@@_-leXosip2_@@_-lws2_32_@@_
 PreprocDefines=
diff --git a/linphone/console/shell.c b/linphone/console/shell.c
index 8cf7755c85494e0f5f6afa45f002fe2edf684a77..d40ff0588949963ae9c10b90ad0a93f3885b1538 100644
--- a/linphone/console/shell.c
+++ b/linphone/console/shell.c
@@ -39,7 +39,6 @@
 
 #include "ortp/ortp.h"
 
-#define DEFAULT_TCP_PORT "32333"
 #define DEFAULT_REPLY_SIZE 4096
 
 #define STATUS_REGISTERED (1<<0)
@@ -49,11 +48,6 @@
 #define STATUS_IN_CONNECTED (1<<4) /* incoming call accepted */
 #define STATUS_OUT_CONNECTED (1<<5) /*outgoing call accepted */
 
-#ifndef WIN32
-static int tcp=0;
-#else
-static int tcp=1;
-#endif
 
 static int make_status_value(const char *status_string){
 	int ret=0;
@@ -78,57 +72,37 @@ static int make_status_value(const char *status_string){
 	return ret;
 }
 
-static int send_command(const char *command, const char * port, char *reply, int reply_len, int print_errors){
-	ortp_socket_t sock;
+static int send_command(const char *command, char *reply, int reply_len, int print_errors){
+	ortp_pipe_t pp;
 	int i;
 	int err;
-	if (tcp){
-		struct addrinfo *ai=NULL;
-		struct addrinfo hints;
-		memset(&hints,0,sizeof(hints));
-		hints.ai_family=AF_INET;
-		hints.ai_socktype=SOCK_STREAM;
-		err=getaddrinfo("127.0.0.1",port,&hints,&ai);
-		if (err!=0){
-			if (print_errors) fprintf(stderr,"ERROR: getaddrinfo failed: error %i\n", err);
-			return -1;
-		}
-		sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
-		if (connect(sock,ai->ai_addr,ai->ai_addrlen)!=0){
-			if (print_errors) fprintf(stderr,"ERROR: Failed to connect socket.\n");
-			freeaddrinfo(ai);
-			return -1;
-		}
-		freeaddrinfo(ai);
-	}else{
+	char path[128];
 #ifndef WIN32
-		struct sockaddr_un sa;
-		char path[128];
-		sock=socket(AF_UNIX,SOCK_STREAM,0);
-		sa.sun_family=AF_UNIX;
-		snprintf(path,sizeof(path)-1,"/tmp/linphonec-%i",getuid());
-		strncpy(sa.sun_path,path,sizeof(sa.sun_path)-1);
-		if (connect(sock,(struct sockaddr*)&sa,sizeof(sa))!=0){
-			if (print_errors) fprintf(stderr,"ERROR: Failed to connect socket: %s\n",getSocketError());
-			return -1;
-		}
+	snprintf(path,sizeof(path)-1,"linphonec-%i",getuid());
 #else
-		fprintf(stderr,"ERROR: windows pipes communication not yet implemented.\n");
-		return -1;
+	{
+		char username[128];
+		DWORD size=sizeof(username)-1;
+		GetUserName(username,&size);
+		snprintf(path,sizeof(path)-1,"linphonec-%s",username);
+	}
 #endif
+	if ((pp=ortp_client_pipe_connect(path))==ORTP_PIPE_INVALID){
+		if (print_errors) fprintf(stderr,"ERROR: Failed to connect pipe: %s\n",strerror(errno));
+		return -1;
 	}
-	if (send(sock,command,strlen(command),0)<0){
+	if (ortp_pipe_write(pp,command,strlen(command))==-1){
 		if (print_errors) fprintf(stderr,"ERROR: Fail to send command to remote linphonec\n");
-		close_socket(sock);
+		ortp_client_pipe_close(pp);
 		return -1;
 	}
 	/*wait for replies */
 	i=0;
-	while ((err=recv(sock,&reply[i],reply_len-i-1,0))>0){
+	while ((err=ortp_pipe_read(pp,&reply[i],reply_len-i-1))>0){
 		i+=err;
 	}
 	reply[i]='\0';
-	close_socket(sock);
+	ortp_client_pipe_close(pp);
 	return 0;
 }
 
@@ -160,10 +134,7 @@ static void spawn_linphonec(int argc, char *argv[]){
 	pid_t pid;
 	j=0;
 	args[j++]="linphonec";
-	if (tcp){
-		args[j++]="--tcp";
-		args[j++]=DEFAULT_TCP_PORT;
-	}else args[j++]="--pipe";
+	args[j++]="--pipe";
 	args[j++]="-c";
 	args[j++]="/dev/null";
 	for(i=0;i<argc;++i){
@@ -207,7 +178,7 @@ static void spawn_linphonec(int argc, char *argv[]){
     ZeroMemory( &pinfo, sizeof(pinfo) );
 
 
-	BOOL ret=CreateProcess(NULL,"linphonec.exe --tcp " DEFAULT_TCP_PORT " -c NUL",
+	BOOL ret=CreateProcess(NULL,"linphonec.exe --pipe -c NUL",
 		NULL,
 		NULL,
 		FALSE,
@@ -228,7 +199,7 @@ static void spawn_linphonec(int argc, char *argv[]){
 static int send_generic_command(const char *command, int print_result){
 	char reply[DEFAULT_REPLY_SIZE];
 	int err;
-	err=send_command(command,DEFAULT_TCP_PORT,reply,sizeof(reply),print_result);
+	err=send_command(command,reply,sizeof(reply),print_result);
 	if (err==0 && print_result) {
 		printf("%s",reply);
 		fflush(stdout);
@@ -296,7 +267,7 @@ static int status_execute(int argc, char *argv[]){
 	
 	if (argc==1){
 		snprintf(cmd,sizeof(cmd),"status %s",argv[0]);
-		err=send_command(cmd,DEFAULT_TCP_PORT,reply,sizeof(reply),TRUE);
+		err=send_command(cmd,reply,sizeof(reply),TRUE);
 		if (err==0) {
 			printf("%s",reply);
 			err=make_status_value(reply);
@@ -323,14 +294,14 @@ static int soundcard_execute(int argc, char *argv[]){
 	int err;
 	if (argc==1){
 		snprintf(cmd,sizeof(cmd),"soundcard %s",argv[0]);
-		err=send_command(cmd,DEFAULT_TCP_PORT,reply,sizeof(reply),TRUE);
+		err=send_command(cmd,reply,sizeof(reply),TRUE);
 		if (err==0) {
 			printf("%s",reply);
 			return parse_card_index(reply);
 		}
 	}else if (argc==2){/*setting a soundcard */
 		snprintf(cmd,sizeof(cmd),"soundcard %s %s",argv[0],argv[1]);
-		err=send_command(cmd,DEFAULT_TCP_PORT,reply,sizeof(reply),TRUE);
+		err=send_command(cmd,reply,sizeof(reply),TRUE);
 		if (err==0) {
 			printf("%s",reply);
 			return 0;
@@ -349,16 +320,13 @@ int main(int argc, char *argv[]){
 	}
 	ortp_init();
 	for(argi=1;argi<argc;++argi){
-		if (strcmp(argv[argi],"--tcp")==0){
-			tcp=1;
-		}else if (strcmp(argv[argi],"init")==0){
+		if (strcmp(argv[argi],"init")==0){
 			/*check if there is running instance*/
 			if (send_generic_command("help",0)==0){
 				fprintf(stderr,"A running linphonec has been found, not spawning a second one.\n");
 				return 0;
 			}
 			spawn_linphonec(argc-argi-1,&argv[argi+1]);
-			if (tcp) fprintf(stderr,"WARNING: using --tcp is unsafe: unprivilegied users can make calls.\n");
 			return 0;
 		}else if (strcmp(argv[argi],"generic")==0){
 			if (argi+1<argc){
diff --git a/linphone/coreapi/private.h b/linphone/coreapi/private.h
index 68326842559ae32f2f3cf4ec7720e87fea20af8c..325d103cf0767f3c2c3409a12c07c64aaea716d9 100644
--- a/linphone/coreapi/private.h
+++ b/linphone/coreapi/private.h
@@ -33,7 +33,7 @@
 #endif
 
 #ifndef LINPHONE_VERSION
-#define LINPHONE_VERSION "3.1.1"
+#define LINPHONE_VERSION "3.1.2"
 #endif
 
 #ifndef LIBLINPHONE_VERSION 
diff --git a/linphone/gtk-glade/linphone.h b/linphone/gtk-glade/linphone.h
index 52b17c31f90a1827a0421b47a10a7c1badcb6586..c330138f3a34595a666d2f41fb9aef9736503395 100644
--- a/linphone/gtk-glade/linphone.h
+++ b/linphone/gtk-glade/linphone.h
@@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define PACKAGE_DATA_DIR "./"
 
 #ifndef LINPHONE_VERSION
-#define LINPHONE_VERSION "3.1.2"
+#define LINPHONE_VERSION "3.1.2-20090520"
 #endif
 
 #endif
diff --git a/linphone/oRTP/include/ortp/port.h b/linphone/oRTP/include/ortp/port.h
index 05b2457309d3119d49d4d5cf6df8dc6a2402a50c..2949931222d949c3653cfaa5ac1bd8fbc6e63f40 100644
--- a/linphone/oRTP/include/ortp/port.h
+++ b/linphone/oRTP/include/ortp/port.h
@@ -231,16 +231,29 @@ char *ortp_strdup_printf(const char *fmt,...);
 char *ortp_strdup_vprintf(const char *fmt, va_list ap);
 
 /* portable named pipes */
-ortp_socket_t ortp_server_pipe_create(const char *name);
-ortp_socket_t ortp_server_pipe_accept_client(ortp_socket_t server);
-int ortp_server_pipe_close(ortp_socket_t spipe);
-int ortp_server_pipe_close_client(ortp_socket_t client);
+#ifdef WIN32
+typedef HANDLE ortp_pipe_t;
+#define ORTP_PIPE_INVALID INVALID_HANDLE_VALUE
+#else
+typedef int ortp_pipe_t;
+#define ORTP_PIPE_INVALID (-1)
+#endif
+
+ortp_pipe_t ortp_server_pipe_create(const char *name);
+/*
+ * warning: on win32 ortp_server_pipe_accept_client() might return INVALID_HANDLE_VALUE without
+ * any specific error, this happens when ortp_server_pipe_close() is called on another pipe.
+ * This pipe api is not thread-safe.
+*/
+ortp_pipe_t ortp_server_pipe_accept_client(ortp_pipe_t server);
+int ortp_server_pipe_close(ortp_pipe_t spipe);
+int ortp_server_pipe_close_client(ortp_pipe_t client);
 
-ortp_socket_t ortp_client_pipe_connect(const char *name);
-int ortp_client_pipe_close(ortp_socket_t sock);
+ortp_pipe_t ortp_client_pipe_connect(const char *name);
+int ortp_client_pipe_close(ortp_pipe_t sock);
 
-int ortp_pipe_read(ortp_socket_t p, uint8_t *buf, int len);
-int ortp_pipe_write(ortp_socket_t p, const uint8_t *buf, int len);
+int ortp_pipe_read(ortp_pipe_t p, uint8_t *buf, int len);
+int ortp_pipe_write(ortp_pipe_t p, const uint8_t *buf, int len);
 
 
 #ifdef __cplusplus
diff --git a/linphone/oRTP/src/port.c b/linphone/oRTP/src/port.c
index 470fe304611c76e7342233fff3717ad4f3049dbc..02a8e14e9248b13fee2fe697d23bb915f133593e 100644
--- a/linphone/oRTP/src/port.c
+++ b/linphone/oRTP/src/port.c
@@ -341,14 +341,20 @@ char * WSAAPI gai_strerror(int errnum){
 #include <sys/un.h>
 #include <sys/stat.h>
 
+static char *make_pipe_name(const char *name){
+	return ortp_strdup_printf("/tmp/%s",name);
+}
+
 /* portable named pipes */
 ortp_socket_t ortp_server_pipe_create(const char *name){
 	struct sockaddr_un sa;
+	char *pipename=make_pipe_name(name);
 	ortp_socket_t sock;
 	sock=socket(AF_UNIX,SOCK_STREAM,0);
 	sa.sun_family=AF_UNIX;
-	strncpy(sa.sun_path,name,sizeof(sa.sun_path)-1);
-	unlink(name);/*in case we didn't finished properly previous time */
+	strncpy(sa.sun_path,pipename,sizeof(sa.sun_path)-1);
+	unlink(pipename);/*in case we didn't finished properly previous time */
+	ortp_free(pipename);
 	fchmod(sock,S_IRUSR|S_IWUSR);
 	if (bind(sock,(struct sockaddr*)&sa,sizeof(sa))!=0){
 		ortp_error("Failed to bind command unix socket: %s",strerror(errno));
@@ -375,9 +381,11 @@ int ortp_server_pipe_close(ortp_socket_t spipe){
 
 ortp_socket_t ortp_client_pipe_connect(const char *name){
 	struct sockaddr_un sa;
+	char *pipename=make_pipe_name(name);
 	ortp_socket_t sock=socket(AF_UNIX,SOCK_STREAM,0);
 	sa.sun_family=AF_UNIX;
-	strncpy(sa.sun_path,name,sizeof(sa.sun_path)-1);
+	strncpy(sa.sun_path,pipename,sizeof(sa.sun_path)-1);
+	ortp_free(pipename);
 	if (connect(sock,(struct sockaddr*)&sa,sizeof(sa))!=0){
 		close(sock);
 		return -1;
@@ -398,13 +406,90 @@ int ortp_client_pipe_close(ortp_socket_t sock){
 }
 
 #else
+
+static char *make_pipe_name(const char *name){
+	return ortp_strdup_printf("\\\\.\\pipe\\%s",name);
+}
+
+static HANDLE event=NULL;
+
 /* portable named pipes */
-ortp_socket_t ortp_server_pipe_create(const char *name);
-ortp_socket_t ortp_server_pipe_accept(ortp_socket_t server);
-int ortp_server_pipe_close(ortp_socket_t spipe);
+ortp_pipe_t ortp_server_pipe_create(const char *name){
+	ortp_pipe_t h;
+	char *pipename=make_pipe_name(name);
+	h=CreateNamedPipe(pipename,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,PIPE_TYPE_MESSAGE|PIPE_WAIT,1,
+						32768,32768,0,NULL);
+	ortp_free(pipename);
+	if (h==INVALID_HANDLE_VALUE){
+		ortp_error("Fail to create named pipe %s",pipename);
+	}
+	if (event==NULL) event=CreateEvent(NULL,TRUE,FALSE,NULL);
+	return h;
+}
+
+
+/*this function is a bit complex because we need to wakeup someday
+even if nobody connects to the pipe.
+ortp_server_pipe_close() makes this function to exit.
+*/
+ortp_pipe_t ortp_server_pipe_accept_client(ortp_pipe_t server){
+	OVERLAPPED ol;
+	DWORD undef;
+	memset(&ol,0,sizeof(ol));
+	ol.hEvent=event;
+	ResetEvent(event);
+	ConnectNamedPipe(server,&ol);
+	WaitForSingleObject(ol.hEvent,INFINITE);
+	if (GetOverlappedResult(server,&ol,&undef,FALSE)){
+		return server;
+	}
+	return INVALID_HANDLE_VALUE;
+}
 
-ortp_socket_t ortp_call_pipe(const char *name);
+int ortp_server_pipe_close_client(ortp_pipe_t server){
+	return DisconnectNamedPipe(server)==TRUE ? 0 : -1;
+}
+
+int ortp_server_pipe_close(ortp_pipe_t spipe){
+	SetEvent(event);
+	//CancelIoEx(spipe,NULL); /*vista only*/
+	return CloseHandle(spipe);
+}
+
+ortp_pipe_t ortp_client_pipe_connect(const char *name){
+	char *pipename=make_pipe_name(name);
+	ortp_pipe_t hpipe = CreateFile( 
+         pipename,   // pipe name 
+         GENERIC_READ |  // read and write access 
+         GENERIC_WRITE, 
+         0,              // no sharing 
+         NULL,           // default security attributes
+         OPEN_EXISTING,  // opens existing pipe 
+         0,              // default attributes 
+         NULL);          // no template file 
+	ortp_free(pipename);
+	return hpipe;
+}
+
+int ortp_pipe_read(ortp_pipe_t p, uint8_t *buf, int len){
+	DWORD ret=0;
+	if (ReadFile(p,buf,len,&ret,NULL))
+		return ret;
+	/*ortp_error("Could not read from pipe: %s",strerror(GetLastError()));*/
+	return -1;
+}
+
+int ortp_pipe_write(ortp_pipe_t p, const uint8_t *buf, int len){
+	DWORD ret=0;
+	if (WriteFile(p,buf,len,&ret,NULL))
+		return ret;
+	/*ortp_error("Could not write to pipe: %s",strerror(GetLastError()));*/
+	return -1;
+}
+
+
+int ortp_client_pipe_close(ortp_pipe_t sock){
+	return CloseHandle(sock);
+}
 
-int ortp_pipe_read(ortp_socket_t p, uint8_t *buf, int len);
-int ortp_pipe_write(ortp_socket_t p, const uint8_t *buf, int len);
 #endif