Index: src/settings.cpp
===================================================================
--- src/settings.cpp	(revision 13667)
+++ src/settings.cpp	(working copy)
@@ -1657,6 +1657,7 @@
 	SDT_CONDBOOL(GameSettings, construction.road_stop_on_town_road,             47, SL_MAX_VERSION, 0, 0,  true,                    STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD,      NULL),
 	SDT_CONDBOOL(GameSettings, station.adjacent_stations,                       62, SL_MAX_VERSION, 0, 0,  true,                    STR_CONFIG_PATCHES_ADJACENT_STATIONS,      NULL),
 	SDT_CONDBOOL(GameSettings, economy.station_noise_level,                     96, SL_MAX_VERSION, 0, 0, false,                    STR_CONFIG_PATCHES_NOISE_LEVEL,            InvalidateTownViewWindow),
+	SDT_CONDBOOL(GameSettings, construction.one_tile_terraform,					 SL_VERSION_PATCH, SL_MAX_VERSION, 0, 0, false,					STR_CONFIG_PATCHES_ONE_TILE_TERRAFORM,	   NULL),
 
 	    SDT_BOOL(GameSettings, economy.inflation,                                                   0, 0,  true,                    STR_CONFIG_PATCHES_INFLATION,              NULL),
 	     SDT_VAR(GameSettings, construction.raw_industry_construction, SLE_UINT8,                   0,MS,     0,     0,       2, 0, STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD, InvalidateBuildIndustryWindow),
@@ -1744,6 +1745,9 @@
 	     SDT_VAR(GameSettings, game_creation.map_x,                           SLE_UINT8,                     S, 0,     8,                     6,      11, 0, STR_CONFIG_PATCHES_MAP_X,                 NULL),
 	     SDT_VAR(GameSettings, game_creation.map_y,                           SLE_UINT8,                     S, 0,     8,                     6,      11, 0, STR_CONFIG_PATCHES_MAP_Y,                 NULL),
 
+	SDT_CONDBOOL(GameSettings, construction.disable_tree_growth,						 SL_VERSION_PATCH, SL_MAX_VERSION, 0, 0, false,					STR_CONFIG_PATCHES_TREE_GROWTH,            NULL),
+
+
  SDT_CONDOMANY(GameSettings, locale.currency,                               SLE_UINT8, 97, SL_MAX_VERSION, N, 0, 0, CUSTOM_CURRENCY_ID, "GBP|USD|EUR|YEN|ATS|BEF|CHF|CZK|DEM|DKK|ESP|FIM|FRF|GRD|HUF|ISK|ITL|NLG|NOK|PLN|ROL|RUR|SIT|SEK|YTL|SKK|BRR|custom", STR_NULL, NULL, NULL),
  SDT_CONDOMANY(GameSettings, locale.units,                                  SLE_UINT8, 97, SL_MAX_VERSION, N, 0, 1, 2, "imperial|metric|si", STR_NULL, NULL, NULL),
 
@@ -1819,6 +1823,9 @@
 	  SDTC_VAR(network.last_port,            SLE_UINT16, S,  0,     0,     0,  UINT16_MAX, 0, STR_NULL,                                       NULL),
 #endif /* ENABLE_NETWORK */
 
+	// allowed terraform bitmask, serverside, nosave
+	 SDT_VAR(GameSettings, construction.allow_terraform, SLE_UINT16, S, 0, 65535,     0,    65535, 0, STR_NULL,                                       NULL),
+
 	/*
 	 * Since the network code (CmdChangePatchSetting and friends) use the index in this array to decide
 	 * which patch the server is talking about all conditional compilation of this array must be at the
Index: src/lang/english.txt
===================================================================
--- src/lang/english.txt	(revision 13667)
+++ src/lang/english.txt	(working copy)
@@ -1179,6 +1179,10 @@
 STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 grid
 STR_CONFIG_PATCHES_TOWN_LAYOUT_RANDOM                           :random
 
+STR_CONFIG_PATCHES_TREE_GROWTH                                  :{LTBLUE}Disable Tree Growth: {ORANGE}{STRING1}
+
+STR_CONFIG_PATCHES_ONE_TILE_TERRAFORM							:{LTBLUE}Enable One-tile terraform: {ORANGE}{STRING1}
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Position of main toolbar: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Left
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centre
Index: src/settings_gui.cpp
===================================================================
--- src/settings_gui.cpp	(revision 13667)
+++ src/settings_gui.cpp	(working copy)
@@ -626,6 +626,8 @@
 	"gui.drag_signals_density",
 	"game_creation.oil_refinery_limit",
 	"gui.semaphore_build_before",
+	"construction.disable_tree_growth",
+	"construction.one_tile_terraform",
 };
 
 static const char *_patches_stations[] = {
Index: src/terraform_cmd.cpp
===================================================================
--- src/terraform_cmd.cpp	(revision 13667)
+++ src/terraform_cmd.cpp	(working copy)
@@ -12,6 +12,7 @@
 #include "variables.h"
 #include "functions.h"
 #include "economy_func.h"
+#include "settings_type.h"
 
 #include "table/strings.h"
 
@@ -206,9 +207,13 @@
 			if (abs(height_diff) > 1) {
 				/* Terraform the neighboured corner. The resulting height difference should be 1. */
 				height_diff += (height_diff < 0 ? 1 : -1);
-				CommandCost cost = TerraformTileHeight(ts, tile, r + height_diff);
-				if (CmdFailed(cost)) return cost;
-				total_cost.AddCost(cost);
+				if (_settings_game.construction.one_tile_terraform) {
+					return CMD_ERROR;
+				} else {
+					CommandCost cost = TerraformTileHeight(ts, tile, r + height_diff);
+					if (CmdFailed(cost)) return cost;
+					total_cost.AddCost(cost);
+				}
 			}
 		}
 	}
@@ -301,10 +306,7 @@
 				return_cmd_error(STR_1002_EXCAVATION_WOULD_DAMAGE);
 			}
 			/* Check tiletype-specific things, and add extra-cost */
-			const bool curr_gen = _generating_world;
-			if (_game_mode == GM_EDITOR) _generating_world = true; // used to create green terraformed land
 			CommandCost cost = _tile_type_procs[GetTileType(tile)]->terraform_tile_proc(tile, flags | DC_AUTO, z_min * TILE_HEIGHT, tileh);
-			_generating_world = curr_gen;
 			if (CmdFailed(cost)) {
 				_terraform_err_tile = tile;
 				return cost;
@@ -371,6 +373,9 @@
 
 	int size_x = ex - sx + 1;
 	int size_y = ey - sy + 1;
+	
+	/* make sure that the terraform region is not larger than 2x2, if one-tile terraform enabled */
+	if ((size_x > 2 || size_y > 2) && _settings_game.construction.one_tile_terraform) { return CMD_ERROR; }
 
 	Money money = GetAvailableMoneyForCommand();
 	CommandCost cost(EXPENSES_CONSTRUCTION);
Index: src/saveload.cpp
===================================================================
--- src/saveload.cpp	(revision 13667)
+++ src/saveload.cpp	(working copy)
@@ -36,7 +36,7 @@
 
 #include "table/strings.h"
 
-extern const uint16 SAVEGAME_VERSION = 98;
+extern const uint16 SAVEGAME_VERSION = SL_VERSION_PATCH;
 
 SavegameType _savegame_type; ///< type of savegame we are loading
 
Index: src/tree_cmd.cpp
===================================================================
--- src/tree_cmd.cpp	(revision 13667)
+++ src/tree_cmd.cpp	(working copy)
@@ -650,6 +650,8 @@
 	}
 	SetTreeCounter(tile, 0);
 
+ 	if (_settings_game.construction.disable_tree_growth == false)
+ 	{
 	switch (GetTreeGrowth(tile)) {
 		case 3: /* regular sized tree */
 			if (_settings_game.game_creation.landscape == LT_TROPIC &&
@@ -714,12 +716,14 @@
 			AddTreeGrowth(tile, 1);
 			break;
 	}
-
+	}
 	MarkTileDirtyByTile(tile);
 }
 
 void OnTick_Trees()
 {
+ 	if (_settings_game.construction.disable_tree_growth == false)
+ 	{
 	uint32 r;
 	TileIndex tile;
 	TreeType tree;
@@ -741,6 +745,7 @@
 	if (CanPlantTreesOnTile(tile, false) && (tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TREE_INVALID) {
 		PlantTreesOnTile(tile, tree, 0, 0);
 	}
+	}
 }
 
 static void ClickTile_Trees(TileIndex tile)
Index: src/settings_type.h
===================================================================
--- src/settings_type.h	(revision 13667)
+++ src/settings_type.h	(working copy)
@@ -148,6 +148,9 @@
 	bool   extra_dynamite;                   ///< extra dynamite
 	bool   road_stop_on_town_road;           ///< allow building of drive-through road stops on town owned roads
 	uint8  raw_industry_construction;        ///< type of (raw) industry construction (none, "normal", prospecting)
+	bool   disable_tree_growth;				 ///< If trees are allowed to grow
+	bool   one_tile_terraform;               ///< allow only terraform of size "1 tile"
+	uint16 allow_terraform;                  ///< bitmask for companies allowed to terraform (only effective for network server)
 };
 
 /** Settings related to the AI. */
Index: src/water_cmd.cpp
===================================================================
--- src/water_cmd.cpp	(revision 13667)
+++ src/water_cmd.cpp	(working copy)
@@ -344,7 +344,7 @@
  * @param tile end tile of stretch-dragging
  * @param flags type of operation
  * @param p1 start tile of stretch-dragging
- * @param p2 specifies canal (0), water (1) or river (2); last two can only be built in scenario editor
+ * @param p2 specifies canal (0), water (1) or river (2); water can only be built in scenario editor
  */
 CommandCost CmdBuildCanal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -356,8 +356,8 @@
 
 	if (p1 >= MapSize()) return CMD_ERROR;
 
-	/* Outside of the editor you can only build canals, not oceans */
-	if (p2 != 0 && _game_mode != GM_EDITOR) return CMD_ERROR;
+	/* Outside of the editor you may not build oceans */
+	if (p2 == 1 && _game_mode != GM_EDITOR) return CMD_ERROR;
 
 	x = TileX(tile);
 	y = TileY(tile);
@@ -380,8 +380,8 @@
 			return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
 		}
 
-		/* can't make water of water! */
-		if (IsTileType(tile, MP_WATER) && (!IsTileOwner(tile, OWNER_WATER) || p2 == 1)) continue;
+		/* skip tile if it already has the right type */
+		if (IsTileType(tile, MP_WATER) && (p2 == 1 && IsSea(tile) || (p2 == 0 && IsCanal(tile)) || (p2 == 2 && IsRiver(tile)))) continue;
 
 		ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 		if (CmdFailed(ret)) return ret;
@@ -400,6 +400,7 @@
 		}
 
 		cost.AddCost(_price.clear_water);
+		if (p2 == 2) cost.AddCost(_price.clear_water * 3);
 	} END_TILE_LOOP(tile, size_x, size_y, 0);
 
 	if (cost.GetCost() == 0) {
Index: src/network/network_server.cpp
===================================================================
--- src/network/network_server.cpp	(revision 13667)
+++ src/network/network_server.cpp	(working copy)
@@ -893,6 +893,12 @@
 		return;
 	}
 
+	/* handle terraform commands */
+	if ((cp->cmd & 0xff) == CMD_TERRAFORM_LAND || (cp->cmd & 0xff) == CMD_LEVEL_LAND) {
+		if (!HasBit(_settings_game.construction.allow_terraform, cp->player)) return;
+		DEBUG(misc, 1, "Client %u (Player %u) terraformed tile %x", ci->client_index, cp->player, cp->tile);
+	}
+
 	if (!CheckCommandFlags(cp, ci)) {
 		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_KICKED);
 		free(cp);
Index: src/dock_gui.cpp
===================================================================
--- src/dock_gui.cpp	(revision 13667)
+++ src/dock_gui.cpp	(working copy)
@@ -87,7 +87,7 @@
 	DTW_CAPTION,                   ///< Window caption
 	DTW_STICKY,                    ///< Sticky window button
 	DTW_BUTTONS_BEGIN,             ///< Begin of clickable buttons (except seperating panel)
-	DTW_CANAL = DTW_BUTTONS_BEGIN, ///< Build canal button
+	DTW_CANAL = DTW_BUTTONS_BEGIN, ///< Build canal button	
 	DTW_LOCK,                      ///< Build lock button
 	DTW_SEPERATOR,                 ///< Seperating panel between lock and demolish
 	DTW_DEMOLISH,                  ///< Demolish aka dynamite button
@@ -136,7 +136,6 @@
 
 static void BuildDocksClick_River(Window *w)
 {
-	if (_game_mode != GM_EDITOR) return;
 	HandlePlacePushButton(w, DTW_RIVER, SPR_CURSOR_RIVER, VHM_RECT, PlaceDocks_BuildRiver);
 }
 
@@ -227,7 +226,6 @@
 				case DDSP_CREATE_RIVER:
 					DoCommandP(end_tile, start_tile, 2, CcBuildCanal, CMD_BUILD_CANAL | CMD_MSG(STR_CANT_PLACE_RIVERS));
 					break;
-
 				default: break;
 			}
 		}
@@ -252,8 +250,8 @@
 
 static const Widget _build_docks_toolb_widgets[] = {
 {   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},                  // DTW_CLOSEBOX
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_9801_WATERWAYS_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},        // DTW_CAPTION
-{  WWT_STICKYBOX,   RESIZE_NONE,     7,   148,   159,     0,    13, 0x0,                             STR_STICKY_BUTTON},                      // DTW_STICKY
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   168,     0,    13, STR_9801_WATERWAYS_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},        // DTW_CAPTION
+{  WWT_STICKYBOX,   RESIZE_NONE,     7,   169,   180,     0,    13, 0x0,                             STR_STICKY_BUTTON},                      // DTW_STICKY
 {     WWT_IMGBTN,   RESIZE_NONE,     7,     0,    21,    14,    35, SPR_IMG_BUILD_CANAL,             STR_BUILD_CANALS_TIP},                   // DTW_CANAL
 {     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_BUILD_LOCK,              STR_BUILD_LOCKS_TIP},                    // DTW_LOCK
 
@@ -263,13 +261,13 @@
 {     WWT_IMGBTN,   RESIZE_NONE,     7,    71,    92,    14,    35, SPR_IMG_SHIP_DEPOT,              STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING}, // DTW_DEPOT
 {     WWT_IMGBTN,   RESIZE_NONE,     7,    93,   114,    14,    35, SPR_IMG_SHIP_DOCK,               STR_981D_BUILD_SHIP_DOCK},               // DTW_STATION
 {     WWT_IMGBTN,   RESIZE_NONE,     7,   115,   136,    14,    35, SPR_IMG_BOUY,                    STR_9834_POSITION_BUOY_WHICH_CAN},       // DTW_BUOY
-{     WWT_EMPTY,    RESIZE_NONE,     0,     0,     0,     0,     0, 0x0,                             STR_NULL},                               // DTW_RIVER
-{     WWT_IMGBTN,   RESIZE_NONE,     7,   137,   159,    14,    35, SPR_IMG_AQUEDUCT,                STR_BUILD_AQUEDUCT},                     // DTW_BUILD_AQUEDUCT
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   137,   158,    14,    35, SPR_IMG_BUILD_RIVER,             STR_CREATE_RIVER},                       // DTW_RIVER
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   159,   180,    14,    35, SPR_IMG_AQUEDUCT,                STR_BUILD_AQUEDUCT},                     // DTW_BUILD_AQUEDUCT
 {   WIDGETS_END},
 };
 
 static const WindowDesc _build_docks_toolbar_desc = {
-	WDP_ALIGN_TBR, 22, 160, 36, 160, 36,
+	WDP_ALIGN_TBR, 22, 181, 36, 181, 36,
 	WC_BUILD_TOOLBAR, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 	_build_docks_toolb_widgets,
Index: src/saveload.h
===================================================================
--- src/saveload.h	(revision 13667)
+++ src/saveload.h	(working copy)
@@ -13,6 +13,9 @@
 
 #define SIZE_MAX ((size_t)-1)
 
+#define SL_VERSION_PATCH	123
+#define SL_VERSION_TRUNK     99
+
 enum SaveOrLoadResult {
 	SL_OK     = 0, ///< completed successfully
 	SL_ERROR  = 1, ///< error that was caught before internal structures were modified
