diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index ed03629358..9cd40c83e0 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -1402,7 +1402,9 @@ static Vehicle *UpdateTrainPowerProc(Vehicle *v, void *data)
  * @param tile end tile of rail conversion drag
  * @param flags operation to perform
  * @param p1 start tile of drag
- * @param p2 new railtype to convert to
+ * @param p2 various bitstuffed elements:
+ * - p2 = (bit  0- 3) new railtype to convert to.
+ * - p2 = (bit  4)    build diagonally or not.
  * @param text unused
  * @return the cost of this operation or an error
  */
@@ -1418,7 +1420,8 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
 	CommandCost cost(EXPENSES_CONSTRUCTION);
 	CommandCost error = CommandCost(STR_ERROR_NO_SUITABLE_RAILROAD_TRACK); // by default, there is no track to convert.
 	TileArea ta(tile, p1);
-	TILE_AREA_LOOP(tile, ta) {
+	TileIterator *iter = HasBit(p2, 4) ? (TileIterator *)new DiagonalTileIterator(tile, p1) : new OrthogonalTileIterator(ta);
+	for (; (tile = *iter) != INVALID_TILE; ++(*iter)) {
 		TileType tt = GetTileType(tile);
 
 		/* Check if there is any track on tile */
diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp
index cffbeceffd..80c2d143b8 100644
--- a/src/rail_gui.cpp
+++ b/src/rail_gui.cpp
@@ -604,7 +604,7 @@ struct BuildRailToolbarWindow : Window {
 				break;
 
 			case RTW_CONVERT_RAIL:
-				HandlePlacePushButton(this, RTW_CONVERT_RAIL, GetRailTypeInfo(_cur_railtype)->cursor.convert, HT_RECT);
+				HandlePlacePushButton(this, RTW_CONVERT_RAIL, GetRailTypeInfo(_cur_railtype)->cursor.convert, HT_RECT | HT_DIAGONAL);
 				this->last_user_action = widget;
 				break;
 
@@ -715,7 +715,7 @@ struct BuildRailToolbarWindow : Window {
 					break;
 
 				case DDSP_CONVERT_RAIL:
-					DoCommandP(end_tile, start_tile, _cur_railtype, CMD_CONVERT_RAIL | CMD_MSG(STR_ERROR_CAN_T_CONVERT_RAIL), CcPlaySound10);
+					DoCommandP(end_tile, start_tile, _cur_railtype | (_ctrl_pressed ? 0x10 : 0), CMD_CONVERT_RAIL | CMD_MSG(STR_ERROR_CAN_T_CONVERT_RAIL), CcPlaySound10);
 					break;
 
 				case DDSP_REMOVE_STATION: