diff -urbN qpopper4.0.5/popper/pop_config.c qpopper4.0.5-exp/popper/pop_config.c
--- qpopper4.0.5/popper/pop_config.c	Sun Feb  1 14:37:47 2004
+++ qpopper4.0.5-exp/popper/pop_config.c	Thu Jan 29 23:41:36 2004
@@ -236,6 +236,8 @@
     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)     */
 #endif /* HAPPYMAIL */
     kPOPPER_HOST,           /*    (no flag)     */
     kPOPPER_NAME,           /*    (no flag)     */
@@ -278,12 +280,14 @@
     { "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 },
 #endif /* HAPPYMAIL */
     { "hash-spool"                   , CfgInt  , CfgResUser, kHASH_SPOOL         },
     { "home-dir-mail"                , CfgStr  , CfgResUser, kHOME_DIR_MAIL      },
@@ -954,6 +958,8 @@
 	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 );
 #endif /* HAPPYMAIL */
 #ifdef LOCALNAMES
         case kPOPPER_HOST:         R__PTR ( &p->pPopper_Host );
diff -urbN qpopper4.0.5/popper/pop_dropcopy.c qpopper4.0.5-exp/popper/pop_dropcopy.c
--- qpopper4.0.5/popper/pop_dropcopy.c	Sun Feb  1 14:37:29 2004
+++ qpopper4.0.5-exp/popper/pop_dropcopy.c	Sun Feb  1 13:25:36 2004
@@ -1236,19 +1236,50 @@
 	}
 
 	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) {
+	if (my_timer - p->happymail_tab[pwp->pw_uid] < mydelay) {
+            if (mydelay <= p->happymail_sleep ) {
+                p->happymail_delay = mydelay - ( my_timer - p->happymail_tab[pwp->pw_uid] );
+                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 */
+            }
+            else
 	    return (pop_msg(p, POP_FAILURE, HERE,
-			    "[HAPPYMAIL] Please wait at least %d minutes "
-			    "between checks. "
+			    "[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,
diff -urbN qpopper4.0.5/popper/pop_init.c qpopper4.0.5-exp/popper/pop_init.c
--- qpopper4.0.5/popper/pop_init.c	Sun Feb  1 14:37:52 2004
+++ qpopper4.0.5-exp/popper/pop_init.c	Sun Feb  1 14:30:58 2004
@@ -766,6 +766,9 @@
     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 = 15;
 #endif /* HAPPYMAIL */
 
 
diff -urbN qpopper4.0.5/popper/pop_msg.c qpopper4.0.5-exp/popper/pop_msg.c
--- qpopper4.0.5/popper/pop_msg.c	Wed Jan  1 21:39:02 2003
+++ qpopper4.0.5-exp/popper/pop_msg.c	Sun Feb  1 14:33:25 2004
@@ -136,6 +136,16 @@
      */
     strcat ( message, "\r\n" );
         
+#ifdef HAPPYMAIL
+    if ( p->happymail_delay ) {
+	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 -urbN qpopper4.0.5/popper/popper.h qpopper4.0.5-exp/popper/popper.h
--- qpopper4.0.5/popper/popper.h	Sun Feb  1 14:37:47 2004
+++ qpopper4.0.5-exp/popper/popper.h	Sun Feb  1 14:42:01 2004
@@ -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-pl3"
 #endif /* HAPPYMAIL */
 
 #ifndef MAXHOSTNAMELEN
@@ -664,6 +664,9 @@
     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 */					   
 #endif /* HAPPYMAIL */
 
     BOOL                bUser_opts;             /* Process ~/.qpopper-options */
