diff -urN xpilot-4.U.3/Local.config xpilot-4.U.4a2/Local.config
--- xpilot-4.U.3/Local.config	Sun May 23 15:16:11 1999
+++ xpilot-4.U.4a2/Local.config	Sun May 23 15:18:35 1999
@@ -173,10 +173,10 @@
  */
       VERSION_MAJOR = 4
       VERSION_MINOR = U
- VERSION_PATCHLEVEL = 3
+ VERSION_PATCHLEVEL = 4
     VERSION_WINDOWS = 13
-     VERSION_STATUS =
-        RELEASEDATE = Mar 21th, 1999
+     VERSION_STATUS = alpha2
+        RELEASEDATE = May 23th, 1999
 
 
 /*
diff -urN xpilot-4.U.3/src/common/pack.h xpilot-4.U.4a2/src/common/pack.h
--- xpilot-4.U.3/src/common/pack.h	Sun Aug 30 17:40:54 1998
+++ xpilot-4.U.4a2/src/common/pack.h	Sun May 23 15:18:36 1999
@@ -90,7 +90,7 @@
  * 3.8.0.0: new items (deflector, hyperjump, phasing), keyboardsize and rounddelay.
  * 4.1.0.0: new item (mirror).
  */
-#define	MAGIC		0x4100F4ED
+#define	MAGIC		0x4101F4ED
 
 #define MAGIC2VERSION(M)	(((M) >> 16) & 0xFFFF)
 #define VERSION2MAGIC(V)	((((V) & 0xFFFF) << 16) | (MAGIC & 0xFFFF))
diff -urN xpilot-4.U.3/src/common/version.h xpilot-4.U.4a2/src/common/version.h
--- xpilot-4.U.3/src/common/version.h	Sun May 23 15:16:11 1999
+++ xpilot-4.U.4a2/src/common/version.h	Sun May 23 15:18:36 1999
@@ -28,15 +28,15 @@
 #if defined(__hpux)
 #   pragma COPYRIGHT_DATE	"1991-1998"
 #   pragma COPYRIGHT		"Bjørn Stabell, Ken Ronny Schouten, Bert Gijsbers & Dick Balaska"
-#   pragma VERSIONID		"XPilot 4.U.3"
+#   pragma VERSIONID		"XPilot 4.U.4alpha2"
 #endif
 
-#define VERSION			"4.U.3"
+#define VERSION			"4.U.4alpha2"
 #ifdef	_WINDOWS
-#define	TITLE			"4.U.3-NT13"
+#define	TITLE			"4.U.4alpha2-NT13"
 #define	VERSION_WINDOWS	"13"
 #else
-#define TITLE			"XPilot 4.U.3"
+#define TITLE			"XPilot 4.U.4alpha2"
 #endif
 #define AUTHORS			"Bjørn Stabell, Ken Ronny Schouten, Bert Gijsbers & Dick Balaska"
 #define COPYRIGHT		"Copyright © 1991-1998 by Bjørn Stabell, Ken Ronny Schouten, Bert Gijsbers & Dick Balaska"
diff -urN xpilot-4.U.3/src/replay/xp-replay.c xpilot-4.U.4a2/src/replay/xp-replay.c
--- xpilot-4.U.3/src/replay/xp-replay.c	Sat Apr 18 14:53:08 1998
+++ xpilot-4.U.4a2/src/replay/xp-replay.c	Sun May 23 15:18:36 1999
@@ -88,6 +88,7 @@
 #include "items/itemTractorBeam.xbm"
 #include "items/itemAutopilot.xbm"
 #include "items/itemEmergencyShield.xbm"
+#include "items/itemMirror.xbm"
 
 #include "tools/eject.xbm"
 #include "tools/fastf.xbm"
@@ -1386,7 +1387,8 @@
     itemEmergencyShield_bits,
     itemDeflector_bits,
     itemHyperJump_bits,
-    itemPhasingDevice_bits
+    itemPhasingDevice_bits,
+    itemMirror_bits
 };
 
 static XFontStruct *loadQueryFont(const char *fontName, GC gc)
diff -urN xpilot-4.U.3/src/server/cmdline.c xpilot-4.U.4a2/src/server/cmdline.c
--- xpilot-4.U.3/src/server/cmdline.c	Sun May 23 15:16:11 1999
+++ xpilot-4.U.4a2/src/server/cmdline.c	Sun May 23 15:18:37 1999
@@ -232,12 +232,13 @@
 
 bool		pLockServer;		/* Is server swappable out of memory?  */
 
-int             FPSMultiplier;          /* Slow everything by this factor */
-bool            useWreckage;            /* Create wreckage or not? */
-bool            ignore20MaxFPS;         /* Ignore client maxFPS request if it is 20 */
+int             FPSMultiplier;          /* slow everything by this factor */
+bool            useWreckage;            /* create wreckage or not? */
+bool            ignore20MaxFPS;         /* ignore client maxFPS request if it is 20 */
 int             timerResolution;        /* OS timer resolution (times/s) */
 char            *password;              /* password for operator status */
 int             numberOfRounds;         /* how many rounds to play */
+int             playerLimit;            /* allow less players than bases */
 
 const char default_map[] = DEFAULT_MAP;
 
@@ -2332,6 +2333,15 @@
 	valInt,
 	tuner_dummy,
 	"The number of rounds to play. If 0, unlimited.\n"
+    },
+    {
+        "playerLimit",
+	"playerLimit",
+	"0",
+	&playerLimit,
+	valInt,
+	tuner_dummy,
+	"Allow only (number of bases)-playerLimit players to enter.\n"
     }
 };
 
diff -urN xpilot-4.U.3/src/server/collision.c xpilot-4.U.4a2/src/server/collision.c
--- xpilot-4.U.3/src/server/collision.c	Sun May 23 15:16:11 1999
+++ xpilot-4.U.4a2/src/server/collision.c	Sun May 23 15:18:37 1999
@@ -1594,7 +1594,7 @@
 		obj->vel.y = (y - CLICK_TO_FLOAT(obj->pos.cy))*FPSMultiplier;
 		/* changed from = x - obj->pos.x to make lasers disappear
 		   less frequently when wrapping. There's still a small
-		   change of it happening though. Didn't bother to really
+		   chance of it happening though. Didn't bother to really
 		   fix the code to completely prevent that. */
 		Move_object(objnum);
 		if (obj->life == 0) {
diff -urN xpilot-4.U.3/src/server/contact.c xpilot-4.U.4a2/src/server/contact.c
--- xpilot-4.U.3/src/server/contact.c	Sat Aug 29 21:49:54 1998
+++ xpilot-4.U.4a2/src/server/contact.c	Sun May 23 15:18:37 1999
@@ -736,7 +736,7 @@
     /*
      * Is the game full?
      */
-    if (NumPlayers - NumPseudoPlayers + login_in_progress + NumQueuedPlayers >= World.NumBases) {
+    if (NumPlayers - NumPseudoPlayers + login_in_progress + NumQueuedPlayers >= World.NumBases - playerLimit) {
 	if (NumQueuedPlayers > 0) {
 	    return E_GAME_FULL;
 	}
@@ -745,7 +745,7 @@
 		return E_GAME_FULL;
 	    }
 	}
-	if (NumPlayers - NumPseudoPlayers + login_in_progress + NumQueuedPlayers >= World.NumBases) {
+	if (NumPlayers - NumPseudoPlayers + login_in_progress + NumQueuedPlayers >= World.NumBases - playerLimit) {
 	    return E_GAME_FULL;
 	}
     }
@@ -825,7 +825,7 @@
     long			last_ack_recv;
 };
 
-static struct queued_player	*qp_list;
+struct queued_player	*qp_list;
 
 static void Queue_remove(struct queued_player *qp, struct queued_player *prev)
 {
@@ -902,11 +902,11 @@
 	if (last_unqueued_loops + 2 + (FPS >> 2) < main_loops) {
 
 	    /* is there a homebase available? */
-	    if (NumPlayers - NumPseudoPlayers + login_in_progress < World.NumBases
+	    if (NumPlayers - NumPseudoPlayers + login_in_progress < World.NumBases - playerLimit
 		|| (Kick_robot_players(TEAM_NOT_SET)
-		    && NumPlayers - NumPseudoPlayers + login_in_progress < World.NumBases)
+		    && NumPlayers - NumPseudoPlayers + login_in_progress < World.NumBases - playerLimit)
 		|| (Kick_paused_players(TEAM_NOT_SET)
-		    && NumPlayers - NumPseudoPlayers + login_in_progress < World.NumBases)) {
+		    && NumPlayers - NumPseudoPlayers + login_in_progress < World.NumBases - playerLimit)) {
 
 		/* find a team for this fellow. */
 		if (BIT(World.rules->mode, TEAM_PLAY)) {
diff -urN xpilot-4.U.3/src/server/event.c xpilot-4.U.4a2/src/server/event.c
--- xpilot-4.U.3/src/server/event.c	Sun May 23 15:16:12 1999
+++ xpilot-4.U.4a2/src/server/event.c	Sun May 23 15:18:37 1999
@@ -193,7 +193,7 @@
 	if (i == lock
 	    || (BIT(Players[i]->status, PLAYING|PAUSE|GAME_OVER) != PLAYING)
 	    || !Player_lock_allowed(ind, i)
-	    || lockOtherTeam && TEAM(ind,i)) {
+	    || TEAM(ind,i)) {
 	    continue;
 	}
 	l = Wrap_length(Players[i]->pos.x - pl->pos.x,
@@ -297,7 +297,8 @@
 	}
 	pressed = BITV_ISSET(pl->last_keyv, key) != 0;
 	BITV_TOGGLE(pl->prev_keyv, key);
-	pl->frame_last_busy = frame_loops;
+	if (key != KEY_SHIELD)               /* Client might automatically */
+	  pl->frame_last_busy = frame_loops; /* keep shields up */
 
 	/*
 	 * Allow these functions before a round has started.
@@ -480,7 +481,7 @@
 		    if (i == j)
 			break;
 		} while (i == ind
-			 || BIT(Players[i]->status, GAME_OVER)
+			 || BIT(Players[i]->status, GAME_OVER|PAUSE)
 			 || !Player_lock_allowed(ind, i));
 		if (i == ind) {
 		    CLR_BIT(pl->lock.tagged, LOCK_PLAYER);
@@ -717,7 +718,8 @@
 			*l = pl->lock.pl_id;
 		    }
 		} else {
-		    if (Player_lock_allowed(ind, GetInd[*l])) {
+		    if ((*l!=NOT_CONNECTED)
+			    && Player_lock_allowed(ind, GetInd[*l])) {
 			pl->lock.pl_id = *l;
 			SET_BIT(pl->lock.tagged, LOCK_PLAYER);
 		    }
@@ -905,6 +907,9 @@
 		    || BIT(pl->used, OBJ_AUTOPILOT))
 		    break;
 		pl->power *= 1.10;
+#if 1
+		Set_player_message(pl,"KEY_INCREASE_POWER [*BUGHUNT NOTICE*]");
+#endif
 		pl->power = MIN(pl->power, MAX_PLAYER_POWER);
 		break;
 
@@ -913,6 +918,9 @@
 		    || BIT(pl->used, OBJ_AUTOPILOT))
 		    break;
 		pl->power *= 0.90;
+#if 1
+		Set_player_message(pl,"KEY_DECREASE_POWER [*BUGHUNT NOTICE*]");
+#endif
 		pl->power = MAX(pl->power, MIN_PLAYER_POWER);
 		break;
 
@@ -922,6 +930,9 @@
 		    break;
 		if (pl->turnacc == 0.0)
 		    pl->turnspeed *= 1.05;
+#if 1
+		Set_player_message(pl,"KEY_INCREASE_TURNSPEED [*BUGHUNT NOTICE*]");
+#endif
 		pl->turnspeed = MIN(pl->turnspeed, MAX_PLAYER_TURNSPEED);
 		break;
 
@@ -931,6 +942,9 @@
 		    break;
 		if (pl->turnacc == 0.0)
 		    pl->turnspeed *= 0.95;
+#if 1
+		Set_player_message(pl,"KEY_DECREASE_TURNSPEED [*BUGHUNT NOTICE(]");
+#endif
 		pl->turnspeed = MAX(pl->turnspeed, MIN_PLAYER_TURNSPEED);
 		break;
 
diff -urN xpilot-4.U.3/src/server/frame.c xpilot-4.U.4a2/src/server/frame.c
--- xpilot-4.U.3/src/server/frame.c	Sun May 23 15:16:12 1999
+++ xpilot-4.U.4a2/src/server/frame.c	Sun May 23 15:18:37 1999
@@ -819,7 +819,7 @@
 		&& frame_loops % 5 >= 3) {
 		continue;
 	    }
-	    Send_radar(conn, (int)x, (int)y, 3);
+	    Send_radar(conn, (int)x, (int)y, TEAM(i,ind) ? 3+0x80:3);
 	}
     }
 }
diff -urN xpilot-4.U.3/src/server/global.h xpilot-4.U.4a2/src/server/global.h
--- xpilot-4.U.3/src/server/global.h	Sun May 23 15:16:12 1999
+++ xpilot-4.U.4a2/src/server/global.h	Sun May 23 15:18:37 1999
@@ -251,6 +251,7 @@
 extern int              timerResolution;
 extern char             *password;
 extern int              numberOfRounds;
+extern int              playerLimit;
 #endif
 
 #endif /* GLOBAL_H */
diff -urN xpilot-4.U.3/src/server/netserver.c xpilot-4.U.4a2/src/server/netserver.c
--- xpilot-4.U.3/src/server/netserver.c	Sun May 23 15:16:12 1999
+++ xpilot-4.U.4a2/src/server/netserver.c	Sun May 23 15:18:37 1999
@@ -1776,7 +1776,9 @@
 {
     connection_t	*connp = &Conn[ind];
 
-    return Packet_printf(&connp->w, "%c%hd%hd%c", PKT_RADAR, x, y, size);
+    if (connp->version < 0x4101 && size >= 0x80)
+      size-=0x80;      /* friends and enemies look the same to old clients */
+      return Packet_printf(&connp->w, "%c%hd%hd%c", PKT_RADAR, x, y, size);
 }
 
 int Send_damaged(int ind, int damaged)
@@ -2008,6 +2010,9 @@
     }
     power = (DFLOAT) tmp / 256.0F;
     pl = Players[GetInd[connp->id]];
+#if 1
+    Set_player_message(pl,"RECEIVED PACKET TO SET POWER (OR SOMETHING) [*BUGHUNT NOTICE*]");
+#endif
     switch (ch) {
     case PKT_POWER:
 	pl->power = power;
@@ -2664,9 +2669,27 @@
 
 extern int roundCounter;
 
+struct queued_player {
+    struct queued_player	*next;
+    char			real_name[MAX_CHARS];
+    char			nick_name[MAX_CHARS];
+    char			disp_name[MAX_CHARS];
+    char			host_name[MAX_CHARS];
+    char			host_addr[24];
+    int				port;
+    int				team;
+    unsigned			version;
+    int				login_port;
+    long			last_ack_sent;
+    long			last_ack_recv;
+};
+
+extern struct queued_player *qp_list;
+
 enum Command {
   KICK_CMD, VERSION_CMD, HELP_CMD, RESET_CMD, TEAM_CMD,
-  PASSWORD_CMD, LOCK_CMD, SET_CMD, PAUSE_CMD, NO_CMD
+  PASSWORD_CMD, LOCK_CMD, SET_CMD, PAUSE_CMD, SHOW_CMD, 
+  ADVANCE_CMD, NO_CMD
 };
 
 typedef struct {
@@ -2692,7 +2715,7 @@
   },
   {
     "version",
-    "Prints server version.",
+    "Print server version.",
     0,
     VERSION_CMD
   },
@@ -2730,9 +2753,22 @@
   },
   {
     "kick",
-    "/kick <player name or ID number>. Removes player from game. (operator)",
+    "/kick <player name or ID number>. Remove a player from game. (operator)",
     1,
     KICK_CMD
+  },
+  {
+    "show",
+    "/show queue. Show the names of players waiting to enter.",
+    0,
+    SHOW_CMD
+  },
+  {
+    "advance",
+    "/advance <name of player in the queue>. "
+         "Move the player to the front of the queue. (operator)",
+    1,
+    ADVANCE_CMD
   }
 };
 
@@ -2759,16 +2795,72 @@
       sprintf(msg,"You need operator status to use this command.");
     }
     else
-      i=commands[i].number;
+    i=commands[i].number;
 
     switch(i) {
     case NO_CMD:
       break;
-      
+
+    case ADVANCE_CMD:
+      if (!args)
+	sprintf(msg, "You must give a player name as an argument.");
+      else {
+	struct queued_player *last=qp_list, *p;
+
+	if (!last || !(p=last->next)) {
+	  sprintf(msg, "There are less than 2 players in the queue.");
+	  break;
+	}
+	if (!strcasecmp(last->nick_name, args)) {
+	  sprintf(msg, "Already first.");
+	  break;
+	}
+	while (1)
+	  if (strcasecmp(p->nick_name, args)) {
+	    last=p;
+	    p=p->next;
+	    if (!p) {
+	      sprintf(msg, "No player named %s in the queue.",args);
+	      break;
+	    }
+	  } else {
+	    last->next=p->next;
+	    p->next=qp_list;
+	    qp_list=p;
+	    sprintf(msg, "Done.");
+	    break;
+	  }
+      }
+      break;
+	
+    case SHOW_CMD:
+      if (!args)
+	sprintf(msg,"Show what?");
+      else if (!strcasecmp(args,"queue")) {
+	int len=0, i, count;
+	struct queued_player *p=qp_list;
+
+	if (!p) {
+	  sprintf(msg, "The queue is empty.");
+	  break;
+	}
+	sprintf(msg, "Queue: ");
+	len=strlen(msg);
+	count=1;
+	do {
+	  sprintf(msg+len, "%d. %s  ", count++, p->nick_name);
+	  len+=strlen(msg+len);
+	  p=p->next;
+	} while (p && len < MSG_LEN - 25);
+	*(msg+len-2)=0;                  /* -2 to strip spaces */
+      } else
+	sprintf(msg,"Unrecognized argument to /show.");
+      break;
+
     case TEAM_CMD:
       Swap_team(plind,args);
       return;
-      
+
     case KICK_CMD:
       if ( (i=Ind_by_name(args)) >= 0) {
 	sprintf(msg,"%s kicked %s out! [*Server notice*]",
@@ -2787,15 +2879,15 @@
       else
 	sprintf(msg,"Error.");
       break;
      
     case VERSION_CMD:
-      sprintf(msg,"Xpilot 4.1.0 + patch 4.U.3");
+      sprintf(msg,"Xpilot 4.1.0 + patch 4.U.4alpha2");
       break;
-      
+
     case HELP_CMD:
       if (!args)
 	sprintf(msg,"Commands: help team version lock password pause "\
-		"reset set kick");
+		"reset set kick show advance");
       else {
 	for (i=0;i<NELEM(commands);i++)
 	  if (!strcasecmp(args,commands[i].name))
@@ -3261,7 +3353,7 @@
     }
     pl = Players[GetInd[connp->id]];
     if (BIT(pl->used, OBJ_AUTOPILOT))
-	Autopilot(ind, 0);
+	Autopilot(GetInd[connp->id], 0);
     turnspeed = movement * pl->turnspeed / MAX_PLAYER_TURNSPEED;
     if (turnspeed < 0) {
 	turndir = -1.0;
@@ -3307,7 +3399,7 @@
 	pl = Players[GetInd[connp->id]];
 	pl->player_fps = fps;
 	if (fps > FPS) pl->player_fps = FPS;
-	if (fps < (FPS / 2)) pl->player_fps = FPS / 2;
+	if (fps < (FPS / 2)) pl->player_fps = (FPS+1) / 2;
 	if (fps == 0) pl->player_fps = FPS;
 	if ((fps == 20) && ignore20MaxFPS) pl->player_fps = FPS;
 	n = FPS - pl->player_fps;
diff -urN xpilot-4.U.3/src/server/update.c xpilot-4.U.4a2/src/server/update.c
--- xpilot-4.U.3/src/server/update.c	Sun May 23 15:16:13 1999
+++ xpilot-4.U.4a2/src/server/update.c	Sun May 23 15:18:38 1999
@@ -224,6 +224,10 @@
 	sound_play_sensors(pl->pos.x, pl->pos.y, AUTOPILOT_ON_SOUND);
     } else {
 	pl->power = pl->auto_power_s;
+#if 1
+	if (pl->power < 55)
+	  Set_player_message(pl,"WARNING!!!! AUTOPILOT RESTORING LESS THAN FULL POWER!!! [* BUGHUNT NOTICE *]");
+#endif
 	pl->turnacc = pl->auto_turnacc_s;
 	pl->turnspeed = pl->auto_turnspeed_s;
 	pl->turnresistance = pl->auto_turnresistance_s;
diff -urN xpilot-4.U.3/src/server/walls.c xpilot-4.U.4a2/src/server/walls.c
--- xpilot-4.U.3/src/server/walls.c	Sun May 23 15:16:13 1999
+++ xpilot-4.U.4a2/src/server/walls.c	Sun May 23 15:18:38 1999
@@ -1000,7 +1000,7 @@
 		     * Ball has been brought back to home treasure.
 		     * The team should be punished.
 		     */
-		    sprintf(msg," < The ball was loose %d frames >",
+		    sprintf(msg," < The ball was loose for %d frames >",
 			    LONG_MAX - mi->obj->life);
 		    Set_message(msg);
 		    if (Punish_team(GetInd[mi->obj->owner],
