diff -ur qpopper4.0.8-happy/popper/pop_config.c qpopper4.0.8-happy-jmpl5/popper/pop_config.c
--- qpopper4.0.8-happy/popper/pop_config.c	Thu May 26 14:47:53 2005
+++ qpopper4.0.8-happy-jmpl5/popper/pop_config.c	Wed Jun  1 01:19:29 2005
@@ -272,6 +272,9 @@
     kHM_FREE,		    /* -h base+secs:bytes@FREE/max */
     kHM_MAX,		    /* -h base+secs:bytes@free/MAX */
     kHM_BUFSIZ,		    /* -z bufsiz        */
+    kHM_SLEEP,              /*    (no flag)     */
+    kHM_SLEEP_SLICE,        /*    (no flag)     */
+    kHM_NOMSGS,             /*    (no flag)     */
 #endif /* HAPPYMAIL */
 
 
@@ -308,12 +311,15 @@
     { "group-no-server-mode"         , CfgStr  , CfgResUser, kGRP_NO_SERV_MODE   },
     { "group-server-mode"            , CfgStr  , CfgResUser, kGRP_SERV_MODE      },
 #ifdef HAPPYMAIL
-    { "happymail-base"               , CfgIntTime , CfgResInit, kHM_BASE         },
-    { "happymail-rate-seconds"       , CfgIntTime , CfgResInit, kHM_RATE_S       },
-    { "happymail-rate-bytes"         , CfgIntSpace , CfgResInit, kHM_RATE_B      },
-    { "happymail-free"               , CfgIntSpace , CfgResInit, kHM_FREE        },
-    { "happymail-max"                , CfgIntTime , CfgResInit, kHM_MAX          },
-    { "happymail-bufsiz"             , CfgIntSpace , CfgResInit, kHM_BUFSIZ      },
+    { "happymail-base"               , CfgIntTime  , CfgResNone, kHM_BASE        },
+    { "happymail-rate-seconds"       , CfgIntTime  , CfgResNone, kHM_RATE_S      },
+    { "happymail-rate-bytes"         , CfgIntSpace , CfgResNone, kHM_RATE_B      },
+    { "happymail-free"               , CfgIntSpace , CfgResNone, kHM_FREE        },
+    { "happymail-max"                , CfgIntTime  , CfgResNone, kHM_MAX         },
+    { "happymail-bufsiz"             , CfgIntSpace , CfgResNone, kHM_BUFSIZ      },
+    { "happymail-sleep"              , CfgIntTime  , CfgResNone, kHM_SLEEP       },
+    { "happymail-sleep-slice"        , CfgIntTime  , CfgResNone, kHM_SLEEP_SLICE },
+    { "happymail-nomsgs"             , CfgBool , CfgResNone, kHM_NOMSGS          },
 #endif /* HAPPYMAIL */
     { "hash-spool"                   , CfgInt  , CfgResUser, kHASH_SPOOL         },
     { "home-dir-mail"                , CfgStr  , CfgResUser, kHOME_DIR_MAIL      },
@@ -993,6 +999,9 @@
 	case kHM_FREE:             R__INT ( &p->happymail_free );
 	case kHM_MAX:              R__INT ( &p->happymail_max );
 	case kHM_BUFSIZ:           R__INT ( &p->happymail_bufsiz );
+	case kHM_SLEEP:            R__INT ( &p->happymail_sleep );
+	case kHM_SLEEP_SLICE:      R__INT ( &p->happymail_sleep_slice );
+	case kHM_NOMSGS:           R__BOO ( &p->happymail_nomsgs );
 #endif /* HAPPYMAIL */
 
         default:                   R__PTR ( NULL );
diff -ur qpopper4.0.8-happy/popper/pop_dropcopy.c qpopper4.0.8-happy-jmpl5/popper/pop_dropcopy.c
--- qpopper4.0.8-happy/popper/pop_dropcopy.c	Thu May 26 14:45:31 2005
+++ qpopper4.0.8-happy-jmpl5/popper/pop_dropcopy.c	Thu Jun  9 06:54:15 2005
@@ -1237,19 +1237,85 @@
 	}
 
 	mydelay = (p->happymail_base + adjust);
-	mydelay -= mydelay % 60;	/* should be a round # of minutes */
-
 
 	/* don't allow mydelay to be larger than max */
 	if (p->happymail_max > 0 && mydelay > p->happymail_max)
 	    mydelay = p->happymail_max;
 
-	if (my_timer - p->happymail_tab[pwp->pw_uid] < mydelay - 30) {
-	    return (pop_msg(p, POP_FAILURE, HERE,
-			    "[HAPPYMAIL] Please wait at least %d minutes "
-			    "between checks. "
+	if ( my_timer - p->happymail_tab[pwp->pw_uid] < mydelay ) {
+            p->happymail_delay = mydelay - ( my_timer - p->happymail_tab[pwp->pw_uid] );
+            if ( p->happymail_delay <= p->happymail_sleep) {
+                pop_log ( p, POP_NOTICE, HERE,
+#ifdef DEBUG
+			    "%s at localhost: "
+#else
+			    "%s at %s (%s): "
+#endif /* DEBUG */			    
+			    "[HAPPYMAIL] Sleeping for %d %s "
+			    "[%d+%d:%d@%d!%d (%d) => %d + %d %s %d]",
+			    p->user ? p->user : "(null)",
+#ifndef DEBUG
+			    p->client, 
+			    p->ipaddr,
+#endif /* DEBUG */ 
+			    (p->happymail_delay % 60) ? p->happymail_delay : p->happymail_delay/60,
+			    (p->happymail_delay % 60) ? "second(s)" : "minute(s)", 
+			    p->happymail_base,
+			    p->happymail_rate_s,
+			    p->happymail_rate_b,
+			    p->happymail_free,
+			    p->happymail_max,
+			    mybuf.st_size,
+			    p->happymail_base,
+			    adjust,
+			    p->happymail_base + adjust > p->happymail_max ?
+				">" : "=>",
+			    mydelay
+			);		
+			/* sleep done in pop_msg.c */
+			    
+            }
+
+	    if ( p->happymail_nomsgs && p->happymail_delay > p->happymail_sleep ) {
+		    pop_log ( p, POP_NOTICE, HERE,
+#ifdef DEBUG
+			    "%s at localhost: "
+#else
+			    "%s at %s (%s): "
+#endif /* DEBUG */
+	                    "[HAPPYMAIL] Delay is %d %s,%s user will see zero messages "
+			    "[%d+%d:%d@%d!%d (%d) => %d + %d %s %d]",
+	                    p->user ? p->user : "(null)",
+#ifndef DEBUG
+			    p->client, 
+			    p->ipaddr,
+#endif /* DEBUG */ 
+			    (p->happymail_delay % 60) ? p->happymail_delay : p->happymail_delay/60,
+			    (p->happymail_delay % 60) ? "second(s)" : "minute(s)", 
+			    p->happymail_sleep ? " sleeping for max and" : "",
+			    p->happymail_base,
+			    p->happymail_rate_s,
+			    p->happymail_rate_b,
+			    p->happymail_free,
+			    p->happymail_max,
+			    mybuf.st_size,
+			    p->happymail_base,
+			    adjust,
+			    p->happymail_base + adjust > p->happymail_max ?
+				">" : "=>",
+			    mydelay
+			    ); 
+
+		    return ( POP_SUCCESS );
+	    }
+            else if (p->happymail_delay > p->happymail_sleep) {
+                 p->happymail_delay = p->happymail_sleep_slice ;
+                 return (pop_msg(p, POP_FAILURE, HERE,
+			    "[HAPPYMAIL] Please wait at least %d %s "
+			    "between checking your email. "
 			    "[%d+%d:%d@%d!%d (%d) => %d + %d %s %d] ",
-			    mydelay/60,
+			    (mydelay % 60) ? mydelay : mydelay/60,
+			    (mydelay % 60) ? "second(s)" : "minute(s)", 
 			    p->happymail_base,
 			    p->happymail_rate_s,
 			    p->happymail_rate_b,
@@ -1262,6 +1328,7 @@
 				">" : "=>",
 			    mydelay
 			    ));
+            }
 	}
 	p->happymail_tab[pwp->pw_uid] = my_timer;
     }
diff -ur qpopper4.0.8-happy/popper/pop_init.c qpopper4.0.8-happy-jmpl5/popper/pop_init.c
--- qpopper4.0.8-happy/popper/pop_init.c	Thu May 26 14:56:20 2005
+++ qpopper4.0.8-happy-jmpl5/popper/pop_init.c	Thu Jun  9 07:03:14 2005
@@ -790,6 +790,11 @@
     p->happymail_max = 0;		/* no maximum */
     /* bulk copy blocksize */
     p->happymail_bufsiz = 0;		/* use the default, don't setvbuf() */
+    /* sleep instead of error if mydelay < happymail_sleep */
+    p->happymail_sleep = 0;
+    p->happymail_sleep_slice = 0;
+    /* report zero messages instead of error */
+    p->happymail_nomsgs = 0;
 #endif /* HAPPYMAIL */
     /*  
      * Process command line arguments 
diff -ur qpopper4.0.8-happy/popper/pop_msg.c qpopper4.0.8-happy-jmpl5/popper/pop_msg.c
--- qpopper4.0.8-happy/popper/pop_msg.c	Mon Apr 25 23:14:39 2005
+++ qpopper4.0.8-happy-jmpl5/popper/pop_msg.c	Thu Jun  9 06:59:09 2005
@@ -136,6 +136,16 @@
      */
     strcat ( message, "\r\n" );
         
+#ifdef HAPPYMAIL
+    if ( p->happymail_delay && p->happymail_sleep ) {
+	int i = 0;
+	
+	i = ( p->happymail_delay < p->happymail_sleep_slice ? p->happymail_delay : p->happymail_sleep_slice ); 
+        sleep ( i ); 
+        p->happymail_delay -= i;
+    }
+#endif /* HAPPYMAIL */
+
     /*  
      * Send the message to the client 
      */
diff -ur qpopper4.0.8-happy/popper/pop_updt.c qpopper4.0.8-happy-jmpl5/popper/pop_updt.c
--- qpopper4.0.8-happy/popper/pop_updt.c	Thu May 26 14:45:31 2005
+++ qpopper4.0.8-happy-jmpl5/popper/pop_updt.c	Wed Jun  1 01:19:29 2005
@@ -263,6 +263,13 @@
     time_t                  my_timer    = time(0);  /*  For timing */
 
 
+    if ( !p->drop || !p->drop_name )
+#ifdef HAPPYMAIL
+	   return ( POP_SUCCESS );
+#else
+   	   return ( POP_FAILURE ); 
+#endif
+
     if ( p->bAuto_delete && p->bUpdate_on_abort == FALSE )
     {
         /* 
diff -ur qpopper4.0.8-happy/popper/popper.h qpopper4.0.8-happy-jmpl5/popper/popper.h
--- qpopper4.0.8-happy/popper/popper.h	Thu May 26 14:45:31 2005
+++ qpopper4.0.8-happy-jmpl5/popper/popper.h	Wed Jun  1 01:19:29 2005
@@ -102,7 +102,7 @@
 #define OUT_BUF_SIZE    512 /* Amount of output to buffer before forcing a write */
 
 #ifdef HAPPYMAIL
-# define HAPPYMAIL_PATCHLEVEL "pl8"
+# define HAPPYMAIL_PATCHLEVEL "pl8-jm-pl5c"
 #endif /* HAPPYMAIL */
 
 #ifndef MAXHOSTNAMELEN
@@ -682,6 +682,10 @@
     int			happymail_max;		/* upper boundary on timer */
     time_t          *   happymail_tab;          /* per-uid shmem check table */
     int                 happymail_bufsiz;	/* buffer size for maildrops */
+    int                 happymail_sleep;        /* less than this sleep instead of error */
+    int                 happymail_sleep_slice;  /* slice to sleep for */ 
+    int                 happymail_delay;        /* store the total delay neccessary */					   
+    BOOL		 happymail_nomsgs;       /* Instead of producing an error, claim 0 messages */
 #endif /* HAPPYMAIL */
 
     BOOL                bUser_opts;             /* Process ~/.qpopper-options */
