diff --git a/top.c b/top.c
index cfd0655d..0bea0e36 100644
--- a/top.c
+++ b/top.c
@@ -39,6 +39,7 @@
 #include <unistd.h>
 #include <values.h>
 
+#include "proc/alloc.h"
 #include "proc/devname.h"
 #include "proc/procps.h"
 #include "proc/readproc.h"
@@ -82,10 +83,6 @@ static const char *Cpu_States_fmts = STATES_line2x4;
 static pid_t Monpids [MONPIDMAX] = { 0 };
 static int   Monpidsidx = 0;
 
-        /* A postponed error message */
-static char Msg_delayed [MEDBUFSIZ];
-static int  Msg_awaiting = 0;
-
         /* Current screen dimensions.
            note: the number of processes displayed is tracked on a per window
                  basis (see the WIN_t).  Max_lines is the total number of
@@ -285,9 +282,9 @@ static inline char *scat (char *dst, const char *src) {
 } // end: scat
 
 
+#ifdef TERMIOS_ONLY
         /*
-         * Trim the rc file lines and any 'open_psdb_message' which arrives
-         * with an inappropriate newline (thanks to 'sysmap_mmap') */
+         * Trim line oriented input */
 static char *strim (char *str) {
    static const char ws[] = "\b\f\n\r\t\v\x1b\x9b";  // 0x1b + 0x9b are escape
    char *p;
@@ -295,6 +292,7 @@ static char *strim (char *str) {
    if ((p = strpbrk(str, ws))) *p = '\0';
    return str;
 } // end: strim
+#endif
 
 
         /*
@@ -489,6 +487,21 @@ static void error_exit (const char *str) {
 } // end: error_exit
 
 
+        /*
+         * Handle library memory errors ourselves rather than accept a default
+         * fprintf to stderr (since we've mucked with the termios struct) */
+static void library_err (const char *fmts, ...) NORETURN;
+static void library_err (const char *fmts, ...) {
+   static char tmp[MEDBUFSIZ];
+   va_list va;
+
+   va_start(va, fmts);
+   vsnprintf(tmp, sizeof(tmp), fmts, va);
+   va_end(va);
+   error_exit(tmp);
+} // end: library_err
+
+
         /*
          * Called in response to Frames_paused (tku: sig_paused) */
 static void pause_pgm (void) {
@@ -631,25 +644,6 @@ static void capsmk (WIN_t *q) {
 } // end: capsmk
 
 
-        /*
-         * Show an error, but not right now.
-         * Due to the postponed opening of ksym, using open_psdb_message,
-         * if P_WCH had been selected and the program is restarted, the
-         * message would otherwise be displayed prematurely. */
-static void msg_save (const char *fmts, ...) __attribute__((format(printf,1,2)));
-static void msg_save (const char *fmts, ...) {
-   char tmp[MEDBUFSIZ];
-   va_list va;
-
-   va_start(va, fmts);
-   vsnprintf(tmp, sizeof(tmp), fmts, va);
-   va_end(va);
-   // we'll add some extra attention grabbers to whatever this is
-   snprintf(Msg_delayed, sizeof(Msg_delayed), "***  %s  ***", strim(tmp));
-   Msg_awaiting = 1;
-} // end: msg_save
-
-
         /*
          * Show an error message (caller may include '\a' for sound) */
 static void show_msg (const char *str) {
@@ -662,7 +656,6 @@ static void show_msg (const char *str) {
       , Cap_clr_eol);
    fflush(stdout);
    usleep(MSG_USLEEP);
-   Msg_awaiting = 0;
 } // end: show_msg
 
 
@@ -797,33 +790,7 @@ static void show_special (int interact, const char *glob) {
    if (*glob) PUTT("%.*s", Screen_cols -1, glob);
 } // end: show_special
 
-/*######  Low Level Memory/Keyboard support  #############################*/
-
-        /*
-         * Handle our own memory stuff without the risk of leaving the
-         * user's terminal in an ugly state should things go sour. */
-
-static void *alloc_c (size_t num) MALLOC;
-static void *alloc_c (size_t num) {
-   void *pv;
-
-   if (!num) ++num;
-   if (!(pv = calloc(1, num)))
-      error_exit("failed memory allocate");
-   return pv;
-} // end: alloc_c
-
-
-static void *alloc_r (void *ptr, size_t num) MALLOC;
-static void *alloc_r (void *ptr, size_t num) {
-   void *pv;
-
-   if (!num) ++num;
-   if (!(pv = realloc(ptr, num)))
-      error_exit("failed memory re-allocate");
-   return pv;
-} // end: alloc_r
-
+/*######  Low Level Keyboard support  ####################################*/
 
         /*
          * This routine isolates ALL user INPUT and ensures that we
@@ -1352,7 +1319,7 @@ static void adj_geometry (void) {
    // we'll only grow our Pseudo_screen, never shrink it
    if (pseudo_max < Pseudo_size) {
       pseudo_max = Pseudo_size;
-      Pseudo_screen = alloc_r(Pseudo_screen, pseudo_max);
+      Pseudo_screen = xrealloc(Pseudo_screen, pseudo_max);
    }
    PSU_CLREOS(0);
    if (Frames_resize) putp(Cap_clr_scr);
@@ -1520,7 +1487,7 @@ static void calibrate_fields (void) {
    if (needpsdb) {
       if (-1 == No_ksyms) {
          No_ksyms = 0;
-         if (open_psdb_message(NULL, msg_save))
+         if (open_psdb_message(NULL, library_err))
             No_ksyms = 1;
          else
             PSDBopen = 1;
@@ -1802,7 +1769,7 @@ static CPU_t *cpus_refresh (CPU_t *cpus) {
       /* note: we allocate one more CPU_t than Cpu_tot so that the last slot
                can hold tics representing the /proc/stat cpu summary (the first
                line read) -- that slot supports our View_CPUSUM toggle */
-      cpus = alloc_c((1 + Cpu_tot) * sizeof(CPU_t));
+      cpus = xcalloc((1 + Cpu_tot) * sizeof(CPU_t));
    }
    rewind(fp);
    fflush(fp);
@@ -1953,8 +1920,8 @@ static void prochlp (proc_t *this) {
 
    if (Frame_maxtask+1 >= HHist_siz) {
       HHist_siz = HHist_siz * 5 / 4 + 100;
-      PHist_sav = alloc_r(PHist_sav, sizeof(HST_t) * HHist_siz);
-      PHist_new = alloc_r(PHist_new, sizeof(HST_t) * HHist_siz);
+      PHist_sav = xrealloc(PHist_sav, sizeof(HST_t) * HHist_siz);
+      PHist_new = xrealloc(PHist_new, sizeof(HST_t) * HHist_siz);
    }
 
    /* calculate time in this process; the sum of user time (utime) and
@@ -2068,9 +2035,10 @@ static void before (char *me) {
    struct sigaction sa;
    int i;
 
-   // setup our program name -- big!
+   // setup our program name and library error message handler -- big!
    Myname = strrchr(me, '/');
    if (Myname) ++Myname; else Myname = me;
+   xalloc_err_handler = library_err;
 
    // establish cpu particulars -- even bigger!
 #ifdef PRETEND4CPUS
@@ -3133,7 +3101,7 @@ static void forest_create (WIN_t *q) {
       qsort(Seed_ppt, Frame_maxtask, sizeof(proc_t*), Fieldstab[P_PPD].sort);
       if (hwmsav < Frame_maxtask) {         // grow, but never shrink
          hwmsav = Frame_maxtask;
-         Tree_ppt = alloc_r(Tree_ppt, sizeof(proc_t*) * hwmsav);
+         Tree_ppt = xrealloc(Tree_ppt, sizeof(proc_t*) * hwmsav);
       }
       while (0 == Seed_ppt[i]->ppid)        // identify trees (expect 2)
          forest_add(i++, 1);                // add parent plus children
@@ -3722,7 +3690,6 @@ int main (int dont_care_argc, char **argv) {
 
       frame_make();
 
-      if (Msg_awaiting) show_msg(Msg_delayed);
       if (0 < Loops) --Loops;
       if (!Loops) bye_bye(NULL);
 
diff --git a/top.h b/top.h
index a409c61a..9dd133aa 100644
--- a/top.h
+++ b/top.h
@@ -375,6 +375,7 @@ typedef struct WIN_t {
       return Frame_srtflg * ( (*Q)->n - (*P)->n ); }
 #define SCB_STRS(f,s) \
    static int SCB_NAME(f) (const proc_t **P, const proc_t **Q) { \
+      if (!(*P)->s || !(*Q)->s) return SORT_eq; \
       return Frame_srtflg * STRSORTCMP((*Q)->s, (*P)->s); }
 #define SCB_STRV(f,b,v,s) \
    static int SCB_NAME(f) (const proc_t **P, const proc_t **Q) { \
@@ -385,6 +386,7 @@ typedef struct WIN_t {
 #define SCB_STRX(f,s) \
    int strverscmp(const char *s1, const char *s2); \
    static int SCB_NAME(f) (const proc_t **P, const proc_t **Q) { \
+      if (!(*P)->s || !(*Q)->s) return SORT_eq; \
       return Frame_srtflg * strverscmp((*Q)->s, (*P)->s); }
 
 /*
@@ -618,11 +620,14 @@ typedef struct WIN_t {
 /*------  Tiny useful routine(s)  ----------------------------------------*/
 //atic const char   *fmtmk (const char *fmts, ...);
 //atic inline char  *scat (char *dst, const char *src);
+#ifdef TERMIOS_ONLY
 //atic char         *strim (char *str);
+#endif
 //atic const char   *tg2 (int x, int y);
 /*------  Exit/Interrput routines  ---------------------------------------*/
 //atic void          bye_bye (const char *str);
 //atic void          error_exit (const char *str);
+//atic void          library_err (const char *fmts, ...);
 //atic void          pause_pgm (void);
 //atic void          sig_abexit (int sig);
 //atic void          sig_endpgm (int dont_care_sig);
@@ -630,14 +635,11 @@ typedef struct WIN_t {
 //atic void          sig_resize (int dont_care_sig);
 /*------  Misc Color/Display support  ------------------------------------*/
 //atic void          capsmk (WIN_t *q);
-//atic void          msg_save (const char *fmts, ...);
 //atic void          show_msg (const char *str);
 //atic int           show_pmt (const char *str);
 //atic inline void   show_scroll (void);
 //atic void          show_special (int interact, const char *glob);
-/*------  Low Level Memory/Keyboard support  -----------------------------*/
-//atic void         *alloc_c (size_t num);
-//atic void         *alloc_r (void *ptr, size_t num);
+/*------  Low Level Keyboard support  ------------------------------------*/
 //atic int           chin (int ech, char *buf, unsigned cnt);
 //atic int           keyin (int init);
 //atic char         *linein (const char *prompt);