Index: c/src/lib/libbsp/arm/shared/include/linker-symbols.h
===================================================================
--- c/src/lib/libbsp/arm/shared/include/linker-symbols.h	(revision 967c14385b9194d4257bc44bf21bf1312f9f3321)
+++ c/src/lib/libbsp/arm/shared/include/linker-symbols.h	(revision 798b8da7efe7df881ded4105981d5e74ecd0aad7)
@@ -129,4 +129,5 @@
 
 LINKER_SYMBOL(bsp_translation_table_base)
+LINKER_SYMBOL(bsp_translation_table_end)
 
 #define BSP_FAST_TEXT_SECTION __attribute__((section(".bsp_fast_text")))
Index: cpukit/libcsupport/include/rtems/libio_.h
===================================================================
--- cpukit/libcsupport/include/rtems/libio_.h	(revision 967c14385b9194d4257bc44bf21bf1312f9f3321)
+++ cpukit/libcsupport/include/rtems/libio_.h	(revision 798b8da7efe7df881ded4105981d5e74ecd0aad7)
@@ -41,4 +41,11 @@
 
 #define RTEMS_FILESYSTEM_SYMLOOP_MAX 32
+
+/*
+ * Not defined in newlib so provide here. Users should use dup2 and
+ * not this non-portable fcntl command. Provided here to allow the
+ * RTEMS implementation to work.
+ */
+#define F_DUP2FD 20
 
 /*
Index: cpukit/libcsupport/src/dup2.c
===================================================================
--- cpukit/libcsupport/src/dup2.c	(revision 967c14385b9194d4257bc44bf21bf1312f9f3321)
+++ cpukit/libcsupport/src/dup2.c	(revision 798b8da7efe7df881ded4105981d5e74ecd0aad7)
@@ -55,4 +55,4 @@
    */
 
-  return fcntl( fildes, F_DUPFD, fildes2 );
+  return fcntl( fildes, F_DUP2FD, fildes2 );
 }
Index: cpukit/libcsupport/src/fcntl.c
===================================================================
--- cpukit/libcsupport/src/fcntl.c	(revision 967c14385b9194d4257bc44bf21bf1312f9f3321)
+++ cpukit/libcsupport/src/fcntl.c	(revision 798b8da7efe7df881ded4105981d5e74ecd0aad7)
@@ -25,12 +25,8 @@
 #include <rtems/libio_.h>
 
-static int duplicate_iop( rtems_libio_t *iop, int fd2 )
+static int duplicate_iop( rtems_libio_t *iop )
 {
   int rv = 0;
 
-  /*
-   * FIXME: We ignore the start value fd2 for the file descriptor search.  This
-   * is not POSIX conform.
-   */
   rtems_libio_t *diop = rtems_libio_allocate();
 
@@ -63,4 +59,45 @@
 }
 
+static int duplicate2_iop( rtems_libio_t *iop, int fd2 )
+{
+  rtems_libio_t *iop2;
+  int            rv = 0;
+
+  rtems_libio_check_fd( fd2 );
+  iop2 = rtems_libio_iop( fd2 );
+
+  if (iop != iop2)
+  {
+    int oflag;
+
+    if ((iop2->flags & LIBIO_FLAGS_OPEN) != 0) {
+      rv = (*iop2->pathinfo.handlers->close_h)( iop2 );
+    }
+
+    if (rv == 0) {
+      oflag = rtems_libio_to_fcntl_flags( iop->flags );
+      oflag &= ~O_CREAT;
+      iop2->flags |= rtems_libio_fcntl_flags( oflag );
+
+      rtems_filesystem_instance_lock( &iop->pathinfo );
+      rtems_filesystem_location_clone( &iop2->pathinfo, &iop->pathinfo );
+      rtems_filesystem_instance_unlock( &iop->pathinfo );
+
+      /*
+       * XXX: We call the open handler here to have a proper open and close
+       *      pair.
+       *
+       * FIXME: What to do with the path?
+       */
+      rv = (*iop2->pathinfo.handlers->open_h)( iop2, NULL, oflag, 0 );
+      if ( rv == 0 ) {
+        rv = fd2;
+      }
+    }
+  }
+
+  return rv;
+}
+
 static int vfcntl(
   int fd,
@@ -89,6 +126,10 @@
   switch ( cmd ) {
     case F_DUPFD:        /* dup */
+      ret = duplicate_iop( iop );
+      break;
+
+    case F_DUP2FD:       /* dup2 */
       fd2 = va_arg( ap, int );
-      ret = duplicate_iop( iop, fd2 );
+      ret = duplicate2_iop( iop, fd2 );
       break;
 
Index: cpukit/libfs/src/imfs/imfs_init.c
===================================================================
--- cpukit/libfs/src/imfs/imfs_init.c	(revision 967c14385b9194d4257bc44bf21bf1312f9f3321)
+++ cpukit/libfs/src/imfs/imfs_init.c	(revision 798b8da7efe7df881ded4105981d5e74ecd0aad7)
@@ -54,5 +54,5 @@
   [IMFS_MEMORY_FILE] = &IMFS_node_control_memfile,
   [IMFS_LINEAR_FILE] = &IMFS_node_control_linfile,
-  [IMFS_FIFO] = &IMFS_node_control_default
+  [IMFS_FIFO] = &IMFS_node_control_fifo
 };
 
Index: cpukit/libfs/src/pipe/fifo.c
===================================================================
--- cpukit/libfs/src/pipe/fifo.c	(revision 967c14385b9194d4257bc44bf21bf1312f9f3321)
+++ cpukit/libfs/src/pipe/fifo.c	(revision 798b8da7efe7df881ded4105981d5e74ecd0aad7)
@@ -391,51 +391,49 @@
     return -EINTR;
 
-  while (read < count) {
-    while (PIPE_EMPTY(pipe)) {
-      /* Not an error */
-      if (pipe->Writers == 0)
-        goto out_locked;
-
-      if (LIBIO_NODELAY(iop)) {
-        ret = -EAGAIN;
-        goto out_locked;
-      }
-
-      /* Wait until pipe is no more empty or no writer exists */
-      pipe->waitingReaders ++;
-      PIPE_UNLOCK(pipe);
-      if (! PIPE_READWAIT(pipe))
-        ret = -EINTR;
-      if (! PIPE_LOCK(pipe)) {
-        /* WARN waitingReaders not restored! */
-        ret = -EINTR;
-        goto out_nolock;
-      }
-      pipe->waitingReaders --;
-      if (ret != 0)
-        goto out_locked;
+  while (PIPE_EMPTY(pipe)) {
+    /* Not an error */
+    if (pipe->Writers == 0)
+      goto out_locked;
+
+    if (LIBIO_NODELAY(iop)) {
+      ret = -EAGAIN;
+      goto out_locked;
     }
 
-    /* Read chunk bytes */
-    chunk = MIN(count - read,  pipe->Length);
-    chunk1 = pipe->Size - pipe->Start;
-    if (chunk > chunk1) {
-      memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1);
-      memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1);
+    /* Wait until pipe is no more empty or no writer exists */
+    pipe->waitingReaders ++;
+    PIPE_UNLOCK(pipe);
+    if (! PIPE_READWAIT(pipe))
+      ret = -EINTR;
+    if (! PIPE_LOCK(pipe)) {
+      /* WARN waitingReaders not restored! */
+      ret = -EINTR;
+      goto out_nolock;
     }
-    else
-      memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk);
-
-    pipe->Start += chunk;
-    pipe->Start %= pipe->Size;
-    pipe->Length -= chunk;
-    /* For buffering optimization */
-    if (PIPE_EMPTY(pipe))
-      pipe->Start = 0;
-
-    if (pipe->waitingWriters > 0)
-      PIPE_WAKEUPWRITERS(pipe);
-    read += chunk;
-  }
+    pipe->waitingReaders --;
+    if (ret != 0)
+      goto out_locked;
+  }
+
+  /* Read chunk bytes */
+  chunk = MIN(count - read,  pipe->Length);
+  chunk1 = pipe->Size - pipe->Start;
+  if (chunk > chunk1) {
+    memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1);
+    memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1);
+  }
+  else
+    memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk);
+
+  pipe->Start += chunk;
+  pipe->Start %= pipe->Size;
+  pipe->Length -= chunk;
+  /* For buffering optimization */
+  if (PIPE_EMPTY(pipe))
+    pipe->Start = 0;
+
+  if (pipe->waitingWriters > 0)
+    PIPE_WAKEUPWRITERS(pipe);
+  read += chunk;
 
 out_locked:
Index: cpukit/libnetworking/lib/syslog.c
===================================================================
--- cpukit/libnetworking/lib/syslog.c	(revision 967c14385b9194d4257bc44bf21bf1312f9f3321)
+++ cpukit/libnetworking/lib/syslog.c	(revision 798b8da7efe7df881ded4105981d5e74ecd0aad7)
@@ -143,5 +143,5 @@
 	myAddress.sin_family = AF_INET;
 	myAddress.sin_addr.s_addr = INADDR_ANY;
-	myAddress.sin_port = 0;
+	myAddress.sin_port = htons (SYSLOG_PORT);;
 	memset (myAddress.sin_zero, '\0', sizeof myAddress.sin_zero);
 	if (bind (LogFd, (struct sockaddr *)&myAddress, sizeof (myAddress)) < 0) {
