diff -urN backup/act.wizard.c src/act.wizard.c
--- backup/act.wizard.c	2003-01-01 22:38:25.000000000 -0800
+++ src/act.wizard.c	2003-02-24 00:25:35.000000000 -0800
@@ -2586,3 +2586,40 @@
     free_char(cbuf);
 }
 
+ACMD(do_forcetime) {
+
+   extern void heartbeat(void); /* from comm.c */
+   int m, t = 0;
+   char *ca;
+
+   /* Parse command line */
+   for (ca = strtok(argument, " "); ca; ca = strtok(NULL, " ")) {
+      m = LOWER(ca[strlen(ca) - 1]);
+      if (m == 'h')                    /* hours */
+         m = 60 * 60;
+      else if (m == 'm')               /* minutes */
+         m = 60;
+      else if (m == 's' || isdigit(m)) /* seconds */
+         m = 1;
+      else
+         m = 0;
+      if ((m *= atoi(ca)) > 0)
+         t += m;
+      else {
+         send_to_char(ch, "Invalid command line.\r\n");
+         return;
+      }
+   }
+
+   if (!t) /* 1 tick default */
+      t = (SECS_PER_MUD_HOUR);
+
+   for (m = 0; m < t * PASSES_PER_SEC; m++)
+      heartbeat();
+
+   mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "(GC) %s forced time to advance %d seconds.", GET_NAME(ch), t);
+
+   send_to_char(ch, OK);
+
+}
+
diff -urN backup/comm.c src/comm.c
--- backup/comm.c	2003-01-01 22:38:25.000000000 -0800
+++ src/comm.c	2003-02-24 00:21:09.000000000 -0800
@@ -138,7 +138,7 @@
 void record_usage(void);
 char *make_prompt(struct descriptor_data *point);
 void check_idle_passwords(void);
-void heartbeat(int pulse);
+void heartbeat(void);
 struct in_addr *get_bind_addr(void);
 int parse_ip(const char *addr, struct in_addr *inaddr);
 int set_sendbuf(socket_t s);
@@ -593,7 +593,7 @@
   struct timeval before_sleep, now, timeout;
   char comm[MAX_INPUT_LENGTH];
   struct descriptor_data *d, *next_d;
-  int pulse = 0, missed_pulses, maxdesc, aliased;
+  int missed_pulses, maxdesc, aliased;
 
   /* initialize various time values */
   null_time.tv_sec = 0;
@@ -799,7 +799,7 @@
 
     /* Now execute the heartbeat functions */
     while (missed_pulses--)
-      heartbeat(++pulse);
+      heartbeat();
 
     /* Check for any signals we may have received. */
     if (reread_wizlist) {
@@ -815,10 +815,6 @@
       num_invalid = 0;
     }
 
-    /* Roll pulse over after 10 hours */
-    if (pulse >= (10 * 60 * 60 * PASSES_PER_SEC))
-      pulse = 0;
-
 #ifdef CIRCLE_UNIX
     /* Update tics for deadlock protection (UNIX only) */
     tics++;
@@ -827,9 +823,15 @@
 }
 
 
-void heartbeat(int pulse)
+void heartbeat(void)
 {
-  static int mins_since_crashsave = 0;
+  static int mins_since_crashsave = 0, pulse = 0;
+
+  pulse++;
+
+  /* Roll pulse over after 10 hours */
+  if (pulse >= (10 * 60 * 60 * PASSES_PER_SEC))
+    pulse = 0;
 
   if (!(pulse % PULSE_ZONE))
     zone_update();
diff -urN backup/interpreter.c src/interpreter.c
--- backup/interpreter.c	2003-01-01 22:38:25.000000000 -0800
+++ src/interpreter.c	2003-02-24 00:12:06.000000000 -0800
@@ -91,6 +91,7 @@
 ACMD(do_flee);
 ACMD(do_follow);
 ACMD(do_force);
+ACMD(do_forcetime);
 ACMD(do_gecho);
 ACMD(do_gen_comm);
 ACMD(do_gen_door);
@@ -281,6 +282,7 @@
   { "examine"  , POS_SITTING , do_examine  , 0, 0 },
 
   { "force"    , POS_SLEEPING, do_force    , LVL_GOD, 0 },
+  { "forcetime", POS_DEAD    , do_forcetime, LVL_IMPL, 0 },
   { "fart"     , POS_RESTING , do_action   , 0, 0 },
   { "fill"     , POS_STANDING, do_pour     , 0, SCMD_FILL },
   { "flee"     , POS_FIGHTING, do_flee     , 1, 0 },
