diff --git a/src/libraries/libisc-new/README b/src/libraries/libisc-new/README
new file mode 100644
index 0000000000000000000000000000000000000000..a89248c0e83e941978be73644be2ee9093210526
--- /dev/null
+++ b/src/libraries/libisc-new/README
@@ -0,0 +1,7 @@
+This package implements a library of functions that is intendend
+to help creating client-server packages using TCP/IP or other
+file descriptor based links.
+ 
+Have a look at EXAMPLE.c for a example of how it can be used.
+ 
+/Peter Eriksson (pen@lysator.liu.se)
diff --git a/src/libraries/libisc-new/TODO b/src/libraries/libisc-new/TODO
new file mode 100644
index 0000000000000000000000000000000000000000..968b247471ebcf7b2c6db74691330b97140d3f94
--- /dev/null
+++ b/src/libraries/libisc-new/TODO
@@ -0,0 +1,13 @@
+* Anv�nd ett IscMessage som sendbuffert
+
+* Kolla upp s� att inte tecken i sendbuf[] s�nds f�r�n isc_flush() verkligen
+  har gjorts (manuellt). Vi vill inte ha en-teckens-paket..
+
+* Ta bort isc_setlogfn() et al - ska styras via IscMasterConfig-structen.
+
+* IscHandlerCache: Direkta funktionspekare ocks�.
+
+* Man-sidorna
+
+* Root-Makefile
+
diff --git a/src/libraries/libisc-new/demo/Makefile b/src/libraries/libisc-new/demo/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..8d7bd39b08dac187c22f5a3a0a88e75c9f7db5e7
--- /dev/null
+++ b/src/libraries/libisc-new/demo/Makefile
@@ -0,0 +1,19 @@
+INCDIRS=-I$(HOME)/include
+LIBDIRS=-L$(HOME)/lib
+SOURCES=tcp.c udp.c
+CFLAGS= -g $(LIBDIRS) $(INCDIRS)
+CC=gcc
+
+tcp:	tcp.c $(HOME)/include/isc.h $(HOME)/lib/libisc.a
+	gcc $(CFLAGS) -o tcp tcp.c -lisc -lansi
+
+udp:	udp.c $(HOME)/include/isc.h $(HOME)/lib/libisc.a
+	gcc $(CFLAGS) -o udp udp.c -lisc -lansi
+
+clean:
+	rm -f *~ *.o a.out core tcp udp \#*\#
+
+depend:
+	gmkdep $(INCDIRS) $(SOURCES)
+
+# DO NOT DELETE THIS LINE -- mkdep uses it.
diff --git a/src/libraries/libisc-new/demo/udp.c b/src/libraries/libisc-new/demo/udp.c
new file mode 100644
index 0000000000000000000000000000000000000000..0a135950ebea53f864ffda0d45da7f75505d2902
--- /dev/null
+++ b/src/libraries/libisc-new/demo/udp.c
@@ -0,0 +1,251 @@
+/*
+** udp.c                             A small ISC subsystem demo program
+**
+** Copyright (c) 1992 Peter Eriksson and Per Cederqvist of the
+**                    Lysator Academic Computer Association.
+**
+** history:
+** 910306 pen      initial coding
+** 920211 pen      code cleaned up
+*/
+
+#include <stdio.h>
+#include <errno.h>
+
+/*
+** Could do a "#define ISC_UDGTYPE foobar" to change the type of
+** the (IscSession) 'udg' member pointer type from "void *" to "foobar *".
+*/
+#include <isc.h>
+
+
+extern void abort(void);
+
+static IscConfig cfg =
+{
+  1005,
+  {
+    1001,
+    { -1, -1, -1, -1, -1 }
+  },
+  {
+    1001
+  }
+};
+
+#define TIMEOUT    30000    /* 30 seconds */
+
+Perror(char *msg)
+{
+  perror(msg);
+  exit(1);
+}
+
+void
+main(int argc, char *argv[])
+{
+  IscMaster   * mcb;   /* ISC master control block */
+  IscSession  * scb;   /* ISC session control block */
+  IscSession  * tty;   /* ISC session control block */
+  IscEvent    * ecb;   /* ISC event control block */
+
+
+  if (argc < 2)
+    exit(1);
+
+  puts("Beginning operation...");
+  
+  /*
+  ** Initialize the ISC subsystem, create a Master Control Block
+  */
+  if ((mcb = isc_initialize(&cfg)) == NULL)
+    Perror("isc_initialize");
+
+  puts("ISC initialized.");
+
+  if (argc > 2)
+  {
+    /* Client connection */
+    
+    /*
+     ** Establish a TCP session to a remote service (IRC)
+     */
+    if ((scb = isc_openudp(mcb, argv[1], argv[2])) == NULL)
+      Perror("isc_openudp");
+
+    if ((tty = isc_openfd(mcb, 0)) == NULL)
+      Perror("isc_openfd(tty)");
+    
+    puts("Connection initiated.");
+  }
+  else
+  {
+    /*
+     ** Enable remote connection attempts at port "argv[1]"
+     */
+    if (isc_listenudp(mcb, NULL, argv[1]) == 0)
+      Perror("isc_listenudp");
+    puts("Listening port installed.");
+  }
+
+
+  puts("entering main event loop...");
+  
+  /*
+  ** Handle all events
+  */
+  while (ecb = isc_getnextevent(mcb, TIMEOUT))
+  {
+    switch (ecb->event)
+    {
+      case ISC_EVENT_CONNECTED:
+        puts("Server connection established.");
+	break;
+	
+      case ISC_EVENT_REJECTED:
+        puts("Server connection rejected.");
+	isc_destroy(mcb, scb);
+	exit(0);
+	
+      case ISC_EVENT_ERROR: /* ISC subsystem error */
+	fprintf(stderr, "ISC-ERROR: errno = %d", errno);
+	if (ecb->msg)
+	  fprintf(stderr, " (%s)", ecb->msg->buffer);
+	putc('\n', stderr);
+
+	/*
+	** Should probably do something more sensible than
+	** just finishing off the session
+	*/
+	if (ecb->session)
+	  isc_destroy(mcb, ecb->session);
+	break;
+
+      case ISC_EVENT_TIMEOUT: /* Timeout limit reached */
+	puts("*** Timeout ***");
+	break;
+
+      case ISC_EVENT_LOGIN: /* New client requesting connection */
+	{
+	  /*
+	  ** THIS SHOULD NORMALLY NEVER HAPPEN FOR UDP SESSIONS
+	  */
+	  char laddr[256];
+	  char lserv[256];
+	  char raddr[256];
+	  char rserv[256];
+	  
+	  fetch_address(ecb->session->info.tcp.raddr,
+			raddr,
+			sizeof(raddr)-1,
+			rserv,
+			sizeof(rserv)-1);
+	  
+	  fetch_address(ecb->session->info.tcp.laddr,
+			laddr,
+			sizeof(laddr)-1,
+			lserv,
+			sizeof(lserv)-1);
+	  
+	  printf("New session #%d on %s/%s connecting from: %s/%s\n",
+		 ecb->session,
+		 laddr, lserv,
+		 raddr, rserv);
+	
+	  /*
+	  ** Here we could assign the 'ecb->session->udg' member some
+	  ** arbitrary value to be used later by our own routines
+	  */
+	}
+	break;
+
+      case ISC_EVENT_LOGOUT: /* Client closed connection */
+	if (ecb->session == scb)
+	{
+	  printf("Server disconnecting\n");
+	  exit(0);
+	}
+	else
+	  printf("Client #%d disconnecting\n", ecb->session);
+
+	/*
+	** Deallocate the storage reserved for the session
+	*/
+	isc_destroy(mcb, ecb->session);
+	break;
+
+      case ISC_EVENT_MESSAGE: /* Message from client or server */
+	if (ecb->session == scb)
+	  printf("Message from server: '%s'\n", ecb->msg->buffer);
+	else if (ecb->session == tty)
+	  isc_send(scb, isc_copymsg(ecb->msg));
+	else
+	{
+	  IscMessage *msg;
+	  char raddr[256];
+	  char rserv[256];
+
+	  fetch_address(ecb->msg->address,
+			raddr,
+			sizeof(raddr)-1,
+			rserv,
+			sizeof(rserv)-1);
+	  
+	  printf("Message from client #%d (%s/%s):\n%s",
+		 ecb->session,
+		 raddr, rserv,
+		 ecb->msg->buffer);
+	  fflush(stdout);
+	  
+	  /*
+	  ** Reply with some text to the client
+	  */
+	  msg = isc_mkstrmsg("Ok, got it via UDP\n\r");
+	  isc_sendto(ecb->session,
+		     ecb->msg->address,
+		     msg);
+	  
+	  isc_flush(ecb->session);
+	}
+	break;
+
+      default: /* NOTREACHED - OR SHOULDN'T BE ATLEAST :-) */
+	Perror("NOTREACHED");
+    }
+
+    /*
+    ** Finished with the event, lets get rid of it
+    */
+    isc_dispose(ecb);
+  }
+
+  /* NOTREACHED - I THINK ... */
+  Perror("SHUTDOWN");
+}
+
+
+const char *strerror(int num)
+{
+  static char foo[256];
+
+  sprintf(foo, "Error #%d", num);
+  return foo;
+}
+
+fetch_address(IscAddress *ia,
+	      char *host,
+	      int hlen,
+	      char *port,
+	      int plen)
+{
+  char *cp;
+
+
+  cp = isc_gethostname(ia, host, hlen);
+  if (!cp)
+    isc_getipnum(ia, host, hlen);
+
+  cp = isc_getservice(ia, port, plen, ISC_TYPE_TCP);
+  if (!cp)
+    sprintf(port, "%d", isc_getportnum(ia));
+}