Index: rail_cmd.c
===================================================================
--- rail_cmd.c	(revision 612)
+++ rail_cmd.c	(working copy)
@@ -785,8 +785,8 @@
 /* build signals, p1 = track */
 int32 CmdBuildSignals(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 {
-	uint tile;
-	byte m5;
+	uint tile = TILE_FROM_XY(x,y);
+	byte m5 = _map5[tile];
 	int32 cost;
 	int track = p1 & 0x7;
 	
@@ -794,26 +794,34 @@
 	assert(p2 == 0);
 	
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
-
-	tile = TILE_FROM_XY(x,y);
 	
 	if (!EnsureNoVehicle(tile))
 		return CMD_ERROR;
 
 	_error_message = STR_1005_NO_SUITABLE_RAILROAD_TRACK;
 	
+	fprintf(stderr, "Rail type %x, m5 %x, track %x, has bit %d?\n", _map_type_and_height[tile] >> 4, m5, track, HASBIT(m5, track));
 	// must be railway, and not a depot, and it must have a track in the suggested position.
-	if (!IS_TILETYPE(tile, MP_RAILWAY) || (m5=_map5[tile], m5&0x80) || !HASBIT(m5, track))
+	if ((!IS_TILETYPE(tile, MP_RAILWAY) || (m5 & RAIL_TYPE_SPECIAL) || !HASBIT(m5, track))
+	    && (!IS_TILETYPE(tile, MP_TUNNELBRIDGE)))
 		return CMD_ERROR;
+	fprintf(stderr, "I rule!\n");
 
 	// check rail combination
-	{
+	if (IS_TILETYPE(tile, MP_RAILWAY)) {
 		byte m = m5 & RAIL_BIT_MASK;
-		if (m != RAIL_BIT_DIAG1 && m != RAIL_BIT_DIAG2 && m != RAIL_BIT_UPPER && m != RAIL_BIT_LOWER && 
-				m != RAIL_BIT_LEFT && m != RAIL_BIT_RIGHT && m != (RAIL_BIT_UPPER|RAIL_BIT_LOWER) && m != (RAIL_BIT_LEFT|RAIL_BIT_RIGHT))
+
+		fprintf(stderr, "m is %x\n", m);
+		if (m != RAIL_BIT_DIAG1 && m != RAIL_BIT_DIAG2 &&
+		    m != RAIL_BIT_UPPER && m != RAIL_BIT_LOWER &&
+		    m != RAIL_BIT_LEFT && m != RAIL_BIT_RIGHT &&
+		    m != (RAIL_BIT_UPPER | RAIL_BIT_LOWER) &&
+		    m != (RAIL_BIT_LEFT | RAIL_BIT_RIGHT))
 			return CMD_ERROR;
 	}
 
+	fprintf(stderr, "I double-rule!\n");
+
 	// check ownership
 	if (!CheckTileOwnership(tile))
 		return CMD_ERROR;
