Index: c/src/lib/libbsp/m68k/dmv152/clock/ckinit.c
===================================================================
--- c/src/lib/libbsp/m68k/dmv152/clock/ckinit.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/dmv152/clock/ckinit.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -20,8 +20,7 @@
 
 #include <stdlib.h>
-
-#include <rtems.h>
+ 
 #include <bsp.h>
-#include <clockdrv.h>
+#include <rtems/libio.h>
 
 rtems_unsigned32 Clock_isrs;        /* ISRs until next tick */
@@ -30,24 +29,35 @@
 rtems_isr_entry  Old_ticker;
 
-rtems_device_driver Clock_initialize(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void *pargp,
-  rtems_id tid,
-  rtems_unsigned32 *rval
+void Clock_exit( void );
+
+#define CLOCK_VECTOR  TIMER_VECTOR
+ 
+/*
+ * These are set by clock driver during its init
+ */
+ 
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+/*
+ *  ISR Handler
+ */
+
+rtems_isr Clock_isr(
+  rtems_vector_number vector
 )
 {
-  Install_clock( Clock_isr );
-}
+  Clock_driver_ticks += 1;
 
-void ReInstall_clock(
-  rtems_isr_entry clock_isr
-)
-{
-  rtems_unsigned32 isrlevel = 0 ;
+  Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xE2 );
+  Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x22 );
+  Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xC6 );
 
-  rtems_interrupt_disable( isrlevel );
-   (void) set_vector( clock_isr, TIMER_VECTOR, 1 );
-  rtems_interrupt_enable( isrlevel );
+  if ( Clock_isrs == 1 ) {
+    rtems_clock_tick();
+    Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+  }
+  else
+    Clock_isrs -= 1;
 }
 
@@ -62,5 +72,5 @@
 
   if ( BSP_Configuration.ticks_per_timeslice ) {
-    Old_ticker = (rtems_isr_entry) set_vector( clock_isr, TIMER_VECTOR, 1 );
+    Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
 
     Z8x36_WRITE( TIMER, MASTER_CFG, 0xd4 );
@@ -70,5 +80,5 @@
     Z8x36_WRITE( TIMER, CT1_TIME_CONST_LSB, 0xCE );
     Z8x36_WRITE( TIMER, CT1_MODE_SPEC, 0x83 );
-    Z8x36_WRITE( TIMER, CNT_TMR_VECTOR, TIMER_VECTOR );
+    Z8x36_WRITE( TIMER, CNT_TMR_VECTOR, CLOCK_VECTOR );
     Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x20 );
     Z8x36_READ ( TIMER, MASTER_INTR, data );
@@ -88,4 +98,15 @@
 }
 
+void ReInstall_clock(
+  rtems_isr_entry clock_isr
+)
+{
+  rtems_unsigned32 isrlevel = 0 ;
+
+  rtems_interrupt_disable( isrlevel );
+   (void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+  rtems_interrupt_enable( isrlevel );
+}
+
 void Clock_exit( void )
 {
@@ -100,2 +121,50 @@
   }
 }
+
+rtems_device_driver Clock_initialize(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void *pargp
+)
+{
+  Install_clock( Clock_isr );
+ 
+  /*
+   * make major/minor avail to others such as shared memory driver
+   */
+ 
+  rtems_clock_major = major;
+  rtems_clock_minor = minor;
+ 
+  return RTEMS_SUCCESSFUL;
+}
+ 
+rtems_device_driver Clock_control(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void *pargp
+)
+{
+    rtems_libio_ioctl_args_t *args = pargp;
+ 
+    if (args == 0)
+        goto done;
+ 
+    /*
+     * This is hokey, but until we get a defined interface
+     * to do this, it will just be this simple...
+     */
+ 
+    if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+    {
+        Clock_isr(CLOCK_VECTOR);
+    }
+    else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+    {
+        ReInstall_clock(args->buffer);
+    }
+ 
+done:
+    return RTEMS_SUCCESSFUL;
+}
+
Index: c/src/lib/libbsp/m68k/dmv152/console/console.c
===================================================================
--- c/src/lib/libbsp/m68k/dmv152/console/console.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/dmv152/console/console.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -15,8 +15,7 @@
 #define D152_INIT
 
-#include <rtems.h>
-#include "console.h"
-#include "bsp.h"
-
+#include <bsp.h>
+#include <rtems/libio.h>
+ 
 /*  console_initialize
  *
@@ -29,16 +28,24 @@
  *  Return values:
  */
-
+ 
 rtems_device_driver console_initialize(
   rtems_device_major_number  major,
   rtems_device_minor_number  minor,
-  void                      *arg,
-  rtems_id                   self,
-  rtems_unsigned32          *status
-)
-{
-  *status = RTEMS_SUCCESSFUL;
-}
-
+  void                      *arg
+)
+{
+  rtems_status_code status;
+ 
+  status = rtems_io_register_name(
+    "/dev/console",
+    major,
+    (rtems_device_minor_number) 0
+  );
+ 
+  if (status != RTEMS_SUCCESSFUL)
+    rtems_fatal_error_occurred(status);
+ 
+  return RTEMS_SUCCESSFUL;
+}
 
 /*  is_character_ready
@@ -140,47 +147,101 @@
 
 /*
- * __read  -- read bytes from the serial port. Ignore fd, since
- *            we only have stdin.
- */
-
-int __read(
-  int fd,
-  char *buf,
-  int nbytes
-)
-{
-  int i = 0;
-
-  for (i = 0; i < nbytes; i++) {
-    *(buf + i) = inbyte();
-    if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
-      (*(buf + i++)) = '\n';
-      (*(buf + i)) = 0;
+ *  Open entry point
+ */
+
+rtems_device_driver console_open(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
+ 
+/*
+ *  Close entry point
+ */
+
+rtems_device_driver console_close(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  rtems_libio_rw_args_t *rw_args;
+  char *buffer;
+  int maximum;
+  int count = 0;
+ 
+  rw_args = (rtems_libio_rw_args_t *) arg;
+
+  buffer = rw_args->buffer;
+  maximum = rw_args->count;
+
+  for (count = 0; count < maximum; count++) {
+    buffer[ count ] = inbyte();
+    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+      buffer[ count++ ]  = '\n';
+      buffer[ count ]  = 0;
       break;
     }
   }
-  return (i);
-}
-
-/*
- * __write -- write bytes to the serial port. Ignore fd, since
- *            stdout and stderr are the same. Since we have no filesystem,
- *            open will only return an error.
- */
-
-int __write(
-  int fd,
-  char *buf,
-  int nbytes
-)
-{
-  int i;
-
-  for (i = 0; i < nbytes; i++) {
-    if (*(buf + i) == '\n') {
-      outbyte ('\r');
+
+  rw_args->bytes_moved = count;
+  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same. 
+ */
+
+rtems_device_driver console_write(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  int count;
+  int maximum;
+  rtems_libio_rw_args_t *rw_args;
+  char *buffer;
+
+  rw_args = (rtems_libio_rw_args_t *) arg;
+
+  buffer = rw_args->buffer;
+  maximum = rw_args->count;
+
+  for (count = 0; count < maximum; count++) {
+    if ( buffer[ count ] == '\n') {
+      outbyte('\r');
     }
-    outbyte (*(buf + i));
-  }
-  return (nbytes);
-}
+    outbyte( buffer[ count ] );
+  }
+  return maximum;
+}
+
+/*
+ *  IO Control entry point
+ */
+
+rtems_device_driver console_control(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
Index: c/src/lib/libbsp/m68k/dmv152/include/bsp.h
===================================================================
--- c/src/lib/libbsp/m68k/dmv152/include/bsp.h	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/dmv152/include/bsp.h	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -22,5 +22,8 @@
 
 #include <rtems.h>
+#include <console.h>
+#include <clockdrv.h>
 #include <iosupp.h>
+#include <vmeintr.h>
 #include <z8530.h>
 #include <z8536.h>
@@ -152,4 +155,22 @@
 extern m68k_isr_entry M68Kvec[];   /* vector table address */
 
+/*
+ *  Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+ 
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS       20
+
 /* functions */
 
Index: c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c
===================================================================
--- c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -22,9 +22,15 @@
  */
 
-#include <rtems.h>
 #include <bsp.h>
+#include <rtems/libio.h>
+ 
 #include <libcsupport.h>
-#include <vmeintr.h>
-
+ 
+#include <string.h>
+#include <fcntl.h>
+ 
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
 /*
  *  The original table from the application and our copy of it with
@@ -36,4 +42,6 @@
 
 rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
 
 /*      Initialize whatever libc we are using
@@ -53,4 +61,12 @@
 
     /*
+     *  Init the RTEMS libio facility to provide UNIX-like system
+     *  calls for use by newlib (ie: provide __open, __close, etc)
+     *  Uses malloc() to get area for the iops, so must be after malloc init
+     */
+
+    rtems_libio_init();
+
+    /*
      * Set up for the libc handling.
      */
@@ -70,5 +86,31 @@
 }
 
-int bsp_start(
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+ 
+void
+bsp_postdriver_hook(void)
+{
+  int stdin_fd, stdout_fd, stderr_fd;
+ 
+  if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD0');
+ 
+  if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD1');
+ 
+  if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD2');
+ 
+  if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+    rtems_fatal_error_occurred('STIO');
+}
+
+int main(
   int argc,
   char **argv,
@@ -80,4 +122,9 @@
   void           *vbr;
 
+  if ((argc > 0) && argv && argv[0])
+    rtems_progname = argv[0];
+  else
+    rtems_progname = "RTEMS";
+
   monitors_vector_table = (m68k_isr_entry *)0;   /* Monitor Vectors are at 0 */
   m68k_set_vbr( monitors_vector_table );
@@ -116,5 +163,5 @@
   Cpu_table.predriver_hook = bsp_libc_init;  /* RTEMS resources available */
 
-  Cpu_table.postdriver_hook = NULL;   /* Call our main() for constructors */
+  Cpu_table.postdriver_hook = bsp_postdriver_hook;
 
   Cpu_table.idle_task = NULL;  /* do not override system IDLE task */
@@ -159,4 +206,10 @@
     BSP_Configuration.maximum_extensions++;
 #endif
+
+  /*
+   * Tell libio how many fd's we want and allow it to tweak config
+   */
+
+  rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
 
   rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
Index: c/src/lib/libbsp/m68k/gen68302/clock/ckinit.c
===================================================================
--- c/src/lib/libbsp/m68k/gen68302/clock/ckinit.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/gen68302/clock/ckinit.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -21,9 +21,10 @@
 #include <stdlib.h>			/* for atexit() */
 
-#include <rtems.h>
 #include <bsp.h>
-#include <clockdrv.h>
+#include <rtems/libio.h>
+
 #include "m68302.h"
 
+#define CLOCK_VECTOR 137
 
 #define TMR1_VAL (  RBIT_TMR_RST	/* software reset the timer */\
@@ -50,16 +51,33 @@
 rtems_unsigned32 Clock_isrs;
 
+void Clock_exit( void );
+ 
+/*
+ * These are set by clock driver during its init
+ */
+ 
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
 
-rtems_device_driver Clock_initialize( 
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void *pargp,
-  rtems_id tid,
-  rtems_unsigned32 *rval
+/*
+ *  ISR Handler
+ */
+
+rtems_isr Clock_isr(
+  rtems_vector_number vector
 )
 {
-  Install_clock( Clock_isr );
+  Clock_driver_ticks += 1;
+
+  m302.reg.isr  = RBIT_ISR_TIMER1;	/* clear in-service bit */
+  m302.reg.ter1 = (RBIT_TER_REF | RBIT_TER_CAP); /* clear timer intr request */
+
+  if ( Clock_isrs == 1 ) {
+    rtems_clock_tick();
+    Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+  }
+  else
+    Clock_isrs -= 1;
 }
-
 
 void Install_clock(
@@ -72,5 +90,5 @@
 
   if ( BSP_Configuration.ticks_per_timeslice ) {
-/*  set_vector( clock_isr, 137, 1 );*/
+/*  set_vector( clock_isr, CLOCK_VECTOR, 1 );*/
 
     m302.reg.trr1 = TRR1_VAL;		/* set timer reference register */
@@ -85,4 +103,14 @@
 }
 
+void ReInstall_clock(
+  rtems_isr_entry clock_isr
+)
+{
+  rtems_unsigned32 isrlevel;
+ 
+  rtems_interrupt_disable( isrlevel );
+   /* (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); */
+  rtems_interrupt_enable( isrlevel );
+}
 
 void Clock_exit( void )
@@ -93,2 +121,50 @@
   }
 }
+
+rtems_device_driver Clock_initialize(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void *pargp
+)
+{
+  Install_clock( Clock_isr );
+ 
+  /*
+   * make major/minor avail to others such as shared memory driver
+   */
+ 
+  rtems_clock_major = major;
+  rtems_clock_minor = minor;
+ 
+  return RTEMS_SUCCESSFUL;
+}
+ 
+rtems_device_driver Clock_control(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void *pargp
+)
+{
+    rtems_libio_ioctl_args_t *args = pargp;
+ 
+    if (args == 0)
+        goto done;
+ 
+    /*
+     * This is hokey, but until we get a defined interface
+     * to do this, it will just be this simple...
+     */
+ 
+    if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+    {
+        Clock_isr( CLOCK_VECTOR);
+    }
+    else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+    {
+        ReInstall_clock(args->buffer);
+    }
+ 
+done:
+    return RTEMS_SUCCESSFUL;
+}
+
Index: c/src/lib/libbsp/m68k/gen68302/console/console.c
===================================================================
--- c/src/lib/libbsp/m68k/gen68302/console/console.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/gen68302/console/console.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -15,7 +15,6 @@
 #define GEN68302_INIT
 
-#include <rtems.h>
-#include "console.h"
 #include <bsp.h>
+#include <rtems/libio.h>
 
 #include "m68302.h"
@@ -35,9 +34,8 @@
   rtems_device_major_number  major,
   rtems_device_minor_number  minor,
-  void                      *arg,
-  rtems_id                   self,
-  rtems_unsigned32          *status
-)
-{
+  void                      *arg
+)
+{
+  rtems_status_code status;
   volatile m302_dualPortRAM_t *p = &m302;
 
@@ -82,7 +80,16 @@
   p->reg.scc[1].scm  = 0x01BD;
 
-  *status = RTEMS_SUCCESSFUL;
-}
-
+  status = rtems_io_register_name(
+    "/dev/console",
+    major,
+    (rtems_device_minor_number) 0
+  );
+ 
+  if (status != RTEMS_SUCCESSFUL)
+    rtems_fatal_error_occurred(status);
+ 
+  return RTEMS_SUCCESSFUL;
+
+}
 
 /*  is_character_ready
@@ -195,47 +202,101 @@
 
 /*
- * __read  -- read bytes from the serial port. Ignore fd, since
- *            we only have stdin.
- */
-
-int __read(
-  int fd,
-  char *buf,
-  int nbytes
-)
-{
-  int i = 0;
-
-  for (i = 0; i < nbytes; i++) {
-    *(buf + i) = inbyte();
-    if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
-      (*(buf + i++)) = '\n';
-      (*(buf + i)) = 0;
+ *  Open entry point
+ */
+
+rtems_device_driver console_open(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
+ 
+/*
+ *  Close entry point
+ */
+
+rtems_device_driver console_close(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  rtems_libio_rw_args_t *rw_args;
+  char *buffer;
+  int maximum;
+  int count = 0;
+ 
+  rw_args = (rtems_libio_rw_args_t *) arg;
+
+  buffer = rw_args->buffer;
+  maximum = rw_args->count;
+
+  for (count = 0; count < maximum; count++) {
+    buffer[ count ] = inbyte();
+    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+      buffer[ count++ ]  = '\n';
+      buffer[ count ]  = 0;
       break;
     }
   }
-  return (i);
-}
-
-/*
- * __write -- write bytes to the serial port. Ignore fd, since
- *            stdout and stderr are the same. Since we have no filesystem,
- *            open will only return an error.
- */
-
-int __write(
-  int fd,
-  char *buf,
-  int nbytes
-)
-{
-  int i;
-
-  for (i = 0; i < nbytes; i++) {
-    if (*(buf + i) == '\n') {
-      outbyte ('\r');
+
+  rw_args->bytes_moved = count;
+  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same. 
+ */
+
+rtems_device_driver console_write(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  int count;
+  int maximum;
+  rtems_libio_rw_args_t *rw_args;
+  char *buffer;
+
+  rw_args = (rtems_libio_rw_args_t *) arg;
+
+  buffer = rw_args->buffer;
+  maximum = rw_args->count;
+
+  for (count = 0; count < maximum; count++) {
+    if ( buffer[ count ] == '\n') {
+      outbyte('\r');
     }
-    outbyte (*(buf + i));
+    outbyte( buffer[ count ] );
   }
-  return (nbytes);
-}
+  return maximum;
+}
+
+/*
+ *  IO Control entry point
+ */
+
+rtems_device_driver console_control(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
Index: c/src/lib/libbsp/m68k/gen68302/include/bsp.h
===================================================================
--- c/src/lib/libbsp/m68k/gen68302/include/bsp.h	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/gen68302/include/bsp.h	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -24,5 +24,7 @@
 
 #include <rtems.h>
+#include <console.h>
 #include <iosupp.h>
+#include <clockdrv.h>
 
 /*
@@ -82,4 +84,22 @@
 #endif
 
+/*
+ *  Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+ 
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS       20
+
 /* miscellaneous stuff assumed to exist */
 
Index: c/src/lib/libbsp/m68k/gen68302/start/start302.s
===================================================================
--- c/src/lib/libbsp/m68k/gen68302/start/start302.s	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/gen68302/start/start302.s	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -228,5 +228,8 @@
 #endif
 
-        jsr     SYM (bsp_start)
+        move.l  #0,a7@-               | environp
+        move.l  #0,a7@-               | argv
+        move.l  #0,a7@-               | argc
+        jsr     SYM (main)
 
 	nop
Index: c/src/lib/libbsp/m68k/gen68302/start302/start302.s
===================================================================
--- c/src/lib/libbsp/m68k/gen68302/start302/start302.s	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/gen68302/start302/start302.s	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -228,5 +228,8 @@
 #endif
 
-        jsr     SYM (bsp_start)
+        move.l  #0,a7@-               | environp
+        move.l  #0,a7@-               | argv
+        move.l  #0,a7@-               | argc
+        jsr     SYM (main)
 
 	nop
Index: c/src/lib/libbsp/m68k/gen68302/startup/bspstart.c
===================================================================
--- c/src/lib/libbsp/m68k/gen68302/startup/bspstart.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/gen68302/startup/bspstart.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -21,8 +21,15 @@
  */
 
-#include <rtems.h>
 #include <bsp.h>
+#include <rtems/libio.h>
+ 
 #include <libcsupport.h>
-
+ 
+#include <string.h>
+#include <fcntl.h>
+ 
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
 
 /*
@@ -35,4 +42,6 @@
 
 rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
 
 /*      Initialize whatever libc we are using
@@ -59,4 +68,12 @@
 
     /*
+     *  Init the RTEMS libio facility to provide UNIX-like system
+     *  calls for use by newlib (ie: provide __open, __close, etc)
+     *  Uses malloc() to get area for the iops, so must be after malloc init
+     */
+
+    rtems_libio_init();
+
+    /*
      * Set up for the libc handling.
      */
@@ -76,6 +93,31 @@
 }
 
-
-int bsp_start(
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+ 
+void
+bsp_postdriver_hook(void)
+{
+  int stdin_fd, stdout_fd, stderr_fd;
+ 
+  if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD0');
+ 
+  if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD1');
+ 
+  if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD2');
+ 
+  if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+    rtems_fatal_error_occurred('STIO');
+}
+
+int main(
   int argc,
   char **argv,
@@ -83,4 +125,9 @@
 )
 {
+  if ((argc > 0) && argv && argv[0])
+    rtems_progname = argv[0];
+  else
+    rtems_progname = "RTEMS";
+
   /*
    *  Allocate the memory for the RTEMS Work Space.  This can come from
@@ -91,5 +138,5 @@
    */
 #if 0
-a  Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/;
+  Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/;
 #endif
 
@@ -122,4 +169,10 @@
     BSP_Configuration.maximum_extensions++;
 #endif
+
+  /*
+   * Tell libio how many fd's we want and allow it to tweak config
+   */
+
+  rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
 
   /*
@@ -144,5 +197,5 @@
   Cpu_table.predriver_hook = bsp_libc_init;    /* RTEMS resources available */
 
-  Cpu_table.postdriver_hook = NULL;
+  Cpu_table.postdriver_hook = bsp_postdriver_hook;
 
   Cpu_table.idle_task = NULL;  /* do not override system IDLE task */
Index: c/src/lib/libbsp/m68k/idp/clock/ckinit.c
===================================================================
--- c/src/lib/libbsp/m68k/idp/clock/ckinit.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/idp/clock/ckinit.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -27,7 +27,6 @@
 #include <stdlib.h>
 
-#include <rtems.h>
-#include <clockdrv.h>
 #include <bsp.h>
+#include <rtems/libio.h>
 
 rtems_unsigned32 Clock_isrs;        /* ISRs until next tick */
@@ -40,28 +39,51 @@
 void Disable_clock();
 
-#define TIMER_VECTOR 0x4D
-
-rtems_device_driver Clock_initialize( 
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void *pargp,
-  rtems_id tid,
-  rtems_unsigned32 *rval
+#define CLOCK_VECTOR 0x4D
+
+void Clock_exit( void );
+ 
+/*
+ * These are set by clock driver during its init
+ */
+ 
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+ 
+
+/*
+ *  ISR Handler
+ *
+ *
+ * ((1ms * 6.5 MHz) / 2^5) = 203.125) where 6.5 MHz is the clock rate of the
+ * MC68230, 2^5 is the prescaler factor, and 1ms is the common interrupt
+ * interval for the Clock_isr routine.
+ * Therefore, 203 (decimal) is the number to program into the CPRH-L registers
+ * of the MC68230 for countdown.  However, I have found that 193 instead of
+ * 203 provides greater accuracy -- why?  The crystal should be more accurate
+ * than that
+ */
+
+rtems_isr Clock_isr(
+  rtems_vector_number vector
 )
 {
-  Install_clock( Clock_isr );
-}
-
-void ReInstall_clock( clock_isr )
-rtems_isr_entry clock_isr;
-{
-  rtems_unsigned32 isrlevel = 0 ;
-
-  rtems_interrupt_disable( isrlevel );
-   (void) set_vector( clock_isr, TIMER_VECTOR, 1 );
-  rtems_interrupt_enable( isrlevel );
-}
-
-/* The following was added for debugging purposes */
+  Clock_driver_ticks += 1;
+  /* acknowledge interrupt
+  	TSR = 1; */
+  MC68230_WRITE (TSR, 1);
+
+  if ( Clock_isrs == 1 ) {
+    rtems_clock_tick();
+	/* Cast to an integer so that 68EC040 IDP which doesn't have an FPU doesn't
+	   have a heart attack -- if you use newlib1.6 or greater and get
+	   libgcc.a for gcc with software floating point support, this is not
+	   a problem */
+    Clock_isrs = 
+      (int)(BSP_Configuration.microseconds_per_tick / 1000);
+  }
+  else 
+    Clock_isrs -= 1;
+}
+
 void Disable_clock()
 {
@@ -78,5 +100,5 @@
   if ( Configuration.ticks_per_timeslice ) {
 /*    led_putnum('c'); * for debugging purposes */
-    Old_ticker = (rtems_isr_entry) set_vector( clock_isr, TIMER_VECTOR, 1 );
+    Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
 
 	/* Disable timer for initialization */
@@ -86,6 +108,6 @@
 	   file in this directory to understand why I use the values that I do */
 	/* Set up the interrupt vector on the MC68230 chip:
-		TIVR = TIMER_VECTOR; */
-	MC68230_WRITE (TIVR, TIMER_VECTOR);
+		TIVR = CLOCK_VECTOR; */
+	MC68230_WRITE (TIVR, CLOCK_VECTOR);
 
 	/* Set CPRH through CPRL to 193 (not 203) decimal for countdown--see ckisr.c
@@ -109,4 +131,15 @@
 }
 
+void ReInstall_clock( clock_isr )
+rtems_isr_entry clock_isr;
+{
+  rtems_unsigned32 isrlevel = 0 ;
+
+  rtems_interrupt_disable( isrlevel );
+   (void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+  rtems_interrupt_enable( isrlevel );
+}
+
+/* The following was added for debugging purposes */
 void Clock_exit( void )
 {
@@ -124,2 +157,50 @@
   }
 }
+
+rtems_device_driver Clock_initialize(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void *pargp
+)
+{
+  Install_clock( Clock_isr );
+ 
+  /*
+   * make major/minor avail to others such as shared memory driver
+   */
+ 
+  rtems_clock_major = major;
+  rtems_clock_minor = minor;
+ 
+  return RTEMS_SUCCESSFUL;
+}
+ 
+rtems_device_driver Clock_control(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void *pargp
+)
+{
+    rtems_libio_ioctl_args_t *args = pargp;
+ 
+    if (args == 0)
+        goto done;
+ 
+    /*
+     * This is hokey, but until we get a defined interface
+     * to do this, it will just be this simple...
+     */
+ 
+    if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+    {
+        Clock_isr(CLOCK_VECTOR);
+    }
+    else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+    {
+        ReInstall_clock(args->buffer);
+    }
+ 
+done:
+    return RTEMS_SUCCESSFUL;
+}
+
Index: c/src/lib/libbsp/m68k/idp/console/console.c
===================================================================
--- c/src/lib/libbsp/m68k/idp/console/console.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/idp/console/console.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -12,14 +12,12 @@
 #define MIDP_INIT
 
-#include "rtems.h"
-#include "console.h"
-#include "bsp.h"
-
-#include "ringbuf.h"
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <ringbuf.h>
 
 Ring_buffer_t  Buffer[ 2 ];
 
 rtems_isr C_Receive_ISR(rtems_vector_number vector);
-
 
 /*  console_initialize
@@ -37,9 +35,8 @@
   rtems_device_major_number  major,
   rtems_device_minor_number  minor,
-  void                      *arg,
-  rtems_id                   self,
-  rtems_unsigned32          *status
-)
-{
+  void                      *arg
+)
+{
+  rtems_status_code status;
 
   Ring_buffer_Initialize( &Buffer[ 0 ] );
@@ -48,5 +45,32 @@
   init_pit();
 
-  *status = RTEMS_SUCCESSFUL;
+  status = rtems_io_register_name(
+    "/dev/console",
+    major,
+    (rtems_device_minor_number) 0
+  );
+ 
+  if (status != RTEMS_SUCCESSFUL)
+    rtems_fatal_error_occurred(status);
+ 
+  status = rtems_io_register_name(
+    "/dev/tty00",
+    major,
+    (rtems_device_minor_number) 0
+  );
+ 
+  if (status != RTEMS_SUCCESSFUL)
+    rtems_fatal_error_occurred(status);
+ 
+  status = rtems_io_register_name(
+    "/dev/tty01",
+    major,
+    (rtems_device_minor_number) 1
+  );
+ 
+  if (status != RTEMS_SUCCESSFUL)
+    rtems_fatal_error_occurred(status);
+ 
+  return RTEMS_SUCCESSFUL;
 }
 
@@ -152,65 +176,107 @@
 
 /*
- * __read  -- read bytes from the serial port. Ignore fd, since
- *            we only have stdin.
- */
-
-int __read(
-  int fd,
-  char *buf,
-  int nbytes
-)
-{
-  int i = 0;
-  int port;
-
-  /*
-   *  Map port A to stdin, stdout, and stderr.
-   *  Map everything else to port B.
-   */
-
-  if ( fd <= 2 ) port = 0;
-  else           port = 1;
-
-  for (i = 0; i < nbytes; i++) {
-    *(buf + i) = inbyte( port );
-    if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
-      (*(buf + i++)) = '\n';
-      (*(buf + i)) = 0;
+ *  Open entry point
+ */
+
+rtems_device_driver console_open(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
+ 
+/*
+ *  Close entry point
+ */
+
+rtems_device_driver console_close(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  rtems_libio_rw_args_t *rw_args;
+  char *buffer;
+  int maximum;
+  int count = 0;
+ 
+  rw_args = (rtems_libio_rw_args_t *) arg;
+
+  buffer = rw_args->buffer;
+  maximum = rw_args->count;
+
+  if ( minor > 1 )
+    return RTEMS_INVALID_NUMBER;
+
+  for (count = 0; count < maximum; count++) {
+    buffer[ count ] = inbyte( minor );
+    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+      buffer[ count++ ]  = '\n';
+      buffer[ count ]  = 0;
       break;
     }
   }
-  return (i);
-}
-
-/*
- * __write -- write bytes to the serial port. Ignore fd, since
- *            stdout and stderr are the same. Since we have no filesystem,
- *            open will only return an error.
- */
-
-int __write(
-  int fd,
-  char *buf,
-  int nbytes
-)
-{
-  int i;
-  int port;
- 
-  /*
-   *  Map port A to stdin, stdout, and stderr.
-   *  Map everything else to port B.
-   */
- 
-  if ( fd <= 2 ) port = 0;
-  else           port = 1;
- 
-  for (i = 0; i < nbytes; i++) {
-    if (*(buf + i) == '\n') {
-      outbyte ('\r', port );
+
+  rw_args->bytes_moved = count;
+  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same. 
+ */
+
+rtems_device_driver console_write(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  int count;
+  int maximum;
+  rtems_libio_rw_args_t *rw_args;
+  char *buffer;
+
+  rw_args = (rtems_libio_rw_args_t *) arg;
+
+  buffer = rw_args->buffer;
+  maximum = rw_args->count;
+
+  if ( minor > 1 )
+    return RTEMS_INVALID_NUMBER;
+
+  for (count = 0; count < maximum; count++) {
+    if ( buffer[ count ] == '\n') {
+      outbyte('\r', minor );
     }
-    outbyte (*(buf + i), port );
+    outbyte( buffer[ count ], minor  );
   }
-  return (nbytes);
-}
+  return maximum;
+}
+
+/*
+ *  IO Control entry point
+ */
+
+rtems_device_driver console_control(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
Index: c/src/lib/libbsp/m68k/idp/include/bsp.h
===================================================================
--- c/src/lib/libbsp/m68k/idp/include/bsp.h	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/idp/include/bsp.h	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -11,4 +11,5 @@
 #include <rtems.h>
 #include <console.h>
+#include <clockdrv.h>
 #include <mc68230.h>
 #include <mc68681.h>
@@ -53,4 +54,22 @@
 #endif
 
+/*
+ *  Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+ 
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS       20
+
 /* miscellaneous stuff assumed to exist */
 
Index: c/src/lib/libbsp/m68k/idp/startup/bspstart.c
===================================================================
--- c/src/lib/libbsp/m68k/idp/startup/bspstart.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/idp/startup/bspstart.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -21,7 +21,15 @@
  */
 
-#include <rtems.h>
 #include <bsp.h>
+#include <rtems/libio.h>
+ 
 #include <libcsupport.h>
+ 
+#include <string.h>
+#include <fcntl.h>
+ 
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
 
 unsigned char *duart_base;
@@ -42,4 +50,6 @@
 rtems_cpu_table Cpu_table;
  
+char *rtems_progname;
+
 /*      Initialize whatever libc we are using
  *      called from postdriver hook
@@ -57,4 +67,12 @@
 	/* Create 64 KByte memory region for RTEMS executive */
     RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+    /*
+     *  Init the RTEMS libio facility to provide UNIX-like system
+     *  calls for use by newlib (ie: provide __open, __close, etc)
+     *  Uses malloc() to get area for the iops, so must be after malloc init
+     */
+
+    rtems_libio_init();
  
     /*
@@ -77,5 +95,31 @@
  
 
-int bsp_start(
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+ 
+void
+bsp_postdriver_hook(void)
+{
+  int stdin_fd, stdout_fd, stderr_fd;
+ 
+  if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD0');
+ 
+  if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD1');
+ 
+  if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD2');
+ 
+  if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+    rtems_fatal_error_occurred('STIO');
+}
+
+int main(
   int argc,
   char **argv,
@@ -86,4 +130,9 @@
   int             index;
 
+  if ((argc > 0) && argv && argv[0])
+    rtems_progname = argv[0];
+  else
+    rtems_progname = "RTEMS";
+
   duart_base = (unsigned char *)DUART_ADDR;
 
@@ -122,5 +171,5 @@
   Cpu_table.predriver_hook = bsp_libc_init;  /* RTEMS resources available */
  
-  Cpu_table.postdriver_hook = NULL;
+  Cpu_table.postdriver_hook = bsp_postdriver_hook;
  
   Cpu_table.idle_task = NULL;  /* do not override system IDLE task */
@@ -165,4 +214,10 @@
 #endif
  
+  /*
+   * Tell libio how many fd's we want and allow it to tweak config
+   */
+
+  rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
 /*  led_putnum('e'); * for debugging purposes only */
   rtems_initialize_executive( &BSP_Configuration, &Cpu_table );/* does not return */
Index: c/src/lib/libbsp/m68k/mvme136/clock/ckinit.c
===================================================================
--- c/src/lib/libbsp/m68k/mvme136/clock/ckinit.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/mvme136/clock/ckinit.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -21,7 +21,6 @@
 #include <stdlib.h>
 
-#include <rtems.h>
 #include <bsp.h>
-#include <clockdrv.h>
+#include <rtems/libio.h>
 #include <z8036.h>
 
@@ -36,29 +35,41 @@
                                     /*   and trigger countdown */
 
+#define TIMER        0xfffb0000
+#define RELOAD       0x24            /* clr IP & IUS,allow countdown */
+ 
+#define CLOCK_VECTOR 66
+
 rtems_unsigned32 Clock_isrs;        /* ISRs until next tick */
-volatile rtems_unsigned32 Clock_driver_ticks;
-                                    /* ticks since initialization */
+
+volatile rtems_unsigned32 Clock_driver_ticks; /* ticks since initialization */
+
 rtems_isr_entry  Old_ticker;
 
-rtems_device_driver Clock_initialize(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void *pargp,
-  rtems_id tid,
-  rtems_unsigned32 *rval
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+ 
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+ 
+/*
+ *  ISR Handler
+ */
+ 
+rtems_isr Clock_isr(
+  rtems_vector_number vector
 )
 {
-  Install_clock( Clock_isr );
-}
+  Clock_driver_ticks += 1;
+  ((volatile struct z8036_map *) TIMER)->CT1_CMD_STATUS = RELOAD;
 
-void ReInstall_clock(
-  rtems_isr_entry clock_isr
-)
-{
-  rtems_unsigned32 isrlevel;
-
-  rtems_interrupt_disable( isrlevel );
-   (void) set_vector( clock_isr, 66, 1 );
-  rtems_interrupt_enable( isrlevel );
+  if ( Clock_isrs == 1 ) {
+    rtems_clock_tick();
+    Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+  }
+  else
+    Clock_isrs -= 1;
 }
 
@@ -73,26 +84,38 @@
 
   if ( BSP_Configuration.ticks_per_timeslice ) {
-    Old_ticker = (rtems_isr_entry) set_vector( clock_isr, 66, 1 );
+    Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
     timer = (struct z8036_map *) 0xfffb0000;
     timer->MASTER_INTR        = MICRVAL;
     timer->CT1_MODE_SPEC      = T1MSRVAL;
 
-  *((rtems_unsigned16 *)0xfffb0016) = MS_COUNT;  /* write countdown value */
-/*
-    timer->CT1_TIME_CONST_MSB = (MS_COUNT >> 8);
-    timer->CT1_TIME_CONST_LSB = (MS_COUNT &  0xff);
-*/
+    *((rtems_unsigned16 *)0xfffb0016) = MS_COUNT;  /* write countdown value */
+
+    /*
+     *  timer->CT1_TIME_CONST_MSB = (MS_COUNT >> 8);
+     *  timer->CT1_TIME_CONST_LSB = (MS_COUNT &  0xff);
+     */
+
     timer->MASTER_CFG         = MCCRVAL;
     timer->CT1_CMD_STATUS     = T1CSRVAL;
 
-/*
- * Enable interrupt via VME interrupt mask register
- */
+    /*
+     * Enable interrupt via VME interrupt mask register
+     */
     (*(rtems_unsigned8 *)0xfffb0038) &= 0xfd;
-
 
     atexit( Clock_exit );
   }
 
+}
+
+void ReInstall_clock(
+  rtems_isr_entry clock_isr
+)
+{
+  rtems_unsigned32 isrlevel;
+
+  rtems_interrupt_disable( isrlevel );
+   (void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+  rtems_interrupt_enable( isrlevel );
 }
 
@@ -110,2 +133,50 @@
   }
 }
+
+rtems_device_driver Clock_initialize(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void *pargp
+)
+{
+  Install_clock( Clock_isr );
+
+  /*
+   * make major/minor avail to others such as shared memory driver
+   */
+
+  rtems_clock_major = major;
+  rtems_clock_minor = minor;
+ 
+  return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void *pargp
+)
+{
+    rtems_libio_ioctl_args_t *args = pargp;
+ 
+    if (args == 0)
+        goto done;
+ 
+    /*
+     * This is hokey, but until we get a defined interface
+     * to do this, it will just be this simple...
+     */
+ 
+    if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+    {
+        Clock_isr(CLOCK_VECTOR);
+    }
+    else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+    {
+        ReInstall_clock(args->buffer);
+    }
+ 
+done:
+    return RTEMS_SUCCESSFUL;
+}
+
Index: c/src/lib/libbsp/m68k/mvme136/console/console.c
===================================================================
--- c/src/lib/libbsp/m68k/mvme136/console/console.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/mvme136/console/console.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -15,7 +15,6 @@
 #define M136_INIT
 
-#include <rtems.h>
-#include "console.h"
-#include "bsp.h"
+#include <bsp.h>
+#include <rtems/libio.h>
 
 /*  console_initialize
@@ -33,12 +32,22 @@
   rtems_device_major_number  major,
   rtems_device_minor_number  minor,
-  void                      *arg,
-  rtems_id                   self,
-  rtems_unsigned32          *status
-)
-{
+  void                      *arg
+)
+{
+  rtems_status_code status;
+
   _Write_m681 = ( struct w_m681_info * ) M681ADDR;
   _Read_m681 = ( struct r_m681_info * ) M681ADDR;
-  *status = RTEMS_SUCCESSFUL;
+
+  status = rtems_io_register_name(
+    "/dev/console",
+    major,
+    (rtems_device_minor_number) 0
+  );
+
+  if (status != RTEMS_SUCCESSFUL)
+    rtems_fatal_error_occurred(status);
+ 
+  return RTEMS_SUCCESSFUL;
 }
 
@@ -113,47 +122,101 @@
 
 /*
- * __read  -- read bytes from the serial port. Ignore fd, since
- *            we only have stdin.
- */
-
-int __read(
-  int fd,
-  char *buf,
-  int nbytes
-)
-{
-  int i = 0;
-
-  for (i = 0; i < nbytes; i++) {
-    *(buf + i) = inbyte();
-    if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
-      (*(buf + i++)) = '\n';
-      (*(buf + i)) = 0;
+ *  Open entry point
+ */
+
+rtems_device_driver console_open(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
+ 
+/*
+ *  Close entry point
+ */
+
+rtems_device_driver console_close(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  rtems_libio_rw_args_t *rw_args;
+  char *buffer;
+  int maximum;
+  int count = 0;
+ 
+  rw_args = (rtems_libio_rw_args_t *) arg;
+
+  buffer = rw_args->buffer;
+  maximum = rw_args->count;
+
+  for (count = 0; count < maximum; count++) {
+    buffer[ count ] = inbyte();
+    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+      buffer[ count++ ]  = '\n';
+      buffer[ count ]  = 0;
       break;
     }
   }
-  return (i);
-}
-
-/*
- * __write -- write bytes to the serial port. Ignore fd, since
- *            stdout and stderr are the same. Since we have no filesystem,
- *            open will only return an error.
- */
-
-int __write(
-  int fd,
-  char *buf,
-  int nbytes
-)
-{
-  int i;
-
-  for (i = 0; i < nbytes; i++) {
-    if (*(buf + i) == '\n') {
-      outbyte ('\r');
+
+  rw_args->bytes_moved = count;
+  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same. 
+ */
+
+rtems_device_driver console_write(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  int count;
+  int maximum;
+  rtems_libio_rw_args_t *rw_args;
+  char *buffer;
+
+  rw_args = (rtems_libio_rw_args_t *) arg;
+
+  buffer = rw_args->buffer;
+  maximum = rw_args->count;
+
+  for (count = 0; count < maximum; count++) {
+    if ( buffer[ count ] == '\n') {
+      outbyte('\r');
     }
-    outbyte (*(buf + i));
+    outbyte( buffer[ count ] );
   }
-  return (nbytes);
-}
+  return maximum;
+}
+
+/*
+ *  IO Control entry point
+ */
+
+rtems_device_driver console_control(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
Index: c/src/lib/libbsp/m68k/mvme136/include/bsp.h
===================================================================
--- c/src/lib/libbsp/m68k/mvme136/include/bsp.h	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/mvme136/include/bsp.h	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -22,4 +22,6 @@
 
 #include <rtems.h>
+#include <clockdrv.h>
+#include <console.h>
 #include <iosupp.h>
 
@@ -125,4 +127,22 @@
 extern m68k_isr_entry M68Kvec[];   /* vector table address */
 
+/*
+ *  Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+ 
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS       20
+
 /* functions */
 
Index: c/src/lib/libbsp/m68k/mvme136/startup/bspstart.c
===================================================================
--- c/src/lib/libbsp/m68k/mvme136/startup/bspstart.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/mvme136/startup/bspstart.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -21,10 +21,16 @@
  */
 
-#include <rtems.h>
 #include <bsp.h>
+#include <rtems/libio.h>
+
 #include <libcsupport.h>
 #include <z8036.h>
 
-#include "stackchk.h"
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
 
 /*
@@ -37,4 +43,6 @@
 
 rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
 
 /*      Initialize whatever libc we are using
@@ -47,4 +55,8 @@
     rtems_unsigned32        heap_start;
 
+#ifdef RTEMS_DEBUG
+    rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+
     heap_start = (rtems_unsigned32) &end;
     if (heap_start & (CPU_ALIGNMENT-1))
@@ -52,4 +64,12 @@
 
     RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+    /*
+     *  Init the RTEMS libio facility to provide UNIX-like system
+     *  calls for use by newlib (ie: provide __open, __close, etc)
+     *  Uses malloc() to get area for the iops, so must be after malloc init
+     */
+
+    rtems_libio_init();
 
     /*
@@ -71,5 +91,32 @@
 }
 
-int bsp_start(
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+ 
+void
+bsp_postdriver_hook(void)
+{
+  int stdin_fd, stdout_fd, stderr_fd;
+
+  if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD0');
+ 
+  if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD1');
+ 
+  if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD2');
+ 
+  if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+    rtems_fatal_error_occurred('STIO');
+}
+
+
+int main(
   int argc,
   char **argv,
@@ -80,4 +127,9 @@
   int             index;
 
+  if ((argc > 0) && argv && argv[0])
+    rtems_progname = argv[0];
+  else
+    rtems_progname = "RTEMS";
+
   monitors_vector_table = (m68k_isr_entry *)0;   /* 135Bug Vectors are at 0 */
   m68k_set_vbr( monitors_vector_table );
@@ -105,5 +157,5 @@
   Cpu_table.predriver_hook = bsp_libc_init;  /* RTEMS resources available */
 
-  Cpu_table.postdriver_hook = NULL;
+  Cpu_table.postdriver_hook = bsp_postdriver_hook;
 
   Cpu_table.idle_task = NULL;  /* do not override system IDLE task */
@@ -148,4 +200,10 @@
 #endif
 
+  /*
+   * Tell libio how many fd's we want and allow it to tweak config
+   */
+
+  rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
   rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
   /* does not return */
Index: c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c
===================================================================
--- c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -28,7 +28,6 @@
 #include <stdlib.h>
 
-#include <rtems.h>
 #include <bsp.h>
-#include <clockdrv.h>
+#include <rtems/libio.h>
 
 #define MS_COUNT          1000            /* T2's countdown constant (1 ms) */
@@ -39,22 +38,31 @@
 rtems_isr_entry  Old_ticker;
 
-rtems_device_driver Clock_initialize( 
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void *pargp,
-  rtems_id tid,
-  rtems_unsigned32 *rval
-)
+void Clock_exit( void );
+ 
+#define CLOCK_VECTOR (VBR0 * 0x10 + 0x9)
+/*
+ * These are set by clock driver during its init
+ */
+ 
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+ 
+
+/*
+ *  ISR Handler
+ */
+
+rtems_isr Clock_isr(rtems_vector_number vector)
 {
-  Install_clock( Clock_isr );
-}
+  Clock_driver_ticks += 1;
+  lcsr->timer_cnt_2 = 0;            /* clear counter */
+  lcsr->intr_clear |= 0x02000000;
 
-void ReInstall_clock(rtems_isr_entry clock_isr)
-{
-  rtems_unsigned32 isrlevel;
-
-  rtems_interrupt_disable( isrlevel );
-  (void) set_vector( clock_isr, VBR0 * 0x10 + 0x9, 1 );
-  rtems_interrupt_enable( isrlevel );
+  if ( Clock_isrs == 1 ) {
+    rtems_clock_tick();
+    Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+  }
+  else 
+    Clock_isrs -= 1;
 }
 
@@ -67,5 +75,5 @@
   if ( BSP_Configuration.ticks_per_timeslice ) {
     Old_ticker = 
-      (rtems_isr_entry) set_vector( clock_isr, VBR0 * 0x10 + 0x9, 1 );
+      (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
     lcsr->vector_base |= MASK_INT;   /* unmask VMEchip2 interrupts */
     lcsr->to_ctl = 0xE7;             /* prescaler to 1 MHz (see Appendix A1) */
@@ -80,5 +88,13 @@
     atexit( Clock_exit );
   } 
+}
 
+void ReInstall_clock(rtems_isr_entry clock_isr)
+{
+  rtems_unsigned32 isrlevel;
+
+  rtems_interrupt_disable( isrlevel );
+  (void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+  rtems_interrupt_enable( isrlevel );
 }
 
@@ -87,2 +103,50 @@
 /* Dummy for now. See other m68k BSP's for code examples */
 }
+
+rtems_device_driver Clock_initialize(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void *pargp
+)
+{
+  Install_clock( Clock_isr );
+ 
+  /*
+   * make major/minor avail to others such as shared memory driver
+   */
+ 
+  rtems_clock_major = major;
+  rtems_clock_minor = minor;
+ 
+  return RTEMS_SUCCESSFUL;
+}
+ 
+rtems_device_driver Clock_control(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void *pargp
+)
+{
+    rtems_libio_ioctl_args_t *args = pargp;
+ 
+    if (args == 0)
+        goto done;
+ 
+    /*
+     * This is hokey, but until we get a defined interface
+     * to do this, it will just be this simple...
+     */
+ 
+    if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+    {
+        Clock_isr(CLOCK_VECTOR);
+    }
+    else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+    {
+        ReInstall_clock(args->buffer);
+    }
+ 
+done:
+    return RTEMS_SUCCESSFUL;
+}
+
Index: c/src/lib/libbsp/m68k/mvme162/console/console.c
===================================================================
--- c/src/lib/libbsp/m68k/mvme162/console/console.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/mvme162/console/console.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -22,8 +22,7 @@
 #define M162_INIT
 
-#include <rtems.h>
-#include "console.h"
-#include "bsp.h"
-#include "ringbuf.h"
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <ringbuf.h>
 
 Ring_buffer_t  Buffer[2];
@@ -55,10 +54,9 @@
   rtems_device_major_number  major,
   rtems_device_minor_number  minor,
-  void                      *arg,
-  rtems_id                   self,
-  rtems_unsigned32          *status
+  void                      *arg
 )
 {
   int     i;
+  rtems_status_code status;
   
   /*
@@ -80,5 +78,32 @@
   mcchip->SCC_int_ctl = 0x13;     /* SCC IEN, IPL3 */
 
-  *status = RTEMS_SUCCESSFUL;
+  status = rtems_io_register_name(
+    "/dev/console",
+    major,
+    (rtems_device_minor_number) 0
+  );
+ 
+  if (status != RTEMS_SUCCESSFUL)
+    rtems_fatal_error_occurred(status);
+ 
+  status = rtems_io_register_name(
+    "/dev/tty00",
+    major,
+    (rtems_device_minor_number) 0
+  );
+ 
+  if (status != RTEMS_SUCCESSFUL)
+    rtems_fatal_error_occurred(status);
+ 
+  status = rtems_io_register_name(
+    "/dev/tty01",
+    major,
+    (rtems_device_minor_number) 0
+  );
+ 
+  if (status != RTEMS_SUCCESSFUL)
+    rtems_fatal_error_occurred(status);
+ 
+  return RTEMS_SUCCESSFUL;
 }
 
@@ -101,5 +126,5 @@
  */
 
-char char_wait(int port)
+char inbyte(int port)
 {
   unsigned char tmp_char;
@@ -114,5 +139,5 @@
  */
 
-void char_put(int port, char ch)
+void outbyte(int port, char ch)
 {
   while (1) {
@@ -123,44 +148,107 @@
 
 /*
- *    Map port A (1) to stdin, stdout, and stderr.
- *    Map everything else to port B (0).
- */
-
-int __read(int fd, char *buf, int nbytes)
-{
-  int i, port;
-
-  if ( fd <= 2 ) port = 1;
-  else           port = 0;
-
-  for (i = 0; i < nbytes; i++) {
-    *(buf + i) = char_wait(port);
-    if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
-      (*(buf + i++)) = '\n';
-      (*(buf + i)) = 0;
+ *  Open entry point
+ */
+
+rtems_device_driver console_open(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
+ 
+/*
+ *  Close entry point
+ */
+
+rtems_device_driver console_close(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  rtems_libio_rw_args_t *rw_args;
+  char *buffer;
+  int maximum;
+  int count = 0;
+ 
+  rw_args = (rtems_libio_rw_args_t *) arg;
+
+  buffer = rw_args->buffer;
+  maximum = rw_args->count;
+
+  if ( minor > 1 )
+    return RTEMS_INVALID_NUMBER;
+
+  for (count = 0; count < maximum; count++) {
+    buffer[ count ] = inbyte( minor );
+    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+      buffer[ count++ ]  = '\n';
+      buffer[ count ]  = 0;
       break;
     }
   }
-  return (i);
-}
-
-/*
- *  Map port A (1) to stdin, stdout, and stderr.
- *  Map everything else to port B (0).
- */
-
-int __write(int fd, char *buf, int nbytes)
-{
-  int i, port;
- 
-  if ( fd <= 2 ) port = 1;
-  else           port = 0;
- 
-  for (i = 0; i < nbytes; i++) {
-    if (*(buf + i) == '\n') {
-      char_put (port, '\r');
+
+  rw_args->bytes_moved = count;
+  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same. 
+ */
+
+rtems_device_driver console_write(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  int count;
+  int maximum;
+  rtems_libio_rw_args_t *rw_args;
+  char *buffer;
+
+  rw_args = (rtems_libio_rw_args_t *) arg;
+
+  buffer = rw_args->buffer;
+  maximum = rw_args->count;
+
+  if ( minor > 1 )
+    return RTEMS_INVALID_NUMBER;
+
+  for (count = 0; count < maximum; count++) {
+    if ( buffer[ count ] == '\n') {
+      outbyte('\r', minor );
     }
-    char_put (port, *(buf + i));
-  }
-  return (nbytes);
-}
+    outbyte( buffer[ count ], minor  );
+  }
+  return maximum;
+}
+
+/*
+ *  IO Control entry point
+ */
+
+rtems_device_driver console_control(
+  rtems_device_major_number major,
+  rtems_device_minor_number minor,
+  void                    * arg
+)
+{
+  return RTEMS_SUCCESSFUL;
+}
Index: c/src/lib/libbsp/m68k/mvme162/include/bsp.h
===================================================================
--- c/src/lib/libbsp/m68k/mvme162/include/bsp.h	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/mvme162/include/bsp.h	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -29,4 +29,6 @@
 
 #include <rtems.h>
+#include <clockdrv.h>
+#include <console.h>
 #include <iosupp.h>
 
@@ -249,4 +251,22 @@
 #endif
 
+/*
+ *  Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+ 
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS       20
+
 /* miscellaneous stuff assumed to exist */
 
Index: c/src/lib/libbsp/m68k/mvme162/startup/bspstart.c
===================================================================
--- c/src/lib/libbsp/m68k/mvme162/startup/bspstart.c	(revision c6fb8e90960d4504018e61bbe2bf06ff7f116d72)
+++ c/src/lib/libbsp/m68k/mvme162/startup/bspstart.c	(revision 3a4ae6c210bcc37754767966f1128ae23c77b6af)
@@ -28,8 +28,15 @@
  */
 
-#include <rtems.h>
 #include <bsp.h>
+#include <rtems/libio.h>
+ 
 #include <libcsupport.h>
-#include <z8036.h>
+ 
+#include <string.h>
+#include <fcntl.h>
+ 
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
 
 /*
@@ -42,4 +49,6 @@
 
 rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
 
 /*      Initialize whatever libc we are using
@@ -59,4 +68,12 @@
 
     /*
+     *  Init the RTEMS libio facility to provide UNIX-like system
+     *  calls for use by newlib (ie: provide __open, __close, etc)
+     *  Uses malloc() to get area for the iops, so must be after malloc init
+     */
+
+    rtems_libio_init();
+
+    /*
      * Set up for the libc handling.
      */
@@ -76,5 +93,31 @@
 }
 
-int bsp_start(
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+ 
+void
+bsp_postdriver_hook(void)
+{
+  int stdin_fd, stdout_fd, stderr_fd;
+ 
+  if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD0');
+ 
+  if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD1');
+ 
+  if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
+    rtems_fatal_error_occurred('STD2');
+ 
+  if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+    rtems_fatal_error_occurred('STIO');
+}
+
+int main(
   int argc,
   char **argv,
@@ -85,4 +128,9 @@
   int             index;
 
+  if ((argc > 0) && argv && argv[0])
+    rtems_progname = argv[0];
+  else
+    rtems_progname = "RTEMS";
+
   /*
    *  162Bug Vectors are at 0xFFE00000
@@ -122,5 +170,5 @@
   Cpu_table.predriver_hook = bsp_libc_init;  /* RTEMS resources available */
 
-  Cpu_table.postdriver_hook = NULL;   /* Call our main() for constructors */
+  Cpu_table.postdriver_hook = bsp_postdriver_hook;
 
   Cpu_table.idle_task = NULL;  /* do not override system IDLE task */
@@ -162,4 +210,10 @@
 #endif
 
+  /*
+   * Tell libio how many fd's we want and allow it to tweak config
+   */
+
+  rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
   BSP_Configuration.work_space_start = (void *)
      (RAM_END - BSP_Configuration.work_space_size);
