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;
@@ -854,10 +862,14 @@
 			_map3_hi[tile] = (_map3_hi[tile] & ~3) | ((_map3_hi[tile] + 1) & 3);
 		}
 		
+		fprintf(stderr, "foo\n");
 		MarkTileDirtyByTile(tile);
+		fprintf(stderr, "bar\n");
 		SetSignalsOnBothDir(tile, track);
 	}
 
+	fprintf(stderr, "Done, cost %d!\n", cost);
+
 	return cost;
 }
 
Index: tunnelbridge_cmd.c
===================================================================
--- tunnelbridge_cmd.c	(revision 612)
+++ tunnelbridge_cmd.c	(working copy)
@@ -873,7 +873,7 @@
 				DrawGroundSprite(image);
 			}
 			// get bridge sprites
-			b = _bridge_sprite_table[_map2[ti->tile]>>4][_map2[ti->tile]&0xF] + tmp * 4;
+			b = _bridge_sprite_table[_map2[ti->tile]>>4/*&0xC*/][_map2[ti->tile]&0xF] + tmp * 4;
 
 			z = GetBridgeHeight(ti->tile) + 5;
 			
@@ -882,12 +882,12 @@
 			if (!(_display_opt & DO_TRANS_BUILDINGS)) image = (image & 0x3FFF) | 0x03224000;
 			AddSortableSpriteToDraw(image, ti->x, ti->y, (ti->map5&1)?11:16, (ti->map5&1)?16:11, 1, z);
 
+			// draw roof
 			x = ti->x;
 			y = ti->y;
 			image = b[1];
 			if (!(_display_opt & DO_TRANS_BUILDINGS)) image = (image & 0x3FFF) | 0x03224000;
 
-			// draw roof
 			if (ti->map5&1) {
 				x += 12;
 				if (image&0x3FFF) AddSortableSpriteToDraw(image, x,y, 1, 16, 0x28, z);
