(svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644. NewGRF_ports
authorrichk
Tue, 15 Apr 2008 00:47:19 +0000
branchNewGRF_ports
changeset 10184 fcf5fb2548eb
parent 10179 eec5a7dcbf61
child 10192 195d7f6dcf71
(svn r12715) [NewGRF_ports] -Sync: with trunk r12351:12644.
Makefile.in
changelog.txt
config.lib
media/palette.act
os/debian/changelog
os/mandrake/README.urpmi
os/mandrake/openttd.spec
os/rpm/openttd.spec
os/suse/openttd.spec
projects/determineversion.vbs
projects/openttd_vs80.vcproj
projects/openttd_vs80.vcproj.in
projects/openttd_vs90.vcproj
projects/openttd_vs90.vcproj.in
source.list
src/ai/default/default.cpp
src/ai/trolly/build.cpp
src/ai/trolly/trolly.cpp
src/ai/trolly/trolly.h
src/aircraft.h
src/aircraft_cmd.cpp
src/aircraft_gui.cpp
src/airport_gui.cpp
src/articulated_vehicles.cpp
src/articulated_vehicles.h
src/autoreplace_cmd.cpp
src/autoreplace_gui.cpp
src/build_vehicle_gui.cpp
src/cargopacket.cpp
src/cargopacket.h
src/cargotype.h
src/command.cpp
src/command_type.h
src/console_cmds.cpp
src/core/alloc_func.hpp
src/core/math_func.hpp
src/core/random_func.cpp
src/core/random_func.hpp
src/currency.cpp
src/date.cpp
src/depot.cpp
src/depot.h
src/depot_gui.cpp
src/depot_type.h
src/disaster_cmd.cpp
src/dock_gui.cpp
src/driver.cpp
src/driver.h
src/economy.cpp
src/economy_func.h
src/elrail.cpp
src/engine.cpp
src/engine.h
src/engine_func.h
src/engine_gui.cpp
src/engine_type.h
src/genworld.cpp
src/genworld_gui.cpp
src/gfx.cpp
src/gfx_func.h
src/gfx_type.h
src/group.h
src/group_cmd.cpp
src/group_gui.cpp
src/group_type.h
src/gui.h
src/helpers.cpp
src/industry_cmd.cpp
src/industry_gui.cpp
src/landscape.cpp
src/lang/afrikaans.txt
src/lang/brazilian_portuguese.txt
src/lang/bulgarian.txt
src/lang/catalan.txt
src/lang/croatian.txt
src/lang/czech.txt
src/lang/danish.txt
src/lang/dutch.txt
src/lang/english.txt
src/lang/english_US.txt
src/lang/esperanto.txt
src/lang/estonian.txt
src/lang/finnish.txt
src/lang/french.txt
src/lang/galician.txt
src/lang/german.txt
src/lang/hungarian.txt
src/lang/icelandic.txt
src/lang/italian.txt
src/lang/japanese.txt
src/lang/korean.txt
src/lang/lithuanian.txt
src/lang/norwegian_bokmal.txt
src/lang/norwegian_nynorsk.txt
src/lang/piglatin.txt
src/lang/polish.txt
src/lang/portuguese.txt
src/lang/romanian.txt
src/lang/russian.txt
src/lang/simplified_chinese.txt
src/lang/slovak.txt
src/lang/slovenian.txt
src/lang/spanish.txt
src/lang/swedish.txt
src/lang/traditional_chinese.txt
src/lang/turkish.txt
src/lang/ukrainian.txt
src/lang/unfinished/frisian.txt
src/lang/unfinished/greek.txt
src/lang/unfinished/latvian.txt
src/main_gui.cpp
src/misc.cpp
src/misc_cmd.cpp
src/misc_gui.cpp
src/music.cpp
src/music.h
src/music/win32_m.cpp
src/namegen.cpp
src/namegen.h
src/namegen_func.h
src/network/core/config.h
src/network/core/udp.cpp
src/network/network_data.cpp
src/network/network_gui.cpp
src/network/network_internal.h
src/network/network_server.cpp
src/network/network_udp.cpp
src/newgrf.cpp
src/newgrf.h
src/newgrf_callbacks.h
src/newgrf_canal.cpp
src/newgrf_cargo.cpp
src/newgrf_config.h
src/newgrf_engine.cpp
src/newgrf_fsmports.cpp
src/newgrf_fsmports.h
src/newgrf_generic.cpp
src/newgrf_gui.cpp
src/newgrf_house.cpp
src/newgrf_house.h
src/newgrf_industries.cpp
src/newgrf_industrytiles.cpp
src/newgrf_sound.cpp
src/newgrf_sound.h
src/newgrf_spritegroup.cpp
src/newgrf_spritegroup.h
src/newgrf_station.cpp
src/newgrf_station.h
src/newgrf_text.cpp
src/newgrf_town.cpp
src/news.h
src/news_func.h
src/news_gui.cpp
src/news_type.h
src/npf.cpp
src/npf.h
src/oldloader.cpp
src/oldpool.h
src/oldpool_func.h
src/openttd.cpp
src/openttd.h
src/order.h
src/order_base.h
src/order_cmd.cpp
src/order_func.h
src/order_gui.cpp
src/order_type.h
src/osk_gui.cpp
src/ottdres.rc.in
src/pathfind.cpp
src/pathfind.h
src/player_base.h
src/player_gui.cpp
src/players.cpp
src/rail.cpp
src/rail.h
src/rail_cmd.cpp
src/rail_gui.cpp
src/rail_gui.h
src/rail_map.h
src/resource.h
src/rev.cpp.in
src/road.cpp
src/road_cmd.cpp
src/road_func.h
src/road_gui.cpp
src/road_internal.h
src/road_map.cpp
src/road_map.h
src/roadveh.h
src/roadveh_cmd.cpp
src/roadveh_gui.cpp
src/saveload.cpp
src/saveload.h
src/settings.cpp
src/settings_gui.cpp
src/settings_type.h
src/ship.h
src/ship_cmd.cpp
src/ship_gui.cpp
src/signal_type.h
src/signs.cpp
src/signs.h
src/signs_base.h
src/signs_func.h
src/signs_gui.cpp
src/signs_type.h
src/slope_func.h
src/slope_type.h
src/sound.cpp
src/sound/win32_s.cpp
src/spritecache.cpp
src/spriteloader/png.cpp
src/station.cpp
src/station.h
src/station_base.h
src/station_cmd.cpp
src/station_func.h
src/station_gui.cpp
src/station_gui.h
src/station_map.h
src/station_type.h
src/stdafx.h
src/strgen/strgen.cpp
src/string_func.h
src/strings.cpp
src/subsidy_gui.cpp
src/table/cargo_const.h
src/table/railtypes.h
src/table/road_land.h
src/table/sprites.h
src/table/station_land.h
src/table/track_land.h
src/terraform_cmd.cpp
src/terraform_gui.cpp
src/textbuf_gui.h
src/texteff.hpp
src/timetable_cmd.cpp
src/timetable_gui.cpp
src/toolbar_gui.cpp
src/toolbar_gui.h
src/town.h
src/town_cmd.cpp
src/town_gui.cpp
src/town_type.h
src/train.h
src/train_cmd.cpp
src/train_gui.cpp
src/transparency.h
src/transparency_gui.cpp
src/tree_cmd.cpp
src/tunnelbridge_cmd.cpp
src/unmovable_cmd.cpp
src/vehicle.cpp
src/vehicle_base.h
src/vehicle_func.h
src/vehicle_gui.cpp
src/vehicle_gui.h
src/viewport.cpp
src/viewport_type.h
src/water_cmd.cpp
src/waypoint.cpp
src/waypoint.h
src/waypoint_type.h
src/widget.cpp
src/widgets/dropdown.cpp
src/widgets/dropdown_func.h
src/widgets/dropdown_type.h
src/window.cpp
src/window_func.h
src/window_gui.h
src/window_type.h
src/yapf/yapf.h
src/yapf/yapf.hpp
src/yapf/yapf_destrail.hpp
src/yapf/yapf_road.cpp
--- a/Makefile.in	Mon Apr 14 20:32:36 2008 +0000
+++ b/Makefile.in	Tue Apr 15 00:47:19 2008 +0000
@@ -22,7 +22,6 @@
 INSTALL_BINARY_DIR = "$(INSTALL_DIR)/"!!BINARY_DIR!!
 INSTALL_ICON_DIR = "$(INSTALL_DIR)/"!!ICON_DIR!!
 INSTALL_DATA_DIR = "$(INSTALL_DIR)/"!!DATA_DIR!!
-INSTALL_PERSONAL_DIR = !!PERSONAL_DIR!!
 # TODO: ENABLE_INSTALL should be removed when the search path patch has been applied
 ENABLE_INSTALL = !!ENABLE_INSTALL!!
 TTD = !!TTD!!
@@ -273,10 +272,5 @@
 	$(Q)install -m 644 "$(BUNDLE_DIR)/data/"* "$(INSTALL_DATA_DIR)/data"
 	$(Q)install -m 644 "$(BUNDLE_DIR)/docs/"* "$(INSTALL_DATA_DIR)/docs"
 	$(Q)install -m 644 "$(BUNDLE_DIR)/media/"* "$(INSTALL_ICON_DIR)"
-ifdef INSTALL_PERSONAL_DIR
-	$(Q)mkdir -p ~/"$(INSTALL_PERSONAL_DIR)"
-	$(Q)cp -R "$(BUNDLE_DIR)/scenario" ~/"$(INSTALL_PERSONAL_DIR)"
-else
 	$(Q)cp -R "$(BUNDLE_DIR)/scenario" "$(INSTALL_DATA_DIR)"
-endif # INSTALL_PERSONAL_DIR
 endif # OSXAPP
--- a/changelog.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/changelog.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1,213 +1,206 @@
 0.6.0-beta5 (2008-03-04)
 ------------------------------------------------------------------------
--Feature: Vehicle variable FE bit 8 (r12331) [FS#1812]
--Feature: Vehicle variable FE bit 5 and 6 (r12330)
--Feature: Support loading full range of 0xD0xx NewGRF strings which includes 0xD000 to 0xD3FF (r12316)
--Feature: Ability to change aircraft speed factor, from so called 'realistic' (matching other vehicles) (1/1) to original TTD speed (1/4) (r12293, r12294)
--Fix: Don't pause/unpause the game when showing load/save windows when the game is paused due to missing GRFs (r12336) [FS#1733]
--Fix: Disallow building level crossings over one-way roads as this allowed competitors to remove the one-way state (r12329) [FS#1819]
--Fix: Wrong Y pillar specified for girder with arch bridge (r12328)
--Fix: Vehicles could be sorted in a wrong order when a vehicle name changed - cached name was not invalidated  (r12324)
--Fix: Vehicle sorting by name was broken, it was comparing two the same strings (when caching was not used) (r12323) [FS#1821]
--Fix: Endian issue when saving/loading group owner  (r12322)
--Change: Update readme about where openttd looks for files (r12321)
--Fix: Wrong transparency options could be saved after toggling all (r12320) [FS#1817]
--Fix: Map string IDs that are embedded from other strings (r12317) [FS#1815]
--Fix: Include prop 25 data for all train parts, not just those that carry cargo (r12314)
--Fix: YAPF and NTP did not apply penalty for uphill tracks on steep slopes (r12313)
--Fix: Restore timetable from backupped orders and add group ID to the backup (r12296) [FS#1549]
--Fix: Do not draw trees nor lamps between tram tracks  (r12290) [FS#1807]
--Fix: [Win32] Don't create save dir on install (r12269)
--Fix: Autoreplace did not update vehicle index for timetable window (r12261) [FS#1805]
--Fix: GetProductionAroundTiles() may fail if only the second production slot exists (r12258)
--Fix: Removing the Broken FollowTrack_t (pathfinding) fixed related functions (r12252)  [FS#1801]
--Fix: Town variables 0x9E to 0xAD (company ratings) returned wrong values (r12247)
--Fix: Proper usage of Clamp() (r12246)
--Fix: Typo resulting in no players are given the engine preview offer (r12244)
--Fix: Mac OSX bundle display name should be 'OpenTTD' (r12234) [FS#1798]
--Fix: [NewGRF] Support using any base price for rail and road vehicles' running cost, show running cost of wagons if available (r12209)
--Fix: When loading a savegame fails, don't start creating a new game, just go straight back to the intro screen (r12202)
--Fix: Force AI to build rail or road instead of bridges if possible, so it doesn't build bridges everywhere (r12200)
--Fix: "Transparent buildings" now only toggles buildings, so show tick when buildings are transparent [FS#1789] (r12198)
--Fix: Show correct last year profit when the train had negative income  [FS#1788] (r12197)
--Fix: There can be oil rigs at map borders, do not set water class for them [FS#1787] (r12195)
--Fix: Clamp various town variables to 16bit prior to returning the value (r12192)
--Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles (r12191)
--Fix: YAPF always shows 0ms PF time in debug for debug level 2 [FS#1786] (r12190)
--Fix: Assert when trying to play tile sound at NW border of map (placing buyos, leveling land) [FS#1784] (r12186)
--Fix: Wrong operator priority, hopefully harmless (r12185)
--Fix: Take into account possible loan when AI is deciding which bridge to build, so it won't build wooden bridges everytime (r12184)
+- Feature: Vehicle variable FE bit 5, 6 and 8 [FS#1812] (r12331, r12330)
+- Feature: Support loading full range of 0xD0xx NewGRF strings which includes 0xD000 to 0xD3FF (r12316)
+- Feature: Ability to change aircraft speed factor, from so called 'realistic' (matching other vehicles) (1/1) to original TTD speed (1/4) (r12293, r12294)
+- Change: Update readme about where openttd looks for files (r12321)
+- Fix: Don't pause/unpause the game when showing load/save windows when the game is paused due to missing GRFs [FS#1733] (r12336)
+- Fix: Disallow building level crossings over one-way roads as this allowed competitors to remove the one-way state [FS#1819] (r12329)
+- Fix: Wrong Y pillar specified for girder with arch bridge (r12328)
+- Fix: Vehicles could be sorted in a wrong order when a vehicle name changed - cached name was not invalidated (r12324)
+- Fix: Vehicle sorting by name was broken, it was comparing the same string (when caching was not used) [FS#1821] (r12323)
+- Fix: Endian issue when saving/loading group owner (r12322)
+- Fix: Wrong transparency options could be saved after toggling all [FS#1817] (r12320)
+- Fix: Map string IDs that are embedded from other strings [FS#1815] (r12317)
+- Fix: Include prop 25 data for all train parts, not just those that carry cargo (r12314)
+- Fix: YAPF and NTP did not apply penalty for uphill tracks on steep slopes (r12313)
+- Fix: Restore timetable from backupped orders and add group ID to the backup [FS#1549] (r12296)
+- Fix: Do not draw trees nor lamps between tram tracks  (r12290) [FS#1807]
+- Fix: [Win32] Do not create save dir on install (r12269)
+- Fix: Autoreplace did not update vehicle index for timetable window [FS#1805] (r12261)
+- Fix: GetProductionAroundTiles() may fail if only the second production slot exists (r12258)
+- Fix: Town variables 0x9E to 0xAD (company ratings) returned wrong values (r12247)
+- Fix: Typo resulting in no players are given the engine preview offer (r12244)
+- Fix: Mac OSX bundle display name should be 'OpenTTD' [FS#1798] (r12234)
+- Fix: [NewGRF] Support using any base price for rail and road vehicles' running cost, show running cost of wagons if available (r12209)
+- Fix: When loading a savegame fails, do not start creating a new game, just go straight back to the intro screen (r12202)
+- Fix: Force AI to build rail or road instead of bridges if possible, so it doesn't build bridges everywhere (r12200)
+- Fix: "Transparent buildings" now only toggles buildings, so show tick when buildings are transparent [FS#1789] (r12198)
+- Fix: Show correct last year profit when the train had negative income  [FS#1788] (r12197)
+- Fix: There can be oil rigs at map borders, do not set water class for them [FS#1787] (r12195)
+- Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles (r12191)
+- Fix: Assert when trying to play tile sound at NW border of map (placing buyos, leveling land) [FS#1784] (r12186)
+- Fix: Take into account possible loan when AI is deciding which bridge to build, so it won't build wooden bridges everytime (r12184)
+
 
 0.6.0-beta4 (2008-02-18)
 ------------------------------------------------------------------------
--Feature: Allow buttons to resize in NewGRF settings window (r12172)
--Feature: Change colour of autorail and autoroad selection when Ctrl is pressed (r12167)
--Feature: Separate catenary transparency settings from building transparency settings (r12103)
--Feature: Allow locking individual transparency settings so they will not be changed by pressing 'x' (r12102)
--Feature: Add some missing VarAction2 variables (r12124)
--Feature: Make snow appear on rail tiles dependant on track height, not on height of the lowest part of the tile (r12098)
--Feature[newGRF]: Specify the purchase, rail and road description of a bridge (r12069)
--Feature[newGRF]: Add support for var 12, Variational Action 2 (r12045)
--Feature: Allow trees on shore (r12029)
--Feature: Invisible trees are now separate from the building concept (r12022)
--Feature: Add support for passenger engine designation for AI-use, NewGRF property 0x08 for trains (r12019)
--Feature: Show all cargo sources (en-route from) in the station view cargo waiting list instead of just one (r11990)
--Feature[newGRF]: Resizable industry view window on callback 3A (r11987)
--Feature[newGRF]: Implement var 8F(random bits) during callback 28 [FS#1697] (r11985)
--Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size (r11961)
--Feature: Make use of new sprites added by Action5 type 0D (r11947)
--Feature: Allow building bridge heads on more slopes (r11937)
--Feature[newGRF]: Add support for Rivers. Rivers can currently only be placed with-in the scenario editor (r11926,r11938,r11949,r12071)
--Feature: Generate.vbs script to allow project files generation for users unable to run generate bash script (r12123)
--Feature: Sort the strings in languages dropdown (r11886)
--Codechange: Drop MSVC 2003 support (r11979)
--Fix: Test purchase list loading/loaded sprites instead of unconditionally returning a possibly non-existant sprite (r12180)
--Fix: Return correct bridge price for AI when DC_QUERY_COST is set [FS#609] (r12171)
--Fix: When drag&drop mode was cancelled by keyboard input, depot/group window wasn't updated [FS#337] (r12166)
--Fix: Buffer overflow when drawing scrolling news [FS#1652, FS#1773] (r12165)
--Fix: If a train is 'stopping' when entering a depot, do not let it leave again [FS#1705] (r12163)
--Fix: Towns shouldn't build over houses owned by another town [FS#1757] (r12162)
--Fix: Towns will no longer build houses > 1x1 there where should be road (with 2x2, 3x3 grid town layouts) (r12161)
--Fix: Remove the arbitrary limit of 64 waypoints per town [FS#1744] (r12160)
--Fix: Chance16I was now biased towards zero - round to nearest now (r12156)
--Fix: Adjust aircraft slowing algorithm (r12144)
--Fix: Callback 0x3D always gets a cargobit in var 0x18, independent of grf version [FS#1766] (r12142)
--Fix: Do not allow adding tram to rail-road crossing when there is a vehicle on it (r12138)
--Fix: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown [FS#1769] (r12137)
--Fix: With mammoth trains disabled, maximum train length was limited to 9 (r12131)
--Fix: Use tile index 0 for planes in the air, so it cannot have an invalid tile index [FS#1745] (r12109)
--Fix: X/Y axis swap for station tiles in GetNearbyTile() was wrong way around [FS#1753]( r12108)
--Fix: Loading older savegames fixes (r12096,r12097)
--Fix: When a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road [FS#1703] (r12095)
--Fix: Do not set station owner for buoys when merging company (r12093)
--Fix: Keep production level within delimited boundaries, while using var result 0D/0E and than multiplying/dividing it [FS#1755] (r12092)
--Fix: Assert when loading savegame with wrong tiletype at south map borders (r12088)
--Fix: Check overrides only for industries when mapping newgrf entities to 'real' entities [FS#1747] (r12086)
--Fix: Update waypoint signs when changing language (r12080)
--Fix: Use search paths when opening console scripts (r12079)
--Fix: When reusing a renamed deleted waypoint, keep the new name (r12076)
--Fix: Make docks at sea flood neighboured tiles (r12072)
--Fix: Possible deadlock when there are no houses available to build at given tile (r12062)
--Fix: Houses with zero probability could be built (r12062)
--Fix: Do not clear tiles when the town won't be able to build any buildings anyway (r12060)
--Fix: Allow building 2x2 building on slopes if not explicitly forbidden (r12060)
--Fix: It was possible to build 2x1 and 1x2 buildings on slopes even if it was not allowed (r12060)
--Fix: Teach NPF where road vehicles and trams can reverse (r12058)
--Fix: Ships can drive through opponents' ship depots (r12058)
--Fix: Slowdown train when approaching 90deg turn when 90deg turns are forbidden (r12057)
--Fix: Enable YAPF to start searching inside a wormhole [FS#1704] (r12056)
--Fix: Another way to fix AI trying to build road through depots (r12055)
--Fix: The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early [FS#1737] (r12052)
--Fix: Random_func broke for desync debug (r12050)
--Fix: Memset on multibyte array with wrong byte count (r12049)
--Fix: Crash when centering on a vehicle (aircraft) that is outside of the map [FS#1741] (r12044)
--Fix: Allow building transmitters and lighthouses on tree tiles [FS#1736] (r12043)
--Fix: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
-      stored for buoys, docks, locks and depots. All these are now allowed on rivers and removal of them will revert to the
-      original water type [FS#1676] (r12042)
--Fix: Change ownership of or remove statues when merging/bankrupting companies (r12038)
--Fix: For station tiles, only get road types for road stops (r12036)
--Fix: Teach YAPF where trams can reverse, and where not [FS#1702] (r12035)
--Fix: Do not show train speed as zero after loading paused game (r12033)
--Fix: When removing a statue, remove town statue flag for the statue owner, not current player (r12032)
--Fix: Prevent towns from removing or claiming ownership of player owned tiles when growing [FS#1689,FS#1719] (r12031)
--Fix: In one case trees could spread under bridges (r12024)
--Fix: Put a better suited text in the quit-dialog [FS#1690] (r12023)
--Fix: Restore initial intent on the invisible tree while transparent building patch setting [FS#1721] (r12018)
--Fix: When you have more than 9 network interfaces you'll enter the wonderfull world of overflows (r12017)
--Fix: Better work on strings in regard to gender [FS#1716] (r12015)
--Fix: Lighthouses and transmitters were never supposed to be build on a slope (r12014)
--Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases (r12013)
--Fix: Enable TownRatingTestMode during cost estimation with 'shift'-key (r12012)
--Fix: Do not consider one-corner-raised-shores to be watered tiles from all sides [FS#1701] (r12011)
--Fix: Avoid loading sample.cat if it 'looks' incorrect, and avoid later null pointer dereferences by moving volume lookup deeper [FS#1707] (r12009)
--Fix: Possible reading from an invalid pointer [FS#1717] (r12005)
--Fix: When skipping Action 11 or 12, also skip belonging sprites (r12001)
--Fix: Do entrance-slope-check for every tile of railstations (r11999)
--Fix: Possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD [FS#1692] (r11998)
--Fix: Update train statusbar when stopping from zero speed [FS#1706] (r11996)
--Fix: Resize station/roadstop/dock/airport construction windows if cargo acceptance list is too long (r11993)
--Fix: When building two rail stations close to each other (with control) so they looked like one long track trains would see them as one (r11992)
--Fix: Resize autoreplace window to fit purchase information text if it is too large (r11989)
--Fix: Build system ignored changes to table/control_codes.h which require strgen to be rebuilt (r11986)
--Fix: Also draw corner shores under rail tracks (r11984)
--Revert(r8738): Now we have shores in corners. No need to remove them from TTDP games (r11982)
--Fix: Use unicode glyph mapping to fix up missing/shuffled sprites in original data files instead of shuffling or skipping sprites directly [FS#1698] (r11981)
--Fix: Industries using results 0D/0E on callback cb29/35 were a bit too eager to close down (r11976)
--Fix: Shore and sea tiles under bridges were converted to canals in old savegames [FS#1684] (r11974)
--Fix: Use grass tiles for corner shores, if shores got replaced by ActionA [FS#1683] (r11973)
--Fix: Old AI shouldn't build fast planes with a small airport in orders(r11972)
--Fix: MP_ROAD can have railbits too - OPF searching over rail of diffen t owner behind crossing (r11967)
--Fix: OPF was searching through depots and normal road stops [FS#1403, FS#1506] (r11966)
--Fix: Tropic zone data was returned incorrectly [FS#1685] (r11964)
--Fix: NewAI couldn't build any road vehicles when there were any tram grfs loaded (r11958)
--Fix: Disallow building locks and docks on rapids [FS#1675] (r11956)
--Fix: Do not allow modifying roadbits when other roadtypes would need different foundation (r11953)
--Fix: Loading of very old savegames was broken (r11951)
--Fix: Slope detection of bridge ramps.Helps YAPF and Trolly (r11946)
--Fix: FileExists() failed for non latin paths (win32) (r11945)
--Fix: Allow building drive-through road/tram stops at road/tram track that has no owner (r11944)
--Fix: 'BRIDGE_TOO_LOW_FOR_TERRAIN'-check was wrong for steep slopes (r11936)
--Fix[autoreplace]: Single to dualhead locomotive replacefailed when player had enough money to replace and refit one but not enough to refit the last one as well [FS#1624] (r11929)
--Fix[autoreplace]: Autoreplace could refit train engines to the wrong cargo type if the old engine had no cargo capacity and the new one had (r11928)
--Fix: Loading old, pre savegame version 2, savegames (r11925)
--Fix: AI was reading wrong tile slope while building road bridge (r11917)
--Fix: set correctly crossing state after train reversal, train leaving crossing, train crash (r11900)
--Fix: Segmentation faults/wrong frees due uninitialized memory in the AI [FS#1658] (r11887)
--Fix: Assert when trying to remove rail from a house or industry tile [FS#1663,FS#1665-6-7-8,FS#1680,FS#1686-7-8 FS#1715 FS#1742 FS#1771 FS#1776](r11883)
--Fix: Crash in MP in vehicle group window if the currently selected group is deleted by another player (r11878)
--Fix: Another way to crash competitors' train in a station (r11877)
--Fix: Automatically sending aircraft to depot for autoreplace/renew is now triggered by the correct conditions (r11875)
--Fix: EngineHasReplacementForPlayer() didn't look in ALL_GROUP (r11872)
--Fix: Do not update signals after each tile when building/removing a large block of track/signals/station [FS#1074] (r11871)
--Fix: Slow down train when approaching tile we can't enter in more cases (r11870)
--Fix: Do not make crossing red when we can't enter it in any case (r11870)
+- Feature: Allow buttons to resize in NewGRF settings window (r12172)
+- Feature: Change colour of autorail and autoroad selection when Ctrl is pressed (r12167)
+- Feature: Separate catenary transparency settings from building transparency settings (r12103)
+- Feature: Allow locking individual transparency settings so they will not be changed by pressing 'x' (r12102)
+- Feature: Add some missing VarAction2 variables (r12124)
+- Feature: Make snow appear on rail tiles dependant on track height, not on height of the lowest part of the tile (r12098)
+- Feature: [NewGRF] Specify the purchase, rail and road description of a bridge (r12069)
+- Feature: [NewGRF] Add support for var 12, Variational Action 2 (r12045)
+- Feature: Allow trees on shore (r12029)
+- Feature: Invisible trees are now separate from the building concept (r12022)
+- Feature: Add support for passenger engine designation for AI-use, NewGRF property 0x08 for trains (r12019)
+- Feature: Show all cargo sources (en-route from) in the station view cargo waiting list instead of just one (r11990)
+- Feature: [NewGRF] Resizable industry view window on callback 3A (r11987)
+- Feature: [NewGRF] Implement var 8F (random bits) during callback 28 [FS#1697] (r11985)
+- Feature: [NewGRF] Add support for Action 0D, var 13: informations about current map size (r11961)
+- Feature: Support Action5 type 0D (newwater) (r11947)
+- Feature: Allow building bridge heads on more slopes (r11937)
+- Feature: [NewGRF] Add support for Rivers. Rivers can currently only be placed with-in the scenario editor (r11926,r11938,r11949,r12071)
+- Feature: Generate.vbs script to allow project files generation for users unable to run generate bash script (r12123)
+- Feature: Sort the strings in languages dropdown (r11886)
+- Codechange: Drop MSVC 2003 support (r11979)
+- Fix: Test purchase list loading/loaded sprites instead of unconditionally returning a possibly non-existant sprite (r12180)
+- Fix: Return correct bridge price for AI when DC_QUERY_COST is set [FS#609] (r12171)
+- Fix: When drag&drop mode was cancelled by keyboard input, depot/group window wasn't updated [FS#337] (r12166)
+- Fix: Buffer overflow when drawing scrolling news [FS#1652, FS#1773] (r12165)
+- Fix: If a train is 'stopping' when entering a depot, do not let it leave again [FS#1705] (r12163)
+- Fix: Towns shouldn't build over houses owned by another town [FS#1757] (r12162)
+- Fix: Towns will no longer build houses > 1x1 there where should be road (with 2x2, 3x3 grid town layouts) (r12161)
+- Fix: Remove the arbitrary limit of 64 waypoints per town [FS#1744] (r12160)
+- Fix: Chance16I was now biased towards zero - round to nearest now (r12156)
+- Fix: Adjust aircraft slowing algorithm (r12144)
+- Fix: Callback 0x3D always gets a cargobit in var 0x18, independent of grf version [FS#1766] (r12142)
+- Fix: Do not allow adding tram to rail-road crossing when there is a vehicle on it (r12138)
+- Fix: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown [FS#1769] (r12137)
+- Fix: With mammoth trains disabled, maximum train length was limited to 9 (r12131)
+- Fix: Use tile index 0 for planes in the air, so it cannot have an invalid tile index [FS#1745] (r12109)
+- Fix: X/Y axis swap for station tiles in GetNearbyTile() was wrong way around [FS#1753]( r12108)
+- Fix: Loading older savegames fixes (r12096,r12097)
+- Fix: When a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road [FS#1703] (r12095)
+- Fix: Do not set station owner for buoys when merging company (r12093)
+- Fix: Keep production level within delimited boundaries, while using var result 0D/0E and than multiplying/dividing it [FS#1755] (r12092)
+- Fix: Assert when loading savegame with wrong tiletype at south map borders (r12088)
+- Fix: Check overrides only for industries when mapping newgrf entities to 'real' entities [FS#1747] (r12086)
+- Fix: Update waypoint signs when changing language (r12080)
+- Fix: Use search paths when opening console scripts (r12079)
+- Fix: When reusing a renamed deleted waypoint, keep the new name (r12076)
+- Fix: Make docks at sea flood neighboured tiles (r12072)
+- Fix: Possible deadlock when there are no houses available to build at given tile (r12062)
+- Fix: Houses with zero probability could be built (r12062)
+- Fix: Do not clear tiles when the town won't be able to build any buildings anyway (r12060)
+- Fix: Allow building 2x2 building on slopes if not explicitly forbidden (r12060)
+- Fix: It was possible to build 2x1 and 1x2 buildings on slopes even if it was not allowed (r12060)
+- Fix: Teach NPF where road vehicles and trams can reverse (r12058)
+- Fix: Ships can drive through opponents' ship depots (r12058)
+- Fix: Slowdown train when approaching 90deg turn when 90deg turns are forbidden (r12057)
+- Fix: Enable YAPF to start searching inside a wormhole [FS#1704] (r12056)
+- Fix: Another way to fix AI trying to build road through depots (r12055)
+- Fix: The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early [FS#1737] (r12052)
+- Fix: Random_func broke for desync debug (r12050)
+- Fix: Memset on multibyte array with wrong byte count (r12049)
+- Fix: Crash when centering on a vehicle (aircraft) that is outside of the map [FS#1741] (r12044)
+- Fix: Allow building transmitters and lighthouses on tree tiles [FS#1736] (r12043)
+- Fix: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be stored for buoys, docks, locks and depots. All these are now allowed on rivers and removal of them will revert to the original water type [FS#1676] (r12042)
+- Fix: Change ownership of or remove statues when merging/bankrupting companies (r12038)
+- Fix: For station tiles, only get road types for road stops (r12036)
+- Fix: Teach YAPF where trams can reverse, and where not [FS#1702] (r12035)
+- Fix: Do not show train speed as zero after loading paused game (r12033)
+- Fix: When removing a statue, remove town statue flag for the statue owner, not current player (r12032)
+- Fix: Prevent towns from removing or claiming ownership of player owned tiles when growing [FS#1689,FS#1719] (r12031)
+- Fix: In one case trees could spread under bridges (r12024)
+- Fix: Put a better suited text in the quit-dialog [FS#1690] (r12023)
+- Fix: Restore initial intent on the invisible tree while transparent building patch setting [FS#1721] (r12018)
+- Fix: When you have more than 9 network interfaces you'll enter the wonderfull world of overflows (r12017)
+- Fix: Better work on strings in regard to gender [FS#1716] (r12015)
+- Fix: Lighthouses and transmitters were never supposed to be build on a slope (r12014)
+- Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases (r12013)
+- Fix: Enable TownRatingTestMode during cost estimation with 'shift'-key (r12012)
+- Fix: Do not consider one-corner-raised-shores to be watered tiles from all sides [FS#1701] (r12011)
+- Fix: Avoid loading sample.cat if it 'looks' incorrect, and avoid later null pointer dereferences by moving volume lookup deeper [FS#1707] (r12009)
+- Fix: Possible reading from an invalid pointer [FS#1717] (r12005)
+- Fix: When skipping Action 11 or 12, also skip belonging sprites (r12001)
+- Fix: Do entrance-slope-check for every tile of railstations (r11999)
+- Fix: Possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD [FS#1692] (r11998)
+- Fix: Update train statusbar when stopping from zero speed [FS#1706] (r11996)
+- Fix: Resize station/roadstop/dock/airport construction windows if cargo acceptance list is too long (r11993)
+- Fix: When building two rail stations close to each other (with control) so they looked like one long track trains would see them as one (r11992)
+- Fix: Resize autoreplace window to fit purchase information text if it is too large (r11989)
+- Fix: Build system ignored changes to table/control_codes.h which require strgen to be rebuilt (r11986)
+- Fix: Also draw corner shores under rail tracks (r11984)
+- Fix: Use unicode glyph mapping to fix up missing/shuffled sprites in original data files instead of shuffling or skipping sprites directly [FS#1698] (r11981)
+- Fix: Industries using results 0D/0E on callback cb29/35 were a bit too eager to close down (r11976)
+- Fix: Shore and sea tiles under bridges were converted to canals in old savegames [FS#1684] (r11974)
+- Fix: Use grass tiles for corner shores, if shores got replaced by ActionA [FS#1683] (r11973)
+- Fix: Old AI shouldn't build fast planes with a small airport in orders(r11972)
+- Fix: MP_ROAD can have railbits too - OPF searching over rail of diffen t owner behind crossing (r11967)
+- Fix: OPF was searching through depots and normal road stops [FS#1403, FS#1506] (r11966)
+- Fix: Tropic zone data was returned incorrectly [FS#1685] (r11964)
+- Fix: NewAI couldn't build any road vehicles when there were any tram grfs loaded (r11958)
+- Fix: Disallow building locks and docks on rapids [FS#1675] (r11956)
+- Fix: Do not allow modifying roadbits when other roadtypes would need different foundation (r11953)
+- Fix: Loading of very old savegames was broken (r11951)
+- Fix: Slope detection of bridge ramps. Helps YAPF and Trolly (r11946)
+- Fix: FileExists() failed for non latin paths (win32) (r11945)
+- Fix: Allow building drive-through road/tram stops at road/tram track that has no owner (r11944)
+- Fix: 'BRIDGE_TOO_LOW_FOR_TERRAIN'-check was wrong for steep slopes (r11936)
+- Fix: [Autoreplace] Single to dualhead locomotive replacefailed when player had enough money to replace and refit one but not enough to refit the last one as well [FS#1624] (r11929)
+- Fix: [Autoreplace] Autoreplace could refit train engines to the wrong cargo type if the old engine had no cargo capacity and the new one had (r11928)
+- Fix: Loading old, pre savegame version 2, savegames (r11925)
+- Fix: AI was reading wrong tile slope while building road bridge (r11917)
+- Fix: set correctly crossing state after train reversal, train leaving crossing, train crash (r11900)
+- Fix: Segmentation faults/wrong frees due uninitialized memory in the AI [FS#1658] (r11887)
+- Fix: Assert when trying to remove rail from a house or industry tile [FS#1663,FS#1665-6-7-8,FS#1680,FS#1686-7-8 FS#1715 FS#1742 FS#1771 FS#1776](r11883)
+- Fix: Crash in MP in vehicle group window if the currently selected group is deleted by another player (r11878)
+- Fix: Another way to crash competitors' train in a station (r11877)
+- Fix: Automatically sending aircraft to depot for autoreplace/renew is now triggered by the correct conditions (r11875)
+- Fix: EngineHasReplacementForPlayer() didn't look in ALL_GROUP (r11872)
+- Fix: Do not update signals after each tile when building/removing a large block of track/signals/station [FS#1074] (r11871)
+- Fix: Slow down train when approaching tile we can't enter in more cases (r11870)
+- Fix: Do not make crossing red when we can't enter it in any case (r11870)
+
 
 0.6.0-beta3 (2008-01-16)
 ------------------------------------------------------------------------
--Feature: Replaced fixed size custom name array. Names are now attached to their object directly and there is no limit to the amount of names (r11822)
--Feature: Add drag-n-drop support to the raise/lower land tools. Land is raised/lowered at the start and the rest of the area levelled to match (r11759)
--Feature: Add support for NewGRF's train 'tilt' flag. Trains with tilt capability (specific details are per NewGRF set) will be given a 20% speed limit bonus on curves (r11741)
--Feature: Added sorting for cost, running costs and speed to road vehicles and ships build windows (r11710)
--Feature: List neutral stations where the player has service in the station list too (r11670)
--Feature: Check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen (r11646)
--Feature: Support shore replacement via Action 5 (r11726)
--Fix: When two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF [FS#1559] (r11862)
--Fix: Recompute town population when removing a 'newhouses' grf, or when loading a game with missing 'newhouses' grfs [FS#1335] (r11855)
--Fix: Road vehicle count was incorrect in network lobby window (r11844)
--Fix: Mark dirty canal tile even in diagonal direction from flooded tile, draw correctly canal next to half flooded rail tile (r11843, r11838)
--Fix: At least one instance of dmusic driver is needed for it to be registered and usable (r11826)
--Fix: An articulated road vehicle could split up when it turned around at a corner and then would enter a drive through station at the next tile [FS#1627] (r11825)
--Fix: Switch _screen to the output buffer and disable usage of 32bpp-anim animation buffer during giant screenshots [FS#1602] (r11813)
--Fix: Do not crash trains when leaving depot to a very long track [FS#716] (r11802)
--Fix: Take town rating into account when testing if a command can be executed [FS#1616] (r11795)
--Fix: Reversing a train when loading at a station with an adjacent station in the same axis crashed [FS#1632] (r11794)
--Fix: Group names got not deallocated in the command test run [FS#1614] (r11743)
--Fix: Run window tick events when paused, so that news pop-ups and the about window still progress. For other windows the events are ignored when paused [FS#1319] (r11742)
--Fix: Modify and possibly discard key events for code points in the unicode private use area [FS#1610] (r11740)
--Fix: Set the new scroll position after zooming in instead of before, as the zoom will cancel it out [FS#1609] (r11739)
--Fix: Do not reset loading indicator IDs when only reloading NewGRFs [FS#1574] (r11735)
--Fix: Elrail merge gave elrail, monorail & maglev unintended speed bonuses for curves, as the bonus was based on the railtype index. The bonus is now specified by a property of the railtype (r11732)
--Fix: Clear sprite override data before performing NewGRF wagon attach callback. This stopped the callback working for autoreplace and when moving wagons from train to train in a depot [FS#1582] (r11731)
--Fix: If there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available [FS#1577] (r11727)
--Fix: Make it impossible (for users) to circumvent the length checking of the NewGRF 'allow wagon attach' callback by moving several wagons at a time (r11724)
--Fix: Do not put more than one Random() in function calls because parameter evaluation order is not guaranteed in the c++ standard [FS#1561] (r11716)
--Fix: Do not allow player inauguration date on scenarios to be bigger than current year [FS#1569] (r11714)
--Fix: Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids (r11712)
--Fix: Do not allow refitting flooded (destroyed) vehicles (r11707)
--Fix: Trains could have sprites with wrong direction when reversing, also was inconsistent with save/load process [FS#1557] (r11705)
--Fix: When removing buoys, return to water or canal depending on their owner (r11666)
--Fix: Animation informations should not be copied from original industry tile spec, while doing an action 00, industry tile, prop 08 (r11665)
--Fix: Do not allow modifying non-uniform stations when non-uniform stations are disabled [FS#1563] (r11659)
--Fix: 'Initialised' NewGRFs could still be deactivated in the later 'activation' pass (r11650)
--Fix: Vehicles were still followed when sold [FS#1541] (r11632)
--Fix: Many viewports could crash the scenario editor [FS#1527] (r11629)
--Fix: Popping from text reference stack must be done in a precise order. But some compiler (MSVC) over optimised it and inverted this order [FS#1532] (r11627)
--Fix: There were still some cases where one could not build a tram track, but the tram could become blocked [FS#1525] (r11621)
--Fix: Do not make crossing red behind depot the train is entering [FS#1531] (r11619)
--Fix: Buoys are just waypoints, so don't allow load/unload/transfert for them (r11618)
--Fix: Sometimes large values could go off the chart [FS#1526] (r11616)
--Fix: Temperate banks can only be built in towns (over a house) (r11615)
+- Feature: Replaced fixed size custom name array. Names are now attached to their object directly and there is no limit to the amount of names (r11822)
+- Feature: Add drag-n-drop support to the raise/lower land tools. Land is raised/lowered at the start and the rest of the area levelled to match (r11759)
+- Feature: Add support for NewGRF's train 'tilt' flag. Trains with tilt capability (specific details are per NewGRF set) will be given a 20% speed limit bonus on curves (r11741)
+- Feature: Added sorting for cost, running costs and speed to road vehicles and ships build windows (r11710)
+- Feature: List neutral stations where the player has service in the station list too (r11670)
+- Feature: Check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen (r11646)
+- Feature: Support shore replacement via Action 5 (r11726)
+- Fix: When two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF [FS#1559] (r11862)
+- Fix: Recompute town population when removing a 'newhouses' grf, or when loading a game with missing 'newhouses' grfs [FS#1335] (r11855)
+- Fix: Road vehicle count was incorrect in network lobby window (r11844)
+- Fix: Mark dirty canal tile even in diagonal direction from flooded tile, draw correctly canal next to half flooded rail tile (r11843, r11838)
+- Fix: At least one instance of dmusic driver is needed for it to be registered and usable (r11826)
+- Fix: An articulated road vehicle could split up when it turned around at a corner and then would enter a drive through station at the next tile [FS#1627] (r11825)
+- Fix: Switch _screen to the output buffer and disable usage of 32bpp-anim animation buffer during giant screenshots [FS#1602] (r11813)
+- Fix: Do not crash trains when leaving depot to a very long track [FS#716] (r11802)
+- Fix: Take town rating into account when testing if a command can be executed [FS#1616] (r11795)
+- Fix: Reversing a train when loading at a station with an adjacent station in the same axis crashed [FS#1632] (r11794)
+- Fix: Group names got not deallocated in the command test run [FS#1614] (r11743)
+- Fix: Run window tick events when paused, so that news pop-ups and the about window still progress. For other windows the events are ignored when paused [FS#1319] (r11742)
+- Fix: Modify and possibly discard key events for code points in the unicode private use area [FS#1610] (r11740)
+- Fix: Set the new scroll position after zooming in instead of before, as the zoom will cancel it out [FS#1609] (r11739)
+- Fix: Do not reset loading indicator IDs when only reloading NewGRFs [FS#1574] (r11735)
+- Fix: Elrail merge gave elrail, monorail & maglev unintended speed bonuses for curves, as the bonus was based on the railtype index. The bonus is now specified by a property of the railtype (r11732)
+- Fix: Clear sprite override data before performing NewGRF wagon attach callback. This stopped the callback working for autoreplace and when moving wagons from train to train in a depot [FS#1582] ( r11731)
+- Fix: If there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available [FS#1577] (r11727)
+- Fix: Make it impossible (for users) to circumvent the length checking of the NewGRF 'allow wagon attach' callback by moving several wagons at a time (r11724)
+- Fix: Do not put more than one Random() in function calls because parameter evaluation order is not guaranteed in the C++ standard [FS#1561] (r11716)
+- Fix: Do not allow player inauguration date on scenarios to be bigger than current year [FS#1569] (r11714)
+- Fix: Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids (r11712)
+- Fix: Do not allow refitting flooded (destroyed) vehicles (r11707)
+- Fix: Trains could have sprites with wrong direction when reversing, also was inconsistent with save/load process [FS#1557] (r11705)
+- Fix: When removing buoys, return to water or canal depending on their owner (r11666)
+- Fix: Animation informations should not be copied from original industry tile spec, while doing an action 00, industry tile, prop 08 (r11665)
+- Fix: Do not allow modifying non-uniform stations when non-uniform stations are disabled [FS#1563] (r11659)
+- Fix: 'Initialised' NewGRFs could still be deactivated in the later 'activation' pass (r11650)
+- Fix: Vehicles were still followed when sold [FS#1541] (r11632)
+- Fix: Many viewports could crash the scenario editor [FS#1527] (r11629)
+- Fix: Popping from text reference stack must be done in a precise order. But some compiler (MSVC) over optimised it and inverted this order [FS#1532] (r11627)
+- Fix: There were still some cases where one could not build a tram track, but the tram could become blocked [FS#1525] (r11621)
+- Fix: Do not make crossing red behind depot the train is entering [FS#1531] (r11619)
+- Fix: Buoys are just waypoints, so don't allow load/unload/transfert for them (r11618)
+- Fix: Sometimes large values could go off the chart [FS#1526] (r11616)
+- Fix: Temperate banks can only be built in towns (over a house) (r11615)
 
 
 0.6.0-beta2 (2007-12-09)
--- a/config.lib	Mon Apr 14 20:32:36 2008 +0000
+++ b/config.lib	Tue Apr 15 00:47:19 2008 +0000
@@ -41,7 +41,7 @@
 	enable_translator="0"
 	enable_unicode="1"
 	enable_assert="1"
-	enable_strip="1"
+	enable_strip="0"
 	enable_universal="1"
 	enable_osx_g5="0"
 	enable_cocoa_quartz="1"
@@ -970,12 +970,6 @@
 		if [ $cc_version -ge 42 ]; then
 			CFLAGS="$CFLAGS -fno-strict-overflow"
 		fi
-
-		# GCC 4.3+ gives a warning about empty body of
-		# loops and conditions
-		if [ $cc_version -ge 43 ]; then
-			CFLAGS="$CFLAGS -Wno-empty-body"
-		fi
 	fi
 
 	if [ "$os" != "CYGWIN" ] && [ "$os" != "FREEBSD" ] && [ "$os" != "OPENBSD" ] && [ "$os" != "MINGW" ] && [ "$os" != "MORPHOS" ] && [ "$os" != "OSX" ] && [ "$os" != "WINCE" ] && [ "$os" != "PSP" ] && [ "$os" != "OS2" ]; then
@@ -2341,7 +2335,7 @@
 	echo "                                 version (Win32 ONLY)"
 	echo "  --disable-network              disable network support"
 	echo "  --disable-assert               disable asserts (continue on errors)"
-	echo "  --disable-strip                disable any possible stripping"
+	echo "  --enable-strip                 enable any possible stripping"
 	echo "  --without-osx-sysroot          disable the automatic adding of sysroot "
 	echo "                                 (OSX ONLY)"
 	echo "  --without-application-bundle   disable generation of application bundle"
Binary file media/palette.act has changed
--- a/os/debian/changelog	Mon Apr 14 20:32:36 2008 +0000
+++ b/os/debian/changelog	Tue Apr 15 00:47:19 2008 +0000
@@ -1,3 +1,9 @@
+openttd (0.7~svn) unstable; urgency=low
+
+  * Unreleased SVN version. Versioned to allow normal upgrades to released versions.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Sat, 22 Mar 2007 21:07:05 +0100
+
 openttd (0.6.0~beta5) unstable; urgency=low
 
   * New upstream release.
--- a/os/mandrake/README.urpmi	Mon Apr 14 20:32:36 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-You require the data files of the original Transport Tycoon Deluxe
-for Windows to play the game. You have to manually copy the following
-files to %{_gamesdatadir}/openttd/data/
-sample.cat
-trg1r.grf
-trgcr.grf
-trghr.grf
-trgir.grf
-trgtr.grf
--- a/os/mandrake/openttd.spec	Mon Apr 14 20:32:36 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-#------------------------------------------------------------------------------
-#   openttd.spec
-#       This SPEC file controls the building of custom OpenTTD RPM
-#       packages.
-#------------------------------------------------------------------------------
-
-%define name openttd
-%define version 0.5.0
-%define release 1mdk
-
-#------------------------------------------------------------------------------
-#   Prologue information
-#------------------------------------------------------------------------------
-Name: %{name}
-Version: %{version}
-Release: %{release}
-Summary: An open source clone of the Microprose game "Transport Tycoon Deluxe"
-Group: Games/Strategy
-License: GPL
-
-URL: http://www.openttd.org
-
-Source: %{name}-%{version}.tar.gz
-Packager: Dominik Scherer <dominik@openttd.com>
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
-BuildRequires: libSDL1.2-devel >= 1.2.7
-BuildRequires: libpng3-devel >= 1.2.5
-BuildRequires: zlib1-devel >= 1.2.1
-
-#------------------------------------------------------------------------------
-#   Description
-#------------------------------------------------------------------------------
-%description
-An enhanced open source clone of the Microprose game "Transport Tycoon Deluxe".
-You require the data files of the original Transport Tycoon Deluxe
-for Windows to play the game. You have to MANUALLY copy them to the
-game data directory!
-
-#------------------------------------------------------------------------------
-#   install scripts
-#------------------------------------------------------------------------------
-%prep
-rm -rf $RPM_BUILD_ROOT
-%setup
-
-%build
-make BINARY_DIR=%{_gamesbindir} PREFIX=%{_gamesdatadir} DATA_DIR=openttd INSTALL_DIR=%{_gamesdatadir}/openttd/ USE_HOMEDIR=1 PERSONAL_DIR=.openttd INSTALL=1 RELEASE=%{version}
-
-%install
-mkdir -p $RPM_BUILD_ROOT%{_gamesbindir}
-mkdir -p $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/lang
-mkdir -p $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/data
-mkdir -p $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/scenario
-
-cp ./openttd $RPM_BUILD_ROOT%{_gamesbindir}/
-cp -r ./lang/*.lng $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/lang/
-cp -r ./data/*.grf $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/data/
-cp -r ./scenario/*.scn $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/scenario/
-cp -r ./data/opntitle.dat $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/data/
-
-# icon
-install -m644 media/openttd.32.png -D $RPM_BUILD_ROOT%{_miconsdir}/%{name}.png
-install -m644 media/openttd.64.png -D $RPM_BUILD_ROOT%{_iconsdir}/%{name}.png
-install -m644 media/openttd.128.png -D $RPM_BUILD_ROOT%{_liconsdir}/%{name}.png
-
-# menu entry
-mkdir -p $RPM_BUILD_ROOT/%{_menudir}
-cat << EOF > $RPM_BUILD_ROOT/%{_menudir}/%{name}
-?package(%{name}):command="%{_gamesbindir}/openttd" icon="%{name}.png" \
-  needs="X11" section="Amusement/Strategy" title="OpenTTD" \
-  longtitle="%{Summary}"
-EOF
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%post
-%{update_menus}
-
-%postun
-%{clean_menus}
-
-#------------------------------------------------------------------------------
-#   Files listing.
-#------------------------------------------------------------------------------
-%files
-%defattr(-,root,root,0755)
-%{_gamesbindir}/openttd
-
-%{_gamesdatadir}/openttd/lang/american.lng
-%{_gamesdatadir}/openttd/lang/catalan.lng
-%{_gamesdatadir}/openttd/lang/czech.lng
-%{_gamesdatadir}/openttd/lang/danish.lng
-%{_gamesdatadir}/openttd/lang/dutch.lng
-%{_gamesdatadir}/openttd/lang/english.lng
-%{_gamesdatadir}/openttd/lang/finnish.lng
-%{_gamesdatadir}/openttd/lang/french.lng
-%{_gamesdatadir}/openttd/lang/galician.lng
-%{_gamesdatadir}/openttd/lang/german.lng
-%{_gamesdatadir}/openttd/lang/hungarian.lng
-%{_gamesdatadir}/openttd/lang/icelandic.lng
-%{_gamesdatadir}/openttd/lang/italian.lng
-%{_gamesdatadir}/openttd/lang/norwegian.lng
-%{_gamesdatadir}/openttd/lang/origveh.lng
-%{_gamesdatadir}/openttd/lang/polish.lng
-%{_gamesdatadir}/openttd/lang/portuguese.lng
-%{_gamesdatadir}/openttd/lang/romanian.lng
-%{_gamesdatadir}/openttd/lang/slovak.lng
-%{_gamesdatadir}/openttd/lang/spanish.lng
-%{_gamesdatadir}/openttd/lang/swedish.lng
-
-%{_gamesdatadir}/openttd/data/autorail.grf
-%{_gamesdatadir}/openttd/data/canalsw.grf
-%{_gamesdatadir}/openttd/data/openttd.grf
-%{_gamesdatadir}/openttd/data/opntitle.dat
-%{_gamesdatadir}/openttd/data/signalsw.grf
-%{_gamesdatadir}/openttd/data/trkfoundw.grf
-
-"%{_gamesdatadir}/openttd/scenario/Linkgame Islands 2004.scn"
-"%{_gamesdatadir}/openttd/scenario/Mountain Pass.scn"
-"%{_gamesdatadir}/openttd/scenario/Volcano City.scn"
-
-%{_menudir}/%{name}
-%{_iconsdir}/*.png
-%{_miconsdir}/*.png
-%{_liconsdir}/*.png
-
-%doc changelog.txt readme.txt COPYING os/linux/README.urpmi
-
-#------------------------------------------------------------------------------
-#   Change Log
-#------------------------------------------------------------------------------
-%changelog
-* Sun Jan 23 2005 Dominik Scherer <dominik@openttd.com> 0.3.6-1mdk
-- Upgraded to 0.3.6
-- Structured and commented the spec file a bit (inspired by ScummVM)
-
-* Fri Dec 24 2004 Dominik Scherer <dominik@openttd.com> 0.3.5-1mdk
-- Upgraded to 0.3.5
-- Added a warning message about the additional required files (only displayed when installing via urpmi)
-
-* Wed Sep 15 2004 Dominik Scherer <> 0.3.4-1mdk
-- Upgraded to 0.3.4
-
-* Wed Jul 31 2004 Dominik Scherer <> 0.3.3-1mdk
-- Initial release
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/os/rpm/openttd.spec	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,75 @@
+#
+# spec file for package openttd (trunk)
+#
+# Copyright (c) 2007 The OpenTTD team.
+# This file and all modifications and additions to the pristine
+# package are under the same license as the package itself
+#
+Name:          openttd
+Version:       svn
+Release:       head
+Group:         Applications/Games
+Source:        %{name}-%{version}-%{release}.tar.gz
+License:       GPL
+URL:           http://www.openttd.org
+Packager:      Denis Burlaka <burlaka@yandex.ru>
+Summary:       OpenTTD is an Open Source clone of Chris Sawyer's Transport Tycoon Deluxe
+Requires:      SDL zlib libpng freetype2 fontconfig
+BuildRequires: gcc SDL-devel zlib-devel libpng-devel fontconfig-devel
+%if %{_vendor}=="suse"
+BuildRequires: freetype2-devel
+%endif
+%if %{_vendor}=="fedora"
+BuildRequires: freetype-devel
+%endif
+%if %{_vendor}=="mandriva"
+BuildRequires: libfreetype6-devel
+%endif
+BuildRoot:     %{_tmppath}/%{name}-%{version}-%{release}-buildroot
+Prefix:        /usr
+
+%description
+OpenTTD is a clone of the Microprose game "Transport Tycoon Deluxe", a popular game originally written by Chris Sawyer. It attempts to mimic the original game as closely as possible while extending it with new features.
+
+OpenTTD is licensed under the GNU General Public License version 2.0. For more information, see the file 'COPYING' included with every release and source download of the game.
+
+%prep
+%setup
+
+%build
+./configure --prefix-dir=%{prefix} --binary-dir=bin --install-dir="$RPM_BUILD_ROOT"
+make
+
+%install
+make ROOT="$RPM_BUILD_ROOT" install
+
+mkdir -p $RPM_BUILD_ROOT/%{_datadir}/applications
+cat << EOF > $RPM_BUILD_ROOT/%{_datadir}/applications/%{name}.desktop
+[Desktop Entry]
+Categories=Games;
+Encoding=UTF-8
+Exec=/usr/bin/openttd
+Name=OpenTTD
+Icon=openttd.32
+Terminal=false
+Type=Application
+EOF
+
+%clean
+rm -Rf "$RPM_BUILD_ROOT"
+
+%files
+%dir %{_datadir}/games/%{name}
+%dir %{_datadir}/games/%{name}/lang
+%dir %{_datadir}/games/%{name}/data
+%dir %{_datadir}/games/%{name}/gm
+%dir %{_datadir}/games/%{name}/docs
+%dir %{_datadir}/pixmaps
+%defattr(644, root, games, 755)
+%attr(755, root, games) %{_bindir}/%{name}
+%{_datadir}/games/%{name}/lang/*
+%{_datadir}/games/%{name}/data/*
+%{_datadir}/games/%{name}/docs/*
+%{_datadir}/pixmaps/*
+%{_datadir}/applications/%{name}.desktop
+
Binary file os/suse/openttd.spec has changed
--- a/projects/determineversion.vbs	Mon Apr 14 20:32:36 2008 +0000
+++ b/projects/determineversion.vbs	Tue Apr 15 00:47:19 2008 +0000
@@ -53,6 +53,43 @@
 	UpdateFile revision, version, cur_date, "../src/ottdres.rc"
 End Sub
 
+Function ReadRegistryKey(shive, subkey, valuename, architecture)
+	Dim hiveKey, objCtx, objLocator, objServices, objReg, Inparams, Outparams
+
+	' First, get the Registry Provider for the requested architecture
+	Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
+	objCtx.Add "__ProviderArchitecture", architecture ' Must be 64 of 32
+	Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
+	Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
+	Set objReg = objServices.Get("StdRegProv")
+
+	' Check the hive and give it the right value
+	Select Case shive
+		Case "HKCR", "HKEY_CLASSES_ROOT"
+			hiveKey = &h80000000
+		Case "HKCU", "HKEY_CURRENT_USER"
+			hiveKey = &H80000001
+		Case "HKLM", "HKEY_LOCAL_MACHINE"
+			hiveKey = &h80000002
+		Case "HKU", "HKEY_USERS"
+			hiveKey = &h80000003
+		Case "HKCC", "HKEY_CURRENT_CONFIG"
+			hiveKey = &h80000005
+		Case "HKDD", "HKEY_DYN_DATA" ' Only valid for Windows 95/98
+			hiveKey = &h80000006
+		Case Else
+			MsgBox "Hive not valid (ReadRegistryKey)"
+	End Select
+
+	Set Inparams = objReg.Methods_("GetStringValue").Inparameters
+	Inparams.Hdefkey = hiveKey
+	Inparams.Ssubkeyname = subkey
+	Inparams.Svaluename = valuename
+	Set Outparams = objReg.ExecMethod_("GetStringValue", Inparams,,objCtx)
+
+	ReadRegistryKey = Outparams.SValue
+End Function
+
 Function DetermineSVNVersion()
 	Dim WshShell, version, url, oExec, line
 	Set WshShell = CreateObject("WScript.Shell")
@@ -61,27 +98,35 @@
 	' Try TortoiseSVN
 	' Get the directory where TortoiseSVN (should) reside(s)
 	Dim sTortoise
-	sTortoise = WshShell.RegRead("HKLM\SOFTWARE\TortoiseSVN\Directory")
+	' First, try with 32-bit architecture
+	sTortoise = ReadRegistryKey("HKLM", "SOFTWARE\TortoiseSVN", "Directory", 32)
+	If sTortoise = Nothing Then
+		' No 32-bit version of TortoiseSVN installed, try 64-bit version (doesn't hurt on 32-bit machines, it returns nothing or is ignored)
+		sTortoise = ReadRegistryKey("HKLM", "SOFTWARE\TortoiseSVN", "Directory", 64)
+	End If
 
-	Dim file
-	' Write some "magic" to a temporary file so we can acquire the svn revision/state
-	Set file = FSO.CreateTextFile("tsvn_tmp", -1, 0)
-	file.WriteLine "r$WCREV$$WCMODS?M:$"
-	file.WriteLine "$WCURL$"
-	file.Close
-	Set oExec = WshShell.Exec(sTortoise & "\bin\SubWCRev.exe ../src tsvn_tmp tsvn_tmp")
-	' Wait till the application is finished ...
-	Do
-		OExec.StdOut.ReadLine()
-	Loop While Not OExec.StdOut.atEndOfStream
+	' If TortoiseSVN is installed, try to get the revision number
+	If sTortoise <> Nothing Then
+		Dim file
+		' Write some "magic" to a temporary file so we can acquire the svn revision/state
+		Set file = FSO.CreateTextFile("tsvn_tmp", -1, 0)
+		file.WriteLine "r$WCREV$$WCMODS?M:$"
+		file.WriteLine "$WCURL$"
+		file.Close
+		Set oExec = WshShell.Exec(sTortoise & "\bin\SubWCRev.exe ../src tsvn_tmp tsvn_tmp")
+		' Wait till the application is finished ...
+		Do
+			OExec.StdOut.ReadLine()
+		Loop While Not OExec.StdOut.atEndOfStream
 
-	Set file = FSO.OpenTextFile("tsvn_tmp", 1, 0, 0)
-	version = file.ReadLine
-	url = file.ReadLine
-	file.Close
+		Set file = FSO.OpenTextFile("tsvn_tmp", 1, 0, 0)
+		version = file.ReadLine
+		url = file.ReadLine
+		file.Close
 
-	Set file = FSO.GetFile("tsvn_tmp")
-	file.Delete
+		Set file = FSO.GetFile("tsvn_tmp")
+		file.Delete
+	End If
 
 	' Looks like there is no TortoiseSVN installed either. Then we don't know it.
 	If InStr(version, "$") Then
--- a/projects/openttd_vs80.vcproj	Mon Apr 14 20:32:36 2008 +0000
+++ b/projects/openttd_vs80.vcproj	Tue Apr 15 00:47:19 2008 +0000
@@ -61,7 +61,7 @@
 				FavorSizeOrSpeed="2"
 				OmitFramePointers="true"
 				AdditionalIncludeDirectories="..\objs\langs"
-				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;;WITH_ASSERT"
 				StringPooling="true"
 				ExceptionHandling="1"
 				RuntimeLibrary="0"
@@ -272,7 +272,7 @@
 				FavorSizeOrSpeed="2"
 				OmitFramePointers="true"
 				AdditionalIncludeDirectories="..\objs\langs"
-				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;;WITH_ASSERT"
 				StringPooling="true"
 				ExceptionHandling="1"
 				RuntimeLibrary="0"
@@ -780,6 +780,10 @@
 			Name="Header Files"
 			>
 			<File
+				RelativePath=".\..\src\ai\ai.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\aircraft.h"
 				>
 			</File>
@@ -884,10 +888,18 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\ai\default\default.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\depot.h"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\depot_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\direction_func.h"
 				>
 			</File>
@@ -924,7 +936,11 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\engine.h"
+				RelativePath=".\..\src\engine_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\engine_type.h"
 				>
 			</File>
 			<File
@@ -984,6 +1000,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\group_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\gui.h"
 				>
 			</File>
@@ -1008,6 +1028,18 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\lzoconf.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\map_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\map_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\core\math_func.hpp"
 				>
 			</File>
@@ -1016,6 +1048,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\minilzo.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\mixer.h"
 				>
 			</File>
@@ -1024,6 +1060,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\namegen_func.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\network\network.h"
 				>
 			</File>
@@ -1120,6 +1160,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_string_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_text.h"
 				>
 			</File>
@@ -1132,7 +1176,11 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\news.h"
+				RelativePath=".\..\src\news_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\news_type.h"
 				>
 			</File>
 			<File
@@ -1156,11 +1204,23 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\oldpool_func.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\openttd.h"
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\order.h"
+				RelativePath=".\..\src\order_base.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\order_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\order_type.h"
 				>
 			</File>
 			<File
@@ -1244,6 +1304,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\sdl.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\sound\sdl_s.h"
 				>
 			</File>
@@ -1272,7 +1336,19 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\signs.h"
+				RelativePath=".\..\src\signal_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs_base.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs_type.h"
 				>
 			</File>
 			<File
@@ -1300,7 +1376,11 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\station.h"
+				RelativePath=".\..\src\station_base.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\station_func.h"
 				>
 			</File>
 			<File
@@ -1308,6 +1388,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\station_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\stdafx.h"
 				>
 			</File>
@@ -1368,6 +1452,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\toolbar_gui.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\track_func.h"
 				>
 			</File>
@@ -1388,6 +1476,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\ai\trolly\trolly.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\tunnelbridge.h"
 				>
 			</File>
@@ -1416,10 +1508,22 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\viewport_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\viewport_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\waypoint.h"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\waypoint_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\music\win32_m.h"
 				>
 			</File>
@@ -1432,6 +1536,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\water.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\win32.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\window_func.h"
 				>
 			</File>
@@ -1536,6 +1648,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\osk_gui.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\player_gui.cpp"
 				>
 			</File>
@@ -1584,6 +1700,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\toolbar_gui.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\town_gui.cpp"
 				>
 			</File>
@@ -1704,6 +1824,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\table\bridge_land.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\table\build_industry.h"
 				>
 			</File>
@@ -1716,6 +1840,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\table\control_codes.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\table\elrail_data.h"
 				>
 			</File>
@@ -1724,6 +1852,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\table\files.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\table\genland.h"
 				>
 			</File>
@@ -1744,6 +1876,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\table\railtypes.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\table\road_land.h"
 				>
 			</File>
@@ -1780,6 +1916,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\table\unicode.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\table\unmovable_land.h"
 				>
 			</File>
--- a/projects/openttd_vs80.vcproj.in	Mon Apr 14 20:32:36 2008 +0000
+++ b/projects/openttd_vs80.vcproj.in	Tue Apr 15 00:47:19 2008 +0000
@@ -61,7 +61,7 @@
 				FavorSizeOrSpeed="2"
 				OmitFramePointers="true"
 				AdditionalIncludeDirectories="..\objs\langs"
-				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;;WITH_ASSERT"
 				StringPooling="true"
 				ExceptionHandling="1"
 				RuntimeLibrary="0"
@@ -272,7 +272,7 @@
 				FavorSizeOrSpeed="2"
 				OmitFramePointers="true"
 				AdditionalIncludeDirectories="..\objs\langs"
-				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;;WITH_ASSERT"
 				StringPooling="true"
 				ExceptionHandling="1"
 				RuntimeLibrary="0"
--- a/projects/openttd_vs90.vcproj	Mon Apr 14 20:32:36 2008 +0000
+++ b/projects/openttd_vs90.vcproj	Tue Apr 15 00:47:19 2008 +0000
@@ -62,7 +62,7 @@
 				FavorSizeOrSpeed="2"
 				OmitFramePointers="true"
 				AdditionalIncludeDirectories="..\objs\langs"
-				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;;WITH_ASSERT"
 				StringPooling="true"
 				ExceptionHandling="1"
 				RuntimeLibrary="0"
@@ -270,7 +270,7 @@
 				FavorSizeOrSpeed="2"
 				OmitFramePointers="true"
 				AdditionalIncludeDirectories="..\objs\langs"
-				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;;WITH_ASSERT"
 				StringPooling="true"
 				ExceptionHandling="1"
 				RuntimeLibrary="0"
@@ -769,6 +769,10 @@
 			Name="Header Files"
 			>
 			<File
+				RelativePath=".\..\src\ai\ai.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\aircraft.h"
 				>
 			</File>
@@ -877,10 +881,18 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\ai\default\default.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\depot.h"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\depot_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\direction_func.h"
 				>
 			</File>
@@ -917,7 +929,11 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\engine.h"
+				RelativePath=".\..\src\engine_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\engine_type.h"
 				>
 			</File>
 			<File
@@ -969,6 +985,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\group_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\gui.h"
 				>
 			</File>
@@ -993,6 +1013,18 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\lzoconf.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\map_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\map_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\core\math_func.hpp"
 				>
 			</File>
@@ -1001,6 +1033,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\minilzo.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\mixer.h"
 				>
 			</File>
@@ -1009,6 +1045,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\namegen_func.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\network\network.h"
 				>
 			</File>
@@ -1101,6 +1141,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_string_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_text.h"
 				>
 			</File>
@@ -1113,7 +1157,11 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\news.h"
+				RelativePath=".\..\src\news_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\news_type.h"
 				>
 			</File>
 			<File
@@ -1137,11 +1185,23 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\oldpool_func.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\openttd.h"
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\order.h"
+				RelativePath=".\..\src\order_base.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\order_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\order_type.h"
 				>
 			</File>
 			<File
@@ -1225,6 +1285,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\sdl.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\sound\sdl_s.h"
 				>
 			</File>
@@ -1253,7 +1317,19 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\signs.h"
+				RelativePath=".\..\src\signal_type.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs_base.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs_type.h"
 				>
 			</File>
 			<File
@@ -1281,7 +1357,11 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\station.h"
+				RelativePath=".\..\src\station_base.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\station_func.h"
 				>
 			</File>
 			<File
@@ -1289,6 +1369,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\station_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\stdafx.h"
 				>
 			</File>
@@ -1349,6 +1433,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\toolbar_gui.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\track_func.h"
 				>
 			</File>
@@ -1369,6 +1457,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\ai\trolly\trolly.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\tunnelbridge.h"
 				>
 			</File>
@@ -1397,10 +1489,22 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\viewport_func.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\viewport_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\waypoint.h"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\waypoint_type.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\music\win32_m.h"
 				>
 			</File>
@@ -1413,6 +1517,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\water.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\win32.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\window_func.h"
 				>
 			</File>
@@ -1517,6 +1629,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\osk_gui.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\player_gui.cpp"
 				>
 			</File>
@@ -1565,6 +1681,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\toolbar_gui.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\town_gui.cpp"
 				>
 			</File>
@@ -1685,6 +1805,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\table\bridge_land.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\table\build_industry.h"
 				>
 			</File>
@@ -1697,6 +1821,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\table\control_codes.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\table\elrail_data.h"
 				>
 			</File>
@@ -1705,6 +1833,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\table\files.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\table\genland.h"
 				>
 			</File>
@@ -1725,6 +1857,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\table\railtypes.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\table\road_land.h"
 				>
 			</File>
@@ -1761,6 +1897,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\table\unicode.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\table\unmovable_land.h"
 				>
 			</File>
--- a/projects/openttd_vs90.vcproj.in	Mon Apr 14 20:32:36 2008 +0000
+++ b/projects/openttd_vs90.vcproj.in	Tue Apr 15 00:47:19 2008 +0000
@@ -62,7 +62,7 @@
 				FavorSizeOrSpeed="2"
 				OmitFramePointers="true"
 				AdditionalIncludeDirectories="..\objs\langs"
-				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;;WITH_ASSERT"
 				StringPooling="true"
 				ExceptionHandling="1"
 				RuntimeLibrary="0"
@@ -270,7 +270,7 @@
 				FavorSizeOrSpeed="2"
 				OmitFramePointers="true"
 				AdditionalIncludeDirectories="..\objs\langs"
-				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\&quot;OpenTTD\&quot;;WITH_ASSERT"
 				StringPooling="true"
 				ExceptionHandling="1"
 				RuntimeLibrary="0"
--- a/source.list	Mon Apr 14 20:32:36 2008 +0000
+++ b/source.list	Tue Apr 15 00:47:19 2008 +0000
@@ -103,6 +103,7 @@
 window.cpp
 
 # Header Files
+ai/ai.h
 aircraft.h
 airport.h
 core/alloc_func.hpp
@@ -129,7 +130,9 @@
 date_type.h
 debug.h
 video/dedicated_v.h
+ai/default/default.h
 depot.h
+depot_type.h
 direction_func.h
 direction_type.h
 music/dmusic.h
@@ -139,7 +142,8 @@
 economy_func.h
 economy_type.h
 core/endian_func.hpp
-engine.h
+engine_func.h
+engine_type.h
 core/enum_type.hpp
 fileio.h
 fios.h
@@ -154,16 +158,22 @@
 gfxinit.h
 group.h
 group_gui.h
+group_type.h
 gui.h
 heightmap.h
 industry.h
 industry_type.h
 landscape.h
 livery.h
+lzoconf.h
+map_func.h
+map_type.h
 core/math_func.hpp
 md5.h
+minilzo.h
 mixer.h
 music.h
+namegen_func.h
 network/network.h
 network/network_client.h
 network/network_data.h
@@ -188,17 +198,22 @@
 newgrf_spritegroup.h
 newgrf_station.h
 newgrf_storage.h
+newgrf_string_type.h
 newgrf_text.h
 newgrf_town.h
 newgrf_townname.h
-news.h
+news_func.h
+news_type.h
 npf.h
 music/null_m.h
 sound/null_s.h
 video/null_v.h
 oldpool.h
+oldpool_func.h
 openttd.h
-order.h
+order_base.h
+order_func.h
+order_type.h
 core/overflowsafe_type.hpp
 pathfind.h
 player_base.h
@@ -219,6 +234,7 @@
 roadveh.h
 saveload.h
 screenshot.h
+sdl.h
 sound/sdl_s.h
 video/sdl_v.h
 settings_func.h
@@ -226,15 +242,20 @@
 settings_type.h
 ship.h
 signal_func.h
-signs.h
+signal_type.h
+signs_base.h
+signs_func.h
+signs_type.h
 slope_func.h
 slope_type.h
 sound_func.h
 sound_type.h
 sprite.h
 spritecache.h
-station.h
+station_base.h
+station_func.h
 station_gui.h
+station_type.h
 stdafx.h
 string_func.h
 string_type.h
@@ -250,11 +271,13 @@
 timetable.h
 town.h
 town_type.h
+toolbar_gui.h
 track_func.h
 track_type.h
 train.h
 transparency.h
 transparency_gui.h
+ai/trolly/trolly.h
 tunnelbridge.h
 unmovable.h
 variables.h
@@ -262,15 +285,34 @@
 vehicle_func.h
 vehicle_gui.h
 vehicle_type.h
+viewport_func.h
+viewport_type.h
 waypoint.h
+waypoint_type.h
 music/win32_m.h
 sound/win32_s.h
 video/win32_v.h
+water.h
+win32.h
 window_func.h
 window_gui.h
 window_type.h
 zoom_func.h
 zoom_type.h
+#if WIN32
+#else
+music/bemidi.h
+music/extmidi.h
+music/libtimidity.h
+music/os2_m.h
+music/qtmidi.h
+os/macosx/macos.h
+os/macosx/osx_stdafx.h
+os/macosx/splash.h
+sound/cocoa_s.h
+video/cocoa/cocoa_keys.h
+video/cocoa/cocoa_v.h
+#end
 
 # GUI Source Code
 aircraft_gui.cpp
@@ -293,6 +335,7 @@
 newgrf_gui.cpp
 news_gui.cpp
 order_gui.cpp
+osk_gui.cpp
 player_gui.cpp
 rail_gui.cpp
 road_gui.cpp
@@ -305,6 +348,7 @@
 subsidy_gui.cpp
 terraform_gui.cpp
 timetable_gui.cpp
+toolbar_gui.cpp
 town_gui.cpp
 train_gui.cpp
 transparency_gui.cpp
@@ -337,16 +381,20 @@
 table/ai_rail.h
 table/animcursors.h
 table/autorail.h
+table/bridge_land.h
 table/build_industry.h
 table/cargo_const.h
 table/clear_land.h
+table/control_codes.h
 table/elrail_data.h
 table/engines.h
+table/files.h
 table/genland.h
 table/industry_land.h
 table/landscape_sprite.h
 table/namegen.h
 table/palettes.h
+table/railtypes.h
 table/road_land.h
 table/roadveh_movement.h
 table/sprites.h
@@ -356,6 +404,7 @@
 table/track_land.h
 table/train_cmd.h
 table/tree_land.h
+table/unicode.h
 table/unmovable_land.h
 table/water_land.h
 
--- a/src/ai/default/default.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/ai/default/default.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -11,11 +11,9 @@
 #include "../../roadveh.h"
 #include "../../station_map.h"
 #include "../../tunnel_map.h"
-#include "../../engine.h"
 #include "../../command_func.h"
 #include "../../town.h"
 #include "../../industry.h"
-#include "../../station.h"
 #include "../../pathfind.h"
 #include "../../airport.h"
 #include "../../depot.h"
@@ -32,6 +30,7 @@
 #include "../../settings_type.h"
 #include "default.h"
 #include "../../tunnelbridge.h"
+#include "../../order_func.h"
 
 #include "../../table/ai_rail.h"
 
@@ -264,8 +263,8 @@
 
 	FOR_VEHICLE_ORDERS(v, o) {
 		if (!o->IsValid()) continue;
-		if (!IsValidStationID(o->dest)) continue;
-		const Station *st = GetStation(o->dest);
+		if (!IsValidStationID(o->GetDestination())) continue;
+		const Station *st = GetStation(o->GetDestination());
 		if (!(st->facilities & FACIL_AIRPORT)) continue;
 
 		AirportFTAClass::Flags flags = st->Airport()->flags;
@@ -300,7 +299,7 @@
 
 static void AiHandleGotoDepot(Player *p, int cmd)
 {
-	if (_players_ai[p->index].cur_veh->current_order.type != OT_GOTO_DEPOT)
+	if (!_players_ai[p->index].cur_veh->current_order.IsType(OT_GOTO_DEPOT))
 		DoCommand(0, _players_ai[p->index].cur_veh->index, 0, DC_EXEC, cmd);
 
 	if (++_players_ai[p->index].state_counter <= 1387) {
@@ -308,9 +307,8 @@
 		return;
 	}
 
-	if (_players_ai[p->index].cur_veh->current_order.type == OT_GOTO_DEPOT) {
-		_players_ai[p->index].cur_veh->current_order.type = OT_DUMMY;
-		_players_ai[p->index].cur_veh->current_order.flags = 0;
+	if (_players_ai[p->index].cur_veh->current_order.IsType(OT_GOTO_DEPOT)) {
+		_players_ai[p->index].cur_veh->current_order.MakeDummy();
 		InvalidateWindow(WC_VEHICLE_VIEW, _players_ai[p->index].cur_veh->index);
 	}
 }
@@ -319,8 +317,8 @@
 {
 	if (bak->order == NULL) return;
 
-	for (uint i = 0; bak->order[i].type != OT_NOTHING; i++) {
-		if (!DoCommandP(0, v->index + (i << 16), PackOrder(&bak->order[i]), NULL, CMD_INSERT_ORDER | CMD_NO_TEST_IF_IN_NETWORK))
+	for (uint i = 0; !bak->order[i].IsType(OT_NOTHING); i++) {
+		if (!DoCommandP(0, v->index + (i << 16), bak->order[i].Pack(), NULL, CMD_INSERT_ORDER | CMD_NO_TEST_IF_IN_NETWORK))
 			break;
 	}
 }
@@ -1923,7 +1921,7 @@
 	arpfd.tile2 = _players_ai[p->index].cur_tile_a;
 	arpfd.flag = false;
 	arpfd.count = 0;
-	FollowTrack(_players_ai[p->index].cur_tile_a + TileOffsByDiagDir(_players_ai[p->index].cur_dir_a), TRANSPORT_RAIL, 0, ReverseDiagDir(_players_ai[p->index].cur_dir_a),
+	FollowTrack(_players_ai[p->index].cur_tile_a + TileOffsByDiagDir(_players_ai[p->index].cur_dir_a), PATHFIND_FLAGS_NONE, TRANSPORT_RAIL, 0, ReverseDiagDir(_players_ai[p->index].cur_dir_a),
 		(TPFEnumProc*)AiEnumFollowTrack, NULL, &arpfd);
 	return arpfd.count > 8;
 }
@@ -1952,9 +1950,6 @@
 	{1, 3, 5, 0, 3, 2, 128 + 3, 67}
 };
 
-static const byte _dir_table_1[] = { 3, 9, 12, 6};
-static const byte _dir_table_2[] = {12, 6,  3, 9};
-
 
 static bool AiIsTileBanned(const Player* p, TileIndex tile, byte val)
 {
@@ -2027,7 +2022,7 @@
 	DiagDirection dir2 = (DiagDirection)(p[0] & 3);
 
 	tileh = GetTileSlope(tile, &z);
-	if (tileh == _dir_table_1[dir2] || (tileh == SLOPE_FLAT && z != 0)) {
+	if (tileh == InclinedSlope(ReverseDiagDir(dir2)) || (tileh == SLOPE_FLAT && z != 0)) {
 		TileIndex tile_new = tile;
 
 		// Allow bridges directly over bottom tiles
@@ -2064,7 +2059,7 @@
 {
 	uint z;
 
-	if (GetTileSlope(tile, &z) == _dir_table_2[p[0] & 3] && z != 0) {
+	if (GetTileSlope(tile, &z) == InclinedSlope((DiagDirection)(p[0] & 3)) && z != 0) {
 		CommandCost cost = DoCommand(tile, _players_ai[arf->player->index].railtype_to_use, 0, DC_AUTO, CMD_BUILD_TUNNEL);
 
 		if (CmdSucceeded(cost) && cost.GetCost() <= (arf->player->player_money >> 4)) {
@@ -2139,8 +2134,6 @@
 }
 
 
-static const byte _dir_table_3[] = {0x25, 0x2A, 0x19, 0x16};
-
 static void AiBuildRailConstruct(Player *p)
 {
 	AiRailFinder arf;
@@ -2269,8 +2262,6 @@
 
 static bool AiRemoveTileAndGoForward(Player *p)
 {
-	byte b;
-	int bit;
 	const byte *ptr;
 	TileIndex tile = _players_ai[p->index].cur_tile_a;
 	TileIndex tilenew;
@@ -2299,11 +2290,11 @@
 	}
 
 	// Find the railtype at the position. Quit if no rail there.
-	b = GetRailTrackStatus(tile) & _dir_table_3[_players_ai[p->index].cur_dir_a];
-	if (b == 0) return false;
+	TrackBits bits = GetRailTrackStatus(tile) & DiagdirReachesTracks(ReverseDiagDir(_players_ai[p->index].cur_dir_a));
+	if (bits == TRACK_BIT_NONE) return false;
 
 	// Convert into a bit position that CMD_REMOVE_SINGLE_RAIL expects.
-	bit = FindFirstBit(b);
+	Track track = FindFirstTrack(bits);
 
 	// Then remove and signals if there are any.
 	if (IsTileType(tile, MP_RAILWAY) &&
@@ -2312,12 +2303,12 @@
 	}
 
 	// And also remove the rail.
-	if (CmdFailed(DoCommand(tile, 0, bit, DC_EXEC, CMD_REMOVE_SINGLE_RAIL)))
+	if (CmdFailed(DoCommand(tile, 0, track, DC_EXEC, CMD_REMOVE_SINGLE_RAIL)))
 		return false;
 
 	// Find the direction at the other edge of the rail.
 	ptr = _ai_table_15[ReverseDiagDir(_players_ai[p->index].cur_dir_a)];
-	while (ptr[0] != bit) ptr += 2;
+	while (ptr[0] != track) ptr += 2;
 	_players_ai[p->index].cur_dir_a = ReverseDiagDir((DiagDirection)ptr[1]);
 
 	// And then also switch tile.
@@ -2460,7 +2451,7 @@
 	uint16 best_speed    = 0;
 	uint speed;
 
-	for (i = 0; i < NUM_TRAIN_ENGINES; i++) {
+	FOR_ALL_ENGINEIDS_OF_TYPE(i, VEH_TRAIN) {
 		const RailVehicleInfo *rvi = RailVehInfo(i);
 		const Engine* e = GetEngine(i);
 
@@ -2561,15 +2552,13 @@
 		);
 		Order order;
 
-		order.type = OT_GOTO_STATION;
-		order.flags = 0;
-		order.dest = AiGetStationIdByDef(aib->use_tile, aib->cur_building_rule);
-
-		if (!is_pass && i == 1) order.flags |= OFB_UNLOAD;
+		order.MakeGoToStation(AiGetStationIdByDef(aib->use_tile, aib->cur_building_rule));
+
+		if (!is_pass && i == 1) order.SetUnloadType(OUFB_UNLOAD);
 		if (_players_ai[p->index].num_want_fullload != 0 && (is_pass || i == 0))
-			order.flags |= OFB_FULL_LOAD;
-
-		DoCommand(0, loco_id + (i << 16), PackOrder(&order), DC_EXEC, CMD_INSERT_ORDER);
+			order.SetLoadType(OLFB_FULL_LOAD);
+
+		DoCommand(0, loco_id + (i << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER);
 	}
 
 	DoCommand(0, loco_id, 0, DC_EXEC, CMD_START_STOP_TRAIN);
@@ -2689,10 +2678,10 @@
 		} else if (p->mode == 1) {
 			if (_want_road_truck_station) {
 				// Truck station
-				ret = DoCommand(c, p->attr, ROADTYPES_ROAD << 2 | RoadStop::TRUCK, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP);
+				ret = DoCommand(c, p->attr, ROADTYPES_ROAD << 2 | ROADSTOP_TRUCK, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP);
 			} else {
 				// Bus station
-				ret = DoCommand(c, p->attr, ROADTYPES_ROAD << 2 | RoadStop::BUS, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP);
+				ret = DoCommand(c, p->attr, ROADTYPES_ROAD << 2 | ROADSTOP_BUS, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP);
 			}
 clear_town_stuff:;
 
@@ -2831,16 +2820,10 @@
 struct AiRoadEnum {
 	TileIndex dest;
 	TileIndex best_tile;
-	int best_track;
+	Trackdir best_track;
 	uint best_dist;
 };
 
-static const DiagDirection _dir_by_track[] = {
-	DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE,
-	DIAGDIR_NE, DIAGDIR_NE,
-	DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE,
-};
-
 static void AiBuildRoadRecursive(AiRoadFinder *arf, TileIndex tile, DiagDirection dir);
 
 static bool AiCheckRoadPathBetter(AiRoadFinder *arf, const byte *p)
@@ -2877,12 +2860,12 @@
 }
 
 
-static bool AiEnumFollowRoad(TileIndex tile, AiRoadEnum *a, int track, uint length)
+static bool AiEnumFollowRoad(TileIndex tile, AiRoadEnum *a, Trackdir track, uint length)
 {
 	uint dist = DistanceManhattan(tile, a->dest);
 
 	if (dist <= a->best_dist) {
-		TileIndex tile2 = TILE_MASK(tile + TileOffsByDiagDir(_dir_by_track[track]));
+		TileIndex tile2 = TILE_MASK(tile + TileOffsByDiagDir(TrackdirToExitdir(track)));
 
 		if (IsNormalRoadTile(tile2)) {
 			a->best_dist = dist;
@@ -2894,32 +2877,24 @@
 	return false;
 }
 
-static const uint16 _ai_road_table_and[4] = {
-	0x1009,
-	0x16,
-	0x520,
-	0x2A00,
-};
-
 static bool AiCheckRoadFinished(Player *p)
 {
 	AiRoadEnum are;
 	TileIndex tile;
 	DiagDirection dir = _players_ai[p->index].cur_dir_a;
-	uint32 bits;
 
 	are.dest = _players_ai[p->index].cur_tile_b;
 	tile = TILE_MASK(_players_ai[p->index].cur_tile_a + TileOffsByDiagDir(dir));
 
 	if (IsRoadStopTile(tile) || IsTileDepotType(tile, TRANSPORT_ROAD)) return false;
-	bits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, ROADTYPES_ROAD)) & _ai_road_table_and[dir];
-	if (bits == 0) return false;
+	TrackdirBits bits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, ROADTYPES_ROAD)) & DiagdirReachesTrackdirs(dir);
+	if (bits == TRACKDIR_BIT_NONE) return false;
 
 	are.best_dist = (uint)-1;
 
-	uint i;
-	FOR_EACH_SET_BIT(i, bits) {
-		FollowTrack(tile, 0x1000 | TRANSPORT_ROAD, ROADTYPES_ROAD, (DiagDirection)_dir_by_track[i], (TPFEnumProc*)AiEnumFollowRoad, NULL, &are);
+	while (bits != TRACKDIR_BIT_NONE) {
+		Trackdir trackdir = RemoveFirstTrackdir(&bits);
+		FollowTrack(tile, PATHFIND_FLAGS_DISABLE_TILE_HASH, TRANSPORT_ROAD, ROADTYPES_ROAD, TrackdirToExitdir(trackdir), (TPFEnumProc*)AiEnumFollowRoad, NULL, &are);
 	}
 
 	if (DistanceManhattan(tile, are.dest) <= are.best_dist) return false;
@@ -2927,7 +2902,7 @@
 	if (are.best_dist == 0) return true;
 
 	_players_ai[p->index].cur_tile_a = are.best_tile;
-	_players_ai[p->index].cur_dir_a = _dir_by_track[are.best_track];
+	_players_ai[p->index].cur_dir_a = TrackdirToExitdir(are.best_track);
 	return false;
 }
 
@@ -2954,7 +2929,7 @@
 	DiagDirection dir2 = (DiagDirection)(p[0] & 3);
 
 	tileh = GetTileSlope(tile, &z);
-	if (tileh == _dir_table_1[dir2] || (tileh == SLOPE_FLAT && z != 0)) {
+	if (tileh == InclinedSlope(ReverseDiagDir(dir2)) || (tileh == SLOPE_FLAT && z != 0)) {
 		TileIndex tile_new = tile;
 
 		// Allow bridges directly over bottom tiles
@@ -2992,7 +2967,7 @@
 {
 	uint z;
 
-	if (GetTileSlope(tile, &z) == _dir_table_2[p[0] & 3] && z != 0) {
+	if (GetTileSlope(tile, &z) == InclinedSlope((DiagDirection)(p[0] & 3)) && z != 0) {
 		CommandCost cost = DoCommand(tile, 0x200, 0, DC_AUTO, CMD_BUILD_TUNNEL);
 
 		if (CmdSucceeded(cost) && cost.GetCost() <= (arf->player->player_money >> 4)) {
@@ -3312,15 +3287,13 @@
 		);
 		Order order;
 
-		order.type = OT_GOTO_STATION;
-		order.flags = 0;
-		order.dest = AiGetStationIdFromRoadBlock(aib->use_tile, aib->cur_building_rule);
-
-		if (!is_pass && i == 1) order.flags |= OFB_UNLOAD;
+		order.MakeGoToStation(AiGetStationIdFromRoadBlock(aib->use_tile, aib->cur_building_rule));
+
+		if (!is_pass && i == 1) order.SetUnloadType(OUFB_UNLOAD);
 		if (_players_ai[p->index].num_want_fullload != 0 && (is_pass || i == 0))
-			order.flags |= OFB_FULL_LOAD;
-
-		DoCommand(0, loco_id + (i << 16), PackOrder(&order), DC_EXEC, CMD_INSERT_ORDER);
+			order.SetLoadType(OLFB_FULL_LOAD);
+
+		DoCommand(0, loco_id + (i << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER);
 	}
 
 	DoCommand(0, loco_id, 0, DC_EXEC, CMD_START_STOP_ROADVEH);
@@ -3569,15 +3542,13 @@
 		bool is_pass = (_players_ai[p->index].cargo_type == CT_PASSENGERS || _players_ai[p->index].cargo_type == CT_MAIL);
 		Order order;
 
-		order.type = OT_GOTO_STATION;
-		order.flags = 0;
-		order.dest = GetStationIndex(tile);
-
-		if (!is_pass && i == 1) order.flags |= OFB_UNLOAD;
+		order.MakeGoToStation(GetStationIndex(tile));
+
+		if (!is_pass && i == 1) order.SetUnloadType(OUFB_UNLOAD);
 		if (_players_ai[p->index].num_want_fullload != 0 && (is_pass || i == 0))
-			order.flags |= OFB_FULL_LOAD;
-
-		DoCommand(0, loco_id + (i << 16), PackOrder(&order), DC_EXEC, CMD_INSERT_ORDER);
+			order.SetLoadType(OLFB_FULL_LOAD);
+
+		DoCommand(0, loco_id + (i << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER);
 	}
 
 	DoCommand(0, loco_id, 0, DC_EXEC, CMD_START_STOP_AIRCRAFT);
@@ -3612,7 +3583,7 @@
 		if (v->type == VEH_TRAIN) {
 
 			if (!IsTileDepotType(v->tile, TRANSPORT_RAIL) || v->u.rail.track != 0x80 || !(v->vehstatus&VS_STOPPED)) {
-				if (v->current_order.type != OT_GOTO_DEPOT)
+				if (!v->current_order.IsType(OT_GOTO_DEPOT))
 					DoCommand(0, v->index, 0, DC_EXEC, CMD_SEND_TRAIN_TO_DEPOT);
 				goto going_to_depot;
 			}
@@ -3622,7 +3593,7 @@
 
 		} else if (v->type == VEH_ROAD) {
 			if (!v->IsStoppedInDepot()) {
-				if (v->current_order.type != OT_GOTO_DEPOT)
+				if (!v->current_order.IsType(OT_GOTO_DEPOT))
 					DoCommand(0, v->index, 0, DC_EXEC, CMD_SEND_ROADVEH_TO_DEPOT);
 				goto going_to_depot;
 			}
@@ -3630,7 +3601,7 @@
 			DoCommand(0, v->index, 0, DC_EXEC, CMD_SELL_ROAD_VEH);
 		} else if (v->type == VEH_AIRCRAFT) {
 			if (!v->IsStoppedInDepot()) {
-				if (v->current_order.type != OT_GOTO_DEPOT)
+				if (!v->current_order.IsType(OT_GOTO_DEPOT))
 					DoCommand(0, v->index, 0, DC_EXEC, CMD_SEND_AIRCRAFT_TO_HANGAR);
 				goto going_to_depot;
 			}
@@ -3645,9 +3616,8 @@
 going_to_depot:;
 	if (++_players_ai[p->index].state_counter <= 832) return;
 
-	if (v->current_order.type == OT_GOTO_DEPOT) {
-		v->current_order.type = OT_DUMMY;
-		v->current_order.flags = 0;
+	if (v->current_order.IsType(OT_GOTO_DEPOT)) {
+		v->current_order.MakeDummy();
 		InvalidateWindow(WC_VEHICLE_VIEW, v->index);
 	}
 return_to_loop:;
@@ -3668,7 +3638,7 @@
 	byte *in_use = MallocT<byte>(GetMaxStationIndex() + 1);
 	memset(in_use, 0, GetMaxStationIndex() + 1);
 	FOR_ALL_ORDERS(ord) {
-		if (ord->type == OT_GOTO_STATION) in_use[ord->dest] = 1;
+		if (ord->IsType(OT_GOTO_STATION)) in_use[ord->GetDestination()] = 1;
 	}
 
 	// Go through all stations and delete those that aren't in use
--- a/src/ai/trolly/build.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/ai/trolly/build.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -6,8 +6,7 @@
 #include "../../road_map.h"
 #include "../../command_func.h"
 #include "trolly.h"
-#include "../../engine.h"
-#include "../../station.h"
+#include "../../engine_func.h"
 #include "../../variables.h"
 #include "../../bridge.h"
 #include "../../vehicle_func.h"
@@ -44,9 +43,9 @@
 		return AI_DoCommand(tile, direction + (numtracks << 8) + (length << 16), 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_RAILROAD_STATION);
 
 	if (type == AI_BUS)
-		return AI_DoCommand(tile, direction, ROADTYPES_ROAD << 2 | RoadStop::BUS, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP);
+		return AI_DoCommand(tile, direction, ROADTYPES_ROAD << 2 | ROADSTOP_BUS, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP);
 
-	return AI_DoCommand(tile, direction, ROADTYPES_ROAD << 2 | RoadStop::TRUCK, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP);
+	return AI_DoCommand(tile, direction, ROADTYPES_ROAD << 2 | ROADSTOP_TRUCK, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP);
 }
 
 
--- a/src/ai/trolly/trolly.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/ai/trolly/trolly.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -26,15 +26,14 @@
 #include "trolly.h"
 #include "../../town.h"
 #include "../../industry.h"
-#include "../../station.h"
-#include "../../engine.h"
+#include "../../station_base.h"
+#include "../../engine_func.h"
 #include "../../gui.h"
 #include "../../depot.h"
 #include "../../vehicle_base.h"
 #include "../../vehicle_func.h"
 #include "../../date_func.h"
 #include "../ai.h"
-#include "../../order.h"
 #include "../../player_base.h"
 #include "../../player_func.h"
 
@@ -554,7 +553,7 @@
 			const Order *order;
 
 			FOR_VEHICLE_ORDERS(v, order) {
-				if (order->type == OT_GOTO_STATION && GetStation(order->dest) == st) {
+				if (order->IsType(OT_GOTO_STATION) && GetStation(order->GetDestination()) == st) {
 					// This vehicle has this city in its list
 					count++;
 				}
@@ -1185,27 +1184,19 @@
 	// Very handy for AI, goto depot.. but yeah, it needs to be activated ;)
 	if (_patches.gotodepot) {
 		idx = 0;
-		order.type = OT_GOTO_DEPOT;
-		order.flags = OFB_UNLOAD;
-		order.dest = GetDepotByTile(_players_ainew[p->index].depot_tile)->index;
-		AI_DoCommand(0, _players_ainew[p->index].veh_id + (idx << 16), PackOrder(&order), DC_EXEC, CMD_INSERT_ORDER);
+		order.MakeGoToDepot(GetDepotByTile(_players_ainew[p->index].depot_tile)->index, ODTFB_PART_OF_ORDERS);
+		AI_DoCommand(0, _players_ainew[p->index].veh_id + (idx << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER);
 	}
 
 	idx = 0;
-	order.type = OT_GOTO_STATION;
-	order.flags = 0;
-	order.dest = GetStationIndex(_players_ainew[p->index].to_tile);
-	if (_players_ainew[p->index].tbt == AI_TRUCK && _players_ainew[p->index].to_deliver)
-		order.flags |= OFB_FULL_LOAD;
-	AI_DoCommand(0, _players_ainew[p->index].veh_id + (idx << 16), PackOrder(&order), DC_EXEC, CMD_INSERT_ORDER);
+	order.MakeGoToStation(GetStationIndex(_players_ainew[p->index].to_tile));
+	if (_players_ainew[p->index].tbt == AI_TRUCK && _players_ainew[p->index].to_deliver) order.SetLoadType(OLFB_FULL_LOAD);
+	AI_DoCommand(0, _players_ainew[p->index].veh_id + (idx << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER);
 
 	idx = 0;
-	order.type = OT_GOTO_STATION;
-	order.flags = 0;
-	order.dest = GetStationIndex(_players_ainew[p->index].from_tile);
-	if (_players_ainew[p->index].tbt == AI_TRUCK && _players_ainew[p->index].from_deliver)
-		order.flags |= OFB_FULL_LOAD;
-	AI_DoCommand(0, _players_ainew[p->index].veh_id + (idx << 16), PackOrder(&order), DC_EXEC, CMD_INSERT_ORDER);
+	order.MakeGoToStation(GetStationIndex(_players_ainew[p->index].from_tile));
+	if (_players_ainew[p->index].tbt == AI_TRUCK && _players_ainew[p->index].from_deliver) order.SetLoadType(OLFB_FULL_LOAD);
+	AI_DoCommand(0, _players_ainew[p->index].veh_id + (idx << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER);
 
 	// Start the engines!
 	_players_ainew[p->index].state = AI_STATE_START_VEHICLE;
--- a/src/ai/trolly/trolly.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/ai/trolly/trolly.h	Tue Apr 15 00:47:19 2008 +0000
@@ -7,6 +7,7 @@
 #include "../../player_type.h"
 #include "../../vehicle_type.h"
 #include "../../date_type.h"
+#include "../../engine_type.h"
 
 /*
  * These defines can be altered to change the behavoir of the AI
--- a/src/aircraft.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/aircraft.h	Tue Apr 15 00:47:19 2008 +0000
@@ -6,8 +6,9 @@
 #define AIRCRAFT_H
 
 #include "station_map.h"
+#include "station_base.h"
 #include "vehicle_base.h"
-#include "engine.h"
+#include "engine_func.h"
 
 /** An aircraft can be one ot those types */
 enum AircraftSubType {
@@ -127,6 +128,7 @@
 	bool IsInDepot() const { return (this->vehstatus & VS_HIDDEN) != 0 && IsHangarTile(this->tile); }
 	void Tick();
 	void OnNewDay();
+	TileIndex GetOrderStationLocation(StationID station);
 };
 
 #endif /* AIRCRAFT_H */
--- a/src/aircraft_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/aircraft_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -11,9 +11,7 @@
 #include "station_map.h"
 #include "timetable.h"
 #include "depot.h"
-#include "engine.h"
-#include "station.h"
-#include "news.h"
+#include "news_func.h"
 #include "aircraft.h"
 #include "airport.h"
 #include "vehicle_gui.h"
@@ -36,6 +34,7 @@
 #include "gfx_func.h"
 #include "player_func.h"
 #include "settings_type.h"
+#include "order_func.h"
 
 #include "table/strings.h"
 #include "table/sprites.h"
@@ -55,17 +54,17 @@
 				case FLYING:     x = MKIT(24, 24, -1, -1); break;
 				default:         x = MKIT( 2,  2, -1, -1); break;
 			}
-			this->z_height = 5;
+			this->z_extent = 5;
 			break;
-		case AIR_SHADOW:     this->z_height = 1; x = MKIT(2,  2,  0,  0); break;
-		case AIR_ROTOR:      this->z_height = 1; x = MKIT(2,  2, -1, -1); break;
+		case AIR_SHADOW:     this->z_extent = 1; x = MKIT(2,  2,  0,  0); break;
+		case AIR_ROTOR:      this->z_extent = 1; x = MKIT(2,  2, -1, -1); break;
 	}
 #undef MKIT
 
 	this->x_offs        = GB(x,  0, 8);
 	this->y_offs        = GB(x,  8, 8);
-	this->sprite_width  = GB(x, 16, 8);
-	this->sprite_height = GB(x, 24, 8);
+	this->x_extent      = GB(x, 16, 8);
+	this->y_extent      = GB(x, 24, 8);
 }
 
 static bool AirportMove(Vehicle *v, const AirportFTAClass *apc);
@@ -611,14 +610,15 @@
 
 	if (v->type != VEH_AIRCRAFT || !CheckOwnership(v->owner) || v->IsInDepot()) return CMD_ERROR;
 
-	if (v->current_order.type == OT_GOTO_DEPOT && !(p2 & DEPOT_LOCATE_HANGAR)) {
-		if (!!(p2 & DEPOT_SERVICE) == HasBit(v->current_order.flags, OF_HALT_IN_DEPOT)) {
+	if (v->current_order.IsType(OT_GOTO_DEPOT) && !(p2 & DEPOT_LOCATE_HANGAR)) {
+		bool halt_in_depot = v->current_order.GetDepotActionType() & ODATFB_HALT;
+		if (!!(p2 & DEPOT_SERVICE) == halt_in_depot) {
 			/* We called with a different DEPOT_SERVICE setting.
 			 * Now we change the setting to apply the new one and let the vehicle head for the same hangar.
 			 * Note: the if is (true for requesting service == true for ordered to stop in hangar) */
 			if (flags & DC_EXEC) {
-				ClrBit(v->current_order.flags, OF_PART_OF_ORDERS);
-				ToggleBit(v->current_order.flags, OF_HALT_IN_DEPOT);
+				v->current_order.SetDepotOrderType(ODTF_MANUAL);
+				v->current_order.SetDepotActionType(halt_in_depot ? ODATF_SERVICE_ONLY : ODATFB_HALT);
 				InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 			}
 			return CommandCost();
@@ -626,9 +626,11 @@
 
 		if (p2 & DEPOT_DONT_CANCEL) return CMD_ERROR; // Requested no cancelation of hangar orders
 		if (flags & DC_EXEC) {
-			if (v->current_order.flags & OFB_UNLOAD) v->cur_order_index++;
-			v->current_order.type = OT_DUMMY;
-			v->current_order.flags = 0;
+			/* If the orders to 'goto depot' are in the orders list (forced servicing),
+			 * then skip to the next order; effectively cancelling this forced service */
+			if (v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) v->cur_order_index++;
+
+			v->current_order.MakeDummy();
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 		}
 	} else {
@@ -646,13 +648,10 @@
 		}
 
 		if (flags & DC_EXEC) {
-			if (v->current_order.type == OT_LOADING) v->LeaveStation();
+			if (v->current_order.IsType(OT_LOADING)) v->LeaveStation();
 
-			v->current_order.type = OT_GOTO_DEPOT;
-			v->current_order.flags = OFB_NON_STOP;
-			if (!(p2 & DEPOT_SERVICE)) SetBit(v->current_order.flags, OF_HALT_IN_DEPOT);
-			v->current_order.refit_cargo = CT_INVALID;
-			v->current_order.dest = next_airport_index;
+			v->current_order.MakeGoToDepot(next_airport_index, ODTF_MANUAL);
+			if (!(p2 & DEPOT_SERVICE)) v->current_order.SetDepotActionType(ODATFB_HALT);
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 			if (v->u.air.state == FLYING && !next_airport_has_hangar) {
 				/* The aircraft is now heading for a different hangar than the next in the orders */
@@ -745,23 +744,21 @@
 
 static void CheckIfAircraftNeedsService(Vehicle *v)
 {
-	if (_patches.servint_aircraft == 0 || !VehicleNeedsService(v)) return;
+	if (_patches.servint_aircraft == 0 || !v->NeedsAutomaticServicing()) return;
 	if (v->IsInDepot()) {
 		VehicleServiceInDepot(v);
 		return;
 	}
 
-	const Station *st = GetStation(v->current_order.dest);
+	const Station *st = GetStation(v->current_order.GetDestination());
 	/* only goto depot if the target airport has terminals (eg. it is airport) */
 	if (st->IsValid() && st->airport_tile != 0 && st->Airport()->terminals != NULL) {
 //		printf("targetairport = %d, st->index = %d\n", v->u.air.targetairport, st->index);
 //		v->u.air.targetairport = st->index;
-		v->current_order.type = OT_GOTO_DEPOT;
-		v->current_order.flags = OFB_NON_STOP;
+		v->current_order.MakeGoToDepot(st->index, ODTFB_SERVICE);
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
-	} else if (v->current_order.type == OT_GOTO_DEPOT) {
-		v->current_order.type = OT_DUMMY;
-		v->current_order.flags = 0;
+	} else if (v->current_order.IsType(OT_GOTO_DEPOT)) {
+		v->current_order.MakeDummy();
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 	}
 }
@@ -822,7 +819,7 @@
 
 	/* if true, helicopter rotors do not rotate. This should only be the case if a helicopter is
 	 * loading/unloading at a terminal or stopped */
-	if (v->current_order.type == OT_LOADING || (v->vehstatus & VS_STOPPED)) {
+	if (v->current_order.IsType(OT_LOADING) || (v->vehstatus & VS_STOPPED)) {
 		if (u->cur_speed != 0) {
 			u->cur_speed++;
 			if (u->cur_speed >= 0x80 && u->u.air.state == HRS_ROTOR_MOVING_3) {
@@ -1118,7 +1115,7 @@
 		/* Jump into our "holding pattern" state machine if possible */
 		if (v->u.air.pos >= afc->num_positions) {
 			v->u.air.pos = v->u.air.previous_pos = AircraftGetEntryPoint(v, afc);
-		} else if (v->u.air.targetairport != v->current_order.dest) {
+		} else if (v->u.air.targetairport != v->current_order.GetDestination()) {
 			/* If not possible, just get out of here fast */
 			v->u.air.state = FLYING;
 			UpdateAircraftCache(v);
@@ -1414,74 +1411,48 @@
 	}
 }
 
-static void ProcessAircraftOrder(Vehicle *v)
+void HandleMissingAircraftOrders(Vehicle *v)
 {
-	switch (v->current_order.type) {
-		case OT_GOTO_DEPOT:
-			if (!(v->current_order.flags & OFB_PART_OF_ORDERS)) return;
-			if (v->current_order.flags & OFB_SERVICE_IF_NEEDED &&
-					!VehicleNeedsService(v)) {
-				UpdateVehicleTimetable(v, true);
-				v->cur_order_index++;
-			}
-			break;
+	/*
+	 * We do not have an order. This can be divided into two cases:
+	 * 1) we are heading to an invalid station. In this case we must
+	 *    find another airport to go to. If there is nowhere to go,
+	 *    we will destroy the aircraft as it otherwise will enter
+	 *    the holding pattern for the first airport, which can cause
+	 *    the plane to go into an undefined state when building an
+	 *    airport with the same StationID.
+	 * 2) we are (still) heading to a (still) valid airport, then we
+	 *    can continue going there. This can happen when you are
+	 *    changing the aircraft's orders while in-flight or in for
+	 *    example a depot. However, when we have a current order to
+	 *    go to a depot, we have to keep that order so the aircraft
+	 *    actually stops.
+	 */
+	const Station *st = GetStation(v->u.air.targetairport);
+	if (!st->IsValid() || st->airport_tile == 0) {
+		CommandCost ret;
+		PlayerID old_player = _current_player;
 
-		case OT_LOADING: return;
+		_current_player = v->owner;
+		ret = DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_SEND_AIRCRAFT_TO_HANGAR);
+		_current_player = old_player;
 
-		default: break;
+		if (CmdFailed(ret)) CrashAirplane(v);
+	} else if (!v->current_order.IsType(OT_GOTO_DEPOT)) {
+		v->current_order.Free();
+	}
+}
+
+
+TileIndex Aircraft::GetOrderStationLocation(StationID station)
+{
+	/* Orders are changed in flight, ensure going to the right station. */
+	if (this->u.air.state == FLYING) {
+		AircraftNextAirportPos_and_Order(this);
 	}
 
-	if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0;
-
-	const Order *order = GetVehicleOrder(v, v->cur_order_index);
-
-	if (order == NULL|| (order->type == OT_DUMMY && !CheckForValidOrders(v))) {
-		/*
-		 * We do not have an order. This can be divided into two cases:
-		 * 1) we are heading to an invalid station. In this case we must
-		 *    find another airport to go to. If there is nowhere to go,
-		 *    we will destroy the aircraft as it otherwise will enter
-		 *    the holding pattern for the first airport, which can cause
-		 *    the plane to go into an undefined state when building an
-		 *    airport with the same StationID.
-		 * 2) we are (still) heading to a (still) valid airport, then we
-		 *    can continue going there. This can happen when you are
-		 *    changing the aircraft's orders while in-flight or in for
-		 *    example a depot. However, when we have a current order to
-		 *    go to a depot, we have to keep that order so the aircraft
-		 *    actually stops.
-		 */
-		const Station *st = GetStation(v->u.air.targetairport);
-		if (!st->IsValid() || st->airport_tile == 0) {
-			CommandCost ret;
-			PlayerID old_player = _current_player;
-
-			_current_player = v->owner;
-			ret = DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_SEND_AIRCRAFT_TO_HANGAR);
-			_current_player = old_player;
-
-			if (CmdFailed(ret)) CrashAirplane(v);
-		} else if (v->current_order.type != OT_GOTO_DEPOT) {
-			v->current_order.Free();
-		}
-		return;
-	}
-
-	if (order->type  == v->current_order.type  &&
-			order->flags == v->current_order.flags &&
-			order->dest  == v->current_order.dest)
-		return;
-
-	v->current_order = *order;
-
-	/* orders are changed in flight, ensure going to the right station */
-	if (order->type == OT_GOTO_STATION && v->u.air.state == FLYING) {
-		AircraftNextAirportPos_and_Order(v);
-	}
-
-	InvalidateVehicleOrder(v);
-
-	InvalidateWindowClasses(WC_AIRCRAFT_LIST);
+	/* Aircraft do not use dest-tile */
+	return 0;
 }
 
 void Aircraft::MarkDirty()
@@ -1517,7 +1488,7 @@
 
 	SetDParam(1, st->index);
 	AddNewsItem(newsitem,
-		NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0),
+		NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
 		v->index,
 		0);
 
@@ -1550,22 +1521,19 @@
 /** we've landed and just arrived at a terminal */
 static void AircraftEntersTerminal(Vehicle *v)
 {
-	if (v->current_order.type == OT_GOTO_DEPOT) return;
+	if (v->current_order.IsType(OT_GOTO_DEPOT)) return;
 
 	Station *st = GetStation(v->u.air.targetairport);
 	v->last_station_visited = v->u.air.targetairport;
 
 	/* Check if station was ever visited before */
 	if (!(st->had_vehicle_of_type & HVOT_AIRCRAFT)) {
-		uint32 flags;
-
 		st->had_vehicle_of_type |= HVOT_AIRCRAFT;
 		SetDParam(0, st->index);
 		/* show newsitem of celebrating citizens */
-		flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
 		AddNewsItem(
 			STR_A033_CITIZENS_CELEBRATE_FIRST,
-			flags,
+			NM_THIN, NF_VIEWPORT | NF_VEHICLE, (v->owner == _local_player) ? NT_ARRIVAL_PLAYER : NT_ARRIVAL_OTHER, DNC_NONE,
 			v->index,
 			0);
 	}
@@ -1587,9 +1555,9 @@
 /** set the right pos when heading to other airports after takeoff */
 static void AircraftNextAirportPos_and_Order(Vehicle *v)
 {
-	if (v->current_order.type == OT_GOTO_STATION ||
-			v->current_order.type == OT_GOTO_DEPOT)
-		v->u.air.targetairport = v->current_order.dest;
+	if (v->current_order.IsType(OT_GOTO_STATION) ||
+			v->current_order.IsType(OT_GOTO_DEPOT))
+		v->u.air.targetairport = v->current_order.GetDestination();
 
 	const AirportFTAClass *apc = GetStation(v->u.air.targetairport)->Airport();
 	v->u.air.pos = v->u.air.previous_pos = AircraftGetEntryPoint(v, apc);
@@ -1751,13 +1719,13 @@
 	}
 
 	/* if we were sent to the depot, stay there */
-	if (v->current_order.type == OT_GOTO_DEPOT && (v->vehstatus & VS_STOPPED)) {
+	if (v->current_order.IsType(OT_GOTO_DEPOT) && (v->vehstatus & VS_STOPPED)) {
 		v->current_order.Free();
 		return;
 	}
 
-	if (v->current_order.type != OT_GOTO_STATION &&
-			v->current_order.type != OT_GOTO_DEPOT)
+	if (!v->current_order.IsType(OT_GOTO_STATION) &&
+			!v->current_order.IsType(OT_GOTO_DEPOT))
 		return;
 
 	/* if the block of the next position is busy, stay put */
@@ -1765,7 +1733,7 @@
 	if (AirportHasBlock(v, &apc->layout[v->u.air.pos], apc)) return;
 
 	/* We are already at the target airport, we need to find a terminal */
-	if (v->current_order.dest == v->u.air.targetairport) {
+	if (v->current_order.GetDestination() == v->u.air.targetairport) {
 		/* FindFreeTerminal:
 		 * 1. Find a free terminal, 2. Occupy it, 3. Set the vehicle's state to that terminal */
 		if (ChooseTerminal(v, apc)) {
@@ -1817,13 +1785,13 @@
 	/* airport-road is free. We either have to go to another airport, or to the hangar
 	 * ---> start moving */
 
-	switch (v->current_order.type) {
+	switch (v->current_order.GetType()) {
 		case OT_GOTO_STATION: // ready to fly to another airport
 			/* airplane goto state takeoff, helicopter to helitakeoff */
 			v->u.air.state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF;
 			break;
 		case OT_GOTO_DEPOT:   // visit hangar for serivicing, sale, etc.
-			if (v->current_order.dest == v->u.air.targetairport) {
+			if (v->current_order.GetDestination() == v->u.air.targetairport) {
 				v->u.air.state = HANGAR;
 			} else {
 				v->u.air.state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF;
@@ -1958,7 +1926,7 @@
 	 * 2. not going for terminal (but depot, no order),
 	 * --> get out of the way to the hangar. */
 
-	if (v->current_order.type == OT_GOTO_STATION && ChooseTerminal(v, apc)) return; // if successfully chosen, return
+	if (v->current_order.IsType(OT_GOTO_STATION) && ChooseTerminal(v, apc)) return; // if successfully chosen, return
 	v->u.air.state = (apc->num_depots != 0) ? HANGAR : TAKEOFF;
 	AirportMove(v, apc);
 
@@ -1974,7 +1942,7 @@
 	 * the reason behind this is that if an airport has a terminal, it also has a hangar. Airplanes
 	 * must go to a hangar. */
 
-	if (v->current_order.type == OT_GOTO_STATION && ChooseTerminal(v, apc)) return; // if successfully chosen, return
+	if (v->current_order.IsType(OT_GOTO_STATION) && ChooseTerminal(v, apc)) return; // if successfully chosen, return
 	v->u.air.state = (apc->num_depots != 0) ? HANGAR : HELITAKEOFF;
 	AirportMove(v, apc);
 }
@@ -2078,7 +2046,7 @@
 						v->u.air.state = current->special;
 					}
 					if (current->heading == 0x7D && v->subtype == AIR_HELICOPTER) { //choose helipad
-						if (v->current_order.type == OT_GOTO_STATION) {
+						if (v->current_order.IsType(OT_GOTO_STATION)) {
 							if (!AirportFindFreeHelipad(v, apc, current)) {
 								current = current->next;
 								continue;
@@ -2086,7 +2054,7 @@
 						}
 					}
 					if (current->heading == 0x7E && v->subtype == AIR_AIRCRAFT) { //choose terminal
-						if (v->current_order.type == OT_GOTO_STATION) {
+						if (v->current_order.IsType(OT_GOTO_STATION)) {
 							if (!AirportFindFreeTerminal(v, apc, current)) {
 								current = current->next;
 								continue;
@@ -2260,7 +2228,6 @@
 static void AircraftEventHandler(Vehicle *v, int loop)
 {
 	v->tick_counter++;
-	v->current_order_time++;
 
 	if (v->vehstatus & VS_CRASHED) {
 		HandleCrashedAircraft(v);
@@ -2279,10 +2246,10 @@
 	}
 
 	HandleAircraftSmoke(v);
-	ProcessAircraftOrder(v);
+	ProcessOrders(v);
 	v->HandleLoading(loop != 0);
 
-	if (v->current_order.type >= OT_LOADING) return;
+	if (v->current_order.IsType(OT_LOADING) || v->current_order.IsType(OT_LEAVESTATION)) return;
 
 	AirportGoToNextPosition(v);
 }
@@ -2297,6 +2264,8 @@
 
 	AgeAircraftCargo(this);
 
+	this->current_order_time++;
+
 	for (uint i = 0; i != 2; i++) {
 		AircraftEventHandler(this, i);
 		if (this->type != VEH_AIRCRAFT) // In case it was deleted
--- a/src/aircraft_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/aircraft_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -7,13 +7,13 @@
 #include "aircraft.h"
 #include "debug.h"
 #include "gui.h"
-#include "engine.h"
 #include "depot.h"
 #include "vehicle_gui.h"
 #include "newgrf_engine.h"
 #include "strings_func.h"
 #include "vehicle_func.h"
 #include "gfx_func.h"
+#include "order_func.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
--- a/src/airport_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/airport_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -4,27 +4,29 @@
 
 #include "stdafx.h"
 #include "openttd.h"
+#include "gui.h"
 #include "window_gui.h"
-#include "gui.h"
-#include "station_gui.h"
+#include "player_func.h"
 #include "terraform_gui.h"
 #include "command_func.h"
-#include "station.h"
+#include "station_gui.h"
+#include "station_func.h"
 #include "airport.h"
 #include "depot.h"
 #include "newgrf_callbacks.h"
 #include "sound_func.h"
+#include "settings_type.h"
+
+#include "strings_func.h"
+#include "core/alloc_func.hpp"
 #include "window_func.h"
-#include "settings_type.h"
 #include "viewport_func.h"
 #include "gfx_func.h"
-#include "player_func.h"
-#include "widgets/dropdown_type.h"
 #include "widgets/dropdown_func.h"
-#include "strings_func.h"
+#include "order_func.h"
 
 //TODO: remove station.h once converted to newgrf airports. stations just used as temporary loader
-#include "station.h"
+//#include "station.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -255,7 +257,8 @@
 			if (fsmportspec->layout_mask != NULL) _thd.FSMportMask = &fsmportspec->layout_mask[_airport.layout_set];  // irregular airport support
 			int rad = _patches.modified_catchment ? fsmportspec->portFSM->catchment : 4;
 			if (_station_show_coverage) SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
-			int text_end = DrawStationCoverageAreaText(2, 206, SCT_ALL, rad) + 4;
+			int text_end = DrawStationCoverageAreaText(2, 206, SCT_ALL, rad, false);
+			text_end = DrawStationCoverageAreaText(2, text_end + 4, SCT_ALL, rad, true) + 4;
 			if (text_end > w->widget[BAPW_BACKGROUND].bottom) {
 				SetWindowDirty(w);
 				ResizeWindowForWidget(w, BAPW_BACKGROUND, 0, text_end - w->widget[BAPW_BACKGROUND].bottom);
--- a/src/articulated_vehicles.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/articulated_vehicles.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -5,7 +5,6 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "articulated_vehicles.h"
-#include "engine.h"
 #include "train.h"
 #include "roadveh.h"
 #include "newgrf_callbacks.h"
--- a/src/articulated_vehicles.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/articulated_vehicles.h	Tue Apr 15 00:47:19 2008 +0000
@@ -6,6 +6,7 @@
 #define ARTICULATED_VEHICLES_H
 
 #include "vehicle_type.h"
+#include "engine_type.h"
 
 uint CountArticulatedParts(EngineID engine_type, bool purchase_window);
 uint16 *GetCapacityOfArticulatedParts(EngineID engine, VehicleType type);
--- a/src/autoreplace_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/autoreplace_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -4,9 +4,8 @@
 #include "openttd.h"
 #include "roadveh.h"
 #include "ship.h"
-#include "news.h"
+#include "news_func.h"
 #include "player_func.h"
-#include "engine.h"
 #include "debug.h"
 #include "vehicle_gui.h"
 #include "depot.h"
@@ -14,7 +13,6 @@
 #include "aircraft.h"
 #include "cargotype.h"
 #include "group.h"
-#include "order.h"
 #include "strings_func.h"
 #include "command_func.h"
 #include "vehicle_func.h"
@@ -73,9 +71,9 @@
 	}
 
 	FOR_VEHICLE_ORDERS(u, o) {
-		if (!(o->refit_cargo < NUM_CARGO)) continue;
-		if (!CanRefitTo(v->engine_type, o->refit_cargo)) continue;
-		if (!CanRefitTo(engine_type, o->refit_cargo)) return false;
+		if (!o->IsRefit()) continue;
+		if (!CanRefitTo(v->engine_type, o->GetRefitCargo())) continue;
+		if (!CanRefitTo(engine_type, o->GetRefitCargo())) return false;
 	}
 
 	return true;
@@ -199,12 +197,21 @@
 			 */
 			/* Get the vehicle in front of the one we move out */
 			Vehicle *front = old_v->Previous();
-			/* If the vehicle in front is the rear end of a dualheaded engine, then we need to use the one in front of that one */
-			if (IsRearDualheaded(front)) front = front->Previous();
-			/* Now we move the old one out of the train */
-			DoCommand(0, (INVALID_VEHICLE << 16) | old_v->index, 0, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
-			/* Add the new vehicle */
-			DoCommand(0, (front->index << 16) | new_v->index, 1, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
+			if (front == NULL) {
+				/* It would appear that we have the front wagon of a row of wagons without engines */
+				Vehicle *next = old_v->Next();
+				if (next != NULL) {
+					/* Move the chain to the new front wagon */
+					DoCommand(0, (new_v->index << 16) | next->index, 1, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
+				}
+			} else {
+				/* If the vehicle in front is the rear end of a dualheaded engine, then we need to use the one in front of that one */
+				if (IsRearDualheaded(front)) front = front->Previous();
+				/* Now we move the old one out of the train */
+				DoCommand(0, (INVALID_VEHICLE << 16) | old_v->index, 0, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
+				/* Add the new vehicle */
+				DoCommand(0, (front->index << 16) | new_v->index, 1, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
+			}
 		} else {
 			// copy/clone the orders
 			DoCommand(0, (old_v->index << 16) | new_v->index, old_v->IsOrderListShared() ? CO_SHARE : CO_COPY, DC_EXEC, CMD_CLONE_ORDER);
@@ -368,7 +375,7 @@
 					default: NOT_REACHED(); message = 0; break;
 				}
 
-				AddNewsItem(message, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
+				AddNewsItem(message, NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, DNC_NONE, v->index, 0);
 			}
 			if (stopped) v->vehstatus &= ~VS_STOPPED;
 			if (display_costs) _current_player = OWNER_NONE;
@@ -399,7 +406,7 @@
 			if (w == NULL) {
 				// we failed to make the train short enough
 				SetDParam(0, v->unitnumber);
-				AddNewsItem(STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
+				AddNewsItem(STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT, NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE, v->index, 0);
 				break;
 			}
 			temp = w;
--- a/src/autoreplace_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/autoreplace_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -19,10 +19,24 @@
 #include "gfx_func.h"
 #include "player_func.h"
 #include "widgets/dropdown_func.h"
+#include "engine_func.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
 
+struct replaceveh_d {
+	byte sel_index[2];
+	EngineID sel_engine[2];
+	uint16 count[2];
+	bool wagon_btnstate; ///< true means engine is selected
+	EngineList list[2];
+	bool update_left;
+	bool update_right;
+	bool init_lists;
+	GroupID sel_group;
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(replaceveh_d));
+
 static RailType _railtype_selected_in_replace_gui;
 
 static bool _rebuild_left_list;
--- a/src/build_vehicle_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/build_vehicle_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -12,9 +12,7 @@
 #include "gui.h"
 #include "articulated_vehicles.h"
 #include "textbuf_gui.h"
-#include "station.h"
 #include "command_func.h"
-#include "engine.h"
 #include "player_func.h"
 #include "depot.h"
 #include "airport.h"
--- a/src/cargopacket.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/cargopacket.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -4,9 +4,10 @@
 
 #include "stdafx.h"
 #include "openttd.h"
-#include "station.h"
+#include "station_base.h"
 #include "cargopacket.h"
 #include "saveload.h"
+#include "oldpool_func.h"
 
 /* Initialize the cargopacket-pool */
 DEFINE_OLD_POOL_GENERIC(CargoPacket, CargoPacket)
--- a/src/cargopacket.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/cargopacket.h	Tue Apr 15 00:47:19 2008 +0000
@@ -5,8 +5,10 @@
 #ifndef CARGOPACKET_H
 #define CARGOPACKET_H
 
+#include "oldpool.h"
 #include "economy_type.h"
 #include "tile_type.h"
+#include "station_type.h"
 #include <list>
 
 typedef uint32 CargoPacketID;
--- a/src/cargotype.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/cargotype.h	Tue Apr 15 00:47:19 2008 +0000
@@ -59,6 +59,8 @@
 void SetupCargoForClimate(LandscapeID l);
 /* Retrieve cargo details for the given cargo ID */
 const CargoSpec *GetCargo(CargoID c);
+/* Get the cargo icon for a given cargo ID */
+SpriteID GetCargoSprite(CargoID i);
 /* Get the cargo ID with the cargo label */
 CargoID GetCargoIDByLabel(CargoLabel cl);
 CargoID GetCargoIDByBitnum(uint8 bitnum);
--- a/src/command.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/command.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -542,12 +542,16 @@
 	 * fact will trigger an assertion failure. --pasky
 	 * CMD_CLONE_VEHICLE: Both building new vehicles and refitting them can be
 	 * influenced by newgrf callbacks, which makes it impossible to accurately
-	 * estimate the cost of cloning a vehicle. */
+	 * estimate the cost of cloning a vehicle.
+	 * CMD_DEPOT_MASS_AUTOREPLACE: we can't predict wagon removal so
+	 * the test will not include income from any sold wagons.
+	 * This means that the costs can sometimes be lower than estimated. */
 	notest =
 		(cmd & 0xFF) == CMD_CLEAR_AREA ||
 		(cmd & 0xFF) == CMD_LEVEL_LAND ||
 		(cmd & 0xFF) == CMD_REMOVE_LONG_ROAD ||
-		(cmd & 0xFF) == CMD_CLONE_VEHICLE;
+		(cmd & 0xFF) == CMD_CLONE_VEHICLE    ||
+		(cmd & 0xFF) == CMD_DEPOT_MASS_AUTOREPLACE;
 
 	_docommand_recursive = 1;
 
@@ -675,41 +679,3 @@
 	}
 	return *this;
 }
-
-CommandCost CommandCost::AddCost(Money cost)
-{
-	this->cost += cost;
-	return *this;
-}
-
-CommandCost CommandCost::MultiplyCost(int factor)
-{
-	this->cost *= factor;
-	return *this;
-}
-
-Money CommandCost::GetCost() const
-{
-	return this->cost;
-}
-
-ExpensesType CommandCost::GetExpensesType() const
-{
-	return this->expense_type;
-}
-
-void CommandCost::SetGlobalErrorMessage() const
-{
-	extern StringID _error_message;
-	if (this->message != INVALID_STRING_ID) _error_message = this->message;
-}
-
-bool CommandCost::Succeeded() const
-{
-	return this->success;
-}
-
-bool CommandCost::Failed() const
-{
-	return !this->success;
-}
--- a/src/command_type.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/command_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -56,43 +56,67 @@
 	 * @param cost the cost to add
 	 * @return this class.
 	 */
-	CommandCost AddCost(Money cost);
+	CommandCost AddCost(Money cost)
+	{
+		this->cost += cost;
+		return *this;
+	}
 
 	/**
 	 * Multiplies the cost of the command by the given factor.
 	 * @param cost factor to multiply the costs with
 	 * @return this class
 	 */
-	CommandCost MultiplyCost(int factor);
+	CommandCost MultiplyCost(int factor)
+	{
+		this->cost *= factor;
+		return *this;
+	}
 
 	/**
 	 * The costs as made up to this moment
 	 * @return the costs
 	 */
-	Money GetCost() const;
+	Money GetCost() const
+	{
+		return this->cost;
+	}
 
 	/**
 	 * The expense type of the cost
 	 * @return the expense type
 	 */
-	ExpensesType GetExpensesType() const;
+	ExpensesType GetExpensesType() const
+	{
+		return this->expense_type;
+	}
 
 	/**
 	 * Sets the global error message *if* this class has one.
 	 */
-	void SetGlobalErrorMessage() const;
+	void SetGlobalErrorMessage() const
+	{
+		extern StringID _error_message;
+		if (this->message != INVALID_STRING_ID) _error_message = this->message;
+	}
 
 	/**
 	 * Did this command succeed?
 	 * @return true if and only if it succeeded
 	 */
-	bool Succeeded() const;
+	bool Succeeded() const
+	{
+		return this->success;
+	}
 
 	/**
 	 * Did this command fail?
 	 * @return true if and only if it failed
 	 */
-	bool Failed() const;
+	bool Failed() const
+	{
+		return !this->success;
+	}
 };
 
 /**
--- a/src/console_cmds.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/console_cmds.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -6,7 +6,7 @@
 #include "openttd.h"
 #include "console.h"
 #include "debug.h"
-#include "engine.h"
+#include "engine_func.h"
 #include "landscape.h"
 #include "saveload.h"
 #include "variables.h"
@@ -18,7 +18,6 @@
 #include "settings_func.h"
 #include "fios.h"
 #include "fileio.h"
-#include "station.h"
 #include "screenshot.h"
 #include "genworld.h"
 #include "network/network.h"
--- a/src/core/alloc_func.hpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/core/alloc_func.hpp	Tue Apr 15 00:47:19 2008 +0000
@@ -107,9 +107,11 @@
 #else
 	/** Storing it on the heap */
 	T *data;
+	/** The length (in elements) of data in this allocator. */
+	size_t len;
 
 	/** Allocating the memory */
-	SmallStackSafeStackAlloc() : data(MallocT<T>(length)) {}
+	SmallStackSafeStackAlloc() : data(MallocT<T>(length)), len(length) {}
 	/** And freeing when it goes out of scope */
 	~SmallStackSafeStackAlloc() { free(data); }
 #endif
@@ -118,7 +120,26 @@
 	 * Gets a pointer to the data stored in this wrapper.
 	 * @return the pointer.
 	 */
-	operator T* () { return data; }
+	inline operator T* () { return data; }
+
+	/**
+	 * Gets a pointer to the data stored in this wrapper.
+	 * @return the pointer.
+	 */
+	inline T* operator -> () { return data; }
+
+	/**
+	 * Gets a pointer to the last data element stored in this wrapper.
+	 * @note needed because endof does not work properly for pointers.
+	 * @return the 'endof' pointer.
+	 */
+	inline T* EndOf() {
+#if !defined(__NDS__)
+		return endof(data);
+#else
+		return &data[len];
+#endif
+	}
 };
 
 #endif /* ALLOC_FUNC_HPP */
--- a/src/core/math_func.hpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/core/math_func.hpp	Tue Apr 15 00:47:19 2008 +0000
@@ -163,13 +163,13 @@
  */
 static inline int32 ClampToI32(const int64 a)
 {
-	if (a <= (int32)0x80000000) return 0x80000000;
-	if (a >= (int32)0x7FFFFFFF) return 0x7FFFFFFF;
+	if (a <= INT32_MIN) return INT32_MIN;
+	if (a >= INT32_MAX) return INT32_MAX;
 	return (int32)a;
 }
 
 /**
- * Reduce an usigned 64-bit int to an unsigned 16-bit one
+ * Reduce an unsigned 64-bit int to an unsigned 16-bit one
  *
  * @param a The 64-bit value to clamp
  * @return The 64-bit value reduced to a 16-bit value
@@ -177,7 +177,7 @@
  */
 static inline uint16 ClampToU16(const uint64 a)
 {
-	return min(a, 0xFFFF);
+	return (uint16)(a <= UINT16_MAX ? a : UINT16_MAX);
 }
 
 /**
--- a/src/core/random_func.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/core/random_func.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -28,101 +28,6 @@
 	this->state[1] = seed;
 }
 
-#ifdef MERSENNE_TWISTER
-// Source code for Mersenne Twister.
-// A Random number generator with much higher quality random numbers.
-
-#define N              (624)                 // length of _mt_state vector
-#define M              (397)                 // a period parameter
-#define K              (0x9908B0DFU)         // a magic constant
-#define hiBit(u)       ((u) & 0x80000000U)   // mask all but highest   bit of u
-#define loBit(u)       ((u) & 0x00000001U)   // mask all but lowest    bit of u
-#define loBits(u)      ((u) & 0x7FFFFFFFU)   // mask     the highest   bit of u
-#define mixBits(u, v)  (hiBit(u)|loBits(v))  // move hi bit of u to hi bit of v
-
-static uint32 _mt_state[N+1];     // _mt_state vector + 1 extra to not violate ANSI C
-static uint32 *_mt_next;          // _mt_next random value is computed from here
-static int    _mt_left = -1;      // can *_mt_next++ this many times before reloading
-
-void SetRandomSeed(register uint32 seed)
-{
-	register uint32 *s = _mt_state;
-	_mt_left = 0;
-
-	seed |= 1U;
-	seed &= 0xFFFFFFFFU;
-
-	*s = seed;
-
-	for (register uint i = N; i != 0; i--) {
-		seed *= 69069U;
-		*s++;
-		*s = seed & 0xFFFFFFFFU;
-	}
-}
-
-static uint32 ReloadRandom()
-{
-	if (_mt_left < -1) SetRandomSeed(4357U);
-
-	_mt_left = N - 1;
-	_mt_next = _mt_state + 1;
-
-	register uint32 *p0 = _mt_state;
-	register uint32 *p2 = _mt_state + 2;
-	register uint32 *pM = _mt_state + M;
-
-	register uint32 s0 = _mt_state[0];
-	register uint32 s1 = _mt_state[1];
-
-	register uint i = 0;
-
-	for (i = (N - M + 1); i != 0; i--) {
-		s0 = s1;
-		s1 = *p2;
-		*p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
-		*p0++;
-		*p2++;
-		*pM++;
-	}
-
-	pM = _mt_state;
-
-	for (i = M; i != 0; i--) {
-		s0 = s1;
-		s1 = *p2;
-		*p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
-		*p0++;
-		*p2++;
-		*pM++;
-	}
-
-	s1 = _mt_state[0];
-	*p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
-
-	s1 ^= (s1 >> 11);
-	s1 ^= (s1 <<  7) & 0x9D2C5680U;
-	s1 ^= (s1 << 15) & 0xEFC60000U;
-	s1 ^= (s1 >> 18);
-	return s1;
-}
-
-uint32 Random()
-{
-	_mt_left--;
-	if (_mt_left < 0) return ReloadRandom();
-
-	uint32 y = *_mt_next;
-	*_mt_next++;
-
-	y ^= (y >> 11);
-	y ^= (y <<  7) & 0x9D2C5680U;
-	y ^= (y << 15) & 0xEFC60000U;
-	y ^= (y >> 18);
-	return y;
-}
-
-#else /* MERSENNE_TWISTER */
 void SetRandomSeed(uint32 seed)
 {
 	_random.SetSeed(seed);
@@ -142,12 +47,9 @@
 
 	return _random.Next();
 }
-#endif /* RANDOM_DEBUG */
-#endif /* MERSENNE_TWISTER */
 
-#if defined(RANDOM_DEBUG) && !defined(MERSENNE_TWISTER)
 uint DoRandomRange(uint max, int line, const char *file)
 {
 	return GB(DoRandom(line, file), 0, 16) * max >> 16;
 }
-#endif /* RANDOM_DEBUG & !MERSENNE_TWISTER */
+#endif /* RANDOM_DEBUG */
--- a/src/core/random_func.hpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/core/random_func.hpp	Tue Apr 15 00:47:19 2008 +0000
@@ -23,10 +23,6 @@
 //#define RANDOM_DEBUG
 
 
-// Enable this to produce higher quality random numbers.
-// Doesn't work with network yet.
-// #define MERSENNE_TWISTER
-
 /**
  * Structure to encapsulate the pseudo random number generators.
  */
--- a/src/currency.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/currency.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -5,7 +5,7 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "currency.h"
-#include "news.h"
+#include "news_func.h"
 #include "settings_type.h"
 #include "date_func.h"
 
@@ -154,7 +154,7 @@
 			_currency_specs[_opt.currency].to_euro != CF_ISEURO &&
 			_cur_year >= _currency_specs[_opt.currency].to_euro) {
 		_opt.currency = 2; // this is the index of euro above.
-		AddNewsItem(STR_EURO_INTRODUCE, NEWS_FLAGS(NM_NORMAL, 0, NT_ECONOMY, 0), 0, 0);
+		AddNewsItem(STR_EURO_INTRODUCE, NM_NORMAL, NF_NONE, NT_ECONOMY, DNC_NONE, 0, 0);
 	}
 }
 
--- a/src/date.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/date.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -15,6 +15,7 @@
 #include "date_func.h"
 #include "vehicle_base.h"
 #include "debug.h"
+#include "rail_gui.h"
 #ifdef DEBUG_DUMP_COMMANDS
 #include "saveload.h"
 #endif
@@ -282,6 +283,8 @@
 	ShipsYearlyLoop();
 	if (_network_server) NetworkServerYearlyLoop();
 
+	if (_cur_year == _patches.semaphore_build_before) ResetSignalVariant();
+
 	/* check if we reached end of the game */
 	if (_cur_year == _patches.ending_year) {
 			ShowEndGameChart();
--- a/src/depot.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/depot.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -7,8 +7,9 @@
 #include "depot.h"
 #include "landscape.h"
 #include "saveload.h"
-#include "order.h"
+#include "order_func.h"
 #include "window_func.h"
+#include "oldpool_func.h"
 
 #include "table/strings.h"
 
--- a/src/depot.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/depot.h	Tue Apr 15 00:47:19 2008 +0000
@@ -6,13 +6,13 @@
 #define DEPOT_H
 
 #include "direction_type.h"
+#include "depot_type.h"
 #include "oldpool.h"
 #include "road_map.h"
 #include "rail_map.h"
 #include "water_map.h"
 #include "station_map.h"
 
-struct Depot;
 DECLARE_OLD_POOL(Depot, Depot, 3, 8000)
 
 struct Depot : PoolItem<Depot, DepotID, &_Depot_pool> {
--- a/src/depot_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/depot_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -22,6 +22,7 @@
 #include "window_func.h"
 #include "vehicle_func.h"
 #include "player_func.h"
+#include "order_func.h"
 
 #include "table/strings.h"
 #include "table/sprites.h"
@@ -440,6 +441,7 @@
 				WP(w, depot_d).sel = v->index;
 				SetWindowDirty(w);
 				SetObjectToPlaceWnd(image, GetVehiclePalette(v), VHM_DRAG, w);
+				_cursor.vehchain = _ctrl_pressed;
 			}
 			}
 			break;
@@ -956,6 +958,7 @@
 					WP(w, depot_d).sel = INVALID_VEHICLE;
 					SetWindowDirty(w);
 			}
+			_cursor.vehchain = false;
 			break;
 
 		case WE_RESIZE:
@@ -964,6 +967,13 @@
 			w->widget[DEPOT_WIDGET_MATRIX].data = (w->vscroll.cap << 8) + (WP(w, depot_d).type == VEH_TRAIN ? 1 : w->hscroll.cap);
 			ResizeDepotButtons(w);
 			break;
+
+		case WE_CTRL_CHANGED:
+			if (WP(w, depot_d).sel != INVALID_VEHICLE) {
+				_cursor.vehchain = _ctrl_pressed;
+				w->InvalidateWidget(DEPOT_WIDGET_MATRIX);
+			}
+			break;
 	}
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/depot_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,11 @@
+/* $Id$ */
+
+/** @file depot_type.h Header files for depots (not hangars) */
+
+#ifndef DEPOT_TYPE_H
+#define DEPOT_TYPE_H
+
+typedef uint16 DepotID;
+struct Depot;
+
+#endif /* DEPOT_TYPE_H */
--- a/src/disaster_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/disaster_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -24,8 +24,8 @@
 #include "station_map.h"
 #include "command_func.h"
 #include "tile_cmd.h"
-#include "news.h"
-#include "station.h"
+#include "news_func.h"
+#include "station_base.h"
 #include "waypoint.h"
 #include "town.h"
 #include "industry.h"
@@ -209,34 +209,34 @@
 
 	v->tick_counter++;
 
-	if (v->current_order.dest < 2) {
+	if (v->current_order.GetDestination() < 2) {
 		if (HasBit(v->tick_counter, 0)) return;
 
 		GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 
 		SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 
-		if (v->current_order.dest == 1) {
+		if (v->current_order.GetDestination() == 1) {
 			if (++v->age == 38) {
-				v->current_order.dest = 2;
+				v->current_order.SetDestination(2);
 				v->age = 0;
 			}
 
 			if (GB(v->tick_counter, 0, 3) == 0) CreateEffectVehicleRel(v, 0, -17, 2, EV_SMOKE);
 
-		} else if (v->current_order.dest == 0) {
+		} else if (v->current_order.GetDestination() == 0) {
 			tile = v->tile;
 
 			if (IsValidTile(tile) &&
 					IsTileType(tile, MP_STATION) &&
 					IsAirport(tile) &&
 					IsHumanPlayer(GetTileOwner(tile))) {
-				v->current_order.dest = 1;
+				v->current_order.SetDestination(1);
 				v->age = 0;
 
 				SetDParam(0, GetStationIndex(tile));
 				AddNewsItem(STR_B000_ZEPPELIN_DISASTER_AT,
-					NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
+					NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
 					v->index,
 					0);
 			}
@@ -246,7 +246,7 @@
 		return;
 	}
 
-	if (v->current_order.dest > 2) {
+	if (v->current_order.GetDestination() > 2) {
 		if (++v->age <= 13320) return;
 
 		tile = v->tile;
@@ -287,7 +287,7 @@
 				EV_EXPLOSION_SMALL);
 		}
 	} else if (v->age == 350) {
-		v->current_order.dest = 3;
+		v->current_order.SetDestination(3);
 		v->age = 0;
 	}
 
@@ -315,7 +315,7 @@
 
 	v->u.disaster.image_override = (HasBit(++v->tick_counter, 3)) ? SPR_UFO_SMALL_SCOUT_DARKER : SPR_UFO_SMALL_SCOUT;
 
-	if (v->current_order.dest == 0) {
+	if (v->current_order.GetDestination() == 0) {
 		/* Fly around randomly */
 		int x = TileX(v->dest_tile) * TILE_SIZE;
 		int y = TileY(v->dest_tile) * TILE_SIZE;
@@ -329,7 +329,7 @@
 			v->dest_tile = RandomTile();
 			return;
 		}
-		v->current_order.dest = 1;
+		v->current_order.SetDestination(1);
 
 		FOR_ALL_VEHICLES(u) {
 			if (u->type == VEH_ROAD && IsHumanPlayer(u->owner)) {
@@ -369,7 +369,7 @@
 				u->vehstatus |= VS_CRASHED;
 
 				AddNewsItem(STR_B001_ROAD_VEHICLE_DESTROYED,
-					NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
+					NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
 					u->index,
 					0);
 			}
@@ -408,7 +408,7 @@
 {
 	v->tick_counter++;
 	v->u.disaster.image_override =
-		(v->current_order.dest == 1 && HasBit(v->tick_counter, 2)) ? SPR_F_15_FIRING : 0;
+		(v->current_order.GetDestination() == 1 && HasBit(v->tick_counter, 2)) ? SPR_F_15_FIRING : 0;
 
 	GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 	SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
@@ -418,7 +418,7 @@
 		return;
 	}
 
-	if (v->current_order.dest == 2) {
+	if (v->current_order.GetDestination() == 2) {
 		if (GB(v->tick_counter, 0, 2) == 0) {
 			Industry *i = GetIndustry(v->dest_tile);
 			int x = TileX(i->xy) * TILE_SIZE;
@@ -431,23 +431,23 @@
 				GB(r, 12, 4),
 				EV_EXPLOSION_SMALL);
 
-			if (++v->age >= 55) v->current_order.dest = 3;
+			if (++v->age >= 55) v->current_order.SetDestination(3);
 		}
-	} else if (v->current_order.dest == 1) {
+	} else if (v->current_order.GetDestination() == 1) {
 		if (++v->age == 112) {
 			Industry *i;
 
-			v->current_order.dest = 2;
+			v->current_order.SetDestination(2);
 			v->age = 0;
 
 			i = GetIndustry(v->dest_tile);
 			DestructIndustry(i);
 
 			SetDParam(0, i->town->index);
-			AddNewsItem(STR_B002_OIL_REFINERY_EXPLOSION, NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0), i->xy, 0);
+			AddNewsItem(STR_B002_OIL_REFINERY_EXPLOSION, NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, DNC_NONE, i->xy, 0);
 			SndPlayTileFx(SND_12_EXPLOSION, i->xy);
 		}
-	} else if (v->current_order.dest == 0) {
+	} else if (v->current_order.GetDestination() == 0) {
 		int x, y;
 		TileIndex tile;
 		uint ind;
@@ -464,7 +464,7 @@
 		v->dest_tile = ind;
 
 		if (GetIndustrySpec(GetIndustry(ind)->type)->behaviour & INDUSTRYBEH_AIRPLANE_ATTACKS) {
-			v->current_order.dest = 1;
+			v->current_order.SetDestination(1);
 			v->age = 0;
 		}
 	}
@@ -481,7 +481,7 @@
 {
 	v->tick_counter++;
 	v->u.disaster.image_override =
-		(v->current_order.dest == 1 && HasBit(v->tick_counter, 2)) ? SPR_AH_64A_FIRING : 0;
+		(v->current_order.GetDestination() == 1 && HasBit(v->tick_counter, 2)) ? SPR_AH_64A_FIRING : 0;
 
 	GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 	SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
@@ -491,7 +491,7 @@
 		return;
 	}
 
-	if (v->current_order.dest == 2) {
+	if (v->current_order.GetDestination() == 2) {
 		if (GB(v->tick_counter, 0, 2) == 0) {
 			Industry *i = GetIndustry(v->dest_tile);
 			int x = TileX(i->xy) * TILE_SIZE;
@@ -504,23 +504,23 @@
 				GB(r, 12, 4),
 				EV_EXPLOSION_SMALL);
 
-			if (++v->age >= 55) v->current_order.dest = 3;
+			if (++v->age >= 55) v->current_order.SetDestination(3);
 		}
-	} else if (v->current_order.dest == 1) {
+	} else if (v->current_order.GetDestination() == 1) {
 		if (++v->age == 112) {
 			Industry *i;
 
-			v->current_order.dest = 2;
+			v->current_order.SetDestination(2);
 			v->age = 0;
 
 			i = GetIndustry(v->dest_tile);
 			DestructIndustry(i);
 
 			SetDParam(0, i->town->index);
-			AddNewsItem(STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS, NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0), i->xy, 0);
+			AddNewsItem(STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS, NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, DNC_NONE, i->xy, 0);
 			SndPlayTileFx(SND_12_EXPLOSION, i->xy);
 		}
-	} else if (v->current_order.dest == 0) {
+	} else if (v->current_order.GetDestination() == 0) {
 		int x, y;
 		TileIndex tile;
 		uint ind;
@@ -537,7 +537,7 @@
 		v->dest_tile = ind;
 
 		if (GetIndustrySpec(GetIndustry(ind)->type)->behaviour & INDUSTRYBEH_CHOPPER_ATTACKS) {
-			v->current_order.dest = 1;
+			v->current_order.SetDestination(1);
 			v->age = 0;
 		}
 	}
@@ -571,7 +571,7 @@
 
 	v->tick_counter++;
 
-	if (v->current_order.dest == 1) {
+	if (v->current_order.GetDestination() == 1) {
 		int x = TileX(v->dest_tile) * TILE_SIZE + TILE_SIZE / 2;
 		int y = TileY(v->dest_tile) * TILE_SIZE + TILE_SIZE / 2;
 		if (Delta(v->x_pos, x) + Delta(v->y_pos, y) >= 8) {
@@ -588,7 +588,7 @@
 			return;
 		}
 
-		v->current_order.dest = 2;
+		v->current_order.SetDestination(2);
 
 		FOR_ALL_VEHICLES(u) {
 			if (u->type == VEH_TRAIN || u->type == VEH_ROAD) {
@@ -602,7 +602,7 @@
 		t = ClosestTownFromTile(v->dest_tile, (uint)-1);
 		SetDParam(0, t->index);
 		AddNewsItem(STR_B004_UFO_LANDS_NEAR,
-			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0),
+			NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, DNC_NONE,
 			v->tile,
 			0);
 
@@ -621,7 +621,7 @@
 		u->SetNext(w);
 		InitializeDisasterVehicle(w, -6 * TILE_SIZE, v->y_pos, 0, DIR_SW, ST_Big_Ufo_Destroyer_Shadow);
 		w->vehstatus |= VS_SHADOW;
-	} else if (v->current_order.dest == 0) {
+	} else if (v->current_order.GetDestination() == 0) {
 		int x = TileX(v->dest_tile) * TILE_SIZE;
 		int y = TileY(v->dest_tile) * TILE_SIZE;
 		if (Delta(x, v->x_pos) + Delta(y, v->y_pos) >= TILE_SIZE) {
@@ -635,7 +635,7 @@
 			v->dest_tile = RandomTile();
 			return;
 		}
-		v->current_order.dest = 1;
+		v->current_order.SetDestination(1);
 
 		tile_org = tile = RandomTile();
 		do {
@@ -672,10 +672,10 @@
 		return;
 	}
 
-	if (v->current_order.dest == 0) {
+	if (v->current_order.GetDestination() == 0) {
 		u = GetVehicle(v->u.disaster.big_ufo_destroyer_target);
 		if (Delta(v->x_pos, u->x_pos) > TILE_SIZE) return;
-		v->current_order.dest = 1;
+		v->current_order.SetDestination(1);
 
 		CreateEffectVehicleRel(u, 0, 7, 8, EV_EXPLOSION_LARGE);
 		SndPlayVehicleFx(SND_12_EXPLOSION, u);
@@ -980,7 +980,7 @@
 			if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_CAN_SUBSIDENCE) && --index < 0) {
 				SetDParam(0, i->town->index);
 				AddNewsItem(STR_B005_COAL_MINE_SUBSIDENCE_LEAVES,
-					NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0), i->xy + TileDiffXY(1, 1), 0);
+					NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, DNC_NONE, i->xy + TileDiffXY(1, 1), 0);
 
 				{
 					TileIndex tile = i->xy;
@@ -1064,7 +1064,7 @@
 {
 	this->x_offs        = -1;
 	this->y_offs        = -1;
-	this->sprite_width  =  2;
-	this->sprite_height =  2;
-	this->z_height      =  5;
+	this->x_extent      =  2;
+	this->y_extent      =  2;
+	this->z_extent      =  5;
 }
--- a/src/dock_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/dock_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -5,7 +5,7 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "tile_map.h"
-#include "station.h"
+#include "station_type.h"
 #include "gui.h"
 #include "terraform_gui.h"
 #include "window_gui.h"
@@ -259,8 +259,9 @@
 
 		if (_station_show_coverage) SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
 
-		int text_end = DrawStationCoverageAreaText(4, 50, SCT_ALL, rad) + 4;
-		if (text_end > w->widget[2].bottom) {
+		int text_end = DrawStationCoverageAreaText(4, 50, SCT_ALL, rad, false);
+		text_end = DrawStationCoverageAreaText(4, text_end + 4, SCT_ALL, rad, true) + 4;
+		if (text_end != w->widget[2].bottom) {
 			SetWindowDirty(w);
 			ResizeWindowForWidget(w, 2, 0, text_end - w->widget[2].bottom);
 			SetWindowDirty(w);
--- a/src/driver.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/driver.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -53,3 +53,137 @@
 	const char* p = GetDriverParam(parm, name);
 	return p != NULL ? atoi(p) : def;
 }
+
+/**
+ * Find the requested driver and return its class.
+ * @param name the driver to select.
+ * @post Sets the driver so GetCurrentDriver() returns it too.
+ */
+const Driver *DriverFactoryBase::SelectDriver(const char *name, Driver::Type type)
+{
+	if (GetDrivers().size() == 0) return NULL;
+
+	if (*name == '\0') {
+		/* Probe for this driver */
+		for (int priority = 10; priority >= 0; priority--) {
+			Drivers::iterator it = GetDrivers().begin();
+			for (; it != GetDrivers().end(); ++it) {
+				DriverFactoryBase *d = (*it).second;
+
+				/* Check driver type */
+				if (d->type != type) continue;
+				if (d->priority != priority) continue;
+
+				Driver *newd = d->CreateInstance();
+				const char *err = newd->Start(NULL);
+				if (err == NULL) {
+					DEBUG(driver, 1, "Successfully probed %s driver '%s'", GetDriverTypeName(type), d->name);
+					delete *GetActiveDriver(type);
+					*GetActiveDriver(type) = newd;
+					return newd;
+				}
+
+				DEBUG(driver, 1, "Probing %s driver '%s' failed with error: %s", GetDriverTypeName(type), d->name, err);
+				delete newd;
+			}
+		}
+		error("Couldn't find any suitable %s driver", GetDriverTypeName(type));
+	} else {
+		char *parm;
+		char buffer[256];
+		const char *parms[32];
+
+		/* Extract the driver name and put parameter list in parm */
+		strecpy(buffer, name, lastof(buffer));
+		parm = strchr(buffer, ':');
+		parms[0] = NULL;
+		if (parm != NULL) {
+			uint np = 0;
+			/* Tokenize the parm. */
+			do {
+				*parm++ = '\0';
+				if (np < lengthof(parms) - 1) parms[np++] = parm;
+				while (*parm != '\0' && *parm != ',') parm++;
+			} while (*parm == ',');
+			parms[np] = NULL;
+		}
+
+		/* Find this driver */
+		Drivers::iterator it = GetDrivers().begin();
+		for (; it != GetDrivers().end(); ++it) {
+			DriverFactoryBase *d = (*it).second;
+
+			/* Check driver type */
+			if (d->type != type) continue;
+
+			/* Check driver name */
+			if (strcasecmp(buffer, d->name) != 0) continue;
+
+			/* Found our driver, let's try it */
+			Driver *newd = d->CreateInstance();
+
+			const char *err = newd->Start(parms);
+			if (err != NULL) {
+				delete newd;
+				error("Unable to load driver '%s'. The error was: %s", d->name, err);
+			}
+
+			DEBUG(driver, 1, "Successfully loaded %s driver '%s'", GetDriverTypeName(type), d->name);
+			delete *GetActiveDriver(type);
+			*GetActiveDriver(type) = newd;
+			return newd;
+		}
+		error("No such %s driver: %s\n", GetDriverTypeName(type), buffer);
+	}
+}
+
+/**
+ * Register a driver internally, based on its name.
+ * @param name the name of the driver.
+ * @note an assert() will be trigger if 2 driver with the same name try to register.
+ */
+void DriverFactoryBase::RegisterDriver(const char *name, Driver::Type type, int priority)
+{
+	/* Don't register nameless Drivers */
+	if (name == NULL) return;
+
+	this->name = strdup(name);
+	this->type = type;
+	this->priority = priority;
+
+	/* Prefix the name with driver type to make it unique */
+	char buf[32];
+	strecpy(buf, GetDriverTypeName(type), lastof(buf));
+	strecpy(buf + 5, name, lastof(buf));
+
+#if !defined(NDEBUG) || defined(WITH_ASSERT)
+	/* NDEBUG disables asserts and gives a warning: unused variable 'P' */
+	std::pair<Drivers::iterator, bool> P =
+#endif /* !NDEBUG */
+	GetDrivers().insert(Drivers::value_type(buf, this));
+	assert(P.second);
+}
+
+/**
+ * Build a human readable list of available drivers, grouped by type.
+ */
+char *DriverFactoryBase::GetDriversInfo(char *p, const char *last)
+{
+	for (Driver::Type type = Driver::DT_BEGIN; type != Driver::DT_END; type++) {
+		p += snprintf(p, last - p, "List of %s drivers:\n", GetDriverTypeName(type));
+
+		for (int priority = 10; priority >= 0; priority--) {
+			Drivers::iterator it = GetDrivers().begin();
+			for (; it != GetDrivers().end(); it++) {
+				DriverFactoryBase *d = (*it).second;
+				if (d->type != type) continue;
+				if (d->priority != priority) continue;
+				p += snprintf(p, last - p, "%18s: %s\n", d->name, d->GetDescription());
+			}
+		}
+
+		p += snprintf(p, last - p, "\n");
+	}
+
+	return p;
+}
--- a/src/driver.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/driver.h	Tue Apr 15 00:47:19 2008 +0000
@@ -60,32 +60,7 @@
 	}
 
 protected:
-	/**
-	 * Register a driver internally, based on its name.
-	 * @param name the name of the driver.
-	 * @note an assert() will be trigger if 2 driver with the same name try to register.
-	 */
-	void RegisterDriver(const char *name, Driver::Type type, int priority)
-	{
-		/* Don't register nameless Drivers */
-		if (name == NULL) return;
-
-		this->name = strdup(name);
-		this->type = type;
-		this->priority = priority;
-
-		/* Prefix the name with driver type to make it unique */
-		char buf[32];
-		strecpy(buf, GetDriverTypeName(type), lastof(buf));
-		strecpy(buf + 5, name, lastof(buf));
-
-#if !defined(NDEBUG) || defined(WITH_ASSERT)
-		/* NDEBUG disables asserts and gives a warning: unused variable 'P' */
-		std::pair<Drivers::iterator, bool> P =
-#endif /* !NDEBUG */
-		GetDrivers().insert(Drivers::value_type(buf, this));
-		assert(P.second);
-	}
+	void RegisterDriver(const char *name, Driver::Type type, int priority);
 
 public:
 	DriverFactoryBase() :
@@ -94,114 +69,8 @@
 
 	virtual ~DriverFactoryBase() { if (this->name != NULL) GetDrivers().erase(this->name); free(this->name); }
 
-	/**
-	 * Find the requested driver and return its class.
-	 * @param name the driver to select.
-	 * @post Sets the driver so GetCurrentDriver() returns it too.
-	 */
-	static Driver *SelectDriver(const char *name, Driver::Type type)
-	{
-		if (GetDrivers().size() == 0) return NULL;
-
-		if (*name == '\0') {
-			/* Probe for this driver */
-			for (int priority = 10; priority >= 0; priority--) {
-				Drivers::iterator it = GetDrivers().begin();
-				for (; it != GetDrivers().end(); ++it) {
-					DriverFactoryBase *d = (*it).second;
-
-					/* Check driver type */
-					if (d->type != type) continue;
-					if (d->priority != priority) continue;
-
-					Driver *newd = d->CreateInstance();
-					const char *err = newd->Start(NULL);
-					if (err == NULL) {
-						DEBUG(driver, 1, "Successfully probed %s driver '%s'", GetDriverTypeName(type), d->name);
-						delete *GetActiveDriver(type);
-						*GetActiveDriver(type) = newd;
-						return newd;
-					}
-
-					DEBUG(driver, 1, "Probing %s driver '%s' failed with error: %s", GetDriverTypeName(type), d->name, err);
-					delete newd;
-				}
-			}
-			error("Couldn't find any suitable %s driver", GetDriverTypeName(type));
-		} else {
-			char *parm;
-			char buffer[256];
-			const char *parms[32];
-
-			/* Extract the driver name and put parameter list in parm */
-			strecpy(buffer, name, lastof(buffer));
-			parm = strchr(buffer, ':');
-			parms[0] = NULL;
-			if (parm != NULL) {
-				uint np = 0;
-				/* Tokenize the parm. */
-				do {
-					*parm++ = '\0';
-					if (np < lengthof(parms) - 1)
-						parms[np++] = parm;
-					while (*parm != '\0' && *parm != ',')
-						parm++;
-				} while (*parm == ',');
-				parms[np] = NULL;
-			}
-
-			/* Find this driver */
-			Drivers::iterator it = GetDrivers().begin();
-			for (; it != GetDrivers().end(); ++it) {
-				DriverFactoryBase *d = (*it).second;
-
-				/* Check driver type */
-				if (d->type != type) continue;
-
-				/* Check driver name */
-				if (strcasecmp(buffer, d->name) != 0) continue;
-
-				/* Found our driver, let's try it */
-				Driver *newd = d->CreateInstance();
-
-				const char *err = newd->Start(parms);
-				if (err != NULL) {
-					delete newd;
-					error("Unable to load driver '%s'. The error was: %s", d->name, err);
-				}
-
-				DEBUG(driver, 1, "Successfully loaded %s driver '%s'", GetDriverTypeName(type), d->name);
-				delete *GetActiveDriver(type);
-				*GetActiveDriver(type) = newd;
-				return newd;
-			}
-			error("No such %s driver: %s\n", GetDriverTypeName(type), buffer);
-		}
-	}
-
-	/**
-	 * Build a human readable list of available drivers, grouped by type.
-	 */
-	static char *GetDriversInfo(char *p, const char *last)
-	{
-		for (Driver::Type type = Driver::DT_BEGIN; type != Driver::DT_END; type++) {
-			p += snprintf(p, last - p, "List of %s drivers:\n", GetDriverTypeName(type));
-
-			for (int priority = 10; priority >= 0; priority--) {
-				Drivers::iterator it = GetDrivers().begin();
-				for (; it != GetDrivers().end(); it++) {
-					DriverFactoryBase *d = (*it).second;
-					if (d->type != type) continue;
-					if (d->priority != priority) continue;
-					p += snprintf(p, last - p, "%18s: %s\n", d->name, d->GetDescription());
-				}
-			}
-
-			p += snprintf(p, last - p, "\n");
-		}
-
-		return p;
-	}
+	static const Driver *SelectDriver(const char *name, Driver::Type type);
+	static char *GetDriversInfo(char *p, const char *last);
 
 	/**
 	 * Get a nice description of the driver-class.
--- a/src/economy.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/economy.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -6,16 +6,14 @@
 #include "openttd.h"
 #include "currency.h"
 #include "landscape.h"
-#include "news.h"
 #include "player_base.h"
 #include "player_func.h"
-#include "station.h"
 #include "command_func.h"
 #include "saveload.h"
 #include "industry.h"
 #include "town.h"
+#include "news_func.h"
 #include "network/network.h"
-#include "engine.h"
 #include "network/network_data.h"
 #include "variables.h"
 #include "vehicle_gui.h"
@@ -353,7 +351,7 @@
 		}
 
 		/* Reset the ratings for the old player */
-		t->ratings[old_player] = 500;
+		t->ratings[old_player] = RATING_INITIAL;
 		ClrBit(t->have_ratings, old_player);
 	}
 
@@ -513,15 +511,15 @@
 
 	switch (p->quarters_of_bankrupcy) {
 		case 2:
-			AddNewsItem( (StringID)(owner | NB_BTROUBLE),
-				NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
+			AddNewsItem((StringID)(owner | NB_BTROUBLE),
+				NM_CALLBACK, NF_NONE, NT_COMPANY_INFO, DNC_BANKRUPCY, 0, 0);
 			break;
 		case 3: {
 			/* XXX - In multiplayer, should we ask other players if it wants to take
 		          over when it is a human company? -- TrueLight */
 			if (IsHumanPlayer(owner)) {
-				AddNewsItem( (StringID)(owner | NB_BTROUBLE),
-					NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
+				AddNewsItem((StringID)(owner | NB_BTROUBLE),
+					NM_CALLBACK, NF_NONE, NT_COMPANY_INFO, DNC_BANKRUPCY, 0, 0);
 				break;
 			}
 
@@ -542,7 +540,7 @@
 
 			/* Show bankrupt news */
 			SetDParam(0, p->index);
-			AddNewsItem( (StringID)(owner | NB_BBANKRUPT), NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
+			AddNewsItem((StringID)(owner | NB_BBANKRUPT), NM_CALLBACK, NF_NONE, NT_COMPANY_INFO, DNC_BANKRUPCY, 0, 0);
 
 			if (IsHumanPlayer(owner)) {
 				/* XXX - If we are in offline mode, leave the player playing. Eg. there
@@ -568,11 +566,10 @@
 	}
 }
 
-void DrawNewsBankrupcy(Window *w)
+void DrawNewsBankrupcy(Window *w, const NewsItem *ni)
 {
 	DrawNewsBorder(w);
 
-	const NewsItem *ni = WP(w, news_d).ni;
 	Player *p = GetPlayer((PlayerID)GB(ni->string_id, 0, 4));
 	DrawPlayerFace(p->face, p->player_color, 2, 23);
 	GfxFillRect(3, 23, 3 + 91, 23 + 118, PALETTE_TO_STRUCT_GREY | (1 << USE_COLORTABLE));
@@ -786,10 +783,10 @@
 
 	if (--_economy.fluct == 0) {
 		_economy.fluct = -(int)GB(Random(), 0, 2);
-		AddNewsItem(STR_7073_WORLD_RECESSION_FINANCIAL, NEWS_FLAGS(NM_NORMAL,0,NT_ECONOMY,0), 0, 0);
+		AddNewsItem(STR_7073_WORLD_RECESSION_FINANCIAL, NM_NORMAL, NF_NONE, NT_ECONOMY, DNC_NONE, 0, 0);
 	} else if (_economy.fluct == -12) {
 		_economy.fluct = GB(Random(), 0, 8) + 312;
-		AddNewsItem(STR_7074_RECESSION_OVER_UPTURN_IN, NEWS_FLAGS(NM_NORMAL,0,NT_ECONOMY,0), 0, 0);
+		AddNewsItem(STR_7074_RECESSION_OVER_UPTURN_IN, NM_NORMAL, NF_NONE, NT_ECONOMY, DNC_NONE, 0, 0);
 	}
 }
 
@@ -1129,14 +1126,14 @@
 
 		if (s->age == 12-1) {
 			pair = SetupSubsidyDecodeParam(s, 1);
-			AddNewsItem(STR_202E_OFFER_OF_SUBSIDY_EXPIRED, NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_SUBSIDIES, 0), pair.a, pair.b);
+			AddNewsItem(STR_202E_OFFER_OF_SUBSIDY_EXPIRED, NM_NORMAL, NF_TILE, NT_SUBSIDIES, DNC_NONE, pair.a, pair.b);
 			s->cargo_type = CT_INVALID;
 			modified = true;
 		} else if (s->age == 2*12-1) {
 			st = GetStation(s->to);
 			if (st->owner == _local_player) {
 				pair = SetupSubsidyDecodeParam(s, 1);
-				AddNewsItem(STR_202F_SUBSIDY_WITHDRAWN_SERVICE, NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_SUBSIDIES, 0), pair.a, pair.b);
+				AddNewsItem(STR_202F_SUBSIDY_WITHDRAWN_SERVICE, NM_NORMAL, NF_TILE, NT_SUBSIDIES, DNC_NONE, pair.a, pair.b);
 			}
 			s->cargo_type = CT_INVALID;
 			modified = true;
@@ -1175,7 +1172,7 @@
 				if (!CheckSubsidyDuplicate(s)) {
 					s->age = 0;
 					pair = SetupSubsidyDecodeParam(s, 0);
-					AddNewsItem(STR_2030_SERVICE_SUBSIDY_OFFERED, NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_SUBSIDIES, 0), pair.a, pair.b);
+					AddNewsItem(STR_2030_SERVICE_SUBSIDY_OFFERED, NM_NORMAL, NF_TILE, NT_SUBSIDIES, DNC_NONE, pair.a, pair.b);
 					modified = true;
 					break;
 				}
@@ -1392,7 +1389,7 @@
 			SetDParam(0, _current_player);
 			AddNewsItem(
 				STR_2031_SERVICE_SUBSIDY_AWARDED + _opt.diff.subsidy_multiplier,
-				NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_SUBSIDIES, 0),
+				NM_NORMAL, NF_TILE, NT_SUBSIDIES, DNC_NONE,
 				pair.a, pair.b
 			);
 
@@ -1492,7 +1489,7 @@
 			if (!cp->paid_for &&
 					cp->source != last_visited &&
 					HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) &&
-					(front_v->current_order.flags & OFB_TRANSFER) == 0) {
+					(front_v->current_order.GetUnloadType() & OUFB_TRANSFER) == 0) {
 				/* Deliver goods to the station */
 				st->time_since_unload = 0;
 
@@ -1505,8 +1502,8 @@
 				result |= 1;
 
 				SetBit(v->vehicle_flags, VF_CARGO_UNLOADING);
-			} else if (front_v->current_order.flags & (OFB_UNLOAD | OFB_TRANSFER)) {
-				if (!cp->paid_for && (front_v->current_order.flags & OFB_TRANSFER) != 0) {
+			} else if (front_v->current_order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) {
+				if (!cp->paid_for && (front_v->current_order.GetUnloadType() & OUFB_TRANSFER) != 0) {
 					Money profit = GetTransportedGoodsIncome(
 						cp->count,
 						/* pay transfer vehicle for only the part of transfer it has done: ie. cargo_loaded_at_xy to here */
@@ -1555,11 +1552,11 @@
  */
 static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
 {
-	assert(v->current_order.type == OT_LOADING);
+	assert(v->current_order.IsType(OT_LOADING));
 
 	/* We have not waited enough time till the next round of loading/unloading */
 	if (--v->load_unload_time_rem != 0) {
-		if (_patches.improved_load && HasBit(v->current_order.flags, OF_FULL_LOAD)) {
+		if (_patches.improved_load && (v->current_order.GetLoadType() & OLFB_FULL_LOAD)) {
 			/* 'Reserve' this cargo for this vehicle, because we were first. */
 			for (; v != NULL; v = v->Next()) {
 				if (v->cargo_cap != 0) cargo_left[v->cargo_type] -= v->cargo_cap - v->cargo.Count();
@@ -1607,12 +1604,12 @@
 			uint amount_unloaded = _patches.gradual_loading ? min(cargo_count, load_amount) : cargo_count;
 			bool remaining; // Are there cargo entities in this vehicle that can still be unloaded here?
 
-			if (HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) && !(u->current_order.flags & OFB_TRANSFER)) {
+			if (HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) && !(u->current_order.GetUnloadType() & OUFB_TRANSFER)) {
 				/* The cargo has reached it's final destination, the packets may now be destroyed */
 				remaining = v->cargo.MoveTo(NULL, amount_unloaded, CargoList::MTA_FINAL_DELIVERY, last_visited);
 
 				result |= 1;
-			} else if (u->current_order.flags & (OFB_UNLOAD | OFB_TRANSFER)) {
+			} else if (u->current_order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) {
 				remaining = v->cargo.MoveTo(&ge->cargo, amount_unloaded);
 				SetBit(ge->acceptance_pickup, GoodsEntry::PICKUP);
 
@@ -1641,7 +1638,7 @@
 		}
 
 		/* Do not pick up goods that we unloaded */
-		if (u->current_order.flags & OFB_UNLOAD) continue;
+		if (u->current_order.GetUnloadType() & OUFB_UNLOAD) continue;
 
 		/* update stats */
 		int t;
@@ -1713,7 +1710,7 @@
 	 * all wagons at the same time instead of using the same 'improved'
 	 * loading algorithm for the wagons (only fill wagon when there is
 	 * enough to fill the previous wagons) */
-	if (_patches.improved_load && HasBit(u->current_order.flags, OF_FULL_LOAD)) {
+	if (_patches.improved_load && (u->current_order.GetLoadType() & OLFB_FULL_LOAD)) {
 		/* Update left cargo */
 		for (v = u; v != NULL; v = v->Next()) {
 			if (v->cargo_cap != 0) cargo_left[v->cargo_type] -= v->cargo_cap - v->cargo.Count();
@@ -1732,8 +1729,8 @@
 		}
 	} else {
 		bool finished_loading = true;
-		if (HasBit(v->current_order.flags, OF_FULL_LOAD)) {
-			if (_patches.full_load_any) {
+		if (v->current_order.GetLoadType() & OLFB_FULL_LOAD) {
+			if (v->current_order.GetLoadType() == OLF_FULL_LOAD_ANY) {
 				/* if the aircraft carries passengers and is NOT full, then
 				 * continue loading, no matter how much mail is in */
 				if ((v->type == VEH_AIRCRAFT && IsCargoInClass(v->cargo_type, CC_PASSENGERS) && v->cargo_cap != v->cargo.Count()) ||
@@ -1829,7 +1826,7 @@
 
 	SetDParam(0, p->index);
 	SetDParam(1, p->bankrupt_value);
-	AddNewsItem( (StringID)(_current_player | NB_BMERGER), NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
+	AddNewsItem((StringID)(_current_player | NB_BMERGER), NM_CALLBACK, NF_NONE, NT_COMPANY_INFO, DNC_BANKRUPCY, 0, 0);
 
 	/* original code does this a little bit differently */
 	PlayerID pi = p->index;
--- a/src/economy_func.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/economy_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -13,6 +13,7 @@
 #include "town_type.h"
 #include "industry_type.h"
 #include "player_type.h"
+#include "station_type.h"
 
 struct Player;
 
--- a/src/elrail.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/elrail.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -65,6 +65,7 @@
 #include "vehicle_func.h"
 #include "player_base.h"
 #include "tunnelbridge.h"
+#include "engine_func.h"
 
 #include "table/sprites.h"
 #include "table/elrail_data.h"
@@ -84,7 +85,7 @@
 {
 	switch (GetTileType(t)) {
 		case MP_RAILWAY:
-			if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
+			if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
 			switch (GetRailTileType(t)) {
 				case RAIL_TILE_NORMAL: case RAIL_TILE_SIGNALS:
 					return GetTrackBits(t);
@@ -96,7 +97,7 @@
 			break;
 
 		case MP_TUNNELBRIDGE:
-			if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
+			if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
 			if (override != NULL && (IsTunnel(t) || GetTunnelBridgeLength(t, GetOtherBridgeEnd(t)) > 0)) {
 				*override = 1 << GetTunnelBridgeDirection(t);
 			}
@@ -104,12 +105,12 @@
 
 		case MP_ROAD:
 			if (!IsLevelCrossing(t)) return TRACK_BIT_NONE;
-			if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
+			if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
 			return GetCrossingRailBits(t);
 
 		case MP_STATION:
 			if (!IsRailwayStation(t)) return TRACK_BIT_NONE;
-			if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
+			if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
 			if (!IsStationTileElectrifiable(t)) return TRACK_BIT_NONE;
 			return TrackToTrackBits(GetRailStationTrack(t));
 
@@ -179,7 +180,7 @@
 		{ 1, 0, 15, 16 }, // NW
 	};
 
-	if ((GetRailType(ti->tile) != RAILTYPE_ELECTRIC) || _patches.disable_elrails) return;
+	if (!HasCatenary(GetRailType(ti->tile)) || _patches.disable_elrails) return;
 
 	DiagDirection dir = GetTunnelBridgeDirection(ti->tile);
 
@@ -282,7 +283,7 @@
 		if (IsTileType(neighbour, MP_STATION)) tileh[TS_NEIGHBOUR] = SLOPE_FLAT;
 
 		/* Read the foundataions if they are present, and adjust the tileh */
-		if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE && IsTileType(neighbour, MP_RAILWAY) && GetRailType(neighbour) == RAILTYPE_ELECTRIC) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]);
+		if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE && IsTileType(neighbour, MP_RAILWAY) && HasCatenary(GetRailType(neighbour))) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]);
 		if (IsBridgeTile(neighbour)) {
 			foundation = GetBridgeFoundation(tileh[TS_NEIGHBOUR], DiagDirToAxis(GetTunnelBridgeDirection(neighbour)));
 		}
@@ -433,10 +434,13 @@
 {
 	if (_patches.disable_elrails) return;
 
+	/* Do not draw catenary if it is invisible */
+	if (IsInvisibilitySet(TO_CATENARY)) return;
+
 	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile)) {
 		TileIndex head = GetNorthernBridgeEnd(ti->tile);
 
-		if (GetTunnelBridgeTransportType(head) == TRANSPORT_RAIL && GetRailType(head) == RAILTYPE_ELECTRIC) {
+		if (GetTunnelBridgeTransportType(head) == TRANSPORT_RAIL && HasCatenary(GetRailType(head))) {
 			DrawCatenaryOnBridge(ti);
 		}
 	}
--- a/src/engine.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/engine.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -5,11 +5,10 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
-#include "engine.h"
 #include "player_base.h"
 #include "player_func.h"
 #include "command_func.h"
-#include "news.h"
+#include "news_func.h"
 #include "saveload.h"
 #include "variables.h"
 #include "train.h"
@@ -26,6 +25,7 @@
 #include "autoreplace_gui.h"
 #include "string_func.h"
 #include "settings_type.h"
+#include "oldpool_func.h"
 
 #include "table/strings.h"
 #include "table/engines.h"
@@ -338,7 +338,7 @@
 			if (p->is_active) SetBit(p->avail_roadtypes, HasBit(EngInfo(index)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
 		}
 	}
-	AddNewsItem(index, NEWS_FLAGS(NM_CALLBACK, 0, NT_NEW_VEHICLES, DNC_VEHICLEAVAIL), 0, 0);
+	AddNewsItem(index, NM_CALLBACK, NF_NONE, NT_NEW_VEHICLES, DNC_VEHICLEAVAIL, 0, 0);
 }
 
 void EnginesMonthlyLoop()
--- a/src/engine.h	Mon Apr 14 20:32:36 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,278 +0,0 @@
-/* $Id$ */
-
-/** @file engine.h */
-
-#ifndef ENGINE_H
-#define ENGINE_H
-
-#include "rail_type.h"
-#include "cargo_type.h"
-#include "vehicle_type.h"
-#include "gfx_type.h"
-#include "date_type.h"
-#include "sound_type.h"
-#include "player_type.h"
-#include "strings_type.h"
-
-enum RailVehicleTypes {
-	RAILVEH_SINGLEHEAD,  ///< indicates a "standalone" locomotive
-	RAILVEH_MULTIHEAD,   ///< indicates a combination of two locomotives
-	RAILVEH_WAGON,       ///< simple wagon, not motorized
-};
-
-enum EngineClass {
-	EC_STEAM,
-	EC_DIESEL,
-	EC_ELECTRIC,
-	EC_MONORAIL,
-	EC_MAGLEV,
-};
-
-struct RailVehicleInfo {
-	byte image_index;
-	RailVehicleTypes railveh_type;
-	byte base_cost;
-	RailTypeByte railtype;
-	uint16 max_speed;
-	uint16 power;
-	uint16 weight;
-	byte running_cost;
-	byte running_cost_class;
-	EngineClass engclass;           ///< Class of engine for this vehicle
-	byte capacity;
-	CargoID cargo_type;
-	byte ai_rank;
-	byte ai_passenger_only; ///< Bit value to tell AI that this engine is for passenger use only
-	uint16 pow_wag_power;
-	byte pow_wag_weight;
-	byte visual_effect; // NOTE: this is not 100% implemented yet, at the moment it is only used as a 'fallback' value
-	                    //       for when the 'powered wagon' callback fails. But it should really also determine what
-	                    //       kind of visual effect to generate for a vehicle (default, steam, diesel, electric).
-	                    //       Same goes for the callback result, which atm is only used to check if a wagon is powered.
-	byte shorten_factor;   ///< length on main map for this type is 8 - shorten_factor
-	byte tractive_effort;  ///< Tractive effort coefficient
-	byte user_def_data;    ///< Property 0x25: "User-defined bit mask" Used only for (very few) NewGRF vehicles
-};
-
-struct ShipVehicleInfo {
-	byte image_index;
-	byte base_cost;
-	uint16 max_speed;
-	CargoID cargo_type;
-	uint16 capacity;
-	byte running_cost;
-	SoundFxByte sfx;
-	bool refittable;
-};
-
-/* AircraftVehicleInfo subtypes, bitmask type.
- * If bit 0 is 0 then it is a helicopter, otherwise it is a plane
- * in which case bit 1 tells us whether it's a big(fast) plane or not */
-enum {
-	AIR_HELI = 0,
-	AIR_CTOL = 1, ///< Conventional Take Off and Landing, i.e. planes
-	AIR_FAST = 2,
-	AIR_SEAPLANE = 8
-};
-
-struct AircraftVehicleInfo {
-	byte image_index;
-	byte base_cost;
-	byte running_cost;
-	byte subtype;
-	SoundFxByte sfx;
-	byte acceleration;
-	uint16 max_speed;
-	byte mail_capacity;
-	uint16 passenger_capacity;
-};
-
-struct RoadVehicleInfo {
-	byte image_index;
-	byte base_cost;
-	byte running_cost;
-	byte running_cost_class;
-	SoundFxByte sfx;
-	byte max_speed;
-	byte capacity;
-	CargoID cargo_type;
-};
-
-/** Information about a vehicle
- *  @see table/engines.h
- */
-struct EngineInfo {
-	Date base_intro;
-	Year lifelength;
-	Year base_life;
-	byte unk2;         ///< flag for carriage(bit 7) and decay speed(bits0..6)
-	byte load_amount;
-	byte climates;
-	uint32 refit_mask;
-	byte refit_cost;
-	byte misc_flags;
-	byte callbackmask;
-	int8 retire_early;  ///< Number of years early to retire vehicle
-	StringID string_id; ///< Default name of engine
-};
-
-struct Engine {
-	char *name;         ///< Custom name of engine
-	Date intro_date;
-	Date age;
-	uint16 reliability;
-	uint16 reliability_spd_dec;
-	uint16 reliability_start, reliability_max, reliability_final;
-	uint16 duration_phase_1, duration_phase_2, duration_phase_3;
-	byte lifelength;
-	byte flags;
-	uint8 preview_player_rank;
-	byte preview_wait;
-	byte player_avail;
-	VehicleType type; ///< type, ie VEH_ROAD, VEH_TRAIN, etc.
-};
-
-/**
- * EngineInfo.misc_flags is a bitmask, with the following values
- */
-enum {
-	EF_RAIL_TILTS = 0, ///< Rail vehicle tilts in curves
-	EF_ROAD_TRAM  = 0, ///< Road vehicle is a tram/light rail vehicle
-	EF_USES_2CC   = 1, ///< Vehicle uses two company colours
-	EF_RAIL_IS_MU = 2, ///< Rail vehicle is a multiple-unit (DMU/EMU)
-};
-
-/**
- * Engine.flags is a bitmask, with the following values.
- */
-enum {
-	ENGINE_AVAILABLE         = 1, ///< This vehicle is available to everyone.
-	ENGINE_EXCLUSIVE_PREVIEW = 2, ///< This vehicle is in the exclusive preview stage, either being used or being offered to a player.
-	ENGINE_OFFER_WINDOW_OPEN = 4, ///< The exclusive offer window is currently open for a player.
-};
-
-enum {
-	NUM_VEHICLE_TYPES = 6
-};
-
-static const EngineID INVALID_ENGINE = 0xFFFF;
-
-
-void SetupEngines();
-void StartupEngines();
-
-
-void DrawTrainEngine(int x, int y, EngineID engine, SpriteID pal);
-void DrawRoadVehEngine(int x, int y, EngineID engine, SpriteID pal);
-void DrawShipEngine(int x, int y, EngineID engine, SpriteID pal);
-void DrawAircraftEngine(int x, int y, EngineID engine, SpriteID pal);
-
-void LoadCustomEngineNames();
-void DeleteCustomEngineNames();
-
-bool IsEngineBuildable(EngineID engine, VehicleType type, PlayerID player);
-CargoID GetEngineCargoType(EngineID engine);
-
-enum {
-	NUM_NORMAL_RAIL_ENGINES = 54,
-	NUM_MONORAIL_ENGINES    = 30,
-	NUM_MAGLEV_ENGINES      = 32,
-	NUM_TRAIN_ENGINES       = NUM_NORMAL_RAIL_ENGINES + NUM_MONORAIL_ENGINES + NUM_MAGLEV_ENGINES,
-	NUM_ROAD_ENGINES        = 88,
-	NUM_SHIP_ENGINES        = 11,
-	NUM_AIRCRAFT_ENGINES    = 41,
-	TOTAL_NUM_ENGINES       = NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES + NUM_SHIP_ENGINES + NUM_AIRCRAFT_ENGINES,
-	AIRCRAFT_ENGINES_INDEX  = NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES + NUM_SHIP_ENGINES,
-	SHIP_ENGINES_INDEX      = NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES,
-	ROAD_ENGINES_INDEX      = NUM_TRAIN_ENGINES,
-};
-
-static inline EngineID GetFirstEngineOfType(VehicleType type)
-{
-	const EngineID start[] = {0, ROAD_ENGINES_INDEX, SHIP_ENGINES_INDEX, AIRCRAFT_ENGINES_INDEX};
-
-	return start[type];
-}
-
-static inline EngineID GetLastEngineOfType(VehicleType type)
-{
-	const EngineID end[] = {
-		NUM_TRAIN_ENGINES,
-		ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES,
-		SHIP_ENGINES_INDEX + NUM_SHIP_ENGINES,
-		AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES};
-
-	return end[type];
-}
-
-extern Engine _engines[TOTAL_NUM_ENGINES];
-#define FOR_ALL_ENGINES(e) for (e = _engines; e != endof(_engines); e++)
-#define FOR_ALL_ENGINEIDS_OF_TYPE(e, type) for (e = GetFirstEngineOfType(type); e != GetLastEngineOfType(type); e++)
-
-
-static inline Engine* GetEngine(EngineID i)
-{
-	assert(i < lengthof(_engines));
-	return &_engines[i];
-}
-
-static inline bool IsEngineIndex(uint index)
-{
-	return index < TOTAL_NUM_ENGINES;
-}
-
-/* Access Vehicle Data */
-extern const EngineInfo _orig_engine_info[TOTAL_NUM_ENGINES];
-extern const RailVehicleInfo _orig_rail_vehicle_info[NUM_TRAIN_ENGINES];
-extern const ShipVehicleInfo _orig_ship_vehicle_info[NUM_SHIP_ENGINES];
-extern const AircraftVehicleInfo _orig_aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES];
-extern const RoadVehicleInfo _orig_road_vehicle_info[NUM_ROAD_ENGINES];
-
-extern EngineInfo _engine_info[TOTAL_NUM_ENGINES];
-extern RailVehicleInfo _rail_vehicle_info[NUM_TRAIN_ENGINES];
-extern ShipVehicleInfo _ship_vehicle_info[NUM_SHIP_ENGINES];
-extern AircraftVehicleInfo _aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES];
-extern RoadVehicleInfo _road_vehicle_info[NUM_ROAD_ENGINES];
-
-static inline const EngineInfo *EngInfo(EngineID e)
-{
-	assert(e < lengthof(_engine_info));
-	return &_engine_info[e];
-}
-
-static inline const RailVehicleInfo* RailVehInfo(EngineID e)
-{
-	assert(e < lengthof(_rail_vehicle_info));
-	return &_rail_vehicle_info[e];
-}
-
-static inline const ShipVehicleInfo* ShipVehInfo(EngineID e)
-{
-	assert(e >= SHIP_ENGINES_INDEX && e < SHIP_ENGINES_INDEX + lengthof(_ship_vehicle_info));
-	return &_ship_vehicle_info[e - SHIP_ENGINES_INDEX];
-}
-
-static inline const AircraftVehicleInfo* AircraftVehInfo(EngineID e)
-{
-	assert(e >= AIRCRAFT_ENGINES_INDEX && e < AIRCRAFT_ENGINES_INDEX + lengthof(_aircraft_vehicle_info));
-	return &_aircraft_vehicle_info[e - AIRCRAFT_ENGINES_INDEX];
-}
-
-static inline const RoadVehicleInfo* RoadVehInfo(EngineID e)
-{
-	assert(e >= ROAD_ENGINES_INDEX && e < ROAD_ENGINES_INDEX + lengthof(_road_vehicle_info));
-	return &_road_vehicle_info[e - ROAD_ENGINES_INDEX];
-}
-
-/* Engine list manipulators - current implementation is only C wrapper of CBlobT<EngineID> class (helpers.cpp) */
-void EngList_Create(EngineList *el);            ///< Creates engine list
-void EngList_Destroy(EngineList *el);           ///< Deallocate and destroy engine list
-uint EngList_Count(const EngineList *el);       ///< Returns number of items in the engine list
-void EngList_Add(EngineList *el, EngineID eid); ///< Append one item at the end of engine list
-EngineID* EngList_Items(EngineList *el);        ///< Returns engine list items as C array
-void EngList_RemoveAll(EngineList *el);         ///< Removes all items from engine list
-typedef int CDECL EngList_SortTypeFunction(const void*, const void*); ///< argument type for EngList_Sort()
-void EngList_Sort(EngineList *el, EngList_SortTypeFunction compare); ///< qsort of the engine list
-void EngList_SortPartial(EngineList *el, EngList_SortTypeFunction compare, uint begin, uint num_items); ///< qsort of specified portion of the engine list
-
-#endif /* ENGINE_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/engine_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,113 @@
+/* $Id$ */
+
+/** @file engine.h */
+
+#ifndef ENGINE_H
+#define ENGINE_H
+
+#include "engine_type.h"
+
+void SetupEngines();
+void StartupEngines();
+
+
+void DrawTrainEngine(int x, int y, EngineID engine, SpriteID pal);
+void DrawRoadVehEngine(int x, int y, EngineID engine, SpriteID pal);
+void DrawShipEngine(int x, int y, EngineID engine, SpriteID pal);
+void DrawAircraftEngine(int x, int y, EngineID engine, SpriteID pal);
+
+void LoadCustomEngineNames();
+void DeleteCustomEngineNames();
+
+bool IsEngineBuildable(EngineID engine, VehicleType type, PlayerID player);
+CargoID GetEngineCargoType(EngineID engine);
+
+static inline EngineID GetFirstEngineOfType(VehicleType type)
+{
+	const EngineID start[] = {0, ROAD_ENGINES_INDEX, SHIP_ENGINES_INDEX, AIRCRAFT_ENGINES_INDEX};
+
+	return start[type];
+}
+
+static inline EngineID GetLastEngineOfType(VehicleType type)
+{
+	const EngineID end[] = {
+		NUM_TRAIN_ENGINES,
+		ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES,
+		SHIP_ENGINES_INDEX + NUM_SHIP_ENGINES,
+		AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES};
+
+	return end[type];
+}
+
+extern Engine _engines[TOTAL_NUM_ENGINES];
+#define FOR_ALL_ENGINES(e) for (e = _engines; e != endof(_engines); e++)
+#define FOR_ALL_ENGINEIDS_OF_TYPE(e, type) for (e = GetFirstEngineOfType(type); e != GetLastEngineOfType(type); e++)
+
+
+static inline Engine* GetEngine(EngineID i)
+{
+	assert(i < lengthof(_engines));
+	return &_engines[i];
+}
+
+static inline bool IsEngineIndex(uint index)
+{
+	return index < TOTAL_NUM_ENGINES;
+}
+
+/* Access Vehicle Data */
+extern const EngineInfo _orig_engine_info[TOTAL_NUM_ENGINES];
+extern const RailVehicleInfo _orig_rail_vehicle_info[NUM_TRAIN_ENGINES];
+extern const ShipVehicleInfo _orig_ship_vehicle_info[NUM_SHIP_ENGINES];
+extern const AircraftVehicleInfo _orig_aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES];
+extern const RoadVehicleInfo _orig_road_vehicle_info[NUM_ROAD_ENGINES];
+
+extern EngineInfo _engine_info[TOTAL_NUM_ENGINES];
+extern RailVehicleInfo _rail_vehicle_info[NUM_TRAIN_ENGINES];
+extern ShipVehicleInfo _ship_vehicle_info[NUM_SHIP_ENGINES];
+extern AircraftVehicleInfo _aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES];
+extern RoadVehicleInfo _road_vehicle_info[NUM_ROAD_ENGINES];
+
+static inline const EngineInfo *EngInfo(EngineID e)
+{
+	assert(e < lengthof(_engine_info));
+	return &_engine_info[e];
+}
+
+static inline const RailVehicleInfo* RailVehInfo(EngineID e)
+{
+	assert(e < lengthof(_rail_vehicle_info));
+	return &_rail_vehicle_info[e];
+}
+
+static inline const ShipVehicleInfo* ShipVehInfo(EngineID e)
+{
+	assert(e >= SHIP_ENGINES_INDEX && e < SHIP_ENGINES_INDEX + lengthof(_ship_vehicle_info));
+	return &_ship_vehicle_info[e - SHIP_ENGINES_INDEX];
+}
+
+static inline const AircraftVehicleInfo* AircraftVehInfo(EngineID e)
+{
+	assert(e >= AIRCRAFT_ENGINES_INDEX && e < AIRCRAFT_ENGINES_INDEX + lengthof(_aircraft_vehicle_info));
+	return &_aircraft_vehicle_info[e - AIRCRAFT_ENGINES_INDEX];
+}
+
+static inline const RoadVehicleInfo* RoadVehInfo(EngineID e)
+{
+	assert(e >= ROAD_ENGINES_INDEX && e < ROAD_ENGINES_INDEX + lengthof(_road_vehicle_info));
+	return &_road_vehicle_info[e - ROAD_ENGINES_INDEX];
+}
+
+/* Engine list manipulators - current implementation is only C wrapper of CBlobT<EngineID> class (helpers.cpp) */
+void EngList_Create(EngineList *el);            ///< Creates engine list
+void EngList_Destroy(EngineList *el);           ///< Deallocate and destroy engine list
+uint EngList_Count(const EngineList *el);       ///< Returns number of items in the engine list
+void EngList_Add(EngineList *el, EngineID eid); ///< Append one item at the end of engine list
+EngineID* EngList_Items(EngineList *el);        ///< Returns engine list items as C array
+void EngList_RemoveAll(EngineList *el);         ///< Removes all items from engine list
+typedef int CDECL EngList_SortTypeFunction(const void*, const void*); ///< argument type for EngList_Sort()
+void EngList_Sort(EngineList *el, EngList_SortTypeFunction compare); ///< qsort of the engine list
+void EngList_SortPartial(EngineList *el, EngList_SortTypeFunction compare, uint begin, uint num_items); ///< qsort of specified portion of the engine list
+
+#endif /* ENGINE_H */
--- a/src/engine_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/engine_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -7,10 +7,10 @@
 #include "gui.h"
 #include "window_gui.h"
 #include "gfx_func.h"
-#include "engine.h"
+#include "engine_func.h"
 #include "command_func.h"
 #include "economy_func.h"
-#include "news.h"
+#include "news_func.h"
 #include "variables.h"
 #include "newgrf_engine.h"
 #include "strings_func.h"
@@ -182,11 +182,11 @@
 	return STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE;
 }
 
-void DrawNewsNewVehicleAvail(Window *w)
+void DrawNewsNewVehicleAvail(Window *w, const NewsItem *ni)
 {
 	DrawNewsBorder(w);
 
-	EngineID engine = WP(w, news_d).ni->string_id;
+	EngineID engine = ni->string_id;
 	const DrawEngineInfo *dei = &_draw_engine_list[GetEngine(engine)->type];
 
 	SetDParam(0, GetEngineCategoryName(engine));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/engine_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,178 @@
+/* $Id$ */
+
+/** @file engine_type.h Types related to engines. */
+
+#ifndef ENGINE_TYPE_H
+#define ENGINE_TYPE_H
+
+#include "rail_type.h"
+#include "cargo_type.h"
+#include "vehicle_type.h"
+#include "gfx_type.h"
+#include "date_type.h"
+#include "sound_type.h"
+#include "player_type.h"
+#include "strings_type.h"
+
+typedef uint16 EngineID;
+typedef uint16 EngineRenewID;
+typedef EngineID *EngineList; ///< engine list type placeholder acceptable for C code (see helpers.cpp)
+
+enum RailVehicleTypes {
+	RAILVEH_SINGLEHEAD,  ///< indicates a "standalone" locomotive
+	RAILVEH_MULTIHEAD,   ///< indicates a combination of two locomotives
+	RAILVEH_WAGON,       ///< simple wagon, not motorized
+};
+
+enum EngineClass {
+	EC_STEAM,
+	EC_DIESEL,
+	EC_ELECTRIC,
+	EC_MONORAIL,
+	EC_MAGLEV,
+};
+
+struct RailVehicleInfo {
+	byte image_index;
+	RailVehicleTypes railveh_type;
+	byte base_cost;
+	RailTypeByte railtype;
+	uint16 max_speed;
+	uint16 power;
+	uint16 weight;
+	byte running_cost;
+	byte running_cost_class;
+	EngineClass engclass;           ///< Class of engine for this vehicle
+	byte capacity;
+	CargoID cargo_type;
+	byte ai_rank;
+	byte ai_passenger_only; ///< Bit value to tell AI that this engine is for passenger use only
+	uint16 pow_wag_power;
+	byte pow_wag_weight;
+	byte visual_effect; // NOTE: this is not 100% implemented yet, at the moment it is only used as a 'fallback' value
+	                    //       for when the 'powered wagon' callback fails. But it should really also determine what
+	                    //       kind of visual effect to generate for a vehicle (default, steam, diesel, electric).
+	                    //       Same goes for the callback result, which atm is only used to check if a wagon is powered.
+	byte shorten_factor;   ///< length on main map for this type is 8 - shorten_factor
+	byte tractive_effort;  ///< Tractive effort coefficient
+	byte user_def_data;    ///< Property 0x25: "User-defined bit mask" Used only for (very few) NewGRF vehicles
+};
+
+struct ShipVehicleInfo {
+	byte image_index;
+	byte base_cost;
+	uint16 max_speed;
+	CargoID cargo_type;
+	uint16 capacity;
+	byte running_cost;
+	SoundFxByte sfx;
+	bool refittable;
+};
+
+/* AircraftVehicleInfo subtypes, bitmask type.
+ * If bit 0 is 0 then it is a helicopter, otherwise it is a plane
+ * in which case bit 1 tells us whether it's a big(fast) plane or not */
+enum {
+	AIR_HELI = 0,
+	AIR_CTOL = 1, ///< Conventional Take Off and Landing, i.e. planes
+	AIR_FAST = 2,
+	AIR_SEAPLANE = 8
+};
+
+struct AircraftVehicleInfo {
+	byte image_index;
+	byte base_cost;
+	byte running_cost;
+	byte subtype;
+	SoundFxByte sfx;
+	byte acceleration;
+	uint16 max_speed;
+	byte mail_capacity;
+	uint16 passenger_capacity;
+};
+
+struct RoadVehicleInfo {
+	byte image_index;
+	byte base_cost;
+	byte running_cost;
+	byte running_cost_class;
+	SoundFxByte sfx;
+	byte max_speed;
+	byte capacity;
+	CargoID cargo_type;
+};
+
+/** Information about a vehicle
+ *  @see table/engines.h
+ */
+struct EngineInfo {
+	Date base_intro;
+	Year lifelength;
+	Year base_life;
+	byte unk2;         ///< flag for carriage(bit 7) and decay speed(bits0..6)
+	byte load_amount;
+	byte climates;
+	uint32 refit_mask;
+	byte refit_cost;
+	byte misc_flags;
+	byte callbackmask;
+	int8 retire_early;  ///< Number of years early to retire vehicle
+	StringID string_id; ///< Default name of engine
+};
+
+struct Engine {
+	char *name;         ///< Custom name of engine
+	Date intro_date;
+	Date age;
+	uint16 reliability;
+	uint16 reliability_spd_dec;
+	uint16 reliability_start, reliability_max, reliability_final;
+	uint16 duration_phase_1, duration_phase_2, duration_phase_3;
+	byte lifelength;
+	byte flags;
+	uint8 preview_player_rank;
+	byte preview_wait;
+	byte player_avail;
+	VehicleType type; ///< type, ie VEH_ROAD, VEH_TRAIN, etc.
+};
+
+/**
+ * EngineInfo.misc_flags is a bitmask, with the following values
+ */
+enum {
+	EF_RAIL_TILTS = 0, ///< Rail vehicle tilts in curves
+	EF_ROAD_TRAM  = 0, ///< Road vehicle is a tram/light rail vehicle
+	EF_USES_2CC   = 1, ///< Vehicle uses two company colours
+	EF_RAIL_IS_MU = 2, ///< Rail vehicle is a multiple-unit (DMU/EMU)
+};
+
+/**
+ * Engine.flags is a bitmask, with the following values.
+ */
+enum {
+	ENGINE_AVAILABLE         = 1, ///< This vehicle is available to everyone.
+	ENGINE_EXCLUSIVE_PREVIEW = 2, ///< This vehicle is in the exclusive preview stage, either being used or being offered to a player.
+	ENGINE_OFFER_WINDOW_OPEN = 4, ///< The exclusive offer window is currently open for a player.
+};
+
+enum {
+	NUM_VEHICLE_TYPES = 6
+};
+
+static const EngineID INVALID_ENGINE = 0xFFFF;
+
+enum {
+	NUM_NORMAL_RAIL_ENGINES = 54,
+	NUM_MONORAIL_ENGINES    = 30,
+	NUM_MAGLEV_ENGINES      = 32,
+	NUM_TRAIN_ENGINES       = NUM_NORMAL_RAIL_ENGINES + NUM_MONORAIL_ENGINES + NUM_MAGLEV_ENGINES,
+	NUM_ROAD_ENGINES        = 88,
+	NUM_SHIP_ENGINES        = 11,
+	NUM_AIRCRAFT_ENGINES    = 41,
+	TOTAL_NUM_ENGINES       = NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES + NUM_SHIP_ENGINES + NUM_AIRCRAFT_ENGINES,
+	AIRCRAFT_ENGINES_INDEX  = NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES + NUM_SHIP_ENGINES,
+	SHIP_ENGINES_INDEX      = NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES,
+	ROAD_ENGINES_INDEX      = NUM_TRAIN_ENGINES,
+};
+
+#endif /* ENGINE_TYPE_H */
--- a/src/genworld.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/genworld.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -21,7 +21,7 @@
 #include "map_func.h"
 #include "date_func.h"
 #include "core/random_func.hpp"
-#include "engine.h"
+#include "engine_func.h"
 #include "settings_type.h"
 #include "newgrf_storage.h"
 #include "water.h"
--- a/src/genworld_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/genworld_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -48,6 +48,7 @@
 	uint y;
 	char name[64];
 };
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(generate_d));
 
 extern void SwitchMode(int new_mode);
 
@@ -127,7 +128,7 @@
 {   WWT_DROPDOWN, RESIZE_NONE, 12, 114, 175, 130, 141, 0x0,                          STR_NULL}, // Number of industries
 
 {       WWT_TEXT, RESIZE_NONE,  0,  12, 110, 153, 163, STR_RANDOM_SEED,              STR_NULL},
-{      WWT_PANEL, RESIZE_NONE, 15, 114, 207, 152, 163, 0x0,                          STR_RANDOM_SEED_HELP}, // Edit box for seed
+{    WWT_EDITBOX, RESIZE_NONE, 15, 114, 207, 152, 163, STR_RANDOM_SEED_OSKTITLE,     STR_RANDOM_SEED_HELP}, // Edit box for seed
 {    WWT_TEXTBTN, RESIZE_NONE, 12, 216, 326, 152, 163, STR_RANDOM,                   STR_RANDOM_HELP},
 
 {    WWT_TEXTBTN, RESIZE_NONE,  6, 243, 326, 228, 257, STR_GENERATE,                 STR_NULL}, // Generate button
@@ -181,7 +182,7 @@
 {   WWT_DROPDOWN, RESIZE_NONE, 12, 114, 175, 152, 163, 0x0,                          STR_NULL}, // Number of industries
 
 {       WWT_TEXT, RESIZE_NONE,  0,  12, 110, 175, 185, STR_RANDOM_SEED,              STR_NULL},
-{      WWT_PANEL, RESIZE_NONE, 15, 114, 207, 174, 185, 0x0,                          STR_RANDOM_SEED_HELP}, // Edit box for seed
+{    WWT_EDITBOX, RESIZE_NONE, 15, 114, 207, 174, 185, STR_RANDOM_SEED_OSKTITLE,     STR_RANDOM_SEED_HELP}, // Edit box for seed
 {    WWT_TEXTBTN, RESIZE_NONE, 12, 216, 326, 174, 185, STR_RANDOM,                   STR_RANDOM_HELP},
 
 {    WWT_TEXTBTN, RESIZE_NONE,  6, 243, 326, 196, 225, STR_GENERATE,                 STR_NULL}, // Generate button
@@ -374,8 +375,11 @@
 					SetWindowDirty(w);
 					break;
 
+				case GLAND_RANDOM_EDITBOX: // edit box for random seed
+					ShowOnScreenKeyboard(w, & _genseed_query, GLAND_RANDOM_EDITBOX, 0, 0);
+					break;
+
 				case GLAND_GENERATE_BUTTON: // Generate
-
 					UpdatePatches();
 
 					if (_patches.town_layout == TL_NO_ROADS) {
--- a/src/gfx.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/gfx.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -28,10 +28,10 @@
 bool _ctrl_pressed;   ///< Is Ctrl pressed?
 bool _shift_pressed;  ///< Is Shift pressed?
 byte _fast_forward;
-bool _left_button_down;
-bool _left_button_clicked;
-bool _right_button_down;
-bool _right_button_clicked;
+bool _left_button_down;     ///< Is left mouse button pressed?
+bool _left_button_clicked;  ///< Is left mouse button clicked?
+bool _right_button_down;    ///< Is right mouse button pressed?
+bool _right_button_clicked; ///< Is right mouse button clicked?
 DrawPixelInfo _screen;
 bool _screen_disable_anim = false;   ///< Disable palette animation (important for 32bpp-anim blitter during giant screenshot)
 bool _exit_game;
@@ -561,6 +561,20 @@
 	return br;
 }
 
+void DrawCharCentered(WChar c, int x, int y, uint16 real_color)
+{
+	FontSize size = FS_NORMAL;
+	byte color = real_color & 0xFF;
+	uint palette = _use_dos_palette ? 1 : 0;
+	int w = GetCharacterWidth(size, c);
+
+	_string_colorremap[1] = _string_colormap[palette][color].text;
+	_string_colorremap[2] = _string_colormap[palette][color].shadow;
+	_color_remap_ptr = _string_colorremap;
+
+	GfxMainBlitter(GetGlyph(size, c), x - w / 2, y, BM_COLOUR_REMAP);
+}
+
 /** Draw a string at the given coordinates with the given colour
  * @param string the string to draw
  * @param x offset from left side of the screen, if negative offset from the right side
--- a/src/gfx_func.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/gfx_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -99,6 +99,8 @@
 void DrawStringRightAlignedTruncated(int x, int y, StringID str, uint16 color, uint maxw);
 void DrawStringRightAlignedUnderline(int x, int y, StringID str, uint16 color);
 
+void DrawCharCentered(uint32 c, int x, int y, uint16 color);
+
 void GfxFillRect(int left, int top, int right, int bottom, int color);
 void GfxDrawLine(int left, int top, int right, int bottom, int color);
 void DrawBox(int x, int y, int dx1, int dy1, int dx2, int dy2, int dx3, int dy3);
--- a/src/gfx_type.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/gfx_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -130,6 +130,8 @@
 	bool dirty;      ///< the rect occupied by the mouse is dirty (redraw)
 	bool fix_at;     ///< mouse is moving, but cursor is not (used for scrolling)
 	bool in_window;  ///< mouse inside this window, determines drawing logic
+
+	bool vehchain;   ///< vehicle chain is dragged
 };
 
 struct DrawPixelInfo {
--- a/src/group.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/group.h	Tue Apr 15 00:47:19 2008 +0000
@@ -5,18 +5,12 @@
 #ifndef GROUP_H
 #define GROUP_H
 
+#include "group_type.h"
 #include "oldpool.h"
 #include "player_type.h"
 #include "vehicle_type.h"
-#include "engine.h"
+#include "engine_type.h"
 
-enum {
-	ALL_GROUP     = 0xFFFD,
-	DEFAULT_GROUP = 0xFFFE, ///< ungrouped vehicles are in this group.
-	INVALID_GROUP = 0xFFFF,
-};
-
-struct Group;
 DECLARE_OLD_POOL(Group, Group, 5, 2047)
 
 struct Group : PoolItem<Group, GroupID, &_Group_pool> {
--- a/src/group_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/group_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -21,6 +21,8 @@
 #include "autoreplace_func.h"
 #include "string_func.h"
 #include "player_func.h"
+#include "order_func.h"
+#include "oldpool_func.h"
 
 #include "table/strings.h"
 
--- a/src/group_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/group_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -8,7 +8,6 @@
 #include "window_gui.h"
 #include "textbuf_gui.h"
 #include "command_func.h"
-#include "engine.h"
 #include "vehicle_gui.h"
 #include "depot.h"
 #include "train.h"
@@ -29,6 +28,20 @@
 #include "table/strings.h"
 #include "table/sprites.h"
 
+struct grouplist_d {
+	const Group **sort_list;
+	list_d l;                   // General list struct
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(grouplist_d));
+
+struct groupveh_d : vehiclelist_d {
+	GroupID group_sel;
+	VehicleID vehicle_sel;
+
+	grouplist_d gl;
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(groupveh_d));
+
 struct Sorting {
 	Listing aircraft;
 	Listing roadveh;
@@ -499,7 +512,7 @@
 		}
 
 		case WE_CLICK:
-			HideDropDownMenu(w);
+			if (e->we.click.widget != GRP_WIDGET_SORT_BY_DROPDOWN && e->we.click.widget != GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN) HideDropDownMenu(w);
 
 			switch(e->we.click.widget) {
 				case GRP_WIDGET_SORT_BY_ORDER: // Flip sorting method ascending/descending
@@ -562,6 +575,7 @@
 
 					if (v->IsValid()) {
 						SetObjectToPlaceWnd(v->GetImage(DIR_W), GetVehiclePalette(v), VHM_DRAG, w);
+						_cursor.vehchain = true;
 					}
 
 					SetWindowDirty(w);
@@ -674,6 +688,7 @@
 					break;
 				}
 			}
+			_cursor.vehchain = false;
 			break;
 		}
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/group_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,18 @@
+/* $Id$ */
+
+/** @file group_type.h Types of a group. */
+
+#ifndef GROUP_TYPE_H
+#define GROUP_TYPE_H
+
+typedef uint16 GroupID;
+
+enum {
+	ALL_GROUP     = 0xFFFD,
+	DEFAULT_GROUP = 0xFFFE, ///< ungrouped vehicles are in this group.
+	INVALID_GROUP = 0xFFFF,
+};
+
+struct Group;
+
+#endif /* GROUP_TYPE_H */
--- a/src/gui.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/gui.h	Tue Apr 15 00:47:19 2008 +0000
@@ -15,6 +15,10 @@
 /* main_gui.cpp */
 void CcPlaySound10(bool success, TileIndex tile, uint32 p1, uint32 p2);
 void CcBuildCanal(bool success, TileIndex tile, uint32 p1, uint32 p2);
+void HandleOnEditText(const char *str);
+void InitializeGUI();
+Window *PopupMainPlayerToolbMenu(Window *w, int main_button, int gray);
+Window *PopupMainToolbMenu(Window *w, uint16 parent_button, StringID base_string, byte item_count, byte disabled_mask);
 
 /* settings_gui.cpp */
 void ShowGameOptions();
@@ -79,6 +83,9 @@
 	DDSP_PLACE_AUTOROAD,
 };
 
+/* timetable_gui.cpp */
+void ShowTimetableWindow(const Vehicle *v);
+
 /* misc_gui.cpp */
 void PlaceLandBlockInfo();
 void ShowAboutWindow();
@@ -109,11 +116,8 @@
 void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, byte bridge_type);
 
 void ShowBuildIndustryWindow();
+void ShowBuildTownWindow();
 void ShowMusicWindow();
 
-/* main_gui.cpp */
-void HandleOnEditText(const char *str);
-
-void InitializeGUI();
 
 #endif /* GUI_H */
--- a/src/helpers.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/helpers.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -5,7 +5,7 @@
 #include "stdafx.h"
 
 #include "openttd.h"
-#include "engine.h"
+#include "engine_func.h"
 
 #include <new>
 #include "misc/blob.hpp"
--- a/src/industry_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/industry_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -13,7 +13,7 @@
 #include "command_func.h"
 #include "industry.h"
 #include "town.h"
-#include "news.h"
+#include "news_func.h"
 #include "saveload.h"
 #include "variables.h"
 #include "genworld.h"
@@ -36,6 +36,8 @@
 #include "date_func.h"
 #include "vehicle_func.h"
 #include "sound_func.h"
+#include "station_base.h"
+#include "oldpool_func.h"
 
 #include "table/strings.h"
 #include "table/sprites.h"
@@ -302,6 +304,9 @@
 
 	DrawGroundSprite(image, pal);
 
+	/* If industries are transparent and invisible, do not draw the upper part */
+	if (IsInvisibilitySet(TO_INDUSTRIES)) return;
+
 	/* Add industry on top of the ground? */
 	image = dits->building.sprite;
 	if (image != 0) {
@@ -1641,7 +1646,7 @@
 							SetDParam(1, ind->town->index);
 						}
 						AddNewsItem(indspec->new_industry_text,
-								NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0), ind->xy, 0);
+								NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, DNC_NONE, ind->xy, 0);
 						break;
 					}
 				}
@@ -1860,7 +1865,7 @@
 		SetDParam(1, ind->town->index);
 	}
 	AddNewsItem(ind_spc->new_industry_text,
-		NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0), ind->xy, 0);
+		NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, DNC_NONE, ind->xy, 0);
 }
 
 /**
@@ -1963,13 +1968,13 @@
 		 */
 		const Order *o;
 		FOR_VEHICLE_ORDERS(v, o) {
-			if (o->type == OT_GOTO_STATION && !HasBit(o->flags, OF_TRANSFER)) {
+			if (o->IsType(OT_GOTO_STATION) && !(o->GetUnloadType() & OUFB_TRANSFER)) {
 				/* Vehicle visits a station to load or unload */
-				Station *st = GetStation(o->dest);
+				Station *st = GetStation(o->GetDestination());
 				if (!st->IsValid()) continue;
 
 				/* Same cargo produced by industry is dropped here => not serviced by vehicle v */
-				if (HasBit(o->flags, OF_UNLOAD) && !c_accepts) break;
+				if ((o->GetUnloadType() & OUFB_UNLOAD) && !c_accepts) break;
 
 				if (stations.find(st) != stations.end()) {
 					if (v->owner == _local_player) return 2; // Player services industry
@@ -2003,7 +2008,7 @@
 	SetDParam(1, ind->index);
 	AddNewsItem(
 		percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN,
-		NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, nt, 0),
+		NM_THIN, NF_VIEWPORT | NF_TILE, nt, DNC_NONE,
 		ind->xy + TileDiffXY(1, 1), 0
 	);
 }
@@ -2196,7 +2201,7 @@
 		}
 		/* and report the news to the user */
 		AddNewsItem(str,
-			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, nt, 0),
+			NM_THIN, NF_VIEWPORT | NF_TILE, nt, DNC_NONE,
 			i->xy + TileDiffXY(1, 1), 0);
 	}
 }
--- a/src/industry_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/industry_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -60,6 +60,29 @@
 assert_compile(lengthof(_fund_gui.index) == lengthof(_fund_gui.text));
 assert_compile(lengthof(_fund_gui.index) == lengthof(_fund_gui.enabled));
 
+/**
+ * Gets the string to display after the cargo name (using callback 37)
+ * @param cargo the cargo for which the suffix is requested
+ * - 00 - first accepted cargo type
+ * - 01 - second accepted cargo type
+ * - 02 - third accepted cargo type
+ * - 03 - first produced cargo type
+ * - 04 - second produced cargo type
+ * @param ind the industry (NULL if in fund window)
+ * @param ind_type the industry type
+ * @param indspec the industry spec
+ * @return the string to display
+ */
+static StringID GetCargoSuffix(uint cargo, Industry *ind, IndustryType ind_type, const IndustrySpec *indspec)
+{
+	if (HasBit(indspec->callback_flags, CBM_IND_CARGO_SUFFIX)) {
+		bool fund = ind == NULL;
+		uint8 callback = GetIndustryCallback(CBID_INDUSTRY_CARGO_SUFFIX, 0, ((!fund) ? 1 << 8 : 0) | cargo, ind, ind_type, (!fund) ? ind->xy : INVALID_TILE);
+		if (callback != 0xFF) return GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + callback);
+	}
+	return STR_EMPTY;
+}
+
 static void BuildDynamicIndustryWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
@@ -179,10 +202,12 @@
 			StringID str = STR_4827_REQUIRES;
 			byte p = 0;
 			SetDParam(0, STR_00D0_NOTHING);
+			SetDParam(1, STR_EMPTY);
 			for (byte j = 0; j < lengthof(indsp->accepts_cargo); j++) {
 				if (indsp->accepts_cargo[j] == CT_INVALID) continue;
 				if (p > 0) str++;
 				SetDParam(p++, GetCargo(indsp->accepts_cargo[j])->name);
+				SetDParam(p++, GetCargoSuffix(j, NULL, WP(w, fnd_d).select, indsp));
 			}
 			DrawStringTruncated(x_str, y_str, str, TC_FROMSTRING, max_width);
 			y_str += 11;
@@ -191,10 +216,12 @@
 			str = STR_4827_PRODUCES;
 			p = 0;
 			SetDParam(0, STR_00D0_NOTHING);
+			SetDParam(1, STR_EMPTY);
 			for (byte j = 0; j < lengthof(indsp->produced_cargo); j++) {
 				if (indsp->produced_cargo[j] == CT_INVALID) continue;
 				if (p > 0) str++;
 				SetDParam(p++, GetCargo(indsp->produced_cargo[j])->name);
+				SetDParam(p++, GetCargoSuffix(j + 3, NULL, WP(w, fnd_d).select, indsp));
 			}
 			DrawStringTruncated(x_str, y_str, str, TC_FROMSTRING, max_width);
 			y_str += 11;
@@ -391,7 +418,6 @@
 	IVW_INFO,
 	IVW_GOTO,
 	IVW_SPACER,
-	IVW_RESIZE_WIDGET,
 };
 
 /** Information to store about the industry window */
@@ -407,71 +433,10 @@
 static void IndustryViewWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: {
-		/* Count the number of lines that we need to resize the GUI with */
-		const Industry *i = GetIndustry(w->window_number);
-		const IndustrySpec *ind = GetIndustrySpec(i->type);
-		int lines = -3;
-		bool first = true;
-		bool has_accept = false;
-
-		if (HasBit(ind->callback_flags, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(ind->callback_flags, CBM_IND_PRODUCTION_256_TICKS)) {
-			for (byte j = 0; j < lengthof(i->accepts_cargo); j++) {
-				if (i->accepts_cargo[j] == CT_INVALID) continue;
-				has_accept = true;
-				if (first) {
-					lines++;
-					first = false;
-				}
-				lines++;
-			}
-		} else {
-			for (byte j = 0; j < lengthof(i->accepts_cargo); j++) {
-				if (i->accepts_cargo[j] == CT_INVALID) continue;
-				has_accept = true;
-				lines++;
-				break;
-			}
-		}
-
-		first = true;
-		for (byte j = 0; j < lengthof(i->produced_cargo); j++) {
-			if (i->produced_cargo[j] == CT_INVALID) continue;
-			if (first) {
-				if (has_accept) lines++;
-				lines++;
-				first = false;
-			}
-			lines++;
-		}
-
-		if (HasBit(ind->callback_flags, CBM_IND_WINDOW_MORE_TEXT)) {
-			lines += 2;
-		} else {
-			/* Remove the resizing option from the widgets. Do it before the Hiding since it will be overwritten */
-			for (byte j = IVW_INFO; j <= IVW_RESIZE_WIDGET; j++) {
-				w->widget[j].display_flags = RESIZE_NONE;
-			}
-			/* Hide the resize button and enlarge the spacer so it will take its place */
-			w->HideWidget(IVW_RESIZE_WIDGET);
-			w->widget[IVW_SPACER].right = w->widget[IVW_RESIZE_WIDGET].right;
-		}
-
-		lines *= 10;
-
-		/* Resize the widgets for the new size, given by the addition of cargos */
-		for (byte j = IVW_INFO; j <= IVW_RESIZE_WIDGET; j++) {
-			if (j != IVW_INFO) w->widget[j].top += lines;
-			w->widget[j].bottom += lines;
-		}
-		w->height += lines;
-		w->resize.height += lines;
-	} break;
-
 	case WE_PAINT: {
 		Industry *i = GetIndustry(w->window_number);
 		const IndustrySpec *ind = GetIndustrySpec(i->type);
-		int y = 111;
+		int y = w->widget[IVW_INFO].top + 1;
 		bool first = true;
 		bool has_accept = false;
 
@@ -489,6 +454,7 @@
 				}
 				SetDParam(0, i->accepts_cargo[j]);
 				SetDParam(1, i->incoming_cargo_waiting[j]);
+				SetDParam(2, GetCargoSuffix(j, i, i->type, ind));
 				DrawString(4, y, STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO, TC_FROMSTRING);
 				y += 10;
 			}
@@ -500,6 +466,7 @@
 				has_accept = true;
 				if (p > 0) str++;
 				SetDParam(p++, GetCargo(i->accepts_cargo[j])->name);
+				SetDParam(p++, GetCargoSuffix(j, i, i->type, ind));
 			}
 			if (has_accept) {
 				DrawString(2, y, str, TC_FROMSTRING);
@@ -520,8 +487,9 @@
 
 			SetDParam(0, i->produced_cargo[j]);
 			SetDParam(1, i->last_month_production[j]);
+			SetDParam(2, GetCargoSuffix(j + 3, i, i->type, ind));
 
-			SetDParam(2, i->last_month_pct_transported[j] * 100 >> 8);
+			SetDParam(3, i->last_month_pct_transported[j] * 100 >> 8);
 			DrawString(4 + (IsProductionAlterable(i) ? 30 : 0), y, STR_482B_TRANSPORTED, TC_FROMSTRING);
 			/* Let's put out those buttons.. */
 			if (IsProductionAlterable(i)) {
@@ -542,12 +510,19 @@
 
 					PrepareTextRefStackUsage(6);
 					/* Use all the available space left from where we stand up to the end of the window */
-					DrawStringMultiLine(2, y, message, wi->right - wi->left - 4, wi->bottom - y);
+					y += DrawStringMultiLine(2, y, message, wi->right - wi->left - 4, -1);
 					StopTextRefStackUsage();
 				}
 			}
 		}
 
+		if (y > w->widget[IVW_INFO].bottom) {
+			SetWindowDirty(w);
+			ResizeWindowForWidget(w, IVW_INFO, 0, y - w->widget[IVW_INFO].top);
+			SetWindowDirty(w);
+			return;
+		}
+
 		DrawWindowViewport(w);
 	} break;
 
@@ -631,18 +606,17 @@
 {  WWT_STICKYBOX,   RESIZE_NONE,     9,   248,   259,     0,    13, 0x0,               STR_STICKY_BUTTON},                // IVW_STICKY
 {      WWT_PANEL,   RESIZE_NONE,     9,     0,   259,    14,   105, 0x0,               STR_NULL},                         // IVW_BACKGROUND
 {      WWT_INSET,   RESIZE_NONE,     9,     2,   257,    16,   103, 0x0,               STR_NULL},                         // IVW_VIEWPORT
-{      WWT_PANEL, RESIZE_BOTTOM,     9,     0,   259,   106,   147, 0x0,               STR_NULL},                         // IVW_INFO
-{ WWT_PUSHTXTBTN,     RESIZE_TB,     9,     0,   129,   148,   159, STR_00E4_LOCATION, STR_482C_CENTER_THE_MAIN_VIEW_ON}, // IVW_GOTO
-{      WWT_PANEL,     RESIZE_TB,     9,   130,   247,   148,   159, 0x0,               STR_NULL},                         // IVW_SPACER
-{  WWT_RESIZEBOX,     RESIZE_TB,     9,   248,   259,   148,   159, 0x0,               STR_RESIZE_BUTTON},                // IVW_RESIZE_WIDGET
+{      WWT_PANEL, RESIZE_BOTTOM,     9,     0,   259,   106,   107, 0x0,               STR_NULL},                         // IVW_INFO
+{ WWT_PUSHTXTBTN,     RESIZE_TB,     9,     0,   129,   108,   119, STR_00E4_LOCATION, STR_482C_CENTER_THE_MAIN_VIEW_ON}, // IVW_GOTO
+{      WWT_PANEL,     RESIZE_TB,     9,   130,   259,   108,   119, 0x0,               STR_NULL},                         // IVW_SPACER
 {   WIDGETS_END},
 };
 
 /** Window definition of the view industy gui */
 static const WindowDesc _industry_view_desc = {
-	WDP_AUTO, WDP_AUTO, 260, 160, 260, 160,
+	WDP_AUTO, WDP_AUTO, 260, 120, 260, 120,
 	WC_INDUSTRY_VIEW, WC_NONE,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON,
 	_industry_view_widgets,
 	IndustryViewWndProc
 };
--- a/src/landscape.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/landscape.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -72,7 +72,6 @@
  */
 uint ApplyFoundationToSlope(Foundation f, Slope *s)
 {
-
 	if (!IsFoundation(f)) return 0;
 
 	if (IsLeveledFoundation(f)) {
@@ -116,6 +115,13 @@
 }
 
 
+/**
+ * Determines height at given coordinate of a slope
+ * @param x x coordinate
+ * @param y y coordinate
+ * @param corners slope to examine
+ * @return height of given point of given slope
+ */
 uint GetPartialZ(int x, int y, Slope corners)
 {
 	if (IsHalftileSlope(corners)) {
@@ -143,91 +149,99 @@
 	int z = 0;
 
 	switch (RemoveHalftileSlope(corners)) {
-	case SLOPE_W:
-		if (x - y >= 0)
-			z = (x - y) >> 1;
-		break;
-
-	case SLOPE_S:
-		y ^= 0xF;
-		if ( (x - y) >= 0)
-			z = (x - y) >> 1;
-		break;
-
-	case SLOPE_SW:
-		z = (x >> 1) + 1;
-		break;
-
-	case SLOPE_E:
-		if (y - x >= 0)
-			z = (y - x) >> 1;
-		break;
-
-	case SLOPE_EW:
-	case SLOPE_NS:
-	case SLOPE_ELEVATED:
-		z = 4;
-		break;
-
-	case SLOPE_SE:
-		z = (y >> 1) + 1;
-		break;
-
-	case SLOPE_WSE:
-		z = 8;
-		y ^= 0xF;
-		if (x - y < 0)
-			z += (x - y) >> 1;
-		break;
+		case SLOPE_W:
+			if (x - y >= 0) {
+				z = (x - y) >> 1;
+			}
+			break;
 
-	case SLOPE_N:
-		y ^= 0xF;
-		if (y - x >= 0)
-			z = (y - x) >> 1;
-		break;
-
-	case SLOPE_NW:
-		z = (y ^ 0xF) >> 1;
-		break;
-
-	case SLOPE_NWS:
-		z = 8;
-		if (x - y < 0)
-			z += (x - y) >> 1;
-		break;
-
-	case SLOPE_NE:
-		z = (x ^ 0xF) >> 1;
-		break;
+		case SLOPE_S:
+			y ^= 0xF;
+			if ((x - y) >= 0) {
+				z = (x - y) >> 1;
+			}
+			break;
 
-	case SLOPE_ENW:
-		z = 8;
-		y ^= 0xF;
-		if (y - x < 0)
-			z += (y - x) >> 1;
-		break;
-
-	case SLOPE_SEN:
-		z = 8;
-		if (y - x < 0)
-			z += (y - x) >> 1;
-		break;
+		case SLOPE_SW:
+			z = (x >> 1) + 1;
+			break;
 
-	case SLOPE_STEEP_S:
-		z = 1 + ((x + y) >> 1);
-		break;
+		case SLOPE_E:
+			if (y - x >= 0) {
+				z = (y - x) >> 1;
+			}
+			break;
 
-	case SLOPE_STEEP_W:
-		z = 1 + ((x + (y ^ 0xF)) >> 1);
-		break;
+		case SLOPE_EW:
+		case SLOPE_NS:
+		case SLOPE_ELEVATED:
+			z = 4;
+			break;
 
-	case SLOPE_STEEP_N:
-		z = 1 + (((x ^ 0xF) + (y ^ 0xF)) >> 1);
-		break;
+		case SLOPE_SE:
+			z = (y >> 1) + 1;
+			break;
 
-	case SLOPE_STEEP_E:
-		z = 1 + (((x ^ 0xF) + y) >> 1);
-		break;
+		case SLOPE_WSE:
+			z = 8;
+			y ^= 0xF;
+			if (x - y < 0) {
+				z += (x - y) >> 1;
+			}
+			break;
+
+		case SLOPE_N:
+			y ^= 0xF;
+			if (y - x >= 0) {
+				z = (y - x) >> 1;
+			}
+			break;
+
+		case SLOPE_NW:
+			z = (y ^ 0xF) >> 1;
+			break;
+
+		case SLOPE_NWS:
+			z = 8;
+			if (x - y < 0) {
+				z += (x - y) >> 1;
+			}
+			break;
+
+		case SLOPE_NE:
+			z = (x ^ 0xF) >> 1;
+			break;
+
+		case SLOPE_ENW:
+			z = 8;
+			y ^= 0xF;
+			if (y - x < 0) {
+				z += (y - x) >> 1;
+			}
+			break;
+
+		case SLOPE_SEN:
+			z = 8;
+			if (y - x < 0) {
+				z += (y - x) >> 1;
+			}
+			break;
+
+		case SLOPE_STEEP_S:
+			z = 1 + ((x + y) >> 1);
+			break;
+
+		case SLOPE_STEEP_W:
+			z = 1 + ((x + (y ^ 0xF)) >> 1);
+			break;
+
+		case SLOPE_STEEP_N:
+			z = 1 + (((x ^ 0xF) + (y ^ 0xF)) >> 1);
+			break;
+
+		case SLOPE_STEEP_E:
+			z = 1 + (((x ^ 0xF) + y) >> 1);
+			break;
 
 		default: break;
 	}
@@ -552,35 +566,29 @@
  */
 CommandCost CmdClearArea(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	CommandCost ret, money;
-	CommandCost cost(EXPENSES_CONSTRUCTION);
-	int ex;
-	int ey;
-	int sx, sy;
-	int x, y;
-	bool success = false;
-
 	if (p1 >= MapSize()) return CMD_ERROR;
 
 	/* make sure sx,sy are smaller than ex,ey */
-	ex = TileX(tile);
-	ey = TileY(tile);
-	sx = TileX(p1);
-	sy = TileY(p1);
+	int ex = TileX(tile);
+	int ey = TileY(tile);
+	int sx = TileX(p1);
+	int sy = TileY(p1);
 	if (ex < sx) Swap(ex, sx);
 	if (ey < sy) Swap(ey, sy);
 
-	money.AddCost(GetAvailableMoneyForCommand());
+	Money money = GetAvailableMoneyForCommand();
+	CommandCost cost(EXPENSES_CONSTRUCTION);
+	bool success = false;
 
-	for (x = sx; x <= ex; ++x) {
-		for (y = sy; y <= ey; ++y) {
-			ret = DoCommand(TileXY(x, y), 0, 0, flags & ~DC_EXEC, CMD_LANDSCAPE_CLEAR);
+	for (int x = sx; x <= ex; ++x) {
+		for (int y = sy; y <= ey; ++y) {
+			CommandCost ret = DoCommand(TileXY(x, y), 0, 0, flags & ~DC_EXEC, CMD_LANDSCAPE_CLEAR);
 			if (CmdFailed(ret)) continue;
 			success = true;
 
 			if (flags & DC_EXEC) {
-				money.AddCost(-ret.GetCost());
-				if (ret.GetCost() > 0 && money.GetCost() < 0) {
+				money -= ret.GetCost();
+				if (ret.GetCost() > 0 && money < 0) {
 					_additional_cash_required = ret.GetCost();
 					return cost;
 				}
@@ -609,13 +617,10 @@
 
 void RunTileLoop()
 {
-	TileIndex tile;
-	uint count;
+	TileIndex tile = _cur_tileloop_tile;
 
-	tile = _cur_tileloop_tile;
-
-	assert( (tile & ~TILELOOP_ASSERTMASK) == 0);
-	count = (MapSizeX() / TILELOOP_SIZE) * (MapSizeY() / TILELOOP_SIZE);
+	assert((tile & ~TILELOOP_ASSERTMASK) == 0);
+	uint count = (MapSizeX() / TILELOOP_SIZE) * (MapSizeY() / TILELOOP_SIZE);
 	do {
 		_tile_type_procs[GetTileType(tile)]->tile_loop_proc(tile);
 
@@ -624,12 +629,13 @@
 		} else {
 			tile = TILE_MASK(tile - TILELOOP_SIZE * (MapSizeX() / TILELOOP_SIZE - 1) + TileDiffXY(0, TILELOOP_SIZE)); /* x would overflow, also increase y */
 		}
-	} while (--count);
-	assert( (tile & ~TILELOOP_ASSERTMASK) == 0);
+	} while (--count != 0);
+	assert((tile & ~TILELOOP_ASSERTMASK) == 0);
 
 	tile += 9;
-	if (tile & TILELOOP_CHKMASK)
+	if (tile & TILELOOP_CHKMASK) {
 		tile = (tile + MapSizeX()) & TILELOOP_ASSERTMASK;
+	}
 	_cur_tileloop_tile = tile;
 }
 
@@ -638,10 +644,10 @@
 	uint maxx = MapMaxX();
 	uint maxy = MapMaxY();
 	uint sizex = MapSizeX();
-	uint x;
+
 	uint y;
-
 	for (y = 0; y < maxy; y++) {
+		uint x;
 		for (x = 0; x < maxx; x++) {
 			MakeClear(sizex * y + x, CLEAR_GRASS, 3);
 			SetTileHeight(sizex * y + x, 0);
@@ -650,49 +656,38 @@
 		}
 		MakeVoid(sizex * y + x);
 	}
-	for (x = 0; x < sizex; x++) MakeVoid(sizex * y + x);
+	for (uint x = 0; x < sizex; x++) MakeVoid(sizex * y + x);
 }
 
 static const byte _genterrain_tbl_1[5] = { 10, 22, 33, 37, 4  };
 static const byte _genterrain_tbl_2[5] = {  0,  0,  0,  0, 33 };
 
-static void GenerateTerrain(int type, int flag)
+static void GenerateTerrain(int type, uint flag)
 {
-	uint32 r;
-	uint x;
-	uint y;
-	uint w;
-	uint h;
-	const Sprite* templ;
-	const byte *p;
-	Tile* tile;
-	byte direction;
+	uint32 r = Random();
 
-	r = Random();
-	templ = GetSprite((((r >> 24) * _genterrain_tbl_1[type]) >> 8) + _genterrain_tbl_2[type] + 4845);
+	const Sprite *templ = GetSprite((((r >> 24) * _genterrain_tbl_1[type]) >> 8) + _genterrain_tbl_2[type] + 4845);
 
-	x = r & MapMaxX();
-	y = (r >> MapLogX()) & MapMaxY();
-
+	uint x = r & MapMaxX();
+	uint y = (r >> MapLogX()) & MapMaxY();
 
 	if (x < 2 || y < 2) return;
 
-	direction = GB(r, 22, 2);
-	if (direction & 1) {
-		w = templ->height;
-		h = templ->width;
-	} else {
-		w = templ->width;
-		h = templ->height;
-	}
-	p = templ->data;
+	DiagDirection direction = (DiagDirection)GB(r, 22, 2);
+	uint w = templ->width;
+	uint h = templ->height;
 
-	if (flag & 4) {
+	if (DiagDirToAxis(direction) == AXIS_Y) Swap(w, h);
+
+	const byte *p = templ->data;
+
+	if ((flag & 4) != 0) {
 		uint xw = x * MapSizeY();
 		uint yw = y * MapSizeX();
 		uint bias = (MapSizeX() + MapSizeY()) * 16;
 
 		switch (flag & 3) {
+			default: NOT_REACHED();
 			case 0:
 				if (xw + yw > MapSize() - bias) return;
 				break;
@@ -714,15 +709,15 @@
 	if (x + w >= MapMaxX() - 1) return;
 	if (y + h >= MapMaxY() - 1) return;
 
-	tile = &_m[TileXY(x, y)];
+	Tile *tile = &_m[TileXY(x, y)];
 
 	switch (direction) {
-		case 0:
+		default: NOT_REACHED();
+		case DIAGDIR_NE:
 			do {
-				Tile* tile_cur = tile;
-				uint w_cur;
+				Tile *tile_cur = tile;
 
-				for (w_cur = w; w_cur != 0; --w_cur) {
+				for (uint w_cur = w; w_cur != 0; --w_cur) {
 					if (*p >= tile_cur->type_height) tile_cur->type_height = *p;
 					p++;
 					tile_cur++;
@@ -731,27 +726,25 @@
 			} while (--h != 0);
 			break;
 
-		case 1:
+		case DIAGDIR_SE:
 			do {
-				Tile* tile_cur = tile;
-				uint h_cur;
+				Tile *tile_cur = tile;
 
-				for (h_cur = h; h_cur != 0; --h_cur) {
+				for (uint h_cur = h; h_cur != 0; --h_cur) {
 					if (*p >= tile_cur->type_height) tile_cur->type_height = *p;
 					p++;
 					tile_cur += TileDiffXY(0, 1);
 				}
-				tile++;
+				tile += TileDiffXY(1, 0);
 			} while (--w != 0);
 			break;
 
-		case 2:
+		case DIAGDIR_SW:
 			tile += TileDiffXY(w - 1, 0);
 			do {
-				Tile* tile_cur = tile;
-				uint w_cur;
+				Tile *tile_cur = tile;
 
-				for (w_cur = w; w_cur != 0; --w_cur) {
+				for (uint w_cur = w; w_cur != 0; --w_cur) {
 					if (*p >= tile_cur->type_height) tile_cur->type_height = *p;
 					p++;
 					tile_cur--;
@@ -760,18 +753,17 @@
 			} while (--h != 0);
 			break;
 
-		case 3:
+		case DIAGDIR_NW:
 			tile += TileDiffXY(0, h - 1);
 			do {
-				Tile* tile_cur = tile;
-				uint h_cur;
+				Tile *tile_cur = tile;
 
-				for (h_cur = h; h_cur != 0; --h_cur) {
+				for (uint h_cur = h; h_cur != 0; --h_cur) {
 					if (*p >= tile_cur->type_height) tile_cur->type_height = *p;
 					p++;
 					tile_cur -= TileDiffXY(0, 1);
 				}
-				tile++;
+				tile += TileDiffXY(1, 0);
 			} while (--w != 0);
 			break;
 	}
@@ -782,12 +774,10 @@
 
 static void CreateDesertOrRainForest()
 {
-	TileIndex tile;
 	TileIndex update_freq = MapSize() / 4;
 	const TileIndexDiffC *data;
-	uint i;
 
-	for (tile = 0; tile != MapSize(); ++tile) {
+	for (TileIndex tile = 0; tile != MapSize(); ++tile) {
 		if ((tile % update_freq) == 0) IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
 
 		for (data = _make_desert_or_rainforest_data;
@@ -799,13 +789,13 @@
 			SetTropicZone(tile, TROPICZONE_DESERT);
 	}
 
-	for (i = 0; i != 256; i++) {
+	for (uint i = 0; i != 256; i++) {
 		if ((i % 64) == 0) IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
 
 		RunTileLoop();
 	}
 
-	for (tile = 0; tile != MapSize(); ++tile) {
+	for (TileIndex tile = 0; tile != MapSize(); ++tile) {
 		if ((tile % update_freq) == 0) IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
 
 		for (data = _make_desert_or_rainforest_data;
@@ -820,10 +810,7 @@
 
 void GenerateLandscape(byte mode)
 {
-	const int gwp_desert_amount = 4 + 8;
-	uint i;
-	uint flag;
-	uint32 r;
+	static const int gwp_desert_amount = 4 + 8;
 
 	if (mode == GW_HEIGHTMAP) {
 		SetGeneratingWorldProgress(GWP_LANDSCAPE, (_opt.landscape == LT_TROPIC) ? 1 + gwp_desert_amount : 1);
@@ -834,54 +821,58 @@
 		GenerateTerrainPerlin();
 	} else {
 		switch (_opt.landscape) {
-			case LT_ARCTIC:
+			case LT_ARCTIC: {
 				SetGeneratingWorldProgress(GWP_LANDSCAPE, 2);
 
-				for (i = ScaleByMapSize((Random() & 0x7F) + 950); i != 0; --i) {
+				uint32 r = Random();
+
+				for (uint i = ScaleByMapSize(GB(r, 0, 7) + 950); i != 0; --i) {
 					GenerateTerrain(2, 0);
 				}
 				IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
 
-				r = Random();
-				flag = GB(r, 0, 2) | 4;
-				for (i = ScaleByMapSize(GB(r, 16, 7) + 450); i != 0; --i) {
+				uint flag = GB(r, 7, 2) | 4;
+				for (uint i = ScaleByMapSize(GB(r, 9, 7) + 450); i != 0; --i) {
 					GenerateTerrain(4, flag);
 				}
 				IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
-				break;
+			} break;
 
-			case LT_TROPIC:
+			case LT_TROPIC: {
 				SetGeneratingWorldProgress(GWP_LANDSCAPE, 3 + gwp_desert_amount);
 
-				for (i = ScaleByMapSize((Random() & 0x7F) + 170); i != 0; --i) {
+				uint32 r = Random();
+
+				for (uint i = ScaleByMapSize(GB(r, 0, 7) + 170); i != 0; --i) {
 					GenerateTerrain(0, 0);
 				}
 				IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
 
-				r = Random();
-				flag = GB(r, 0, 2) | 4;
-				for (i = ScaleByMapSize(GB(r, 16, 8) + 1700); i != 0; --i) {
+				uint flag = GB(r, 7, 2) | 4;
+				for (uint i = ScaleByMapSize(GB(r, 9, 8) + 1700); i != 0; --i) {
 					GenerateTerrain(0, flag);
 				}
 				IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
 
 				flag ^= 2;
 
-				for (i = ScaleByMapSize((Random() & 0x7F) + 410); i != 0; --i) {
+				for (uint i = ScaleByMapSize(GB(r, 17, 7) + 410); i != 0; --i) {
 					GenerateTerrain(3, flag);
 				}
 				IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
-				break;
+			} break;
 
-			default:
+			default: {
 				SetGeneratingWorldProgress(GWP_LANDSCAPE, 1);
 
-				i = ScaleByMapSize((Random() & 0x7F) + (3 - _opt.diff.quantity_sea_lakes) * 256 + 100);
+				uint32 r = Random();
+
+				uint i = ScaleByMapSize(GB(r, 0, 7) + (3 - _opt.diff.quantity_sea_lakes) * 256 + 100);
 				for (; i != 0; --i) {
 					GenerateTerrain(_opt.diff.terrain_type, 0);
 				}
 				IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
-				break;
+			} break;
 		}
 	}
 
--- a/src/lang/afrikaans.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/afrikaans.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1061,7 +1061,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Outohernuwe minimum vereisde geld vir hernuwe: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Duur van fout boodskap: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Toon dorp populasie in die dorp naam etiket: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Onsigbaar boome (met deurskynend geboue): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Land genereerder: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Oorspronklik
@@ -1970,20 +1969,20 @@
 STR_4826_SUGAR_MINE                                             :Suiker Myn
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Vereis: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Vrag wag om geprosesseer te wees:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produseer: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produseer: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produseer: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produseer: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produksie verlede maand:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% uitgevoer)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% uitgevoer)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Senter skerm op nywerheid
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nuwe {STRING} onder opbou naby {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nuwe {STRING} word naby {TOWN} beplant!
@@ -2609,26 +2608,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Burgers herdenk . . .{}Eerste trein arriveer by {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Aanwyse)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Trein in die weg
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Gaan na {STATION}
-STR_GO_TO_TRANSFER                                              :Gaan na {STATION} (Oordrag en vat vrag)
-STR_8807_GO_TO_UNLOAD                                           :Gaan na {STATION} (Aflaai)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Gaan na {STATION} (Oordrag en verlaat leeg)
-STR_8808_GO_TO_LOAD                                             :Gaan na {STATION} (Laai)
-STR_GO_TO_TRANSFER_LOAD                                         :Gaan na {STATION} (Oordrag en wag vir volle lading)
-STR_880A_GO_NON_STOP_TO                                         :Gaan deurgaande na {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Gaan deurgaande na {STATION} (Oordra en neem vrag)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Gaan deurgaande na {STATION} (Aflaai)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Gaan deurgaande na {STATION} (Oordra en verlaat leë)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Gaan deurgaande na {STATION} (Laai)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Gaan deurgaande na {STATION} (Oordra en wag vir volle lading)
 STR_GO_TO_TRAIN_DEPOT                                           :Gaan na {TOWN} Trein Depot
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Diens by {TOWN} Trein Depot
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Gaan deurgaande na {TOWN} Trein Depot
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Diens deurgaande by {TOWN} Trein Depot
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Reis (Nie gerooster nie)
 STR_TIMETABLE_TRAVEL_FOR                                        :Reis vir {STRING}
 STR_TIMETABLE_STAY_FOR                                          :en bly vir {STRING}
@@ -2680,7 +2664,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Skakel na die rooster uitsig
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Opdrae)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Einde van Opdrae - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Diens
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Kan nie spoorweg voertuig bou nie...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Gebou: {LTBLUE}{NUM}{BLACK} Waarde: {LTBLUE}{CURRENCY}
--- a/src/lang/brazilian_portuguese.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/brazilian_portuguese.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -2,7 +2,6 @@
 ##ownname Português (BR)
 ##isocode pt_BR
 ##plural 2
-##case m f
 ##gender m f
 
 #
@@ -1052,6 +1051,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permitir o envio de dinheiro a outras empresas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estações não uniformes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicador de peso para trens simulando trens pesados: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Fator de velocidade para aeronaves: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permitir estações drive-through em ruas locais: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permitir construção de estações adjacentes: {ORANGE}{STRING}
 
@@ -1069,7 +1069,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Dinheiro mínimo para fazer auto-renovação: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Duração das mensagens de erro: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Exibir população da cidade na janela da cidade: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Ãrvores invisíveis (com edifícios transparentes): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Gerador de Terreno: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1174,6 +1173,7 @@
 STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :melhores estradas
 STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :grade 2x2
 STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :grade 3x3
+STR_CONFIG_PATCHES_TOWN_LAYOUT_RANDOM                           :random
 
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Posição da barra de ferramentas principal: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Esquerda
@@ -1353,6 +1353,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Nome:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Este é o nome pelo qual os outros jogadores irão te identificar
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Coloque seu nome
 STR_NETWORK_CONNECTION                                          :{BLACK}Conexão:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Escolha entre um jogo pela Internet ou pela rede local
 
@@ -1396,6 +1397,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Nome do jogo:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}O nome do jogo será exibido aos outros jogadores no menu de seleção de jogos multi-jogador
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Coloque o nome para o jogo em rede
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Definir senha
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Proteja o jogo com uma senha se não desejar que seja publicamente acessível
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Selecionar um mapa:
@@ -1452,6 +1454,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :Sueco
 STR_NETWORK_LANG_TURKISH                                        :Turco
 STR_NETWORK_LANG_UKRAINIAN                                      :Ucraniano
+STR_NETWORK_LANG_AFRIKAANS                                      :Africano
+STR_NETWORK_LANG_CROATIAN                                       :Croata
+STR_NETWORK_LANG_CATALAN                                        :Catalão
+STR_NETWORK_LANG_ESTONIAN                                       :Estoniano
+STR_NETWORK_LANG_GALICIAN                                       :Galego
+STR_NETWORK_LANG_GREEK                                          :Grego
+STR_NETWORK_LANG_LATVIAN                                        :Letão
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Sala de espera do jogo
@@ -1550,6 +1559,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Privado] Para {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[Todos] :
 STR_NETWORK_CHAT_ALL                                            :[Todos] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Coloque o texto para o jogo em rede
 STR_NETWORK_NAME_CHANGE                                         :mudou o nome dele/dela para
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} O servidor fechou a sessão
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} O servidor está reiniciando...{}Aguarde...
@@ -1613,6 +1623,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Tipo de linha não apropriado
 STR_1007_ALREADY_BUILT                                          :{WHITE}...já construído
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Deve remover a ferrovia primeiro
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Rua é mão única ou está bloqueado
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Construir ferrovias
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Construir ferrovias (elétricas)
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Construir ferrovias (monotrilho)
@@ -1715,6 +1726,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}O edifício deve ser demolido primeiro
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Cidade)
 STR_2006_POPULATION                                             :{BLACK}População: {ORANGE}{COMMA}{BLACK}  Casas: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Renomear Cidade
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Impossível renomear cidade...
@@ -1806,8 +1818,6 @@
 STR_INDUSTRY                                                    :{INDUSTRY}
 STR_TOWN                                                        :{TOWN}
 STR_INDUSTRY_FORMAT                                             :{1:STRING} de {0:TOWN}
-STR_INDUSTRY_FORMAT.f                                           :{G=f}{1:STRING} de {0:TOWN}
-STR_INDUSTRY_FORMAT.m                                           :{G=m}{1:STRING} de {0:TOWN}
 STR_STATION                                                     :{STATION}
 
 ##id 0x2800
@@ -1953,6 +1963,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Selecionar cenário (verde), jogo pré-programado (azul), ou novo jogo aleatório
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Gerar novo jogo aleatório
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Carregar Relevo
+STR_SAVE_OSKTITLE                                               :{BLACK}Coloque o nome para o jogo salvo
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} no caminho
@@ -1996,20 +2007,20 @@
 STR_4826_SUGAR_MINE                                             :{G=f}Mina de Açúcar
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Requer: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Requer: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Requer: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Requer: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Requer: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Requer: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Carga aguardando processamento
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produz: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produz: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produz: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produz: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produção no mês passado:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportado)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportado)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centralizar visualização na localização da indústria
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nov{G o a} {STRING} em construção em {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nov{G o a} {STRING} sendo plantada em {TOWN}!
@@ -2642,26 +2653,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Cidadãos celebram . . .{}Primeiro trem chega a {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detalhes)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Trem no caminho
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Ir para {STATION}
-STR_GO_TO_TRANSFER                                              :Ir para {STATION} (Transferir e carregar)
-STR_8807_GO_TO_UNLOAD                                           :Ir para {STATION} (Descarregar)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Ir para {STATION} (Transferir e deixar vazio)
-STR_8808_GO_TO_LOAD                                             :Ir para {STATION} (Carregar)
-STR_GO_TO_TRANSFER_LOAD                                         :Ir para {STATION} (Trasferir e aguardar carga total)
-STR_880A_GO_NON_STOP_TO                                         :Ir sem parar para {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Ir sem parar para {STATION} (Transferir e carregar)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Ir sem parar para {STATION} (Descarregar)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Ir sem parar para {STATION} (Transferir e deixar vazio)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Ir sem parar para {STATION} (Carregar)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Ir sem parar para {STATION} (Trasferir e aguardar carga total)
 STR_GO_TO_TRAIN_DEPOT                                           :Ir para o depósito de {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Manutenção no depósito de {TOWN}
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Ir sem parar para o depósito de {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Manutenção no depósito de {TOWN} sem parar
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Viajar (não progamado)
 STR_TIMETABLE_TRAVEL_FOR                                        :Viajar para {STRING}
 STR_TIMETABLE_STAY_FOR                                          :e ficar durante {STRING}
@@ -2711,9 +2707,10 @@
 STR_REFIT_ORDER                                                 :(Adaptar para {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}Plano de horário
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Exibe o plano de horário
+STR_ORDER_VIEW                                                  :{BLACK}Ordens
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}Alternar para ver as ordens
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordens)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fim de Ordens - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Manutenção
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Impossível construir veículo ferroviário...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construído: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY}
@@ -3267,6 +3264,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Geração de mundo
 STR_RANDOM_SEED                                                 :{BLACK}Semente:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Clique para digitar uma semente
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Coloque uma semente randomica
 STR_LAND_GENERATOR                                              :{BLACK}Gerador de terra
 STR_TREE_PLACER                                                 :{BLACK}Algorítimo de árvores
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Rotação do mapa em relevo:
@@ -3414,6 +3412,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Próxima Placa
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Placa anterior
+STR_SIGN_OSKTITLE                                               :{BLACK}Coloque um nome para a placa
 
 ########
 
@@ -3486,3 +3485,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Diminuir a densidade dos sinais
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Aumentar a densidade dos sinais
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :`1234567890-=\qwertyuiop[]asdfghjkl;'  zxcvbnm,./ .
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:"  ZXCVBNM<>? .
+########
--- a/src/lang/bulgarian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/bulgarian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1052,6 +1052,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Позволи изпращане на пари до други компаний: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}ÐеÑтандартни Ñтанции: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Теглови множител към товарите за ÑÐ¸Ð¼ÑƒÐ»Ð°Ñ†Ð¸Ñ Ð½Ð° тежки влакове: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}СкороÑтоопределÑща: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Преминаване през Ñпирки на градÑки пътища: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}ПозвалÑвай допрени гари: {ORANGE}{STRING}
 
@@ -1069,7 +1070,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Ðвтоматично възÑтановÑване на минималната Ñума пари необходима за започване отначало: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}ПродължителноÑÑ‚ на ÑъобщениÑта за грешки: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}ÐаÑелението на града в етикета Ñ Ð¸Ð¼ÐµÑ‚Ð¾ на града: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Ðевидими дървета (Ñ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ð¸ Ñгради): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Генератор на земÑ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Оригинал
@@ -1353,6 +1353,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Име на играч:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Чрез това име другите играчи ще ви идентифицират
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Въведете името Ñи
 STR_NETWORK_CONNECTION                                          :{BLACK}Връзка:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Избор между игра в интернет или локална мрежа (LAN)
 
@@ -1396,6 +1397,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Име на игра:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Името на играта ще Ñе вижда от другите играчи при избор на игра
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Въведете име за мрежовата игра
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}ПоÑтавÑне на парола
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Защитаване на вашата игра Ñ Ð¿Ð°Ñ€Ð¾Ð»Ð° за да не е публично доÑтъпна
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Избор на карта:
@@ -1452,6 +1454,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :ШведÑки
 STR_NETWORK_LANG_TURKISH                                        :ТурÑки
 STR_NETWORK_LANG_UKRAINIAN                                      :УкраинÑки
+STR_NETWORK_LANG_AFRIKAANS                                      :ÐфрикаанÑ
+STR_NETWORK_LANG_CROATIAN                                       :ХърватÑки
+STR_NETWORK_LANG_CATALAN                                        :КаталонÑки
+STR_NETWORK_LANG_ESTONIAN                                       :ЕÑтонÑки
+STR_NETWORK_LANG_GALICIAN                                       :ГалиматиÑ
+STR_NETWORK_LANG_GREEK                                          :Гръцки
+STR_NETWORK_LANG_LATVIAN                                        :ЛатвийÑки
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Преддверие
@@ -1550,6 +1559,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Private] До {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[All] :
 STR_NETWORK_CHAT_ALL                                            :[All] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Въведи текÑÑ‚ за мрежов разговор
 STR_NETWORK_NAME_CHANGE                                         :Ñмени името Ñи на
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Сървъра прекъÑна ÑеÑиÑта
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Сървъра Ñе реÑтартира...{}ÐœÐ¾Ð»Ñ Ð¸Ð·Ñ‡Ð°ÐºÐ°Ð¹Ñ‚Ðµ...
@@ -1613,6 +1623,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}ÐеподходÑщ за употреба релÑов път
 STR_1007_ALREADY_BUILT                                          :{WHITE}...вече е поÑтроено
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Първо трÑбва да премахнеш релÑÐ¾Ð²Ð¸Ñ Ð¿ÑŠÑ‚
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}ПътÑÑ‚ е еднопоÑочен или блокиран
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}КонÑтрукции за ДвурелÑов път
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Строене на електрифицирана ЖП мрежа
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}КонÑтрукции за ЕднорелÑов път
@@ -1715,6 +1726,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Сградата първо трÑбва да бъде разрушена
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Град)
 STR_2006_POPULATION                                             :{BLACK}ÐаÑеление: {ORANGE}{COMMA}{BLACK}  Жилища: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Преименуване на град
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Градът не може да бъде преименуван
@@ -1951,6 +1963,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Избери на Ñценарии (зелено), предварително наÑтроена игра (Ñиньо), или произволна нова игра
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Генерирай произволна нова игра
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Зареди виÑочинна карта
+STR_SAVE_OSKTITLE                                               :{BLACK}Въведете име за запазената игра
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} пречи
@@ -1994,20 +2007,20 @@
 STR_4826_SUGAR_MINE                                             :Захарна мина
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Ðуждае Ñе от: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Ðуждае Ñе от: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Ðуждае Ñе от: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Ðуждае Ñе от: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Ðуждае Ñе от: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Ðуждае Ñе от: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Товар чакащ до бъде преработен:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Произвежда: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Произвежда: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Произвежда: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Произвежда: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Произведено Ð¼Ð¸Ð½Ð°Ð»Ð¸Ñ Ð¼ÐµÑец:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% превозено)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% превозено)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Центриране Ð³Ð»Ð°Ð²Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ† върху индуÑтриÑта
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Ðова {STRING} Ñе Ñтрои близо до {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Ðова {STRING} Ñе заÑажда близо до {TOWN}!
@@ -2640,26 +2653,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Хората празнуват . . .{}Първи влак приÑтигна на {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (ПодробноÑти)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Влак на пътÑ
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Отиди на {STATION}
-STR_GO_TO_TRANSFER                                              :Отиди на {STATION} (Обмени и вземи товар)
-STR_8807_GO_TO_UNLOAD                                           :Отиди на {STATION} (Разтовари)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Отиди на {STATION} (Обмени и не взимай нов товар)
-STR_8808_GO_TO_LOAD                                             :Отиди на {STATION} (Товари)
-STR_GO_TO_TRANSFER_LOAD                                         :Отиди на {STATION} (Обмени и изчакай до пълен товар)
-STR_880A_GO_NON_STOP_TO                                         :Отиди без да Ñпираш на {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Отиди без да Ñпираш на {STATION} (Обмени и вземи товар)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :отиди без да Ñпираш на {STATION} (Разтовари)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Отиди без да Ñпираш на {STATION} (Обмени и не товари)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Отиди без да Ñпираш на {STATION} (Товари)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Отиди без да Ñпираш на {STATION} (Обмени и изчакай до пълен товар)
 STR_GO_TO_TRAIN_DEPOT                                           :Отиди до Влаковото депо на {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Ремонт в {TOWN} влаково депо
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Отиди без да Ñпираш на {TOWN} Влаково депо
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Ремонт без Ñпиране в {TOWN} влаково депо
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Патувай (без разпиÑание)
 STR_TIMETABLE_TRAVEL_FOR                                        :Патувай за {STRING}
 STR_TIMETABLE_STAY_FOR                                          :и оÑтани за {STRING}
@@ -2709,9 +2707,10 @@
 STR_REFIT_ORDER                                                 :(ПреуÑтройÑтво към {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}РазпиÑание
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Виж разпиÑанието
+STR_ORDER_VIEW                                                  :{BLACK}Сортиране
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}Промени ÑортациÑта
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Заповеди)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Край на Заповедите - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Ремонт
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Ðе може да купиш ЖП машина...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Купи: {LTBLUE}{NUM}{BLACK} Цена: {LTBLUE}{CURRENCY}
@@ -2768,7 +2767,7 @@
 STR_TIMETABLE_TOOLTIP                                           :{BLACK}Времетаблица - кликни върху заповед за да Ñ Ð¼Ð°Ñ€ÐºÐ¸Ñ€Ð°Ñˆ.
 STR_TIMETABLE_WAIT_TIME_TOOLTIP                                 :{BLACK}Промени времетраенето на маркираната заповед
 STR_TIMETABLE_CLEAR_TIME_TOOLTIP                                :{BLACK}ИзчиÑти времетраенето на маркираната заповед
-STR_TIMETABLE_RESET_LATENESS_TOOLTIP                            :{BLACK}Преправи закъÑнÑлата бройка, такаче превозните ÑредÑтва да Ñа на време
+STR_TIMETABLE_RESET_LATENESS_TOOLTIP                            :{BLACK}Reset the lateness counter, so the vehicle will be on time
 STR_SERVICE_HINT                                                :{BLACK}ПропуÑни оÑвен ако е необходим ремонт
 STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}Цена: {CURRENCY} Тегло: {WEIGHT_S}{}СкороÑÑ‚: {VELOCITY}  МощноÑÑ‚: {POWER}{}Разход: {CURRENCY}/г.{}Капацитет: {CARGO}
 STR_885C_BROKEN_DOWN                                            :{RED}Развален
@@ -3265,6 +3264,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Световна генерациÑ
 STR_RANDOM_SEED                                                 :{BLACK}Семе на ÑлучайноÑÑ‚:
 STR_RANDOM_SEED_HELP                                            :{BLACK}ÐатиÑнете за въвеждане Ñеме на ÑлучайноÑÑ‚
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Въведи Ñлучаено Ñеме
 STR_LAND_GENERATOR                                              :{BLACK}Генератор на земÑ:
 STR_TREE_PLACER                                                 :{BLACK}Ðлгоритъм за дървета:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Завъртане на виÑочинна карта:
@@ -3355,6 +3355,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Използвай прозрачноÑÑ‚ за Ñгради като гари, депа, пътни точки и виÑÑщи жици
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Използвай прозрачноÑÑ‚ за моÑтове
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Използвай прозрачноÑÑ‚ за Ñгради като фарове и антени, може би в бъдеще за украÑи
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Ðктивирай прозрачноÑÑ‚ за виÑÑщите. CTRL+клик за фикÑиране.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Вклучи прозрачноÑÑ‚ за товарещи указатели
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
@@ -3411,6 +3412,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Отиди до Ñледващиат знак
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Отиди до предишниат знак
+STR_SIGN_OSKTITLE                                               :{BLACK}Въведете име за знакът
 
 ########
 
@@ -3483,3 +3485,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}ÐамалÑва плътноÑта на Ñигналите при влачене
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Увеличава плътноÑта на Ñигналите при влачене
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :`1234567890-.,уеишщкÑдзц;(ÑŒÑаожгтнвмчюйъÑфхпрлб
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :~!?+"%=:/_№ІVыУЕИШЩКСДЗЦ§)ЬЯÐОЖГТÐВМЧЮЙЪЭФХПРЛБ
+########
--- a/src/lang/catalan.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/catalan.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1050,6 +1050,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permet enviar diners a altres companyies: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estacions no uniformes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicador de pes per contenidor per simular trens pesats: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Factor de velocitat dels avions: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permet situar parades en carreteres que són propietat del poble: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permet construir estacions annexes: {ORANGE}{STRING}
 
@@ -1067,7 +1068,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Autorenovació: mínim de diners per renovar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Duració del missatge d'error: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Mostra els habitants a la etiqueta del nom de població: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Arbres invisibles (amb edificis transparents): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Generador de terrenys: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1172,6 +1172,7 @@
 STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :millors carreteres
 STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :graella 2x2
 STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :graella 3x3
+STR_CONFIG_PATCHES_TOWN_LAYOUT_RANDOM                           :aleatori
 
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Posició de la barra d'eines principal: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Esquerra
@@ -1351,6 +1352,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Nom del jugador:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Aquest és el nom amb el que els altres jugadors t'identificaran
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Posa el teu nom
 STR_NETWORK_CONNECTION                                          :{BLACK}Connexió:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Tria entre jugar per internet o jugar en xarxa local
 
@@ -1394,6 +1396,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Nom del joc:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}El nom del joc es mostrarà a altres jugadors en el menú de selecció de joc multijugador
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Posa el nom del joc per xarxa
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Posa una contrasenya
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Protegeix el teu joc amb una contrasenya si no vols que d'altre gent el pugui utilitzar
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Selecciona un mapa:
@@ -1450,6 +1453,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :Suec
 STR_NETWORK_LANG_TURKISH                                        :Turc
 STR_NETWORK_LANG_UKRAINIAN                                      :Ucraïnès
+STR_NETWORK_LANG_AFRIKAANS                                      :Afrikaans
+STR_NETWORK_LANG_CROATIAN                                       :Croat
+STR_NETWORK_LANG_CATALAN                                        :Català
+STR_NETWORK_LANG_ESTONIAN                                       :Estonià
+STR_NETWORK_LANG_GALICIAN                                       :Gallec
+STR_NETWORK_LANG_GREEK                                          :Grec
+STR_NETWORK_LANG_LATVIAN                                        :Letó
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Lobby de partida multijugador
@@ -1548,6 +1558,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Private] a {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[All] :
 STR_NETWORK_CHAT_ALL                                            :[All] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Posa el text pel xat de xarxa
 STR_NETWORK_NAME_CHANGE                                         :ha canviat el seu nom a
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} El servidor ha tancat la sesió
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} El servidor està reiniciant...{}Espera un moment...
@@ -1611,6 +1622,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Via de tren no apropiada
 STR_1007_ALREADY_BUILT                                          :{WHITE}...ja construit
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}S'ha de treure la via primer
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}La carretera és un d'un sol sentit o està bloquejada
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Construcció de Ferrocarril
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Construcció de Ferrocarril Elèctric
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Construcció de Monorail
@@ -1713,6 +1725,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}L'edifici s'ha d'enderrocar primer
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Ciutat)
 STR_2006_POPULATION                                             :{BLACK}Població: {ORANGE}{COMMA}{BLACK}  Cases: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Reanomena Població
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}No es pot reanomenar la població...
@@ -1949,6 +1962,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Selecciona l'escenari (verd), joc pre-programat (blau), o el nou joc aleatori
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Genera un nou joc aleatori
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Carrega un Mapa d'alçades
+STR_SAVE_OSKTITLE                                               :{BLACK}Posa el nom pel joc desat
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} en el camí
@@ -1992,20 +2006,20 @@
 STR_4826_SUGAR_MINE                                             :Mina de Sucre
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Necessita: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Necessita: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Necessita: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Necessita: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Necessita: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Necessita: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Càrrega en espera de ser processada:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produeix: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produeix: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produeix: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produeix: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Producció del darrer mes:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportat)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportat)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centra la pantalla principal al lloc de l'indústria
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nou/nova {STRING} en construcció a prop de {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nou/nova {STRING} s'està plantant a prop de {TOWN}!
@@ -2638,26 +2652,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Celebració popular . . .{} Arribada del 1er. tren a {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detalls)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Tren en el camí
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Ves a {STATION}
-STR_GO_TO_TRANSFER                                              :Ves a {STATION} (Transfereix i agafa càrrega)
-STR_8807_GO_TO_UNLOAD                                           :Ves a {STATION} (Descarrega)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Ves a {STATION} (Transfereix i deixa buit)
-STR_8808_GO_TO_LOAD                                             :Ves a {STATION} (Carrega)
-STR_GO_TO_TRANSFER_LOAD                                         :Ves a {STATION} (Transfereix i espera càrrega completa)
-STR_880A_GO_NON_STOP_TO                                         :Ves sense parar a {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Ves sense parar a {STATION} (Transfereix i agafa càrrega)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Ves sense parar a {STATION} (Descarrega)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Ves sense parar a {STATION} (Transfereix i deixa buit)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Ves sense parar a {STATION} (Carrega)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Ves sense parar a {STATION} (Transfereix i espera càrrega completa)
 STR_GO_TO_TRAIN_DEPOT                                           :Ves al Diposit {TOWN} de Tren
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Manteniment a cotxeres de {TOWN}.
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Ves sense parar a les cotxeres de {TOWN}.
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Manteniment sense parades a cotxeres de {TOWN}.
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Viatge (fora d'horari)
 STR_TIMETABLE_TRAVEL_FOR                                        :Viatge a {STRING}
 STR_TIMETABLE_STAY_FOR                                          :i estigues {STRING}
@@ -2707,9 +2706,10 @@
 STR_REFIT_ORDER                                                 :(Remodela a {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}Horari
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Canvia cap a la vista d'horari
+STR_ORDER_VIEW                                                  :{BLACK}Ordres
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}Commuta l'ordre de la vista
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordres)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fí d'Ordres - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Servei
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}No es pot construir el vehicle...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construit: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY}
@@ -3263,6 +3263,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Generació del món
 STR_RANDOM_SEED                                                 :{BLACK}Nombre aleatori:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Click per introduïr un nombre aleatori
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Posa un valor aleatori
 STR_LAND_GENERATOR                                              :{BLACK}Gen. de terrenys:
 STR_TREE_PLACER                                                 :{BLACK}Algoritme d'arbres:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Rotació del mapa d'alçades:
@@ -3410,6 +3411,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Ves a la propera senyal
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Ves a la senyal anterior
+STR_SIGN_OSKTITLE                                               :{BLACK}Posa el nom del signe
 
 ########
 
@@ -3482,3 +3484,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Disminueix la densitat de senyals en arrossegar
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Incrementa la densitat de senyals en arrossegar
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :`1234567890-=\qwertyuiop[]asdfghjkl;'  zxcvbnm,./ .
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:"  ZXCVBNM<>? .
+########
--- a/src/lang/croatian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/croatian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1067,7 +1067,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Minimum novca potrebnih za automatsko obnavljanje: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Trajanje poruke s greškom: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Pokaži broj stanovnika u oznaci imena grada: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Nevidljivo drveće (s prozirnim građevinama): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Generator zemlje: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Izvorni
@@ -1979,20 +1978,20 @@
 STR_4826_SUGAR_MINE                                             :Rudnik šećera
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Treba: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Treba: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Treba: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Treba: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Treba: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Treba: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Teret koji Äeka obradu:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Proizvodi: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Proizvodi: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Proizvodi: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Proizvodi: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}ProÅ¡lomjeseÄna proizvodnja:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% prevezeno)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% prevezeno)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centriraj glavni pogled na položaj industrije
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}ZapoÄela je izgradnja nove industrije ( {STRING} ) u blizini grada {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nova {STRING} trenutno se sadi blizu grada {TOWN}!
@@ -2623,26 +2622,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Građani slave . . .{}Prvi vlak je stigao na {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detalji)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Vlak na putu
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Idi do {STATION}
-STR_GO_TO_TRANSFER                                              :Idi do {STATION} (Transferiraj i preuzmi teret)
-STR_8807_GO_TO_UNLOAD                                           :Idi do {STATION} (Istovar)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Go to {STATION} (Transferiraj i otiđi prazan)
-STR_8808_GO_TO_LOAD                                             :Idi do{STATION} (Utovar)
-STR_GO_TO_TRANSFER_LOAD                                         :Idi do {STATION} (Transferiraj i priÄekaj puni utovar)
-STR_880A_GO_NON_STOP_TO                                         :Idi neprekidno do {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Idi neprekidno do {STATION} (Transferiraj i preuzmi teret)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Idi neprekidno do {STATION} (Istovar)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Idi neprekidno do {STATION} (Transferiraj i otiđi prazan)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Idi neprekidno do {STATION} (Utovar)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Idi neprekidno do {STATION} (Transferiraj i priÄekaj puni utovar)
 STR_GO_TO_TRAIN_DEPOT                                           :Idi u spremište vlakova grada {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Servisiranje u spremištu vlakova grada {TOWN}
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Idi neprekidno do spremišta vlakova grada {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Servisiraj neprekidno u spremištu vlakova grada {TOWN}
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Putovanje (bez rasporeda)
 STR_TIMETABLE_TRAVEL_FOR                                        :Putovanje za {STRING}
 STR_TIMETABLE_STAY_FOR                                          :i boravak za {STRING}
@@ -2694,7 +2678,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Prebacivanje na pogled rasporeda
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Naredbe)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Kraj naredbi - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Servis
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Nije moguće izgraditi željezniÄko vozilo...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Izgrađen: {LTBLUE}{NUM}{BLACK} Vrijednost: {LTBLUE}{CURRENCY}
--- a/src/lang/czech.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/czech.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1108,6 +1108,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Umožnit zasílání penÄ›z ostatním spoleÄnostem: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Nejednolité stanice: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Pro simulaci těžkých vlaků vynásobit hmotnost nákladu: {ORANGE}{STRING}x
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}ÄŒinitel rychlosti letadel: {ORANGE}1/{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Povolit průjezdné zastávky na silnicích vlastněných obcemi: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Povolit stavění přilehlých stanic: {ORANGE}{STRING}
 
@@ -1125,7 +1126,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Minimální Äástka pro automatické obnovení: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Doba zobrazení chybové zprávy: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Zobrazovat populaci města v jeho popisku: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Neviditelné stromy (spoleÄnÄ› s průhlednými budovami): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Tvůrce krajiny: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :původní
@@ -1669,6 +1669,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Žádné použitelné koleje
 STR_1007_ALREADY_BUILT                                          :{WHITE}... již vystavěno
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Musíš nejprve odstranit koleje
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Silnice je jednosměrná nebo zablokovaná
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Výstavba železnice
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Výstavba elektrifikované železnice
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Výstavba monorailu
@@ -1771,6 +1772,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Budova musí být nejprve zniÄena
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (velkoměsto)
 STR_2006_POPULATION                                             :{BLACK}Populace: {ORANGE}{COMMA}{BLACK} Domů: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Přejmenovat město
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Nemohu přejmenovat město:
@@ -2050,20 +2052,20 @@
 STR_4826_SUGAR_MINE                                             :Cukerný důl
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Vyžaduje: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Vyžaduje: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Vyžaduje: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Vyžaduje: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Vyžaduje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Vyžaduje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Náklad Äekající na zpracování:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produkce minulý měsíc:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA} % přepraveno)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA} % přepraveno)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Nastavit pohled na průmysl
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}{STRING} se staví poblíž města {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nový {STRING} se vysazuje poblíž města {TOWN}!
@@ -2702,26 +2704,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Obyvatelé oslavují...{}První vlak dorazil do {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detaily)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}V cestÄ› je vlak
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Jet do {STATION}
-STR_GO_TO_TRANSFER                                              :Jet do {STATION} (přeložit a naložit jiný náklad)
-STR_8807_GO_TO_UNLOAD                                           :Jet do {STATION} (vyložit)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Jet do {STATION} (přeložit a nenakládat)
-STR_8808_GO_TO_LOAD                                             :Jet do {STATION} (naložit)
-STR_GO_TO_TRANSFER_LOAD                                         :Jet do {STATION} (přeložit a plně naložit jiný náklad)
-STR_880A_GO_NON_STOP_TO                                         :Jet bez zastavení do {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Jet bez zastavení do {STATION} (přeložit a naložit jiný náklad)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Jet bez zastavení do {STATION} (vyložit)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Jet bez zastavení do {STATION} (přeložit a nenakládat)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Jet bez zastavení do {STATION} (naložit)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Jet bez zastavení do {STATION} (přeložit a plně naložit jiný náklad)
 STR_GO_TO_TRAIN_DEPOT                                           :Jet do železniÄního depa v {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Údržba v železniÄním depu {TOWN}
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Jet bez zastavení do železniÄního depa {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Údržba bez zastavení v železniÄním depu {TOWN}
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Jet do (mimo jízdní řád)
 STR_TIMETABLE_TRAVEL_FOR                                        :Jet do {STRING}
 STR_TIMETABLE_STAY_FOR                                          :a zůstat {STRING}
@@ -2773,7 +2760,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Přepnout na jízdní řád
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Příkazy)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Konec příkazů - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Údržba
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Nemohu koupit vagon nebo lokomotivu...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Koupeno: {LTBLUE}{NUM}{BLACK} Hodnota: {LTBLUE}{CURRENCY}
--- a/src/lang/danish.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/danish.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1050,6 +1050,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Tillad at sende penge til andre firmaer: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Ikke uniforme stationer: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Vægtfaktor for fragt for at simulere tunge tog: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Fly-hastighedsfaktor: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Tillad gennemkørsels-stop på veje ejet af en by: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Tillad bygning af tilstødende stationer: {ORANGE}{STRING}
 
@@ -1067,7 +1068,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Min. kontanter før automatisk køretøjsfornyelse: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Levetid for fejlmeddelser: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Vis byens indbyggertal i bynavnet: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Usynlige træer (med gennemsigtige bygninger): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Landskabs generator: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1204,6 +1204,19 @@
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Skift indstillingsværdi
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Nogle eller alle standard service intervaller nedenunder er uforenelige med den valgte opsætning! 5-90% og 30-800 dage er gyldige
 
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Stifinder til tog: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Ikke anbefalet)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Anbefalet)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Stifinder til vejkøretøjer: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(Ikke anbefalet)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Anbefalet)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Stifinder til skibe: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Anbefalet)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Ikke anbefalet)
+
 STR_TEMPERATE_LANDSCAPE                                         :Tempereret klima
 STR_SUB_ARCTIC_LANDSCAPE                                        :Arktisk klima
 STR_SUB_TROPICAL_LANDSCAPE                                      :Tropisk klima
@@ -1598,6 +1611,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Ingen brugbar jernbane
 STR_1007_ALREADY_BUILT                                          :{WHITE}...allerede bygget
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Det er nødvendigt at fjerne jernbaneskinnerne først
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Vejen er ensrettet eller blokeret
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Jernbanekonstruktion
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Elektrisk jernbanekonstruktion
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Monorailkonstruktion
@@ -1979,20 +1993,20 @@
 STR_4826_SUGAR_MINE                                             :Sukkermine
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Kræver: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Kræver: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Kræver: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Kræver: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Kræver: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Kræver: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Fragt der venter på forarbejdning:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Producerer: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Producerer: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Producerer: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Producerer: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produktion sidste måned:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transporteret)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transporteret)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centrer skærmen over industriens lokalitet
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Ny {STRING} under opførelse tæt på {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Ny {STRING} bliver plantet tæt på {TOWN}!
@@ -2625,26 +2639,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Indbyggerne fester . . .{}Første tog ankommer til {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detaljer)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Tog i vejen
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :GÃ¥ til {STATION}
-STR_GO_TO_TRANSFER                                              :Gå til {STATION} (Overfør og tag gods)
-STR_8807_GO_TO_UNLOAD                                           :Gå til {STATION} (Aflæs)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Gå til {STATION} (Overfør og efterlad tom)
-STR_8808_GO_TO_LOAD                                             :GÃ¥ til {STATION} (Fuld last)
-STR_GO_TO_TRANSFER_LOAD                                         :Gå til {STATION} (Overfør og vent på fuld last)
-STR_880A_GO_NON_STOP_TO                                         :GÃ¥ uden stop til {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Gå uden stop til {STATION} (Overfør og tag gods)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Gå uden stop til {STATION} (Aflæs)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Gå uden stop til {STATION} (Overfør og efterlad tom)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :GÃ¥ uden stop til {STATION} (Fuld last)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Gå uden stop til {STATION} (Overfør og vent på fuld last)
 STR_GO_TO_TRAIN_DEPOT                                           :GÃ¥ til {TOWN} remise
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Service i {TOWN} remise
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :GÃ¥ uden stop til {TOWN} remise
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Service uden stop i {TOWN} remise
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Rejs (ikke iflg. køreplan)
 STR_TIMETABLE_TRAVEL_FOR                                        :Rejs i {STRING}
 STR_TIMETABLE_STAY_FOR                                          :og vent i {STRING}
@@ -2696,7 +2695,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Skift til køreplan-visning
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordrer)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Slut på ordrer - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Service
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Kan ikke bygge jernbanekøretøj...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Bygget: {LTBLUE}{NUM}{BLACK} Værdi: {LTBLUE}{CURRENCY}
@@ -3340,6 +3338,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Skift gennemsigtighed for konstruktioner som stationer, værksteder, kontrolsteder og køreledninger
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Skift gennemsigtighed for broer
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Skift gennemsigtighed for strukturer som fyrtårne og antenner, og måske i fremtiden for øjeguf
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Slå transparens til/fra for køreledninger. CTRL+klik for at låse.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Slå gennemsigtighed til/fra for laste-indikatorer
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
--- a/src/lang/dutch.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/dutch.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1050,6 +1050,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Geld geven aan andere bedrijven toestaan: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Vrij gevormde stations: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Gewichtsverhouding voor vracht om zware treinen te simuleren: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Vliegtuig snelheidsverhouding: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Laat toe dat doorrij wegstops worden geplaatst op door stad beheerde wegen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Bouwen van aangrenzende stations toestaan: {ORANGE}{STRING}
 
@@ -1067,7 +1068,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Minimum benodigd geld voor automatisch vernieuwen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Duur van foutmeldingen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Geef het inwoneraantal bij een stad weer: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Onzichtbare bomen (met transparante gebouwen): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Land generator: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Origineel
@@ -1172,6 +1172,7 @@
 STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :betere wegen
 STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 raster
 STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 raster
+STR_CONFIG_PATCHES_TOWN_LAYOUT_RANDOM                           :willekeurig
 
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Positie van algemene toolbar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Links
@@ -1211,7 +1212,7 @@
 STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Routezoeker voor voertuigen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(Niet aanbevolen)
 STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
-STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Aanbevolen)
 STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Routezoeker voor schepen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Aanbevolen)
 STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
@@ -1351,6 +1352,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Spelernaam:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Dit is de naam waarmee andere spelers je herkennen
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Was is je naam
 STR_NETWORK_CONNECTION                                          :{BLACK}Verbinding:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Kies tussen een internet spel of een lokaal netwerk spel
 
@@ -1394,6 +1396,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Spelnaam:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}De spelnaam wordt weergegeven aan andere spelers in het multiplayer spelselectie menu
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Geef de naam van het netwerk spel
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Zet wachtwoord
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Bescherm je spel met een wachtwoord als je niet wil dat andere mensen meespelen
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Selecteer een kaart:
@@ -1450,6 +1453,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :Zweeds
 STR_NETWORK_LANG_TURKISH                                        :Turks
 STR_NETWORK_LANG_UKRAINIAN                                      :Oekraïne
+STR_NETWORK_LANG_AFRIKAANS                                      :Afrikaans
+STR_NETWORK_LANG_CROATIAN                                       :Kroatisch
+STR_NETWORK_LANG_CATALAN                                        :Catalaans
+STR_NETWORK_LANG_ESTONIAN                                       :Ests
+STR_NETWORK_LANG_GALICIAN                                       :Galiciaans
+STR_NETWORK_LANG_GREEK                                          :Grieks
+STR_NETWORK_LANG_LATVIAN                                        :Lets
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Multiplayer lobby
@@ -1548,6 +1558,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Prive] Aan {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[Iedereen] :
 STR_NETWORK_CHAT_ALL                                            :[Iedereen] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Heef de tekst voor de netwerk-chat
 STR_NETWORK_NAME_CHANGE                                         :heeft zijn naam veranderd in
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} De server heeft de sessie gestopt.
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} De server wordt opnieuw gestart...{}Wacht aub...
@@ -1611,6 +1622,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Geen bruikbaar spoor
 STR_1007_ALREADY_BUILT                                          :{WHITE}...reeds gebouwd
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Bestaand spoor moet eerst weggehaald worden
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Eenrichtingsverkeer of de weg is geblokkeerd
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Spoorwegconstructie
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Geëlectrificeerde spoorwegconstructie
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Monorailconstructie
@@ -1713,6 +1725,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Gebouw moet eerst gesloopt worden
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Stad)
 STR_2006_POPULATION                                             :{BLACK}Bevolking: {ORANGE}{COMMA}{BLACK}  Huizen: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Hernoem stad
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Kan stad niet hernoemen...
@@ -1949,6 +1962,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Selecteer scenario (groen), vooraf ingesteld spel (blauw), or willekeurig nieuw spel
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Genereer willekeurig nieuw spel
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Laad Hoogtekaart
+STR_SAVE_OSKTITLE                                               :{BLACK}Typ een naam voor het op te slaan spel
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} in de weg
@@ -1992,20 +2006,20 @@
 STR_4826_SUGAR_MINE                                             :Suikermijn
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Vereist: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Vereist: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Vereist: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Vereist: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Vereist: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Vereist: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Vracht klaar om te worden verwerkt:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produceert: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produceert: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produceert: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produceert: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Productie vorige maand:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% getransporteerd)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% getransporteerd)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centreer het hoofdbeeld op de locatie van de industrie
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nieuw {STRING} in aanbouw bij {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nieuw {STRING} in aanplant bij {TOWN}!
@@ -2638,26 +2652,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Inwoners feesten... {}Eerste trein arriveert in {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Details)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Trein in de weg
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Ga naar {STATION}
-STR_GO_TO_TRANSFER                                              :Ga naar {STATION} (Overladen en neem goederen)
-STR_8807_GO_TO_UNLOAD                                           :Ga naar {STATION} (Uit laden)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Ga naar {STATION} (Overladen en leeg laten)
-STR_8808_GO_TO_LOAD                                             :Ga naar {STATION} (Laden)
-STR_GO_TO_TRANSFER_LOAD                                         :Ga naar {STATION} (Overladen en wacht tot vol geladen)
-STR_880A_GO_NON_STOP_TO                                         :Ga non-stop naar {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Ga non-stop naar {STATION} (Overladen en neem goederen)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Ga non-stop naar {STATION} (Uitladen)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Ga non-stop naar {STATION} (Overladen en leeg laten)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Ga non-stop naar {STATION} (Laden)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Ga non-stop naar {STATION} (Overladen en wacht tot vol geladen)
 STR_GO_TO_TRAIN_DEPOT                                           :Ga naar {TOWN} Trein Depot
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Reparatie in {TOWN} treindepot
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Ga zonder tussenstop naar {TOWN} Treindepot
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Reparatie zonder tussentop in {TOWN} treindepot
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Reis (geen dienstregeling)
 STR_TIMETABLE_TRAVEL_FOR                                        :Reis naar {STRING}
 STR_TIMETABLE_STAY_FOR                                          :en blijf voor {STRING}
@@ -2707,9 +2706,10 @@
 STR_REFIT_ORDER                                                 :(Ombouwen naar {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}Dienstregeling
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Schakel naar de dienstregeling
+STR_ORDER_VIEW                                                  :{BLACK}Orders
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}Ga naar het order scherm
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Orders)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Einde van orders - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Reparatie
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Kan spoorvoertuig niet bouwen...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Gebouwd: {LTBLUE}{NUM}{BLACK} Waarde: {LTBLUE}{CURRENCY}
@@ -3263,6 +3263,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Wereld maken
 STR_RANDOM_SEED                                                 :{BLACK}Willekeurig getal
 STR_RANDOM_SEED_HELP                                            :{BLACK}Klik voor een willekeurig getal
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Geef een willekeurige seed op
 STR_LAND_GENERATOR                                              :{BLACK}Land generator:
 STR_TREE_PLACER                                                 :{BLACK}Bos algoritme:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Aantal graden hoogtekaart:
@@ -3410,6 +3411,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Ga naar volgende bord
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Ga naar vorige bord
+STR_SIGN_OSKTITLE                                               :{BLACK}Heef een naam voor dit bord
 
 ########
 
@@ -3482,3 +3484,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Verklein gesleepte sein dichtheid
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Vergroot gesleepte sein dichtheid
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :`1234567890-=\qwertyuiop[]asdfghjkl;'  zxcvbnm,./ .
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:"  ZXCVBNM<>? .
+########
--- a/src/lang/english.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/english.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -18,6 +18,7 @@
 STR_EN_ROUTE_FROM                                               :{YELLOW}({SHORTCARGO} en-route from {STATION})
 STR_000C_ACCEPTS                                                :{BLACK}Accepts: {WHITE}
 STR_000D_ACCEPTS                                                :{BLACK}Accepts: {GOLD}
+STR_SUPPLIES                                                    :{BLACK}Supplies: {GOLD}
 STR_000E                                                        :
 STR_000F_PASSENGERS                                             :Passengers
 STR_0010_COAL                                                   :Coal
@@ -1068,7 +1069,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Autorenew minimum needed money for renew: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Duration of error message: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Show town population in the town name label: {ORANGE}{STRING1}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Invisible trees: {ORANGE}{STRING1}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Land generator: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1173,6 +1173,7 @@
 STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :better roads
 STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 grid
 STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 grid
+STR_CONFIG_PATCHES_TOWN_LAYOUT_RANDOM                           :random
 
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Position of main toolbar: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Left
@@ -1352,6 +1353,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Player name:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}This is the name other players will identify you by
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Enter your name
 STR_NETWORK_CONNECTION                                          :{BLACK}Connection:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Choose between an internet game or a Local Area Network (LAN) game
 
@@ -1395,6 +1397,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Game name:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}The game name will be displayed to other players in the multiplayer game selection menu
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Enter a name for the network game
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Set password
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Protect your game with a password if you don't want it to be publicly accessible
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Select a map:
@@ -1451,6 +1454,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :Swedish
 STR_NETWORK_LANG_TURKISH                                        :Turkish
 STR_NETWORK_LANG_UKRAINIAN                                      :Ukrainian
+STR_NETWORK_LANG_AFRIKAANS                                      :Afrikaans
+STR_NETWORK_LANG_CROATIAN                                       :Croatian
+STR_NETWORK_LANG_CATALAN                                        :Catalan
+STR_NETWORK_LANG_ESTONIAN                                       :Estonian
+STR_NETWORK_LANG_GALICIAN                                       :Galician
+STR_NETWORK_LANG_GREEK                                          :Greek
+STR_NETWORK_LANG_LATVIAN                                        :Latvian
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Multiplayer game lobby
@@ -1549,6 +1559,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Private] To {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[All] :
 STR_NETWORK_CHAT_ALL                                            :[All] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Enter text for network chat
 STR_NETWORK_NAME_CHANGE                                         :has changed his/her name to
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} The server closed the session
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} The server is restarting...{}Please wait...
@@ -1715,6 +1726,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Building must be demolished first
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (City)
 STR_2006_POPULATION                                             :{BLACK}Population: {ORANGE}{COMMA}{BLACK}  Houses: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Rename Town
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Can't rename town...
@@ -1951,6 +1963,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Select scenario (green), pre-set game (blue), or random new game
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Generate random new game
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Load Heightmap
+STR_SAVE_OSKTITLE                                               :{BLACK}Enter a name for the savegame
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} in the way
@@ -1994,20 +2007,20 @@
 STR_4826_SUGAR_MINE                                             :Sugar Mine
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Cargo waiting to be processed:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produces: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produces: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produces: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produces: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Production last month:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transported)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transported)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centre the main view on industry location
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}New {STRING} under construction near {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}New {STRING} being planted near {TOWN}!
@@ -2640,26 +2653,33 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Citizens celebrate . . .{}First train arrives at {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Details)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Train in the way
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING1} {STRING1}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING1} {STRING1}
-STR_8806_GO_TO                                                  :Go to {STATION}
-STR_GO_TO_TRANSFER                                              :Go to {STATION} (Transfer and take cargo)
-STR_8807_GO_TO_UNLOAD                                           :Go to {STATION} (Unload)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Go to {STATION} (Transfer and leave empty)
-STR_8808_GO_TO_LOAD                                             :Go to {STATION} (Load)
-STR_GO_TO_TRANSFER_LOAD                                         :Go to {STATION} (Transfer and wait for full load)
-STR_880A_GO_NON_STOP_TO                                         :Go non-stop to {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Go non-stop to {STATION} (Transfer and take cargo)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Go non-stop to {STATION} (Unload)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Go non-stop to {STATION} (Transfer and leave empty)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Go non-stop to {STATION} (Load)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Go non-stop to {STATION} (Transfer and wait for full load)
+STR_8804                                                        :{SETX 10}{COMMA}: {STRING3}
+STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING3}
+STR_ORDER_GO_TO                                                 :Go to
+STR_ORDER_GO_NON_STOP_TO                                        :Go non-stop to
+STR_ORDER_GO_VIA                                                :Go via
+STR_ORDER_GO_NON_STOP_VIA                                       :Go non-stop via
+STR_ORDER_DROP_LOAD_IF_POSSIBLE                                 :Load if available
+STR_ORDER_DROP_FULL_LOAD_ALL                                    :Full load all cargo
+STR_ORDER_DROP_FULL_LOAD_ANY                                    :Full load any cargo
+STR_ORDER_UNLOAD                                                :(Unload)
+STR_ORDER_FULL_LOAD                                             :(Full load)
+STR_ORDER_FULL_LOAD_ANY                                         :(Full load any cargo)
+STR_ORDER_NO_LOAD                                               :(No loading)
+STR_ORDER_TRANSFER                                              :(Transfer and take cargo)
+STR_ORDER_TRANSFER_UNLOAD                                       :(Transfer and leave empty)
+STR_ORDER_TRANSFER_FULL_LOAD                                    :(Transfer and wait for full load)
+STR_ORDER_TRANSFER_FULL_LOAD_ANY                                :(Transfer and wait for any full load)
+STR_ORDER_NO_UNLOAD                                             :(No unload and take cargo)
+STR_ORDER_NO_UNLOAD_FULL_LOAD                                   :(No unload and wait for full load)
+STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY                               :(No unload and wait for any full load)
+STR_GO_TO_STATION                                               :{STRING} {STATION} {STRING}
 STR_GO_TO_TRAIN_DEPOT                                           :Go to {TOWN} Train Depot
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Service at {TOWN} Train Depot
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Go non-stop to {TOWN} Train Depot
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Service non-stop at {TOWN} Train Depot
 
-STR_TIMETABLE_GO_TO                                             :{STRING1} {STRING2}
+STR_TIMETABLE_GO_TO                                             :{STRING3} {STRING2}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Travel (not timetabled)
 STR_TIMETABLE_TRAVEL_FOR                                        :Travel for {STRING1}
 STR_TIMETABLE_STAY_FOR                                          :and stay for {STRING1}
@@ -2709,9 +2729,10 @@
 STR_REFIT_ORDER                                                 :(Refit to {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}Timetable
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Switch to the timetable view
+STR_ORDER_VIEW                                                  :{BLACK}Orders
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}Switch to the order view
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Orders)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - End of Orders - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Service
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Can't build railway vehicle...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Built: {LTBLUE}{NUM}{BLACK} Value: {LTBLUE}{CURRENCY}
@@ -3265,6 +3286,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}World generation
 STR_RANDOM_SEED                                                 :{BLACK}Random Seed:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Click to enter a random seed
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Enter a random seed
 STR_LAND_GENERATOR                                              :{BLACK}Land generator:
 STR_TREE_PLACER                                                 :{BLACK}Tree algorithm:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Heightmap rotation:
@@ -3357,6 +3379,7 @@
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Toggle transparency for structures like lighthouses and antennas. CTRL+click to lock.
 STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Toggle transparency for catenary. CTRL+click to lock.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Toggle transparency for loading indicators. CTRL+click to lock.
+STR_TRANSPARENT_INVISIBLE_DESC                                  :{BLACK}Set objects invisible instead of transparent
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
 STR_PERCENT_UP                                                  :{WHITE}{NUM}%{UPARROW}
@@ -3412,6 +3435,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Go to next sign
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Go to previous sign
+STR_SIGN_OSKTITLE                                               :{BLACK}Enter a name for the sign
 
 ########
 
@@ -3484,3 +3508,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Decrease dragging signal density
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Increase dragging signal density
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :`1234567890-=\qwertyuiop[]asdfghjkl;'  zxcvbnm,./ .
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:"  ZXCVBNM<>? .
+########
--- a/src/lang/english_US.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/english_US.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1064,7 +1064,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Autorenew minimum needed money for renew: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Duration of error message: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Show town population in the town name label: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Invisible trees (with transparent buildings): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Land generator: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1976,20 +1975,20 @@
 STR_4826_SUGAR_MINE                                             :Sugar Mine
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Requires: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Cargo waiting to be processed:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produces: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produces: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produces: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produces: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Production last month:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transported)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transported)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Center the main view on industry location
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}New {STRING} under construction near {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}New {STRING} being planted near {TOWN}!
@@ -2620,26 +2619,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Citizens celebrate . . .{}First train arrives at {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Details)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Train in the way
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Go to {STATION}
-STR_GO_TO_TRANSFER                                              :Go to {STATION} (Transfer and take cargo)
-STR_8807_GO_TO_UNLOAD                                           :Go to {STATION} (Unload)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Go to {STATION} (Transfer and leave empty)
-STR_8808_GO_TO_LOAD                                             :Go to {STATION} (Load)
-STR_GO_TO_TRANSFER_LOAD                                         :Go to {STATION} (Transfer and wait for full load)
-STR_880A_GO_NON_STOP_TO                                         :Go non-stop to {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Go non-stop to {STATION} (Transfer and take cargo)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Go non-stop to {STATION} (Unload)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Go non-stop to {STATION} (Transfer and leave empty)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Go non-stop to {STATION} (Load)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Go non-stop to {STATION} (Transfer and wait for full load)
 STR_GO_TO_TRAIN_DEPOT                                           :Go to {TOWN} Train Depot
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Service at {TOWN} Train Depot
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Go non-stop to {TOWN} Train Depot
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Service non-stop at {TOWN} Train Depot
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Travel (not timetabled)
 STR_TIMETABLE_TRAVEL_FOR                                        :Travel for {STRING}
 STR_TIMETABLE_STAY_FOR                                          :and stay for {STRING}
@@ -2691,7 +2675,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Switch to the timetable view
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Orders)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - End of Orders - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Service
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Can't build railroad vehicle...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Built: {LTBLUE}{NUM}{BLACK} Value: {LTBLUE}{CURRENCY}
--- a/src/lang/esperanto.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/esperanto.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1054,7 +1054,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Minimuma mono por anstataÅ­ado: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}DaÅ­ro de erar-mesaÄo: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Montru enloÄantaron en urbnomindikilo: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Nevideblaj arboj (ĉe travideblaj konstruaĵoj): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Landgenerilo: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Origina
@@ -1864,13 +1863,13 @@
 STR_4826_SUGAR_MINE                                             :Sukerminejo
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Bezonas: {YELLOW}{STRING.n}
-STR_4828_REQUIRES                                               :{BLACK}Bezonas: {YELLOW}{STRING.n}, {STRING.n}
-STR_4829_REQUIRES                                               :{BLACK}Bezonas: {YELLOW}{STRING.n}, {STRING.n}, {STRING.n}
+STR_4827_REQUIRES                                               :{BLACK}Bezonas: {YELLOW}{STRING.n}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Bezonas: {YELLOW}{STRING.n}{STRING}, {STRING.n}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Bezonas: {YELLOW}{STRING.n}{STRING}, {STRING.n}{STRING}, {STRING.n}{STRING}
 ############ range for requires ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Lastmonata produktado:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportiÄis)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportiÄis)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centre en la ĉefvido vidu la industilokon
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nova {STRING} konstruiÄas ĉe {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nova {STRING} plantiÄas ĉe {TOWN}!
@@ -2492,20 +2491,6 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}EnloÄantoj festas . . .{}Unua trajno alvenas ĉe {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detaloj)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Trajno okupas la lokon
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Iru al {STATION}
-STR_GO_TO_TRANSFER                                              :Iru al {STATION} (Transigu kaj prenu ÅarÄon)
-STR_8807_GO_TO_UNLOAD                                           :Iru al {STATION} (DeÅarÄu)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Iru al {STATION} (Transigu kaj lasu malplena)
-STR_8808_GO_TO_LOAD                                             :Iru al {STATION} (ÅœarÄu)
-STR_GO_TO_TRANSFER_LOAD                                         :Iru al {STATION} (Transigu kaj atendu Äis plena ÅarÄo)
-STR_880A_GO_NON_STOP_TO                                         :Iru senhalte al {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Iru senhalte al {STATION} (Transigu kaj prenu ÅarÄon)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Iru senhalte al {STATION} (DeÅarÄu)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Iru senhalte al {STATION} (Transigu kaj lasu malplena)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Iru senhalte al {STATION} (ÅœarÄu)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Iru senhalte al {STATION} (Transigu kaj atendu Äis plena ÅarÄo)
 STR_GO_TO_TRAIN_DEPOT                                           :Iru al {TOWN} Trajndeponejo
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Prizorgo ĉe {TOWN} Trajndeponejo
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Iru senhalte al {TOWN} Trajndeponejo
@@ -2554,7 +2539,6 @@
 STR_REFIT_ORDER                                                 :(Transformu al {STRING})
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordenoj)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fino de Ordenoj - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Prizorgo
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Ne povas krei relan veturilon...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Kreite: {LTBLUE}{NUM}{BLACK} Valoro: {LTBLUE}{CURRENCY}
--- a/src/lang/estonian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/estonian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1150,6 +1150,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Luba teistele ettevõtetele raha saata: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Luba suvalise kujuga jaamad: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Raskete rongide simuleerimiseks kasutatav raskuse korrutaja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Lennuki kiiruse tegur: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Luba läbisõidupeatused linnateedel: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Luba jaamu lähestikku ehitada: {ORANGE}{STRING}
 
@@ -1167,7 +1168,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Iseuuendusele kuluv väikseim summa: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Veateate kuvamise kestus: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Linna nimesildil näidatakse rahvaarvu: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Nähtamatud puud (läbipaistvate ehitistega): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Maaala Generaator: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Algupärane
@@ -1711,6 +1711,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Sobiv rongitee puudub
 STR_1007_ALREADY_BUILT                                          :{WHITE}...juba ehitatud
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Rööbastee tuleb eelnevalt lammutada
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Läbipääsmatu või ühesuunaline maantee
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Rööbasteede ehitamine
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Elektrifitseeritud rööbasteede ehitamine
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Monorelsi ehitamine
@@ -2092,20 +2093,20 @@
 STR_4826_SUGAR_MINE                                             :suhkrukaevandus
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Vajab: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Vajab: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Vajab: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Vajab: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Vajab: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Vajab: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Käitlust ootav kaup:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Toodab: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Toodab: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Toodab: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Toodab: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Eelmise kuu valmistoodang:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% veetud)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% veetud)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Vaate keskendamine tööstusele
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Uus {STRING} on linna {TOWN} lähedal ehitamisel!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Uus {STRING} on istutatud linna {TOWN} lähedale!
@@ -2738,26 +2739,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Rahvas rõõmustab. . .{}{STATION} jaama saabus esimene rong!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (üksikasjad)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Rong on ees
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Mine {STATION}
-STR_GO_TO_TRANSFER                                              :Mine {STATION} (laadi ümber ja võta laadung peale)
-STR_8807_GO_TO_UNLOAD                                           :Mine {STATION} (laadi maha)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Mine {STATION} (laadi ümber ja jäta tühjaks)
-STR_8808_GO_TO_LOAD                                             :Mine {STATION} (laadi)
-STR_GO_TO_TRANSFER_LOAD                                         :Mine {STATION} (laadi ümber ja oota täislaadungit)
-STR_880A_GO_NON_STOP_TO                                         :Sõida läbi {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Sõida läbi {STATION} (laadi ümber ja oota täislaadungit)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Sõida läbi {STATION} (laadi maha)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Sõida läbi {STATION} (laadi ümber ja jäta tühjaks)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Sõida läbi {STATION} (laadi)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Sõida läbi {STATION} (laadi ümber ja oota täislaadungit)
 STR_GO_TO_TRAIN_DEPOT                                           :Mine linna {TOWN} rongidepoosse
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Hoolda linna {TOWN} rongidepoos
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Sõida läbi linna {TOWN} rongidepoo
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Hooldus linna {TOWN} rongidepoost läbisõidul
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Sõitmine (sõiduplaanita)
 STR_TIMETABLE_TRAVEL_FOR                                        :Sõida {STRING}
 STR_TIMETABLE_STAY_FOR                                          :ja oota {STRING}
@@ -2809,7 +2795,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Näita sõiduplaani
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (käsud)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Sihtpunktide lõpp - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Hooldus
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Rööbassõidukit ei saa ehitada...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Ehitatud: {LTBLUE}{NUM}{BLACK} Väärtus: {LTBLUE}{CURRENCY}
--- a/src/lang/finnish.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/finnish.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1057,7 +1057,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Pienin tarvittava rahamäärä itseuudistukseen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Virheilmoituksen kesto: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Näytä kaupungin asukasluku kaupungin nimessä: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Näkymättömät puut (läpinäkyvillä rakennuksilla): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Maa generaattori: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Alkuperäinen
@@ -1963,20 +1962,20 @@
 STR_4826_SUGAR_MINE                                             :Sokerikaivos
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Tarvitsee: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Tarvitsee: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Tarvitsee: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Tarvitsee: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Tarvitsee: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Tarvitsee: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Rahti odottaa käsittelyä:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Tuottaa: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Tuottaa: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Tuottaa: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Tuottaa: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Tuotto viime kuussa:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}{NBSP}% kuljetettu)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}{NBSP}% kuljetettu)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Keskitä päänäkymä teollisuuden sijaintiin.
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Uusi {STRING} rakennetaan kaupungin {TOWN} lähistölle!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Uusi {STRING} istutetaan kaupungin {TOWN} lähistölle!
@@ -2600,26 +2599,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Kaupunkilaiset juhlivat . . .{}Ensimmäinen juna saapuu asemalle ({STATION})!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (yksityiskohdat)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Juna on tiellä.
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Asemalle {STATION}
-STR_GO_TO_TRANSFER                                              :Mene asemalle {STATION} (Siirrä ja ota rahti)
-STR_8807_GO_TO_UNLOAD                                           :Mene asemalle {STATION} (Pura rahti)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Mene asemalle {STATION} (Siirrä ja jätä tyhjäksi)
-STR_8808_GO_TO_LOAD                                             :Mene asemalle {STATION} (Lastaa)
-STR_GO_TO_TRANSFER_LOAD                                         :Mene asemalle {STATION} (Siirrä ja odota täyttä rahtia)
-STR_880A_GO_NON_STOP_TO                                         :Mene tauotta asemalle {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Mene tauotta asemalle {STATION} (Siirrä ja ota rahti)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Mene tauotta asemalle {STATION} (Pura rahti)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Mene tauotta asemalle {STATION} (Siirrä ja jätä tyhjäksi)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Mene tauotta asemalle {STATION} (Lastaa)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Mene tauotta asemalle {STATION} (Siirrä ja odota täyttä rahtia)
 STR_GO_TO_TRAIN_DEPOT                                           :Mene kaupungin {TOWN} veturitalliin
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Huolto veturitallilla ({TOWN})
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Mene pysähtymättä veturitalliin ({TOWN})
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Huolto pysähtymättä veturitallilla ({TOWN})
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Kiertävä (ei aikataulua)
 STR_TIMETABLE_TRAVEL_FOR                                        :Kulje kohteeseen {STRING}
 STR_TIMETABLE_STAY_FOR                                          :ja odota {STRING}
@@ -2671,7 +2655,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Näytä aikataulu
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (aikataulu)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - aikataulun loppu - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Huolto
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Yksikköä ei voi rakentaa...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Rakennettu: {LTBLUE}{NUM}{BLACK} Arvo: {LTBLUE}{CURRENCY}
--- a/src/lang/french.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/french.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1051,6 +1051,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Autoriser l'envoi d'argent aux autres compagnies: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Gares non uniformes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplier le poid pour les trains fret (simule des trains lourds): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Facteur de vitesse des aéroplanes: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Autoriser les arrêts de bus sur les routes des municipalités: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Autoriser la construction de stations adjacentes: {ORANGE}{STRING}
 
@@ -1068,7 +1069,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Argent nécessaire pour l'auto-renouvelement : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Temps d'affichage des messages d'erreur: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Afficher la population d'une ville dans son label : {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Arbres invisibles: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Générateur de terrain : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1173,6 +1173,7 @@
 STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :meilleures routes
 STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :grille 2x2
 STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :grille 3x3
+STR_CONFIG_PATCHES_TOWN_LAYOUT_RANDOM                           :aléatoire
 
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Position de la barre d'outils principale: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :À gauche
@@ -1352,6 +1353,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Nom du joueur:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Ceci est le nom avec lequel les autres joueurs pourront vous identifier
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Entrer votre nom
 STR_NETWORK_CONNECTION                                          :{BLACK}Connexion :
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Choisir entre un jeu sur Internet ou sur réseau local
 
@@ -1395,6 +1397,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Nom de la partie:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Le nom de la partie sera affiché aux autres joueurs dans le menu de sélection de partie multijoueur
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Entrer un nom pour la partie en réseau
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Choisir le mot de passe
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Protéger votre partie avec un mot de passe si vous ne souhaitez pas que d'autres l'utilisent
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Choisir une carte:
@@ -1451,6 +1454,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :Suédois
 STR_NETWORK_LANG_TURKISH                                        :Turc
 STR_NETWORK_LANG_UKRAINIAN                                      :Ukrainien
+STR_NETWORK_LANG_AFRIKAANS                                      :Afrikaans
+STR_NETWORK_LANG_CROATIAN                                       :Croate
+STR_NETWORK_LANG_CATALAN                                        :Catalan
+STR_NETWORK_LANG_ESTONIAN                                       :Estonien
+STR_NETWORK_LANG_GALICIAN                                       :Galicien
+STR_NETWORK_LANG_GREEK                                          :Grec
+STR_NETWORK_LANG_LATVIAN                                        :Letton
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Préparation de la partie
@@ -1549,6 +1559,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Privé] A {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[Tous] :
 STR_NETWORK_CHAT_ALL                                            :[Tous] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Entrer le texte pour le chat
 STR_NETWORK_NAME_CHANGE                                         :a changé son nom pour
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Le serveur a fermé la session
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Le serveur redémarre...{}Veuillez patienter...
@@ -1612,6 +1623,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Aucuns rails convenables
 STR_1007_ALREADY_BUILT                                          :{WHITE}...déjà construit
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Vous devez d'abord enlever les rails
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}La route est à sens unique ou bloquée
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Construction de voie ferrée
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Construction de voie ferrée électrifiée
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Construction de Monorail
@@ -1714,6 +1726,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}L'édifice doit d'abord être démolit
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Métropole)
 STR_2006_POPULATION                                             :{BLACK}Population: {ORANGE}{COMMA}{BLACK}  Maisons: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Renommer Ville
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Impossible de renommer la ville...
@@ -1950,6 +1963,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Choisir un scénario (vert), une partie préparée (bleu), ou une partie aléatoire
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Créer une partie aléatoirement
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Charger une carte d'altitude
+STR_SAVE_OSKTITLE                                               :{BLACK}Entrer un nom pour la sauvegarde
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} présente
@@ -1993,20 +2007,20 @@
 STR_4826_SUGAR_MINE                                             :{G=f}Mine de sucre
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Nécessite: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Nécessite: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Nécessite: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Nécessite: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Nécessite: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Nécessite: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Marchandise en attente d'être utilisée:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produit: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produit: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produit: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produit: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Production le mois dernier:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transporté)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transporté)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centrer la vue sur l'industrie
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Un{G "" "" e} nouv{G eau el elle} {STRING} en construction près de {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Un{G "" "" e} nouv{G eau el elle} {STRING} s'implante près de {TOWN}!
@@ -2639,26 +2653,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Les habitants célèbrent{}l'arrivée du premier train à {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Détails)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Train présent
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Aller à {STATION}
-STR_GO_TO_TRANSFER                                              :Aller à {STATION} (Transférer et charger)
-STR_8807_GO_TO_UNLOAD                                           :Aller à {STATION} (Décharger)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Aller à {STATION} (Transférer et laisser vide)
-STR_8808_GO_TO_LOAD                                             :Aller à {STATION} (Charger)
-STR_GO_TO_TRANSFER_LOAD                                         :Aller à {STATION} (Transférer et attendre pleine charge)
-STR_880A_GO_NON_STOP_TO                                         :Aller sans s'arrêter à {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Aller sans s'arrêter à {STATION} (Transférer et charger)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Aller sans s'arrêter à {STATION} (Décharger)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Aller sans s'arrêter à {STATION} (Transférer et laisser vide)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Aller sans s'arrêter à {STATION} (Charger)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Aller sans s'arrêter à {STATION} (Transférer et attendre pleine charge)
 STR_GO_TO_TRAIN_DEPOT                                           :Aller au dépot de {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Entretien au dépôt de {TOWN}
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Aller sans s'arrêter au dépôt de {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Aller faire l'entretien sans s'arrêter au dépôt de {TOWN}
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Voyager (sans horaires)
 STR_TIMETABLE_TRAVEL_FOR                                        :Voyager pendant {STRING}
 STR_TIMETABLE_STAY_FOR                                          :et rester pendant {STRING}
@@ -2708,9 +2707,10 @@
 STR_REFIT_ORDER                                                 :(Réaménager pour {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}Horaire
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Basculer vers la vue horaire
+STR_ORDER_VIEW                                                  :{BLACK}Ordres
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}Basculer vers la vue ordres
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordres)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fin des ordres - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Entretien
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Impossible de construire le véhicule ferroviaire...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construit en: {LTBLUE}{NUM}{BLACK} Valeur: {LTBLUE}{CURRENCY}
@@ -3264,6 +3264,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Création du monde
 STR_RANDOM_SEED                                                 :{BLACK}Amorce :
 STR_RANDOM_SEED_HELP                                            :{BLACK}Cliquer pour saisir une amorce
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Entrer une amorce
 STR_LAND_GENERATOR                                              :{BLACK}Générateur :
 STR_TREE_PLACER                                                 :{BLACK}Ajout des arbres :
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Rotation de la carte d'altitude :
@@ -3411,6 +3412,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Aller au panneau suivant
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Aller au panneau précédent
+STR_SIGN_OSKTITLE                                               :{BLACK}Entrer un nom pour le panneau
 
 ########
 
@@ -3483,3 +3485,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Réduire la densité de signal
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Augmenter la densité de signal
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :²&é"'(-è_çà)=azertyuiop^$qsdfghjklmù*wxcvbn,;:!
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :²1234567890°+AZERTYUIOP¨£QSDFGHJKLM%µWXCVBN?./§
+########
--- a/src/lang/galician.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/galician.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1024,7 +1024,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Diñeiro mínimo necesario para a autorenovación: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Duración das mensaxes de error: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Mostra-la poboación da cidade na etiqueta: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Ãrbores invisibles (con edificios transparentes): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Xerador de mapas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Orixinal
@@ -1806,19 +1805,19 @@
 STR_4826_SUGAR_MINE                                             :Mina de Azucre
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Require: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Require: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Require: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Require: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Require: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Require: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Producción no último mes:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportado)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportado)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centra-la vista principal na situación da industria
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}¡Nova {STRING} en construcción cerca de {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}¡Nova {STRING} cerca de {TOWN}!
@@ -2428,20 +2427,6 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Celebración cidadá . . .{}Chega o primeiro tren a {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detalles)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Hai un tren no camiño
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Ir a {STATION}
-STR_GO_TO_TRANSFER                                              :Ir a {STATION} (Transferir e coller carga)
-STR_8807_GO_TO_UNLOAD                                           :Ir a {STATION} (Descargar)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Ir a {STATION} (Transferir e sair valeiro)
-STR_8808_GO_TO_LOAD                                             :Ir a {STATION} (Cargar)
-STR_GO_TO_TRANSFER_LOAD                                         :Ir a {STATION} (Transferir e esperar a cargar)
-STR_880A_GO_NON_STOP_TO                                         :Ir sen parar a {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Ir sen parar a {STATION} (Transferir e coller carga)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Ir sen parar a {STATION} (Descargar)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Ir sen parar a {STATION} (Descargar e saír baleiro)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Ir sen parar a {STATION} (Cargar)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Ir sen parar a {STATION} (Transferir e esperar a cargar)
 STR_GO_TO_TRAIN_DEPOT                                           :Ir o Depósito De Trens de {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Face-lo servicio no Depósito de Trens de {TOWN}
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Ir sen paradas o Depósito de Trens de {TOWN}
@@ -2487,7 +2472,6 @@
 STR_TIMETABLE_VIEW                                              :{BLACK}Táboa de tempo
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordes)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fin das Ordes - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Servicio
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}No se pode construí-lo vehículo de ferrocarril...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construído: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY}
--- a/src/lang/german.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/german.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -16,6 +16,7 @@
 STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Ebenes Land erforderlich
 STR_0008_WAITING                                                :{BLACK}Im Wartezustand:  {WHITE}{STRING}
 STR_0009                                                        :{WHITE}{CARGO}
+STR_EN_ROUTE_FROM                                               :{YELLOW}({SHORTCARGO} unterwegs von {STATION})
 STR_000C_ACCEPTS                                                :{BLACK}Akzeptiert: {WHITE}
 STR_000D_ACCEPTS                                                :{BLACK}Akzeptiert: {GOLD}
 STR_000E                                                        :
@@ -724,7 +725,7 @@
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Leuchtturm errichten
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Sender errichten
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Lege Wüstengebiet an.{}STRG drücken zum entfernen
-STR_CREATE_LAKE                                                 :{BLACK}Wasser erzeugen.{}Baut einen Kanal. Bei gedrückter Strg.-Taste wird ein Wasserfeld erzeugt, das umliegendes Land flutet.
+STR_CREATE_LAKE                                                 :{BLACK}Wasser erzeugen.{}Baut einen Kanal; Bei gedrückter Strg.-Taste wird ein Wasserfeld erzeugt, das umliegendes Land flutet.
 STR_CREATE_RIVER                                                :{BLACK}Flüsse platzieren.
 STR_0290_DELETE                                                 :{BLACK}Löschen
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Diese Stadt vollständig löschen
@@ -1050,6 +1051,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Erlaube es, anderen Firmen Geld zu schenken: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Ungleichmäßige Bahnhöfe: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Frachtgewicht erhöhen um schwere Züge zu simulieren: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Flugzeug-Geschwindigkeitsfaktor: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Bushaltestellen an städtischen Straßen erlauben: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Bau angrenzender Stationen erlauben: {ORANGE}{STRING}
 
@@ -1067,7 +1069,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Minimaler Kontostand für automatisches Erneuern: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Dauer der Fehlermeldungen: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Zeige die Einwohnerzahl der Stadt im Label: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Unsichtbare Bäume (bei transparenten Gebäuden): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Land Generator: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1204,6 +1205,19 @@
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Einstellungswert ändern
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Einige oder alle dieser Standardwartungsintervalle sind inkompatibel mit den gewählten Einstellungen! 5-90% und 30-800 Tage sind gültig.
 
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Pathfinder für Züge: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Not recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Pathfinder für Straßenfahrzeuge: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(nicht empfohlen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(empfohlen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Pathfinder für Schiffe: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(empfohlen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(nicht empfohlen)
+
 STR_TEMPERATE_LANDSCAPE                                         :Gemäßigt
 STR_SUB_ARCTIC_LANDSCAPE                                        :Subarktisch
 STR_SUB_TROPICAL_LANDSCAPE                                      :Subtropisch
@@ -1598,6 +1612,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Keine geeigneten Gleise
 STR_1007_ALREADY_BUILT                                          :{WHITE}...ist bereits gebaut
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Gleise müssen erst entfernt werden
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Einbahnstraße oder blockierter Weg
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Gleis- / Bahnhofsbau
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Bau elektrifizierter Strecken
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Einschienenbahnbau
@@ -1979,20 +1994,20 @@
 STR_4826_SUGAR_MINE                                             :{G=w}Zuckermine
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Benötigt: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Benötigt: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Benötigt: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Benötigt: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Benötigt: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Benötigt: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Zur Verarbeitung bereitstehende Fracht:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produziert: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produziert: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produziert: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produziert: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produktion im letzten Monat:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% befördert)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% befördert)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Hauptansicht zum Industriegebiet scrollen
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Neue{G r "" s} {STRING} wird nahe {TOWN} gebaut!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Neue{G r "" s} {STRING} wird nahe {TOWN} aufgeforstet!
@@ -2625,26 +2640,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Die Einwohner feiern . . .{}Der erste Zug erreicht {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Details)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Zug ist im Weg
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Fahre nach {STATION}
-STR_GO_TO_TRANSFER                                              :Fahre nach {STATION} (Umladen und beladen)
-STR_8807_GO_TO_UNLOAD                                           :Fahre nach {STATION} (Entladen)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Fahre nach {STATION} (Umladen und leer verlassen)
-STR_8808_GO_TO_LOAD                                             :Fahre nach {STATION} (Beladen)
-STR_GO_TO_TRANSFER_LOAD                                         :Fahre nach {STATION} (Umladen und voll beladen)
-STR_880A_GO_NON_STOP_TO                                         :Fahre ohne Halt nach {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Fahre ohne Halt nach {STATION} (Umladen und beladen)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Fahre ohne Halt nach {STATION} (Entladen)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Fahre nach {STATION} (Umladen und leer verlassen)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Fahre ohne Halt nach {STATION} (Beladen)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Fahre ohne Halt nach {STATION} (Umladen und voll beladen)
 STR_GO_TO_TRAIN_DEPOT                                           :Fahre zum {TOWN} Zugdepot
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Wartung bei {TOWN} Zugdepot
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Fahre ohne Halt zu {TOWN} Zugdepot
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Wartung (ohne Halt) bei {TOWN} Zugdepot
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Fahren (ohne Fahrplan)
 STR_TIMETABLE_TRAVEL_FOR                                        :{STRING} lang fahren
 STR_TIMETABLE_STAY_FOR                                          :und {STRING} lang bleiben
@@ -2696,7 +2696,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Zur Fahrplanansicht wechseln
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Aufträge)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Ende der Aufträge - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Wartung
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Schienenfahrzeug kann nicht gebaut werden...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Gebaut: {LTBLUE}{NUM}{BLACK}  Wert: {LTBLUE}{CURRENCY}
@@ -3340,6 +3339,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Transparenz für Gebäude wie Bahnhöfe, Depots, Wegpunkte und Oberleitung einstellen
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Transparenz für Brücken einstellen
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Transparenz für Bauten wie Leuchttürme und Antennen, evtl. in der Zukunft auch für Sehenswürdigkeiten, einstellen
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Transparente Oberleitungen. Strg.+klick zum feststellen.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Transparenz für Ladestandsanzeige einstellen
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
@@ -3468,3 +3468,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Signalabstand verringern
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Signalabstand erhöhen
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :^1234567890ß'€qwertzuiopü+asdfghjklöä#<yxcvbnm,.- .
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :°!"§$%&/()=?`@QWERTZUIOPÜ*ASDFGHJKLÖÄ'>YXCVBNM;:_ .
+########
--- a/src/lang/hungarian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/hungarian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1115,6 +1115,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Lehessen más vállalatoknak pénzt küldeni: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Különböző vágánytípusok engedélyezése egy állomáson: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Tömegszorzó tehervonatoknak (szimulációs célból): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Repülőgép sebességszorzó: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Ãthajtható állomások engedélyezése városi utakra: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Érintkező állomások építésének engedélyezése: {ORANGE}{STRING}
 
@@ -1132,7 +1133,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Automata megújításhoz szükséges minimális pénz: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Hibaüzenetek megjelenítési ideje: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Mutassa a lakosságot a feliratban: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Láthatatlan fák (átlátszó épületekkel): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Térkép generálás: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Eredeti
@@ -1237,6 +1237,7 @@
 STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :jobb utak
 STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2-es háló
 STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3-as háló
+STR_CONFIG_PATCHES_TOWN_LAYOUT_RANDOM                           :véletlenszerű
 
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}A fő eszközsor helye: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Balra
@@ -1416,6 +1417,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Játékos neve:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}A többi játékos ilyen nével fog ismerni Téged.
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Add meg a neved
 STR_NETWORK_CONNECTION                                          :{BLACK}Kapcsolat:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Válassz az internetes vagy helyi hálózati játék közül
 
@@ -1459,6 +1461,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Játék neve:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}A játék neve fog megjelenni a többi játékosnak a többjátékos menüben
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Add meg a hálózati játékhoz a neved
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Jelszó beállítása
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Védd le a játékodat jelszóval ha nem akarod hogy mások csatlakozzanak
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Válassz egy térképet:
@@ -1515,6 +1518,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :Svéd
 STR_NETWORK_LANG_TURKISH                                        :Török
 STR_NETWORK_LANG_UKRAINIAN                                      :Ukrán
+STR_NETWORK_LANG_AFRIKAANS                                      :Afrikai
+STR_NETWORK_LANG_CROATIAN                                       :Horvát
+STR_NETWORK_LANG_CATALAN                                        :Katalán
+STR_NETWORK_LANG_ESTONIAN                                       :Észt
+STR_NETWORK_LANG_GALICIAN                                       :Gall
+STR_NETWORK_LANG_GREEK                                          :Görög
+STR_NETWORK_LANG_LATVIAN                                        :Lett
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Hálózati-játék lobby
@@ -1613,6 +1623,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Privát] {STRING} számára: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[Mindenkinek] :
 STR_NETWORK_CHAT_ALL                                            :[Mindenkinek] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Add meg a hálózati beszélgetéshez a neved
 STR_NETWORK_NAME_CHANGE                                         :megváltoztatta a nevét erre:
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} A szerver leállította a játékot
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} A szerver újraindul...{}Türelem...
@@ -1676,6 +1687,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Nincs megfelelő sín
 STR_1007_ALREADY_BUILT                                          :{WHITE}...már van itt
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Előbb le kell rombolnod a sínt
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Az út egy irányú vagy blokkolt
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Vasútépítés
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Elektromos-vasút építés
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Egysínű vasút építése
@@ -1778,6 +1790,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Előbb le kell rombolnod az épületet
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Város)
 STR_2006_POPULATION                                             :{BLACK}Lakosság: {ORANGE}{COMMA}{BLACK} Házak: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Város átnevezése
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Nem nevezheted át a várost...
@@ -2014,6 +2027,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Válassz egy pályát (zöld), előre beállított játékot (kék) vagy véletlenszerű új játékot
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Véletlenszerű új játék
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Magasságtérkép betöltése
+STR_SAVE_OSKTITLE                                               :{BLACK}Add meg a játékmentés nevét
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}...{STRING} van az útban
@@ -2094,20 +2108,20 @@
 STR_4826_SUGAR_MINE.t                                           :cukorbányát
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Felhasznál: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Felhasznál: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Felhasznál: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Felhasznál: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Felhasznál: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Felhasznál: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Feldolgozásra váró szállítmány:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Gyárt: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Gyárt: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Gyárt: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Gyárt: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Múlt havi termelés:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% elszállítva)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% elszállítva)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}A fő nézetet a gazdasági épületre állítja
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Új {STRING.t} építenek {TOWN} közelében!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Új {STRING.t} ültettek {TOWN} közelében!
@@ -2740,26 +2754,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Az emberek ünnepelnek . . .{}Megérkezett az első vonat {STATION} állomásra!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} adatai
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Vonat van az útban
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING}{STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING}{STRING}
-STR_8806_GO_TO                                                  :Menj {STATION} állomásra
-STR_GO_TO_TRANSFER                                              :Menj {STATION} (odaszállít és felvesz rakományt)
-STR_8807_GO_TO_UNLOAD                                           :Menj {STATION} (lepakol)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Menj {STATION} (odaszállít és üresen továbbmegy)
-STR_8808_GO_TO_LOAD                                             :Menj {STATION} (felpakol)
-STR_GO_TO_TRANSFER_LOAD                                         :Menj {STATION} (odaszállít és teljes rakományra vár)
-STR_880A_GO_NON_STOP_TO                                         :Megállás nélkül menj {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Megállás nélkül menj {STATION} (odaszállít és felvesz rakományt)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Megállás nélkül menj {STATION} (lepakol)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Megállás nélkül menj {STATION} (odaszállít és üresen távozik)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Megállás nélkül menj {STATION} (felpakol)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Megállás nélkül menj {STATION} (odaszállít és teljes rakományra vár)
 STR_GO_TO_TRAIN_DEPOT                                           :Menj {TOWN} jármütelepre
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Javítsd a vonatot a {TOWN}i járműtelepen
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Menj megállás nélkül {TOWN}i járműtelepre
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Mindig javítsd a vonatot a {TOWN}i járműtelepen
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Útipont (időzítetlen)
 STR_TIMETABLE_TRAVEL_FOR                                        :Menjen {STRING} állomásra
 STR_TIMETABLE_STAY_FOR                                          :és maradjon {STRING.t}
@@ -2811,7 +2810,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Ãtkapcsolás menetrendi nézetre
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} menetrendje
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Menetrend vége - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Javítás
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Nem veheted meg a vasúti járművet...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK} Vásárlás éve: {LTBLUE}{NUM}{BLACK} Érték: {LTBLUE}{CURRENCY}
@@ -3584,3 +3582,6 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Automata szignáltávolság csökkentése
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Automata szignáltávolság növelése
 ########
+
+############ on screen keyboard
+########
--- a/src/lang/icelandic.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/icelandic.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -4,6 +4,8 @@
 ##plural 0
 ##gender karlkyn kvenkyn hvorugkyn
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Brún kortsins
@@ -14,6 +16,7 @@
 STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Sléttlendi nauðsynlegt
 STR_0008_WAITING                                                :{BLACK}Bíður: {WHITE}{STRING}
 STR_0009                                                        :{WHITE}{CARGO}
+STR_EN_ROUTE_FROM                                               :{YELLOW}({SHORTCARGO} frá {STATION})
 STR_000C_ACCEPTS                                                :{BLACK}Tekur við: {WHITE}
 STR_000D_ACCEPTS                                                :{BLACK}Tekur við: {GOLD}
 STR_000E                                                        :
@@ -278,6 +281,7 @@
 STR_OSNAME_MORPHOS                                              :MorphOS
 STR_OSNAME_AMIGAOS                                              :AmigaOS
 STR_OSNAME_OS2                                                  :OS/2
+STR_OSNAME_SUNOS                                                :SunOS
 
 STR_013B_OWNED_BY                                               :{WHITE}...í eigu {STRING}
 STR_013C_CARGO                                                  :{BLACK}Farmur
@@ -582,7 +586,11 @@
 STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Aðkoma fyrsta farartækis á stöð andstæðings
 STR_0208_ACCIDENTS_DISASTERS                                    :{YELLOW}Slys / hamfarir
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Fyrirtækisupplýsingar
+STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Opnun / lokun iðnaða
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Efnahagsbreytingar
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER                           :{YELLOW}Framleiðslubreytingar fyrirtækja þjónustuð af leikmanni
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER                            :{YELLOW}Framleiðslubreytingar fyrirtækja þjónustuð af mótherjum
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES                           :{YELLOW}Aðrar framleiðslubreytingar
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Ráð / upplýsingar um farartæki leikmanns
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Ný farartæki
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Breyting á viðtöku farms
@@ -717,6 +725,8 @@
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Setja vita
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Setja sendi
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Afmarkaðu eyðimörk.{}Smelltu og haltu CTRL til að fjarlægja hana
+STR_CREATE_LAKE                                                 :{BLACK}Skilgreina vantssvæði.{}Grafa skipaskurð, nema CTRL sé haldið niðri við sjávarmál, þá flæðir það umhverfið í staðin.
+STR_CREATE_RIVER                                                :{BLACK}Búa til fljót.
 STR_0290_DELETE                                                 :{BLACK}Eyða
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Eyða þessum bæ algjörlega
 STR_0292_SAVE_SCENARIO                                          :Vista kort
@@ -740,6 +750,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Lítill
 STR_02A2_MEDIUM                                                 :{BLACK}Miðlungs
 STR_02A3_LARGE                                                  :{BLACK}Stór
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Borg
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Velja stærð bæjar
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Stærð bæjar:
 
@@ -764,6 +775,7 @@
 STR_02C6_DIFFICULTY_SETTINGS                                    :Erfiðleikastig
 STR_MENU_CONFIG_PATCHES                                         :Viðbætur
 STR_NEWGRF_SETTINGS                                             :NewGRF stillingar
+STR_TRANSPARENCY_OPTIONS                                        :Gegnsæisstillingar
 STR_GAMEOPTMENU_0A                                              :
 STR_02CA_TOWN_NAMES_DISPLAYED                                   :{SETX 12}Bæjarnöfn sýnd
 STR_02CC_STATION_NAMES_DISPLAYED                                :{SETX 12}Stöðvarnöfn sýnd
@@ -846,6 +858,7 @@
 
 STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Fjármagna nýjan iðnað
 STR_JUST_STRING                                                 :{STRING}
+STR_JUST_INT                                                    :{NUM}
 STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...aðeins hægt að byggja í bæjum
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...aðeins hægt að byggja á regnskógasvæðum
 STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...aðeins hægt að byggja í eyðimörk
@@ -923,6 +936,7 @@
 
 STR_OPTIONS_FULLSCREEN                                          :{BLACK}Fylla út í skjá
 STR_OPTIONS_FULLSCREEN_TIP                                      :{BLACK}Smelltu hér til að OpenTTD fylli út í skjáinn
+STR_FULLSCREEN_FAILED                                           :{WHITE}Skjáfyllihamur brást
 
 STR_OPTIONS_RES                                                 :{BLACK}Skjáupplausn
 STR_OPTIONS_RES_CBO                                             :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
@@ -1006,6 +1020,7 @@
 STR_CONFIG_PATCHES_ON                                           :Já
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Sýna hraða farartækis á upplýsingaslá: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Leyfilegt að byggja í halla og á strönd: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Leyfa landslagsbreytingar undir byggingum, teinum o.fl. (landfylling): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Raunverulegri stærð svæðis sem stöðvar ná yfir: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Leyfa meiri eyðingu vega, brúa, gangna o.s.frv. í eigu bæjar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Leyfa mjög langar lestir: {ORANGE}{STRING}
@@ -1019,6 +1034,10 @@
 STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Aðeins afhlaða farmi á stöðvum þar sem er eftirspurn: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Leyfa byggingu mjög langra brúa: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Skýli má vera á áætlun lesta: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD             :{LTBLUE}Fjármögnun nýrra hráefnisiðnaða: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE        :engin
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL      :eins og annarra iðnaða
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :með jarðefnisleit
 STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Leyfa marga svipaða iðnaði í sama bæ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Má byggja iðnaði af sömu gerð nálægt hvor öðrum: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Sýna alltaf fulla dagsetningu á upplýsingaslá: {ORANGE}{STRING}
@@ -1028,9 +1047,13 @@
 STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Bifreiðir bíða í röð (með skömmtunaráhrifum): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Færa sjónarhorn þegar músin nálgast brún gluggans: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Leyfilegt að múta bæjaryfirvöldum: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE                              :{LTBLUE}Heimila sölu á sérleyfi til flutninga: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Heimila peningagreiðslur til annarra fyrirtækja: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Órétthyrndar lestarstöðvar leyfðar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Margfalda þyngd farms til að líkja eftir þyngri lestum: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Hraðastuðull flugvéla: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Leyfa strætóstöðvar á gangstéttum bæja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Heimila sambyggingu stöðva: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Alltaf leyfa litla flugvelli: {ORANGE}{STRING}
 
@@ -1046,7 +1069,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Lágmarks bankainnistæða fyrir sjálfvirka uppfæringu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Birtingartími villuskilaboða: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Sýna íbúafjölda í bæjarmerki: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Ósýnileg tré (með gagnsæjum byggingum): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Landslagsmótun: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Upphafleg
@@ -1071,13 +1093,45 @@
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Skoða þyrlur sjálfvirkt á þyrlupalli: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Opna landmótunarglugga samhliða öðrum framkvæmdum: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Færa sjónarhorn í öfuga átt miðað við mús: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Mjúkt skrun í skjágluggum: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Sýna mælstiku við byggingu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Sýna auka litastillingar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Aldrei
 STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Eigin fyrirtækis
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Allra fyrirtækja
 STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Nota liðsspjall með <ENTER>: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Virkni skrunhjóls: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Víkka/þrengja sjónarhorn
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Skruna á korti
+STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Engin
+STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Hraði skrunhjóls á korti: {ORANGE}{STRING}
 
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU                          :{LTBLUE}Hægrismellshermun: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_COMMAND                  :Command-smella
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_CONTROL                  :Control-smella
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF                      :Af
+
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Setja leik á bið þegar nýr leikur er hafinn: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Ãtarlegur listi yfir farartæki: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF                   :Af
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Eigin fyrirtækis
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :Allra fyrirtækja
+STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Sýna stöðu lestunar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Engra fyrirtækja
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Eigin fyrirtækis
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Allra fyrirtækja
+STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Virkja áætlanir fyrir farartæki: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Birta áætlanir í slögum frekar en dögum: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Valin lestartegund (eftir nýjan leik/opnaðan leik): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :Hefðbundin lest
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :Rafmagnslest
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL                   :Einteinungslest
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MAGLEV                     :Segulsviflest
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST                      :Fyrsta mögulega
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :Síðasta mögulega
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :Mest notuð
+
+STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Sýna byggingarvalmynd þegar engin viðeigandi farartæki eru fáanleg: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Lestir á leikmann mest: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Bifreiðir á leikmann mest: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Flugvélar á leikmann mest: {ORANGE}{STRING}
@@ -1110,12 +1164,32 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Leyfa hlutabréfakaup í öðrum fyrirtækjum
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Þegar dregið er, setja skilti á: {ORANGE}{STRING} hvern reit
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Nota skilti í stað ljósa fyrir: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI                            :{LTBLUE}Virkja valmynd lestarljósa: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Vegaskipulagið „ekki fleiri vegi“ er ekki gilt við landslagsgerð
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Vegaskipulag bæja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :ekki fleiri vegi
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :sjálfgefið
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :betri vegi
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 net
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 net
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Staðsetning tækjasláar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Vinstri
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Miðja
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Hægri
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Gluggar smella saman við: {ORANGE}{STRING} punkta radíus
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Gluggar smella: {ORANGE}ekki saman
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Vaxtarhraði bæja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Enginn
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Hægur
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Venjulegur
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Hraður
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Mjög hraður
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Hlutfall bæja sem verða að borgum: {ORANGE}1 af {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Hlutfall bæja sem verða að borgum: {ORANGE}Enginn
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Upphaflegur margfaldari bogarstærðar: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Fjarlægja fráleita vegahluti þegar vegagerð stendur yfir
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Viðmót
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Bygging
@@ -1131,6 +1205,19 @@
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Breyta gildi stillingar
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Einhver eða öll bil milli skoðana hér fyrir neðan eru ósamhæfanleg við valdar stillingar! 5-90% og 30-800 dagar er leyfilegt
 
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Leiðsagnarkerfi lesta: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Óráðlegt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Ráðlegt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Leiðsögukerfi bifreiða: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(Óráðlegt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Ráðlegt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Leiðsögukerfi skipa: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Ráðlegt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Óráðlegt)
+
 STR_TEMPERATE_LANDSCAPE                                         :Temprað landslag
 STR_SUB_ARCTIC_LANDSCAPE                                        :Heimskautalandslag
 STR_SUB_TROPICAL_LANDSCAPE                                      :Miðjarðarlandslag
@@ -1192,6 +1279,7 @@
 STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}Gróðursetja tré af handahófskenndri gerð
 
 STR_CANT_BUILD_CANALS                                           :{WHITE}Ekki hægt að grafa skipaskurð hér...
+STR_BUILD_CANALS_TIP                                            :{BLACK}Grafa skipaskurði.
 STR_LANDINFO_CANAL                                              :Skipaskurður
 
 STR_CANT_BUILD_LOCKS                                            :{WHITE}Ekki hægt að gera skurðgátt hér
@@ -1200,6 +1288,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}... bauja í notkun!
 
+STR_LANDINFO_COORDS                                             :{BLACK}Hnit: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Get ekki fjarlægt hluta af stöð...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}Get ekki breytt lestarteini...
@@ -1215,8 +1304,8 @@
 STR_FAST_FORWARD                                                :{BLACK}Spóla leikinn áfram
 STR_MESSAGE_HISTORY                                             :{WHITE}Saga skilaboða
 STR_MESSAGE_HISTORY_TIP                                         :{BLACK}Listi yfir nýlegar fréttir
-STR_MESSAGES_DISABLE_ALL                                        :{BLACK}Óvirkja allt
-STR_MESSAGES_ENABLE_ALL                                         :{BLACK}Virkja allt
+STR_MESSAGES_DISABLE_ALL                                        :{BLACK}Fela allt
+STR_MESSAGES_ENABLE_ALL                                         :{BLACK}Sýna allt
 
 STR_CONSTRUCT_COAL_MINE_TIP                                     :{BLACK}Grafa Kolanámu
 STR_CONSTRUCT_FOREST_TIP                                        :{BLACK}Gróðursetja Skóg
@@ -1263,6 +1352,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Nafn leikmanns:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Þetta er nafnið sem aðrir leikmenn munu þekkja þig undir
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Sláðu inn nafn þitt
 STR_NETWORK_CONNECTION                                          :{BLACK}Tenging:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Veldu milli internetleiks eða staðarnetleiks
 
@@ -1306,22 +1396,28 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Nafn leiks:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Nafn leiksins mun vera sýnilegt öðrum leikmönnum í fjölspilunarvalmyndinni
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Sláðu inn nafn netleiksins
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Veldu lykilorð
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Verndaðu leikinn þinn með lykilorði ef þú vilt ekki að óboðnir tengist honum
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Veldu kort:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Hvaða kort viltu spila?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Hámarksfjöldi notenda:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Veldu hámarksfjölda notenda. Ekki þarf að fylla öll pláss
+STR_NETWORK_LAN_INTERNET_COMBO                                  :{BLACK}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :Staðarnet
 STR_NETWORK_INTERNET                                            :Internet
 STR_NETWORK_LAN_INTERNET                                        :Staðarnet / Internet
 STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (auglýsa)
+STR_NETWORK_CLIENTS_SELECT                                      :{BLACK}{SKIP}{SKIP}{NUM} biðlar{P i ar}
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Hámarksfjöldi notenda:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Veldu hámarksfjölda notenda. Ekki þarf að fylla öll pláss
+STR_NETWORK_COMPANIES_SELECT                                    :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} Fyrirtæki
 STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Hámarksfjöldi fyrirtækja:
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Takmarka fjölda fyrirtækja á vefþjóni
+STR_NETWORK_SPECTATORS_SELECT                                   :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} áhorf{P andi endur}
 STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Hámarksfjöldi áhorfanda:
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Takmarka fjölda áhorfanda á vefþjóninum
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Tungumál:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Aðrir notendur munu vita hvaða tungumál er talað á þjóninum
+STR_NETWORK_LANGUAGE_COMBO                                      :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}Hefja leik
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}Hefja nýjan netleik í sérvöldu korti eða landslagi af handahófi
 STR_NETWORK_LOAD_GAME                                           :{BLACK}Hlaða leik
@@ -1332,6 +1428,38 @@
 STR_NETWORK_LANG_ENGLISH                                        :Enska
 STR_NETWORK_LANG_GERMAN                                         :Þýska
 STR_NETWORK_LANG_FRENCH                                         :Franska
+STR_NETWORK_LANG_BRAZILIAN                                      :Brasilíska
+STR_NETWORK_LANG_BULGARIAN                                      :Búlgarska
+STR_NETWORK_LANG_CHINESE                                        :Kínverska
+STR_NETWORK_LANG_CZECH                                          :Tékkneska
+STR_NETWORK_LANG_DANISH                                         :Danska
+STR_NETWORK_LANG_DUTCH                                          :Hollenska
+STR_NETWORK_LANG_ESPERANTO                                      :Esperanto
+STR_NETWORK_LANG_FINNISH                                        :Finnska
+STR_NETWORK_LANG_HUNGARIAN                                      :Ungverska
+STR_NETWORK_LANG_ICELANDIC                                      :Ãslenska
+STR_NETWORK_LANG_ITALIAN                                        :Ãtalska
+STR_NETWORK_LANG_JAPANESE                                       :Japanska
+STR_NETWORK_LANG_KOREAN                                         :Kóreiska
+STR_NETWORK_LANG_LITHUANIAN                                     :Litháenska
+STR_NETWORK_LANG_NORWEGIAN                                      :Norska
+STR_NETWORK_LANG_POLISH                                         :Pólska
+STR_NETWORK_LANG_PORTUGUESE                                     :Portúgalska
+STR_NETWORK_LANG_ROMANIAN                                       :Rómanska
+STR_NETWORK_LANG_RUSSIAN                                        :Rússneska
+STR_NETWORK_LANG_SLOVAK                                         :Slóvakíska
+STR_NETWORK_LANG_SLOVENIAN                                      :Slóveska
+STR_NETWORK_LANG_SPANISH                                        :Spænska
+STR_NETWORK_LANG_SWEDISH                                        :Sænska
+STR_NETWORK_LANG_TURKISH                                        :Tyrkneska
+STR_NETWORK_LANG_UKRAINIAN                                      :Úkraínska
+STR_NETWORK_LANG_AFRIKAANS                                      :Afríkanska
+STR_NETWORK_LANG_CROATIAN                                       :Króatíska
+STR_NETWORK_LANG_CATALAN                                        :Katalónska
+STR_NETWORK_LANG_ESTONIAN                                       :Eistneska
+STR_NETWORK_LANG_GALICIAN                                       :Gelíska
+STR_NETWORK_LANG_GREEK                                          :Gríska
+STR_NETWORK_LANG_LATVIAN                                        :Lettneska
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Anddyri fjölspilunarleiks
@@ -1430,6 +1558,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Private] Til {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[All] :
 STR_NETWORK_CHAT_ALL                                            :[All] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Sláðu inn texta fyrir netpsjall
 STR_NETWORK_NAME_CHANGE                                         :hefur breytt nafni sínu í
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Þjónninn sleit tengingunni
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Verið er að endurræsa þjóninn...{}Vinsamlega bíðið...
@@ -1493,6 +1622,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Enginn hentugur lestarteinn
 STR_1007_ALREADY_BUILT                                          :{WHITE}...nú þegar byggt
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Verður að fjarlægja lestartein fyrst
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Vegurinn er einstefnuvegur eða stíflaður
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Járnbrautarlestarframkvæmdir
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Raflestaframkvæmdir
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Einteinungsframkvæmdir
@@ -1524,6 +1654,14 @@
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Lestarteinn með venjulegum ljósum
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Lestarteinn með forljósum
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Lestarteinn með útljósum
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Járnbrautarspor með fjölljósum
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Járbrautarspor með venjulegum ljósum og forljósum
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Járnbrautarspor með venjulegum ljósum og útgangsljósum
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Járnbrautarspor með venjulegum ljósum og fjölljósum
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Járnbrautarspor með for- og útgangsljósum
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Járnbrautarspor með for- og fjölljósum
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Járnbrautarspor með útgangs- og fjölljósum
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Verður að fjarlægja járnbrautarstöð fyrst
 
 
 
@@ -1531,22 +1669,42 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Verður að fjarlægja veg fyrst
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Vegaframkvæmdir standa yfir
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Vegagerð
+STR_WHITE_TRAMWAY_CONSTRUCTION                                  :{WHITE}Sporvagnaframkvæmdir
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Veldu vegabrú
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... einstefnuvegin geta ekki mætt öðrum vegi
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Get ekki lagt veg hér...
+STR_CAN_T_BUILD_TRAMWAY_HERE                                    :{WHITE}Get ekki lagt sporvagnaspor hér...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Get ekki fjarlægt veg héðan...
+STR_CAN_T_REMOVE_TRAMWAY_FROM                                   :{WHITE}Get ekki fjarlægt sporvagnaspor héðan...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Bifreiðaskýli
+STR_TRAM_DEPOT_ORIENTATION                                      :{WHITE}Staða sporvagnaskýlis
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Get ekki fjarlægt bifreiðaskýli héðan...
+STR_CAN_T_BUILD_TRAM_VEHICLE                                    :{WHITE}Get ekki reist sporvagnaskýli hér...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Get ekki byggt strætóstoppistöð...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Get ekki byggt flutningabílastöð...
+STR_CAN_T_BUILD_PASSENGER_TRAM_STATION                          :{WHITE}Get ekki reist sporvagnastöð fyrir farþega...
+STR_CAN_T_BUILD_CARGO_TRAM_STATION                              :{WHITE}Get ekki reist sporvagnastöð fyrir farm...
 STR_180A_ROAD_CONSTRUCTION                                      :Vegagerð
+STR_TRAMWAY_CONSTRUCTION                                        :Sporvagnaframkvæmdir
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Leggja veg
+STR_BUILD_AUTOROAD_TIP                                          :{BLACK}Leggja veghluta í sjálfvirkum vegaham
+STR_BUILD_TRAMWAY_SECTION                                       :{BLACK}Leggja sporvagnaspor
+STR_BUILD_AUTOTRAM_TIP                                          :{BLACK}Leggja sporvagnaspor í sjálfvirkum sporvagnsham
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Byggja bifreiðaskýli (til að byggja og gera við bifreiðir)
+STR_BUILD_TRAM_VEHICLE_DEPOT                                    :{BLACK}Reisa sporvagnaskýli (til að smíða og þjónusta vagna)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Byggja strætóstoppistöð
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Byggja flutningabílastöð
+STR_BUILD_PASSENGER_TRAM_STATION                                :{BLACK}Reisa sporvagnastöð fyrir farþega
+STR_BUILD_CARGO_TRAM_STATION                                    :{BLACK}Reisa sporvagnastöð fyrir farm
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Byggja vegabrú
+STR_BUILD_TRAMWAY_BRIDGE                                        :{BLACK}Byggja sporvagnabrú
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Byggja göng
+STR_BUILD_TRAMWAY_TUNNEL                                        :{BLACK}Grafa sporvagnagöng
+STR_TOGGLE_ONE_WAY_ROAD                                         :{BLACK}Virkja/afvirkja einstefnugötur
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Skipta á milli byggja/fjarlægja fyrir vegagerð
+STR_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                            :{BLACK}Skipta á milli þess að leggja leggja og fjarlægja sporvagnaspor
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Veldu legu bifreiðaskýlis
+STR_SELECT_TRAM_VEHICLE_DEPOT                                   :{BLACK}Veldu stöðu sporvagnaskýlis
 STR_1814_ROAD                                                   :Vegur
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Vegur með umferðarljósum
 STR_1816_TREE_LINED_ROAD                                        :Trjáskreyttur vegur
@@ -1554,6 +1712,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Vega/lestar gatnamót
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Get ekki fjarlægt strætóstoppistöð...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Get ekki flutt vörubílastöð...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Get ekki fjarlægt farþegasporvagnastöð...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Get ekki fjarlægt farmsporvagnastöð...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Bæir
@@ -1562,8 +1722,10 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Verður að eyða byggingu fyrst
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Borg)
 STR_2006_POPULATION                                             :{BLACK}Ãbúafjöldi: {ORANGE}{COMMA}{BLACK}  Hús: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Endurskíra bæ
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Get ekki endurskírt bæ...
@@ -1718,8 +1880,12 @@
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} tekur nú við {STRING} og {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Staða strætisvagnastöðvar
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Staða póstvagnsstöðvar
+STR_PASSENGER_TRAM_STATION_ORIENTATION                          :{WHITE}Staða sporvagnafarþegastöðvar
+STR_CARGO_TRAM_STATION_ORIENT                                   :{WHITE}Staða farmsporvagnastöðvar
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Verður að eyða strætisvagnastöðinni fyrst
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Verður að eyða póstvagnsstöðinni fyrst
+STR_MUST_DEMOLISH_PASSENGER_TRAM_STATION                        :{WHITE}Verður að rífa farþegasporvagnastöð fyrst
+STR_MUST_DEMOLISH_CARGO_TRAM_STATION                            :{WHITE}Verður að rífa farmsporvagnastöð fyrst
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Stöðvar
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Ekkert -
@@ -1731,6 +1897,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Veldu lengd lestarstöðvar
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Veldu stöðu strætisvagnastöðvar
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Veldu stöðu póstvagnsstöðvar
+STR_SELECT_PASSENGER_TRAM_STATION_ORIENTATION                   :{BLACK}Velja stöðu farþegasporvagnastöðvar
+STR_SELECT_CARGO_TRAM_STATION_ORIENTATION                       :{BLACK}Velja stöðu farmsporvagnastöðvar
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Færa miðju sýnishorns á staðsetningu stöðvar
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Sýna einkunn stöðvar
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Breyta nafni stöðvar
@@ -1768,6 +1936,7 @@
 STR_3805_COAST_OR_RIVERBANK                                     :Strönd
 STR_3806_SHIP_DEPOT                                             :Slippur
 STR_3807_CAN_T_BUILD_ON_WATER                                   :{WHITE}...Get ekki byggt á vatni
+STR_MUST_DEMOLISH_CANAL_FIRST                                   :{WHITE}Verður að fylla upp í skipaskurð fyrst
 
 ##id 0x4000
 STR_4000_SAVE_GAME                                              :{WHITE}Vista leik
@@ -1780,6 +1949,11 @@
 STR_4007_GAME_SAVE_FAILED                                       :{WHITE}Vistun leiks mistókst{}{STRING}
 STR_4008_UNABLE_TO_DELETE_FILE                                  :{WHITE}Get ekki eytt skrá
 STR_4009_GAME_LOAD_FAILED                                       :{WHITE}Mistókst að opna leik{}{STRING}
+STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR                   :Innri villa: {STRING}
+STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME                         :Bilun í vistuðum leik - {STRING}
+STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME                        :Leikur er vistaður í nýrri útgáfu
+STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE                       :Skrá er ekki lesanleg
+STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE                      :Skrá er ekki skrifanleg
 STR_400A_LIST_OF_DRIVES_DIRECTORIES                             :{BLACK}Listi yfir drif, möppur og vistaða leiki
 STR_400B_CURRENTLY_SELECTED_NAME                                :{BLACK}Nafn fyrir vistun leiks
 STR_400C_DELETE_THE_CURRENTLY_SELECTED                          :{BLACK}Eyða nafninu
@@ -1788,6 +1962,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Velja landslag (grænt), forstilltan leik (blátt) eða handahófskenndan leik
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Búa til nýjan leik
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Hlaða hæðakorti
+STR_SAVE_OSKTITLE                                               :{BLACK}Sláðu inn nafn fyrir vistun leiksins
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} er fyrir
@@ -1831,13 +2006,20 @@
 STR_4826_SUGAR_MINE                                             :Sykurnáma
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Tekur við: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Tekur við: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Tekur við: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Tekur við: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Tekur við: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Tekur við: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
+############ range for produces starts
+STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Farmur sem bíður verkunar:
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Framleiðir: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Framleiðir: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+############ range for produces ends
+
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Framleiðsla síðasta mánaðar:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% flutt)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% flutt)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Miðja aðalsjónarhorn á iðnað
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Ný {STRING} í byggingu við {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Ný {STRING} er að rísa við {TOWN}!
@@ -1865,6 +2047,8 @@
 STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Verður að eyða göngum fyrst
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Verður að eyða brú fyrst
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Getur ekki byrjað og endað á sama stað
+STR_BRIDGEHEADS_NOT_SAME_HEIGHT                                 :{WHITE}Brúarendar ekki í sömu hæð
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN                                  :{WHITE}Brú er of lág fyrir umhverfið
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Verður að byrja og enda í sömu línu
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Óhentug staðsetning fyrir enda gangnanna
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -1897,7 +2081,7 @@
 
 ##id 0x5800
 STR_5800_OBJECT_IN_THE_WAY                                      :{WHITE}Hluturinn er fyrir
-STR_5801_TRANSMITTER                                            :Sendir
+STR_5801_TRANSMITTER                                            :Mastur
 STR_5802_LIGHTHOUSE                                             :Viti
 STR_5803_COMPANY_HEADQUARTERS                                   :Höfuðstöðvar fyritækis
 STR_5804_COMPANY_HEADQUARTERS_IN                                :{WHITE}...höfuðstöðvar fyrirtækis eru fyrir
@@ -1949,6 +2133,7 @@
 STR_SV_STNAME_LOWER                                             :Neðri {STRING}
 STR_SV_STNAME_HELIPORT                                          :{STRING} Þyrlupallur
 STR_SV_STNAME_FOREST                                            :{STRING} Skógur
+STR_SV_STNAME_FALLBACK                                          :{STRING} Stöð #{NUM}
 
 ############ end of savegame specific region!
 
@@ -1985,6 +2170,7 @@
 ############ range for difficulty settings ends
 
 STR_NONE                                                        :Engin
+STR_NUM_VERY_LOW                                                :Mjög lág
 STR_6816_LOW                                                    :Fáir
 STR_6817_NORMAL                                                 :Miðlungs
 STR_6818_HIGH                                                   :Margir
@@ -2143,6 +2329,11 @@
 STR_COMPANY_PASSWORD                                            :{BLACK}Lykilorð
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Til að vernda fyrirtæki þitt frá óboðnum notendum geturðu sett lykilorð á það
 STR_SET_COMPANY_PASSWORD                                        :{BLACK}Setja lykilorð á fyrirtæki
+STR_COMPANY_PASSWORD_CANCEL                                     :{BLACK}Ekki vista innslegið lykilorð
+STR_COMPANY_PASSWORD_OK                                         :{BLACK}Læsa fyrirtækinu með nýja lykilorðinu
+STR_COMPANY_PASSWORD_CAPTION                                    :{WHITE}Lykilorð fyrirtækis
+STR_MAKE_DEFAULT_COMPANY_PASSWORD                               :{BLACK}Sjálfgefið lykilorð fyrirtækis
+STR_MAKE_DEFAULT_COMPANY_PASSWORD_TIP                           :{BLACK}Nota lykilorð þessa fyrirtækis sem sjálfgefið fyrir ný fyrirtæki
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Heimssamdráttur!{}{}Hagfræðingar hræddir um efnahagshrun!
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Samdráttur!{}{}Uppslag í viðskiptum gefur bjartari von um betri efnahag!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Stækka/smækka gluggastærð
@@ -2168,6 +2359,8 @@
 STR_LIVERY_PASSENGER_WAGON_STEAM                                :Farþegavagn (Gufu)
 STR_LIVERY_PASSENGER_WAGON_DIESEL                               :Farþegavagn (Dísel)
 STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :Farþegavagn (Rafmagns)
+STR_LIVERY_PASSENGER_WAGON_MONORAIL                             :Farþegavagn (einteinungslest)
+STR_LIVERY_PASSENGER_WAGON_MAGLEV                               :Farþegavagn (segulsviflest)
 STR_LIVERY_FREIGHT_WAGON                                        :Flutningsvagnar
 STR_LIVERY_BUS                                                  :Strætó
 STR_LIVERY_TRUCK                                                :Flutningabílar
@@ -2176,6 +2369,8 @@
 STR_LIVERY_HELICOPTER                                           :Þyrlur
 STR_LIVERY_SMALL_PLANE                                          :Flugvélar
 STR_LIVERY_LARGE_PLANE                                          :Þotur
+STR_LIVERY_PASSENGER_TRAM                                       :Farþegasporvagn
+STR_LIVERY_FREIGHT_TRAM                                         :Farmsporvagn
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Grunnlitur fyrirtækis
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Litaskema lesta
@@ -2457,25 +2652,17 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Bæjarbúar fagna . . .{}Fyrsta lest kemur við á {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Upplýsingar)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Lest fyrir
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Fer til {STATION}
-STR_GO_TO_TRANSFER                                              :Fer til {STATION} (Yfirfæra og ferma)
-STR_8807_GO_TO_UNLOAD                                           :Fer til {STATION} (Afferma)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Fer til {STATION} (Yfirfæra og yfirgefa tóm)
-STR_8808_GO_TO_LOAD                                             :Fer til {STATION} (Fullferma)
-STR_GO_TO_TRANSFER_LOAD                                         :Fer til {STATION} (Yfirfæra og fullferma)
-STR_880A_GO_NON_STOP_TO                                         :Fer viðstöðulaust til {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Fer viðstöðulaust til {STATION} (Yfirfæra og ferma)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Fer viðstöðulaust til {STATION} (Afferma)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Fer viðstöðulaust til {STATION} (Yfirfæra og yfirgefa tóm)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Fer viðstöðulaust til {STATION} (Fullferma)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Fer viðstöðulaust til {STATION} (Yfirfæra og fullferma)
 STR_GO_TO_TRAIN_DEPOT                                           :Fer til {TOWN} Lestaskýli
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Viðgerð í {TOWN} Lestar Byggingu
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Fer viðstöðulaust til {TOWN} Lestar Byggingar
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Viðgerð viðstöðulaust í {TOWN} Lestar Byggingu
 
+STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Ferðalag (ekki sett í áætlun)
+STR_TIMETABLE_TRAVEL_FOR                                        :Ferðast í {STRING}
+STR_TIMETABLE_STAY_FOR                                          :og bíða í {STRING}
+STR_TIMETABLE_DAYS                                              :{COMMA} dag{P "" a}
+STR_TIMETABLE_TICKS                                             :{COMMA} sl{P ag ög}
+
 STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}à leið í {TOWN} Lestar Byggingu
 STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}à leið í {TOWN} Lestar Byggingu, {VELOCITY}
 STR_HEADING_FOR_TRAIN_DEPOT_SERVICE                             :{LTBLUE}Viðhald í {TOWN} lestaskýli
@@ -2517,9 +2704,12 @@
 STR_REFIT                                                       :{BLACK}Breyta
 STR_REFIT_TIP                                                   :{BLACK}Veldu farm til að breyta í. CTRL smelltu til að fjarlægja breytiskipun
 STR_REFIT_ORDER                                                 :(Breyta í {STRING})
+STR_TIMETABLE_VIEW                                              :{BLACK}Ãætlun
+STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Skipta yfir í áætlanasýn
+STR_ORDER_VIEW                                                  :{BLACK}Skipanir
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}Skipta yfir í skipanasýn
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Skipanir)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Endi skipana - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Skoðun
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Get ekki byggt lest...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Framleitt: {LTBLUE}{NUM}{BLACK} Virði: {LTBLUE}{CURRENCY}
@@ -2533,6 +2723,9 @@
 STR_8833_CAN_T_INSERT_NEW_ORDER                                 :{WHITE}Get ekki bætt við nýrri skipun...
 STR_8834_CAN_T_DELETE_THIS_ORDER                                :{WHITE}Get ekki eytt þessari skipun...
 STR_8835_CAN_T_MODIFY_THIS_ORDER                                :{WHITE}Get ekki breytt þessari skipun...
+STR_CAN_T_MOVE_THIS_ORDER                                       :{WHITE}Get ekki fært þessa skipun...
+STR_CAN_T_SKIP_ORDER                                            :{WHITE}Get ekki sleppt núverandi skipun...
+STR_CAN_T_SKIP_TO_ORDER                                         :{WHITE}Get ekki hoppað í valda skipun...
 STR_8837_CAN_T_MOVE_VEHICLE                                     :{WHITE}Get ekki fært farartæki...
 STR_REAR_ENGINE_FOLLOW_FRONT_ERROR                              :{WHITE}Aftari dráttarvagn fylgir alltaf fremri hluta
 STR_8838_N_A                                                    :N/A{SKIP}
@@ -2564,11 +2757,16 @@
 STR_8851_SHOW_CAPACITIES_OF_EACH                                :{BLACK}Sýna burðargetu hvers farartækis
 STR_SHOW_TOTAL_CARGO                                            :{BLACK}Sýna heildar burðargetu lestar, raðar eftir tegund farms
 STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Ãætlun - smelltu til að velja stöð. CTRL + músartakki færir sjónarhorn að stöðinni
+STR_8853_SKIP_THE_CURRENT_ORDER                                 :{BLACK}Sleppa núverandi skipun og fara í þá næstu. CTRL + smella sleppir valdri skipun
 STR_8854_DELETE_THE_HIGHLIGHTED                                 :{BLACK}Eyða valdri skipun
 STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Gera valda skipun viðstöðulausa
 STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Skeyta inn nýrri skipun á undan valdri skipun, eða bæta við á enda listans
 STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Neyða lest til að bíða eftir fullum farmi í valdri skipun
 STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Neyða lest til að afferma sig í valdri skipun
+STR_TIMETABLE_TOOLTIP                                           :{BLACK}Ãætlun - smelltu á skipun til að velja hana.
+STR_TIMETABLE_WAIT_TIME_TOOLTIP                                 :{BLACK}Breyta tímanum sem valin skipun ætti að taka
+STR_TIMETABLE_CLEAR_TIME_TOOLTIP                                :{BLACK}Hreinsa tímann fyrir valda skipun
+STR_TIMETABLE_RESET_LATENESS_TOOLTIP                            :{BLACK}Endurstilla seinkunarteljara, svo farartækið verði á réttum tíma
 STR_SERVICE_HINT                                                :{BLACK}Sleppa þessarri skipun nema þörf sé á viðgerð
 STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}Verð: {CURRENCY} Þyngd: {WEIGHT_S}{}Hraði: {VELOCITY}  Afl: {POWER}{}Rekstrarkostnaður: {CURRENCY} á ári{}Burðargeta: {CARGO}
 STR_885C_BROKEN_DOWN                                            :{RED}Bilaður
@@ -2590,6 +2788,8 @@
 STR_886B_CAN_T_RENAME_TRAIN_VEHICLE                             :{WHITE}Get ekki endurskírt lestargerð...
 STR_MAKE_THE_HIGHLIGHTED_ORDER                                  :{BLACK}Lætur lestina losa farminn á valinni skipun
 STR_TRANSFER                                                    :{BLACK}Yfirfæra
+STR_CLEAR_TIME                                                  :{BLACK}Hreinsa tíma
+STR_RESET_LATENESS                                              :{BLACK}Endurstilla seinkunnarteljara
 
 STR_TRAIN_STOPPING                                              :{RED}Stöðva
 STR_TRAIN_STOPPING_VEL                                          :{RED}Stöðva, {VELOCITY}
@@ -2597,6 +2797,25 @@
 STR_TRAIN_NO_POWER                                              :{RED}Ekkert afl
 STR_TRAIN_START_NO_CATENARY                                     :à þetta lestarspor vantar rafmagnsvíra, lestin kemst ekki af stað
 
+STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Ný {STRING} er nú fáanleg!
+STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{ENGINE}
+STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Ný {STRING} er nú fáanleg!  -  {ENGINE}
+
+STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Get ekki selt ónýtt farartæki...
+STR_CAN_T_REFIT_DESTROYED_VEHICLE                               :{WHITE}Get ekki breytt ónýtu farartæki...
+
+STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Get ekki stillt áætlun farartækis...
+STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Farartæki getur aðeins beðið við stöð.
+STR_TIMETABLE_NOT_STOPPING_HERE                                 :{WHITE}Þetta farartæki mun ekki stoppa við þessa stöð.
+STR_TIMETABLE_CHANGE_TIME                                       :{BLACK}Breyta tíma
+STR_TIMETABLE_STATUS_ON_TIME                                    :Þetta farartæki er nú þegar á réttum tíma
+STR_TIMETABLE_STATUS_LATE                                       :Þetta farartæki er {STRING} of seint
+STR_TIMETABLE_STATUS_EARLY                                      :Þetta farartæki er {STRING} of fljótt
+STR_TIMETABLE_TOTAL_TIME                                        :Það mun taka {STRING} að ljúka við þessa áætlun
+STR_TIMETABLE_TOTAL_TIME_INCOMPLETE                             :Það mun að minnsta kosti taka {STRING} að ljúka við þessa áætlun (ekki allar skipanir á áætlun)
+STR_TIMETABLE_AUTOFILL                                          :{BLACK}Skrifa sjálfvirkt
+STR_TIMETABLE_AUTOFILL_TOOLTIP                                  :{BLACK}Skrifa áætlunina sjálfvirkt með gildum úr fyrstu ferð
+
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Bíll fyrir
 STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Bílar
@@ -2638,12 +2857,16 @@
 STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}Bifreiðalisti - ýttu á bifreið fyrir nánari upplýsingar
 STR_9027_BUILD_THE_HIGHLIGHTED_ROAD                             :{BLACK}Smíða valda bifreið
 STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}Verð: {CURRENCY}{}Hraði: {VELOCITY}{}Rekstrarkostnaður: {CURRENCY} á ári{}Burðargeta: {CARGO}
+STR_ARTICULATED_RV_CAPACITY                                     :{BLACK}Rými: {LTBLUE}
+STR_BARE_CARGO                                                  :{CARGO}
 
 STR_902C_NAME_ROAD_VEHICLE                                      :{WHITE}Nefna bifreið
 STR_902D_CAN_T_NAME_ROAD_VEHICLE                                :{WHITE}Get ekki nefnt bifreið...
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Nefna bifreið
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Bæjarbúar fagna . . .{}Fyrsti strætisvagn kemur við á {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Bæjarbúar fagna . . .{}Fyrsti vörubíll kemur við á {STATION}!
+STR_CITIZENS_CELEBRATE_FIRST_PASSENGER_TRAM                     :{BLACK}{BIGFONT}Bæjarbúar fagna . . .{}Fyrsti farþegasporvagn kemur við á {STATION}!
+STR_CITIZENS_CELEBRATE_FIRST_CARGO_TRAM                         :{BLACK}{BIGFONT}Bæjarbúar fagna . . .{}Fyrsti farmsporvagn kemur við á {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Bílslys!{}Bílstjóri deyr í sprengingu eftir árekstur við lest
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Bílslys!{}{COMMA} deyja í sprengingu eftir árekstur við lest
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Get ekki snúið bifreið við...
@@ -2804,6 +3027,8 @@
 STR_GO_TO_AIRPORT_HANGAR                                        :Fara í {STATION} flugskýli
 SERVICE_AT_AIRPORT_HANGAR                                       :Skoða í {STATION} flugskýli
 
+STR_TIMETABLE_TITLE                                             :{WHITE}{VEHICLE} (Ãætlun)
+
 ##id 0xB000
 STR_B000_ZEPPELIN_DISASTER_AT                                   :{BLACK}{BIGFONT}Loftskipaslys á {STATION}!
 STR_B001_ROAD_VEHICLE_DESTROYED                                 :{BLACK}{BIGFONT}Bifreið eyðilagðist í árekstri við FFH
@@ -2857,6 +3082,19 @@
 STR_NEWGRF_MD5SUM                                               :{BLACK}MD5 summa: {SILVER}{STRING}
 STR_NEWGRF_CONFIRMATION_TEXT                                    :{YELLOW}Þú ert í þann mund að eiga við leik í gangi, við það gæti OpenTTD hrunið.{}Ertu viss um að þú viljir halda áfram?
 
+STR_NEWGRF_ERROR_MSG_INFO                                       :{SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_WARNING                                    :{RED}Aðvörun: {SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_ERROR                                      :{RED}Villa: {SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_FATAL                                      :{RED}Banvænt: {SILVER}{STRING}
+STR_NEWGRF_ERROR_VERSION_NUMBER                                 :{STRING} Mun ekki virka með útgáfu TTDPatch sem OpenTTD gefur til kynna.
+STR_NEWGRF_ERROR_DOS_OR_WINDOWS                                 :{STRING} er fyrir {STRING} útgáfu af TTD.
+STR_NEWGRF_ERROR_UNSET_SWITCH                                   :{STRING} er hannað til að notast með {STRING}
+STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Ógild færibreyta {STRING}: færibreyta {STRING} ({NUM})
+STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} verður að hlaðast á undan {STRING}.
+STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} verður að hlaðast eftir {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} þarf OpenTTD útgáfu {STRING} eða nýrri.
+STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF skránni sem það var hannað til að þýða
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Of mörg NewGRF eru hlaðin.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Bæta við
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Bæta NewGRF skrá við listann
@@ -2885,6 +3123,8 @@
 STR_NEWGRF_COMPATIBLE_LOAD_WARNING                              :{WHITE}Samsvarandi GRF hlaðið í staðin týndrar skrár
 STR_NEWGRF_DISABLED_WARNING                                     :{WHITE}Týndar GRF skrár hafa verið gerðar óvirkar
 STR_NEWGRF_NOT_FOUND_WARNING                                    :{WHITE}Vantar GRF skrár til að hægt sé að hlaða leik
+STR_NEWGRF_UNPAUSE_WARNING_TITLE                                :{YELLOW}Vantar GRF skrá(r)
+STR_NEWGRF_UNPAUSE_WARNING                                      :{WHITE}OpenTTD getur hrunið ef leikur er settur af stað. Ekki skrá villufærslur fyrir eftirfarandi hrun.{}Ertu viss um að þú viljir setja leikinn af stað?
 
 STR_CURRENCY_WINDOW                                             :{WHITE}Sérvalinn gjaldeyrir
 STR_CURRENCY_EXCHANGE_RATE                                      :{LTBLUE}Gengi: {ORANGE}{CURRENCY} = £ {COMMA}
@@ -2917,6 +3157,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Þú ert í þann mund að selja öll farartækin. Viltu halda áfram?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Röng tegund skýlis
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Selja allar lestir í skýli
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Selja allar bifreiðar í skýli
@@ -2954,6 +3195,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Heldur lengd lestar með því að fjarlægja vagna (framan frá) ef útskipting dráttarvagna myndi lengja hana.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Skipti út: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} TILRAUNAEIGINLEIKI {}Skipta á milli útskiptiglugga dráttar- og flutningavagna.{}Útskipting vagna fer aðeins fram ef hægt er að breyta nýju vögnunum til að flytja sama farm og þeir gömlu. Það er kannað fyrir hvern vagn þegar útskipting á honum fer fram.
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Lestarvagn er ekki fáanlegur
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Bifreið er ekki fáanleg
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Skip er ekki fáanlegt
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Flugvél er ekki fáanleg
 
 STR_ENGINES                                                     :Dráttarvagnar
 STR_WAGONS                                                      :Vagnar
@@ -3004,6 +3249,12 @@
 STR_PURCHASE_INFO_ALL_BUT                                       :Allt nema {GOLD}
 STR_PURCHASE_INFO_MAX_TE                                        :{BLACK}Hámarks : {GOLD}{FORCE}
 
+########### For showing numbers in widgets
+
+STR_NUM_1                                                       :{BLACK}{SKIP}{NUM}
+STR_NUM_2                                                       :{BLACK}{SKIP}{SKIP}{NUM}
+STR_NUM_3                                                       :{BLACK}{SKIP}{SKIP}{SKIP}{NUM}
+
 ########### String for New Landscape Generator
 
 STR_GENERATE                                                    :{WHITE}Mynda land
@@ -3012,6 +3263,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Sköpun heims
 STR_RANDOM_SEED                                                 :{BLACK}Raðnúmer lands:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Smelltu til að skrifa inn raðnúmer
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Sláðu inn slembistofn
 STR_LAND_GENERATOR                                              :{BLACK}Landmyndun:
 STR_TREE_PLACER                                                 :{BLACK}Planta trjám:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Snúningur hæðarkorts:
@@ -3029,6 +3281,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Breyta upphafsári
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Stærð hæðarlínukorts
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Ekki er mælt með því að breyta stærð grunnkorts of mikið. Viltu halda áfram?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Vegaskipulagsaðvörun
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Vegaskipulagið „ekki fleiri vegi“ er óráðlegt. Halda myndun áfram?
 STR_HEIGHTMAP_NAME                                              :{BLACK}Nafn hæðarlínukorts:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Stærð: {ORANGE}{NUM} x {NUM}
 STR_GENERATION_WORLD                                            :{WHITE}Skapa heim...
@@ -3056,6 +3310,7 @@
 STR_FLAT_WORLD_HEIGHT                                           :{BLACK}Hæð slétts lands yfir sjávarmáli
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Miðja heimskort á núverandi staðsetningu
+STR_SMALLMAP_INDUSTRY                                           :{TINYFONT}{STRING} ({NUM})
 
 ########### String for new airports
 STR_SMALL_AIRPORT                                               :{BLACK}Lítill flugvöllur
@@ -3081,5 +3336,154 @@
 STR_MEASURE_AREA_HEIGHTDIFF                                     :{BLACK}Svæði: {NUM} x {NUM}{}Hæðarmunur: {NUM} m
 
 ############ Date formatting
+STR_DATE_TINY                                                   :{STRING}-{STRING}-{NUM}
+STR_DATE_SHORT                                                  :{STRING} {NUM}
+STR_DATE_LONG                                                   :{STRING} {STRING} {NUM}
 
 ########
+
+STR_FEEDER_CARGO_VALUE                                          :{BLACK}Millifæra gjaldeyri: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...vegurinn er í eigu bæjar
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...vegurinn snýr í ranga átt
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Stilling gegnsæjis
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Virkja/afvirkja gegnsæji stöðvaskiltia. CTRL+smella til að læsa.
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Virkja/afvirkja gegnsæji trjáa. CTRL+smella til að læsa.
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Virkja/afvirkja gegnsæji húsa. CTRL+smella til að læsa.
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Virkja/afvirkja gegnsæji iðnaða. CTRL+smella til að læsa.
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Virkja/afvirkja gegnsæji bygginga á borð við stöðvar, skýli og veghlið. CTRL+smella til að læsa.
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Virkja/afvirkja gegnsæji brúa. CTRL+smella til að læsa.
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Virkja/afvirkja gegnsæji bygginga á borð við vita og möstur. CTRL+smella til að læsa.
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Virkja/afvirkja gegnsæji raflína. CTRL+smella til að læsa.
+STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Virkja/afvirkja gegnsæji hleðslumæla. CTRL+smella til að læsa.
+
+STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
+STR_PERCENT_UP                                                  :{WHITE}{NUM}%{UPARROW}
+STR_PERCENT_DOWN_SMALL                                          :{TINYFONT}{WHITE}{NUM}%{DOWNARROW}
+STR_PERCENT_DOWN                                                :{WHITE}{NUM}%{DOWNARROW}
+STR_PERCENT_UP_DOWN_SMALL                                       :{TINYFONT}{WHITE}{NUM}%{UPARROW}{DOWNARROW}
+STR_PERCENT_UP_DOWN                                             :{WHITE}{NUM}%{UPARROW}{DOWNARROW}
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Hópur {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Allar lestir
+STR_GROUP_ALL_ROADS                                             :Allar bifreiðir
+STR_GROUP_ALL_SHIPS                                             :Öll skip
+STR_GROUP_ALL_AIRCRAFTS                                         :Allar flugvélar
+STR_GROUP_DEFAULT_TRAINS                                        :Hóplausar lestir
+STR_GROUP_DEFAULT_ROADS                                         :Hóplausar bifreiðir
+STR_GROUP_DEFAULT_SHIPS                                         :Hóplaus skip
+STR_GROUP_DEFAULT_AIRCRAFTS                                     :Hóplausar flugvélar
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Bæta við deildu farartæki
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Fjarlægja öll farartæki
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Lest{P "" ir}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Bifreið{P "" ar}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Skip
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Flugvél{P "" ar}
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Endurnefna hóp
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Skipta út farartækjum í „{GROUP}“
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Get ekki búið til hóp...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Get ekki eytt þessum hópi...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Get ekki endurnefnt hóp...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Get ekki fjarlægt öll farartæki úr þessum hóp...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Get ekki bætt farartækinu við þennan hóp...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Get ekki bætt við deildu farartæki við hóp...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Hópar - Smelltu á hóp til að skrifa öll farartæki í þessum hóp
+STR_GROUP_CREATE_TIP                                            :{BLACK}Smelltu til að búa til hóp
+STR_GROUP_DELETE_TIP                                            :{BLACK}Eyða völdum hóp
+STR_GROUP_RENAME_TIP                                            :{BLACK}Endurnefna valdan hóp
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Smelltu til að halda þessum hóp frá sjálfvirkri uppfærslu
+
+STR_COMPANY_NAME                                                :{COMPANY}
+STR_ENGINE_NAME                                                 :{ENGINE}
+STR_GROUP_NAME                                                  :{GROUP}
+STR_PLAYER_NAME                                                 :{PLAYERNAME}
+STR_SIGN_NAME                                                   :{SIGN}
+STR_VEHICLE_NAME                                                :{VEHICLE}
+
+STR_NAME_MUST_BE_UNIQUE                                         :{WHITE}Nafnið verður að vera sérstætt
+
+#### Improved sign GUI
+STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Fara að næsta skilti
+STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Fara að fyrra skilti
+STR_SIGN_OSKTITLE                                               :{BLACK}Sláðu inn nafn fyrir skiltið
+
+########
+
+STR_FUND_NEW_INDUSTRY                                           :{BLACK}Fjármagna
+STR_PROSPECT_NEW_INDUSTRY                                       :{BLACK}Horfur
+STR_BUILD_NEW_INDUSTRY                                          :{BLACK}Reisa
+STR_INDUSTRY_SELECTION_HINT                                     :{BLACK}Veldu viðeigandi iðnað úr listanum
+
+############ Face formatting
+STR_FACE_ADVANCED                                               :{BLACK}Ãtarlegt
+STR_FACE_ADVANCED_TIP                                           :{BLACK}Ãtarleg breyting andlits
+STR_FACE_SIMPLE                                                 :{BLACK}Einfalt
+STR_FACE_SIMPLE_TIP                                             :{BLACK}Einföld breyting andlits
+STR_FACE_LOAD                                                   :{BLACK}Hlaða
+STR_FACE_LOAD_TIP                                               :{BLACK}Hlaða uppáhalds andliti
+STR_FACE_LOAD_DONE                                              :{WHITE}Uppáhalds andlitinu þínu hefur verið hlaðið úr stilliskrá OpenTTD.
+STR_FACE_FACECODE                                               :{BLACK}Andlit nr.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Skoða og/eða stilla andlitsnúmer
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Skoða og/eða stilla andlitsnúmer
+STR_FACE_FACECODE_SET                                           :{WHITE}Nýtt andlitsnúmer hefur verið stillt.
+STR_FACE_FACECODE_ERR                                           :{WHITE}Gat ekki stillt andlitsnúmer - verður að vera tala á bilinu 0 og upp í 4.294.967.295!
+STR_FACE_SAVE                                                   :{BLACK}Vista
+STR_FACE_SAVE_TIP                                               :{BLACK}Vista uppáhalds andlit
+STR_FACE_SAVE_DONE                                              :{WHITE}Þetta andlit verður vistað sem þitt uppáhalds í stilliskrá OpenTTD.
+STR_FACE_EUROPEAN                                               :{BLACK}Evrópskt
+STR_FACE_SELECT_EUROPEAN                                        :{BLACK}Velur evrópskt útlit
+STR_FACE_AFRICAN                                                :{BLACK}Afrískt
+STR_FACE_SELECT_AFRICAN                                         :{BLACK}Velur afrískt útlit
+STR_FACE_YES                                                    :Já
+STR_FACE_NO                                                     :Nei
+STR_FACE_MOUSTACHE_EARRING_TIP                                  :{BLACK}Virkja yfirvaraskegg eða eyrnalokk
+STR_FACE_HAIR                                                   :Hár:
+STR_FACE_HAIR_TIP                                               :{BLACK}Breyta hári
+STR_FACE_EYEBROWS                                               :Augabrúnir:
+STR_FACE_EYEBROWS_TIP                                           :{BLACK}Breyta augabrúnum
+STR_FACE_EYECOLOUR                                              :Augnlitur:
+STR_FACE_EYECOLOUR_TIP                                          :{BLACK}Breyta augnlit
+STR_FACE_GLASSES                                                :Gleraugu:
+STR_FACE_GLASSES_TIP                                            :{BLACK}Velja/afvelja gleraugu
+STR_FACE_GLASSES_TIP_2                                          :{BLACK}Breyta gleraugum
+STR_FACE_NOSE                                                   :Nef:
+STR_FACE_NOSE_TIP                                               :{BLACK}Breyta nefi
+STR_FACE_LIPS                                                   :Varir:
+STR_FACE_MOUSTACHE                                              :Yfirvaraskegg:
+STR_FACE_LIPS_MOUSTACHE_TIP                                     :{BLACK}Breyta vörum eða yfirvaraskeggi
+STR_FACE_CHIN                                                   :Vangar:
+STR_FACE_CHIN_TIP                                               :{BLACK}Breyta vöngum
+STR_FACE_JACKET                                                 :Jakki:
+STR_FACE_JACKET_TIP                                             :{BLACK}Breyta jakka
+STR_FACE_COLLAR                                                 :Kragi:
+STR_FACE_COLLAR_TIP                                             :{BLACK}Breyta kraga
+STR_FACE_TIE                                                    :Bindi:
+STR_FACE_EARRING                                                :Eyrnalokkur:
+STR_FACE_TIE_EARRING_TIP                                        :{BLACK}Breyta bindi eða eyrnalokk
+########
+
+############ signal GUI
+STR_SIGNAL_SELECTION                                            :{WHITE}Lestaljós
+STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE                           :{WHITE}Get ekki breytt ljósum hér...
+STR_BUILD_SIGNAL_SEMAPHORE_NORM_TIP                             :{BLACK}Hefðbundin merki{}Merki eru nauðsynleg til að koma í veg fyrir að lestir lendi í árekstri.
+STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TIP                            :{BLACK}Komumerki{}Hleypir í gegn uns ekkert frámerki er eftir opið.
+STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TIP                             :{BLACK}Frámerki{}Virkar eins og hefðbundið merki en er nauðsynlegt til að fá rétta virkni fyrir komu- og fjölmerki.
+STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TIP                            :{BLACK}Fjölmerki{}Fjölmerkin virka bæði sem komu- og frámerki sem gerir þér kleyft að hanna stór „tré“ af formerkjum.
+STR_BUILD_SIGNAL_ELECTRIC_NORM_TIP                              :{BLACK}Hefðbundin ljós{}Ljós eru nauðsynleg til að koma í veg fyrir að lestir lendi í árekstri.
+STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TIP                             :{BLACK}Komuljós{}Hleypir í gegn uns ekkert fráljós er lengur grænt.
+STR_BUILD_SIGNAL_ELECTRIC_EXIT_TIP                              :{BLACK}Fráljós{}Virkar eins og hefðbundið ljós en er naðusynlegt til að fá rétta virkni fyrir komu- og fjölljós.
+STR_BUILD_SIGNAL_ELECTRIC_COMBO_TIP                             :{BLACK}Fjölljós{}Fjölljósið virkar bæði sem komu- og fráljós sem gerir þér kleyft að hanna stór „tré“ af forljósum.
+STR_SIGNAL_CONVERT_TIP                                          :{BLACK}Breyting ljósa{}Þegar valið þá breytist merki sem til er fyrir í valda gerð og tegund. CTRL-smellur mun rúlla í gegnum núverandi tegund.
+STR_DRAG_SIGNALS_DENSITY_TIP                                    :{BLACK}Þéttleiki dreginna ljósa
+STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Minnka þéttleika dreginna ljósa
+STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Auka þéttleika dreginna ljósa
+########
+
+############ on screen keyboard
+########
--- a/src/lang/italian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/italian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1052,6 +1052,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Consenti l'invio di denaro ad altre compagnie: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Stazioni non uniformi: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Moltiplicatore di peso per simulare treni merci pesanti: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Fattore di velocità degli aeromobili: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Consenti fermate passanti sulle strade delle città: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Consenti la costruzione di stazioni adiacenti: {ORANGE}{STRING}
 
@@ -1069,7 +1070,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Rinnova solo se disponibile il fondo minimo di {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Durata dei messaggi d'errore: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Mostra la popolazione di una città nell'etichetta del nome: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Alberi invisibili: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Generatore terreno: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Originale
@@ -1174,6 +1174,7 @@
 STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :Pianta migliorata
 STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :Griglia 2x2
 STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :Griglia 3x3
+STR_CONFIG_PATCHES_TOWN_LAYOUT_RANDOM                           :Casuale
 
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Posizione barra degli strumenti principale: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Sinistra
@@ -1353,6 +1354,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Nome giocatore:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Questo è il nome con cui si verrà identificati dagli altri giocatori
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Inserire il nome del giocatore
 STR_NETWORK_CONNECTION                                          :{BLACK}Connessione:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Sceglie fra una partita in Internet o in rete locale (LAN)
 
@@ -1396,6 +1398,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Nome partita:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Il nome della partita sarà mostrato dagli altri giocatori nel menu di selezione delle partite multigiocatore
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Inserire il nome della partita
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Imposta password
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Protegge la partita con una password in modo che non sia accessibile pubblicamente
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Seleziona mappa:
@@ -1452,6 +1455,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :Svedese
 STR_NETWORK_LANG_TURKISH                                        :Turco
 STR_NETWORK_LANG_UKRAINIAN                                      :Ucraino
+STR_NETWORK_LANG_AFRIKAANS                                      :Afrikaans
+STR_NETWORK_LANG_CROATIAN                                       :Croato
+STR_NETWORK_LANG_CATALAN                                        :Catalano
+STR_NETWORK_LANG_ESTONIAN                                       :Estone
+STR_NETWORK_LANG_GALICIAN                                       :Galiziano
+STR_NETWORK_LANG_GREEK                                          :Greco
+STR_NETWORK_LANG_LATVIAN                                        :Lèttone
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Stanza principale partita multigiocatore
@@ -1550,6 +1560,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Privato] A {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[Tutti] :
 STR_NETWORK_CHAT_ALL                                            :[Tutti] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Inserire il messaggio
 STR_NETWORK_NAME_CHANGE                                         :ha cambiato il suo nome in
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Il server ha chiuso la sessione
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Il server si sta riavviando...{}Attendere prego...
@@ -1613,6 +1624,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Tipo di binari non adatti
 STR_1007_ALREADY_BUILT                                          :{WHITE}...già costruito
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Bisogna demolire i binari prima
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}La strada è bloccata o a senso unico
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Costruzione ferrovie
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Costruzione ferrovie elettrificate
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Costruzione monorotaia
@@ -1715,6 +1727,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}L'edificio deve essere demolito prima
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Metropoli)
 STR_2006_POPULATION                                             :{BLACK}Popolazione: {ORANGE}{COMMA}{BLACK}  Case: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Rinomina città
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Impossibile rinominare la città...
@@ -1951,6 +1964,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Seleziona uno scenario (verde), una partita pre-impostata (blu), o una nuova partita casuale
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Crea partita casuale
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Carica heightmap
+STR_SAVE_OSKTITLE                                               :{BLACK}Inserire un nome per il salvataggio
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} di mezzo
@@ -1994,20 +2008,20 @@
 STR_4826_SUGAR_MINE                                             :{G=f}Miniera di zucchero
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Richiede: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Richiede: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Richiede: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Richiede: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Richiede: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Richiede: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Carico in attesa di lavorazione:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produzione il mese scorso:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% trasportato)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% trasportato)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centra la visuale principale sulla posizione dell'industria
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nuov{G o a} {STRING} in costruzione vicino a {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nuov{G o a} {STRING} piantat{G o a} vicino a {TOWN}!
@@ -2640,26 +2654,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}Il primo treno arriva a {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Dettagli)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Treno di mezzo
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Vai a {STATION}
-STR_GO_TO_TRANSFER                                              :Vai a {STATION} (Trasferisci e carica merce)
-STR_8807_GO_TO_UNLOAD                                           :Vai a {STATION} (Scarica)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Vai a {STATION} (Trasferisci e parti vuoto)
-STR_8808_GO_TO_LOAD                                             :Vai a {STATION} (Carica)
-STR_GO_TO_TRANSFER_LOAD                                         :Vai a {STATION} (Trasferisci e aspetta carico completo)
-STR_880A_GO_NON_STOP_TO                                         :Vai non-stop a {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Vai non-stop a {STATION} (Trasferisci e carica merce)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Vai non-stop a {STATION} (Scarica)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Vai non-stop a {STATION} (Trasferisci e parti vuoto)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Vai non-stop a {STATION} (Carica)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Vai non-stop a {STATION} (Trasferisci e aspetta carico completo)
 STR_GO_TO_TRAIN_DEPOT                                           :Vai al Deposito ferroviario di {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Manutenzione al Deposito di {TOWN}
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Vai non-stop al Deposito ferroviario di {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Manutenzione non-stop al Deposito di {TOWN}
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Viaggia senza orario
 STR_TIMETABLE_TRAVEL_FOR                                        :Viaggia per {STRING}
 STR_TIMETABLE_STAY_FOR                                          :e sosta per {STRING}
@@ -2709,9 +2708,10 @@
 STR_REFIT_ORDER                                                 :(Riadatta per {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}Orario
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Passa alla visualizzazione della tabella oraria
+STR_ORDER_VIEW                                                  :{BLACK}Ordini
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}Passa alla visualizzazione degli ordini
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordini)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fine degli ordini - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Manutieni
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Impossibile costruire il veicolo ferroviario...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Costruito nel: {LTBLUE}{NUM}{BLACK} Valore: {LTBLUE}{CURRENCY}
@@ -3265,6 +3265,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Generazione mondo
 STR_RANDOM_SEED                                                 :{BLACK}Seme casuale:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Fare clic per introdurre un seme casuale
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Inserire un seme casuale
 STR_LAND_GENERATOR                                              :{BLACK}Generatore:
 STR_TREE_PLACER                                                 :{BLACK}Algoritmo alberi:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Rotazione heightmap:
@@ -3412,6 +3413,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Va al cartello successivo
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Va al cartello precedente
+STR_SIGN_OSKTITLE                                               :{BLACK}Inserire il nome del cartello
 
 ########
 
@@ -3484,3 +3486,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Riduce la distanza fra i segnali costruiti
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Aumenta la distanza fra i segnali costruiti
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :\1234567890'ìùqwertyuiopè+asdfghjklòà  zxcvbnm,.- .
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :|!"£$%&/()=?^QWERTYUIOPé*§ASDFGHJKLç°  ZXCVBNM;:_ .
+########
--- a/src/lang/japanese.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/japanese.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1067,7 +1067,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}自動交æ›ã™ã‚‹ãŸã‚ã®æœ€å°è³‡é‡‘:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}エラーメッセージã®è¡¨ç¤ºæ™‚間:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}町åã«äººå£ã‚’å«ã‚€ï¼š{ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}木をä¸å¯è¦–ã«ã™ã‚‹ï¼ˆå»ºç‰©ãŒé€æ˜Žï¼‰ï¼š{ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}地形作æˆï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :æ—§å¼
@@ -1992,20 +1991,20 @@
 STR_4826_SUGAR_MINE                                             :砂糖鉱山
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}å¿…è¦ãªåŽŸæ–™ï¼š{YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}å¿…è¦ãªåŽŸæ–™ï¼š{YELLOW}{STRING}ã¨{STRING}
-STR_4829_REQUIRES                                               :{BLACK}å¿…è¦ãªåŽŸæ–™ï¼š{YELLOW}{STRING}ã€{STRING}ã€{STRING}
+STR_4827_REQUIRES                                               :{BLACK}å¿…è¦ãªåŽŸæ–™ï¼š{YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}å¿…è¦ãªåŽŸæ–™ï¼š{YELLOW}{STRING}{STRING}ã¨{STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}å¿…è¦ãªåŽŸæ–™ï¼š{YELLOW}{STRING}{STRING}ã€{STRING}{STRING}ã€{STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}処ç†å¾…ã¡ã®è²¨ç‰©ï¼š
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}産物:{YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}産物:{YELLOW}{STRING}ã€{STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}産物:{YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}産物:{YELLOW}{STRING}{STRING}ã€{STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}先月ã®ç”Ÿç”£é‡ï¼š
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK}({COMMA}ï¼…é‹é€æ¸ˆã¿ï¼‰
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK}({COMMA}ï¼…é‹é€æ¸ˆã¿ï¼‰
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}主ã®ç”»é¢ã‚’産業ã®å ´æ‰€ã«ç§»å‹•ã—ã¾ã™
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}æ–°ã—ã„{STRING}ãŒ{TOWN}町ã«å·¥äº‹ä¸­ï¼
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}æ–°ã—ã„{STRING}ãŒ{TOWN}ç”ºã«æ¤æž—中ï¼
@@ -2638,26 +2637,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}町民ã®ç¥è³€{}åˆåˆ—車ãŒ{STATION}é§…ã«åˆ°ç€ï¼
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE}(詳細)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}列車ãŒã‚りã¾ã™
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :{STATION}ã¸è¡Œã
-STR_GO_TO_TRANSFER                                              :{STATION}ã¸è¡Œãï¼ˆé‹æ¬ã—ã¦è²¨ç‰©ã‚’ç©ã‚€ï¼‰
-STR_8807_GO_TO_UNLOAD                                           :{STATION}ã¸è¡Œã(貨物をé™ã‚ã™ï¼‰
-STR_GO_TO_TRANSFER_UNLOAD                                       :{STATION}ã¸è¡Œãï¼ˆé‹æ¬ã—ã¦ç©ºãã®ã¾ã¾æ¬¡ã¸è¡Œã)
-STR_8808_GO_TO_LOAD                                             :{STATION}ã¸è¡Œã(全負è·ï¼‰
-STR_GO_TO_TRANSFER_LOAD                                         :{STATION}ã¸è¡Œãï¼ˆé‹æ¬ã—ã¦å…¨è² è·ã¾ã§å¾…ã¤ï¼‰
-STR_880A_GO_NON_STOP_TO                                         :{STATION}ã¸ç›´è¡Œã§è¡Œã
-STR_GO_TO_NON_STOP_TRANSFER                                     :{STATION}ã¸ç›´è¡Œã§è¡Œãï¼ˆé‹æ¬ã—ã¦è²¨ç‰©ã‚’ç©ã‚€ï¼‰
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :{STATION}ã¸ç›´è¡Œã§è¡Œã(貨物をé™ã‚ã™ï¼‰
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :{STATION}ã¸ç›´è¡Œã§è¡Œãï¼ˆé‹æ¬ã—ã¦ç©ºãã®ã¾ã¾æ¬¡ã¸è¡Œã)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :{STATION}ã¸ç›´è¡Œã§è¡Œã(全負è·ï¼‰
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :{STATION}ã¸ç›´è¡Œã§è¡Œãï¼ˆé‹æ¬ã—ã¦å…¨è² è·ã¾ã§å¾…ã¤ï¼‰
 STR_GO_TO_TRAIN_DEPOT                                           :{TOWN}電車庫ã¸å›žé€
 STR_SERVICE_AT_TRAIN_DEPOT                                      :{TOWN}電車庫ã§ä¿®ç†
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :{TOWN}電車庫ã¸ç›´è¡Œã§å›žé€
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :{TOWN}電車庫ã¸ç›´è¡Œã§å›žé€ã—ã¦ä¿®ç†
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :é‹è¡Œï¼ˆæœªè¨ˆç”»ï¼‰
 STR_TIMETABLE_TRAVEL_FOR                                        :{STRING}é‹è¡Œ
 STR_TIMETABLE_STAY_FOR                                          :{STRING}åœè»Š
@@ -2709,7 +2693,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}時刻表を表示ã—ã¾ã™
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE}(指令)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - 指令終了 - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}ä¿®ç†
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}鉄é“車両ãŒè³¼å…¥ã§ãã¾ã›ã‚“...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK} 購入日付:{LTBLUE}{NUM}{BLACK} 価値:{LTBLUE}{CURRENCY}
--- a/src/lang/korean.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/korean.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1051,6 +1051,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}다른 회사ì—게 ëˆì„ 송금하는 ê²ƒì„ í—ˆìš©: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}ì´ë¯¸ 지어진 ì—­ì— ì¶”ê°€ë¡œ ì—­ì„ ì¦ì¶•하는 ê²ƒì„ í—ˆìš© : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}무거운 열차를 운행하기 위해 í™”ë¬¼ì— ë¬´ê²Œë¥¼ 가함 : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}비행기 ì†ë„ ì¸ìˆ˜: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}마ì„ì´ ì†Œìœ ì¤‘ì¸ ë„로를 통과하는 버스 정류장 건설 허용: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}정거장 ê·¼ì²˜ì— ê±´ë¬¼ 짓기 허용: {ORANGE}{STRING}
 
@@ -1068,7 +1069,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}êµì²´ë¥¼ 위한 ìžë™ êµì²´ 최소 요구 ìžê¸ˆ : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}오류 메시지 표시 : {ORANGE}{STRING}ì´ˆ ë™ì•ˆ
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}ë„시명 ì˜†ì— ì¸êµ¬ë¥¼ 표시함 : {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}나무 안보ì´ê²Œ 하기 (건물 투명하게 하면서) : {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}지형 ìƒì„±: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :오리지ë„
@@ -1301,7 +1301,7 @@
 STR_SELECT_STATION_CLASS_TIP                                    :{BLACK}표시할 ì—­ì˜ ì¢…ë¥˜ë¥¼ ì„ íƒí•©ë‹ˆë‹¤
 STR_SELECT_STATION_TYPE_TIP                                     :{BLACK}건설할 ì—­ì˜ ì¢…ë¥˜ë¥¼ ì„ íƒí•©ë‹ˆë‹¤
 
-STR_FAST_FORWARD                                                :{BLACK}게임 빨리ê°ê¸°
+STR_FAST_FORWARD                                                :{BLACK}게임 ê³ ì† ì§„í–‰
 STR_MESSAGE_HISTORY                                             :{WHITE}메시지 기ë¡
 STR_MESSAGE_HISTORY_TIP                                         :{BLACK}최근 뉴스 ë©”ì‹œì§€ì˜ ê¸°ë¡ìž…니다
 STR_MESSAGES_DISABLE_ALL                                        :{BLACK}ëª¨ë‘ ì‚¬ìš© 안함
@@ -1352,6 +1352,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}플레ì´ì–´ ì´ë¦„:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}다른 ì‚¬ëžŒì´ ë‹¹ì‹ ì„ í™•ì¸í•  ì´ë¦„입니다
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”
 STR_NETWORK_CONNECTION                                          :{BLACK}ì ‘ì†ë°©ë²•:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}ì¸í„°ë„·/ë„¤íŠ¸ì›Œí¬ ê²Œìž„ì¤‘ì— í•˜ë‚˜ë¥¼ ì„ íƒí•˜ì„¸ìš”.
 
@@ -1395,6 +1396,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}게임 제목:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}ë©€í‹°í”Œë ˆì´ ê²Œìž„ ì„ íƒ ë©”ë‰´ì—서 보여질 게임 제목입니다.
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}ë„¤íŠ¸ì›Œí¬ ê²Œìž„ì—서 사용할 ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}암호 설정
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}ìžìœ ë¡œìš´ ì ‘ê·¼ì„ ë§‰ê³  ì‹¶ì„ ë•Œ 게임 접근시 암호를 설정할 수 있습니다
 STR_NETWORK_SELECT_MAP                                          :{BLACK}ë§µ ì„ íƒ:
@@ -1451,6 +1453,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :스웨ë´ì–´
 STR_NETWORK_LANG_TURKISH                                        :터키어
 STR_NETWORK_LANG_UKRAINIAN                                      :ìš°í¬ë¼ì´ë‚˜ì–´
+STR_NETWORK_LANG_AFRIKAANS                                      :아프리카
+STR_NETWORK_LANG_CROATIAN                                       :í¬ë¡œì•„í‹°ì•„
+STR_NETWORK_LANG_CATALAN                                        :카탈로니아
+STR_NETWORK_LANG_ESTONIAN                                       :ì—스토니아
+STR_NETWORK_LANG_GALICIAN                                       :갈리시아
+STR_NETWORK_LANG_GREEK                                          :그리스
+STR_NETWORK_LANG_LATVIAN                                        :ë¼íŠ¸ë¹„ì•„
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}ë©€í‹°í”Œë ˆì´ ì¤€ë¹„
@@ -1549,6 +1558,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[ê·“ì†ë§] {STRING}ì—게: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[모ë‘] :
 STR_NETWORK_CHAT_ALL                                            :[모ë‘] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}ë„¤íŠ¸ì›Œí¬ ì±„íŒ…ì„ ìœ„í•œ í…스트를 입력하세요
 STR_NETWORK_NAME_CHANGE                                         :ë‹˜ì˜ ì´ë¦„ì´ ë°”ë€Œì—ˆìŠµë‹ˆë‹¤ :
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} 서버가 ì„¸ì…˜ì„ ì¢…ë£Œí•˜ì˜€ìŠµë‹ˆë‹¤
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} 서버 재가ë™ì¤‘...{}기다려주세요...
@@ -1612,6 +1622,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}알맞지 ì•Šì€ ì² ë¡œìž…ë‹ˆë‹¤.
 STR_1007_ALREADY_BUILT                                          :{WHITE}...ì´ë¯¸ 지어져있습니다
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}철로를 먼저 제거하십시오
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}ë„로가 ì¼ë°©í†µí–‰ì´ê±°ë‚˜ 막혔습니다
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}ì² ë„ ê±´ì„¤
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}ì „ê¸°ì² ë„ ê±´ì„¤
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}ëª¨ë…¸ë ˆì¼ ê±´ì„¤
@@ -1714,6 +1725,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}ê±´ë¬¼ì„ ë¨¼ì € 제거하십시오!
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (ë„시)
 STR_2006_POPULATION                                             :{BLACK}ì¸êµ¬: {ORANGE}{COMMA}{BLACK}  가구수: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :ë„시 ì´ë¦„ 변경
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}ë„시 ì´ë¦„ì„ ë°”ê¿€ 수 없습니다...
@@ -1950,6 +1962,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}시나리오(녹색), 프리셋 게임(파랑), 무작위 게임 ì„ íƒ
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :ì‹ ê·œ 무작위 게임 ìƒì„±
 STR_LOAD_HEIGHTMAP                                              :{WHITE}DEM지형 로드
+STR_SAVE_OSKTITLE                                               :{BLACK}ê²Œìž„ì„ ì €ìž¥í•  파ì¼ëª…ì„ ìž…ë ¥í•˜ì„¸ìš”
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}ì¤‘ê°„ì— {STRING}ì´/ê°€ 있습니다
@@ -1993,20 +2006,20 @@
 STR_4826_SUGAR_MINE                                             :설탕 광산
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}필요함: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}필요함: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}필요함: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}필요함: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}필요함: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}필요함: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}ì²˜ë¦¬ë  í™”ë¬¼ 대기:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}ìƒì‚°: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}ìƒì‚°: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}ìƒì‚°: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}ìƒì‚°: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}지난달 ìƒì‚°ëŸ‰:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% 수송ë¨)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% 수송ë¨)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}ì´ ì‚°ì—…ì‹œì„¤ì´ ìžˆëŠ” 곳으로 ì´ë™
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}새로운 {STRING}ì´/ê°€ {TOWN} ê·¼ì²˜ì— ì§€ì–´ì§€ê³  있습니다!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}새로운 {STRING}ì´/ê°€ {TOWN} 근처ì—서 ìžë¼ë‚˜ê³  있습니다!
@@ -2639,26 +2652,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}{STATION}ì— ì²˜ìŒìœ¼ë¡œ 기차가 ë„착했습니다!{}ì‚¬ëžŒë“¤ì´ í™˜í˜¸ì„±ì„ ì§€ë¦…ë‹ˆë‹¤!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (ìƒì„¸ì •ë³´)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}ì¤‘ê°„ì— ê¸°ì°¨ê°€ 있습니다
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :{STATION} í–‰
-STR_GO_TO_TRANSFER                                              :{STATION} 행 (환승시키고 화물 싣기)
-STR_8807_GO_TO_UNLOAD                                           :{STATION} í–‰ (ëª¨ë‘ ë‚´ë¦¼)
-STR_GO_TO_TRANSFER_UNLOAD                                       :{STATION} í–‰ (환승시키고 í™”ë¬¼ì„ ëª¨ë‘ ë‚´ë¦¼)
-STR_8808_GO_TO_LOAD                                             :{STATION} í–‰ (ëª¨ë‘ ì‹£ê¸°)
-STR_GO_TO_TRANSFER_LOAD                                         :{STATION} í–‰ (환승시키고 í™”ë¬¼ì„ ê°€ë“ ì‹¤ìŒ)
-STR_880A_GO_NON_STOP_TO                                         :{STATION} 급행
-STR_GO_TO_NON_STOP_TRANSFER                                     :{STATION} 급행 (환승시키고 화물 싣기)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :{STATION} 급행 (ëª¨ë‘ ë‚´ë¦¼)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :{STATION} 급행 (환승시키고 í™”ë¬¼ì„ ëª¨ë‘ ë‚´ë¦¼)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :{STATION} 급행 (ëª¨ë‘ ì‹£ê¸°)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :{STATION} 급행 (환승시키고 í™”ë¬¼ì„ ê°€ë“ ì‹¤ìŒ)
 STR_GO_TO_TRAIN_DEPOT                                           :{TOWN} 차량기지행
 STR_SERVICE_AT_TRAIN_DEPOT                                      :{TOWN} 차량기지행 (ì ê²€)
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :{TOWN} 차량기지 급행
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :{TOWN} 차량기지 급행 (ì ê²€)
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :여행 (시간표 ì—†ìŒ)
 STR_TIMETABLE_TRAVEL_FOR                                        :{STRING}로 여행
 STR_TIMETABLE_STAY_FOR                                          :그리고 {STRING}ì— ë¨¸ë¬´ë¦„
@@ -2708,9 +2706,10 @@
 STR_REFIT_ORDER                                                 :({STRING}(으)로 개조)
 STR_TIMETABLE_VIEW                                              :{BLACK}시간표
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}시간표 보기 전환
+STR_ORDER_VIEW                                                  :{BLACK}순서
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}순서 보기로 변경
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (경로)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - ê²½ë¡œì˜ ë - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}ì ê²€
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}기차를 ìƒì„±í•  수 없습니다...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   ìƒì‚°: {LTBLUE}{NUM}{BLACK} 가격: {LTBLUE}{CURRENCY}
@@ -2938,7 +2937,7 @@
 STR_9831_NAME_SHIP                                              :{WHITE}ì„ ë°• ì´ë¦„ 지정
 STR_9832_CAN_T_NAME_SHIP                                        :{WHITE}ì„ ë°•ì˜ ì´ë¦„ì„ ë°”ê¿€ 수 없습니다...
 STR_9833_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}첫 ì„ ë°•ì´ {STATION}ì— ë„착했습니다!{}ì‹œë¯¼ë“¤ì´ í™˜í˜¸í•˜ê³  있습니다!
-STR_9834_POSITION_BUOY_WHICH_CAN                                :{BLACK}웨ì´í¬ì¸íŠ¸ë¡œ 사용할 ë¶€ì´ë¥¼  which can be used as a waypoint
+STR_9834_POSITION_BUOY_WHICH_CAN                                :{BLACK}웨ì´í¬ì¸íŠ¸ë¡œ 사용할 ë¶€ì´ë¥¼ 설치합니다.
 STR_9835_CAN_T_POSITION_BUOY_HERE                               :{WHITE}ì—¬ê¸°ì— ë¶€ì´ë¥¼ 설치할 수 없습니다...
 STR_9836_RENAME                                                 :{BLACK}ì´ë¦„ 지정
 STR_9837_RENAME_SHIP_TYPE                                       :{BLACK}ì„ ë°• íƒ€ìž…ì˜ ì´ë¦„ 지정
@@ -3264,6 +3263,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}세계 창조
 STR_RANDOM_SEED                                                 :{BLACK}무작위수치:
 STR_RANDOM_SEED_HELP                                            :{BLACK}무작위수치를 입력하세요
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}ìž„ì˜ ì„¤ì •ê°’ ìž…ë ¥
 STR_LAND_GENERATOR                                              :{BLACK}지형 ìƒì„±:
 STR_TREE_PLACER                                                 :{BLACK}나무 알고리즘:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}DEM지형 방향:
@@ -3393,7 +3393,7 @@
 STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}ì´ ê·¸ë£¹ì— ì°¨ëŸ‰ì„ ì¶”ê°€í•  수 없습니다.
 STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}ì´ êµ¬ë¦…ì— ê³µìœ ëœ ì°¨ëŸ‰ì„ ì¶”ê°€í•  수 없습니다.
 
-STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}그룹 - ë•…ì„ í´ë¦­í•˜ë©´ ì´ ê·¸ë£¹ì˜ ëª¨ë“  ì°¨ëŸ‰ì„ ë‚˜ì—´
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}그룹 - í´ë¦­í•˜ì‹  ê·¸ë£¹ì— ì†í•œ ì°¨ëŸ‰ì„ ëª¨ë‘ ë‚˜ì—´í•©ë‹ˆë‹¤
 STR_GROUP_CREATE_TIP                                            :{BLACK}그룹 만들기
 STR_GROUP_DELETE_TIP                                            :{BLACK}ì„ íƒí•œ 그룹 ì‚­ì œ
 STR_GROUP_RENAME_TIP                                            :{BLACK}ì„ íƒí•œ 그룹 ì´ë¦„ 바꾸기
@@ -3411,6 +3411,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}ë‹¤ìŒ íŒ»ë§ë¡œ 가기
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}ì´ì „ 팻ë§ë¡œ 가기
+STR_SIGN_OSKTITLE                                               :{BLACK}íŒ»ë§ ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”
 
 ########
 
@@ -3483,3 +3484,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}드래그시 신호기 간격 ê°ì†Œ
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}드래그시 신호기 ì¦ê°€
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :`1234567890-=\qwertyuiop[]asdfghjkl;'  zxcvbnm,./ .
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:"  ZXCVBNM<>? .
+########
--- a/src/lang/lithuanian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/lithuanian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1084,7 +1084,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Minimali suma reikalinga automatiniam atnaujinimui: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Klaidos pranešimų rodymo trukmė: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Rodyti miestu gyventoju skaiciu salia pavadinimo: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Nematomi medziai (kai ijungti permatomi pastatai): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Sausumos kūrimas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Standartinis
@@ -1871,16 +1870,16 @@
 STR_4826_SUGAR_MINE                                             :cukraus kasykloje
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Reikalauja: {YELLOW}{STRING.ko}
-STR_4828_REQUIRES                                               :{BLACK}Reikalauja: {YELLOW}{STRING.ko}, {STRING.ko}
-STR_4829_REQUIRES                                               :{BLACK}Reikalauja: {YELLOW}{STRING.ko}, {STRING.ko}, {STRING.ko}
+STR_4827_REQUIRES                                               :{BLACK}Reikalauja: {YELLOW}{STRING.ko}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Reikalauja: {YELLOW}{STRING.ko}{STRING}, {STRING.ko}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Reikalauja: {YELLOW}{STRING.ko}{STRING}, {STRING.ko}{STRING}, {STRING.ko}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}PraÄ—jusio mÄ—nesio produkcija:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportuota)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportuota)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Rodyti gamykla ekrano centre
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Statomas naujas {STRING} netoli miesto: {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Sodinamas naujas {STRING} netoli miesto: {TOWN}!
@@ -2500,20 +2499,6 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Gyventojai džiūgauja. . .{}Pirmas traukinys atvažiavo į {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detales)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Traukinys kelyje
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Vaziuoja i {STATION}
-STR_GO_TO_TRANSFER                                              :Vykti i {STATION} (Perkelti ir pakrauti krovinius)
-STR_8807_GO_TO_UNLOAD                                           :Vykti i {STATION} (Issikrauti)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Vykti i {STATION} (Perkrauti ir palikti tuscia)
-STR_8808_GO_TO_LOAD                                             :Vykti i {STATION} (Pasikrauti)
-STR_GO_TO_TRANSFER_LOAD                                         :Vykti i {STATION} (Perkrauti ir palaukti pilno pakrovimo)
-STR_880A_GO_NON_STOP_TO                                         :Vykti be sustojimo i {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Vykti be sustojimo i {STATION} (Perkrauti ir paimti krovini)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Vykti be sustojimo i {STATION} (Issikrauti)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Vykti be sustojimo i {STATION} (Perkrauti ir palikti tuscia)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Vykti be sustojimo i {STATION} (Pasikrauti)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Vykti be sustojimo i {STATION} (Perkrauti ir palaukti pilno pakrovimo)
 STR_GO_TO_TRAIN_DEPOT                                           :Vaziuoti i {TOWN} Traukinio Depa
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Remontas {TOWN} traukiniu depe
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Važiuoti nestojant į {TOWN} traukinių depą
@@ -2563,7 +2548,6 @@
 STR_REFIT_ORDER                                                 :(Keisti į {STRING})
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Uzduotys)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Uzduociu pabaiga- -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Remontas
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Gelezinkelio transporto priemones nupirkti negalima...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Pastatyta: {LTBLUE}{NUM}{BLACK} Verte: {LTBLUE}{CURRENCY}
--- a/src/lang/norwegian_bokmal.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/norwegian_bokmal.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1066,7 +1066,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Autoforny minimum penger trengst for fornying: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Varighet til feilmelding: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Vis byers folketall i tittel: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Usynlige trær (med gjennomsiktige bygninger): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Landskapsgenerator: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Orginal
@@ -1978,20 +1977,20 @@
 STR_4826_SUGAR_MINE                                             :Sukkergruve
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Trenger: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Trenger: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Trenger: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Trenger: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Trenger: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Trenger: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Gods som venter på behandling:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produserer: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produserer: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produserer: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produserer: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produksjon forrige måned:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}{NBSP}% transportert)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}{NBSP}% transportert)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Sentrer bildet på industriområdet
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Ny {STRING} under bygging i nærheten av {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Ny {STRING} plantes i nærheten av {TOWN}!
@@ -2622,26 +2621,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Innbyggerne jubler . . .{}Første tog ankommer {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detaljer)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Tog i veien
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Kjør til {STATION}
-STR_GO_TO_TRANSFER                                              :Gå til {STATION} (overfør og ta last)
-STR_8807_GO_TO_UNLOAD                                           :GÃ¥ til {STATION} (last av)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Gå til {STATION} (overfør og forlat som tom)
-STR_8808_GO_TO_LOAD                                             :GÃ¥ til {STATION} (last)
-STR_GO_TO_TRANSFER_LOAD                                         :Gå til {STATION} (overfør og vent på full last)
-STR_880A_GO_NON_STOP_TO                                         :GÃ¥ uten stopp til {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Gå uten stopp til {STATION} (overfør og ta last)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :GÃ¥ uten stopp til {STATION} (last av)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Gå uten stopp {STATION} (overfør og forlat som tom)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :GÃ¥ uten stopp til {STATION} (last)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Gå uten stopp til {STATION} (overfør og vent på full last)
 STR_GO_TO_TRAIN_DEPOT                                           :GÃ¥ til {TOWN} togdepot
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Velikehold ved {TOWN} togstall
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Kjør uten å stoppe til {TOWN} togstall
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Vedlikehold (uten å stoppe) ved {TOWN} togstall
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Reise (uten tidstabell)
 STR_TIMETABLE_TRAVEL_FOR                                        :Reise for {STRING}
 STR_TIMETABLE_STAY_FOR                                          :og bli værende i {STRING}
@@ -2693,7 +2677,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Bytt til tidstabellvisning
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordre)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Slutt på ordre - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Vedlikehold
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Kan ikke bygge jernbanekjøretøy...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Bygget: {LTBLUE}{NUM}{BLACK} Verdi: {LTBLUE}{CURRENCY}
--- a/src/lang/norwegian_nynorsk.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/norwegian_nynorsk.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1065,7 +1065,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Minimum pengar som trengst for automatisk fornying: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Varigskap for feilmelding: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Vis innbyggjartalet til byane i tittel: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Usynlige tre (med gjennomsiktige bygningar): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Landskapsgenerator: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1977,20 +1976,20 @@
 STR_4826_SUGAR_MINE                                             :Sukkergruve
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Treng: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Treng: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Treng: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Treng: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Treng: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Treng: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Gods ventar på å bli behandla:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Lagar: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Lagar: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Lagar: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Lagar: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produksjon førre månad:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA} % transportert)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA} % transportert)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Sentrer biletet på industriområdet
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Ny {STRING} byggjast i nærleiken av {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Ny {STRING} plantast i nærleiken av {TOWN}!
@@ -2621,26 +2620,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Innbyggjarane jublar . . .{}Første tog kjem til {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detaljar)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Tog i vegen
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Køyr til {STATION}
-STR_GO_TO_TRANSFER                                              :Køyr til {STATION} (overfør og ta last)
-STR_8807_GO_TO_UNLOAD                                           :Køyr til {STATION} (last av)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Køyr til {STATION} (overfør og forlat som tom)
-STR_8808_GO_TO_LOAD                                             :Køyr til {STATION} (last)
-STR_GO_TO_TRANSFER_LOAD                                         :Køyr til {STATION} (overfør og vent på full last)
-STR_880A_GO_NON_STOP_TO                                         :Køyr utan stopp til {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Køyr utan stopp til {STATION} (overfør og ta last)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Køyr utan stopp til {STATION} (last av)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Køyr utan stopp til {STATION} (overfør og forlat som tom)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Køyr utan stopp til {STATION} (last)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Køyr utan stopp til {STATION} (overfør og vent på full last)
 STR_GO_TO_TRAIN_DEPOT                                           :Køyr til {TOWN} togstall
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Velikehald ved {TOWN} togstall
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Køyr utan stopp til togstallen i {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Vedlikehald (utan å stoppe) ved {TOWN} togstall
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Reis (ikke på rutetabell)
 STR_TIMETABLE_TRAVEL_FOR                                        :Reis i  {STRING}
 STR_TIMETABLE_STAY_FOR                                          :stå i {STRING}
@@ -2692,7 +2676,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Bytt til rutetabellvinauge
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordre)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Slutt på ordre - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Vedlikehald
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Kan ikkje byggje jernbanekøyretøy...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Bygd: {LTBLUE}{NUM}{BLACK} Verdi: {LTBLUE}{CURRENCY}
--- a/src/lang/piglatin.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/piglatin.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1057,7 +1057,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Autorenewway inimummay eedednay oneymay orfay enewray: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Urationday ofway errorway essagemay: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Owshay owntay opulationpay inway ethay owntay amenay abellay: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Invisibleway eestray (ithway ansparenttray uildingsbay): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Andlay eneratorgay: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Originalway
@@ -1967,20 +1966,20 @@
 STR_4826_SUGAR_MINE                                             :Ugarsay Inemay
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Equiresray: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Equiresray: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Equiresray: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Equiresray: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Equiresray: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Equiresray: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Argocay aitingway otay ebay ocessedpray:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Oducespray: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Oducespray: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Oducespray: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Oducespray: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Oductionpray astlay onthmay:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% ansportedtray)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% ansportedtray)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Entrecay ethay ainmay iewvay onway industryway ocationlay
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Ewnay {STRING} underway onstructioncay earnay {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Ewnay {STRING} eingbay antedplay earnay {TOWN}!
@@ -2611,26 +2610,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Itizenscay elebratecay . . .{}Irstfay aintray arrivesway atway {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Etailsday)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Aintray inway ethay ayway
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Ogay otay {STATION}
-STR_GO_TO_TRANSFER                                              :Ogay otay {STATION} (Ansfertray andway aketay argocay)
-STR_8807_GO_TO_UNLOAD                                           :Ogay otay {STATION} (Unloadway)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Ogay otay {STATION} (Ansfertray andway eavelay emptyway)
-STR_8808_GO_TO_LOAD                                             :Ogay otay {STATION} (Oadlay)
-STR_GO_TO_TRANSFER_LOAD                                         :Ogay otay {STATION} (Ansfertray andway aitway orfay ullfay oadlay)
-STR_880A_GO_NON_STOP_TO                                         :Ogay onnay-opstay otay {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Ogay onnay-opstay otay {STATION} (Ansfertray andway aketay argocay)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Ogay onnay-opstay otay {STATION} (Unloadway)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Ogay onnay-opstay otay {STATION} (Ansfertray andway eavelay emptyway)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Ogay onnay-opstay otay {STATION} (Oadlay)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Ogay onnay-opstay otay {STATION} (Ansfertray andway aitway orfay ullfay oadlay)
 STR_GO_TO_TRAIN_DEPOT                                           :Ogay otay {TOWN} Aintray Epotday
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Ervicesay atway {TOWN} Aintray Epotday
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Ogay onnay-opstay otay {TOWN} Aintray Epotday
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Ervicesay onnay-opstay atway {TOWN} Aintray Epotday
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Aveltray (otnay imetabledtay)
 STR_TIMETABLE_TRAVEL_FOR                                        :Aveltray orfay {STRING}
 STR_TIMETABLE_STAY_FOR                                          :andway aystay orfay {STRING}
@@ -2682,7 +2666,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Itchsway otay ethay imetabletay iewvay
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordersway)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Endway ofway Ordersway - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Ervicesay
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}An'tcay uildbay ailwayray ehiclevay...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Uiltbay: {LTBLUE}{NUM}{BLACK} Aluevay: {LTBLUE}{CURRENCY}
--- a/src/lang/polish.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/polish.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1151,7 +1151,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Min. ilość pieniędzy potrzebna do autoodnowienia: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Czas trwania komunikatu o błędzie: {ORANGE}{STRING} sekund{P a y ""}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Pokaż populację miasta w jego nazwie: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Niewidoczne drzewa (w trybie przezroczystych budynków): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Generator krajobrazu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Oryginalny
@@ -2099,20 +2098,20 @@
 STR_4826_SUGAR_MINE.d                                           :{G=f}kopalni cukru
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Wymaga: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Wymaga: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Wymaga: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Wymaga: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Wymaga: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Wymaga: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Åadunek oczekujÄ…cy na przetworzenie:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Wyprodukowano w ostatnim miesiÄ…cu:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% przetransportowano)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% przetransportowano)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centruj główny widok na przedsiębiorstwie
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Rozpoczęto budowę nowe{G go j go} {STRING.d} blisko {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Now{G y a e} {STRING} został{G 0 "" a o} posadzon{G 0 y a e} blisko {TOWN}!
@@ -2749,26 +2748,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Mieszkańcy świętują . . .{}Pierwszy pociąg przybył do {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Szczegóły)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}PociÄ…g na drodze
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Idź do {STATION}
-STR_GO_TO_TRANSFER                                              :Idź do {STATION} (Przewieź i weź ładunek)
-STR_8807_GO_TO_UNLOAD                                           :Idź do {STATION} (Wyładunek)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Idź do {STATION} (Przewieź i nie bierz ładunku)
-STR_8808_GO_TO_LOAD                                             :Idź do {STATION} (Załadunek)
-STR_GO_TO_TRANSFER_LOAD                                         :Idź do {STATION} (Przewieź i czekaj na pełen załadunek)
-STR_880A_GO_NON_STOP_TO                                         :Idź bez zatrzymywania do {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Idź bez zatrzymywania do {STATION} (Przewieź i weź ładunek)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Idź bez zatrzymywania do {STATION} (Wyładunek)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Idź bez zatrzymywania do {STATION} (Przewieź i nie bierz ładunku)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Idź bez zatrzymywania do {STATION} (Załadunek)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Idź bez zatrzymywania do {STATION} (Przewieź i czekaj na pełen załadunek)
 STR_GO_TO_TRAIN_DEPOT                                           :Idź do zajezdni w {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Serwisuj w zajezdni w {TOWN}
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Idź bez zatrzymywania do zajezdni w {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Idź bez zatrzymywania do serwisu w zajezdni w {TOWN}
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Przejazd (bez ustalonego czasu)
 STR_TIMETABLE_TRAVEL_FOR                                        :Przejazd przez {STRING}
 STR_TIMETABLE_STAY_FOR                                          :i zostań tam przez {STRING}
@@ -2820,7 +2804,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Otwórz widok rozkładu jazdy
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Polecenia)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Koniec poleceń - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Serwis
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Nie można wybudować lokomotywy...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Budowa: {LTBLUE}{NUM}{BLACK} Wartość: {LTBLUE}{CURRENCY}
--- a/src/lang/portuguese.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/portuguese.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1019,7 +1019,7 @@
 STR_CONFIG_PATCHES_ON                                           :Ligado
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Mostrar velocidade do veículo na barra de estado: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Permitir a construção em declives e encostas: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Permitir formação de terra em construções, linhas, etc. (auto-declive): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE                                    :{LTBLUE}Permitir formação de terra em construções (auto-declive): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Dimensionamento mais realista de áreas de abrangência: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Permitir remoção de mais estradas, pontes, etc: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Permitir a construção de comboios muito longos: {ORANGE}{STRING}
@@ -1050,6 +1050,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permitir enviar dinheiro para outras empresas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estações não uniformes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicador de peso para simular comboios pesados: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Factor de velocidade de aviões: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permitir estações de passagem em estradas das cidades: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permitir construção de estações adjacentes: {ORANGE}{STRING}
 
@@ -1067,7 +1068,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Dinheiro mínimo para fazer auto-renovação: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Duração das mensagens de erro: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Mostra população da cidade na janela da cidade: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Ãrvores invisíveis (com edifícios transparentes): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Gerador de terra: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1093,7 +1093,7 @@
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Ligar ferramentas de paisagem com as de construção: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Ao deslizar com o rato, mover a vista na direcção oposta: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Suavizar deslocamento da navegação no mapa: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Mostrar as medidas nas várias ferramentas de construção: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Mostrar medidas nas várias ferramentas de construção: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Mostrar estampagens da companhia: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Nenhum
 STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Própria companhia
@@ -1121,7 +1121,7 @@
 STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :Todas as empresas
 STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Activar plano de horários para veículos: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Mostrar horário em tics em vez dias: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Tipo padrão de ferrovia (ao criar ou carregar jogo): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Tipo padrão de ferrovia (ao criar ou carregar): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :Linha Normal
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :Linha Electrificada
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL                   :Monorail
@@ -1130,7 +1130,7 @@
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :Último disponível
 STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :Mais utilizado
 
-STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Mostrar ferramentas de construção quando não existirem veículos adequeados: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Mostrar ferram. de construção se não houver veículos adequados: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Máximo de comboios por jogador: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Máximo de veículos de estrada por jogador: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Máximo de aeronaves por jogador: {ORANGE}{STRING}
@@ -1204,6 +1204,18 @@
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Alterar valor
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Alguns ou todos os intervalo(s) de serviço predefinidos abaixo são incompatíveis com o valor escolhido! São válidos 5-90% e 30-800 dias
 
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Sistema de encontrar caminho para comboios: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Não recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Sistema de encontrar caminho para veículos: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(Não recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Sistema de encontrar caminho para barcos: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Não recomendado)
 
 STR_TEMPERATE_LANDSCAPE                                         :Terreno temperado
 STR_SUB_ARCTIC_LANDSCAPE                                        :terreno subárctico
@@ -1599,6 +1611,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Tipo de linha não apropriado
 STR_1007_ALREADY_BUILT                                          :{WHITE}...já construído
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Deverá remover a linha férrea primeiro
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Estrada de sentido único ou bloqueada
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Construir caminhos-de-ferro
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Construir caminhos-de-ferro electrificados
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Construir monocarril
@@ -1980,20 +1993,20 @@
 STR_4826_SUGAR_MINE                                             :Mina de Açúcar
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Necessário: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Necessário: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Necessário: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Necessário: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Necessário: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Necessário: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Carga aguardando processamento:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produz: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produz: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produz: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produz: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produção no último mês:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportado)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportado)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centrar visualização na localização da indústria
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nova {STRING} em construção em {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nova {STRING} está a ser plantada em {TOWN}!
@@ -2626,26 +2639,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Cidadãos celebram . . .{}Primeiro comboio chega a {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detalhes)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Comboio no caminho
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Ir para {STATION}
-STR_GO_TO_TRANSFER                                              :Ir para {STATION} (Transferir e levar carga)
-STR_8807_GO_TO_UNLOAD                                           :Ir para {STATION} (Descarregar)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Ir para {STATION} (Transferir e deixar vazio)
-STR_8808_GO_TO_LOAD                                             :Ir para {STATION} (Carregar)
-STR_GO_TO_TRANSFER_LOAD                                         :Ir para {STATION} (Transferir e aguardar carga completa)
-STR_880A_GO_NON_STOP_TO                                         :Ir sem parar para {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Ir sem parar para {STATION} (Transfer ir e levar carga)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Ir sem parar para {STATION} (Descarregar)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Ir sem parar para {STATION} (Transferir e deixar vazio)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Ir sem parar para {STATION} (Carregar)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Ir sem parar para {STATION} (Transferir e aguardar carga completa)
 STR_GO_TO_TRAIN_DEPOT                                           :Ir para o depósito de {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Manutenção no depósito de {TOWN}
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Ir sem parar para o depósito de {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Manutenção no depósito de {TOWN} sem parar
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Viagem (sem programação)
 STR_TIMETABLE_TRAVEL_FOR                                        :Viajar durante {STRING}
 STR_TIMETABLE_STAY_FOR                                          :e ficar durante {STRING}
@@ -2697,7 +2695,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Mudar para a vista de horário
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordens)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fim de Ordens - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Manutenção
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Não é possível construir veículo ferroviário...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construído: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY}
@@ -2867,7 +2864,7 @@
 STR_SERVICE_AT_ROADVEH_DEPOT                                    :Manutenção no depósito de {TOWN}
 
 STR_REFIT_ROAD_VEHICLE_TO_CARRY                                 :{BLACK}Reconverter veículo para transportar outro tipo de carga
-STR_REFIT_ROAD_VEHICLE                                          :{BLACK}Reconverter veiculo
+STR_REFIT_ROAD_VEHICLE                                          :{BLACK}Reconverter veículo
 STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED                     :{BLACK}Reconverter veículo para transportar o tipo de carga seleccionado
 STR_REFIT_ROAD_VEHICLE_CAN_T                                    :{WHITE}Não é possível reconverter veículo
 STR_ROAD_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Seleccione o tipo de carga para o veículo
@@ -3136,7 +3133,7 @@
 STR_SCHEDULED_SHIPS                                             :{WHITE}{STATION} - {COMMA} Barcos
 
 STR_SCHEDULED_TRAINS_TIP                                        :{BLACK}Mostrar todos os comboios que têm esta estação nas ordens de serviço
-STR_SCHEDULED_ROAD_VEHICLES_TIP                                 :{BLACK}Mostrar todos os veiculos de estrada que têm esta estação nas ordens de serviço
+STR_SCHEDULED_ROAD_VEHICLES_TIP                                 :{BLACK}Mostrar todos os veículos de estrada que têm esta estação nas ordens de serviço
 STR_SCHEDULED_AIRCRAFT_TIP                                      :{BLACK}Mostrar todos os aviões que têm esta estação nas ordens de serviço
 STR_SCHEDULED_SHIPS_TIP                                         :{BLACK}Mostrar todos os navios de cujo itinerário esta estação faz parte
 
@@ -3341,6 +3338,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Comutar transparência para edificações como estações, depósitos, pontos-de-passagem e catenárias
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Comutar transparência para pontes
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Comutar transparência para estruturas como faróis-terrestres e antenas (talvez, no futuro, para embelezamentos)
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Comutar transparência para catenária. CTRL+clique para fechar.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Alterar transparência para indicadores de carga
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
--- a/src/lang/romanian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/romanian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1065,7 +1065,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Fonduri minime pentru înnoire automatã: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Durata mesajelor de eroare: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Afiseaza populatia unui oras langa nume: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Ascunde arborii la alegerea optiunii 'clãdiri transparente': {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Generator teren: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1977,20 +1976,20 @@
 STR_4826_SUGAR_MINE                                             :Mină de zahăr
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Are nevoie de: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Are nevoie de: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Are nevoie de: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Are nevoie de: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Are nevoie de: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Are nevoie de: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Incarcatura in asteaptarea procesarii:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Producţia lunii trecute:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportat)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportat)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centrează imaginea pe locaţia industriei
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Un nou obiectiv industrial ({STRING}) se construieşte lângă {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}O nouă {STRING} se plantează lângă {TOWN}!
@@ -2621,26 +2620,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Cetăţenii sărbătoresc {}sosirea primului tren la {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detalii)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Tren în drum
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Mergi la {STATION}
-STR_GO_TO_TRANSFER                                              :Mergi la {STATION} (Preia încărcătura pentru transfer)
-STR_8807_GO_TO_UNLOAD                                           :Mergi la {STATION} (Descarcă)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Mergi la {STATION} (Descarcă încărcătura pentru transfer)
-STR_8808_GO_TO_LOAD                                             :Mergi la {STATION} (Încarcă)
-STR_GO_TO_TRANSFER_LOAD                                         :Mergi la {STATION} (Aşteaptă 100% încărcătură pentru transfer)
-STR_880A_GO_NON_STOP_TO                                         :Mergi fără oprire la {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Mergi fără oprire la {STATION} (Preia încărcătura pentru transfer)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Mergi fără oprire la {STATION} (Descarcă)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Mergi fără oprire la {STATION} (Descarcă încărcătura pentru transfer)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Mergi fără oprire la {STATION} (Încarcă)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Mergi fără oprire la {STATION} (Aşteaptă 100% încărcătură pentru transfer)
 STR_GO_TO_TRAIN_DEPOT                                           :Mergi la depoul {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Service la Depoul {TOWN}
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Mergi fără oprire la Depoul {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Non-stop pt. service la Depoul {TOWN}
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Calatorie (fara orar)
 STR_TIMETABLE_TRAVEL_FOR                                        :Calatorii pentru {STRING}
 STR_TIMETABLE_STAY_FOR                                          :si opriri pentru {STRING}
@@ -2692,7 +2676,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Comuta in modul de vizualizare orar
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Comenzi)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Sfârşitul comenzilor - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Service
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Nu pot construi vehiculul...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Cumpărat: {LTBLUE}{NUM}{BLACK} Valoare: {LTBLUE}{CURRENCY}
--- a/src/lang/russian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/russian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1052,6 +1052,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Разрешить передачу денег другим компаниÑм: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Станции могут быть произвольной формы: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Множитель ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²ÐµÑа груза Ð´Ð»Ñ Ñ‚Ð¾Ð²Ð°Ñ€Ð½Ñ‹Ñ… поездов: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}КоÑффициент ÑкороÑти авиатранÑпорта: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}ПозволÑть Ñтроить оÑтановки на городÑких дорогах: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Разрешить ÑтроительÑтво Ñмежных Ñтанций: {ORANGE}{STRING}
 
@@ -1069,7 +1070,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Сумма, Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð·Ð°Ð¼ÐµÐ½Ñ‹: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}МакÑ. длительноÑть Ñообщений об ошибке (Ñек.): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Показывать количеÑтво жителей города поÑле названиÑ: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Убирать Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ð¿Ñ€Ð¸ включении прозрачноÑти зданий: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Генератор земли: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Оригинальный
@@ -1206,6 +1206,19 @@
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Изменить значение
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Ðекоторые интервалы не ÑовмеÑтимы Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ уÑтановкой. ДопуÑкаютÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ 5-90% или 30-800 дней
 
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Ðлгоритм поиÑка пути Ð´Ð»Ñ Ð¿Ð¾ÐµÐ·Ð´Ð¾Ð²: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Ðе рекоменд.)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Рекоменд.)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Ðлгоритм поиÑка пути Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ‚Ñ€Ð°Ð½Ñпорта: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Оригин. {RED}(Ðе рекоменд.)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Рекоменд.)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Ðлгоритм поиÑка путей Ð´Ð»Ñ ÐºÐ¾Ñ€Ð°Ð±Ð»ÐµÐ¹: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Оригин. {BLUE}(Рекоменд.)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Ðе рекоменд.)
+
 STR_TEMPERATE_LANDSCAPE                                         :Умеренный ландшафт
 STR_SUB_ARCTIC_LANDSCAPE                                        :СубарктичеÑкий ландшафт
 STR_SUB_TROPICAL_LANDSCAPE                                      :СубтропичеÑкий ландшафт
@@ -1439,6 +1452,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :ШведÑкий
 STR_NETWORK_LANG_TURKISH                                        :Турецкий
 STR_NETWORK_LANG_UKRAINIAN                                      :УкраинÑкий
+STR_NETWORK_LANG_AFRIKAANS                                      :ÐфриканÑкий
+STR_NETWORK_LANG_CROATIAN                                       :ХорватÑкий
+STR_NETWORK_LANG_CATALAN                                        :КаталанÑкий
+STR_NETWORK_LANG_ESTONIAN                                       :ЭÑтонÑкий
+STR_NETWORK_LANG_GALICIAN                                       :ГалицийÑкий
+STR_NETWORK_LANG_GREEK                                          :ГречеÑкий
+STR_NETWORK_LANG_LATVIAN                                        :ЛатвийÑкий
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}СоÑтоÑние Ñетевой игры
@@ -1600,6 +1620,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Ðет подходÑщих рельÑов
 STR_1007_ALREADY_BUILT                                          :{WHITE}...уже поÑтроено
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Сначала надо удалить рельÑÑ‹
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Дорога одноÑтороннÑÑ Ð¸Ð»Ð¸ блокирована
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Железные дороги
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Электрифицированные ж/д
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}МонорельÑ
@@ -1702,6 +1723,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Сначала надо уничтожить зданиÑ
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Город)
 STR_2006_POPULATION                                             :{BLACK}ÐаÑеление: {ORANGE}{COMMA}{BLACK}  Зданий: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Переименовать город
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Ðе могу переименовать город...
@@ -1981,20 +2003,20 @@
 STR_4826_SUGAR_MINE                                             :Ð¡Ð°Ñ…Ð°Ñ€Ð½Ð°Ñ ÑˆÐ°Ñ…Ñ‚Ð°
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}ТребуетÑÑ: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}ТребуетÑÑ: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}ТребуетÑÑ: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}ТребуетÑÑ: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}ТребуетÑÑ: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}ТребуетÑÑ: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Груз, ожидающий переработки:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Произведено: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Произведено: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Произведено: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Произведено: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Произведено за прошлый меÑÑц:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% перевезено)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% перевезено)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Показать предприÑтие в оÑновном окне
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Ðовое предприÑтие! {STRING} ÑтроитÑÑ Ð²Ð¾Ð·Ð»Ðµ г. {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Ðовое предприÑтие! {STRING} заложен возле г. {TOWN}!
@@ -2638,26 +2660,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жители празднуют!{}Первый поезд прибыл на Ñтанцию {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Детали)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Поезд мешает
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Ехать к ÑÑ‚. {STATION}
-STR_GO_TO_TRANSFER                                              :Ехать к ÑÑ‚. {STATION} (ТранÑфер)
-STR_8807_GO_TO_UNLOAD                                           :Ехать к ÑÑ‚. {STATION} (Ðе грузитьÑÑ)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Ехать к ÑÑ‚. {STATION} (ТранÑфер и не грузитьÑÑ)
-STR_8808_GO_TO_LOAD                                             :Ехать к ÑÑ‚. {STATION} (ÐŸÐ¾Ð»Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°)
-STR_GO_TO_TRANSFER_LOAD                                         :Ехать к ÑÑ‚. {STATION} (ТранÑфер и Ð¿Ð¾Ð»Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°)
-STR_880A_GO_NON_STOP_TO                                         :Ехать к ÑÑ‚. {STATION} без оÑтановки
-STR_GO_TO_NON_STOP_TRANSFER                                     :Ехать к ÑÑ‚. {STATION} без оÑтановки (ТранÑфер)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Ехать к ÑÑ‚. {STATION} без оÑтановки (Ðе грузитьÑÑ)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Ехать к ÑÑ‚. {STATION} без оÑтановки (ТранÑфер и не грузитьÑÑ)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Ехать к ÑÑ‚. {STATION} без оÑтановки (ÐŸÐ¾Ð»Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Ехать к ÑÑ‚. {STATION} без оÑтановки (ТранÑфер и Ð¿Ð¾Ð»Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°)
 STR_GO_TO_TRAIN_DEPOT                                           :Ехать в депо {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :ОбÑлужитьÑÑ Ð² депо {TOWN}
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Ехать в депо {TOWN} без оÑтановки
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :ОбÑлужитьÑÑ Ð² депо {TOWN} без оÑтановки
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :ПутешеÑтвует (не учитываетÑÑ)
 STR_TIMETABLE_TRAVEL_FOR                                        :Идти до {STRING}
 STR_TIMETABLE_STAY_FOR                                          :и ждать {STRING}
@@ -2709,7 +2716,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}ПроÑмотр раÑпиÑаниÑ
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (ЗаданиÑ)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Конец заданий - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}ОбÑлуж.
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Ðевозможно поÑтроить ж/д транÑпорт...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   ПоÑтроен: {LTBLUE}{NUM}{BLACK} СтоимоÑть: {LTBLUE}{CURRENCY}
@@ -3353,6 +3359,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Переключить прозрачноÑть зданий, которые можно Ñтроить игроком. Ðапример -- Ñтанции, депо, точки пути и Ñтолбы Ð´Ð»Ñ ÑлектричеÑтва.
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Переключить прозрачноÑть моÑтов
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Переключить прозрачноÑть зданий, вроде антенн и маÑков.
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Переключить прозрачноÑть контактной Ñети. Ctrl-щелчок - запрет изменений.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Переключить прозрачноÑть Ð´Ð»Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð¾Ð² загрузки
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
--- a/src/lang/simplified_chinese.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/simplified_chinese.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1052,7 +1052,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}å¯åŠ¨è‡ªåŠ¨æ›´æ–°éœ€è¦çš„æœ€å°‘现金:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}é”™è¯¯ä¿¡æ¯æ˜¾ç¤ºæ—¶é—´ï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}在城镇åç§°çš„æ ‡ç­¾ä¸­åŒæ—¶æ˜¾ç¤ºäººå£ï¼š{ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}åœ¨å»ºç­‘ç‰©é€æ˜Žæ¨¡å¼ä¸­éšè—树木:{ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}生æˆåœ°å½¢ï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :原始
@@ -1854,13 +1853,13 @@
 STR_4826_SUGAR_MINE                                             :蔗糖矿
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}上月产é‡ï¼š
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% å·²è¿è¾“)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% å·²è¿è¾“)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}å°†å±å¹•中心移动到工厂所在的ä½ç½®
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}æ–° {STRING} 正在 {TOWN} 加紧建设ï¼
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}æ–° {STRING} å³å°†è½æˆ· {TOWN}ï¼
@@ -2480,26 +2479,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}市民举行庆ç¥ä»ªå¼â€¦â€¦{}第一列ç«è½¦æŠµè¾¾ {STATION}ï¼
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (详细信æ¯)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}指定ä½ç½®æœ‰åˆ—车
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :å‰å¾€ {STATION}
-STR_GO_TO_TRANSFER                                              :å‰å¾€ {STATION} (转è¿å¹¶è£…è´§)
-STR_8807_GO_TO_UNLOAD                                           :å‰å¾€ {STATION} (全部å¸è´§)
-STR_GO_TO_TRANSFER_UNLOAD                                       :å‰å¾€ {STATION} (转è¿ä¸”ä¸è£…è´§)
-STR_8808_GO_TO_LOAD                                             :å‰å¾€ {STATION} (等待装满)
-STR_GO_TO_TRANSFER_LOAD                                         :å‰å¾€ {STATION} (转è¿å¹¶ç­‰å¾…装满)
-STR_880A_GO_NON_STOP_TO                                         :å‰å¾€(ä¸åœ) {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :å‰å¾€(ä¸åœ) {STATION} (转è¿å¹¶è£…è´§)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :å‰å¾€(ä¸åœ) {STATION} (全部å¸è´§)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :å‰å¾€(ä¸åœ) {STATION} (转è¿ä¸”ä¸è£…è´§)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :å‰å¾€(ä¸åœ) {STATION} (等待装满)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :å‰å¾€(ä¸åœ) {STATION} (转è¿å¹¶ç­‰å¾…装满)
 STR_GO_TO_TRAIN_DEPOT                                           :å‰å¾€ {TOWN} 车库
 STR_SERVICE_AT_TRAIN_DEPOT                                      :在 {TOWN} 车库ä¿å…»
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :å‰å¾€(ä¸åœ) {TOWN} 车库
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :在 {TOWN} 车库ä¿å…»(ä¸åœ)
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :旅行 (无时间表)
 STR_TIMETABLE_TRAVEL_FOR                                        :å‰å¾€ {STRING} 旅行
 STR_TIMETABLE_STAY_FOR                                          :并且在 {STRING} åœç•™
@@ -2551,7 +2535,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}切æ¢åˆ°æ—¶é—´è¡¨è§†å›¾
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (调度计划)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}-- è°ƒåº¦è®¡åˆ’ç»“æŸ --
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}ä¿å…»
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}ä¸èƒ½è´­ä¹°åˆ—车……
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   建造时间:{LTBLUE}{NUM}{BLACK} 价值:{LTBLUE}{CURRENCY}
--- a/src/lang/slovak.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/slovak.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1114,6 +1114,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Umožnit posielanie penazí ostatným spolocnostiam: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Roznorode stanice: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Váhový násobok pre nákladné vlaky: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Faktor rýchlosti lietadiel: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Povolit prejazdné zastávky na mestských cestách: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Povolit stavbu oddelených staníc: {ORANGE}{STRING}
 
@@ -1131,7 +1132,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Min. mnozstvo penazi pre aut. obnovovanie vozidiel: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Dlžka zobrazenia chybovej správy: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Zobrazit pocet obyvatelov mesta v jeho nazve: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Neviditelne stromy (pri priesvitnych budovach): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Generátor uzemia: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Povodny
@@ -1415,6 +1415,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Meno hraca:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Toto je meno podla ktoreho vas ostatny identifikuju
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Zadajte vaše meno
 STR_NETWORK_CONNECTION                                          :{BLACK}Pripojenie:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Vyber si medzi hrou na internete alebo na lokalnej sieti
 
@@ -1458,6 +1459,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Nazov hry:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Nazov hry, ktory uvidia ostatni v zozname sietovych hier
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Zadajte názov sietovej hry
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Nastavit heslo
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Ochran hru heslom, ak nechcec aby sa pripajali ostatni ludia
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Vyber mapu:
@@ -1514,6 +1516,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :Svédsky
 STR_NETWORK_LANG_TURKISH                                        :Turecky
 STR_NETWORK_LANG_UKRAINIAN                                      :Ukrajinsky
+STR_NETWORK_LANG_AFRIKAANS                                      :Africky
+STR_NETWORK_LANG_CROATIAN                                       :Chorvátsky
+STR_NETWORK_LANG_CATALAN                                        :Katalánsky
+STR_NETWORK_LANG_ESTONIAN                                       :Estónsky
+STR_NETWORK_LANG_GALICIAN                                       :Gálsky
+STR_NETWORK_LANG_GREEK                                          :Grécky
+STR_NETWORK_LANG_LATVIAN                                        :Litovsky
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Sietova hra - lobby
@@ -1612,6 +1621,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Privatny] pre {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[Všetkým] :
 STR_NETWORK_CHAT_ALL                                            :[Všetkým] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Zadajte text pre sietový chat
 STR_NETWORK_NAME_CHANGE                                         :si zmenil meno na
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Server ukoncil relaciu
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Server sa restartuje ...{}Cakajte prosim ...
@@ -1675,6 +1685,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Ziadne pouzitelne zeleznicne kolaje
 STR_1007_ALREADY_BUILT                                          :{WHITE}... uz bolo vytvorene
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Najskor treba odstranit zeleznicne kolaje
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Cesta je jednosmerná alebo blokovaná.
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Zeleznica
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Elektrifikovana železnica
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Jednokolajka - Monorail
@@ -1777,6 +1788,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Budova sa musi zburat
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Mesto)
 STR_2006_POPULATION                                             :{BLACK}Obyvatelstvo: {ORANGE}{COMMA}{BLACK}  Domov: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Premenovat mesto
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Mesto nemoze byt odstranene ...
@@ -2013,6 +2025,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Vyber scenar (zeleny), prednastavenu hra (modra), alebo nahodnu hru
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Vygenerovat nahodnu novu hru
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Nahrat výškovú mapu
+STR_SAVE_OSKTITLE                                               :{BLACK}Zadajte názov pre uloženie hry
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} v ceste
@@ -2056,20 +2069,20 @@
 STR_4826_SUGAR_MINE                                             :Cukrova bana
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Náklad cakajúci na spracovanie:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produkcia za posledny mesiac:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% prepravenych)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% prepravenych)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Vycentrovanie pohladu na poziciu tovarne
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}{STRING} sa zacina stavat nedaleko mesta {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}{STRING} sa vysadza nedaleko mesta {TOWN}!
@@ -2702,26 +2715,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Mesto oslavuje . . .{}Prvy vlak dorazil do stanice {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detaily)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Vlak v ceste
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Chod do {STATION}
-STR_GO_TO_TRANSFER                                              :Chod do {STATION} (prelozit a nalozit iny naklad)
-STR_8807_GO_TO_UNLOAD                                           :Chod do {STATION} (vylozit)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Chod do {STATION} (prelozit a nechat prazdne)
-STR_8808_GO_TO_LOAD                                             :Chod do {STATION} (nalozit)
-STR_GO_TO_TRANSFER_LOAD                                         :Chod do {STATION} (prelozit a plne nalozit)
-STR_880A_GO_NON_STOP_TO                                         :Chod bez zastavenia do {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Chod bez zastavenia do {STATION} (prelozit a nalozit iny naklad)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Chod bez zastavenia do {STATION} (vylozit)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Chod bez zastavenia do {STATION} (prelozit a nechat prazdne)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Chod bez zastavenia do {STATION} (nalozit)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Chod bez zastavenia do {STATION} (prelozit a plne nalozit)
 STR_GO_TO_TRAIN_DEPOT                                           :Chod do depa {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Opravit v {TOWN} Vlakovom Depe
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Chod bez zastavenia do depa {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Opravovat bez zastavenia v depe {TOWN}
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Cesta (neurcený cas)
 STR_TIMETABLE_TRAVEL_FOR                                        :Cesta do {STRING}
 STR_TIMETABLE_STAY_FOR                                          :prestávka {STRING}
@@ -2771,9 +2769,10 @@
 STR_REFIT_ORDER                                                 :(Prestavba na {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}CP
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Prepnút na zobrazenie cestovného poriadku
+STR_ORDER_VIEW                                                  :{BLACK}Príkazy
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}Prepnút na zobrazenie príkazov
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Prikazy)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Koniec prikazov - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Oprava
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Nemozno kupit vlak...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Vyrobene: {LTBLUE}{NUM}{BLACK} Hodnota: {LTBLUE}{CURRENCY}
@@ -3327,6 +3326,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Vytvorenie krajiny
 STR_RANDOM_SEED                                                 :{BLACK}Náhodný kód:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Kliknite pre zadanie nahodneho kodu
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Zadajte náhodný kód
 STR_LAND_GENERATOR                                              :{BLACK}Generátor krajiny:
 STR_TREE_PLACER                                                 :{BLACK}Generátor stromov:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Orientacia vyskovej mapy:
@@ -3474,6 +3474,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Prejst na dalsiu znacku
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Prejst na predchádzajúcu znacku
+STR_SIGN_OSKTITLE                                               :{BLACK}Zadajte názov pre popis
 
 ########
 
@@ -3546,3 +3547,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Znižit hustotu signálov
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Zvýšit hustotu signálov
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :`1234567890-=\qwertyuiop[]asdfghjkl;'  zxcvbnm,./ .
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:"  ZXCVBNM<>? .
+########
--- a/src/lang/slovenian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/slovenian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1092,6 +1092,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Dovoli pošiljanje denarja drugim podjetjem: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Neenake postaje: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Koeficient teže tovora za simulacijo težkih vlakov: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Faktor hitrosti letal: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Dovoli prehodne postaje na cestah v lasti mest: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Dovoli gradnjo združljivih postaj: {ORANGE}{STRING}
 
@@ -1109,7 +1110,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Samoobnovi najmanj potrebnega denarja za obnovo: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Trajanje sporoÄila o napaki: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Prikaz števila prebivalcev ob imenu mesta: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Prozorna drevesa (ob prozornih zgradbah): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Urejevalnik terena: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1214,6 +1214,7 @@
 STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :boljše ceste
 STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 mreža
 STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 mreža
+STR_CONFIG_PATCHES_TOWN_LAYOUT_RANDOM                           :nakljuÄno
 
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Pozicija glavne orodne vrstice: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Levo
@@ -1246,6 +1247,18 @@
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Spremeni vrednost
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Nekatera ali vsa privzeta obdobja servisiranja spodaj niso združljiva z izborom! 5-90% in 30-800 dni je veljavno
 
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Iskalnik poti za vlake: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Ni priporoÄeno)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(PriporoÄeno)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Iskalnik poti za vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(Ni priporoÄeno)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(PriporoÄeno)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Logaritem poti za ladje: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(PriporoÄen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Ni priporoÄen)
 
 STR_TEMPERATE_LANDSCAPE                                         :Zmerno podnebje
 STR_SUB_ARCTIC_LANDSCAPE                                        :Sub arktiÄno podnebje
@@ -1381,6 +1394,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Ime igralca:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}To je ime, po katerem te prepoznajo drugi igralci
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Vpiši tvoje ime
 STR_NETWORK_CONNECTION                                          :{BLACK}Povezava:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Izberi med internetom ali lokalno mrezo (LAN)
 
@@ -1424,6 +1438,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Ime igre:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Ime bo prikazano drugim igralcem na veÄigralskem seznamu
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Vpiši ime za mrežno igro
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Nastavi geslo
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}ZaÅ¡Äiti igro z geslom, Äe želiÅ¡ prepreÄiti dostop nepovabljenim
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Izberi ozemlje:
@@ -1480,6 +1495,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :Å vedski
 STR_NETWORK_LANG_TURKISH                                        :Turški
 STR_NETWORK_LANG_UKRAINIAN                                      :Ukrajinski
+STR_NETWORK_LANG_AFRIKAANS                                      :Afriški
+STR_NETWORK_LANG_CROATIAN                                       :Hrvaški
+STR_NETWORK_LANG_CATALAN                                        :Katalonski
+STR_NETWORK_LANG_ESTONIAN                                       :Estonski
+STR_NETWORK_LANG_GALICIAN                                       :Galijski
+STR_NETWORK_LANG_GREEK                                          :Grški
+STR_NETWORK_LANG_LATVIAN                                        :Latvijski
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Seje veÄigralskih iger
@@ -1578,6 +1600,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Privatno] Za {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[Vsi] :
 STR_NETWORK_CHAT_ALL                                            :[Vsi] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Vpiši tekst za mrežni pogovor
 STR_NETWORK_NAME_CHANGE                                         :je spremenil/a svoje ime v
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Strežnik je zaprl sejo
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Strežnik se zaganja...{}Prosim poÄakaj...
@@ -1641,6 +1664,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Ni primernih traÄnic
 STR_1007_ALREADY_BUILT                                          :{WHITE} ... že zgrajeno
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Najprej odstrani traÄnice
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Cesta je enosmerna ali blokirana
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Gradnja železnice
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Elektrificirana Železnica
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Gradnja enotirne železnice
@@ -1743,6 +1767,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Najprej mora biti stavba porušena
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Mesto)
 STR_2006_POPULATION                                             :{BLACK}Prebivalstvo: {ORANGE}{COMMA}{BLACK}  Å tevilo stavb: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Preimenuj mesto
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Ne moreš preimenovati mesta ...
@@ -1980,6 +2005,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Izberi scenarij (zeleno), prednastavljeno igro (modro) ali nakljuÄno novo igro
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Ustvari nakljuÄno novo igro
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Naloži višinsko karto
+STR_SAVE_OSKTITLE                                               :{BLACK}Vpiši ime za shranjeno igro
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} na poti
@@ -2060,20 +2086,20 @@
 STR_4826_SUGAR_MINE.r                                           :Rudnika sladkorja
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Tovor na Äakanju obdelave:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Proizvaja: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Proizvaja: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Proizvaja: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Proizvaja: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Proizvodnja prejšnjega meseca:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% prepeljano)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% prepeljano)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Pogled na industrijo
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Na novo se gradi {STRING} blizu mesta {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Postavlja se {STRING} blizu mesta {TOWN}!
@@ -2706,26 +2732,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Prebivalci praznujejo . . .{}Prvi vlak je slovesno pripeljal{}na postajo {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Podrobnosti)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Vlak v napoto
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING}{STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING}{STRING}
-STR_8806_GO_TO                                                  :Pojdi do {STATION}
-STR_GO_TO_TRANSFER                                              :Pojdi do {STATION} (Pretovori in vzemi tovor)
-STR_8807_GO_TO_UNLOAD                                           :Pojdi do {STATION} (Raztovori)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Pojdi do {STATION} (Pretovori in pusti prazno)
-STR_8808_GO_TO_LOAD                                             :Pojdi do  {STATION} (Naloži)
-STR_GO_TO_TRANSFER_LOAD                                         :Pojdi do {STATION} (Prenesi in poÄakaj na polno breme)
-STR_880A_GO_NON_STOP_TO                                         :Pojdi brez postanka do {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Pojdi brez postanka do {STATION} (Prenesi in vzemi tovor)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Pojdi brez postanka do {STATION} (Raztovori)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Pojdi brez postanka do {STATION} (Pretovori in pusti prazno)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Pojdi brez postanka do {STATION} (Naloži)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Pojdi brez postanka do {STATION} (Prenesi in poÄakaj na polno breme)
 STR_GO_TO_TRAIN_DEPOT                                           :Pojdi v {TOWN} železniško garažo
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Na servis v {TOWN} železniško garažo
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Pojdi brez postanka do garaže {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Non stop na servis v {TOWN} železniško garažo
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Potovanje (brez Äasovnih tabel)
 STR_TIMETABLE_TRAVEL_FOR                                        :Potuj za {STRING}
 STR_TIMETABLE_STAY_FOR                                          :in ostani za {STRING}
@@ -2775,9 +2786,10 @@
 STR_REFIT_ORDER                                                 :(Predelaj za {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}ÄŒasovna tabela
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Preklop na pogled Äasovnih tabel
+STR_ORDER_VIEW                                                  :{BLACK}Ukazi
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}Preklop na pogled ukazov
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ukazi)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Konec ukazov - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Servis
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Ni mogoÄe kupiti vozila ...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Zgrajeno: {LTBLUE}{NUM}{BLACK} Vrednost: {LTBLUE}{CURRENCY}
@@ -3331,6 +3343,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Ustvarjanje sveta
 STR_RANDOM_SEED                                                 :{BLACK}NakljuÄno seme:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Klikni za vnos nakljuÄnega semena
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}VpiÅ¡i nakljuÄno seme
 STR_LAND_GENERATOR                                              :{BLACK}Ustvarjalec terena:
 STR_TREE_PLACER                                                 :{BLACK}Algoritem dreves:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Zasuk višinskega zemljevida:
@@ -3421,6 +3434,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Prozoren ali navaden pogled ostalih objektov kot so postaje, garaže...
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Prozoren ali navaden pogled mostov
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Prozoren ali navaden pogled struktur kot so antene, svetilniki...
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Preklop prosojnosti za pogone. CTRL+klik za zaklepanje.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Preklop na prosojnost za prikaz polnenja
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
@@ -3477,6 +3491,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Pojdi na naslednjo oznako
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Pojdi na  predhodno oznako
+STR_SIGN_OSKTITLE                                               :{BLACK}Vpiši ime za znak
 
 ########
 
@@ -3549,3 +3564,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}ZmanjÅ¡aj gostoto signala za vleÄenje
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}PoveÄaj gostoto signala za vleÄenjeIncrease dragging signal density
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :`1234567890-=\qwertyuiop[]asdfghjkl;'  zxcvbnm,./ .
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:"  ZXCVBNM<>? .
+########
--- a/src/lang/spanish.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/spanish.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1051,6 +1051,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Permitir enviar dinero a otras empresas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estaciones no uniformes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Carga el multiplicador de peso para simular trenes pesados: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Factor velocidad avión: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permite conducir en paradas sobre carreteras de ciudades: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permitir construcción en estaciones contiguas : {ORANGE}{STRING}
 
@@ -1068,7 +1069,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Renovar auto. usando la menor cantidad de dinero: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Duración del mensaje de error: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Muestra la población de esta población en esta etiqueta: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Ãrboles invisibles (con edificios transparentes): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Generador terreno: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1150,7 +1150,7 @@
 STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}Intervalo de despacho por defecto para veh. de carretera: {ORANGE}{STRING} días
 STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}Intervalo de despacho por defecto para veh. de carretera: {ORANGE}no
 STR_CONFIG_PATCHES_SERVINT_AIRCRAFT                             :{LTBLUE}Intervalo de despacho por defecto para aeroplanos: {ORANGE}{STRING} días
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}Intervalo de despacho por defecto para aviones: {ORANGE}no
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}Intervalo de despacho por defecto para aeronaves: {ORANGE}no
 STR_CONFIG_PATCHES_SERVINT_SHIPS                                :{LTBLUE}Intervalo de despacho por defecto para barcos: {ORANGE}{STRING} días
 STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED                       :{LTBLUE}Intervalo de despacho por defecto para barcos: {ORANGE}no
 STR_CONFIG_PATCHES_NOSERVICE                                    :{LTBLUE}Desactivar servicio cuando las averías están desactivadas: {ORANGE}{STRING}
@@ -1612,6 +1612,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Tramo de vía no apropiado
 STR_1007_ALREADY_BUILT                                          :{WHITE}...ya construído
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Se debe retirar primero tramo de vía
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Carretera de un solo sentido o bloqueada
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Construcción de ferrocarril
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Construcciòn Línea Eléctrica de Ferrocarril
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Construcción de monorraíl
@@ -1993,20 +1994,20 @@
 STR_4826_SUGAR_MINE                                             :Mina de Azúcar
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Requiere: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Requiere: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Requiere: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Requiere: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Requiere: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Requiere: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}La carga está esperando a ser procesada:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Producción mes anterior:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportado)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportado)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centrar la vista sobre la industria
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nuevo {STRING} bajo construcción cerca de {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nuevo {STRING} está siendo plantado cerca de {TOWN}!
@@ -2639,26 +2640,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Los ciudadanos celebran . . .{}¡Primer tren llega a {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detalles)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Tren en camino
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING}{STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING}{STRING}
-STR_8806_GO_TO                                                  :Ir a {STATION}
-STR_GO_TO_TRANSFER                                              :Ir a {STATION} (Transferir y cargar)
-STR_8807_GO_TO_UNLOAD                                           :Ir a {STATION} (Descargar)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Ir a {STATION} (Transferir y dejar vacío)
-STR_8808_GO_TO_LOAD                                             :Ir a {STATION} (Cargar)
-STR_GO_TO_TRANSFER_LOAD                                         :Ir a {STATION} (Transferir y esperar a carga completa)
-STR_880A_GO_NON_STOP_TO                                         :Ir sin paradas a {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Ir sin paradas a {STATION} (Transferir y cargar)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Ir sin paradas a {STATION} (Descargar)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Ir sin paradas a {STATION} (Transferir y dejar vacío)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Ir sin paradas a  {STATION} (Cargar)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Ir sin paradas a {STATION} (Transferir y esperar a carga completa)
 STR_GO_TO_TRAIN_DEPOT                                           :Ir al depósito del tren de {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Ir al depósito de {TOWN} para mantenimiento
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Ir sin parar al depósito de {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Ir sin parar al depósito de {TOWN} para mantenimiento
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Viaje (sin horarios)
 STR_TIMETABLE_TRAVEL_FOR                                        :Viaje para {STRING}
 STR_TIMETABLE_STAY_FOR                                          :y estancia en {STRING}
@@ -2710,7 +2696,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Cambiar a la vista de horarios
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Órdenes)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fin de pedidos - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Servicio
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}No se puede construir vehículo...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Construido: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY}
@@ -2964,7 +2949,7 @@
 STR_CLONE_AIRCRAFT                                              :{BLACK}Clonar aeronave
 STR_CLONE_AIRCRAFT_INFO                                         :{BLACK}Esto copiará la aeronave. Control-click compartirá las ordenes
 STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW                           :{BLACK}Esto construirá una copia de la aeronave. Pulsa este botón y después la aeronave dentro o fuera del hangar. Control-click compartirá las ordenes
-STR_A005_NEW_AIRCRAFT                                           :{WHITE}Nuevo avilón
+STR_A005_NEW_AIRCRAFT                                           :{WHITE}Nueva Aeronave
 STR_A006_BUILD_AIRCRAFT                                         :{BLACK}Construir aeronave
 STR_A008_CAN_T_BUILD_AIRCRAFT                                   :{WHITE}No se puede construir aeronave...
 STR_A009_AIRCRAFT                                               :{WHITE}{COMPANY} - {COMMA} Aeronave
--- a/src/lang/swedish.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/swedish.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1050,6 +1050,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Tillåt skicka pengar till andra företag: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Icke-rektangulära stationer: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Godsfaktor för att simulera tunga tåg: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Hastighetsfaktor för flygplan: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Tillåt genomfarts-stop på stadsägda vägar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Tillåt byggande av närliggande stationer: {ORANGE}{STRING}
 
@@ -1067,7 +1068,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Minst mängd pengar för auto-förnyelse av fordon: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Hur länge felmeddelanden visas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Visa befolkningsmängd i stadsnamnet: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Osynliga träd (när genomskinliga byggnader är valt): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Land generator: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Original
@@ -1204,6 +1204,18 @@
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Ändra inställningsvärde
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Några eller alla av standard serviceintervalls-inställningarna är felaktiga! (5-90% och 30-800 dagar är giltiga inställningar)
 
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Vägfinnare för tåg: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Ej rekommenderad)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Rekommenderad)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Vägfinnare för vägfordon: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(Ej rekommenderad)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Rekommenderad)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Vägfinnare för skepp: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Rekommenderad)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Ej rekommenderad)
 
 STR_TEMPERATE_LANDSCAPE                                         :Tempererat landskap
 STR_SUB_ARCTIC_LANDSCAPE                                        :Sub-arktiskt landskap
@@ -1339,6 +1351,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Spelarnamn:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Namnet som andra spelare kommer se dej som
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Mata in ditt namn
 STR_NETWORK_CONNECTION                                          :{BLACK}Anslutning:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Välj mellan att spela över internet eller det lokala nätverket
 
@@ -1382,6 +1395,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Namn:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Namnet på nätverksspelet kommer att synas för andra spelare i multiplayer menyn
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Mata in ett namn för nätverksspelet
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Bestäm lösenord
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Skydda spelet med ett lösenord så att inte andra än dom som har lösenordet kan gå med i spelet
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Välj karta:
@@ -1438,6 +1452,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :Svensk
 STR_NETWORK_LANG_TURKISH                                        :Turkisk
 STR_NETWORK_LANG_UKRAINIAN                                      :Ukrainsk
+STR_NETWORK_LANG_AFRIKAANS                                      :Afrikaans
+STR_NETWORK_LANG_CROATIAN                                       :Kroatiska
+STR_NETWORK_LANG_CATALAN                                        :Katalanska
+STR_NETWORK_LANG_ESTONIAN                                       :Estniska
+STR_NETWORK_LANG_GALICIAN                                       :Galiciska
+STR_NETWORK_LANG_GREEK                                          :Grekiska
+STR_NETWORK_LANG_LATVIAN                                        :Lettiska
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Nätverksspel
@@ -1536,6 +1557,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Privat] Till {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[Alla] :
 STR_NETWORK_CHAT_ALL                                            :[Alla] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Mata in text för nätverkschat
 STR_NETWORK_NAME_CHANGE                                         :har ändrat sitt namn till
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Servern avslutade sessionen
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Servern startar om...{}Var vänlig vänta...
@@ -1599,6 +1621,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Inget passande järnvägsspår
 STR_1007_ALREADY_BUILT                                          :{WHITE}...redan byggd
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Måste ta bort järnväg först
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Vägen är enkelriktad eller blockerad
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Bygg järnväg
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Elektrifierad järnvägskonstruktion
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Bygg monorail
@@ -1701,6 +1724,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Byggnad måste rivas först
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Stad)
 STR_2006_POPULATION                                             :{BLACK}Invånare: {ORANGE}{COMMA}{BLACK}  Hus: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Byt namn på stad
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Kan inte byta namn på stad...
@@ -1937,6 +1961,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Välj scenario (grön), förbestämt spel (blå), eller slumpmässigt nytt spel
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Skapa slumpmässigt nytt spel
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Läs höjdkarta
+STR_SAVE_OSKTITLE                                               :{BLACK}Mata in ett namn för detta sparade spel
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} i vägen
@@ -1980,20 +2005,20 @@
 STR_4826_SUGAR_MINE                                             :Sockergruva
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Kräver: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Kräver: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Kräver: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Kräver: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Kräver: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Kräver: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Last som väntar på att bli behandlad:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Producerar: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Producerar: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Producerar: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Producerar: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produktion förra månaden:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transporterat)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transporterat)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centrera vyn ovanför industrin
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Ny {STRING} under byggnation nära {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Ny {STRING} planteras nära {TOWN}!
@@ -2626,26 +2651,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Invånarna firar . . .{}Första tåget ankommer till {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Details)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Tåg i vägen
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Ã…k till {STATION}
-STR_GO_TO_TRANSFER                                              :Åk till {STATION} (Lasta om och på)
-STR_8807_GO_TO_UNLOAD                                           :Ã…k till {STATION} (Lasta av)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Åk till {STATION} (Lasta om men inte på)
-STR_8808_GO_TO_LOAD                                             :Åk till {STATION} (Lasta på)
-STR_GO_TO_TRANSFER_LOAD                                         :Åk till {STATION} (Lasta om och vänta på full last)
-STR_880A_GO_NON_STOP_TO                                         :Ã…k nonstop till {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Åk nonstop till {STATION} (Lasta om och på)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Ã…k nonstop till {STATION} (Lasta av)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Åk nonstop till {STATION} (Lasta om men inte på)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Åk nonstop till {STATION} (Lasta på)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Åk nonstop till {STATION} (Lasta om och vänta på full last)
 STR_GO_TO_TRAIN_DEPOT                                           :Åk till {TOWN}s tågdepå
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Servning vid {TOWN} tågdepå
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Åk non-stop till {TOWN}s tågdepå
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Servning non-stop {TOWN} tågdepå
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Avres (Inte tillagd i tidtabell)
 STR_TIMETABLE_TRAVEL_FOR                                        :Res till {STRING}
 STR_TIMETABLE_STAY_FOR                                          :och stanna i {STRING}
@@ -2695,9 +2705,10 @@
 STR_REFIT_ORDER                                                 :(Anpassa för {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}Tidtabell
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Ändra till tidtabellsvy
+STR_ORDER_VIEW                                                  :{BLACK}Order
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}Byt till  ordervyn
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Order)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Slut på order - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Servning
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Kan inte bygga järnvägfordon...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Byggt: {LTBLUE}{NUM}{BLACK} Värde: {LTBLUE}{CURRENCY}
@@ -3251,6 +3262,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Generera Värld
 STR_RANDOM_SEED                                                 :{BLACK}Slump-nummer:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Klicka för att mata in ett slump-nummer
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Mata in ett slumpmässigt frö
 STR_LAND_GENERATOR                                              :{BLACK}Landgenerator:
 STR_TREE_PLACER                                                 :{BLACK}Träd Algoritm:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Rotation på höjdkarta:
@@ -3341,6 +3353,7 @@
 STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Växla genomskinlighet för byggnader såsom stationer, depåer, riktmärken eller kedjelinje
 STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Växla genomskinlighet för industrier
 STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Växla genomskinlighet för byggnader såsom fyrar och antenner, kanske i framtiden även ögongodis
+STR_TRANSPARENT_CATENARY_DESC                                   :{BLACK}Växla genomskinlighet för kedjebro. CTRL+klick för att låsa.
 STR_TRANSPARENT_LOADING_DESC                                    :{BLACK}Växla genomskinlighet för lastningsindikatörer
 
 STR_PERCENT_UP_SMALL                                            :{TINYFONT}{WHITE}{NUM}%{UPARROW}
@@ -3397,6 +3410,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}Åk till nästa skylt
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Åk till föregående skylt
+STR_SIGN_OSKTITLE                                               :{BLACK}Mata in ett namn för skylten
 
 ########
 
@@ -3469,3 +3483,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Minska dragen signals täthet
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Öka dragen signals täthet
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :`1234567890-=\qwertyuiop[]asdfghjkl;'  zxcvbnm,./ .
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:"  ZXCVBNM<>? .
+########
--- a/src/lang/traditional_chinese.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/traditional_chinese.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1061,7 +1061,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}自動翻新最低費用:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}錯誤訊æ¯é¡¯ç¤ºæ™‚間:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}於標籤顯示市鎮人å£ï¼š{ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}鏿“‡åŠé€æ˜Žå»ºç¯‰ç‰©æ™‚將樹木隱è—:{ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}地形產生器:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :原版
@@ -1973,20 +1972,20 @@
 STR_4826_SUGAR_MINE                                             :糖礦
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}囤ç©çš„貨物:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}產出:{YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}產出:{YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}產出:{YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}產出:{YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}上月產é‡ï¼š
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} (é‹é€äº† {COMMA}%)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} (é‹é€äº† {COMMA}%)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}將主視野帶到工業上方
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}æ–°çš„ {STRING} 正在 {TOWN} 附近建造中ï¼
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}æ–°çš„ {STRING} 正在 {TOWN} 附近種æ¤ä¸­ï¼
@@ -2617,26 +2616,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}市民慶賀 . . .{}é¦–è¼›åˆ—è»ŠæŠµé” {STATION}ï¼
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (詳細資料)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}剿–¹æœ‰åˆ—車
-STR_8804                                                        :{SETX 10}{COMMA}:{STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}:{STRING} {STRING}
-STR_8806_GO_TO                                                  :å‰å¾€ {STATION}
-STR_GO_TO_TRANSFER                                              :å‰å¾€ {STATION} (轉é‹ï¼Œåƒ…載ä¸å¸)
-STR_8807_GO_TO_UNLOAD                                           :å‰å¾€ {STATION} (å¸å®¢è²¨)
-STR_GO_TO_TRANSFER_UNLOAD                                       :å‰å¾€ {STATION} (轉é‹ï¼Œå¸å®¢è²¨æ¸…空離站)
-STR_8808_GO_TO_LOAD                                             :å‰å¾€ {STATION} (滿載)
-STR_GO_TO_TRANSFER_LOAD                                         :å‰å¾€ {STATION} (轉é‹ï¼Œç­‰å¾…滿載)
-STR_880A_GO_NON_STOP_TO                                         :å‰å¾€ {STATION} ä¸åœé /中途ä¸åœ
-STR_GO_TO_NON_STOP_TRANSFER                                     :å‰å¾€ {STATION} (è½‰é‹ [僅載ä¸å¸]) 中途ä¸åœ
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :å‰å¾€ {STATION} (å¸è¼‰) 中途ä¸åœ
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :å‰å¾€ {STATION} (è½‰é‹ [å¸è¼‰æ¸…空離站]) 中途ä¸åœ
-STR_880C_GO_NON_STOP_TO_LOAD                                    :å‰å¾€ {STATION} (滿載) 中途ä¸åœ
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :å‰å¾€ {STATION} (è½‰é‹ [等待滿載]) 中途ä¸åœ
 STR_GO_TO_TRAIN_DEPOT                                           :å‰å¾€ {TOWN} 機廠
 STR_SERVICE_AT_TRAIN_DEPOT                                      :在 {TOWN} 機廠維護
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :å‰å¾€ {TOWN} 機廠 中途ä¸åœ
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :在 {TOWN} 機廠維護 中途ä¸åœ
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :æ¼«éŠ (無時刻表)
 STR_TIMETABLE_TRAVEL_FOR                                        :通行於 {STRING}
 STR_TIMETABLE_STAY_FOR                                          :並等待 {STRING}
@@ -2688,7 +2672,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}切æ›è‡³æ™‚刻表檢視模å¼
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (指令)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - æŒ‡ä»¤çµæŸ - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}ç¶­è­·
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}無法購買éµé“車輛...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   購於:{LTBLUE}{NUM}{BLACK} 價值:{LTBLUE}{CURRENCY}
--- a/src/lang/turkish.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/turkish.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -724,6 +724,7 @@
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Verici koy
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Çöl yap, kaldırmak için CTRL'ye basılı tut
 STR_CREATE_LAKE                                                 :{BLACK}Su alanını belirle.{}Deniz seviyesinde CTRL tuşu basılı olmadığı sürece kanal yapar, basılıysa etraftakileri su altında bırakır
+STR_CREATE_RIVER                                                :{BLACK}Irmak oluÅŸtur.
 STR_0290_DELETE                                                 :{BLACK}Sil
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Sehri tamamen sil
 STR_0292_SAVE_SCENARIO                                          :Kaydet
@@ -933,6 +934,7 @@
 
 STR_OPTIONS_FULLSCREEN                                          :{BLACK}Tam ekran
 STR_OPTIONS_FULLSCREEN_TIP                                      :{BLACK}Tam ekran oynamak için bunu isaretleyin
+STR_FULLSCREEN_FAILED                                           :{WHITE}Tam ekran modu başarısız
 
 STR_OPTIONS_RES                                                 :{BLACK}Ekran Çözünürlüğü
 STR_OPTIONS_RES_CBO                                             :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
@@ -1033,6 +1035,7 @@
 STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD             :{LTBLUE}Üretim fabrikalarının yapım yöntemi: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE        :hiçbiri
 STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL      :diÄŸer fabrikalar gibi
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :tetkik aramayla
 STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Bir şehirde birden fazla aynı fabrika olması izinli: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Aynı tür fabrikalar yan yana yapılabilir: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Durum çubuğunda uzun tarih göster: {ORANGE}{STRING}
@@ -1046,6 +1049,7 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Diğer şirketlere para gönderme izinli: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Özel istasyonlar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Ağır yük trenleri için ağırlık çarpanı: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Uçak hızı çarpanı: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Şehiriçi yollara durak yapmak izinli: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}BitiÅŸik istasyonlar izinli: {ORANGE}{STRING}
 
@@ -1063,7 +1067,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Yenileme icin gerekli en az parayı otomatik yenile: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Hata mesajı görünme süresi: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Şehir nüfusunu isminin yanına yaz: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Görünmez ağaçlar (şeffaf binalarla): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Arazi üretici: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Özgün
@@ -1200,6 +1203,19 @@
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Ayar deÄŸerini deÄŸiÅŸtir
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Bazi servis gecikmeleri aralık dışında: %5-%90 veya 30-800 gün arasında olmalı
 
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Trenler için yol bulucu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Önerilmez)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Önerilen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Arabalar için yol bulucu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Öntanımlı {RED}(Önerilmez)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Önerilen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Gemiler için yol bulucu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Öntanımlı {BLUE}(Önerilen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Önerilmez)
+
 STR_TEMPERATE_LANDSCAPE                                         :Ilıman iklim
 STR_SUB_ARCTIC_LANDSCAPE                                        :SoÄŸuk iklim
 STR_SUB_TROPICAL_LANDSCAPE                                      :Tropik iklim
@@ -1334,6 +1350,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Oyuncu adı:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Oyuncuların görecegi adınızı seçin
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}İsminizi girin
 STR_NETWORK_CONNECTION                                          :{BLACK}Bağlantı:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}İnternet ya da yerel ağ bağlantısı (LAN) oyunundan birini seçin
 
@@ -1377,6 +1394,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Oyun adı:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Bu oyun adı diğer oyuncuların server listesinde görünecek
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Ağ oyunu için bir isim girin
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Parola koy
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Erişimi kısıtlamak için oyuna parola koy
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Harita seç:
@@ -1433,6 +1451,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :İsveççe
 STR_NETWORK_LANG_TURKISH                                        :Türkçe
 STR_NETWORK_LANG_UKRAINIAN                                      :Ukraynaca
+STR_NETWORK_LANG_AFRIKAANS                                      :Afrikaanca
+STR_NETWORK_LANG_CROATIAN                                       :Hırvatça
+STR_NETWORK_LANG_CATALAN                                        :Katalanca
+STR_NETWORK_LANG_ESTONIAN                                       :Estonyaca
+STR_NETWORK_LANG_GALICIAN                                       :Galiçyaca
+STR_NETWORK_LANG_GREEK                                          :Yunanca
+STR_NETWORK_LANG_LATVIAN                                        :Letonca
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Çok oyunculu oyun lobisi
@@ -1531,6 +1556,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Özel] -> {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[Herkes] :
 STR_NETWORK_CHAT_ALL                                            :[Herkes] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Ağ sohbeti için yazı girin
 STR_NETWORK_NAME_CHANGE                                         :ismini deÄŸiÅŸtirdi:
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Sunucu kapandı
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} Sunucu baştan başlatılıyor...{}Lütfen bekleyin...
@@ -1594,6 +1620,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Uygun ray yok
 STR_1007_ALREADY_BUILT                                          :{WHITE}...zaten yapıldı
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Önce ray kaldırılmalı
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Yol tek yönlü veya kapalı
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Demiryolu Yapımı
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Elektrikli Ray Yapımı
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Monoray Yapımı
@@ -1696,6 +1723,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Önce bina yıkılmalı
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (Åžehir)
 STR_2006_POPULATION                                             :{BLACK}Nüfus: {ORANGE}{COMMA}{BLACK}  Ev: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :İsim değiştir
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}İsim değiştirilemiyor...
@@ -1932,6 +1960,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Senaryo (yeşil), kurulu oyun (mavi) veya yeni oyun seç
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Rastgele haritada oyna
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Yükseklik haritası yükle
+STR_SAVE_OSKTITLE                                               :{BLACK}Kayıtlı oyun için bir isim girin
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}yolda {STRING} var
@@ -1975,20 +2004,20 @@
 STR_4826_SUGAR_MINE                                             :Åžeker Madeni
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}İstenen: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}İstenenler: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}İstenenler: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}İstenen: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}İstenenler: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}İstenenler: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}İşlenmeyi bekleyen kargo:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}Üretir: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}Üretir: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}Üretir: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}Üretir: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Geçen ayki üretim:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} (%{COMMA} tasindi)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} (%{COMMA} tasindi)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Fabrikaya git
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Yeni bir {STRING}, {TOWN} şehri yakınlarında kuruldu!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Yeni bir {STRING}, {TOWN} şehri yakınlarında kuruldu!
@@ -2328,6 +2357,8 @@
 STR_LIVERY_PASSENGER_WAGON_STEAM                                :Tramvay (Buhar)
 STR_LIVERY_PASSENGER_WAGON_DIESEL                               :Tramvay (Dizel)
 STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :Tramvay (Elektrik)
+STR_LIVERY_PASSENGER_WAGON_MONORAIL                             :Yolcu Vagonu (Monoray)
+STR_LIVERY_PASSENGER_WAGON_MAGLEV                               :Yolcu Vagonu (Maglev)
 STR_LIVERY_FREIGHT_WAGON                                        :Yük Vagonu
 STR_LIVERY_BUS                                                  :Otobüs
 STR_LIVERY_TRUCK                                                :Kamyon
@@ -2619,26 +2650,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Kutlama Yapıldı . . .{} {STATION} istasyonuna ilk kez tren geldi!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Detaylar)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Yolda tren var
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8806_GO_TO                                                  :Git: {STATION}
-STR_GO_TO_TRANSFER                                              :Aktar: {STATION} (Kargoyu al)
-STR_8807_GO_TO_UNLOAD                                           :Git: {STATION} (BoÅŸalt)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Aktar: {STATION} (Boş dön)
-STR_8808_GO_TO_LOAD                                             :Git: {STATION} (Doldur)
-STR_GO_TO_TRANSFER_LOAD                                         :Aktar: {STATION} (Tam doldur)
-STR_880A_GO_NON_STOP_TO                                         :Durmadan git: {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Durmadan aktar: {STATION} (Kargoyu al)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Durmadan git: {STATION} (BoÅŸalt)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Durmadan aktar: {STATION} (Boş dön)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Durmadan git: {STATION} (Doldur)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Durmadan aktar: {STATION} (Tam doldur)
 STR_GO_TO_TRAIN_DEPOT                                           :Git: {TOWN} Tren Garı
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Bakıma git: {TOWN} Tren Garı
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Durmadan git: {TOWN} Tren Garı
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Durmadan bakıma git: {TOWN} Tren Garı
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :Gezi (zamanlı değil)
 STR_TIMETABLE_TRAVEL_FOR                                        :{STRING} için gezi
 STR_TIMETABLE_STAY_FOR                                          :{STRING} için bekle
@@ -2690,7 +2706,6 @@
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}Zaman tablosu görünümüne geç
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Talimatlar)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Talimatların Sonu - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Bakım
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Tren satın alınamaz...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Tarih: {LTBLUE}{NUM}{BLACK} DeÄŸeri: {LTBLUE}{CURRENCY}
@@ -2783,6 +2798,7 @@
 STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}{STRING} artık kullanılabilir!  -  {ENGINE}
 
 STR_CAN_T_SELL_DESTROYED_VEHICLE                                :{WHITE}Hurda araçlar satılamaz...
+STR_CAN_T_REFIT_DESTROYED_VEHICLE                               :{WHITE}Yok olmuş araç modifiye edilemez...
 
 STR_CAN_T_TIMETABLE_VEHICLE                                     :{WHITE}Aracın zaman çizelgesi oluşturulamıyor...
 STR_TIMETABLE_ONLY_WAIT_AT_STATIONS                             :{WHITE}Araçlar sadece istasyonlarda bekleyebilir.
@@ -3073,6 +3089,7 @@
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} önce, {STRING} ondan sonra yüklenmeli.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} sonra, {STRING} ondan önce yüklenmeli.
 STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER                            :{STRING} OpenTTD {STRING} veya daha yüksek bir sürüm gerektirir.
+STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF dosyası çeviri için yapılmış
 STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED                        :Çok fazla NewGRF yüklendi.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Ekle
@@ -3227,6 +3244,12 @@
 STR_PURCHASE_INFO_ALL_BUT                                       :{GOLD} hariç hepsi
 STR_PURCHASE_INFO_MAX_TE                                        :{BLACK}Mak. Çekim Gücü: {GOLD}{FORCE}
 
+########### For showing numbers in widgets
+
+STR_NUM_1                                                       :{BLACK}{SKIP}{NUM}
+STR_NUM_2                                                       :{BLACK}{SKIP}{SKIP}{NUM}
+STR_NUM_3                                                       :{BLACK}{SKIP}{SKIP}{SKIP}{NUM}
+
 ########### String for New Landscape Generator
 
 STR_GENERATE                                                    :{WHITE}OluÅŸtur
@@ -3235,6 +3258,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Harita üretimi
 STR_RANDOM_SEED                                                 :{BLACK}Rastgele Sayı:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Rastgele bir sayı girmek için tıklayın
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Rastgele bir tohum girin
 STR_LAND_GENERATOR                                              :{BLACK}Harita üretici:
 STR_TREE_PLACER                                                 :{BLACK}Ağaç algoritmasi:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Yükseklik haritası döndür:
@@ -3252,6 +3276,7 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Başlangıç yılını değiştir
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Ölcek uyarısı
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Kaynak haritanin boyutunu değiştirmek önerilmez. Harita oluşturmaya devam edilsin mi?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Şehir planlama uyarısı
 STR_HEIGHTMAP_NAME                                              :{BLACK}Yükseklik haritası adı:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Boyut: {ORANGE}{NUM} x {NUM}
 STR_GENERATION_WORLD                                            :{WHITE}Harita oluÅŸturuluyor...
@@ -3395,6 +3420,8 @@
 STR_FACE_LOAD_TIP                                               :{BLACK}Tercih edilen yüzü yükle
 STR_FACE_LOAD_DONE                                              :{WHITE}Tercih edilen yüz OpenTTD ayar dosyasından yüklendi.
 STR_FACE_FACECODE                                               :{BLACK}Oyuncu yüzü no.
+STR_FACE_FACECODE_TIP                                           :{BLACK}Oyuncu suratının numarasını göster/değiştir
+STR_FACE_FACECODE_CAPTION                                       :{WHITE}Oyuncu suratının numarasını göster/değiştir
 STR_FACE_FACECODE_SET                                           :{WHITE}Surat numarası ayarlandı.
 STR_FACE_FACECODE_ERR                                           :{WHITE}Oyuncu surat numarası ayarlanamadı - 0 ve 4.294.967.295 arasında bir sayı olmalı!
 STR_FACE_SAVE                                                   :{BLACK}Kaydet
@@ -3439,3 +3466,6 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Sinyal sürükleme yoğunluğunu azalt
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Sinyal sürükleme yoğunluğunu arttır
 ########
+
+############ on screen keyboard
+########
--- a/src/lang/ukrainian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/ukrainian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -723,7 +723,7 @@
 STR_MESSAGES_ALL                                                :{YELLOW}Відображати повідомленнÑ: відкл. / коротко / повно
 STR_MESSAGE_SOUND                                               :{YELLOW}Звукове ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ñ–Ð´Ñумкових новин
 STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO                       :{WHITE}...дуже далеко від попереднього пункту призначеннÑ
-STR_0211_TOP_COMPANIES_WHO_REACHED                              :{BIGFONT}{BLACK}Кращі компанії, що доÑÑгли {NUM}{}(рівень {STRING})
+STR_0211_TOP_COMPANIES_WHO_REACHED                              :{BIGFONT}{BLACK}Кращі компанії, що доÑÑгли {NUM}{}({STRING} рівень)
 STR_TOP_COMPANIES_NETWORK_GAME                                  :{BIGFONT}{BLACK}Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ñ–Ð¹ з {NUM}
 STR_0212                                                        :{BIGFONT}{COMMA}.
 STR_0213_BUSINESSMAN                                            :БізнеÑмен
@@ -940,7 +940,7 @@
 STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Виберіть грошову одиницю
 STR_MEASURING_UNITS                                             :{BLACK}СиÑтема одиниць виміру
 STR_02E4                                                        :{BLACK}{SKIP}{SKIP}{STRING}
-STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Вибір ÑиÑтеми одиниць виміру
+STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Виберіть ÑиÑтему одиниць виміру
 STR_02E6_ROAD_VEHICLES                                          :{BLACK}ТранÑпорт
 STR_02E7                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
 STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Виберіть, по Ñкій Ñтороні їхатиме транÑпорт
@@ -953,10 +953,10 @@
 STR_02F4_AUTOSAVE                                               :{BLACK}ÐвтозбереженнÑ
 STR_02F5                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_02F6_SELECT_INTERVAL_BETWEEN                                :{BLACK}Виберіть період Ð°Ð²Ñ‚Ð¾Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð³Ñ€Ð¸
-STR_02F7_OFF                                                    :Вимкнено
-STR_02F8_EVERY_3_MONTHS                                         :Кожні три міÑÑці
-STR_02F9_EVERY_6_MONTHS                                         :Кожні півроку
-STR_02FA_EVERY_12_MONTHS                                        :Щороку
+STR_02F7_OFF                                                    :вимкнено
+STR_02F8_EVERY_3_MONTHS                                         :кожні три міÑÑці
+STR_02F9_EVERY_6_MONTHS                                         :кожні півроку
+STR_02FA_EVERY_12_MONTHS                                        :щороку
 STR_02FB_START_A_NEW_GAME                                       :{BLACK}Почати нову гру
 STR_02FC_LOAD_A_SAVED_GAME                                      :{BLACK}Продовжити збережену гру
 STR_02FE_CREATE_A_CUSTOMIZED_GAME                               :{BLACK}Створити Ñвій Ñценарій
@@ -1175,29 +1175,29 @@
 STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY                             :{LTBLUE}Дозволити передавати гроші іншим компаніÑм: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Ðеоднорідні Ñтанції: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Множник ваги Ð´Ð»Ñ Ñ–Ð¼Ñ–Ñ‚Ð°Ñ†Ñ–Ñ— важких потÑгів: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED                                  :{LTBLUE}Фактор швидкоÑті літаків: {ORANGE}1 / {STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Дозволити безпереÑадкові зупинки на муніципальних дорогах: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Дозволити будувати Ñуміжні Ñтанції: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Будувати малі аеропорти можна завжди: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}ПовідомлÑти, коли поїзд загубивÑÑ {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}ПовідомлÑти, Ñкщо поїзд загубивÑÑ {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ORDER_REVIEW                                 :{LTBLUE}Показ транÑпортних наказів: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ORDER_REVIEW_OFF                             :ні
 STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT                         :так, крім зупиненого транÑпорту
 STR_CONFIG_PATCHES_ORDER_REVIEW_ON                              :уÑього транÑпорту
-STR_CONFIG_PATCHES_WARN_INCOME_LESS                             :{LTBLUE}Попереджати Ñкщо поїзд приноÑить збитки: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_INCOME_LESS                             :{LTBLUE}ПовідомлÑти, Ñкщо поїзд приноÑить збитки: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES                        :{LTBLUE}ТранÑпорт не Ñтаріє: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTORENEW_VEHICLE                            :{LTBLUE}ÐÐ²Ñ‚Ð¾Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñтарого транÑпорту
 STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}ÐÐ²Ñ‚Ð¾Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ñпорту через {ORANGE}{STRING}{LTBLUE} міÑ. до/піÑÐ»Ñ Ð¼Ð°ÐºÑ.віку
-STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Ðеобхідна Ñума Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Сума, необхідна Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}ТриваліÑть Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Показувати наÑÐµÐ»ÐµÐ½Ð½Ñ Ð¼Ñ–Ñта поруч з назвою: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Ðевидимі дерева Ñ– прозорі будівлі: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Генератор ландшафту: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :КлаÑичний
 STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS                 :ТерраГен
-STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}ÐœÐ°ÐºÑ Ð²Ñ–Ð´Ð´Ð°Ð»ÐµÐ½Ñ–Ñть від нафтової Ñвердловини {ORANGE}{STRING}
+STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}МакÑ. віддаленіÑть від краю Ð´Ð»Ñ Ð½Ð°Ñ„Ñ‚Ð¾Ð²Ð¸Ñ… Ñвердловин {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SNOWLINE_HEIGHT                              :{LTBLUE}ВиÑота Ñ€Ñ–Ð²Ð½Ñ Ñнігу: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN                         :{LTBLUE}ÐерівніÑть землі (лише Ð´Ð»Ñ TerraGenesis) : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH             :Дуже гладкий
@@ -1215,7 +1215,7 @@
 
 STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}МакÑ. довжина Ñтанції: {ORANGE}{STRING} {RED}Велике Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð³Ð°Ð»ÑŒÐ¼ÑƒÑ” гру
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Ðвтоматичний техоглÑд гелікоптерів на площадках: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Включити меню рельєфу до меню будуваннÑ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Приєднати меню рельєфу до меню будуваннÑ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Протилежний напрÑмок прокрутки: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Плавна прокрутка у вікні: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Показувати розміри будівництва в підказці: {ORANGE}{STRING}
@@ -1266,7 +1266,7 @@
 STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT                           :{LTBLUE}Заборонити комп'ютеру будувати літаки: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AI_BUILDS_SHIPS                              :{LTBLUE}Заборонити комп'ютеру будувати кораблі: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Ðовий тип інтелекту (альфа): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Ðовий тип інтелекту (альфа-верÑÑ–Ñ): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Включити інтелект при грі в мережі(теÑтовий): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Інтервал техоглÑду Ð´Ð»Ñ Ð¿Ð¾Ñ—Ð·Ð´Ñ–Ð²: {ORANGE}{STRING} дн/%
@@ -1476,6 +1476,7 @@
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Ім'Ñ Ð³Ñ€Ð°Ð²Ñ†Ñ:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Ім'Ñ, за Ñким тебе розпізнаватимуть інші гравці
+STR_NETWORK_PLAYER_NAME_OSKTITLE                                :{BLACK}Введіть ваше ім'Ñ
 STR_NETWORK_CONNECTION                                          :{BLACK}З'єднаннÑ:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Виберіть гру через інтернет або через локальну мережу(ЛОМ)
 
@@ -1519,6 +1520,7 @@
 
 STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Ðазва гри:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Ðазва гри відображатиметьÑÑ Ñ–Ð½ÑˆÐ¸Ð¼ гравцÑм у меню мережної гри
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE                              :{BLACK}Введіть назву мережевої гри
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Ð’Ñтановити пароль
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}ЗахиÑтіть вашу гру паролем, Ñкщо не бажаєте загального доÑтупу
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Виберіть карту:
@@ -1575,6 +1577,13 @@
 STR_NETWORK_LANG_SWEDISH                                        :ШведÑька
 STR_NETWORK_LANG_TURKISH                                        :Турецька
 STR_NETWORK_LANG_UKRAINIAN                                      :УкраїнÑька
+STR_NETWORK_LANG_AFRIKAANS                                      :ÐфрікаанÑ
+STR_NETWORK_LANG_CROATIAN                                       :ХорватÑька
+STR_NETWORK_LANG_CATALAN                                        :КаталонÑька
+STR_NETWORK_LANG_ESTONIAN                                       :ЕÑтонÑька
+STR_NETWORK_LANG_GALICIAN                                       :ГаліÑійÑька
+STR_NETWORK_LANG_GREEK                                          :Грецька
+STR_NETWORK_LANG_LATVIAN                                        :ЛатвійÑька
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Мережева гра - кімната
@@ -1673,6 +1682,7 @@
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Приватно] до {STRING}:{GRAY}{STRING}
 STR_NETWORK_CHAT_ALL_CAPTION                                    :[Ð’Ñім] :
 STR_NETWORK_CHAT_ALL                                            :[Ð’Ñім] {STRING}:{GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE                                       :{BLACK}Введіть текÑÑ‚ Ð´Ð»Ñ Ð¼ÐµÑ€ÐµÐ¶ÐµÐ²Ð¾Ð³Ð¾ чату
 STR_NETWORK_NAME_CHANGE                                         :змінив Ñвоє ім'Ñ Ð½Ð°
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} Сервер закрив ÑеанÑ
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} ÐŸÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñервера...{}Зачекайте...
@@ -1736,6 +1746,7 @@
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Ðевідповідний тип колії
 STR_1007_ALREADY_BUILT                                          :{WHITE}...вже побудовано
 STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Спочатку приберіть колію
+STR_ERR_CROSSING_ON_ONEWAY_ROAD                                 :{WHITE}Дорога з одноÑтороннім рухом  або блокована
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Будівництво залізниці
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Будувати електрифіковану колію
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Будівництво монорельÑа
@@ -1838,6 +1849,7 @@
 STR_2002_WHITE                                                  :{TINYFONT}{WHITE}{SIGN}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Спочатку зруйнуйте Ñпоруду
 STR_2005                                                        :{WHITE}{TOWN}
+STR_CITY                                                        :{WHITE}{TOWN} (міÑто)
 STR_2006_POPULATION                                             :{BLACK}ÐаÑеленнÑ: {ORANGE}{COMMA}{BLACK}  Будинки: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Перейменувати
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Ðеможливо перейменувати...
@@ -2074,6 +2086,7 @@
 STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Виберіть Ñценарій (зелений), вÑтановлена гра (Ñиній), або випадкова нова гра
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Генерувати випадкову нову гру
 STR_LOAD_HEIGHTMAP                                              :{WHITE}Завантажити ландшафт
+STR_SAVE_OSKTITLE                                               :{BLACK}Введіть назву файла збереженої гри
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} на шлÑху
@@ -2154,20 +2167,20 @@
 STR_4826_SUGAR_MINE.z                                           :цукрову копальню
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Потребує: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Потребує: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Потребує: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Потребує: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Потребує: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Потребує: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Вантаж чекає на обробку:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES                                               :{BLACK}ПродукціÑ: {YELLOW}{STRING}
-STR_4828_PRODUCES                                               :{BLACK}ПродукціÑ: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES                                               :{BLACK}ПродукціÑ: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES                                               :{BLACK}ПродукціÑ: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Вироблено за міÑÑць:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% перевезено)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% перевезено)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Показати в центрі екрану
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}БудуєтьÑÑ {STRING} Ð±Ñ–Ð»Ñ {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}ÐаÑаджено {STRING} Ð±Ñ–Ð»Ñ {TOWN}!
@@ -2346,14 +2359,14 @@
 STR_682D_MOUNTAINOUS                                            :ГориÑтий
 STR_682E_STEADY                                                 :Стабільна
 STR_682F_FLUCTUATING                                            :ÐеÑтійка
-STR_6830_IMMEDIATE                                              :Відразу
+STR_6830_IMMEDIATE                                              :відразу
 STR_6831_3_MONTHS_AFTER_PLAYER                                  :3 міÑÑці піÑÐ»Ñ Ð³Ñ€Ð°Ð²Ñ†Ñ
 STR_6832_6_MONTHS_AFTER_PLAYER                                  :6 міÑÑців піÑÐ»Ñ Ð³Ñ€Ð°Ð²Ñ†Ñ
 STR_6833_9_MONTHS_AFTER_PLAYER                                  :9 міÑÑців піÑÐ»Ñ Ð³Ñ€Ð°Ð²Ñ†Ñ
-STR_6834_AT_END_OF_LINE_AND_AT_STATIONS                         :Ð’ кінці лінії, або на ÑтанціÑÑ…
-STR_6835_AT_END_OF_LINE_ONLY                                    :Лише в кінці лінії
-STR_6836_OFF                                                    :ВиКл
-STR_6837_ON                                                     :Вкл
+STR_6834_AT_END_OF_LINE_AND_AT_STATIONS                         :в кінці лінії, або на ÑтанціÑÑ…
+STR_6835_AT_END_OF_LINE_ONLY                                    :лише в кінці лінії
+STR_6836_OFF                                                    :відкл.
+STR_6837_ON                                                     :вкл.
 STR_6838_SHOW_HI_SCORE_CHART                                    :{BLACK}Показати таблицю рекордів
 STR_PERMISSIVE                                                  :ДопуÑтиме
 STR_TOLERANT                                                    :Терпиме
@@ -2800,26 +2813,11 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жителі ÑвÑткують . . .{}Перший поїзд з'ÑвивÑÑ Ð½Ð° {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{VEHICLE} (Детально)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Поїзд на шлÑху
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING}{STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING}{STRING}
-STR_8806_GO_TO                                                  :ПрÑмувати до {STATION}
-STR_GO_TO_TRANSFER                                              :ПрÑмувати до {STATION} (ПереÑадити Ñ– забрати вантаж)
-STR_8807_GO_TO_UNLOAD                                           :ПрÑмувати до {STATION} (розвантажитиÑÑ)
-STR_GO_TO_TRANSFER_UNLOAD                                       :ПрÑмувати до {STATION} (ПереÑадити Ñ– залишити вантаж)
-STR_8808_GO_TO_LOAD                                             :ПрÑмувати до {STATION} (ЗавантажитиÑÑ)
-STR_GO_TO_TRANSFER_LOAD                                         :ПрÑмувати до {STATION} (ПереÑадити Ñ– завантажити повніÑтю)
-STR_880A_GO_NON_STOP_TO                                         :ПрÑмувати без зупинок до {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :ПрÑмувати без зупинок до {STATION} (ПереÑадити Ñ– забрати вантаж)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :ПрÑмувати без зупинок до {STATION} (розвантажитиÑÑ)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :ПрÑмувати без зупинок до {STATION} (ПереÑадити Ñ– залишити вантаж)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :ПрÑмувати без зупинок до {STATION} (Завантажити)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :ПрÑмувати без зупинок до {STATION} (ПереÑадити Ñ– завантажити повніÑтю)
 STR_GO_TO_TRAIN_DEPOT                                           :ПрÑмувати до {TOWN} депо
 STR_SERVICE_AT_TRAIN_DEPOT                                      :РемонтуватиÑÑŒ в {TOWN} депо
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :ПрÑмувати без зупинок до {TOWN} депо
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :РемонтуватиÑÑŒ без зупинок в {TOWN} депо
 
-STR_TIMETABLE_GO_TO                                             :{STRING} {STRING}
 STR_TIMETABLE_TRAVEL_NOT_TIMETABLED                             :ПрÑмує (не за розкладом)
 STR_TIMETABLE_TRAVEL_FOR                                        :ПрÑмує до {STRING}
 STR_TIMETABLE_STAY_FOR                                          :Ñ– ÑтоÑти {STRING}
@@ -2869,9 +2867,10 @@
 STR_REFIT_ORDER                                                 :(Переобладнати до {STRING})
 STR_TIMETABLE_VIEW                                              :{BLACK}Розклад
 STR_TIMETABLE_VIEW_TOOLTIP                                      :{BLACK}ПереключитиÑÑŒ на розклад
+STR_ORDER_VIEW                                                  :{BLACK}ЗавданнÑ
+STR_ORDER_VIEW_TOOLTIP                                          :{BLACK}ПереключитиÑÑŒ до вікна завдань
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ðакази)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Кінець наказів - -
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}ТехоглÑд
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Ðеможливо збудувати поїзд...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{ENGINE}{BLACK}   Рік випуÑку: {LTBLUE}{NUM}{BLACK} Ціна: {LTBLUE}{CURRENCY}
@@ -3425,6 +3424,7 @@
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñвіту
 STR_RANDOM_SEED                                                 :{BLACK}Випадкове чиÑло:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Клік Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ значеннÑ
+STR_RANDOM_SEED_OSKTITLE                                        :{BLACK}Введіть випадкове чиÑло
 STR_LAND_GENERATOR                                              :{BLACK}Ландшафт:
 STR_TREE_PLACER                                                 :{BLACK}ÐаÑÐ°Ð´Ð¶ÐµÐ½Ð½Ñ Ð´ÐµÑ€ÐµÐ²:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Поворот рельєфу
@@ -3572,6 +3572,7 @@
 #### Improved sign GUI
 STR_NEXT_SIGN_TOOLTIP                                           :{BLACK}ÐаÑтупне позначеннÑ
 STR_PREVIOUS_SIGN_TOOLTIP                                       :{BLACK}Попереднє позначеннÑ
+STR_SIGN_OSKTITLE                                               :{BLACK}Введіть назву знака
 
 ########
 
@@ -3644,3 +3645,8 @@
 STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP                           :{BLACK}Зменшити чаÑтоту Ñигналів
 STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP                           :{BLACK}Збільшити чаÑтоту Ñигналів
 ########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT                                         :`1234567890-=\йцукенгшщзхїфівапролджє  ÑчÑмитьбю. .
+STR_OSK_KEYBOARD_LAYOUT_CAPS                                    :~!@#$%^&*()_+|ЙЦУКЕÐГШЩЗХЇФІВÐПРОЛДЖЄ  ЯЧСМИТЬБЮ, .
+########
--- a/src/lang/unfinished/frisian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/unfinished/frisian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1079,13 +1079,13 @@
 STR_4826_SUGAR_MINE                                             :Sûkermyn
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Nedich: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Nedich: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Nedich: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Nedich: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Nedich: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Nedich: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produksje lêste moanne:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportearre)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportearre)
 STR_482F_COST                                                   :{BLACK}Kostet: {YELLOW}{CURRENCY}
 
 ##id 0x5000
--- a/src/lang/unfinished/greek.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/unfinished/greek.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1047,7 +1047,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Αυτόματη Ανανέωση με τα ελάχιστα απαιτοÏμενα χÏήματα: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}ΔιάÏκεια μηνÏματος σφάλματος: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Εμφάνιση Ï€Î»Î·Î¸Ï…ÏƒÎ¼Î¿Ï Ï€ÏŒÎ»Î·Ï‚ στο όνομα της πόλης: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}ΑόÏατα δέντÏα (με διαφανή κτίÏια): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}ΓεννήτÏια Γης: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Αυθεντικό
@@ -1596,13 +1595,13 @@
 STR_4826_SUGAR_MINE                                             :ΟÏυχείο ΖάχαÏης
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Απαιτεί: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Απαιτεί: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Απαιτεί: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Απαιτεί: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Απαιτεί: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Απαιτεί: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}ΠαÏαγωγή Ï€ÏοηγοÏμενου μήνα:
-STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% μεταφέÏθηκαν)
+STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% μεταφέÏθηκαν)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}ΚεντÏάÏισμα εικόνας στην πεÏιοχή της βιομηχανίας
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Îέο {STRING} υπό κατασκευή κοντά στην πόλη {TOWN}!
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Îέα {STRING} φυτεÏεται κοντά στην πόλη {TOWN}!
--- a/src/lang/unfinished/latvian.txt	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/lang/unfinished/latvian.txt	Tue Apr 15 00:47:19 2008 +0000
@@ -1039,7 +1039,6 @@
 STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Automa'tiski atjaunot minima'lo naudu kas nepiecies'ama atjaunos'anai: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Kl'u'das zin'ojuma ilgums: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Râdît pilsçtas iedzîvotâju skaitu pie pilsçtas nosaukuma: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Neredzami koki (ar caurspi'di'ga'm celtne'm): {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Parasts
 STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS                 :TerraGenesis
@@ -1558,14 +1557,14 @@
 STR_4826_SUGAR_MINE                                             :Cukura raktuve
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}Nepieciešams: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}Nepieciešams: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}Nepieciešams: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}Nepieciešams: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}Nepieciešams: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES                                               :{BLACK}Nepieciešams: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
 ############ range for requires ends
 
 ############ range for produces starts
 STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING                      :{BLACK}Krava, kas jÄapstrÄdÄ:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{BLACK}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO                     :{YELLOW}{CARGO}{STRING}{BLACK}
 ############ range for produces ends
 
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produkcija iepriekšēja mēnesī:
@@ -1774,19 +1773,6 @@
 STR_8104_AIRCRAFT                                               :lidmaðîna
 
 ##id 0x8800
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
-STR_GO_TO_TRANSFER                                              :Uz {STATION} (Pa'rvest un pan'emt kravu)
-STR_8807_GO_TO_UNLOAD                                           :Uz {STATION} (Nokraut)
-STR_GO_TO_TRANSFER_UNLOAD                                       :Uz {STATION} (Pa'rvest un atsta't tuks'u)
-STR_8808_GO_TO_LOAD                                             :Uz {STATION} (Piekraut)
-STR_GO_TO_TRANSFER_LOAD                                         :Go to {STATION} (Pa'rvest un gaidi't pilnu kravu)
-STR_880A_GO_NON_STOP_TO                                         :Bez pieturam uz {STATION}
-STR_GO_TO_NON_STOP_TRANSFER                                     :Bez pieturam uz {STATION} (Pa'rvest un pan'emt kravu)
-STR_880B_GO_NON_STOP_TO_UNLOAD                                  :Bez pieturam uz {STATION} (Nokraut)
-STR_GO_TO_NON_STOP_TRANSFER_UNLOAD                              :Bez pieturam uz {STATION} (Pa'rvest un atsta't tuks'u)
-STR_880C_GO_NON_STOP_TO_LOAD                                    :Bez pieturam uz {STATION} (Piekraut)
-STR_GO_TO_NON_STOP_TRANSFER_LOAD                                :Bez pieturam uz {STATION} (Pa'rvest un gaidi't pilnu kravu)
 STR_GO_TO_TRAIN_DEPOT                                           :Uz {TOWN} Vilcienu Depo
 
 
@@ -1796,7 +1782,6 @@
 STR_8816                                                        :{BLACK}-
 
 
-STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Serviss
 STR_882E                                                        :{WHITE}{VEHICLE}
 STR_TRAIN_MUST_BE_STOPPED                                       :{WHITE}Vilciens ja'apsta'dina kad tas ierodas depo
--- a/src/main_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/main_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -13,10 +13,10 @@
 #include "textbuf_gui.h"
 #include "viewport_func.h"
 #include "command_func.h"
-#include "news.h"
+#include "news_func.h"
 #include "town.h"
 #include "console.h"
-#include "signs.h"
+#include "signs_func.h"
 #include "waypoint.h"
 #include "variables.h"
 #include "train.h"
@@ -44,6 +44,7 @@
 #include "player_func.h"
 #include "player_gui.h"
 #include "settings_type.h"
+#include "toolbar_gui.h"
 
 #include "network/network.h"
 #include "network/network_data.h"
@@ -59,11 +60,6 @@
 
 RailType _last_built_railtype;
 RoadType _last_built_roadtype;
-static int _scengen_town_size = 1; // depress medium-sized towns per default
-
-extern void GenerateIndustries();
-extern bool GenerateTowns();
-
 bool _draw_bounding_boxes = false;
 
 
@@ -147,20 +143,6 @@
 }
 
 
-static void ToolbarPauseClick(Window *w)
-{
-	if (_networking && !_network_server) return; // only server can pause the game
-
-	if (DoCommandP(0, _pause_game ? 0 : 1, 0, NULL, CMD_PAUSE)) SndPlayFx(SND_15_BEEP);
-}
-
-static void ToolbarFastForwardClick(Window *w)
-{
-	_fast_forward ^= true;
-	SndPlayFx(SND_15_BEEP);
-}
-
-
 static void MenuClickSettings(int index)
 {
 	switch (index) {
@@ -182,7 +164,7 @@
 	MarkWholeScreenDirty();
 }
 
-static void MenuClickSaveLoad(int index)
+void MenuClickSaveLoad(int index)
 {
 	if (_game_mode == GM_EDITOR) {
 		switch (index) {
@@ -347,7 +329,7 @@
 	ShowQueryString(STR_WAYPOINT_RAW, STR_EDIT_WAYPOINT_NAME, 30, 180, NULL, CS_ALPHANUMERAL);
 }
 
-static void SelectSignTool()
+void SelectSignTool()
 {
 	if (_cursor.sprite == SPR_CURSOR_SIGN) {
 		ResetObjectToPlace();
@@ -380,12 +362,12 @@
 	}
 }
 
-static void MenuClickSmallScreenshot()
+void MenuClickSmallScreenshot()
 {
 	SetScreenshotType(SC_VIEWPORT);
 }
 
-static void MenuClickWorldScreenshot()
+void MenuClickWorldScreenshot()
 {
 	SetScreenshotType(SC_WORLD);
 }
@@ -546,6 +528,7 @@
 		num = num * 10 + 2;
 		w->height = num;
 		w->widget[0].bottom = w->widget[0].top + num - 1;
+		w->top = GetToolbarDropdownPos(0, w->width, w->height).y;
 		SetWindowDirty(w);
 	}
 }
@@ -699,26 +682,21 @@
  * @param item_count Number of strings in the list, see previous parameter
  * @param disabled_mask Bitmask of disabled strings in the list
  * @return Return a pointer to the newly created dropdown window */
-static Window *PopupMainToolbMenu(Window *w, uint16 parent_button, StringID base_string, byte item_count, byte disabled_mask)
+ Window *PopupMainToolbMenu(Window *w, uint16 parent_button, StringID base_string, byte item_count, byte disabled_mask)
 {
-	int width;
-	int x = w->widget[GB(parent_button, 0, 8)].left;
-
 	assert(disabled_mask == 0 || item_count <= 8);
 	w->LowerWidget(parent_button);
 	w->InvalidateWidget(parent_button);
 
 	DeleteWindowById(WC_TOOLBAR_MENU, 0);
 
-	/* Extend the dropdown toolbar to the longest string in the list and
-	 * also make sure the dropdown is fully visible within the window.
-	 * x + w->left because x is supposed to be the offset of the toolbar-button
-	 * we clicked on and w->left the toolbar window itself. So meaning that
-	 * the default position is aligned with the left side of the clicked button */
-	width = max(GetStringListMaxWidth(base_string, item_count) + 6, 140);
-	x = w->left + Clamp(x, 0, w->width - width); // or alternatively '_screen.width - width'
+	// Extend the dropdown toolbar to the longest string in the list
+	int width = max(GetStringListMaxWidth(base_string, item_count) + 6, 140);
+	int height = item_count * 10 + 2;
 
-	w = AllocateWindow(x, 22, width, item_count * 10 + 2, MenuWndProc, WC_TOOLBAR_MENU, _menu_widgets);
+	Point pos = GetToolbarDropdownPos(parent_button, width, height);
+
+	w = AllocateWindow(pos.x, pos.y, width, height, MenuWndProc, WC_TOOLBAR_MENU, _menu_widgets);
 	w->widget[0].bottom = item_count * 10 + 1;
 	w->flags4 &= ~WF_WHITE_BORDER_MASK;
 
@@ -736,15 +714,14 @@
 	return w;
 }
 
-static Window *PopupMainPlayerToolbMenu(Window *w, int main_button, int gray)
+Window *PopupMainPlayerToolbMenu(Window *w, int main_button, int gray)
 {
-	int x = w->widget[main_button].left + w->left;
-
 	w->LowerWidget(main_button);
 	w->InvalidateWidget(main_button);
 
 	DeleteWindowById(WC_TOOLBAR_MENU, 0);
-	w = AllocateWindow(x, 0x16, 0xF1, 0x52, PlayerMenuWndProc, WC_TOOLBAR_MENU, _player_menu_widgets);
+	Point pos = GetToolbarDropdownPos(main_button, 241, 82);
+	w = AllocateWindow(pos.x, pos.y, 241, 82, PlayerMenuWndProc, WC_TOOLBAR_MENU, _player_menu_widgets);
 	w->flags4 &= ~WF_WHITE_BORDER_MASK;
 	WP(w, menu_d).item_count = 0;
 	WP(w, menu_d).sel_index = (_local_player != PLAYER_SPECTATOR) ? _local_player : GetPlayerIndexFromMenu(0);
@@ -765,101 +742,6 @@
 	return w;
 }
 
-static void ToolbarSaveClick(Window *w)
-{
-	PopupMainToolbMenu(w, 3, STR_015C_SAVE_GAME, 4, 0);
-}
-
-static void ToolbarMapClick(Window *w)
-{
-	PopupMainToolbMenu(w, 4, STR_02DE_MAP_OF_WORLD, 3, 0);
-}
-
-static void ToolbarTownClick(Window *w)
-{
-	PopupMainToolbMenu(w, 5, STR_02BB_TOWN_DIRECTORY, 1, 0);
-}
-
-static void ToolbarSubsidiesClick(Window *w)
-{
-	PopupMainToolbMenu(w, 6, STR_02DD_SUBSIDIES, 1, 0);
-}
-
-static void ToolbarStationsClick(Window *w)
-{
-	PopupMainPlayerToolbMenu(w, 7, 0);
-}
-
-static void ToolbarMoneyClick(Window *w)
-{
-	PopupMainPlayerToolbMenu(w, 8, 0);
-}
-
-static void ToolbarPlayersClick(Window *w)
-{
-	PopupMainPlayerToolbMenu(w, 9, 0);
-}
-
-static void ToolbarGraphsClick(Window *w)
-{
-	PopupMainToolbMenu(w, 10, STR_0154_OPERATING_PROFIT_GRAPH, 6, 0);
-}
-
-static void ToolbarLeagueClick(Window *w)
-{
-	PopupMainToolbMenu(w, 11, STR_015A_COMPANY_LEAGUE_TABLE, 2, 0);
-}
-
-static void ToolbarIndustryClick(Window *w)
-{
-	/* Disable build-industry menu if we are a spectator */
-	PopupMainToolbMenu(w, 12, STR_INDUSTRY_DIR, 2, (_current_player == PLAYER_SPECTATOR) ? (1 << 1) : 0);
-}
-
-static void ToolbarTrainClick(Window *w)
-{
-	const Vehicle *v;
-	int dis = -1;
-
-	FOR_ALL_VEHICLES(v) {
-		if (v->type == VEH_TRAIN && IsFrontEngine(v)) ClrBit(dis, v->owner);
-	}
-	PopupMainPlayerToolbMenu(w, 13, dis);
-}
-
-static void ToolbarRoadClick(Window *w)
-{
-	const Vehicle *v;
-	int dis = -1;
-
-	FOR_ALL_VEHICLES(v) {
-		if (v->type == VEH_ROAD && IsRoadVehFront(v)) ClrBit(dis, v->owner);
-	}
-	PopupMainPlayerToolbMenu(w, 14, dis);
-}
-
-static void ToolbarShipClick(Window *w)
-{
-	const Vehicle *v;
-	int dis = -1;
-
-	FOR_ALL_VEHICLES(v) {
-		if (v->type == VEH_SHIP) ClrBit(dis, v->owner);
-	}
-	PopupMainPlayerToolbMenu(w, 15, dis);
-}
-
-static void ToolbarAirClick(Window *w)
-{
-	const Vehicle *v;
-	int dis = -1;
-
-	FOR_ALL_VEHICLES(v) {
-		if (v->type == VEH_AIRCRAFT) ClrBit(dis, v->owner);
-	}
-	PopupMainPlayerToolbMenu(w, 16, dis);
-}
-
 /* Zooms a viewport in a window in or out */
 /* No button handling or what so ever */
 bool DoZoomInOutWindow(int how, Window *w)
@@ -904,152 +786,16 @@
 	return true;
 }
 
-static void ToolbarZoomInClick(Window *w)
-{
-	if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
-		w->HandleButtonClick(17);
-		SndPlayFx(SND_15_BEEP);
-	}
-}
-
-static void ToolbarZoomOutClick(Window *w)
-{
-	if (DoZoomInOutWindow(ZOOM_OUT,FindWindowById(WC_MAIN_WINDOW, 0))) {
-		w->HandleButtonClick(18);
-		SndPlayFx(SND_15_BEEP);
-	}
-}
-
-static void ToolbarBuildRailClick(Window *w)
-{
-	const Player *p = GetPlayer(_local_player);
-	Window *w2 = PopupMainToolbMenu(w, 19, STR_1015_RAILROAD_CONSTRUCTION, RAILTYPE_END, ~p->avail_railtypes);
-	WP(w2, menu_d).sel_index = _last_built_railtype;
-}
-
-static void ToolbarBuildRoadClick(Window *w)
-{
-	const Player *p = GetPlayer(_local_player);
-	/* The standard road button is *always* available */
-	Window *w2 = PopupMainToolbMenu(w, 20, STR_180A_ROAD_CONSTRUCTION, 2, ~(p->avail_roadtypes | ROADTYPES_ROAD));
-	WP(w2, menu_d).sel_index = _last_built_roadtype;
-}
-
-static void ToolbarBuildWaterClick(Window *w)
-{
-	PopupMainToolbMenu(w, 21, STR_9800_DOCK_CONSTRUCTION, 1, 0);
-}
-
-static void ToolbarBuildAirClick(Window *w)
-{
-	PopupMainToolbMenu(w, 22, STR_A01D_AIRPORT_CONSTRUCTION, 1, 0);
-}
-
-static void ToolbarForestClick(Window *w)
-{
-	PopupMainToolbMenu(w, 23, STR_LANDSCAPING, 3, 0);
-}
-
-static void ToolbarMusicClick(Window *w)
-{
-	PopupMainToolbMenu(w, 24, STR_01D3_SOUND_MUSIC, 1, 0);
-}
-
-static void ToolbarNewspaperClick(Window *w)
-{
-	PopupMainToolbMenu(w, 25, STR_0200_LAST_MESSAGE_NEWS_REPORT, 3, 0);
-}
-
-static void ToolbarHelpClick(Window *w)
-{
-	PopupMainToolbMenu(w, 26, STR_02D5_LAND_BLOCK_INFO, 6, 0);
-}
-
-static void ToolbarOptionsClick(Window *w)
-{
-	uint16 x = 0;
-
-	w = PopupMainToolbMenu(w, 2, STR_02C4_GAME_OPTIONS, 14, 0);
-
-	if (HasBit(_display_opt, DO_SHOW_TOWN_NAMES))    SetBit(x,  6);
-	if (HasBit(_display_opt, DO_SHOW_STATION_NAMES)) SetBit(x,  7);
-	if (HasBit(_display_opt, DO_SHOW_SIGNS))         SetBit(x,  8);
-	if (HasBit(_display_opt, DO_WAYPOINTS))          SetBit(x,  9);
-	if (HasBit(_display_opt, DO_FULL_ANIMATION))     SetBit(x, 10);
-	if (HasBit(_display_opt, DO_FULL_DETAIL))        SetBit(x, 11);
-	if (IsTransparencySet(TO_HOUSES))                SetBit(x, 12);
-	if (IsTransparencySet(TO_SIGNS))                 SetBit(x, 13);
-	WP(w, menu_d).checked_items = x;
-}
-
-
-static void ToolbarScenSaveOrLoad(Window *w)
-{
-	PopupMainToolbMenu(w, 3, STR_0292_SAVE_SCENARIO, 6, 0);
-}
-
-static void ToolbarScenDateBackward(Window *w)
-{
-	/* don't allow too fast scrolling */
-	if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
-		w->HandleButtonClick(6);
-		SetWindowDirty(w);
-
-		_patches_newgame.starting_year = Clamp(_patches_newgame.starting_year - 1, MIN_YEAR, MAX_YEAR);
-		SetDate(ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
-	}
-	_left_button_clicked = false;
-}
-
-static void ToolbarScenDateForward(Window *w)
-{
-	/* don't allow too fast scrolling */
-	if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
-		w->HandleButtonClick(7);
-		SetWindowDirty(w);
-
-		_patches_newgame.starting_year = Clamp(_patches_newgame.starting_year + 1, MIN_YEAR, MAX_YEAR);
-		SetDate(ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
-	}
-	_left_button_clicked = false;
-}
-
-static void ToolbarScenMapTownDir(Window *w)
-{
-	/* Scenario editor button, *hack*hack* use different button to activate */
-	PopupMainToolbMenu(w, 8 | (17 << 8), STR_02DE_MAP_OF_WORLD, 4, 0);
-}
-
-static void ToolbarScenZoomIn(Window *w)
-{
-	if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
-		w->HandleButtonClick(9);
-		SndPlayFx(SND_15_BEEP);
-	}
-}
-
-static void ToolbarScenZoomOut(Window *w)
-{
-	if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) {
-		w->HandleButtonClick(10);
-		SndPlayFx(SND_15_BEEP);
-	}
-}
-
 void ZoomInOrOutToCursorWindow(bool in, Window *w)
 {
-	ViewPort *vp;
-	Point pt;
-
-	assert(w != 0);
-
-	vp = w->viewport;
+	assert(w != NULL);
 
 	if (_game_mode != GM_MENU) {
+		ViewPort *vp = w->viewport;
 		if ((in && vp->zoom == ZOOM_LVL_MIN) || (!in && vp->zoom == ZOOM_LVL_MAX))
 			return;
 
-		pt = GetTileZoomCenterWindow(in,w);
+		Point pt = GetTileZoomCenterWindow(in,w);
 		if (pt.x != -1) {
 			ScrollWindowTo(pt.x, pt.y, w, true);
 
@@ -1058,608 +804,6 @@
 	}
 }
 
-static void ToolbarScenGenLand(Window *w)
-{
-	w->HandleButtonClick(11);
-	SndPlayFx(SND_15_BEEP);
-
-	ShowEditorTerraformToolbar();
-}
-
-void CcBuildTown(bool success, TileIndex tile, uint32 p1, uint32 p2)
-{
-	if (success) {
-		SndPlayTileFx(SND_1F_SPLAT, tile);
-		ResetObjectToPlace();
-	}
-}
-
-static void PlaceProc_Town(TileIndex tile)
-{
-	uint32 size = min(_scengen_town_size, (int)TSM_CITY);
-	uint32 mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
-	DoCommandP(tile, size, mode, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
-}
-
-
-static const Widget _scen_edit_town_gen_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                 STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_0233_TOWN_GENERATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{  WWT_STICKYBOX,   RESIZE_NONE,     7,   148,   159,     0,    13, 0x0,                      STR_STICKY_BUTTON},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   159,    14,    94, 0x0,                      STR_NULL},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    16,    27, STR_0234_NEW_TOWN,        STR_0235_CONSTRUCT_NEW_TOWN},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    29,    40, STR_023D_RANDOM_TOWN,     STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    42,    53, STR_MANY_RANDOM_TOWNS,    STR_RANDOM_TOWNS_TIP},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,    53,    68,    79, STR_02A1_SMALL,           STR_02A4_SELECT_TOWN_SIZE},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    54,   105,    68,    79, STR_02A2_MEDIUM,          STR_02A4_SELECT_TOWN_SIZE},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,   106,   157,    68,    79, STR_02A3_LARGE,           STR_02A4_SELECT_TOWN_SIZE},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    81,    92, STR_SCENARIO_EDITOR_CITY, STR_02A4_SELECT_TOWN_SIZE},
-{      WWT_LABEL,   RESIZE_NONE,     7,     0,   147,    54,    67, STR_02A5_TOWN_SIZE,       STR_NULL},
-{   WIDGETS_END},
-};
-
-static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-	case WE_PAINT:
-		DrawWindowWidgets(w);
-		break;
-
-	case WE_CREATE:
-		w->LowerWidget(_scengen_town_size + 7);
-		break;
-
-	case WE_CLICK:
-		switch (e->we.click.widget) {
-		case 4: // new town
-			HandlePlacePushButton(w, 4, SPR_CURSOR_TOWN, VHM_RECT, PlaceProc_Town);
-			break;
-		case 5: {// random town
-			Town *t;
-			uint size = min(_scengen_town_size, (int)TSM_CITY);
-			TownSizeMode mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
-
-			w->HandleButtonClick(5);
-			_generating_world = true;
-			t = CreateRandomTown(20, mode, size);
-			_generating_world = false;
-
-			if (t == NULL) {
-				ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
-			} else {
-				ScrollMainWindowToTile(t->xy);
-			}
-
-			break;
-		}
-		case 6: {// many random towns
-			w->HandleButtonClick(6);
-
-			_generating_world = true;
-			if (!GenerateTowns()) ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
-			_generating_world = false;
-			break;
-		}
-
-		case 7: case 8: case 9: case 10:
-			w->RaiseWidget(_scengen_town_size + 7);
-			_scengen_town_size = e->we.click.widget - 7;
-			w->LowerWidget(_scengen_town_size + 7);
-			SetWindowDirty(w);
-			break;
-		}
-		break;
-
-	case WE_TIMEOUT:
-		w->RaiseWidget(5);
-		w->RaiseWidget(6);
-		SetWindowDirty(w);
-		break;
-	case WE_PLACE_OBJ:
-		_place_proc(e->we.place.tile);
-		break;
-	case WE_ABORT_PLACE_OBJ:
-		w->RaiseButtons();
-		w->LowerWidget(_scengen_town_size + 7);
-		SetWindowDirty(w);
-		break;
-	}
-}
-
-static const WindowDesc _scen_edit_town_gen_desc = {
-	WDP_AUTO, WDP_AUTO, 160, 95, 160, 95,
-	WC_SCEN_TOWN_GEN, WC_NONE,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
-	_scen_edit_town_gen_widgets,
-	ScenEditTownGenWndProc,
-};
-
-static void ToolbarScenGenTown(Window *w)
-{
-	w->HandleButtonClick(12);
-	SndPlayFx(SND_15_BEEP);
-
-	AllocateWindowDescFront(&_scen_edit_town_gen_desc, 0);
-}
-
-static void ToolbarScenGenIndustry(Window *w)
-{
-	w->HandleButtonClick(13);
-	SndPlayFx(SND_15_BEEP);
-	ShowBuildIndustryWindow();
-}
-
-static void ToolbarScenBuildRoad(Window *w)
-{
-	w->HandleButtonClick(14);
-	SndPlayFx(SND_15_BEEP);
-	ShowBuildRoadScenToolbar();
-}
-
-static void ToolbarScenPlantTrees(Window *w)
-{
-	w->HandleButtonClick(15);
-	SndPlayFx(SND_15_BEEP);
-	ShowBuildTreesScenToolbar();
-}
-
-static void ToolbarScenPlaceSign(Window *w)
-{
-	w->HandleButtonClick(16);
-	SndPlayFx(SND_15_BEEP);
-	SelectSignTool();
-}
-
-static void ToolbarBtn_NULL(Window *w)
-{
-}
-
-
-typedef void ToolbarButtonProc(Window *w);
-
-static ToolbarButtonProc * const _toolbar_button_procs[] = {
-	ToolbarPauseClick,
-	ToolbarFastForwardClick,
-	ToolbarOptionsClick,
-	ToolbarSaveClick,
-	ToolbarMapClick,
-	ToolbarTownClick,
-	ToolbarSubsidiesClick,
-	ToolbarStationsClick,
-	ToolbarMoneyClick,
-	ToolbarPlayersClick,
-	ToolbarGraphsClick,
-	ToolbarLeagueClick,
-	ToolbarIndustryClick,
-	ToolbarTrainClick,
-	ToolbarRoadClick,
-	ToolbarShipClick,
-	ToolbarAirClick,
-	ToolbarZoomInClick,
-	ToolbarZoomOutClick,
-	ToolbarBuildRailClick,
-	ToolbarBuildRoadClick,
-	ToolbarBuildWaterClick,
-	ToolbarBuildAirClick,
-	ToolbarForestClick,
-	ToolbarMusicClick,
-	ToolbarNewspaperClick,
-	ToolbarHelpClick,
-};
-
-static void MainToolbarWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-	case WE_PAINT:
-		/* Draw brown-red toolbar bg. */
-		GfxFillRect(0, 0, w->width-1, w->height-1, 0xB2);
-		GfxFillRect(0, 0, w->width-1, w->height-1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
-
-		/* If spectator, disable all construction buttons
-		 * ie : Build road, rail, ships, airports and landscaping
-		 * Since enabled state is the default, just disable when needed */
-		w->SetWidgetsDisabledState(_current_player == PLAYER_SPECTATOR, 19, 20, 21, 22, 23, WIDGET_LIST_END);
-		/* disable company list drop downs, if there are no companies */
-		w->SetWidgetsDisabledState(ActivePlayerCount() == 0, 7, 8, 13, 14, 15, 16, WIDGET_LIST_END);
-
-		w->SetWidgetDisabledState(19, !CanBuildVehicleInfrastructure(VEH_TRAIN));
-		w->SetWidgetDisabledState(22, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
-
-		DrawWindowWidgets(w);
-		break;
-
-	case WE_CLICK: {
-		if (_game_mode != GM_MENU && !w->IsWidgetDisabled(e->we.click.widget))
-			_toolbar_button_procs[e->we.click.widget](w);
-	} break;
-
-	case WE_KEYPRESS: {
-		switch (e->we.keypress.keycode) {
-		case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break;
-		case WKC_F2: ShowGameOptions(); break;
-		case WKC_F3: MenuClickSaveLoad(0); break;
-		case WKC_F4: ShowSmallMap(); break;
-		case WKC_F5: ShowTownDirectory(); break;
-		case WKC_F6: ShowSubsidiesList(); break;
-		case WKC_F7: ShowPlayerStations(_local_player); break;
-		case WKC_F8: ShowPlayerFinances(_local_player); break;
-		case WKC_F9: ShowPlayerCompany(_local_player); break;
-		case WKC_F10: ShowOperatingProfitGraph(); break;
-		case WKC_F11: ShowCompanyLeagueTable(); break;
-		case WKC_F12: ShowBuildIndustryWindow(); break;
-		case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_player, VEH_TRAIN); break;
-		case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_player, VEH_ROAD); break;
-		case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_player, VEH_SHIP); break;
-		case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_player, VEH_AIRCRAFT); break;
-		case WKC_NUM_PLUS: // Fall through
-		case WKC_EQUALS: // Fall through
-		case WKC_SHIFT | WKC_EQUALS: // Fall through
-		case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
-		case WKC_NUM_MINUS: // Fall through
-		case WKC_MINUS: // Fall through
-		case WKC_SHIFT | WKC_MINUS: // Fall through
-		case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
-		case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break;
-		case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break;
-		case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break;
-		case WKC_SHIFT | WKC_F10: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break;
-		case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break;
-		case WKC_SHIFT | WKC_F12: ShowMusicWindow(); break;
-		case WKC_CTRL  | 'S': MenuClickSmallScreenshot(); break;
-		case WKC_CTRL  | 'G': MenuClickWorldScreenshot(); break;
-		case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break;
-		case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; // Invoke Autorail
-		case 'L': ShowTerraformToolbar(); break;
-		case 'M': ShowSmallMap(); break;
-		case 'V': ShowExtraViewPortWindow(); break;
-		default: return;
-		}
-		e->we.keypress.cont = false;
-	} break;
-
-	case WE_PLACE_OBJ: {
-		_place_proc(e->we.place.tile);
-	} break;
-
-	case WE_ABORT_PLACE_OBJ: {
-		w->RaiseWidget(25);
-		SetWindowDirty(w);
-	} break;
-
-	case WE_MOUSELOOP:
-		if (w->IsWidgetLowered(0) != !!_pause_game) {
-			w->ToggleWidgetLoweredState(0);
-			w->InvalidateWidget(0);
-		}
-
-		if (w->IsWidgetLowered(1) != !!_fast_forward) {
-			w->ToggleWidgetLoweredState(1);
-			w->InvalidateWidget(1);
-		}
-		break;
-
-	case WE_RESIZE: {
-		/* There are 27 buttons plus some spacings if the space allows it */
-		uint button_width;
-		uint spacing;
-		if (w->width >= 27 * 22) {
-			button_width = 22;
-			spacing = w->width - (27 * button_width);
-		} else {
-			button_width = w->width / 27;
-			spacing = 0;
-		}
-		uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
-
-		for (uint i = 0, x = 0, j = 0; i < 27; i++) {
-			if (extra_spacing_at[j] == i) {
-				j++;
-				uint add = spacing / (lengthof(extra_spacing_at) - j);
-				spacing -= add;
-				x += add;
-			}
-
-			w->widget[i].left = x;
-			x += (spacing != 0) ? button_width : (w->width - x) / (27 - i);
-			w->widget[i].right = x - 1;
-		}
-	} break;
-
-	case WE_TIMEOUT: {
-		uint i;
-		for (i = 2; i < w->widget_count; i++) {
-			if (w->IsWidgetLowered(i)) {
-				w->RaiseWidget(i);
-				w->InvalidateWidget(i);
-			}
-		}
-		break;
-	}
-
-		case WE_MESSAGE:
-			if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 17, 18);
-			break;
-	}
-}
-
-static const Widget _toolb_normal_widgets[] = {
-{     WWT_IMGBTN,   RESIZE_LEFT,    14,     0,     0,     0,    21, SPR_IMG_PAUSE,           STR_0171_PAUSE_GAME},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_FASTFORWARD,     STR_FAST_FORWARD},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SETTINGS,        STR_0187_OPTIONS},
-{   WWT_IMGBTN_2,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SAVE,            STR_0172_SAVE_GAME_ABANDON_GAME},
-
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SMALLMAP,        STR_0174_DISPLAY_MAP},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_TOWN,            STR_0176_DISPLAY_TOWN_DIRECTORY},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SUBSIDIES,       STR_02DC_DISPLAY_SUBSIDIES},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_COMPANY_LIST,    STR_0173_DISPLAY_LIST_OF_COMPANY},
-
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_COMPANY_FINANCE, STR_0177_DISPLAY_COMPANY_FINANCES},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_COMPANY_GENERAL, STR_0178_DISPLAY_COMPANY_GENERAL},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_GRAPHS,          STR_0179_DISPLAY_GRAPHS},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_COMPANY_LEAGUE,  STR_017A_DISPLAY_COMPANY_LEAGUE},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_INDUSTRY,        STR_0312_FUND_CONSTRUCTION_OF_NEW},
-
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_TRAINLIST,       STR_017B_DISPLAY_LIST_OF_COMPANY},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_TRUCKLIST,       STR_017C_DISPLAY_LIST_OF_COMPANY},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SHIPLIST,        STR_017D_DISPLAY_LIST_OF_COMPANY},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_AIRPLANESLIST,   STR_017E_DISPLAY_LIST_OF_COMPANY},
-
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_ZOOMIN,          STR_017F_ZOOM_THE_VIEW_IN},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_ZOOMOUT,         STR_0180_ZOOM_THE_VIEW_OUT},
-
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_BUILDRAIL,       STR_0181_BUILD_RAILROAD_TRACK},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_BUILDROAD,       STR_0182_BUILD_ROADS},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_BUILDWATER,      STR_0183_BUILD_SHIP_DOCKS},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_BUILDAIR,        STR_0184_BUILD_AIRPORTS},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_LANDSCAPING,     STR_LANDSCAPING_TOOLBAR_TIP}, // tree icon is 0x2E6
-
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_MUSIC,           STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_MESSAGES,        STR_0203_SHOW_LAST_MESSAGE_NEWS},
-{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_QUERY,           STR_0186_LAND_BLOCK_INFORMATION},
-{   WIDGETS_END},
-};
-
-static const WindowDesc _toolb_normal_desc = {
-	0, 0, 0, 22, 640, 22,
-	WC_MAIN_TOOLBAR, WC_NONE,
-	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET,
-	_toolb_normal_widgets,
-	MainToolbarWndProc
-};
-
-
-static const Widget _toolb_scen_widgets[] = {
-{  WWT_IMGBTN, RESIZE_LEFT, 14,   0,   0,  0, 21, SPR_IMG_PAUSE,       STR_0171_PAUSE_GAME},
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_SETTINGS,    STR_0187_OPTIONS},
-{WWT_IMGBTN_2, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_SAVE,        STR_0297_SAVE_SCENARIO_LOAD_SCENARIO},
-
-{   WWT_PANEL, RESIZE_NONE, 14,   0,   0,  0, 21, 0x0,                 STR_NULL},
-
-{   WWT_PANEL, RESIZE_NONE, 14,   0, 129,  0, 21, 0x0,                 STR_NULL},
-{  WWT_IMGBTN, RESIZE_NONE, 14,   3,  14,  5, 16, SPR_ARROW_DOWN,      STR_029E_MOVE_THE_STARTING_DATE},
-{  WWT_IMGBTN, RESIZE_NONE, 14, 113, 125,  5, 16, SPR_ARROW_UP,        STR_029F_MOVE_THE_STARTING_DATE},
-
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_SMALLMAP,    STR_0175_DISPLAY_MAP_TOWN_DIRECTORY},
-
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_ZOOMIN,      STR_017F_ZOOM_THE_VIEW_IN},
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_ZOOMOUT,     STR_0180_ZOOM_THE_VIEW_OUT},
-
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_LANDSCAPING, STR_022E_LANDSCAPE_GENERATION},
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_TOWN,        STR_022F_TOWN_GENERATION},
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_INDUSTRY,    STR_0230_INDUSTRY_GENERATION},
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_BUILDROAD,   STR_0231_ROAD_CONSTRUCTION},
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_PLANTTREES,  STR_0288_PLANT_TREES},
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_SIGN,        STR_0289_PLACE_SIGN},
-
-{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
-{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
-{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
-{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
-{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
-{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
-{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_MUSIC,       STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
-{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
-{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_QUERY,       STR_0186_LAND_BLOCK_INFORMATION},
-{WIDGETS_END},
-};
-
-static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
-	ToolbarPauseClick,
-	ToolbarFastForwardClick,
-	ToolbarOptionsClick,
-	ToolbarScenSaveOrLoad,
-	ToolbarBtn_NULL,
-	ToolbarBtn_NULL,
-	ToolbarScenDateBackward,
-	ToolbarScenDateForward,
-	ToolbarScenMapTownDir,
-	ToolbarScenZoomIn,
-	ToolbarScenZoomOut,
-	ToolbarScenGenLand,
-	ToolbarScenGenTown,
-	ToolbarScenGenIndustry,
-	ToolbarScenBuildRoad,
-	ToolbarScenPlantTrees,
-	ToolbarScenPlaceSign,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	ToolbarMusicClick,
-	NULL,
-	ToolbarHelpClick,
-};
-
-static void ScenEditToolbarWndProc(Window *w, WindowEvent *e)
-{
-	switch (e->event) {
-	case WE_PAINT:
-		w->SetWidgetDisabledState(6, _patches_newgame.starting_year <= MIN_YEAR);
-		w->SetWidgetDisabledState(7, _patches_newgame.starting_year >= MAX_YEAR);
-
-		/* Draw brown-red toolbar bg. */
-		GfxFillRect(0, 0, w->width-1, w->height-1, 0xB2);
-		GfxFillRect(0, 0, w->width-1, w->height-1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
-
-		DrawWindowWidgets(w);
-
-		SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
-		DrawStringCenteredTruncated(w->widget[6].right, w->widget[7].left, 6, STR_00AF, TC_FROMSTRING);
-
-		/* We hide this panel when the toolbar space gets too small */
-		if (w->widget[4].left != w->widget[4].right) {
-			DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1,  1, STR_0221_OPENTTD, TC_FROMSTRING);
-			DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 11, STR_0222_SCENARIO_EDITOR, TC_FROMSTRING);
-		}
-
-		break;
-
-	case WE_CLICK: {
-		if (_game_mode == GM_MENU) return;
-		_scen_toolbar_button_procs[e->we.click.widget](w);
-	} break;
-
-	case WE_KEYPRESS:
-		switch (e->we.keypress.keycode) {
-			case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break;
-			case WKC_F2: ShowGameOptions(); break;
-			case WKC_F3: MenuClickSaveLoad(0); break;
-			case WKC_F4: ToolbarScenGenLand(w); break;
-			case WKC_F5: ToolbarScenGenTown(w); break;
-			case WKC_F6: ToolbarScenGenIndustry(w); break;
-			case WKC_F7: ToolbarScenBuildRoad(w); break;
-			case WKC_F8: ToolbarScenPlantTrees(w); break;
-			case WKC_F9: ToolbarScenPlaceSign(w); break;
-			case WKC_F10: ShowMusicWindow(); break;
-			case WKC_F11: PlaceLandBlockInfo(); break;
-			case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break;
-			case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break;
-
-			/* those following are all fall through */
-			case WKC_NUM_PLUS:
-			case WKC_EQUALS:
-			case WKC_SHIFT | WKC_EQUALS:
-			case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
-
-			/* those following are all fall through */
-			case WKC_NUM_MINUS:
-			case WKC_MINUS:
-			case WKC_SHIFT | WKC_MINUS:
-			case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
-
-			case 'L': ShowEditorTerraformToolbar(); break;
-			case 'M': ShowSmallMap(); break;
-			case 'V': ShowExtraViewPortWindow(); break;
-			default: return;
-		}
-		e->we.keypress.cont = false;
-		break;
-
-	case WE_PLACE_OBJ: {
-		_place_proc(e->we.place.tile);
-	} break;
-
-	case WE_ABORT_PLACE_OBJ: {
-		w->RaiseWidget(25);
-		SetWindowDirty(w);
-	} break;
-
-	case WE_RESIZE: {
-		/* There are 15 buttons plus some spacings if the space allows it.
-		 * Furthermore there are two panels of which one is non-essential
-		 * and that one can be removed is the space is too small. */
-		uint buttons_width;
-		uint spacing;
-
-		static int normal_min_width = (15 * 22) + (2 * 130);
-		static int one_less_panel_min_width = (15 * 22) + 130;
-
-		if (w->width >= one_less_panel_min_width) {
-			buttons_width = 15 * 22;
-			spacing = w->width - ((w->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width);
-		} else {
-			buttons_width = w->width - 130;
-			spacing = 0;
-		}
-		uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 16, 0 };
-
-		/* Yes, it defines about 27 widgets for this toolbar */
-		for (uint i = 0, x = 0, j = 0, b = 0; i < 27; i++) {
-			switch (i) {
-				case 4:
-					w->widget[i].left = x;
-					if (w->width < normal_min_width) {
-						w->widget[i].right = x;
-						j++;
-						continue;
-					}
-
-					x += 130;
-					w->widget[i].right = x - 1;
-					break;
-
-				case 5: {
-					int offset = x - w->widget[i].left;
-					w->widget[i + 1].left  += offset;
-					w->widget[i + 1].right += offset;
-					w->widget[i + 2].left  += offset;
-					w->widget[i + 2].right += offset;
-					w->widget[i].left = x;
-					x += 130;
-					w->widget[i].right = x - 1;
-					i += 2;
-				} break;
-
-				default:
-					if (w->widget[i].bottom == 0) continue;
-
-					w->widget[i].left = x;
-					x += buttons_width / (15 - b);
-					w->widget[i].right = x - 1;
-					buttons_width -= buttons_width / (15 - b);
-					b++;
-					break;
-			}
-
-			if (extra_spacing_at[j] == i) {
-				j++;
-				uint add = spacing / (lengthof(extra_spacing_at) - j);
-				spacing -= add;
-				x += add;
-			}
-		}
-	} break;
-
-	case WE_MOUSELOOP:
-		if (w->IsWidgetLowered(0) != !!_pause_game) {
-			w->ToggleWidgetLoweredState(0);
-			SetWindowDirty(w);
-		}
-
-		if (w->IsWidgetLowered(1) != !!_fast_forward) {
-			w->ToggleWidgetLoweredState(1);
-			SetWindowDirty(w);
-		}
-		break;
-
-		case WE_MESSAGE:
-			HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 9, 10);
-			break;
-	}
-}
-
-static const WindowDesc _toolb_scen_desc = {
-	0, 0, 130, 22, 640, 22,
-	WC_MAIN_TOOLBAR, WC_NONE,
-	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
-	_toolb_scen_widgets,
-	ScenEditToolbarWndProc
-};
 
 extern GetNewsStringCallbackProc * const _get_news_string_callback[];
 
@@ -1923,6 +1067,19 @@
 				MarkWholeScreenDirty();
 				break;
 
+			case '1' | WKC_CTRL | WKC_SHIFT:
+			case '2' | WKC_CTRL | WKC_SHIFT:
+			case '3' | WKC_CTRL | WKC_SHIFT:
+			case '4' | WKC_CTRL | WKC_SHIFT:
+			case '5' | WKC_CTRL | WKC_SHIFT:
+			case '6' | WKC_CTRL | WKC_SHIFT:
+			case '7' | WKC_CTRL | WKC_SHIFT:
+			case '8' | WKC_CTRL | WKC_SHIFT:
+				/* Invisibility toggle hot keys */
+				ToggleInvisibilityWithTransparency((TransparencyOption)(e->we.keypress.keycode - ('1' | WKC_CTRL | WKC_SHIFT)));
+				MarkWholeScreenDirty();
+				break;
+
 			case 'X' | WKC_CTRL:
 				ShowTransparencyToolbar();
 				break;
@@ -2036,9 +1193,7 @@
 
 void ShowVitalWindows()
 {
-	Window *w;
-
-	w = AllocateWindowDesc((_game_mode != GM_EDITOR) ? &_toolb_normal_desc : &_toolb_scen_desc);
+	Window *w = AllocateToolbar();
 	DoZoomInOutWindow(ZOOM_NONE, w);
 
 	CLRBITS(w->flags4, WF_WHITE_BORDER_MASK);
@@ -2059,6 +1214,10 @@
 	WP(w, def_d).data_1 = -1280;
 }
 
+/**
+ * Size of the application screen changed.
+ * Adapt the game screen-size, re-allocate the open windows, and repaint everything
+ */
 void GameSizeChanged()
 {
 	_cur_resolution[0] = _screen.width;
--- a/src/misc.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/misc.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -6,9 +6,8 @@
 #include "openttd.h"
 #include "currency.h"
 #include "landscape.h"
-#include "news.h"
+#include "news_func.h"
 #include "saveload.h"
-#include "engine.h"
 #include "vehicle_gui.h"
 #include "variables.h"
 #include "ai/ai.h"
@@ -482,9 +481,8 @@
 {
 	Cheat* cht = (Cheat*)&_cheats;
 	uint count = SlGetFieldLength() / 2;
-	uint i;
 
-	for (i = 0; i < count; i++) {
+	for (uint i = 0; i < count; i++) {
 		cht[i].been_used = (SlReadByte() != 0);
 		cht[i].value     = (SlReadByte() != 0);
 	}
--- a/src/misc_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/misc_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -54,20 +54,20 @@
  */
 CommandCost CmdSetPlayerColor(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Player *p, *pp;
-	byte colour;
+	if (p2 >= 16) return CMD_ERROR; // max 16 colours
+
+	byte colour = p2;
+
 	LiveryScheme scheme = (LiveryScheme)GB(p1, 0, 8);
 	byte state = GB(p1, 8, 2);
 
-	if (p2 >= 16) return CMD_ERROR; // max 16 colours
-	colour = p2;
-
 	if (scheme >= LS_END || state >= 3) return CMD_ERROR;
 
-	p = GetPlayer(_current_player);
+	Player *p = GetPlayer(_current_player);
 
 	/* Ensure no two companies have the same primary colour */
 	if (scheme == LS_DEFAULT && state == 0) {
+		const Player *pp;
 		FOR_ALL_PLAYERS(pp) {
 			if (pp->is_active && pp != p && pp->player_color == colour) return CMD_ERROR;
 		}
@@ -225,14 +225,12 @@
  */
 CommandCost CmdChangeCompanyName(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Player *p;
-
 	if (StrEmpty(_cmd_text)) return CMD_ERROR;
 
 	if (!IsUniqueCompanyName(_cmd_text)) return_cmd_error(STR_NAME_MUST_BE_UNIQUE);
 
 	if (flags & DC_EXEC) {
-		p = GetPlayer(_current_player);
+		Player *p = GetPlayer(_current_player);
 		free(p->name);
 		p->name = strdup(_cmd_text);
 		MarkWholeScreenDirty();
@@ -264,14 +262,12 @@
  */
 CommandCost CmdChangePresidentName(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Player *p;
-
 	if (StrEmpty(_cmd_text)) return CMD_ERROR;
 
 	if (!IsUniquePresidentName(_cmd_text)) return_cmd_error(STR_NAME_MUST_BE_UNIQUE);
 
 	if (flags & DC_EXEC) {
-		p = GetPlayer(_current_player);
+		Player *p = GetPlayer(_current_player);
 		free(p->president_name);
 		p->president_name = strdup(_cmd_text);
 
@@ -349,7 +345,7 @@
 #ifndef _DEBUG
 	if (_networking) return CMD_ERROR;
 #endif
-	return CommandCost(EXPENSES_OTHER, -(Money)p1);
+	return CommandCost(EXPENSES_OTHER, -(int32)p1);
 }
 
 /** Transfer funds (money) from one player to another.
@@ -409,8 +405,9 @@
 		/* If we are a network-client, update the difficult setting (if it is open).
 		 * Use this instead of just dirtying the window because we need to load in
 		 * the new difficulty settings */
-		if (_networking && !_network_server && FindWindowById(WC_GAME_OPTIONS, 0) != NULL)
+		if (_networking && !_network_server && FindWindowById(WC_GAME_OPTIONS, 0) != NULL) {
 			ShowGameDifficulty();
+		}
 	}
 	return CommandCost();
 }
--- a/src/misc_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/misc_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -17,7 +17,7 @@
 #include "textbuf_gui.h"
 #include "viewport_func.h"
 #include "gfx_func.h"
-#include "station.h"
+#include "station_func.h"
 #include "command_func.h"
 #include "player_func.h"
 #include "player_base.h"
@@ -40,6 +40,8 @@
 #include "string_func.h"
 #include "player_gui.h"
 #include "settings_type.h"
+#include "newgrf_cargo.h"
+#include "rail_gui.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -92,29 +94,23 @@
 
 static void Place_LandInfo(TileIndex tile)
 {
-	Player *p;
-	Window *w;
-	Town *t;
-	Money old_money;
-	CommandCost costclear;
-	AcceptedCargo ac;
-	TileDesc td;
-	StringID str;
-
 	DeleteWindowById(WC_LAND_INFO, 0);
 
-	w = AllocateWindowDesc(&_land_info_desc);
+	Window *w = AllocateWindowDesc(&_land_info_desc);
 	WP(w, void_d).data = &_landinfo_data;
 
-	p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : PLAYER_FIRST);
-	t = ClosestTownFromTile(tile, _patches.dist_local_authority);
+	Player *p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : PLAYER_FIRST);
+	Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority);
 
-	old_money = p->player_money;
+	Money old_money = p->player_money;
 	p->player_money = INT64_MAX;
-	costclear = DoCommand(tile, 0, 0, 0, CMD_LANDSCAPE_CLEAR);
+	CommandCost costclear = DoCommand(tile, 0, 0, 0, CMD_LANDSCAPE_CLEAR);
 	p->player_money = old_money;
 
 	/* Because build_date is not set yet in every TileDesc, we make sure it is empty */
+	TileDesc td;
+	AcceptedCargo ac;
+
 	td.build_date = 0;
 	GetAcceptedCargo(tile, ac);
 	GetTileDesc(tile, &td);
@@ -126,7 +122,7 @@
 	if (td.owner != OWNER_NONE && td.owner != OWNER_WATER) GetNameOfOwner(td.owner, tile);
 	GetString(_landinfo_data[1], STR_01A7_OWNER, lastof(_landinfo_data[1]));
 
-	str = STR_01A4_COST_TO_CLEAR_N_A;
+	StringID str = STR_01A4_COST_TO_CLEAR_N_A;
 	if (CmdSucceeded(costclear)) {
 		SetDParam(0, costclear.GetCost());
 		str = STR_01A5_COST_TO_CLEAR;
@@ -147,36 +143,33 @@
 	}
 	GetString(_landinfo_data[4], STR_01A8_LOCAL_AUTHORITY, lastof(_landinfo_data[4]));
 
-	{
-		char *p = GetString(_landinfo_data[5], STR_01CE_CARGO_ACCEPTED, lastof(_landinfo_data[5]));
-		bool found = false;
+	char *strp = GetString(_landinfo_data[5], STR_01CE_CARGO_ACCEPTED, lastof(_landinfo_data[5]));
+	bool found = false;
 
-		for (CargoID i = 0; i < NUM_CARGO; ++i) {
-			if (ac[i] > 0) {
-				/* Add a comma between each item. */
-				if (found) {
-					*p++ = ',';
-					*p++ = ' ';
-				}
-				found = true;
+	for (CargoID i = 0; i < NUM_CARGO; ++i) {
+		if (ac[i] > 0) {
+			/* Add a comma between each item. */
+			if (found) {
+				*strp++ = ',';
+				*strp++ = ' ';
+			}
+			found = true;
 
-				/* If the accepted value is less than 8, show it in 1/8:ths */
-				if (ac[i] < 8) {
-					SetDParam(0, ac[i]);
-					SetDParam(1, GetCargo(i)->name);
-					p = GetString(p, STR_01D1_8, lastof(_landinfo_data[5]));
-				} else {
-					p = GetString(p, GetCargo(i)->name, lastof(_landinfo_data[5]));
-				}
+			/* If the accepted value is less than 8, show it in 1/8:ths */
+			if (ac[i] < 8) {
+				SetDParam(0, ac[i]);
+				SetDParam(1, GetCargo(i)->name);
+				strp = GetString(strp, STR_01D1_8, lastof(_landinfo_data[5]));
+			} else {
+				strp = GetString(strp, GetCargo(i)->name, lastof(_landinfo_data[5]));
 			}
 		}
-
-		if (!found) _landinfo_data[5][0] = '\0';
 	}
+	if (!found) _landinfo_data[5][0] = '\0';
 
 	if (td.build_date != 0) {
 		SetDParam(0, td.build_date);
-	GetString(_landinfo_data[6], STR_BUILD_DATE, lastof(_landinfo_data[6]));
+		GetString(_landinfo_data[6], STR_BUILD_DATE, lastof(_landinfo_data[6]));
 	} else {
 		_landinfo_data[6][0] = '\0';
 	}
@@ -265,40 +258,41 @@
 static void AboutWindowProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: // Set up window counter and start position of scroller
-		WP(w, scroller_d).counter = 5;
-		WP(w, scroller_d).height = w->height - 40;
-		break;
-	case WE_PAINT: {
-		uint i;
-		int y = WP(w, scroller_d).height;
-		DrawWindowWidgets(w);
-
-		/* Show original copyright and revision version */
-		DrawStringCentered(210, 17, STR_00B6_ORIGINAL_COPYRIGHT, TC_FROMSTRING);
-		DrawStringCentered(210, 17 + 10, STR_00B7_VERSION, TC_FROMSTRING);
+		case WE_CREATE: // Set up window counter and start position of scroller
+			WP(w, scroller_d).counter = 5;
+			WP(w, scroller_d).height = w->height - 40;
+			break;
 
-		/* Show all scrolling credits */
-		for (i = 0; i < lengthof(credits); i++) {
-			if (y >= 50 && y < (w->height - 40)) {
-				DoDrawString(credits[i], 10, y, TC_BLACK);
-			}
-			y += 10;
-		}
+		case WE_PAINT: {
+			int y = WP(w, scroller_d).height;
+			DrawWindowWidgets(w);
 
-		/* If the last text has scrolled start anew from the start */
-		if (y < 50) WP(w, scroller_d).height = w->height - 40;
+			/* Show original copyright and revision version */
+			DrawStringCentered(210, 17, STR_00B6_ORIGINAL_COPYRIGHT, TC_FROMSTRING);
+			DrawStringCentered(210, 17 + 10, STR_00B7_VERSION, TC_FROMSTRING);
 
-		DoDrawStringCentered(210, w->height - 25, "Website: http://www.openttd.org", TC_BLACK);
-		DrawStringCentered(210, w->height - 15, STR_00BA_COPYRIGHT_OPENTTD, TC_FROMSTRING);
-	} break;
-	case WE_TICK: // Timer to scroll the text and adjust the new top
-		if (--WP(w, scroller_d).counter == 0) {
-			WP(w, scroller_d).counter = 5;
-			WP(w, scroller_d).height--;
-			SetWindowDirty(w);
-		}
-		break;
+			/* Show all scrolling credits */
+			for (uint i = 0; i < lengthof(credits); i++) {
+				if (y >= 50 && y < (w->height - 40)) {
+					DoDrawString(credits[i], 10, y, TC_BLACK);
+				}
+				y += 10;
+			}
+
+			/* If the last text has scrolled start anew from the start */
+			if (y < 50) WP(w, scroller_d).height = w->height - 40;
+
+			DoDrawStringCentered(210, w->height - 25, "Website: http://www.openttd.org", TC_BLACK);
+			DrawStringCentered(210, w->height - 15, STR_00BA_COPYRIGHT_OPENTTD, TC_FROMSTRING);
+		} break;
+
+		case WE_TICK: // Timer to scroll the text and adjust the new top
+			if (--WP(w, scroller_d).counter == 0) {
+				WP(w, scroller_d).counter = 5;
+				WP(w, scroller_d).height--;
+				SetWindowDirty(w);
+			}
+			break;
 	}
 }
 
@@ -343,82 +337,85 @@
 static void BuildTreesWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_PAINT: {
-		int x,y;
-		int i, count;
-
-		DrawWindowWidgets(w);
-
-		WP(w, tree_d).base = i = _tree_base_by_landscape[_opt.landscape];
-		WP(w, tree_d).count = count = _tree_count_by_landscape[_opt.landscape];
-
-		x = 18;
-		y = 54;
-		do {
-			DrawSprite(_tree_sprites[i].sprite, _tree_sprites[i].pal, x, y);
-			x += 35;
-			if (!(++i & 3)) {
-				x -= 35 * 4;
-				y += 47;
-			}
-		} while (--count);
-	} break;
-
-	case WE_CLICK: {
-		int wid = e->we.click.widget;
-
-		switch (wid) {
-		case 0:
+		case WE_CREATE:
 			ResetObjectToPlace();
 			break;
 
-		case 3: case 4: case 5: case 6:
-		case 7: case 8: case 9: case 10:
-		case 11:case 12: case 13: case 14:
-			if (wid - 3 >= WP(w, tree_d).count) break;
+		case WE_PAINT: {
+			DrawWindowWidgets(w);
 
-			if (HandlePlacePushButton(w, wid, SPR_CURSOR_TREE, VHM_RECT, NULL))
-				_tree_to_plant = WP(w, tree_d).base + wid - 3;
-			break;
+			int i = WP(w, tree_d).base = _tree_base_by_landscape[_opt.landscape];
+			int count = WP(w, tree_d).count = _tree_count_by_landscape[_opt.landscape];
 
-		case 15: // tree of random type.
-			if (HandlePlacePushButton(w, 15, SPR_CURSOR_TREE, VHM_RECT, NULL))
-				_tree_to_plant = -1;
+			int x = 18;
+			int y = 54;
+			do {
+				DrawSprite(_tree_sprites[i].sprite, _tree_sprites[i].pal, x, y);
+				x += 35;
+				if (!(++i & 3)) {
+					x -= 35 * 4;
+					y += 47;
+				}
+			} while (--count);
+		} break;
+
+		case WE_CLICK: {
+			int wid = e->we.click.widget;
+
+			switch (wid) {
+				case 0:
+					ResetObjectToPlace();
+					break;
+
+				case 3: case 4: case 5: case 6:
+				case 7: case 8: case 9: case 10:
+				case 11:case 12: case 13: case 14:
+					if (wid - 3 >= WP(w, tree_d).count) break;
+
+					if (HandlePlacePushButton(w, wid, SPR_CURSOR_TREE, VHM_RECT, NULL)) {
+						_tree_to_plant = WP(w, tree_d).base + wid - 3;
+					}
+					break;
+
+				case 15: // tree of random type.
+					if (HandlePlacePushButton(w, 15, SPR_CURSOR_TREE, VHM_RECT, NULL)) {
+						_tree_to_plant = -1;
+					}
+					break;
+
+				case 16: // place trees randomly over the landscape
+					w->LowerWidget(16);
+					w->flags4 |= 5 << WF_TIMEOUT_SHL;
+					SndPlayFx(SND_15_BEEP);
+					PlaceTreesRandomly();
+					MarkWholeScreenDirty();
+					break;
+			}
+		} break;
+
+		case WE_PLACE_OBJ:
+			VpStartPlaceSizing(e->we.place.tile, VPM_X_AND_Y_LIMITED, DDSP_PLANT_TREES);
+			VpSetPlaceSizingLimit(20);
 			break;
 
-		case 16: // place trees randomly over the landscape
-			w->LowerWidget(16);
-			w->flags4 |= 5 << WF_TIMEOUT_SHL;
-			SndPlayFx(SND_15_BEEP);
-			PlaceTreesRandomly();
-			MarkWholeScreenDirty();
-			break;
-		}
-	} break;
-
-	case WE_PLACE_OBJ:
-		VpStartPlaceSizing(e->we.place.tile, VPM_X_AND_Y_LIMITED, DDSP_PLANT_TREES);
-		VpSetPlaceSizingLimit(20);
-		break;
+		case WE_PLACE_DRAG:
+			VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
+			return;
 
-	case WE_PLACE_DRAG:
-		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
-		return;
+		case WE_PLACE_MOUSEUP:
+			if (e->we.place.pt.x != -1 && e->we.place.select_proc == DDSP_PLANT_TREES) {
+				DoCommandP(e->we.place.tile, _tree_to_plant, e->we.place.starttile, NULL,
+					CMD_PLANT_TREE | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE));
+			}
+			break;
 
-	case WE_PLACE_MOUSEUP:
-		if (e->we.place.pt.x != -1 && e->we.place.select_proc == DDSP_PLANT_TREES) {
-			DoCommandP(e->we.place.tile, _tree_to_plant, e->we.place.starttile, NULL,
-				CMD_PLANT_TREE | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE));
-		}
-		break;
+		case WE_TIMEOUT:
+			w->RaiseWidget(16);
+			break;
 
-	case WE_TIMEOUT:
-		w->RaiseWidget(16);
-		break;
-
-	case WE_ABORT_PLACE_OBJ:
-		w->RaiseButtons();
-		break;
+		case WE_ABORT_PLACE_OBJ:
+			w->RaiseButtons();
+			break;
 	}
 }
 
@@ -513,83 +510,80 @@
 static void ErrmsgWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_PAINT:
-		CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
-		DrawWindowWidgets(w);
-		CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
+		case WE_PAINT:
+			CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
+			DrawWindowWidgets(w);
+			CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
 
-		/* If the error message comes from a NewGRF, we must use the text ref. stack reserved for error messages.
-		 * If the message doesn't come from a NewGRF, it won't use the TTDP-style text ref. stack, so we won't hurt anything
-		 */
-		SwitchToErrorRefStack();
-		RewindTextRefStack();
+			/* If the error message comes from a NewGRF, we must use the text ref. stack reserved for error messages.
+			* If the message doesn't come from a NewGRF, it won't use the TTDP-style text ref. stack, so we won't hurt anything
+			*/
+			SwitchToErrorRefStack();
+			RewindTextRefStack();
 
-		if (!IsWindowOfPrototype(w, _errmsg_face_widgets)) {
-			DrawStringMultiCenter(
-				120,
-				(_errmsg_message_1 == INVALID_STRING_ID ? 25 : 15),
-				_errmsg_message_2,
-				w->width - 2);
-			if (_errmsg_message_1 != INVALID_STRING_ID)
+			if (!IsWindowOfPrototype(w, _errmsg_face_widgets)) {
 				DrawStringMultiCenter(
 					120,
-					30,
-					_errmsg_message_1,
+					(_errmsg_message_1 == INVALID_STRING_ID ? 25 : 15),
+					_errmsg_message_2,
 					w->width - 2);
-		} else {
-			const Player *p = GetPlayer((PlayerID)GetDParamX(_errmsg_decode_params,2));
-			DrawPlayerFace(p->face, p->player_color, 2, 16);
+				if (_errmsg_message_1 != INVALID_STRING_ID) {
+					DrawStringMultiCenter(
+						120,
+						30,
+						_errmsg_message_1,
+						w->width - 2);
+				}
+			} else {
+				const Player *p = GetPlayer((PlayerID)GetDParamX(_errmsg_decode_params,2));
+				DrawPlayerFace(p->face, p->player_color, 2, 16);
 
-			DrawStringMultiCenter(
-				214,
-				(_errmsg_message_1 == INVALID_STRING_ID ? 65 : 45),
-				_errmsg_message_2,
-				w->width - 2);
-			if (_errmsg_message_1 != INVALID_STRING_ID)
 				DrawStringMultiCenter(
 					214,
-					90,
-					_errmsg_message_1,
+					(_errmsg_message_1 == INVALID_STRING_ID ? 65 : 45),
+					_errmsg_message_2,
 					w->width - 2);
-		}
-
-		/* Switch back to the normal text ref. stack for NewGRF texts */
-		SwitchToNormalRefStack();
-		break;
-
-	case WE_MOUSELOOP:
-		if (_right_button_down) DeleteWindow(w);
-		break;
+				if (_errmsg_message_1 != INVALID_STRING_ID) {
+					DrawStringMultiCenter(
+						214,
+						90,
+						_errmsg_message_1,
+						w->width - 2);
+				}
+			}
 
-	case WE_4:
-		if (--_errmsg_duration == 0) DeleteWindow(w);
-		break;
+			/* Switch back to the normal text ref. stack for NewGRF texts */
+			SwitchToNormalRefStack();
+			break;
 
-	case WE_DESTROY:
-		SetRedErrorSquare(0);
-		_switch_mode_errorstr = INVALID_STRING_ID;
-		break;
+		case WE_MOUSELOOP:
+			if (_right_button_down) DeleteWindow(w);
+			break;
 
-	case WE_KEYPRESS:
-		if (e->we.keypress.keycode == WKC_SPACE) {
-			/* Don't continue. */
-			e->we.keypress.cont = false;
-			DeleteWindow(w);
-		}
-		break;
+		case WE_4:
+			if (--_errmsg_duration == 0) DeleteWindow(w);
+			break;
+
+		case WE_DESTROY:
+			SetRedErrorSquare(0);
+			_switch_mode_errorstr = INVALID_STRING_ID;
+			break;
+
+		case WE_KEYPRESS:
+			if (e->we.keypress.keycode == WKC_SPACE) {
+				/* Don't continue. */
+				e->we.keypress.cont = false;
+				DeleteWindow(w);
+			}
+			break;
 	}
 }
 
 void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y)
 {
-	Window *w;
-	const ViewPort *vp;
-	Point pt;
-
 	DeleteWindowById(WC_ERRMSG, 0);
 
-	//assert(msg_2);
-	if (msg_2 == 0) msg_2 = STR_EMPTY;
+	if (msg_2 == STR_NULL) msg_2 = STR_EMPTY;
 
 	_errmsg_message_1 = msg_1;
 	_errmsg_message_2 = msg_2;
@@ -597,9 +591,12 @@
 	_errmsg_duration = _patches.errmsg_duration;
 	if (!_errmsg_duration) return;
 
+	Point pt;
+	const ViewPort *vp;
+	Window *w;
+
 	if (_errmsg_message_1 != STR_013B_OWNED_BY || GetDParamX(_errmsg_decode_params,2) >= 8) {
-
-		if ( (x|y) != 0) {
+		if ((x | y) != 0) {
 			pt = RemapCoords2(x, y);
 			vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport;
 
@@ -617,7 +614,7 @@
 		}
 		w = AllocateWindow(pt.x, pt.y, 240, 46, ErrmsgWndProc, WC_ERRMSG, _errmsg_widgets);
 	} else {
-		if ( (x|y) != 0) {
+		if ((x | y) != 0) {
 			pt = RemapCoords2(x, y);
 			vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport;
 			pt.x = Clamp(UnScaleByZoom(pt.x - vp->virtual_left, vp->zoom) + vp->left - (334/2), 0, _screen.width - 334);
@@ -647,10 +644,9 @@
 
 void ShowCostOrIncomeAnimation(int x, int y, int z, Money cost)
 {
-	StringID msg;
 	Point pt = RemapCoords(x,y,z);
+	StringID msg = STR_0801_COST;
 
-	msg = STR_0801_COST;
 	if (cost < 0) {
 		cost = -cost;
 		msg = STR_0803_INCOME;
@@ -699,17 +695,15 @@
 static void TooltipsWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-		case WE_PAINT: {
-			uint arg;
+		case WE_PAINT:
 			GfxFillRect(0, 0, w->width - 1, w->height - 1, 0);
 			GfxFillRect(1, 1, w->width - 2, w->height - 2, 0x44);
 
-			for (arg = 0; arg < WP(w, tooltips_d).paramcount; arg++) {
+			for (uint arg = 0; arg < WP(w, tooltips_d).paramcount; arg++) {
 				SetDParam(arg, WP(w, tooltips_d).params[arg]);
 			}
 			DrawStringMultiCenter((w->width >> 1), (w->height >> 1) - 5, WP(w, tooltips_d).string_id, w->width - 2);
 			break;
-		}
 
 		case WE_MOUSELOOP:
 			/* We can show tooltips while dragging tools. These are shown as long as
@@ -731,21 +725,16 @@
  * added to a tooltip; currently only supports parameters of {NUM} (integer) */
 void GuiShowTooltipsWithArgs(StringID str, uint paramcount, const uint64 params[])
 {
-	char buffer[512];
-	Dimension br;
-	Window *w;
-	uint i;
-	int x, y;
-
 	DeleteWindowById(WC_TOOLTIPS, 0);
 
 	/* We only show measurement tooltips with patch setting on */
 	if (str == STR_NULL || (paramcount != 0 && !_patches.measure_tooltip)) return;
 
-	for (i = 0; i != paramcount; i++) SetDParam(i, params[i]);
+	for (uint i = 0; i != paramcount; i++) SetDParam(i, params[i]);
+	char buffer[512];
 	GetString(buffer, str, lastof(buffer));
 
-	br = GetStringBoundingBox(buffer);
+	Dimension br = GetStringBoundingBox(buffer);
 	br.width += 6; br.height += 4; // increase slightly to have some space around the box
 
 	/* Cut tooltip length to 200 pixels max, wrap to new line if longer */
@@ -757,11 +746,11 @@
 	/* Correctly position the tooltip position, watch out for window and cursor size
 	 * Clamp value to below main toolbar and above statusbar. If tooltip would
 	 * go below window, flip it so it is shown above the cursor */
-	y = Clamp(_cursor.pos.y + _cursor.size.y + _cursor.offs.y + 5, 22, _screen.height - 12);
+	int y = Clamp(_cursor.pos.y + _cursor.size.y + _cursor.offs.y + 5, 22, _screen.height - 12);
 	if (y + br.height > _screen.height - 12) y = _cursor.pos.y + _cursor.offs.y - br.height - 5;
-	x = Clamp(_cursor.pos.x - (br.width >> 1), 0, _screen.width - br.width);
+	int x = Clamp(_cursor.pos.x - (br.width >> 1), 0, _screen.width - br.width);
 
-	w = AllocateWindow(x, y, br.width, br.height, TooltipsWndProc, WC_TOOLTIPS, _tooltips_widgets);
+	Window *w = AllocateWindow(x, y, br.width, br.height, TooltipsWndProc, WC_TOOLTIPS, _tooltips_widgets);
 
 	WP(w, tooltips_d).string_id = str;
 	assert(sizeof(WP(w, tooltips_d).params[0]) == sizeof(params[0]));
@@ -774,13 +763,12 @@
 }
 
 
-static int DrawStationCoverageText(const AcceptedCargo accepts,
-	int str_x, int str_y, StationCoverageType sct)
+static int DrawStationCoverageText(const AcceptedCargo cargo,
+	int str_x, int str_y, StationCoverageType sct, bool supplies)
 {
-	char *b = _userstring;
 	bool first = true;
 
-	b = InlineString(b, STR_000D_ACCEPTS);
+	char *b = InlineString(_userstring, supplies ? STR_SUPPLIES : STR_000D_ACCEPTS);
 
 	for (CargoID i = 0; i < NUM_CARGO; i++) {
 		if (b >= lastof(_userstring) - (1 + 2 * 4)) break; // ',' or ' ' and two calls to Utf8Encode()
@@ -790,7 +778,7 @@
 			case SCT_ALL: break;
 			default: NOT_REACHED();
 		}
-		if (accepts[i] >= 8) {
+		if (cargo[i] >= (supplies ? 1 : 8)) {
 			if (first) {
 				first = false;
 			} else {
@@ -813,13 +801,26 @@
 	return DrawStringMultiLine(str_x, str_y, STR_SPEC_USERSTRING, 144);
 }
 
-int DrawStationCoverageAreaText(int sx, int sy, StationCoverageType sct, int rad)
+/**
+ * Calculates and draws the accepted or supplied cargo around the selected tile(s)
+ * @param sx x position where the string is to be drawn
+ * @param sy y position where the string is to be drawn
+ * @param sct which type of cargo is to be displayed (passengers/non-passengers)
+ * @param rad radius around selected tile(s) to be searched
+ * @param supplies if supplied cargos should be drawn, else accepted cargos
+ * @return Returns the y value below the string that was drawn
+ */
+int DrawStationCoverageAreaText(int sx, int sy, StationCoverageType sct, int rad, bool supplies)
 {
 	TileIndex tile = TileVirtXY(_thd.pos.x, _thd.pos.y);
-	AcceptedCargo accepts;
+	AcceptedCargo cargo;
 	if (tile < MapSize()) {
-		GetAcceptanceAroundTiles(accepts, tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE , rad);
-		return sy + DrawStationCoverageText(accepts, sx, sy, sct);
+		if (supplies) {
+			GetProductionAroundTiles(cargo, tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE , rad);
+		} else {
+			GetAcceptanceAroundTiles(cargo, tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE , rad);
+		}
+		return sy + DrawStationCoverageText(cargo, sx, sy, sct, supplies);
 	}
 
 	return sy;
@@ -863,14 +864,12 @@
 static void DelChar(Textbuf *tb, bool backspace)
 {
 	WChar c;
-	uint width;
-	size_t len;
 	char *s = tb->buf + tb->caretpos;
 
 	if (backspace) s = Utf8PrevChar(s);
 
-	len = Utf8Decode(&c, s);
-	width = GetCharacterWidth(FS_NORMAL, c);
+	size_t len = Utf8Decode(&c, s);
+	uint width = GetCharacterWidth(FS_NORMAL, c);
 
 	tb->width  -= width;
 	if (backspace) {
@@ -949,35 +948,41 @@
 bool MoveTextBufferPos(Textbuf *tb, int navmode)
 {
 	switch (navmode) {
-	case WKC_LEFT:
-		if (tb->caretpos != 0) {
-			WChar c;
-			const char *s = Utf8PrevChar(tb->buf + tb->caretpos);
-			Utf8Decode(&c, s);
-			tb->caretpos    = s - tb->buf; // -= (tb->buf + tb->caretpos - s)
-			tb->caretxoffs -= GetCharacterWidth(FS_NORMAL, c);
+		case WKC_LEFT:
+			if (tb->caretpos != 0) {
+				WChar c;
+				const char *s = Utf8PrevChar(tb->buf + tb->caretpos);
+				Utf8Decode(&c, s);
+				tb->caretpos    = s - tb->buf; // -= (tb->buf + tb->caretpos - s)
+				tb->caretxoffs -= GetCharacterWidth(FS_NORMAL, c);
 
+				return true;
+			}
+			break;
+
+		case WKC_RIGHT:
+			if (tb->caretpos < tb->length) {
+				WChar c;
+
+				tb->caretpos   += Utf8Decode(&c, tb->buf + tb->caretpos);
+				tb->caretxoffs += GetCharacterWidth(FS_NORMAL, c);
+
+				return true;
+			}
+			break;
+
+		case WKC_HOME:
+			tb->caretpos = 0;
+			tb->caretxoffs = 0;
 			return true;
-		}
-		break;
-	case WKC_RIGHT:
-		if (tb->caretpos < tb->length) {
-			WChar c;
 
-			tb->caretpos   += Utf8Decode(&c, tb->buf + tb->caretpos);
-			tb->caretxoffs += GetCharacterWidth(FS_NORMAL, c);
-
+		case WKC_END:
+			tb->caretpos = tb->length;
+			tb->caretxoffs = tb->width;
 			return true;
-		}
-		break;
-	case WKC_HOME:
-		tb->caretpos = 0;
-		tb->caretxoffs = 0;
-		return true;
-	case WKC_END:
-		tb->caretpos = tb->length;
-		tb->caretxoffs = tb->width;
-		return true;
+
+		default:
+			break;
 	}
 
 	return false;
@@ -1029,32 +1034,33 @@
 	e->we.keypress.cont = false;
 
 	switch (e->we.keypress.keycode) {
-	case WKC_ESC: return 2;
-	case WKC_RETURN: case WKC_NUM_ENTER: return 1;
-	case (WKC_CTRL | 'V'):
-		if (InsertTextBufferClipboard(&string->text))
-			w->InvalidateWidget(wid);
-		break;
-	case (WKC_CTRL | 'U'):
-		DeleteTextBufferAll(&string->text);
-		w->InvalidateWidget(wid);
-		break;
-	case WKC_BACKSPACE: case WKC_DELETE:
-		if (DeleteTextBufferChar(&string->text, e->we.keypress.keycode))
+		case WKC_ESC: return 2;
+
+		case WKC_RETURN: case WKC_NUM_ENTER: return 1;
+
+		case (WKC_CTRL | 'V'):
+			if (InsertTextBufferClipboard(&string->text)) w->InvalidateWidget(wid);
+			break;
+
+		case (WKC_CTRL | 'U'):
+			DeleteTextBufferAll(&string->text);
 			w->InvalidateWidget(wid);
-		break;
-	case WKC_LEFT: case WKC_RIGHT: case WKC_END: case WKC_HOME:
-		if (MoveTextBufferPos(&string->text, e->we.keypress.keycode))
-			w->InvalidateWidget(wid);
-		break;
-	default:
-		if (IsValidChar(e->we.keypress.key, string->afilter)) {
-			if (InsertTextBufferChar(&string->text, e->we.keypress.key)) {
-				w->InvalidateWidget(wid);
+			break;
+
+		case WKC_BACKSPACE: case WKC_DELETE:
+			if (DeleteTextBufferChar(&string->text, e->we.keypress.keycode)) w->InvalidateWidget(wid);
+			break;
+
+		case WKC_LEFT: case WKC_RIGHT: case WKC_END: case WKC_HOME:
+			if (MoveTextBufferPos(&string->text, e->we.keypress.keycode)) w->InvalidateWidget(wid);
+			break;
+
+		default:
+			if (IsValidChar(e->we.keypress.key, string->afilter)) {
+				if (InsertTextBufferChar(&string->text, e->we.keypress.key)) w->InvalidateWidget(wid);
+			} else { // key wasn't caught. Continue only if standard entry specified
+				e->we.keypress.cont = (string->afilter == CS_ALPHANUMERAL);
 			}
-		} else { // key wasn't caught. Continue only if standard entry specified
-			e->we.keypress.cont = (string->afilter == CS_ALPHANUMERAL);
-		}
 	}
 
 	return 0;
@@ -1079,26 +1085,31 @@
 
 void DrawEditBox(Window *w, querystr_d *string, int wid)
 {
-	DrawPixelInfo dpi, *old_dpi;
-	int delta;
 	const Widget *wi = &w->widget[wid];
-	const Textbuf *tb = &string->text;
+
+	assert((wi->type & WWT_MASK) == WWT_EDITBOX);
 
 	GfxFillRect(wi->left + 1, wi->top + 1, wi->right - 1, wi->bottom - 1, 215);
 
+	DrawPixelInfo dpi;
+	int delta;
+
 	/* Limit the drawing of the string inside the widget boundaries */
 	if (!FillDrawPixelInfo(&dpi,
-	      wi->left + 4,
-	      wi->top + 1,
-	      wi->right - wi->left - 4,
-	      wi->bottom - wi->top - 1)
-	) return;
+			wi->left + 4,
+			wi->top + 1,
+			wi->right - wi->left - 4,
+			wi->bottom - wi->top - 1)) {
+		return;
+	}
 
-	old_dpi = _cur_dpi;
+	DrawPixelInfo *old_dpi = _cur_dpi;
 	_cur_dpi = &dpi;
 
 	/* We will take the current widget length as maximum width, with a small
 	 * space reserved at the end for the caret to show */
+	const Textbuf *tb = &string->text;
+
 	delta = (wi->right - wi->left) - tb->width - 10;
 	if (delta > 0) delta = 0;
 
@@ -1135,6 +1146,10 @@
 
 		case WE_CLICK:
 			switch (e->we.click.widget) {
+				case QUERY_STR_WIDGET_TEXT:
+					ShowOnScreenKeyboard(w, &WP(w, querystr_d), QUERY_STR_WIDGET_TEXT, QUERY_STR_WIDGET_CANCEL, QUERY_STR_WIDGET_OK);
+					break;
+
 				case QUERY_STR_WIDGET_OK:
 		press_ok:;
 					if (qs->orig == NULL || strcmp(qs->text.buf, qs->orig) != 0) {
@@ -1188,7 +1203,7 @@
 {   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,        STR_018B_CLOSE_WINDOW},
 {    WWT_CAPTION,   RESIZE_NONE,    14,    11,   259,     0,    13, STR_012D,        STR_NULL},
 {      WWT_PANEL,   RESIZE_NONE,    14,     0,   259,    14,    29, 0x0,             STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,     2,   257,    16,    27, 0x0,             STR_NULL},
+{    WWT_EDITBOX,   RESIZE_NONE,    14,     2,   257,    16,    27, 0x0,             STR_NULL},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     0,   129,    30,    41, STR_012E_CANCEL, STR_NULL},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,   130,   259,    30,    41, STR_012F_OK,     STR_NULL},
 {   WIDGETS_END},
@@ -1202,7 +1217,8 @@
 	QueryStringWndProc
 };
 
-static char _edit_str_buf[64];
+char _edit_str_buf[64];
+char _orig_str_buf[lengthof(_edit_str_buf)];
 
 /** Show a query popup window with a textbox in it.
  * @param str StringID for the text shown in the textbox
@@ -1215,8 +1231,6 @@
  * @param afilter filters out unwanted character input */
 void ShowQueryString(StringID str, StringID caption, uint maxlen, uint maxwidth, Window *parent, CharSetFilter afilter)
 {
-	static char orig_str_buf[lengthof(_edit_str_buf)];
-	Window *w;
 	uint realmaxlen = maxlen & ~0x1000;
 
 	assert(realmaxlen < lengthof(_edit_str_buf));
@@ -1224,7 +1238,7 @@
 	DeleteWindowById(WC_QUERY_STRING, 0);
 	DeleteWindowById(WC_SAVELOAD, 0);
 
-	w = AllocateWindowDesc(&_query_string_desc);
+	Window *w = AllocateWindowDesc(&_query_string_desc);
 	w->parent = parent;
 
 	GetString(_edit_str_buf, str, lastof(_edit_str_buf));
@@ -1233,8 +1247,8 @@
 	if (maxlen & 0x1000) {
 		WP(w, querystr_d).orig = NULL;
 	} else {
-		strecpy(orig_str_buf, _edit_str_buf, lastof(orig_str_buf));
-		WP(w, querystr_d).orig = orig_str_buf;
+		strecpy(_orig_str_buf, _edit_str_buf, lastof(_orig_str_buf));
+		WP(w, querystr_d).orig = _orig_str_buf;
 	}
 
 	w->LowerWidget(QUERY_STR_WIDGET_TEXT);
@@ -1379,7 +1393,7 @@
 {      WWT_INSET,     RESIZE_RB,    14,     2,   243,    50,   150, 0x0,              STR_400A_LIST_OF_DRIVES_DIRECTORIES},
 {  WWT_SCROLLBAR,    RESIZE_LRB,    14,   245,   256,    60,   151, 0x0,              STR_0190_SCROLL_BAR_SCROLLS_LIST},
 {      WWT_PANEL,    RESIZE_RTB,    14,     0,   256,   152,   167, 0x0,              STR_NULL},
-{      WWT_PANEL,    RESIZE_RTB,    14,     2,   254,   154,   165, 0x0,              STR_400B_CURRENTLY_SELECTED_NAME},
+{    WWT_EDITBOX,    RESIZE_RTB,    14,     2,   254,   154,   165, STR_SAVE_OSKTITLE,STR_400B_CURRENTLY_SELECTED_NAME},
 { WWT_PUSHTXTBTN,     RESIZE_TB,    14,     0,   127,   168,   179, STR_4003_DELETE,  STR_400C_DELETE_THE_CURRENTLY_SELECTED},
 { WWT_PUSHTXTBTN,     RESIZE_TB,    14,   128,   244,   168,   179, STR_4002_SAVE,    STR_400D_SAVE_THE_CURRENT_GAME_USING},
 {  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   245,   256,   168,   179, 0x0,              STR_RESIZE_BUTTON},
@@ -1429,14 +1443,12 @@
 {
 	uint sort_start = 0;
 	uint sort_end = 0;
-	uint s_amount;
-	int i;
 
 	/* Directories are always above the files (FIOS_TYPE_DIR)
 	 * Drives (A:\ (windows only) are always under the files (FIOS_TYPE_DRIVE)
 	 * Only sort savegames/scenarios, not directories
 	 */
-	for (i = 0; i < _fios_num; i++) {
+	for (int i = 0; i < _fios_num; i++) {
 		switch (_fios_list[i].type) {
 			case FIOS_TYPE_DIR:    sort_start++; break;
 			case FIOS_TYPE_PARENT: sort_start++; break;
@@ -1444,14 +1456,15 @@
 		}
 	}
 
-	s_amount = _fios_num - sort_start - sort_end;
-	if (s_amount > 0)
+	uint s_amount = _fios_num - sort_start - sort_end;
+	if (s_amount > 0) {
 		qsort(_fios_list + sort_start, s_amount, sizeof(FiosItem), compare_FiosItems);
+	}
 }
 
 static void GenerateFileName()
 {
-	/* Check if we are not a specatator who wants to generate a name..
+	/* Check if we are not a spectator who wants to generate a name..
 	    Let's use the name of player #0 for now. */
 	const Player *p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : PLAYER_FIRST);
 
@@ -1468,192 +1481,201 @@
 	static FiosItem o_dir;
 
 	switch (e->event) {
-	case WE_CREATE: // Set up OPENTTD button
-		w->vscroll.cap = 10;
-		w->resize.step_width = 2;
-		w->resize.step_height = 10;
-
-		o_dir.type = FIOS_TYPE_DIRECT;
-		switch (_saveload_mode) {
-			case SLD_SAVE_GAME:
-			case SLD_LOAD_GAME:
-				FioGetDirectory(o_dir.name, lengthof(o_dir.name), SAVE_DIR);
-				break;
-
-			case SLD_SAVE_SCENARIO:
-			case SLD_LOAD_SCENARIO:
-				FioGetDirectory(o_dir.name, lengthof(o_dir.name), SCENARIO_DIR);
-				break;
-
-			case SLD_LOAD_HEIGHTMAP:
-				FioGetDirectory(o_dir.name, lengthof(o_dir.name), HEIGHTMAP_DIR);
-				break;
-
-			default:
-				ttd_strlcpy(o_dir.name, _personal_dir, lengthof(o_dir.name));
-		}
-		break;
-
-	case WE_PAINT: {
-		int pos;
-		int y;
+		case WE_CREATE: // Set up OPENTTD button
+			w->vscroll.cap = 10;
+			w->resize.step_width = 2;
+			w->resize.step_height = 10;
 
-		SetVScrollCount(w, _fios_num);
-		DrawWindowWidgets(w);
-		DrawFiosTexts(w->width);
-
-		if (_savegame_sort_dirty) {
-			_savegame_sort_dirty = false;
-			MakeSortedSaveGameList();
-		}
-
-		GfxFillRect(w->widget[7].left + 1, w->widget[7].top + 1, w->widget[7].right, w->widget[7].bottom, 0xD7);
-		DrawSortButtonState(w, _savegame_sort_order & SORT_BY_NAME ? 2 : 3, _savegame_sort_order & SORT_DESCENDING ? SBS_DOWN : SBS_UP);
-
-		y = w->widget[7].top + 1;
-		for (pos = w->vscroll.pos; pos < _fios_num; pos++) {
-			const FiosItem *item = _fios_list + pos;
+			o_dir.type = FIOS_TYPE_DIRECT;
+			switch (_saveload_mode) {
+				case SLD_SAVE_GAME:
+				case SLD_LOAD_GAME:
+					FioGetDirectory(o_dir.name, lengthof(o_dir.name), SAVE_DIR);
+					break;
 
-			DoDrawStringTruncated(item->title, 4, y, _fios_colors[item->type], w->width - 18);
-			y += 10;
-			if (y >= w->vscroll.cap * 10 + w->widget[7].top + 1) break;
-		}
+				case SLD_SAVE_SCENARIO:
+				case SLD_LOAD_SCENARIO:
+					FioGetDirectory(o_dir.name, lengthof(o_dir.name), SCENARIO_DIR);
+					break;
 
-		if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
-			DrawEditBox(w, &WP(w, querystr_d), 10);
-		}
-		break;
-	}
+				case SLD_LOAD_HEIGHTMAP:
+					FioGetDirectory(o_dir.name, lengthof(o_dir.name), HEIGHTMAP_DIR);
+					break;
 
-	case WE_CLICK:
-		switch (e->we.click.widget) {
-		case 2: // Sort save names by name
-			_savegame_sort_order = (_savegame_sort_order == SORT_BY_NAME) ?
-				SORT_BY_NAME | SORT_DESCENDING : SORT_BY_NAME;
-			_savegame_sort_dirty = true;
-			SetWindowDirty(w);
+				default:
+					ttd_strlcpy(o_dir.name, _personal_dir, lengthof(o_dir.name));
+			}
 			break;
 
-		case 3: // Sort save names by date
-			_savegame_sort_order = (_savegame_sort_order == SORT_BY_DATE) ?
-				SORT_BY_DATE | SORT_DESCENDING : SORT_BY_DATE;
-			_savegame_sort_dirty = true;
-			SetWindowDirty(w);
-			break;
-
-		case 6: // OpenTTD 'button', jumps to OpenTTD directory
-			FiosBrowseTo(&o_dir);
-			SetWindowDirty(w);
-			BuildFileList();
-			break;
-
-		case 7: { // Click the listbox
-			int y = (e->we.click.pt.y - w->widget[e->we.click.widget].top - 1) / 10;
-			char *name;
-			const FiosItem *file;
-
-			if (y < 0 || (y += w->vscroll.pos) >= w->vscroll.count) return;
-
-			file = _fios_list + y;
+		case WE_PAINT: {
+			int pos;
+			int y;
 
-			name = FiosBrowseTo(file);
-			if (name != NULL) {
-				if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) {
-					_switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD;
-
-					SetFiosType(file->type);
-					ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
-					ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title));
+			SetVScrollCount(w, _fios_num);
+			DrawWindowWidgets(w);
+			DrawFiosTexts(w->width);
 
-					DeleteWindow(w);
-				} else if (_saveload_mode == SLD_LOAD_HEIGHTMAP) {
-					SetFiosType(file->type);
-					ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
-					ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title));
+			if (_savegame_sort_dirty) {
+				_savegame_sort_dirty = false;
+				MakeSortedSaveGameList();
+			}
 
-					DeleteWindow(w);
-					ShowHeightmapLoad();
-				} else {
-					/* SLD_SAVE_GAME, SLD_SAVE_SCENARIO copy clicked name to editbox */
-					ttd_strlcpy(WP(w, querystr_d).text.buf, file->title, WP(w, querystr_d).text.maxlength);
-					UpdateTextBufferSize(&WP(w, querystr_d).text);
-					w->InvalidateWidget(10);
-				}
-			} else {
-				/* Changed directory, need repaint. */
-				SetWindowDirty(w);
-				BuildFileList();
+			GfxFillRect(w->widget[7].left + 1, w->widget[7].top + 1, w->widget[7].right, w->widget[7].bottom, 0xD7);
+			DrawSortButtonState(w, _savegame_sort_order & SORT_BY_NAME ? 2 : 3, _savegame_sort_order & SORT_DESCENDING ? SBS_DOWN : SBS_UP);
+
+			y = w->widget[7].top + 1;
+			for (pos = w->vscroll.pos; pos < _fios_num; pos++) {
+				const FiosItem *item = _fios_list + pos;
+
+				DoDrawStringTruncated(item->title, 4, y, _fios_colors[item->type], w->width - 18);
+				y += 10;
+				if (y >= w->vscroll.cap * 10 + w->widget[7].top + 1) break;
+			}
+
+			if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
+				DrawEditBox(w, &WP(w, querystr_d), 10);
 			}
 			break;
 		}
 
-		case 11: case 12: // Delete, Save game
-			break;
-		}
-		break;
-	case WE_MOUSELOOP:
-		if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
-			HandleEditBox(w, &WP(w, querystr_d), 10);
-		}
-		break;
-	case WE_KEYPRESS:
-		if (e->we.keypress.keycode == WKC_ESC) {
-			DeleteWindow(w);
-			return;
-		}
+		case WE_CLICK:
+			switch (e->we.click.widget) {
+				case 2: // Sort save names by name
+					_savegame_sort_order = (_savegame_sort_order == SORT_BY_NAME) ?
+						SORT_BY_NAME | SORT_DESCENDING : SORT_BY_NAME;
+					_savegame_sort_dirty = true;
+					SetWindowDirty(w);
+					break;
 
-		if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
-			if (HandleEditBoxKey(w, &WP(w, querystr_d), 10, e) == 1) // Press Enter
-					w->HandleButtonClick(12);
-		}
-		break;
-	case WE_TIMEOUT:
-		/* This test protects against using widgets 11 and 12 which are only available
-		 * in those two saveload mode  */
-		if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO)) break;
+				case 3: // Sort save names by date
+					_savegame_sort_order = (_savegame_sort_order == SORT_BY_DATE) ?
+						SORT_BY_DATE | SORT_DESCENDING : SORT_BY_DATE;
+					_savegame_sort_dirty = true;
+					SetWindowDirty(w);
+					break;
 
-		if (w->IsWidgetLowered(11)) { // Delete button clicked
-			if (!FiosDelete(WP(w, querystr_d).text.buf)) {
-				ShowErrorMessage(INVALID_STRING_ID, STR_4008_UNABLE_TO_DELETE_FILE, 0, 0);
-			} else {
-				BuildFileList();
-				/* Reset file name to current date on successful delete */
-				if (_saveload_mode == SLD_SAVE_GAME) GenerateFileName();
+				case 6: // OpenTTD 'button', jumps to OpenTTD directory
+					FiosBrowseTo(&o_dir);
+					SetWindowDirty(w);
+					BuildFileList();
+					break;
+
+				case 7: { // Click the listbox
+					int y = (e->we.click.pt.y - w->widget[e->we.click.widget].top - 1) / 10;
+					char *name;
+					const FiosItem *file;
+
+					if (y < 0 || (y += w->vscroll.pos) >= w->vscroll.count) return;
+
+					file = _fios_list + y;
+
+					name = FiosBrowseTo(file);
+					if (name != NULL) {
+						if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) {
+							_switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD;
+
+							SetFiosType(file->type);
+							ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
+							ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title));
+
+							DeleteWindow(w);
+						} else if (_saveload_mode == SLD_LOAD_HEIGHTMAP) {
+							SetFiosType(file->type);
+							ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
+							ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title));
+
+							DeleteWindow(w);
+							ShowHeightmapLoad();
+						} else {
+							/* SLD_SAVE_GAME, SLD_SAVE_SCENARIO copy clicked name to editbox */
+							ttd_strlcpy(WP(w, querystr_d).text.buf, file->title, WP(w, querystr_d).text.maxlength);
+							UpdateTextBufferSize(&WP(w, querystr_d).text);
+							w->InvalidateWidget(10);
+						}
+					} else {
+						/* Changed directory, need repaint. */
+						SetWindowDirty(w);
+						BuildFileList();
+					}
+					break;
+				}
+
+				case 10: // edit box
+					ShowOnScreenKeyboard(w, &WP(w, querystr_d), e->we.click.widget, 0, 0);
+					break;
+
+				case 11: case 12: // Delete, Save game
+					break;
+			}
+			break;
+
+		case WE_MOUSELOOP:
+			if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
+				HandleEditBox(w, &WP(w, querystr_d), 10);
+			}
+			break;
+
+		case WE_KEYPRESS:
+			if (e->we.keypress.keycode == WKC_ESC) {
+				DeleteWindow(w);
+				return;
 			}
 
-			UpdateTextBufferSize(&WP(w, querystr_d).text);
-			SetWindowDirty(w);
-		} else if (w->IsWidgetLowered(12)) { // Save button clicked
-			_switch_mode = SM_SAVE;
-			FiosMakeSavegameName(_file_to_saveload.name, WP(w, querystr_d).text.buf, sizeof(_file_to_saveload.name));
+			if ((_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) &&
+					HandleEditBoxKey(w, &WP(w, querystr_d), 10, e) == 1) { // Press Enter
+				w->HandleButtonClick(12);
+			}
+			break;
 
-			/* In the editor set up the vehicle engines correctly (date might have changed) */
-			if (_game_mode == GM_EDITOR) StartupEngines();
-		}
-		break;
-	case WE_DESTROY:
-		/* pause is only used in single-player, non-editor mode, non menu mode */
-		if (!_networking && _game_mode != GM_EDITOR && _game_mode != GM_MENU) {
-			if (_pause_game >= 0) DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
-		}
-		FiosFreeSavegameList();
-		ClrBit(_no_scroll, SCROLL_SAVE);
-		break;
-	case WE_RESIZE: {
-		/* Widget 2 and 3 have to go with halve speed, make it so obiwan */
-		uint diff = e->we.sizing.diff.x / 2;
-		w->widget[2].right += diff;
-		w->widget[3].left  += diff;
-		w->widget[3].right += e->we.sizing.diff.x;
+		case WE_TIMEOUT:
+			/* This test protects against using widgets 11 and 12 which are only available
+			* in those two saveload mode  */
+			if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO)) break;
 
-		/* Same for widget 11 and 12 in save-dialog */
-		if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
-			w->widget[11].right += diff;
-			w->widget[12].left  += diff;
-			w->widget[12].right += e->we.sizing.diff.x;
-		}
+			if (w->IsWidgetLowered(11)) { // Delete button clicked
+				if (!FiosDelete(WP(w, querystr_d).text.buf)) {
+					ShowErrorMessage(INVALID_STRING_ID, STR_4008_UNABLE_TO_DELETE_FILE, 0, 0);
+				} else {
+					BuildFileList();
+					/* Reset file name to current date on successful delete */
+					if (_saveload_mode == SLD_SAVE_GAME) GenerateFileName();
+				}
 
-		w->vscroll.cap += e->we.sizing.diff.y / 10;
+				UpdateTextBufferSize(&WP(w, querystr_d).text);
+				SetWindowDirty(w);
+			} else if (w->IsWidgetLowered(12)) { // Save button clicked
+				_switch_mode = SM_SAVE;
+				FiosMakeSavegameName(_file_to_saveload.name, WP(w, querystr_d).text.buf, sizeof(_file_to_saveload.name));
+
+				/* In the editor set up the vehicle engines correctly (date might have changed) */
+				if (_game_mode == GM_EDITOR) StartupEngines();
+			}
+			break;
+
+		case WE_DESTROY:
+			/* pause is only used in single-player, non-editor mode, non menu mode */
+			if (!_networking && _game_mode != GM_EDITOR && _game_mode != GM_MENU) {
+				if (_pause_game >= 0) DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
+			}
+			FiosFreeSavegameList();
+			ClrBit(_no_scroll, SCROLL_SAVE);
+			break;
+
+		case WE_RESIZE: {
+			/* Widget 2 and 3 have to go with halve speed, make it so obiwan */
+			uint diff = e->we.sizing.diff.x / 2;
+			w->widget[2].right += diff;
+			w->widget[3].left  += diff;
+			w->widget[3].right += e->we.sizing.diff.x;
+
+			/* Same for widget 11 and 12 in save-dialog */
+			if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
+				w->widget[11].right += diff;
+				w->widget[12].left  += diff;
+				w->widget[12].right += e->we.sizing.diff.x;
+			}
+
+			w->vscroll.cap += e->we.sizing.diff.y / 10;
 		} break;
 	}
 }
@@ -1695,10 +1717,8 @@
 		STR_LOAD_HEIGHTMAP,
 	};
 
-	Window *w;
 	const WindowDesc *sld = &_save_dialog_desc;
 
-
 	SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, VHM_NONE, WC_MAIN_WINDOW, 0);
 	DeleteWindowById(WC_QUERY_STRING, 0);
 	DeleteWindowById(WC_SAVELOAD, 0);
@@ -1716,7 +1736,8 @@
 	}
 
 	assert((uint)mode < lengthof(saveload_captions));
-	w = AllocateWindowDesc(sld);
+
+	Window *w = AllocateWindowDesc(sld);
 	w->widget[1].data = saveload_captions[mode];
 	w->LowerWidget(7);
 
@@ -1768,10 +1789,17 @@
 	}
 }
 
+/**
+ * The 'amount' to cheat with.
+ * This variable is semantically a constant value, but because the cheat
+ * code requires to be able to write to the variable it is not constified.
+ */
+static int32 _money_cheat_amount = 10000000;
+
 static int32 ClickMoneyCheat(int32 p1, int32 p2)
 {
-		DoCommandP(0, 10000000, 0, NULL, CMD_MONEY_CHEAT);
-		return true;
+	DoCommandP(0, (uint32)(p2 * _money_cheat_amount), 0, NULL, CMD_MONEY_CHEAT);
+	return _money_cheat_amount;
 }
 
 /**
@@ -1822,43 +1850,30 @@
 	SetDate(ConvertYMDToDate(_cur_year + p2, ymd.month, ymd.day));
 	EnginesMonthlyLoop();
 	SetWindowDirty(FindWindowById(WC_STATUS_BAR, 0));
+	ResetSignalVariant();
 	return _cur_year;
 }
 
 typedef int32 CheckButtonClick(int32, int32);
 
-enum ce_flags_long
-{
-	CE_NONE = 0,
-	CE_CLICK = 1 << 0,
-	CE_END = 1 << 1,
-};
-
-/** Define basic enum properties */
-template <> struct EnumPropsT<ce_flags_long> : MakeEnumPropsT<ce_flags_long, byte, CE_NONE, CE_END, CE_END> {};
-typedef TinyEnumT<ce_flags_long> ce_flags;
-
-
 struct CheatEntry {
 	VarType type;          ///< type of selector
-	ce_flags flags;        ///< selector flags
 	StringID str;          ///< string with descriptive text
 	void *variable;        ///< pointer to the variable
 	bool *been_used;       ///< has this cheat been used before?
 	CheckButtonClick *proc;///< procedure
-	int16 min, max;        ///< range for spinbox setting
 };
 
 static const CheatEntry _cheats_ui[] = {
-	{SLE_BOOL, {CE_CLICK}, STR_CHEAT_MONEY,          &_cheats.money.value,           &_cheats.money.been_used,           &ClickMoneyCheat,         0,  0},
-	{SLE_UINT8, {CE_NONE}, STR_CHEAT_CHANGE_PLAYER,  &_local_player,                 &_cheats.switch_player.been_used,   &ClickChangePlayerCheat,  0, 11},
-	{SLE_BOOL,  {CE_NONE}, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, NULL,                     0,  0},
-	{SLE_BOOL,  {CE_NONE}, STR_CHEAT_CROSSINGTUNNELS,&_cheats.crossing_tunnels.value,&_cheats.crossing_tunnels.been_used,NULL,                     0,  0},
-	{SLE_BOOL,  {CE_NONE}, STR_CHEAT_BUILD_IN_PAUSE, &_cheats.build_in_pause.value,  &_cheats.build_in_pause.been_used,  NULL,                     0,  0},
-	{SLE_BOOL,  {CE_NONE}, STR_CHEAT_NO_JETCRASH,    &_cheats.no_jetcrash.value,     &_cheats.no_jetcrash.been_used,     NULL,                     0,  0},
-	{SLE_BOOL,  {CE_NONE}, STR_CHEAT_SETUP_PROD,     &_cheats.setup_prod.value,      &_cheats.setup_prod.been_used,      NULL,                     0,  0},
-	{SLE_UINT8, {CE_NONE}, STR_CHEAT_SWITCH_CLIMATE, &_opt.landscape,                &_cheats.switch_climate.been_used,  &ClickChangeClimateCheat,-1,  4},
-	{SLE_INT32, {CE_NONE}, STR_CHEAT_CHANGE_DATE,    &_cur_year,                     &_cheats.change_date.been_used,     &ClickChangeDateCheat,   -1,  1},
+	{SLE_INT32, STR_CHEAT_MONEY,           &_money_cheat_amount,            &_cheats.money.been_used,            &ClickMoneyCheat        },
+	{SLE_UINT8, STR_CHEAT_CHANGE_PLAYER,   &_local_player,                  &_cheats.switch_player.been_used,    &ClickChangePlayerCheat },
+	{SLE_BOOL,  STR_CHEAT_EXTRA_DYNAMITE,  &_cheats.magic_bulldozer.value,  &_cheats.magic_bulldozer.been_used,  NULL                    },
+	{SLE_BOOL,  STR_CHEAT_CROSSINGTUNNELS, &_cheats.crossing_tunnels.value, &_cheats.crossing_tunnels.been_used, NULL                    },
+	{SLE_BOOL,  STR_CHEAT_BUILD_IN_PAUSE,  &_cheats.build_in_pause.value,   &_cheats.build_in_pause.been_used,   NULL                    },
+	{SLE_BOOL,  STR_CHEAT_NO_JETCRASH,     &_cheats.no_jetcrash.value,      &_cheats.no_jetcrash.been_used,      NULL                    },
+	{SLE_BOOL,  STR_CHEAT_SETUP_PROD,      &_cheats.setup_prod.value,       &_cheats.setup_prod.been_used,       NULL                    },
+	{SLE_UINT8, STR_CHEAT_SWITCH_CLIMATE,  &_opt.landscape,                 &_cheats.switch_climate.been_used,   &ClickChangeClimateCheat},
+	{SLE_INT32, STR_CHEAT_CHANGE_DATE,     &_cur_year,                      &_cheats.change_date.been_used,      &ClickChangeDateCheat   },
 };
 
 
@@ -1873,123 +1888,97 @@
 static void CheatsWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_PAINT: {
-		int clk = WP(w, def_d).data_1;
-		int x, y;
-		int i;
-
-		DrawWindowWidgets(w);
-
-		DrawStringMultiCenter(200, 25, STR_CHEATS_WARNING, w->width - 50);
-
-		x = 0;
-		y = 45;
-
-		for (i = 0; i != lengthof(_cheats_ui); i++) {
-			const CheatEntry *ce = &_cheats_ui[i];
+		case WE_PAINT: {
+			int clk = WP(w, def_d).data_1;
 
-			DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, x + 5, y + 2);
-
-			switch (ce->type) {
-			case SLE_BOOL: {
-				bool on = (*(bool*)ce->variable);
+			DrawWindowWidgets(w);
+			DrawStringMultiCenter(200, 25, STR_CHEATS_WARNING, w->width - 50);
 
-				if (ce->flags & CE_CLICK) {
-					DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, 0, (clk - (i * 2) == 1) ? FR_LOWERED : FR_NONE);
-					if (i == 0) { // XXX - hack/hack for first element which is increase money. Told ya it's a mess
-						SetDParam(0, 10000000);
-					} else {
-						SetDParam(0, false);
-					}
-				} else {
-					DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, on ? 6 : 4, on ? FR_LOWERED : FR_NONE);
-					SetDParam(0, on ? STR_CONFIG_PATCHES_ON : STR_CONFIG_PATCHES_OFF);
+			for (int i = 0, x = 0, y = 45; i != lengthof(_cheats_ui); i++) {
+				const CheatEntry *ce = &_cheats_ui[i];
+
+				DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, x + 5, y + 2);
+
+				switch (ce->type) {
+					case SLE_BOOL: {
+						bool on = (*(bool*)ce->variable);
+
+						DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, on ? 6 : 4, on ? FR_LOWERED : FR_NONE);
+						SetDParam(0, on ? STR_CONFIG_PATCHES_ON : STR_CONFIG_PATCHES_OFF);
+					} break;
+
+					default: {
+						int32 val = (int32)ReadValue(ce->variable, ce->type);
+						char buf[512];
+
+						/* Draw [<][>] boxes for settings of an integer-type */
+						DrawArrowButtons(x + 20, y, 3, clk - (i * 2), true, true);
+
+						switch (ce->str) {
+							/* Display date for change date cheat */
+							case STR_CHEAT_CHANGE_DATE: SetDParam(0, _date); break;
+
+							/* Draw colored flag for change player cheat */
+							case STR_CHEAT_CHANGE_PLAYER:
+								SetDParam(0, val);
+								GetString(buf, STR_CHEAT_CHANGE_PLAYER, lastof(buf));
+								DrawPlayerIcon(_current_player, 60 + GetStringBoundingBox(buf).width, y + 2);
+								break;
+
+							/* Set correct string for switch climate cheat */
+							case STR_CHEAT_SWITCH_CLIMATE: val += STR_TEMPERATE_LANDSCAPE;
+
+							/* Fallthrough */
+							default: SetDParam(0, val);
+						}
+					} break;
 				}
-			} break;
-			default: {
-				int32 val = (int32)ReadValue(ce->variable, ce->type);
-				char buf[512];
-
-				/* Draw [<][>] boxes for settings of an integer-type */
-				DrawArrowButtons(x + 20, y, 3, clk - (i * 2), true, true);
 
-				switch (ce->str) {
-				/* Display date for change date cheat */
-				case STR_CHEAT_CHANGE_DATE: SetDParam(0, _date); break;
-				/* Draw colored flag for change player cheat */
-				case STR_CHEAT_CHANGE_PLAYER:
-					SetDParam(0, val);
-					GetString(buf, STR_CHEAT_CHANGE_PLAYER, lastof(buf));
-					DrawPlayerIcon(_current_player, 60 + GetStringBoundingBox(buf).width, y + 2);
-					break;
-				/* Set correct string for switch climate cheat */
-				case STR_CHEAT_SWITCH_CLIMATE: val += STR_TEMPERATE_LANDSCAPE;
-				/* Fallthrough */
-				default: SetDParam(0, val);
-				}
-			} break;
+				DrawString(50, y + 1, ce->str, TC_FROMSTRING);
+
+				y += 12;
 			}
-
-			DrawString(50, y + 1, ce->str, TC_FROMSTRING);
-
-			y += 12;
+			break;
 		}
-		break;
-	}
 
-	case WE_CLICK: {
-			const CheatEntry *ce;
+		case WE_CLICK: {
 			uint btn = (e->we.click.pt.y - 46) / 12;
-			int32 value, oldvalue;
 			uint x = e->we.click.pt.x;
 
-			/* not clicking a button? */
+			/* Not clicking a button? */
 			if (!IsInsideMM(x, 20, 40) || btn >= lengthof(_cheats_ui)) break;
 
-			ce = &_cheats_ui[btn];
-			oldvalue = value = (int32)ReadValue(ce->variable, ce->type);
+			const CheatEntry *ce = &_cheats_ui[btn];
+			int value = (int32)ReadValue(ce->variable, ce->type);
+			int oldvalue = value;
 
 			*ce->been_used = true;
 
 			switch (ce->type) {
-			case SLE_BOOL:
-				if (ce->flags & CE_CLICK) WP(w, def_d).data_1 = btn * 2 + 1;
-				value ^= 1;
-				if (ce->proc != NULL) ce->proc(value, 0);
-				break;
-			default: {
-				/* Add a dynamic step-size to the scroller. In a maximum of
-				 * 50-steps you should be able to get from min to max */
-				uint16 step = ((ce->max - ce->min) / 20);
-				if (step == 0) step = 1;
+				case SLE_BOOL:
+					value ^= 1;
+					if (ce->proc != NULL) ce->proc(value, 0);
+					break;
 
-				/* Increase or decrease the value and clamp it to extremes */
-				value += (x >= 30) ? step : -step;
-				value = Clamp(value, ce->min, ce->max);
+				default:
+					/* Take whatever the function returns */
+					value = ce->proc(value + ((x >= 30) ? 1 : -1), (x >= 30) ? 1 : -1);
 
-				/* take whatever the function returns */
-				value = ce->proc(value, (x >= 30) ? 1 : -1);
-
-				if (value != oldvalue) {
-					WP(w, def_d).data_1 = btn * 2 + 1 + ((x >= 30) ? 1 : 0);
-				}
-			} break;
+					if (value != oldvalue) WP(w, def_d).data_1 = btn * 2 + 1 + ((x >= 30) ? 1 : 0);
+					break;
 			}
 
-			if (value != oldvalue) {
-				WriteValue(ce->variable, ce->type, (int64)value);
-				SetWindowDirty(w);
-			}
+			if (value != oldvalue) WriteValue(ce->variable, ce->type, (int64)value);
 
 			w->flags4 |= 5 << WF_TIMEOUT_SHL;
 
 			SetWindowDirty(w);
-		}
-		break;
-	case WE_TIMEOUT:
-		WP(w, def_d).data_1 = 0;
-		SetWindowDirty(w);
-		break;
+		} break;
+
+		case WE_TIMEOUT:
+			WP(w, def_d).data_1 = 0;
+			SetWindowDirty(w);
+			break;
 	}
 }
 
--- a/src/music.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/music.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -2,6 +2,7 @@
 
 /** @file music.cpp */
 
+#include "stdafx.h"
 #include "music.h"
 
 const SongSpecs origin_songs_specs[NUM_SONGS_AVAILABLE] = {
--- a/src/music.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/music.h	Tue Apr 15 00:47:19 2008 +0000
@@ -9,7 +9,7 @@
 #define NUM_SONGS_AVAILABLE 22
 
 struct SongSpecs {
-	char filename[256];
+	char filename[MAX_PATH];
 	char song_name[64];
 };
 
--- a/src/music/win32_m.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/music/win32_m.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -13,7 +13,7 @@
 	HANDLE wait_obj;
 	HANDLE thread;
 	UINT_PTR devid;
-	char start_song[260];
+	char start_song[MAX_PATH];
 } _midi;
 
 static FMusicDriver_Win32 iFMusicDriver_Win32;
@@ -46,28 +46,34 @@
 	SetEvent(_midi.wait_obj);
 }
 
-static MCIERROR CDECL MidiSendCommand(const char* cmd, ...)
+static MCIERROR CDECL MidiSendCommand(const TCHAR* cmd, ...)
 {
 	va_list va;
-	char buf[512];
+	TCHAR buf[512];
 
 	va_start(va, cmd);
-	vsnprintf(buf, lengthof(buf), cmd, va);
+	_vsntprintf(buf, lengthof(buf), cmd, va);
 	va_end(va);
-	return mciSendStringA(buf, NULL, 0, 0);
+	return mciSendString(buf, NULL, 0, 0);
 }
 
 static bool MidiIntPlaySong(const char *filename)
 {
-	MidiSendCommand("close all");
-	if (MidiSendCommand("open \"%s\" type sequencer alias song", filename) != 0) return false;
+	MidiSendCommand(_T("close all"));
 
-	return MidiSendCommand("play song from 0") == 0;
+	if (MidiSendCommand(_T("open \"%s\" type sequencer alias song"), OTTD2FS(filename)) != 0) {
+		/* Let's try the "short name" */
+		TCHAR buf[MAX_PATH];
+		if (GetShortPathName(OTTD2FS(filename), buf, MAX_PATH) == 0) return false;
+		if (MidiSendCommand(_T("open \"%s\" type sequencer alias song"), buf) != 0) return false;
+	}
+
+	return MidiSendCommand(_T("play song from 0")) == 0;
 }
 
 static void MidiIntStopSong()
 {
-	MidiSendCommand("close all");
+	MidiSendCommand(_T("close all"));
 }
 
 static void MidiIntSetVolume(int vol)
--- a/src/namegen.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/namegen.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -5,7 +5,7 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
-#include "namegen.h"
+#include "namegen_func.h"
 #include "string_func.h"
 
 #include "table/namegen.h"
--- a/src/namegen.h	Mon Apr 14 20:32:36 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-/* $Id$ */
-
-/** @file namegen.h Town name generator stuff. */
-
-#ifndef NAMEGEN_H
-#define NAMEGEN_H
-
-typedef byte TownNameGenerator(char *buf, uint32 seed, const char *last);
-
-extern TownNameGenerator * const _town_name_generators[];
-
-#endif /* NAMEGEN_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/namegen_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,12 @@
+/* $Id$ */
+
+/** @file namegen.h Town name generator stuff. */
+
+#ifndef NAMEGEN_H
+#define NAMEGEN_H
+
+typedef byte TownNameGenerator(char *buf, uint32 seed, const char *last);
+
+extern TownNameGenerator * const _town_name_generators[];
+
+#endif /* NAMEGEN_H */
--- a/src/network/core/config.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/network/core/config.h	Tue Apr 15 00:47:19 2008 +0000
@@ -38,16 +38,11 @@
 	/**
 	 * Maximum number of GRFs that can be sent.
 	 * This value is related to number of handles (files) OpenTTD can open.
-	 * This is currently 64 and about 10 are currently used when OpenTTD loads
-	 * without any NewGRFs. Therefore one can only load about 55 NewGRFs, so
-	 * this is not a limit, but rather a way to easily check whether the limit
-	 * imposed by the handle count is reached. Secondly it isn't possible to
-	 * send much more GRF IDs + MD5sums in the PACKET_UDP_SERVER_RESPONSE, due
-	 * to the limited size of UDP packets.
+	 * This is currently 64. Two are used for configuration and sound.
 	 */
-	NETWORK_MAX_GRF_COUNT         =   55,
+	NETWORK_MAX_GRF_COUNT         =   62,
 
-	NETWORK_NUM_LANGUAGES         =   29, ///< Number of known languages (to the network protocol) + 1 for 'any'.
+	NETWORK_NUM_LANGUAGES         =   36, ///< Number of known languages (to the network protocol) + 1 for 'any'.
 	/**
 	 * The number of landscapes in OpenTTD.
 	 * This number must be equal to NUM_LANDSCAPE, but as this number is used
--- a/src/network/core/udp.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/network/core/udp.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -221,6 +221,9 @@
 			uint i;
 			uint num_grfs = p->Recv_uint8();
 
+			/* Broken/bad data. It cannot have that many NewGRFs. */
+			if (num_grfs > NETWORK_MAX_GRF_COUNT) return;
+
 			for (i = 0; i < num_grfs; i++) {
 				GRFConfig *c = CallocT<GRFConfig>(1);
 				this->Recv_GRFIdentifier(p, c);
--- a/src/network/network_data.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/network/network_data.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -79,7 +79,7 @@
 		/* And we queue it for delivery to the clients */
 		NetworkTCPSocketHandler *cs;
 		FOR_ALL_CLIENTS(cs) {
-			if (cs->status > STATUS_AUTH) NetworkAddCommandQueue(cs, &c);
+			if (cs->status > STATUS_MAP_WAIT) NetworkAddCommandQueue(cs, &c);
 		}
 		return;
 	}
--- a/src/network/network_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/network/network_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -35,6 +35,7 @@
 #define BTC 15
 
 struct chatquerystr_d : public querystr_d {
+	DestType dtype;
 	int dest;
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(chatquerystr_d));
@@ -59,7 +60,7 @@
 /* Global to remember sorting after window has been closed */
 static Listing _ng_sorting;
 
-static char _edit_str_buf[150];
+static char _edit_str_net_buf[150];
 static bool _chat_tab_completion_active;
 
 static void ShowNetworkStartServerWindow();
@@ -254,58 +255,57 @@
 	list_d *ld = &WP(w, network_ql_d).l;
 
 	switch (e->event) {
-	case WE_CREATE: // Focus input box
-		w->vscroll.cap = 13;
-		w->resize.step_height = NET_PRC__SIZE_OF_ROW;
-
-		nd->field = NGWW_PLAYER;
-		nd->server = NULL;
-
-		WP(w, network_ql_d).sort_list = NULL;
-		ld->flags = VL_REBUILD | (_ng_sorting.order ? VL_DESC : VL_NONE);
-		ld->sort_type = _ng_sorting.criteria;
-		break;
-
-	case WE_PAINT: {
-		const NetworkGameList *sel = nd->server;
-		const SortButtonState arrow = (ld->flags & VL_DESC) ? SBS_DOWN : SBS_UP;
-
-		if (ld->flags & VL_REBUILD) {
-			BuildNetworkGameList(&WP(w, network_ql_d));
-			SetVScrollCount(w, ld->list_length);
-		}
-		if (ld->flags & VL_RESORT) SortNetworkGameList(&WP(w, network_ql_d));
+		case WE_CREATE: // Focus input box
+			w->vscroll.cap = 13;
+			w->resize.step_height = NET_PRC__SIZE_OF_ROW;
 
-		/* 'Refresh' button invisible if no server selected */
-		w->SetWidgetDisabledState(NGWW_REFRESH, sel == NULL);
-		/* 'Join' button disabling conditions */
-		w->SetWidgetDisabledState(NGWW_JOIN, sel == NULL || // no Selected Server
-				!sel->online || // Server offline
-				sel->info.clients_on >= sel->info.clients_max || // Server full
-				!sel->info.compatible); // Revision mismatch
-
-		/* 'NewGRF Settings' button invisible if no NewGRF is used */
-		w->SetWidgetHiddenState(NGWW_NEWGRF, sel == NULL ||
-				!sel->online ||
-				sel->info.grfconfig == NULL);
+			nd->field = NGWW_PLAYER;
+			nd->server = NULL;
 
-		SetDParam(0, 0x00);
-		SetDParam(1, _lan_internet_types_dropdown[_network_lan_internet]);
-		DrawWindowWidgets(w);
-
-		/* Edit box to set player name */
-		DrawEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER);
+			WP(w, network_ql_d).sort_list = NULL;
+			ld->flags = VL_REBUILD | (_ng_sorting.order ? VL_DESC : VL_NONE);
+			ld->sort_type = _ng_sorting.criteria;
+			break;
 
-		DrawString(w->widget[NGWW_PLAYER].left - 100, 23, STR_NETWORK_PLAYER_NAME, TC_GOLD);
+		case WE_PAINT: {
+			const NetworkGameList *sel = nd->server;
+			const SortButtonState arrow = (ld->flags & VL_DESC) ? SBS_DOWN : SBS_UP;
 
-		/* Sort based on widgets: name, clients, compatibility */
-		switch (ld->sort_type) {
-			case NGWW_NAME    - NGWW_NAME: DrawSortButtonState(w, NGWW_NAME,    arrow); break;
-			case NGWW_CLIENTS - NGWW_NAME: DrawSortButtonState(w, NGWW_CLIENTS, arrow); break;
-			case NGWW_INFO    - NGWW_NAME: DrawSortButtonState(w, NGWW_INFO,    arrow); break;
-		}
+			if (ld->flags & VL_REBUILD) {
+				BuildNetworkGameList(&WP(w, network_ql_d));
+				SetVScrollCount(w, ld->list_length);
+			}
+			if (ld->flags & VL_RESORT) SortNetworkGameList(&WP(w, network_ql_d));
 
-		{ // draw list of games
+			/* 'Refresh' button invisible if no server selected */
+			w->SetWidgetDisabledState(NGWW_REFRESH, sel == NULL);
+			/* 'Join' button disabling conditions */
+			w->SetWidgetDisabledState(NGWW_JOIN, sel == NULL || // no Selected Server
+					!sel->online || // Server offline
+					sel->info.clients_on >= sel->info.clients_max || // Server full
+					!sel->info.compatible); // Revision mismatch
+
+			/* 'NewGRF Settings' button invisible if no NewGRF is used */
+			w->SetWidgetHiddenState(NGWW_NEWGRF, sel == NULL ||
+					!sel->online ||
+					sel->info.grfconfig == NULL);
+
+			SetDParam(0, 0x00);
+			SetDParam(1, _lan_internet_types_dropdown[_network_lan_internet]);
+			DrawWindowWidgets(w);
+
+			/* Edit box to set player name */
+			DrawEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER);
+
+			DrawString(w->widget[NGWW_PLAYER].left - 100, 23, STR_NETWORK_PLAYER_NAME, TC_GOLD);
+
+			/* Sort based on widgets: name, clients, compatibility */
+			switch (ld->sort_type) {
+				case NGWW_NAME    - NGWW_NAME: DrawSortButtonState(w, NGWW_NAME,    arrow); break;
+				case NGWW_CLIENTS - NGWW_NAME: DrawSortButtonState(w, NGWW_CLIENTS, arrow); break;
+				case NGWW_INFO    - NGWW_NAME: DrawSortButtonState(w, NGWW_INFO,    arrow); break;
+			}
+
 			uint16 y = NET_PRC__OFFSET_TOP_WIDGET + 3;
 			int32 n = 0;
 			int32 pos = w->vscroll.pos;
@@ -346,258 +346,270 @@
 				y += NET_PRC__SIZE_OF_ROW;
 				if (++n == w->vscroll.cap) break; // max number of games in the window
 			}
-		}
 
-		/* Draw the right menu */
-		GfxFillRect(w->widget[NGWW_DETAILS].left + 1, 43, w->widget[NGWW_DETAILS].right - 1, 92, 157);
-		if (sel == NULL) {
-			DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 58, STR_NETWORK_GAME_INFO, TC_FROMSTRING);
-		} else if (!sel->online) {
-			SetDParamStr(0, sel->info.server_name);
-			DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 68, STR_ORANGE, TC_FROMSTRING); // game name
+			/* Draw the right menu */
+			GfxFillRect(w->widget[NGWW_DETAILS].left + 1, 43, w->widget[NGWW_DETAILS].right - 1, 92, 157);
+			if (sel == NULL) {
+				DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 58, STR_NETWORK_GAME_INFO, TC_FROMSTRING);
+			} else if (!sel->online) {
+				SetDParamStr(0, sel->info.server_name);
+				DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 68, STR_ORANGE, TC_FROMSTRING); // game name
 
-			DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 132, STR_NETWORK_SERVER_OFFLINE, TC_FROMSTRING); // server offline
-		} else { // show game info
-			uint16 y = 100;
-			const uint16 x = w->widget[NGWW_DETAILS].left + 5;
+				DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 132, STR_NETWORK_SERVER_OFFLINE, TC_FROMSTRING); // server offline
+			} else { // show game info
+				uint16 y = 100;
+				const uint16 x = w->widget[NGWW_DETAILS].left + 5;
 
-			DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 48, STR_NETWORK_GAME_INFO, TC_FROMSTRING);
+				DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 48, STR_NETWORK_GAME_INFO, TC_FROMSTRING);
 
 
-			SetDParamStr(0, sel->info.server_name);
-			DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 62, STR_ORANGE, TC_BLACK); // game name
-
-			SetDParamStr(0, sel->info.map_name);
-			DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 74, STR_02BD, TC_BLACK); // map name
-
-			SetDParam(0, sel->info.clients_on);
-			SetDParam(1, sel->info.clients_max);
-			SetDParam(2, sel->info.companies_on);
-			SetDParam(3, sel->info.companies_max);
-			DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
-			y += 10;
-
-			SetDParam(0, STR_NETWORK_LANG_ANY + sel->info.server_lang);
-			DrawString(x, y, STR_NETWORK_LANGUAGE, TC_GOLD); // server language
-			y += 10;
-
-			SetDParam(0, STR_TEMPERATE_LANDSCAPE + sel->info.map_set);
-			DrawString(x, y, STR_NETWORK_TILESET, TC_GOLD); // tileset
-			y += 10;
-
-			SetDParam(0, sel->info.map_width);
-			SetDParam(1, sel->info.map_height);
-			DrawString(x, y, STR_NETWORK_MAP_SIZE, TC_GOLD); // map size
-			y += 10;
+				SetDParamStr(0, sel->info.server_name);
+				DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 62, STR_ORANGE, TC_BLACK); // game name
 
-			SetDParamStr(0, sel->info.server_revision);
-			DrawString(x, y, STR_NETWORK_SERVER_VERSION, TC_GOLD); // server version
-			y += 10;
-
-			SetDParamStr(0, sel->info.hostname);
-			SetDParam(1, sel->port);
-			DrawString(x, y, STR_NETWORK_SERVER_ADDRESS, TC_GOLD); // server address
-			y += 10;
-
-			SetDParam(0, sel->info.start_date);
-			DrawString(x, y, STR_NETWORK_START_DATE, TC_GOLD); // start date
-			y += 10;
+				SetDParamStr(0, sel->info.map_name);
+				DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 74, STR_02BD, TC_BLACK); // map name
 
-			SetDParam(0, sel->info.game_date);
-			DrawString(x, y, STR_NETWORK_CURRENT_DATE, TC_GOLD); // current date
-			y += 10;
-
-			y += 2;
+				SetDParam(0, sel->info.clients_on);
+				SetDParam(1, sel->info.clients_max);
+				SetDParam(2, sel->info.companies_on);
+				SetDParam(3, sel->info.companies_max);
+				DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
+				y += 10;
 
-			if (!sel->info.compatible) {
-				DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, sel->info.version_compatible ? STR_NETWORK_GRF_MISMATCH : STR_NETWORK_VERSION_MISMATCH, TC_FROMSTRING); // server mismatch
-			} else if (sel->info.clients_on == sel->info.clients_max) {
-				/* Show: server full, when clients_on == clients_max */
-				DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_SERVER_FULL, TC_FROMSTRING); // server full
-			} else if (sel->info.use_password) {
-				DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_PASSWORD, TC_FROMSTRING); // password warning
+				SetDParam(0, STR_NETWORK_LANG_ANY + sel->info.server_lang);
+				DrawString(x, y, STR_NETWORK_LANGUAGE, TC_GOLD); // server language
+				y += 10;
+
+				SetDParam(0, STR_TEMPERATE_LANDSCAPE + sel->info.map_set);
+				DrawString(x, y, STR_NETWORK_TILESET, TC_GOLD); // tileset
+				y += 10;
+
+				SetDParam(0, sel->info.map_width);
+				SetDParam(1, sel->info.map_height);
+				DrawString(x, y, STR_NETWORK_MAP_SIZE, TC_GOLD); // map size
+				y += 10;
+
+				SetDParamStr(0, sel->info.server_revision);
+				DrawString(x, y, STR_NETWORK_SERVER_VERSION, TC_GOLD); // server version
+				y += 10;
+
+				SetDParamStr(0, sel->info.hostname);
+				SetDParam(1, sel->port);
+				DrawString(x, y, STR_NETWORK_SERVER_ADDRESS, TC_GOLD); // server address
+				y += 10;
+
+				SetDParam(0, sel->info.start_date);
+				DrawString(x, y, STR_NETWORK_START_DATE, TC_GOLD); // start date
+				y += 10;
+
+				SetDParam(0, sel->info.game_date);
+				DrawString(x, y, STR_NETWORK_CURRENT_DATE, TC_GOLD); // current date
+				y += 10;
+
+				y += 2;
+
+				if (!sel->info.compatible) {
+					DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, sel->info.version_compatible ? STR_NETWORK_GRF_MISMATCH : STR_NETWORK_VERSION_MISMATCH, TC_FROMSTRING); // server mismatch
+				} else if (sel->info.clients_on == sel->info.clients_max) {
+					/* Show: server full, when clients_on == clients_max */
+					DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_SERVER_FULL, TC_FROMSTRING); // server full
+				} else if (sel->info.use_password) {
+					DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_PASSWORD, TC_FROMSTRING); // password warning
+				}
+
+				y += 10;
+			}
+		} break;
+
+		case WE_CLICK:
+			nd->field = e->we.click.widget;
+			switch (e->we.click.widget) {
+				case NGWW_PLAYER:
+					ShowOnScreenKeyboard(w, &WP(w, network_ql_d).q,  NGWW_PLAYER, 0, 0);
+					break;
+
+				case NGWW_CANCEL: // Cancel button
+					DeleteWindowById(WC_NETWORK_WINDOW, 0);
+					break;
+
+				case NGWW_CONN_BTN: // 'Connection' droplist
+					ShowDropDownMenu(w, _lan_internet_types_dropdown, _network_lan_internet, NGWW_CONN_BTN, 0, 0); // do it for widget NSSW_CONN_BTN
+					break;
+
+				case NGWW_NAME: // Sort by name
+				case NGWW_CLIENTS: // Sort by connected clients
+				case NGWW_INFO: // Connectivity (green dot)
+					if (ld->sort_type == e->we.click.widget - NGWW_NAME) ld->flags ^= VL_DESC;
+					ld->flags |= VL_RESORT;
+					ld->sort_type = e->we.click.widget - NGWW_NAME;
+
+					_ng_sorting.order = !!(ld->flags & VL_DESC);
+					_ng_sorting.criteria = ld->sort_type;
+					SetWindowDirty(w);
+					break;
+
+				case NGWW_MATRIX: { // Matrix to show networkgames
+					NetworkGameList *cur_item;
+					uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW;
+
+					if (id_v >= w->vscroll.cap) return; // click out of bounds
+					id_v += w->vscroll.pos;
+
+					cur_item = _network_game_list;
+					for (; id_v > 0 && cur_item != NULL; id_v--) cur_item = cur_item->next;
+
+					nd->server = cur_item;
+					SetWindowDirty(w);
+				} break;
+
+				case NGWW_FIND: // Find server automatically
+					switch (_network_lan_internet) {
+						case 0: NetworkUDPSearchGame(); break;
+						case 1: NetworkUDPQueryMasterServer(); break;
+					}
+					break;
+
+				case NGWW_ADD: // Add a server
+					ShowQueryString(
+						BindCString(_network_default_ip),
+						STR_NETWORK_ENTER_IP,
+						31 | 0x1000,  // maximum number of characters OR
+						250, // characters up to this width pixels, whichever is satisfied first
+						w, CS_ALPHANUMERAL);
+					break;
+
+				case NGWW_START: // Start server
+					ShowNetworkStartServerWindow();
+					break;
+
+				case NGWW_JOIN: // Join Game
+					if (nd->server != NULL) {
+						snprintf(_network_last_host, sizeof(_network_last_host), "%s", inet_ntoa(*(struct in_addr *)&nd->server->ip));
+						_network_last_port = nd->server->port;
+						ShowNetworkLobbyWindow(nd->server);
+					}
+					break;
+
+				case NGWW_REFRESH: // Refresh
+					if (nd->server != NULL) NetworkUDPQueryServer(nd->server->info.hostname, nd->server->port);
+					break;
+
+				case NGWW_NEWGRF: // NewGRF Settings
+					if (nd->server != NULL) ShowNewGRFSettings(false, false, false, &nd->server->info.grfconfig);
+					break;
+			}
+			break;
+
+		case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
+			switch (e->we.dropdown.button) {
+				case NGWW_CONN_BTN:
+					_network_lan_internet = e->we.dropdown.index;
+					break;
+
+				default:
+					NOT_REACHED();
 			}
 
-			y += 10;
-		}
-	} break;
-
-	case WE_CLICK:
-		nd->field = e->we.click.widget;
-		switch (e->we.click.widget) {
-		case NGWW_CANCEL: // Cancel button
-			DeleteWindowById(WC_NETWORK_WINDOW, 0);
-			break;
-		case NGWW_CONN_BTN: // 'Connection' droplist
-			ShowDropDownMenu(w, _lan_internet_types_dropdown, _network_lan_internet, NGWW_CONN_BTN, 0, 0); // do it for widget NSSW_CONN_BTN
-			break;
-		case NGWW_NAME: // Sort by name
-		case NGWW_CLIENTS: // Sort by connected clients
-		case NGWW_INFO: // Connectivity (green dot)
-			if (ld->sort_type == e->we.click.widget - NGWW_NAME) ld->flags ^= VL_DESC;
-			ld->flags |= VL_RESORT;
-			ld->sort_type = e->we.click.widget - NGWW_NAME;
-
-			_ng_sorting.order = !!(ld->flags & VL_DESC);
-			_ng_sorting.criteria = ld->sort_type;
 			SetWindowDirty(w);
 			break;
-		case NGWW_MATRIX: { // Matrix to show networkgames
-			NetworkGameList *cur_item;
-			uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW;
-
-			if (id_v >= w->vscroll.cap) return; // click out of bounds
-			id_v += w->vscroll.pos;
-
-			cur_item = _network_game_list;
-			for (; id_v > 0 && cur_item != NULL; id_v--) cur_item = cur_item->next;
 
-			nd->server = cur_item;
-			SetWindowDirty(w);
-		} break;
-		case NGWW_FIND: // Find server automatically
-			switch (_network_lan_internet) {
-				case 0: NetworkUDPSearchGame(); break;
-				case 1: NetworkUDPQueryMasterServer(); break;
-			}
-			break;
-		case NGWW_ADD: { // Add a server
-			ShowQueryString(
-				BindCString(_network_default_ip),
-				STR_NETWORK_ENTER_IP,
-				31 | 0x1000,  // maximum number of characters OR
-				250, // characters up to this width pixels, whichever is satisfied first
-				w, CS_ALPHANUMERAL);
-		} break;
-		case NGWW_START: // Start server
-			ShowNetworkStartServerWindow();
-			break;
-		case NGWW_JOIN: // Join Game
-			if (nd->server != NULL) {
-				snprintf(_network_last_host, sizeof(_network_last_host), "%s", inet_ntoa(*(struct in_addr *)&nd->server->ip));
-				_network_last_port = nd->server->port;
-				ShowNetworkLobbyWindow(nd->server);
-			}
-			break;
-		case NGWW_REFRESH: // Refresh
-			if (nd->server != NULL)
-				NetworkUDPQueryServer(nd->server->info.hostname, nd->server->port);
-			break;
-		case NGWW_NEWGRF: // NewGRF Settings
-			if (nd->server != NULL) ShowNewGRFSettings(false, false, false, &nd->server->info.grfconfig);
+		case WE_MOUSELOOP:
+			if (nd->field == NGWW_PLAYER) HandleEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER);
 			break;
 
-	} break;
-
-	case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
-		switch (e->we.dropdown.button) {
-			case NGWW_CONN_BTN:
-				_network_lan_internet = e->we.dropdown.index;
-				break;
-			default:
-				NOT_REACHED();
-		}
-
-		SetWindowDirty(w);
-		break;
-
-	case WE_MOUSELOOP:
-		if (nd->field == NGWW_PLAYER) HandleEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER);
-		break;
-
-	case WE_MESSAGE:
-		if (e->we.message.msg != 0) nd->server = NULL;
-		ld->flags |= VL_REBUILD;
-		SetWindowDirty(w);
-		break;
-
-	case WE_KEYPRESS:
-		if (nd->field != NGWW_PLAYER) {
-			if (nd->server != NULL) {
-				if (e->we.keypress.keycode == WKC_DELETE) { // Press 'delete' to remove servers
-					NetworkGameListRemoveItem(nd->server);
-					NetworkRebuildHostList();
-					nd->server = NULL;
-				}
-			}
+		case WE_MESSAGE:
+			if (e->we.message.msg != 0) nd->server = NULL;
+			ld->flags |= VL_REBUILD;
+			SetWindowDirty(w);
 			break;
-		}
 
-		if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NGWW_PLAYER, e) == 1) break; // enter pressed
-
-		/* The name is only allowed when it starts with a letter! */
-		if (_edit_str_buf[0] != '\0' && _edit_str_buf[0] != ' ') {
-			ttd_strlcpy(_network_player_name, _edit_str_buf, lengthof(_network_player_name));
-		} else {
-			ttd_strlcpy(_network_player_name, "Player", lengthof(_network_player_name));
-		}
-
-		break;
-
-	case WE_ON_EDIT_TEXT:
-		NetworkAddServer(e->we.edittext.str);
-		NetworkRebuildHostList();
-		break;
-
-	case WE_RESIZE: {
-		w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height;
+		case WE_KEYPRESS:
+			if (nd->field != NGWW_PLAYER) {
+				if (nd->server != NULL) {
+					if (e->we.keypress.keycode == WKC_DELETE) { // Press 'delete' to remove servers
+						NetworkGameListRemoveItem(nd->server);
+						NetworkRebuildHostList();
+						nd->server = NULL;
+					}
+				}
+				break;
+			}
 
-		w->widget[NGWW_MATRIX].data = (w->vscroll.cap << 8) + 1;
-
-		SetVScrollCount(w, ld->list_length);
-
-		int widget_width = w->widget[NGWW_FIND].right - w->widget[NGWW_FIND].left;
-		int space = (w->width - 4 * widget_width - 25) / 3;
+			if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NGWW_PLAYER, e) == 1) break; // enter pressed
 
-		int offset = 10;
-		for (uint i = 0; i < 4; i++) {
-			w->widget[NGWW_FIND + i].left  = offset;
-			offset += widget_width;
-			w->widget[NGWW_FIND + i].right = offset;
-			offset += space;
-		}
-	} break;
+			/* The name is only allowed when it starts with a letter! */
+			if (_edit_str_net_buf[0] != '\0' && _edit_str_net_buf[0] != ' ') {
+				ttd_strlcpy(_network_player_name, _edit_str_net_buf, lengthof(_network_player_name));
+			} else {
+				ttd_strlcpy(_network_player_name, "Player", lengthof(_network_player_name));
+			}
 
-	case WE_DESTROY: // Nicely clean up the sort-list
-		free(WP(w, network_ql_d).sort_list);
-		break;
+			break;
+
+		case WE_ON_EDIT_TEXT:
+			NetworkAddServer(e->we.edittext.str);
+			NetworkRebuildHostList();
+			break;
+
+		case WE_RESIZE: {
+			w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height;
+
+			w->widget[NGWW_MATRIX].data = (w->vscroll.cap << 8) + 1;
+
+			SetVScrollCount(w, ld->list_length);
+
+			int widget_width = w->widget[NGWW_FIND].right - w->widget[NGWW_FIND].left;
+			int space = (w->width - 4 * widget_width - 25) / 3;
+
+			int offset = 10;
+			for (uint i = 0; i < 4; i++) {
+				w->widget[NGWW_FIND + i].left  = offset;
+				offset += widget_width;
+				w->widget[NGWW_FIND + i].right = offset;
+				offset += space;
+			}
+		} break;
+
+		case WE_DESTROY: // Nicely clean up the sort-list
+			free(WP(w, network_ql_d).sort_list);
+			break;
 	}
 }
 
 static const Widget _network_game_window_widgets[] = {
 /* TOP */
-{   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                       STR_018B_CLOSE_WINDOW},            // NGWW_CLOSE
-{    WWT_CAPTION,   RESIZE_RIGHT,  BGC,    11,   449,     0,    13, STR_NETWORK_MULTIPLAYER,        STR_NULL},
-{      WWT_PANEL,   RESIZE_RB,     BGC,     0,   449,    14,   263, 0x0,                            STR_NULL},
+{   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},            // NGWW_CLOSE
+{    WWT_CAPTION,   RESIZE_RIGHT,  BGC,    11,   449,     0,    13, STR_NETWORK_MULTIPLAYER,          STR_NULL},
+{      WWT_PANEL,   RESIZE_RB,     BGC,     0,   449,    14,   263, 0x0,                              STR_NULL},
 
-{       WWT_TEXT,   RESIZE_NONE,   BGC,     9,    85,    23,    35, STR_NETWORK_CONNECTION,         STR_NULL},
-{ WWT_DROPDOWNIN,   RESIZE_NONE,   BGC,    90,   181,    22,    33, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP},       // NGWW_CONN_BTN
+{       WWT_TEXT,   RESIZE_NONE,   BGC,     9,    85,    23,    35, STR_NETWORK_CONNECTION,           STR_NULL},
+{ WWT_DROPDOWNIN,   RESIZE_NONE,   BGC,    90,   181,    22,    33, STR_NETWORK_LAN_INTERNET_COMBO,   STR_NETWORK_CONNECTION_TIP},       // NGWW_CONN_BTN
 
-{      WWT_PANEL,   RESIZE_LR,     BGC,   290,   440,    22,    33, 0x0,                            STR_NETWORK_ENTER_NAME_TIP},       // NGWW_PLAYER
+{    WWT_EDITBOX,   RESIZE_LR,     BGC,   290,   440,    22,    33, STR_NETWORK_PLAYER_NAME_OSKTITLE, STR_NETWORK_ENTER_NAME_TIP},       // NGWW_PLAYER
 
 /* LEFT SIDE */
-{ WWT_PUSHTXTBTN,   RESIZE_RIGHT,  BTC,    10,    70,    42,    53, STR_NETWORK_GAME_NAME,          STR_NETWORK_GAME_NAME_TIP},        // NGWW_NAME
-{ WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,    71,   150,    42,    53, STR_NETWORK_CLIENTS_CAPTION,    STR_NETWORK_CLIENTS_CAPTION_TIP},  // NGWW_CLIENTS
-{ WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,   151,   190,    42,    53, STR_EMPTY,                      STR_NETWORK_INFO_ICONS_TIP},       // NGWW_INFO
+{ WWT_PUSHTXTBTN,   RESIZE_RIGHT,  BTC,    10,    70,    42,    53, STR_NETWORK_GAME_NAME,            STR_NETWORK_GAME_NAME_TIP},        // NGWW_NAME
+{ WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,    71,   150,    42,    53, STR_NETWORK_CLIENTS_CAPTION,      STR_NETWORK_CLIENTS_CAPTION_TIP},  // NGWW_CLIENTS
+{ WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,   151,   190,    42,    53, STR_EMPTY,                        STR_NETWORK_INFO_ICONS_TIP},       // NGWW_INFO
 
-{     WWT_MATRIX,   RESIZE_RB,     BGC,    10,   190,    54,   236, (13 << 8) + 1,                  STR_NETWORK_CLICK_GAME_TO_SELECT}, // NGWW_MATRIX
-{  WWT_SCROLLBAR,   RESIZE_LRB,    BGC,   191,   202,    42,   236, 0x0,                            STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{     WWT_MATRIX,   RESIZE_RB,     BGC,    10,   190,    54,   236, (13 << 8) + 1,                    STR_NETWORK_CLICK_GAME_TO_SELECT}, // NGWW_MATRIX
+{  WWT_SCROLLBAR,   RESIZE_LRB,    BGC,   191,   202,    42,   236, 0x0,                              STR_0190_SCROLL_BAR_SCROLLS_LIST},
 
 /* RIGHT SIDE */
-{      WWT_PANEL,   RESIZE_LRB,    BGC,   210,   440,    42,   236, 0x0,                            STR_NULL},                         // NGWW_DETAILS
+{      WWT_PANEL,   RESIZE_LRB,    BGC,   210,   440,    42,   236, 0x0,                              STR_NULL},                         // NGWW_DETAILS
 
-{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   215,   315,   215,   226, STR_NETWORK_JOIN_GAME,          STR_NULL},                         // NGWW_JOIN
-{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   215,   226, STR_NETWORK_REFRESH,            STR_NETWORK_REFRESH_TIP},          // NGWW_REFRESH
+{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   215,   315,   215,   226, STR_NETWORK_JOIN_GAME,            STR_NULL},                         // NGWW_JOIN
+{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   215,   226, STR_NETWORK_REFRESH,              STR_NETWORK_REFRESH_TIP},          // NGWW_REFRESH
 
-{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   197,   208, STR_NEWGRF_SETTINGS_BUTTON,     STR_NULL},                         // NGWW_NEWGRF
+{ WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   197,   208, STR_NEWGRF_SETTINGS_BUTTON,       STR_NULL},                         // NGWW_NEWGRF
 
 /* BOTTOM */
-{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,    10,   110,   246,   257, STR_NETWORK_FIND_SERVER,        STR_NETWORK_FIND_SERVER_TIP},      // NGWW_FIND
-{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   118,   218,   246,   257, STR_NETWORK_ADD_SERVER,         STR_NETWORK_ADD_SERVER_TIP},       // NGWW_ADD
-{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   226,   326,   246,   257, STR_NETWORK_START_SERVER,       STR_NETWORK_START_SERVER_TIP},     // NGWW_START
-{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   334,   434,   246,   257, STR_012E_CANCEL,                STR_NULL},                         // NGWW_CANCEL
+{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,    10,   110,   246,   257, STR_NETWORK_FIND_SERVER,          STR_NETWORK_FIND_SERVER_TIP},      // NGWW_FIND
+{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   118,   218,   246,   257, STR_NETWORK_ADD_SERVER,           STR_NETWORK_ADD_SERVER_TIP},       // NGWW_ADD
+{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   226,   326,   246,   257, STR_NETWORK_START_SERVER,         STR_NETWORK_START_SERVER_TIP},     // NGWW_START
+{ WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   334,   434,   246,   257, STR_012E_CANCEL,                  STR_NULL},                         // NGWW_CANCEL
 
-{  WWT_RESIZEBOX,   RESIZE_LRTB,   BGC,   438,   449,   252,   263, 0x0,                            STR_RESIZE_BUTTON },
+{  WWT_RESIZEBOX,   RESIZE_LRTB,   BGC,   438,   449,   252,   263, 0x0,                              STR_RESIZE_BUTTON },
 
 {   WIDGETS_END},
 };
@@ -613,12 +625,11 @@
 void ShowNetworkGameWindow()
 {
 	static bool first = true;
-	Window *w;
 	DeleteWindowById(WC_NETWORK_WINDOW, 0);
 
 	/* Only show once */
 	if (first) {
-		char* const *srv;
+		char * const *srv;
 
 		first = false;
 		// add all servers from the config file to our list
@@ -630,13 +641,13 @@
 		_ng_sorting.order = 0;    // sort ascending by default
 	}
 
-	w = AllocateWindowDesc(&_network_game_window_desc);
+	Window *w = AllocateWindowDesc(&_network_game_window_desc);
 	if (w != NULL) {
 		querystr_d *querystr = &WP(w, network_ql_d).q;
 
-		ttd_strlcpy(_edit_str_buf, _network_player_name, lengthof(_edit_str_buf));
+		ttd_strlcpy(_edit_str_net_buf, _network_player_name, lengthof(_edit_str_net_buf));
 		querystr->afilter = CS_ALPHANUMERAL;
-		InitializeTextBuffer(&querystr->text, _edit_str_buf, lengthof(_edit_str_buf), 120);
+		InitializeTextBuffer(&querystr->text, _edit_str_net_buf, lengthof(_edit_str_net_buf), 120);
 
 		UpdateNetworkGameWindow(true);
 	}
@@ -683,242 +694,254 @@
 	network_d *nd = &WP(w, network_ql_d).n;
 
 	switch (e->event) {
-	case WE_CREATE: // focus input box
-		nd->field = NSSW_GAMENAME;
-		_network_game_info.use_password = (_network_server_password[0] != '\0');
-		break;
-
-	case WE_PAINT: {
-		int y = NSSWND_START, pos;
-		const FiosItem *item;
-
-		/* draw basic widgets */
-		SetDParam(1, _connection_types_dropdown[_network_advertise]);
-		SetDParam(2, _network_game_info.clients_max);
-		SetDParam(3, _network_game_info.companies_max);
-		SetDParam(4, _network_game_info.spectators_max);
-		SetDParam(5, STR_NETWORK_LANG_ANY + _network_game_info.server_lang);
-		DrawWindowWidgets(w);
-
-		/* editbox to set game name */
-		DrawEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME);
-
-		/* if password is set, draw red '*' next to 'Set password' button */
-		if (_network_game_info.use_password) DoDrawString("*", 408, 23, TC_RED);
-
-		/* draw list of maps */
-		GfxFillRect(11, 63, 258, 215, 0xD7);  // black background of maps list
-
-		pos = w->vscroll.pos;
-		while (pos < _fios_num + 1) {
-			item = _fios_list + pos - 1;
-			if (item == nd->map || (pos == 0 && nd->map == NULL))
-				GfxFillRect(11, y - 1, 258, y + 10, 155); // show highlighted item with a different colour
-
-			if (pos == 0) {
-				DrawString(14, y, STR_4010_GENERATE_RANDOM_NEW_GAME, TC_DARK_GREEN);
-			} else {
-				DoDrawString(item->title, 14, y, _fios_colors[item->type] );
-			}
-			pos++;
-			y += NSSWND_ROWSIZE;
-
-			if (y >= w->vscroll.cap * NSSWND_ROWSIZE + NSSWND_START) break;
-		}
-	} break;
-
-	case WE_CLICK:
-		nd->field = e->we.click.widget;
-		switch (e->we.click.widget) {
-		case NSSW_CLOSE:  // Close 'X'
-		case NSSW_CANCEL: // Cancel button
-			ShowNetworkGameWindow();
+		case WE_CREATE: // focus input box
+			nd->field = NSSW_GAMENAME;
+			_network_game_info.use_password = (_network_server_password[0] != '\0');
 			break;
 
-		case NSSW_SETPWD: // Set password button
-			nd->widget_id = NSSW_SETPWD;
-			ShowQueryString(BindCString(_network_server_password), STR_NETWORK_SET_PASSWORD, 20, 250, w, CS_ALPHANUMERAL);
+		case WE_PAINT: {
+			int y = NSSWND_START, pos;
+			const FiosItem *item;
+
+			/* draw basic widgets */
+			SetDParam(1, _connection_types_dropdown[_network_advertise]);
+			SetDParam(2, _network_game_info.clients_max);
+			SetDParam(3, _network_game_info.companies_max);
+			SetDParam(4, _network_game_info.spectators_max);
+			SetDParam(5, STR_NETWORK_LANG_ANY + _network_game_info.server_lang);
+			DrawWindowWidgets(w);
+
+			/* editbox to set game name */
+			DrawEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME);
+
+			/* if password is set, draw red '*' next to 'Set password' button */
+			if (_network_game_info.use_password) DoDrawString("*", 408, 23, TC_RED);
+
+			/* draw list of maps */
+			GfxFillRect(11, 63, 258, 215, 0xD7);  // black background of maps list
+
+			pos = w->vscroll.pos;
+			while (pos < _fios_num + 1) {
+				item = _fios_list + pos - 1;
+				if (item == nd->map || (pos == 0 && nd->map == NULL))
+					GfxFillRect(11, y - 1, 258, y + 10, 155); // show highlighted item with a different colour
+
+				if (pos == 0) {
+					DrawString(14, y, STR_4010_GENERATE_RANDOM_NEW_GAME, TC_DARK_GREEN);
+				} else {
+					DoDrawString(item->title, 14, y, _fios_colors[item->type] );
+				}
+				pos++;
+				y += NSSWND_ROWSIZE;
+
+				if (y >= w->vscroll.cap * NSSWND_ROWSIZE + NSSWND_START) break;
+			}
+		} break;
+
+		case WE_CLICK:
+			if (e->we.click.widget != NSSW_CONNTYPE_BTN && e->we.click.widget != NSSW_LANGUAGE_BTN) HideDropDownMenu(w);
+			nd->field = e->we.click.widget;
+			switch (e->we.click.widget) {
+				case NSSW_CLOSE:  // Close 'X'
+				case NSSW_CANCEL: // Cancel button
+					ShowNetworkGameWindow();
+					break;
+
+				case NSSW_GAMENAME:
+					ShowOnScreenKeyboard(w, &WP(w, network_ql_d).q,  NSSW_GAMENAME, 0, 0);
+					break;
+
+				case NSSW_SETPWD: // Set password button
+					nd->widget_id = NSSW_SETPWD;
+					ShowQueryString(BindCString(_network_server_password), STR_NETWORK_SET_PASSWORD, 20, 250, w, CS_ALPHANUMERAL);
+					break;
+
+				case NSSW_SELMAP: { // Select map
+					int y = (e->we.click.pt.y - NSSWND_START) / NSSWND_ROWSIZE;
+
+					y += w->vscroll.pos;
+					if (y >= w->vscroll.count) return;
+
+					nd->map = (y == 0) ? NULL : _fios_list + y - 1;
+					SetWindowDirty(w);
+				} break;
+
+				case NSSW_CONNTYPE_BTN: // Connection type
+					ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, NSSW_CONNTYPE_BTN, 0, 0); // do it for widget NSSW_CONNTYPE_BTN
+					break;
+
+				case NSSW_CLIENTS_BTND:    case NSSW_CLIENTS_BTNU:    // Click on up/down button for number of clients
+				case NSSW_COMPANIES_BTND:  case NSSW_COMPANIES_BTNU:  // Click on up/down button for number of companies
+				case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU: // Click on up/down button for number of spectators
+					/* Don't allow too fast scrolling */
+					if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
+						w->HandleButtonClick(e->we.click.widget);
+						SetWindowDirty(w);
+						switch (e->we.click.widget) {
+							default: NOT_REACHED();
+							case NSSW_CLIENTS_BTND: case NSSW_CLIENTS_BTNU:
+								_network_game_info.clients_max    = Clamp(_network_game_info.clients_max    + e->we.click.widget - NSSW_CLIENTS_TXT,    2, MAX_CLIENTS);
+								break;
+							case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU:
+								_network_game_info.companies_max  = Clamp(_network_game_info.companies_max  + e->we.click.widget - NSSW_COMPANIES_TXT,  1, MAX_PLAYERS);
+								break;
+							case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU:
+								_network_game_info.spectators_max = Clamp(_network_game_info.spectators_max + e->we.click.widget - NSSW_SPECTATORS_TXT, 0, MAX_CLIENTS);
+								break;
+						}
+					}
+					_left_button_clicked = false;
+					break;
+
+				case NSSW_CLIENTS_TXT:    // Click on number of players
+					nd->widget_id = NSSW_CLIENTS_TXT;
+					SetDParam(0, _network_game_info.clients_max);
+					ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_CLIENTS,    3, 50, w, CS_NUMERAL);
+					break;
+
+				case NSSW_COMPANIES_TXT:  // Click on number of companies
+					nd->widget_id = NSSW_COMPANIES_TXT;
+					SetDParam(0, _network_game_info.companies_max);
+					ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_COMPANIES,  3, 50, w, CS_NUMERAL);
+					break;
+
+				case NSSW_SPECTATORS_TXT: // Click on number of spectators
+					nd->widget_id = NSSW_SPECTATORS_TXT;
+					SetDParam(0, _network_game_info.spectators_max);
+					ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_SPECTATORS, 3, 50, w, CS_NUMERAL);
+					break;
+
+				case NSSW_LANGUAGE_BTN: { // Language
+					uint sel = 0;
+					for (uint i = 0; i < lengthof(_language_dropdown) - 1; i++) {
+						if (_language_dropdown[i] == STR_NETWORK_LANG_ANY + _network_game_info.server_lang) {
+							sel = i;
+							break;
+						}
+					}
+					ShowDropDownMenu(w, _language_dropdown, sel, NSSW_LANGUAGE_BTN, 0, 0);
+				} break;
+
+				case NSSW_START: // Start game
+					_is_network_server = true;
+
+					if (nd->map == NULL) { // start random new game
+						ShowGenerateLandscape();
+					} else { // load a scenario
+						char *name = FiosBrowseTo(nd->map);
+						if (name != NULL) {
+							SetFiosType(nd->map->type);
+							_file_to_saveload.filetype = FT_SCENARIO;
+							ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
+							ttd_strlcpy(_file_to_saveload.title, nd->map->title, sizeof(_file_to_saveload.title));
+
+							DeleteWindow(w);
+							SwitchMode(SM_START_SCENARIO);
+						}
+					}
+					break;
+
+				case NSSW_LOAD: // Load game
+					_is_network_server = true;
+					/* XXX - WC_NETWORK_WINDOW (this window) should stay, but if it stays, it gets
+					* copied all the elements of 'load game' and upon closing that, it segfaults */
+					DeleteWindow(w);
+					ShowSaveLoadDialog(SLD_LOAD_GAME);
+					break;
+			}
 			break;
 
-		case NSSW_SELMAP: { // Select map
-			int y = (e->we.click.pt.y - NSSWND_START) / NSSWND_ROWSIZE;
+		case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
+			switch (e->we.dropdown.button) {
+				case NSSW_CONNTYPE_BTN:
+					_network_advertise = (e->we.dropdown.index != 0);
+					break;
+				case NSSW_LANGUAGE_BTN:
+					_network_game_info.server_lang = _language_dropdown[e->we.dropdown.index] - STR_NETWORK_LANG_ANY;
+					break;
+				default:
+					NOT_REACHED();
+			}
 
-			y += w->vscroll.pos;
-			if (y >= w->vscroll.count) return;
-
-			nd->map = (y == 0) ? NULL : _fios_list + y - 1;
 			SetWindowDirty(w);
-			} break;
-		case NSSW_CONNTYPE_BTN: // Connection type
-			ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, NSSW_CONNTYPE_BTN, 0, 0); // do it for widget NSSW_CONNTYPE_BTN
 			break;
-		case NSSW_CLIENTS_BTND:    case NSSW_CLIENTS_BTNU:    // Click on up/down button for number of clients
-		case NSSW_COMPANIES_BTND:  case NSSW_COMPANIES_BTNU:  // Click on up/down button for number of companies
-		case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU: // Click on up/down button for number of spectators
-			/* Don't allow too fast scrolling */
-			if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
-				w->HandleButtonClick(e->we.click.widget);
-				SetWindowDirty(w);
-				switch (e->we.click.widget) {
+
+		case WE_MOUSELOOP:
+			if (nd->field == NSSW_GAMENAME) HandleEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME);
+			break;
+
+		case WE_KEYPRESS:
+			if (nd->field == NSSW_GAMENAME) {
+				if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NSSW_GAMENAME, e) == 1) break; // enter pressed
+
+				ttd_strlcpy(_network_server_name, WP(w, network_ql_d).q.text.buf, sizeof(_network_server_name));
+			}
+			break;
+
+		case WE_ON_EDIT_TEXT:
+			if (e->we.edittext.str == NULL) break;
+
+			if (nd->widget_id == NSSW_SETPWD) {
+				ttd_strlcpy(_network_server_password, e->we.edittext.str, lengthof(_network_server_password));
+				_network_game_info.use_password = (_network_server_password[0] != '\0');
+			} else {
+				int32 value = atoi(e->we.edittext.str);
+				w->InvalidateWidget(nd->widget_id);
+				switch (nd->widget_id) {
 					default: NOT_REACHED();
-					case NSSW_CLIENTS_BTND: case NSSW_CLIENTS_BTNU:
-						_network_game_info.clients_max    = Clamp(_network_game_info.clients_max    + e->we.click.widget - NSSW_CLIENTS_TXT,    2, MAX_CLIENTS);
-						break;
-					case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU:
-						_network_game_info.companies_max  = Clamp(_network_game_info.companies_max  + e->we.click.widget - NSSW_COMPANIES_TXT,  1, MAX_PLAYERS);
-						break;
-					case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU:
-						_network_game_info.spectators_max = Clamp(_network_game_info.spectators_max + e->we.click.widget - NSSW_SPECTATORS_TXT, 0, MAX_CLIENTS);
-						break;
+					case NSSW_CLIENTS_TXT:    _network_game_info.clients_max    = Clamp(value, 2, MAX_CLIENTS); break;
+					case NSSW_COMPANIES_TXT:  _network_game_info.companies_max  = Clamp(value, 1, MAX_PLAYERS); break;
+					case NSSW_SPECTATORS_TXT: _network_game_info.spectators_max = Clamp(value, 0, MAX_CLIENTS); break;
 				}
 			}
-			_left_button_clicked = false;
-			break;
-		case NSSW_CLIENTS_TXT:    // Click on number of players
-			nd->widget_id = NSSW_CLIENTS_TXT;
-			SetDParam(0, _network_game_info.clients_max);
-			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_CLIENTS,    3, 50, w, CS_NUMERAL);
-			break;
-		case NSSW_COMPANIES_TXT:  // Click on number of companies
-			nd->widget_id = NSSW_COMPANIES_TXT;
-			SetDParam(0, _network_game_info.companies_max);
-			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_COMPANIES,  3, 50, w, CS_NUMERAL);
-			break;
-		case NSSW_SPECTATORS_TXT: // Click on number of spectators
-			nd->widget_id = NSSW_SPECTATORS_TXT;
-			SetDParam(0, _network_game_info.spectators_max);
-			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_SPECTATORS, 3, 50, w, CS_NUMERAL);
-			break;
-		case NSSW_LANGUAGE_BTN: { // Language
-			uint sel = 0;
-			for (uint i = 0; i < lengthof(_language_dropdown) - 1; i++) {
-				if (_language_dropdown[i] == STR_NETWORK_LANG_ANY + _network_game_info.server_lang) {
-					sel = i;
-					break;
-				}
-			}
-			ShowDropDownMenu(w, _language_dropdown, sel, NSSW_LANGUAGE_BTN, 0, 0);
-			break;
-		}
-		case NSSW_START: // Start game
-			_is_network_server = true;
 
-			if (nd->map == NULL) { // start random new game
-				ShowGenerateLandscape();
-			} else { // load a scenario
-				char *name = FiosBrowseTo(nd->map);
-				if (name != NULL) {
-					SetFiosType(nd->map->type);
-					_file_to_saveload.filetype = FT_SCENARIO;
-					ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
-					ttd_strlcpy(_file_to_saveload.title, nd->map->title, sizeof(_file_to_saveload.title));
-
-					DeleteWindow(w);
-					SwitchMode(SM_START_SCENARIO);
-				}
-			}
+			SetWindowDirty(w);
 			break;
-		case NSSW_LOAD: // Load game
-			_is_network_server = true;
-			/* XXX - WC_NETWORK_WINDOW (this window) should stay, but if it stays, it gets
-			 * copied all the elements of 'load game' and upon closing that, it segfaults */
-			DeleteWindow(w);
-			ShowSaveLoadDialog(SLD_LOAD_GAME);
-			break;
-		}
-		break;
-
-	case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
-		switch (e->we.dropdown.button) {
-			case NSSW_CONNTYPE_BTN:
-				_network_advertise = (e->we.dropdown.index != 0);
-				break;
-			case NSSW_LANGUAGE_BTN:
-				_network_game_info.server_lang = _language_dropdown[e->we.dropdown.index] - STR_NETWORK_LANG_ANY;
-				break;
-			default:
-				NOT_REACHED();
-		}
-
-		SetWindowDirty(w);
-		break;
-
-	case WE_MOUSELOOP:
-		if (nd->field == NSSW_GAMENAME) HandleEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME);
-		break;
-
-	case WE_KEYPRESS:
-		if (nd->field == NSSW_GAMENAME) {
-			if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NSSW_GAMENAME, e) == 1) break; // enter pressed
-
-			ttd_strlcpy(_network_server_name, WP(w, network_ql_d).q.text.buf, sizeof(_network_server_name));
-		}
-		break;
-
-	case WE_ON_EDIT_TEXT:
-		if (e->we.edittext.str == NULL) break;
-
-		if (nd->widget_id == NSSW_SETPWD) {
-			ttd_strlcpy(_network_server_password, e->we.edittext.str, lengthof(_network_server_password));
-			_network_game_info.use_password = (_network_server_password[0] != '\0');
-		} else {
-			int32 value = atoi(e->we.edittext.str);
-			w->InvalidateWidget(nd->widget_id);
-			switch (nd->widget_id) {
-				default: NOT_REACHED();
-				case NSSW_CLIENTS_TXT:    _network_game_info.clients_max    = Clamp(value, 2, MAX_CLIENTS); break;
-				case NSSW_COMPANIES_TXT:  _network_game_info.companies_max  = Clamp(value, 1, MAX_PLAYERS); break;
-				case NSSW_SPECTATORS_TXT: _network_game_info.spectators_max = Clamp(value, 0, MAX_CLIENTS); break;
-			}
-		}
-
-		SetWindowDirty(w);
-		break;
 	}
 }
 
 static const Widget _network_start_server_window_widgets[] = {
 /* Window decoration and background panel */
-{   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW },               // NSSW_CLOSE
-{    WWT_CAPTION,   RESIZE_NONE,   BGC,    11,   419,     0,    13, STR_NETWORK_START_GAME_WINDOW,    STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,   BGC,     0,   419,    14,   243, 0x0,                              STR_NULL},
+{   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                           STR_018B_CLOSE_WINDOW },               // NSSW_CLOSE
+{    WWT_CAPTION,   RESIZE_NONE,   BGC,    11,   419,     0,    13, STR_NETWORK_START_GAME_WINDOW,      STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,   BGC,     0,   419,    14,   243, 0x0,                                STR_NULL},
 
 /* Set game name and password widgets */
-{       WWT_TEXT,   RESIZE_NONE,   BGC,    10,    90,    22,    34, STR_NETWORK_NEW_GAME_NAME,        STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,   BGC,   100,   272,    22,    33, 0x0,                              STR_NETWORK_NEW_GAME_NAME_TIP},        // NSSW_GAMENAME
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   285,   405,    22,    33, STR_NETWORK_SET_PASSWORD,         STR_NETWORK_PASSWORD_TIP},             // NSSW_SETPWD
+{       WWT_TEXT,   RESIZE_NONE,   BGC,    10,    90,    22,    34, STR_NETWORK_NEW_GAME_NAME,          STR_NULL},
+{    WWT_EDITBOX,   RESIZE_NONE,   BGC,   100,   272,    22,    33, STR_NETWORK_NEW_GAME_NAME_OSKTITLE, STR_NETWORK_NEW_GAME_NAME_TIP},        // NSSW_GAMENAME
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   285,   405,    22,    33, STR_NETWORK_SET_PASSWORD,           STR_NETWORK_PASSWORD_TIP},             // NSSW_SETPWD
 
 /* List of playable scenarios */
-{       WWT_TEXT,   RESIZE_NONE,   BGC,    10,   110,    43,    55, STR_NETWORK_SELECT_MAP,           STR_NULL},
-{      WWT_INSET,   RESIZE_NONE,   BGC,    10,   271,    62,   216, STR_NULL,                         STR_NETWORK_SELECT_MAP_TIP},           // NSSW_SELMAP
-{  WWT_SCROLLBAR,   RESIZE_NONE,   BGC,   259,   270,    63,   215, 0x0,                              STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{       WWT_TEXT,   RESIZE_NONE,   BGC,    10,   110,    43,    55, STR_NETWORK_SELECT_MAP,             STR_NULL},
+{      WWT_INSET,   RESIZE_NONE,   BGC,    10,   271,    62,   216, STR_NULL,                           STR_NETWORK_SELECT_MAP_TIP},           // NSSW_SELMAP
+{  WWT_SCROLLBAR,   RESIZE_NONE,   BGC,   259,   270,    63,   215, 0x0,                                STR_0190_SCROLL_BAR_SCROLLS_LIST},
 
 /* Combo/selection boxes to control Connection Type / Max Clients / Max Companies / Max Observers / Language */
-{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,    63,    75, STR_NETWORK_CONNECTION,           STR_NULL},
-{ WWT_DROPDOWNIN,   RESIZE_NONE,   BGC,   280,   410,    77,    88, STR_NETWORK_LAN_INTERNET_COMBO,   STR_NETWORK_CONNECTION_TIP},           // NSSW_CONNTYPE_BTN
-
-{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,    95,   107, STR_NETWORK_NUMBER_OF_CLIENTS,    STR_NULL},
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   109,   120, SPR_ARROW_DOWN,                   STR_NETWORK_NUMBER_OF_CLIENTS_TIP},    // NSSW_CLIENTS_BTND
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   109,   120, STR_NETWORK_CLIENTS_SELECT,       STR_NETWORK_NUMBER_OF_CLIENTS_TIP},    // NSSW_CLIENTS_TXT
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   109,   120, SPR_ARROW_UP,                     STR_NETWORK_NUMBER_OF_CLIENTS_TIP},    // NSSW_CLIENTS_BTNU
+{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,    63,    75, STR_NETWORK_CONNECTION,             STR_NULL},
+{ WWT_DROPDOWNIN,   RESIZE_NONE,   BGC,   280,   410,    77,    88, STR_NETWORK_LAN_INTERNET_COMBO,     STR_NETWORK_CONNECTION_TIP},           // NSSW_CONNTYPE_BTN
 
-{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,   127,   139, STR_NETWORK_NUMBER_OF_COMPANIES,  STR_NULL},
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   141,   152, SPR_ARROW_DOWN,                   STR_NETWORK_NUMBER_OF_COMPANIES_TIP},  // NSSW_COMPANIES_BTND
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   141,   152, STR_NETWORK_COMPANIES_SELECT,     STR_NETWORK_NUMBER_OF_COMPANIES_TIP},  // NSSW_COMPANIES_TXT
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   141,   152, SPR_ARROW_UP,                     STR_NETWORK_NUMBER_OF_COMPANIES_TIP},  // NSSW_COMPANIES_BTNU
+{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,    95,   107, STR_NETWORK_NUMBER_OF_CLIENTS,      STR_NULL},
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   109,   120, SPR_ARROW_DOWN,                     STR_NETWORK_NUMBER_OF_CLIENTS_TIP},    // NSSW_CLIENTS_BTND
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   109,   120, STR_NETWORK_CLIENTS_SELECT,         STR_NETWORK_NUMBER_OF_CLIENTS_TIP},    // NSSW_CLIENTS_TXT
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   109,   120, SPR_ARROW_UP,                       STR_NETWORK_NUMBER_OF_CLIENTS_TIP},    // NSSW_CLIENTS_BTNU
 
-{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,   159,   171, STR_NETWORK_NUMBER_OF_SPECTATORS, STR_NULL},
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   173,   184, SPR_ARROW_DOWN,                   STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTND
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   173,   184, STR_NETWORK_SPECTATORS_SELECT,    STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_TXT
-{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   173,   184, SPR_ARROW_UP,                     STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTNU
+{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,   127,   139, STR_NETWORK_NUMBER_OF_COMPANIES,    STR_NULL},
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   141,   152, SPR_ARROW_DOWN,                     STR_NETWORK_NUMBER_OF_COMPANIES_TIP},  // NSSW_COMPANIES_BTND
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   141,   152, STR_NETWORK_COMPANIES_SELECT,       STR_NETWORK_NUMBER_OF_COMPANIES_TIP},  // NSSW_COMPANIES_TXT
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   141,   152, SPR_ARROW_UP,                       STR_NETWORK_NUMBER_OF_COMPANIES_TIP},  // NSSW_COMPANIES_BTNU
 
-{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,   191,   203, STR_NETWORK_LANGUAGE_SPOKEN,      STR_NULL},
-{ WWT_DROPDOWNIN,   RESIZE_NONE,   BGC,   280,   410,   205,   216, STR_NETWORK_LANGUAGE_COMBO,       STR_NETWORK_LANGUAGE_TIP},             // NSSW_LANGUAGE_BTN
+{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,   159,   171, STR_NETWORK_NUMBER_OF_SPECTATORS,   STR_NULL},
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   173,   184, SPR_ARROW_DOWN,                     STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTND
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   173,   184, STR_NETWORK_SPECTATORS_SELECT,      STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_TXT
+{     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   173,   184, SPR_ARROW_UP,                       STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTNU
+
+{       WWT_TEXT,   RESIZE_NONE,   BGC,   280,   419,   191,   203, STR_NETWORK_LANGUAGE_SPOKEN,        STR_NULL},
+{ WWT_DROPDOWNIN,   RESIZE_NONE,   BGC,   280,   410,   205,   216, STR_NETWORK_LANGUAGE_COMBO,         STR_NETWORK_LANGUAGE_TIP},             // NSSW_LANGUAGE_BTN
 
 /* Buttons Start / Load / Cancel */
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    40,   140,   224,   235, STR_NETWORK_START_GAME,           STR_NETWORK_START_GAME_TIP},           // NSSW_START
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   150,   250,   224,   235, STR_NETWORK_LOAD_GAME,            STR_NETWORK_LOAD_GAME_TIP},            // NSSW_LOAD
-{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   260,   360,   224,   235, STR_012E_CANCEL,                  STR_NULL},                             // NSSW_CANCEL
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    40,   140,   224,   235, STR_NETWORK_START_GAME,             STR_NETWORK_START_GAME_TIP},           // NSSW_START
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   150,   250,   224,   235, STR_NETWORK_LOAD_GAME,              STR_NETWORK_LOAD_GAME_TIP},            // NSSW_LOAD
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   260,   360,   224,   235, STR_012E_CANCEL,                    STR_NULL},                             // NSSW_CANCEL
 
 {   WIDGETS_END},
 };
@@ -933,11 +956,10 @@
 
 static void ShowNetworkStartServerWindow()
 {
-	Window *w;
 	DeleteWindowById(WC_NETWORK_WINDOW, 0);
 
-	w = AllocateWindowDesc(&_network_start_server_window_desc);
-	ttd_strlcpy(_edit_str_buf, _network_server_name, lengthof(_edit_str_buf));
+	Window *w = AllocateWindowDesc(&_network_start_server_window_desc);
+	ttd_strlcpy(_edit_str_net_buf, _network_server_name, lengthof(_edit_str_net_buf));
 
 	_saveload_mode = SLD_NEW_GAME;
 	BuildFileList();
@@ -945,16 +967,13 @@
 	w->vscroll.count = _fios_num + 1;
 
 	WP(w, network_ql_d).q.afilter = CS_ALPHANUMERAL;
-	InitializeTextBuffer(&WP(w, network_ql_d).q.text, _edit_str_buf, lengthof(_edit_str_buf), 160);
+	InitializeTextBuffer(&WP(w, network_ql_d).q.text, _edit_str_net_buf, lengthof(_edit_str_net_buf), 160);
 }
 
 static PlayerID NetworkLobbyFindCompanyIndex(byte pos)
 {
-	PlayerID i;
-
-	/* Scroll through all _network_player_info and get the 'pos' item
-	    that is not empty */
-	for (i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
+	/* Scroll through all _network_player_info and get the 'pos' item that is not empty */
+	for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
 		if (_network_player_info[i].company_name[0] != '\0') {
 			if (pos-- == 0) return i;
 		}
@@ -989,142 +1008,148 @@
 	network_d *nd = &WP(w, network_d);
 
 	switch (e->event) {
-	case WE_CREATE:
-		nd->company = INVALID_PLAYER;
-		break;
-
-	case WE_PAINT: {
-		const NetworkGameInfo *gi = &nd->server->info;
-		int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos;
-
-		/* Join button is disabled when no company is selected */
-		w->SetWidgetDisabledState(NLWW_JOIN, nd->company == INVALID_PLAYER);
-		/* Cannot start new company if there are too many */
-		w->SetWidgetDisabledState(NLWW_NEW, gi->companies_on >= gi->companies_max);
-		/* Cannot spectate if there are too many spectators */
-		w->SetWidgetDisabledState(NLWW_SPECTATE, gi->spectators_on >= gi->spectators_max);
-
-		/* Draw window widgets */
-		SetDParamStr(0, gi->server_name);
-		DrawWindowWidgets(w);
-
-		/* Draw company list */
-		pos = w->vscroll.pos;
-		while (pos < gi->companies_on) {
-			byte company = NetworkLobbyFindCompanyIndex(pos);
-			bool income = false;
-			if (nd->company == company)
-				GfxFillRect(11, y - 1, 154, y + 10, 10); // show highlighted item with a different colour
-
-			DoDrawStringTruncated(_network_player_info[company].company_name, 13, y, TC_BLACK, 135 - 13);
-			if (_network_player_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, 135, y);
-
-			/* If the company's income was positive puts a green dot else a red dot */
-			if (_network_player_info[company].income >= 0) income = true;
-			DrawSprite(SPR_BLOT, income ? PALETTE_TO_GREEN : PALETTE_TO_RED, 145, y);
-
-			pos++;
-			y += NET_PRC__SIZE_OF_ROW;
-			if (pos >= w->vscroll.cap) break;
-		}
-
-		/* Draw info about selected company when it is selected in the left window */
-		GfxFillRect(174, 39, 403, 75, 157);
-		DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING);
-		if (nd->company != INVALID_PLAYER) {
-			const uint x = 183;
-			const uint trunc_width = w->widget[NLWW_DETAILS].right - x;
-			y = 80;
-
-			SetDParam(0, nd->server->info.clients_on);
-			SetDParam(1, nd->server->info.clients_max);
-			SetDParam(2, nd->server->info.companies_on);
-			SetDParam(3, nd->server->info.companies_max);
-			DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
-			y += 10;
-
-			SetDParamStr(0, _network_player_info[nd->company].company_name);
-			DrawStringTruncated(x, y, STR_NETWORK_COMPANY_NAME, TC_GOLD, trunc_width);
-			y += 10;
-
-			SetDParam(0, _network_player_info[nd->company].inaugurated_year);
-			DrawString(x, y, STR_NETWORK_INAUGURATION_YEAR, TC_GOLD); // inauguration year
-			y += 10;
+		case WE_CREATE:
+			nd->company = INVALID_PLAYER;
+			break;
 
-			SetDParam(0, _network_player_info[nd->company].company_value);
-			DrawString(x, y, STR_NETWORK_VALUE, TC_GOLD); // company value
-			y += 10;
-
-			SetDParam(0, _network_player_info[nd->company].money);
-			DrawString(x, y, STR_NETWORK_CURRENT_BALANCE, TC_GOLD); // current balance
-			y += 10;
-
-			SetDParam(0, _network_player_info[nd->company].income);
-			DrawString(x, y, STR_NETWORK_LAST_YEARS_INCOME, TC_GOLD); // last year's income
-			y += 10;
-
-			SetDParam(0, _network_player_info[nd->company].performance);
-			DrawString(x, y, STR_NETWORK_PERFORMANCE, TC_GOLD); // performance
-			y += 10;
-
-			SetDParam(0, _network_player_info[nd->company].num_vehicle[0]);
-			SetDParam(1, _network_player_info[nd->company].num_vehicle[1]);
-			SetDParam(2, _network_player_info[nd->company].num_vehicle[2]);
-			SetDParam(3, _network_player_info[nd->company].num_vehicle[3]);
-			SetDParam(4, _network_player_info[nd->company].num_vehicle[4]);
-			DrawString(x, y, STR_NETWORK_VEHICLES, TC_GOLD); // vehicles
-			y += 10;
-
-			SetDParam(0, _network_player_info[nd->company].num_station[0]);
-			SetDParam(1, _network_player_info[nd->company].num_station[1]);
-			SetDParam(2, _network_player_info[nd->company].num_station[2]);
-			SetDParam(3, _network_player_info[nd->company].num_station[3]);
-			SetDParam(4, _network_player_info[nd->company].num_station[4]);
-			DrawString(x, y, STR_NETWORK_STATIONS, TC_GOLD); // stations
-			y += 10;
+		case WE_PAINT: {
+			const NetworkGameInfo *gi = &nd->server->info;
+			int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos;
 
-			SetDParamStr(0, _network_player_info[nd->company].players);
-			DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, TC_GOLD, trunc_width); // players
-		}
-	} break;
-
-	case WE_CLICK:
-		switch (e->we.click.widget) {
-		case NLWW_CLOSE:    // Close 'X'
-		case NLWW_CANCEL:   // Cancel button
-			ShowNetworkGameWindow();
-			break;
-		case NLWW_MATRIX: { // Company list
-			uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET_COMPANY) / NET_PRC__SIZE_OF_ROW;
-
-			if (id_v >= w->vscroll.cap) break;
+			/* Join button is disabled when no company is selected */
+			w->SetWidgetDisabledState(NLWW_JOIN, nd->company == INVALID_PLAYER);
+			/* Cannot start new company if there are too many */
+			w->SetWidgetDisabledState(NLWW_NEW, gi->companies_on >= gi->companies_max);
+			/* Cannot spectate if there are too many spectators */
+			w->SetWidgetDisabledState(NLWW_SPECTATE, gi->spectators_on >= gi->spectators_max);
 
-			id_v += w->vscroll.pos;
-			nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
-			SetWindowDirty(w);
-		} break;
-		case NLWW_JOIN:     // Join company
-			/* Button can be clicked only when it is enabled */
-			_network_playas = nd->company;
-			NetworkClientConnectGame(_network_last_host, _network_last_port);
-			break;
-		case NLWW_NEW:      // New company
-			_network_playas = PLAYER_NEW_COMPANY;
-			NetworkClientConnectGame(_network_last_host, _network_last_port);
-			break;
-		case NLWW_SPECTATE: // Spectate game
-			_network_playas = PLAYER_SPECTATOR;
-			NetworkClientConnectGame(_network_last_host, _network_last_port);
-			break;
-		case NLWW_REFRESH:  // Refresh
-			NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
-			NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
-			break;
+			/* Draw window widgets */
+			SetDParamStr(0, gi->server_name);
+			DrawWindowWidgets(w);
+
+			/* Draw company list */
+			pos = w->vscroll.pos;
+			while (pos < gi->companies_on) {
+				byte company = NetworkLobbyFindCompanyIndex(pos);
+				bool income = false;
+				if (nd->company == company)
+					GfxFillRect(11, y - 1, 154, y + 10, 10); // show highlighted item with a different colour
+
+				DoDrawStringTruncated(_network_player_info[company].company_name, 13, y, TC_BLACK, 135 - 13);
+				if (_network_player_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, 135, y);
+
+				/* If the company's income was positive puts a green dot else a red dot */
+				if (_network_player_info[company].income >= 0) income = true;
+				DrawSprite(SPR_BLOT, income ? PALETTE_TO_GREEN : PALETTE_TO_RED, 145, y);
+
+				pos++;
+				y += NET_PRC__SIZE_OF_ROW;
+				if (pos >= w->vscroll.cap) break;
+			}
+
+			/* Draw info about selected company when it is selected in the left window */
+			GfxFillRect(174, 39, 403, 75, 157);
+			DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING);
+			if (nd->company != INVALID_PLAYER) {
+				const uint x = 183;
+				const uint trunc_width = w->widget[NLWW_DETAILS].right - x;
+				y = 80;
+
+				SetDParam(0, nd->server->info.clients_on);
+				SetDParam(1, nd->server->info.clients_max);
+				SetDParam(2, nd->server->info.companies_on);
+				SetDParam(3, nd->server->info.companies_max);
+				DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
+				y += 10;
+
+				SetDParamStr(0, _network_player_info[nd->company].company_name);
+				DrawStringTruncated(x, y, STR_NETWORK_COMPANY_NAME, TC_GOLD, trunc_width);
+				y += 10;
+
+				SetDParam(0, _network_player_info[nd->company].inaugurated_year);
+				DrawString(x, y, STR_NETWORK_INAUGURATION_YEAR, TC_GOLD); // inauguration year
+				y += 10;
+
+				SetDParam(0, _network_player_info[nd->company].company_value);
+				DrawString(x, y, STR_NETWORK_VALUE, TC_GOLD); // company value
+				y += 10;
+
+				SetDParam(0, _network_player_info[nd->company].money);
+				DrawString(x, y, STR_NETWORK_CURRENT_BALANCE, TC_GOLD); // current balance
+				y += 10;
+
+				SetDParam(0, _network_player_info[nd->company].income);
+				DrawString(x, y, STR_NETWORK_LAST_YEARS_INCOME, TC_GOLD); // last year's income
+				y += 10;
+
+				SetDParam(0, _network_player_info[nd->company].performance);
+				DrawString(x, y, STR_NETWORK_PERFORMANCE, TC_GOLD); // performance
+				y += 10;
+
+				SetDParam(0, _network_player_info[nd->company].num_vehicle[0]);
+				SetDParam(1, _network_player_info[nd->company].num_vehicle[1]);
+				SetDParam(2, _network_player_info[nd->company].num_vehicle[2]);
+				SetDParam(3, _network_player_info[nd->company].num_vehicle[3]);
+				SetDParam(4, _network_player_info[nd->company].num_vehicle[4]);
+				DrawString(x, y, STR_NETWORK_VEHICLES, TC_GOLD); // vehicles
+				y += 10;
+
+				SetDParam(0, _network_player_info[nd->company].num_station[0]);
+				SetDParam(1, _network_player_info[nd->company].num_station[1]);
+				SetDParam(2, _network_player_info[nd->company].num_station[2]);
+				SetDParam(3, _network_player_info[nd->company].num_station[3]);
+				SetDParam(4, _network_player_info[nd->company].num_station[4]);
+				DrawString(x, y, STR_NETWORK_STATIONS, TC_GOLD); // stations
+				y += 10;
+
+				SetDParamStr(0, _network_player_info[nd->company].players);
+				DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, TC_GOLD, trunc_width); // players
+			}
 		} break;
 
-	case WE_MESSAGE:
-		SetWindowDirty(w);
-		break;
+		case WE_CLICK:
+			switch (e->we.click.widget) {
+				case NLWW_CLOSE:    // Close 'X'
+				case NLWW_CANCEL:   // Cancel button
+					ShowNetworkGameWindow();
+					break;
+
+				case NLWW_MATRIX: { // Company list
+					uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET_COMPANY) / NET_PRC__SIZE_OF_ROW;
+
+					if (id_v >= w->vscroll.cap) break;
+
+					id_v += w->vscroll.pos;
+					nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
+					SetWindowDirty(w);
+				} break;
+
+				case NLWW_JOIN:     // Join company
+					/* Button can be clicked only when it is enabled */
+					_network_playas = nd->company;
+					NetworkClientConnectGame(_network_last_host, _network_last_port);
+					break;
+
+				case NLWW_NEW:      // New company
+					_network_playas = PLAYER_NEW_COMPANY;
+					NetworkClientConnectGame(_network_last_host, _network_last_port);
+					break;
+
+				case NLWW_SPECTATE: // Spectate game
+					_network_playas = PLAYER_SPECTATOR;
+					NetworkClientConnectGame(_network_last_host, _network_last_port);
+					break;
+
+				case NLWW_REFRESH:  // Refresh
+					NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
+					NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
+					break;
+			}
+			break;
+
+		case WE_MESSAGE:
+			SetWindowDirty(w);
+			break;
 	}
 }
 
@@ -1164,16 +1189,15 @@
  * @param ngl Selected game pointer which is passed to the new window */
 static void ShowNetworkLobbyWindow(NetworkGameList *ngl)
 {
-	Window *w;
 	DeleteWindowById(WC_NETWORK_WINDOW, 0);
 
 	NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
 	NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
 
-	w = AllocateWindowDesc(&_network_lobby_window_desc);
+	Window *w = AllocateWindowDesc(&_network_lobby_window_desc);
 	if (w != NULL) {
 		WP(w, network_ql_d).n.server = ngl;
-		strcpy(_edit_str_buf, "");
+		strcpy(_edit_str_net_buf, "");
 		w->vscroll.cap = 10;
 	}
 }
@@ -1247,36 +1271,39 @@
 
 static void ClientList_Ban(byte client_no)
 {
-	uint i;
 	uint32 ip = NetworkFindClientInfo(client_no)->client_ip;
 
-	for (i = 0; i < lengthof(_network_ban_list); i++) {
+	for (uint i = 0; i < lengthof(_network_ban_list); i++) {
 		if (_network_ban_list[i] == NULL) {
 			_network_ban_list[i] = strdup(inet_ntoa(*(struct in_addr *)&ip));
 			break;
 		}
 	}
 
-	if (client_no < MAX_PLAYERS)
+	if (client_no < MAX_PLAYERS) {
 		SEND_COMMAND(PACKET_SERVER_ERROR)(DEREF_CLIENT(client_no), NETWORK_ERROR_KICKED);
+	}
 }
 
 static void ClientList_GiveMoney(byte client_no)
 {
-	if (NetworkFindClientInfo(client_no) != NULL)
+	if (NetworkFindClientInfo(client_no) != NULL) {
 		ShowNetworkGiveMoneyWindow(NetworkFindClientInfo(client_no)->client_playas);
+	}
 }
 
 static void ClientList_SpeakToClient(byte client_no)
 {
-	if (NetworkFindClientInfo(client_no) != NULL)
+	if (NetworkFindClientInfo(client_no) != NULL) {
 		ShowNetworkChatQueryWindow(DESTTYPE_CLIENT, NetworkFindClientInfo(client_no)->client_index);
+	}
 }
 
 static void ClientList_SpeakToCompany(byte client_no)
 {
-	if (NetworkFindClientInfo(client_no) != NULL)
+	if (NetworkFindClientInfo(client_no) != NULL) {
 		ShowNetworkChatQueryWindow(DESTTYPE_TEAM, NetworkFindClientInfo(client_no)->client_playas);
+	}
 }
 
 static void ClientList_SpeakToAll(byte client_no)
@@ -1286,34 +1313,38 @@
 
 static void ClientList_None(byte client_no)
 {
-	// No action ;)
+	/* No action ;) */
 }
 
 
 
-// Help, a action is clicked! What do we do?
+/**
+ * An action is clicked! What do we do?
+ */
 static void HandleClientListPopupClick(byte index, byte clientno)
 {
-	// A click on the Popup of the ClientList.. handle the command
+	/* A click on the Popup of the ClientList.. handle the command */
 	if (index < MAX_CLIENTLIST_ACTION && _clientlist_proc[index] != NULL) {
 		_clientlist_proc[index](clientno);
 	}
 }
 
-// Finds the amount of clients and set the height correct
+/**
+ * Finds the amount of clients and set the height correct
+ */
 static bool CheckClientListHeight(Window *w)
 {
 	int num = 0;
 	const NetworkClientInfo *ci;
 
-	// Should be replaced with a loop through all clients
+	/* Should be replaced with a loop through all clients */
 	FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
 		num++;
 	}
 
 	num *= CLNWND_ROWSIZE;
 
-	// If height is changed
+	/* If height is changed */
 	if (w->height != CLNWND_OFFSET + num + 1) {
 		// XXX - magic unfortunately; (num + 2) has to be one bigger than heigh (num + 1)
 		SetWindowDirty(w);
@@ -1325,13 +1356,15 @@
 	return true;
 }
 
-// Finds the amount of actions in the popup and set the height correct
+/**
+ * Finds the amount of actions in the popup and set the height correct
+ */
 static uint ClientListPopupHeight()
 {
-	int i, num = 0;
+	int num = 0;
 
 	// Find the amount of actions
-	for (i = 0; i < MAX_CLIENTLIST_ACTION; i++) {
+	for (int i = 0; i < MAX_CLIENTLIST_ACTION; i++) {
 		if (_clientlist_action[i][0] == '\0') continue;
 		if (_clientlist_proc[i] == NULL) continue;
 		num++;
@@ -1342,21 +1375,25 @@
 	return num + 1;
 }
 
-// Show the popup (action list)
+/**
+ * Show the popup (action list)
+ */
 static Window *PopupClientList(Window *w, int client_no, int x, int y)
 {
-	int i, h;
+	int i;
 	const NetworkClientInfo *ci;
 	DeleteWindowById(WC_TOOLBAR_MENU, 0);
 
-	// Clean the current actions
+	/* Clean the current actions */
 	for (i = 0; i < MAX_CLIENTLIST_ACTION; i++) {
 		_clientlist_action[i][0] = '\0';
 		_clientlist_proc[i] = NULL;
 	}
 
-	// Fill the actions this client has
-	// Watch is, max 50 chars long!
+	/*
+	 * Fill the actions this client has.
+	 * Watch is, max 50 chars long!
+	 */
 
 	ci = NetworkFindClientInfo(client_no);
 	if (ci == NULL) return NULL;
@@ -1382,7 +1419,7 @@
 		}
 	}
 
-	// A server can kick clients (but not himself)
+	/* A server can kick clients (but not himself) */
 	if (_network_server && _network_own_client_index != ci->client_index) {
 		GetString(_clientlist_action[i], STR_NETWORK_CLIENTLIST_KICK, lastof(_clientlist_action[i]));
 		_clientlist_proc[i++] = &ClientList_Kick;
@@ -1397,9 +1434,9 @@
 	}
 
 	/* Calculate the height */
-	h = ClientListPopupHeight();
+	int h = ClientListPopupHeight();
 
-	// Allocate the popup
+	/* Allocate the popup */
 	w = AllocateWindow(x, y, 150, h + 1, ClientListPopupWndProc, WC_TOOLBAR_MENU, _client_list_popup_widgets);
 	w->widget[0].bottom = w->widget[0].top + h;
 	w->widget[0].right = w->widget[0].left + 150;
@@ -1420,127 +1457,127 @@
 static void ClientListPopupWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_PAINT: {
-		int i, y, sel;
-		TextColour colour;
-		DrawWindowWidgets(w);
+		case WE_PAINT: {
+			DrawWindowWidgets(w);
 
-		// Draw the actions
-		sel = WP(w, menu_d).sel_index;
-		y = 1;
-		for (i = 0; i < MAX_CLIENTLIST_ACTION; i++, y += CLNWND_ROWSIZE) {
-			if (_clientlist_action[i][0] == '\0') continue;
-			if (_clientlist_proc[i] == NULL) continue;
+			/* Draw the actions */
+			int sel = WP(w, menu_d).sel_index;
+			int y = 1;
+			for (int i = 0; i < MAX_CLIENTLIST_ACTION; i++, y += CLNWND_ROWSIZE) {
+				if (_clientlist_action[i][0] == '\0') continue;
+				if (_clientlist_proc[i] == NULL) continue;
 
-			if (sel-- == 0) { // Selected item, highlight it
-				GfxFillRect(1, y, 150 - 2, y + CLNWND_ROWSIZE - 1, 0);
-				colour = TC_WHITE;
-			} else {
-				colour = TC_BLACK;
+				TextColour colour;
+				if (sel-- == 0) { // Selected item, highlight it
+					GfxFillRect(1, y, 150 - 2, y + CLNWND_ROWSIZE - 1, 0);
+					colour = TC_WHITE;
+				} else {
+					colour = TC_BLACK;
+				}
+
+				DoDrawString(_clientlist_action[i], 4, y, colour);
+			}
+		} break;
+
+		case WE_POPUPMENU_SELECT: {
+			/* We selected an action */
+			int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE;
+
+			if (index >= 0 && e->we.popupmenu.pt.y >= w->top) {
+				HandleClientListPopupClick(index, WP(w, menu_d).main_button);
 			}
 
-			DoDrawString(_clientlist_action[i], 4, y, colour);
-		}
-	} break;
-
-	case WE_POPUPMENU_SELECT: {
-		// We selected an action
-		int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE;
-
-		if (index >= 0 && e->we.popupmenu.pt.y >= w->top)
-			HandleClientListPopupClick(index, WP(w, menu_d).main_button);
+			DeleteWindowById(WC_TOOLBAR_MENU, 0);
+		} break;
 
-		DeleteWindowById(WC_TOOLBAR_MENU, 0);
-	} break;
+		case WE_POPUPMENU_OVER: {
+			/* Our mouse hoovers over an action? Select it! */
+			int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE;
 
-	case WE_POPUPMENU_OVER: {
-		// Our mouse hoovers over an action? Select it!
-		int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE;
+			if (index == -1 || index == WP(w, menu_d).sel_index) return;
 
-		if (index == -1 || index == WP(w, menu_d).sel_index) return;
-
-		WP(w, menu_d).sel_index = index;
-		SetWindowDirty(w);
-	} break;
-
+			WP(w, menu_d).sel_index = index;
+			SetWindowDirty(w);
+		} break;
 	}
 }
 
-// Main handle for clientlist
+/**
+ * Main handle for clientlist
+ */
 static void ClientListWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_PAINT: {
-		NetworkClientInfo *ci;
-		int y, i = 0;
-		TextColour colour;
-
-		// Check if we need to reset the height
-		if (!CheckClientListHeight(w)) break;
-
-		DrawWindowWidgets(w);
-
-		y = CLNWND_OFFSET;
+		case WE_PAINT: {
+			NetworkClientInfo *ci;
+			int i = 0;
 
-		FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
-			if (_selected_clientlist_item == i++) { // Selected item, highlight it
-				GfxFillRect(1, y, 248, y + CLNWND_ROWSIZE - 1, 0);
-				colour = TC_WHITE;
+			/* Check if we need to reset the height */
+			if (!CheckClientListHeight(w)) break;
+
+			DrawWindowWidgets(w);
+
+			int y = CLNWND_OFFSET;
+
+			FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
+				TextColour colour;
+				if (_selected_clientlist_item == i++) { // Selected item, highlight it
+					GfxFillRect(1, y, 248, y + CLNWND_ROWSIZE - 1, 0);
+					colour = TC_WHITE;
+				} else {
+					colour = TC_BLACK;
+				}
+
+				if (ci->client_index == NETWORK_SERVER_INDEX) {
+					DrawString(4, y, STR_NETWORK_SERVER, colour);
+				} else {
+					DrawString(4, y, STR_NETWORK_CLIENT, colour);
+				}
+
+				/* Filter out spectators */
+				if (IsValidPlayer(ci->client_playas)) DrawPlayerIcon(ci->client_playas, 64, y + 1);
+
+				DoDrawString(ci->client_name, 81, y, colour);
+
+				y += CLNWND_ROWSIZE;
+			}
+		} break;
+
+		case WE_CLICK:
+			/* Show the popup with option */
+			if (_selected_clientlist_item != 255) {
+				PopupClientList(w, _selected_clientlist_item, e->we.click.pt.x + w->left, e->we.click.pt.y + w->top);
+			}
+			break;
+
+		case WE_MOUSEOVER:
+			/* -1 means we left the current window */
+			if (e->we.mouseover.pt.y == -1) {
+				_selected_clientlist_y = 0;
+				_selected_clientlist_item = 255;
+				SetWindowDirty(w);
+				break;
+			}
+			/* It did not change.. no update! */
+			if (e->we.mouseover.pt.y == _selected_clientlist_y) break;
+
+			/* Find the new selected item (if any) */
+			_selected_clientlist_y = e->we.mouseover.pt.y;
+			if (e->we.mouseover.pt.y > CLNWND_OFFSET) {
+				_selected_clientlist_item = (e->we.mouseover.pt.y - CLNWND_OFFSET) / CLNWND_ROWSIZE;
 			} else {
-				colour = TC_BLACK;
-			}
-
-			if (ci->client_index == NETWORK_SERVER_INDEX) {
-				DrawString(4, y, STR_NETWORK_SERVER, colour);
-			} else {
-				DrawString(4, y, STR_NETWORK_CLIENT, colour);
+				_selected_clientlist_item = 255;
 			}
 
-			// Filter out spectators
-			if (IsValidPlayer(ci->client_playas)) DrawPlayerIcon(ci->client_playas, 64, y + 1);
-
-			DoDrawString(ci->client_name, 81, y, colour);
-
-			y += CLNWND_ROWSIZE;
-		}
-	} break;
-
-	case WE_CLICK:
-		// Show the popup with option
-		if (_selected_clientlist_item != 255) {
-			PopupClientList(w, _selected_clientlist_item, e->we.click.pt.x + w->left, e->we.click.pt.y + w->top);
-		}
-
-		break;
-
-	case WE_MOUSEOVER:
-		// -1 means we left the current window
-		if (e->we.mouseover.pt.y == -1) {
-			_selected_clientlist_y = 0;
-			_selected_clientlist_item = 255;
+			/* Repaint */
 			SetWindowDirty(w);
 			break;
-		}
-		// It did not change.. no update!
-		if (e->we.mouseover.pt.y == _selected_clientlist_y) break;
 
-		// Find the new selected item (if any)
-		_selected_clientlist_y = e->we.mouseover.pt.y;
-		if (e->we.mouseover.pt.y > CLNWND_OFFSET) {
-			_selected_clientlist_item = (e->we.mouseover.pt.y - CLNWND_OFFSET) / CLNWND_ROWSIZE;
-		} else {
+		case WE_DESTROY: case WE_CREATE:
+			/* When created or destroyed, data is reset */
 			_selected_clientlist_item = 255;
-		}
-
-		// Repaint
-		SetWindowDirty(w);
-		break;
-
-	case WE_DESTROY: case WE_CREATE:
-		// When created or destroyed, data is reset
-		_selected_clientlist_item = 255;
-		_selected_clientlist_y = 0;
-		break;
+			_selected_clientlist_y = 0;
+			break;
 	}
 }
 
@@ -1570,54 +1607,52 @@
 static void NetworkJoinStatusWindowWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_PAINT: {
-		uint8 progress; // used for progress bar
-		DrawWindowWidgets(w);
+		case WE_PAINT: {
+			uint8 progress; // used for progress bar
+			DrawWindowWidgets(w);
 
-		DrawStringCentered(125, 35, STR_NETWORK_CONNECTING_1 + _network_join_status, TC_GREY);
-		switch (_network_join_status) {
-			case NETWORK_JOIN_STATUS_CONNECTING: case NETWORK_JOIN_STATUS_AUTHORIZING:
-			case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO:
-				progress = 10; // first two stages 10%
-				break;
-			case NETWORK_JOIN_STATUS_WAITING:
-				SetDParam(0, _network_join_waiting);
-				DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_WAITING, TC_GREY);
-				progress = 15; // third stage is 15%
-				break;
-			case NETWORK_JOIN_STATUS_DOWNLOADING:
-				SetDParam(0, _network_join_kbytes);
-				SetDParam(1, _network_join_kbytes_total);
-				DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_DOWNLOADING, TC_GREY);
-				/* Fallthrough */
-			default: /* Waiting is 15%, so the resting receivement of map is maximum 70% */
-				progress = 15 + _network_join_kbytes * (100 - 15) / _network_join_kbytes_total;
-		}
+			DrawStringCentered(125, 35, STR_NETWORK_CONNECTING_1 + _network_join_status, TC_GREY);
+			switch (_network_join_status) {
+				case NETWORK_JOIN_STATUS_CONNECTING: case NETWORK_JOIN_STATUS_AUTHORIZING:
+				case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO:
+					progress = 10; // first two stages 10%
+					break;
+				case NETWORK_JOIN_STATUS_WAITING:
+					SetDParam(0, _network_join_waiting);
+					DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_WAITING, TC_GREY);
+					progress = 15; // third stage is 15%
+					break;
+				case NETWORK_JOIN_STATUS_DOWNLOADING:
+					SetDParam(0, _network_join_kbytes);
+					SetDParam(1, _network_join_kbytes_total);
+					DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_DOWNLOADING, TC_GREY);
+					/* Fallthrough */
+				default: /* Waiting is 15%, so the resting receivement of map is maximum 70% */
+					progress = 15 + _network_join_kbytes * (100 - 15) / _network_join_kbytes_total;
+			}
 
-		/* Draw nice progress bar :) */
-		DrawFrameRect(20, 18, (int)((w->width - 20) * progress / 100), 28, 10, FR_NONE);
-	} break;
+			/* Draw nice progress bar :) */
+			DrawFrameRect(20, 18, (int)((w->width - 20) * progress / 100), 28, 10, FR_NONE);
+		} break;
 
-	case WE_CLICK:
-		switch (e->we.click.widget) {
-			case 2: /* Disconnect button */
+		case WE_CLICK:
+			if (e->we.click.widget == 2) { //Disconnect button
 				NetworkDisconnect();
 				DeleteWindow(w);
 				SwitchMode(SM_MENU);
 				ShowNetworkGameWindow();
-				break;
-		}
-		break;
-
-		/* If the server asks for a password, we need to fill it in */
-		case WE_ON_EDIT_TEXT_CANCEL:
-			NetworkDisconnect();
-			ShowNetworkGameWindow();
+			}
 			break;
 
-		case WE_ON_EDIT_TEXT:
-			SEND_COMMAND(PACKET_CLIENT_PASSWORD)(pw_type, e->we.edittext.str);
-			break;
+			/* If the server asks for a password, we need to fill it in */
+			case WE_ON_EDIT_TEXT_CANCEL:
+				NetworkDisconnect();
+				ShowNetworkGameWindow();
+				break;
+
+			case WE_ON_EDIT_TEXT:
+				SEND_COMMAND(PACKET_CLIENT_PASSWORD)(pw_type, e->we.edittext.str);
+				break;
 	}
 }
 
@@ -1638,9 +1673,8 @@
 
 void ShowJoinStatusWindow()
 {
-	Window *w;
 	DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
-	w = AllocateWindowDesc(&_network_join_status_window_desc);
+	Window *w = AllocateWindowDesc(&_network_join_status_window_desc);
 	/* Parent the status window to the lobby */
 	if (w != NULL) w->parent = FindWindowById(WC_NETWORK_WINDOW, 0);
 }
@@ -1708,7 +1742,7 @@
  */
 static void ChatTabCompletion(Window *w)
 {
-	static char _chat_tab_completion_buf[lengthof(_edit_str_buf)];
+	static char _chat_tab_completion_buf[lengthof(_edit_str_net_buf)];
 	Textbuf *tb = &WP(w, chatquerystr_d).text;
 	uint len, tb_len;
 	uint item;
@@ -1761,9 +1795,9 @@
 
 			/* Change to the found name. Add ': ' if we are at the start of the line (pretty) */
 			if (pre_buf == tb_buf) {
-				snprintf(tb->buf, lengthof(_edit_str_buf), "%s: ", cur_name);
+				snprintf(tb->buf, lengthof(_edit_str_net_buf), "%s: ", cur_name);
 			} else {
-				snprintf(tb->buf, lengthof(_edit_str_buf), "%s %s", pre_buf, cur_name);
+				snprintf(tb->buf, lengthof(_edit_str_net_buf), "%s %s", pre_buf, cur_name);
 			}
 
 			/* Update the textbuffer */
@@ -1790,75 +1824,73 @@
 
 /*
  * uses chatquerystr_d WP macro
- * uses chatquerystr_d->caption to store type of chat message (Private/Team/All)
+ * uses chatquerystr_d->dtype to store type of chat message (Private/Team/All)
  */
 static void ChatWindowWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE:
-		SendWindowMessage(WC_NEWS_WINDOW, 0, WE_CREATE, w->height, 0);
-		SetBit(_no_scroll, SCROLL_CHAT); // do not scroll the game with the arrow-keys
-		break;
-
-	case WE_PAINT: {
-		static const StringID chat_captions[] = {
-			STR_NETWORK_CHAT_ALL_CAPTION,
-			STR_NETWORK_CHAT_COMPANY_CAPTION,
-			STR_NETWORK_CHAT_CLIENT_CAPTION
-		};
-		StringID msg;
-
-		DrawWindowWidgets(w);
-
-		assert(WP(w, chatquerystr_d).caption < lengthof(chat_captions));
-		msg = chat_captions[WP(w, chatquerystr_d).caption];
-		DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, msg, TC_BLACK);
-		DrawEditBox(w, &WP(w, chatquerystr_d), 2);
-	} break;
+		case WE_CREATE:
+			SendWindowMessage(WC_NEWS_WINDOW, 0, WE_CREATE, w->height, 0);
+			SetBit(_no_scroll, SCROLL_CHAT); // do not scroll the game with the arrow-keys
+			break;
 
-	case WE_CLICK:
-		switch (e->we.click.widget) {
-			case 3: { /* Send */
-				DestType type = (DestType)WP(w, chatquerystr_d).caption;
-				int dest = WP(w, chatquerystr_d).dest;
-				SendChat(WP(w, chatquerystr_d).text.buf, type, dest);
-			} /* FALLTHROUGH */
-			case 0: /* Cancel */ DeleteWindow(w); break;
-		}
-		break;
-
-	case WE_MOUSELOOP:
-		HandleEditBox(w, &WP(w, chatquerystr_d), 2);
-		break;
+		case WE_PAINT: {
+			static const StringID chat_captions[] = {
+				STR_NETWORK_CHAT_ALL_CAPTION,
+				STR_NETWORK_CHAT_COMPANY_CAPTION,
+				STR_NETWORK_CHAT_CLIENT_CAPTION
+			};
 
-	case WE_KEYPRESS:
-		if (e->we.keypress.keycode == WKC_TAB) {
-			ChatTabCompletion(w);
-		} else {
-			_chat_tab_completion_active = false;
-			switch (HandleEditBoxKey(w, &WP(w, chatquerystr_d), 2, e)) {
-				case 1: { /* Return */
-				DestType type = (DestType)WP(w, chatquerystr_d).caption;
-				int dest = WP(w, chatquerystr_d).dest;
-				SendChat(WP(w, chatquerystr_d).text.buf, type, dest);
-			} /* FALLTHROUGH */
-				case 2: /* Escape */ DeleteWindow(w); break;
+			DrawWindowWidgets(w);
+
+			assert((uint)WP(w, chatquerystr_d).dtype < lengthof(chat_captions));
+			DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, chat_captions[WP(w, chatquerystr_d).dtype], TC_BLACK);
+			DrawEditBox(w, &WP(w, chatquerystr_d), 2);
+		} break;
+
+		case WE_CLICK:
+			switch (e->we.click.widget) {
+				case 2:
+					ShowOnScreenKeyboard(w, &WP(w, chatquerystr_d), 2, 0, 3);
+					break;
+
+				case 3: /* Send */
+					SendChat(WP(w, chatquerystr_d).text.buf, WP(w, chatquerystr_d).dtype, WP(w, chatquerystr_d).dest);
+				/* FALLTHROUGH */
+				case 0: /* Cancel */ DeleteWindow(w); break;
 			}
-		}
-		break;
+			break;
 
-	case WE_DESTROY:
-		SendWindowMessage(WC_NEWS_WINDOW, 0, WE_DESTROY, 0, 0);
-		ClrBit(_no_scroll, SCROLL_CHAT);
-		break;
+		case WE_MOUSELOOP:
+			HandleEditBox(w, &WP(w, chatquerystr_d), 2);
+			break;
+
+		case WE_KEYPRESS:
+			if (e->we.keypress.keycode == WKC_TAB) {
+				ChatTabCompletion(w);
+			} else {
+				_chat_tab_completion_active = false;
+				switch (HandleEditBoxKey(w, &WP(w, chatquerystr_d), 2, e)) {
+					case 1: /* Return */
+						SendChat(WP(w, chatquerystr_d).text.buf, WP(w, chatquerystr_d).dtype, WP(w, chatquerystr_d).dest);
+					/* FALLTHROUGH */
+					case 2: /* Escape */ DeleteWindow(w); break;
+				}
+			}
+			break;
+
+		case WE_DESTROY:
+			SendWindowMessage(WC_NEWS_WINDOW, 0, WE_DESTROY, 0, 0);
+			ClrBit(_no_scroll, SCROLL_CHAT);
+			break;
 	}
 }
 
 static const Widget _chat_window_widgets[] = {
-{   WWT_CLOSEBOX, RESIZE_NONE,  14,   0,  10,  0, 13, STR_00C5,         STR_018B_CLOSE_WINDOW},
-{      WWT_PANEL, RESIZE_RIGHT, 14,  11, 319,  0, 13, 0x0,              STR_NULL}, // background
-{      WWT_PANEL, RESIZE_RIGHT, 14,  75, 257,  1, 12, 0x0,              STR_NULL}, // text box
-{ WWT_PUSHTXTBTN, RESIZE_LR,    14, 258, 319,  1, 12, STR_NETWORK_SEND, STR_NULL}, // send button
+{   WWT_CLOSEBOX, RESIZE_NONE,  14,   0,  10,  0, 13, STR_00C5,                  STR_018B_CLOSE_WINDOW},
+{      WWT_PANEL, RESIZE_RIGHT, 14,  11, 319,  0, 13, 0x0,                       STR_NULL}, // background
+{    WWT_EDITBOX, RESIZE_RIGHT, 14,  75, 257,  1, 12, STR_NETWORK_CHAT_OSKTITLE, STR_NULL}, // text box
+{ WWT_PUSHTXTBTN, RESIZE_LR,    14, 258, 319,  1, 12, STR_NETWORK_SEND,          STR_NULL}, // send button
 {   WIDGETS_END},
 };
 
@@ -1872,20 +1904,18 @@
 
 void ShowNetworkChatQueryWindow(DestType type, int dest)
 {
-	Window *w;
-
 	DeleteWindowById(WC_SEND_NETWORK_MSG, 0);
 
-	_edit_str_buf[0] = '\0';
+	_edit_str_net_buf[0] = '\0';
 	_chat_tab_completion_active = false;
 
-	w = AllocateWindowDesc(&_chat_window_desc);
+	Window *w = AllocateWindowDesc(&_chat_window_desc);
 
 	w->LowerWidget(2);
-	WP(w, chatquerystr_d).caption = type; // Misuse of caption
+	WP(w, chatquerystr_d).dtype   = type;
 	WP(w, chatquerystr_d).dest    = dest;
 	WP(w, chatquerystr_d).afilter = CS_ALPHANUMERAL;
-	InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_buf, lengthof(_edit_str_buf), 0);
+	InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_net_buf, lengthof(_edit_str_net_buf), 0);
 }
 
 /** Enum for NetworkGameWindow, referring to _network_game_window_widgets */
@@ -1912,12 +1942,12 @@
 			switch (e->we.click.widget) {
 				case NCPWW_OK: {
 					if (w->IsWidgetLowered(NCPWW_SAVE_AS_DEFAULT_PASSWORD)) {
-						snprintf(_network_default_company_pass, lengthof(_network_default_company_pass), "%s", _edit_str_buf);
+						snprintf(_network_default_company_pass, lengthof(_network_default_company_pass), "%s", _edit_str_net_buf);
 					}
 
 					/* empty password is a '*' because of console argument */
-					if (StrEmpty(_edit_str_buf)) snprintf(_edit_str_buf, lengthof(_edit_str_buf), "*");
-					char *password = _edit_str_buf;
+					if (StrEmpty(_edit_str_net_buf)) snprintf(_edit_str_net_buf, lengthof(_edit_str_net_buf), "*");
+					char *password = _edit_str_net_buf;
 					NetworkChangeCompanyPassword(1, &password);
 				}
 
@@ -1930,6 +1960,9 @@
 					w->ToggleWidgetLoweredState(NCPWW_SAVE_AS_DEFAULT_PASSWORD);
 					SetWindowDirty(w);
 					break;
+				case NCPWW_PASSWORD:
+					ShowOnScreenKeyboard(w, &WP(w, chatquerystr_d), NCPWW_PASSWORD, 2, 1);
+					break;
 			}
 			break;
 
@@ -1958,7 +1991,7 @@
 {    WWT_CAPTION, RESIZE_NONE, 14,  11, 299,  0, 13, STR_COMPANY_PASSWORD_CAPTION,      STR_018C_WINDOW_TITLE_DRAG_THIS},
 {      WWT_PANEL, RESIZE_NONE, 14,   0, 299, 14, 50, 0x0,                               STR_NULL},
 {       WWT_TEXT, RESIZE_NONE, 14,   5, 100, 19, 30, STR_COMPANY_PASSWORD,              STR_NULL},
-{      WWT_PANEL, RESIZE_NONE, 14, 101, 294, 19, 30, 0x0,                               STR_NULL},
+{    WWT_EDITBOX, RESIZE_NONE, 14, 101, 294, 19, 30, STR_SET_COMPANY_PASSWORD,          STR_NULL},
 {    WWT_TEXTBTN, RESIZE_NONE, 14, 101, 294, 35, 46, STR_MAKE_DEFAULT_COMPANY_PASSWORD, STR_MAKE_DEFAULT_COMPANY_PASSWORD_TIP},
 { WWT_PUSHTXTBTN, RESIZE_NONE, 14,   0, 149, 51, 62, STR_012E_CANCEL,                   STR_COMPANY_PASSWORD_CANCEL},
 { WWT_PUSHTXTBTN, RESIZE_NONE, 14, 150, 299, 51, 62, STR_012F_OK,                       STR_COMPANY_PASSWORD_OK},
@@ -1977,10 +2010,10 @@
 {
 	DeleteWindowById(WC_COMPANY_PASSWORD_WINDOW, 0);
 
-	_edit_str_buf[0] = '\0';
+	_edit_str_net_buf[0] = '\0';
 	Window *w = AllocateWindowDesc(&_ncp_window_desc);
 	WP(w, chatquerystr_d).afilter = CS_ALPHANUMERAL;
-	InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_buf, min(lengthof(_network_default_company_pass), lengthof(_edit_str_buf)), 0);
+	InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_net_buf, min(lengthof(_network_default_company_pass), lengthof(_edit_str_net_buf)), 0);
 }
 
 #endif /* ENABLE_NETWORK */
--- a/src/network/network_internal.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/network/network_internal.h	Tue Apr 15 00:47:19 2008 +0000
@@ -10,58 +10,66 @@
 #include "core/config.h"
 #include "core/game.h"
 
-// If this line is enable, every frame will have a sync test
-//  this is not needed in normal games. Normal is like 1 sync in 100
-//  frames. You can enable this if you have a lot of desyncs on a certain
-//  game.
-// Remember: both client and server have to be compiled with this
-//  option enabled to make it to work. If one of the two has it disabled
-//  nothing will happen.
+/**
+ * If this line is enable, every frame will have a sync test
+ *  this is not needed in normal games. Normal is like 1 sync in 100
+ *  frames. You can enable this if you have a lot of desyncs on a certain
+ *  game.
+ * Remember: both client and server have to be compiled with this
+ *  option enabled to make it to work. If one of the two has it disabled
+ *  nothing will happen.
+ */
 //#define ENABLE_NETWORK_SYNC_EVERY_FRAME
 
-// In theory sending 1 of the 2 seeds is enough to check for desyncs
-//   so in theory, this next define can be left off.
+/**
+ * In theory sending 1 of the 2 seeds is enough to check for desyncs
+ *   so in theory, this next define can be left off.
+ */
 //#define NETWORK_SEND_DOUBLE_SEED
 
-// How many clients can we have? Like.. MAX_PLAYERS - 1 is the amount of
-//  players that can really play.. so.. a max of 4 spectators.. gives us..
-//  MAX_PLAYERS + 3
-#define MAX_CLIENTS (MAX_PLAYERS + 3)
-
 
-// Do not change this next line. It should _ALWAYS_ be MAX_CLIENTS + 1
-#define MAX_CLIENT_INFO (MAX_CLIENTS + 1)
+enum {
+	/**
+	 * How many clients can we have? Like.. MAX_PLAYERS - 1 is the amount of
+	 *  players that can really play.. so.. a max of 4 spectators.. gives us..
+	 *  MAX_PLAYERS + 3
+	 */
+	MAX_CLIENTS = MAX_PLAYERS + 3,
 
-#define MAX_INTERFACES 9
-
+	/** Do not change this next line. It should _ALWAYS_ be MAX_CLIENTS + 1 */
+	MAX_CLIENT_INFO = MAX_CLIENTS + 1,
 
-// How many vehicle/station types we put over the network
-#define NETWORK_VEHICLE_TYPES 5
-#define NETWORK_STATION_TYPES 5
+	/** Maximum number of internet interfaces supported. */
+	MAX_INTERFACES = 9,
+
+	/** How many vehicle/station types we put over the network */
+	NETWORK_VEHICLE_TYPES = 5,
+	NETWORK_STATION_TYPES = 5,
+};
 
 struct NetworkPlayerInfo {
-	char company_name[NETWORK_NAME_LENGTH];         // Company name
-	char password[NETWORK_PASSWORD_LENGTH];         // The password for the player
-	Year inaugurated_year;                          // What year the company started in
-	Money company_value;                            // The company value
-	Money money;                                    // The amount of money the company has
-	Money income;                                   // How much did the company earned last year
-	uint16 performance;                             // What was his performance last month?
-	bool use_password;                              // Is there a password
-	uint16 num_vehicle[NETWORK_VEHICLE_TYPES];      // How many vehicles are there of this type?
-	uint16 num_station[NETWORK_STATION_TYPES];      // How many stations are there of this type?
-	char players[NETWORK_PLAYERS_LENGTH];           // The players that control this company (Name1, name2, ..)
-	uint16 months_empty;                            // How many months the company is empty
+	char company_name[NETWORK_NAME_LENGTH];         ///< Company name
+	char password[NETWORK_PASSWORD_LENGTH];         ///< The password for the player
+	Year inaugurated_year;                          ///< What year the company started in
+	Money company_value;                            ///< The company value
+	Money money;                                    ///< The amount of money the company has
+	Money income;                                   ///< How much did the company earned last year
+	uint16 performance;                             ///< What was his performance last month?
+	bool use_password;                              ///< Is there a password
+	uint16 num_vehicle[NETWORK_VEHICLE_TYPES];      ///< How many vehicles are there of this type?
+	uint16 num_station[NETWORK_STATION_TYPES];      ///< How many stations are there of this type?
+	char players[NETWORK_PLAYERS_LENGTH];           ///< The players that control this company (Name1, name2, ..)
+	uint16 months_empty;                            ///< How many months the company is empty
 };
 
 struct NetworkClientInfo {
-	uint16 client_index;                            // Index of the client (same as ClientState->index)
-	char client_name[NETWORK_CLIENT_NAME_LENGTH];   // Name of the client
-	byte client_lang;                               // The language of the client
-	PlayerID client_playas;                         // As which player is this client playing (PlayerID)
-	uint32 client_ip;                               // IP-address of the client (so he can be banned)
-	Date join_date;                                 // Gamedate the player has joined
-	char unique_id[NETWORK_UNIQUE_ID_LENGTH];       // Every play sends an unique id so we can indentify him
+	uint16 client_index;                            ///< Index of the client (same as ClientState->index)
+	char client_name[NETWORK_CLIENT_NAME_LENGTH];   ///< Name of the client
+	byte client_lang;                               ///< The language of the client
+	PlayerID client_playas;                         ///< As which player is this client playing (PlayerID)
+	uint32 client_ip;                               ///< IP-address of the client (so he can be banned)
+	Date join_date;                                 ///< Gamedate the player has joined
+	char unique_id[NETWORK_UNIQUE_ID_LENGTH];       ///< Every play sends an unique id so we can indentify him
 };
 
 enum NetworkJoinStatus {
@@ -75,7 +83,7 @@
 	NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO,
 };
 
-/* Language ids for server_lang and client_lang. Do NOT modify the order. */
+/** Language ids for server_lang and client_lang. Do NOT modify the order. */
 enum NetworkLanguage {
 	NETLANG_ANY = 0,
 	NETLANG_ENGLISH,
@@ -106,6 +114,13 @@
 	NETLANG_SWEDISH,
 	NETLANG_TURKISH,
 	NETLANG_UKRAINIAN,
+	NETLANG_AFRIKAANS,
+	NETLANG_CROATIAN,
+	NETLANG_CATALAN,
+	NETLANG_ESTONIAN,
+	NETLANG_GALICIAN,
+	NETLANG_GREEK,
+	NETLANG_LATVIAN,
 	NETLANG_COUNT
 };
 
--- a/src/network/network_server.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/network/network_server.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -16,7 +16,7 @@
 #include "../console.h"
 #include "../command_func.h"
 #include "../saveload.h"
-#include "../station.h"
+#include "../station_base.h"
 #include "../variables.h"
 #include "../genworld.h"
 #include "../core/alloc_func.hpp"
--- a/src/network/network_udp.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/network/network_udp.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -519,7 +519,7 @@
 
 	/* check for socket */
 	if (!_udp_master_socket->IsConnected()) {
-		if (!_udp_master_socket->Listen(0, 0, false)) return;
+		if (!_udp_master_socket->Listen(_network_server_bind_ip, 0, false)) return;
 	}
 
 	DEBUG(net, 1, "[udp] removing advertise from master server");
@@ -549,7 +549,7 @@
 
 	/* check for socket */
 	if (!_udp_master_socket->IsConnected()) {
-		if (!_udp_master_socket->Listen(0, 0, false)) return;
+		if (!_udp_master_socket->Listen(_network_server_bind_ip, 0, false)) return;
 	}
 
 	if (_network_need_advertise) {
--- a/src/newgrf.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -9,9 +9,8 @@
 #include "openttd.h"
 #include "debug.h"
 #include "fileio.h"
-#include "engine.h"
+#include "engine_func.h"
 #include "spritecache.h"
-#include "station.h"
 #include "sprite.h"
 #include "newgrf.h"
 #include "variables.h"
@@ -26,6 +25,7 @@
 #include "newgrf_house.h"
 #include "newgrf_sound.h"
 #include "newgrf_spritegroup.h"
+#include "newgrf_station.h"
 #include "cargotype.h"
 #include "industry.h"
 #include "newgrf_canal.h"
@@ -2932,13 +2932,19 @@
 		/* Randomized Sprite Group */
 		case 0x80: // Self scope
 		case 0x83: // Parent scope
+		case 0x84: // Relative scope
 		{
-			if (!check_length(bufend - buf, 7, "NewSpriteGroup (Randomized) (1)")) return;
+			if (!check_length(bufend - buf, HasBit(type, 2) ? 8 : 7, "NewSpriteGroup (Randomized) (1)")) return;
 
 			group = AllocateSpriteGroup();
 			group->type = SGT_RANDOMIZED;
 			group->g.random.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
 
+			if (HasBit(type, 2)) {
+				if (feature <= GSF_AIRCRAFT) group->g.random.var_scope = VSG_SCOPE_RELATIVE;
+				group->g.random.count = grf_load_byte(&buf);
+			}
+
 			uint8 triggers = grf_load_byte(&buf);
 			group->g.random.triggers       = GB(triggers, 0, 7);
 			group->g.random.cmp_mode       = HasBit(triggers, 7) ? RSG_CMP_ALL : RSG_CMP_ANY;
@@ -3981,6 +3987,10 @@
 			return true;
 		}
 
+		case 0x22: // difficulty level
+			*value = _opt.diff_level;
+			return true;
+
 		default: return false;
 	}
 }
@@ -5070,7 +5080,7 @@
 	} else {
 		/* Attach the label to the end of the list */
 		GRFLabel *l;
-		for (l = _cur_grffile->label; l->next != NULL; l = l->next);
+		for (l = _cur_grffile->label; l->next != NULL; l = l->next) {}
 		l->next = label;
 	}
 
@@ -5798,17 +5808,18 @@
 static void CalculateRefitMasks()
 {
 	for (EngineID engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
+		EngineInfo *ei = &_engine_info[engine];
 		uint32 mask = 0;
 		uint32 not_mask = 0;
 		uint32 xor_mask = 0;
 
-		if (_engine_info[engine].refit_mask != 0) {
+		if (ei->refit_mask != 0) {
 			const GRFFile *file = GetEngineGRF(engine);
 			if (file != NULL && file->cargo_max != 0) {
 				/* Apply cargo translation table to the refit mask */
 				uint num_cargo = min(32, file->cargo_max);
 				for (uint i = 0; i < num_cargo; i++) {
-					if (!HasBit(_engine_info[engine].refit_mask, i)) continue;
+					if (!HasBit(ei->refit_mask, i)) continue;
 
 					CargoID c = GetCargoIDByLabel(file->cargo_list[i]);
 					if (c == CT_INVALID) continue;
@@ -5821,7 +5832,7 @@
 					const CargoSpec *cs = GetCargo(c);
 					if (!cs->IsValid()) continue;
 
-					if (HasBit(_engine_info[engine].refit_mask, cs->bitnum)) SetBit(xor_mask, c);
+					if (HasBit(ei->refit_mask, cs->bitnum)) SetBit(xor_mask, c);
 				}
 			}
 		}
@@ -5852,7 +5863,8 @@
 				}
 			}
 		}
-		_engine_info[engine].refit_mask = ((mask & ~not_mask) ^ xor_mask) & _cargo_mask;
+
+		ei->refit_mask = ((mask & ~not_mask) ^ xor_mask) & _cargo_mask;
 
 		/* Check if this engine's cargo type is valid. If not, set to the first refittable
 		 * cargo type. Apparently cargo_type isn't a common property... */
@@ -5862,19 +5874,19 @@
 			case VEH_TRAIN: {
 				RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
 				if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
-				if (rvi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
+				if (rvi->cargo_type == CT_INVALID) ei->climates = 0;
 				break;
 			}
 			case VEH_ROAD: {
 				RoadVehicleInfo *rvi = &_road_vehicle_info[engine - ROAD_ENGINES_INDEX];
 				if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
-				if (rvi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
+				if (rvi->cargo_type == CT_INVALID) ei->climates = 0;
 				break;
 			}
 			case VEH_SHIP: {
 				ShipVehicleInfo *svi = &_ship_vehicle_info[engine - SHIP_ENGINES_INDEX];
 				if (svi->cargo_type == CT_INVALID) svi->cargo_type = FindFirstRefittableCargo(engine);
-				if (svi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
+				if (svi->cargo_type == CT_INVALID) ei->climates = 0;
 				break;
 			}
 		}
--- a/src/newgrf.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf.h	Tue Apr 15 00:47:19 2008 +0000
@@ -5,11 +5,11 @@
 #ifndef NEWGRF_H
 #define NEWGRF_H
 
-#include "station.h"
 #include "town_type.h"
 #include "newgrf_config.h"
 #include "cargotype.h"
 #include "industry_type.h"
+#include "station_type.h"
 #include "newgrf_fsmports.h"
 
 enum GrfLoadingStage {
--- a/src/newgrf_callbacks.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_callbacks.h	Tue Apr 15 00:47:19 2008 +0000
@@ -150,7 +150,7 @@
 	CBID_VEHICLE_MODIFY_PROPERTY         = 0x36,
 
 	/** Called to determine text to display after cargo name */
-	CBID_INDUSTRY_CARGO_SUFFIX           = 0x37, // not implemented
+	CBID_INDUSTRY_CARGO_SUFFIX           = 0x37,
 
 	/** Called to determine more text in the fund industry window */
 	CBID_INDUSTRY_FUND_MORE_TEXT         = 0x38,
@@ -210,6 +210,11 @@
 
 	/** Customize the output cargo types of a newly build industry. */
 	CBID_INDUSTRY_OUTPUT_CARGO_TYPES     = 0x14C,
+
+	/* ATTENTION:
+	 * When adding new callbacks and their result is 15bit, add them to newgrf_spritegroup.cpp:Is8BitCallback().
+	 * It does not harm to add them there though they are not implemented. But it does harm if they get forgotton.
+	 */
 };
 
 /**
--- a/src/newgrf_canal.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_canal.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -85,6 +85,7 @@
 	res->last_value      = 0;
 	res->trigger         = 0;
 	res->reseed          = 0;
+	res->count           = 0;
 }
 
 
--- a/src/newgrf_cargo.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_cargo.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -64,6 +64,7 @@
 	res->last_value      = 0;
 	res->trigger         = 0;
 	res->reseed          = 0;
+	res->count           = 0;
 }
 
 
--- a/src/newgrf_config.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_config.h	Tue Apr 15 00:47:19 2008 +0000
@@ -7,17 +7,19 @@
 
 #include "strings_type.h"
 
-/* GRF config bit flags */
+/** GRF config bit flags */
 enum GCF_Flags {
-	GCF_SYSTEM,    ///< GRF file is an openttd-internal system grf
-	GCF_UNSAFE,    ///< GRF file is unsafe for static usage
-	GCF_STATIC,    ///< GRF file is used statically (can be used in any MP game)
-	GCF_COMPATIBLE,///< GRF file does not exactly match the requested GRF (different MD5SUM), but grfid matches)
-	GCF_COPY,      ///< The data is copied from a grf in _all_grfs
-	GCF_INIT_ONLY, ///< GRF file is processed up to GLS_INIT
-	GCF_RESERVED,  ///< GRF file passed GLS_RESERVE stage
+	GCF_SYSTEM,     ///< GRF file is an openttd-internal system grf
+	GCF_UNSAFE,     ///< GRF file is unsafe for static usage
+	GCF_STATIC,     ///< GRF file is used statically (can be used in any MP game)
+	GCF_COMPATIBLE, ///< GRF file does not exactly match the requested GRF (different MD5SUM), but grfid matches)
+	GCF_COPY,       ///< The data is copied from a grf in _all_grfs
+	GCF_INIT_ONLY,  ///< GRF file is processed up to GLS_INIT
+	GCF_RESERVED,   ///< GRF file passed GLS_RESERVE stage
+
 };
 
+/** Status of GRF */
 enum GRFStatus {
 	GCS_UNKNOWN,      ///< The status of this grf file is unknown
 	GCS_DISABLED,     ///< GRF file is disabled
@@ -26,53 +28,50 @@
 	GCS_ACTIVATED     ///< GRF file has been activated
 };
 
+/** Status of post-gameload GRF compatibility check */
 enum GRFListCompatibility{
-	GLC_ALL_GOOD,
-	GLC_COMPATIBLE,
-	GLC_NOT_FOUND
-};
-
-struct GRFIdentifier {
-	uint32 grfid;
-	uint8 md5sum[16];
+	GLC_ALL_GOOD,   ///< All GRF needed by game are present
+	GLC_COMPATIBLE, ///< Compatible (eg. the same ID, but different chacksum) GRF found in at least one case
+	GLC_NOT_FOUND   ///< At least one GRF couldn't be found (higher priority than GLC_COMPATIBLE)
 };
 
-struct GRFError {
-	char *custom_message;
-	char *data;
-	StringID message;
-	StringID severity;
-	uint8 num_params;
-	uint8 param_number[2];
+/** Basic data to distinguish a GRF. Used in the server list window */
+struct GRFIdentifier {
+	uint32 grfid;     ///< GRF ID (defined by Action 0x08)
+	uint8 md5sum[16]; ///< MD5 checksum of file to distinguish files with the same GRF ID (eg. newer version of GRF)
 };
 
-struct GRFConfig : public GRFIdentifier {
-	char *filename;
-	char *name;
-	char *info;
-	GRFError *error;
+/** Information about why GRF had problems during initialisation */
+struct GRFError {
+	char *custom_message;  ///< Custom message (if present)
+	char *data;            ///< Additional data for message and custom_message
+	StringID message;      ///< Default message
+	StringID severity;     ///< Info / Warning / Error / Fatal
+	uint8 num_params;      ///< Number of additinal parameters for custom_message (0, 1 or 2)
+	uint8 param_number[2]; ///< GRF parameters to show for custom_message
+};
 
-	uint8 flags;
-	GRFStatus status;
-	uint32 param[0x80];
-	uint8 num_params;
+/** Information about GRF, used in the game and (part of it) in savegames */
+struct GRFConfig : public GRFIdentifier {
+	char *filename;     ///< Filename - either with or without full path
+	char *name;         ///< NOSAVE: GRF name (Action 0x08)
+	char *info;         ///< NOSAVE: GRF info (author, copyright, ...) (Action 0x08)
+	GRFError *error;    ///< NOSAVE: Error/Warning during GRF loading (Action 0x0B)
 
-	struct GRFConfig *next;
+	uint8 flags;        ///< NOSAVE: GCF_Flags, bitset
+	GRFStatus status;   ///< NOSAVE: GRFStatus, enum
+	uint32 param[0x80]; ///< GRF parameters
+	uint8 num_params;   ///< Number of used parameters
+
+	struct GRFConfig *next; ///< NOSAVE: Next item in the linked list
 
 	bool IsOpenTTDBaseGRF() const;
 };
 
-/* First item in list of all scanned NewGRFs */
-extern GRFConfig *_all_grfs;
-
-/* First item in list of current GRF set up */
-extern GRFConfig *_grfconfig;
-
-/* First item in list of default GRF set up */
-extern GRFConfig *_grfconfig_newgame;
-
-/* First item in list of static GRF set up */
-extern GRFConfig *_grfconfig_static;
+extern GRFConfig *_all_grfs;          ///< First item in list of all scanned NewGRFs
+extern GRFConfig *_grfconfig;         ///< First item in list of current GRF set up
+extern GRFConfig *_grfconfig_newgame; ///< First item in list of default GRF set up
+extern GRFConfig *_grfconfig_static;  ///< First item in list of static GRF set up
 
 void ScanNewGRFFiles();
 const GRFConfig *FindGRFConfig(uint32 grfid, const uint8 *md5sum = NULL);
--- a/src/newgrf_engine.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_engine.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -6,11 +6,11 @@
 #include "openttd.h"
 #include "variables.h"
 #include "debug.h"
-#include "engine.h"
+#include "engine_func.h"
 #include "train.h"
 #include "player_func.h"
 #include "player_base.h"
-#include "station.h"
+#include "station_base.h"
 #include "airport.h"
 #include "newgrf.h"
 #include "newgrf_callbacks.h"
@@ -344,11 +344,11 @@
 
 		case FIRST_TERMINAL:
 		case FIRST_HELIPAD:
-			return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD1 : AMA_TTDP_LANDING_TO_PAD1;
+			return (v->current_order.IsType(OT_LOADING)) ? AMA_TTDP_ON_PAD1 : AMA_TTDP_LANDING_TO_PAD1;
 
 		case FIRST_TERMINAL + 1:
 		case FIRST_HELIPAD + 1:
-			return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD2 : AMA_TTDP_LANDING_TO_PAD2;
+			return (v->current_order.IsType(OT_LOADING)) ? AMA_TTDP_ON_PAD2 : AMA_TTDP_LANDING_TO_PAD2;
 
 		case TAKEOFF:      // Moving to takeoff position
 		case STARTTAKEOFF: // Accelerating down runway
@@ -365,12 +365,12 @@
 		case HELILANDING:
 		case HELIENDLANDING:
 			/* @todo Need to check terminal we're landing to. Is it known yet? */
-			return (v->current_order.type == OT_GOTO_DEPOT) ?
+			return (v->current_order.IsType(OT_GOTO_DEPOT)) ?
 				AMA_TTDP_LANDING_TO_HANGAR : AMA_TTDP_LANDING_TO_PAD1;
 
 		default:
 			if (FIRST_TERMINAL <= v->u.air.state && v->u.air.state <= LAST_HELIPAD) {
-				return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD3 : AMA_TTDP_LANDING_TO_PAD3;
+				return (v->current_order.IsType(OT_LOADING)) ? AMA_TTDP_ON_PAD3 : AMA_TTDP_LANDING_TO_PAD3;
 			}
 
 			return AMA_TTDP_IN_HANGAR;
@@ -390,7 +390,39 @@
 /* Vehicle Resolver Functions */
 static inline const Vehicle *GRV(const ResolverObject *object)
 {
-	return object->scope == VSG_SCOPE_SELF ? object->u.vehicle.self : object->u.vehicle.parent;
+	switch (object->scope) {
+		default: NOT_REACHED();
+		case VSG_SCOPE_SELF: return object->u.vehicle.self;
+		case VSG_SCOPE_PARENT: return object->u.vehicle.parent;
+		case VSG_SCOPE_RELATIVE: {
+			const Vehicle *v = NULL;
+			switch (GB(object->count, 6, 2)) {
+				default: NOT_REACHED();
+				case 0x00: // count back (away from the engine), starting at this vehicle
+				case 0x01: // count forward (toward the engine), starting at this vehicle
+					v = object->u.vehicle.self;
+					break;
+				case 0x02: // count back, starting at the engine
+					v = object->u.vehicle.parent;
+					break;
+				case 0x03: { // count back, starting at the first vehicle in this chain of vehicles with the same ID, as for vehicle variable 41
+					const Vehicle *self = object->u.vehicle.self;
+					for (const Vehicle *u = self->First(); u != self; u = u->Next()) {
+						if (u->engine_type != self->engine_type) {
+							v = NULL;
+						} else {
+							if (v == NULL) v = u;
+						}
+					}
+					if (v == NULL) v = self;
+				} break;
+			}
+			uint32 count = GB(object->count, 0, 4);
+			if (count == 0) count = GetRegister(0x100);
+			while (v != NULL && count-- != 0) v = (GB(object->count, 6, 2) == 0x01) ? v->Previous() : v->Next();
+			return v;
+		}
+	}
 }
 
 
@@ -633,8 +665,8 @@
 		case 0x01: return MapOldSubType(v);
 		case 0x04: return v->index;
 		case 0x05: return GB(v->index, 8, 8);
-		case 0x0A: return PackOrder(&v->current_order);
-		case 0x0B: return GB(PackOrder(&v->current_order), 8, 8);
+		case 0x0A: return v->current_order.Pack();
+		case 0x0B: return GB(v->current_order.Pack(), 8, 8);
 		case 0x0C: return v->num_orders;
 		case 0x0D: return v->cur_order_index;
 		case 0x10: return v->load_unload_time_rem;
@@ -763,7 +795,7 @@
 		return NULL;
 	}
 
-	bool in_motion = v->First()->current_order.type != OT_LOADING;
+	bool in_motion = !v->First()->current_order.IsType(OT_LOADING);
 
 	totalsets = in_motion ? group->g.real.num_loaded : group->g.real.num_loading;
 
@@ -800,6 +832,7 @@
 	res->last_value      = 0;
 	res->trigger         = 0;
 	res->reseed          = 0;
+	res->count           = 0;
 }
 
 
--- a/src/newgrf_fsmports.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_fsmports.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -11,7 +11,7 @@
 #include "sprite.h"
 #include "table/sprites.h"
 #include "table/strings.h"
-#include "station.h"
+#include "station_base.h"
 #include "station_map.h"
 #include "newgrf.h"
 #include "newgrf_callbacks.h"
@@ -23,6 +23,7 @@
 #include "newgrf_town.h"
 #include "player_func.h"
 #include "gfx_func.h"
+#include "strings_func.h"
 #include "widgets/dropdown_type.h"
 
 static FSMportsClass fsmports_classes[FSMPORTS_CLASS_MAX];
--- a/src/newgrf_fsmports.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_fsmports.h	Tue Apr 15 00:47:19 2008 +0000
@@ -10,10 +10,11 @@
 #include "map_type.h"
 #include "map_func.h"
 #include "tile_map.h"
-#include "engine.h"
 #include "newgrf_cargo.h"
 #include "sprite.h"
 #include "airport.h"
+#include "station_type.h"
+#include "strings_func.h"
 #include "widgets/dropdown_type.h"
 
 enum FSMportClass {
--- a/src/newgrf_generic.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_generic.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -125,6 +125,7 @@
 	res->last_value      = 0;
 	res->trigger         = 0;
 	res->reseed          = 0;
+	res->count           = 0;
 }
 
 
--- a/src/newgrf_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -114,6 +114,7 @@
 	GRFConfig **list;
 	const GRFConfig *sel;
 };
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(newgrf_add_d));
 
 /* Names of the add a newgrf window widgets */
 enum AddNewGRFWindowWidgets {
@@ -179,7 +180,7 @@
 					const GRFConfig *c;
 					uint i = (e->we.click.pt.y - w->widget[ANGRFW_GRF_LIST].top) / 10 + w->vscroll.pos;
 
-					for (c = _all_grfs; c != NULL && i > 0; c = c->next, i--);
+					for (c = _all_grfs; c != NULL && i > 0; c = c->next, i--) {}
 					WP(w, newgrf_add_d).sel = c;
 					SetWindowDirty(w);
 					break;
@@ -304,7 +305,7 @@
 	const GRFConfig *c;
 	int i;
 
-	for (c = *WP(w, newgrf_d).list, i = 0; c != NULL; c = c->next, i++);
+	for (c = *WP(w, newgrf_d).list, i = 0; c != NULL; c = c->next, i++) {}
 
 	w->vscroll.cap = (w->widget[SNGRFS_FILE_LIST].bottom - w->widget[SNGRFS_FILE_LIST].top) / 14 + 1;
 	SetVScrollCount(w, i);
@@ -327,9 +328,9 @@
 		ReloadNewGRFData();
 
 		/* Show new, updated list */
-		for (c = *nd->list; c != NULL && c != nd->sel; c = c->next, i++);
+		for (c = *nd->list; c != NULL && c != nd->sel; c = c->next, i++) {}
 		CopyGRFConfigList(nd->list, *nd->orig_list, false);
-		for (c = *nd->list; c != NULL && i > 0; c = c->next, i--);
+		for (c = *nd->list; c != NULL && i > 0; c = c->next, i--) {}
 		nd->sel = c;
 
 		SetWindowDirty(w);
@@ -474,7 +475,7 @@
 					GRFConfig *c;
 					uint i = (e->we.click.pt.y - w->widget[SNGRFS_FILE_LIST].top) / 14 + w->vscroll.pos;
 
-					for (c = *WP(w, newgrf_d).list; c != NULL && i > 0; c = c->next, i--);
+					for (c = *WP(w, newgrf_d).list; c != NULL && i > 0; c = c->next, i--) {}
 					WP(w, newgrf_d).sel = c;
 
 					SetWindowDirty(w);
--- a/src/newgrf_house.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_house.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -31,13 +31,24 @@
 
 HouseOverrideManager _house_mngr(NEW_HOUSE_OFFSET, HOUSE_MAX, INVALID_HOUSE_ID);
 
-void CheckHouseIDs()
+/**
+ * Check and update town and house values.
+ *
+ * Checked are the HouseIDs. Updated are the
+ * town population the number of houses per
+ * town, the town radius and the max passengers
+ * of the town.
+ */
+void UpdateHousesAndTowns()
 {
 	Town *town;
 	InitializeBuildingCounts();
 
-	/* Reset town population */
-	FOR_ALL_TOWNS(town) town->population = 0;
+	/* Reset town population and num_houses */
+	FOR_ALL_TOWNS(town) {
+		town->population = 0;
+		town->num_houses = 0;
+	}
 
 	for (TileIndex t = 0; t < MapSize(); t++) {
 		HouseID house_id;
@@ -51,9 +62,23 @@
 			house_id = _house_mngr.GetSubstituteID(house_id);
 			SetHouseType(t, house_id);
 		}
+
 		town = GetTownByTile(t);
 		IncreaseBuildingCount(town, house_id);
 		if (IsHouseCompleted(t)) town->population += GetHouseSpecs(house_id)->population;
+
+		/* Increase the number of houses for every house tile which
+		 * has a size bit set. Multi tile buildings have got only
+		 * one tile with such a bit set, so there is no problem. */
+		if (GetHouseSpecs(GetHouseType(t))->building_flags & BUILDING_HAS_1_TILE) {
+			town->num_houses++;
+		}
+	}
+
+	/* Update the population and num_house dependant values */
+	FOR_ALL_TOWNS(town) {
+		UpdateTownRadius(town);
+		UpdateTownMaxPass(town);
 	}
 }
 
@@ -191,7 +216,7 @@
 
 	switch (variable) {
 		/* Construction stage. */
-		case 0x40: return (IsTileType(tile, MP_HOUSE) ? GetHouseBuildingStage(tile) : 0) | OriginalTileRandomiser(TileX(tile), TileY(tile)) << 2;
+		case 0x40: return (IsTileType(tile, MP_HOUSE) ? GetHouseBuildingStage(tile) : 0) | TileHash2Bit(TileX(tile), TileY(tile)) << 2;
 
 		/* Building age. */
 		case 0x41: return Clamp(_cur_year - GetHouseConstructionYear(tile), 0, 0xFF);
@@ -266,6 +291,7 @@
 	res->last_value      = 0;
 	res->trigger         = 0;
 	res->reseed          = 0;
+	res->count           = 0;
 }
 
 uint16 GetHouseCallback(CallbackID callback, uint32 param1, uint32 param2, HouseID house_id, Town *town, TileIndex tile)
@@ -296,6 +322,9 @@
 
 	if (GB(image, 0, SPRITE_WIDTH) != 0) DrawGroundSprite(image, pal);
 
+	/* End now, if houses are invisible */
+	if (IsInvisibilitySet(TO_HOUSES)) return;
+
 	foreach_draw_tile_seq(dtss, dts->seq) {
 		if (GB(dtss->image.sprite, 0, SPRITE_WIDTH) == 0) continue;
 
@@ -314,7 +343,7 @@
 						pal = HasBit(callback, 14) ? GB(callback, 0, 8) + SPR_2CCMAP_BASE : callback;
 					}
 				} else {
-					pal = hs->random_colour[OriginalTileRandomiser(ti->x, ti->y)] + PALETTE_RECOLOR_START;
+					pal = hs->random_colour[TileHash2Bit(ti->x, ti->y)] + PALETTE_RECOLOR_START;
 				}
 			}
 		} else {
--- a/src/newgrf_house.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_house.h	Tue Apr 15 00:47:19 2008 +0000
@@ -26,7 +26,7 @@
 	uint8  class_id;  ////< The class id within the grf file
 };
 
-void CheckHouseIDs();
+void UpdateHousesAndTowns();
 
 HouseClassID AllocateHouseClassID(byte grf_class_id, uint32 grfid);
 
--- a/src/newgrf_industries.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_industries.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -25,7 +25,7 @@
 
 #include "table/strings.h"
 
-static Randomizer _industry_creation_randomizer;
+static uint32 _industry_creation_random_bits;
 
 /* Since the industry IDs defined by the GRF file don't necessarily correlate
  * to those used by the game, the IDs used for overriding old industries must be
@@ -410,6 +410,7 @@
 	res->last_value      = 0;
 	res->trigger         = 0;
 	res->reseed          = 0;
+	res->count           = 0;
 }
 
 uint16 GetIndustryCallback(CallbackID callback, uint32 param1, uint32 param2, Industry *industry, IndustryType type, TileIndex tile)
@@ -469,7 +470,7 @@
 		case 0x8D: return min(DistanceSquare(industry->town->xy, tile), 65535);
 
 		/* 32 random bits */
-		case 0x8F: return _industry_creation_randomizer.Next();
+		case 0x8F: return _industry_creation_random_bits;
 	}
 
 	/* None of the special ones, so try the general ones */
@@ -494,7 +495,7 @@
 	NewIndustryResolver(&object, tile, &ind, type);
 	object.GetVariable = IndustryLocationGetVariable;
 	object.callback = CBID_INDUSTRY_LOCATION;
-	_industry_creation_randomizer.SetSeed(seed);
+	_industry_creation_random_bits = seed;
 
 	group = Resolve(GetIndustrySpec(type)->grf_prop.spritegroup, &object);
 
--- a/src/newgrf_industrytiles.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_industrytiles.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -170,6 +170,7 @@
 	res->last_value      = 0;
 	res->trigger         = 0;
 	res->reseed          = 0;
+	res->count           = 0;
 }
 
 void IndustryDrawTileLayout(const TileInfo *ti, const SpriteGroup *group, byte rnd_color, byte stage, IndustryGfx gfx)
@@ -184,6 +185,9 @@
 
 	if (GB(image, 0, SPRITE_WIDTH) != 0) DrawGroundSprite(image, pal);
 
+	/* End now if industries are invisible */
+	if (IsInvisibilitySet(TO_INDUSTRIES)) return;
+
 	foreach_draw_tile_seq(dtss, dts->seq) {
 		if (GB(dtss->image.sprite, 0, SPRITE_WIDTH) == 0) continue;
 
@@ -275,7 +279,7 @@
 		return !IsSlopeRefused(GetTileSlope(ind_tile, NULL), its->slopes_refused);
 	}
 	if (its->grf_prop.grffile->grf_version < 7) {
-		return callback_res != 0;
+		return (callback_res & 0xFF) != 0; // mask to 8 bit callback result
 	}
 
 	/* Copy some parameters from the registers to the error message text ref. stack */
--- a/src/newgrf_sound.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_sound.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -5,7 +5,7 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "oldpool.h"
-#include "engine.h"
+#include "engine_func.h"
 #include "newgrf_callbacks.h"
 #include "newgrf_engine.h"
 #include "newgrf_sound.h"
--- a/src/newgrf_sound.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_sound.h	Tue Apr 15 00:47:19 2008 +0000
@@ -6,6 +6,7 @@
 #define NEWGRF_SOUND_H
 
 #include "sound_type.h"
+#include "tile_type.h"
 
 enum VehicleSoundEvent {
 	VSE_START        = 1,
--- a/src/newgrf_spritegroup.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_spritegroup.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -80,6 +80,37 @@
 TemporaryStorageArray<uint32, 0x110> _temp_store;
 
 
+static inline bool Is8BitCallback(const ResolverObject *object)
+{
+	/* Var 0x7E procedure results are always 15 bit */
+	if (object == NULL || object->procedure_call) return false;
+
+	switch (object->callback) {
+		/* All these functions are 15 bit callbacks */
+		case CBID_STATION_SPRITE_LAYOUT:
+		case CBID_VEHICLE_REFIT_CAPACITY:
+		case CBID_HOUSE_COLOUR:
+		case CBID_HOUSE_CARGO_ACCEPTANCE:
+		case CBID_INDUSTRY_LOCATION:
+		case CBID_HOUSE_ACCEPT_CARGO:
+		case CBID_INDTILE_CARGO_ACCEPTANCE:
+		case CBID_INDTILE_ACCEPT_CARGO:
+		case CBID_VEHICLE_COLOUR_MAPPING:
+		case CBID_HOUSE_PRODUCE_CARGO:
+		case CBID_INDTILE_SHAPE_CHECK: // depends on grf version, masked to 8 bit in PerformIndustryTileSlopeCheck() if needed
+		case CBID_VEHICLE_SOUND_EFFECT:
+		case CBID_VEHICLE_MODIFY_PROPERTY: // depends on queried property
+		case CBID_CARGO_PROFIT_CALC:
+		case CBID_SOUNDS_AMBIENT_EFFECT:
+		case CBID_CARGO_STATION_RATING_CALC:
+			return false;
+
+		/* The rest is a 8 bit callback, which should be truncated properly */
+		default:
+			return true;
+	}
+}
+
 static inline uint32 GetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
 {
 	/* First handle variables common with Action7/9/D */
@@ -174,6 +205,7 @@
 		bool available = true;
 		if (adjust->variable == 0x7E) {
 			ResolverObject subobject = *object;
+			subobject.procedure_call = true;
 			const SpriteGroup *subgroup = Resolve(adjust->subroutine, &subobject);
 			if (subgroup == NULL || subgroup->type != SGT_CALLBACK) {
 				value = CALLBACK_FAILED;
@@ -204,25 +236,7 @@
 	if (group->g.determ.num_ranges == 0) {
 		/* nvar == 0 is a special case -- we turn our value into a callback result */
 		nvarzero.type = SGT_CALLBACK;
-		switch (object->callback) {
-			/* All these functions are 15 bit callbacks */
-			case CBID_VEHICLE_REFIT_CAPACITY:
-			case CBID_HOUSE_COLOUR:
-			case CBID_HOUSE_CARGO_ACCEPTANCE:
-			case CBID_INDUSTRY_LOCATION:
-			case CBID_INDTILE_CARGO_ACCEPTANCE:
-			case CBID_VEHICLE_COLOUR_MAPPING:
-			case CBID_HOUSE_PRODUCE_CARGO:
-			case CBID_VEHICLE_SOUND_EFFECT:
-			case CBID_SOUNDS_AMBIENT_EFFECT:
-				nvarzero.g.callback.result = GB(value, 0, 15);
-				break;
-
-			/* The rest is a 8 bit callback, which should be truncated properly */
-			default:
-				nvarzero.g.callback.result = GB(value, 0, 8);
-				break;
-		}
+		nvarzero.g.callback.result = GB(value, 0, Is8BitCallback(object) ? 8 : 15);
 		return &nvarzero;
 	}
 
@@ -242,6 +256,7 @@
 	byte index;
 
 	object->scope = group->g.random.var_scope;
+	object->count = group->g.random.count;
 
 	if (object->trigger != 0) {
 		/* Handle triggers */
@@ -280,6 +295,14 @@
 		case SGT_REAL:          return object->ResolveReal(object, group);
 		case SGT_DETERMINISTIC: return ResolveVariable(group, object);
 		case SGT_RANDOMIZED:    return ResolveRandom(group, object);
+		case SGT_CALLBACK: {
+			if (!Is8BitCallback(object)) return group;
+
+			static SpriteGroup result8bit;
+			result8bit.type = SGT_CALLBACK;
+			result8bit.g.callback.result = GB(group->g.callback.result, 0, 8);
+			return &result8bit;
+		}
 		default:                return group;
 	}
 }
--- a/src/newgrf_spritegroup.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_spritegroup.h	Tue Apr 15 00:47:19 2008 +0000
@@ -7,10 +7,15 @@
 
 #include "town_type.h"
 #include "industry_type.h"
-#include "newgrf_storage.h"
 #include "core/bitmath_func.hpp"
 #include "gfx_type.h"
+#include "engine_type.h"
+#include "tile_type.h"
+
+#include "newgrf_cargo.h"
+#include "newgrf_callbacks.h"
 #include "newgrf_generic.h"
+#include "newgrf_storage.h"
 
 /**
  * Gets the value of a so-called newgrf "register".
@@ -48,6 +53,8 @@
 	VSG_SCOPE_SELF,
 	/* Engine of consists for vehicles, city for stations. */
 	VSG_SCOPE_PARENT,
+	/* Any vehicle in the consist (vehicles only) */
+	VSG_SCOPE_RELATIVE,
 };
 
 enum DeterministicSpriteGroupSize {
@@ -128,6 +135,7 @@
 
 	RandomizedSpriteGroupCompareMode cmp_mode; ///< Check for these triggers:
 	byte triggers;
+	byte count;
 
 	byte lowest_randbit; ///< Look for this in the per-object randomized bitmask:
 	byte num_groups; ///< must be power of 2
@@ -198,8 +206,10 @@
 	CallbackID callback;
 	uint32 callback_param1;
 	uint32 callback_param2;
+	bool procedure_call; ///< true if we are currently resolving a var 0x7E procedure result.
 
 	byte trigger;
+	byte count;
 	uint32 last_value;
 	uint32 reseed;
 	VarSpriteGroupScope scope;
@@ -255,6 +265,8 @@
 	void (*SetTriggers)(const struct ResolverObject*, int);
 	uint32 (*GetVariable)(const struct ResolverObject*, byte, byte, bool*);
 	const SpriteGroup *(*ResolveReal)(const struct ResolverObject*, const SpriteGroup*);
+
+	ResolverObject() : procedure_call(false) { }
 };
 
 
--- a/src/newgrf_station.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_station.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -9,7 +9,7 @@
 #include "landscape.h"
 #include "debug.h"
 #include "sprite.h"
-#include "station.h"
+#include "station_base.h"
 #include "station_map.h"
 #include "newgrf.h"
 #include "newgrf_callbacks.h"
@@ -105,7 +105,7 @@
 uint GetNumStationClasses()
 {
 	uint i;
-	for (i = 0; i < STAT_CLASS_MAX && _station_classes[i].id != 0; i++);
+	for (i = 0; i < STAT_CLASS_MAX && _station_classes[i].id != 0; i++) {}
 	return i;
 }
 
@@ -572,6 +572,7 @@
 	res->last_value      = 0;
 	res->trigger         = 0;
 	res->reseed          = 0;
+	res->count           = 0;
 }
 
 static const SpriteGroup *ResolveStation(ResolverObject *object)
@@ -725,7 +726,7 @@
 
 	/* If this was the highest spec index, reallocate */
 	if (specindex == st->num_specs - 1) {
-		for (; st->speclist[st->num_specs - 1].grfid == 0 && st->num_specs > 1; st->num_specs--);
+		for (; st->speclist[st->num_specs - 1].grfid == 0 && st->num_specs > 1; st->num_specs--) {}
 
 		if (st->num_specs > 1) {
 			st->speclist = ReallocT(st->speclist, st->num_specs);
--- a/src/newgrf_station.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_station.h	Tue Apr 15 00:47:19 2008 +0000
@@ -5,11 +5,14 @@
 #ifndef NEWGRF_STATION_H
 #define NEWGRF_STATION_H
 
-#include "engine.h"
+#include "engine_type.h"
 #include "newgrf_callbacks.h"
 #include "newgrf_cargo.h"
 #include "tile_type.h"
+#include "station_type.h"
 #include "strings_type.h"
+#include "sprite.h"
+#include "direction_type.h"
 
 enum StationClassID {
 	STAT_CLASS_BEGIN = 0,    ///< the lowest valid value
@@ -120,12 +123,6 @@
 SpriteID GetCustomStationGroundRelocation(const StationSpec *statspec, const Station *st, TileIndex tile);
 uint16 GetStationCallback(CallbackID callback, uint32 param1, uint32 param2, const StationSpec *statspec, const Station *st, TileIndex tile);
 
-/* Check if a rail station tile is traversable. */
-bool IsStationTileBlocked(TileIndex tile);
-
-/* Check if a rail station tile is electrifiable. */
-bool IsStationTileElectrifiable(TileIndex tile);
-
 /* Allocate a StationSpec to a Station. This is called once per build operation. */
 int AllocateSpecToStation(const StationSpec *statspec, Station *st, bool exec);
 
--- a/src/newgrf_text.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_text.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -19,6 +19,7 @@
 #include "core/alloc_func.hpp"
 #include "newgrf_storage.h"
 #include "string_func.h"
+#include "date_type.h"
 
 #include "table/strings.h"
 #include "table/control_codes.h"
@@ -642,7 +643,7 @@
 		case SCC_NEWGRF_PRINT_SIGNED_WORD:
 		case SCC_NEWGRF_PRINT_SIGNED_BYTE:
 		case SCC_NEWGRF_PRINT_UNSIGNED_WORD:
-			return SCC_NUM;
+			return SCC_COMMA;
 
 		case SCC_NEWGRF_PRINT_DWORD_CURRENCY:
 		case SCC_NEWGRF_PRINT_QWORD_CURRENCY:
--- a/src/newgrf_town.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/newgrf_town.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -64,7 +64,7 @@
 		case 0xAD: return GB(t->ratings[7], 8, 8);
 		case 0xAE: return t->have_ratings;
 		case 0xB2: return t->statues;
-		case 0xB6: return t->num_houses;
+		case 0xB6: return ClampToU16(t->num_houses);
 		case 0xB9: return t->growth_rate;
 		case 0xBA: return ClampToU16(t->new_max_pass);
 		case 0xBB: return GB(ClampToU16(t->new_max_pass), 8, 8);
--- a/src/news.h	Mon Apr 14 20:32:36 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-/* $Id$ */
-
-/** @file news.h */
-
-#ifndef NEWS_H
-#define NEWS_H
-
-#include "window_type.h"
-#include "vehicle_type.h"
-#include "tile_type.h"
-#include "date_type.h"
-#include "strings_type.h"
-
-struct NewsItem {
-	StringID string_id; ///< Message text (sometimes also used for storing other info)
-	uint16 duration;    ///< Remaining time for showing this news message
-	Date date;          ///< Date of the news
-	byte flags;         ///< NewsFlags bits @see NewsFlags
-	byte display_mode;  ///< Display mode value @see NewsMode
-	byte type;          ///< News category @see NewsType
-	byte callback;      ///< Call-back function
-
-	TileIndex data_a;   ///< Reference to tile or vehicle
-	TileIndex data_b;   ///< Reference to second tile or vehicle
-
-	uint64 params[10];
-};
-
-typedef bool ValidationProc ( uint data_a, uint data_b );
-typedef void DrawNewsCallbackProc(Window *w);
-typedef StringID GetNewsStringCallbackProc(const NewsItem *ni);
-
-/**
- * Macro for creating news flags.
- * @param mode (bits 0 - 7) Display_mode, one of the NewsMode enums (NM_)
- * @param flag (bits 8 - 15) OR-able news flags, any of the NewsFlags enums (NF_)
- * @param type (bits 16-23) News category, one of the NewsType enums (NT_)
- * @param cb (bits 24-31) Call-back function, one of the NewsCallback enums (DNC_) or 0 if no callback
- * @see NewsMode
- * @see NewsFlags
- * @see NewsType
- * @see NewsCallback
- * @see AddNewsItem
- */
-#define NEWS_FLAGS(mode, flag, type, cb) ((cb) << 24 | (type) << 16 | (flag) << 8 | (mode))
-
-void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b);
-void NewsLoop();
-void DrawNewsBorder(const Window *w);
-void InitNewsItemStructs();
-
-extern NewsItem _statusbar_news_item;
-extern uint32 _news_display_opt;
-extern bool _news_ticker_sound;
-
-/** Type of news. */
-enum NewsType {
-	NT_ARRIVAL_PLAYER,  ///< Cargo arrived for player
-	NT_ARRIVAL_OTHER,   ///< Cargo arrived for competitor
-	NT_ACCIDENT,        ///< An accident or disaster has occurred
-	NT_COMPANY_INFO,    ///< Company info (new companies, bankrupcy messages)
-	NT_OPENCLOSE,       ///< Opening and closing of industries
-	NT_ECONOMY,         ///< Economic changes (recession, industry up/dowm)
-	NT_INDUSTRY_PLAYER, ///< Production changes of industry serviced by local player
-	NT_INDUSTRY_OTHER,  ///< Production changes of industry serviced by competitor(s)
-	NT_INDUSTRY_NOBODY, ///< Other industry production changes
-	NT_ADVICE,          ///< Bits of news about vehicles of the player
-	NT_NEW_VEHICLES,    ///< New vehicle has become available
-	NT_ACCEPTANCE,      ///< A type of cargo is (no longer) accepted
-	NT_SUBSIDIES,       ///< News about subsidies (announcements, expirations, acceptance)
-	NT_GENERAL,         ///< General news (from towns)
-	NT_END,             ///< end-of-array marker
-};
-
-extern const char *_news_display_name[NT_END];
-
-/**
- * News mode.
- * @see NEWS_FLAGS
- */
-enum NewsMode {
-	NM_SMALL    = 0, ///< Show only a small popup informing us about vehicle age for example
-	NM_NORMAL   = 1, ///< Show a simple news message (height 170 pixels)
-	NM_THIN     = 2, ///< Show a simple news message (height 130 pixels)
-	NM_CALLBACK = 3, ///< Do some special processing before displaying news message. Which callback to call is in NewsCallback
-};
-
-/**
- * Various OR-able news-item flags.
- * note: NF_INCOLOR is set automatically if needed
- * @see NEWS_FLAGS
- */
-enum NewsFlags {
-	NF_VIEWPORT  = (1 << 1), ///< Does the news message have a viewport? (ingame picture of happening)
-	NF_TILE      = (1 << 2), ///< When clicked on the news message scroll to a given tile? Tile is in data_a/data_b
-	NF_VEHICLE   = (1 << 3), ///< When clicked on the message scroll to the vehicle? VehicleID is in data_a
-	NF_FORCE_BIG = (1 << 4), ///< Force the appearance of a news message if it has already been shown (internal)
-	NF_INCOLOR   = (1 << 5), ///< Show the newsmessage in colour, otherwise it defaults to black & white
-};
-
-/** Special news items */
-enum NewsCallback {
-	DNC_VEHICLEAVAIL  = 0, ///< Show new vehicle available message. StringID is EngineID
-	DNC_BANKRUPCY     = 1, ///< Show bankrupcy message. StringID is PlayerID (0-3) and NewsBankrupcy (4-7)
-};
-
-/** Kinds of bankrupcy */
-enum NewsBankrupcy {
-	NB_BTROUBLE    = (1 << 4), ///< Company is in trouble (warning)
-	NB_BMERGER     = (2 << 4), ///< Company has been bought by another company
-	NB_BBANKRUPT   = (3 << 4), ///< Company has gone bankrupt
-	NB_BNEWCOMPANY = (4 << 4), ///< A new company has been started
-};
-
-/**
- * Delete a news item type about a vehicle
- * if the news item type is INVALID_STRING_ID all news about the vehicle get
- * deleted
- */
-void DeleteVehicleNews(VehicleID, StringID news);
-
-#endif /* NEWS_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/news_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,29 @@
+/* $Id$ */
+
+/** @file news_func.h Functions related to news. */
+
+#ifndef NEWS_FUNC_H
+#define NEWS_FUNC_H
+
+#include "news_type.h"
+#include "vehicle_type.h"
+
+void AddNewsItem(StringID string, NewsMode mode, NewsFlag flag, NewsType type, NewsCallback callback, uint data_a, uint data_b);
+void NewsLoop();
+void DrawNewsBorder(const Window *w);
+void InitNewsItemStructs();
+
+extern NewsItem _statusbar_news_item;
+extern uint32 _news_display_opt;
+extern bool _news_ticker_sound;
+
+extern const char *_news_display_name[NT_END];
+
+/**
+ * Delete a news item type about a vehicle
+ * if the news item type is INVALID_STRING_ID all news about the vehicle get
+ * deleted
+ */
+void DeleteVehicleNews(VehicleID, StringID news);
+
+#endif /* NEWS_FUNC_H */
--- a/src/news_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/news_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -6,7 +6,7 @@
 #include "gui.h"
 #include "window_gui.h"
 #include "viewport_func.h"
-#include "news.h"
+#include "news_func.h"
 #include "settings_type.h"
 #include "transparency.h"
 #include "strings_func.h"
@@ -60,6 +60,16 @@
 static NewsID _oldest_news = 0;             ///< points to first item in fifo queue
 static NewsID _latest_news = INVALID_NEWS;  ///< points to last item in fifo queue
 
+struct news_d {
+	uint16 follow_vehicle;
+	int32 scrollpos_x;
+	int32 scrollpos_y;
+	int32 dest_scrollpos_x;
+	int32 dest_scrollpos_y;
+	NewsItem *ni;
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(news_d));
+
 /** Forced news item.
  * Users can force an item by accessing the history or "last message".
  * If the message being shown was forced by the user, its index is stored in
@@ -68,8 +78,8 @@
 
 static byte _total_news = 0; ///< Number of news items in FIFO queue @see _news_items
 
-void DrawNewsNewVehicleAvail(Window *w);
-void DrawNewsBankrupcy(Window *w);
+void DrawNewsNewVehicleAvail(Window *w, const NewsItem *ni);
+void DrawNewsBankrupcy(Window *w, const NewsItem *ni);
 static void MoveToNextItem();
 
 StringID GetNewsStringNewVehicleAvail(const NewsItem *ni);
@@ -117,118 +127,115 @@
 static void NewsWindowProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: { // If chatbar is open at creation time, we need to go above it
-		const Window *w1 = FindWindowById(WC_SEND_NETWORK_MSG, 0);
-		w->message.msg = (w1 != NULL) ? w1->height : 0;
-	} break;
-
-	case WE_PAINT: {
-		const NewsItem *ni = WP(w, news_d).ni;
-		ViewPort *vp;
-
-		switch (ni->display_mode) {
-			case NM_NORMAL:
-			case NM_THIN: {
-				DrawNewsBorder(w);
-
-				DrawString(2, 1, STR_00C6, TC_FROMSTRING);
-
-				SetDParam(0, ni->date);
-				DrawStringRightAligned(428, 1, STR_01FF, TC_FROMSTRING);
-
-				if (!(ni->flags & NF_VIEWPORT)) {
-					CopyInDParam(0, ni->params, lengthof(ni->params));
-					DrawStringMultiCenter(215, ni->display_mode == NM_NORMAL ? 76 : 56,
-						ni->string_id, w->width - 4);
-				} else {
-					/* Back up transparency options to draw news view */
-					TransparencyOptionBits to_backup = _transparency_opt;
-					_transparency_opt = 0;
-					DrawWindowViewport(w);
-					_transparency_opt = to_backup;
-
-					/* Shade the viewport into gray, or color*/
-					vp = w->viewport;
-					GfxFillRect(vp->left - w->left, vp->top - w->top,
-						vp->left - w->left + vp->width - 1, vp->top - w->top + vp->height - 1,
-						(ni->flags & NF_INCOLOR ? PALETTE_TO_TRANSPARENT : PALETTE_TO_STRUCT_GREY) | (1 << USE_COLORTABLE)
-					);
+		case WE_CREATE: { // If chatbar is open at creation time, we need to go above it
+			const Window *w1 = FindWindowById(WC_SEND_NETWORK_MSG, 0);
+			w->message.msg = (w1 != NULL) ? w1->height : 0;
+		} break;
 
-					CopyInDParam(0, ni->params, lengthof(ni->params));
-					DrawStringMultiCenter(w->width / 2, 20, ni->string_id, w->width - 4);
-				}
-				break;
-			}
+		case WE_PAINT: {
+			const NewsItem *ni = WP(w, news_d).ni;
 
-			case NM_CALLBACK: {
-				_draw_news_callback[ni->callback](w);
-				break;
-			}
+			switch (ni->display_mode) {
+				case NM_NORMAL:
+				case NM_THIN: {
+					DrawNewsBorder(w);
 
-			default: {
-				DrawWindowWidgets(w);
-				if (!(ni->flags & NF_VIEWPORT)) {
-					CopyInDParam(0, ni->params, lengthof(ni->params));
-					DrawStringMultiCenter(140, 38, ni->string_id, 276);
-				} else {
-					DrawWindowViewport(w);
-					CopyInDParam(0, ni->params, lengthof(ni->params));
-					DrawStringMultiCenter(w->width / 2, w->height - 16, ni->string_id, w->width - 4);
+					DrawString(2, 1, STR_00C6, TC_FROMSTRING);
+
+					SetDParam(0, ni->date);
+					DrawStringRightAligned(428, 1, STR_01FF, TC_FROMSTRING);
+
+					if (!(ni->flags & NF_VIEWPORT)) {
+						CopyInDParam(0, ni->params, lengthof(ni->params));
+						DrawStringMultiCenter(215, ni->display_mode == NM_NORMAL ? 76 : 56,
+							ni->string_id, w->width - 4);
+					} else {
+						/* Back up transparency options to draw news view */
+						TransparencyOptionBits to_backup = _transparency_opt;
+						_transparency_opt = 0;
+						DrawWindowViewport(w);
+						_transparency_opt = to_backup;
+
+						/* Shade the viewport into gray, or color*/
+						ViewPort *vp = w->viewport;
+						GfxFillRect(vp->left - w->left, vp->top - w->top,
+							vp->left - w->left + vp->width - 1, vp->top - w->top + vp->height - 1,
+							(ni->flags & NF_INCOLOR ? PALETTE_TO_TRANSPARENT : PALETTE_TO_STRUCT_GREY) | (1 << USE_COLORTABLE)
+						);
+
+						CopyInDParam(0, ni->params, lengthof(ni->params));
+						DrawStringMultiCenter(w->width / 2, 20, ni->string_id, w->width - 4);
+					}
+					break;
 				}
-				break;
-			}
-		}
-	} break;
 
-	case WE_CLICK: {
-		switch (e->we.click.widget) {
-		case 1: {
-			NewsItem *ni = WP(w, news_d).ni;
-			DeleteWindow(w);
-			ni->duration = 0;
-			_forced_news = INVALID_NEWS;
-		} break;
-		case 0: {
-			NewsItem *ni = WP(w, news_d).ni;
-			if (ni->flags & NF_VEHICLE) {
-				Vehicle *v = GetVehicle(ni->data_a);
-				ScrollMainWindowTo(v->x_pos, v->y_pos);
-			} else if (ni->flags & NF_TILE) {
-				if (!ScrollMainWindowToTile(ni->data_a) && ni->data_b != 0)
-					ScrollMainWindowToTile(ni->data_b);
+				case NM_CALLBACK:
+					_draw_news_callback[ni->callback](w, ni);
+					break;
+
+				default:
+					DrawWindowWidgets(w);
+					if (!(ni->flags & NF_VIEWPORT)) {
+						CopyInDParam(0, ni->params, lengthof(ni->params));
+						DrawStringMultiCenter(140, 38, ni->string_id, 276);
+					} else {
+						DrawWindowViewport(w);
+						CopyInDParam(0, ni->params, lengthof(ni->params));
+						DrawStringMultiCenter(w->width / 2, w->height - 16, ni->string_id, w->width - 4);
+					}
+					break;
 			}
 		} break;
-		}
-	} break;
-
-	case WE_KEYPRESS:
-		if (e->we.keypress.keycode == WKC_SPACE) {
-			/* Don't continue. */
-			e->we.keypress.cont = false;
-			DeleteWindow(w);
-		}
-		break;
 
-	case WE_MESSAGE: // The chatbar has notified us that is was either created or closed
-		switch (e->we.message.msg) {
-			case WE_CREATE: w->message.msg = e->we.message.wparam; break;
-			case WE_DESTROY: w->message.msg = 0; break;
-		}
-		break;
+		case WE_CLICK: {
+			switch (e->we.click.widget) {
+			case 1: {
+				NewsItem *ni = WP(w, news_d).ni;
+				DeleteWindow(w);
+				ni->duration = 0;
+				_forced_news = INVALID_NEWS;
+			} break;
+			case 0: {
+				NewsItem *ni = WP(w, news_d).ni;
+				if (ni->flags & NF_VEHICLE) {
+					Vehicle *v = GetVehicle(ni->data_a);
+					ScrollMainWindowTo(v->x_pos, v->y_pos);
+				} else if (ni->flags & NF_TILE) {
+					if (!ScrollMainWindowToTile(ni->data_a) && ni->data_b != 0)
+						ScrollMainWindowToTile(ni->data_b);
+				}
+			} break;
+			}
+		} break;
 
-	case WE_TICK: { // Scroll up newsmessages from the bottom in steps of 4 pixels
-		int diff;
-		int y = max(w->top - 4, _screen.height - w->height - 12 - w->message.msg);
-		if (y == w->top) return;
+		case WE_KEYPRESS:
+			if (e->we.keypress.keycode == WKC_SPACE) {
+				/* Don't continue. */
+				e->we.keypress.cont = false;
+				DeleteWindow(w);
+			}
+			break;
 
-		if (w->viewport != NULL)
-			w->viewport->top += y - w->top;
+		case WE_MESSAGE: // The chatbar has notified us that is was either created or closed
+			switch (e->we.message.msg) {
+				case WE_CREATE: w->message.msg = e->we.message.wparam; break;
+				case WE_DESTROY: w->message.msg = 0; break;
+			}
+			break;
 
-		diff = Delta(w->top, y);
-		w->top = y;
+		case WE_TICK: { // Scroll up newsmessages from the bottom in steps of 4 pixels
+			int diff;
+			int y = max(w->top - 4, _screen.height - w->height - 12 - w->message.msg);
+			if (y == w->top) return;
 
-		SetDirtyBlocks(w->left, w->top - diff, w->left + w->width, w->top + w->height);
-	} break;
+			if (w->viewport != NULL)
+				w->viewport->top += y - w->top;
+
+			diff = Delta(w->top, y);
+			w->top = y;
+
+			SetDirtyBlocks(w->left, w->top - diff, w->left + w->width, w->top + w->height);
+		} break;
 	}
 }
 
@@ -236,7 +243,7 @@
  * Return the correct index in the pseudo-fifo
  * queue and deals with overflows when increasing the index
  */
-static inline NewsID increaseIndex(NewsID i)
+static inline NewsID IncreaseIndex(NewsID i)
 {
 	assert(i != INVALID_NEWS);
 	return (i + 1) % MAX_NEWS;
@@ -246,7 +253,7 @@
  * Return the correct index in the pseudo-fifo
  * queue and deals with overflows when decreasing the index
  */
-static inline NewsID decreaseIndex(NewsID i)
+static inline NewsID DecreaseIndex(NewsID i)
 {
 	assert(i != INVALID_NEWS);
 	return (i + MAX_NEWS - 1) % MAX_NEWS;
@@ -254,17 +261,15 @@
 
 /**
  * Add a new newsitem to be shown.
- * @param string String to display, can have special values based on parameter \a flags
- * @param flags various control bits that will show various news-types. See macro NEWS_FLAGS()
+ * @param string String to display, can have special values based on parameter \a display_mode
+ * @param display_mode, any of the NewsMode enums (NM_)
+ * @param flags any of the NewsFlag enums (NF_)
+ * @param type news category, any of the NewsType enums (NT_)
+ * @param callback news callback function, any of the NewsCallback enums (DNC_)
  * @param data_a news-specific value based on news type
  * @param data_b news-specific value based on news type
- * @note flags exists of 4 byte-sized extra parameters.
- *  -# Bits  0 -  7 display_mode, any of the NewsMode enums (NM_)
- *  -# Bits  8 - 15 news flags, any of the NewsFlags enums (NF_)
- *  -# Bits 16 - 23 news category, any of the NewsType enums (NT_)
- *  -# Bits 24 - 31 news callback function, any of the NewsCallback enums (DNC_)
  *
- * If the display mode is NM_CALLBACK, special news is shown and parameter
+ * @note If the display mode is NM_CALLBACK, special news is shown and parameter
  * \a string has a special meaning.
  *  - For DNC_TRAINAVAIL, DNC_ROADAVAIL, DNC_SHIPAVAIL, DNC_AIRCRAFTAVAIL messages: StringID is
  *    the index of the engine that is shown
@@ -274,68 +279,64 @@
  *    @see NewsBankrupcy
  *
  * @see NewsMode
- * @see NewsFlags
+ * @see NewsFlag
  * @see NewsType
  * @see NewsCallback
  */
-void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b)
+void AddNewsItem(StringID string, NewsMode display_mode, NewsFlag flags, NewsType type, NewsCallback callback, uint data_a, uint data_b)
 {
-	NewsID l_news;
-
 	if (_game_mode == GM_MENU) return;
 
 	/* check the rare case that the oldest (to be overwritten) news item is open */
-	if (_total_news == MAX_NEWS && (_oldest_news == _current_news || _oldest_news == _forced_news))
+	if (_total_news == MAX_NEWS && (_oldest_news == _current_news || _oldest_news == _forced_news)) {
 		MoveToNextItem();
+	}
 
 	if (_total_news < MAX_NEWS) _total_news++;
 
 	/* Increase _latest_news. If we have no news yet, use _oldest news as an
 	 * index. We cannot use 0 as _oldest_news can jump around due to
 	 * DeleteVehicleNews */
-	l_news = _latest_news;
-	_latest_news = (_latest_news == INVALID_NEWS) ? _oldest_news : increaseIndex(_latest_news);
+	NewsID l_news = _latest_news;
+	_latest_news = (_latest_news == INVALID_NEWS) ? _oldest_news : IncreaseIndex(_latest_news);
 
 	/* If the fifo-buffer is full, overwrite the oldest entry */
 	if (l_news != INVALID_NEWS && _latest_news == _oldest_news) {
 		assert(_total_news == MAX_NEWS);
-		_oldest_news = increaseIndex(_oldest_news);
+		_oldest_news = IncreaseIndex(_oldest_news);
 	}
 
 	/*DEBUG(misc, 0, "+cur %3d, old %2d, lat %3d, for %3d, tot %2d",
 	  _current_news, _oldest_news, _latest_news, _forced_news, _total_news);*/
 
 	/* Add news to _latest_news */
-	{
-		Window *w;
-		NewsItem *ni = &_news_items[_latest_news];
-		memset(ni, 0, sizeof(*ni));
-
-		ni->string_id = string;
-		ni->display_mode = (byte)flags;
-		ni->flags = (byte)(flags >> 8);
-
-		/* show this news message in color? */
-		if (_cur_year >= _patches.colored_news_year) ni->flags |= NF_INCOLOR;
+	NewsItem *ni = &_news_items[_latest_news];
+	memset(ni, 0, sizeof(*ni));
 
-		ni->type = (byte)(flags >> 16);
-		ni->callback = (byte)(flags >> 24);
-		ni->data_a = data_a;
-		ni->data_b = data_b;
-		ni->date = _date;
-		CopyOutDParam(ni->params, 0, lengthof(ni->params));
+	ni->string_id = string;
+	ni->display_mode = display_mode;
+	ni->flags = flags;
 
-		w = FindWindowById(WC_MESSAGE_HISTORY, 0);
-		if (w == NULL) return;
-		SetWindowDirty(w);
-		w->vscroll.count = _total_news;
-	}
+	/* show this news message in color? */
+	if (_cur_year >= _patches.colored_news_year) ni->flags |= NF_INCOLOR;
+
+	ni->type = type;
+	ni->callback = callback;
+	ni->data_a = data_a;
+	ni->data_b = data_b;
+	ni->date = _date;
+	CopyOutDParam(ni->params, 0, lengthof(ni->params));
+
+	Window *w = FindWindowById(WC_MESSAGE_HISTORY, 0);
+	if (w == NULL) return;
+	SetWindowDirty(w);
+	w->vscroll.count = _total_news;
 }
 
 
 /**
  * Maximum age of news items.
- * Don't show item if it's older than x days, corresponds with NewsType in news.h
+ * Don't show item if it's older than x days, corresponds with NewsType in news_type.h
  * @see NewsType
  */
 static const byte _news_items_age[NT_END] = {
@@ -461,44 +462,42 @@
 /** Open up an own newspaper window for the news item */
 static void ShowNewspaper(NewsItem *ni)
 {
-	Window *w;
-	SoundFx sound;
-	int top;
 	ni->flags &= ~NF_FORCE_BIG;
 	ni->duration = 555;
 
-	sound = _news_sounds[ni->type];
+	SoundFx sound = _news_sounds[ni->type];
 	if (sound != 0) SndPlayFx(sound);
 
-	top = _screen.height;
+	int top = _screen.height;
+	Window *w;
 	switch (ni->display_mode) {
 		case NM_NORMAL:
-		case NM_CALLBACK: {
+		case NM_CALLBACK:
 			_news_type13_desc.top = top;
 			w = AllocateWindowDesc(&_news_type13_desc);
-			if (ni->flags & NF_VIEWPORT)
+			if (ni->flags & NF_VIEWPORT) {
 				AssignWindowViewport(w, 2, 58, 0x1AA, 0x6E,
 					ni->data_a | (ni->flags & NF_VEHICLE ? 0x80000000 : 0), ZOOM_LVL_NEWS);
+			}
 			break;
-		}
 
-		case NM_THIN: {
+		case NM_THIN:
 			_news_type2_desc.top = top;
 			w = AllocateWindowDesc(&_news_type2_desc);
-			if (ni->flags & NF_VIEWPORT)
+			if (ni->flags & NF_VIEWPORT) {
 				AssignWindowViewport(w, 2, 58, 0x1AA, 0x46,
 					ni->data_a | (ni->flags & NF_VEHICLE ? 0x80000000 : 0), ZOOM_LVL_NEWS);
+			}
 			break;
-		}
 
-		default: {
+		default:
 			_news_type0_desc.top = top;
 			w = AllocateWindowDesc(&_news_type0_desc);
-			if (ni->flags & NF_VIEWPORT)
+			if (ni->flags & NF_VIEWPORT) {
 				AssignWindowViewport(w, 3, 17, 0x112, 0x2F,
 					ni->data_a | (ni->flags & NF_VEHICLE ? 0x80000000 : 0), ZOOM_LVL_NEWS);
+			}
 			break;
-		}
 	}
 
 	/*DEBUG(misc, 0, " cur %3d, old %2d, lat %3d, for %3d, tot %2d",
@@ -511,12 +510,10 @@
 /** Show news item in the ticker */
 static void ShowTicker(const NewsItem *ni)
 {
-	Window *w;
-
 	if (_news_ticker_sound) SndPlayFx(SND_16_MORSE);
 
 	_statusbar_news_item = *ni;
-	w = FindWindowById(WC_STATUS_BAR, 0);
+	Window *w = FindWindowById(WC_STATUS_BAR, 0);
 	if (w != NULL) WP(w, def_d).data_1 = 360;
 }
 
@@ -527,16 +524,14 @@
  */
 static bool ReadyForNextItem()
 {
-	const Window *w;
 	NewsID item = (_forced_news == INVALID_NEWS) ? _current_news : _forced_news;
-	NewsItem *ni;
 
 	if (item >= MAX_NEWS) return true;
-	ni = &_news_items[item];
+	NewsItem *ni = &_news_items[item];
 
 	/* Ticker message
 	 * Check if the status bar message is still being displayed? */
-	w = FindWindowById(WC_STATUS_BAR, 0);
+	const Window *w = FindWindowById(WC_STATUS_BAR, 0);
 	if (w != NULL && WP(w, const def_d).data_1 > -1280) return false;
 
 	/* Newspaper message, decrement duration counter */
@@ -554,10 +549,8 @@
 
 	/* if we're not at the last item, then move on */
 	if (_current_news != _latest_news) {
-		NewsItem *ni;
-
-		_current_news = (_current_news == INVALID_NEWS) ? _oldest_news : increaseIndex(_current_news);
-		ni = &_news_items[_current_news];
+		_current_news = (_current_news == INVALID_NEWS) ? _oldest_news : IncreaseIndex(_current_news);
+		NewsItem *ni = &_news_items[_current_news];
 
 		/* check the date, don't show too old items */
 		if (_date - _news_items_age[ni->type] > ni->date) return;
@@ -623,13 +616,13 @@
 		/* Not forced any news yet, show the current one, unless a news window is
 		 * open (which can only be the current one), then show the previous item */
 		const Window *w = FindWindowById(WC_NEWS_WINDOW, 0);
-		ShowNewsMessage((w == NULL || (_current_news == _oldest_news)) ? _current_news : decreaseIndex(_current_news));
+		ShowNewsMessage((w == NULL || (_current_news == _oldest_news)) ? _current_news : DecreaseIndex(_current_news));
 	} else if (_forced_news == _oldest_news) {
 		/* We have reached the oldest news, start anew with the latest */
 		ShowNewsMessage(_latest_news);
 	} else {
 		/* 'Scrolling' through news history show each one in turn */
-		ShowNewsMessage(decreaseIndex(_forced_news));
+		ShowNewsMessage(DecreaseIndex(_forced_news));
 	}
 }
 
@@ -661,8 +654,6 @@
 static void DrawNewsString(int x, int y, uint16 color, const NewsItem *ni, uint maxw)
 {
 	char buffer[512], buffer2[512];
-	const char *ptr;
-	char *dest;
 	StringID str;
 
 	if (ni->display_mode == NM_CALLBACK) {
@@ -675,8 +666,8 @@
 	GetString(buffer, str, lastof(buffer));
 	/* Copy the just gotten string to another buffer to remove any formatting
 	 * from it such as big fonts, etc. */
-	ptr  = buffer;
-	dest = buffer2;
+	const char *ptr = buffer;
+	char *dest = buffer2;
 	WChar c_last = '\0';
 	for (;;) {
 		WChar c = Utf8Consume(&ptr);
@@ -703,46 +694,40 @@
 static void MessageHistoryWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_PAINT: {
-		int y = 19;
-		NewsID p, show;
-
-		SetVScrollCount(w, _total_news);
-		DrawWindowWidgets(w);
-
-		if (_total_news == 0) break;
-		show = min(_total_news, w->vscroll.cap);
-
-		for (p = w->vscroll.pos; p < w->vscroll.pos + show; p++) {
-			/* get news in correct order */
-			const NewsItem *ni = &_news_items[getNews(p)];
+		case WE_PAINT: {
+			int y = 19;
 
-			SetDParam(0, ni->date);
-			DrawString(4, y, STR_SHORT_DATE, TC_WHITE);
-
-			DrawNewsString(82, y, TC_WHITE, ni, w->width - 95);
-			y += 12;
-		}
-		break;
-	}
+			SetVScrollCount(w, _total_news);
+			DrawWindowWidgets(w);
 
-	case WE_CLICK:
-		switch (e->we.click.widget) {
-		case 3: {
-			int y = (e->we.click.pt.y - 19) / 12;
-			NewsID p = getNews(y + w->vscroll.pos);
+			if (_total_news == 0) break;
+			NewsID show = min(_total_news, w->vscroll.cap);
 
-			if (p == INVALID_NEWS) break;
+			for (NewsID p = w->vscroll.pos; p < w->vscroll.pos + show; p++) {
+				/* get news in correct order */
+				const NewsItem *ni = &_news_items[getNews(p)];
 
-			ShowNewsMessage(p);
+				SetDParam(0, ni->date);
+				DrawString(4, y, STR_SHORT_DATE, TC_WHITE);
+
+				DrawNewsString(82, y, TC_WHITE, ni, w->width - 95);
+				y += 12;
+			}
 			break;
 		}
-		}
-		break;
 
-	case WE_RESIZE:
-		w->vscroll.cap += e->we.sizing.diff.y / 12;
-		break;
+		case WE_CLICK:
+			if (e->we.click.widget == 3) {
+				int y = (e->we.click.pt.y - 19) / 12;
+				NewsID p = getNews(y + w->vscroll.pos);
+
+				if (p != INVALID_NEWS) ShowNewsMessage(p);
+			}
+			break;
+
+		case WE_RESIZE:
+			w->vscroll.cap += e->we.sizing.diff.y / 12;
+			break;
 	}
 }
 
@@ -767,10 +752,8 @@
 /** Display window with news messages history */
 void ShowMessageHistory()
 {
-	Window *w;
-
 	DeleteWindowById(WC_MESSAGE_HISTORY, 0);
-	w = AllocateWindowDesc(&_message_history_desc);
+	Window *w = AllocateWindowDesc(&_message_history_desc);
 
 	if (w != NULL) {
 		w->vscroll.cap = 10;
@@ -822,11 +805,10 @@
 		case WE_CREATE: {
 			uint32 val = _news_display_opt;
 			uint32 all_val;
-			int i;
 
 			/* Set up the initial disabled buttons in the case of 'off' or 'full' */
 			all_val = val & 0x3;
-			for (i = 0; i < NT_END; i++, val >>= 2) {
+			for (int i = 0; i < NT_END; i++, val >>= 2) {
 				SetMessageButtonStates(w, val & 0x3, i);
 				/* If the value doesn't match the ALL-button value, set the ALL-button value to 'off' */
 				if ((val & 0x3) != all_val) all_val = 0;
@@ -837,7 +819,6 @@
 
 		case WE_PAINT: {
 			uint32 val = _news_display_opt;
-			int i, y;
 
 			if (_news_ticker_sound) w->LowerWidget(WIDGET_NEWSOPT_SOUNDTICKER);
 
@@ -845,7 +826,7 @@
 			DrawWindowWidgets(w);
 
 			/* Draw the string of each setting on each button. */
-			for (i = 0, y = 26; i < NT_END; i++, y += 12, val >>= 2) {
+			for (int i = 0, y = 26; i < NT_END; i++, y += 12, val >>= 2) {
 				/* 51 comes from 13 + 89 (left and right of the button)+1, shiefted by one as to get division,
 				 * which will give centered position */
 				DrawStringCentered(51, y + 1, message_opt[val & 0x3], TC_BLACK);
@@ -875,19 +856,18 @@
 						SetWindowDirty(w);
 					}
 				} break;
-			} break;
+			}
+			break;
 
-		case WE_DROPDOWN_SELECT: { // Select all settings for newsmessages
-			int i;
-
+		case WE_DROPDOWN_SELECT: // Select all settings for newsmessages
 			WP(w, def_d).data_1 = e->we.dropdown.index;
 
-			for (i = 0; i < NT_END; i++) {
+			for (int i = 0; i < NT_END; i++) {
 				SetMessageButtonStates(w, e->we.dropdown.index, i);
 				SetNewsDisplayValue(i, e->we.dropdown.index);
 			}
 			SetWindowDirty(w);
-		} break;
+			break;
 	}
 }
 
@@ -1002,16 +982,12 @@
 
 void DeleteVehicleNews(VehicleID vid, StringID news)
 {
-	NewsID n;
-
-	for (n = _oldest_news; _latest_news != INVALID_NEWS; n = increaseIndex(n)) {
+	for (NewsID n = _oldest_news; _latest_news != INVALID_NEWS; n = IncreaseIndex(n)) {
 		const NewsItem *ni = &_news_items[n];
 
 		if (ni->flags & NF_VEHICLE &&
 				ni->data_a == vid &&
 				(news == INVALID_STRING_ID || ni->string_id == news)) {
-			Window *w;
-
 			/* If we delete a forced news and it is just before the current news
 			 * then we need to advance to the next news (if any) */
 			if (_forced_news == n) MoveToNextItem();
@@ -1034,27 +1010,27 @@
 			 * We also need an update of the current, forced and visible (open window)
 			 * news's as this shifting could change the items they were pointing to */
 			if (_total_news != 0) {
-				w = FindWindowById(WC_NEWS_WINDOW, 0);
+				Window *w = FindWindowById(WC_NEWS_WINDOW, 0);
 				NewsID visible_news = (w != NULL) ? (NewsID)(WP(w, news_d).ni - _news_items) : INVALID_NEWS;
 
-				for (NewsID i = n;; i = decreaseIndex(i)) {
-					_news_items[i] = _news_items[decreaseIndex(i)];
+				for (NewsID i = n;; i = DecreaseIndex(i)) {
+					_news_items[i] = _news_items[DecreaseIndex(i)];
 
 					if (i != _latest_news) {
-						if (i == _current_news) _current_news = increaseIndex(_current_news);
-						if (i == _forced_news) _forced_news = increaseIndex(_forced_news);
-						if (i == visible_news) WP(w, news_d).ni = &_news_items[increaseIndex(visible_news)];
+						if (i == _current_news) _current_news = IncreaseIndex(_current_news);
+						if (i == _forced_news) _forced_news = IncreaseIndex(_forced_news);
+						if (i == visible_news) WP(w, news_d).ni = &_news_items[IncreaseIndex(visible_news)];
 					}
 
 					if (i == _oldest_news) break;
 				}
-				_oldest_news = increaseIndex(_oldest_news);
+				_oldest_news = IncreaseIndex(_oldest_news);
 			}
 
 			/*DEBUG(misc, 0, "-cur %3d, old %2d, lat %3d, for %3d, tot %2d",
 			  _current_news, _oldest_news, _latest_news, _forced_news, _total_news);*/
 
-			w = FindWindowById(WC_MESSAGE_HISTORY, 0);
+			Window *w = FindWindowById(WC_MESSAGE_HISTORY, 0);
 			if (w != NULL) {
 				SetWindowDirty(w);
 				w->vscroll.count = _total_news;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/news_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,96 @@
+/* $Id$ */
+
+/** @file news_type.h Types related to news. */
+
+#ifndef NEWS_TYPE_H
+#define NEWS_TYPE_H
+
+#include "window_type.h"
+#include "date_type.h"
+#include "strings_type.h"
+
+/**
+ * Type of news.
+ */
+enum NewsType {
+	NT_ARRIVAL_PLAYER,  ///< Cargo arrived for player
+	NT_ARRIVAL_OTHER,   ///< Cargo arrived for competitor
+	NT_ACCIDENT,        ///< An accident or disaster has occurred
+	NT_COMPANY_INFO,    ///< Company info (new companies, bankrupcy messages)
+	NT_OPENCLOSE,       ///< Opening and closing of industries
+	NT_ECONOMY,         ///< Economic changes (recession, industry up/dowm)
+	NT_INDUSTRY_PLAYER, ///< Production changes of industry serviced by local player
+	NT_INDUSTRY_OTHER,  ///< Production changes of industry serviced by competitor(s)
+	NT_INDUSTRY_NOBODY, ///< Other industry production changes
+	NT_ADVICE,          ///< Bits of news about vehicles of the player
+	NT_NEW_VEHICLES,    ///< New vehicle has become available
+	NT_ACCEPTANCE,      ///< A type of cargo is (no longer) accepted
+	NT_SUBSIDIES,       ///< News about subsidies (announcements, expirations, acceptance)
+	NT_GENERAL,         ///< General news (from towns)
+	NT_END,             ///< end-of-array marker
+};
+
+/**
+ * News mode.
+ */
+enum NewsMode {
+	NM_SMALL    = 0, ///< Show only a small popup informing us about vehicle age for example
+	NM_NORMAL   = 1, ///< Show a simple news message (height 170 pixels)
+	NM_THIN     = 2, ///< Show a simple news message (height 130 pixels)
+	NM_CALLBACK = 3, ///< Do some special processing before displaying news message. Which callback to call is in NewsCallback
+};
+
+/**
+ * Various OR-able news-item flags.
+ * note: NF_INCOLOR is set automatically if needed
+ */
+enum NewsFlag {
+	NF_NONE      = 0,        ///< No flag is set.
+	NF_VIEWPORT  = (1 << 1), ///< Does the news message have a viewport? (ingame picture of happening)
+	NF_TILE      = (1 << 2), ///< When clicked on the news message scroll to a given tile? Tile is in data_a/data_b
+	NF_VEHICLE   = (1 << 3), ///< When clicked on the message scroll to the vehicle? VehicleID is in data_a
+	NF_FORCE_BIG = (1 << 4), ///< Force the appearance of a news message if it has already been shown (internal)
+	NF_INCOLOR   = (1 << 5), ///< Show the newsmessage in colour, otherwise it defaults to black & white
+};
+DECLARE_ENUM_AS_BIT_SET(NewsFlag);
+
+
+/**
+ * Special news items
+ */
+enum NewsCallback {
+	DNC_VEHICLEAVAIL  = 0,    ///< Show new vehicle available message. StringID is EngineID
+	DNC_BANKRUPCY     = 1,    ///< Show bankrupcy message. StringID is PlayerID (0-3) and NewsBankrupcy (4-7)
+	DNC_NONE          = 0xFF, ///< No news callback.
+};
+
+/**
+ * Kinds of bankrupcy
+ */
+enum NewsBankrupcy {
+	NB_BTROUBLE,    ///< Company is in trouble (warning)
+	NB_BMERGER,     ///< Company has been bought by another company
+	NB_BBANKRUPT,   ///< Company has gone bankrupt
+	NB_BNEWCOMPANY, ///< A new company has been started
+};
+
+struct NewsItem {
+	StringID string_id;    ///< Message text (sometimes also used for storing other info)
+	uint16 duration;       ///< Remaining time for showing this news message
+	Date date;             ///< Date of the news
+	NewsFlag flags;        ///< NewsFlags bits @see NewsFlag
+	NewsMode display_mode; ///< Display mode value @see NewsMode
+	NewsType type;         ///< News category @see NewsType
+	NewsCallback callback; ///< Call-back function
+
+	uint data_a;           ///< Reference to tile or vehicle
+	uint data_b;           ///< Reference to second tile or vehicle
+
+	uint64 params[10];
+};
+
+typedef bool ValidationProc(uint data_a, uint data_b);
+typedef void DrawNewsCallbackProc(Window *w, const NewsItem *ni);
+typedef StringID GetNewsStringCallbackProc(const NewsItem *ni);
+
+#endif /* NEWS_TYPE_H */
--- a/src/npf.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/npf.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -12,7 +12,7 @@
 #include "landscape.h"
 #include "aystar.h"
 #include "pathfind.h"
-#include "station.h"
+#include "station_base.h"
 #include "station_map.h"
 #include "depot.h"
 #include "tunnel_map.h"
@@ -980,10 +980,10 @@
 	 * dest_tile, not just any stop of that station.
 	 * So only for train orders to stations we fill fstd->station_index, for all
 	 * others only dest_coords */
-	if (v->current_order.type == OT_GOTO_STATION && v->type == VEH_TRAIN) {
-		fstd->station_index = v->current_order.dest;
+	if (v->current_order.IsType(OT_GOTO_STATION) && v->type == VEH_TRAIN) {
+		fstd->station_index = v->current_order.GetDestination();
 		/* Let's take the closest tile of the station as our target for trains */
-		fstd->dest_coords = CalcClosestStationTile(v->current_order.dest, v->tile);
+		fstd->dest_coords = CalcClosestStationTile(fstd->station_index, v->tile);
 	} else {
 		fstd->dest_coords = v->dest_tile;
 		fstd->station_index = INVALID_STATION;
--- a/src/npf.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/npf.h	Tue Apr 15 00:47:19 2008 +0000
@@ -6,7 +6,9 @@
 #define NPF_H
 
 #include "aystar.h"
-#include "station.h"
+#include "station_type.h"
+#include "rail_type.h"
+#include "player_type.h"
 #include "vehicle_type.h"
 #include "tile_type.h"
 #include "track_type.h"
--- a/src/oldloader.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/oldloader.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -7,15 +7,13 @@
 #include "station_map.h"
 #include "town.h"
 #include "industry.h"
-#include "station.h"
 #include "player_func.h"
 #include "player_base.h"
-#include "engine.h"
 #include "aircraft.h"
 #include "roadveh.h"
 #include "ship.h"
 #include "train.h"
-#include "signs.h"
+#include "signs_base.h"
 #include "debug.h"
 #include "depot.h"
 #include "newgrf_config.h"
@@ -339,6 +337,18 @@
 			ClrBit(v->u.road.state, RVS_IS_STOPPING);
 		}
 
+		/* The subtype should be 0, but it sometimes isn't :( */
+		if (v->type == VEH_ROAD) v->subtype = 0;
+
+		/* Sometimes primary vehicles would have a nothing (invalid) order
+		 * or vehicles that could not have an order would still have a
+		 * (loading) order which causes assertions and the like later on.
+		 */
+		if (!IsPlayerBuildableVehicleType(v) ||
+				(v->IsPrimaryVehicle() && v->current_order.IsType(OT_NOTHING))) {
+			v->current_order.MakeDummy();
+		}
+
 		FOR_ALL_VEHICLES_FROM(u, v->index + 1) {
 			/* If a vehicle has the same orders, add the link to eachother
 			 * in both vehicles */
@@ -428,7 +438,7 @@
 
 static const OldChunks town_chunk[] = {
 	OCL_SVAR(   OC_TILE, Town, xy ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, population ),
+	OCL_NULL( 2 ),         ///< population,        no longer in use
 	OCL_SVAR( OC_UINT16, Town, townnametype ),
 	OCL_SVAR( OC_UINT32, Town, townnameparts ),
 	OCL_SVAR(  OC_UINT8, Town, grow_counter ),
@@ -451,7 +461,7 @@
 	nothing changed ? ? */
 	OCL_SVAR( OC_FILE_U32 | OC_VAR_U8, Town, have_ratings ),
 	OCL_SVAR( OC_FILE_U32 | OC_VAR_U8, Town, statues ),
-	OCL_SVAR( OC_UINT16, Town, num_houses ),
+	OCL_NULL( 2 ),         ///< num_houses,        no longer in use
 	OCL_SVAR(  OC_UINT8, Town, time_until_rebuild ),
 	OCL_SVAR(  OC_UINT8, Town, growth_rate ),
 
@@ -494,7 +504,7 @@
 {
 	if (!LoadChunk(ls, NULL, order_chunk)) return false;
 
-	AssignOrder(new (num) Order(), UnpackOldOrder(_old_order));
+	new (num) Order(UnpackOldOrder(_old_order));
 
 	/* Relink the orders to eachother (in TTD(Patch) the orders for one
 	vehicle are behind eachother, with an invalid order (OT_NOTHING) as indication that
@@ -1099,17 +1109,15 @@
 	uint temp = ls->total_read;
 	bool res;
 
-	/* We changed the offset of the vehicle types, so fix it
-	 * Basically v->type -= 0x10; would suffice, but play safely */
 	switch (v->type) {
 		default: NOT_REACHED();
-		case 0x00 /*VEH_INVALID */: v = new (v) InvalidVehicle();  res = LoadChunk(ls, NULL,           vehicle_empty_chunk);    break;
-		case 0x10 /*VEH_TRAIN   */: v = new (v) Train();           res = LoadChunk(ls, &v->u.rail,     vehicle_train_chunk);    break;
-		case 0x11 /*VEH_ROAD    */: v = new (v) RoadVehicle();     res = LoadChunk(ls, &v->u.road,     vehicle_road_chunk);     break;
-		case 0x12 /*VEH_SHIP    */: v = new (v) Ship();            res = LoadChunk(ls, &v->u.ship,     vehicle_ship_chunk);     break;
-		case 0x13 /*VEH_AIRCRAFT*/: v = new (v) Aircraft();        res = LoadChunk(ls, &v->u.air,      vehicle_air_chunk);      break;
-		case 0x14 /*VEH_SPECIAL */: v = new (v) SpecialVehicle();  res = LoadChunk(ls, &v->u.special,  vehicle_special_chunk);  break;
-		case 0x15 /*VEH_DISASTER*/: v = new (v) DisasterVehicle(); res = LoadChunk(ls, &v->u.disaster, vehicle_disaster_chunk); break;
+		case VEH_INVALID : res = LoadChunk(ls, NULL,           vehicle_empty_chunk);    break;
+		case VEH_TRAIN   : res = LoadChunk(ls, &v->u.rail,     vehicle_train_chunk);    break;
+		case VEH_ROAD    : res = LoadChunk(ls, &v->u.road,     vehicle_road_chunk);     break;
+		case VEH_SHIP    : res = LoadChunk(ls, &v->u.ship,     vehicle_ship_chunk);     break;
+		case VEH_AIRCRAFT: res = LoadChunk(ls, &v->u.air,      vehicle_air_chunk);      break;
+		case VEH_SPECIAL : res = LoadChunk(ls, &v->u.special,  vehicle_special_chunk);  break;
+		case VEH_DISASTER: res = LoadChunk(ls, &v->u.disaster, vehicle_disaster_chunk); break;
 	}
 
 	/* This chunk size should always be 10 bytes */
@@ -1124,7 +1132,6 @@
 static uint16 _cargo_count;
 
 static const OldChunks vehicle_chunk[] = {
-	OCL_SVAR(  OC_UINT8, Vehicle, type ),
 	OCL_SVAR(  OC_UINT8, Vehicle, subtype ),
 
 	OCL_NULL( 2 ),         ///< Hash, calculated automatically
@@ -1148,8 +1155,8 @@
 	OCL_SVAR(  OC_UINT8, Vehicle, z_pos ),
 	OCL_SVAR(  OC_UINT8, Vehicle, direction ),
 	OCL_NULL( 2 ),         ///< x_offs and y_offs, calculated automatically
-	OCL_NULL( 2 ),         ///< sprite_width and sprite_height, calculated automatically
-	OCL_NULL( 1 ),         ///< z_height, calculated automatically
+	OCL_NULL( 2 ),         ///< x_extent and y_extent, calculated automatically
+	OCL_NULL( 1 ),         ///< z_extent, calculated automatically
 
 	OCL_SVAR(  OC_UINT8, Vehicle, owner ),
 	OCL_SVAR(   OC_TILE, Vehicle, tile ),
@@ -1213,7 +1220,18 @@
 	for (i = 0; i < _old_vehicle_multiplier; i++) {
 		_current_vehicle_id = num * _old_vehicle_multiplier + i;
 
-		Vehicle *v = new (_current_vehicle_id) InvalidVehicle();
+		/* Read the vehicle type and allocate the right vehicle */
+		Vehicle *v;
+		switch (ReadByte(ls)) {
+			default: NOT_REACHED();
+			case 0x00 /*VEH_INVALID */: v = new (_current_vehicle_id) InvalidVehicle();  break;
+			case 0x10 /*VEH_TRAIN   */: v = new (_current_vehicle_id) Train();           break;
+			case 0x11 /*VEH_ROAD    */: v = new (_current_vehicle_id) RoadVehicle();     break;
+			case 0x12 /*VEH_SHIP    */: v = new (_current_vehicle_id) Ship();            break;
+			case 0x13 /*VEH_AIRCRAFT*/: v = new (_current_vehicle_id) Aircraft();        break;
+			case 0x14 /*VEH_SPECIAL */: v = new (_current_vehicle_id) SpecialVehicle();  break;
+			case 0x15 /*VEH_DISASTER*/: v = new (_current_vehicle_id) DisasterVehicle(); break;
+		}
 		if (!LoadChunk(ls, v, vehicle_chunk)) return false;
 
 		/* This should be consistent, else we have a big problem... */
@@ -1223,9 +1241,14 @@
 		}
 
 		if (_old_order_ptr != 0 && _old_order_ptr != 0xFFFFFFFF) {
-			v->orders = GetOrder(REMAP_ORDER_IDX(_old_order_ptr));
+			uint old_id = REMAP_ORDER_IDX(_old_order_ptr);
+			/* There is a maximum of 5000 orders in old savegames, so *if*
+			 * we go over that limit something is very wrong. In that case
+			 * we just assume there are no orders for the vehicle.
+			 */
+			if (old_id < 5000) v->orders = GetOrder(old_id);
 		}
-		AssignOrder(&v->current_order, UnpackOldOrder(_old_order));
+		v->current_order.AssignOrder(UnpackOldOrder(_old_order));
 
 		/* For some reason we need to correct for this */
 		switch (v->spritenum) {
@@ -1669,6 +1692,12 @@
 
 	fclose(ls.file);
 
+	/* Some old TTDP savegames could have buoys at tile 0
+	 * (without assigned station struct)
+	 * MakeWater() can be used as long as sea has the same
+	 * format as old savegames (eg. everything is zeroed) */
+	MakeWater(0);
+
 	_pause_game = 2;
 
 	return true;
--- a/src/oldpool.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/oldpool.h	Tue Apr 15 00:47:19 2008 +0000
@@ -260,32 +260,7 @@
 	}
 
 private:
-	/**
-	 * Allocate a pool item; possibly allocate a new block in the pool.
-	 * @param first the first pool item to start searching
-	 * @pre first <= Tpool->GetSize()
-	 * @return the allocated pool item (or NULL when the pool is full).
-	 */
-	static inline T *AllocateSafeRaw(uint &first)
-	{
-		uint last_minus_one = Tpool->GetSize() - 1;
-
-		for (T *t = Tpool->Get(first); t != NULL; t = (t->index < last_minus_one) ? Tpool->Get(t->index + 1U) : NULL) {
-			if (!t->IsValid()) {
-				first = t->index;
-				Tid index = t->index;
-
-				memset(t, 0, Tpool->item_size);
-				t->index = index;
-				return t;
-			}
-		}
-
-		/* Check if we can add a block to the pool */
-		if (Tpool->AddBlockToPool()) return AllocateRaw(first);
-
-		return NULL;
-	}
+	static T *AllocateSafeRaw(uint &first);
 
 protected:
 	/**
@@ -346,7 +321,8 @@
 #define DEFINE_OLD_POOL_GENERIC(name, type) \
 	OldMemoryPool<type> _##name##_pool( \
 		#name, name##_POOL_MAX_BLOCKS, name##_POOL_BLOCK_SIZE_BITS, sizeof(type), \
-		PoolNewBlock<type, &_##name##_pool>, PoolCleanBlock<type, &_##name##_pool>);
+		PoolNewBlock<type, &_##name##_pool>, PoolCleanBlock<type, &_##name##_pool>); \
+		template type *PoolItem<type, type##ID, &_##name##_pool>::AllocateSafeRaw(uint &first);
 
 
 #define STATIC_OLD_POOL(name, type, block_size_bits, max_blocks, new_block_proc, clean_block_proc) \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/oldpool_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,34 @@
+/* $Id$ */
+
+#ifndef OLDPOOL_FUNC_H
+
+#include "oldpool.h"
+
+/**
+ * Allocate a pool item; possibly allocate a new block in the pool.
+ * @param first the first pool item to start searching
+ * @pre first <= Tpool->GetSize()
+ * @return the allocated pool item (or NULL when the pool is full).
+ */
+template<typename T, typename Tid, OldMemoryPool<T> *Tpool> T *PoolItem<T, Tid, Tpool>::AllocateSafeRaw(uint &first)
+{
+	uint last_minus_one = Tpool->GetSize() - 1;
+
+	for (T *t = Tpool->Get(first); t != NULL; t = (t->index < last_minus_one) ? Tpool->Get(t->index + 1U) : NULL) {
+		if (!t->IsValid()) {
+			first = t->index;
+			Tid index = t->index;
+
+			memset(t, 0, Tpool->item_size);
+			t->index = index;
+			return t;
+		}
+	}
+
+	/* Check if we can add a block to the pool */
+	if (Tpool->AddBlockToPool()) return AllocateRaw(first);
+
+	return NULL;
+}
+
+#endif /* OLDPOOL_FUNC_H */
--- a/src/openttd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/openttd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -3,33 +3,40 @@
 /** @file openttd.cpp */
 
 #include "stdafx.h"
+
 #define VARDEF
-#include "debug.h"
-#include "driver.h"
-#include "saveload.h"
+#include "variables.h"
+#include "network/network_internal.h"
+#undef VARDEF
 
 #include "openttd.h"
-#include "bridge_map.h"
-#include "mixer.h"
-#include "spritecache.h"
+
+#include "driver.h"
+#include "blitter/factory.hpp"
+#include "sound/sound_driver.hpp"
+#include "music/music_driver.hpp"
+#include "video/video_driver.hpp"
+
+#include "fontcache.h"
 #include "gfxinit.h"
+#include "gfx_func.h"
 #include "gui.h"
-#include "landscape.h"
-#include "station.h"
-#include "station_map.h"
-#include "town_map.h"
-#include "tunnel_map.h"
+#include "mixer.h"
+#include "sound_func.h"
 #include "viewport_func.h"
-#include "gfx_func.h"
 #include "window_func.h"
 #include "window_gui.h"
+#include "zoom_func.h"
+
+#include "debug.h"
+#include "saveload.h"
+#include "landscape.h"
 #include "player_func.h"
 #include "player_base.h"
 #include "command_func.h"
 #include "town.h"
 #include "industry.h"
-#include "news.h"
-#include "engine.h"
+#include "news_func.h"
 #include "fileio.h"
 #include "fios.h"
 #include "airport.h"
@@ -37,8 +44,8 @@
 #include "console.h"
 #include "screenshot.h"
 #include "network/network.h"
-#include "network/network_internal.h"
-#include "signs.h"
+#include "signs_base.h"
+#include "signs_func.h"
 #include "depot.h"
 #include "waypoint.h"
 #include "ai/ai.h"
@@ -46,36 +53,30 @@
 #include "yapf/yapf.h"
 #include "settings_func.h"
 #include "genworld.h"
-#include "clear_map.h"
-#include "fontcache.h"
+#include "player_face.h"
+#include "group.h"
+#include "newgrf_fsmports.h"
+#include "strings_func.h"
+#include "date_func.h"
+#include "vehicle_func.h"
+
 #include "newgrf.h"
 #include "newgrf_config.h"
 #include "newgrf_house.h"
 #include "newgrf_commons.h"
-#include "newgrf_storage.h"
-#include "player_face.h"
-#include "group.h"
-#include "blitter/factory.hpp"
-#include "sound/sound_driver.hpp"
-#include "music/music_driver.hpp"
-#include "video/video_driver.hpp"
-#include "newgrf_fsmports.h"
-#include "strings_func.h"
-#include "zoom_func.h"
-#include "date_func.h"
-#include "vehicle_func.h"
-#include "sound_func.h"
-#include "variables.h"
-#include "road_func.h"
+#include "newgrf_station.h"
 
-#include "bridge_map.h"
 #include "clear_map.h"
+#include "tree_map.h"
 #include "rail_map.h"
 #include "road_map.h"
-#include "water_map.h"
+#include "station_map.h"
+#include "town_map.h"
 #include "industry_map.h"
 #include "unmovable_map.h"
-#include "tree_map.h"
+#include "tunnel_map.h"
+#include "bridge_map.h"
+#include "water_map.h"
 #include "tunnelbridge_map.h"
 #include "void_map.h"
 #include "water.h"
@@ -93,7 +94,7 @@
 extern void SetDifficultyLevel(int mode, GameOptions *gm_opt);
 extern Player* DoStartupNewPlayer(bool is_ai);
 extern void ShowOSErrorBox(const char *buf);
-extern void SetDefaultRailGui();
+extern void InitializeRailGUI();
 
 /* TODO: usrerror() for errors which are not of an internal nature but
  * caused by the user, i.e. missing files or fatal configuration errors.
@@ -696,7 +697,7 @@
 	DoCommandP(0, (_patches.autorenew << 15 ) | (_patches.autorenew_months << 16) | 4, _patches.autorenew_money, NULL, CMD_SET_AUTOREPLACE);
 
 	SettingsDisableElrail(_patches.disable_elrails);
-	SetDefaultRailGui();
+	InitializeRailGUI();
 
 #ifdef ENABLE_NETWORK
 	/* We are the server, we start a new player (not dedicated),
@@ -1371,9 +1372,9 @@
 	if (CheckSavegameVersionOldStyle(6, 1)) UpdateSignOwner();
 
 	/* In old version there seems to be a problem that water is owned by
-	    OWNER_NONE, not OWNER_WATER.. I can't replicate it for the current
-	    (4.3) version, so I just check when versions are older, and then
-	    walk through the whole map.. */
+	 * OWNER_NONE, not OWNER_WATER.. I can't replicate it for the current
+	 * (4.3) version, so I just check when versions are older, and then
+	 * walk through the whole map.. */
 	if (CheckSavegameVersionOldStyle(4, 3)) {
 		for (TileIndex t = 0; t < map_size; t++) {
 			if (IsTileType(t, MP_WATER) && GetTileOwner(t) >= MAX_PLAYERS) {
@@ -2011,7 +2012,12 @@
 
 		for (TileIndex t = 0; t < map_size; t++) {
 			if (IsTileType(t, MP_CLEAR) && IsClearGround(t, CLEAR_FIELDS)) {
+				/* remove fields */
 				MakeClear(t, CLEAR_GRASS, 3);
+			} else if (IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES)) {
+				/* remove fences around fields */
+				SetFenceSE(t, 0);
+				SetFenceSW(t, 0);
 			}
 		}
 
@@ -2030,13 +2036,11 @@
 		Vehicle *v;
 
 		FOR_ALL_ORDERS(order) {
-			order->refit_cargo   = CT_NO_REFIT;
-			order->refit_subtype = CT_NO_REFIT;
+			order->SetRefit(CT_NO_REFIT);
 		}
 
 		FOR_ALL_VEHICLES(v) {
-			v->current_order.refit_cargo   = CT_NO_REFIT;
-			v->current_order.refit_subtype = CT_NO_REFIT;
+			v->current_order.SetRefit(CT_NO_REFIT);
 		}
 	}
 
@@ -2045,7 +2049,7 @@
 	if (CheckSavegameVersion(38)) _patches.disable_elrails = false;
 	/* do the same as when elrails were enabled/disabled manually just now */
 	SettingsDisableElrail(_patches.disable_elrails);
-	SetDefaultRailGui();
+	InitializeRailGUI();
 
 	/* From version 53, the map array was changed for house tiles to allow
 	 * space for newhouses grf features. A new byte, m7, was also added. */
@@ -2083,8 +2087,8 @@
 		}
 	}
 
-	/* Check that house ids are still valid. */
-	CheckHouseIDs();
+	/* Check and update house and town values */
+	UpdateHousesAndTowns();
 
 	if (CheckSavegameVersion(43)) {
 		for (TileIndex t = 0; t < map_size; t++) {
@@ -2221,7 +2225,7 @@
 		FOR_ALL_VEHICLES(v) {
 			if ((v->type != VEH_TRAIN || IsFrontEngine(v)) &&  // for all locs
 					!(v->vehstatus & (VS_STOPPED | VS_CRASHED)) && // not stopped or crashed
-					v->current_order.type == OT_LOADING) {         // loading
+					v->current_order.IsType(OT_LOADING)) {         // loading
 				GetStation(v->last_station_visited)->loading_vehicles.push_back(v);
 
 				/* The loading finished flag is *only* set when actually completely
@@ -2238,7 +2242,7 @@
 			for (iter = st->loading_vehicles.begin(); iter != st->loading_vehicles.end();) {
 				Vehicle *v = *iter;
 				iter++;
-				if (v->current_order.type != OT_LOADING) st->loading_vehicles.remove(v);
+				if (!v->current_order.IsType(OT_LOADING)) st->loading_vehicles.remove(v);
 			}
 		}
 	}
@@ -2350,8 +2354,9 @@
 		/* Update go to buoy orders because they are just waypoints */
 		Order *order;
 		FOR_ALL_ORDERS(order) {
-			if (order->type == OT_GOTO_STATION && GetStation(order->dest)->IsBuoy()) {
-				order->flags = 0;
+			if (order->IsType(OT_GOTO_STATION) && GetStation(order->GetDestination())->IsBuoy()) {
+				order->SetLoadType(OLF_LOAD_IF_POSSIBLE);
+				order->SetUnloadType(OUF_UNLOAD_IF_POSSIBLE);
 			}
 		}
 
@@ -2510,8 +2515,8 @@
 	/* update station and waypoint graphics */
 	AfterLoadWaypoints();
 	AfterLoadStations();
-	/* check that house ids are still valid */
-	CheckHouseIDs();
+	/* Check and update house and town values */
+	UpdateHousesAndTowns();
 	/* redraw the whole screen */
 	MarkWholeScreenDirty();
 }
--- a/src/openttd.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/openttd.h	Tue Apr 15 00:47:19 2008 +0000
@@ -9,39 +9,9 @@
 #endif
 
 // Forward declarations of structs.
-struct Depot;
-struct Waypoint;
-struct Station;
-struct ViewPort;
-struct NewsItem;
-struct DrawPixelInfo;
-struct Group;
-typedef byte VehicleOrderID;  ///< The index of an order within its current vehicle (not pool related)
 typedef byte LandscapeID;
-typedef uint16 EngineID;
 typedef uint16 UnitID;
 
-typedef EngineID *EngineList; ///< engine list type placeholder acceptable for C code (see helpers.cpp)
-
-/* IDs used in Pools */
-typedef uint16 StationID;
-static const StationID INVALID_STATION = 0xFFFF;
-typedef uint16 RoadStopID;
-typedef uint16 DepotID;
-typedef uint16 WaypointID;
-typedef uint16 OrderID;
-typedef uint16 SignID;
-typedef uint16 GroupID;
-typedef uint16 EngineRenewID;
-typedef uint16 DestinationID;
-
-/* DestinationID must be at least as large as every these below, because it can
- * be any of them
- */
-assert_compile(sizeof(DestinationID) >= sizeof(DepotID));
-assert_compile(sizeof(DestinationID) >= sizeof(WaypointID));
-assert_compile(sizeof(DestinationID) >= sizeof(StationID));
-
 enum GameModes {
 	GM_MENU,
 	GM_NORMAL,
--- a/src/order.h	Mon Apr 14 20:32:36 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,235 +0,0 @@
-/* $Id$ */
-
-/** @file order.h */
-
-#ifndef ORDER_H
-#define ORDER_H
-
-#include "oldpool.h"
-#include "core/bitmath_func.hpp"
-#include "cargo_type.h"
-#include "vehicle_type.h"
-#include "tile_type.h"
-#include "date_type.h"
-
-enum {
-	INVALID_VEH_ORDER_ID = 0xFF,
-};
-
-static const OrderID INVALID_ORDER = 0xFFFF;
-
-/* Order types */
-enum OrderType {
-	OT_BEGIN         = 0,
-	OT_NOTHING       = 0,
-	OT_GOTO_STATION  = 1,
-	OT_GOTO_DEPOT    = 2,
-	OT_LOADING       = 3,
-	OT_LEAVESTATION  = 4,
-	OT_DUMMY         = 5,
-	OT_GOTO_WAYPOINT = 6,
-	OT_END
-};
-
-/* It needs to be 8bits, because we save and load it as such */
-/** Define basic enum properties */
-template <> struct EnumPropsT<OrderType> : MakeEnumPropsT<OrderType, byte, OT_BEGIN, OT_END, OT_END> {};
-typedef TinyEnumT<OrderType> OrderTypeByte;
-
-
-/* Order flags -- please use OF instead OF and use HASBIT/SETBIT/CLEARBIT */
-
-/** Order flag masks - these are for direct bit operations */
-enum OrderFlagMasks {
-	//Flags for stations:
-	/** vehicle will transfer cargo (i. e. not deliver to nearby industry/town even if accepted there) */
-	OFB_TRANSFER           = 0x1,
-	/** If OFB_TRANSFER is not set, drop any cargo loaded. If accepted, deliver, otherwise cargo remains at the station.
-      * No new cargo is loaded onto the vehicle whatsoever */
-	OFB_UNLOAD             = 0x2,
-	/** Wait for full load of all vehicles, or of at least one cargo type, depending on patch setting
-	  * @todo make this two different flags */
-	OFB_FULL_LOAD          = 0x4,
-
-	//Flags for depots:
-	/** The current depot-order was initiated because it was in the vehicle's order list */
-	OFB_PART_OF_ORDERS     = 0x2,
-	/** if OFB_PART_OF_ORDERS is not set, this will cause the vehicle to be stopped in the depot */
-	OFB_HALT_IN_DEPOT      = 0x4,
-	/** if OFB_PART_OF_ORDERS is set, this will cause the order only be come active if the vehicle needs servicing */
-	OFB_SERVICE_IF_NEEDED  = 0x4, //used when OFB_PART_OF_ORDERS is set.
-
-	//Common flags
-	/** This causes the vehicle not to stop at intermediate OR the destination station (depending on patch settings)
-	  * @todo make this two different flags */
-	OFB_NON_STOP           = 0x8
-};
-
-/** Order flags bits - these are for the *BIT macros
- * for descrption of flags, see OrderFlagMasks
- * @see OrderFlagMasks
- */
-enum {
-	OF_TRANSFER          = 0,
-	OF_UNLOAD            = 1,
-	OF_FULL_LOAD         = 2,
-	OF_PART_OF_ORDERS    = 1,
-	OF_HALT_IN_DEPOT     = 2,
-	OF_SERVICE_IF_NEEDED = 2,
-	OF_NON_STOP          = 3
-};
-
-
-/* Possible clone options */
-enum {
-	CO_SHARE   = 0,
-	CO_COPY    = 1,
-	CO_UNSHARE = 2
-};
-
-struct Order;
-DECLARE_OLD_POOL(Order, Order, 6, 1000)
-
-/* If you change this, keep in mind that it is saved on 3 places:
- * - Load_ORDR, all the global orders
- * - Vehicle -> current_order
- * - REF_ORDER (all REFs are currently limited to 16 bits!!)
- */
-struct Order : PoolItem<Order, OrderID, &_Order_pool> {
-	Order *next;          ///< Pointer to next order. If NULL, end of list
-
-	OrderTypeByte type;
-	uint8  flags;
-	DestinationID dest;   ///< The destionation of the order.
-
-	CargoID refit_cargo; // Refit CargoID
-	byte refit_subtype; // Refit subtype
-
-	uint16 wait_time;    ///< How long in ticks to wait at the destination.
-	uint16 travel_time;  ///< How long in ticks the journey to this destination should take.
-
-	Order() : refit_cargo(CT_NO_REFIT) {}
-	~Order() { this->type = OT_NOTHING; }
-
-	/**
-	 * Check if a Order really exists.
-	 */
-	inline bool IsValid() const { return this->type != OT_NOTHING; }
-
-	void Free();
-	void FreeChain();
-};
-
-struct BackuppedOrders {
-	BackuppedOrders() : order(NULL), name(NULL) { }
-	~BackuppedOrders() { free(order); free(name); }
-
-	VehicleID clone;
-	VehicleOrderID orderindex;
-	GroupID group;
-	Order *order;
-	uint16 service_interval;
-	char *name;
-};
-
-extern TileIndex _backup_orders_tile;
-extern BackuppedOrders _backup_orders_data;
-
-static inline VehicleOrderID GetMaxOrderIndex()
-{
-	/* TODO - This isn't the real content of the function, but
-	 *  with the new pool-system this will be replaced with one that
-	 *  _really_ returns the highest index. Now it just returns
-	 *  the next safe value we are sure about everything is below.
-	 */
-	return GetOrderPoolSize() - 1;
-}
-
-static inline VehicleOrderID GetNumOrders()
-{
-	return GetOrderPoolSize();
-}
-
-inline void Order::Free()
-{
-	this->type  = OT_NOTHING;
-	this->flags = 0;
-	this->dest  = 0;
-	this->next  = NULL;
-}
-
-inline void Order::FreeChain()
-{
-	if (next != NULL) next->FreeChain();
-	delete this;
-}
-
-#define FOR_ALL_ORDERS_FROM(order, start) for (order = GetOrder(start); order != NULL; order = (order->index + 1U < GetOrderPoolSize()) ? GetOrder(order->index + 1U) : NULL) if (order->IsValid())
-#define FOR_ALL_ORDERS(order) FOR_ALL_ORDERS_FROM(order, 0)
-
-
-#define FOR_VEHICLE_ORDERS(v, order) for (order = v->orders; order != NULL; order = order->next)
-
-static inline bool HasOrderPoolFree(uint amount)
-{
-	const Order *order;
-
-	/* There is always room if not all blocks in the pool are reserved */
-	if (_Order_pool.CanAllocateMoreBlocks()) return true;
-
-	FOR_ALL_ORDERS(order) if (!order->IsValid() && --amount == 0) return true;
-
-	return false;
-}
-
-
-/* Pack and unpack routines */
-
-static inline uint32 PackOrder(const Order *order)
-{
-	return order->dest << 16 | order->flags << 8 | order->type;
-}
-
-static inline Order UnpackOrder(uint32 packed)
-{
-	Order order;
-	order.type    = (OrderType)GB(packed,  0,  8);
-	order.flags   = GB(packed,  8,  8);
-	order.dest    = GB(packed, 16, 16);
-	order.next    = NULL;
-	order.index   = 0; // avoid compiler warning
-	order.refit_cargo   = CT_NO_REFIT;
-	order.refit_subtype = 0;
-	order.wait_time     = 0;
-	order.travel_time   = 0;
-	return order;
-}
-
-/* Functions */
-void BackupVehicleOrders(const Vehicle *v, BackuppedOrders *order = &_backup_orders_data);
-void RestoreVehicleOrders(const Vehicle *v, const BackuppedOrders *order = &_backup_orders_data);
-void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination);
-void InvalidateVehicleOrder(const Vehicle *v);
-bool VehicleHasDepotOrders(const Vehicle *v);
-void CheckOrders(const Vehicle*);
-void DeleteVehicleOrders(Vehicle *v);
-void AssignOrder(Order *order, Order data);
-bool CheckForValidOrders(const Vehicle* v);
-
-Order UnpackOldOrder(uint16 packed);
-
-#define MIN_SERVINT_PERCENT  5
-#define MAX_SERVINT_PERCENT 90
-#define MIN_SERVINT_DAYS    30
-#define MAX_SERVINT_DAYS   800
-
-/**
- * Get the service interval domain.
- * Get the new proposed service interval for the vehicle is indeed, clamped
- * within the given bounds. @see MIN_SERVINT_PERCENT ,etc.
- * @param index proposed service interval
- * @return service interval
- */
-Date GetServiceIntervalClamped(uint index);
-
-#endif /* ORDER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/order_base.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,233 @@
+/* $Id$ */
+
+/** @file order_base.h */
+
+#ifndef ORDER_BASE_H
+#define ORDER_BASE_H
+
+#include "order_type.h"
+#include "oldpool.h"
+#include "core/bitmath_func.hpp"
+#include "cargo_type.h"
+#include "depot_type.h"
+#include "station_type.h"
+#include "vehicle_type.h"
+#include "waypoint_type.h"
+
+DECLARE_OLD_POOL(Order, Order, 6, 1000)
+
+/* If you change this, keep in mind that it is saved on 3 places:
+ * - Load_ORDR, all the global orders
+ * - Vehicle -> current_order
+ * - REF_ORDER (all REFs are currently limited to 16 bits!!)
+ */
+struct Order : PoolItem<Order, OrderID, &_Order_pool> {
+private:
+	friend const struct SaveLoad *GetVehicleDescription(VehicleType vt); ///< Saving and loading the current order of vehicles.
+	friend void Load_VEHS();                                             ///< Loading of ancient vehicles.
+	friend const struct SaveLoad *GetOrderDescription();                 ///< Saving and loading of orders.
+
+	OrderTypeByte type;   ///< The type of order
+	uint8 flags;          ///< 'Sub'type of order
+	DestinationID dest;   ///< The destination of the order.
+
+	CargoID refit_cargo;  ///< Refit CargoID
+	byte refit_subtype;   ///< Refit subtype
+
+public:
+	Order *next;          ///< Pointer to next order. If NULL, end of list
+
+	uint16 wait_time;    ///< How long in ticks to wait at the destination.
+	uint16 travel_time;  ///< How long in ticks the journey to this destination should take.
+
+	Order() : refit_cargo(CT_NO_REFIT) {}
+	~Order() { this->type = OT_NOTHING; }
+
+	/**
+	 * Create an order based on a packed representation of that order.
+	 * @param packed the packed representation.
+	 */
+	Order(uint32 packed);
+
+	/**
+	 * Check if a Order really exists.
+	 * @return true if the order is valid.
+	 */
+	inline bool IsValid() const { return this->type != OT_NOTHING; }
+
+	/**
+	 * Check whether this order is of the given type.
+	 * @param type the type to check against.
+	 * @return true if the order matches.
+	 */
+	inline bool IsType(OrderType type) const { return this->type == type; }
+
+	/**
+	 * Get the type of order of this order.
+	 * @return the order type.
+	 */
+	inline OrderType GetType() const { return this->type; }
+
+	/**
+	 * 'Free' the order
+	 * @note ONLY use on "current_order" vehicle orders!
+	 */
+	void Free();
+
+	/**
+	 * Makes this order a Go To Station order.
+	 * @param destsination the station to go to.
+	 */
+	void MakeGoToStation(StationID destination);
+
+	/**
+	 * Makes this order a Go To Depot order.
+	 * @param destination the depot to go to.
+	 * @param order       is this order a 'default' order, or an overriden vehicle order?
+	 * @param cargo       the cargo type to change to.
+	 * @param subtype     the subtype to change to.
+	 */
+	void MakeGoToDepot(DepotID destination, OrderDepotTypeFlags order, CargoID cargo = CT_NO_REFIT, byte subtype = 0);
+
+	/**
+	 * Makes this order a Go To Waypoint order.
+	 * @param destination the waypoint to go to.
+	 */
+	void MakeGoToWaypoint(WaypointID destination);
+
+	/**
+	 * Makes this order a Loading order.
+	 * @param ordered is this an ordered stop?
+	 */
+	void MakeLoading(bool ordered);
+
+	/**
+	 * Makes this order a Leave Station order.
+	 */
+	void MakeLeaveStation();
+
+	/**
+	 * Makes this order a Dummy order.
+	 */
+	void MakeDummy();
+
+	/**
+	 * Free a complete order chain.
+	 * @note do not use on "current_order" vehicle orders!
+	 */
+	void FreeChain();
+
+	/**
+	 * Gets the destination of this order.
+	 * @pre IsType(OT_GOTO_WAYPOINT) || IsType(OT_GOTO_DEPOT) || IsType(OT_GOTO_STATION).
+	 * @return the destination of the order.
+	 */
+	inline DestinationID GetDestination() const { return this->dest; }
+
+	/**
+	 * Sets the destination of this order.
+	 * @param destination the new destination of the order.
+	 * @pre IsType(OT_GOTO_WAYPOINT) || IsType(OT_GOTO_DEPOT) || IsType(OT_GOTO_STATION).
+	 */
+	inline void SetDestination(DestinationID destination) { this->dest = destination; }
+
+	/**
+	 * Is this order a refit order.
+	 * @pre IsType(OT_GOTO_DEPOT)
+	 * @return true if a refit should happen.
+	 */
+	inline bool IsRefit() const { return this->refit_cargo < NUM_CARGO; }
+
+	/**
+	 * Get the cargo to to refit to.
+	 * @pre IsType(OT_GOTO_DEPOT)
+	 * @return the cargo type.
+	 */
+	inline CargoID GetRefitCargo() const { return this->refit_cargo; }
+
+	/**
+	 * Get the cargo subtype to to refit to.
+	 * @pre IsType(OT_GOTO_DEPOT)
+	 * @return the cargo subtype.
+	 */
+	inline byte GetRefitSubtype() const { return this->refit_subtype; }
+
+	/**
+	 * Make this depot order also a refit order.
+	 * @param cargo   the cargo type to change to.
+	 * @param subtype the subtype to change to.
+	 * @pre IsType(OT_GOTO_DEPOT).
+	 */
+	void SetRefit(CargoID cargo, byte subtype = 0);
+
+	/** How must the consist be loaded? */
+	OrderLoadFlags GetLoadType() const;
+	/** How must the consist be unloaded? */
+	inline OrderUnloadFlags GetUnloadType() const { return (OrderUnloadFlags)GB(this->flags, 0, 2); }
+	/** Where must we stop? */
+	OrderNonStopFlags GetNonStopType() const;
+	/** What caused us going to the depot? */
+	inline OrderDepotTypeFlags GetDepotOrderType() const { return (OrderDepotTypeFlags)this->flags; }
+	/** What are we going to do when in the depot. */
+	inline OrderDepotActionFlags GetDepotActionType() const { return (OrderDepotActionFlags)(this->flags & ODATFB_HALT); }
+
+	/** Set how the consist must be loaded. */
+	inline void SetLoadType(OrderLoadFlags load_type) { SB(this->flags, 2, 1, !!load_type); }
+	/** Set how the consist must be unloaded. */
+	inline void SetUnloadType(OrderUnloadFlags unload_type) { SB(this->flags, 0, 2, unload_type); }
+	/** Set whether we must stop at stations or not. */
+	inline void SetNonStopType(OrderNonStopFlags non_stop_type) { SB(this->flags, 3, 1, !!non_stop_type); }
+	/** Set the cause to go to the depot. */
+	inline void SetDepotOrderType(OrderDepotTypeFlags depot_order_type) { this->flags = depot_order_type == ODTFB_SERVICE ? ODTF_MANUAL : depot_order_type; }
+	/** Set what we are going to do in the depot. */
+	inline void SetDepotActionType(OrderDepotActionFlags depot_service_type) { this->flags = depot_service_type; }
+
+	bool ShouldStopAtStation(const Vehicle *v, StationID station) const;
+
+	/**
+	 * Assign the given order to this one.
+	 * @param other the data to copy (except next pointer).
+	 */
+	void AssignOrder(const Order &other);
+
+	/**
+	 * Does this order have the same type, flags and destination?
+	 * @param other the second order to compare to.
+	 * @return true if the type, flags and destination match.
+	 */
+	bool Equals(const Order &other) const;
+
+	/**
+	 * Pack this order into a 32 bits integer, or actually only
+	 * the type, flags and destination.
+	 * @return the packed representation.
+	 * @note unpacking is done in the constructor.
+	 */
+	uint32 Pack() const;
+};
+
+static inline VehicleOrderID GetMaxOrderIndex()
+{
+	/* TODO - This isn't the real content of the function, but
+	 *  with the new pool-system this will be replaced with one that
+	 *  _really_ returns the highest index. Now it just returns
+	 *  the next safe value we are sure about everything is below.
+	 */
+	return GetOrderPoolSize() - 1;
+}
+
+static inline VehicleOrderID GetNumOrders()
+{
+	return GetOrderPoolSize();
+}
+
+#define FOR_ALL_ORDERS_FROM(order, start) for (order = GetOrder(start); order != NULL; order = (order->index + 1U < GetOrderPoolSize()) ? GetOrder(order->index + 1U) : NULL) if (order->IsValid())
+#define FOR_ALL_ORDERS(order) FOR_ALL_ORDERS_FROM(order, 0)
+
+
+#define FOR_VEHICLE_ORDERS(v, order) for (order = v->orders; order != NULL; order = order->next)
+
+/* (Un)pack routines */
+Order UnpackOldOrder(uint16 packed);
+
+#endif /* ORDER_H */
--- a/src/order_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/order_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -4,14 +4,14 @@
 
 #include "stdafx.h"
 #include "openttd.h"
-#include "order.h"
+#include "order_base.h"
+#include "order_func.h"
 #include "airport.h"
 #include "depot.h"
 #include "waypoint.h"
 #include "command_func.h"
-#include "station.h"
 #include "player_func.h"
-#include "news.h"
+#include "news_func.h"
 #include "saveload.h"
 #include "vehicle_gui.h"
 #include "cargotype.h"
@@ -22,41 +22,139 @@
 #include "window_func.h"
 #include "settings_type.h"
 #include "string_func.h"
+#include "newgrf_cargo.h"
+#include "timetable.h"
+#include "vehicle_func.h"
+#include "oldpool_func.h"
 
 #include "table/strings.h"
 
+/* DestinationID must be at least as large as every these below, because it can
+ * be any of them
+ */
+assert_compile(sizeof(DestinationID) >= sizeof(DepotID));
+assert_compile(sizeof(DestinationID) >= sizeof(WaypointID));
+assert_compile(sizeof(DestinationID) >= sizeof(StationID));
+
 TileIndex _backup_orders_tile;
 BackuppedOrders _backup_orders_data;
 
-DEFINE_OLD_POOL_GENERIC(Order, Order)
+DEFINE_OLD_POOL_GENERIC(Order, Order);
 
-/**
- *
- * Unpacks a order from savegames made with TTD(Patch)
- *
- */
-Order UnpackOldOrder(uint16 packed)
+OrderLoadFlags Order::GetLoadType() const
 {
-	Order order;
-	order.type    = (OrderType)GB(packed, 0, 4);
-	order.flags   = GB(packed, 4, 4);
-	order.dest    = GB(packed, 8, 8);
-	order.next    = NULL;
+	if ((this->flags & OLFB_FULL_LOAD) == 0) return OLF_LOAD_IF_POSSIBLE;
+	return _patches.full_load_any ? OLF_FULL_LOAD_ANY : OLFB_FULL_LOAD;
+}
 
-	order.refit_cargo   = CT_NO_REFIT;
-	order.refit_subtype = 0;
-	order.wait_time     = 0;
-	order.travel_time   = 0;
-	order.index = 0; // avoid compiler warning
-
-	// Sanity check
-	// TTD stores invalid orders as OT_NOTHING with non-zero flags/station
-	if (!order.IsValid() && (order.flags != 0 || order.dest != 0)) {
-		order.type = OT_DUMMY;
-		order.flags = 0;
+OrderNonStopFlags Order::GetNonStopType() const
+{
+	if (_patches.new_nonstop) {
+		return (this->flags & 0x08) ? ONSF_NO_STOP_AT_ANY_STATION : ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS;
 	}
 
-	return order;
+	return (this->flags & 0x08) ? ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS : ONSF_STOP_EVERYWHERE;
+}
+
+void Order::Free()
+{
+	this->type  = OT_NOTHING;
+	this->flags = 0;
+	this->dest  = 0;
+	this->next  = NULL;
+}
+
+void Order::MakeGoToStation(StationID destination)
+{
+	this->type = OT_GOTO_STATION;
+	this->flags = 0;
+	this->dest = destination;
+}
+
+void Order::MakeGoToDepot(DepotID destination, OrderDepotTypeFlags order, CargoID cargo, byte subtype)
+{
+	this->type = OT_GOTO_DEPOT;
+	this->flags = 0;
+	this->SetDepotOrderType(order);
+	if (!(order & ODTFB_PART_OF_ORDERS)) {
+		this->SetNonStopType(ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS);
+	}
+	this->dest = destination;
+	this->SetRefit(cargo, subtype);
+}
+
+void Order::MakeGoToWaypoint(WaypointID destination)
+{
+	this->type = OT_GOTO_WAYPOINT;
+	this->flags = 0;
+	this->dest = destination;
+}
+
+void Order::MakeLoading(bool ordered)
+{
+	this->type = OT_LOADING;
+	if (!ordered) this->flags = 0;
+}
+
+void Order::MakeLeaveStation()
+{
+	this->type = OT_LEAVESTATION;
+	this->flags = 0;
+}
+
+void Order::MakeDummy()
+{
+	this->type = OT_DUMMY;
+	this->flags = 0;
+}
+
+void Order::SetRefit(CargoID cargo, byte subtype)
+{
+	this->refit_cargo = cargo;
+	this->refit_subtype = subtype;
+}
+
+void Order::FreeChain()
+{
+	if (next != NULL) next->FreeChain();
+	delete this;
+}
+
+bool Order::Equals(const Order &other) const
+{
+	return
+			this->type  == other.type &&
+			this->flags == other.flags &&
+			this->dest  == other.dest;
+}
+
+static bool HasOrderPoolFree(uint amount)
+{
+	const Order *order;
+
+	/* There is always room if not all blocks in the pool are reserved */
+	if (_Order_pool.CanAllocateMoreBlocks()) return true;
+
+	FOR_ALL_ORDERS(order) if (!order->IsValid() && --amount == 0) return true;
+
+	return false;
+}
+
+uint32 Order::Pack() const
+{
+	return this->dest << 16 | this->flags << 8 | this->type;
+}
+
+Order::Order(uint32 packed)
+{
+	this->type    = (OrderType)GB(packed,  0,  8);
+	this->flags   = GB(packed,  8,  8);
+	this->dest    = GB(packed, 16, 16);
+	this->next    = NULL;
+	this->refit_cargo   = CT_NO_REFIT;
+	this->refit_subtype = 0;
+	this->wait_time     = 0;
+	this->travel_time   = 0;
 }
 
 /**
@@ -66,16 +164,26 @@
  */
 static Order UnpackVersion4Order(uint16 packed)
 {
-	Order order;
-	order.type  = (OrderType)GB(packed, 0, 4);
-	order.flags = GB(packed, 4, 4);
-	order.dest  = GB(packed, 8, 8);
-	order.next  = NULL;
-	order.index = 0; // avoid compiler warning
-	order.refit_cargo   = CT_NO_REFIT;
-	order.refit_subtype = 0;
-	order.wait_time     = 0;
-	order.travel_time   = 0;
+	return Order(GB(packed, 8, 8) << 16 | GB(packed, 4, 4) << 8 | GB(packed, 0, 4));
+}
+
+/**
+ *
+ * Unpacks a order from savegames made with TTD(Patch)
+ *
+ */
+Order UnpackOldOrder(uint16 packed)
+{
+	Order order = UnpackVersion4Order(packed);
+
+	/*
+	 * Sanity check
+	 * TTD stores invalid orders as OT_NOTHING with non-zero flags/station
+	 */
+	if (!order.IsValid() && (order.GetLoadType() != 0 || order.GetUnloadType() != 0 || order.GetDestination() != 0)) {
+		order.MakeDummy();
+	}
+
 	return order;
 }
 
@@ -101,9 +209,9 @@
 	Order temp_order;
 
 	temp_order = *order1;
-	AssignOrder(order1, *order2);
+	order1->AssignOrder(*order2);
 	order1->next = order2->next;
-	AssignOrder(order2, temp_order);
+	order2->AssignOrder(temp_order);
 	order2->next = temp_order.next;
 }
 
@@ -113,17 +221,17 @@
  *   This function makes sure that the index is maintained correctly
  *
  */
-void AssignOrder(Order *order, Order data)
+void Order::AssignOrder(const Order &other)
 {
-	order->type  = data.type;
-	order->flags = data.flags;
-	order->dest  = data.dest;
+	this->type  = other.type;
+	this->flags = other.flags;
+	this->dest  = other.dest;
 
-	order->refit_cargo   = data.refit_cargo;
-	order->refit_subtype = data.refit_subtype;
+	this->refit_cargo   = other.refit_cargo;
+	this->refit_subtype = other.refit_subtype;
 
-	order->wait_time   = data.wait_time;
-	order->travel_time = data.travel_time;
+	this->wait_time   = other.wait_time;
+	this->travel_time = other.travel_time;
 }
 
 
@@ -144,10 +252,10 @@
 
 static TileIndex GetOrderLocation(const Order& o)
 {
-	switch (o.type) {
+	switch (o.GetType()) {
 		default: NOT_REACHED();
-		case OT_GOTO_STATION: return GetStation(o.dest)->xy;
-		case OT_GOTO_DEPOT:   return GetDepot(o.dest)->xy;
+		case OT_GOTO_STATION: return GetStation(o.GetDestination())->xy;
+		case OT_GOTO_DEPOT:   return GetDepot(o.GetDestination())->xy;
 	}
 }
 
@@ -167,7 +275,7 @@
 	Vehicle *v;
 	VehicleID veh   = GB(p1,  0, 16);
 	VehicleOrderID sel_ord = GB(p1, 16, 16);
-	Order new_order = UnpackOrder(p2);
+	Order new_order(p2);
 
 	if (!IsValidVehicleID(veh)) return CMD_ERROR;
 
@@ -177,12 +285,11 @@
 
 	/* Check if the inserted order is to the correct destination (owner, type),
 	 * and has the correct flags if any */
-	switch (new_order.type) {
+	switch (new_order.GetType()) {
 		case OT_GOTO_STATION: {
-			const Station *st;
+			if (!IsValidStationID(new_order.GetDestination())) return CMD_ERROR;
 
-			if (!IsValidStationID(new_order.dest)) return CMD_ERROR;
-			st = GetStation(new_order.dest);
+			const Station *st = GetStation(new_order.GetDestination());
 
 			if (st->owner != OWNER_NONE && !CheckOwnership(st->owner)) {
 				return CMD_ERROR;
@@ -214,38 +321,26 @@
 				default: return CMD_ERROR;
 			}
 
-			/* Order flags can be any of the following for stations:
-			 * [full-load | unload] [+ transfer] [+ non-stop]
-			 * non-stop orders (if any) are only valid for trains */
-			switch (new_order.flags) {
-				case 0:
-				case OFB_FULL_LOAD:
-				case OFB_FULL_LOAD | OFB_TRANSFER:
-				case OFB_UNLOAD:
-				case OFB_UNLOAD | OFB_TRANSFER:
-				case OFB_TRANSFER:
-					break;
+			/* Non stop not allowed for non-trains. */
+			// TODO: implement properly once savegame bump is done. if ((new_order.GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) != 0 && v->type != VEH_TRAIN) return CMD_ERROR;
 
-				case OFB_NON_STOP:
-				case OFB_NON_STOP | OFB_FULL_LOAD:
-				case OFB_NON_STOP | OFB_FULL_LOAD | OFB_TRANSFER:
-				case OFB_NON_STOP | OFB_UNLOAD:
-				case OFB_NON_STOP | OFB_UNLOAD | OFB_TRANSFER:
-				case OFB_NON_STOP | OFB_TRANSFER:
-					if (v->type != VEH_TRAIN) return CMD_ERROR;
-					break;
+			/* Full load and unload are mutual exclusive. */
+			if ((new_order.GetLoadType() & OLFB_FULL_LOAD) && (new_order.GetUnloadType() & OUFB_UNLOAD)) return CMD_ERROR;
 
+			/* Filter invalid load/unload types. */
+			switch (new_order.GetLoadType()) {
+				case OLF_LOAD_IF_POSSIBLE: case OLFB_FULL_LOAD: case OLF_FULL_LOAD_ANY: break;
 				default: return CMD_ERROR;
 			}
+			if (new_order.GetUnloadType() & ~(OUFB_UNLOAD | OUFB_TRANSFER)) return CMD_ERROR;
 			break;
 		}
 
 		case OT_GOTO_DEPOT: {
 			if (v->type == VEH_AIRCRAFT) {
-				const Station* st;
+				if (!IsValidStationID(new_order.GetDestination())) return CMD_ERROR;
 
-				if (!IsValidStationID(new_order.dest)) return CMD_ERROR;
-				st = GetStation(new_order.dest);
+				const Station *st = GetStation(new_order.GetDestination());
 
 				if (!CheckOwnership(st->owner) ||
 						!(st->facilities & FACIL_AIRPORT) ||
@@ -254,10 +349,9 @@
 					return CMD_ERROR;
 				}
 			} else {
-				const Depot* dp;
+				if (!IsValidDepotID(new_order.GetDestination())) return CMD_ERROR;
 
-				if (!IsValidDepotID(new_order.dest)) return CMD_ERROR;
-				dp = GetDepot(new_order.dest);
+				const Depot *dp = GetDepot(new_order.GetDestination());
 
 				if (!CheckOwnership(GetTileOwner(dp->xy))) return CMD_ERROR;
 
@@ -278,46 +372,26 @@
 				}
 			}
 
-			/* Order flags can be any of the following for depots:
-			 * order [+ halt] [+ non-stop]
-			 * non-stop orders (if any) are only valid for trains */
-			switch (new_order.flags) {
-				case OFB_PART_OF_ORDERS:
-				case OFB_PART_OF_ORDERS | OFB_HALT_IN_DEPOT:
-					break;
-
-				case OFB_NON_STOP | OFB_PART_OF_ORDERS:
-				case OFB_NON_STOP | OFB_PART_OF_ORDERS | OFB_HALT_IN_DEPOT:
-					if (v->type != VEH_TRAIN) return CMD_ERROR;
-					break;
-
-				default: return CMD_ERROR;
-			}
+			// TODO: implement properly once savegame bump is done. if (new_order.GetNonStopType() != ONSF_STOP_EVERYWHERE && v->type != VEH_TRAIN) return CMD_ERROR;
+			if (new_order.GetDepotOrderType() & ~ODTFB_PART_OF_ORDERS) return CMD_ERROR;
+			if (new_order.GetDepotActionType() & ~ODATFB_HALT) return CMD_ERROR;
 			break;
 		}
 
 		case OT_GOTO_WAYPOINT: {
-			const Waypoint* wp;
 
 			if (v->type != VEH_TRAIN) return CMD_ERROR;
 
-			if (!IsValidWaypointID(new_order.dest)) return CMD_ERROR;
-			wp = GetWaypoint(new_order.dest);
+			if (!IsValidWaypointID(new_order.GetDestination())) return CMD_ERROR;
+			const Waypoint *wp = GetWaypoint(new_order.GetDestination());
 
 			if (!CheckOwnership(GetTileOwner(wp->xy))) return CMD_ERROR;
 
 			/* Order flags can be any of the following for waypoints:
 			 * [non-stop]
 			 * non-stop orders (if any) are only valid for trains */
-			switch (new_order.flags) {
-				case 0: break;
+			// TODO: implement properly once savegame bump is done. if (new_order.GetNonStopType() != ONSF_STOP_EVERYWHERE && v->type != VEH_TRAIN) return CMD_ERROR;
 
-				case OFB_NON_STOP:
-					if (v->type != VEH_TRAIN) return CMD_ERROR;
-					break;
-
-				default: return CMD_ERROR;
-			}
 			break;
 		}
 
@@ -337,7 +411,7 @@
 		 * If the order is to be inserted at the beginning of the order list this
 		 * finds the last order in the list. */
 		for (const Order *o = v->orders; o != NULL; o = o->next) {
-			if (o->type == OT_GOTO_STATION || o->type == OT_GOTO_DEPOT) prev = o;
+			if (o->IsType(OT_GOTO_STATION) || o->IsType(OT_GOTO_DEPOT)) prev = o;
 			if (++n == sel_ord && prev != NULL) break;
 		}
 		if (prev != NULL) {
@@ -354,7 +428,7 @@
 	if (flags & DC_EXEC) {
 		Vehicle *u;
 		Order *new_o = new Order();
-		AssignOrder(new_o, new_order);
+		new_o->AssignOrder(new_order);
 
 		/* Create new order and link in list */
 		if (v->orders == NULL) {
@@ -511,9 +585,8 @@
 
 			/* NON-stop flag is misused to see if a train is in a station that is
 			 * on his order list or not */
-			if (sel_ord == u->cur_order_index && u->current_order.type == OT_LOADING &&
-					HasBit(u->current_order.flags, OF_NON_STOP)) {
-				u->current_order.flags = 0;
+			if (sel_ord == u->cur_order_index && u->current_order.IsType(OT_LOADING)) {
+				u->current_order.SetNonStopType(ONSF_STOP_EVERYWHERE);
 			}
 
 			/* Update any possible open window of the vehicle */
@@ -550,12 +623,7 @@
 
 		if (v->type == VEH_ROAD) ClearSlot(v);
 
-		if (v->current_order.type == OT_LOADING) {
-			v->LeaveStation();
-			/* NON-stop flag is misused to see if a train is in a station that is
-			 * on his order list or not */
-			if (HasBit(v->current_order.flags, OF_NON_STOP)) v->current_order.flags = 0;
-		}
+		if (v->current_order.IsType(OT_LOADING)) v->LeaveStation();
 
 		InvalidateVehicleOrder(v);
 	}
@@ -661,74 +729,112 @@
  * - p1 = (bit 16 - 31) - the selected order (if any). If the last order is given,
  *                        the order will be inserted before that one
  *                        only the first 8 bits used currently (bit 16 - 23) (max 255)
- * @param p2 mode to change the order to (always set)
+ * @param p2 various bitstuffed elements
+ *  - p2 = (bit 0 - 1) - what data to modify (@see ModifyOrderFlags)
+ *  - p2 = (bit 2 - 5) - the data to modify
  */
 CommandCost CmdModifyOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Vehicle *v;
-	Order *order;
 	VehicleOrderID sel_ord = GB(p1, 16, 16); // XXX - automatically truncated to 8 bits.
-	VehicleID veh   = GB(p1,  0, 16);
+	VehicleID veh          = GB(p1,  0, 16);
+	ModifyOrderFlags mof   = (ModifyOrderFlags)GB(p2,  0,  2);
+	uint8 data             = GB(p2,  2,  4);
 
 	if (!IsValidVehicleID(veh)) return CMD_ERROR;
-	if (p2 != OF_FULL_LOAD && p2 != OF_UNLOAD && p2 != OF_NON_STOP && p2 != OF_TRANSFER) return CMD_ERROR;
 
-	v = GetVehicle(veh);
-
+	Vehicle *v = GetVehicle(veh);
 	if (!CheckOwnership(v->owner)) return CMD_ERROR;
 
 	/* Is it a valid order? */
 	if (sel_ord >= v->num_orders) return CMD_ERROR;
 
-	order = GetVehicleOrder(v, sel_ord);
-	if ((order->type != OT_GOTO_STATION  || GetStation(order->dest)->IsBuoy()) &&
-			(order->type != OT_GOTO_DEPOT    || p2 == OF_UNLOAD) &&
-			(order->type != OT_GOTO_WAYPOINT || p2 != OF_NON_STOP)) {
-		return CMD_ERROR;
+	Order *order = GetVehicleOrder(v, sel_ord);
+	switch (order->GetType()) {
+		case OT_GOTO_STATION:
+			if (mof == MOF_DEPOT_ACTION || GetStation(order->GetDestination())->IsBuoy()) return CMD_ERROR;
+			break;
+
+		case OT_GOTO_DEPOT:
+			if (mof == MOF_UNLOAD || mof == MOF_LOAD) return CMD_ERROR;
+			break;
+
+		case OT_GOTO_WAYPOINT:
+			if (mof != MOF_NON_STOP) return CMD_ERROR;
+			break;
+
+		default:
+			return CMD_ERROR;
+	}
+
+	switch (mof) {
+		case MOF_NON_STOP:
+			if (data >= ONSF_END) return CMD_ERROR;
+			if (data == order->GetNonStopType()) return CMD_ERROR;
+			break;
+
+		case MOF_UNLOAD:
+			if ((data & ~(OUFB_UNLOAD | OUFB_TRANSFER)) != 0) return CMD_ERROR;
+			if (data == order->GetUnloadType()) return CMD_ERROR;
+			break;
+
+		case MOF_LOAD:
+			if ((data & ~OLFB_FULL_LOAD) != 0) return CMD_ERROR;
+			if (data == order->GetLoadType()) return CMD_ERROR;
+			break;
+
+		case MOF_DEPOT_ACTION:
+			if (data != 0) return CMD_ERROR;
+			break;
 	}
 
 	if (flags & DC_EXEC) {
-		switch (p2) {
-		case OF_FULL_LOAD:
-			ToggleBit(order->flags, OF_FULL_LOAD);
-			if (order->type != OT_GOTO_DEPOT) ClrBit(order->flags, OF_UNLOAD);
-			break;
-		case OF_UNLOAD:
-			ToggleBit(order->flags, OF_UNLOAD);
-			ClrBit(order->flags, OF_FULL_LOAD);
-			break;
-		case OF_NON_STOP:
-			ToggleBit(order->flags, OF_NON_STOP);
-			break;
-		case OF_TRANSFER:
-			ToggleBit(order->flags, OF_TRANSFER);
-			break;
-		default: NOT_REACHED();
+		switch (mof) {
+			case MOF_NON_STOP:
+				order->SetNonStopType((OrderNonStopFlags)data);
+				break;
+
+			case MOF_UNLOAD:
+				order->SetUnloadType((OrderUnloadFlags)data);
+				/* Full loading gets disabled when un loading! */
+				if ((data & OUFB_UNLOAD) != 0) {
+					order->SetLoadType((OrderLoadFlags)(order->GetLoadType() & ~(OLFB_FULL_LOAD | OLF_FULL_LOAD_ANY)));
+				}
+				break;
+
+			case MOF_LOAD:
+				order->SetLoadType((OrderLoadFlags)data);
+				/* Unloading gets disabled when full loading! */
+				if ((data & OLFB_FULL_LOAD) != 0) {
+					order->SetUnloadType((OrderUnloadFlags)(order->GetUnloadType() & ~OUFB_UNLOAD));
+				}
+				break;
+
+			case MOF_DEPOT_ACTION:
+				order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() ^ ODTFB_SERVICE));
+				break;
+
+			default: NOT_REACHED();
 		}
 
 		/* Update the windows and full load flags, also for vehicles that share the same order list */
-		{
-			Vehicle* u;
-
-			u = GetFirstVehicleFromSharedList(v);
-			DeleteOrderWarnings(u);
-			for (; u != NULL; u = u->next_shared) {
-				/* Toggle u->current_order "Full load" flag if it changed.
-				 * However, as the same flag is used for depot orders, check
-				 * whether we are not going to a depot as there are three
-				 * cases where the full load flag can be active and only
-				 * one case where the flag is used for depot orders. In the
-				 * other cases for the OrderTypeByte the flags are not used,
-				 * so do not care and those orders should not be active
-				 * when this function is called.
-				 */
-				if (sel_ord == u->cur_order_index &&
-						u->current_order.type != OT_GOTO_DEPOT &&
-						HasBit(u->current_order.flags, OF_FULL_LOAD) != HasBit(order->flags, OF_FULL_LOAD)) {
-					ToggleBit(u->current_order.flags, OF_FULL_LOAD);
-				}
-				InvalidateVehicleOrder(u);
+		Vehicle *u = GetFirstVehicleFromSharedList(v);
+		DeleteOrderWarnings(u);
+		for (; u != NULL; u = u->next_shared) {
+			/* Toggle u->current_order "Full load" flag if it changed.
+			 * However, as the same flag is used for depot orders, check
+			 * whether we are not going to a depot as there are three
+			 * cases where the full load flag can be active and only
+			 * one case where the flag is used for depot orders. In the
+			 * other cases for the OrderTypeByte the flags are not used,
+			 * so do not care and those orders should not be active
+			 * when this function is called.
+			 */
+			if (sel_ord == u->cur_order_index &&
+					(u->current_order.IsType(OT_GOTO_STATION) || u->current_order.IsType(OT_LOADING)) &&
+					u->current_order.GetLoadType() != order->GetLoadType()) {
+				u->current_order.SetLoadType(order->GetLoadType());
 			}
+			InvalidateVehicleOrder(u);
 		}
 	}
 
@@ -820,8 +926,8 @@
 				TileIndex required_dst = INVALID_TILE;
 
 				FOR_VEHICLE_ORDERS(src, order) {
-					if (order->type == OT_GOTO_STATION) {
-						const Station *st = GetStation(order->dest);
+					if (order->IsType(OT_GOTO_STATION)) {
+						const Station *st = GetStation(order->GetDestination());
 						if (IsCargoInClass(dst->cargo_type, CC_PASSENGERS)) {
 							if (st->bus_stops != NULL) required_dst = st->bus_stops->xy;
 						} else {
@@ -849,7 +955,7 @@
 				order_dst = &dst->orders;
 				FOR_VEHICLE_ORDERS(src, order) {
 					*order_dst = new Order();
-					AssignOrder(*order_dst, *order);
+					(*order_dst)->AssignOrder(*order);
 					order_dst = &(*order_dst)->next;
 				}
 
@@ -898,8 +1004,7 @@
 	if (flags & DC_EXEC) {
 		Vehicle *u;
 
-		order->refit_cargo = cargo;
-		order->refit_subtype = subtype;
+		order->SetRefit(cargo, subtype);
 
 		u = GetFirstVehicleFromSharedList(v);
 		for (; u != NULL; u = u->next_shared) {
@@ -907,9 +1012,8 @@
 			InvalidateVehicleOrder(u);
 
 			/* If the vehicle already got the current depot set as current order, then update current order as well */
-			if (u->cur_order_index == order_number && HasBit(u->current_order.flags, OF_PART_OF_ORDERS)) {
-				u->current_order.refit_cargo = cargo;
-				u->current_order.refit_subtype = subtype;
+			if (u->cur_order_index == order_number && u->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) {
+				u->current_order.SetRefit(cargo, subtype);
 			}
 		}
 	}
@@ -992,7 +1096,7 @@
 		 *  in network the commands are queued before send, the second insert always
 		 *  fails in test mode. By bypassing the test-mode, that no longer is a problem. */
 		for (uint i = 0; bak->order[i].IsValid(); i++) {
-			if (!DoCommandP(0, v->index + (i << 16), PackOrder(&bak->order[i]), NULL,
+			if (!DoCommandP(0, v->index + (i << 16), bak->order[i].Pack(), NULL,
 					CMD_INSERT_ORDER | CMD_NO_TEST_IF_IN_NETWORK)) {
 				break;
 			}
@@ -1098,13 +1202,13 @@
 
 		FOR_VEHICLE_ORDERS(v, order) {
 			/* Dummy order? */
-			if (order->type == OT_DUMMY) {
+			if (order->IsType(OT_DUMMY)) {
 				problem_type = 1;
 				break;
 			}
 			/* Does station have a load-bay for this vehicle? */
-			if (order->type == OT_GOTO_STATION) {
-				const Station* st = GetStation(order->dest);
+			if (order->IsType(OT_GOTO_STATION)) {
+				const Station* st = GetStation(order->GetDestination());
 				TileIndex required_tile = GetStationTileForVehicle(v, st);
 
 				n_st++;
@@ -1116,9 +1220,7 @@
 		if (v->num_orders > 1) {
 			const Order* last = GetLastVehicleOrder(v);
 
-			if (v->orders->type  == last->type &&
-					v->orders->flags == last->flags &&
-					v->orders->dest  == last->dest) {
+			if (v->orders->Equals(*last)) {
 				problem_type = 2;
 			}
 		}
@@ -1135,7 +1237,7 @@
 		SetDParam(0, v->unitnumber);
 		AddNewsItem(
 			message,
-			NEWS_FLAGS(NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, 0),
+			NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE,
 			v->index,
 			0
 		);
@@ -1166,20 +1268,18 @@
 		}
 
 		order = &v->current_order;
-		if ((v->type == VEH_AIRCRAFT && order->type == OT_GOTO_DEPOT ? OT_GOTO_STATION : order->type) == type &&
-				v->current_order.dest == destination) {
-			order->type = OT_DUMMY;
-			order->flags = 0;
+		if ((v->type == VEH_AIRCRAFT && order->IsType(OT_GOTO_DEPOT) ? OT_GOTO_STATION : order->GetType()) == type &&
+				v->current_order.GetDestination() == destination) {
+			order->MakeDummy();
 			InvalidateWindow(WC_VEHICLE_VIEW, v->index);
 		}
 
 		/* Clear the order from the order-list */
 		invalidate = false;
 		FOR_VEHICLE_ORDERS(v, order) {
-			if ((v->type == VEH_AIRCRAFT && order->type == OT_GOTO_DEPOT ? OT_GOTO_STATION : order->type) == type &&
-					order->dest == destination) {
-				order->type = OT_DUMMY;
-				order->flags = 0;
+			if ((v->type == VEH_AIRCRAFT && order->IsType(OT_GOTO_DEPOT) ? OT_GOTO_STATION : order->GetType()) == type &&
+					order->GetDestination() == destination) {
+				order->MakeDummy();
 				invalidate = true;
 			}
 		}
@@ -1201,7 +1301,7 @@
 	const Order *order;
 
 	FOR_VEHICLE_ORDERS(v, order) {
-		if (order->type == OT_GOTO_DEPOT)
+		if (order->IsType(OT_GOTO_DEPOT))
 			return true;
 	}
 
@@ -1267,7 +1367,6 @@
 	return (_patches.servint_ispercent) ? Clamp(index, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : Clamp(index, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS);
 }
 
-
 /**
  *
  * Check if a vehicle has any valid orders
@@ -1275,15 +1374,149 @@
  * @return false if there are no valid orders
  *
  */
-bool CheckForValidOrders(const Vehicle* v)
+static bool CheckForValidOrders(const Vehicle *v)
 {
 	const Order *order;
 
-	FOR_VEHICLE_ORDERS(v, order) if (order->type != OT_DUMMY) return true;
+	FOR_VEHICLE_ORDERS(v, order) if (!order->IsType(OT_DUMMY)) return true;
 
 	return false;
 }
 
+/**
+ * Handle the orders of a vehicle and determine the next place
+ * to go to if needed.
+ * @param v the vehicle to do this for.
+ * @return true *if* the vehicle is eligible for reversing
+ *              (basically only when leaving a station).
+ */
+bool ProcessOrders(Vehicle *v)
+{
+	switch (v->current_order.GetType()) {
+		case OT_GOTO_DEPOT:
+			/* Let a depot order in the orderlist interrupt. */
+			if (!(v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS)) return false;
+
+			if ((v->current_order.GetDepotOrderType() & ODTFB_SERVICE) && !v->NeedsServicing()) {
+				UpdateVehicleTimetable(v, true);
+				v->cur_order_index++;
+			}
+			break;
+
+		case OT_LOADING:
+			return false;
+
+		case OT_LEAVESTATION:
+			if (v->type != VEH_AIRCRAFT) return false;
+			break;
+
+		default: break;
+	}
+
+	/**
+	 * Reversing because of order change is allowed only just after leaving a
+	 * station (and the difficulty setting to allowed, of course)
+	 * this can be detected because only after OT_LEAVESTATION, current_order
+	 * will be reset to nothing. (That also happens if no order, but in that case
+	 * it won't hit the point in code where may_reverse is checked)
+	 */
+	bool may_reverse = v->current_order.IsType(OT_NOTHING);
+
+	/* Check if we've reached the waypoint? */
+	if (v->current_order.IsType(OT_GOTO_WAYPOINT) && v->tile == v->dest_tile) {
+		UpdateVehicleTimetable(v, true);
+		v->cur_order_index++;
+	}
+
+	/* Check if we've reached a non-stop station.. */
+	if ((v->current_order.GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) &&
+			IsTileType(v->tile, MP_STATION) &&
+			v->current_order.GetDestination() == GetStationIndex(v->tile)) {
+		v->last_station_visited = v->current_order.GetDestination();
+		UpdateVehicleTimetable(v, true);
+		v->cur_order_index++;
+	}
+
+	/* Get the current order */
+	if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0;
+
+	const Order *order = GetVehicleOrder(v, v->cur_order_index);
+
+	/* If no order, do nothing. */
+	if (order == NULL || (v->type == VEH_AIRCRAFT && order->IsType(OT_DUMMY) && !CheckForValidOrders(v))) {
+		if (v->type == VEH_AIRCRAFT) {
+			/* Aircraft do something vastly different here, so handle separately */
+			extern void HandleMissingAircraftOrders(Vehicle *v);
+			HandleMissingAircraftOrders(v);
+			return false;
+		}
+
+		v->current_order.Free();
+		v->dest_tile = 0;
+		if (v->type == VEH_ROAD) ClearSlot(v);
+		return false;
+	}
+
+	/* If it is unchanged, keep it. */
+	if (order->Equals(v->current_order) &&
+			(v->type != VEH_SHIP || !order->IsType(OT_GOTO_STATION) || GetStation(order->GetDestination())->dock_tile != 0)) {
+		return false;
+	}
+
+	/* Otherwise set it, and determine the destination tile. */
+	v->current_order = *order;
+
+	InvalidateVehicleOrder(v);
+	switch (v->type) {
+		default:
+			NOT_REACHED();
+
+		case VEH_ROAD:
+		case VEH_TRAIN:
+			break;
+
+		case VEH_AIRCRAFT:
+		case VEH_SHIP:
+			InvalidateWindowClasses(v->GetVehicleListWindowClass());
+			break;
+	}
+
+	switch (order->GetType()) {
+		case OT_GOTO_STATION:
+			v->dest_tile = v->GetOrderStationLocation(order->GetDestination());
+			break;
+
+		case OT_GOTO_DEPOT:
+			if (v->type != VEH_AIRCRAFT) v->dest_tile = GetDepot(order->GetDestination())->xy;
+			break;
+
+		case OT_GOTO_WAYPOINT:
+			v->dest_tile = GetWaypoint(order->GetDestination())->xy;
+			break;
+
+		default:
+			v->dest_tile = 0;
+			return false;
+	}
+
+	return may_reverse;
+}
+
+/**
+ * Check whether the given vehicle should stop at the given station
+ * based on this order and the non-stop settings.
+ * @param v       the vehicle that might be stopping.
+ * @param station the station to stop at.
+ * @return true if the vehicle should stop.
+ */
+bool Order::ShouldStopAtStation(const Vehicle *v, StationID station) const
+{
+	return
+			v->last_station_visited != station && // Do stop only when we've not just been there
+			/* Finally do stop when there is no non-stop flag set for this type of station. */
+			!(this->GetNonStopType() & ((this->dest == station) ? ONSF_NO_STOP_AT_DESTINATION_STATION : ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS));
+}
+
 void InitializeOrders()
 {
 	_Order_pool.CleanPool();
@@ -1292,6 +1525,7 @@
 	_backup_orders_tile = 0;
 }
 
+const SaveLoad *GetOrderDescription() {
 static const SaveLoad _order_desc[] = {
 	SLE_VAR(Order, type,  SLE_UINT8),
 	SLE_VAR(Order, flags, SLE_UINT8),
@@ -1307,6 +1541,8 @@
 	SLE_CONDNULL(10, 5, 35),
 	SLE_END()
 };
+	return _order_desc;
+}
 
 static void Save_ORDR()
 {
@@ -1314,7 +1550,7 @@
 
 	FOR_ALL_ORDERS(order) {
 		SlSetArrayIndex(order->index);
-		SlObject(order, _order_desc);
+		SlObject(order, GetOrderDescription());
 	}
 }
 
@@ -1336,7 +1572,7 @@
 
 			for (i = 0; i < len; ++i) {
 				Order *order = new (i) Order();
-				AssignOrder(order, UnpackVersion4Order(orders[i]));
+				order->AssignOrder(UnpackVersion4Order(orders[i]));
 			}
 
 			free(orders);
@@ -1347,8 +1583,7 @@
 			SlArray(orders, len, SLE_UINT32);
 
 			for (i = 0; i < len; ++i) {
-				Order *order = new (i) Order();
-				AssignOrder(order, UnpackOrder(orders[i]));
+				new (i) Order(orders[i]);
 			}
 
 			free(orders);
@@ -1367,7 +1602,7 @@
 
 		while ((index = SlIterateArray()) != -1) {
 			Order *order = new (index) Order();
-			SlObject(order, _order_desc);
+			SlObject(order, GetOrderDescription());
 		}
 	}
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/order_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,54 @@
+/* $Id$ */
+
+/** @file order_func.h Functions related to orders. */
+
+#ifndef ORDER_FUNC_H
+#define ORDER_FUNC_H
+
+#include "order_type.h"
+#include "vehicle_type.h"
+#include "tile_type.h"
+#include "group_type.h"
+#include "date_type.h"
+
+struct BackuppedOrders {
+	BackuppedOrders() : order(NULL), name(NULL) { }
+	~BackuppedOrders() { free(order); free(name); }
+
+	VehicleID clone;
+	VehicleOrderID orderindex;
+	GroupID group;
+	Order *order;
+	uint16 service_interval;
+	char *name;
+};
+
+extern TileIndex _backup_orders_tile;
+extern BackuppedOrders _backup_orders_data;
+
+void BackupVehicleOrders(const Vehicle *v, BackuppedOrders *order = &_backup_orders_data);
+void RestoreVehicleOrders(const Vehicle *v, const BackuppedOrders *order = &_backup_orders_data);
+
+/* Functions */
+void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination);
+void InvalidateVehicleOrder(const Vehicle *v);
+bool VehicleHasDepotOrders(const Vehicle *v);
+void CheckOrders(const Vehicle*);
+void DeleteVehicleOrders(Vehicle *v);
+bool ProcessOrders(Vehicle *v);
+
+#define MIN_SERVINT_PERCENT  5
+#define MAX_SERVINT_PERCENT 90
+#define MIN_SERVINT_DAYS    30
+#define MAX_SERVINT_DAYS   800
+
+/**
+ * Get the service interval domain.
+ * Get the new proposed service interval for the vehicle is indeed, clamped
+ * within the given bounds. @see MIN_SERVINT_PERCENT ,etc.
+ * @param index proposed service interval
+ * @return service interval
+ */
+Date GetServiceIntervalClamped(uint index);
+
+#endif /* ORDER_FUNC_H */
--- a/src/order_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/order_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -8,7 +8,7 @@
 #include "station_map.h"
 #include "gui.h"
 #include "window_gui.h"
-#include "station.h"
+#include "station_base.h"
 #include "town.h"
 #include "command_func.h"
 #include "viewport_func.h"
@@ -20,12 +20,13 @@
 #include "vehicle_gui.h"
 #include "timetable.h"
 #include "cargotype.h"
-#include "order.h"
 #include "strings_func.h"
 #include "window_func.h"
 #include "vehicle_func.h"
 #include "settings_type.h"
 #include "player_func.h"
+#include "newgrf_cargo.h"
+#include "widgets/dropdown_func.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -44,8 +45,9 @@
 	ORDER_WIDGET_UNLOAD,
 	ORDER_WIDGET_REFIT,
 	ORDER_WIDGET_TRANSFER,
+	ORDER_WIDGET_SERVICE,
+	ORDER_WIDGET_RESIZE_BAR,
 	ORDER_WIDGET_SHARED_ORDER_LIST,
-	ORDER_WIDGET_RESIZE_BAR,
 	ORDER_WIDGET_RESIZE,
 };
 
@@ -91,43 +93,32 @@
 	return (sel <= v->num_orders && sel >= 0) ? sel : INVALID_ORDER;
 }
 
-static StringID StationOrderStrings[] = {
-	STR_8806_GO_TO,
-	STR_GO_TO_TRANSFER,
-	STR_8807_GO_TO_UNLOAD,
-	STR_GO_TO_TRANSFER_UNLOAD,
-	STR_8808_GO_TO_LOAD,
-	STR_GO_TO_TRANSFER_LOAD,
-	STR_NULL,
-	STR_NULL,
-	STR_880A_GO_NON_STOP_TO,
-	STR_GO_TO_NON_STOP_TRANSFER,
-	STR_880B_GO_NON_STOP_TO_UNLOAD,
-	STR_GO_TO_NON_STOP_TRANSFER_UNLOAD,
-	STR_880C_GO_NON_STOP_TO_LOAD,
-	STR_GO_TO_NON_STOP_TRANSFER_LOAD,
-	STR_NULL
+/** Order load types that could be given to station orders. */
+static const StringID _station_load_types[][5] = {
+	{
+		STR_EMPTY,
+		STR_ORDER_UNLOAD,
+		STR_ORDER_FULL_LOAD,
+		STR_ORDER_FULL_LOAD_ANY,
+		STR_ORDER_NO_LOAD,
+	}, {
+		STR_ORDER_TRANSFER,
+		STR_ORDER_TRANSFER_UNLOAD,
+		STR_ORDER_TRANSFER_FULL_LOAD,
+		STR_ORDER_TRANSFER_FULL_LOAD_ANY,
+		INVALID_STRING_ID,
+	}
 };
 
 static void DrawOrdersWindow(Window *w)
 {
-	const Vehicle *v;
-	const Order *order;
-	StringID str;
-	int sel;
-	int y, i;
-	bool shared_orders;
-
-	v = GetVehicle(w->window_number);
-
-	shared_orders = v->IsOrderListShared();
+	const Vehicle *v = GetVehicle(w->window_number);
+	bool shared_orders = v->IsOrderListShared();
 
 	SetVScrollCount(w, v->num_orders + 1);
 
-	sel = OrderGetSel(w);
-	SetDParam(2, STR_8827_FULL_LOAD);
-
-	order = GetVehicleOrder(v, sel);
+	int sel = OrderGetSel(w);
+	const Order *order = GetVehicleOrder(v, sel);
 
 	if (v->owner == _local_player) {
 		/* skip */
@@ -145,17 +136,21 @@
 		/* Disable list of vehicles with the same shared orders if there is no list */
 		w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL);
 		w->SetWidgetDisabledState(ORDER_WIDGET_REFIT,     order == NULL); // Refit
+		w->SetWidgetDisabledState(ORDER_WIDGET_SERVICE,   order == NULL); // Refit
 		w->HideWidget(ORDER_WIDGET_REFIT); // Refit
+		w->HideWidget(ORDER_WIDGET_SERVICE); // Service
 	} else {
 		w->DisableWidget(ORDER_WIDGET_TRANSFER);
+		w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
 	}
 
-	w->ShowWidget(ORDER_WIDGET_UNLOAD); // Unload
+	w->ShowWidget(ORDER_WIDGET_UNLOAD);
+	w->ShowWidget(ORDER_WIDGET_TRANSFER);
 
 	if (order != NULL) {
-		switch (order->type) {
+		switch (order->GetType()) {
 			case OT_GOTO_STATION:
-				if (!GetStation(order->dest)->IsBuoy()) break;
+				if (!GetStation(order->GetDestination())->IsBuoy()) break;
 				/* Fall-through */
 
 			case OT_GOTO_WAYPOINT:
@@ -165,12 +160,13 @@
 				break;
 
 			case OT_GOTO_DEPOT:
-				w->DisableWidget(ORDER_WIDGET_TRANSFER);
+				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
 
 				/* Remove unload and replace it with refit */
 				w->HideWidget(ORDER_WIDGET_UNLOAD);
 				w->ShowWidget(ORDER_WIDGET_REFIT);
-				SetDParam(2,STR_SERVICE);
+				w->HideWidget(ORDER_WIDGET_TRANSFER);
+				w->ShowWidget(ORDER_WIDGET_SERVICE);
 				break;
 
 			default: // every other orders
@@ -183,10 +179,11 @@
 	SetDParam(0, v->index);
 	DrawWindowWidgets(w);
 
-	y = 15;
+	int y = 15;
 
-	i = w->vscroll.pos;
+	int i = w->vscroll.pos;
 	order = GetVehicleOrder(v, i);
+	StringID str;
 	while (order != NULL) {
 		str = (v->cur_order_index == i) ? STR_8805 : STR_8804;
 		SetDParam(3, STR_EMPTY);
@@ -194,40 +191,46 @@
 		if (i - w->vscroll.pos < w->vscroll.cap) {
 			SetDParam(1, 6);
 
-			switch (order->type) {
+			switch (order->GetType()) {
 				case OT_DUMMY:
 					SetDParam(1, STR_INVALID_ORDER);
-					SetDParam(2, order->dest);
+					SetDParam(2, order->GetDestination());
 					break;
 
-				case OT_GOTO_STATION:
-					SetDParam(1, StationOrderStrings[order->flags]);
-					SetDParam(2, order->dest);
-					break;
+				case OT_GOTO_STATION: {
+					OrderLoadFlags load = order->GetLoadType();
+					OrderUnloadFlags unload = order->GetUnloadType();
+
+					SetDParam(1, STR_GO_TO_STATION);
+					SetDParam(2, STR_ORDER_GO_TO + (v->type == VEH_TRAIN ? order->GetNonStopType() : 0));
+					SetDParam(3, order->GetDestination());
+					/* Yes, this is ugly, but... once the savegame bump is done, it'll look a lot better! */
+					SetDParam(4, _station_load_types[unload & OUFB_TRANSFER][((load & 1) | (load >> 1)) + ((unload & ~(OUFB_NO_UNLOAD | OUFB_TRANSFER)) >> 1)]);
+				} break;
 
 				case OT_GOTO_DEPOT: {
 					StringID s = STR_NULL;
 
 					if (v->type == VEH_AIRCRAFT) {
 						s = STR_GO_TO_AIRPORT_HANGAR;
-						SetDParam(2, order->dest);
+						SetDParam(2, order->GetDestination());
 					} else {
-						SetDParam(2, GetDepot(order->dest)->town_index);
+						SetDParam(2, GetDepot(order->GetDestination())->town_index);
 
 						switch (v->type) {
-							case VEH_TRAIN: s = (order->flags & OFB_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
+							case VEH_TRAIN: s = (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
 							case VEH_ROAD:  s = STR_GO_TO_ROADVEH_DEPOT; break;
 							case VEH_SHIP:  s = STR_GO_TO_SHIP_DEPOT; break;
 							default: break;
 						}
 					}
 
-					if (order->flags & OFB_FULL_LOAD) s++; /* service at */
+					if (order->GetDepotOrderType() & ODTFB_SERVICE) s++; // service at
 
 					SetDParam(1, s);
-					if (order->refit_cargo < NUM_CARGO) {
+					if (order->IsRefit()) {
 						SetDParam(3, STR_REFIT_ORDER);
-						SetDParam(4, GetCargo(order->refit_cargo)->name);
+						SetDParam(4, GetCargo(order->GetRefitCargo())->name);
 					} else {
 						SetDParam(3, STR_EMPTY);
 					}
@@ -235,8 +238,8 @@
 				}
 
 				case OT_GOTO_WAYPOINT:
-					SetDParam(1, (order->flags & OFB_NON_STOP) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
-					SetDParam(2, order->dest);
+					SetDParam(1, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
+					SetDParam(2, order->GetDestination());
 					break;
 
 				default: break;
@@ -263,67 +266,55 @@
 	Order order;
 	order.next  = NULL;
 	order.index = 0;
-	order.refit_cargo   = CT_INVALID;
-	order.refit_subtype = 0;
 
-	// check depot first
+	/* check depot first */
 	if (_patches.gotodepot) {
 		switch (GetTileType(tile)) {
-		case MP_RAILWAY:
-			if (v->type == VEH_TRAIN && IsTileOwner(tile, _local_player)) {
-				if (IsRailDepot(tile)) {
-					order.type = OT_GOTO_DEPOT;
-					order.flags = OFB_PART_OF_ORDERS;
-					order.dest = GetDepotByTile(tile)->index;
+			case MP_RAILWAY:
+				if (v->type == VEH_TRAIN && IsTileOwner(tile, _local_player)) {
+					if (IsRailDepot(tile)) {
+						order.MakeGoToDepot(GetDepotByTile(tile)->index, ODTFB_PART_OF_ORDERS);
+						return order;
+					}
+				}
+				break;
+
+			case MP_ROAD:
+				if (IsRoadDepot(tile) && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) {
+					order.MakeGoToDepot(GetDepotByTile(tile)->index, ODTFB_PART_OF_ORDERS);
 					return order;
 				}
-			}
-			break;
-
-		case MP_ROAD:
-			if (IsRoadDepot(tile) && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) {
-				order.type = OT_GOTO_DEPOT;
-				order.flags = OFB_PART_OF_ORDERS;
-				order.dest = GetDepotByTile(tile)->index;
-				return order;
-			}
-			break;
+				break;
 
-		case MP_STATION:
-			if (v->type != VEH_AIRCRAFT) break;
-			if (IsHangar(tile) && IsTileOwner(tile, _local_player)) {
-				order.type = OT_GOTO_DEPOT;
-				order.flags = OFB_PART_OF_ORDERS;
-				order.dest = GetStationIndex(tile);
-				return order;
-			}
-			break;
+			case MP_STATION:
+				if (v->type != VEH_AIRCRAFT) break;
+				if (IsHangar(tile) && IsTileOwner(tile, _local_player)) {
+					order.MakeGoToDepot(GetStationIndex(tile), ODTFB_PART_OF_ORDERS);
+					return order;
+				}
+				break;
 
-		case MP_WATER:
-			if (v->type != VEH_SHIP) break;
-			if (IsTileDepotType(tile, TRANSPORT_WATER) &&
-					IsTileOwner(tile, _local_player)) {
-				TileIndex tile2 = GetOtherShipDepotTile(tile);
+			case MP_WATER:
+				if (v->type != VEH_SHIP) break;
+				if (IsTileDepotType(tile, TRANSPORT_WATER) &&
+						IsTileOwner(tile, _local_player)) {
+					TileIndex tile2 = GetOtherShipDepotTile(tile);
 
-				order.type = OT_GOTO_DEPOT;
-				order.flags = OFB_PART_OF_ORDERS;
-				order.dest = GetDepotByTile(tile < tile2 ? tile : tile2)->index;
-				return order;
-			}
+					order.MakeGoToDepot(GetDepotByTile(tile < tile2 ? tile : tile2)->index, ODTFB_PART_OF_ORDERS);
+					return order;
+				}
 
 			default:
 				break;
 		}
 	}
 
-	// check waypoint
+	/* check waypoint */
 	if (IsTileType(tile, MP_RAILWAY) &&
 			v->type == VEH_TRAIN &&
 			IsTileOwner(tile, _local_player) &&
 			IsRailWaypoint(tile)) {
-		order.type = OT_GOTO_WAYPOINT;
-		order.flags = 0;
-		order.dest = GetWaypointByTile(tile)->index;
+		order.MakeGoToWaypoint(GetWaypointByTile(tile)->index);
 		return order;
 	}
 
@@ -333,23 +324,20 @@
 
 		if (st->owner == _current_player || st->owner == OWNER_NONE) {
 			byte facil;
-			(facil=FACIL_DOCK, v->type == VEH_SHIP) ||
-			(facil=FACIL_TRAIN, v->type == VEH_TRAIN) ||
-			(facil=FACIL_AIRPORT, v->type == VEH_AIRCRAFT) ||
-			(facil=FACIL_BUS_STOP, v->type == VEH_ROAD && IsCargoInClass(v->cargo_type, CC_PASSENGERS)) ||
-			(facil=FACIL_TRUCK_STOP, 1);
+			(facil = FACIL_DOCK, v->type == VEH_SHIP) ||
+			(facil = FACIL_TRAIN, v->type == VEH_TRAIN) ||
+			(facil = FACIL_AIRPORT, v->type == VEH_AIRCRAFT) ||
+			(facil = FACIL_BUS_STOP, v->type == VEH_ROAD && IsCargoInClass(v->cargo_type, CC_PASSENGERS)) ||
+			(facil = FACIL_TRUCK_STOP, 1);
 			if (st->facilities & facil) {
-				order.type = OT_GOTO_STATION;
-				order.flags = 0;
-				order.dest = st_index;
+				order.MakeGoToStation(st_index);
 				return order;
 			}
 		}
 	}
 
-	// not found
+	/* not found */
 	order.Free();
-	order.dest = INVALID_STATION;
 	return order;
 }
 
@@ -362,8 +350,8 @@
 		if (!u->IsPrimaryVehicle()) return false;
 	}
 
-	// v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet
-	// obviously if you press CTRL on a non-empty orders vehicle you know what you are doing
+	/* v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet
+	 * obviously if you press CTRL on a non-empty orders vehicle you know what you are doing */
 	if (v->num_orders != 0 && _ctrl_pressed == 0) return false;
 
 	if (DoCommandP(v->tile, v->index | (u->index << 16), _ctrl_pressed ? CO_SHARE : CO_COPY, NULL,
@@ -377,17 +365,14 @@
 
 static void OrdersPlaceObj(const Vehicle *v, TileIndex tile, Window *w)
 {
-	Order cmd;
-	const Vehicle *u;
-
-	// check if we're clicking on a vehicle first.. clone orders in that case.
-	u = CheckMouseOverVehicle();
+	/* check if we're clicking on a vehicle first.. clone orders in that case. */
+	const Vehicle *u = CheckMouseOverVehicle();
 	if (u != NULL && HandleOrderVehClick(v, u, w)) return;
 
-	cmd = GetOrderCmdFromTile(v, tile);
+	const Order cmd = GetOrderCmdFromTile(v, tile);
 	if (!cmd.IsValid()) return;
 
-	if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), PackOrder(&cmd), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) {
+	if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), cmd.Pack(), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) {
 		if (WP(w, order_d).sel != -1) WP(w,order_d).sel++;
 		ResetObjectToPlace();
 	}
@@ -399,7 +384,7 @@
  * @param w current window
  * @param v current vehicle
  */
-static void OrderClick_Goto(Window *w, const Vehicle *v)
+static void OrderClick_Goto(Window *w, const Vehicle *v, int i)
 {
 	w->InvalidateWidget(ORDER_WIDGET_GOTO);
 	w->ToggleWidgetLoweredState(ORDER_WIDGET_GOTO);
@@ -416,10 +401,27 @@
  *
  * @param w current window
  * @param v current vehicle
+ * @param load_type the way to load.
  */
-static void OrderClick_FullLoad(Window *w, const Vehicle *v)
+static void OrderClick_FullLoad(Window *w, const Vehicle *v, int load_type)
 {
-	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OF_FULL_LOAD, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
+	VehicleOrderID sel_ord = OrderGetSel(w);
+	const Order *order = GetVehicleOrder(v, sel_ord);
+
+	if (load_type > 0) load_type += 3;
+	if (load_type >= 0 && (order->GetLoadType() & OLFB_FULL_LOAD) == (load_type & OLFB_FULL_LOAD)) return;
+	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_LOAD | ((order->GetLoadType() & OLFB_FULL_LOAD) ^ OLFB_FULL_LOAD) << 2, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
+}
+
+/**
+ * Handle the click on the service.
+ *
+ * @param w current window
+ * @param v current vehicle
+ */
+static void OrderClick_Service(Window *w, const Vehicle *v, int i)
+{
+	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), MOF_DEPOT_ACTION, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
 }
 
 /**
@@ -428,9 +430,12 @@
  * @param w current window
  * @param v current vehicle
  */
-static void OrderClick_Unload(Window *w, const Vehicle *v)
+static void OrderClick_Unload(Window *w, const Vehicle *v, int i)
 {
-	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OF_UNLOAD,    NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
+	VehicleOrderID sel_ord = OrderGetSel(w);
+	const Order *order = GetVehicleOrder(v, sel_ord);
+
+	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_UNLOAD | (order->GetUnloadType() ^ OUFB_UNLOAD) << 2, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
 }
 
 /**
@@ -438,10 +443,22 @@
  *
  * @param w current window
  * @param v current vehicle
+ * @param non_stop what non-stop type to use; -1 to use the 'next' one.
  */
-static void OrderClick_Nonstop(Window *w, const Vehicle *v)
+static void OrderClick_Nonstop(Window *w, const Vehicle *v, int non_stop)
 {
-	DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), OF_NON_STOP,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
+	VehicleOrderID sel_ord = OrderGetSel(w);
+	const Order *order = GetVehicleOrder(v, sel_ord);
+
+	if (order->GetNonStopType() == non_stop) return;
+	if (_patches.new_nonstop && non_stop == ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) non_stop = ONSF_STOP_EVERYWHERE;
+
+	/* Keypress if negative, so 'toggle' to the next */
+	if (non_stop < 0) {
+		non_stop = (order->GetNonStopType() + 1) % ONSF_END;
+	}
+
+	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_NON_STOP | non_stop << 2,  NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
 }
 
 /**
@@ -450,9 +467,12 @@
  * @param w current window
  * @param v current vehicle
  */
-static void OrderClick_Transfer(Window* w, const Vehicle* v)
+static void OrderClick_Transfer(Window *w, const Vehicle *v, int i)
 {
-	DoCommandP(v->tile, v->index + (OrderGetSel(w) <<  16), OF_TRANSFER, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
+	VehicleOrderID sel_ord = OrderGetSel(w);
+	const Order *order = GetVehicleOrder(v, sel_ord);
+
+	DoCommandP(v->tile, v->index + (sel_ord << 16), MOF_UNLOAD | (order->GetUnloadType() ^ OUFB_TRANSFER) << 2, NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
 }
 
 /**
@@ -463,7 +483,7 @@
  * @param w current window
  * @param v current vehicle
  */
-static void OrderClick_Skip(Window *w, const Vehicle *v)
+static void OrderClick_Skip(Window *w, const Vehicle *v, int i)
 {
 	/* Don't skip when there's nothing to skip */
 	if (_ctrl_pressed && v->cur_order_index == OrderGetSel(w)) return;
@@ -478,7 +498,7 @@
  * @param w current window
  * @param v current vehicle
  */
-static void OrderClick_Delete(Window *w, const Vehicle *v)
+static void OrderClick_Delete(Window *w, const Vehicle *v, int i)
 {
 	DoCommandP(v->tile, v->index, OrderGetSel(w), NULL, CMD_DELETE_ORDER | CMD_MSG(STR_8834_CAN_T_DELETE_THIS_ORDER));
 }
@@ -491,7 +511,7 @@
  * @param w current window
  * @param v current vehicle
  */
-static void OrderClick_Refit(Window *w, const Vehicle *v)
+static void OrderClick_Refit(Window *w, const Vehicle *v, int i)
 {
 	if (_ctrl_pressed) {
 		/* Cancel refitting */
@@ -501,7 +521,7 @@
 	}
 }
 
-typedef void OnButtonVehClick(Window *w, const Vehicle *v);
+typedef void OnButtonVehClick(Window *w, const Vehicle *v, int i);
 
 /**
  * Keycode function mapping.
@@ -516,7 +536,8 @@
 	OrderClick_Goto,
 	OrderClick_FullLoad,
 	OrderClick_Unload,
-	OrderClick_Transfer
+	OrderClick_Transfer,
+	OrderClick_Service,
 };
 
 static const uint16 _order_keycodes[] = {
@@ -528,15 +549,32 @@
 	'K'  //unload
 };
 
+static const StringID _order_non_stop_drowdown[] = {
+	STR_ORDER_GO_TO,
+	STR_ORDER_GO_NON_STOP_TO,
+	STR_ORDER_GO_VIA,
+	STR_ORDER_GO_NON_STOP_VIA,
+	INVALID_STRING_ID
+};
+
+static const StringID _order_full_load_drowdown[] = {
+	STR_ORDER_DROP_LOAD_IF_POSSIBLE,
+	STR_ORDER_DROP_FULL_LOAD_ALL,
+	STR_ORDER_DROP_FULL_LOAD_ANY,
+	INVALID_STRING_ID
+};
+
 static void OrdersWndProc(Window *w, WindowEvent *e)
 {
+	const Vehicle *v = GetVehicle(w->window_number);
+
 	switch (e->event) {
 		case WE_CREATE:
 			/* Ensure that the refit and unload buttons always remain at the same location.
 			 * Only one of them can be active at any one time and takes turns on being disabled.
 			 * To ensure that they stay at the same location, we also verify that they behave the same
 			 * when resizing. */
-			if (GetVehicle(w->window_number)->owner == _local_player) { // only the vehicle owner got these buttons
+			if (v->owner == _local_player) { // only the vehicle owner got these buttons
 				assert(w->widget[ORDER_WIDGET_REFIT].left          == w->widget[ORDER_WIDGET_UNLOAD].left);
 				assert(w->widget[ORDER_WIDGET_REFIT].right         == w->widget[ORDER_WIDGET_UNLOAD].right);
 				assert(w->widget[ORDER_WIDGET_REFIT].top           == w->widget[ORDER_WIDGET_UNLOAD].top);
@@ -552,193 +590,200 @@
 
 			break;
 
-	case WE_PAINT:
-		DrawOrdersWindow(w);
-		break;
-
-	case WE_CLICK: {
-		const Vehicle *v = GetVehicle(w->window_number);
-		switch (e->we.click.widget) {
-		case ORDER_WIDGET_ORDER_LIST: {
-			ResetObjectToPlace();
-
-			int sel = GetOrderFromOrderWndPt(w, e->we.click.pt.y, v);
-
-			if (sel == INVALID_ORDER) {
-				/* This was a click on an empty part of the orders window, so
-				 * deselect the currently selected order. */
-				WP(w, order_d).sel = -1;
-				SetWindowDirty(w);
-				return;
-			}
-
-			if (_ctrl_pressed && sel < v->num_orders) {
-				const Order *ord = GetVehicleOrder(v, sel);
-				TileIndex xy;
-
-				switch (ord->type) {
-					case OT_GOTO_STATION:  xy = GetStation(ord->dest)->xy ; break;
-					case OT_GOTO_DEPOT:    xy = (v->type == VEH_AIRCRAFT) ?  GetStation(ord->dest)->xy : GetDepot(ord->dest)->xy;    break;
-					case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->dest)->xy; break;
-					default:               xy = 0; break;
-				}
-
-				if (xy != 0) ScrollMainWindowToTile(xy);
-				return;
-			} else {
-				if (sel == WP(w, order_d).sel) {
-					/* Deselect clicked order */
-					WP(w, order_d).sel = -1;
-				} else {
-					/* Select clicked order */
-					WP(w, order_d).sel = sel;
-
-					if (v->owner == _local_player) {
-						/* Activate drag and drop */
-						SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, VHM_DRAG, w);
-					}
-				}
-			}
-
-			SetWindowDirty(w);
-		} break;
-
-		case ORDER_WIDGET_SKIP:
-			OrderClick_Skip(w, v);
-			break;
-
-		case ORDER_WIDGET_DELETE:
-			OrderClick_Delete(w, v);
-			break;
-
-		case ORDER_WIDGET_NON_STOP:
-			OrderClick_Nonstop(w, v);
-			break;
-
-		case ORDER_WIDGET_GOTO:
-			OrderClick_Goto(w, v);
-			break;
-
-		case ORDER_WIDGET_FULL_LOAD:
-			OrderClick_FullLoad(w, v);
-			break;
-
-		case ORDER_WIDGET_UNLOAD:
-			OrderClick_Unload(w, v);
-			break;
-		case ORDER_WIDGET_REFIT:
-			OrderClick_Refit(w, v);
-			break;
-
-		case ORDER_WIDGET_TRANSFER:
-			OrderClick_Transfer(w, v);
-			break;
-
-		case ORDER_WIDGET_TIMETABLE_VIEW:
-			ShowTimetableWindow(v);
+		case WE_PAINT:
+			DrawOrdersWindow(w);
 			break;
 
-		case ORDER_WIDGET_SHARED_ORDER_LIST:
-			ShowVehicleListWindow(v);
-			break;
-		}
-	} break;
-
-	case WE_DRAGDROP: {
-		const Vehicle *v = GetVehicle(w->window_number);
+		case WE_CLICK:
+			switch (e->we.click.widget) {
+				case ORDER_WIDGET_ORDER_LIST: {
+					ResetObjectToPlace();
+					HideDropDownMenu(w);
 
-		switch (e->we.click.widget) {
-			case ORDER_WIDGET_ORDER_LIST: {
-				int from_order = OrderGetSel(w);
-				int to_order = GetOrderFromOrderWndPt(w, e->we.dragdrop.pt.y, v);
+					int sel = GetOrderFromOrderWndPt(w, e->we.click.pt.y, v);
 
-				if (!(from_order == to_order || from_order == INVALID_ORDER || from_order > v->num_orders || to_order == INVALID_ORDER || to_order > v->num_orders) &&
-						DoCommandP(v->tile, v->index, from_order | (to_order << 16), NULL, CMD_MOVE_ORDER | CMD_MSG(STR_CAN_T_MOVE_THIS_ORDER))) {
-					WP(w, order_d).sel = -1;
-				}
+					if (sel == INVALID_ORDER) {
+						/* This was a click on an empty part of the orders window, so
+						* deselect the currently selected order. */
+						WP(w, order_d).sel = -1;
+						SetWindowDirty(w);
+						return;
+					}
 
-				break;
+					if (_ctrl_pressed && sel < v->num_orders) {
+						const Order *ord = GetVehicleOrder(v, sel);
+						TileIndex xy;
+
+						switch (ord->GetType()) {
+							case OT_GOTO_STATION:  xy = GetStation(ord->GetDestination())->xy ; break;
+							case OT_GOTO_DEPOT:    xy = (v->type == VEH_AIRCRAFT) ?  GetStation(ord->GetDestination())->xy : GetDepot(ord->GetDestination())->xy;    break;
+							case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->GetDestination())->xy; break;
+							default:               xy = 0; break;
+						}
+
+						if (xy != 0) ScrollMainWindowToTile(xy);
+						return;
+					} else {
+						if (sel == WP(w, order_d).sel) {
+							/* Deselect clicked order */
+							WP(w, order_d).sel = -1;
+						} else {
+							/* Select clicked order */
+							WP(w, order_d).sel = sel;
+
+							if (v->owner == _local_player) {
+								/* Activate drag and drop */
+								SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, VHM_DRAG, w);
+							}
+						}
+					}
+
+					SetWindowDirty(w);
+				} break;
+
+				case ORDER_WIDGET_SKIP:
+					OrderClick_Skip(w, v, 0);
+					break;
+
+				case ORDER_WIDGET_DELETE:
+					OrderClick_Delete(w, v, 0);
+					break;
+
+				case ORDER_WIDGET_NON_STOP:
+					ShowDropDownMenu(w, _order_non_stop_drowdown, GetVehicleOrder(v, OrderGetSel(w))->GetNonStopType(), ORDER_WIDGET_NON_STOP, 0, _patches.new_nonstop ? 5 : 12, 124);
+					break;
+
+				case ORDER_WIDGET_GOTO:
+					OrderClick_Goto(w, v, 0);
+					break;
+
+				case ORDER_WIDGET_FULL_LOAD:
+					ShowDropDownMenu(w, _order_full_load_drowdown, GetVehicleOrder(v, OrderGetSel(w))->GetLoadType() << 2, ORDER_WIDGET_FULL_LOAD, 0, _patches.full_load_any ? 2 : 4, 124);
+					break;
+
+				case ORDER_WIDGET_UNLOAD:
+					OrderClick_Unload(w, v, 0);
+					break;
+
+				case ORDER_WIDGET_REFIT:
+					OrderClick_Refit(w, v, 0);
+					break;
+
+				case ORDER_WIDGET_TRANSFER:
+					OrderClick_Transfer(w, v, 0);
+					break;
+
+				case ORDER_WIDGET_SERVICE:
+					OrderClick_Service(w, v, 0);
+					break;
+
+				case ORDER_WIDGET_TIMETABLE_VIEW:
+					ShowTimetableWindow(v);
+					break;
+
+				case ORDER_WIDGET_SHARED_ORDER_LIST:
+					ShowVehicleListWindow(v);
+					break;
+			}
+			break;
+
+		case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
+			switch (e->we.dropdown.button) {
+				case ORDER_WIDGET_NON_STOP:
+					OrderClick_Nonstop(w, v, e->we.dropdown.index);
+					break;
+
+				case ORDER_WIDGET_FULL_LOAD:
+					OrderClick_FullLoad(w, v, e->we.dropdown.index);
+					break;
+			}
+			break;
+
+		case WE_DRAGDROP:
+			switch (e->we.click.widget) {
+				case ORDER_WIDGET_ORDER_LIST: {
+					int from_order = OrderGetSel(w);
+					int to_order = GetOrderFromOrderWndPt(w, e->we.dragdrop.pt.y, v);
+
+					if (!(from_order == to_order || from_order == INVALID_ORDER || from_order > v->num_orders || to_order == INVALID_ORDER || to_order > v->num_orders) &&
+							DoCommandP(v->tile, v->index, from_order | (to_order << 16), NULL, CMD_MOVE_ORDER | CMD_MSG(STR_CAN_T_MOVE_THIS_ORDER))) {
+						WP(w, order_d).sel = -1;
+					}
+
+				} break;
+
+				case ORDER_WIDGET_DELETE:
+					OrderClick_Delete(w, v, 0);
+					break;
 			}
 
-			case ORDER_WIDGET_DELETE:
-				OrderClick_Delete(w, v);
-				break;
-		}
-
-		ResetObjectToPlace();
-		break;
-	}
-
-	case WE_KEYPRESS: {
-		Vehicle *v = GetVehicle(w->window_number);
-		uint i;
-
-		if (v->owner != _local_player) break;
-
-		for (i = 0; i < lengthof(_order_keycodes); i++) {
-			if (e->we.keypress.keycode == _order_keycodes[i]) {
-				e->we.keypress.cont = false;
-				//see if the button is disabled
-				if (!w->IsWidgetDisabled(i + ORDER_WIDGET_SKIP)) _order_button_proc[i](w, v);
-				break;
-			}
-		}
-		break;
-	}
-
-	case WE_RCLICK: {
-		const Vehicle *v = GetVehicle(w->window_number);
-		int s = OrderGetSel(w);
-
-		if (e->we.click.widget != ORDER_WIDGET_FULL_LOAD) break;
-		if (s == v->num_orders || GetVehicleOrder(v, s)->type != OT_GOTO_DEPOT) {
-			GuiShowTooltips(STR_8857_MAKE_THE_HIGHLIGHTED_ORDER);
-		} else {
-			GuiShowTooltips(STR_SERVICE_HINT);
-		}
-	} break;
+			ResetObjectToPlace();
+			break;
 
-	case WE_PLACE_OBJ: {
-		OrdersPlaceObj(GetVehicle(w->window_number), e->we.place.tile, w);
-	} break;
-
-	case WE_ABORT_PLACE_OBJ: {
-		w->RaiseWidget(ORDER_WIDGET_GOTO);
-		w->InvalidateWidget(ORDER_WIDGET_GOTO);
-	} break;
+		case WE_KEYPRESS:
+			if (v->owner != _local_player) break;
 
-	// check if a vehicle in a depot was clicked..
-	case WE_MOUSELOOP: {
-		const Vehicle *v = _place_clicked_vehicle;
-		/*
-		 * Check if we clicked on a vehicle
-		 * and if the GOTO button of this window is pressed
-		 * This is because of all open order windows WE_MOUSELOOP is called
-		 * and if you have 3 windows open, and this check is not done
-		 * the order is copied to the last open window instead of the
-		 * one where GOTO is enabled
-		 */
-		if (v != NULL && w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
-			_place_clicked_vehicle = NULL;
-			HandleOrderVehClick(GetVehicle(w->window_number), v, w);
-		}
-	} break;
+			for (uint i = 0; i < lengthof(_order_keycodes); i++) {
+				if (e->we.keypress.keycode == _order_keycodes[i]) {
+					e->we.keypress.cont = false;
+					/* see if the button is disabled */
+					if (!w->IsWidgetDisabled(i + ORDER_WIDGET_SKIP)) _order_button_proc[i](w, v, -1);
+					break;
+				}
+			}
+			break;
 
-	case WE_RESIZE:
-		/* Update the scroll + matrix */
-		w->vscroll.cap = (w->widget[ORDER_WIDGET_ORDER_LIST].bottom - w->widget[ORDER_WIDGET_ORDER_LIST].top) / 10;
-		break;
+		case WE_RCLICK: {
+			int s = OrderGetSel(w);
 
-	case WE_TIMEOUT: { // handle button unclick ourselves...
-		// unclick all buttons except for the 'goto' button (ORDER_WIDGET_GOTO), which is 'persistent'
-		uint i;
-		for (i = 0; i < w->widget_count; i++) {
-			if (w->IsWidgetLowered(i) && i != ORDER_WIDGET_GOTO) {
-				w->RaiseWidget(i);
-				w->InvalidateWidget(i);
+			if (e->we.click.widget != ORDER_WIDGET_FULL_LOAD) break;
+			if (s == v->num_orders || !GetVehicleOrder(v, s)->IsType(OT_GOTO_DEPOT)) {
+				GuiShowTooltips(STR_8857_MAKE_THE_HIGHLIGHTED_ORDER);
+			} else {
+				GuiShowTooltips(STR_SERVICE_HINT);
 			}
-		}
-	} break;
+		} break;
+
+		case WE_PLACE_OBJ:
+			OrdersPlaceObj(GetVehicle(w->window_number), e->we.place.tile, w);
+			break;
+
+		case WE_ABORT_PLACE_OBJ:
+			w->RaiseWidget(ORDER_WIDGET_GOTO);
+			w->InvalidateWidget(ORDER_WIDGET_GOTO);
+			break;
+
+		/* check if a vehicle in a depot was clicked.. */
+		case WE_MOUSELOOP:
+			v = _place_clicked_vehicle;
+			/*
+			* Check if we clicked on a vehicle
+			* and if the GOTO button of this window is pressed
+			* This is because of all open order windows WE_MOUSELOOP is called
+			* and if you have 3 windows open, and this check is not done
+			* the order is copied to the last open window instead of the
+			* one where GOTO is enabled
+			*/
+			if (v != NULL && w->IsWidgetLowered(ORDER_WIDGET_GOTO)) {
+				_place_clicked_vehicle = NULL;
+				HandleOrderVehClick(GetVehicle(w->window_number), v, w);
+			}
+			break;
+
+		case WE_RESIZE:
+			/* Update the scroll + matrix */
+			w->vscroll.cap = (w->widget[ORDER_WIDGET_ORDER_LIST].bottom - w->widget[ORDER_WIDGET_ORDER_LIST].top) / 10;
+			break;
+
+		case WE_TIMEOUT: // handle button unclick ourselves...
+			/* unclick all buttons except for the 'goto' button (ORDER_WIDGET_GOTO), which is 'persistent' */
+			for (uint i = 0; i < w->widget_count; i++) {
+				if (w->IsWidgetLowered(i) && i != ORDER_WIDGET_GOTO) {
+					w->RaiseWidget(i);
+					w->InvalidateWidget(i);
+				}
+			}
+			break;
 	}
 }
 
@@ -747,32 +792,32 @@
  */
 static const Widget _orders_train_widgets[] = {
 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
-	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   398,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
-	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   338,   398,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
-
-	{      WWT_PANEL,   RESIZE_RB,      14,     0,   386,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
-
-	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   387,   398,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
+	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   385,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
+	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   325,   385,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
 
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    52,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,    53,   105,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   106,   158,    76,    87, STR_8825_NON_STOP,       STR_8855_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_NON_STOP
-	{    WWT_TEXTBTN,   RESIZE_TB,      14,   159,   211,    76,    87, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   212,   264,    76,    87, STR_FULLLOAD_OR_SERVICE, STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   372,    76,    87, STR_TRANSFER,            STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_TRANSFER
+	{      WWT_PANEL,   RESIZE_RB,      14,     0,   373,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
 
-	{ WWT_PUSHIMGBTN,   RESIZE_TB,      14,   373,   386,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
+	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   374,   385,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
 
-	{      WWT_PANEL,   RESIZE_RTB,     14,   387,   386,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   123,    88,    99, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    88,    99, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
+	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,    92,    76,    87, STR_8825_NON_STOP,       STR_8855_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_NON_STOP
+	{    WWT_TEXTBTN,   RESIZE_TB,      14,   248,   371,    88,    99, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
+	{   WWT_DROPDOWN,   RESIZE_TB,      14,    93,   185,    76,    87, STR_8827_FULL_LOAD,      STR_8857_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_FULL_LOAD
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   186,   278,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   186,   278,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   279,   371,    76,    87, STR_TRANSFER,            STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_TRANSFER
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   279,   371,    76,    87, STR_SERVICE,             STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_SERVICE
 
-	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   387,   398,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
+	{      WWT_PANEL,   RESIZE_RTB,     14,   372,   373,    76,    99, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
+	{ WWT_PUSHIMGBTN,   RESIZE_LRTB,    14,   372,   385,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
+
+	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
 	{   WIDGETS_END},
 };
 
 static const WindowDesc _orders_train_desc = {
-	WDP_AUTO, WDP_AUTO, 399, 88, 399, 88,
+	WDP_AUTO, WDP_AUTO, 386, 100, 386, 100,
 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
 	_orders_train_widgets,
@@ -784,32 +829,32 @@
  */
 static const Widget _orders_widgets[] = {
 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
-	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   409,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
-	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   349,   409,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
+	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   385,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
+	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   325,   385,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
 
-	{      WWT_PANEL,   RESIZE_RB,      14,     0,   397,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
+	{      WWT_PANEL,   RESIZE_RB,      14,     0,   373,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
 
-	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   398,   409,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
+	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   374,   385,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
 
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    63,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,    64,   128,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   123,    88,    99, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    88,    99, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
 	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                     0x0},                                 // ORDER_WIDGET_NON_STOP
-	{    WWT_TEXTBTN,   RESIZE_TB,      14,   129,   192,    76,    87, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   193,   256,    76,    87, STR_FULLLOAD_OR_SERVICE, STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   383,    76,    87, STR_TRANSFER,            STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_TRANSFER
+	{    WWT_TEXTBTN,   RESIZE_TB,      14,   248,   371,    88,    99, STR_8826_GO_TO,          STR_8856_INSERT_A_NEW_ORDER_BEFORE},  // ORDER_WIDGET_GOTO
+	{   WWT_DROPDOWN,   RESIZE_TB,      14,     0,   123,    76,    87, STR_8827_FULL_LOAD,      STR_8857_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_FULL_LOAD
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   124,   247,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   372,    76,    87, STR_TRANSFER,            STR_MAKE_THE_HIGHLIGHTED_ORDER},      // ORDER_WIDGET_TRANSFER
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   248,   372,    76,    87, STR_SERVICE,             STR_NULL},                            // ORDER_WIDGET_SERVICE
 
-	{ WWT_PUSHIMGBTN,   RESIZE_TB,      14,   384,   397,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
+	{      WWT_PANEL,   RESIZE_RTB,     14,   372,   373,    76,    99, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
+	{ WWT_PUSHIMGBTN,   RESIZE_LRTB,    14,   372,   385,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
 
-	{      WWT_PANEL,   RESIZE_RTB,     14,   397,   396,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
-
-	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   398,   409,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
+	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
 	{   WIDGETS_END},
 };
 
 static const WindowDesc _orders_desc = {
-	WDP_AUTO, WDP_AUTO, 410, 88, 410, 88,
+	WDP_AUTO, WDP_AUTO, 386, 100, 386, 100,
 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
 	_orders_widgets,
@@ -821,32 +866,32 @@
  */
 static const Widget _other_orders_widgets[] = {
 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,           STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
-	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   331,     0,    13, STR_A00B_ORDERS,    STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
-	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   271,   331,     0,    13, STR_TIMETABLE_VIEW, STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
-
-	{      WWT_PANEL,   RESIZE_RB,      14,     0,   319,    14,    75, 0x0,                STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
-
-	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   320,   331,    14,    75, 0x0,                STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
+	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   385,     0,    13, STR_8829_ORDERS,    STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
+	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   325,   385,     0,    13, STR_TIMETABLE_VIEW, STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
 
-	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SKIP
-	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_DELETE
-	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_NON_STOP
-	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_GOTO
-	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
-	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD
-	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_REFIT
-	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_TRANSFER
+	{      WWT_PANEL,   RESIZE_RB,      14,     0,   373,    14,    75, 0x0,                STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
 
-	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SHARED_ORDER_LIST
+	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   374,   385,    14,    75, 0x0,                STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
 
-	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SKIP
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_DELETE
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_NON_STOP
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_GOTO
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_FULL_LOAD
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_REFIT
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_TRANSFER
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SERVICE
 
-	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   320,   331,    76,    87, 0x0,                STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
+	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   373,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
+	{      WWT_EMPTY,   RESIZE_TB,      14,     0,     0,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SHARED_ORDER_LIST
+
+	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   374,   385,    88,    99, 0x0,                STR_RESIZE_BUTTON},              // ORDER_WIDGET_RESIZE
 	{   WIDGETS_END},
 };
 
 static const WindowDesc _other_orders_desc = {
-	WDP_AUTO, WDP_AUTO, 332, 88, 332, 88,
+	WDP_AUTO, WDP_AUTO, 386, 88, 386, 88,
 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
 	_other_orders_widgets,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/order_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,106 @@
+/* $Id$ */
+
+/** @file order_type.h Types related to orders. */
+
+#ifndef ORDER_TYPE_H
+#define ORDER_TYPE_H
+
+#include "core/enum_type.hpp"
+
+typedef byte VehicleOrderID;  ///< The index of an order within its current vehicle (not pool related)
+typedef uint16 OrderID;
+typedef uint16 DestinationID;
+
+enum {
+	INVALID_VEH_ORDER_ID = 0xFF,
+};
+
+static const OrderID INVALID_ORDER = 0xFFFF;
+
+/* Order types */
+enum OrderType {
+	OT_BEGIN         = 0,
+	OT_NOTHING       = 0,
+	OT_GOTO_STATION  = 1,
+	OT_GOTO_DEPOT    = 2,
+	OT_LOADING       = 3,
+	OT_LEAVESTATION  = 4,
+	OT_DUMMY         = 5,
+	OT_GOTO_WAYPOINT = 6,
+	OT_END
+};
+
+/* It needs to be 8bits, because we save and load it as such */
+/** Define basic enum properties */
+template <> struct EnumPropsT<OrderType> : MakeEnumPropsT<OrderType, byte, OT_BEGIN, OT_END, OT_END> {};
+typedef TinyEnumT<OrderType> OrderTypeByte;
+
+
+/**
+ * Flags related to the unloading order.
+ */
+enum OrderUnloadFlags {
+	OUF_UNLOAD_IF_POSSIBLE = 0,      ///< Unload all cargo that the station accepts.
+	OUFB_TRANSFER          = 1 << 0, ///< Transfer all cargo onto the platform.
+	OUFB_UNLOAD            = 1 << 1, ///< Force unloading all cargo onto the platform, possibly not getting paid.
+	OUFB_NO_UNLOAD         = 1 << 2, ///< Totally no unloading will be done.
+};
+
+/**
+ * Flags related to the loading order.
+ */
+enum OrderLoadFlags {
+	OLF_LOAD_IF_POSSIBLE = 0,      ///< Load as long as there is cargo that fits in the train.
+	OLFB_FULL_LOAD       = 1 << 2, ///< Full load the complete the consist.
+	OLF_FULL_LOAD_ANY    = 5,      ///< Full load the a single cargo of the consist.
+};
+
+/**
+ * Non-stop order flags.
+ */
+enum OrderNonStopFlags {
+	ONSF_STOP_EVERYWHERE                  = 0, ///< The vehicle will stop at any station it passes and the destination.
+	ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS = 1, ///< The vehicle will not stop at any stations it passes except the destination.
+	ONSF_NO_STOP_AT_DESTINATION_STATION   = 2, ///< The vehicle will stop at any station it passes except the destination.
+	ONSF_NO_STOP_AT_ANY_STATION           = 3, ///< The vehicle will not stop at any stations it passes including the destination.
+	ONSF_END
+};
+
+/**
+ * Reasons that could cause us to go to the depot.
+ */
+enum OrderDepotTypeFlags {
+	ODTF_MANUAL          = 0,      ///< The player initiated this order manually.
+	ODTFB_SERVICE        = 1 << 2, ///< This depot order is because of the servicing limit.
+	ODTFB_PART_OF_ORDERS = 1 << 1, ///< This depot order is because of a regular order.
+};
+
+/**
+ * Actions that can be performed when the vehicle enters the depot.
+ */
+enum OrderDepotActionFlags {
+	ODATF_SERVICE_ONLY   = 0,      ///< Only service the vehicle.
+	ODATFB_HALT          = 1 << 2, ///< Service the vehicle and then halt it.
+};
+
+/**
+ * Enumeration for the data to set in CmdModifyOrder.
+ */
+enum ModifyOrderFlags {
+	MOF_NON_STOP,      ///< Passes a OrderNonStopFlags.
+	MOF_UNLOAD,        ///< Passes an OrderUnloadType.
+	MOF_LOAD,          ///< Passes an OrderLoadType
+	MOF_DEPOT_ACTION,  ///< Toggle the 'service' if needed flag.
+};
+
+
+/* Possible clone options */
+enum {
+	CO_SHARE   = 0,
+	CO_COPY    = 1,
+	CO_UNSHARE = 2
+};
+
+struct Order;
+
+#endif /* ORDER_TYPE_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/osk_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,370 @@
+/* $Id$ */
+
+/** @file osk_gui.cpp The On Screen Keyboard GUI */
+
+#include "stdafx.h"
+#include "openttd.h"
+
+#include "textbuf_gui.h"
+#include "window_gui.h"
+#include "string_func.h"
+#include "strings_func.h"
+#include "debug.h"
+#include "window_func.h"
+#include "gfx_func.h"
+
+#include "table/sprites.h"
+#include "table/strings.h"
+
+struct osk_d {
+	querystr_d *qs; // text-input
+	int text_btn;   // widget number of parent's text field
+	int ok_btn;     // widget number of parent's ok button (=0 when ok shouldn't be passed on)
+	int cancel_btn; // widget number of parent's cancel button (=0 when cancel shouldn't be passed on; text will be reverted to original)
+	Textbuf *text;  // pointer to parent's textbuffer (to update caret position)
+	char *orig;     // the original text, in case we cancel
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(osk_d));
+
+enum OskWidgets {
+	OSK_WIDGET_TEXT = 3,
+	OSK_WIDGET_CANCEL = 5,
+	OSK_WIDGET_OK,
+	OSK_WIDGET_BACKSPACE,
+	OSK_WIDGET_SPECIAL,
+	OSK_WIDGET_CAPS,
+	OSK_WIDGET_SHIFT,
+	OSK_WIDGET_SPACE,
+	OSK_WIDGET_LEFT,
+	OSK_WIDGET_RIGHT,
+	OSK_WIDGET_LETTERS
+};
+
+char _keyboard_opt[2][OSK_KEYBOARD_ENTRIES * 4 + 1];
+static WChar _keyboard[2][OSK_KEYBOARD_ENTRIES];
+
+enum {
+	KEYS_NONE,
+	KEYS_SHIFT,
+	KEYS_CAPS
+};
+static byte _keystate = KEYS_NONE;
+
+/*
+ * Only show valid characters; do not show characters that would
+ * only insert a space when we have a spacebar to do that or
+ * characters that are not allowed to be entered.
+ */
+static void ChangeOskDiabledState(Window *w, const querystr_d *qs, bool shift)
+{
+	for (uint i = 0; i < OSK_KEYBOARD_ENTRIES; i++) {
+		w->SetWidgetDisabledState(OSK_WIDGET_LETTERS + i,
+				!IsValidChar(_keyboard[shift][i], qs->afilter) || _keyboard[shift][i] == ' ');
+	}
+	w->SetWidgetDisabledState(OSK_WIDGET_SPACE, !IsValidChar(' ', qs->afilter));
+}
+
+/* on screen keyboard */
+static void OskWndProc(Window *w, WindowEvent *e)
+{
+	querystr_d *qs = WP(w, osk_d).qs;
+
+	switch (e->event) {
+		case WE_CREATE:
+			SetBit(_no_scroll, SCROLL_EDIT);
+			/* Not needed by default. */
+			w->DisableWidget(OSK_WIDGET_SPECIAL);
+			break;
+
+		case WE_PAINT: {
+			bool shift = HasBit(_keystate, KEYS_CAPS) ^ HasBit(_keystate, KEYS_SHIFT);
+
+			w->LowerWidget(OSK_WIDGET_TEXT);
+			w->SetWidgetLoweredState(OSK_WIDGET_SHIFT, HasBit(_keystate, KEYS_SHIFT));
+			w->SetWidgetLoweredState(OSK_WIDGET_CAPS, HasBit(_keystate, KEYS_CAPS));
+
+			ChangeOskDiabledState(w, qs, shift);
+
+			SetDParam(0, qs->caption);
+			DrawWindowWidgets(w);
+
+			for (uint i = 0; i < OSK_KEYBOARD_ENTRIES; i++) {
+				DrawCharCentered(_keyboard[shift][i],
+					w->widget[OSK_WIDGET_LETTERS + i].left + 8,
+					w->widget[OSK_WIDGET_LETTERS + i].top + 3,
+					TC_BLACK);
+			}
+
+			DrawEditBox(w, qs, OSK_WIDGET_TEXT);
+			break;
+		}
+
+		case WE_CLICK:
+			/* clicked a letter */
+			if (e->we.click.widget >= OSK_WIDGET_LETTERS) {
+				bool shift = HasBit(_keystate, KEYS_CAPS) ^ HasBit(_keystate, KEYS_SHIFT);
+
+				WChar c = _keyboard[shift][e->we.click.widget - OSK_WIDGET_LETTERS];
+
+				if (!IsValidChar(c, qs->afilter)) break;
+
+				if (InsertTextBufferChar(&qs->text, c)) w->InvalidateWidget(OSK_WIDGET_TEXT);
+
+				if (HasBit(_keystate, KEYS_SHIFT)) {
+					ToggleBit(_keystate, KEYS_SHIFT);
+					w->widget[OSK_WIDGET_SHIFT].color = HasBit(_keystate, KEYS_SHIFT) ? 15 : 14;
+					SetWindowDirty(w);
+				}
+				break;
+			}
+
+			switch (e->we.click.widget) {
+				case OSK_WIDGET_BACKSPACE:
+					if (DeleteTextBufferChar(&qs->text, WKC_BACKSPACE)) w->InvalidateWidget(OSK_WIDGET_TEXT);
+					break;
+
+				case OSK_WIDGET_SPECIAL:
+					/*
+					 * Anything device specific can go here.
+					 * The button itself is hidden by default, and when you need it you
+					 * can not hide it in the create event.
+					 */
+					break;
+
+				case OSK_WIDGET_CAPS:
+					ToggleBit(_keystate, KEYS_CAPS);
+					SetWindowDirty(w);
+					break;
+
+				case OSK_WIDGET_SHIFT:
+					ToggleBit(_keystate, KEYS_SHIFT);
+					SetWindowDirty(w);
+					break;
+
+				case OSK_WIDGET_SPACE:
+					if (InsertTextBufferChar(&qs->text, ' ')) w->InvalidateWidget(OSK_WIDGET_TEXT);
+					break;
+
+				case OSK_WIDGET_LEFT:
+					if (MoveTextBufferPos(&qs->text, WKC_LEFT)) w->InvalidateWidget(OSK_WIDGET_TEXT);
+					break;
+
+				case OSK_WIDGET_RIGHT:
+					if (MoveTextBufferPos(&qs->text, WKC_RIGHT)) w->InvalidateWidget(OSK_WIDGET_TEXT);
+					break;
+
+				case OSK_WIDGET_OK:
+					if (qs->orig == NULL || strcmp(qs->text.buf, qs->orig) != 0) {
+						/* pass information by simulating a button press on parent window */
+						if (WP(w, osk_d).ok_btn != 0) {
+							Window *parent = w->parent;
+							WindowEvent e;
+							e.event = WE_CLICK;
+							e.we.click.widget = WP(w, osk_d).ok_btn;
+							parent->wndproc(parent, &e);
+						}
+					}
+					DeleteWindow(w);
+					break;
+
+				case OSK_WIDGET_CANCEL:
+					if (WP(w, osk_d).cancel_btn != 0) { // pass a cancel event to the parent window
+						Window *parent = w->parent;
+						WindowEvent e;
+						e.event = WE_CLICK;
+						e.we.click.widget = WP(w, osk_d).cancel_btn;
+						parent->wndproc(parent, &e);
+					} else { // or reset to original string
+						strcpy(qs->text.buf, WP(w, osk_d).orig);
+						UpdateTextBufferSize(&qs->text);
+						MoveTextBufferPos(&qs->text, WKC_END);
+					}
+					DeleteWindow(w);
+					break;
+			}
+			/* make sure that the parent window's textbox also gets updated */
+			if (w->parent != NULL) w->parent->InvalidateWidget(WP(w, osk_d).text_btn);
+			break;
+
+		case WE_MOUSELOOP:
+			HandleEditBox(w, qs, OSK_WIDGET_TEXT);
+			/* make the caret of the parent window also blink */
+			w->parent->InvalidateWidget(WP(w, osk_d).text_btn);
+			break;
+	}
+}
+
+static const Widget _osk_widgets[] = {
+{      WWT_EMPTY, RESIZE_NONE,     0,     0,     0,     0,     0, 0x0,               STR_NULL},
+{    WWT_CAPTION, RESIZE_NONE,    14,     0,   255,     0,    13, STR_012D,          STR_NULL},
+{      WWT_PANEL, RESIZE_NONE,    14,     0,   255,    14,    29, 0x0,               STR_NULL},
+{    WWT_EDITBOX, RESIZE_NONE,    14,     2,   253,    16,    27, 0x0,               STR_NULL},
+
+{      WWT_PANEL, RESIZE_NONE,    14,     0,   255,    30,   139, 0x0,               STR_NULL},
+
+{    WWT_TEXTBTN, RESIZE_NONE,    14,     3,   108,    35,    46, STR_012E_CANCEL,   STR_NULL},
+{    WWT_TEXTBTN, RESIZE_NONE,    14,   111,   216,    35,    46, STR_012F_OK,       STR_NULL},
+{ WWT_PUSHIMGBTN, RESIZE_NONE,    14,   219,   252,    35,    46, SPR_OSK_BACKSPACE, STR_NULL},
+
+{ WWT_PUSHIMGBTN, RESIZE_NONE,    14,     3,    27,    67,    82, SPR_OSK_SPECIAL,   STR_NULL},
+{     WWT_IMGBTN, RESIZE_NONE,    14,     3,    36,    85,   100, SPR_OSK_CAPS,      STR_NULL},
+{     WWT_IMGBTN, RESIZE_NONE,    14,     3,    27,   103,   118, SPR_OSK_SHIFT,     STR_NULL},
+
+{ WWT_PUSHTXTBTN, RESIZE_NONE,    14,    75,   189,   121,   136, STR_EMPTY,         STR_NULL},
+
+{ WWT_PUSHIMGBTN, RESIZE_NONE,    14,   219,   234,   121,   136, SPR_OSK_LEFT,      STR_NULL},
+{ WWT_PUSHIMGBTN, RESIZE_NONE,    14,   237,   252,   121,   136, SPR_OSK_RIGHT,     STR_NULL},
+
+{    WWT_PUSHBTN, RESIZE_NONE,    14,     3,    18,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    21,    36,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    39,    54,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    57,    72,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    75,    90,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    93,   108,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   111,   126,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   129,   144,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   147,   162,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   165,   180,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   183,   198,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   201,   216,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   219,   234,    49,    64, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   237,   252,    49,    64, 0x0,    STR_NULL},
+
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    30,    45,    67,    82, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    48,    63,    67,    82, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    66,    81,    67,    82, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    84,    99,    67,    82, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   102,   117,    67,    82, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   120,   135,    67,    82, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   138,   153,    67,    82, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   156,   171,    67,    82, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   174,   189,    67,    82, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   192,   207,    67,    82, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   210,   225,    67,    82, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   228,   243,    67,    82, 0x0,    STR_NULL},
+
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    39,    54,    85,   100, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    57,    72,    85,   100, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    75,    90,    85,   100, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    93,   108,    85,   100, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   111,   126,    85,   100, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   129,   144,    85,   100, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   147,   162,    85,   100, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   165,   180,    85,   100, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   183,   198,    85,   100, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   201,   216,    85,   100, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   219,   234,    85,   100, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   237,   252,    85,   100, 0x0,    STR_NULL},
+
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    30,    45,   103,   118, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    48,    63,   103,   118, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    66,    81,   103,   118, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,    84,    99,   103,   118, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   102,   117,   103,   118, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   120,   135,   103,   118, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   138,   153,   103,   118, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   156,   171,   103,   118, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   174,   189,   103,   118, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   192,   207,   103,   118, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   210,   225,   103,   118, 0x0,    STR_NULL},
+{    WWT_PUSHBTN, RESIZE_NONE,    14,   228,   243,   103,   118, 0x0,    STR_NULL},
+
+{   WIDGETS_END},
+};
+
+WindowDesc _osk_desc = {
+	WDP_CENTER, WDP_CENTER, 256, 140, 256, 140,
+	WC_OSK, WC_NONE,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
+	_osk_widgets,
+	OskWndProc
+};
+
+/**
+ * Retrieve keyboard layout from language string or (if set) config file.
+ * Also check for invalid characters.
+ */
+void GetKeyboardLayout()
+{
+	char keyboard[2][OSK_KEYBOARD_ENTRIES * 4 + 1];
+	char errormark[2][OSK_KEYBOARD_ENTRIES + 1]; // used for marking invalid chars
+	bool has_error = false; // true when an invalid char is detected
+
+	if (StrEmpty(_keyboard_opt[0])) {
+		GetString(keyboard[0], STR_OSK_KEYBOARD_LAYOUT, lastof(keyboard[0]));
+	} else {
+		strncpy(keyboard[0], _keyboard_opt[0], lengthof(keyboard[0]));
+	}
+
+	if (StrEmpty(_keyboard_opt[1])) {
+		GetString(keyboard[1], STR_OSK_KEYBOARD_LAYOUT_CAPS, lastof(keyboard[1]));
+	} else {
+		strncpy(keyboard[1], _keyboard_opt[1], lengthof(keyboard[1]));
+	}
+
+	for (uint j = 0; j < 2; j++) {
+		const char *kbd = keyboard[j];
+		bool ended = false;
+		for (uint i = 0; i < OSK_KEYBOARD_ENTRIES; i++) {
+			_keyboard[j][i] = Utf8Consume(&kbd);
+
+			/* Be lenient when the last characters are missing (is quite normal) */
+			if (_keyboard[j][i] == '\0' || ended) {
+				ended = true;
+				_keyboard[j][i] = ' ';
+				continue;
+			}
+
+			if (IsPrintable(_keyboard[j][i])) {
+				errormark[j][i] = ' ';
+			} else {
+				has_error = true;
+				errormark[j][i] = '^';
+				_keyboard[j][i] = ' ';
+			}
+		}
+	}
+
+	if (has_error) {
+		ShowInfoF("The keyboard layout you selected contains invalid chars. Please check those chars marked with ^.");
+		ShowInfoF("Normal keyboard:  %s", keyboard[0]);
+		ShowInfoF("                  %s", errormark[0]);
+		ShowInfoF("Caps Lock:        %s", keyboard[1]);
+		ShowInfoF("                  %s", errormark[1]);
+	}
+}
+
+/**
+ * Show the osk associated with a given textbox
+ * @param parent pointer to the Window where this keyboard originated from
+ * @param q      querystr_d pointer to the query string of the parent, which is
+ *               shared for both windows
+ * @param button widget number of parent's textbox
+ * @param cancel widget number of parent's cancel button (0 if cancel events
+ *               should not be passed)
+ * @param ok     widget number of parent's ok button  (0 if ok events should not
+ *               be passed)
+ */
+void ShowOnScreenKeyboard(Window *parent, querystr_d *q, int button, int cancel, int ok)
+{
+	DeleteWindowById(WC_OSK, 0);
+
+	Window *w = AllocateWindowDesc(&_osk_desc);
+
+	w->parent = parent;
+	assert(parent != NULL);
+
+	if (parent->widget[button].data != 0) q->caption = parent->widget[button].data;
+
+	WP(w, osk_d).qs         = q;
+	WP(w, osk_d).text_btn   = button;
+	WP(w, osk_d).cancel_btn = cancel;
+	WP(w, osk_d).ok_btn     = ok;
+	WP(w, osk_d).text       = &q->text;
+
+	GetKeyboardLayout();
+
+	/* make a copy in case we need to reset later */
+	strcpy(_orig_str_buf, WP(w, osk_d).qs->text.buf);
+	WP(w, osk_d).orig = _orig_str_buf;
+}
--- a/src/ottdres.rc.in	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/ottdres.rc.in	Tue Apr 15 00:47:19 2008 +0000
@@ -1,12 +1,11 @@
 //Microsoft Developer Studio generated resource script.
 // $Id$
 //
-#define APSTUDIO_READONLY_SYMBOLS
 /////////////////////////////////////////////////////////////////////////////
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "resource.h"
+#define APSTUDIO_READONLY_SYMBOLS
 #define APSTUDIO_HIDDEN_SYMBOLS
 #include "windows.h"
 #undef APSTUDIO_HIDDEN_SYMBOLS
@@ -87,7 +86,7 @@
             VALUE "FileDescription", "OpenTTD\0"
             VALUE "FileVersion", "Development @@VERSION@@\0"
             VALUE "InternalName", "openttd\0"
-            VALUE "LegalCopyright", "Copyright © OpenTTD Developers 2002-2007. All Rights Reserved.\0"
+            VALUE "LegalCopyright", "Copyright © OpenTTD Developers 2002-2008. All Rights Reserved.\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "openttd.exe\0"
             VALUE "PrivateBuild", "\0"
--- a/src/pathfind.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/pathfind.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -17,6 +17,7 @@
 #include "depot.h"
 #include "tunnelbridge_map.h"
 #include "core/random_func.hpp"
+#include "core/alloc_func.hpp"
 #include "tunnelbridge.h"
 
 /* remember which tiles we have already visited so we don't visit them again. */
@@ -111,34 +112,7 @@
 	return true;
 }
 
-static const byte _bits_mask[4] = {
-	0x19,
-	0x16,
-	0x25,
-	0x2A,
-};
-
-static const DiagDirection _tpf_new_direction[14] = {
-	DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE,
-	INVALID_DIAGDIR, INVALID_DIAGDIR,
-	DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE,
-};
-
-static const DiagDirection _tpf_prev_direction[14] = {
-	DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW,
-	INVALID_DIAGDIR, INVALID_DIAGDIR,
-	DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE, DIAGDIR_NW,
-};
-
-
-static const byte _otherdir_mask[4] = {
-	0x10,
-	0,
-	0x5,
-	0x2A,
-};
-
-static void TPFMode2(TrackPathFinder* tpf, TileIndex tile, DiagDirection direction)
+static void TPFModeShip(TrackPathFinder* tpf, TileIndex tile, DiagDirection direction)
 {
 	RememberData rd;
 
@@ -152,8 +126,7 @@
 	if (++tpf->rd.cur_length > 50)
 		return;
 
-	TrackStatus ts = GetTileTrackStatus(tile, tpf->tracktype, tpf->sub_type);
-	TrackBits bits = (TrackBits)(TrackStatusToTrackBits(ts) & _bits_mask[direction]);
+	TrackBits bits = TrackStatusToTrackBits(GetTileTrackStatus(tile, tpf->tracktype, tpf->sub_type)) & DiagdirReachesTracks(direction);
 	if (bits == TRACK_BIT_NONE) return;
 
 	assert(TileX(tile) != MapMaxX() && TileY(tile) != MapMaxY());
@@ -173,10 +146,10 @@
 			tpf->rd.last_choosen_track = track;
 		}
 
-		tpf->the_dir = (Trackdir)(track + (HasBit(_otherdir_mask[direction], track) ? 8 : 0));
+		tpf->the_dir = TrackEnterdirToTrackdir(track, direction);
 
 		if (!tpf->enum_proc(tile, tpf->userdata, tpf->the_dir, tpf->rd.cur_length)) {
-			TPFMode2(tpf, tile, _tpf_new_direction[tpf->the_dir]);
+			TPFModeShip(tpf, tile, TrackdirToExitdir(tpf->the_dir));
 		}
 
 		tpf->rd = rd;
@@ -208,9 +181,7 @@
 	return true;
 }
 
-static const uint16 _tpfmode1_and[4] = { 0x1009, 0x16, 0x520, 0x2A00 };
-
-static void TPFMode1(TrackPathFinder* tpf, TileIndex tile, DiagDirection direction)
+static void TPFModeNormal(TrackPathFinder* tpf, TileIndex tile, DiagDirection direction)
 {
 	const TileIndex tile_org = tile;
 
@@ -252,78 +223,70 @@
 		}
 	}
 
-	uint32 bits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, tpf->tracktype, tpf->sub_type));
+	TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, tpf->tracktype, tpf->sub_type));
 
 	/* Check in case of rail if the owner is the same */
 	if (tpf->tracktype == TRANSPORT_RAIL) {
-		if (bits != 0 && TrackStatusToTrackdirBits(GetTileTrackStatus(tile_org, TRANSPORT_RAIL, 0)) != TRACKDIR_BIT_NONE) {
+		if (trackdirbits != TRACKDIR_BIT_NONE && TrackStatusToTrackdirBits(GetTileTrackStatus(tile_org, TRANSPORT_RAIL, 0)) != TRACKDIR_BIT_NONE) {
 			if (GetTileOwner(tile_org) != GetTileOwner(tile)) return;
 		}
 	}
 
 	tpf->rd.cur_length++;
 
-	if ((byte)bits != tpf->var2) {
-		bits &= _tpfmode1_and[direction];
-		bits |= bits >> 8;
-	}
-	bits &= 0xBF;
+	trackdirbits &= DiagdirReachesTrackdirs(direction);
+	TrackBits bits = TrackdirBitsToTrackBits(trackdirbits);
 
-	if (bits != 0) {
+	if (bits != TRACK_BIT_NONE) {
 		if (!tpf->disable_tile_hash || (tpf->rd.cur_length <= 64 && (KillFirstBit(bits) == 0 || ++tpf->rd.depth <= 7))) {
 			do {
-				int i = FIND_FIRST_BIT(bits);
-				bits = KillFirstBit(bits);
+				Track track = RemoveFirstTrack(&bits);
 
-				tpf->the_dir = (Trackdir)((_otherdir_mask[direction] & (byte)(1 << i)) ? (i + 8) : i);
+				tpf->the_dir = TrackEnterdirToTrackdir(track, direction);
 				RememberData rd = tpf->rd;
 
 				/* make sure we are not leaving from invalid side */
 				if (TPFSetTileBit(tpf, tile, tpf->the_dir) && CanAccessTileInDir(tile, TrackdirToExitdir(tpf->the_dir), tpf->tracktype) &&
 						!tpf->enum_proc(tile, tpf->userdata, tpf->the_dir, tpf->rd.cur_length) ) {
-					TPFMode1(tpf, tile, _tpf_new_direction[tpf->the_dir]);
+					TPFModeNormal(tpf, tile, TrackdirToExitdir(tpf->the_dir));
 				}
 				tpf->rd = rd;
-			} while (bits != 0);
+			} while (bits != TRACK_BIT_NONE);
 		}
 	}
 }
 
-void FollowTrack(TileIndex tile, uint16 flags, uint sub_type, DiagDirection direction, TPFEnumProc *enum_proc, TPFAfterProc *after_proc, void *data)
+void FollowTrack(TileIndex tile, PathfindFlags flags, TransportType tt, uint sub_type, DiagDirection direction, TPFEnumProc *enum_proc, TPFAfterProc *after_proc, void *data)
 {
-	TrackPathFinder tpf;
+	assert(IsValidDiagDirection(direction));
 
-	assert(direction < 4);
+	SmallStackSafeStackAlloc<TrackPathFinder, 1> tpf;
 
 	/* initialize path finder variables */
-	tpf.userdata = data;
-	tpf.enum_proc = enum_proc;
-	tpf.new_link = tpf.links;
-	tpf.num_links_left = lengthof(tpf.links);
-
-	tpf.rd.cur_length = 0;
-	tpf.rd.depth = 0;
-	tpf.rd.last_choosen_track = INVALID_TRACK;
+	tpf->userdata = data;
+	tpf->enum_proc = enum_proc;
+	tpf->new_link = tpf->links;
+	tpf->num_links_left = lengthof(tpf->links);
 
-	tpf.var2 = HasBit(flags, 15) ? 0x43 : 0xFF; // 0x8000
-
-	tpf.disable_tile_hash = HasBit(flags, 12);  // 0x1000
-
+	tpf->rd.cur_length = 0;
+	tpf->rd.depth = 0;
+	tpf->rd.last_choosen_track = INVALID_TRACK;
 
-	tpf.tracktype = (TransportType)(flags & 0xFF);
-	tpf.sub_type = sub_type;
+	tpf->disable_tile_hash = (flags & PATHFIND_FLAGS_DISABLE_TILE_HASH) != 0;
 
-	if (HasBit(flags, 11)) {
-		tpf.enum_proc(tile, data, INVALID_TRACKDIR, 0);
-		TPFMode2(&tpf, tile, direction);
+	tpf->tracktype = tt;
+	tpf->sub_type = sub_type;
+
+	if ((flags & PATHFIND_FLAGS_SHIP_MODE) != 0) {
+		tpf->enum_proc(tile, data, INVALID_TRACKDIR, 0);
+		TPFModeShip(tpf, tile, direction);
 	} else {
 		/* clear the hash_heads */
-		memset(tpf.hash_head, 0, sizeof(tpf.hash_head));
-		TPFMode1(&tpf, tile, direction);
+		memset(tpf->hash_head, 0, sizeof(tpf->hash_head));
+		TPFModeNormal(tpf, tile, direction);
 	}
 
-	if (after_proc != NULL)
-		after_proc(&tpf);
+	if (after_proc != NULL) after_proc(tpf);
 }
 
 struct StackedItem {
@@ -336,15 +299,6 @@
 	byte first_track;
 };
 
-static const Trackdir _new_trackdir[6][4] = {
-{TRACKDIR_X_NE,    INVALID_TRACKDIR, TRACKDIR_X_SW,    INVALID_TRACKDIR,},
-{INVALID_TRACKDIR, TRACKDIR_Y_SE,    INVALID_TRACKDIR, TRACKDIR_Y_NW,},
-{INVALID_TRACKDIR, TRACKDIR_UPPER_E, TRACKDIR_UPPER_W, INVALID_TRACKDIR,},
-{TRACKDIR_LOWER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_W,},
-{TRACKDIR_LEFT_N,  TRACKDIR_LEFT_S,  INVALID_TRACKDIR, INVALID_TRACKDIR,},
-{INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_RIGHT_S, TRACKDIR_RIGHT_N,},
-};
-
 struct HashLink {
 	TileIndex tile;
 	uint16 typelength;
@@ -595,7 +549,7 @@
 
 			HeapifyDown(tpf);
 			/* Make sure we havn't already visited this tile. */
-		} while (!NtpCheck(tpf, tile, _tpf_prev_direction[si.track], si.cur_length));
+		} while (!NtpCheck(tpf, tile, ReverseDiagDir(TrackdirToExitdir(ReverseTrackdir(si.track))), si.cur_length));
 
 		/* Add the length of this track. */
 		si.cur_length += _length_of_track[si.track];
@@ -605,7 +559,7 @@
 			return;
 
 		assert(si.track <= 13);
-		direction = _tpf_new_direction[si.track];
+		direction = TrackdirToExitdir(si.track);
 
 start_at:
 		/* If the tile is the entry tile of a tunnel, and we're not going out of the tunnel,
@@ -649,8 +603,7 @@
 			if (!IsTileType(tile, MP_RAILWAY) || !IsPlainRailTile(tile)) {
 				/* We found a tile which is not a normal railway tile.
 				 * Determine which tracks that exist on this tile. */
-				TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & _tpfmode1_and[direction];
-				bits = TrackStatusToTrackBits(ts);
+				bits = TrackdirBitsToTrackBits(TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTrackdirs(direction));
 
 				/* Check that the tile contains exactly one track */
 				if (bits == 0 || KillFirstBit(bits) != 0) break;
@@ -666,7 +619,7 @@
 				 *   bits - bitmask of which track that exist on the tile (exactly one bit is set)
 				 *   direction - which direction are we moving in?
 				 *******************/
-				si.track = _new_trackdir[FIND_FIRST_BIT(bits)][direction];
+				si.track = TrackEnterdirToTrackdir(FindFirstTrack(bits), direction);
 				si.cur_length += _length_of_track[si.track];
 				goto callback_and_continue;
 			}
@@ -689,7 +642,7 @@
 			/* If we reach here, the tile has exactly one track, and this
 			 track is reachable = > Rail segment continues */
 
-			track = _new_trackdir[FIND_FIRST_BIT(bits)][direction];
+			track = TrackEnterdirToTrackdir(FindFirstTrack(bits), direction);
 			assert(track != INVALID_TRACKDIR);
 
 			si.cur_length += _length_of_track[track];
@@ -738,7 +691,7 @@
 			}
 
 			/* continue with the next track */
-			direction = _tpf_new_direction[track];
+			direction = TrackdirToExitdir(track);
 
 			/* safety check if we're running around chasing our tail... (infinite loop) */
 			if (tile == tile_org) {
@@ -779,7 +732,7 @@
 		si.tile = tile;
 		while (bits != TRACK_BIT_NONE) {
 			Track track = RemoveFirstTrack(&bits);
-			si.track = _new_trackdir[track][direction];
+			si.track = TrackEnterdirToTrackdir(track, direction);
 			assert(si.track != 0xFF);
 			si.priority = si.cur_length + estimation;
 
@@ -820,18 +773,18 @@
 /** new pathfinder for trains. better and faster. */
 void NewTrainPathfind(TileIndex tile, TileIndex dest, RailTypes railtypes, DiagDirection direction, NTPEnumProc* enum_proc, void* data)
 {
-	NewTrackPathFinder tpf;
+	SmallStackSafeStackAlloc<NewTrackPathFinder, 1> tpf;
 
-	tpf.dest = dest;
-	tpf.userdata = data;
-	tpf.enum_proc = enum_proc;
-	tpf.tracktype = TRANSPORT_RAIL;
-	tpf.railtypes = railtypes;
-	tpf.maxlength = min(_patches.pf_maxlength * 3, 10000);
-	tpf.nstack = 0;
-	tpf.new_link = tpf.links;
-	tpf.num_links_left = lengthof(tpf.links);
-	memset(tpf.hash_head, 0, sizeof(tpf.hash_head));
+	tpf->dest = dest;
+	tpf->userdata = data;
+	tpf->enum_proc = enum_proc;
+	tpf->tracktype = TRANSPORT_RAIL;
+	tpf->railtypes = railtypes;
+	tpf->maxlength = min(_patches.pf_maxlength * 3, 10000);
+	tpf->nstack = 0;
+	tpf->new_link = tpf->links;
+	tpf->num_links_left = lengthof(tpf->links);
+	memset(tpf->hash_head, 0, sizeof(tpf->hash_head));
 
-	NTPEnum(&tpf, tile, direction);
+	NTPEnum(tpf, tile, direction);
 }
--- a/src/pathfind.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/pathfind.h	Tue Apr 15 00:47:19 2008 +0000
@@ -58,7 +58,6 @@
 	TransportType tracktype;
 	uint sub_type;
 
-	byte var2;
 	bool disable_tile_hash;
 
 	uint16 hash_head[0x400];
@@ -67,7 +66,15 @@
 	TrackPathFinderLink links[0x400]; ///< hopefully, this is enough.
 };
 
-void FollowTrack(TileIndex tile, uint16 flags, uint sub_type, DiagDirection direction, TPFEnumProc* enum_proc, TPFAfterProc* after_proc, void* data);
+/** Some flags to modify the behaviour of original pathfinder */
+enum PathfindFlags {
+	PATHFIND_FLAGS_NONE              = 0,
+	PATHFIND_FLAGS_SHIP_MODE         = 0x0800, ///< pathfinder with some optimizations for ships, but does not work for other types.
+	PATHFIND_FLAGS_DISABLE_TILE_HASH = 0x1000, ///< do not check for searching in circles
+};
+DECLARE_ENUM_AS_BIT_SET(PathfindFlags)
+
+void FollowTrack(TileIndex tile, PathfindFlags flags, TransportType tt, uint sub_type, DiagDirection direction, TPFEnumProc* enum_proc, TPFAfterProc* after_proc, void* data);
 void NewTrainPathfind(TileIndex tile, TileIndex dest, RailTypes railtypes, DiagDirection direction, NTPEnumProc* enum_proc, void* data);
 
 #endif /* PATHFIND_H */
--- a/src/player_base.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/player_base.h	Tue Apr 15 00:47:19 2008 +0000
@@ -8,7 +8,7 @@
 #include "road_type.h"
 #include "rail_type.h"
 #include "date_type.h"
-#include "engine.h"
+#include "engine_type.h"
 #include "livery.h"
 #include "autoreplace_type.h"
 #include "economy_type.h"
--- a/src/player_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/player_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -40,8 +40,12 @@
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(facesel_d));
 
-static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied);
-static void DoSelectPlayerFace(PlayerID player, bool show_big);
+enum {
+	FIRST_GUI_CALL = INT_MAX,  ///< default value to specify thuis is the first call of the resizable gui
+};
+
+static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied, int top = FIRST_GUI_CALL, int left = FIRST_GUI_CALL);
+static void DoSelectPlayerFace(PlayerID player, bool show_big, int top =  FIRST_GUI_CALL, int left = FIRST_GUI_CALL);
 
 static void DrawPlayerEconomyStats(const Player *p, byte mode)
 {
@@ -153,55 +157,60 @@
 static void PlayerFinancesWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_PAINT: {
-		PlayerID player = (PlayerID)w->window_number;
-		const Player *p = GetPlayer(player);
-
-		/* Recheck the size of the window as it might need to be resized due to the local player changing */
-		int new_height = ((player != _local_player) ? 0 : 12) + ((WP(w, def_d).data_1 != 0) ? 48 : 204);
-		if (w->height != new_height) {
-			/* Make window dirty before and after resizing */
-			SetWindowDirty(w);
-			w->height = new_height;
-			SetWindowDirty(w);
-
-			w->SetWidgetHiddenState(PFW_WIDGET_INCREASE_LOAN, player != _local_player);
-			w->SetWidgetHiddenState(PFW_WIDGET_REPAY_LOAN,    player != _local_player);
-		}
-
-		/* Borrow button only shows when there is any more money to loan */
-		w->SetWidgetDisabledState(PFW_WIDGET_INCREASE_LOAN, p->current_loan == _economy.max_loan);
+		case WE_PAINT: {
+			PlayerID player = (PlayerID)w->window_number;
+			const Player *p = GetPlayer(player);
 
-		/* Repay button only shows when there is any more money to repay */
-		w->SetWidgetDisabledState(PFW_WIDGET_REPAY_LOAN, player != _local_player || p->current_loan == 0);
-
-		SetDParam(0, p->index);
-		SetDParam(1, p->index);
-		SetDParam(2, LOAN_INTERVAL);
-		DrawWindowWidgets(w);
+			/* Recheck the size of the window as it might need to be resized due to the local player changing */
+			int new_height = ((player != _local_player) ? 0 : 12) + ((WP(w, def_d).data_1 != 0) ? 48 : 204);
+			if (w->height != new_height) {
+				/* Make window dirty before and after resizing */
+				SetWindowDirty(w);
+				w->height = new_height;
+				SetWindowDirty(w);
 
-		DrawPlayerEconomyStats(p, (byte)WP(w, def_d).data_1);
-	} break;
+				w->SetWidgetHiddenState(PFW_WIDGET_INCREASE_LOAN, player != _local_player);
+				w->SetWidgetHiddenState(PFW_WIDGET_REPAY_LOAN,    player != _local_player);
+			}
 
-	case WE_CLICK:
-		switch (e->we.click.widget) {
-		case PFW_WIDGET_TOGGLE_SIZE: {/* toggle size */
-			byte mode = (byte)WP(w, def_d).data_1;
-			bool stickied = !!(w->flags4 & WF_STICKY);
-			PlayerID player = (PlayerID)w->window_number;
-			DeleteWindow(w);
-			DoShowPlayerFinances(player, !HasBit(mode, 0), stickied);
+			/* Borrow button only shows when there is any more money to loan */
+			w->SetWidgetDisabledState(PFW_WIDGET_INCREASE_LOAN, p->current_loan == _economy.max_loan);
+
+			/* Repay button only shows when there is any more money to repay */
+			w->SetWidgetDisabledState(PFW_WIDGET_REPAY_LOAN, player != _local_player || p->current_loan == 0);
+
+			SetDParam(0, p->index);
+			SetDParam(1, p->index);
+			SetDParam(2, LOAN_INTERVAL);
+			DrawWindowWidgets(w);
+
+			DrawPlayerEconomyStats(p, (byte)WP(w, def_d).data_1);
 		} break;
 
-		case PFW_WIDGET_INCREASE_LOAN: /* increase loan */
-			DoCommandP(0, 0, _ctrl_pressed, NULL, CMD_INCREASE_LOAN | CMD_MSG(STR_702C_CAN_T_BORROW_ANY_MORE_MONEY));
-			break;
+		case WE_CLICK:
+			switch (e->we.click.widget) {
+				case PFW_WIDGET_TOGGLE_SIZE: {/* toggle size */
+					byte mode = (byte)WP(w, def_d).data_1;
+					bool stickied = !!(w->flags4 & WF_STICKY);
+					int oldtop = w->top;   ///< current top position of the window before closing it
+					int oldleft = w->left; ///< current left position of the window before closing it
+					PlayerID player = (PlayerID)w->window_number;
 
-		case PFW_WIDGET_REPAY_LOAN: /* repay loan */
-			DoCommandP(0, 0, _ctrl_pressed, NULL, CMD_DECREASE_LOAN | CMD_MSG(STR_702F_CAN_T_REPAY_LOAN));
+					DeleteWindow(w);
+					/* Open up the (toggled size) Finance window at the same position as the previous */
+					DoShowPlayerFinances(player, !HasBit(mode, 0), stickied, oldtop, oldleft);
+				}
+				break;
+
+				case PFW_WIDGET_INCREASE_LOAN: /* increase loan */
+					DoCommandP(0, 0, _ctrl_pressed, NULL, CMD_INCREASE_LOAN | CMD_MSG(STR_702C_CAN_T_BORROW_ANY_MORE_MONEY));
+					break;
+
+				case PFW_WIDGET_REPAY_LOAN: /* repay loan */
+					DoCommandP(0, 0, _ctrl_pressed, NULL, CMD_DECREASE_LOAN | CMD_MSG(STR_702F_CAN_T_REPAY_LOAN));
+					break;
+			}
 			break;
-		}
-		break;
 	}
 }
 
@@ -221,7 +230,18 @@
 	PlayerFinancesWndProc
 };
 
-static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied)
+/**
+ * Open the small/large finance window of the player
+ *
+ * @param player         the player who's finances are requested to be seen
+ * @param show_small     show large or small version opf the window
+ * @param show_stickied  previous "stickyness" of the window
+ * @param top            previous top position of the window
+ * @param left           previous left position of the window
+ *
+ * @pre is player a valid player
+ */
+static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied, int top, int left)
 {
 	if (!IsValidPlayer(player)) return;
 
@@ -229,7 +249,14 @@
 	if (w != NULL) {
 		w->caption_color = w->window_number;
 		WP(w, def_d).data_1 = show_small;
+
 		if (show_stickied) w->flags4 |= WF_STICKY;
+
+		/* Check if repositioning from default is required */
+		if (top != FIRST_GUI_CALL && left != FIRST_GUI_CALL) {
+			w->top = top;
+			w->left = left;
+		}
 	}
 }
 
@@ -811,11 +838,15 @@
 			switch (e->we.click.widget) {
 				/* Toggle size, advanced/simple face selection */
 				case PFW_WIDGET_TOGGLE_LARGE_SMALL:
-				case PFW_WIDGET_TOGGLE_LARGE_SMALL_BUTTON:
+				case PFW_WIDGET_TOGGLE_LARGE_SMALL_BUTTON: {
+					int oldtop = w->top;     ///< current top position of the window before closing it
+					int oldleft = w->left;   ///< current top position of the window before closing it
+
 					DoCommandP(0, 0, *pf, NULL, CMD_SET_PLAYER_FACE);
 					DeleteWindow(w);
-					DoSelectPlayerFace((PlayerID)w->window_number, !WP(w, facesel_d).advanced);
-					break;
+					/* Open up the (toggled size) Face selection window at the same position as the previous */
+					DoSelectPlayerFace((PlayerID)w->window_number, !WP(w, facesel_d).advanced, oldtop, oldleft);
+				} break;
 
 				/* Cancel button */
 				case PFW_WIDGET_CANCEL:
@@ -949,10 +980,12 @@
  *
  * @param player the player which face shall be edited
  * @param adv    simple or advanced player face selection window
+ * @param top    previous top position of the window
+ * @param left   previous left position of the window
  *
  * @pre is player a valid player
  */
-static void DoSelectPlayerFace(PlayerID player, bool adv)
+static void DoSelectPlayerFace(PlayerID player, bool adv, int top, int left)
 {
 	if (!IsValidPlayer(player)) return;
 
@@ -962,6 +995,12 @@
 		w->caption_color = w->window_number;
 		WP(w, facesel_d).face = GetPlayer((PlayerID)w->window_number)->face;
 		WP(w, facesel_d).advanced = adv;
+
+		/* Check if repositioning from default is required */
+		if (top != FIRST_GUI_CALL && left != FIRST_GUI_CALL) {
+			w->top = top;
+			w->left = left;
+		}
 	}
 }
 
@@ -1292,31 +1331,30 @@
 static void BuyCompanyWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_PAINT: {
-		Player *p = GetPlayer((PlayerID)w->window_number);
-		SetDParam(0, STR_COMPANY_NAME);
-		SetDParam(1, p->index);
-		DrawWindowWidgets(w);
-
-		DrawPlayerFace(p->face, p->player_color, 2, 16);
+		case WE_PAINT: {
+			Player *p = GetPlayer((PlayerID)w->window_number);
+			SetDParam(0, STR_COMPANY_NAME);
+			SetDParam(1, p->index);
+			DrawWindowWidgets(w);
 
-		SetDParam(0, p->index);
-		SetDParam(1, p->bankrupt_value);
-		DrawStringMultiCenter(214, 65, STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT, 238);
-		break;
-	}
+			DrawPlayerFace(p->face, p->player_color, 2, 16);
 
-	case WE_CLICK:
-		switch (e->we.click.widget) {
-		case 3:
-			DeleteWindow(w);
+			SetDParam(0, p->index);
+			SetDParam(1, p->bankrupt_value);
+			DrawStringMultiCenter(214, 65, STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT, 238);
+		} break;
+
+		case WE_CLICK:
+			switch (e->we.click.widget) {
+				case 3:
+					DeleteWindow(w);
+					break;
+				case 4: {
+					DoCommandP(0, w->window_number, 0, NULL, CMD_BUY_COMPANY | CMD_MSG(STR_7060_CAN_T_BUY_COMPANY));
+					break;
+				}
+			}
 			break;
-		case 4: {
-			DoCommandP(0, w->window_number, 0, NULL, CMD_BUY_COMPANY | CMD_MSG(STR_7060_CAN_T_BUY_COMPANY));
-			break;
-		}
-		}
-		break;
 	}
 }
 
@@ -1370,79 +1408,81 @@
 static void EndGameWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_PAINT: {
-		const Player *p;
-		uint x, y;
-
-		SetupHighScoreEndWindow(w, &x, &y);
-
-		if (!IsValidPlayer(_local_player)) break;
+		case WE_PAINT: {
+			const Player *p;
+			uint x, y;
 
-		p = GetPlayer(_local_player);
-		/* We need to get performance from last year because the image is shown
-		 * at the start of the new year when these things have already been copied */
-		if (WP(w, highscore_d).background_img == SPR_TYCOON_IMG2_BEGIN) { // Tycoon of the century \o/
-			SetDParam(0, p->index);
-			SetDParam(1, p->index);
-			SetDParam(2, EndGameGetPerformanceTitleFromValue(p->old_economy[0].performance_history));
-			DrawStringMultiCenter(x + (640 / 2), y + 107, STR_021C_OF_ACHIEVES_STATUS, 640);
-		} else {
-			SetDParam(0, p->index);
-			SetDParam(1, EndGameGetPerformanceTitleFromValue(p->old_economy[0].performance_history));
-			DrawStringMultiCenter(x + (640 / 2), y + 157, STR_021B_ACHIEVES_STATUS, 640);
-		}
-	} break;
-	case WE_CLICK: /* Close the window (and show the highscore window) */
-		DeleteWindow(w);
-		break;
-	case WE_DESTROY: /* Show the highscore window when this one is closed */
-		if (!_networking) DoCommandP(0, 0, 0, NULL, CMD_PAUSE); // unpause
-		ShowHighscoreTable(w->window_number, WP(w, highscore_d).rank);
-		break;
+			SetupHighScoreEndWindow(w, &x, &y);
+
+			if (!IsValidPlayer(_local_player)) break;
+
+			p = GetPlayer(_local_player);
+			/* We need to get performance from last year because the image is shown
+			 * at the start of the new year when these things have already been copied */
+			if (WP(w, highscore_d).background_img == SPR_TYCOON_IMG2_BEGIN) { // Tycoon of the century \o/
+				SetDParam(0, p->index);
+				SetDParam(1, p->index);
+				SetDParam(2, EndGameGetPerformanceTitleFromValue(p->old_economy[0].performance_history));
+				DrawStringMultiCenter(x + (640 / 2), y + 107, STR_021C_OF_ACHIEVES_STATUS, 640);
+			} else {
+				SetDParam(0, p->index);
+				SetDParam(1, EndGameGetPerformanceTitleFromValue(p->old_economy[0].performance_history));
+				DrawStringMultiCenter(x + (640 / 2), y + 157, STR_021B_ACHIEVES_STATUS, 640);
+			}
+		} break;
+
+		case WE_CLICK: /* Close the window (and show the highscore window) */
+			DeleteWindow(w);
+			break;
+
+		case WE_DESTROY: /* Show the highscore window when this one is closed */
+			if (!_networking) DoCommandP(0, 0, 0, NULL, CMD_PAUSE); // unpause
+			ShowHighscoreTable(w->window_number, WP(w, highscore_d).rank);
+			break;
 	}
 }
 
 static void HighScoreWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_PAINT: {
-		const HighScore *hs = _highscore_table[w->window_number];
-		uint x, y;
-		uint8 i;
-
-		SetupHighScoreEndWindow(w, &x, &y);
-
-		SetDParam(0, _patches.ending_year);
-		SetDParam(1, w->window_number + STR_6801_EASY);
-		DrawStringMultiCenter(x + (640 / 2), y + 62, !_networking ? STR_0211_TOP_COMPANIES_WHO_REACHED : STR_TOP_COMPANIES_NETWORK_GAME, 500);
-
-		/* Draw Highscore peepz */
-		for (i = 0; i < lengthof(_highscore_table[0]); i++) {
-			SetDParam(0, i + 1);
-			DrawString(x + 40, y + 140 + (i * 55), STR_0212, TC_BLACK);
-
-			if (hs[i].company[0] != '\0') {
-				TextColour colour = (WP(w, highscore_d).rank == (int8)i) ? TC_RED : TC_BLACK; // draw new highscore in red
+		case WE_PAINT: {
+			const HighScore *hs = _highscore_table[w->window_number];
+			uint x, y;
+			uint8 i;
 
-				DoDrawString(hs[i].company, x + 71, y + 140 + (i * 55), colour);
-				SetDParam(0, hs[i].title);
-				SetDParam(1, hs[i].score);
-				DrawString(x + 71, y + 160 + (i * 55), STR_HIGHSCORE_STATS, colour);
-			}
-		}
-	} break;
+			SetupHighScoreEndWindow(w, &x, &y);
 
-	case WE_CLICK: /* Onclick to close window, and in destroy event handle the rest */
-		DeleteWindow(w);
-		break;
+			SetDParam(0, _patches.ending_year);
+			SetDParam(1, w->window_number + STR_6801_EASY);
+			DrawStringMultiCenter(x + (640 / 2), y + 62, !_networking ? STR_0211_TOP_COMPANIES_WHO_REACHED : STR_TOP_COMPANIES_NETWORK_GAME, 500);
 
-	case WE_DESTROY: /* Get back all the hidden windows */
-		if (_game_mode != GM_MENU) ShowVitalWindows();
+			/* Draw Highscore peepz */
+			for (i = 0; i < lengthof(_highscore_table[0]); i++) {
+				SetDParam(0, i + 1);
+				DrawString(x + 40, y + 140 + (i * 55), STR_0212, TC_BLACK);
 
-		if (!_networking) DoCommandP(0, 0, 0, NULL, CMD_PAUSE); // unpause
-		break;
-	}
-	}
+				if (hs[i].company[0] != '\0') {
+					TextColour colour = (WP(w, highscore_d).rank == (int8)i) ? TC_RED : TC_BLACK; // draw new highscore in red
+
+					DoDrawString(hs[i].company, x + 71, y + 140 + (i * 55), colour);
+					SetDParam(0, hs[i].title);
+					SetDParam(1, hs[i].score);
+					DrawString(x + 71, y + 160 + (i * 55), STR_HIGHSCORE_STATS, colour);
+				}
+			}
+		} break;
+
+		case WE_CLICK: /* Onclick to close window, and in destroy event handle the rest */
+			DeleteWindow(w);
+			break;
+
+		case WE_DESTROY: /* Get back all the hidden windows */
+			if (_game_mode != GM_MENU) ShowVitalWindows();
+
+			if (!_networking) DoCommandP(0, 0, 0, NULL, CMD_PAUSE); // unpause
+			break;
+		}
+}
 
 static const Widget _highscore_widgets[] = {
 {      WWT_PANEL, RESIZE_NONE, 16, 0, 640, 0, 480, 0x0, STR_NULL},
--- a/src/players.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/players.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -4,18 +4,16 @@
  */
 #include "stdafx.h"
 #include "openttd.h"
-#include "engine.h"
+#include "engine_func.h"
 #include "player_func.h"
 #include "player_gui.h"
 #include "town.h"
-#include "station.h"
-#include "news.h"
+#include "news_func.h"
 #include "saveload.h"
 #include "command_func.h"
 #include "network/network.h"
 #include "network/network_internal.h"
 #include "variables.h"
-#include "engine.h"
 #include "ai/ai.h"
 #include "player_face.h"
 #include "group.h"
@@ -34,6 +32,7 @@
 #include "ai/trolly/trolly.h"
 #include "road_func.h"
 #include "rail.h"
+#include "sprite.h"
 
 #include "table/strings.h"
 #include "table/sprites.h"
@@ -336,7 +335,7 @@
 
 		if (!IsHumanPlayer(p->index)) {
 			SetDParam(0, t->index);
-			AddNewsItem((StringID)(p->index | NB_BNEWCOMPANY), NEWS_FLAGS(NM_CALLBACK, NF_TILE, NT_COMPANY_INFO, DNC_BANKRUPCY), p->last_build_coordinate, 0);
+			AddNewsItem((StringID)(p->index | NB_BNEWCOMPANY), NM_CALLBACK, NF_TILE, NT_COMPANY_INFO, DNC_BANKRUPCY, p->last_build_coordinate, 0);
 		}
 		return;
 	}
@@ -902,7 +901,7 @@
 
 			/* Show the bankrupt news */
 			SetDParam(0, p->index);
-			AddNewsItem( (StringID)(p->index | NB_BBANKRUPT), NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
+			AddNewsItem((StringID)(p->index | NB_BBANKRUPT), NM_CALLBACK, NF_NONE, NT_COMPANY_INFO, DNC_BANKRUPCY, 0, 0);
 
 			/* Remove the company */
 			ChangeOwnershipOfPlayerItems(p->index, PLAYER_SPECTATOR);
--- a/src/rail.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/rail.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -13,6 +13,7 @@
 #include "date_func.h"
 #include "player_func.h"
 #include "player_base.h"
+#include "engine_func.h"
 
 
 /* XXX: Below 3 tables store duplicate data. Maybe remove some? */
--- a/src/rail.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/rail.h	Tue Apr 15 00:47:19 2008 +0000
@@ -13,6 +13,16 @@
 #include "economy_func.h"
 #include "tile_cmd.h"
 
+enum RailTypeFlag {
+	RTF_CATENARY = 0,  ///< Set if the rail type should have catenary drawn
+};
+
+enum RailTypeFlags {
+	RTFB_NONE     = 0,
+	RTFB_CATENARY = 1 << RTF_CATENARY,
+};
+DECLARE_ENUM_AS_BIT_SET(RailTypeFlags);
+
 /** This struct contains all the info that is needed to draw and construct tracks.
  */
 struct RailtypeInfo {
@@ -93,6 +103,11 @@
 	 * Multiplier for curve maximum speed advantage
 	 */
 	byte curve_speed;
+
+	/**
+	 * Bit mask of rail type flags
+	 */
+	RailTypeFlags flags;
 };
 
 
@@ -181,6 +196,18 @@
 void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);
 void DrawDefaultWaypointSprite(int x, int y, RailType railtype);
 void *EnsureNoTrainOnTrackProc(Vehicle *v, void *data);
+int TicksToLeaveDepot(const Vehicle *v);
+
+
+/**
+ * Test if a rail type has catenary
+ * @param rt Rail type to test
+ */
+static inline bool HasCatenary(RailType rt)
+{
+	return HasBit(GetRailTypeInfo(rt)->flags, RTF_CATENARY);
+}
+
 
 /**
  * Draws overhead wires and pylons for electric railways.
--- a/src/rail_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/rail_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -17,9 +17,8 @@
 #include "viewport_func.h"
 #include "command_func.h"
 #include "pathfind.h"
-#include "engine.h"
+#include "engine_func.h"
 #include "town.h"
-#include "station.h"
 #include "sprite.h"
 #include "depot.h"
 #include "waypoint.h"
@@ -1761,7 +1760,7 @@
 
 		if (HasBit(_display_opt, DO_FULL_DETAIL)) DrawTrackDetails(ti);
 
-		if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
+		if (HasCatenary(GetRailType(ti->tile))) DrawCatenary(ti);
 
 		if (HasSignals(ti->tile)) DrawSignals(ti->tile, rails);
 	} else {
@@ -1773,7 +1772,12 @@
 		if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED);
 
 		if (IsRailDepot(ti->tile)) {
-			dts = &_depot_gfx_table[GetRailDepotDirection(ti->tile)];
+			if (IsInvisibilitySet(TO_BUILDINGS)) {
+				/* Draw rail instead of depot */
+				dts = &_depot_invisible_gfx_table[GetRailDepotDirection(ti->tile)];
+			} else {
+				dts = &_depot_gfx_table[GetRailDepotDirection(ti->tile)];
+			}
 
 			relocation = rti->total_offset;
 
@@ -1835,7 +1839,10 @@
 
 		DrawGroundSprite(image, PAL_NONE);
 
-		if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
+		if (HasCatenary(GetRailType(ti->tile))) DrawCatenary(ti);
+
+		/* End now if buildings are invisible */
+		if (IsInvisibilitySet(TO_BUILDINGS)) return;
 
 		foreach_draw_tile_seq(dtss, dts->seq) {
 			SpriteID image = dtss->image.sprite;
@@ -2230,6 +2237,29 @@
 	 0,  1,  0, -1  /* y */
 };
 
+
+/** Compute number of ticks when next wagon will leave a depot.
+ * Negative means next wagon should have left depot n ticks before.
+ * @param v vehicle outside (leaving) the depot
+ * @return number of ticks when the next wagon will leave
+ */
+int TicksToLeaveDepot(const Vehicle *v)
+{
+	DiagDirection dir = GetRailDepotDirection(v->tile);
+	int length = v->u.rail.cached_veh_length;
+
+	switch (dir) {
+		case DIAGDIR_NE: return  ((int)(v->x_pos & 0x0F) - ((_fractcoords_enter[dir] & 0x0F) - (length + 1)));
+		case DIAGDIR_SE: return -((int)(v->y_pos & 0x0F) - ((_fractcoords_enter[dir] >> 4)   + (length + 1)));
+		case DIAGDIR_SW: return -((int)(v->x_pos & 0x0F) - ((_fractcoords_enter[dir] & 0x0F) + (length + 1)));
+		default:
+		case DIAGDIR_NW: return  ((int)(v->y_pos & 0x0F) - ((_fractcoords_enter[dir] >> 4)   - (length + 1)));
+	}
+
+	return 0; // make compilers happy
+}
+
+
 static VehicleEnterTileStatus VehicleEnter_Track(Vehicle *v, TileIndex tile, int x, int y)
 {
 	byte fract_coord;
--- a/src/rail_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/rail_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -13,7 +13,7 @@
 #include "viewport_func.h"
 #include "gfx_func.h"
 #include "command_func.h"
-#include "station.h"
+#include "town_type.h"
 #include "waypoint.h"
 #include "debug.h"
 #include "variables.h"
@@ -45,9 +45,9 @@
 static DiagDirection _build_depot_direction;
 static byte _waypoint_count = 1;
 static byte _cur_waypoint_type;
-static bool _convert_signal_button; // convert signal button in the signal GUI pressed
-static SignalVariant _cur_signal_variant; // set the signal variant (for signal GUI)
-static SignalType _cur_signal_type; // set the signal type (for signal GUI)
+static bool _convert_signal_button;       ///< convert signal button in the signal GUI pressed
+static SignalVariant _cur_signal_variant; ///< set the signal variant (for signal GUI)
+static SignalType _cur_signal_type;       ///< set the signal type (for signal GUI)
 
 static struct {
 	byte orientation;
@@ -205,17 +205,26 @@
 		DoCommandP(tile, track, 0, CcPlaySound1E,
 			CMD_REMOVE_SIGNALS | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM));
 	} else {
-		if (!_patches.enable_signal_gui) _cur_signal_variant = _cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC;
+		const Window *w = FindWindowById(WC_BUILD_SIGNAL, 0);
 
 		/* various bitstuffed elements for CmdBuildSingleSignal() */
 		uint32 p1 = track;
-		SB(p1, 3, 1, _ctrl_pressed);
-		SB(p1, 4, 1, _cur_signal_variant);
-		SB(p1, 5, 2, _patches.enable_signal_gui ? _cur_signal_type : SIGTYPE_NORMAL);
-		SB(p1, 7, 1, _convert_signal_button);
+
+		if (w != NULL) {
+			/* signal GUI is used */
+			SB(p1, 3, 1, _ctrl_pressed);
+			SB(p1, 4, 1, _cur_signal_variant);
+			SB(p1, 5, 2, _cur_signal_type);
+			SB(p1, 7, 1, _convert_signal_button);
+		} else {
+			SB(p1, 3, 1, _ctrl_pressed);
+			SB(p1, 4, 1, (_cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC));
+			SB(p1, 5, 2, SIGTYPE_NORMAL);
+			SB(p1, 7, 1, 0);
+		}
 
 		DoCommandP(tile, p1, 0, CcPlaySound1E, CMD_BUILD_SIGNALS |
-			CMD_MSG(_convert_signal_button ? STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE : STR_1010_CAN_T_BUILD_SIGNALS_HERE));
+			CMD_MSG((w != NULL && _convert_signal_button) ? STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE : STR_1010_CAN_T_BUILD_SIGNALS_HERE));
 	}
 }
 
@@ -364,7 +373,7 @@
 /** The "build signal"-button proc from BuildRailToolbWndProc() (start ShowSignalBuilder() and/or HandleAutoSignalPlacement()) */
 static void BuildRailClick_AutoSignals(Window *w)
 {
-	if (_patches.enable_signal_gui) {
+	if (_patches.enable_signal_gui != _ctrl_pressed) {
 		if (HandlePlacePushButton(w, RTW_BUILD_SIGNALS, ANIMCURSOR_BUILDSIGNALS, VHM_RECT, PlaceRail_AutoSignals)) ShowSignalBuilder();
 	} else {
 		HandlePlacePushButton(w, RTW_BUILD_SIGNALS, ANIMCURSOR_BUILDSIGNALS, VHM_RECT, PlaceRail_AutoSignals);
@@ -454,11 +463,20 @@
 		return;
 	}
 
-	/* XXX Steal ctrl for autosignal function, until we get some GUI */
-	SB(p2,  3, 1, 0);
-	SB(p2,  4, 1, _cur_year < _patches.semaphore_build_before);
-	SB(p2,  6, 1, _ctrl_pressed);
-	SB(p2, 24, 8, _patches.drag_signals_density);
+	const Window *w = FindWindowById(WC_BUILD_SIGNAL, 0);
+
+	if (w != NULL) {
+		/* signal GUI is used */
+		SB(p2,  3, 1, 0);
+		SB(p2,  4, 1, _cur_signal_variant);
+		SB(p2,  6, 1, _ctrl_pressed);
+		SB(p2, 24, 8, _patches.drag_signals_density);
+	} else {
+		SB(p2,  3, 1, 0);
+		SB(p2,  4, 1, (_cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC));
+		SB(p2,  6, 1, _ctrl_pressed);
+		SB(p2, 24, 8, _patches.drag_signals_density);
+	}
 
 	/* _patches.drag_signals_density is given as a parameter such that each user
 	 * in a network game can specify his/her own signal density */
@@ -583,7 +601,7 @@
 
 	case WE_PLACE_DRAG: {
 		/* no dragging if you have pressed the convert button */
-		if (_convert_signal_button && w->IsWidgetLowered(RTW_BUILD_SIGNALS)) return;
+		if (FindWindowById(WC_BUILD_SIGNAL, 0) != NULL && _convert_signal_button && w->IsWidgetLowered(RTW_BUILD_SIGNALS)) return;
 
 		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
 		return;
@@ -921,8 +939,9 @@
 		DrawStringCentered(74, 101 + y_offset, STR_3004_PLATFORM_LENGTH, TC_FROMSTRING);
 		DrawStringCentered(74, 141 + y_offset, STR_3066_COVERAGE_AREA_HIGHLIGHT, TC_FROMSTRING);
 
-		int text_end = DrawStationCoverageAreaText(2, 166 + y_offset, SCT_ALL, rad) + 4;
-		if (text_end > w->widget[BRSW_BACKGROUND].bottom) {
+		int text_end = DrawStationCoverageAreaText(2, 166 + y_offset, SCT_ALL, rad, false);
+		text_end = DrawStationCoverageAreaText(2, text_end + 4, SCT_ALL, rad, true) + 4;
+		if (text_end != w->widget[BRSW_BACKGROUND].bottom) {
 			SetWindowDirty(w);
 			ResizeWindowForWidget(w, BRSW_BACKGROUND, 0, text_end - w->widget[BRSW_BACKGROUND].bottom);
 			SetWindowDirty(w);
@@ -1313,11 +1332,19 @@
 					break;
 
 				case BSW_DRAG_SIGNALS_DENSITY_DECREASE:
-					if (_patches.drag_signals_density > 1) _patches.drag_signals_density--;
+					if (_patches.drag_signals_density > 1) {
+						_patches.drag_signals_density--;
+						const Window *w = FindWindowById(WC_GAME_OPTIONS, 0);
+						if (w != NULL) SetWindowDirty(w);
+					}
 					break;
 
 				case BSW_DRAG_SIGNALS_DENSITY_INCREASE:
-					if (_patches.drag_signals_density < 20) _patches.drag_signals_density++;
+					if (_patches.drag_signals_density < 20) {
+						_patches.drag_signals_density++;
+						const Window *w = FindWindowById(WC_GAME_OPTIONS, 0);
+						if (w != NULL) SetWindowDirty(w);
+					}
 					break;
 
 				default: break;
@@ -1370,14 +1397,9 @@
 
 /**
  * Open the signal selection window
- * @pre reset all signal GUI relevant variables
  */
 static void ShowSignalBuilder()
 {
-	_convert_signal_button = false;
-	_cur_signal_variant = _cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC;
-	_cur_signal_type = SIGTYPE_NORMAL;
-
 	AllocateWindowDesc(&_signal_builder_desc);
 }
 
@@ -1586,7 +1608,7 @@
 	MarkWholeScreenDirty();
 }
 
-void SetDefaultRailGui()
+static void SetDefaultRailGui()
 {
 	if (_local_player == PLAYER_SPECTATOR || !IsValidPlayer(_local_player)) return;
 
@@ -1635,5 +1657,36 @@
 	}
 }
 
+/**
+ * Updates the current signal variant used in the signal GUI
+ * to the one adequate to current year.
+ * @param 0 needed to be called when a patch setting changes
+ * @return success, needed for patch settings
+ */
+int32 ResetSignalVariant(int32 = 0)
+{
+	SignalVariant new_variant = (_cur_year < _patches.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC);
 
+	if (new_variant != _cur_signal_variant) {
+		Window *w = FindWindowById(WC_BUILD_SIGNAL, 0);
+		if (w != NULL) {
+			SetWindowDirty(w);
+			w->RaiseWidget((_cur_signal_variant == SIG_ELECTRIC ? BSW_ELECTRIC_NORM : BSW_SEMAPHORE_NORM) + _cur_signal_type);
+		}
+		_cur_signal_variant = new_variant;
+	}
 
+	return 0;
+}
+
+/** Resets the rail GUI - sets default railtype to build
+ * and resets the signal GUI
+ */
+void InitializeRailGUI()
+{
+	SetDefaultRailGui();
+
+	_convert_signal_button = false;
+	_cur_signal_type = SIGTYPE_NORMAL;
+	ResetSignalVariant();
+}
--- a/src/rail_gui.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/rail_gui.h	Tue Apr 15 00:47:19 2008 +0000
@@ -9,5 +9,6 @@
 
 void ShowBuildRailToolbar(RailType railtype, int button);
 void ReinitGuiAfterToggleElrail(bool disable);
+int32 ResetSignalVariant(int32 = 0);
 
 #endif /* RAIL_GUI_H */
--- a/src/rail_map.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/rail_map.h	Tue Apr 15 00:47:19 2008 +0000
@@ -10,6 +10,8 @@
 #include "direction_func.h"
 #include "track_func.h"
 #include "tile_map.h"
+#include "signal_type.h"
+#include "waypoint_type.h"
 
 
 /** Different types of Rail-related tiles */
@@ -201,14 +203,6 @@
 	return (WaypointID)_m[t].m2;
 }
 
-/** Type of signal, i.e. how does the signal behave? */
-enum SignalType {
-	SIGTYPE_NORMAL  = 0, ///< normal signal
-	SIGTYPE_ENTRY   = 1, ///< presignal block entry
-	SIGTYPE_EXIT    = 2, ///< presignal block exit
-	SIGTYPE_COMBO   = 3  ///< presignal inter-block
-};
-
 static inline SignalType GetSignalType(TileIndex t, Track track)
 {
 	assert(GetRailTileType(t) == RAIL_TILE_SIGNALS);
@@ -244,12 +238,6 @@
 	SB(_m[t].m3, pos, 2, sig);
 }
 
-/** Variant of the signal, i.e. how does the signal look? */
-enum SignalVariant {
-	SIG_ELECTRIC  = 0, ///< Light signal
-	SIG_SEMAPHORE = 1  ///< Old-fashioned semaphore signal
-};
-
 static inline SignalVariant GetSignalVariant(TileIndex t, Track track)
 {
 	byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 6 : 2;
--- a/src/resource.h	Mon Apr 14 20:32:36 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/* $Id$ */
-
-/** @file resource.h */
-
-//{{NO_DEPENDENCIES}}
-// Microsoft Developer Studio generated include file.
-// Used by ttd.rc
-//
-
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        104
-#define _APS_NEXT_COMMAND_VALUE         40001
-#define _APS_NEXT_CONTROL_VALUE         1005
-#define _APS_NEXT_SYMED_VALUE           101
-#endif
-#endif
--- a/src/rev.cpp.in	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/rev.cpp.in	Tue Apr 15 00:47:19 2008 +0000
@@ -34,7 +34,7 @@
  * final release will always have a lower version number than the released
  * version, thus making comparisions on specific revisions easy.
  */
-uint32 _openttd_newgrf_version = 0 << 28 | 6 << 24 | 0 << 20 | 0 << 19 | (@@REVISION@@ & ((1 << 19) - 1));
+uint32 _openttd_newgrf_version = 0 << 28 | 7 << 24 | 0 << 20 | 0 << 19 | (@@REVISION@@ & ((1 << 19) - 1));
 
 #ifdef __MORPHOS__
 /**
--- a/src/road.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/road.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -9,7 +9,7 @@
 #include "genworld.h"
 #include "player_func.h"
 #include "player_base.h"
-#include "engine.h"
+#include "engine_func.h"
 #include "settings_type.h"
 #include "date_func.h"
 
--- a/src/road_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/road_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -43,12 +43,59 @@
 static const uint32 VALID_LEVEL_CROSSING_SLOPES = (M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT));
 #undef M
 
+/* Invalid RoadBits on slopes  */
+static const RoadBits _invalid_tileh_slopes_road[2][15] = {
+	/* The inverse of the mixable RoadBits on a leveled slope */
+	{
+		ROAD_NONE,         // SLOPE_FLAT
+		ROAD_NE | ROAD_SE, // SLOPE_W
+		ROAD_NE | ROAD_NW, // SLOPE_S
+
+		ROAD_NE,           // SLOPE_SW
+		ROAD_NW | ROAD_SW, // SLOPE_E
+		ROAD_NONE,         // SLOPE_EW
+
+		ROAD_NW,           // SLOPE_SE
+		ROAD_NONE,         // SLOPE_WSE
+		ROAD_SE | ROAD_SW, // SLOPE_N
+
+		ROAD_SE,           // SLOPE_NW
+		ROAD_NONE,         // SLOPE_NS
+		ROAD_NONE,         // SLOPE_ENW
+
+		ROAD_SW,           // SLOPE_NE
+		ROAD_NONE,         // SLOPE_SEN
+		ROAD_NONE          // SLOPE_NWS
+	},
+	/* The inverse of the allowed straight roads on a slope
+	 * (with and without a foundation). */
+	{
+		ROAD_NONE, // SLOPE_FLAT
+		ROAD_NONE, // SLOPE_W    Foundation
+		ROAD_NONE, // SLOPE_S    Foundation
+
+		ROAD_Y,    // SLOPE_SW
+		ROAD_NONE, // SLOPE_E    Foundation
+		ROAD_ALL,  // SLOPE_EW
+
+		ROAD_X,    // SLOPE_SE
+		ROAD_ALL,  // SLOPE_WSE
+		ROAD_NONE, // SLOPE_N    Foundation
+
+		ROAD_X,    // SLOPE_NW
+		ROAD_ALL,  // SLOPE_NS
+		ROAD_ALL,  // SLOPE_ENW
+
+		ROAD_Y,    // SLOPE_NE
+		ROAD_ALL,  // SLOPE_SEN
+		ROAD_ALL   // SLOPE_NW
+	}
+};
+
 Foundation GetRoadFoundation(Slope tileh, RoadBits bits);
 
 bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road, RoadType rt)
 {
-	RoadBits present;
-	RoadBits n;
 	*edge_road = true;
 
 	if (_game_mode == GM_EDITOR || remove == ROAD_NONE) return true;
@@ -66,8 +113,8 @@
 	if (_cheats.magic_bulldozer.value) return true;
 
 	/* Get a bitmask of which neighbouring roads has a tile */
-	n = ROAD_NONE;
-	present = GetAnyRoadBits(tile, rt);
+	RoadBits n = ROAD_NONE;
+	RoadBits present = GetAnyRoadBits(tile, rt);
 	if (present & ROAD_NE && GetAnyRoadBits(TILE_ADDXY(tile, -1,  0), rt) & ROAD_SW) n |= ROAD_NE;
 	if (present & ROAD_SE && GetAnyRoadBits(TILE_ADDXY(tile,  0,  1), rt) & ROAD_NW) n |= ROAD_SE;
 	if (present & ROAD_SW && GetAnyRoadBits(TILE_ADDXY(tile,  1,  0), rt) & ROAD_NE) n |= ROAD_SW;
@@ -75,13 +122,12 @@
 
 	/* If 0 or 1 bits are set in n, or if no bits that match the bits to remove,
 	 * then allow it */
-	if ((n & (n - 1)) != 0 && (n & remove) != 0) {
-		Town *t;
+	if (KillFirstBit(n) != ROAD_NONE && (n & remove) != ROAD_NONE) {
 		*edge_road = false;
 		/* you can remove all kind of roads with extra dynamite */
 		if (_patches.extra_dynamite) return true;
 
-		t = ClosestTownFromTile(tile, (uint)-1);
+		const Town *t = ClosestTownFromTile(tile, (uint)-1);
 
 		SetDParam(0, t->index);
 		_error_message = STR_2009_LOCAL_AUTHORITY_REFUSES;
@@ -178,24 +224,38 @@
 
 	switch (GetRoadTileType(tile)) {
 		case ROAD_TILE_NORMAL: {
+			const Slope tileh = GetTileSlope(tile, NULL);
 			RoadBits present = GetRoadBits(tile, rt);
-			RoadBits c = pieces;
+			const RoadBits other = GetOtherRoadBits(tile, rt);
+			const Foundation f = GetRoadFoundation(tileh, present);
 
 			if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
 
-			if (GetTileSlope(tile, NULL) != SLOPE_FLAT  &&
-					(present == ROAD_Y || present == ROAD_X)) {
-				c |= (RoadBits)((c & 0xC) >> 2);
-				c |= (RoadBits)((c & 0x3) << 2);
+			/* Autocomplete to a straight road
+			 * @li on steep slopes
+			 * @li if the bits of the other roadtypes result in another foundation
+			 * @li if build on slopes is disabled */
+			if (IsSteepSlope(tileh) || (IsStraightRoad(other) &&
+					(other & _invalid_tileh_slopes_road[0][tileh & SLOPE_ELEVATED]) != ROAD_NONE) ||
+					(tileh != SLOPE_FLAT && !_patches.build_on_slopes)) {
+				pieces |= MirrorRoadBits(pieces);
 			}
 
 			/* limit the bits to delete to the existing bits. */
-			c &= present;
-			if (c == ROAD_NONE) return CMD_ERROR;
+			pieces &= present;
+			if (pieces == ROAD_NONE) return CMD_ERROR;
+
+			/* Now set present what it will be after the remove */
+			present ^= pieces;
+
+			/* Check for invalid RoadBit combinations on slopes */
+			if (tileh != SLOPE_FLAT && present != ROAD_NONE &&
+					(present & _invalid_tileh_slopes_road[0][tileh & SLOPE_ELEVATED]) == present) {
+				return CMD_ERROR;
+			}
 
 			ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
 			if (flags & DC_EXEC) {
-				present ^= c;
 				if (present == ROAD_NONE) {
 					RoadTypes rts = GetRoadTypes(tile) & ComplementRoadTypes(RoadTypeToRoadTypes(rt));
 					if (rts == ROADTYPES_NONE) {
@@ -215,7 +275,10 @@
 					MarkTileDirtyByTile(tile);
 				}
 			}
-			return CommandCost(EXPENSES_CONSTRUCTION, CountBits(c) * _price.remove_road);
+
+			/* If we change the foundation we have to pay for it. */
+			return CommandCost(EXPENSES_CONSTRUCTION, CountBits(pieces) * _price.remove_road +
+					((GetRoadFoundation(tileh, present) != f) ? _price.terraform : (Money)0));
 		}
 
 		case ROAD_TILE_CROSSING: {
@@ -268,76 +331,6 @@
 	return RemoveRoad(tile, flags, pieces, rt, true);
 }
 
-
-static const RoadBits _valid_tileh_slopes_road[][15] = {
-	/* set of normal ones */
-	{
-		ROAD_ALL,  // SLOPE_FLAT
-		ROAD_NONE, // SLOPE_W
-		ROAD_NONE, // SLOPE_S
-
-		ROAD_X,    // SLOPE_SW
-		ROAD_NONE, // SLOPE_E
-		ROAD_NONE, // SLOPE_EW
-
-		ROAD_Y,    // SLOPE_SE
-		ROAD_NONE, // SLOPE_WSE
-		ROAD_NONE, // SLOPE_N
-
-		ROAD_Y,    // SLOPE_NW
-		ROAD_NONE, // SLOPE_NS
-		ROAD_NONE, // SLOPE_NE
-
-		ROAD_X,    // SLOPE_ENW
-		ROAD_NONE, // SLOPE_SEN
-		ROAD_NONE  // SLOPE_ELEVATED
-	},
-	/* allowed road for an evenly raised platform */
-	{
-		ROAD_NONE,         // SLOPE_FLAT
-		ROAD_SW | ROAD_NW, // SLOPE_W
-		ROAD_SW | ROAD_SE, // SLOPE_S
-
-		ROAD_Y  | ROAD_SW, // SLOPE_SW
-		ROAD_SE | ROAD_NE, // SLOPE_E
-		ROAD_ALL,          // SLOPE_EW
-
-		ROAD_X  | ROAD_SE, // SLOPE_SE
-		ROAD_ALL,          // SLOPE_WSE
-		ROAD_NW | ROAD_NE, // SLOPE_N
-
-		ROAD_X  | ROAD_NW, // SLOPE_NW
-		ROAD_ALL,          // SLOPE_NS
-		ROAD_ALL,          // SLOPE_NE
-
-		ROAD_Y  | ROAD_NE, // SLOPE_ENW
-		ROAD_ALL,          // SLOPE_SEN
-		ROAD_ALL           // SLOPE_ELEVATED
-	},
-	/* Singe bits on slopes */
-	{
-		ROAD_ALL,          // SLOPE_FLAT
-		ROAD_NE | ROAD_SE, // SLOPE_W
-		ROAD_NE | ROAD_NW, // SLOPE_S
-
-		ROAD_NE,           // SLOPE_SW
-		ROAD_NW | ROAD_SW, // SLOPE_E
-		ROAD_ALL,          // SLOPE_EW
-
-		ROAD_NW,           // SLOPE_SE
-		ROAD_ALL,          // SLOPE_WSE
-		ROAD_SE | ROAD_SW, // SLOPE_N
-
-		ROAD_SE,           // SLOPE_NW
-		ROAD_ALL,          // SLOPE_NS
-		ROAD_ALL,          // SLOPE_NE
-
-		ROAD_SW,           // SLOPE_ENW
-		ROAD_ALL,          // SLOPE_SEN
-		ROAD_ALL,          // SLOPE_ELEVATED
-	},
-};
-
 /**
  * Calculate the costs for roads on slopes
  *  Aside modify the RoadBits to fit on the slopes
@@ -345,49 +338,71 @@
  * @note The RoadBits are modified too!
  * @param tileh The current slope
  * @param pieces The RoadBits we want to add
- * @param existing The existent RoadBits
+ * @param existing The existent RoadBits of the current type
+ * @param other The other existent RoadBits
  * @return The costs for these RoadBits on this slope
  */
-static CommandCost CheckRoadSlope(Slope tileh, RoadBits* pieces, RoadBits existing)
+static CommandCost CheckRoadSlope(Slope tileh, RoadBits *pieces, RoadBits existing, RoadBits other)
 {
+	/* Remove already build pieces */
+	CLRBITS(*pieces, existing);
+
+	/* If we can't build anything stop here */
+	if (*pieces == ROAD_NONE) return CMD_ERROR;
+
+	/* All RoadBit combos are valid on flat land */
+	if (tileh == SLOPE_FLAT) return CommandCost();
+
+	/* Proceed steep Slopes first to reduce lookup table size */
 	if (IsSteepSlope(tileh)) {
 		/* Force straight roads. */
 		*pieces |= MirrorRoadBits(*pieces);
 
-		if (existing == ROAD_NONE || existing == *pieces) {
-			if (*pieces == ROAD_X || *pieces == ROAD_Y) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+		/* Use existing as all existing since only straight
+		 * roads are allowed here. */
+		existing |= other;
+
+		if ((existing == ROAD_NONE || existing == *pieces) && IsStraightRoad(*pieces)) {
+			return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
 		}
 		return CMD_ERROR;
 	}
 
-	RoadBits road_bits = *pieces | existing;
+	/* Save the merge of all bits of the current type */
+	RoadBits type_bits = existing | *pieces;
 
-	/* Single bits on slopes.
-	 * We check for the roads that need at least 2 bits */
-	if (_patches.build_on_slopes && !_is_old_ai_player &&
-			existing == ROAD_NONE && CountBits(*pieces) == 1 &&
-			(_valid_tileh_slopes_road[2][tileh] & *pieces) == ROAD_NONE) {
-		return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+	/* Roads on slopes */
+	if (_patches.build_on_slopes && (_invalid_tileh_slopes_road[0][tileh] & (other | type_bits)) == ROAD_NONE) {
+
+		/* If we add leveling we've got to pay for it */
+		if ((other | existing) == ROAD_NONE) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+
+		return CommandCost();
 	}
 
-	/* no special foundation */
-	if ((~_valid_tileh_slopes_road[0][tileh] & road_bits) == ROAD_NONE) {
-		/* force that all bits are set when we have slopes */
-		if (tileh != SLOPE_FLAT) *pieces |= _valid_tileh_slopes_road[0][tileh];
-		return CommandCost(); // no extra cost
-	}
+	/* Autocomplete uphill roads */
+	*pieces |= MirrorRoadBits(*pieces);
+	type_bits = existing | *pieces;
 
-	/* foundation is used. Whole tile is leveled up */
-	if ((~_valid_tileh_slopes_road[1][tileh] & road_bits) == ROAD_NONE) {
-		return CommandCost(EXPENSES_CONSTRUCTION, existing != ROAD_NONE ? (Money)0 : _price.terraform);
-	}
+	/* Uphill roads */
+	if (IsStraightRoad(type_bits) && (other == type_bits || other == ROAD_NONE) &&
+			(_invalid_tileh_slopes_road[1][tileh] & (other | type_bits)) == ROAD_NONE) {
 
-	/* Force straight roads. */
-	*pieces |= MirrorRoadBits(*pieces);
+		/* Slopes with foundation ? */
+		if (IsSlopeWithOneCornerRaised(tileh)) {
 
-	/* partly leveled up tile, only if there's no road on that tile */
-	if ((existing == ROAD_NONE || existing == *pieces) && IsSlopeWithOneCornerRaised(tileh)) {
-		if (*pieces == ROAD_X || *pieces == ROAD_Y) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+			/* Prevent build on slopes if it isn't allowed */
+			if (_patches.build_on_slopes) {
+
+				/* If we add foundation we've got to pay for it */
+				if ((other | existing) == ROAD_NONE) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+
+				return CommandCost();
+			}
+		} else {
+			if (CountBits(existing) == 1) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+			return CommandCost();
+		}
 	}
 	return CMD_ERROR;
 }
@@ -403,10 +418,9 @@
 CommandCost CmdBuildRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	CommandCost cost(EXPENSES_CONSTRUCTION);
-	CommandCost ret;
+
 	RoadBits existing = ROAD_NONE;
-	RoadBits all_bits = ROAD_NONE;
-	Slope tileh;
+	RoadBits other_bits = ROAD_NONE;
 
 	/* Road pieces are max 4 bitset values (NE, NW, SE, SW) and town can only be non-zero
 	 * if a non-player is building the road */
@@ -414,12 +428,15 @@
 
 	RoadBits pieces = Extract<RoadBits, 0>(p1);
 
+	/* do not allow building 'zero' road bits, code wouldn't handle it */
+	if (pieces == ROAD_NONE) return CMD_ERROR;
+
 	RoadType rt = (RoadType)GB(p1, 4, 2);
 	if (!IsValidRoadType(rt) || !ValParamRoadType(rt)) return CMD_ERROR;
 
 	DisallowedRoadDirections toggle_drd = (DisallowedRoadDirections)GB(p1, 6, 2);
 
-	tileh = GetTileSlope(tile, NULL);
+	Slope tileh = GetTileSlope(tile, NULL);
 
 	switch (GetTileType(tile)) {
 		case MP_ROAD:
@@ -427,12 +444,11 @@
 				case ROAD_TILE_NORMAL: {
 					if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
 
-					all_bits = GetAllRoadBits(tile);
+					other_bits = GetOtherRoadBits(tile, rt);
 					if (!HasTileRoadType(tile, rt)) break;
 
 					existing = GetRoadBits(tile, rt);
-					RoadBits merged = existing | pieces;
-					bool crossing = (merged != ROAD_X && merged != ROAD_Y);
+					bool crossing = !IsStraightRoad(existing | pieces);
 					if (rt != ROADTYPE_TRAM && (GetDisallowedRoadDirections(tile) != DRD_NONE || toggle_drd != DRD_NONE) && crossing) {
 						/* Junctions cannot be one-way */
 						return_cmd_error(STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION);
@@ -445,7 +461,7 @@
 							if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 							/* Ignore half built tiles */
-							if (flags & DC_EXEC && rt != ROADTYPE_TRAM && (existing == ROAD_X || existing == ROAD_Y)) {
+							if (flags & DC_EXEC && rt != ROADTYPE_TRAM && IsStraightRoad(existing)) {
 								SetDisallowedRoadDirections(tile, GetDisallowedRoadDirections(tile) ^ toggle_drd);
 								MarkTileDirtyByTile(tile);
 							}
@@ -457,8 +473,8 @@
 
 				case ROAD_TILE_CROSSING:
 					if (HasTileRoadType(tile, rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
-					all_bits = GetCrossingRoadBits(tile);
-					if (pieces & ComplementRoadBits(all_bits)) goto do_clear;
+					other_bits = GetCrossingRoadBits(tile);
+					if (pieces & ComplementRoadBits(other_bits)) goto do_clear;
 					break;
 
 				default:
@@ -468,8 +484,6 @@
 			break;
 
 		case MP_RAILWAY: {
-			Axis roaddir;
-
 			if (IsSteepSlope(tileh)) {
 				return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 			}
@@ -480,6 +494,8 @@
 			}
 
 			if (GetRailTileType(tile) != RAIL_TILE_NORMAL) goto do_clear;
+
+			Axis roaddir;
 			switch (GetTrackBits(tile)) {
 				case TRACK_BIT_X:
 					if (pieces & ROAD_X) goto do_clear;
@@ -518,19 +534,20 @@
 			if (GetVehicleTunnelBridge(tile, GetOtherTunnelBridgeEnd(tile)) != NULL) return CMD_ERROR;
 			break;
 
-		default:
+		default: {
 do_clear:;
-			ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
+			CommandCost ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 			if (CmdFailed(ret)) return ret;
 			cost.AddCost(ret);
+		} break;
 	}
 
-	if (all_bits != pieces) {
+	if (other_bits != pieces) {
 		/* Check the foundation/slopes when adding road/tram bits */
-		ret = CheckRoadSlope(tileh, &pieces, all_bits | existing);
+		CommandCost ret = CheckRoadSlope(tileh, &pieces, existing, other_bits);
 		/* Return an error if we need to build a foundation (ret != 0) but the
 		 * current patch-setting is turned off (or stupid AI@work) */
-		if (CmdFailed(ret) || (ret.GetCost() != 0 && (!_patches.build_on_slopes || _is_old_ai_player))) {
+		if (CmdFailed(ret) || (ret.GetCost() != 0 && !_patches.build_on_slopes)) {
 			return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 		}
 		cost.AddCost(ret);
@@ -605,7 +622,7 @@
 
 		if (rt != ROADTYPE_TRAM && IsNormalRoadTile(tile)) {
 			existing |= pieces;
-			SetDisallowedRoadDirections(tile, (existing == ROAD_X || existing == ROAD_Y) ?
+			SetDisallowedRoadDirections(tile, IsStraightRoad(existing) ?
 					GetDisallowedRoadDirections(tile) ^ toggle_drd : DRD_NONE);
 		}
 
@@ -627,8 +644,7 @@
  */
 CommandCost CmdBuildLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	TileIndex start_tile, tile;
-	CommandCost ret, cost(EXPENSES_CONSTRUCTION);
+	CommandCost cost(EXPENSES_CONSTRUCTION);
 	bool had_bridge = false;
 	bool had_tunnel = false;
 	bool had_success = false;
@@ -638,7 +654,7 @@
 
 	if (p1 >= MapSize()) return CMD_ERROR;
 
-	start_tile = p1;
+	TileIndex start_tile = p1;
 	RoadType rt = (RoadType)GB(p2, 3, 2);
 	if (!IsValidRoadType(rt) || !ValParamRoadType(rt)) return CMD_ERROR;
 
@@ -662,7 +678,7 @@
 	/* No disallowed direction bits have to be toggled */
 	if (!HasBit(p2, 5)) drd = DRD_NONE;
 
-	tile = start_tile;
+	TileIndex tile = start_tile;
 	/* Start tile is the small number. */
 	for (;;) {
 		RoadBits bits = HasBit(p2, 2) ? ROAD_Y : ROAD_X;
@@ -670,7 +686,7 @@
 		if (tile == end_tile && !HasBit(p2, 1)) bits &= ROAD_NW | ROAD_NE;
 		if (tile == start_tile && HasBit(p2, 0)) bits &= ROAD_SE | ROAD_SW;
 
-		ret = DoCommand(tile, drd << 6 | rt << 4 | bits, 0, flags, CMD_BUILD_ROAD);
+		CommandCost ret = DoCommand(tile, drd << 6 | rt << 4 | bits, 0, flags, CMD_BUILD_ROAD);
 		if (CmdFailed(ret)) {
 			if (_error_message != STR_1007_ALREADY_BUILT) return CMD_ERROR;
 		} else {
@@ -713,13 +729,11 @@
  */
 CommandCost CmdRemoveLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	TileIndex start_tile, tile;
-	CommandCost ret, cost(EXPENSES_CONSTRUCTION);
-	Money money;
+	CommandCost cost(EXPENSES_CONSTRUCTION);
 
 	if (p1 >= MapSize()) return CMD_ERROR;
 
-	start_tile = p1;
+	TileIndex start_tile = p1;
 	RoadType rt = (RoadType)GB(p2, 3, 2);
 	if (!IsValidRoadType(rt)) return CMD_ERROR;
 
@@ -735,8 +749,8 @@
 		p2 ^= IsInsideMM(p2 & 3, 1, 3) ? 3 : 0;
 	}
 
-	money = GetAvailableMoneyForCommand();
-	tile = start_tile;
+	Money money = GetAvailableMoneyForCommand();
+	TileIndex tile = start_tile;
 	/* Start tile is the small number. */
 	for (;;) {
 		RoadBits bits = HasBit(p2, 2) ? ROAD_Y : ROAD_X;
@@ -746,7 +760,7 @@
 
 		/* try to remove the halves. */
 		if (bits != 0) {
-			ret = RemoveRoad(tile, flags & ~DC_EXEC, bits, rt, true);
+			CommandCost ret = RemoveRoad(tile, flags & ~DC_EXEC, bits, rt, true);
 			if (CmdSucceeded(ret)) {
 				if (flags & DC_EXEC) {
 					money -= ret.GetCost();
@@ -780,15 +794,12 @@
  */
 CommandCost CmdBuildRoadDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	CommandCost cost;
-	Slope tileh;
-
 	DiagDirection dir = Extract<DiagDirection, 0>(p1);
 	RoadType rt = (RoadType)GB(p1, 2, 2);
 
 	if (!IsValidRoadType(rt) || !ValParamRoadType(rt)) return CMD_ERROR;
 
-	tileh = GetTileSlope(tile, NULL);
+	Slope tileh = GetTileSlope(tile, NULL);
 	if (tileh != SLOPE_FLAT && (
 				!_patches.build_on_slopes ||
 				IsSteepSlope(tileh) ||
@@ -797,7 +808,7 @@
 		return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
 	}
 
-	cost = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
+	CommandCost cost = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 	if (CmdFailed(cost)) return CMD_ERROR;
 
 	if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
@@ -818,8 +829,7 @@
 
 static CommandCost RemoveRoadDepot(TileIndex tile, uint32 flags)
 {
-	if (!CheckTileOwnership(tile) && _current_player != OWNER_WATER)
-		return CMD_ERROR;
+	if (!CheckTileOwnership(tile) && _current_player != OWNER_WATER) return CMD_ERROR;
 
 	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
@@ -865,13 +875,14 @@
 
 			/* Must iterate over the roadtypes in a reverse manner because
 			 * tram tracks must be removed before the road bits. */
-			for (RoadType rt = ROADTYPE_HWAY; rt >= ROADTYPE_ROAD; rt--) {
+			RoadType rt = ROADTYPE_HWAY;
+			do {
 				if (HasBit(rts, rt)) {
 					CommandCost tmp_ret = RemoveRoad(tile, flags, GetCrossingRoadBits(tile), rt, false);
 					if (CmdFailed(tmp_ret)) return tmp_ret;
 					ret.AddCost(tmp_ret);
 				}
-			}
+			} while (rt-- != ROADTYPE_ROAD);
 
 			if (flags & DC_EXEC) {
 				DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
@@ -897,21 +908,29 @@
 
 #include "table/road_land.h"
 
-
+/**
+ * Get the foundationtype of a RoadBits Slope combination
+ *
+ * @param tileh The Slope part
+ * @param bits The RoadBits part
+ * @return The resulting Foundation
+ */
 Foundation GetRoadFoundation(Slope tileh, RoadBits bits)
 {
+	/* Flat land and land without a road doesn't require a foundation */
+	if (tileh == SLOPE_FLAT || bits == ROAD_NONE) return FOUNDATION_NONE;
+
 	if (!IsSteepSlope(tileh)) {
-		if ((~_valid_tileh_slopes_road[0][tileh] & bits) == 0) {
-			/* As one can remove a single road piece when in a corner on a foundation as
-			 * it is on a sloped piece of landscape, one creates a state that cannot be
-			 * created directly, but the state itself is still perfectly drawable.
-			 * However, as we do not want this to be build directly, we need to check
-			 * for that situation in here. */
-			return (tileh != 0 && CountBits(bits) == 1) ? FOUNDATION_LEVELED : FOUNDATION_NONE;
-		}
-		if ((~_valid_tileh_slopes_road[1][tileh] & bits) == 0) return FOUNDATION_LEVELED;
+		/* Leveled RoadBits on a slope */
+		if ((_invalid_tileh_slopes_road[0][tileh] & bits) == ROAD_NONE) return FOUNDATION_LEVELED;
+
+		/* Straight roads without foundation on a slope */
+		if (!IsSlopeWithOneCornerRaised(tileh) &&
+				(_invalid_tileh_slopes_road[1][tileh] & bits) == ROAD_NONE)
+			return FOUNDATION_NONE;
 	}
 
+	/* Roads on steep Slopes or on Slopes with one corner raised */
 	return (bits == ROAD_X ? FOUNDATION_INCLINED_X : FOUNDATION_INCLINED_Y);
 }
 
@@ -944,8 +963,11 @@
  * @param ti   information about the tile (slopes, height etc)
  * @param tram the roadbits for the tram
  */
-void DrawTramCatenary(TileInfo *ti, RoadBits tram)
+void DrawTramCatenary(const TileInfo *ti, RoadBits tram)
 {
+	/* Do not draw catenary if it is invisible */
+	if (IsInvisibilitySet(TO_CATENARY)) return;
+
 	/* Don't draw the catenary under a low bridge */
 	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !IsTransparencySet(TO_CATENARY)) {
 		uint height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
@@ -976,7 +998,7 @@
  * @param dy  the offset from the top of the BB of the tile
  * @param h   the height of the sprite to draw
  */
-static void DrawRoadDetail(SpriteID img, TileInfo *ti, int dx, int dy, int h)
+static void DrawRoadDetail(SpriteID img, const TileInfo *ti, int dx, int dy, int h)
 {
 	int x = ti->x | dx;
 	int y = ti->y | dy;
@@ -989,15 +1011,13 @@
  * Draw ground sprite and road pieces
  * @param ti TileInfo
  */
-static void DrawRoadBits(TileInfo* ti)
+static void DrawRoadBits(TileInfo *ti)
 {
 	RoadBits road = GetRoadBits(ti->tile, ROADTYPE_ROAD);
 	RoadBits tram = GetRoadBits(ti->tile, ROADTYPE_TRAM);
 
-	const DrawRoadTileStruct *drts;
 	SpriteID image = 0;
 	SpriteID pal = PAL_NONE;
-	Roadside roadside;
 
 	if (ti->tileh != SLOPE_FLAT) {
 		DrawFoundation(ti, GetRoadFoundation(ti->tileh, road | tram));
@@ -1009,7 +1029,7 @@
 
 	if (image == 0) image = _road_tile_sprites_1[road != ROAD_NONE ? road : tram];
 
-	roadside = GetRoadside(ti->tile);
+	Roadside roadside = GetRoadside(ti->tile);
 
 	if (AlwaysDrawUnpavedRoads(ti->tile, roadside)) {
 		image += 19;
@@ -1069,7 +1089,7 @@
 	if (CountBits(road) < 2) return;
 
 	/* Draw extra details. */
-	for (drts = _road_display_table[roadside][road | tram]; drts->image != 0; drts++) {
+	for (const DrawRoadTileStruct *drts = _road_display_table[roadside][road | tram]; drts->image != 0; drts++) {
 		DrawRoadDetail(drts->image, ti, drts->subcoord_x, drts->subcoord_y, 0x10);
 	}
 }
@@ -1082,17 +1102,16 @@
 			break;
 
 		case ROAD_TILE_CROSSING: {
-			SpriteID image;
-			SpriteID pal = PAL_NONE;
-			Roadside roadside = GetRoadside(ti->tile);
-
 			if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED);
 
-			image = GetRailTypeInfo(GetRailType(ti->tile))->base_sprites.crossing;
+			SpriteID image = GetRailTypeInfo(GetRailType(ti->tile))->base_sprites.crossing;
+			SpriteID pal = PAL_NONE;
 
 			if (GetCrossingRoadAxis(ti->tile) == AXIS_X) image++;
 			if (IsCrossingBarred(ti->tile)) image += 2;
 
+			Roadside roadside = GetRoadside(ti->tile);
+
 			if (AlwaysDrawUnpavedRoads(ti->tile, roadside)) {
 				image += 8;
 			} else {
@@ -1108,20 +1127,17 @@
 				DrawGroundSprite(SPR_TRAMWAY_OVERLAY + (GetCrossingRoadAxis(ti->tile) ^ 1), pal);
 				DrawTramCatenary(ti, GetCrossingRoadBits(ti->tile));
 			}
-			if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
+			if (HasCatenary(GetRailType(ti->tile))) DrawCatenary(ti);
 			break;
 		}
 
 		default:
 		case ROAD_TILE_DEPOT: {
-			const DrawTileSprites* dts;
-			const DrawTileSeqStruct* dtss;
-			SpriteID palette;
-
 			if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED);
 
-			palette = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile));
+			SpriteID palette = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile));
 
+			const DrawTileSprites *dts;
 			if (HasTileRoadType(ti->tile, ROADTYPE_TRAM)) {
 				dts =  &_tram_depot[GetRoadDepotDirection(ti->tile)];
 			} else {
@@ -1130,7 +1146,10 @@
 
 			DrawGroundSprite(dts->ground.sprite, PAL_NONE);
 
-			for (dtss = dts->seq; dtss->image.sprite != 0; dtss++) {
+			/* End now if buildings are invisible */
+			if (IsInvisibilitySet(TO_BUILDINGS)) break;
+
+			for (const DrawTileSeqStruct *dtss = dts->seq; dtss->image.sprite != 0; dtss++) {
 				SpriteID image = dtss->image.sprite;
 				SpriteID pal;
 
@@ -1157,15 +1176,14 @@
 void DrawRoadDepotSprite(int x, int y, DiagDirection dir, RoadType rt)
 {
 	SpriteID palette = PLAYER_SPRITE_COLOR(_local_player);
-	const DrawTileSprites* dts = (rt == ROADTYPE_TRAM) ? &_tram_depot[dir] : &_road_depot[dir];
-	const DrawTileSeqStruct* dtss;
+	const DrawTileSprites *dts = (rt == ROADTYPE_TRAM) ? &_tram_depot[dir] : &_road_depot[dir];
 
 	x += 33;
 	y += 17;
 
 	DrawSprite(dts->ground.sprite, PAL_NONE, x, y);
 
-	for (dtss = dts->seq; dtss->image.sprite != 0; dtss++) {
+	for (const DrawTileSeqStruct *dtss = dts->seq; dtss->image.sprite != 0; dtss++) {
 		Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z);
 		SpriteID image = dtss->image.sprite;
 
@@ -1245,7 +1263,7 @@
 
 	if (IsRoadDepot(tile)) return;
 
-	const Town* t = ClosestTownFromTile(tile, (uint)-1);
+	const Town *t = ClosestTownFromTile(tile, (uint)-1);
 	if (!HasRoadWorks(tile)) {
 		HouseZonesBits grp = HZB_TOWN_EDGE;
 
@@ -1480,7 +1498,7 @@
 				RoadBits bits = GetAllRoadBits(tile);
 				RoadBits bits_copy = bits;
 				/* Check if the slope-road_bits combination is valid at all, i.e. it is save to call GetRoadFoundation(). */
-				if (!CmdFailed(CheckRoadSlope(tileh_new, &bits_copy, ROAD_NONE))) {
+				if (!CmdFailed(CheckRoadSlope(tileh_new, &bits_copy, ROAD_NONE, ROAD_NONE))) {
 					/* CheckRoadSlope() sometimes changes the road_bits, if it does not agree with them. */
 					if (bits == bits_copy) {
 						uint z_old;
--- a/src/road_func.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/road_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -101,6 +101,17 @@
 }
 
 /**
+ * Check if we've got a straight road
+ *
+ * @param r The given RoadBits
+ * @return true if we've got a straight road
+ */
+static inline bool IsStraightRoad(RoadBits r)
+{
+	return (r == ROAD_X || r == ROAD_Y);
+}
+
+/**
  * Create the road-part which belongs to the given DiagDirection
  *
  * This function returns a RoadBits value which belongs to
@@ -115,6 +126,20 @@
 }
 
 /**
+ * Create the road-part which belongs to the given Axis
+ *
+ * This function returns a RoadBits value which belongs to
+ * the given Axis.
+ *
+ * @param a The Axis
+ * @return The result RoadBits which the selected road-part set
+ */
+static inline RoadBits AxisToRoadBits(Axis a)
+{
+	return a == AXIS_X ? ROAD_X : ROAD_Y;
+}
+
+/**
  * Finds out, whether given player has all given RoadTypes available
  * @param PlayerID ID of player
  * @param rts RoadTypes to test
--- a/src/road_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/road_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -16,7 +16,6 @@
 #include "road_cmd.h"
 #include "road_map.h"
 #include "station_map.h"
-#include "station.h"
 #include "functions.h"
 #include "window_func.h"
 #include "vehicle_func.h"
@@ -27,7 +26,7 @@
 #include "table/sprites.h"
 #include "table/strings.h"
 
-static void ShowRVStationPicker(RoadStop::Type rs);
+static void ShowRVStationPicker(RoadStopType rs);
 static void ShowRoadDepotPicker();
 
 static bool _remove_button_clicked;
@@ -176,7 +175,7 @@
 static void BuildRoadOutsideStation(TileIndex tile, DiagDirection direction)
 {
 	tile += TileOffsByDiagDir(direction);
-	// if there is a roadpiece just outside of the station entrance, build a connecting route
+	/* if there is a roadpiece just outside of the station entrance, build a connecting route */
 	if (IsNormalRoadTile(tile)) {
 		if (GetRoadBits(tile, _cur_roadtype) != ROAD_NONE) {
 			DoCommandP(tile, _cur_roadtype << 4 | DiagDirToRoadBits(ReverseDiagDir(direction)), 0, NULL, CMD_BUILD_ROAD);
@@ -215,18 +214,18 @@
 static void PlaceRoad_BusStation(TileIndex tile)
 {
 	if (_remove_button_clicked) {
-		DoCommandP(tile, 0, RoadStop::BUS, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[RoadStop::BUS]));
+		DoCommandP(tile, 0, ROADSTOP_BUS, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[ROADSTOP_BUS]));
 	} else {
-		PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | RoadStop::BUS, CMD_BUILD_ROAD_STOP | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::BUS]));
+		PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | ROADSTOP_BUS, CMD_BUILD_ROAD_STOP | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[ROADSTOP_BUS]));
 	}
 }
 
 static void PlaceRoad_TruckStation(TileIndex tile)
 {
 	if (_remove_button_clicked) {
-		DoCommandP(tile, 0, RoadStop::TRUCK, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[RoadStop::TRUCK]));
+		DoCommandP(tile, 0, ROADSTOP_TRUCK, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[ROADSTOP_TRUCK]));
 	} else {
-		PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | RoadStop::TRUCK, CMD_BUILD_ROAD_STOP | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::TRUCK]));
+		PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | ROADSTOP_TRUCK, CMD_BUILD_ROAD_STOP | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[ROADSTOP_TRUCK]));
 	}
 }
 
@@ -334,13 +333,13 @@
 static void BuildRoadClick_BusStation(Window *w)
 {
 	if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD)) return;
-	if (HandlePlacePushButton(w, RTW_BUS_STATION, SPR_CURSOR_BUS_STATION, VHM_RECT, PlaceRoad_BusStation)) ShowRVStationPicker(RoadStop::BUS);
+	if (HandlePlacePushButton(w, RTW_BUS_STATION, SPR_CURSOR_BUS_STATION, VHM_RECT, PlaceRoad_BusStation)) ShowRVStationPicker(ROADSTOP_BUS);
 }
 
 static void BuildRoadClick_TruckStation(Window *w)
 {
 	if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD)) return;
-	if (HandlePlacePushButton(w, RTW_TRUCK_STATION, SPR_CURSOR_TRUCK_STATION, VHM_RECT, PlaceRoad_TruckStation)) ShowRVStationPicker(RoadStop::TRUCK);
+	if (HandlePlacePushButton(w, RTW_TRUCK_STATION, SPR_CURSOR_TRUCK_STATION, VHM_RECT, PlaceRoad_TruckStation)) ShowRVStationPicker(ROADSTOP_TRUCK);
 }
 
 /**
@@ -410,7 +409,7 @@
  * @param w The toolbar window
  * @param clicked_widget The widget which the player clicked just now
  */
-static void UpdateOptionWidgetStatus(Window *w, int clicked_widget)
+static void UpdateOptionWidgetStatus(Window *w, RoadToolbarWidgets clicked_widget)
 {
 	/* The remove and the one way button state is driven
 	 * by the other buttons so they don't act on themselfs.
@@ -418,15 +417,20 @@
 	switch (clicked_widget) {
 		case RTW_REMOVE:
 			w->RaiseWidget(RTW_ONE_WAY);
+			w->InvalidateWidget(RTW_ONE_WAY);
 			break;
+
 		case RTW_ONE_WAY:
 			w->RaiseWidget(RTW_REMOVE);
+			w->InvalidateWidget(RTW_REMOVE);
 			break;
+
 		case RTW_BUS_STATION:
 		case RTW_TRUCK_STATION:
 			w->DisableWidget(RTW_ONE_WAY);
 			w->SetWidgetDisabledState(RTW_REMOVE, !w->IsWidgetLowered(clicked_widget));
 			break;
+
 		case RTW_ROAD_X:
 		case RTW_ROAD_Y:
 		case RTW_AUTOROAD:
@@ -435,6 +439,7 @@
 				RTW_ONE_WAY,
 				WIDGET_LIST_END);
 			break;
+
 		default:
 			/* When any other buttons than road/station, raise and
 			 * disable the removal button */
@@ -453,157 +458,163 @@
 static void BuildRoadToolbWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE:
-		w->SetWidgetsDisabledState(true,
-			RTW_REMOVE,
-			RTW_ONE_WAY,
-			WIDGET_LIST_END);
-		break;
+		case WE_CREATE:
+			w->SetWidgetsDisabledState(true,
+				RTW_REMOVE,
+				RTW_ONE_WAY,
+				WIDGET_LIST_END);
+			break;
 
-	case WE_PAINT:
-		w->SetWidgetsDisabledState(!CanBuildVehicleInfrastructure(VEH_ROAD),
-			RTW_DEPOT,
-			RTW_BUS_STATION,
-			RTW_TRUCK_STATION,
-			WIDGET_LIST_END);
-		DrawWindowWidgets(w);
-		break;
+		case WE_PAINT:
+			w->SetWidgetsDisabledState(!CanBuildVehicleInfrastructure(VEH_ROAD),
+				RTW_DEPOT,
+				RTW_BUS_STATION,
+				RTW_TRUCK_STATION,
+				WIDGET_LIST_END);
+			DrawWindowWidgets(w);
+			break;
 
-	case WE_CLICK:
-		if (e->we.click.widget >= RTW_ROAD_X) {
-			_remove_button_clicked = false;
-			_one_way_button_clicked = false;
-			_build_road_button_proc[e->we.click.widget - RTW_ROAD_X](w);
-		}
-		UpdateOptionWidgetStatus(w, e->we.click.widget);
-		if (_ctrl_pressed) RoadToolbar_CtrlChanged(w);
-		break;
-
-	case WE_KEYPRESS:
-		for (uint8 i = 0; i != lengthof(_road_keycodes); i++) {
-			if (e->we.keypress.keycode == _road_keycodes[i]) {
-				e->we.keypress.cont = false;
+		case WE_CLICK:
+			if (e->we.click.widget >= RTW_ROAD_X) {
 				_remove_button_clicked = false;
 				_one_way_button_clicked = false;
-				_build_road_button_proc[i](w);
-				UpdateOptionWidgetStatus(w, i + RTW_ROAD_X);
-				if (_ctrl_pressed) RoadToolbar_CtrlChanged(w);
-				break;
+				_build_road_button_proc[e->we.click.widget - RTW_ROAD_X](w);
 			}
-		}
-		MarkTileDirty(_thd.pos.x, _thd.pos.y); // redraw tile selection
-		break;
-
-	case WE_PLACE_OBJ:
-		_remove_button_clicked = w->IsWidgetLowered(RTW_REMOVE);
-		_one_way_button_clicked = w->IsWidgetLowered(RTW_ONE_WAY);
-		_place_proc(e->we.place.tile);
-		break;
-
-	case WE_ABORT_PLACE_OBJ:
-		w->RaiseButtons();
-		w->SetWidgetsDisabledState(true,
-			RTW_REMOVE,
-			RTW_ONE_WAY,
-			WIDGET_LIST_END);
-		w->InvalidateWidget(RTW_REMOVE);
-		w->InvalidateWidget(RTW_ONE_WAY);
-
-		w = FindWindowById(WC_BUS_STATION, 0);
-		if (w != NULL) WP(w, def_d).close = true;
-		w = FindWindowById(WC_TRUCK_STATION, 0);
-		if (w != NULL) WP(w, def_d).close = true;
-		w = FindWindowById(WC_BUILD_DEPOT, 0);
-		if (w != NULL) WP(w, def_d).close = true;
-		break;
+			UpdateOptionWidgetStatus(w, (RoadToolbarWidgets)e->we.click.widget);
+			if (_ctrl_pressed) RoadToolbar_CtrlChanged(w);
+			break;
 
-	case WE_PLACE_DRAG:
-		/* Here we update the end tile flags
-		 * of the road placement actions.
-		 * At first we reset the end halfroad
-		 * bits and if needed we set them again. */
-		switch (e->we.place.select_proc) {
-			case DDSP_PLACE_ROAD_X_DIR:
-				_place_road_flag &= ~RF_END_HALFROAD_X;
-				if (e->we.place.pt.x & 8) _place_road_flag |= RF_END_HALFROAD_X;
-				break;
-
-			case DDSP_PLACE_ROAD_Y_DIR:
-				_place_road_flag &= ~RF_END_HALFROAD_Y;
-				if (e->we.place.pt.y & 8) _place_road_flag |= RF_END_HALFROAD_Y;
-				break;
-
-			case DDSP_PLACE_AUTOROAD:
-				_place_road_flag &= ~(RF_END_HALFROAD_Y | RF_END_HALFROAD_X);
-				if (e->we.place.pt.y & 8) _place_road_flag |= RF_END_HALFROAD_Y;
-				if (e->we.place.pt.x & 8) _place_road_flag |= RF_END_HALFROAD_X;
+		case WE_KEYPRESS:
+			for (uint i = 0; i != lengthof(_road_keycodes); i++) {
+				if (e->we.keypress.keycode == _road_keycodes[i]) {
+					e->we.keypress.cont = false;
+					_remove_button_clicked = false;
+					_one_way_button_clicked = false;
+					_build_road_button_proc[i](w);
+					UpdateOptionWidgetStatus(w, (RoadToolbarWidgets)(i + RTW_ROAD_X));
+					if (_ctrl_pressed) RoadToolbar_CtrlChanged(w);
+					break;
+				}
+			}
+			MarkTileDirty(_thd.pos.x, _thd.pos.y); // redraw tile selection
+			break;
 
-				/* For autoroad we need to update the
-				 * direction of the road */
-				if (_thd.size.x > _thd.size.y || (_thd.size.x == _thd.size.y &&
-						( (_tile_fract_coords.x < _tile_fract_coords.y && (_tile_fract_coords.x + _tile_fract_coords.y) < 16) ||
-						  (_tile_fract_coords.x > _tile_fract_coords.y && (_tile_fract_coords.x + _tile_fract_coords.y) > 16) ))) {
-					/* Set dir = X */
-					_place_road_flag &= ~RF_DIR_Y;
-				} else {
-					/* Set dir = Y */
-					_place_road_flag |= RF_DIR_Y;
-				}
+		case WE_PLACE_OBJ:
+			_remove_button_clicked = w->IsWidgetLowered(RTW_REMOVE);
+			_one_way_button_clicked = w->IsWidgetLowered(RTW_ONE_WAY);
+			_place_proc(e->we.place.tile);
+			break;
 
-				break;
-		}
-
-		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
-		return;
+		case WE_ABORT_PLACE_OBJ:
+			w->RaiseButtons();
+			w->SetWidgetsDisabledState(true,
+				RTW_REMOVE,
+				RTW_ONE_WAY,
+				WIDGET_LIST_END);
+			w->InvalidateWidget(RTW_REMOVE);
+			w->InvalidateWidget(RTW_ONE_WAY);
 
-	case WE_PLACE_MOUSEUP:
-		if (e->we.place.pt.x != -1) {
-			TileIndex start_tile = e->we.place.starttile;
-			TileIndex end_tile = e->we.place.tile;
+			w = FindWindowById(WC_BUS_STATION, 0);
+			if (w != NULL) WP(w, def_d).close = true;
+			w = FindWindowById(WC_TRUCK_STATION, 0);
+			if (w != NULL) WP(w, def_d).close = true;
+			w = FindWindowById(WC_BUILD_DEPOT, 0);
+			if (w != NULL) WP(w, def_d).close = true;
+			break;
 
+		case WE_PLACE_DRAG:
+			/* Here we update the end tile flags
+			* of the road placement actions.
+			* At first we reset the end halfroad
+			* bits and if needed we set them again. */
 			switch (e->we.place.select_proc) {
-				case DDSP_BUILD_BRIDGE:
-					ResetObjectToPlace();
-					ShowBuildBridgeWindow(start_tile, end_tile, TRANSPORT_ROAD, RoadTypeToRoadTypes(_cur_roadtype));
+				case DDSP_PLACE_ROAD_X_DIR:
+					_place_road_flag &= ~RF_END_HALFROAD_X;
+					if (e->we.place.pt.x & 8) _place_road_flag |= RF_END_HALFROAD_X;
 					break;
 
-				case DDSP_DEMOLISH_AREA:
-					DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
+				case DDSP_PLACE_ROAD_Y_DIR:
+					_place_road_flag &= ~RF_END_HALFROAD_Y;
+					if (e->we.place.pt.y & 8) _place_road_flag |= RF_END_HALFROAD_Y;
 					break;
 
-				case DDSP_PLACE_ROAD_X_DIR:
-				case DDSP_PLACE_ROAD_Y_DIR:
 				case DDSP_PLACE_AUTOROAD:
-					/* Flag description:
-					 * Use the first three bits (0x07) if dir == Y
-					 * else use the last 2 bits (X dir has
-					 * not the 3rd bit set) */
-					_place_road_flag = (RoadFlags)((_place_road_flag & RF_DIR_Y) ? (_place_road_flag & 0x07) : (_place_road_flag >> 3));
+					_place_road_flag &= ~(RF_END_HALFROAD_Y | RF_END_HALFROAD_X);
+					if (e->we.place.pt.y & 8) _place_road_flag |= RF_END_HALFROAD_Y;
+					if (e->we.place.pt.x & 8) _place_road_flag |= RF_END_HALFROAD_X;
 
-					DoCommandP(end_tile, start_tile, _place_road_flag | (_cur_roadtype << 3) | (_one_way_button_clicked << 5), CcPlaySound1D,
-						(_ctrl_pressed || _remove_button_clicked) ?
-						CMD_REMOVE_LONG_ROAD | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_road) :
-						CMD_BUILD_LONG_ROAD | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_road));
+					/* For autoroad we need to update the
+					* direction of the road */
+					if (_thd.size.x > _thd.size.y || (_thd.size.x == _thd.size.y &&
+							( (_tile_fract_coords.x < _tile_fract_coords.y && (_tile_fract_coords.x + _tile_fract_coords.y) < 16) ||
+							(_tile_fract_coords.x > _tile_fract_coords.y && (_tile_fract_coords.x + _tile_fract_coords.y) > 16) ))) {
+						/* Set dir = X */
+						_place_road_flag &= ~RF_DIR_Y;
+					} else {
+						/* Set dir = Y */
+						_place_road_flag |= RF_DIR_Y;
+					}
+
+					break;
+
+				default:
 					break;
 			}
-		}
-		break;
-
-	case WE_PLACE_PRESIZE: {
-		TileIndex tile = e->we.place.tile;
 
-		DoCommand(tile, 0x200 | RoadTypeToRoadTypes(_cur_roadtype), 0, DC_AUTO, CMD_BUILD_TUNNEL);
-		VpSetPresizeRange(tile, _build_tunnel_endtile == 0 ? tile : _build_tunnel_endtile);
-		break;
-	}
+			VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
+			return;
 
-	case WE_DESTROY:
-		if (_patches.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0);
-		break;
+		case WE_PLACE_MOUSEUP:
+			if (e->we.place.pt.x != -1) {
+				TileIndex start_tile = e->we.place.starttile;
+				TileIndex end_tile = e->we.place.tile;
 
-	case WE_CTRL_CHANGED:
-		if (RoadToolbar_CtrlChanged(w)) e->we.ctrl.cont = false;
-		break;
+				switch (e->we.place.select_proc) {
+					default: NOT_REACHED();
+					case DDSP_BUILD_BRIDGE:
+						ResetObjectToPlace();
+						ShowBuildBridgeWindow(start_tile, end_tile, TRANSPORT_ROAD, RoadTypeToRoadTypes(_cur_roadtype));
+						break;
+
+					case DDSP_DEMOLISH_AREA:
+						DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
+						break;
+
+					case DDSP_PLACE_ROAD_X_DIR:
+					case DDSP_PLACE_ROAD_Y_DIR:
+					case DDSP_PLACE_AUTOROAD:
+						/* Flag description:
+						* Use the first three bits (0x07) if dir == Y
+						* else use the last 2 bits (X dir has
+						* not the 3rd bit set) */
+						_place_road_flag = (RoadFlags)((_place_road_flag & RF_DIR_Y) ? (_place_road_flag & 0x07) : (_place_road_flag >> 3));
+
+						DoCommandP(end_tile, start_tile, _place_road_flag | (_cur_roadtype << 3) | (_one_way_button_clicked << 5), CcPlaySound1D,
+							(_ctrl_pressed || _remove_button_clicked) ?
+							CMD_REMOVE_LONG_ROAD | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_road) :
+							CMD_BUILD_LONG_ROAD | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_road));
+						break;
+				}
+			}
+			break;
+
+		case WE_PLACE_PRESIZE: {
+			TileIndex tile = e->we.place.tile;
+
+			DoCommand(tile, 0x200 | RoadTypeToRoadTypes(_cur_roadtype), 0, DC_AUTO, CMD_BUILD_TUNNEL);
+			VpSetPresizeRange(tile, _build_tunnel_endtile == 0 ? tile : _build_tunnel_endtile);
+		} break;
+
+		case WE_DESTROY:
+			if (_patches.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0);
+			break;
+
+		case WE_CTRL_CHANGED:
+			if (RoadToolbar_CtrlChanged(w)) e->we.ctrl.cont = false;
+			break;
+
+		default:
+			break;
 	}
 }
 
@@ -723,39 +734,47 @@
 static void BuildRoadDepotWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE: w->LowerWidget(_road_depot_orientation + BRDW_DEPOT_NE); break;
-
-	case WE_PAINT:
-		DrawWindowWidgets(w);
-
-		DrawRoadDepotSprite(70, 17, DIAGDIR_NE, _cur_roadtype);
-		DrawRoadDepotSprite(70, 69, DIAGDIR_SE, _cur_roadtype);
-		DrawRoadDepotSprite( 2, 69, DIAGDIR_SW, _cur_roadtype);
-		DrawRoadDepotSprite( 2, 17, DIAGDIR_NW, _cur_roadtype);
-		break;
+		case WE_CREATE:
+			w->LowerWidget(_road_depot_orientation + BRDW_DEPOT_NE);
+			break;
 
-	case WE_CLICK:
-		switch (e->we.click.widget) {
-			case BRDW_DEPOT_NW:
-			case BRDW_DEPOT_NE:
-			case BRDW_DEPOT_SW:
-			case BRDW_DEPOT_SE:
-				w->RaiseWidget(_road_depot_orientation + BRDW_DEPOT_NE);
-				_road_depot_orientation = (DiagDirection)(e->we.click.widget - BRDW_DEPOT_NE);
-				w->LowerWidget(_road_depot_orientation + BRDW_DEPOT_NE);
-				SndPlayFx(SND_15_BEEP);
-				SetWindowDirty(w);
-				break;
-		}
-		break;
+		case WE_PAINT:
+			DrawWindowWidgets(w);
 
-	case WE_MOUSELOOP:
-		if (WP(w, def_d).close) DeleteWindow(w);
-		break;
+			DrawRoadDepotSprite(70, 17, DIAGDIR_NE, _cur_roadtype);
+			DrawRoadDepotSprite(70, 69, DIAGDIR_SE, _cur_roadtype);
+			DrawRoadDepotSprite( 2, 69, DIAGDIR_SW, _cur_roadtype);
+			DrawRoadDepotSprite( 2, 17, DIAGDIR_NW, _cur_roadtype);
+			break;
 
-	case WE_DESTROY:
-		if (!WP(w, def_d).close) ResetObjectToPlace();
-		break;
+		case WE_CLICK:
+			switch (e->we.click.widget) {
+				case BRDW_DEPOT_NW:
+				case BRDW_DEPOT_NE:
+				case BRDW_DEPOT_SW:
+				case BRDW_DEPOT_SE:
+					w->RaiseWidget(_road_depot_orientation + BRDW_DEPOT_NE);
+					_road_depot_orientation = (DiagDirection)(e->we.click.widget - BRDW_DEPOT_NE);
+					w->LowerWidget(_road_depot_orientation + BRDW_DEPOT_NE);
+					SndPlayFx(SND_15_BEEP);
+					SetWindowDirty(w);
+					break;
+
+				default:
+					break;
+			}
+			break;
+
+		case WE_MOUSELOOP:
+			if (WP(w, def_d).close) DeleteWindow(w);
+			break;
+
+		case WE_DESTROY:
+			if (!WP(w, def_d).close) ResetObjectToPlace();
+			break;
+
+		default:
+			break;
 	}
 }
 
@@ -823,96 +842,104 @@
 static void RoadStationPickerWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
-	case WE_CREATE:
-		/* Trams don't have non-drivethrough stations */
-		if (_cur_roadtype == ROADTYPE_TRAM && _road_station_picker_orientation < DIAGDIR_END) {
-			_road_station_picker_orientation = DIAGDIR_END;
-		}
-		w->SetWidgetsDisabledState(_cur_roadtype == ROADTYPE_TRAM,
-			BRSW_STATION_NE,
-			BRSW_STATION_SE,
-			BRSW_STATION_SW,
-			BRSW_STATION_NW,
-			WIDGET_LIST_END);
-
-		w->LowerWidget(_road_station_picker_orientation + BRSW_STATION_NE);
-		w->LowerWidget(_station_show_coverage + BRSW_LT_OFF);
-		break;
-
-	case WE_PAINT: {
-		if (WP(w, def_d).close) return;
-
-		DrawWindowWidgets(w);
-
-		_thd.FSMportLayout = NULL;  // ensure irregular airport support disabled
-		_thd.FSMportMask = NULL;
-
-		if (_station_show_coverage) {
-			int rad = _patches.modified_catchment ? CA_TRUCK /* = CA_BUS */ : CA_UNMODIFIED;
-			SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
-		} else {
-			SetTileSelectSize(1, 1);
-		}
-
-		StationType st = (w->window_class == WC_BUS_STATION) ? STATION_BUS : STATION_TRUCK;
-
-		StationPickerDrawSprite(103, 35, st, INVALID_RAILTYPE, ROADTYPE_ROAD, 0);
-		StationPickerDrawSprite(103, 85, st, INVALID_RAILTYPE, ROADTYPE_ROAD, 1);
-		StationPickerDrawSprite( 35, 85, st, INVALID_RAILTYPE, ROADTYPE_ROAD, 2);
-		StationPickerDrawSprite( 35, 35, st, INVALID_RAILTYPE, ROADTYPE_ROAD, 3);
-
-		StationPickerDrawSprite(171, 35, st, INVALID_RAILTYPE, _cur_roadtype, 4);
-		StationPickerDrawSprite(171, 85, st, INVALID_RAILTYPE, _cur_roadtype, 5);
+		case WE_CREATE:
+			/* Trams don't have non-drivethrough stations */
+			if (_cur_roadtype == ROADTYPE_TRAM && _road_station_picker_orientation < DIAGDIR_END) {
+				_road_station_picker_orientation = DIAGDIR_END;
+			}
+			w->SetWidgetsDisabledState(_cur_roadtype == ROADTYPE_TRAM,
+				BRSW_STATION_NE,
+				BRSW_STATION_SE,
+				BRSW_STATION_SW,
+				BRSW_STATION_NW,
+				WIDGET_LIST_END);
 
-		int text_end = DrawStationCoverageAreaText(2, 146,
-			(w->window_class == WC_BUS_STATION) ? SCT_PASSENGERS_ONLY : SCT_NON_PASSENGERS_ONLY,
-			3) + 4;
-		if (text_end > w->widget[BRSW_BACKGROUND].bottom) {
-			SetWindowDirty(w);
-			ResizeWindowForWidget(w, BRSW_BACKGROUND, 0, text_end - w->widget[BRSW_BACKGROUND].bottom);
-			SetWindowDirty(w);
-		}
-
-	} break;
+			w->LowerWidget(_road_station_picker_orientation + BRSW_STATION_NE);
+			w->LowerWidget(_station_show_coverage + BRSW_LT_OFF);
+			break;
 
-	case WE_CLICK: {
-		switch (e->we.click.widget) {
-			case BRSW_STATION_NE:
-			case BRSW_STATION_SE:
-			case BRSW_STATION_SW:
-			case BRSW_STATION_NW:
-			case BRSW_STATION_X:
-			case BRSW_STATION_Y:
-				w->RaiseWidget(_road_station_picker_orientation + BRSW_STATION_NE);
-				_road_station_picker_orientation = (DiagDirection)(e->we.click.widget - BRSW_STATION_NE);
-				w->LowerWidget(_road_station_picker_orientation + BRSW_STATION_NE);
-				SndPlayFx(SND_15_BEEP);
+		case WE_PAINT: {
+			if (WP(w, def_d).close) return;
+
+			DrawWindowWidgets(w);
+
+			_thd.FSMportLayout = NULL;  // ensure irregular airport support disabled
+			_thd.FSMportMask = NULL;
+
+			if (_station_show_coverage) {
+				int rad = _patches.modified_catchment ? CA_TRUCK /* = CA_BUS */ : CA_UNMODIFIED;
+				SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
+			} else {
+				SetTileSelectSize(1, 1);
+			}
+
+			StationType st = (w->window_class == WC_BUS_STATION) ? STATION_BUS : STATION_TRUCK;
+
+			StationPickerDrawSprite(103, 35, st, INVALID_RAILTYPE, ROADTYPE_ROAD, 0);
+			StationPickerDrawSprite(103, 85, st, INVALID_RAILTYPE, ROADTYPE_ROAD, 1);
+			StationPickerDrawSprite( 35, 85, st, INVALID_RAILTYPE, ROADTYPE_ROAD, 2);
+			StationPickerDrawSprite( 35, 35, st, INVALID_RAILTYPE, ROADTYPE_ROAD, 3);
+
+			StationPickerDrawSprite(171, 35, st, INVALID_RAILTYPE, _cur_roadtype, 4);
+			StationPickerDrawSprite(171, 85, st, INVALID_RAILTYPE, _cur_roadtype, 5);
+
+			int text_end = DrawStationCoverageAreaText(2, 146,
+				(w->window_class == WC_BUS_STATION) ? SCT_PASSENGERS_ONLY : SCT_NON_PASSENGERS_ONLY,
+				3, false);
+			text_end = DrawStationCoverageAreaText(2, text_end + 4,
+				(w->window_class == WC_BUS_STATION) ? SCT_PASSENGERS_ONLY : SCT_NON_PASSENGERS_ONLY,
+				3, true) + 4;
+			if (text_end > w->widget[BRSW_BACKGROUND].bottom) {
 				SetWindowDirty(w);
-				break;
-
-			case BRSW_LT_OFF:
-			case BRSW_LT_ON:
-				w->RaiseWidget(_station_show_coverage + BRSW_LT_OFF);
-				_station_show_coverage = (e->we.click.widget != BRSW_LT_OFF);
-				w->LowerWidget(_station_show_coverage + BRSW_LT_OFF);
-				SndPlayFx(SND_15_BEEP);
+				ResizeWindowForWidget(w, BRSW_BACKGROUND, 0, text_end - w->widget[BRSW_BACKGROUND].bottom);
 				SetWindowDirty(w);
-				break;
-		}
-	} break;
+			}
+		} break;
 
-	case WE_MOUSELOOP: {
-		if (WP(w, def_d).close) {
-			DeleteWindow(w);
-			return;
-		}
+		case WE_CLICK:
+			switch (e->we.click.widget) {
+				case BRSW_STATION_NE:
+				case BRSW_STATION_SE:
+				case BRSW_STATION_SW:
+				case BRSW_STATION_NW:
+				case BRSW_STATION_X:
+				case BRSW_STATION_Y:
+					w->RaiseWidget(_road_station_picker_orientation + BRSW_STATION_NE);
+					_road_station_picker_orientation = (DiagDirection)(e->we.click.widget - BRSW_STATION_NE);
+					w->LowerWidget(_road_station_picker_orientation + BRSW_STATION_NE);
+					SndPlayFx(SND_15_BEEP);
+					SetWindowDirty(w);
+					break;
 
-		CheckRedrawStationCoverage(w);
-	} break;
+				case BRSW_LT_OFF:
+				case BRSW_LT_ON:
+					w->RaiseWidget(_station_show_coverage + BRSW_LT_OFF);
+					_station_show_coverage = (e->we.click.widget != BRSW_LT_OFF);
+					w->LowerWidget(_station_show_coverage + BRSW_LT_OFF);
+					SndPlayFx(SND_15_BEEP);
+					SetWindowDirty(w);
+					break;
 
-	case WE_DESTROY:
-		if (!WP(w, def_d).close) ResetObjectToPlace();
-		break;
+				default:
+					break;
+			}
+			break;
+
+		case WE_MOUSELOOP:
+			if (WP(w, def_d).close) {
+				DeleteWindow(w);
+				return;
+			}
+
+			CheckRedrawStationCoverage(w);
+			break;
+
+		case WE_DESTROY:
+			if (!WP(w, def_d).close) ResetObjectToPlace();
+			break;
+
+		default:
+			break;
 	}
 }
 
@@ -943,12 +970,12 @@
 	RoadStationPickerWndProc
 };
 
-static void ShowRVStationPicker(RoadStop::Type rs)
+static void ShowRVStationPicker(RoadStopType rs)
 {
 	Window *w = AllocateWindowDesc(&_rv_station_picker_desc);
 	if (w == NULL) return;
 
-	w->window_class = (rs == RoadStop::BUS) ? WC_BUS_STATION : WC_TRUCK_STATION;
+	w->window_class = (rs == ROADSTOP_BUS) ? WC_BUS_STATION : WC_TRUCK_STATION;
 	w->widget[BRSW_CAPTION].data = _road_type_infos[_cur_roadtype].picker_title[rs];
 	for (uint i = BRSW_STATION_NE; i < BRSW_LT_OFF; i++) w->widget[i].tooltips = _road_type_infos[_cur_roadtype].picker_tooltip[rs];
 }
--- a/src/road_internal.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/road_internal.h	Tue Apr 15 00:47:19 2008 +0000
@@ -31,6 +31,6 @@
  * @param ti   information about the tile (position, slope)
  * @param tram the roadbits to draw the catenary for
  */
-void DrawTramCatenary(TileInfo *ti, RoadBits tram);
+void DrawTramCatenary(const TileInfo *ti, RoadBits tram);
 
 #endif /* ROAD_INTERNAL_H */
--- a/src/road_map.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/road_map.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -7,14 +7,13 @@
 #include "bridge_map.h"
 #include "tile_cmd.h"
 #include "road_map.h"
-#include "station.h"
 #include "tunnel_map.h"
 #include "station_map.h"
 #include "depot.h"
 #include "tunnelbridge_map.h"
 
 
-RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt)
+RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt, bool straight_tunnel_bridge_entrance)
 {
 	if (!HasTileRoadType(tile, rt)) return ROAD_NONE;
 
@@ -34,7 +33,9 @@
 
 		case MP_TUNNELBRIDGE:
 			if (GetTunnelBridgeTransportType(tile) != TRANSPORT_ROAD) return ROAD_NONE;
-			return DiagDirToRoadBits(ReverseDiagDir(GetTunnelBridgeDirection(tile)));
+			return straight_tunnel_bridge_entrance ?
+					AxisToRoadBits(DiagDirToAxis(GetTunnelBridgeDirection(tile))) :
+					DiagDirToRoadBits(ReverseDiagDir(GetTunnelBridgeDirection(tile)));
 
 		default: return ROAD_NONE;
 	}
--- a/src/road_map.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/road_map.h	Tue Apr 15 00:47:19 2008 +0000
@@ -65,6 +65,26 @@
 	}
 }
 
+/**
+ * Get all RoadBits set on a tile except from the given RoadType
+ *
+ * @param t The tile from which we want to get the RoadBits
+ * @param rt The RoadType which we exclude from the querry
+ * @return all set RoadBits of the tile which are not from the given RoadType
+ */
+static inline RoadBits GetOtherRoadBits(TileIndex t, RoadType rt)
+{
+	return ((rt == ROADTYPE_ROAD) ? ROAD_NONE : GetRoadBits(t, ROADTYPE_ROAD)) |
+		((rt == ROADTYPE_TRAM) ? ROAD_NONE : GetRoadBits(t, ROADTYPE_TRAM)) |
+		((rt == ROADTYPE_HWAY) ? ROAD_NONE : GetRoadBits(t, ROADTYPE_HWAY));
+}
+
+/**
+ * Get all set RoadBits on the given tile
+ *
+ * @param tile The tile from which we want to get the RoadBits
+ * @return all set RoadBits of the tile
+ */
 static inline RoadBits GetAllRoadBits(TileIndex tile)
 {
 	return GetRoadBits(tile, ROADTYPE_ROAD) | GetRoadBits(tile, ROADTYPE_TRAM) | GetRoadBits(tile, ROADTYPE_HWAY);
@@ -328,11 +348,16 @@
  * - road tunnels: entrance is treated as road piece
  * - bridge ramps: start of the ramp is treated as road piece
  * - bridge middle parts: bridge itself is ignored
+ *
+ * If straight_tunnel_bridge_entrance is set a ROAD_X or ROAD_Y
+ * for bridge ramps and tunnel entrances is returned depending
+ * on the orientation of the tunnel or bridge.
  * @param tile the tile to get the road bits for
  * @param rt   the road type to get the road bits form
+ * @param stbe whether to return straight road bits for tunnels/bridges.
  * @return the road bits of the given tile
  */
-RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt);
+RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt, bool straight_tunnel_bridge_entrance = false);
 
 /**
  * Get the accessible track bits for the given tile.
--- a/src/roadveh.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/roadveh.h	Tue Apr 15 00:47:19 2008 +0000
@@ -6,7 +6,7 @@
 #define ROADVEH_H
 
 #include "vehicle_base.h"
-#include "engine.h"
+#include "engine_func.h"
 #include "economy_func.h"
 
 enum RoadVehicleSubType {
@@ -76,6 +76,7 @@
 	bool IsInDepot() const { return this->u.road.state == RVSB_IN_DEPOT; }
 	void Tick();
 	void OnNewDay();
+	TileIndex GetOrderStationLocation(StationID station);
 };
 
 byte GetRoadVehLength(const Vehicle *v);
--- a/src/roadveh_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/roadveh_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -10,11 +10,9 @@
 #include "road_map.h"
 #include "roadveh.h"
 #include "station_map.h"
-#include "timetable.h"
-#include "engine.h"
 #include "command_func.h"
-#include "station.h"
-#include "news.h"
+#include "station_base.h"
+#include "news_func.h"
 #include "pathfind.h"
 #include "npf.h"
 #include "player_func.h"
@@ -42,6 +40,7 @@
 #include "autoreplace_gui.h"
 #include "gfx_func.h"
 #include "settings_type.h"
+#include "order_func.h"
 
 #include "table/strings.h"
 
@@ -437,7 +436,7 @@
 
 			/* search in all directions */
 			for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) {
-				FollowTrack(v->tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, d, EnumRoadSignalFindDepot, NULL, &rfdd);
+				FollowTrack(v->tile, PATHFIND_FLAGS_NONE, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, d, EnumRoadSignalFindDepot, NULL, &rfdd);
 			}
 
 			if (rfdd.best_length != UINT_MAX) return GetDepotByTile(rfdd.tile);
@@ -477,14 +476,15 @@
 	if (v->IsInDepot()) return CMD_ERROR;
 
 	/* If the current orders are already goto-depot */
-	if (v->current_order.type == OT_GOTO_DEPOT) {
-		if (!!(p2 & DEPOT_SERVICE) == HasBit(v->current_order.flags, OF_HALT_IN_DEPOT)) {
+	if (v->current_order.IsType(OT_GOTO_DEPOT)) {
+		bool halt_in_depot = v->current_order.GetDepotActionType() & ODATFB_HALT;
+		if (!!(p2 & DEPOT_SERVICE) == halt_in_depot) {
 			/* We called with a different DEPOT_SERVICE setting.
 			 * Now we change the setting to apply the new one and let the vehicle head for the same depot.
 			 * Note: the if is (true for requesting service == true for ordered to stop in depot) */
 			if (flags & DC_EXEC) {
-				ClrBit(v->current_order.flags, OF_PART_OF_ORDERS);
-				ToggleBit(v->current_order.flags, OF_HALT_IN_DEPOT);
+				v->current_order.SetDepotOrderType(ODTF_MANUAL);
+				v->current_order.SetDepotActionType(halt_in_depot ? ODATF_SERVICE_ONLY : ODATFB_HALT);
 				InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 			}
 			return CommandCost();
@@ -494,11 +494,9 @@
 		if (flags & DC_EXEC) {
 			/* If the orders to 'goto depot' are in the orders list (forced servicing),
 			 * then skip to the next order; effectively cancelling this forced service */
-			if (HasBit(v->current_order.flags, OF_PART_OF_ORDERS))
-				v->cur_order_index++;
+			if (v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) v->cur_order_index++;
 
-			v->current_order.type = OT_DUMMY;
-			v->current_order.flags = 0;
+			v->current_order.MakeDummy();
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 		}
 		return CommandCost();
@@ -508,14 +506,11 @@
 	if (dep == NULL) return_cmd_error(STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT);
 
 	if (flags & DC_EXEC) {
-		if (v->current_order.type == OT_LOADING) v->LeaveStation();
+		if (v->current_order.IsType(OT_LOADING)) v->LeaveStation();
 
 		ClearSlot(v);
-		v->current_order.type = OT_GOTO_DEPOT;
-		v->current_order.flags = OFB_NON_STOP;
-		if (!(p2 & DEPOT_SERVICE)) SetBit(v->current_order.flags, OF_HALT_IN_DEPOT);
-		v->current_order.refit_cargo = CT_INVALID;
-		v->current_order.dest = dep->index;
+		v->current_order.MakeGoToDepot(dep->index, ODTF_MANUAL);
+		if (!(p2 & DEPOT_SERVICE)) v->current_order.SetDepotActionType(ODATFB_HALT);
 		v->dest_tile = dep->xy;
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 	}
@@ -585,9 +580,9 @@
 	uint32 x = _delta_xy_table[direction];
 	this->x_offs        = GB(x,  0, 8);
 	this->y_offs        = GB(x,  8, 8);
-	this->sprite_width  = GB(x, 16, 8);
-	this->sprite_height = GB(x, 24, 8);
-	this->z_height      = 6;
+	this->x_extent      = GB(x, 16, 8);
+	this->y_extent      = GB(x, 24, 8);
+	this->z_extent      = 6;
 }
 
 static void ClearCrashedStation(Vehicle *v)
@@ -699,7 +694,7 @@
 	AddNewsItem(
 		(pass == 1) ?
 			STR_9031_ROAD_VEHICLE_CRASH_DRIVER : STR_9032_ROAD_VEHICLE_CRASH_DIE,
-		NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0),
+		NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
 		v->index,
 		0
 	);
@@ -755,89 +750,32 @@
 	}
 }
 
-static void ProcessRoadVehOrder(Vehicle *v)
+TileIndex RoadVehicle::GetOrderStationLocation(StationID station)
 {
-	const Order *order;
-
-	switch (v->current_order.type) {
-		case OT_GOTO_DEPOT:
-			/* Let a depot order in the orderlist interrupt. */
-			if (!(v->current_order.flags & OFB_PART_OF_ORDERS)) return;
-			if (v->current_order.flags & OFB_SERVICE_IF_NEEDED &&
-					!VehicleNeedsService(v)) {
-				UpdateVehicleTimetable(v, true);
-				v->cur_order_index++;
-			}
-			break;
+	if (station == this->last_station_visited) this->last_station_visited = INVALID_STATION;
 
-		case OT_LOADING:
-		case OT_LEAVESTATION:
-			return;
-
-		default: break;
-	}
-
-	if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0;
-
-	order = GetVehicleOrder(v, v->cur_order_index);
+	TileIndex dest = INVALID_TILE;
+	const RoadStop *rs = GetStation(station)->GetPrimaryRoadStop(this);
+	if (rs != NULL) {
+		uint mindist = MAX_UVALUE(uint);
 
-	if (order == NULL) {
-		v->current_order.Free();
-		v->dest_tile = 0;
-		ClearSlot(v);
-		return;
-	}
+		for (; rs != NULL; rs = rs->GetNextRoadStop(this)) {
+			uint dist = DistanceManhattan(this->tile, rs->xy);
 
-	if (order->type  == v->current_order.type &&
-			order->flags == v->current_order.flags &&
-			order->dest  == v->current_order.dest) {
-		return;
+			if (dist < mindist) {
+				mindist = dist;
+				dest = rs->xy;
+			}
+		}
 	}
 
-	v->current_order = *order;
-
-	switch (order->type) {
-		case OT_GOTO_STATION: {
-			if (order->dest == v->last_station_visited) {
-				v->last_station_visited = INVALID_STATION;
-			}
-
-			const RoadStop *rs = GetStation(order->dest)->GetPrimaryRoadStop(v);
-
-			TileIndex dest = INVALID_TILE;
-			if (rs != NULL) {
-				uint mindist = MAX_UVALUE(uint);
-
-				for (; rs != NULL; rs = rs->GetNextRoadStop(v)) {
-					uint dist = DistanceManhattan(v->tile, rs->xy);
-
-					if (dist < mindist) {
-						mindist = dist;
-						dest = rs->xy;
-					}
-				}
-			}
-
-			if (dest != INVALID_TILE) {
-					v->dest_tile = dest;
-			} else {
-				/* There is no stop left at the station, so don't even TRY to go there */
-				v->cur_order_index++;
-				v->dest_tile = 0;
-			}
-			break;
-		}
-
-		case OT_GOTO_DEPOT:
-			v->dest_tile = GetDepot(order->dest)->xy;
-			break;
-
-		default:
-			v->dest_tile = 0;
-			break;
+	if (dest != INVALID_TILE) {
+		return dest;
+	} else {
+		/* There is no stop left at the station, so don't even TRY to go there */
+		this->cur_order_index++;
+		return 0;
 	}
-
-	InvalidateVehicleOrder(v);
 }
 
 static void StartRoadVehSound(const Vehicle* v)
@@ -918,28 +856,22 @@
 	if (IsCargoInClass(v->cargo_type, CC_PASSENGERS)) {
 		/* Check if station was ever visited before */
 		if (!(st->had_vehicle_of_type & HVOT_BUS)) {
-			uint32 flags;
-
 			st->had_vehicle_of_type |= HVOT_BUS;
 			SetDParam(0, st->index);
-			flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
 			AddNewsItem(
 				v->u.road.roadtype == ROADTYPE_ROAD ? STR_902F_CITIZENS_CELEBRATE_FIRST : STR_CITIZENS_CELEBRATE_FIRST_PASSENGER_TRAM,
-				flags,
+				NM_THIN, NF_VIEWPORT | NF_VEHICLE, (v->owner == _local_player) ? NT_ARRIVAL_PLAYER : NT_ARRIVAL_OTHER, DNC_NONE,
 				v->index,
 				0);
 		}
 	} else {
 		/* Check if station was ever visited before */
 		if (!(st->had_vehicle_of_type & HVOT_TRUCK)) {
-			uint32 flags;
-
 			st->had_vehicle_of_type |= HVOT_TRUCK;
 			SetDParam(0, st->index);
-			flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
 			AddNewsItem(
 				v->u.road.roadtype == ROADTYPE_ROAD ? STR_9030_CITIZENS_CELEBRATE_FIRST : STR_CITIZENS_CELEBRATE_FIRST_CARGO_TRAM,
-				flags,
+				NM_THIN, NF_VIEWPORT | NF_VEHICLE, (v->owner == _local_player) ? NT_ARRIVAL_PLAYER : NT_ARRIVAL_OTHER, DNC_NONE,
 				v->index,
 				0
 			);
@@ -1176,7 +1108,7 @@
 			trackdirs = TRACKDIR_BIT_NONE;
 		} else {
 			/* Our station */
-			RoadStop::Type rstype = IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK;
+			RoadStopType rstype = IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? ROADSTOP_BUS : ROADSTOP_TRUCK;
 
 			if (GetRoadStopType(tile) != rstype) {
 				/* Wrong station type */
@@ -1289,7 +1221,7 @@
 				if (best_track == INVALID_TRACKDIR) best_track = (Trackdir)i; // in case we don't find the path, just pick a track
 				frd.maxtracklen = UINT_MAX;
 				frd.mindist = UINT_MAX;
-				FollowTrack(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, _road_pf_directions[i], EnumRoadTrackFindDist, NULL, &frd);
+				FollowTrack(tile, PATHFIND_FLAGS_NONE, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, _road_pf_directions[i], EnumRoadTrackFindDist, NULL, &frd);
 
 				if (frd.mindist < best_dist || (frd.mindist == best_dist && frd.maxtracklen < best_maxlen)) {
 					best_dist = frd.mindist;
@@ -1461,7 +1393,7 @@
 	};
 	RoadBits required = required_roadbits[dir & 0x07];
 
-	if ((required & GetAnyRoadBits(tile, v->u.road.roadtype)) == ROAD_NONE) {
+	if ((required & GetAnyRoadBits(tile, v->u.road.roadtype, true)) == ROAD_NONE) {
 		dir = INVALID_TRACKDIR;
 	}
 
@@ -1698,7 +1630,7 @@
 		uint turn_around_start_frame = RVC_TURN_AROUND_START_FRAME;
 
 		RoadBits tram;
-		if (v->u.road.roadtype == ROADTYPE_TRAM && CountBits(tram = GetAnyRoadBits(v->tile, ROADTYPE_TRAM)) == 1) {
+		if (v->u.road.roadtype == ROADTYPE_TRAM && CountBits(tram = GetAnyRoadBits(v->tile, ROADTYPE_TRAM, true)) == 1) {
 			/*
 			 * The tram is turning around with one tram 'roadbit'. This means that
 			 * it is using the 'big' corner 'drive data'. However, to support the
@@ -1811,8 +1743,8 @@
 	if (IsRoadVehFront(v) && ((IsInsideMM(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END) &&
 			_road_veh_data_1[v->u.road.state - RVSB_IN_ROAD_STOP + (_opt.road_side << RVS_DRIVE_SIDE)] == v->u.road.frame) ||
 			(IsInsideMM(v->u.road.state, RVSB_IN_DT_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END) &&
-			v->current_order.dest == GetStationIndex(v->tile) &&
-			GetRoadStopType(v->tile) == (IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK) &&
+			v->current_order.GetDestination() == GetStationIndex(v->tile) &&
+			GetRoadStopType(v->tile) == (IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? ROADSTOP_BUS : ROADSTOP_TRUCK) &&
 			v->u.road.frame == RVC_DRIVE_THROUGH_STOP_FRAME))) {
 
 		RoadStop *rs = GetRoadStopByTile(v->tile, GetRoadStopType(v->tile));
@@ -1821,13 +1753,13 @@
 		/* Vehicle is at the stop position (at a bay) in a road stop.
 		 * Note, if vehicle is loading/unloading it has already been handled,
 		 * so if we get here the vehicle has just arrived or is just ready to leave. */
-		if (v->current_order.type != OT_LEAVESTATION &&
-				v->current_order.type != OT_GOTO_DEPOT) {
+		if (!v->current_order.IsType(OT_LEAVESTATION) &&
+				!v->current_order.IsType(OT_GOTO_DEPOT)) {
 			/* Vehicle has arrived at a bay in a road stop */
 
 			if (IsDriveThroughStopTile(v->tile)) {
 				TileIndex next_tile = TILE_ADD(v->tile, TileOffsByDir(v->direction));
-				RoadStop::Type type = IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK;
+				RoadStopType type = IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? ROADSTOP_BUS : ROADSTOP_TRUCK;
 
 				/* Check if next inline bay is free */
 				if (IsDriveThroughStopTile(next_tile) && (GetRoadStopType(next_tile) == type)) {
@@ -1859,7 +1791,7 @@
 		}
 
 		/* Vehicle is ready to leave a bay in a road stop */
-		if (v->current_order.type != OT_GOTO_DEPOT) {
+		if (!v->current_order.IsType(OT_GOTO_DEPOT)) {
 			if (rs->IsEntranceBusy()) {
 				/* Road stop entrance is busy, so wait as there is nowhere else to go */
 				v->cur_speed = 0;
@@ -1885,12 +1817,12 @@
 			if (v->dest_tile != v->u.road.slot->xy) {
 				DEBUG(ms, 2, " stop tile 0x%X is not destination tile 0x%X. Multistop desync", v->u.road.slot->xy, v->dest_tile);
 			}
-			if (v->current_order.type != OT_GOTO_STATION) {
-				DEBUG(ms, 2, " current order type (%d) is not OT_GOTO_STATION", v->current_order.type);
+			if (!v->current_order.IsType(OT_GOTO_STATION)) {
+				DEBUG(ms, 2, " current order type (%d) is not OT_GOTO_STATION", v->current_order.GetType());
 			} else {
-				if (v->current_order.dest != st->index)
+				if (v->current_order.GetDestination() != st->index)
 					DEBUG(ms, 2, " current station %d is not target station in current_order.station (%d)",
-							st->index, v->current_order.dest);
+							st->index, v->current_order.GetDestination());
 			}
 
 			DEBUG(ms, 2, " force a slot clearing");
@@ -1945,10 +1877,10 @@
 
 	if (v->vehstatus & VS_STOPPED) return;
 
-	ProcessRoadVehOrder(v);
+	ProcessOrders(v);
 	v->HandleLoading();
 
-	if (v->current_order.type == OT_LOADING) return;
+	if (v->current_order.IsType(OT_LOADING)) return;
 
 	if (v->IsInDepot() && RoadVehLeaveDepot(v, true)) return;
 
@@ -1979,7 +1911,7 @@
 static void CheckIfRoadVehNeedsService(Vehicle *v)
 {
 	/* If we already got a slot at a stop, use that FIRST, and go to a depot later */
-	if (v->u.road.slot != NULL || _patches.servint_roadveh == 0 || !VehicleNeedsService(v)) return;
+	if (v->u.road.slot != NULL || _patches.servint_roadveh == 0 || !v->NeedsAutomaticServicing()) return;
 	if (v->IsInDepot()) {
 		VehicleServiceInDepot(v);
 		return;
@@ -1989,26 +1921,23 @@
 	const Depot *depot = FindClosestRoadDepot(v);
 
 	if (depot == NULL || DistanceManhattan(v->tile, depot->xy) > 12) {
-		if (v->current_order.type == OT_GOTO_DEPOT) {
-			v->current_order.type = OT_DUMMY;
-			v->current_order.flags = 0;
+		if (v->current_order.IsType(OT_GOTO_DEPOT)) {
+			v->current_order.MakeDummy();
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 		}
 		return;
 	}
 
-	if (v->current_order.type == OT_GOTO_DEPOT &&
-			v->current_order.flags & OFB_NON_STOP &&
+	if (v->current_order.IsType(OT_GOTO_DEPOT) &&
+			v->current_order.GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS &&
 			!Chance16(1, 20)) {
 		return;
 	}
 
-	if (v->current_order.type == OT_LOADING) v->LeaveStation();
+	if (v->current_order.IsType(OT_LOADING)) v->LeaveStation();
 	ClearSlot(v);
 
-	v->current_order.type = OT_GOTO_DEPOT;
-	v->current_order.flags = OFB_NON_STOP;
-	v->current_order.dest = depot->index;
+	v->current_order.MakeGoToDepot(depot->index, ODTFB_SERVICE);
 	v->dest_tile = depot->xy;
 	InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 }
@@ -2026,15 +1955,15 @@
 	CheckOrders(this);
 
 	/* Current slot has expired */
-	if (this->current_order.type == OT_GOTO_STATION && this->u.road.slot != NULL && this->u.road.slot_age-- == 0) {
+	if (this->current_order.IsType(OT_GOTO_STATION) && this->u.road.slot != NULL && this->u.road.slot_age-- == 0) {
 		DEBUG(ms, 3, "Slot expired for vehicle %d (index %d) at stop 0x%X",
 			this->unitnumber, this->index, this->u.road.slot->xy);
 		ClearSlot(this);
 	}
 
 	/* update destination */
-	if (!(this->vehstatus & VS_STOPPED) && this->current_order.type == OT_GOTO_STATION && this->u.road.slot == NULL && !(this->vehstatus & VS_CRASHED)) {
-		Station *st = GetStation(this->current_order.dest);
+	if (!(this->vehstatus & VS_STOPPED) && this->current_order.IsType(OT_GOTO_STATION) && this->u.road.slot == NULL && !(this->vehstatus & VS_CRASHED)) {
+		Station *st = GetStation(this->current_order.GetDestination());
 		RoadStop *rs = st->GetPrimaryRoadStop(this);
 		RoadStop *best = NULL;
 
--- a/src/roadveh_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/roadveh_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -17,6 +17,7 @@
 #include "strings_func.h"
 #include "vehicle_func.h"
 #include "string_func.h"
+#include "order_func.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -108,15 +109,29 @@
 	 * 0, we draw enough vehicles for 10 standard vehicle lengths. */
 	int max_length = (count == 0) ? 80 : count * 8;
 
-	for (int dx = 0 ; v != NULL && dx < max_length ; dx += v->u.road.cached_veh_length, v = v->Next()) {
-		if (dx + v->u.road.cached_veh_length > 0 && dx <= max_length) {
+	/* Width of highlight box */
+	int highlight_w = 0;
+
+	for (int dx = 0; v != NULL && dx < max_length ; v = v->Next()) {
+		int width = v->u.road.cached_veh_length;
+
+		if (dx + width > 0 && dx <= max_length) {
 			SpriteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
 			DrawSprite(v->GetImage(DIR_W), pal, x + 14 + RoadVehLengthToPixels(dx), y + 6);
 
 			if (v->index == selection) {
-				DrawFrameRect(x - 1, y - 1, x + 28, y + 12, 15, FR_BORDERONLY);
+				/* Set the highlight position */
+				highlight_w = RoadVehLengthToPixels(width);
+			} else if (_cursor.vehchain && highlight_w != 0) {
+				highlight_w += RoadVehLengthToPixels(width);
 			}
 		}
+
+		dx += width;
+	}
+
+	if (highlight_w != 0) {
+		DrawFrameRect(x - 1, y - 1, x - 1 + highlight_w, y + 12, 15, FR_BORDERONLY);
 	}
 }
 
--- a/src/saveload.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/saveload.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -16,7 +16,7 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
-#include "station.h"
+#include "station_base.h"
 #include "thread.h"
 #include "town.h"
 #include "saveload.h"
@@ -1600,7 +1600,7 @@
 		InitializeGame(IG_DATE_RESET, 256, 256); // set a mapsize of 256x256 for TTDPatch games or it might get confused
 		if (!LoadOldSaveGame(filename)) return SL_REINIT;
 		_sl_version = 0;
-		AfterLoadGame();
+		if (!AfterLoadGame()) return SL_REINIT;
 		return SL_OK;
 	}
 
--- a/src/saveload.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/saveload.h	Tue Apr 15 00:47:19 2008 +0000
@@ -13,7 +13,7 @@
 
 #define SIZE_MAX ((size_t)-1)
 
-static const uint NEWGRF_AIRPORTS_SAVEGAME = 92;
+static const uint NEWGRF_AIRPORTS_SAVEGAME = 93;
 
 enum SaveOrLoadResult {
 	SL_OK     = 0, ///< completed successfully
--- a/src/settings.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/settings.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -37,7 +37,7 @@
 #include "genworld.h"
 #include "rail.h"
 #include "train.h"
-#include "news.h"
+#include "news_func.h"
 #include "window_func.h"
 #include "strings_func.h"
 #include "vehicle_func.h"
@@ -49,7 +49,9 @@
 #endif
 #include "spritecache.h"
 #include "transparency.h"
+#include "textbuf_gui.h"
 #include "string_func.h"
+#include "rail_gui.h"
 #include "gui.h"
 #include "town.h"
 #include "video/video_driver.hpp"
@@ -236,7 +238,7 @@
 	while (fgets(buffer, sizeof(buffer), in)) {
 
 		/* trim whitespace from the left side */
-		for (s = buffer; *s == ' ' || *s == '\t'; s++);
+		for (s = buffer; *s == ' ' || *s == '\t'; s++) {}
 
 		/* trim whitespace from right side. */
 		e = s + strlen(s);
@@ -278,10 +280,10 @@
 			/* find end of keyname */
 			if (*s == '\"') {
 				s++;
-				for (t = s; *t != '\0' && *t != '\"'; t++);
+				for (t = s; *t != '\0' && *t != '\"'; t++) {}
 				if (*t == '\"') *t = ' ';
 			} else {
-				for (t = s; *t != '\0' && *t != '=' && *t != '\t' && *t != ' '; t++);
+				for (t = s; *t != '\0' && *t != '=' && *t != '\t' && *t != ' '; t++) {}
 			}
 
 			/* it's an item in an existing group */
@@ -1195,6 +1197,26 @@
 	return 0;
 }
 
+static int32 RealisticAccelerationChanged(int32 p1)
+{
+	Vehicle *v;
+
+	FOR_ALL_VEHICLES(v) {
+		if (v->type == VEH_TRAIN && IsFrontEngine(v)) UpdateTrainAcceleration(v);
+	}
+
+	return 0;
+}
+
+static int32 DragSignalsDensityChanged(int32)
+{
+	const Window *w = FindWindowById(WC_BUILD_SIGNAL, 0);
+
+	if (w != NULL) SetWindowDirty(w);
+
+	return 0;
+}
+
 /**
  * Check for right TownLayout usage in editor mode.
  * The No Road mode is not desirable since towns have to be
@@ -1284,6 +1306,9 @@
 	  SDTG_VAR("player_face",    SLE_UINT32, S, 0, _player_face,      0,0,0xFFFFFFFF,0, STR_NULL, NULL),
 	  SDTG_VAR("transparency_options", SLE_UINT, S, 0, _transparency_opt,  0,0,0x1FF,0, STR_NULL, NULL),
 	  SDTG_VAR("transparency_locks", SLE_UINT, S, 0, _transparency_lock,   0,0,0x1FF,0, STR_NULL, NULL),
+	  SDTG_VAR("invisibility_options", SLE_UINT, S, 0, _invisibility_opt,  0,0, 0xFF,0, STR_NULL, NULL),
+	  SDTG_STR("keyboard",         SLE_STRB, S, 0, _keyboard_opt[0],       NULL,    STR_NULL, NULL),
+	  SDTG_STR("keyboard_caps",    SLE_STRB, S, 0, _keyboard_opt[1],       NULL,    STR_NULL, NULL),
 	  SDTG_END()
 };
 
@@ -1312,7 +1337,7 @@
 	  SDTG_VAR("max_spectators",       SLE_UINT8, S, 0, _network_game_info.spectators_max, 10, 0, MAX_CLIENTS, 0, STR_NULL, NULL),
 	  SDTG_VAR("restart_game_year",    SLE_INT32, S,D0, _network_restart_game_year,    0, MIN_YEAR, MAX_YEAR, 1, STR_NULL, NULL),
 	  SDTG_VAR("min_players",          SLE_UINT8, S, 0, _network_min_players,               0, 0, 10,   0, STR_NULL, NULL),
-	SDTG_OMANY("server_lang",          SLE_UINT8, S, 0, _network_game_info.server_lang,     0, 28, "ANY|ENGLISH|GERMAN|FRENCH|BRAZILIAN|BULGARIAN|CHINESE|CZECH|DANISH|DUTCH|ESPERANTO|FINNISH|HUNGARIAN|ICELANDIC|ITALIAN|JAPANESE|KOREAN|LITHUANIAN|NORWEGIAN|POLISH|PORTUGUESE|ROMANIAN|RUSSIAN|SLOVAK|SLOVENIAN|SPANISH|SWEDISH|TURKISH|UKRAINIAN", STR_NULL, NULL),
+	SDTG_OMANY("server_lang",          SLE_UINT8, S, 0, _network_game_info.server_lang,     0, 35, "ANY|ENGLISH|GERMAN|FRENCH|BRAZILIAN|BULGARIAN|CHINESE|CZECH|DANISH|DUTCH|ESPERANTO|FINNISH|HUNGARIAN|ICELANDIC|ITALIAN|JAPANESE|KOREAN|LITHUANIAN|NORWEGIAN|POLISH|PORTUGUESE|ROMANIAN|RUSSIAN|SLOVAK|SLOVENIAN|SPANISH|SWEDISH|TURKISH|UKRAINIAN|AFRIKAANS|CROATIAN|CATALAN|ESTONIAN|GALICIAN|GREEK|LATVIAN", STR_NULL, NULL),
 	 SDTG_BOOL("reload_cfg",                      S, 0, _network_reload_cfg,           false,              STR_NULL, NULL),
 	  SDTG_END()
 };
@@ -1365,7 +1390,6 @@
 	 SDT_VAR(Patches, errmsg_duration,    SLE_UINT8, S, 0,  5, 0, 20, 0, STR_CONFIG_PATCHES_ERRMSG_DURATION,       NULL),
 	 SDT_VAR(Patches, toolbar_pos,        SLE_UINT8, S,MS,  0, 0,  2, 0, STR_CONFIG_PATCHES_TOOLBAR_POS,           v_PositionMainToolbar),
 	 SDT_VAR(Patches, window_snap_radius, SLE_UINT8, S,D0, 10, 1, 32, 0, STR_CONFIG_PATCHES_SNAP_RADIUS,           NULL),
-	SDT_BOOL(Patches, invisible_trees,               S, 0, false,        STR_CONFIG_PATCHES_INVISIBLE_TREES,       RedrawScreen),
 	SDT_BOOL(Patches, population_in_label,           S, 0,  true,        STR_CONFIG_PATCHES_POPULATION_IN_LABEL,   PopulationInLabelActive),
 	 SDT_VAR(Patches, map_x,              SLE_UINT8, S, 0,  8, 6, 11, 0, STR_CONFIG_PATCHES_MAP_X,                 NULL),
 	 SDT_VAR(Patches, map_y,              SLE_UINT8, S, 0,  8, 6, 11, 0, STR_CONFIG_PATCHES_MAP_Y,                 NULL),
@@ -1389,13 +1413,13 @@
 	SDT_BOOL(Patches, signal_side,                   N,NN,  true,        STR_CONFIG_PATCHES_SIGNALSIDE,          RedrawScreen),
 	SDT_BOOL(Patches, always_small_airport,          0,NN, false,        STR_CONFIG_PATCHES_SMALL_AIRPORTS,      NULL),
 	SDT_BOOL(Patches, enable_signal_gui,             S, 0, false,        STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI,   NULL),
-	 SDT_VAR(Patches, drag_signals_density,SLE_UINT8,S, 0,  4, 1, 20, 0, STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY,NULL),
-	 SDT_VAR(Patches, semaphore_build_before,SLE_INT32, S, NC, 1975, MIN_YEAR, MAX_YEAR, 1, STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE, NULL),
+	 SDT_VAR(Patches, drag_signals_density,SLE_UINT8,S, 0,  4, 1, 20, 0, STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY,DragSignalsDensityChanged),
+	 SDT_VAR(Patches, semaphore_build_before,SLE_INT32, S, NC, 1975, MIN_YEAR, MAX_YEAR, 1, STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE, ResetSignalVariant),
 	SDT_CONDVAR(Patches, town_layout, SLE_UINT8, 59, SL_MAX_VERSION, 0, MS, TL_ORIGINAL, TL_NO_ROADS, NUM_TLS - 1, 1, STR_CONFIG_PATCHES_TOWN_LAYOUT, CheckTownLayout),
 
 	/***************************************************************************/
 	/* Vehicle section of the GUI-configure patches window */
-	SDT_BOOL(Patches, realistic_acceleration,        0, 0, false,                    STR_CONFIG_PATCHES_REALISTICACCEL,       NULL),
+	SDT_BOOL(Patches, realistic_acceleration,        0, 0, false,                    STR_CONFIG_PATCHES_REALISTICACCEL,       RealisticAccelerationChanged),
 	SDT_BOOL(Patches, forbid_90_deg,                 0, 0, false,                    STR_CONFIG_PATCHES_FORBID_90_DEG,        NULL),
 	SDT_BOOL(Patches, mammoth_trains,                0,NN,  true,                    STR_CONFIG_PATCHES_MAMMOTHTRAINS,        NULL),
 	SDT_BOOL(Patches, gotodepot,                     0, 0,  true,                    STR_CONFIG_PATCHES_GOTODEPOT,            NULL),
@@ -1739,6 +1763,36 @@
 	}
 }
 
+/**
+ * Save the version of OpenTTD to the ini file.
+ * @param ini the ini to write to
+ */
+static void SaveVersionInConfig(IniFile *ini)
+{
+	extern const char _openttd_revision[];
+	extern uint32 _openttd_newgrf_version;
+
+	IniGroup *group = ini_getgroup(ini, "version", -1);
+
+	if (group == NULL) return;
+	group->item = NULL;
+	IniItem **item = &group->item;
+
+	char version[9];
+	snprintf(version, lengthof(version), "%08X", _openttd_newgrf_version);
+
+	const char *versions[][2] = {
+		{ "version_string", _openttd_revision },
+		{ "version_number", version }
+	};
+
+	for (uint i = 0; i < lengthof(versions); i++) {
+		*item = ini_item_alloc(group, versions[i][0], strlen(versions[i][0]));
+		(*item)->value = (char*)pool_strdup(&ini->pool, versions[i][1], strlen(versions[i][1]));
+		item = &(*item)->next;
+	}
+}
+
 /* Save a GRF configuration to the given group name */
 static void GRFSaveConfig(IniFile *ini, const char *grpname, const GRFConfig *list)
 {
@@ -1803,6 +1857,7 @@
 	GRFSaveConfig(ini, "newgrf", _grfconfig_newgame);
 	GRFSaveConfig(ini, "newgrf-static", _grfconfig_static);
 	NewsDisplaySaveConfig(ini, "news_display", _news_display_opt);
+	SaveVersionInConfig(ini);
 	ini_save(_config_file, ini);
 	ini_free(ini);
 }
--- a/src/settings_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/settings_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -9,7 +9,7 @@
 #include "window_gui.h"
 #include "textbuf_gui.h"
 #include "command_func.h"
-#include "engine.h"
+#include "engine_func.h"
 #include "screenshot.h"
 #include "newgrf.h"
 #include "network/network.h"
@@ -27,6 +27,7 @@
 #include "waypoint.h"
 #include "widgets/dropdown_type.h"
 #include "widgets/dropdown_func.h"
+#include "station_func.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -711,7 +712,6 @@
 	"toolbar_pos",
 	"measure_tooltip",
 	"window_snap_radius",
-	"invisible_trees",
 	"population_in_label",
 	"link_terraform_toolbar",
 	"liveries",
--- a/src/settings_type.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/settings_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -98,7 +98,6 @@
 	bool realistic_acceleration;        ///< realistic acceleration for trains
 	bool wagon_speed_limits;            ///< enable wagon speed limits
 	bool forbid_90_deg;                 ///< forbid trains to make 90 deg turns
-	bool invisible_trees;               ///< don't show trees when buildings are transparent
 	bool no_servicing_if_no_breakdowns; ///< dont send vehicles to depot when breakdowns are disabled
 	bool link_terraform_toolbar;        ///< display terraform toolbar when displaying rail, road, water and airport toolbars
 	bool reverse_scroll;                ///< Right-Click-Scrolling scrolls in the opposite direction
--- a/src/ship.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/ship.h	Tue Apr 15 00:47:19 2008 +0000
@@ -6,7 +6,7 @@
 #define SHIP_H
 
 #include "vehicle_base.h"
-#include "engine.h"
+#include "engine_func.h"
 #include "economy_func.h"
 
 void CcBuildShip(bool success, TileIndex tile, uint32 p1, uint32 p2);
@@ -42,6 +42,7 @@
 	bool IsInDepot() const { return this->u.ship.state == 0x80; }
 	void Tick();
 	void OnNewDay();
+	TileIndex GetOrderStationLocation(StationID station);
 };
 
 #endif /* SHIP_H */
--- a/src/ship_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/ship_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -11,9 +11,9 @@
 #include "command_func.h"
 #include "pathfind.h"
 #include "station_map.h"
-#include "station.h"
-#include "news.h"
-#include "engine.h"
+#include "station_base.h"
+#include "news_func.h"
+#include "engine_func.h"
 #include "player_func.h"
 #include "player_base.h"
 #include "npf.h"
@@ -38,6 +38,7 @@
 #include "autoreplace_gui.h"
 #include "gfx_func.h"
 #include "settings_type.h"
+#include "order_func.h"
 
 #include "table/strings.h"
 
@@ -143,7 +144,7 @@
 
 static void CheckIfShipNeedsService(Vehicle *v)
 {
-	if (_patches.servint_ships == 0 || !VehicleNeedsService(v)) return;
+	if (_patches.servint_ships == 0 || !v->NeedsAutomaticServicing()) return;
 	if (v->IsInDepot()) {
 		VehicleServiceInDepot(v);
 		return;
@@ -152,17 +153,14 @@
 	const Depot *depot = FindClosestShipDepot(v);
 
 	if (depot == NULL || DistanceManhattan(v->tile, depot->xy) > 12) {
-		if (v->current_order.type == OT_GOTO_DEPOT) {
-			v->current_order.type = OT_DUMMY;
-			v->current_order.flags = 0;
+		if (v->current_order.IsType(OT_GOTO_DEPOT)) {
+			v->current_order.MakeDummy();
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 		}
 		return;
 	}
 
-	v->current_order.type = OT_GOTO_DEPOT;
-	v->current_order.flags = OFB_NON_STOP;
-	v->current_order.dest = depot->index;
+	v->current_order.MakeGoToDepot(depot->index, ODTFB_SERVICE);
 	v->dest_tile = depot->xy;
 	InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 }
@@ -241,66 +239,17 @@
 	PlayShipSound(this);
 }
 
-static void ProcessShipOrder(Vehicle *v)
+TileIndex Ship::GetOrderStationLocation(StationID station)
 {
-	const Order *order;
-
-	switch (v->current_order.type) {
-		case OT_GOTO_DEPOT:
-			if (!(v->current_order.flags & OFB_PART_OF_ORDERS)) return;
-			if (v->current_order.flags & OFB_SERVICE_IF_NEEDED &&
-					!VehicleNeedsService(v)) {
-				UpdateVehicleTimetable(v, true);
-				v->cur_order_index++;
-			}
-			break;
+	if (station == this->last_station_visited) this->last_station_visited = INVALID_STATION;
 
-		case OT_LOADING:
-		case OT_LEAVESTATION:
-			return;
-
-		default: break;
-	}
-
-	if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0;
-
-	order = GetVehicleOrder(v, v->cur_order_index);
-
-	if (order == NULL) {
-		v->current_order.Free();
-		v->dest_tile = 0;
-		return;
+	Station *st = GetStation(station);
+	if (st->dock_tile != 0) {
+		return TILE_ADD(st->dock_tile, ToTileIndexDiff(GetDockOffset(st->dock_tile)));
+	} else {
+		this->cur_order_index++;
+		return 0;
 	}
-
-	if (order->type  == v->current_order.type &&
-			order->flags == v->current_order.flags &&
-			order->dest  == v->current_order.dest &&
-			(order->type != OT_GOTO_STATION || GetStation(order->dest)->dock_tile != 0))
-		return;
-
-	v->current_order = *order;
-
-	if (order->type == OT_GOTO_STATION) {
-		const Station *st;
-
-		if (order->dest == v->last_station_visited)
-			v->last_station_visited = INVALID_STATION;
-
-		st = GetStation(order->dest);
-		if (st->dock_tile != 0) {
-			v->dest_tile = TILE_ADD(st->dock_tile, ToTileIndexDiff(GetDockOffset(st->dock_tile)));
-		} else {
-			v->cur_order_index++;
-		}
-	} else if (order->type == OT_GOTO_DEPOT) {
-		v->dest_tile = GetDepot(order->dest)->xy;
-	} else {
-		v->dest_tile = 0;
-	}
-
-	InvalidateVehicleOrder(v);
-
-	InvalidateWindowClasses(WC_SHIPS_LIST);
 }
 
 void Ship::UpdateDeltaXY(Direction direction)
@@ -321,9 +270,9 @@
 	uint32 x = _delta_xy_table[direction];
 	this->x_offs        = GB(x,  0, 8);
 	this->y_offs        = GB(x,  8, 8);
-	this->sprite_width  = GB(x, 16, 8);
-	this->sprite_height = GB(x, 24, 8);
-	this->z_height      = 6;
+	this->x_extent      = GB(x, 16, 8);
+	this->y_extent      = GB(x, 24, 8);
+	this->z_extent      = 6;
 }
 
 void RecalcShipStuff(Vehicle *v)
@@ -406,15 +355,12 @@
 {
 	/* Check if station was ever visited before */
 	if (!(st->had_vehicle_of_type & HVOT_SHIP)) {
-		uint32 flags;
-
 		st->had_vehicle_of_type |= HVOT_SHIP;
 
 		SetDParam(0, st->index);
-		flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
 		AddNewsItem(
 			STR_9833_CITIZENS_CELEBRATE_FIRST,
-			flags,
+			NM_THIN, NF_VIEWPORT | NF_VEHICLE, (v->owner == _local_player) ? NT_ARRIVAL_PLAYER : NT_ARRIVAL_OTHER, DNC_NONE,
 			v->index,
 			0);
 	}
@@ -476,7 +422,7 @@
 		pfs.best_bird_dist = (uint)-1;
 		pfs.best_length = (uint)-1;
 
-		FollowTrack(tile, 0x1800 | TRANSPORT_WATER, 0, (DiagDirection)_ship_search_directions[i][dir], (TPFEnumProc*)ShipTrackFollower, NULL, &pfs);
+		FollowTrack(tile, PATHFIND_FLAGS_SHIP_MODE | PATHFIND_FLAGS_DISABLE_TILE_HASH, TRANSPORT_WATER, 0, (DiagDirection)_ship_search_directions[i][dir], (TPFEnumProc*)ShipTrackFollower, NULL, &pfs);
 
 		if (best_track != INVALID_TRACK) {
 			if (pfs.best_bird_dist != 0) {
@@ -652,10 +598,10 @@
 
 	if (v->vehstatus & VS_STOPPED) return;
 
-	ProcessShipOrder(v);
+	ProcessOrders(v);
 	v->HandleLoading();
 
-	if (v->current_order.type == OT_LOADING) return;
+	if (v->current_order.IsType(OT_LOADING)) return;
 
 	CheckShipLeaveDepot(v);
 
@@ -676,40 +622,38 @@
 
 			/* A leave station order only needs one tick to get processed, so we can
 			 * always skip ahead. */
-			if (v->current_order.type == OT_LEAVESTATION) {
+			if (v->current_order.IsType(OT_LEAVESTATION)) {
 				v->current_order.Free();
 				InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 			} else if (v->dest_tile != 0) {
 				/* We have a target, let's see if we reached it... */
-				if (v->current_order.type == OT_GOTO_STATION &&
+				if (v->current_order.IsType(OT_GOTO_STATION) &&
 						IsBuoyTile(v->dest_tile) &&
 						DistanceManhattan(v->dest_tile, gp.new_tile) <= 3) {
 					/* We got within 3 tiles of our target buoy, so let's skip to our
 					 * next order */
 					UpdateVehicleTimetable(v, true);
 					v->cur_order_index++;
-					v->current_order.type = OT_DUMMY;
+					v->current_order.MakeDummy();
 					InvalidateVehicleOrder(v);
 				} else {
 					/* Non-buoy orders really need to reach the tile */
 					if (v->dest_tile == gp.new_tile) {
-						if (v->current_order.type == OT_GOTO_DEPOT) {
+						if (v->current_order.IsType(OT_GOTO_DEPOT)) {
 							if ((gp.x & 0xF) == 8 && (gp.y & 0xF) == 8) {
 								VehicleEnterDepot(v);
 								return;
 							}
-						} else if (v->current_order.type == OT_GOTO_STATION) {
-							Station *st;
-
-							v->last_station_visited = v->current_order.dest;
+						} else if (v->current_order.IsType(OT_GOTO_STATION)) {
+							v->last_station_visited = v->current_order.GetDestination();
 
 							/* Process station in the orderlist. */
-							st = GetStation(v->current_order.dest);
+							Station *st = GetStation(v->current_order.GetDestination());
 							if (st->facilities & FACIL_DOCK) { // ugly, ugly workaround for problem with ships able to drop off cargo at wrong stations
 								ShipArrivesAt(v, st);
 								v->BeginLoading();
 							} else { // leave stations without docks right aways
-								v->current_order.type = OT_LEAVESTATION;
+								v->current_order.MakeLeaveStation();
 								v->cur_order_index++;
 								InvalidateVehicleOrder(v);
 							}
@@ -998,14 +942,15 @@
 	if (v->IsInDepot()) return CMD_ERROR;
 
 	/* If the current orders are already goto-depot */
-	if (v->current_order.type == OT_GOTO_DEPOT) {
-		if (!!(p2 & DEPOT_SERVICE) == HasBit(v->current_order.flags, OF_HALT_IN_DEPOT)) {
+	if (v->current_order.IsType(OT_GOTO_DEPOT)) {
+		bool halt_in_depot = v->current_order.GetDepotActionType() & ODATFB_HALT;
+		if (!!(p2 & DEPOT_SERVICE) == halt_in_depot) {
 			/* We called with a different DEPOT_SERVICE setting.
 			 * Now we change the setting to apply the new one and let the vehicle head for the same depot.
 			 * Note: the if is (true for requesting service == true for ordered to stop in depot)          */
 			if (flags & DC_EXEC) {
-				ClrBit(v->current_order.flags, OF_PART_OF_ORDERS);
-				ToggleBit(v->current_order.flags, OF_HALT_IN_DEPOT);
+				v->current_order.SetDepotOrderType(ODTF_MANUAL);
+				v->current_order.SetDepotActionType(halt_in_depot ? ODATF_SERVICE_ONLY : ODATFB_HALT);
 				InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 			}
 			return CommandCost();
@@ -1015,11 +960,9 @@
 		if (flags & DC_EXEC) {
 			/* If the orders to 'goto depot' are in the orders list (forced servicing),
 			 * then skip to the next order; effectively cancelling this forced service */
-			if (HasBit(v->current_order.flags, OF_PART_OF_ORDERS))
-				v->cur_order_index++;
+			if (v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) v->cur_order_index++;
 
-			v->current_order.type = OT_DUMMY;
-			v->current_order.flags = 0;
+			v->current_order.MakeDummy();
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 		}
 		return CommandCost();
@@ -1029,14 +972,11 @@
 	if (dep == NULL) return_cmd_error(STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT);
 
 	if (flags & DC_EXEC) {
-		if (v->current_order.type == OT_LOADING) v->LeaveStation();
+		if (v->current_order.IsType(OT_LOADING)) v->LeaveStation();
 
 		v->dest_tile = dep->xy;
-		v->current_order.type = OT_GOTO_DEPOT;
-		v->current_order.flags = OFB_NON_STOP;
-		if (!(p2 & DEPOT_SERVICE)) SetBit(v->current_order.flags, OF_HALT_IN_DEPOT);
-		v->current_order.refit_cargo = CT_INVALID;
-		v->current_order.dest = dep->index;
+		v->current_order.MakeGoToDepot(dep->index, ODTF_MANUAL);
+		if (!(p2 & DEPOT_SERVICE)) v->current_order.SetDepotActionType(ODATFB_HALT);
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 	}
 
--- a/src/ship_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/ship_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -15,6 +15,7 @@
 #include "newgrf_engine.h"
 #include "strings_func.h"
 #include "vehicle_func.h"
+#include "order_func.h"
 
 #include "table/strings.h"
 #include "table/sprites.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/signal_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,24 @@
+/* $Id$ */
+
+/** @file signal_type.h Types and classes related to signals. */
+
+#ifndef SIGNAL_TYPE_H
+#define SIGNAL_TYPE_H
+
+/** Variant of the signal, i.e. how does the signal look? */
+enum SignalVariant {
+	SIG_ELECTRIC  = 0, ///< Light signal
+	SIG_SEMAPHORE = 1  ///< Old-fashioned semaphore signal
+};
+
+
+/** Type of signal, i.e. how does the signal behave? */
+enum SignalType {
+	SIGTYPE_NORMAL  = 0, ///< normal signal
+	SIGTYPE_ENTRY   = 1, ///< presignal block entry
+	SIGTYPE_EXIT    = 2, ///< presignal block exit
+	SIGTYPE_COMBO   = 3  ///< presignal inter-block
+};
+
+
+#endif /* SIGNAL_TYPE_H */
--- a/src/signs.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/signs.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -6,7 +6,8 @@
 #include "openttd.h"
 #include "landscape.h"
 #include "player_func.h"
-#include "signs.h"
+#include "signs_base.h"
+#include "signs_func.h"
 #include "saveload.h"
 #include "command_func.h"
 #include "variables.h"
@@ -18,6 +19,7 @@
 #include "window_func.h"
 #include "map_func.h"
 #include "string_func.h"
+#include "oldpool_func.h"
 
 #include "table/strings.h"
 
--- a/src/signs.h	Mon Apr 14 20:32:36 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/* $Id$ */
-
-/** @file signs.h */
-
-#ifndef SIGNS_H
-#define SIGNS_H
-
-#include "oldpool.h"
-
-struct Sign;
-DECLARE_OLD_POOL(Sign, Sign, 2, 16000)
-
-struct Sign : PoolItem<Sign, SignID, &_Sign_pool> {
-	char *name;
-	ViewportSign sign;
-	int32        x;
-	int32        y;
-	byte         z;
-	PlayerByte   owner; // placed by this player. Anyone can delete them though. OWNER_NONE for gray signs from old games.
-
-	/**
-	 * Creates a new sign
-	 */
-	Sign(PlayerID owner = INVALID_PLAYER);
-
-	/** Destroy the sign */
-	~Sign();
-
-	inline bool IsValid() const { return this->owner != INVALID_PLAYER; }
-};
-
-enum {
-	INVALID_SIGN = 0xFFFF,
-};
-
-extern SignID _new_sign_id;
-
-
-static inline SignID GetMaxSignIndex()
-{
-	/* TODO - This isn't the real content of the function, but
-	 *  with the new pool-system this will be replaced with one that
-	 *  _really_ returns the highest index. Now it just returns
-	 *  the next safe value we are sure about everything is below.
-	 */
-	return GetSignPoolSize() - 1;
-}
-
-static inline uint GetNumSigns()
-{
-	extern uint _total_signs;
-	return _total_signs;
-}
-
-static inline bool IsValidSignID(uint index)
-{
-	return index < GetSignPoolSize() && GetSign(index)->IsValid();
-}
-
-#define FOR_ALL_SIGNS_FROM(ss, start) for (ss = GetSign(start); ss != NULL; ss = (ss->index + 1U < GetSignPoolSize()) ? GetSign(ss->index + 1U) : NULL) if (ss->IsValid())
-#define FOR_ALL_SIGNS(ss) FOR_ALL_SIGNS_FROM(ss, 0)
-
-extern bool _sign_sort_dirty;
-
-void UpdateAllSignVirtCoords();
-void PlaceProc_Sign(TileIndex tile);
-
-/* signs_gui.cpp */
-void ShowRenameSignWindow(const Sign *si);
-
-void ShowSignList();
-
-#endif /* SIGNS_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/signs_base.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,56 @@
+/* $Id$ */
+
+/** @file signs_base.h Base class for signs. */
+
+#ifndef SIGNS_BASE_H
+#define SIGNS_BASE_H
+
+#include "signs_type.h"
+#include "oldpool.h"
+
+DECLARE_OLD_POOL(Sign, Sign, 2, 16000)
+
+struct Sign : PoolItem<Sign, SignID, &_Sign_pool> {
+	char *name;
+	ViewportSign sign;
+	int32        x;
+	int32        y;
+	byte         z;
+	PlayerByte   owner; // placed by this player. Anyone can delete them though. OWNER_NONE for gray signs from old games.
+
+	/**
+	 * Creates a new sign
+	 */
+	Sign(PlayerID owner = INVALID_PLAYER);
+
+	/** Destroy the sign */
+	~Sign();
+
+	inline bool IsValid() const { return this->owner != INVALID_PLAYER; }
+};
+
+static inline SignID GetMaxSignIndex()
+{
+	/* TODO - This isn't the real content of the function, but
+	 *  with the new pool-system this will be replaced with one that
+	 *  _really_ returns the highest index. Now it just returns
+	 *  the next safe value we are sure about everything is below.
+	 */
+	return GetSignPoolSize() - 1;
+}
+
+static inline uint GetNumSigns()
+{
+	extern uint _total_signs;
+	return _total_signs;
+}
+
+static inline bool IsValidSignID(uint index)
+{
+	return index < GetSignPoolSize() && GetSign(index)->IsValid();
+}
+
+#define FOR_ALL_SIGNS_FROM(ss, start) for (ss = GetSign(start); ss != NULL; ss = (ss->index + 1U < GetSignPoolSize()) ? GetSign(ss->index + 1U) : NULL) if (ss->IsValid())
+#define FOR_ALL_SIGNS(ss) FOR_ALL_SIGNS_FROM(ss, 0)
+
+#endif /* SIGNS_BASE_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/signs_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,21 @@
+/* $Id$ */
+
+/** @file signs_func.h Functions related to signs. */
+
+#ifndef SIGNS_FUNC_H
+#define SIGNS_FUNC_H
+
+#include "signs_type.h"
+
+extern SignID _new_sign_id;
+extern bool _sign_sort_dirty;
+
+void UpdateAllSignVirtCoords();
+void PlaceProc_Sign(TileIndex tile);
+
+/* signs_gui.cpp */
+void ShowRenameSignWindow(const Sign *si);
+
+void ShowSignList();
+
+#endif /* SIGNS_FUNC_H */
--- a/src/signs_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/signs_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -8,7 +8,8 @@
 #include "textbuf_gui.h"
 #include "window_gui.h"
 #include "player_gui.h"
-#include "signs.h"
+#include "signs_base.h"
+#include "signs_func.h"
 #include "debug.h"
 #include "variables.h"
 #include "command_func.h"
@@ -163,8 +164,7 @@
 struct editsign_d : querystr_d {
 	SignID cur_sign;
 };
-
-static char _edit_str_buf[64];
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(editsign_d));
 
 enum QueryEditSignWidgets {
 	QUERY_EDIT_SIGN_WIDGET_TEXT = 3,
@@ -249,6 +249,10 @@
 					UpdateSignEditWindow(w, si);
 					break;
 
+				case QUERY_EDIT_SIGN_WIDGET_TEXT:
+					ShowOnScreenKeyboard(w, qs, e->we.click.widget, QUERY_EDIT_SIGN_WIDGET_CANCEL, QUERY_EDIT_SIGN_WIDGET_OK);
+					break;
+
 				case QUERY_EDIT_SIGN_WIDGET_DELETE:
 					/* Only need to set the buffer to null, the rest is handled as the OK button */
 					DeleteTextBufferAll(&qs->text);
@@ -287,16 +291,16 @@
 }
 
 static const Widget _query_sign_edit_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE,  14,   0,  10,   0,  13, STR_00C5,        STR_018B_CLOSE_WINDOW},
-{  WWT_CAPTION, RESIZE_NONE,  14,  11, 259,   0,  13, STR_012D,        STR_NULL },
-{    WWT_PANEL, RESIZE_NONE,  14,   0, 259,  14,  29, STR_NULL,        STR_NULL },
-{    WWT_PANEL, RESIZE_NONE,  14,   2, 257,  16,  27, STR_NULL,        STR_NULL },  // Text field
-{  WWT_TEXTBTN, RESIZE_NONE,  14,   0,  60,  30,  41, STR_012F_OK,     STR_NULL },
-{  WWT_TEXTBTN, RESIZE_NONE,  14,  61, 120,  30,  41, STR_012E_CANCEL, STR_NULL },
-{  WWT_TEXTBTN, RESIZE_NONE,  14, 121, 180,  30,  41, STR_0290_DELETE, STR_NULL },
-{    WWT_PANEL, RESIZE_NONE,  14, 181, 237,  30,  41, STR_NULL,        STR_NULL },
-{  WWT_TEXTBTN, RESIZE_NONE,  14, 238, 248,  30,  41, STR_6819,        STR_PREVIOUS_SIGN_TOOLTIP },
-{  WWT_TEXTBTN, RESIZE_NONE,  14, 249, 259,  30,  41, STR_681A,        STR_NEXT_SIGN_TOOLTIP },
+{ WWT_CLOSEBOX, RESIZE_NONE,  14,   0,  10,   0,  13, STR_00C5,          STR_018B_CLOSE_WINDOW},
+{  WWT_CAPTION, RESIZE_NONE,  14,  11, 259,   0,  13, STR_012D,          STR_NULL },
+{    WWT_PANEL, RESIZE_NONE,  14,   0, 259,  14,  29, STR_NULL,          STR_NULL },
+{  WWT_EDITBOX, RESIZE_NONE,  14,   2, 257,  16,  27, STR_SIGN_OSKTITLE, STR_NULL },  // Text field
+{  WWT_TEXTBTN, RESIZE_NONE,  14,   0,  60,  30,  41, STR_012F_OK,       STR_NULL },
+{  WWT_TEXTBTN, RESIZE_NONE,  14,  61, 120,  30,  41, STR_012E_CANCEL,   STR_NULL },
+{  WWT_TEXTBTN, RESIZE_NONE,  14, 121, 180,  30,  41, STR_0290_DELETE,   STR_NULL },
+{    WWT_PANEL, RESIZE_NONE,  14, 181, 237,  30,  41, STR_NULL,          STR_NULL },
+{  WWT_TEXTBTN, RESIZE_NONE,  14, 238, 248,  30,  41, STR_6819,          STR_PREVIOUS_SIGN_TOOLTIP },
+{  WWT_TEXTBTN, RESIZE_NONE,  14, 249, 259,  30,  41, STR_681A,          STR_NEXT_SIGN_TOOLTIP },
 { WIDGETS_END },
 };
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/signs_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,15 @@
+/* $Id$ */
+
+/** @file signs_type.h Types related to signs */
+
+#ifndef SIGNS_TYPE_H
+#define SIGNS_TYPE_H
+
+typedef uint16 SignID;
+struct Sign;
+
+enum {
+	INVALID_SIGN = 0xFFFF,
+};
+
+#endif /* SIGNS_TYPE_H */
--- a/src/slope_func.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/slope_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -54,7 +54,7 @@
  */
 static inline Slope RemoveHalftileSlope(Slope s)
 {
-	return (Slope)(s & ~SLOPE_HALFTILE_MASK);
+	return s & ~SLOPE_HALFTILE_MASK;
 }
 
 /**
@@ -71,7 +71,7 @@
 static inline Slope ComplementSlope(Slope s)
 {
 	assert(!IsSteepSlope(s) && !IsHalftileSlope(s));
-	return (Slope)(0xF ^ s);
+	return s ^ SLOPE_ELEVATED;
 }
 
 /**
@@ -200,7 +200,7 @@
  */
 static inline Slope SteepSlope(Corner corner)
 {
-	return (Slope)(SLOPE_STEEP | SlopeWithThreeCornersRaised(OppositeCorner(corner)));
+	return SLOPE_STEEP | SlopeWithThreeCornersRaised(OppositeCorner(corner));
 }
 
 /**
--- a/src/slope_type.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/slope_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -70,6 +70,7 @@
 	SLOPE_HALFTILE_E = SLOPE_HALFTILE | (CORNER_E << 6),    ///< the east halftile is leveled (non continuous slope)
 	SLOPE_HALFTILE_N = SLOPE_HALFTILE | (CORNER_N << 6),    ///< the north halftile is leveled (non continuous slope)
 };
+DECLARE_ENUM_AS_BIT_SET(Slope)
 
 
 /**
--- a/src/sound.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/sound.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -197,9 +197,7 @@
 
 void SndCopyToPool()
 {
-	uint i;
-
-	for (i = 0; i < _file_count; i++) {
+	for (uint i = 0; i < _file_count; i++) {
 		FileEntry *orig = &_files[_sound_idx[i]];
 		FileEntry *fe = AllocateFileEntry();
 
--- a/src/sound/win32_s.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/sound/win32_s.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -59,7 +59,7 @@
 	wfex.nBlockAlign = (wfex.nChannels * wfex.wBitsPerSample) / 8;
 	wfex.nAvgBytesPerSec = wfex.nSamplesPerSec * wfex.nBlockAlign;
 
-	_bufsize = GetDriverParamInt(parm, "bufsize", 1024);
+	_bufsize = GetDriverParamInt(parm, "bufsize", 2048);
 
 	if (waveOutOpen(&_waveout, WAVE_MAPPER, &wfex, (DWORD_PTR)&waveOutProc, 0, CALLBACK_FUNCTION) != MMSYSERR_NOERROR)
 		return "waveOutOpen failed";
--- a/src/spritecache.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/spritecache.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -23,11 +23,11 @@
 
 
 struct SpriteCache {
- 	void *ptr;
+	void *ptr;
 	uint32 id;
- 	uint32 file_pos;
+	uint32 file_pos;
 	uint16 file_slot;
- 	int16 lru;
+	int16 lru;
 };
 
 
@@ -338,8 +338,7 @@
 			assert(!(next->size & S_FREE_MASK));
 
 			/* If the next block is the sentinel block, we can safely return */
-			if (next->size == 0)
-				break;
+			if (next->size == 0) break;
 
 			/* Locate the sprite belonging to the next pointer. */
 			for (i = 0; GetSpriteCache(i)->ptr != next->data; i++) {
--- a/src/spriteloader/png.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/spriteloader/png.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -9,7 +9,6 @@
 #include "../fileio.h"
 #include "../debug.h"
 #include "../core/alloc_func.hpp"
-#include "../core/endian_func.hpp"
 #include "png.hpp"
 #include <png.h>
 
@@ -126,18 +125,8 @@
 			color_type = PNG_COLOR_TYPE_RGB;
 		}
 
-#ifdef TTD_LITTLE_ENDIAN
-		png_set_bgr(png_ptr);
-#else
-		if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) png_set_swap_alpha(png_ptr);
-#endif
-
 		if (color_type == PNG_COLOR_TYPE_RGB) {
-#ifdef TTD_LITTLE_ENDIAN
 			png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
-#else
-			png_set_filler(png_ptr, 0xff, PNG_FILLER_BEFORE);
-#endif
 		}
 
 		pixelsize = sizeof(uint32);
@@ -159,16 +148,16 @@
 		for (uint x = 0; x < info_ptr->width; x++) {
 			if (mask) {
 				if (row_pointer[x * sizeof(uint8)] != 0) {
+					dst[x].r = 0;
+					dst[x].g = 0;
 					dst[x].b = 0;
-					dst[x].g = 0;
-					dst[x].r = 0;
 					/* Alpha channel is used from the original image (to allow transparency in remap colors) */
 					dst[x].m = row_pointer[x * sizeof(uint8)];
 				}
 			} else {
-				dst[x].b = row_pointer[x * sizeof(uint32) + 0];
+				dst[x].r = row_pointer[x * sizeof(uint32) + 0];
 				dst[x].g = row_pointer[x * sizeof(uint32) + 1];
-				dst[x].r = row_pointer[x * sizeof(uint32) + 2];
+				dst[x].b = row_pointer[x * sizeof(uint32) + 2];
 				dst[x].a = row_pointer[x * sizeof(uint32) + 3];
 				dst[x].m = 0;
 			}
--- a/src/station.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/station.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -7,9 +7,8 @@
 #include "bridge_map.h"
 #include "debug.h"
 #include "station_map.h"
-#include "station.h"
+#include "station_base.h"
 #include "town.h"
-#include "news.h"
 #include "saveload.h"
 #include "player_func.h"
 #include "airport.h"
@@ -31,6 +30,7 @@
 #include "variables.h"
 #include "settings_type.h"
 #include "command_func.h"
+#include "order_func.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -100,7 +100,7 @@
  */
 RoadStop *Station::GetPrimaryRoadStop(const Vehicle *v) const
 {
-	RoadStop *rs = this->GetPrimaryRoadStop(IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK);
+	RoadStop *rs = this->GetPrimaryRoadStop(IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? ROADSTOP_BUS : ROADSTOP_TRUCK);
 
 	for (; rs != NULL; rs = rs->next) {
 		/* The vehicle cannot go to this roadstop (different roadtype) */
--- a/src/station.h	Mon Apr 14 20:32:36 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,317 +0,0 @@
-/* $Id$ */
-
-/** @file station.h */
-
-#ifndef STATION_H
-#define STATION_H
-
-#include "airport.h"
-#include "oldpool.h"
-#include "sprite.h"
-#include "road_type.h"
-#include "newgrf_station.h"
-#include "newgrf_fsmports.h"
-#include "cargopacket.h"
-#include "cargo_type.h"
-#include "town_type.h"
-#include "core/geometry_type.hpp"
-#include <list>
-#include <set>
-
-struct Station;
-struct RoadStop;
-
-DECLARE_OLD_POOL(Station, Station, 6, 1000)
-DECLARE_OLD_POOL(RoadStop, RoadStop, 5, 2000)
-
-static const byte INITIAL_STATION_RATING = 175;
-
-struct GoodsEntry {
-	enum AcceptancePickup {
-		ACCEPTANCE,
-		PICKUP
-	};
-
-	GoodsEntry() :
-		acceptance_pickup(0),
-		days_since_pickup(255),
-		rating(INITIAL_STATION_RATING),
-		last_speed(0),
-		last_age(255)
-	{}
-
-	byte acceptance_pickup;
-	byte days_since_pickup;
-	byte rating;
-	byte last_speed;
-	byte last_age;
-	CargoList cargo; ///< The cargo packets of cargo waiting in this station
-};
-
-/** A Stop for a Road Vehicle */
-struct RoadStop : PoolItem<RoadStop, RoadStopID, &_RoadStop_pool> {
-	/** Types of RoadStops */
-	enum Type {
-		BUS,                                ///< A standard stop for buses
-		TRUCK                               ///< A standard stop for trucks
-	};
-
-	static const int  cDebugCtorLevel =  5;  ///< Debug level on which Contructor / Destructor messages are printed
-	static const uint LIMIT           = 16;  ///< The maximum amount of roadstops that are allowed at a single station
-	static const uint MAX_BAY_COUNT   =  2;  ///< The maximum number of loading bays
-
-	TileIndex        xy;                    ///< Position on the map
-	byte             status;                ///< Current status of the Stop. Like which spot is taken. Access using *Bay and *Busy functions.
-	byte             num_vehicles;          ///< Number of vehicles currently slotted to this stop
-	struct RoadStop  *next;                 ///< Next stop of the given type at this station
-
-	RoadStop(TileIndex tile = 0);
-	virtual ~RoadStop();
-
-	/**
-	 * Determines whether a road stop exists
-	 * @return true if and only is the road stop exists
-	 */
-	inline bool IsValid() const { return this->xy != 0; }
-
-	/* For accessing status */
-	bool HasFreeBay() const;
-	bool IsFreeBay(uint nr) const;
-	uint AllocateBay();
-	void AllocateDriveThroughBay(uint nr);
-	void FreeBay(uint nr);
-	bool IsEntranceBusy() const;
-	void SetEntranceBusy(bool busy);
-
-	RoadStop *GetNextRoadStop(const Vehicle *v) const;
-};
-
-struct StationSpecList {
-	const StationSpec *spec;
-	uint32 grfid;      ///< GRF ID of this custom station
-	uint8  localidx;   ///< Station ID within GRF of station
-};
-
-struct FSMportsSpecList {
-	const FSMportsSpec *spec;
-	uint32 grfid;      ///< GRF ID of this custom station
-	uint8  localidx;   ///< Station ID within GRF of station
-};
-
-/** StationRect - used to track station spread out rectangle - cheaper than scanning whole map */
-struct StationRect : public Rect {
-	enum StationRectMode
-	{
-		ADD_TEST = 0,
-		ADD_TRY,
-		ADD_FORCE
-	};
-
-	StationRect();
-	void MakeEmpty();
-	bool PtInExtendedRect(int x, int y, int distance = 0) const;
-	bool IsEmpty() const;
-	bool BeforeAddTile(TileIndex tile, StationRectMode mode);
-	bool BeforeAddRect(TileIndex tile, int w, int h, StationRectMode mode);
-	bool AfterRemoveTile(Station *st, TileIndex tile);
-	bool AfterRemoveRect(Station *st, TileIndex tile, int w, int h);
-
-	static bool ScanForStationTiles(StationID st_id, int left_a, int top_a, int right_a, int bottom_a);
-
-	StationRect& operator = (Rect src);
-};
-
-struct Station : PoolItem<Station, StationID, &_Station_pool> {
-public:
-	RoadStop *GetPrimaryRoadStop(RoadStop::Type type) const
-	{
-		return type == RoadStop::BUS ? bus_stops : truck_stops;
-	}
-
-	RoadStop *GetPrimaryRoadStop(const Vehicle *v) const;
-
-	const AirportFTAClass *Airport() const
-	{
-		return IsCustomFSMportsSpecIndex(airport_tile) ? fsmportsspeclist[1].spec->portFSM : AirportFTAClass::dummy;
-	}
-
-	TileIndex xy;
-	RoadStop *bus_stops;
-	RoadStop *truck_stops;
-	TileIndex train_tile;
-	TileIndex airport_tile;
-	TileIndex dock_tile;
-	Town *town;
-	StringID string_id;     ///< Default name (town area) of station
-	char *name;             ///< Custom name
-
-	ViewportSign sign;
-
-	uint16 had_vehicle_of_type;
-
-	byte time_since_load;
-	byte time_since_unload;
-	byte delete_ctr;
-	PlayerByte owner;
-	byte facilities;
-	byte airport_type;
-	byte FSMport_layout_set;  /* indicates which layout set (S) of several in an FSMport spec->layouts[S] to use */
-	byte FSMport_orientation; /* direction of orientation of station for use with FSMports */
-	bool FSMport_flood_protected;     /* prevents flooding destroying water based FSMports */
-
-	/* trainstation width/height */
-	byte trainst_w, trainst_h;
-
-	/** List of custom stations (StationSpecs) allocated to the station */
-	uint8 num_specs;
-	StationSpecList *speclist;
-	uint8 num_fsmportsspecs;
-	FSMportsSpecList *fsmportsspeclist;
-
-	Date build_date;
-
-	FSMblockmap airport_flags;   ///< stores which blocks on the port are taken
-
-	byte last_vehicle_type;
-	std::list<Vehicle *> loading_vehicles;
-	GoodsEntry goods[NUM_CARGO];
-
-	uint16 random_bits;
-	byte waiting_triggers;
-
-	StationRect rect; ///< Station spread out rectangle (not saved) maintained by StationRect_xxx() functions
-
-	static const int cDebugCtorLevel = 5;
-
-	Station(TileIndex tile = 0);
-	virtual ~Station();
-
-	void AddFacility(byte new_facility_bit, TileIndex facil_xy);
-
-	/**
-	 * Mark the sign of a station dirty for repaint.
-	 *
-	 * @ingroup dirty
-	 */
-	void MarkDirty() const;
-
-	/**
-	 * Marks the tiles of the station as dirty.
-	 *
-	 * @ingroup dirty
-	 */
-	void MarkTilesDirty(bool cargo_change) const;
-	bool TileBelongsToRailStation(TileIndex tile) const;
-	uint GetPlatformLength(TileIndex tile, DiagDirection dir) const;
-	uint GetPlatformLength(TileIndex tile) const;
-	bool IsBuoy() const;
-
-	/**
-	 * Determines whether a station exists
-	 * @return true if and only is the station exists
-	 */
-	inline bool IsValid() const { return this->xy != 0; }
-};
-
-enum StationType {
-	STATION_RAIL,
-	STATION_AIRPORT,
-	STATION_TRUCK,
-	STATION_BUS,
-	STATION_OILRIG,
-	STATION_DOCK,
-	STATION_BUOY
-};
-
-enum {
-	FACIL_TRAIN      = 0x01,
-	FACIL_TRUCK_STOP = 0x02,
-	FACIL_BUS_STOP   = 0x04,
-	FACIL_AIRPORT    = 0x08,
-	FACIL_DOCK       = 0x10,
-};
-
-enum {
-//	HVOT_PENDING_DELETE = 1 << 0, // not needed anymore
-	HVOT_TRAIN    = 1 << 1,
-	HVOT_BUS      = 1 << 2,
-	HVOT_TRUCK    = 1 << 3,
-	HVOT_AIRCRAFT = 1 << 4,
-	HVOT_SHIP     = 1 << 5,
-	/* This bit is used to mark stations. No, it does not belong here, but what
-	 * can we do? ;-) */
-	HVOT_BUOY     = 1 << 6
-};
-
-enum CatchmentArea {
-	CA_NONE            =  0,
-	CA_BUS             =  3,
-	CA_TRUCK           =  3,
-	CA_TRAIN           =  4,
-	CA_DOCK            =  5,
-
-	CA_UNMODIFIED      =  4, ///< Used when _patches.modified_catchment is false
-
-	MAX_CATCHMENT      = 10, ///< Airports have a catchment up to this number.
-};
-
-void ModifyStationRatingAround(TileIndex tile, PlayerID owner, int amount, uint radius);
-
-/** A set of stations (\c const \c Station* ) */
-typedef std::set<Station*> StationSet;
-
-StationSet FindStationsAroundIndustryTile(TileIndex tile, int w, int h);
-
-void ShowStationViewWindow(StationID station);
-void UpdateAllStationVirtCoord();
-
-static inline StationID GetMaxStationIndex()
-{
-	/* TODO - This isn't the real content of the function, but
-	 *  with the new pool-system this will be replaced with one that
-	 *  _really_ returns the highest index. Now it just returns
-	 *  the next safe value we are sure about everything is below.
-	 */
-	return GetStationPoolSize() - 1;
-}
-
-static inline uint GetNumStations()
-{
-	return GetStationPoolSize();
-}
-
-static inline bool IsValidStationID(StationID index)
-{
-	return index < GetStationPoolSize() && GetStation(index)->IsValid();
-}
-
-#define FOR_ALL_STATIONS_FROM(st, start) for (st = GetStation(start); st != NULL; st = (st->index + 1U < GetStationPoolSize()) ? GetStation(st->index + 1U) : NULL) if (st->IsValid())
-#define FOR_ALL_STATIONS(st) FOR_ALL_STATIONS_FROM(st, 0)
-
-
-/* Stuff for ROADSTOPS */
-
-#define FOR_ALL_ROADSTOPS_FROM(rs, start) for (rs = GetRoadStop(start); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) if (rs->IsValid())
-#define FOR_ALL_ROADSTOPS(rs) FOR_ALL_ROADSTOPS_FROM(rs, 0)
-
-/* End of stuff for ROADSTOPS */
-
-
-void AfterLoadStations();
-void GetProductionAroundTiles(AcceptedCargo produced, TileIndex tile, int w, int h, int rad);
-void GetAcceptanceAroundTiles(AcceptedCargo accepts, TileIndex tile, int w, int h, int rad);
-
-
-const DrawTileSprites *GetStationTileLayout(StationType st, byte gfx);
-void StationPickerDrawSprite(int x, int y, StationType st, RailType railtype, RoadType roadtype, int image);
-
-RoadStop * GetRoadStopByTile(TileIndex tile, RoadStop::Type type);
-uint GetNumRoadStops(const Station* st, RoadStop::Type type);
-RoadStop * AllocateRoadStop();
-void ClearSlot(Vehicle *v);
-
-bool HasStationInUse(StationID station, PlayerID player);
-
-void DeleteOilRig(TileIndex t);
-
-#endif /* STATION_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/station_base.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,240 @@
+/* $Id$ */
+
+/** @file station_base.h Base classes/functions for stations. */
+
+#ifndef STATION_BASE_H
+#define STATION_BASE_H
+
+#include "station_type.h"
+#include "airport.h"
+#include "oldpool.h"
+#include "newgrf_station.h"
+#include "newgrf_fsmports.h"
+#include "cargopacket.h"
+#include "cargo_type.h"
+#include "town_type.h"
+#include "strings_type.h"
+#include "date_type.h"
+#include "vehicle_type.h"
+#include "player_type.h"
+#include "core/geometry_type.hpp"
+#include <list>
+
+DECLARE_OLD_POOL(Station, Station, 6, 1000)
+DECLARE_OLD_POOL(RoadStop, RoadStop, 5, 2000)
+
+static const byte INITIAL_STATION_RATING = 175;
+
+struct GoodsEntry {
+	enum AcceptancePickup {
+		ACCEPTANCE,
+		PICKUP
+	};
+
+	GoodsEntry() :
+		acceptance_pickup(0),
+		days_since_pickup(255),
+		rating(INITIAL_STATION_RATING),
+		last_speed(0),
+		last_age(255)
+	{}
+
+	byte acceptance_pickup;
+	byte days_since_pickup;
+	byte rating;
+	byte last_speed;
+	byte last_age;
+	CargoList cargo; ///< The cargo packets of cargo waiting in this station
+};
+
+/** A Stop for a Road Vehicle */
+struct RoadStop : PoolItem<RoadStop, RoadStopID, &_RoadStop_pool> {
+	static const int  cDebugCtorLevel =  5;  ///< Debug level on which Contructor / Destructor messages are printed
+	static const uint LIMIT           = 16;  ///< The maximum amount of roadstops that are allowed at a single station
+	static const uint MAX_BAY_COUNT   =  2;  ///< The maximum number of loading bays
+
+	TileIndex        xy;                    ///< Position on the map
+	byte             status;                ///< Current status of the Stop. Like which spot is taken. Access using *Bay and *Busy functions.
+	byte             num_vehicles;          ///< Number of vehicles currently slotted to this stop
+	struct RoadStop  *next;                 ///< Next stop of the given type at this station
+
+	RoadStop(TileIndex tile = 0);
+	virtual ~RoadStop();
+
+	/**
+	 * Determines whether a road stop exists
+	 * @return true if and only is the road stop exists
+	 */
+	inline bool IsValid() const { return this->xy != 0; }
+
+	/* For accessing status */
+	bool HasFreeBay() const;
+	bool IsFreeBay(uint nr) const;
+	uint AllocateBay();
+	void AllocateDriveThroughBay(uint nr);
+	void FreeBay(uint nr);
+	bool IsEntranceBusy() const;
+	void SetEntranceBusy(bool busy);
+
+	RoadStop *GetNextRoadStop(const Vehicle *v) const;
+};
+
+struct StationSpecList {
+	const StationSpec *spec;
+	uint32 grfid;      ///< GRF ID of this custom station
+	uint8  localidx;   ///< Station ID within GRF of station
+};
+
+struct FSMportsSpecList {
+	const FSMportsSpec *spec;
+	uint32 grfid;      ///< GRF ID of this custom station
+	uint8  localidx;   ///< Station ID within GRF of station
+};
+
+/** StationRect - used to track station spread out rectangle - cheaper than scanning whole map */
+struct StationRect : public Rect {
+	enum StationRectMode
+	{
+		ADD_TEST = 0,
+		ADD_TRY,
+		ADD_FORCE
+	};
+
+	StationRect();
+	void MakeEmpty();
+	bool PtInExtendedRect(int x, int y, int distance = 0) const;
+	bool IsEmpty() const;
+	bool BeforeAddTile(TileIndex tile, StationRectMode mode);
+	bool BeforeAddRect(TileIndex tile, int w, int h, StationRectMode mode);
+	bool AfterRemoveTile(Station *st, TileIndex tile);
+	bool AfterRemoveRect(Station *st, TileIndex tile, int w, int h);
+
+	static bool ScanForStationTiles(StationID st_id, int left_a, int top_a, int right_a, int bottom_a);
+
+	StationRect& operator = (Rect src);
+};
+
+struct Station : PoolItem<Station, StationID, &_Station_pool> {
+public:
+	RoadStop *GetPrimaryRoadStop(RoadStopType type) const
+	{
+		return type == ROADSTOP_BUS ? bus_stops : truck_stops;
+	}
+
+	RoadStop *GetPrimaryRoadStop(const Vehicle *v) const;
+
+	const AirportFTAClass *Airport() const
+	{
+		return IsCustomFSMportsSpecIndex(airport_tile) ? fsmportsspeclist[1].spec->portFSM : AirportFTAClass::dummy;
+	}
+
+	TileIndex xy;
+	RoadStop *bus_stops;
+	RoadStop *truck_stops;
+	TileIndex train_tile;
+	TileIndex airport_tile;
+	TileIndex dock_tile;
+	Town *town;
+	StringID string_id;     ///< Default name (town area) of station
+	char *name;             ///< Custom name
+
+	ViewportSign sign;
+
+	uint16 had_vehicle_of_type;
+
+	byte time_since_load;
+	byte time_since_unload;
+	byte delete_ctr;
+	PlayerByte owner;
+	byte facilities;
+	byte airport_type;
+	byte FSMport_layout_set;  /* indicates which layout set (S) of several in an FSMport spec->layouts[S] to use */
+	byte FSMport_orientation; /* direction of orientation of station for use with FSMports */
+	bool FSMport_flood_protected;     /* prevents flooding destroying water based FSMports */
+
+	/* trainstation width/height */
+	byte trainst_w, trainst_h;
+
+	/** List of custom stations (StationSpecs) allocated to the station */
+	uint8 num_specs;
+	StationSpecList *speclist;
+	uint8 num_fsmportsspecs;
+	FSMportsSpecList *fsmportsspeclist;
+
+	Date build_date;
+
+	FSMblockmap airport_flags;   ///< stores which blocks on the port are taken
+
+	byte last_vehicle_type;
+	std::list<Vehicle *> loading_vehicles;
+	GoodsEntry goods[NUM_CARGO];
+
+	uint16 random_bits;
+	byte waiting_triggers;
+
+	StationRect rect; ///< Station spread out rectangle (not saved) maintained by StationRect_xxx() functions
+
+	static const int cDebugCtorLevel = 5;
+
+	Station(TileIndex tile = 0);
+	virtual ~Station();
+
+	void AddFacility(byte new_facility_bit, TileIndex facil_xy);
+
+	/**
+	 * Mark the sign of a station dirty for repaint.
+	 *
+	 * @ingroup dirty
+	 */
+	void MarkDirty() const;
+
+	/**
+	 * Marks the tiles of the station as dirty.
+	 *
+	 * @ingroup dirty
+	 */
+	void MarkTilesDirty(bool cargo_change) const;
+	bool TileBelongsToRailStation(TileIndex tile) const;
+	uint GetPlatformLength(TileIndex tile, DiagDirection dir) const;
+	uint GetPlatformLength(TileIndex tile) const;
+	bool IsBuoy() const;
+
+	/**
+	 * Determines whether a station exists
+	 * @return true if and only is the station exists
+	 */
+	inline bool IsValid() const { return this->xy != 0; }
+};
+
+static inline StationID GetMaxStationIndex()
+{
+	/* TODO - This isn't the real content of the function, but
+	 *  with the new pool-system this will be replaced with one that
+	 *  _really_ returns the highest index. Now it just returns
+	 *  the next safe value we are sure about everything is below.
+	 */
+	return GetStationPoolSize() - 1;
+}
+
+static inline uint GetNumStations()
+{
+	return GetStationPoolSize();
+}
+
+static inline bool IsValidStationID(StationID index)
+{
+	return index < GetStationPoolSize() && GetStation(index)->IsValid();
+}
+
+#define FOR_ALL_STATIONS_FROM(st, start) for (st = GetStation(start); st != NULL; st = (st->index + 1U < GetStationPoolSize()) ? GetStation(st->index + 1U) : NULL) if (st->IsValid())
+#define FOR_ALL_STATIONS(st) FOR_ALL_STATIONS_FROM(st, 0)
+
+
+/* Stuff for ROADSTOPS */
+
+#define FOR_ALL_ROADSTOPS_FROM(rs, start) for (rs = GetRoadStop(start); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) if (rs->IsValid())
+#define FOR_ALL_ROADSTOPS(rs) FOR_ALL_ROADSTOPS_FROM(rs, 0)
+
+/* End of stuff for ROADSTOPS */
+
+#endif /* STATION_BASE_H */
--- a/src/station_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/station_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -11,11 +11,10 @@
 #include "tile_cmd.h"
 #include "landscape.h"
 #include "station_map.h"
-#include "station.h"
 #include "viewport_func.h"
 #include "command_func.h"
 #include "town.h"
-#include "news.h"
+#include "news_func.h"
 #include "saveload.h"
 #include "airport.h"
 #include "sprite.h"
@@ -44,6 +43,7 @@
 #include "vehicle_func.h"
 #include "string_func.h"
 #include "signal_func.h"
+#include "oldpool_func.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -133,7 +133,7 @@
 	return st->airport_tile + ToTileIndexDiff(keydepot);
 }
 
-RoadStop* GetRoadStopByTile(TileIndex tile, RoadStop::Type type)
+RoadStop* GetRoadStopByTile(TileIndex tile, RoadStopType type)
 {
 	const Station* st = GetStationByTile(tile);
 
@@ -144,7 +144,7 @@
 }
 
 
-static uint GetNumRoadStopsInStation(const Station* st, RoadStop::Type type)
+static uint GetNumRoadStopsInStation(const Station* st, RoadStopType type)
 {
 	uint num = 0;
 
@@ -494,7 +494,7 @@
 	}
 
 	SetDParam(0, st->index);
-	AddNewsItem(msg, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT | NF_TILE, NT_ACCEPTANCE, 0), st->xy, 0);
+	AddNewsItem(msg, NM_SMALL, NF_VIEWPORT | NF_TILE, NT_ACCEPTANCE, DNC_NONE, st->xy, 0);
 }
 
 /**
@@ -528,12 +528,13 @@
 
 	for (int yc = y1; yc != y2; yc++) {
 		for (int xc = x1; xc != x2; xc++) {
-			if (!(IsInsideBS(xc, x, w) && IsInsideBS(yc, y, h))) {
-				TileIndex tile = TileXY(xc, yc);
-
+			TileIndex tile = TileXY(xc, yc);
+
+			if (!IsTileType(tile, MP_STATION)) {
 				GetProducedCargoProc *gpc = _tile_type_procs[GetTileType(tile)]->get_produced_cargo_proc;
 				if (gpc != NULL) {
-					CargoID cargos[2] = { CT_INVALID, CT_INVALID };
+					CargoID cargos[256]; // Required for CBID_HOUSE_PRODUCE_CARGO.
+					memset(cargos, CT_INVALID, 256);
 
 					gpc(tile, cargos);
 					for (uint i = 0; i < lengthof(cargos); ++i) {
@@ -1387,7 +1388,7 @@
 }
 
 /**
- * @param truck_station Determines whether a stop is RoadStop::BUS or RoadStop::TRUCK
+ * @param truck_station Determines whether a stop is ROADSTOP_BUS or ROADSTOP_TRUCK
  * @param st The Station to do the whole procedure for
  * @return a pointer to where to link a new RoadStop*
  */
@@ -1486,7 +1487,7 @@
 	AutoPtrT<RoadStop> rs_auto_delete(road_stop);
 
 	if (st != NULL &&
-			GetNumRoadStopsInStation(st, RoadStop::BUS) + GetNumRoadStopsInStation(st, RoadStop::TRUCK) >= RoadStop::LIMIT) {
+			GetNumRoadStopsInStation(st, ROADSTOP_BUS) + GetNumRoadStopsInStation(st, ROADSTOP_TRUCK) >= RoadStop::LIMIT) {
 		return_cmd_error(type ? STR_TOO_MANY_TRUCK_STOPS : STR_TOO_MANY_BUS_STOPS);
 	}
 
@@ -1531,7 +1532,7 @@
 
 		st->rect.BeforeAddTile(tile, StationRect::ADD_TRY);
 
-		RoadStop::Type rs_type = type ? RoadStop::TRUCK : RoadStop::BUS;
+		RoadStopType rs_type = type ? ROADSTOP_TRUCK : ROADSTOP_BUS;
 		if (is_drive_through) {
 			MakeDriveThroughRoadStop(tile, st->owner, st->index, rs_type, rts, (Axis)p1, town_owned_road);
 		} else {
@@ -1577,10 +1578,10 @@
 	RoadStop *cur_stop;
 	if (is_truck) { // truck stop
 		primary_stop = &st->truck_stops;
-		cur_stop = GetRoadStopByTile(tile, RoadStop::TRUCK);
+		cur_stop = GetRoadStopByTile(tile, ROADSTOP_TRUCK);
 	} else {
 		primary_stop = &st->bus_stops;
-		cur_stop = GetRoadStopByTile(tile, RoadStop::BUS);
+		cur_stop = GetRoadStopByTile(tile, ROADSTOP_BUS);
 	}
 
 	assert(cur_stop != NULL);
@@ -1976,7 +1977,7 @@
 		if (player == INVALID_PLAYER || v->owner == player) {
 			const Order *order;
 			FOR_VEHICLE_ORDERS(v, order) {
-				if (order->type == OT_GOTO_STATION && order->dest == station) {
+				if (order->IsType(OT_GOTO_STATION) && order->GetDestination() == station) {
 					return true;
 				}
 			}
@@ -2290,7 +2291,7 @@
 	 * but this is something else. If AI builds station with 114 it looks all weird */
 	DrawGroundSprite(image, HasBit(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE);
 
-	if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC && IsStationTileElectrifiable(ti->tile)) DrawCatenary(ti);
+	if (HasCatenary(GetRailType(ti->tile)) && IsStationTileElectrifiable(ti->tile)) DrawCatenary(ti);
 
 	if (HasBit(roadtypes, ROADTYPE_TRAM)) {
 		Axis axis = GetRoadStopDir(ti->tile) == DIAGDIR_NE ? AXIS_X : AXIS_Y;
@@ -2298,6 +2299,9 @@
 		DrawTramCatenary(ti, axis == AXIS_X ? ROAD_X : ROAD_Y);
 	}
 
+	/* End now if buildings are invisible */
+	if (IsInvisibilitySet(TO_BUILDINGS)) return;
+
 	const DrawTileSeqStruct *dtss;
 	foreach_draw_tile_seq(dtss, t->seq) {
 		SpriteID image = dtss->image.sprite;
@@ -2512,33 +2516,27 @@
 
 static VehicleEnterTileStatus VehicleEnter_Station(Vehicle *v, TileIndex tile, int x, int y)
 {
+	StationID station_id = GetStationIndex(tile);
+	if (!v->current_order.ShouldStopAtStation(v, station_id)) return VETSB_CONTINUE;
+
 	if (v->type == VEH_TRAIN) {
 		if (IsRailwayStation(tile) && IsFrontEngine(v) &&
 				!IsCompatibleTrainStationTile(tile + TileOffsByDiagDir(DirToDiagDir(v->direction)), tile)) {
-			StationID station_id = GetStationIndex(tile);
-
-			if ((!(v->current_order.flags & OFB_NON_STOP) && !_patches.new_nonstop) ||
-					(v->current_order.type == OT_GOTO_STATION && v->current_order.dest == station_id)) {
-				if (!(_patches.new_nonstop && v->current_order.flags & OFB_NON_STOP) &&
-						v->current_order.type != OT_LEAVESTATION &&
-						v->last_station_visited != station_id) {
-					DiagDirection dir = DirToDiagDir(v->direction);
-
-					x &= 0xF;
-					y &= 0xF;
-
-					if (DiagDirToAxis(dir) != AXIS_X) Swap(x, y);
-					if (y == TILE_SIZE / 2) {
-						if (dir != DIAGDIR_SE && dir != DIAGDIR_SW) x = TILE_SIZE - 1 - x;
-						if (x == 12) return VETSB_ENTERED_STATION | (VehicleEnterTileStatus)(station_id << VETS_STATION_ID_OFFSET); /* enter station */
-						if (x < 12) {
-							uint16 spd;
-
-							v->vehstatus |= VS_TRAIN_SLOWING;
-							spd = _enter_station_speedtable[x];
-							if (spd < v->cur_speed) v->cur_speed = spd;
-						}
-					}
+			DiagDirection dir = DirToDiagDir(v->direction);
+
+			x &= 0xF;
+			y &= 0xF;
+
+			if (DiagDirToAxis(dir) != AXIS_X) Swap(x, y);
+			if (y == TILE_SIZE / 2) {
+				if (dir != DIAGDIR_SE && dir != DIAGDIR_SW) x = TILE_SIZE - 1 - x;
+				if (x == 12) return VETSB_ENTERED_STATION | (VehicleEnterTileStatus)(station_id << VETS_STATION_ID_OFFSET); /* enter station */
+				if (x < 12) {
+					uint16 spd;
+
+					v->vehstatus |= VS_TRAIN_SLOWING;
+					spd = _enter_station_speedtable[x];
+					if (spd < v->cur_speed) v->cur_speed = spd;
 				}
 			}
 		}
@@ -2555,8 +2553,8 @@
 					if (!rs->IsFreeBay(side)) return VETSB_CANNOT_ENTER;
 
 					/* Check if the vehicle is stopping at this road stop */
-					if (GetRoadStopType(tile) == (IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK) &&
-							v->current_order.dest == GetStationIndex(tile)) {
+					if (GetRoadStopType(tile) == (IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? ROADSTOP_BUS : ROADSTOP_TRUCK) &&
+							v->current_order.GetDestination() == GetStationIndex(tile)) {
 						SetBit(v->u.road.state, RVS_IS_STOPPING);
 						rs->AllocateDriveThroughBay(side);
 					}
@@ -3032,7 +3030,7 @@
 	} else {
 		if (IsDriveThroughStopTile(tile)) {
 			/* Remove the drive-through road stop */
-			DoCommand(tile, 0, (GetStationType(tile) == STATION_TRUCK) ? RoadStop::TRUCK : RoadStop::BUS, DC_EXEC | DC_BANKRUPT, CMD_REMOVE_ROAD_STOP);
+			DoCommand(tile, 0, (GetStationType(tile) == STATION_TRUCK) ? ROADSTOP_TRUCK : ROADSTOP_BUS, DC_EXEC | DC_BANKRUPT, CMD_REMOVE_ROAD_STOP);
 			assert(IsTileType(tile, MP_ROAD));
 			/* Change owner of tile and all roadtypes */
 			ChangeTileOwner(tile, old_player, new_player);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/station_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,51 @@
+/* $Id$ */
+
+/** @file station_func.h Functions related to stations. */
+
+#ifndef STATION_FUNC_H
+#define STATION_FUNC_H
+
+#include "station_type.h"
+#include "sprite.h"
+#include "rail_type.h"
+#include "road_type.h"
+#include "tile_type.h"
+#include "cargo_type.h"
+#include "vehicle_type.h"
+#include <set>
+
+void ModifyStationRatingAround(TileIndex tile, PlayerID owner, int amount, uint radius);
+
+/** A set of stations (\c const \c Station* ) */
+typedef std::set<Station*> StationSet;
+
+StationSet FindStationsAroundIndustryTile(TileIndex tile, int w, int h);
+
+void ShowStationViewWindow(StationID station);
+void UpdateAllStationVirtCoord();
+
+void AfterLoadStations();
+void GetProductionAroundTiles(AcceptedCargo produced, TileIndex tile, int w, int h, int rad);
+void GetAcceptanceAroundTiles(AcceptedCargo accepts, TileIndex tile, int w, int h, int rad);
+
+const DrawTileSprites *GetStationTileLayout(StationType st, byte gfx);
+void StationPickerDrawSprite(int x, int y, StationType st, RailType railtype, RoadType roadtype, int image);
+
+bool HasStationInUse(StationID station, PlayerID player);
+
+RoadStop * GetRoadStopByTile(TileIndex tile, RoadStopType type);
+uint GetNumRoadStops(const Station* st, RoadStopType type);
+RoadStop * AllocateRoadStop();
+
+void ClearSlot(Vehicle *v);
+
+void DeleteOilRig(TileIndex t);
+
+/* Check if a rail station tile is traversable. */
+bool IsStationTileBlocked(TileIndex tile);
+
+/* Check if a rail station tile is electrifiable. */
+bool IsStationTileElectrifiable(TileIndex tile);
+
+
+#endif /* STATION_FUNC_H */
--- a/src/station_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/station_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -8,7 +8,7 @@
 #include "gui.h"
 #include "window_gui.h"
 #include "textbuf_gui.h"
-#include "station.h"
+#include "station_base.h"
 #include "player_func.h"
 #include "economy_func.h"
 #include "town.h"
@@ -17,13 +17,14 @@
 #include "vehicle_gui.h"
 #include "cargotype.h"
 #include "station_gui.h"
-#include "station.h"
+#include "station_func.h"
 #include "strings_func.h"
 #include "core/alloc_func.hpp"
 #include "window_func.h"
 #include "viewport_func.h"
 #include "gfx_func.h"
 #include "widgets/dropdown_func.h"
+#include "newgrf_cargo.h"
 
 #include "table/strings.h"
 #include "table/sprites.h"
@@ -387,7 +388,7 @@
 
 				assert(st->xy != 0);
 
- 				/* Do not do the complex check HasStationInUse here, it may be even false
+				/* Do not do the complex check HasStationInUse here, it may be even false
 				 * when the order had been removed and the station list hasn't been removed yet */
 				assert(st->owner == owner || (st->owner == OWNER_NONE && !st->IsBuoy()));
 
@@ -682,19 +683,8 @@
 {   WIDGETS_END},
 };
 
-/**
- * Draws icons of wainting cargo in the StationView window
- *
- * @param i type of cargo
- * @param waiting number of wainting units
- * @param x x on-screen coordinate where to start with drawing icons
- * @param y y coordinate
- */
-static void DrawCargoIcons(CargoID i, uint waiting, int x, int y, uint width)
+SpriteID GetCargoSprite(CargoID i)
 {
-	uint num = min((waiting + 5) / 10, width / 10); // maximum is width / 10 icons so it won't overflow
-	if (num == 0) return;
-
 	const CargoSpec *cs = GetCargo(i);
 	SpriteID sprite;
 
@@ -707,12 +697,36 @@
 
 	if (sprite == 0) sprite = SPR_CARGO_GOODS;
 
+	return sprite;
+}
+
+/**
+ * Draws icons of waiting cargo in the StationView window
+ *
+ * @param i type of cargo
+ * @param waiting number of waiting units
+ * @param x x on-screen coordinate where to start with drawing icons
+ * @param y y coordinate
+ */
+static void DrawCargoIcons(CargoID i, uint waiting, int x, int y, uint width)
+{
+	uint num = min((waiting + 5) / 10, width / 10); // maximum is width / 10 icons so it won't overflow
+	if (num == 0) return;
+
+	SpriteID sprite = GetCargoSprite(i);
+
 	do {
 		DrawSprite(sprite, PAL_NONE, x, y);
 		x += 10;
 	} while (--num);
 }
 
+struct stationview_d {
+	uint32 cargo;                 ///< Bitmask of cargo types to expand
+	uint16 cargo_rows[NUM_CARGO]; ///< Header row for each cargo type
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(stationview_d));
+
 struct CargoData {
 	CargoID cargo;
 	StationID source;
@@ -740,13 +754,19 @@
 	int pos;      ///< = w->vscroll.pos
 	StringID str;
 	CargoDataList cargolist;
+	uint32 transfers = 0;
 
 	/* count types of cargos waiting in station */
 	for (CargoID i = 0; i < NUM_CARGO; i++) {
-		if (!st->goods[i].cargo.Empty()) {
+		if (st->goods[i].cargo.Empty()) {
+			WP(w, stationview_d).cargo_rows[i] = 0;
+		} else {
 			/* Add an entry for total amount of cargo of this type waiting. */
 			cargolist.push_back(CargoData(i, INVALID_STATION, st->goods[i].cargo.Count()));
 
+			/* Set the row for this cargo entry for the expand/hide button */
+			WP(w, stationview_d).cargo_rows[i] = cargolist.size();
+
 			/* Add an entry for each distinct cargo source. */
 			const CargoList::List *packets = st->goods[i].cargo.Packets();
 			for (CargoList::List::const_iterator it = packets->begin(); it != packets->end(); it++) {
@@ -754,6 +774,12 @@
 				if (cp->source != station_id) {
 					bool added = false;
 
+					/* Enable the expand/hide button for this cargo type */
+					SetBit(transfers, i);
+
+					/* Don't add cargo lines if not expanded */
+					if (!HasBit(WP(w, stationview_d).cargo, i)) break;
+
 					/* Check if we already have this source in the list */
 					for (CargoDataList::iterator jt = cargolist.begin(); jt != cargolist.end(); jt++) {
 						CargoData *cd = &(*jt);
@@ -807,7 +833,14 @@
 				DrawCargoIcons(cd->cargo, cd->count, x, y, width);
 				SetDParam(0, cd->cargo);
 				SetDParam(1, cd->count);
-				DrawStringRightAligned(x + width, y, STR_0009, TC_FROMSTRING);
+				if (HasBit(transfers, cd->cargo)) {
+					/* This cargo has transfers waiting so show the expand or shrink 'button' */
+					const char *sym = HasBit(WP(w, stationview_d).cargo, cd->cargo) ? "-" : "+";
+					DrawStringRightAligned(x + width - 8, y, STR_0009, TC_FROMSTRING);
+					DoDrawString(sym, x + width - 6, y, TC_YELLOW);
+				} else {
+					DrawStringRightAligned(x + width, y, STR_0009, TC_FROMSTRING);
+				}
 			} else {
 				SetDParam(0, cd->cargo);
 				SetDParam(1, cd->count);
@@ -870,6 +903,19 @@
 	}
 }
 
+static void HandleCargoWaitingClick(Window *w, int row)
+{
+	if (row == 0) return;
+
+	for (CargoID c = 0; c < NUM_CARGO; c++) {
+		if (WP(w, stationview_d).cargo_rows[c] == row) {
+			ToggleBit(WP(w, stationview_d).cargo, c);
+			w->InvalidateWidget(SVW_WAITING);
+			break;
+		}
+	}
+}
+
 
 /**
  * Fuction called when any WindowEvent occurs for any StationView window
@@ -886,6 +932,10 @@
 
 		case WE_CLICK:
 			switch (e->we.click.widget) {
+				case SVW_WAITING:
+					HandleCargoWaitingClick(w, (e->we.click.pt.y - w->widget[SVW_WAITING].top) / 10 + w->vscroll.pos);
+					break;
+
 				case SVW_LOCATION:
 					ScrollMainWindowToTile(GetStation(w->window_number)->xy);
 					break;
@@ -953,7 +1003,7 @@
 
 		case WE_DESTROY: {
 			WindowNumber wno =
-				(w->window_number << 16) | GetStation(w->window_number)->owner;
+				(w->window_number << 16) | VLW_STATION_LIST | GetStation(w->window_number)->owner;
 
 			DeleteWindowById(WC_TRAINS_LIST, wno);
 			DeleteWindowById(WC_ROADVEH_LIST, wno);
--- a/src/station_gui.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/station_gui.h	Tue Apr 15 00:47:19 2008 +0000
@@ -58,7 +58,7 @@
 	SCT_ALL
 };
 
-int DrawStationCoverageAreaText(int sx, int sy, StationCoverageType sct, int rad);
+int DrawStationCoverageAreaText(int sx, int sy, StationCoverageType sct, int rad, bool supplies);
 void CheckRedrawStationCoverage(const Window *w);
 
 extern bool _station_show_coverage;
--- a/src/station_map.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/station_map.h	Tue Apr 15 00:47:19 2008 +0000
@@ -8,7 +8,8 @@
 #include "rail_map.h"
 #include "road_map.h"
 #include "water_map.h"
-#include "station.h"
+#include "station_func.h"
+#include "station_base.h"
 #include "rail.h"
 
 typedef byte StationGfx;
@@ -49,10 +50,10 @@
 	return (StationType)GB(_m[t].m6, 3, 3);
 }
 
-static inline RoadStop::Type GetRoadStopType(TileIndex t)
+static inline RoadStopType GetRoadStopType(TileIndex t)
 {
 	assert(GetStationType(t) == STATION_TRUCK || GetStationType(t) == STATION_BUS);
-	return GetStationType(t) == STATION_TRUCK ? RoadStop::TRUCK : RoadStop::BUS;
+	return GetStationType(t) == STATION_TRUCK ? ROADSTOP_TRUCK : ROADSTOP_BUS;
 }
 
 static inline StationGfx GetStationGfx(TileIndex t)
@@ -261,15 +262,15 @@
 	SetRailType(t, rt);
 }
 
-static inline void MakeRoadStop(TileIndex t, Owner o, StationID sid, RoadStop::Type rst, RoadTypes rt, DiagDirection d)
+static inline void MakeRoadStop(TileIndex t, Owner o, StationID sid, RoadStopType rst, RoadTypes rt, DiagDirection d)
 {
-	MakeStation(t, o, sid, (rst == RoadStop::BUS ? STATION_BUS : STATION_TRUCK), d);
+	MakeStation(t, o, sid, (rst == ROADSTOP_BUS ? STATION_BUS : STATION_TRUCK), d);
 	SetRoadTypes(t, rt);
 }
 
-static inline void MakeDriveThroughRoadStop(TileIndex t, Owner o, StationID sid, RoadStop::Type rst, RoadTypes rt, Axis a, bool on_town_road)
+static inline void MakeDriveThroughRoadStop(TileIndex t, Owner o, StationID sid, RoadStopType rst, RoadTypes rt, Axis a, bool on_town_road)
 {
-	MakeStation(t, o, sid, (rst == RoadStop::BUS ? STATION_BUS : STATION_TRUCK), GFX_TRUCK_BUS_DRIVETHROUGH_OFFSET + a);
+	MakeStation(t, o, sid, (rst == ROADSTOP_BUS ? STATION_BUS : STATION_TRUCK), GFX_TRUCK_BUS_DRIVETHROUGH_OFFSET + a);
 	SB(_m[t].m6, 2, 1, on_town_road);
 	SetRoadTypes(t, rt);
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/station_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,65 @@
+/* $Id$ */
+
+/** @file station_type.h Types related to stations. */
+
+#ifndef STATION_TYPE_H
+#define STATION_TYPE_H
+
+typedef uint16 StationID;
+typedef uint16 RoadStopID;
+
+struct Station;
+struct RoadStop;
+struct StationSpec;
+
+static const StationID INVALID_STATION = 0xFFFF;
+
+enum StationType {
+	STATION_RAIL,
+	STATION_AIRPORT,
+	STATION_TRUCK,
+	STATION_BUS,
+	STATION_OILRIG,
+	STATION_DOCK,
+	STATION_BUOY
+};
+
+/** Types of RoadStops */
+enum RoadStopType {
+	ROADSTOP_BUS,    ///< A standard stop for buses
+	ROADSTOP_TRUCK   ///< A standard stop for trucks
+};
+
+enum {
+	FACIL_TRAIN      = 0x01,
+	FACIL_TRUCK_STOP = 0x02,
+	FACIL_BUS_STOP   = 0x04,
+	FACIL_AIRPORT    = 0x08,
+	FACIL_DOCK       = 0x10,
+};
+
+enum {
+//	HVOT_PENDING_DELETE = 1 << 0, // not needed anymore
+	HVOT_TRAIN    = 1 << 1,
+	HVOT_BUS      = 1 << 2,
+	HVOT_TRUCK    = 1 << 3,
+	HVOT_AIRCRAFT = 1 << 4,
+	HVOT_SHIP     = 1 << 5,
+	/* This bit is used to mark stations. No, it does not belong here, but what
+	 * can we do? ;-) */
+	HVOT_BUOY     = 1 << 6
+};
+
+enum CatchmentArea {
+	CA_NONE            =  0,
+	CA_BUS             =  3,
+	CA_TRUCK           =  3,
+	CA_TRAIN           =  4,
+	CA_DOCK            =  5,
+
+	CA_UNMODIFIED      =  4, ///< Used when _patches.modified_catchment is false
+
+	MAX_CATCHMENT      = 10, ///< Airports have a catchment up to this number.
+};
+
+#endif /* STATION_TYPE_H */
--- a/src/stdafx.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/stdafx.h	Tue Apr 15 00:47:19 2008 +0000
@@ -32,8 +32,15 @@
 		#include <stdint.h>
 	#endif
 #else
-	#define INT64_MAX 9223372036854775807LL
-	#define INT64_MIN (-INT64_MAX - 1)
+	#define UINT64_MAX (18446744073709551615ULL)
+	#define INT64_MAX  (9223372036854775807LL)
+	#define INT64_MIN  (-INT64_MAX - 1)
+	#define UINT32_MAX (4294967295U)
+	#define INT32_MAX  (2147483647)
+	#define INT32_MIN  (-INT32_MAX - 1)
+	#define UINT16_MAX (65535U)
+	#define INT16_MAX  (32767)
+	#define INT16_MIN  (-INT16_MAX - 1)
 #endif
 
 #include <cstdio>
--- a/src/strgen/strgen.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/strgen/strgen.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -103,7 +103,7 @@
 static int _numcases;
 
 // for each plural value, this is the number of plural forms.
-static const byte _plural_form_counts[] = { 2, 1, 2, 3, 3, 3, 3, 3, 4 };
+static const byte _plural_form_counts[] = { 2, 1, 2, 3, 3, 3, 3, 3, 4, 2 };
 
 static const char *_cur_ident;
 
@@ -1287,7 +1287,7 @@
 
 int CDECL main(int argc, char* argv[])
 {
-	char pathbuf[256];
+	char pathbuf[MAX_PATH];
 	const char *src_dir = ".";
 	const char *dest_dir = NULL;
 
--- a/src/string_func.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/string_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -48,7 +48,7 @@
 static inline int ttd_strnlen(const char *str, int maxlen)
 {
 	const char *t;
-	for (t = str; *t != '\0' && t - str < maxlen; t++);
+	for (t = str; *t != '\0' && t - str < maxlen; t++) {}
 	return t - str;
 }
 
@@ -128,7 +128,7 @@
 static inline char *Utf8PrevChar(const char *s)
 {
 	const char *ret = s;
-	while (IsUtf8Part(*--ret));
+	while (IsUtf8Part(*--ret)) {}
 	return (char*)ret;
 }
 
@@ -142,7 +142,8 @@
 }
 
 /**
- * Check whether UNICODE character is whitespace or not
+ * Check whether UNICODE character is whitespace or not, i.e. whether
+ * this is a potential line-break character.
  * @param c UNICODE character to check
  * @return a boolean value whether 'c' is a whitespace character or not
  * @see http://www.fileformat.info/info/unicode/category/Zs/list.htm
@@ -151,7 +152,6 @@
 {
 	return
 	  c == 0x0020 /* SPACE */ ||
-	  c == 0x00A0 /* NO-BREAK SPACE */ ||
 	  c == 0x3000 /* IDEOGRAPHIC SPACE */
 	;
 }
--- a/src/strings.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/strings.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -5,10 +5,9 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "currency.h"
-#include "namegen.h"
-#include "station.h"
+#include "namegen_func.h"
+#include "station_base.h"
 #include "town.h"
-#include "news.h"
 #include "screenshot.h"
 #include "waypoint.h"
 #include "industry.h"
@@ -21,7 +20,7 @@
 #include "group.h"
 #include "debug.h"
 #include "newgrf_townname.h"
-#include "signs.h"
+#include "signs_base.h"
 #include "newgrf_engine.h"
 #include "spritecache.h"
 #include "fontcache.h"
@@ -37,6 +36,7 @@
 #include "fios.h"
 #include "settings_type.h"
 #include "video/video_driver.hpp"
+#include "engine_func.h"
 
 #include "table/strings.h"
 #include "table/control_codes.h"
@@ -400,68 +400,75 @@
 	return buff;
 }
 
-static int DeterminePluralForm(int64 cnt)
+static int DeterminePluralForm(int64 count)
 {
-	uint64 n = cnt;
 	/* The absolute value determines plurality */
-	if (cnt < 0) n = -cnt;
+	uint64 n = abs(count);
 
 	switch (_langpack->plural_form) {
-	/* Two forms, singular used for one only
-	 * Used in:
-	 *   Danish, Dutch, English, German, Norwegian, Swedish, Estonian, Finnish,
-	 *   Greek, Hebrew, Italian, Portuguese, Spanish, Esperanto */
-	case 0:
-	default:
-		return n != 1;
-
-	/* Only one form
-	 * Used in:
-	 *   Hungarian, Japanese, Korean, Turkish */
-	case 1:
-		return 0;
-
-	/* Two forms, singular used for zero and one
-	 * Used in:
-	 *   French, Brazilian Portuguese */
-	case 2:
-		return n > 1;
-
-	/* Three forms, special case for zero
-	 * Used in:
-	 *   Latvian */
-	case 3:
-		return n % 10 == 1 && n % 100 != 11 ? 0 : n != 0 ? 1 : 2;
+		default:
+			NOT_REACHED();
 
-	/* Three forms, special case for one and two
-	 * Used in:
-	 *   Gaelige (Irish) */
-	case 4:
-		return n == 1 ? 0 : n == 2 ? 1 : 2;
-
-	/* Three forms, special case for numbers ending in 1[2-9]
-	 * Used in:
-	 *   Lithuanian */
-	case 5:
-		return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+		/* Two forms, singular used for one only
+		 * Used in:
+		 *   Danish, Dutch, English, German, Norwegian, Swedish, Estonian, Finnish,
+		 *   Greek, Hebrew, Italian, Portuguese, Spanish, Esperanto */
+		case 0:
+			return n != 1;
 
-	/* Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
-	 * Used in:
-	 *   Croatian, Czech, Russian, Slovak, Ukrainian */
-	case 6:
-		return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+		/* Only one form
+		 * Used in:
+		 *   Hungarian, Japanese, Korean, Turkish */
+		case 1:
+			return 0;
 
-	/* Three forms, special case for one and some numbers ending in 2, 3, or 4
-	 * Used in:
-	 *   Polish */
-	case 7:
-		return n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+		/* Two forms, singular used for zero and one
+		 * Used in:
+		 *   French, Brazilian Portuguese */
+		case 2:
+			return n > 1;
 
-	/* Four forms, special case for one and all numbers ending in 02, 03, or 04
-	 * Used in:
-	 *   Slovenian */
-	case 8:
-		return n % 100 == 1 ? 0 : n % 100 == 2 ? 1 : n % 100 == 3 || n % 100 == 4 ? 2 : 3;
+		/* Three forms, special case for zero
+		 * Used in:
+		 *   Latvian */
+		case 3:
+			return n % 10 == 1 && n % 100 != 11 ? 0 : n != 0 ? 1 : 2;
+
+		/* Three forms, special case for one and two
+		 * Used in:
+		 *   Gaelige (Irish) */
+		case 4:
+			return n == 1 ? 0 : n == 2 ? 1 : 2;
+
+		/* Three forms, special case for numbers ending in 1[2-9]
+		 * Used in:
+		 *   Lithuanian */
+		case 5:
+			return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+
+		/* Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
+		 * Used in:
+		 *   Croatian, Czech, Russian, Slovak, Ukrainian */
+		case 6:
+			return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+
+		/* Three forms, special case for one and some numbers ending in 2, 3, or 4
+		 * Used in:
+		 *   Polish */
+		case 7:
+			return n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+
+		/* Four forms, special case for one and all numbers ending in 02, 03, or 04
+		 * Used in:
+		 *   Slovenian */
+		case 8:
+			return n % 100 == 1 ? 0 : n % 100 == 2 ? 1 : n % 100 == 3 || n % 100 == 4 ? 2 : 3;
+
+		/* Two forms; singular used for everything ending in 1 but not in 11.
+		 * Used in:
+		 *   Icelandic */
+		case 9:
+			return n % 10 == 1 && n % 100 != 11 ? 0 : 1;
 	}
 }
 
--- a/src/subsidy_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/subsidy_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -4,7 +4,7 @@
 
 #include "stdafx.h"
 #include "openttd.h"
-#include "station.h"
+#include "station_base.h"
 #include "industry.h"
 #include "town.h"
 #include "economy_func.h"
@@ -92,9 +92,11 @@
 
 	ConvertDateToYMD(_date, &ymd);
 
-	int width = w->width - 2;
+	int width = w->width - 13;  // scroll bar = 11 + pixel each side
 	y = 15;
 	x = 1;
+
+	/* Section for drawing the offered subisidies */
 	DrawStringTruncated(x, y, STR_2026_SUBSIDIES_ON_OFFER_FOR, TC_FROMSTRING, width);
 	y += 10;
 	num = 0;
@@ -103,9 +105,11 @@
 		if (s->cargo_type != CT_INVALID && s->age < 12) {
 			int x2;
 
+			/* Displays the two offered towns */
 			SetupSubsidyDecodeParam(s, 1);
 			x2 = DrawStringTruncated(x + 2, y, STR_2027_FROM_TO, TC_FROMSTRING, width);
 
+			/* Displays the deadline before voiding the proposal */
 			SetDParam(0, _date - ymd.day + 384 - s->age * 32);
 			DrawStringTruncated(x2, y, STR_2028_BY, TC_FROMSTRING, width - x2);
 			y += 10;
@@ -118,6 +122,7 @@
 		y += 10;
 	}
 
+	/* Section for drawing the already granted subisidies */
 	DrawStringTruncated(x, y + 1, STR_202B_SERVICES_ALREADY_SUBSIDISED, TC_FROMSTRING, width);
 	y += 10;
 	num = 0;
@@ -131,10 +136,14 @@
 			PlayerID player = GetStation(s->to)->owner;
 			SetDParam(3, player);
 
+			/* Displays the two connected stations */
 			xt = DrawStringTruncated(x + 2, y, STR_202C_FROM_TO, TC_FROMSTRING, width - 2);
 
-			SetDParam(0, _date - ymd.day + 768 - s->age * 32);
-			DrawStringTruncated(xt, y, STR_202D_UNTIL, TC_FROMSTRING, width - xt);
+			/* Displays the date where the granted subsidy will end */
+			if ((xt > 3) && (width - xt) > 9 ) { // do not draw if previous drawing failed or if it will overlap on scrollbar
+				SetDParam(0, _date - ymd.day + 768 - s->age * 32);
+				DrawStringTruncated(xt, y, STR_202D_UNTIL, TC_FROMSTRING, width - xt);
+			}
 			y += 10;
 			num++;
 		}
@@ -159,17 +168,20 @@
 }
 
 static const Widget _subsidies_list_widgets[] = {
-{   WWT_CLOSEBOX, RESIZE_NONE,  13,   0,  10,   0,  13, STR_00C5,           STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION, RESIZE_RIGHT, 13,  11, 307,   0,  13, STR_2025_SUBSIDIES, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{  WWT_STICKYBOX, RESIZE_LR,    13, 308, 319,   0,  13, STR_NULL,           STR_STICKY_BUTTON},
-{      WWT_PANEL, RESIZE_RIGHT, 13,   0, 319,  14, 126, 0x0,                STR_01FD_CLICK_ON_SERVICE_TO_CENTER},
+{   WWT_CLOSEBOX, RESIZE_NONE,   13,   0,  10,   0,  13, STR_00C5,           STR_018B_CLOSE_WINDOW},
+{    WWT_CAPTION, RESIZE_RIGHT,  13,  11, 307,   0,  13, STR_2025_SUBSIDIES, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{  WWT_STICKYBOX, RESIZE_LR,     13, 308, 319,   0,  13, STR_NULL,           STR_STICKY_BUTTON},
+{      WWT_PANEL, RESIZE_RB,     13,   0, 307,  14, 126, 0x0,                STR_01FD_CLICK_ON_SERVICE_TO_CENTER},
+{  WWT_SCROLLBAR, RESIZE_LRB,    13, 308, 319,  14, 114, 0x0,                STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{  WWT_RESIZEBOX, RESIZE_LRTB,   13, 308, 319, 115, 126, 0x0,                STR_RESIZE_BUTTON},
+
 {   WIDGETS_END},
 };
 
 static const WindowDesc _subsidies_list_desc = {
-	WDP_AUTO, WDP_AUTO, 320, 127, 630, 127,
+	WDP_AUTO, WDP_AUTO, 320, 127, 320, 127,
 	WC_SUBSIDIES_LIST, WC_NONE,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_RESIZABLE,
 	_subsidies_list_widgets,
 	SubsidiesListWndProc
 };
--- a/src/table/cargo_const.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/table/cargo_const.h	Tue Apr 15 00:47:19 2008 +0000
@@ -106,11 +106,11 @@
 		SPR_CARGO_SUGAR,         CC_BULK        ),
 
 	MK( 18, 'TOYS', 174,  2, 5574, 25, 255, true,  TE_NONE,
-		STR_0025_TOYS,           STR_0045_TOY,            STR_NOTHING,    STR_QUANTITY_TOYS,         STR_ABBREV_TOYS,
+		STR_0025_TOYS,           STR_0045_TOY,            STR_ITEMS,      STR_QUANTITY_TOYS,         STR_ABBREV_TOYS,
 		SPR_CARGO_TOYS,          CC_PIECE_GOODS ),
 
 	MK( 19, 'BATT', 208,  4, 4322,  2,  30, true,  TE_NONE,
-		STR_002B_BATTERIES,      STR_004B_BATTERY,        STR_NOTHING,    STR_QUANTITY_BATTERIES,    STR_ABBREV_BATTERIES,
+		STR_002B_BATTERIES,      STR_004B_BATTERY,        STR_ITEMS,      STR_QUANTITY_BATTERIES,    STR_ABBREV_BATTERIES,
 		SPR_CARGO_BATTERIES,     CC_PIECE_GOODS ),
 
 	MK( 20, 'SWET', 194,  5, 6144,  8,  40, true,  TE_GOODS,
@@ -130,7 +130,7 @@
 		SPR_CARGO_COTTONCANDY,   CC_BULK        ),
 
 	MK( 24, 'BUBL',  10,  1, 5077, 20,  80, true,  TE_NONE,
-		STR_0029_BUBBLES,        STR_0049_BUBBLE,         STR_NOTHING,    STR_QUANTITY_BUBBLES,      STR_ABBREV_BUBBLES,
+		STR_0029_BUBBLES,        STR_0049_BUBBLE,         STR_ITEMS,      STR_QUANTITY_BUBBLES,      STR_ABBREV_BUBBLES,
 		SPR_CARGO_BUBBLES,       CC_PIECE_GOODS ),
 
 	MK( 25, 'PLST', 202, 16, 4664, 30, 255, true,  TE_NONE,
@@ -138,7 +138,7 @@
 		SPR_CARGO_PLASTIC,       CC_LIQUID      ),
 
 	MK( 26, 'FZDR',  48,  2, 6250, 30,  50, true,  TE_FOOD,
-		STR_002D_FIZZY_DRINKS,   STR_004D_FIZZY_DRINK,    STR_NOTHING,    STR_QUANTITY_FIZZY_DRINKS, STR_ABBREV_FIZZY_DRINKS,
+		STR_002D_FIZZY_DRINKS,   STR_004D_FIZZY_DRINK,    STR_ITEMS,      STR_QUANTITY_FIZZY_DRINKS, STR_ABBREV_FIZZY_DRINKS,
 		SPR_CARGO_FIZZYDRINK,    CC_PIECE_GOODS ),
 
 	/* Void slot in temperate */
--- a/src/table/railtypes.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/table/railtypes.h	Tue Apr 15 00:47:19 2008 +0000
@@ -60,6 +60,9 @@
 
 		/* curve speed advantage (multiplier) */
 		0,
+
+		/* flags */
+		RTFB_NONE,
 	},
 
 	/** Electrified railway */
@@ -116,6 +119,9 @@
 
 		/* curve speed advantage (multiplier) */
 		0,
+
+		/* flags */
+		RTFB_CATENARY,
 	},
 
 	/** Monorail */
@@ -168,6 +174,9 @@
 
 		/* curve speed advantage (multiplier) */
 		1,
+
+		/* flags */
+		RTFB_NONE,
 	},
 
 	/** Maglev */
@@ -220,6 +229,9 @@
 
 		/* curve speed advantage (multiplier) */
 		2,
+
+		/* flags */
+		RTFB_NONE,
 	},
 };
 
--- a/src/table/road_land.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/table/road_land.h	Tue Apr 15 00:47:19 2008 +0000
@@ -9,13 +9,13 @@
 };
 
 static const DrawTileSeqStruct _road_depot_SE[] = {
-	TILE_SEQ_LINE(0x580, PAL_NONE, 0, 0, 1, 16)
+	TILE_SEQ_LINE(0x580 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 0, 1, 16)
 	TILE_SEQ_LINE(0x581 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 15, 0, 1, 16)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _road_depot_SW[] = {
-	TILE_SEQ_LINE(0x582, PAL_NONE, 0, 0, 16, 1)
+	TILE_SEQ_LINE(0x582 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 0, 16, 1)
 	TILE_SEQ_LINE(0x583 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 15, 16, 1)
 	TILE_SEQ_END()
 };
@@ -38,13 +38,13 @@
 };
 
 static const DrawTileSeqStruct _tram_depot_SE[] = {
-	TILE_SEQ_LINE(SPR_TRAMWAY_BASE + 0x31, PAL_NONE, 0, 0, 1, 16)
+	TILE_SEQ_LINE((SPR_TRAMWAY_BASE + 0x31) | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 0, 1, 16)
 	TILE_SEQ_LINE((SPR_TRAMWAY_BASE + 0x32) | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 15, 0, 1, 16)
 	TILE_SEQ_END()
 };
 
 static const DrawTileSeqStruct _tram_depot_SW[] = {
-	TILE_SEQ_LINE(SPR_TRAMWAY_BASE + 0x33, PAL_NONE, 0, 0, 16, 1)
+	TILE_SEQ_LINE((SPR_TRAMWAY_BASE + 0x33) | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 0, 16, 1)
 	TILE_SEQ_LINE((SPR_TRAMWAY_BASE + 0x34) | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 15, 16, 1)
 	TILE_SEQ_END()
 };
--- a/src/table/sprites.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/table/sprites.h	Tue Apr 15 00:47:19 2008 +0000
@@ -49,7 +49,7 @@
 
 	/* Extra graphic spritenumbers */
 	SPR_OPENTTD_BASE     = 4896,
-	OPENTTD_SPRITE_COUNT = 138,
+	OPENTTD_SPRITE_COUNT = 144,
 
 	/* Halftile-selection sprites */
 	SPR_HALFTILE_SELECTION_FLAT = SPR_OPENTTD_BASE,
@@ -73,6 +73,14 @@
 	SPR_PIN_UP             = SPR_OPENTTD_BASE + 51,   // pin icon
 	SPR_PIN_DOWN           = SPR_OPENTTD_BASE + 52,
 
+	/* on screen keyboard icons */
+	SPR_OSK_LEFT           = SPR_OPENTTD_BASE + 138,
+	SPR_OSK_RIGHT          = SPR_OPENTTD_BASE + 139,
+	SPR_OSK_CAPS           = SPR_OPENTTD_BASE + 140,
+	SPR_OSK_SHIFT          = SPR_OPENTTD_BASE + 141,
+	SPR_OSK_BACKSPACE      = SPR_OPENTTD_BASE + 142,
+	SPR_OSK_SPECIAL        = SPR_OPENTTD_BASE + 143,
+
 	/* Clone vehicles stuff */
 	SPR_CLONE_TRAIN    = SPR_OPENTTD_BASE + 106,
 	SPR_CLONE_ROADVEH  = SPR_OPENTTD_BASE + 107,
@@ -210,7 +218,7 @@
 
 	/* Flags sprites (in same order as enum NetworkLanguage) */
 	SPR_FLAGS_BASE = SPR_ONEWAY_BASE + ONEWAY_SPRITE_COUNT,
-	FLAGS_SPRITE_COUNT = 29,
+	FLAGS_SPRITE_COUNT = 36,
 
 	/* Not really a sprite, but an empty bounding box. Used to construct bounding boxes, that help sorting the sprites, but do not have a sprite associated. */
 	SPR_EMPTY_BOUNDING_BOX = SPR_FLAGS_BASE + FLAGS_SPRITE_COUNT,
@@ -850,11 +858,15 @@
 	 *  and an end tile (half a tube on the near side, maked _END
 	 */
 	SPR_BTTUB_X_FRONT_BEG       = 2559,
-	SPR_BTTUB_X_FRONT_MID       = 2660,
+	SPR_BTTUB_X_FRONT_MID       = 2560,
 	SPR_BTTUB_X_FRONT_END       = 2561,
 	SPR_BTTUB_Y_FRONT_END       = 2562,
 	SPR_BTTUB_Y_FRONT_MID       = 2563,
 	SPR_BTTUB_Y_FRONT_BEG       = 2564,
+	SPR_BTTUB_X_PILLAR_BEG      = 2565,
+	SPR_BTTUB_X_PILLAR_MID      = 2566,
+	SPR_BTTUB_Y_PILLAR_MID      = 2567,
+	SPR_BTTUB_Y_PILLAR_BEG      = 2568,
 	SPR_BTTUB_X_RAIL_REAR_BEG   = 2569,
 	SPR_BTTUB_X_RAIL_REAR_MID   = 2570,
 	SPR_BTTUB_X_RAIL_REAR_END   = 2571,
--- a/src/table/station_land.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/table/station_land.h	Tue Apr 15 00:47:19 2008 +0000
@@ -132,7 +132,7 @@
 
 static const DrawTileSeqStruct _station_display_datas_32[] = {
 	TILE_SEQ_LINE(14,  0,  0,  2, 16, 28, SPR_AIRPORT_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR))
-	TILE_SEQ_LINE( 0,  0,  0,  2, 16, 28, SPR_AIRPORT_HANGAR_REAR)
+	TILE_SEQ_LINE( 0,  0,  0,  2, 16, 28, SPR_AIRPORT_HANGAR_REAR | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
@@ -291,7 +291,7 @@
 
 static const DrawTileSeqStruct _station_display_datas_65[] = {
 	TILE_SEQ_LINE(14,  0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR))
-	TILE_SEQ_LINE( 0,  0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_REAR)
+	TILE_SEQ_LINE( 0,  0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_REAR | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
@@ -403,7 +403,7 @@
 // concrete underground
 static const DrawTileSeqStruct _station_display_datas_086[] = {
 	TILE_SEQ_LINE(14, 0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR))
-	TILE_SEQ_LINE( 0, 0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_REAR)
+	TILE_SEQ_LINE( 0, 0,  0,  2, 16, 28, SPR_AIRFIELD_HANGAR_REAR | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
@@ -711,7 +711,7 @@
 // West facing hangar
 static const DrawTileSeqStruct _station_display_datas_0129[] = {
 	TILE_SEQ_LINE(14,  0,  0,  2, 16, 28, SPR_NEWHANGAR_W | (1 << PALETTE_MODIFIER_COLOR))
-	TILE_SEQ_LINE( 0,  0,  0,  2, 16, 28, SPR_NEWHANGAR_W_WALL)
+	TILE_SEQ_LINE( 0,  0,  0,  2, 16, 28, SPR_NEWHANGAR_W_WALL | (1 << PALETTE_MODIFIER_COLOR))
 	TILE_SEQ_END()
 };
 
--- a/src/table/track_land.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/table/track_land.h	Tue Apr 15 00:47:19 2008 +0000
@@ -33,6 +33,12 @@
 	{ {SPR_FLAT_GRASS_TILE, PAL_NONE}, _depot_gfx_NW }
 };
 
+static const DrawTileSprites _depot_invisible_gfx_table[] = {
+	{ {SPR_RAIL_TRACK_X, PAL_NONE}, _depot_gfx_NE },
+	{ {SPR_RAIL_TRACK_Y, PAL_NONE}, _depot_gfx_SE },
+	{ {SPR_RAIL_TRACK_X, PAL_NONE}, _depot_gfx_SW },
+	{ {SPR_RAIL_TRACK_Y, PAL_NONE}, _depot_gfx_NW }
+};
 
 static const DrawTileSeqStruct _waypoint_gfx_X[] = {
 	TILE_SEQ_LINE((1 << PALETTE_MODIFIER_COLOR) | SPR_WAYPOINT_X_1,  0,  0,  16,  5)
--- a/src/terraform_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/terraform_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -35,8 +35,8 @@
 };
 
 struct TerraformerState {
-	int modheight_count;                                         ///< amount of entries in "modheight".
-	int tile_table_count;                                        ///< amount of entries in "tile_table".
+	int modheight_count;  ///< amount of entries in "modheight".
+	int tile_table_count; ///< amount of entries in "tile_table".
 
 	/**
 	 * Dirty tiles, i.e.\ at least one corner changed.
@@ -49,7 +49,7 @@
 	TerraformerHeightMod modheight[TERRAFORMER_MODHEIGHT_SIZE];  ///< Height modifications.
 };
 
-TileIndex _terraform_err_tile;
+TileIndex _terraform_err_tile; ///< first tile we couldn't terraform
 
 /**
  * Gets the TileHeight (height of north corner) of a tile as of current terraforming progress.
@@ -58,12 +58,11 @@
  * @param tile Tile.
  * @return TileHeight.
  */
-static int TerraformGetHeightOfTile(TerraformerState *ts, TileIndex tile)
+static int TerraformGetHeightOfTile(const TerraformerState *ts, TileIndex tile)
 {
-	TerraformerHeightMod *mod = ts->modheight;
-	int count;
+	const TerraformerHeightMod *mod = ts->modheight;
 
-	for (count = ts->modheight_count; count != 0; count--, mod++) {
+	for (int count = ts->modheight_count; count != 0; count--, mod++) {
 		if (mod->tile == tile) return mod->height;
 	}
 
@@ -85,6 +84,7 @@
 	 *       But during house- or industry-construction multiple corners can be terraformed at once. */
 	TerraformerHeightMod *mod = ts->modheight;
 	int count = ts->modheight_count;
+
 	while ((count > 0) && (mod->tile != tile)) {
 		mod++;
 		count--;
@@ -110,12 +110,9 @@
  */
 static void TerraformAddDirtyTile(TerraformerState *ts, TileIndex tile)
 {
-	int count;
-	TileIndex *t;
+	int count = ts->tile_table_count;
 
-	count = ts->tile_table_count;
-
-	for (t = ts->tile_table; count != 0; count--, t++) {
+	for (TileIndex *t = ts->tile_table; count != 0; count--, t++) {
 		if (*t == tile) return;
 	}
 
@@ -149,8 +146,6 @@
  */
 static CommandCost TerraformTileHeight(TerraformerState *ts, TileIndex tile, int height)
 {
-	CommandCost total_cost(EXPENSES_CONSTRUCTION);
-
 	assert(tile < MapSize());
 
 	/* Check range of destination height */
@@ -184,6 +179,8 @@
 	/* Store the height modification */
 	TerraformSetHeightOfTile(ts, tile, height);
 
+	CommandCost total_cost(EXPENSES_CONSTRUCTION);
+
 	/* Increment cost */
 	total_cost.AddCost(_price.terraform);
 
@@ -228,17 +225,17 @@
  */
 CommandCost CmdTerraformLand(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	TerraformerState ts;
+	/* Make an extra check for map-bounds cause we add tiles to the originating tile */
+	if (tile + TileDiffXY(1, 1) >= MapSize()) return CMD_ERROR;
+
+	_terraform_err_tile = INVALID_TILE;
+
 	CommandCost total_cost(EXPENSES_CONSTRUCTION);
 	int direction = (p2 != 0 ? 1 : -1);
-
-	_terraform_err_tile = 0;
+	TerraformerState ts;
 
 	ts.modheight_count = ts.tile_table_count = 0;
 
-	/* Make an extra check for map-bounds cause we add tiles to the originating tile */
-	if (tile + TileDiffXY(1, 1) >= MapSize()) return CMD_ERROR;
-
 	/* Compute the costs and the terraforming result in a model of the landscape */
 	if ((p1 & SLOPE_W) != 0) {
 		TileIndex t = tile + TileDiffXY(1, 0);
@@ -270,10 +267,9 @@
 
 	/* Check if the terraforming is valid wrt. tunnels, bridges and objects on the surface */
 	{
-		int count;
 		TileIndex *ti = ts.tile_table;
 
-		for (count = ts.tile_table_count; count != 0; count--, ti++) {
+		for (int count = ts.tile_table_count; count != 0; count--, ti++) {
 			TileIndex tile = *ti;
 
 			/* Find new heights of tile corners */
@@ -287,11 +283,11 @@
 			uint z_max = max(max(z_N, z_W), max(z_S, z_E));
 
 			/* Compute tile slope */
-			uint tileh = (z_max > z_min + 1 ? SLOPE_STEEP : SLOPE_FLAT);
-			if (z_W > z_min) tileh += SLOPE_W;
-			if (z_S > z_min) tileh += SLOPE_S;
-			if (z_E > z_min) tileh += SLOPE_E;
-			if (z_N > z_min) tileh += SLOPE_N;
+			Slope tileh = (z_max > z_min + 1 ? SLOPE_STEEP : SLOPE_FLAT);
+			if (z_W > z_min) tileh |= SLOPE_W;
+			if (z_S > z_min) tileh |= SLOPE_S;
+			if (z_E > z_min) tileh |= SLOPE_E;
+			if (z_N > z_min) tileh |= SLOPE_N;
 
 			/* Check if bridge would take damage */
 			if (direction == 1 && MayHaveBridgeAbove(tile) && IsBridgeAbove(tile) &&
@@ -305,7 +301,7 @@
 				return_cmd_error(STR_1002_EXCAVATION_WOULD_DAMAGE);
 			}
 			/* Check tiletype-specific things, and add extra-cost */
-			CommandCost cost = _tile_type_procs[GetTileType(tile)]->terraform_tile_proc(tile, flags | DC_AUTO, z_min * TILE_HEIGHT, (Slope) tileh);
+			CommandCost cost = _tile_type_procs[GetTileType(tile)]->terraform_tile_proc(tile, flags | DC_AUTO, z_min * TILE_HEIGHT, tileh);
 			if (CmdFailed(cost)) {
 				_terraform_err_tile = tile;
 				return cost;
@@ -350,49 +346,41 @@
  */
 CommandCost CmdLevelLand(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	int size_x, size_y;
-	int ex;
-	int ey;
-	int sx, sy;
-	uint h, oldh, curh;
-	CommandCost money;
-	CommandCost ret;
-	CommandCost cost(EXPENSES_CONSTRUCTION);
-
 	if (p1 >= MapSize()) return CMD_ERROR;
 
 	/* remember level height */
-	oldh = TileHeight(p1);
+	uint oldh = TileHeight(p1);
 
 	/* compute new height */
-	h = oldh + p2;
+	uint h = oldh + p2;
 
 	/* Check range of destination height */
 	if (h > MAX_TILE_HEIGHT) return_cmd_error((oldh == 0) ? STR_1003_ALREADY_AT_SEA_LEVEL : STR_1004_TOO_HIGH);
 
 	/* make sure sx,sy are smaller than ex,ey */
-	ex = TileX(tile);
-	ey = TileY(tile);
-	sx = TileX(p1);
-	sy = TileY(p1);
+	int ex = TileX(tile);
+	int ey = TileY(tile);
+	int sx = TileX(p1);
+	int sy = TileY(p1);
 	if (ex < sx) Swap(ex, sx);
 	if (ey < sy) Swap(ey, sy);
 	tile = TileXY(sx, sy);
 
-	size_x = ex - sx + 1;
-	size_y = ey - sy + 1;
+	int size_x = ex - sx + 1;
+	int size_y = ey - sy + 1;
 
-	money.AddCost(GetAvailableMoneyForCommand());
+	Money money = GetAvailableMoneyForCommand();
+	CommandCost cost(EXPENSES_CONSTRUCTION);
 
 	BEGIN_TILE_LOOP(tile2, size_x, size_y, tile) {
-		curh = TileHeight(tile2);
+		uint curh = TileHeight(tile2);
 		while (curh != h) {
-			ret = DoCommand(tile2, SLOPE_N, (curh > h) ? 0 : 1, flags & ~DC_EXEC, CMD_TERRAFORM_LAND);
+			CommandCost ret = DoCommand(tile2, SLOPE_N, (curh > h) ? 0 : 1, flags & ~DC_EXEC, CMD_TERRAFORM_LAND);
 			if (CmdFailed(ret)) break;
 
 			if (flags & DC_EXEC) {
-				money.AddCost(-ret.GetCost());
-				if (money.GetCost() < 0) {
+				money -= ret.GetCost();
+				if (money < 0) {
 					_additional_cash_required = ret.GetCost();
 					return cost;
 				}
--- a/src/terraform_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/terraform_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -13,11 +13,11 @@
 #include "viewport_func.h"
 #include "gfx_func.h"
 #include "command_func.h"
-#include "signs.h"
+#include "signs_func.h"
 #include "variables.h"
 #include "functions.h"
 #include "sound_func.h"
-#include "station.h"
+#include "station_base.h"
 #include "unmovable_map.h"
 #include "textbuf_gui.h"
 #include "genworld.h"
--- a/src/textbuf_gui.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/textbuf_gui.h	Tue Apr 15 00:47:19 2008 +0000
@@ -7,6 +7,7 @@
 
 #include "window_type.h"
 #include "string_type.h"
+#include "strings_type.h"
 
 struct Textbuf {
 	char *buf;                  ///< buffer in which text is saved
@@ -26,6 +27,8 @@
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(querystr_d));
 
+extern char _edit_str_buf[64];
+extern char _orig_str_buf[lengthof(_edit_str_buf)];
 
 void DrawEditBox(Window *w, querystr_d *string, int wid);
 void HandleEditBox(Window *w, querystr_d *string, int wid);
@@ -43,4 +46,16 @@
 void ShowQueryString(StringID str, StringID caption, uint maxlen, uint maxwidth, Window *parent, CharSetFilter afilter);
 void ShowQuery(StringID caption, StringID message, Window *w, void (*callback)(Window*, bool));
 
+/** The number of 'characters' on the on-screen keyboard. */
+static const uint OSK_KEYBOARD_ENTRIES = 50;
+
+/**
+ * The number of characters has to be OSK_KEYBOARD_ENTRIES. However, these
+ * have to be UTF-8 encoded, which means up to 4 bytes per character.
+ * Furthermore the string needs to be '\0'-terminated.
+ */
+extern char _keyboard_opt[2][OSK_KEYBOARD_ENTRIES * 4 + 1];
+
+void ShowOnScreenKeyboard(Window *parent, querystr_d *q, int button, int cancel, int ok);
+
 #endif /* TEXTBUF_GUI_H */
--- a/src/texteff.hpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/texteff.hpp	Tue Apr 15 00:47:19 2008 +0000
@@ -3,6 +3,8 @@
 #ifndef TEXTEFF_HPP
 #define TEXTEFF_HPP
 
+#include "gfx_type.h"
+
 /**
  * Text effect modes.
  */
--- a/src/timetable_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/timetable_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -24,7 +24,7 @@
 		order->wait_time = time;
 	}
 
-	if (v->cur_order_index == order_number && HasBit(v->current_order.flags, OF_PART_OF_ORDERS)) {
+	if (v->cur_order_index == order_number && v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) {
 		if (is_journey) {
 			v->current_order.travel_time = time;
 		} else {
@@ -69,8 +69,8 @@
 	bool packed_time = HasBit(p1, 25);
 	bool is_journey = HasBit(p1, 24) || packed_time;
 	if (!is_journey) {
-		if (order->type != OT_GOTO_STATION) return_cmd_error(STR_TIMETABLE_ONLY_WAIT_AT_STATIONS);
-		if (_patches.new_nonstop && (order->flags & OFB_NON_STOP)) return_cmd_error(STR_TIMETABLE_NOT_STOPPING_HERE);
+		if (!order->IsType(OT_GOTO_STATION)) return_cmd_error(STR_TIMETABLE_ONLY_WAIT_AT_STATIONS);
+		if (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) return_cmd_error(STR_TIMETABLE_NOT_STOPPING_HERE);
 	}
 
 	if (flags & DC_EXEC) {
--- a/src/timetable_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/timetable_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -6,7 +6,6 @@
 #include "openttd.h"
 #include "variables.h"
 #include "command_func.h"
-#include "engine.h"
 #include "gui.h"
 #include "window_gui.h"
 #include "textbuf_gui.h"
@@ -21,6 +20,22 @@
 
 #include "table/strings.h"
 
+enum TimetableViewWindowWidgets {
+	TTV_WIDGET_CLOSEBOX = 0,
+	TTV_CAPTION,
+	TTV_ORDER_VIEW,
+	TTV_STICKY,
+	TTV_TIMETABLE_PANEL,
+	TTV_SCROLLBAR,
+	TTV_SUMMARY_PANEL,
+	TTV_CHANGE_TIME,
+	TTV_CLEAR_TIME,
+	TTV_RESET_LATENESS,
+	TTV_AUTOFILL,
+	TTV_EMPTY,
+	TTV_RESIZE,
+};
+
 static int GetOrderFromTimetableWndPt(Window *w, int y, const Vehicle *v)
 {
 	/*
@@ -57,29 +72,29 @@
 
 	if (v->owner == _local_player) {
 		if (selected == -1) {
-			w->DisableWidget(6);
-			w->DisableWidget(7);
+			w->DisableWidget(TTV_CHANGE_TIME);
+			w->DisableWidget(TTV_CLEAR_TIME);
 		} else if (selected % 2 == 1) {
-			w->EnableWidget(6);
-			w->EnableWidget(7);
+			w->EnableWidget(TTV_CHANGE_TIME);
+			w->EnableWidget(TTV_CLEAR_TIME);
 		} else {
 			const Order *order = GetVehicleOrder(v, (selected + 1) / 2);
-			bool disable = order == NULL || order->type != OT_GOTO_STATION || (_patches.new_nonstop && (order->flags & OFB_NON_STOP));
+			bool disable = order == NULL || !order->IsType(OT_GOTO_STATION) || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION);
 
-			w->SetWidgetDisabledState(6, disable);
-			w->SetWidgetDisabledState(7, disable);
+			w->SetWidgetDisabledState(TTV_CHANGE_TIME, disable);
+			w->SetWidgetDisabledState(TTV_CLEAR_TIME, disable);
 		}
 
-		w->EnableWidget(8);
-		w->EnableWidget(9);
+		w->EnableWidget(TTV_RESET_LATENESS);
+		w->EnableWidget(TTV_AUTOFILL);
 	} else {
-		w->DisableWidget(6);
-		w->DisableWidget(7);
-		w->DisableWidget(8);
-		w->DisableWidget(9);
+		w->DisableWidget(TTV_CHANGE_TIME);
+		w->DisableWidget(TTV_CLEAR_TIME);
+		w->DisableWidget(TTV_RESET_LATENESS);
+		w->DisableWidget(TTV_AUTOFILL);
 	}
 
-	w->SetWidgetLoweredState(9, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE));
+	w->SetWidgetLoweredState(TTV_AUTOFILL, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE));
 
 	SetDParam(0, v->index);
 	DrawWindowWidgets(w);
@@ -98,18 +113,22 @@
 		if (i % 2 == 0) {
 			SetDParam(2, STR_EMPTY);
 
-			switch (order->type) {
+			switch (order->GetType()) {
 				case OT_DUMMY:
 					SetDParam(0, STR_INVALID_ORDER);
 					break;
 
 				case OT_GOTO_STATION:
-					SetDParam(0, (order->flags & OFB_NON_STOP) ? STR_880A_GO_NON_STOP_TO : STR_8806_GO_TO);
-					SetDParam(1, order->dest);
+					SetDParam(0, STR_GO_TO_STATION);
+					SetDParam(1, STR_ORDER_GO_TO + order->GetNonStopType());
+					SetDParam(2, order->GetDestination());
+					SetDParam(3, STR_EMPTY);
 
 					if (order->wait_time > 0) {
-						SetDParam(2, STR_TIMETABLE_STAY_FOR);
-						SetTimetableParams(3, 4, order->wait_time);
+						SetDParam(4, STR_TIMETABLE_STAY_FOR);
+						SetTimetableParams(5, 6, order->wait_time);
+					} else {
+						SetDParam(4, STR_EMPTY);
 					}
 
 					break;
@@ -119,26 +138,26 @@
 
 					if (v->type == VEH_AIRCRAFT) {
 						string = STR_GO_TO_AIRPORT_HANGAR;
-						SetDParam(1, order->dest);
+						SetDParam(1, order->GetDestination());
 					} else {
-						SetDParam(1, GetDepot(order->dest)->town_index);
+						SetDParam(1, GetDepot(order->GetDestination())->town_index);
 
 						switch (v->type) {
-							case VEH_TRAIN: string = (order->flags & OFB_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
+							case VEH_TRAIN: string = (order->GetNonStopType() != ONSF_STOP_EVERYWHERE) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
 							case VEH_ROAD:  string = STR_GO_TO_ROADVEH_DEPOT; break;
 							case VEH_SHIP:  string = STR_GO_TO_SHIP_DEPOT; break;
 							default: break;
 						}
 					}
 
-					if (order->flags & OFB_FULL_LOAD) string++; // Service at orders
+					if (order->GetDepotOrderType() & ODTFB_SERVICE) string++; /* service at */
 
 					SetDParam(0, string);
 				} break;
 
 				case OT_GOTO_WAYPOINT:
-					SetDParam(0, (order->flags & OFB_NON_STOP) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
-					SetDParam(1, order->dest);
+					SetDParam(0, (order->GetNonStopType() != ONSF_STOP_EVERYWHERE) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
+					SetDParam(1, order->GetDestination());
 					break;
 
 				default: break;
@@ -173,7 +192,7 @@
 		y += 10;
 	}
 
-	y = w->widget[5].top + 1;
+	y = w->widget[TTV_SUMMARY_PANEL].top + 1;
 
 	{
 		uint total_time = 0;
@@ -182,7 +201,7 @@
 		for (const Order *order = GetVehicleOrder(v, 0); order != NULL; order = order->next) {
 			total_time += order->travel_time + order->wait_time;
 			if (order->travel_time == 0) complete = false;
-			if (order->wait_time == 0 && order->type == OT_GOTO_STATION && !(_patches.new_nonstop && (order->flags & OFB_NON_STOP))) complete = false;
+			if (order->wait_time == 0 && order->IsType(OT_GOTO_STATION) && !(order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) complete = false;
 		}
 
 		if (total_time != 0) {
@@ -221,7 +240,11 @@
 			const Vehicle *v = GetVehicle(w->window_number);
 
 			switch (we->we.click.widget) {
-				case 3: { /* Main panel. */
+				case TTV_ORDER_VIEW: /* Order view button */
+					ShowOrdersWindow(v);
+					break;
+
+				case TTV_TIMETABLE_PANEL: { /* Main panel. */
 					int selected = GetOrderFromTimetableWndPt(w, we->we.click.pt.y, v);
 
 					if (selected == INVALID_ORDER || selected == WP(w, order_d).sel) {
@@ -233,7 +256,7 @@
 					}
 				} break;
 
-				case 6: { /* "Wait For" button. */
+				case TTV_CHANGE_TIME: { /* "Wait For" button. */
 					int selected = WP(w, order_d).sel;
 					VehicleOrderID real = (selected + 1) / 2;
 
@@ -255,16 +278,16 @@
 					ShowQueryString(current, STR_TIMETABLE_CHANGE_TIME, 31, 150, w, CS_NUMERAL);
 				} break;
 
-				case 7: { /* Clear waiting time button. */
+				case TTV_CLEAR_TIME: { /* Clear waiting time button. */
 					uint32 p1 = PackTimetableArgs(v, WP(w, order_d).sel);
 					DoCommandP(0, p1, 0, NULL, CMD_CHANGE_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
 				} break;
 
-				case 8: /* Reset the vehicle's late counter. */
+				case TTV_RESET_LATENESS: /* Reset the vehicle's late counter. */
 					DoCommandP(0, v->index, 0, NULL, CMD_SET_VEHICLE_ON_TIME | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
 					break;
 
-				case 9: /* Autofill the timetable. */
+				case TTV_AUTOFILL: /* Autofill the timetable. */
 					DoCommandP(0, v->index, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE) ? 0 : 1, NULL, CMD_AUTOFILL_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
 					break;
 			}
@@ -287,29 +310,30 @@
 
 		case WE_RESIZE:
 			/* Update the scroll + matrix */
-			w->vscroll.cap = (w->widget[3].bottom - w->widget[3].top) / 10;
+			w->vscroll.cap = (w->widget[TTV_TIMETABLE_PANEL].bottom - w->widget[TTV_TIMETABLE_PANEL].top) / 10;
 			break;
 
 	}
 }
 
 static const Widget _timetable_widgets[] = {
-	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},
-	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   387,     0,    13, STR_TIMETABLE_TITLE,        STR_018C_WINDOW_TITLE_DRAG_THIS},
-	{  WWT_STICKYBOX,   RESIZE_LR,      14,   388,   399,     0,    13, STR_NULL,                   STR_STICKY_BUTTON},
-
-	{      WWT_PANEL,   RESIZE_RB,      14,     0,   387,    14,    95, STR_NULL,                   STR_TIMETABLE_TOOLTIP},
-	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   388,   399,    14,    95, STR_NULL,                   STR_0190_SCROLL_BAR_SCROLLS_LIST},
+	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},                // TTV_WIDGET_CLOSEBOX
+	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   326,     0,    13, STR_TIMETABLE_TITLE,        STR_018C_WINDOW_TITLE_DRAG_THIS},      // TTV_CAPTION
+	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   327,   387,     0,    13, STR_ORDER_VIEW,             STR_ORDER_VIEW_TOOLTIP},               // TTV_ORDER_VIEW
+	{  WWT_STICKYBOX,   RESIZE_LR,      14,   388,   399,     0,    13, STR_NULL,                   STR_STICKY_BUTTON},                    // TTV_STICKY
 
-	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   399,    96,   117, STR_NULL,                   STR_NULL},
+	{      WWT_PANEL,   RESIZE_RB,      14,     0,   387,    14,    95, STR_NULL,                   STR_TIMETABLE_TOOLTIP},                // TTV_TIMETABLE_PANEL
+	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   388,   399,    14,    95, STR_NULL,                   STR_0190_SCROLL_BAR_SCROLLS_LIST},     // TTV_SCROLLBAR
 
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   109,   118,   129, STR_TIMETABLE_CHANGE_TIME,  STR_TIMETABLE_WAIT_TIME_TOOLTIP},
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   110,   219,   118,   129, STR_CLEAR_TIME,             STR_TIMETABLE_CLEAR_TIME_TOOLTIP},
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   220,   337,   118,   129, STR_RESET_LATENESS,         STR_TIMETABLE_RESET_LATENESS_TOOLTIP},
-	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   338,   387,   118,   129, STR_TIMETABLE_AUTOFILL,     STR_TIMETABLE_AUTOFILL_TOOLTIP},
+	{      WWT_PANEL,   RESIZE_RTB,     14,     0,   399,    96,   117, STR_NULL,                   STR_NULL},                             // TTV_SUMMARY_PANEL
 
-	{      WWT_PANEL,   RESIZE_RTB,     14,   388,   387,   118,   129, STR_NULL,                   STR_NULL},
-	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   388,   399,   118,   129, STR_NULL,                   STR_RESIZE_BUTTON},
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,   109,   118,   129, STR_TIMETABLE_CHANGE_TIME,  STR_TIMETABLE_WAIT_TIME_TOOLTIP},      // TTV_CHANGE_TIME
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   110,   219,   118,   129, STR_CLEAR_TIME,             STR_TIMETABLE_CLEAR_TIME_TOOLTIP},     // TTV_CLEAR_TIME
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   220,   337,   118,   129, STR_RESET_LATENESS,         STR_TIMETABLE_RESET_LATENESS_TOOLTIP}, // TTV_RESET_LATENESS
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   338,   387,   118,   129, STR_TIMETABLE_AUTOFILL,     STR_TIMETABLE_AUTOFILL_TOOLTIP},       // TTV_AUTOFILL
+
+	{      WWT_PANEL,   RESIZE_RTB,     14,   388,   387,   118,   129, STR_NULL,                   STR_NULL},                             // TTV_EMPTY
+	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   388,   399,   118,   129, STR_NULL,                   STR_RESIZE_BUTTON},                    // TTV_RESIZE
 
 	{    WIDGETS_END }
 };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/toolbar_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,799 @@
+/* $Id$ */
+
+/** @file toolbar_gui.cpp Code related to the (main) toolbar. */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "gui.h"
+#include "window_gui.h"
+#include "window_func.h"
+#include "viewport_func.h"
+#include "command_func.h"
+#include "variables.h"
+#include "train.h"
+#include "roadveh.h"
+#include "vehicle_gui.h"
+#include "rail_gui.h"
+#include "road_gui.h"
+#include "date_func.h"
+#include "vehicle_func.h"
+#include "sound_func.h"
+#include "terraform_gui.h"
+#include "transparency.h"
+#include "strings_func.h"
+#include "player_base.h"
+#include "player_func.h"
+#include "player_gui.h"
+#include "settings_type.h"
+#include "toolbar_gui.h"
+#include "vehicle_base.h"
+#include "gfx_func.h"
+
+#include "network/network.h"
+
+#include "table/strings.h"
+#include "table/sprites.h"
+
+extern void SelectSignTool();
+extern RailType _last_built_railtype;
+extern RoadType _last_built_roadtype;
+
+/* Returns the position where the toolbar wants the menu to appear.
+ * Make sure the dropdown is fully visible within the window.
+ * x + w->left because x is supposed to be the offset of the toolbar-button
+ * we clicked on and w->left the toolbar window itself. So meaning that
+ * the default position is aligned with the left side of the clicked button */
+Point GetToolbarDropdownPos(uint16 parent_button, int width, int height)
+{
+	const Window *w = FindWindowById(WC_MAIN_TOOLBAR,0);
+	Point pos;
+	pos.x = w->widget[GB(parent_button, 0, 8)].left;
+	pos.x = w->left + Clamp(pos.x, 0, w->width - width);
+	pos.y = w->height;
+
+	return pos;
+}
+
+
+static void ToolbarPauseClick(Window *w)
+{
+	if (_networking && !_network_server) return; // only server can pause the game
+
+	if (DoCommandP(0, _pause_game ? 0 : 1, 0, NULL, CMD_PAUSE)) SndPlayFx(SND_15_BEEP);
+}
+
+static void ToolbarFastForwardClick(Window *w)
+{
+	_fast_forward ^= true;
+	SndPlayFx(SND_15_BEEP);
+}
+
+static void ToolbarSaveClick(Window *w)
+{
+	PopupMainToolbMenu(w, 3, STR_015C_SAVE_GAME, 4, 0);
+}
+
+static void ToolbarMapClick(Window *w)
+{
+	PopupMainToolbMenu(w, 4, STR_02DE_MAP_OF_WORLD, 3, 0);
+}
+
+static void ToolbarTownClick(Window *w)
+{
+	PopupMainToolbMenu(w, 5, STR_02BB_TOWN_DIRECTORY, 1, 0);
+}
+
+static void ToolbarSubsidiesClick(Window *w)
+{
+	PopupMainToolbMenu(w, 6, STR_02DD_SUBSIDIES, 1, 0);
+}
+
+static void ToolbarStationsClick(Window *w)
+{
+	PopupMainPlayerToolbMenu(w, 7, 0);
+}
+
+static void ToolbarMoneyClick(Window *w)
+{
+	PopupMainPlayerToolbMenu(w, 8, 0);
+}
+
+static void ToolbarPlayersClick(Window *w)
+{
+	PopupMainPlayerToolbMenu(w, 9, 0);
+}
+
+static void ToolbarGraphsClick(Window *w)
+{
+	PopupMainToolbMenu(w, 10, STR_0154_OPERATING_PROFIT_GRAPH, 6, 0);
+}
+
+static void ToolbarLeagueClick(Window *w)
+{
+	PopupMainToolbMenu(w, 11, STR_015A_COMPANY_LEAGUE_TABLE, 2, 0);
+}
+
+static void ToolbarIndustryClick(Window *w)
+{
+	/* Disable build-industry menu if we are a spectator */
+	PopupMainToolbMenu(w, 12, STR_INDUSTRY_DIR, 2, (_current_player == PLAYER_SPECTATOR) ? (1 << 1) : 0);
+}
+
+static void ToolbarTrainClick(Window *w)
+{
+	const Vehicle *v;
+	int dis = -1;
+
+	FOR_ALL_VEHICLES(v) {
+		if (v->type == VEH_TRAIN && IsFrontEngine(v)) ClrBit(dis, v->owner);
+	}
+	PopupMainPlayerToolbMenu(w, 13, dis);
+}
+
+static void ToolbarRoadClick(Window *w)
+{
+	const Vehicle *v;
+	int dis = -1;
+
+	FOR_ALL_VEHICLES(v) {
+		if (v->type == VEH_ROAD && IsRoadVehFront(v)) ClrBit(dis, v->owner);
+	}
+	PopupMainPlayerToolbMenu(w, 14, dis);
+}
+
+static void ToolbarShipClick(Window *w)
+{
+	const Vehicle *v;
+	int dis = -1;
+
+	FOR_ALL_VEHICLES(v) {
+		if (v->type == VEH_SHIP) ClrBit(dis, v->owner);
+	}
+	PopupMainPlayerToolbMenu(w, 15, dis);
+}
+
+static void ToolbarAirClick(Window *w)
+{
+	const Vehicle *v;
+	int dis = -1;
+
+	FOR_ALL_VEHICLES(v) {
+		if (v->type == VEH_AIRCRAFT) ClrBit(dis, v->owner);
+	}
+	PopupMainPlayerToolbMenu(w, 16, dis);
+}
+
+
+static void ToolbarZoomInClick(Window *w)
+{
+	if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
+		w->HandleButtonClick(17);
+		SndPlayFx(SND_15_BEEP);
+	}
+}
+
+static void ToolbarZoomOutClick(Window *w)
+{
+	if (DoZoomInOutWindow(ZOOM_OUT,FindWindowById(WC_MAIN_WINDOW, 0))) {
+		w->HandleButtonClick(18);
+		SndPlayFx(SND_15_BEEP);
+	}
+}
+
+static void ToolbarBuildRailClick(Window *w)
+{
+	const Player *p = GetPlayer(_local_player);
+	Window *w2 = PopupMainToolbMenu(w, 19, STR_1015_RAILROAD_CONSTRUCTION, RAILTYPE_END, ~p->avail_railtypes);
+	WP(w2, menu_d).sel_index = _last_built_railtype;
+}
+
+static void ToolbarBuildRoadClick(Window *w)
+{
+	const Player *p = GetPlayer(_local_player);
+	/* The standard road button is *always* available */
+	Window *w2 = PopupMainToolbMenu(w, 20, STR_180A_ROAD_CONSTRUCTION, 2, ~(p->avail_roadtypes | ROADTYPES_ROAD));
+	WP(w2, menu_d).sel_index = _last_built_roadtype;
+}
+
+static void ToolbarBuildWaterClick(Window *w)
+{
+	PopupMainToolbMenu(w, 21, STR_9800_DOCK_CONSTRUCTION, 1, 0);
+}
+
+static void ToolbarBuildAirClick(Window *w)
+{
+	PopupMainToolbMenu(w, 22, STR_A01D_AIRPORT_CONSTRUCTION, 1, 0);
+}
+
+static void ToolbarForestClick(Window *w)
+{
+	PopupMainToolbMenu(w, 23, STR_LANDSCAPING, 3, 0);
+}
+
+static void ToolbarMusicClick(Window *w)
+{
+	PopupMainToolbMenu(w, 24, STR_01D3_SOUND_MUSIC, 1, 0);
+}
+
+static void ToolbarNewspaperClick(Window *w)
+{
+	PopupMainToolbMenu(w, 25, STR_0200_LAST_MESSAGE_NEWS_REPORT, 3, 0);
+}
+
+static void ToolbarHelpClick(Window *w)
+{
+	PopupMainToolbMenu(w, 26, STR_02D5_LAND_BLOCK_INFO, 6, 0);
+}
+
+static void ToolbarOptionsClick(Window *w)
+{
+	uint16 x = 0;
+
+	w = PopupMainToolbMenu(w, 2, STR_02C4_GAME_OPTIONS, 14, 0);
+
+	if (HasBit(_display_opt, DO_SHOW_TOWN_NAMES))    SetBit(x,  6);
+	if (HasBit(_display_opt, DO_SHOW_STATION_NAMES)) SetBit(x,  7);
+	if (HasBit(_display_opt, DO_SHOW_SIGNS))         SetBit(x,  8);
+	if (HasBit(_display_opt, DO_WAYPOINTS))          SetBit(x,  9);
+	if (HasBit(_display_opt, DO_FULL_ANIMATION))     SetBit(x, 10);
+	if (HasBit(_display_opt, DO_FULL_DETAIL))        SetBit(x, 11);
+	if (IsTransparencySet(TO_HOUSES))                SetBit(x, 12);
+	if (IsTransparencySet(TO_SIGNS))                 SetBit(x, 13);
+	WP(w, menu_d).checked_items = x;
+}
+
+
+static void ToolbarScenSaveOrLoad(Window *w)
+{
+	PopupMainToolbMenu(w, 3, STR_0292_SAVE_SCENARIO, 6, 0);
+}
+
+static void ToolbarScenDateBackward(Window *w)
+{
+	/* don't allow too fast scrolling */
+	if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
+		w->HandleButtonClick(6);
+		SetWindowDirty(w);
+
+		_patches_newgame.starting_year = Clamp(_patches_newgame.starting_year - 1, MIN_YEAR, MAX_YEAR);
+		SetDate(ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
+	}
+	_left_button_clicked = false;
+}
+
+static void ToolbarScenDateForward(Window *w)
+{
+	/* don't allow too fast scrolling */
+	if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
+		w->HandleButtonClick(7);
+		SetWindowDirty(w);
+
+		_patches_newgame.starting_year = Clamp(_patches_newgame.starting_year + 1, MIN_YEAR, MAX_YEAR);
+		SetDate(ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
+	}
+	_left_button_clicked = false;
+}
+
+static void ToolbarScenMapTownDir(Window *w)
+{
+	/* Scenario editor button, *hack*hack* use different button to activate */
+	PopupMainToolbMenu(w, 8 | (17 << 8), STR_02DE_MAP_OF_WORLD, 4, 0);
+}
+
+static void ToolbarScenZoomIn(Window *w)
+{
+	if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
+		w->HandleButtonClick(9);
+		SndPlayFx(SND_15_BEEP);
+	}
+}
+
+static void ToolbarScenZoomOut(Window *w)
+{
+	if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) {
+		w->HandleButtonClick(10);
+		SndPlayFx(SND_15_BEEP);
+	}
+}
+
+static void ToolbarScenGenLand(Window *w)
+{
+	w->HandleButtonClick(11);
+	SndPlayFx(SND_15_BEEP);
+
+	ShowEditorTerraformToolbar();
+}
+
+
+static void ToolbarScenGenTown(Window *w)
+{
+	w->HandleButtonClick(12);
+	SndPlayFx(SND_15_BEEP);
+	ShowBuildTownWindow();
+}
+
+static void ToolbarScenGenIndustry(Window *w)
+{
+	w->HandleButtonClick(13);
+	SndPlayFx(SND_15_BEEP);
+	ShowBuildIndustryWindow();
+}
+
+static void ToolbarScenBuildRoad(Window *w)
+{
+	w->HandleButtonClick(14);
+	SndPlayFx(SND_15_BEEP);
+	ShowBuildRoadScenToolbar();
+}
+
+static void ToolbarScenPlantTrees(Window *w)
+{
+	w->HandleButtonClick(15);
+	SndPlayFx(SND_15_BEEP);
+	ShowBuildTreesScenToolbar();
+}
+
+static void ToolbarScenPlaceSign(Window *w)
+{
+	w->HandleButtonClick(16);
+	SndPlayFx(SND_15_BEEP);
+	SelectSignTool();
+}
+
+static void ToolbarBtn_NULL(Window *w)
+{
+}
+
+
+typedef void ToolbarButtonProc(Window *w);
+
+static ToolbarButtonProc * const _toolbar_button_procs[] = {
+	ToolbarPauseClick,
+	ToolbarFastForwardClick,
+	ToolbarOptionsClick,
+	ToolbarSaveClick,
+	ToolbarMapClick,
+	ToolbarTownClick,
+	ToolbarSubsidiesClick,
+	ToolbarStationsClick,
+	ToolbarMoneyClick,
+	ToolbarPlayersClick,
+	ToolbarGraphsClick,
+	ToolbarLeagueClick,
+	ToolbarIndustryClick,
+	ToolbarTrainClick,
+	ToolbarRoadClick,
+	ToolbarShipClick,
+	ToolbarAirClick,
+	ToolbarZoomInClick,
+	ToolbarZoomOutClick,
+	ToolbarBuildRailClick,
+	ToolbarBuildRoadClick,
+	ToolbarBuildWaterClick,
+	ToolbarBuildAirClick,
+	ToolbarForestClick,
+	ToolbarMusicClick,
+	ToolbarNewspaperClick,
+	ToolbarHelpClick,
+};
+
+extern void MenuClickSmallScreenshot();
+extern void MenuClickWorldScreenshot();
+extern void MenuClickSaveLoad(int index);
+
+void MainToolbarWndProc(Window *w, WindowEvent *e)
+{
+	switch (e->event) {
+		case WE_PAINT:
+			/* Draw brown-red toolbar bg. */
+			GfxFillRect(0, 0, w->width-1, w->height-1, 0xB2);
+			GfxFillRect(0, 0, w->width-1, w->height-1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
+
+			/* If spectator, disable all construction buttons
+			* ie : Build road, rail, ships, airports and landscaping
+			* Since enabled state is the default, just disable when needed */
+			w->SetWidgetsDisabledState(_current_player == PLAYER_SPECTATOR, 19, 20, 21, 22, 23, WIDGET_LIST_END);
+			/* disable company list drop downs, if there are no companies */
+			w->SetWidgetsDisabledState(ActivePlayerCount() == 0, 7, 8, 13, 14, 15, 16, WIDGET_LIST_END);
+
+			w->SetWidgetDisabledState(19, !CanBuildVehicleInfrastructure(VEH_TRAIN));
+			w->SetWidgetDisabledState(22, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
+
+			DrawWindowWidgets(w);
+			break;
+
+		case WE_CLICK:
+			if (_game_mode != GM_MENU && !w->IsWidgetDisabled(e->we.click.widget))
+				_toolbar_button_procs[e->we.click.widget](w);
+			break;
+
+		case WE_KEYPRESS:
+			switch (e->we.keypress.keycode) {
+				case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break;
+				case WKC_F2: ShowGameOptions(); break;
+				case WKC_F3: MenuClickSaveLoad(0); break;
+				case WKC_F4: ShowSmallMap(); break;
+				case WKC_F5: ShowTownDirectory(); break;
+				case WKC_F6: ShowSubsidiesList(); break;
+				case WKC_F7: ShowPlayerStations(_local_player); break;
+				case WKC_F8: ShowPlayerFinances(_local_player); break;
+				case WKC_F9: ShowPlayerCompany(_local_player); break;
+				case WKC_F10: ShowOperatingProfitGraph(); break;
+				case WKC_F11: ShowCompanyLeagueTable(); break;
+				case WKC_F12: ShowBuildIndustryWindow(); break;
+				case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_player, VEH_TRAIN); break;
+				case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_player, VEH_ROAD); break;
+				case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_player, VEH_SHIP); break;
+				case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_player, VEH_AIRCRAFT); break;
+				case WKC_NUM_PLUS: // Fall through
+				case WKC_EQUALS: // Fall through
+				case WKC_SHIFT | WKC_EQUALS: // Fall through
+				case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
+				case WKC_NUM_MINUS: // Fall through
+				case WKC_MINUS: // Fall through
+				case WKC_SHIFT | WKC_MINUS: // Fall through
+				case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
+				case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break;
+				case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break;
+				case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break;
+				case WKC_SHIFT | WKC_F10: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break;
+				case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break;
+				case WKC_SHIFT | WKC_F12: ShowMusicWindow(); break;
+				case WKC_CTRL  | 'S': MenuClickSmallScreenshot(); break;
+				case WKC_CTRL  | 'G': MenuClickWorldScreenshot(); break;
+				case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break;
+				case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; // Invoke Autorail
+				case 'L': ShowTerraformToolbar(); break;
+				case 'M': ShowSmallMap(); break;
+				case 'V': ShowExtraViewPortWindow(); break;
+				default: return;
+			}
+			e->we.keypress.cont = false;
+			break;
+
+		case WE_PLACE_OBJ:
+			_place_proc(e->we.place.tile);
+			break;
+
+		case WE_ABORT_PLACE_OBJ:
+			w->RaiseWidget(25);
+			SetWindowDirty(w);
+			break;
+
+		case WE_MOUSELOOP:
+			if (w->IsWidgetLowered(0) != !!_pause_game) {
+				w->ToggleWidgetLoweredState(0);
+				w->InvalidateWidget(0);
+			}
+
+			if (w->IsWidgetLowered(1) != !!_fast_forward) {
+				w->ToggleWidgetLoweredState(1);
+				w->InvalidateWidget(1);
+			}
+			break;
+
+		case WE_RESIZE: {
+			/* There are 27 buttons plus some spacings if the space allows it */
+			uint button_width;
+			uint spacing;
+			if (w->width >= 27 * 22) {
+				button_width = 22;
+				spacing = w->width - (27 * button_width);
+			} else {
+				button_width = w->width / 27;
+				spacing = 0;
+			}
+			uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
+
+			for (uint i = 0, x = 0, j = 0; i < 27; i++) {
+				if (extra_spacing_at[j] == i) {
+					j++;
+					uint add = spacing / (lengthof(extra_spacing_at) - j);
+					spacing -= add;
+					x += add;
+				}
+
+				w->widget[i].left = x;
+				x += (spacing != 0) ? button_width : (w->width - x) / (27 - i);
+				w->widget[i].right = x - 1;
+			}
+		} break;
+
+		case WE_TIMEOUT:
+			for (uint i = 2; i < w->widget_count; i++) {
+				if (w->IsWidgetLowered(i)) {
+					w->RaiseWidget(i);
+					w->InvalidateWidget(i);
+				}
+			}
+			break;
+
+		case WE_MESSAGE:
+			if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 17, 18);
+			break;
+	}
+}
+
+static const Widget _toolb_normal_widgets[] = {
+{     WWT_IMGBTN,   RESIZE_LEFT,    14,     0,     0,     0,    21, SPR_IMG_PAUSE,           STR_0171_PAUSE_GAME},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_FASTFORWARD,     STR_FAST_FORWARD},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SETTINGS,        STR_0187_OPTIONS},
+{   WWT_IMGBTN_2,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SAVE,            STR_0172_SAVE_GAME_ABANDON_GAME},
+
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SMALLMAP,        STR_0174_DISPLAY_MAP},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_TOWN,            STR_0176_DISPLAY_TOWN_DIRECTORY},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SUBSIDIES,       STR_02DC_DISPLAY_SUBSIDIES},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_COMPANY_LIST,    STR_0173_DISPLAY_LIST_OF_COMPANY},
+
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_COMPANY_FINANCE, STR_0177_DISPLAY_COMPANY_FINANCES},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_COMPANY_GENERAL, STR_0178_DISPLAY_COMPANY_GENERAL},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_GRAPHS,          STR_0179_DISPLAY_GRAPHS},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_COMPANY_LEAGUE,  STR_017A_DISPLAY_COMPANY_LEAGUE},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_INDUSTRY,        STR_0312_FUND_CONSTRUCTION_OF_NEW},
+
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_TRAINLIST,       STR_017B_DISPLAY_LIST_OF_COMPANY},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_TRUCKLIST,       STR_017C_DISPLAY_LIST_OF_COMPANY},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_SHIPLIST,        STR_017D_DISPLAY_LIST_OF_COMPANY},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_AIRPLANESLIST,   STR_017E_DISPLAY_LIST_OF_COMPANY},
+
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_ZOOMIN,          STR_017F_ZOOM_THE_VIEW_IN},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_ZOOMOUT,         STR_0180_ZOOM_THE_VIEW_OUT},
+
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_BUILDRAIL,       STR_0181_BUILD_RAILROAD_TRACK},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_BUILDROAD,       STR_0182_BUILD_ROADS},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_BUILDWATER,      STR_0183_BUILD_SHIP_DOCKS},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_BUILDAIR,        STR_0184_BUILD_AIRPORTS},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_LANDSCAPING,     STR_LANDSCAPING_TOOLBAR_TIP}, // tree icon is 0x2E6
+
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_MUSIC,           STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_MESSAGES,        STR_0203_SHOW_LAST_MESSAGE_NEWS},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_QUERY,           STR_0186_LAND_BLOCK_INFORMATION},
+{   WIDGETS_END},
+};
+
+static const WindowDesc _toolb_normal_desc = {
+	0, 0, 0, 22, 640, 22,
+	WC_MAIN_TOOLBAR, WC_NONE,
+	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET,
+	_toolb_normal_widgets,
+	MainToolbarWndProc
+};
+
+
+static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
+	ToolbarPauseClick,
+	ToolbarFastForwardClick,
+	ToolbarOptionsClick,
+	ToolbarScenSaveOrLoad,
+	ToolbarBtn_NULL,
+	ToolbarBtn_NULL,
+	ToolbarScenDateBackward,
+	ToolbarScenDateForward,
+	ToolbarScenMapTownDir,
+	ToolbarScenZoomIn,
+	ToolbarScenZoomOut,
+	ToolbarScenGenLand,
+	ToolbarScenGenTown,
+	ToolbarScenGenIndustry,
+	ToolbarScenBuildRoad,
+	ToolbarScenPlantTrees,
+	ToolbarScenPlaceSign,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	ToolbarMusicClick,
+	NULL,
+	ToolbarHelpClick,
+};
+
+void ScenEditToolbarWndProc(Window *w, WindowEvent *e)
+{
+	switch (e->event) {
+		case WE_PAINT:
+			w->SetWidgetDisabledState(6, _patches_newgame.starting_year <= MIN_YEAR);
+			w->SetWidgetDisabledState(7, _patches_newgame.starting_year >= MAX_YEAR);
+
+			/* Draw brown-red toolbar bg. */
+			GfxFillRect(0, 0, w->width-1, w->height-1, 0xB2);
+			GfxFillRect(0, 0, w->width-1, w->height-1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
+
+			DrawWindowWidgets(w);
+
+			SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
+			DrawStringCenteredTruncated(w->widget[6].right, w->widget[7].left, 6, STR_00AF, TC_FROMSTRING);
+
+			/* We hide this panel when the toolbar space gets too small */
+			if (w->widget[4].left != w->widget[4].right) {
+				DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1,  1, STR_0221_OPENTTD, TC_FROMSTRING);
+				DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 11, STR_0222_SCENARIO_EDITOR, TC_FROMSTRING);
+			}
+
+			break;
+
+		case WE_CLICK:
+			if (_game_mode == GM_MENU) return;
+			_scen_toolbar_button_procs[e->we.click.widget](w);
+			break;
+
+		case WE_KEYPRESS:
+			switch (e->we.keypress.keycode) {
+				case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break;
+				case WKC_F2: ShowGameOptions(); break;
+				case WKC_F3: MenuClickSaveLoad(0); break;
+				case WKC_F4: ToolbarScenGenLand(w); break;
+				case WKC_F5: ToolbarScenGenTown(w); break;
+				case WKC_F6: ToolbarScenGenIndustry(w); break;
+				case WKC_F7: ToolbarScenBuildRoad(w); break;
+				case WKC_F8: ToolbarScenPlantTrees(w); break;
+				case WKC_F9: ToolbarScenPlaceSign(w); break;
+				case WKC_F10: ShowMusicWindow(); break;
+				case WKC_F11: PlaceLandBlockInfo(); break;
+				case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break;
+				case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break;
+
+				/* those following are all fall through */
+				case WKC_NUM_PLUS:
+				case WKC_EQUALS:
+				case WKC_SHIFT | WKC_EQUALS:
+				case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
+
+				/* those following are all fall through */
+				case WKC_NUM_MINUS:
+				case WKC_MINUS:
+				case WKC_SHIFT | WKC_MINUS:
+				case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
+
+				case 'L': ShowEditorTerraformToolbar(); break;
+				case 'M': ShowSmallMap(); break;
+				case 'V': ShowExtraViewPortWindow(); break;
+				default: return;
+			}
+			e->we.keypress.cont = false;
+			break;
+
+		case WE_PLACE_OBJ:
+			_place_proc(e->we.place.tile);
+			break;
+
+		case WE_ABORT_PLACE_OBJ:
+			w->RaiseWidget(25);
+			SetWindowDirty(w);
+			break;
+
+		case WE_RESIZE: {
+			/* There are 15 buttons plus some spacings if the space allows it.
+			* Furthermore there are two panels of which one is non-essential
+			* and that one can be removed is the space is too small. */
+			uint buttons_width;
+			uint spacing;
+
+			static int normal_min_width = (15 * 22) + (2 * 130);
+			static int one_less_panel_min_width = (15 * 22) + 130;
+
+			if (w->width >= one_less_panel_min_width) {
+				buttons_width = 15 * 22;
+				spacing = w->width - ((w->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width);
+			} else {
+				buttons_width = w->width - 130;
+				spacing = 0;
+			}
+			uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 16, 0 };
+
+			/* Yes, it defines about 27 widgets for this toolbar */
+			for (uint i = 0, x = 0, j = 0, b = 0; i < 27; i++) {
+				switch (i) {
+					case 4:
+						w->widget[i].left = x;
+						if (w->width < normal_min_width) {
+							w->widget[i].right = x;
+							j++;
+							continue;
+						}
+
+						x += 130;
+						w->widget[i].right = x - 1;
+						break;
+
+					case 5: {
+						int offset = x - w->widget[i].left;
+						w->widget[i + 1].left  += offset;
+						w->widget[i + 1].right += offset;
+						w->widget[i + 2].left  += offset;
+						w->widget[i + 2].right += offset;
+						w->widget[i].left = x;
+						x += 130;
+						w->widget[i].right = x - 1;
+						i += 2;
+					} break;
+
+					default:
+						if (w->widget[i].bottom == 0) continue;
+
+						w->widget[i].left = x;
+						x += buttons_width / (15 - b);
+						w->widget[i].right = x - 1;
+						buttons_width -= buttons_width / (15 - b);
+						b++;
+						break;
+				}
+
+				if (extra_spacing_at[j] == i) {
+					j++;
+					uint add = spacing / (lengthof(extra_spacing_at) - j);
+					spacing -= add;
+					x += add;
+				}
+			}
+		} break;
+
+		case WE_MOUSELOOP:
+			if (w->IsWidgetLowered(0) != !!_pause_game) {
+				w->ToggleWidgetLoweredState(0);
+				SetWindowDirty(w);
+			}
+
+			if (w->IsWidgetLowered(1) != !!_fast_forward) {
+				w->ToggleWidgetLoweredState(1);
+				SetWindowDirty(w);
+			}
+			break;
+
+		case WE_MESSAGE:
+			HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 9, 10);
+			break;
+	}
+}
+
+static const Widget _toolb_scen_widgets[] = {
+{  WWT_IMGBTN, RESIZE_LEFT, 14,   0,   0,  0, 21, SPR_IMG_PAUSE,       STR_0171_PAUSE_GAME},
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_SETTINGS,    STR_0187_OPTIONS},
+{WWT_IMGBTN_2, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_SAVE,        STR_0297_SAVE_SCENARIO_LOAD_SCENARIO},
+
+{   WWT_PANEL, RESIZE_NONE, 14,   0,   0,  0, 21, 0x0,                 STR_NULL},
+
+{   WWT_PANEL, RESIZE_NONE, 14,   0, 129,  0, 21, 0x0,                 STR_NULL},
+{  WWT_IMGBTN, RESIZE_NONE, 14,   3,  14,  5, 16, SPR_ARROW_DOWN,      STR_029E_MOVE_THE_STARTING_DATE},
+{  WWT_IMGBTN, RESIZE_NONE, 14, 113, 125,  5, 16, SPR_ARROW_UP,        STR_029F_MOVE_THE_STARTING_DATE},
+
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_SMALLMAP,    STR_0175_DISPLAY_MAP_TOWN_DIRECTORY},
+
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_ZOOMIN,      STR_017F_ZOOM_THE_VIEW_IN},
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_ZOOMOUT,     STR_0180_ZOOM_THE_VIEW_OUT},
+
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_LANDSCAPING, STR_022E_LANDSCAPE_GENERATION},
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_TOWN,        STR_022F_TOWN_GENERATION},
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_INDUSTRY,    STR_0230_INDUSTRY_GENERATION},
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_BUILDROAD,   STR_0231_ROAD_CONSTRUCTION},
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_PLANTTREES,  STR_0288_PLANT_TREES},
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_SIGN,        STR_0289_PLACE_SIGN},
+
+{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
+{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
+{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
+{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
+{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
+{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
+{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_MUSIC,       STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
+{   WWT_EMPTY, RESIZE_NONE,  0,   0,   0,  0,  0, 0x0,                 STR_NULL},
+{  WWT_IMGBTN, RESIZE_NONE, 14,   0,   0,  0, 21, SPR_IMG_QUERY,       STR_0186_LAND_BLOCK_INFORMATION},
+{WIDGETS_END},
+};
+
+static const WindowDesc _toolb_scen_desc = {
+	0, 0, 130, 22, 640, 22,
+	WC_MAIN_TOOLBAR, WC_NONE,
+	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
+	_toolb_scen_widgets,
+	ScenEditToolbarWndProc
+};
+
+Window *AllocateToolbar()
+{
+	return AllocateWindowDesc((_game_mode != GM_EDITOR) ? &_toolb_normal_desc : &_toolb_scen_desc);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/toolbar_gui.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,13 @@
+/* $Id$ */
+
+/** @file toolbar_gui.h Stuff related to the (main) toolbar. */
+
+#ifndef TOOLBAR_GUI_H
+#define TOOLBAR_GUI_H
+
+#include "window_type.h"
+
+Point GetToolbarDropdownPos(uint16 parent_button, int width, int height);
+Window *AllocateToolbar();
+
+#endif /*TOOLBAR_GUI_H*/
--- a/src/town.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/town.h	Tue Apr 15 00:47:19 2008 +0000
@@ -6,6 +6,7 @@
 #define TOWN_H
 
 #include "oldpool.h"
+#include "core/bitmath_func.hpp"
 #include "core/random_func.hpp"
 #include "cargo_type.h"
 #include "tile_type.h"
@@ -13,6 +14,7 @@
 #include "town_type.h"
 #include "player_type.h"
 #include "newgrf_string_type.h"
+#include "settings_type.h"
 
 enum {
 	HOUSE_NO_CLASS   = 0,
@@ -45,12 +47,17 @@
 DECLARE_ENUM_AS_BIT_SET(BuildingFlags)
 
 enum HouseZonesBits {
+	HZB_BEGIN     = 0,
 	HZB_TOWN_EDGE = 0,
 	HZB_TOWN_OUTSKIRT,
 	HZB_TOWN_OUTER_SUBURB,
 	HZB_TOWN_INNER_SUBURB,
 	HZB_TOWN_CENTRE,
+	HZB_END,
 };
+assert_compile(HZB_END == 5);
+
+DECLARE_POSTFIX_INCREMENT(HouseZonesBits)
 
 enum HouseZones {                  ///< Bit  Value       Meaning
 	HZ_NOZNS             = 0x0000,  ///<       0          This is just to get rid of zeros, meaning none
@@ -90,7 +97,7 @@
 	TileIndex xy;
 
 	/* Current population of people and amount of houses. */
-	uint16 num_houses;
+	uint32 num_houses;
 	uint32 population;
 
 	/* Town name */
@@ -156,11 +163,14 @@
 	bool larger_town;
 
 	/* NOSAVE: UpdateTownRadius updates this given the house count. */
-	uint16 radius[5];
+	uint16 radius[HZB_END];
 
 	/* NOSAVE: The number of each type of building in the town. */
 	BuildingCounts building_counts;
 
+	/* NOSAVE: The town specific road layout */
+	TownLayout layout;
+
 	/**
 	 * Creates a new town
 	 */
@@ -170,8 +180,21 @@
 	~Town();
 
 	inline bool IsValid() const { return this->xy != 0; }
+
+	void InitializeLayout();
+
+	inline TownLayout GetActiveLayout() const;
 };
 
+/**
+ * Get the current valid layout for the town
+ * @return the active layout for this town
+ */
+inline TownLayout Town::GetActiveLayout() const
+{
+	return (_patches.town_layout == TL_RANDOM) ? this->layout : _patches.town_layout;
+}
+
 struct HouseSpec {
 	/* Standard properties */
 	Year min_date;                     ///< introduction year of the house
@@ -314,16 +337,46 @@
 extern Town *_cleared_town;
 extern int _cleared_town_rating;
 
-uint OriginalTileRandomiser(uint x, uint y);
 void ResetHouses();
 
 void ClearTownHouse(Town *t, TileIndex tile);
 void AfterLoadTown();
 void UpdateTownMaxPass(Town *t);
+void UpdateTownRadius(Town *t);
 bool CheckIfAuthorityAllows(TileIndex tile);
 Town *ClosestTownFromTile(TileIndex tile, uint threshold);
 void ChangeTownRating(Town *t, int add, int max);
 HouseZonesBits GetTownRadiusGroup(const Town* t, TileIndex tile);
 void SetTownRatingTestMode(bool mode);
 
+/**
+ * Calculate a hash value from a tile position
+ *
+ * @param x The X coordinate
+ * @param y The Y coordinate
+ * @return The hash of the tile
+ */
+static inline uint TileHash(uint x, uint y)
+{
+	uint hash = x >> 4;
+	hash ^= x >> 6;
+	hash ^= y >> 4;
+	hash -= y >> 6;
+	return hash;
+}
+
+/**
+ * Get the last two bits of the TileHash
+ *  from a tile position.
+ *
+ * @see TileHash()
+ * @param x The X coordinate
+ * @param y The Y coordinate
+ * @return The last two bits from hash of the tile
+ */
+static inline uint TileHash2Bit(uint x, uint y)
+{
+	return GB(TileHash(x, y), 0, 2);
+}
+
 #endif /* TOWN_H */
--- a/src/town_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/town_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -15,9 +15,9 @@
 #include "town.h"
 #include "command_func.h"
 #include "industry.h"
-#include "station.h"
+#include "station_base.h"
 #include "player_base.h"
-#include "news.h"
+#include "news_func.h"
 #include "saveload.h"
 #include "gui.h"
 #include "unmovable_map.h"
@@ -39,6 +39,8 @@
 #include "strings_func.h"
 #include "window_func.h"
 #include "string_func.h"
+#include "newgrf_cargo.h"
+#include "oldpool_func.h"
 
 #include "table/strings.h"
 #include "table/sprites.h"
@@ -106,6 +108,23 @@
 	this->xy = 0;
 }
 
+/**
+ * Generate a random town road layout.
+ *
+ * The layout is based on the TileHash.
+ */
+void Town::InitializeLayout()
+{
+	this->layout = (TownLayout)(TileHash(TileX(this->xy), TileY(this->xy)) % NUM_TLS);
+
+	/* Set invalid layouts to valid ones */
+	switch (this->layout) {
+		default: break;
+		case TL_RANDOM: this->layout = TL_ORIGINAL; break;
+		case TL_NO_ROADS: this->layout = TL_BETTER_ROADS; break;
+	}
+}
+
 // Local
 static int _grow_town_result;
 
@@ -124,21 +143,10 @@
 }
 
 typedef void TownDrawTileProc(const TileInfo *ti);
-static TownDrawTileProc * const _town_draw_tile_procs[1] = {
+static TownDrawTileProc *const _town_draw_tile_procs[1] = {
 	TownDrawHouseLift
 };
 
-uint OriginalTileRandomiser(uint x, uint y)
-{
-	uint variant;
-	variant  = x >> 4;
-	variant ^= x >> 6;
-	variant ^= y >> 4;
-	variant -= y >> 6;
-	variant &= 3;
-	return variant;
-}
-
 /**
  * Return a random direction
  *
@@ -156,9 +164,6 @@
  */
 static void DrawTile_Town(TileInfo *ti)
 {
-	const DrawBuildingsTileStruct *dcts;
-	SpriteID image;
-	SpriteID pal;
 	HouseID house_id = GetHouseType(ti->tile);
 
 	if (house_id >= NEW_HOUSE_OFFSET) {
@@ -174,16 +179,17 @@
 	}
 
 	/* Retrieve pointer to the draw town tile struct */
-	dcts = &_town_draw_tile_data[house_id << 4 | OriginalTileRandomiser(ti->x, ti->y) << 2 | GetHouseBuildingStage(ti->tile)];
+	const DrawBuildingsTileStruct *dcts = &_town_draw_tile_data[house_id << 4 | TileHash2Bit(ti->x, ti->y) << 2 | GetHouseBuildingStage(ti->tile)];
 
 	if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED);
 
-	image = dcts->ground.sprite;
-	pal   = dcts->ground.pal;
-	DrawGroundSprite(image, pal);
+	DrawGroundSprite(dcts->ground.sprite, dcts->ground.pal);
+
+	/* If houses are invisible, do not draw the upper part */
+	if (IsInvisibilitySet(TO_HOUSES)) return;
 
 	/* Add a house on top of the ground? */
-	image = dcts->building.sprite;
+	SpriteID image = dcts->building.sprite;
 	if (image != 0) {
 		AddSortableSpriteToDraw(image, dcts->building.pal,
 			ti->x + dcts->subtile_x,
@@ -223,8 +229,6 @@
  */
 static void AnimateTile_Town(TileIndex tile)
 {
-	int pos, dest;
-
 	if (GetHouseType(tile) >= NEW_HOUSE_OFFSET) {
 		AnimateNewHouseTile(tile);
 		return;
@@ -242,21 +246,21 @@
 	}
 
 	if (!LiftHasDestination(tile)) {
-		int i;
-
-		/*  Building has 6 floors, number 0 .. 6, where 1 is illegal.
-		 *  This is due to the fact that the first floor is, in the graphics,
+		uint i;
+
+		/* Building has 6 floors, number 0 .. 6, where 1 is illegal.
+		 * This is due to the fact that the first floor is, in the graphics,
 		 *  the height of 2 'normal' floors.
-		 *  Furthermore, there are 6 lift positions from floor N (incl) to floor N + 1 (excl) */
+		 * Furthermore, there are 6 lift positions from floor N (incl) to floor N + 1 (excl) */
 		do {
-			i = (Random() & 7) - 1;
-		} while (i < 0 || i == 1 || i * 6 == GetLiftPosition(tile));
+			i = RandomRange(7);
+		} while (i == 1 || i * 6 == GetLiftPosition(tile));
 
 		SetLiftDestination(tile, i);
 	}
 
-	pos = GetLiftPosition(tile);
-	dest = GetLiftDestination(tile) * 6;
+	int pos = GetLiftPosition(tile);
+	int dest = GetLiftDestination(tile) * 6;
 	pos += (pos < dest) ? 1 : -1;
 	SetLiftPosition(tile, pos);
 
@@ -265,8 +269,6 @@
 	MarkTileDirtyByTile(tile);
 }
 
-static void UpdateTownRadius(Town *t);
-
 /**
  * Determines if a town is close to a tile
  * @param tile TileIndex of the tile to query
@@ -275,7 +277,7 @@
  */
 static bool IsCloseToTown(TileIndex tile, uint dist)
 {
-	const Town* t;
+	const Town *t;
 
 	FOR_ALL_TOWNS(t) {
 		if (DistanceManhattan(tile, t->xy) < dist) return true;
@@ -308,10 +310,8 @@
  */
 void UpdateTownVirtCoord(Town *t)
 {
-	Point pt;
-
 	MarkTownSignDirty(t);
-	pt = RemapCoords2(TileX(t->xy) * TILE_SIZE, TileY(t->xy) * TILE_SIZE);
+	Point pt = RemapCoords2(TileX(t->xy) * TILE_SIZE, TileY(t->xy) * TILE_SIZE);
 	SetDParam(0, t->index);
 	SetDParam(1, t->population);
 	UpdateViewportSignPos(&t->sign, pt.x, pt.y - 24,
@@ -349,10 +349,9 @@
  */
 uint32 GetWorldPopulation()
 {
-	uint32 pop;
-	const Town* t;
-
-	pop = 0;
+	uint32 pop = 0;
+	const Town *t;
+
 	FOR_ALL_TOWNS(t) pop += t->population;
 	return pop;
 }
@@ -404,10 +403,7 @@
  */
 static void TileLoop_Town(TileIndex tile)
 {
-	Town *t;
-	uint32 r;
 	HouseID house_id = GetHouseType(tile);
-	HouseSpec *hs = GetHouseSpecs(house_id);
 
 	/* NewHouseTileLoop returns false if Callback 21 succeeded, i.e. the house
 	 * doesn't exist any more, so don't continue here. */
@@ -419,16 +415,18 @@
 		return;
 	}
 
+	const HouseSpec *hs = GetHouseSpecs(house_id);
+
 	/* If the lift has a destination, it is already an animated tile. */
 	if ((hs->building_flags & BUILDING_IS_ANIMATED) &&
 			house_id < NEW_HOUSE_OFFSET &&
 			!LiftHasDestination(tile) &&
-			Chance16(1, 2))
+			Chance16(1, 2)) {
 		AddAnimatedTile(tile);
-
-	t = GetTownByTile(tile);
-
-	r = Random();
+	}
+
+	Town *t = GetTownByTile(tile);
+	uint32 r = Random();
 
 	if (HasBit(hs->callback_mask, CBM_HOUSE_PRODUCE_CARGO)) {
 		for (uint i = 0; i < 256; i++) {
@@ -461,22 +459,18 @@
 	} else {
 		if (GB(r, 0, 8) < hs->population) {
 			uint amt = GB(r, 0, 8) / 8 + 1;
-			uint moved;
 
 			if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
 			t->new_max_pass += amt;
-			moved = MoveGoodsToStation(tile, 1, 1, CT_PASSENGERS, amt);
-			t->new_act_pass += moved;
+			t->new_act_pass += MoveGoodsToStation(tile, 1, 1, CT_PASSENGERS, amt);
 		}
 
 		if (GB(r, 8, 8) < hs->mail_generation) {
 			uint amt = GB(r, 8, 8) / 8 + 1;
-			uint moved;
 
 			if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
 			t->new_max_mail += amt;
-			moved = MoveGoodsToStation(tile, 1, 1, CT_MAIL, amt);
-			t->new_act_mail += moved;
+			t->new_act_mail += MoveGoodsToStation(tile, 1, 1, CT_MAIL, amt);
 		}
 	}
 
@@ -509,19 +503,17 @@
 
 static CommandCost ClearTile_Town(TileIndex tile, byte flags)
 {
-	int rating;
+	if ((flags & DC_AUTO) && !(flags & DC_AI_BUILDING)) return_cmd_error(STR_2004_BUILDING_MUST_BE_DEMOLISHED);
+	if (!CanDeleteHouse(tile)) return CMD_ERROR;
+
+	const HouseSpec *hs = GetHouseSpecs(GetHouseType(tile));
+
 	CommandCost cost(EXPENSES_CONSTRUCTION);
-	Town *t;
-	HouseSpec *hs = GetHouseSpecs(GetHouseType(tile));
-
-	if (flags&DC_AUTO && !(flags&DC_AI_BUILDING)) return_cmd_error(STR_2004_BUILDING_MUST_BE_DEMOLISHED);
-	if (!CanDeleteHouse(tile)) return CMD_ERROR;
-
 	cost.AddCost(_price.remove_house * hs->removal_cost >> 8);
 
-	rating = hs->remove_rating_decrease;
+	int rating = hs->remove_rating_decrease;
 	_cleared_town_rating += rating;
-	_cleared_town = t = GetTownByTile(tile);
+	Town *t = _cleared_town = GetTownByTile(tile);
 
 	if (IsValidPlayer(_current_player)) {
 		if (rating > t->ratings[_current_player] && !(flags & DC_NO_TOWN_RATING) && !_cheats.magic_bulldozer.value) {
@@ -538,9 +530,36 @@
 	return cost;
 }
 
+static void GetProducedCargo_Town(TileIndex tile, CargoID *b)
+{
+	HouseID house_id = GetHouseType(tile);
+	const HouseSpec *hs = GetHouseSpecs(house_id);
+	Town *t = GetTownByTile(tile);
+
+	if (HasBit(hs->callback_mask, CBM_HOUSE_PRODUCE_CARGO)) {
+		for (uint i = 0; i < 256; i++) {
+			uint16 callback = GetHouseCallback(CBID_HOUSE_PRODUCE_CARGO, i, 0, house_id, t, tile);
+
+			if (callback == CALLBACK_FAILED || callback == CALLBACK_HOUSEPRODCARGO_END) break;
+
+			CargoID cargo = GetCargoTranslation(GB(callback, 8, 7), hs->grffile);
+
+			if (cargo == CT_INVALID) continue;
+			*(b++) = cargo;
+		}
+	} else {
+		if (hs->population > 0) {
+			*(b++) = CT_PASSENGERS;
+		}
+		if (hs->mail_generation > 0) {
+			*(b++) = CT_MAIL;
+		}
+	}
+}
+
 static void GetAcceptedCargo_Town(TileIndex tile, AcceptedCargo ac)
 {
-	HouseSpec *hs = GetHouseSpecs(GetHouseType(tile));
+	const HouseSpec *hs = GetHouseSpecs(GetHouseType(tile));
 	CargoID accepts[3];
 
 	/* Set the initial accepted cargo types */
@@ -703,11 +722,12 @@
 /**
  * Check if a Road is allowed on a given tile
  *
+ * @param t The current town
  * @param tile The target tile
  * @param dir The direction in which we want to extend the town
  * @return true if it is allowed else false
  */
-static bool IsRoadAllowedHere(TileIndex tile, DiagDirection dir)
+static bool IsRoadAllowedHere(Town *t, TileIndex tile, DiagDirection dir)
 {
 	if (TileX(tile) < 2 || TileX(tile) >= MapMaxX() || TileY(tile) < 2 || TileY(tile) >= MapMaxY()) return false;
 
@@ -728,7 +748,7 @@
 		if (cur_slope == SLOPE_FLAT) {
 no_slope:
 			/* Tile has no slope */
-			switch (_patches.town_layout) {
+			switch (t->GetActiveLayout()) {
 				default: NOT_REACHED();
 
 				case TL_ORIGINAL: // Disallow the road if any neighboring tile has a road (distance: 1)
@@ -763,25 +783,21 @@
 
 static bool TerraformTownTile(TileIndex tile, int edges, int dir)
 {
-	CommandCost r;
-
 	TILE_ASSERT(tile);
 
-	r = DoCommand(tile, edges, dir, DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
-	if (CmdFailed(r) || r.GetCost() >= 126 * 16) return false;
+	CommandCost r = DoCommand(tile, edges, dir, DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
+	if (CmdFailed(r) || r.GetCost() >= (_price.terraform + 2) * 8) return false;
 	DoCommand(tile, edges, dir, DC_AUTO | DC_NO_WATER | DC_EXEC, CMD_TERRAFORM_LAND);
 	return true;
 }
 
 static void LevelTownLand(TileIndex tile)
 {
-	Slope tileh;
-
 	TILE_ASSERT(tile);
 
 	/* Don't terraform if land is plain or if there's a house there. */
 	if (IsTileType(tile, MP_HOUSE)) return;
-	tileh = GetTileSlope(tile, NULL);
+	Slope tileh = GetTileSlope(tile, NULL);
 	if (tileh == SLOPE_FLAT) return;
 
 	/* First try up, then down */
@@ -799,13 +815,13 @@
  * @return the RoadBit of the current tile regarding
  *  the selected town layout
  */
-static RoadBits GetTownRoadGridElement(Town* t, TileIndex tile, DiagDirection dir)
+static RoadBits GetTownRoadGridElement(Town *t, TileIndex tile, DiagDirection dir)
 {
 	/* align the grid to the downtown */
 	TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile); // Vector from downtown to the tile
 	RoadBits rcmd = ROAD_NONE;
 
-	switch (_patches.town_layout) {
+	switch (t->GetActiveLayout()) {
 		default: NOT_REACHED();
 
 		case TL_2X2_GRID:
@@ -988,7 +1004,7 @@
 		LevelTownLand(tile);
 
 		/* Is a road allowed here? */
-		switch (_patches.town_layout) {
+		switch (t1->GetActiveLayout()) {
 			default: NOT_REACHED();
 
 			case TL_NO_ROADS: /* Disallow Roads */
@@ -1002,7 +1018,7 @@
 
 			case TL_BETTER_ROADS:
 			case TL_ORIGINAL:
-				if (!IsRoadAllowedHere(tile, target_dir)) return;
+				if (!IsRoadAllowedHere(t1, tile, target_dir)) return;
 
 				DiagDirection source_dir = ReverseDiagDir(target_dir);
 
@@ -1011,7 +1027,7 @@
 					do target_dir = RandomDiagDir(); while (target_dir == source_dir);
 				}
 
-				if (!IsRoadAllowedHere(TileAddByDiagDir(tile, target_dir), target_dir)) {
+				if (!IsRoadAllowedHere(t1, TileAddByDiagDir(tile, target_dir), target_dir)) {
 					/* A road is not allowed to continue the randomized road,
 					 *  return if the road we're trying to build is curved. */
 					if (target_dir != ReverseDiagDir(source_dir)) return;
@@ -1036,7 +1052,7 @@
 		 * the fitting RoadBits */
 		_grow_town_result = GROWTH_SEARCH_STOPPED;
 
-		switch (_patches.town_layout) {
+		switch (t1->GetActiveLayout()) {
 			default: NOT_REACHED();
 
 			case TL_NO_ROADS: /* Disallow Roads */
@@ -1074,7 +1090,7 @@
 		/* Don't walk into water. */
 		if (IsWaterTile(house_tile)) return;
 
-		switch (_patches.town_layout) {
+		switch (t1->GetActiveLayout()) {
 			default: NOT_REACHED();
 
 			case TL_NO_ROADS:
@@ -1098,7 +1114,7 @@
 				 /* Allow a house at the edge. 60% chance or
 				  * always ok if no road allowed. */
 				rcmd = DiagDirToRoadBits(target_dir);
-				allow_house = (!IsRoadAllowedHere(house_tile, target_dir) || Chance16(6, 10));
+				allow_house = (!IsRoadAllowedHere(t1, house_tile, target_dir) || Chance16(6, 10));
 				break;
 		}
 
@@ -1152,7 +1168,7 @@
 	/* Number of times to search.
 	 * Better roads, 2X2 and 3X3 grid grow quite fast so we give
 	 * them a little handicap. */
-	switch (_patches.town_layout) {
+	switch (t->GetActiveLayout()) {
 		case TL_BETTER_ROADS:
 			_grow_town_result = 10 + t->num_houses * 2 / 9;
 			break;
@@ -1219,10 +1235,11 @@
 }
 
 /** Grow the town
- * @Return true if a house was built, or no if the build failed. */
+ * @param t town to grow
+ * @return true iff a house was built
+ */
 static bool GrowTown(Town *t)
 {
-
 	/* Let the town be a ghost town
 	 * The player wanted it in such a way. Thus there he has it. ;)
 	 * Never reached in editor mode. */
@@ -1245,7 +1262,6 @@
 		{ 2, -2},
 		{ 0,  0}
 	};
-	const TileIndexDiffC *ptr;
 
 	/* Current player is a town */
 	PlayerID old_player = _current_player;
@@ -1254,6 +1270,7 @@
 	TileIndex tile = t->xy; // The tile we are working with ATM
 
 	/* Find a road that we can base the construction on. */
+	const TileIndexDiffC *ptr;
 	for (ptr = _town_coord_mod; ptr != endof(_town_coord_mod); ++ptr) {
 		if (GetTownRoadBits(tile) != ROAD_NONE) {
 			int r = GrowTownAtRoad(t, tile);
@@ -1282,7 +1299,7 @@
 	return false;
 }
 
-static void UpdateTownRadius(Town *t)
+void UpdateTownRadius(Town *t)
 {
 	static const uint16 _town_radius_data[23][5] = {
 		{  4,  0,  0,  0,  0}, // 0
@@ -1344,7 +1361,7 @@
 	uint32 grfid = grf ? GetGRFTownNameId(_opt.town_name - _nb_orig_names) : 0;
 	uint16 townnametype = grf ? GetGRFTownNameType(_opt.town_name - _nb_orig_names) : SPECSTR_TOWNNAME_START + _opt.town_name;
 
-	assert(townnameparts);
+	assert(townnameparts != NULL);
 
 	for (;;) {
 restart:
@@ -1393,7 +1410,6 @@
 static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSizeMode size_mode, uint size)
 {
 	extern int _nb_orig_names;
-	int x, i;
 
 	t->xy = tile;
 	t->num_houses = 0;
@@ -1420,8 +1436,7 @@
 	t->act_food = 0;
 	t->act_water = 0;
 
-	for (i = 0; i != MAX_PLAYERS; i++)
-		t->ratings[i] = 500;
+	for (uint i = 0; i != MAX_PLAYERS; i++) t->ratings[i] = RATING_INITIAL;
 
 	t->have_ratings = 0;
 	t->exclusivity = INVALID_PLAYER;
@@ -1442,8 +1457,10 @@
 	UpdateTownVirtCoord(t);
 	_town_sort_dirty = true;
 
+	t->InitializeLayout();
+
 	/* Random town size. */
-	x = (Random() & 0xF) + 8;
+	int x = (Random() & 0xF) + 8;
 
 	switch (size_mode) {
 		default: NOT_REACHED();
@@ -1466,7 +1483,7 @@
 	t->num_houses += x;
 	UpdateTownRadius(t);
 
-	i = x * 4;
+	int i = x * 4;
 	do {
 		GrowTown(t);
 	} while (--i);
@@ -1486,8 +1503,6 @@
  */
 CommandCost CmdBuildTown(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	uint32 townnameparts;
-
 	/* Only in the scenario editor */
 	if (_game_mode != GM_EDITOR) return CMD_ERROR;
 	if (p2 > TSM_CITY) return CMD_ERROR;
@@ -1505,6 +1520,8 @@
 	if (IsCloseToTown(tile, 20))
 		return_cmd_error(STR_0238_TOO_CLOSE_TO_ANOTHER_TOWN);
 
+	uint32 townnameparts;
+
 	/* Get a unique name for the town. */
 	if (!CreateTownName(&townnameparts))
 		return_cmd_error(STR_023A_TOO_MANY_TOWNS);
@@ -1526,13 +1543,9 @@
 
 Town *CreateRandomTown(uint attempts, TownSizeMode mode, uint size)
 {
-	TileIndex tile;
-	Town *t;
-	uint32 townnameparts;
-
 	do {
 		/* Generate a tile index not too close from the edge */
-		tile = RandomTile();
+		TileIndex tile = RandomTile();
 		if (DistanceFromEdge(tile) < 20) continue;
 
 		/* Make sure the tile is plain */
@@ -1541,16 +1554,19 @@
 		/* Check not too close to a town */
 		if (IsCloseToTown(tile, 20)) continue;
 
+		uint32 townnameparts;
+
 		/* Get a unique name for the town. */
 		if (!CreateTownName(&townnameparts)) break;
 
 		/* Allocate a town struct */
-		t = new Town(tile);
+		Town *t = new Town(tile);
 		if (t == NULL) break;
 
 		DoCreateTown(t, tile, townnameparts, mode, size);
 		return t;
-	} while (--attempts);
+	} while (--attempts != 0);
+
 	return NULL;
 }
 
@@ -1591,17 +1607,15 @@
  * @param tile TileIndex where radius needs to be found
  * @return the bit position of the given zone, as defined in HouseZones
  */
-HouseZonesBits GetTownRadiusGroup(const Town* t, TileIndex tile)
+HouseZonesBits GetTownRadiusGroup(const Town *t, TileIndex tile)
 {
 	uint dist = DistanceSquare(tile, t->xy);
-	HouseZonesBits smallest;
-	uint i;
 
 	if (t->fund_buildings_months && dist <= 25) return HZB_TOWN_CENTRE;
 
-	smallest = HZB_TOWN_EDGE;
-	for (i = 0; i != lengthof(t->radius); i++) {
-		if (dist < t->radius[i]) smallest = (HouseZonesBits)i;
+	HouseZonesBits smallest = HZB_TOWN_EDGE;
+	for (HouseZonesBits i = HZB_BEGIN; i < HZB_END; i++) {
+		if (dist < t->radius[i]) smallest = i;
 	}
 
 	return smallest;
@@ -1731,7 +1745,7 @@
 {
 	TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile);
 
-	switch (_patches.town_layout) {
+	switch (t->GetActiveLayout()) {
 		case TL_2X2_GRID:
 			if ((grid_pos.x % 3) == 0 || (grid_pos.y % 3) == 0) return false;
 			break;
@@ -1762,7 +1776,7 @@
 	uint dx = MapSize() + TileX(t->xy) - TileX(tile);
 	uint dy = MapSize() + TileY(t->xy) - TileY(tile);
 
-	switch (_patches.town_layout) {
+	switch (t->GetActiveLayout()) {
 		case TL_2X2_GRID:
 			if ((dx % 3) != 0 || (dy % 3) != 0) return false;
 			break;
@@ -1867,7 +1881,7 @@
 
 	/* Generate a list of all possible houses that can be built. */
 	for (uint i = 0; i < HOUSE_MAX; i++) {
-		HouseSpec *hs = GetHouseSpecs(i);
+		const HouseSpec *hs = GetHouseSpecs(i);
 		/* Verify that the candidate house spec matches the current tile status */
 		if ((~hs->building_availability & bitmask) == 0 && hs->enabled) {
 			/* Without NewHouses, all houses have probability '1' */
@@ -1896,7 +1910,7 @@
 		houses[i] = houses[num];
 		probs[i] = probs[num];
 
-		HouseSpec *hs = GetHouseSpecs(house);
+		const HouseSpec *hs = GetHouseSpecs(house);
 
 		if (_loaded_newgrf_features.has_newhouses) {
 			if (hs->override != 0) {
@@ -1980,11 +1994,9 @@
 
 void ClearTownHouse(Town *t, TileIndex tile)
 {
+	assert(IsTileType(tile, MP_HOUSE));
+
 	HouseID house = GetHouseType(tile);
-	uint eflags;
-	HouseSpec *hs;
-
-	assert(IsTileType(tile, MP_HOUSE));
 
 	/* need to align the tile to point to the upper left corner of the house */
 	if (house >= 3) { // house id 0,1,2 MUST be single tile houses, or this code breaks.
@@ -2003,7 +2015,7 @@
 		}
 	}
 
-	hs = GetHouseSpecs(house);
+	const HouseSpec *hs = GetHouseSpecs(house);
 
 	/* Remove population from the town if the house is finished. */
 	if (IsHouseCompleted(tile)) {
@@ -2021,7 +2033,7 @@
 	}
 
 	/* Do the actual clearing of tiles */
-	eflags = hs->building_flags;
+	uint eflags = hs->building_flags;
 	DoClearTownHouseHelper(tile);
 	if (eflags & BUILDING_2_TILES_X)   DoClearTownHouseHelper(tile + TileDiffXY(1, 0));
 	if (eflags & BUILDING_2_TILES_Y)   DoClearTownHouseHelper(tile + TileDiffXY(0, 1));
@@ -2050,15 +2062,13 @@
  */
 CommandCost CmdRenameTown(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Town *t;
-
 	if (!IsValidTownID(p1) || StrEmpty(_cmd_text)) return CMD_ERROR;
 
-	t = GetTown(p1);
-
 	if (!IsUniqueTownName(_cmd_text)) return_cmd_error(STR_NAME_MUST_BE_UNIQUE);
 
 	if (flags & DC_EXEC) {
+		Town *t = GetTown(p1);
+
 		free(t->name);
 		t->name = strdup(_cmd_text);
 
@@ -2074,16 +2084,14 @@
 /** Called from GUI */
 void ExpandTown(Town *t)
 {
-	int amount, n;
-
 	_generating_world = true;
 
 	/* The more houses, the faster we grow */
-	amount = RandomRange(t->num_houses / 10) + 3;
+	uint amount = RandomRange(ClampToU16(t->num_houses / 10)) + 3;
 	t->num_houses += amount;
 	UpdateTownRadius(t);
 
-	n = amount * 10;
+	uint n = amount * 10;
 	do GrowTown(t); while (--n);
 
 	t->num_houses -= amount;
@@ -2097,22 +2105,22 @@
 	2, 4, 9, 35, 48, 53, 117, 175
 };
 
-static void TownActionAdvertiseSmall(Town* t)
+static void TownActionAdvertiseSmall(Town *t)
 {
 	ModifyStationRatingAround(t->xy, _current_player, 0x40, 10);
 }
 
-static void TownActionAdvertiseMedium(Town* t)
+static void TownActionAdvertiseMedium(Town *t)
 {
 	ModifyStationRatingAround(t->xy, _current_player, 0x70, 15);
 }
 
-static void TownActionAdvertiseLarge(Town* t)
+static void TownActionAdvertiseLarge(Town *t)
 {
 	ModifyStationRatingAround(t->xy, _current_player, 0xA0, 20);
 }
 
-static void TownActionRoadRebuild(Town* t)
+static void TownActionRoadRebuild(Town *t)
 {
 	t->road_build_months = 6;
 
@@ -2120,14 +2128,11 @@
 	SetDParam(1, _current_player);
 
 	AddNewsItem(STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING,
-		NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_GENERAL, 0), t->xy, 0);
+		NM_NORMAL, NF_TILE, NT_GENERAL, DNC_NONE, t->xy, 0);
 }
 
 static bool DoBuildStatueOfCompany(TileIndex tile, TownID town_id)
 {
-	PlayerID old;
-	CommandCost r;
-
 	/* Statues can be build on slopes, just like houses. Only the steep slopes is a no go. */
 	if (IsSteepSlope(GetTileSlope(tile, NULL))) return false;
 
@@ -2137,9 +2142,9 @@
 		return false;
 	}
 
-	old = _current_player;
+	PlayerID old = _current_player;
 	_current_player = OWNER_NONE;
-	r = DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
+	CommandCost r = DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
 	_current_player = old;
 
 	if (CmdFailed(r)) return false;
@@ -2166,15 +2171,16 @@
  * in order to find a free tile to place a statue
  * @param t town to search in
  */
-static void TownActionBuildStatue(Town* t)
+static void TownActionBuildStatue(Town *t)
 {
 	TileIndex tile = t->xy;
 
-	if (CircularTileSearch(tile, 9, SearchTileForStatue, t->index))
+	if (CircularTileSearch(tile, 9, SearchTileForStatue, t->index)) {
 		SetBit(t->statues, _current_player); // Once found and built, "inform" the Town
+	}
 }
 
-static void TownActionFundBuildings(Town* t)
+static void TownActionFundBuildings(Town *t)
 {
 	/* Build next tick */
 	t->grow_counter = 1;
@@ -2184,7 +2190,7 @@
 	t->fund_buildings_months = 3;
 }
 
-static void TownActionBuyRights(Town* t)
+static void TownActionBuyRights(Town *t)
 {
 	/* Check if it's allowed to by the rights */
 	if (!_patches.exclusive_rights) return;
@@ -2195,15 +2201,14 @@
 	ModifyStationRatingAround(t->xy, _current_player, 130, 17);
 }
 
-static void TownActionBribe(Town* t)
+static void TownActionBribe(Town *t)
 {
-	if (!RandomRange(15)) {
-		Station *st;
-
+	if (Chance16(1, 14)) {
 		/* set as unwanted for 6 months */
 		t->unwanted[_current_player] = 6;
 
 		/* set all close by station ratings to 0 */
+		Station *st;
 		FOR_ALL_STATIONS(st) {
 			if (st->town == t && st->owner == _current_player) {
 				for (CargoID i = 0; i < NUM_CARGO; i++) st->goods[i].rating = 0;
@@ -2226,8 +2231,8 @@
 	}
 }
 
-typedef void TownActionProc(Town* t);
-static TownActionProc * const _town_action_proc[] = {
+typedef void TownActionProc(Town *t);
+static TownActionProc *const _town_action_proc[] = {
 	TownActionAdvertiseSmall,
 	TownActionAdvertiseMedium,
 	TownActionAdvertiseLarge,
@@ -2250,11 +2255,9 @@
  */
 CommandCost CmdDoTownAction(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Town *t;
-
 	if (!IsValidTownID(p1) || p2 > lengthof(_town_action_proc)) return CMD_ERROR;
 
-	t = GetTown(p1);
+	Town *t = GetTown(p1);
 
 	if (!HasBit(GetMaskOfTownActions(NULL, _current_player, t), p2)) return CMD_ERROR;
 
@@ -2270,32 +2273,39 @@
 
 static void UpdateTownGrowRate(Town *t)
 {
-	int n;
-	Station *st;
-	uint16 m;
-	Player *p;
-
-	/* Reset player ratings if they're low */
+	/* Increase player ratings if they're low */
+	const Player *p;
 	FOR_ALL_PLAYERS(p) {
-		if (p->is_active && t->ratings[p->index] <= 200) {
-			t->ratings[p->index] += 5;
+		if (p->is_active) {
+			t->ratings[p->index] = min((int)RATING_GROWTH_MAXIMUM, t->ratings[p->index] + RATING_GROWTH_UP_STEP);
 		}
 	}
 
-	n = 0;
+	int n = 0;
+
+	const Station *st;
 	FOR_ALL_STATIONS(st) {
 		if (DistanceSquare(st->xy, t->xy) <= t->radius[0]) {
 			if (st->time_since_load <= 20 || st->time_since_unload <= 20) {
 				n++;
-				if (IsValidPlayer(st->owner) && t->ratings[st->owner] <= 1000-12)
-					t->ratings[st->owner] += 12;
+				if (IsValidPlayer(st->owner)) {
+					int new_rating = t->ratings[st->owner] + RATING_STATION_UP_STEP;
+					t->ratings[st->owner] = min(new_rating, INT16_MAX); // do not let it overflow
+				}
 			} else {
-				if (IsValidPlayer(st->owner) && t->ratings[st->owner] >= -1000+15)
-					t->ratings[st->owner] -= 15;
+				if (IsValidPlayer(st->owner)) {
+					int new_rating = t->ratings[st->owner] + RATING_STATION_DOWN_STEP;
+					t->ratings[st->owner] = max(new_rating, INT16_MIN);
+				}
 			}
 		}
 	}
 
+	/* clamp all ratings to valid values */
+	for (uint i = 0; i < MAX_PLAYERS; i++) {
+		t->ratings[i] = Clamp(t->ratings[i], RATING_MINIMUM, RATING_MAXIMUM);
+	}
+
 	ClrBit(t->flags12, TOWN_IS_FUNDED);
 	if (_patches.town_growth_rate == 0 && t->fund_buildings_months == 0) return;
 
@@ -2306,6 +2316,8 @@
 		{ 320, 420, 300, 220, 160, 100 }  // Normal values
 	};
 
+	uint16 m;
+
 	if (t->fund_buildings_months != 0) {
 		m = _grow_count_values[0][min(n, 5)];
 		t->fund_buildings_months--;
@@ -2356,7 +2368,7 @@
 
 static void UpdateTownUnwanted(Town *t)
 {
-	const Player* p;
+	const Player *p;
 
 	FOR_ALL_PLAYERS(p) {
 		if (t->unwanted[p->index] > 0) t->unwanted[p->index]--;
@@ -2365,14 +2377,12 @@
 
 bool CheckIfAuthorityAllows(TileIndex tile)
 {
-	Town *t;
-
 	if (!IsValidPlayer(_current_player)) return true;
 
-	t = ClosestTownFromTile(tile, _patches.dist_local_authority);
+	Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority);
 	if (t == NULL) return true;
 
-	if (t->ratings[_current_player] > -200) return true;
+	if (t->ratings[_current_player] > RATING_VERYPOOR) return true;
 
 	_error_message = STR_2009_LOCAL_AUTHORITY_REFUSES;
 	SetDParam(0, t->index);
@@ -2381,14 +2391,14 @@
 }
 
 
-Town* CalcClosestTownFromTile(TileIndex tile, uint threshold)
+Town *CalcClosestTownFromTile(TileIndex tile, uint threshold)
 {
 	Town *t;
-	uint dist, best = threshold;
+	uint best = threshold;
 	Town *best_town = NULL;
 
 	FOR_ALL_TOWNS(t) {
-		dist = DistanceManhattan(tile, t->xy);
+		uint dist = DistanceManhattan(tile, t->xy);
 		if (dist < best) {
 			best = dist;
 			best_town = t;
@@ -2431,8 +2441,6 @@
 
 void ChangeTownRating(Town *t, int add, int max)
 {
-	int rating;
-
 	/* if magic_bulldozer cheat is active, town doesn't penaltize for removing stuff */
 	if (t == NULL ||
 			!IsValidPlayer(_current_player) ||
@@ -2442,7 +2450,7 @@
 
 	SetBit(t->have_ratings, _current_player);
 
-	rating = _town_rating_test ? t->test_rating : t->ratings[_current_player];
+	int rating = _town_rating_test ? t->test_rating : t->ratings[_current_player];
 
 	if (add < 0) {
 		if (rating > max) {
@@ -2472,8 +2480,6 @@
 
 bool CheckforTownRating(uint32 flags, Town *t, byte type)
 {
-	int modemod;
-
 	/* if magic_bulldozer cheat is active, town doesn't restrict your destructive actions */
 	if (t == NULL || !IsValidPlayer(_current_player) || _cheats.magic_bulldozer.value)
 		return true;
@@ -2482,7 +2488,7 @@
 	 * owned by a town no removal if rating is lower than ... depends now on
 	 * difficulty setting. Minimum town rating selected by difficulty level
 	 */
-	modemod = _default_rating_settings[_opt.diff.town_council_tolerance][type];
+	int modemod = _default_rating_settings[_opt.diff.town_council_tolerance][type];
 
 	if ((_town_rating_test ? t->test_rating : t->ratings[_current_player]) < 16 + modemod && !(flags & DC_NO_TOWN_RATING)) {
 		SetDParam(0, t->index);
@@ -2511,15 +2517,14 @@
 
 void InitializeTowns()
 {
-	Subsidy *s;
-
 	/* Clean the town pool and create 1 block in it */
 	_Town_pool.CleanPool();
 	_Town_pool.AddBlockToPool();
 
 	memset(_subsidies, 0, sizeof(_subsidies));
-	for (s=_subsidies; s != endof(_subsidies); s++)
+	for (Subsidy *s = _subsidies; s != endof(_subsidies); s++) {
 		s->cargo_type = CT_INVALID;
+	}
 
 	_cur_town_ctr = 0;
 	_cur_town_iter = 0;
@@ -2531,7 +2536,7 @@
 {
 	if (AutoslopeEnabled()) {
 		HouseID house = GetHouseType(tile);
-		HouseSpec *hs = GetHouseSpecs(house);
+		const HouseSpec *hs = GetHouseSpecs(house);
 
 		/* Here we differ from TTDP by checking TILE_NOT_SLOPED */
 		if (((hs->building_flags & TILE_NOT_SLOPED) == 0) && !IsSteepSlope(tileh_new) &&
@@ -2552,7 +2557,7 @@
 	AnimateTile_Town,        /* animate_tile_proc */
 	TileLoop_Town,           /* tile_loop_clear */
 	ChangeTileOwner_Town,    /* change_tile_owner_clear */
-	NULL,                    /* get_produced_cargo_proc */
+	GetProducedCargo_Town,   /* get_produced_cargo_proc */
 	NULL,                    /* vehicle_enter_tile_proc */
 	GetFoundation_Town,      /* get_foundation_proc */
 	TerraformTile_Town,      /* terraform_tile_proc */
@@ -2564,10 +2569,10 @@
 	SLE_CONDVAR(Town, xy,                    SLE_FILE_U16 | SLE_VAR_U32, 0, 5),
 	SLE_CONDVAR(Town, xy,                    SLE_UINT32,                 6, SL_MAX_VERSION),
 
-	SLE_CONDNULL(2, 0, 2),
-	SLE_CONDNULL(4, 3, 84),
-
-	    SLE_VAR(Town, num_houses,            SLE_UINT16),
+	SLE_CONDNULL(2, 0, 2),                   ///< population, no longer in use
+	SLE_CONDNULL(4, 3, 84),                  ///< population, no longer in use
+	SLE_CONDNULL(2, 0, 91),                  ///< num_houses, no longer in use
+
 	SLE_CONDVAR(Town, townnamegrfid,         SLE_UINT32, 66, SL_MAX_VERSION),
 	    SLE_VAR(Town, townnametype,          SLE_UINT16),
 	    SLE_VAR(Town, townnameparts,         SLE_UINT32),
@@ -2576,13 +2581,12 @@
 	    SLE_VAR(Town, flags12,               SLE_UINT8),
 	    SLE_VAR(Town, statues,               SLE_UINT8),
 
-	/* sort_index_obsolete was stored here in savegame format 0 - 1 */
-	SLE_CONDNULL(1, 0, 1),
+	SLE_CONDNULL(1, 0, 1),                   ///< sort_index, no longer in use
 
 	    SLE_VAR(Town, have_ratings,          SLE_UINT8),
 	    SLE_ARR(Town, ratings,               SLE_INT16, 8),
 	/* failed bribe attempts are stored since savegame format 4 */
-	SLE_CONDARR(Town, unwanted,              SLE_INT8, 8, 4,SL_MAX_VERSION),
+	SLE_CONDARR(Town, unwanted,              SLE_INT8, 8, 4, SL_MAX_VERSION),
 
 	SLE_CONDVAR(Town, max_pass,              SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
 	SLE_CONDVAR(Town, max_mail,              SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
@@ -2695,11 +2699,10 @@
 
 void AfterLoadTown()
 {
+	_town_sort_dirty = true;
+
 	Town *t;
-	FOR_ALL_TOWNS(t) {
-		UpdateTownRadius(t);
-	}
-	_town_sort_dirty = true;
+	FOR_ALL_TOWNS(t) t->InitializeLayout();
 }
 
 extern const ChunkHandler _town_chunk_handlers[] = {
--- a/src/town_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/town_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -18,6 +18,7 @@
 #include "network/network.h"
 #include "variables.h"
 #include "strings_func.h"
+#include "sound_func.h"
 #include "economy_func.h"
 #include "core/alloc_func.hpp"
 #include "settings_type.h"
@@ -25,6 +26,9 @@
 #include "table/sprites.h"
 #include "table/strings.h"
 
+extern bool GenerateTowns();
+static int _scengen_town_size = 1; // depress medium-sized towns per default
+
 enum TownAuthorityWidget {
 	TWA_CLOSEBOX = 0,
 	TWA_CAPTION,
@@ -275,6 +279,10 @@
 	Town *t = GetTown(w->window_number);
 
 	switch (e->event) {
+	case WE_CREATE:
+		if (t->larger_town) w->widget[1].data = STR_CITY;
+		break;
+
 	case WE_PAINT:
 		/* disable renaming town in network games if you are not the server */
 		w->SetWidgetDisabledState(8, _networking && !_network_server);
@@ -567,3 +575,117 @@
 		w->resize.height = w->height - 10 * 6; // minimum of 10 items in the list, each item 10 high
 	}
 }
+
+void CcBuildTown(bool success, TileIndex tile, uint32 p1, uint32 p2)
+{
+	if (success) {
+		SndPlayTileFx(SND_1F_SPLAT, tile);
+		ResetObjectToPlace();
+	}
+}
+
+static void PlaceProc_Town(TileIndex tile)
+{
+	uint32 size = min(_scengen_town_size, (int)TSM_CITY);
+	uint32 mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
+	DoCommandP(tile, size, mode, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
+}
+
+static const Widget _scen_edit_town_gen_widgets[] = {
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                 STR_018B_CLOSE_WINDOW},
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_0233_TOWN_GENERATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{  WWT_STICKYBOX,   RESIZE_NONE,     7,   148,   159,     0,    13, 0x0,                      STR_STICKY_BUTTON},
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   159,    14,    94, 0x0,                      STR_NULL},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    16,    27, STR_0234_NEW_TOWN,        STR_0235_CONSTRUCT_NEW_TOWN},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    29,    40, STR_023D_RANDOM_TOWN,     STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    42,    53, STR_MANY_RANDOM_TOWNS,    STR_RANDOM_TOWNS_TIP},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,    53,    68,    79, STR_02A1_SMALL,           STR_02A4_SELECT_TOWN_SIZE},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,    54,   105,    68,    79, STR_02A2_MEDIUM,          STR_02A4_SELECT_TOWN_SIZE},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,   106,   157,    68,    79, STR_02A3_LARGE,           STR_02A4_SELECT_TOWN_SIZE},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    81,    92, STR_SCENARIO_EDITOR_CITY, STR_02A4_SELECT_TOWN_SIZE},
+{      WWT_LABEL,   RESIZE_NONE,     7,     0,   147,    54,    67, STR_02A5_TOWN_SIZE,       STR_NULL},
+{   WIDGETS_END},
+};
+
+static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
+{
+	switch (e->event) {
+	case WE_PAINT:
+		DrawWindowWidgets(w);
+		break;
+
+	case WE_CREATE:
+		w->LowerWidget(_scengen_town_size + 7);
+		break;
+
+	case WE_CLICK:
+		switch (e->we.click.widget) {
+		case 4: // new town
+			HandlePlacePushButton(w, 4, SPR_CURSOR_TOWN, VHM_RECT, PlaceProc_Town);
+			break;
+		case 5: {// random town
+			Town *t;
+			uint size = min(_scengen_town_size, (int)TSM_CITY);
+			TownSizeMode mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
+
+			w->HandleButtonClick(5);
+			_generating_world = true;
+			t = CreateRandomTown(20, mode, size);
+			_generating_world = false;
+
+			if (t == NULL) {
+				ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
+			} else {
+				ScrollMainWindowToTile(t->xy);
+			}
+
+			break;
+		}
+		case 6: {// many random towns
+			w->HandleButtonClick(6);
+
+			_generating_world = true;
+			if (!GenerateTowns()) ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
+			_generating_world = false;
+			break;
+		}
+
+		case 7: case 8: case 9: case 10:
+			w->RaiseWidget(_scengen_town_size + 7);
+			_scengen_town_size = e->we.click.widget - 7;
+			w->LowerWidget(_scengen_town_size + 7);
+			SetWindowDirty(w);
+			break;
+		}
+		break;
+
+	case WE_TIMEOUT:
+		w->RaiseWidget(5);
+		w->RaiseWidget(6);
+		SetWindowDirty(w);
+		break;
+	case WE_PLACE_OBJ:
+		_place_proc(e->we.place.tile);
+		break;
+	case WE_ABORT_PLACE_OBJ:
+		w->RaiseButtons();
+		w->LowerWidget(_scengen_town_size + 7);
+		SetWindowDirty(w);
+		break;
+	}
+}
+
+static const WindowDesc _scen_edit_town_gen_desc = {
+	WDP_AUTO, WDP_AUTO, 160, 95, 160, 95,
+	WC_SCEN_TOWN_GEN, WC_NONE,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
+	_scen_edit_town_gen_widgets,
+	ScenEditTownGenWndProc,
+};
+
+void ShowBuildTownWindow()
+{
+	if (_game_mode != GM_EDITOR && !IsValidPlayer(_current_player)) return;
+	AllocateWindowDescFront(&_scen_edit_town_gen_desc, 0);
+}
+
--- a/src/town_type.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/town_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -35,12 +35,19 @@
 
 	RATING_MAXIMUM = RATING_OUTSTANDING,
 
+	RATING_INITIAL = 500, ///< initial rating
+
 	/* RATINGS AFFECTING NUMBERS */
 	RATING_TREE_DOWN_STEP = -35,
 	RATING_TREE_MINIMUM   = RATING_MINIMUM,
 	RATING_TREE_UP_STEP   = 7,
 	RATING_TREE_MAXIMUM   = 220,
 
+	RATING_GROWTH_UP_STEP    =   5, ///< when a town grows, all players have rating increased a bit ...
+	RATING_GROWTH_MAXIMUM    = RATING_MEDIOCRE, ///< ... up to RATING_MEDIOCRE
+	RATING_STATION_UP_STEP   =  12, ///< when a town grows, player gains reputation for all well serviced stations ...
+	RATING_STATION_DOWN_STEP = -15, ///< ... but loses for bad serviced stations
+
 	RATING_TUNNEL_BRIDGE_DOWN_STEP = -250,
 	RATING_TUNNEL_BRIDGE_MINIMUM   = 0,
 
@@ -66,6 +73,8 @@
 	TL_2X2_GRID,         ///< Geometric 2x2 grid algorithm
 	TL_3X3_GRID,         ///< Geometric 3x3 grid algorithm
 
+	TL_RANDOM,           ///< Random town layout
+
 	NUM_TLS,             ///< Number of town layouts
 };
 
--- a/src/train.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/train.h	Tue Apr 15 00:47:19 2008 +0000
@@ -10,12 +10,10 @@
 #include "vehicle_base.h"
 
 
-/*
- * enum to handle train subtypes
+/** enum to handle train subtypes
  * Do not access it directly unless you have to. Use the access functions below
  * This is an enum to tell what bit to access as it is a bitmask
  */
-
 enum TrainSubtype {
 	TS_FRONT             = 0, ///< Leading engine of a train
 	TS_ARTICULATED_PART  = 1, ///< Articulated part of an engine
@@ -274,6 +272,7 @@
 
 int CheckTrainInDepot(const Vehicle *v, bool needs_to_be_stopped);
 int CheckTrainStoppedInDepot(const Vehicle *v);
+void UpdateTrainAcceleration(Vehicle* v);
 
 /**
  * This class 'wraps' Vehicle; you do not actually instantiate this class.
@@ -305,6 +304,7 @@
 	bool IsStoppedInDepot() const { return CheckTrainStoppedInDepot(this) >= 0; }
 	void Tick();
 	void OnNewDay();
+	TileIndex GetOrderStationLocation(StationID station);
 };
 
 #endif /* TRAIN_H */
--- a/src/train_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/train_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -11,14 +11,13 @@
 #include "gui.h"
 #include "station_map.h"
 #include "tunnel_map.h"
-#include "timetable.h"
 #include "articulated_vehicles.h"
 #include "command_func.h"
 #include "pathfind.h"
 #include "npf.h"
-#include "station.h"
-#include "news.h"
-#include "engine.h"
+#include "station_base.h"
+#include "news_func.h"
+#include "engine_func.h"
 #include "player_func.h"
 #include "player_base.h"
 #include "depot.h"
@@ -47,12 +46,13 @@
 #include "autoreplace_gui.h"
 #include "gfx_func.h"
 #include "settings_type.h"
+#include "order_func.h"
 
 #include "table/strings.h"
 #include "table/train_cmd.h"
 
 static bool TrainCheckIfLineEnds(Vehicle *v);
-static void TrainController(Vehicle *v, bool update_image);
+static void TrainController(Vehicle *v, Vehicle *nomove, bool update_image);
 static TileIndex TrainApproachingCrossingTile(const Vehicle *v);
 
 static const byte _vehicle_initial_x_fract[4] = {10, 8, 4,  8};
@@ -96,7 +96,7 @@
  * Recalculates the cached total power of a train. Should be called when the consist is changed
  * @param v First vehicle of the consist.
  */
-void TrainPowerChanged(Vehicle* v)
+void TrainPowerChanged(Vehicle *v)
 {
 	uint32 total_power = 0;
 	uint32 max_te = 0;
@@ -142,7 +142,7 @@
  * the consist changes.
  * @param v First vehicle of the consist.
  */
-static void TrainCargoChanged(Vehicle* v)
+static void TrainCargoChanged(Vehicle *v)
 {
 	uint32 weight = 0;
 
@@ -180,9 +180,9 @@
  * Note: this needs to be called too for 'wagon chains' (in the depot, without an engine)
  * @param v First vehicle of the chain.
  */
-void TrainConsistChanged(Vehicle* v)
+void TrainConsistChanged(Vehicle *v)
 {
-	uint16 max_speed = 0xFFFF;
+	uint16 max_speed = UINT16_MAX;
 
 	assert(v->type == VEH_TRAIN);
 	assert(IsFrontEngine(v) || IsFreeWagon(v));
@@ -214,6 +214,9 @@
 		/* Reset color map */
 		u->colormap = PAL_NONE;
 
+		/* Set user defined data (must be done before other properties) */
+		u->u.rail.user_def_data = GetVehicleProperty(u, 0x25, rvi_u->user_def_data);
+
 		if (rvi_u->visual_effect != 0) {
 			u->u.rail.cached_vis_effect = rvi_u->visual_effect;
 		} else {
@@ -270,8 +273,6 @@
 			u->cargo_cap = GetVehicleProperty(u, 0x14, rvi_u->capacity);
 		}
 
-		u->u.rail.user_def_data = GetVehicleProperty(u, 0x25, rvi_u->user_def_data);
-
 		/* check the vehicle length (callback) */
 		uint16 veh_len = CALLBACK_FAILED;
 		if (HasBit(EngInfo(u->engine_type)->callbackmask, CBM_VEHICLE_LENGTH)) {
@@ -289,6 +290,11 @@
 
 	/* recalculate cached weights and power too (we do this *after* the rest, so it is known which wagons are powered and need extra weight added) */
 	TrainCargoChanged(v);
+
+	if (IsFrontEngine(v)) {
+		UpdateTrainAcceleration(v);
+		InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
+	}
 }
 
 enum AccelType {
@@ -296,31 +302,10 @@
 	AM_BRAKE
 };
 
-static bool TrainShouldStop(const Vehicle* v, TileIndex tile)
-{
-	const Order* o = &v->current_order;
-	StationID sid = GetStationIndex(tile);
-
-	assert(v->type == VEH_TRAIN);
-	/* When does a train drive through a station
-	 * first we deal with the "new nonstop handling" */
-	if (_patches.new_nonstop && o->flags & OFB_NON_STOP && sid == o->dest) {
-		return false;
-	}
-
-	if (v->last_station_visited == sid) return false;
-
-	if (sid != o->dest && (o->flags & OFB_NON_STOP || _patches.new_nonstop)) {
-		return false;
-	}
-
-	return true;
-}
-
 /** new acceleration*/
 static int GetTrainAcceleration(Vehicle *v, bool mode)
 {
-	static const int absolute_max_speed = 2000;
+	static const int absolute_max_speed = UINT16_MAX;
 	int max_speed = absolute_max_speed;
 	int speed = v->cur_speed * 10 / 16; // km-ish/h -> mp/h
 	int curvecount[2] = {0, 0};
@@ -379,7 +364,7 @@
 	}
 
 	if (IsTileType(v->tile, MP_STATION) && IsFrontEngine(v)) {
-		if (TrainShouldStop(v, v->tile)) {
+		if (v->current_order.ShouldStopAtStation(v, GetStationIndex(v->tile))) {
 			int station_length = GetStationByTile(v->tile)->GetPlatformLength(v->tile, DirToDiagDir(v->direction));
 
 			int st_max_speed = 120;
@@ -467,7 +452,7 @@
 	}
 }
 
-static void UpdateTrainAcceleration(Vehicle* v)
+void UpdateTrainAcceleration(Vehicle *v)
 {
 	assert(IsFrontEngine(v));
 
@@ -542,6 +527,9 @@
 	uint num_vehicles = 1 + CountArticulatedParts(engine, false);
 
 	if (!(flags & DC_QUERY_COST)) {
+		/* Check that the wagon can drive on the track in question */
+		if (!IsCompatibleRail(rvi->railtype, GetRailType(tile))) return CMD_ERROR;
+
 		/* Allow for the wagon and the articulated parts, plus one to "terminate" the list. */
 		Vehicle **vl = (Vehicle**)alloca(sizeof(*vl) * (num_vehicles + 1));
 		memset(vl, 0, sizeof(*vl) * (num_vehicles + 1));
@@ -583,7 +571,7 @@
 			v->u.rail.track = TRACK_BIT_DEPOT;
 			v->vehstatus = VS_HIDDEN | VS_DEFPAL;
 
-			v->subtype = 0;
+//			v->subtype = 0;
 			SetTrainWagon(v);
 
 			if (u != NULL) {
@@ -594,7 +582,7 @@
 			}
 
 			v->cargo_type = rvi->cargo_type;
-			v->cargo_subtype = 0;
+//			v->cargo_subtype = 0;
 			v->cargo_cap = rvi->capacity;
 			v->value = value.GetCost();
 //			v->day_counter = 0;
@@ -627,9 +615,9 @@
 }
 
 /** Move all free vehicles in the depot to the train */
-static void NormalizeTrainVehInDepot(const Vehicle* u)
+static void NormalizeTrainVehInDepot(const Vehicle *u)
 {
-	const Vehicle* v;
+	const Vehicle *v;
 
 	FOR_ALL_VEHICLES(v) {
 		if (v->type == VEH_TRAIN && IsFreeWagon(v) &&
@@ -642,12 +630,12 @@
 	}
 }
 
-static CommandCost EstimateTrainCost(EngineID engine, const RailVehicleInfo* rvi)
+static CommandCost EstimateTrainCost(EngineID engine, const RailVehicleInfo *rvi)
 {
 	return CommandCost(EXPENSES_NEW_VEHICLES, GetEngineProperty(engine, 0x17, rvi->base_cost) * (_price.build_railvehicle >> 3) >> 5);
 }
 
-static void AddRearEngineToMultiheadedTrain(Vehicle* v, Vehicle* u, bool building)
+static void AddRearEngineToMultiheadedTrain(Vehicle *v, Vehicle *u, bool building)
 {
 	u = new (u) Train();
 	u->direction = v->direction;
@@ -658,7 +646,7 @@
 	u->z_pos = v->z_pos;
 	u->u.rail.track = TRACK_BIT_DEPOT;
 	u->vehstatus = v->vehstatus & ~VS_STOPPED;
-	u->subtype = 0;
+//	u->subtype = 0;
 	SetMultiheaded(u);
 	u->spritenum = v->spritenum + 1;
 	u->cargo_type = v->cargo_type;
@@ -696,10 +684,6 @@
 
 	const RailVehicleInfo *rvi = RailVehInfo(p1);
 
-	/* Check if depot and new engine uses the same kind of tracks */
-	/* We need to see if the engine got power on the tile to avoid eletric engines in non-electric depots */
-	if (!HasPowerOnRail(rvi->railtype, GetRailType(tile))) return CMD_ERROR;
-
 	if (rvi->railveh_type == RAILVEH_WAGON) return CmdBuildRailWagon(p1, tile, flags);
 
 	CommandCost value = EstimateTrainCost(p1, rvi);
@@ -709,12 +693,17 @@
 		CountArticulatedParts(p1, false);
 
 	if (!(flags & DC_QUERY_COST)) {
+		/* Check if depot and new engine uses the same kind of tracks *
+		 * We need to see if the engine got power on the tile to avoid eletric engines in non-electric depots */
+		if (!HasPowerOnRail(rvi->railtype, GetRailType(tile))) return CMD_ERROR;
+
 		/* Allow for the dual-heads and the articulated parts, plus one to "terminate" the list. */
 		Vehicle **vl = (Vehicle**)alloca(sizeof(*vl) * (num_vehicles + 1));
 		memset(vl, 0, sizeof(*vl) * (num_vehicles + 1));
 
-		if (!Vehicle::AllocateList(vl, num_vehicles))
+		if (!Vehicle::AllocateList(vl, num_vehicles)) {
 			return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
+		}
 
 		Vehicle *v = vl[0];
 
@@ -735,17 +724,17 @@
 			v->x_pos = x;
 			v->y_pos = y;
 			v->z_pos = GetSlopeZ(x, y);
-			v->running_ticks = 0;
+//			v->running_ticks = 0;
 			v->u.rail.track = TRACK_BIT_DEPOT;
 			v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
 			v->spritenum = rvi->image_index;
 			v->cargo_type = rvi->cargo_type;
-			v->cargo_subtype = 0;
+//			v->cargo_subtype = 0;
 			v->cargo_cap = rvi->capacity;
 			v->max_speed = rvi->max_speed;
 			v->value = value.GetCost();
 			v->last_station_visited = INVALID_STATION;
-			v->dest_tile = 0;
+//			v->dest_tile = 0;
 
 			v->engine_type = p1;
 
@@ -764,12 +753,12 @@
 			v->cur_image = 0xAC2;
 			v->random_bits = VehicleRandomBits();
 
-			v->vehicle_flags = 0;
+//			v->vehicle_flags = 0;
 			if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
 
 			v->group_id = DEFAULT_GROUP;
 
-			v->subtype = 0;
+//			v->subtype = 0;
 			SetFrontEngine(v);
 			SetTrainEngine(v);
 
@@ -789,7 +778,6 @@
 			}
 
 			TrainConsistChanged(v);
-			UpdateTrainAcceleration(v);
 			UpdateTrainGroupID(v);
 
 			if (!HasBit(p2, 1)) { // check if the cars should be added to the new vehicle
@@ -799,8 +787,9 @@
 			InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
 			RebuildVehicleLists();
 			InvalidateWindow(WC_COMPANY, v->owner);
-			if (IsLocalPlayer())
+			if (IsLocalPlayer()) {
 				InvalidateAutoreplaceWindow(v->engine_type, v->group_id); // updates the replace Train window
+			}
 
 			GetPlayer(_current_player)->num_engines[p1]++;
 		}
@@ -1183,12 +1172,12 @@
 					assert(src->orders == NULL);
 					src->num_orders = 0;
 
-					// Decrease the engines number of the src engine_type
+					/* Decrease the engines number of the src engine_type */
 					if (!IsDefaultGroupID(src->group_id) && IsValidGroupID(src->group_id)) {
 						GetGroup(src->group_id)->num_engines[src->engine_type]--;
 					}
 
-					// If we move an engine to a new line affect it to the DEFAULT_GROUP
+					/* If we move an engine to a new line affect it to the DEFAULT_GROUP */
 					src->group_id = DEFAULT_GROUP;
 				}
 			} else {
@@ -1214,7 +1203,7 @@
 			{
 				Vehicle *v;
 
-				for (v = src; GetNextVehicle(v) != NULL; v = GetNextVehicle(v));
+				for (v = src; GetNextVehicle(v) != NULL; v = GetNextVehicle(v)) {}
 				GetLastEnginePart(v)->SetNext(dst->Next());
 			}
 			dst->SetNext(src);
@@ -1244,8 +1233,6 @@
 			TrainConsistChanged(src_head);
 			UpdateTrainGroupID(src_head);
 			if (IsFrontEngine(src_head)) {
-				UpdateTrainAcceleration(src_head);
-				InvalidateWindow(WC_VEHICLE_DETAILS, src_head->index);
 				/* Update the refit button and window */
 				InvalidateWindow(WC_VEHICLE_REFIT, src_head->index);
 				InvalidateWindowWidget(WC_VEHICLE_VIEW, src_head->index, VVW_WIDGET_REFIT_VEH);
@@ -1259,8 +1246,6 @@
 			TrainConsistChanged(dst_head);
 			UpdateTrainGroupID(dst_head);
 			if (IsFrontEngine(dst_head)) {
-				UpdateTrainAcceleration(dst_head);
-				InvalidateWindow(WC_VEHICLE_DETAILS, dst_head->index);
 				/* Update the refit button and window */
 				InvalidateWindowWidget(WC_VEHICLE_VIEW, dst_head->index, VVW_WIDGET_REFIT_VEH);
 				InvalidateWindow(WC_VEHICLE_REFIT, dst_head->index);
@@ -1425,7 +1410,7 @@
 				delete v;
 
 				/* 4 If the second wagon was an engine, update it to front_engine
-					* which UnlinkWagon() has changed to TS_Free_Car */
+				 * which UnlinkWagon() has changed to TS_Free_Car */
 				if (switch_engine) SetFrontEngine(first);
 
 				/* 5. If the train still exists, update its acceleration, window, etc. */
@@ -1433,11 +1418,7 @@
 					NormaliseTrainConsist(first);
 					TrainConsistChanged(first);
 					UpdateTrainGroupID(first);
-					if (IsFrontEngine(first)) {
-						InvalidateWindow(WC_VEHICLE_DETAILS, first->index);
-						InvalidateWindow(WC_VEHICLE_REFIT, first->index);
-						UpdateTrainAcceleration(first);
-					}
+					if (IsFrontEngine(first)) InvalidateWindow(WC_VEHICLE_REFIT, first->index);
 				}
 
 
@@ -1446,10 +1427,10 @@
 				 * Totally braindead cause building a new engine adds all loco-less
 				 * engines to its train anyways */
 				if (p2 == 2 && HasBit(ori_subtype, TS_FRONT)) {
-					Vehicle *tmp;
-					for (v = first; v != NULL; v = tmp) {
-						tmp = GetNextVehicle(v);
+					for (v = first; v != NULL;) {
+						Vehicle *tmp = GetNextVehicle(v);
 						DoCommand(v->tile, v->index | INVALID_VEHICLE << 16, 0, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
+						v = tmp;
 					}
 				}
 			}
@@ -1458,8 +1439,7 @@
 			/* Start deleting every vehicle after the selected one
 			 * If we encounter a matching rear-engine to a front-engine
 			 * earlier in the chain (before deletion), leave it alone */
-			Vehicle *tmp;
-			for (; v != NULL; v = tmp) {
+			for (Vehicle *tmp; v != NULL; v = tmp) {
 				tmp = GetNextVehicle(v);
 
 				if (IsMultiheaded(v)) {
@@ -1503,8 +1483,6 @@
 				NormaliseTrainConsist(first);
 				TrainConsistChanged(first);
 				UpdateTrainGroupID(first);
-				if (IsFrontEngine(first)) UpdateTrainAcceleration(first);
-				InvalidateWindow(WC_VEHICLE_DETAILS, first->index);
 				InvalidateWindow(WC_VEHICLE_REFIT, first->index);
 			}
 		} break;
@@ -1530,9 +1508,9 @@
 	uint32 x = _delta_xy_table[direction];
 	this->x_offs        = GB(x,  0, 8);
 	this->y_offs        = GB(x,  8, 8);
-	this->sprite_width  = GB(x, 16, 8);
-	this->sprite_height = GB(x, 24, 8);
-	this->z_height      = 6;
+	this->x_extent      = GB(x, 16, 8);
+	this->y_extent      = GB(x, 24, 8);
+	this->z_extent      = 6;
 }
 
 static void UpdateVarsAfterSwap(Vehicle *v)
@@ -1544,13 +1522,14 @@
 	EndVehicleMove(v);
 }
 
-static inline void SetLastSpeed(Vehicle* v, int spd)
+static inline void SetLastSpeed(Vehicle *v, int spd)
 {
 	int old = v->u.rail.last_speed;
 	if (spd != old) {
 		v->u.rail.last_speed = spd;
-		if (_patches.vehicle_speed || (old == 0) != (spd == 0))
+		if (_patches.vehicle_speed || (old == 0) != (spd == 0)) {
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
+		}
 	}
 }
 
@@ -1670,14 +1649,14 @@
 	DiagDirection dir = AxisToDiagDir(GetCrossingRailAxis(tile));
 	TileIndex tile_from = tile + TileOffsByDiagDir(dir);
 
-	Vehicle *v = (Vehicle *)VehicleFromPos(tile_from, &tile, &TrainApproachingCrossingEnum);
+	Vehicle *v = (Vehicle*)VehicleFromPos(tile_from, &tile, &TrainApproachingCrossingEnum);
 
 	if (v != NULL) return v;
 
 	dir = ReverseDiagDir(dir);
 	tile_from = tile + TileOffsByDiagDir(dir);
 
-	return (Vehicle *)VehicleFromPos(tile_from, &tile, &TrainApproachingCrossingEnum);
+	return (Vehicle*)VehicleFromPos(tile_from, &tile, &TrainApproachingCrossingEnum);
 }
 
 
@@ -1721,39 +1700,86 @@
 
 /**
  * Advances wagons for train reversing, needed for variable length wagons.
- * Needs to be called once before the train is reversed, and once after it.
+ * This one is called before the train is reversed.
  * @param v First vehicle in chain
- * @param before Set to true for the call before reversing, false otherwise
  */
-static void AdvanceWagons(Vehicle *v, bool before)
+static void AdvanceWagonsBeforeSwap(Vehicle *v)
 {
 	Vehicle *base = v;
-	Vehicle *first = base->Next();
+	Vehicle *first = base;                    // first vehicle to move
+	Vehicle *last = GetLastVehicleInChain(v); // last vehicle to move
 	uint length = CountVehiclesInChain(v);
 
 	while (length > 2) {
-		/* find pairwise matching wagon
-		 * start<>end, start+1<>end-1, ... */
-		Vehicle *last = first;
-		for (uint i = length - 3; i > 0; i--) last = last->Next();
+		last = last->Previous();
+		first = first->Next();
+
+		int differential = base->u.rail.cached_veh_length - last->u.rail.cached_veh_length;
+
+		/* do not update images now
+		 * negative differential will be handled in AdvanceWagonsAfterSwap() */
+		for (int i = 0; i < differential; i++) TrainController(first, last->Next(), false);
+
+		base = first; // == base->Next()
+		length -= 2;
+	}
+}
+
+
+/**
+ * Advances wagons for train reversing, needed for variable length wagons.
+ * This one is called after the train is reversed.
+ * @param v First vehicle in chain
+ */
+static void AdvanceWagonsAfterSwap(Vehicle *v)
+{
+	/* first of all, fix the situation when the train was entering a depot */
+	Vehicle *dep = v; // last vehicle in front of just left depot
+	while (dep->Next() != NULL && (dep->u.rail.track == TRACK_BIT_DEPOT || dep->Next()->u.rail.track != TRACK_BIT_DEPOT)) {
+		dep = dep->Next(); // find first vehicle outside of a depot, with next vehicle inside a depot
+	}
+
+	Vehicle *leave = dep->Next(); // first vehicle in a depot we are leaving now
+
+	if (leave != NULL) {
+		/* 'pull' next wagon out of the depot, so we won't miss it (it could stay in depot forever) */
+		int d = TicksToLeaveDepot(dep);
+
+		if (d <= 0) {
+			leave->vehstatus &= ~VS_HIDDEN; // move it out of the depot
+			leave->u.rail.track = AxisToTrackBits(DiagDirToAxis(GetRailDepotDirection(leave->tile)));
+			for (int i = 0; i >= d; i--) TrainController(leave, NULL, false); // maybe move it, and maybe let another wagon leave
+		}
+	} else {
+		dep = NULL; // no vehicle in a depot, so no vehicle leaving a depot
+	}
+
+	Vehicle *base = v;
+	Vehicle *first = base;                    // first vehicle to move
+	Vehicle *last = GetLastVehicleInChain(v); // last vehicle to move
+	uint length = CountVehiclesInChain(v);
+
+	/* we have to make sure all wagons that leave a depot because of train reversing are moved coorectly
+	 * they have already correct spacing, so we have to make sure they are moved how they should */
+	bool nomove = (dep == NULL); // if there is no vehicle leaving a depot, limit the number of wagons moved immediatelly
+
+	while (length > 2) {
+		/* we reached vehicle (originally) in front of a depot, stop now
+		 * (we would move wagons that are alredy moved with new wagon length) */
+		if (base == dep) break;
+
+		/* the last wagon was that one leaving a depot, so do not move it anymore */
+		if (last == dep) nomove = true;
+
+		last = last->Previous();
+		first = first->Next();
 
 		int differential = last->u.rail.cached_veh_length - base->u.rail.cached_veh_length;
-		if (before) differential *= -1;
-
-		if (differential > 0) {
-			/* disconnect last car to make sure only this subset moves */
-			Vehicle *tempnext = last->Next();
-			last->SetNext(NULL);
-
-			/* do not update images now because the wagons are disconnected
-			 * and that could cause problems with NewGRFs */
-			for (int i = 0; i < differential; i++) TrainController(first, false);
-
-			last->SetNext(tempnext);
-		}
-
-		base = first;
-		first = first->Next();
+
+		/* do not update images now */
+		for (int i = 0; i < differential; i++) TrainController(first, (nomove ? last->Next() : NULL), false);
+
+		base = first; // == base->Next()
 		length -= 2;
 	}
 }
@@ -1769,10 +1795,9 @@
 	TileIndex crossing = TrainApproachingCrossingTile(v);
 
 	/* count number of vehicles */
-	int r = 0;  ///< number of vehicles - 1
-	for (const Vehicle *u = v; (u = u->Next()) != NULL;) { r++; }
-
-	AdvanceWagons(v, true);
+	int r = CountVehiclesInChain(v) - 1;  // number of vehicles - 1
+
+	AdvanceWagonsBeforeSwap(v);
 
 	/* swap start<>end, start+1<>end-1, ... */
 	int l = 0;
@@ -1780,7 +1805,7 @@
 		ReverseTrainSwapVeh(v, l++, r--);
 	} while (l <= r);
 
-	AdvanceWagons(v, false);
+	AdvanceWagonsAfterSwap(v);
 
 	if (IsTileDepotType(v->tile, TRANSPORT_RAIL)) {
 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
@@ -1819,7 +1844,7 @@
 
 	if (v->type != VEH_TRAIN || !CheckOwnership(v->owner)) return CMD_ERROR;
 
-	if (p2) {
+	if (p2 != 0) {
 		/* turn a single unit around */
 
 		if (IsMultiheaded(v) || HasBit(EngInfo(v->engine_type)->callbackmask, CBM_VEHICLE_ARTIC_ENGINE)) {
@@ -2024,7 +2049,7 @@
 		} break;
 
 		case VPF_NPF: { /* NPF */
-			Vehicle* last = GetLastVehicleInChain(v);
+			const Vehicle *last = GetLastVehicleInChain(v);
 			Trackdir trackdir = GetVehicleTrackdir(v);
 			Trackdir trackdir_rev = ReverseTrackdir(GetVehicleTrackdir(last));
 
@@ -2034,9 +2059,9 @@
 				/* Found target */
 				tfdd.tile = ftd.node.tile;
 				/* Our caller expects a number of tiles, so we just approximate that
-				* number by this. It might not be completely what we want, but it will
-				* work for now :-) We can possibly change this when the old pathfinder
-				* is removed. */
+				 * number by this. It might not be completely what we want, but it will
+				 * work for now :-) We can possibly change this when the old pathfinder
+				 * is removed. */
 				tfdd.best_length = ftd.best_path_dist / NPF_TILE_LENGTH;
 				if (NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE)) tfdd.reverse = true;
 			}
@@ -2083,14 +2108,15 @@
 
 	if (v->vehstatus & VS_CRASHED) return CMD_ERROR;
 
-	if (v->current_order.type == OT_GOTO_DEPOT) {
-		if (!!(p2 & DEPOT_SERVICE) == HasBit(v->current_order.flags, OF_HALT_IN_DEPOT)) {
+	if (v->current_order.IsType(OT_GOTO_DEPOT)) {
+		bool halt_in_depot = v->current_order.GetDepotActionType() & ODATFB_HALT;
+		if (!!(p2 & DEPOT_SERVICE) == halt_in_depot) {
 			/* We called with a different DEPOT_SERVICE setting.
 			 * Now we change the setting to apply the new one and let the vehicle head for the same depot.
 			 * Note: the if is (true for requesting service == true for ordered to stop in depot)          */
 			if (flags & DC_EXEC) {
-				ClrBit(v->current_order.flags, OF_PART_OF_ORDERS);
-				ToggleBit(v->current_order.flags, OF_HALT_IN_DEPOT);
+				v->current_order.SetDepotOrderType(ODTF_MANUAL);
+				v->current_order.SetDepotActionType(halt_in_depot ? ODATF_SERVICE_ONLY : ODATFB_HALT);
 				InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 			}
 			return CommandCost();
@@ -2098,12 +2124,11 @@
 
 		if (p2 & DEPOT_DONT_CANCEL) return CMD_ERROR; // Requested no cancelation of depot orders
 		if (flags & DC_EXEC) {
-			if (HasBit(v->current_order.flags, OF_PART_OF_ORDERS)) {
-				v->cur_order_index++;
-			}
-
-			v->current_order.type = OT_DUMMY;
-			v->current_order.flags = 0;
+			/* If the orders to 'goto depot' are in the orders list (forced servicing),
+			 * then skip to the next order; effectively cancelling this forced service */
+			if (v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) v->cur_order_index++;
+
+			v->current_order.MakeDummy();
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 		}
 		return CommandCost();
@@ -2117,14 +2142,11 @@
 	if (tfdd.best_length == (uint)-1) return_cmd_error(STR_883A_UNABLE_TO_FIND_ROUTE_TO);
 
 	if (flags & DC_EXEC) {
-		if (v->current_order.type == OT_LOADING) v->LeaveStation();
+		if (v->current_order.IsType(OT_LOADING)) v->LeaveStation();
 
 		v->dest_tile = tfdd.tile;
-		v->current_order.type = OT_GOTO_DEPOT;
-		v->current_order.flags = OFB_NON_STOP;
-		if (!(p2 & DEPOT_SERVICE)) SetBit(v->current_order.flags, OF_HALT_IN_DEPOT);
-		v->current_order.dest = GetDepotByTile(tfdd.tile)->index;
-		v->current_order.refit_cargo = CT_INVALID;
+		v->current_order.MakeGoToDepot(GetDepotByTile(tfdd.tile)->index, ODTF_MANUAL);
+		if (!(p2 & DEPOT_SERVICE)) v->current_order.SetDepotActionType(ODATFB_HALT);
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 		/* If there is no depot in front, reverse automatically */
 		if (tfdd.reverse) DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_REVERSE_TRAIN_DIRECTION);
@@ -2143,14 +2165,15 @@
 	1, 1, 1, 0, -1, -1, -1, 0
 };
 
-static void HandleLocomotiveSmokeCloud(const Vehicle* v)
+static void HandleLocomotiveSmokeCloud(const Vehicle *v)
 {
 	bool sound = false;
 
-	if (v->vehstatus & VS_TRAIN_SLOWING || v->load_unload_time_rem != 0 || v->cur_speed < 2)
+	if (v->vehstatus & VS_TRAIN_SLOWING || v->load_unload_time_rem != 0 || v->cur_speed < 2) {
 		return;
-
-	const Vehicle* u = v;
+	}
+
+	const Vehicle *u = v;
 
 	do {
 		const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
@@ -2187,29 +2210,32 @@
 		}
 
 		switch (effect_type) {
-		case 0:
-			/* steam smoke. */
-			if (GB(v->tick_counter, 0, 4) == 0) {
-				CreateEffectVehicleRel(v, x, y, 10, EV_STEAM_SMOKE);
-				sound = true;
-			}
-			break;
-
-		case 1:
-			/* diesel smoke */
-			if (u->cur_speed <= 40 && Chance16(15, 128)) {
-				CreateEffectVehicleRel(v, 0, 0, 10, EV_DIESEL_SMOKE);
-				sound = true;
-			}
-			break;
-
-		case 2:
-			/* blue spark */
-			if (GB(v->tick_counter, 0, 2) == 0 && Chance16(1, 45)) {
-				CreateEffectVehicleRel(v, 0, 0, 10, EV_ELECTRIC_SPARK);
-				sound = true;
-			}
-			break;
+			case 0:
+				/* steam smoke. */
+				if (GB(v->tick_counter, 0, 4) == 0) {
+					CreateEffectVehicleRel(v, x, y, 10, EV_STEAM_SMOKE);
+					sound = true;
+				}
+				break;
+
+			case 1:
+				/* diesel smoke */
+				if (u->cur_speed <= 40 && Chance16(15, 128)) {
+					CreateEffectVehicleRel(v, 0, 0, 10, EV_DIESEL_SMOKE);
+					sound = true;
+				}
+				break;
+
+			case 2:
+				/* blue spark */
+				if (GB(v->tick_counter, 0, 2) == 0 && Chance16(1, 45)) {
+					CreateEffectVehicleRel(v, 0, 0, 10, EV_ELECTRIC_SPARK);
+					sound = true;
+				}
+				break;
+
+			default:
+				break;
 		}
 	} while ((v = v->Next()) != NULL);
 
@@ -2280,10 +2306,10 @@
 	return false;
 }
 
-/* Check for station tiles */
+/** Check for station tiles */
 struct TrainTrackFollowerData {
 	TileIndex dest_coords;
-	StationID station_index; // station index we're heading for
+	StationID station_index; ///< station index we're heading for
 	uint best_bird_dist;
 	uint best_track_dist;
 	TrackdirByte best_track;
@@ -2319,14 +2345,10 @@
 	}
 }
 
-static void FillWithStationData(TrainTrackFollowerData* fd, const Vehicle* v)
+static void FillWithStationData(TrainTrackFollowerData *fd, const Vehicle *v)
 {
 	fd->dest_coords = v->dest_tile;
-	if (v->current_order.type == OT_GOTO_STATION) {
-		fd->station_index = v->current_order.dest;
-	} else {
-		fd->station_index = INVALID_STATION;
-	}
+	fd->station_index = v->current_order.IsType(OT_GOTO_STATION) ? v->current_order.GetDestination() : INVALID_STATION;
 }
 
 static const byte _initial_tile_subcoord[6][4][3] = {
@@ -2338,13 +2360,6 @@
 {{  0, 0, 0 }, { 0, 0, 0 }, { 0, 8, 4 }, { 7, 15, 0 }},
 };
 
-static const uint32 _reachable_tracks[4] = {
-	0x10091009,
-	0x00160016,
-	0x05200520,
-	0x2A002A00,
-};
-
 static const byte _search_directions[6][4] = {
 	{ 0, 9, 2, 9 }, ///< track 1
 	{ 9, 1, 9, 3 }, ///< track 2
@@ -2357,7 +2372,7 @@
 static const byte _pick_track_table[6] = {1, 3, 2, 2, 0, 0};
 
 /* choose a track */
-static Track ChooseTrainTrack(Vehicle* v, TileIndex tile, DiagDirection enterdir, TrackBits tracks)
+static Track ChooseTrainTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks)
 {
 	Track best_track;
 	/* pathfinders are able to tell that route was only 'guessed' */
@@ -2453,7 +2468,7 @@
 				SetDParam(0, v->unitnumber);
 				AddNewsItem(
 					STR_TRAIN_IS_LOST,
-					NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0),
+					NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE,
 					v->index,
 					0);
 			}
@@ -2479,8 +2494,9 @@
 {
 	if (_opt.diff.line_reverse_mode != 0 ||
 			v->u.rail.track == TRACK_BIT_DEPOT || v->u.rail.track == TRACK_BIT_WORMHOLE ||
-			!(v->direction & 1))
+			!(v->direction & 1)) {
 		return false;
+	}
 
 	TrainTrackFollowerData fd;
 	FillWithStationData(&fd, v);
@@ -2489,17 +2505,15 @@
 
 	assert(v->u.rail.track);
 
-	int i = _search_directions[FIND_FIRST_BIT(v->u.rail.track)][DirToDiagDir(v->direction)];
-
 	switch (_patches.pathfinder_for_trains) {
-		case VPF_YAPF: { /* YAPF */
+		case VPF_YAPF: /* YAPF */
 			reverse_best = YapfCheckReverseTrain(v);
-		} break;
+			break;
 
 		case VPF_NPF: { /* NPF */
 			NPFFindStationOrTileData fstd;
 			NPFFoundTargetData ftd;
-			Vehicle* last = GetLastVehicleInChain(v);
+			Vehicle *last = GetLastVehicleInChain(v);
 
 			NPFFillWithOrderData(&fstd, v);
 
@@ -2523,6 +2537,8 @@
 
 		default:
 		case VPF_NTP: { /* NTP */
+			int i = _search_directions[FindFirstTrack(v->u.rail.track)][DirToDiagDir(v->direction)];
+
 			int best_track = -1;
 			uint reverse = 0;
 			uint best_bird_dist  = 0;
@@ -2577,94 +2593,11 @@
 	return reverse_best != 0;
 }
 
-static bool ProcessTrainOrder(Vehicle *v)
+TileIndex Train::GetOrderStationLocation(StationID station)
 {
-	switch (v->current_order.type) {
-		case OT_GOTO_DEPOT:
-			if (!(v->current_order.flags & OFB_PART_OF_ORDERS)) return false;
-			if ((v->current_order.flags & OFB_SERVICE_IF_NEEDED) &&
-					!VehicleNeedsService(v)) {
-				UpdateVehicleTimetable(v, true);
-				v->cur_order_index++;
-			}
-			break;
-
-		case OT_LOADING:
-		case OT_LEAVESTATION:
-			return false;
-
-		default: break;
-	}
-
-	/**
-	 * Reversing because of order change is allowed only just after leaving a
-	 * station (and the difficulty setting to allowed, of course)
-	 * this can be detected because only after OT_LEAVESTATION, current_order
-	 * will be reset to nothing. (That also happens if no order, but in that case
-	 * it won't hit the point in code where may_reverse is checked)
-	 */
-	bool may_reverse = v->current_order.type == OT_NOTHING;
-
-	/* check if we've reached the waypoint? */
-	if (v->current_order.type == OT_GOTO_WAYPOINT && v->tile == v->dest_tile) {
-		UpdateVehicleTimetable(v, true);
-		v->cur_order_index++;
-	}
-
-	/* check if we've reached a non-stop station while TTDPatch nonstop is enabled.. */
-	if (_patches.new_nonstop &&
-			v->current_order.flags & OFB_NON_STOP &&
-			IsTileType(v->tile, MP_STATION) &&
-			v->current_order.dest == GetStationIndex(v->tile)) {
-		UpdateVehicleTimetable(v, true);
-		v->cur_order_index++;
-	}
-
-	/* Get the current order */
-	if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0;
-
-	const Order *order = GetVehicleOrder(v, v->cur_order_index);
-
-	/* If no order, do nothing. */
-	if (order == NULL) {
-		v->current_order.Free();
-		v->dest_tile = 0;
-		return false;
-	}
-
-	/* If it is unchanged, keep it. */
-	if (order->type  == v->current_order.type &&
-			order->flags == v->current_order.flags &&
-			order->dest  == v->current_order.dest)
-		return false;
-
-	/* Otherwise set it, and determine the destination tile. */
-	v->current_order = *order;
-
-	v->dest_tile = 0;
-
-	InvalidateVehicleOrder(v);
-
-	switch (order->type) {
-		case OT_GOTO_STATION:
-			if (order->dest == v->last_station_visited)
-				v->last_station_visited = INVALID_STATION;
-			v->dest_tile = GetStation(order->dest)->xy;
-			break;
-
-		case OT_GOTO_DEPOT:
-			v->dest_tile = GetDepot(order->dest)->xy;
-			break;
-
-		case OT_GOTO_WAYPOINT:
-			v->dest_tile = GetWaypoint(order->dest)->xy;
-			break;
-
-		default:
-			return false;
-	}
-
-	return may_reverse && CheckReverseTrain(v);
+	if (station == this->last_station_visited) this->last_station_visited = INVALID_STATION;
+
+	return GetStation(station)->xy;
 }
 
 void Train::MarkDirty()
@@ -2723,19 +2656,15 @@
 	if (!(st->had_vehicle_of_type & HVOT_TRAIN)) {
 		st->had_vehicle_of_type |= HVOT_TRAIN;
 		SetDParam(0, st->index);
-		uint32 flags = v->owner == _local_player ?
-			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) :
-			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ARRIVAL_OTHER,  0);
 		AddNewsItem(
 			STR_8801_CITIZENS_CELEBRATE_FIRST,
-			flags,
+			NM_THIN, NF_VIEWPORT | NF_VEHICLE, v->owner == _local_player ? NT_ARRIVAL_PLAYER : NT_ARRIVAL_OTHER, DNC_NONE,
 			v->index,
 			0
 		);
 	}
 
 	v->BeginLoading();
-	v->current_order.dest = 0;
 }
 
 static byte AfterSetTrainPos(Vehicle *v, bool new_tile)
@@ -2832,7 +2761,7 @@
 };
 
 /** Modify the speed of the vehicle due to a turn */
-static inline void AffectSpeedByDirChange(Vehicle* v, Direction new_dir)
+static inline void AffectSpeedByDirChange(Vehicle *v, Direction new_dir)
 {
 	if (_patches.realistic_acceleration) return;
 
@@ -2858,17 +2787,13 @@
 	}
 }
 
-static const DiagDirection _otherside_signal_directions[] = {
-	DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE, INVALID_DIAGDIR, INVALID_DIAGDIR,
-	DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE
-};
-
 static void TrainMovedChangeSignals(TileIndex tile, DiagDirection dir)
 {
 	if (IsTileType(tile, MP_RAILWAY) &&
 			GetRailTileType(tile) == RAIL_TILE_SIGNALS) {
-		uint i = FindFirstBit2x64(GetTrackBits(tile) * 0x101 & _reachable_tracks[dir]);
-		UpdateSignalsOnSegment(tile, _otherside_signal_directions[i], GetTileOwner(tile));
+		TrackdirBits tracks = TrackBitsToTrackdirBits(GetTrackBits(tile)) & DiagdirReachesTrackdirs(dir);
+		Trackdir trackdir = FindFirstTrackdir(tracks);
+		UpdateSignalsOnSegment(tile, TrackdirToExitdir(trackdir), GetTileOwner(tile));
 	}
 }
 
@@ -2900,7 +2825,7 @@
 	if (crossing != INVALID_TILE) UpdateLevelCrossing(crossing);
 }
 
-static uint CountPassengersInTrain(const Vehicle* v)
+static uint CountPassengersInTrain(const Vehicle *v)
 {
 	uint num = 0;
 	BEGIN_ENUM_WAGONS(v)
@@ -2910,13 +2835,13 @@
 }
 
 struct TrainCollideChecker {
-	Vehicle *v;
-	uint num;
+	Vehicle *v;  ///< vehicle we are testing for collision
+	uint num;    ///< number of dead if train collided
 };
 
 static void *FindTrainCollideEnum(Vehicle *v, void *data)
 {
-	TrainCollideChecker* tcc = (TrainCollideChecker*)data;
+	TrainCollideChecker *tcc = (TrainCollideChecker*)data;
 
 	if (v->type != VEH_TRAIN) return NULL;
 
@@ -2977,7 +2902,7 @@
 
 	SetDParam(0, tcc.num);
 	AddNewsItem(STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL,
-		NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
+		NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
 		v->index,
 		0
 	);
@@ -2998,12 +2923,12 @@
 	return NULL;
 }
 
-static void TrainController(Vehicle *v, bool update_image)
+static void TrainController(Vehicle *v, Vehicle *nomove, bool update_image)
 {
 	Vehicle *prev;
 
 	/* For every vehicle after and including the given vehicle */
-	for (prev = v->Previous(); v != NULL; prev = v, v = v->Next()) {
+	for (prev = v->Previous(); v != nomove; prev = v, v = v->Next()) {
 		DiagDirection enterdir = DIAGDIR_BEGIN;
 		bool update_signals_crossing = false; // will we update signals or crossing state?
 		BeginVehicleMove(v);
@@ -3031,7 +2956,7 @@
 						return;
 					}
 
-					if (v->current_order.type == OT_LEAVESTATION) {
+					if (v->current_order.IsType(OT_LEAVESTATION)) {
 						v->current_order.Free();
 						InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 					}
@@ -3046,9 +2971,11 @@
 
 				/* Get the status of the tracks in the new tile and mask
 				 * away the bits that aren't reachable. */
-				TrackStatus ts = GetTileTrackStatus(gp.new_tile, TRANSPORT_RAIL, 0, ReverseDiagDir(enterdir)) & _reachable_tracks[enterdir];
-				TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts);
-				TrackBits red_signals = TrackdirBitsToTrackBits(TrackStatusToRedSignals(ts));
+				TrackStatus ts = GetTileTrackStatus(gp.new_tile, TRANSPORT_RAIL, 0, ReverseDiagDir(enterdir));
+				TrackdirBits reachable_trackdirs = DiagdirReachesTrackdirs(enterdir);
+
+				TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts) & reachable_trackdirs;
+				TrackBits red_signals = TrackdirBitsToTrackBits(TrackStatusToRedSignals(ts) & reachable_trackdirs);
 
 				TrackBits bits = TrackdirBitsToTrackBits(trackdirbits);
 				if (_patches.pathfinder_for_trains != VPF_NTP && _patches.forbid_90_deg && prev == NULL) {
@@ -3227,7 +3154,6 @@
 	} else {
 		/* Recalculate cached train properties */
 		TrainConsistChanged(first);
-		InvalidateWindow(WC_VEHICLE_DETAILS, first->index);
 		/* Update the depot window if the first vehicle is in depot -
 		 * if v == first, then it is updated in PreDestructor() */
 		if (first->u.rail.track == TRACK_BIT_DEPOT) {
@@ -3272,8 +3198,8 @@
 			v->UpdateDeltaXY(v->direction);
 			v->cur_image = v->GetImage(v->direction);
 			/* Refrain from updating the z position of the vehicle when on
-			   a bridge, because AfterSetTrainPos will put the vehicle under
-			   the bridge in that case */
+			 * a bridge, because AfterSetTrainPos will put the vehicle under
+			 * the bridge in that case */
 			if (v->u.rail.track != TRACK_BIT_WORMHOLE) AfterSetTrainPos(v, false);
 		}
 	} while ((v = v->Next()) != NULL);
@@ -3477,9 +3403,11 @@
 	TileIndex tile = v->tile + TileOffsByDiagDir(dir);
 
 	/* Determine the track status on the next tile */
-	TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0, ReverseDiagDir(dir)) & _reachable_tracks[dir];
-	TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts);
-	TrackdirBits red_signals = TrackStatusToRedSignals(ts);
+	TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0, ReverseDiagDir(dir));
+	TrackdirBits reachable_trackdirs = DiagdirReachesTrackdirs(dir);
+
+	TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts) & reachable_trackdirs;
+	TrackdirBits red_signals = TrackStatusToRedSignals(ts) & reachable_trackdirs;
 
 	/* We are sure the train is not entering a depot, it is detected above */
 
@@ -3530,7 +3458,7 @@
 	/* exit if train is stopped */
 	if (v->vehstatus & VS_STOPPED && v->cur_speed == 0) return;
 
-	if (ProcessTrainOrder(v)) {
+	if (ProcessOrders(v) && CheckReverseTrain(v)) {
 		v->load_unload_time_rem = 0;
 		v->cur_speed = 0;
 		v->subspeed = 0;
@@ -3540,7 +3468,7 @@
 
 	v->HandleLoading(mode);
 
-	if (v->current_order.type == OT_LOADING) return;
+	if (v->current_order.IsType(OT_LOADING)) return;
 
 	if (CheckTrainStayInDepot(v)) return;
 
@@ -3560,7 +3488,7 @@
 		TrainCheckIfLineEnds(v);
 
 		do {
-			TrainController(v, true);
+			TrainController(v, NULL, true);
 			CheckTrainCollision(v);
 			if (v->cur_speed <= 0x100)
 				break;
@@ -3611,11 +3539,11 @@
 	}
 }
 
-#define MAX_ACCEPTABLE_DEPOT_DIST 16
-
 static void CheckIfTrainNeedsService(Vehicle *v)
 {
-	if (_patches.servint_trains == 0 || !VehicleNeedsService(v)) return;
+	static const uint MAX_ACCEPTABLE_DEPOT_DIST = 16;
+
+	if (_patches.servint_trains == 0 || !v->NeedsAutomaticServicing()) return;
 	if (v->IsInDepot()) {
 		VehicleServiceInDepot(v);
 		return;
@@ -3624,28 +3552,25 @@
 	TrainFindDepotData tfdd = FindClosestTrainDepot(v, MAX_ACCEPTABLE_DEPOT_DIST);
 	/* Only go to the depot if it is not too far out of our way. */
 	if (tfdd.best_length == (uint)-1 || tfdd.best_length > MAX_ACCEPTABLE_DEPOT_DIST) {
-		if (v->current_order.type == OT_GOTO_DEPOT) {
+		if (v->current_order.IsType(OT_GOTO_DEPOT)) {
 			/* If we were already heading for a depot but it has
 			 * suddenly moved farther away, we continue our normal
 			 * schedule? */
-			v->current_order.type = OT_DUMMY;
-			v->current_order.flags = 0;
+			v->current_order.MakeDummy();
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 		}
 		return;
 	}
 
-	const Depot* depot = GetDepotByTile(tfdd.tile);
-
-	if (v->current_order.type == OT_GOTO_DEPOT &&
-			v->current_order.dest != depot->index &&
+	const Depot *depot = GetDepotByTile(tfdd.tile);
+
+	if (v->current_order.IsType(OT_GOTO_DEPOT) &&
+			v->current_order.GetDestination() != depot->index &&
 			!Chance16(3, 16)) {
 		return;
 	}
 
-	v->current_order.type = OT_GOTO_DEPOT;
-	v->current_order.flags = OFB_NON_STOP;
-	v->current_order.dest = depot->index;
+	v->current_order.MakeGoToDepot(depot->index, ODTFB_SERVICE);
 	v->dest_tile = tfdd.tile;
 	InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
 }
@@ -3663,8 +3588,8 @@
 		CheckOrders(this);
 
 		/* update destination */
-		if (this->current_order.type == OT_GOTO_STATION) {
-			TileIndex tile = GetStation(this->current_order.dest)->train_tile;
+		if (this->current_order.IsType(OT_GOTO_STATION)) {
+			TileIndex tile = GetStation(this->current_order.GetDestination())->train_tile;
 			if (tile != 0) this->dest_tile = tile;
 		}
 
@@ -3698,7 +3623,7 @@
 				SetDParam(0, v->unitnumber);
 				AddNewsItem(
 					STR_TRAIN_IS_UNPROFITABLE,
-					NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0),
+					NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE,
 					v->index,
 					0);
 			}
@@ -3745,7 +3670,7 @@
 					}
 
 					Vehicle *w;
-					for (w = u->Next(); w != NULL && (w->engine_type != u->engine_type || w->u.rail.other_multiheaded_part != NULL); w = GetNextVehicle(w));
+					for (w = u->Next(); w != NULL && (w->engine_type != u->engine_type || w->u.rail.other_multiheaded_part != NULL); w = GetNextVehicle(w)) {}
 					if (w != NULL) {
 						/* we found a car to partner with this engine. Now we will make sure it face the right way */
 						if (IsTrainEngine(w)) {
--- a/src/train_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/train_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -16,18 +16,19 @@
 #include "strings_func.h"
 #include "vehicle_func.h"
 #include "settings_type.h"
+#include "order_func.h"
+#include "engine_func.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
 
 void CcBuildWagon(bool success, TileIndex tile, uint32 p1, uint32 p2)
 {
-	Vehicle *v, *found;
-
 	if (!success) return;
 
 	/* find a locomotive in the depot. */
-	found = NULL;
+	Vehicle *found = NULL;
+	Vehicle *v;
 	FOR_ALL_VEHICLES(v) {
 		if (v->type == VEH_TRAIN && IsFrontEngine(v) &&
 				v->tile == tile &&
@@ -48,11 +49,9 @@
 
 void CcBuildLoco(bool success, TileIndex tile, uint32 p1, uint32 p2)
 {
-	const Vehicle *v;
-
 	if (!success) return;
 
-	v = GetVehicle(_new_vehicle_id);
+	const Vehicle *v = GetVehicle(_new_vehicle_id);
 	if (tile == _backup_orders_tile) {
 		_backup_orders_tile = 0;
 		RestoreVehicleOrders(v);
@@ -96,6 +95,8 @@
 					/* Set the highlight position */
 					highlight_l = WagonLengthToPixels(dx) + 1;
 					highlight_r = WagonLengthToPixels(dx + width) + 1;
+				} else if (_cursor.vehchain && highlight_r != 0) {
+					highlight_r += WagonLengthToPixels(width);
 				}
 			}
 		}
@@ -193,8 +194,6 @@
 		for (;;) {
 			if (--vscroll_pos < 0 && vscroll_pos >= -vscroll_cap) {
 				int dx = 0;
-				int px;
-				int py;
 
 				u = v;
 				do {
@@ -204,8 +203,8 @@
 					u = u->Next();
 				} while (u != NULL && IsArticulatedPart(u) && u->cargo_cap == 0);
 
-				px = x + WagonLengthToPixels(dx) + 2;
-				py = y + 2;
+				int px = x + WagonLengthToPixels(dx) + 2;
+				int py = y + 2;
 				switch (det_tab) {
 					default: NOT_REACHED();
 					case 0: TrainDetailsCargoTab(   v, px, py); break;
--- a/src/transparency.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/transparency.h	Tue Apr 15 00:47:19 2008 +0000
@@ -28,6 +28,7 @@
 typedef uint TransparencyOptionBits; ///< transparency option bits
 extern TransparencyOptionBits _transparency_opt;
 extern TransparencyOptionBits _transparency_lock;
+extern TransparencyOptionBits _invisibility_opt;
 
 /**
  * Check if the transparency option bit is set
@@ -41,6 +42,17 @@
 }
 
 /**
+ * Check if the invisibility option bit is set
+ * and if we aren't in the game menu (there's never transparency)
+ *
+ * @param to the structure which invisibility option is ask for
+ */
+static inline bool IsInvisibilitySet(TransparencyOption to)
+{
+	return (HasBit(_transparency_opt & _invisibility_opt, to) && _game_mode != GM_MENU);
+}
+
+/**
  * Toggle the transparency option bit
  *
  * @param to the transparency option to be toggled
@@ -51,6 +63,34 @@
 }
 
 /**
+ * Toggle the invisibility option bit
+ *
+ * @param to the structure which invisibility option is toggle
+ */
+static inline void ToggleInvisibility(TransparencyOption to)
+{
+	ToggleBit(_invisibility_opt, to);
+}
+
+/**
+ * Toggles between invisible and solid state.
+ * If object is transparent, then it is made invisible.
+ * Used by the keyboard shortcuts.
+ *
+ * @param to the object type which invisibility option to toggle
+ */
+static inline void ToggleInvisibilityWithTransparency(TransparencyOption to)
+{
+	if (IsInvisibilitySet(to)) {
+		ClrBit(_invisibility_opt, to);
+		ClrBit(_transparency_opt, to);
+	} else {
+		SetBit(_invisibility_opt, to);
+		SetBit(_transparency_opt, to);
+	}
+}
+
+/**
  * Toggle the transparency lock bit
  *
  * @param to the transparency option to be locked or unlocked
--- a/src/transparency_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/transparency_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -13,6 +13,7 @@
 
 TransparencyOptionBits _transparency_opt;
 TransparencyOptionBits _transparency_lock;
+TransparencyOptionBits _invisibility_opt;
 
 enum TransparencyToolbarWidgets{
 	TTW_WIDGET_SIGNS = 3,    ///< Make signs background transparent
@@ -25,6 +26,9 @@
 	TTW_WIDGET_CATENARY,     ///< Make catenary transparent
 	TTW_WIDGET_LOADING,      ///< Make loading indicators transparent
 	TTW_WIDGET_END,          ///< End of toggle buttons
+
+	/* Panel with buttons for invisibility */
+	TTW_BUTTONS = 12,        ///< Panel with 'invisibility' buttons
 };
 
 static void TransparencyToolbWndProc(Window *w, WindowEvent *e)
@@ -41,6 +45,18 @@
 			for (uint i = TO_SIGNS; i < TO_END; i++) {
 				if (HasBit(_transparency_lock, i)) DrawSprite(SPR_LOCK, PAL_NONE, w->widget[TTW_WIDGET_SIGNS + i].left + 1, w->widget[TTW_WIDGET_SIGNS + i].top + 1);
 			}
+
+			/* Do not draw button for invisible loading indicators */
+			for (uint i = 0; i < 8; i++) {
+				if (i < TTW_WIDGET_BRIDGES - TTW_WIDGET_SIGNS) {
+					DrawFrameRect(i * 22, 38, i * 22 + 19, 46, true, HasBit(_invisibility_opt, i) ? FR_LOWERED : FR_NONE);
+				} else if (i == TTW_WIDGET_BRIDGES - TTW_WIDGET_SIGNS) {
+					DrawFrameRect(i * 22, 38, i * 22 + 41, 46, true, HasBit(_invisibility_opt, i) ? FR_LOWERED : FR_NONE);
+				} else { // i > TTW_WIDGET_BRIDGES - TTW_WIDGET_SIGNS
+					DrawFrameRect((i + 1) * 22, 38, (i + 1) * 22 + 19, 46, true, HasBit(_invisibility_opt, i) ? FR_LOWERED : FR_NONE);
+				}
+			}
+
 			break;
 
 		case WE_CLICK:
@@ -55,7 +71,23 @@
 					SndPlayFx(SND_15_BEEP);
 					MarkWholeScreenDirty();
 				}
+			} else if (e->we.click.widget == TTW_BUTTONS) {
+				uint x = e->we.click.pt.x / 22;
+
+				if (x > TTW_WIDGET_BRIDGES - TTW_WIDGET_SIGNS) x--;
+				if (x > TTW_WIDGET_CATENARY - TTW_WIDGET_SIGNS) break;
+
+				ToggleInvisibility((TransparencyOption)x);
+				SndPlayFx(SND_15_BEEP);
+
+				/* Redraw whole screen only if transparency is set */
+				if (IsTransparencySet((TransparencyOption)x)) {
+					MarkWholeScreenDirty();
+				} else {
+					w->InvalidateWidget(TTW_BUTTONS);
+				}
 			}
+
 			break;
 	}
 }
@@ -77,11 +109,13 @@
 {   WWT_IMGBTN,   RESIZE_NONE,  7, 175, 196,  14,  35, SPR_BUILD_X_ELRAIL,   STR_TRANSPARENT_CATENARY_DESC},
 {   WWT_IMGBTN,   RESIZE_NONE,  7, 197, 218,  14,  35, SPR_IMG_TRAINLIST,    STR_TRANSPARENT_LOADING_DESC},
 
+{    WWT_PANEL,   RESIZE_NONE,  7,   0, 218,  36,  48, 0x0,                  STR_TRANSPARENT_INVISIBLE_DESC},
+
 {   WIDGETS_END},
 };
 
 static const WindowDesc _transparency_desc = {
-	WDP_ALIGN_TBR, 58+36, 219, 36, 219, 36,
+	WDP_ALIGN_TBR, 58+36, 219, 49, 219, 49,
 	WC_TRANSPARENCY_TOOLBAR, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 	_transparency_widgets,
--- a/src/tree_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/tree_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -445,7 +445,7 @@
 	DrawClearLandFence(ti);
 
 	/* Do not draw trees when the invisible trees patch and transparency tree are set */
-	if (IsTransparencySet(TO_TREES) && _patches.invisible_trees) return;
+	if (IsInvisibilitySet(TO_TREES)) return;
 
 	uint16 tmp = ti->x;
 
--- a/src/tunnelbridge_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/tunnelbridge_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -34,6 +34,7 @@
 #include "signal_func.h"
 #include "tunnelbridge.h"
 #include "player_base.h"
+#include "engine_func.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -718,7 +719,11 @@
  */
 static void DrawBridgePillars(const PalSpriteID *psid, const TileInfo* ti, Axis axis, BridgeType type, int x, int y, int z_bridge)
 {
+	/* Do not draw bridge pillars if they are invisible */
+	if (IsInvisibilitySet(TO_BRIDGES)) return;
+
 	SpriteID image = psid->sprite;
+
 	if (image != 0) {
 		bool drawfarpillar = !HasBit(GetBridgeSpec(type)->flags, 0);
 
@@ -770,8 +775,9 @@
  * @param z       the z of the bridge
  * @param offset  number representing whether to level or sloped and the direction
  * @param overlay do we want to still see the road?
+ * @param head    are we drawing bridge head?
  */
-static void DrawBridgeTramBits(int x, int y, byte z, int offset, bool overlay)
+static void DrawBridgeTramBits(int x, int y, byte z, int offset, bool overlay, bool head)
 {
 	static const SpriteID tram_offsets[2][6] = { { 107, 108, 109, 110, 111, 112 }, { 4, 5, 15, 16, 17, 18 } };
 	static const SpriteID back_offsets[6]    =   {  95,  96,  99, 102, 100, 101 };
@@ -784,16 +790,29 @@
 
 	/* The sprites under the vehicles are drawn as SpriteCombine. StartSpriteCombine() has already been called
 	 * The bounding boxes here are the same as for bridge front/roof */
-	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + tram_offsets[overlay][offset], PAL_NONE, x, y, size_x[offset], size_y[offset], 0x28, z, IsTransparencySet(TO_BRIDGES));
+	if (head || !IsInvisibilitySet(TO_BRIDGES)) {
+		AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + tram_offsets[overlay][offset], PAL_NONE,
+			x, y, size_x[offset], size_y[offset], 0x28, z,
+			!head && IsTransparencySet(TO_BRIDGES));
+	}
 
-	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + back_offsets[offset],  PAL_NONE, x, y, size_x[offset], size_y[offset], 0x28, z, IsTransparencySet(TO_CATENARY));
+	/* Do not draw catenary if it is set invisible */
+	if (!IsInvisibilitySet(TO_CATENARY)) {
+		AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + back_offsets[offset], PAL_NONE,
+			x, y, size_x[offset], size_y[offset], 0x28, z,
+			IsTransparencySet(TO_CATENARY));
+	}
 
 	/* Start a new SpriteCombine for the front part */
 	EndSpriteCombine();
 	StartSpriteCombine();
 
 	/* For sloped sprites the bounding box needs to be higher, as the pylons stop on a higher point */
-	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + front_offsets[offset], PAL_NONE, x, y, size_x[offset] + front_bb_offset_x[offset], size_y[offset] + front_bb_offset_y[offset], 0x28, z, IsTransparencySet(TO_CATENARY), front_bb_offset_x[offset], front_bb_offset_y[offset]);
+	if (!IsInvisibilitySet(TO_CATENARY)) {
+		AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + front_offsets[offset], PAL_NONE,
+			x, y, size_x[offset] + front_bb_offset_x[offset], size_y[offset] + front_bb_offset_y[offset], 0x28, z,
+			IsTransparencySet(TO_CATENARY), front_bb_offset_x[offset], front_bb_offset_y[offset]);
+	}
 }
 
 /**
@@ -855,11 +874,14 @@
 
 				DrawGroundSprite(SPR_TRAMWAY_BASE + tunnel_sprites[rts - ROADTYPES_TRAM][tunnelbridge_direction], PAL_NONE);
 
-				catenary = true;
-				StartSpriteCombine();
-				AddSortableSpriteToDraw(SPR_TRAMWAY_TUNNEL_WIRES + tunnelbridge_direction, PAL_NONE, ti->x, ti->y, BB_data[10], BB_data[11], TILE_HEIGHT, ti->z, IsTransparencySet(TO_CATENARY), BB_data[8], BB_data[9], BB_Z_SEPARATOR);
+				/* Do not draw wires if they are invisible */
+				if (!IsInvisibilitySet(TO_CATENARY)) {
+					catenary = true;
+					StartSpriteCombine();
+					AddSortableSpriteToDraw(SPR_TRAMWAY_TUNNEL_WIRES + tunnelbridge_direction, PAL_NONE, ti->x, ti->y, BB_data[10], BB_data[11], TILE_HEIGHT, ti->z, IsTransparencySet(TO_CATENARY), BB_data[8], BB_data[9], BB_Z_SEPARATOR);
+				}
 			}
-		} else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
+		} else if (!IsInvisibilitySet(TO_CATENARY) && HasCatenary(GetRailType(ti->tile))) {
 			DrawCatenary(ti);
 
 			catenary = true;
@@ -915,9 +937,8 @@
 		/* HACK set the height of the BB of a sloped ramp to 1 so a vehicle on
 		 * it doesn't disappear behind it
 		 */
-		AddSortableSpriteToDraw(
-			psid->sprite, psid->pal, ti->x, ti->y, 16, 16, ti->tileh == SLOPE_FLAT ? 0 : 8, ti->z, IsTransparencySet(TO_BRIDGES)
-		);
+		/* Bridge heads are drawn solid no matter how invisibility/transparency is set */
+		AddSortableSpriteToDraw(psid->sprite, psid->pal, ti->x, ti->y, 16, 16, ti->tileh == SLOPE_FLAT ? 0 : 8, ti->z);
 
 		if (transport_type == TRANSPORT_ROAD) {
 			RoadTypes rts = GetRoadTypes(ti->tile);
@@ -932,10 +953,10 @@
 					offset += 2;
 				}
 				/* DrawBridgeTramBits() calls EndSpriteCombine() and StartSpriteCombine() */
-				DrawBridgeTramBits(ti->x, ti->y, z, offset, HasBit(rts, ROADTYPE_ROAD));
+				DrawBridgeTramBits(ti->x, ti->y, z, offset, HasBit(rts, ROADTYPE_ROAD), true);
 			}
 			EndSpriteCombine();
-		} else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
+		} else if (HasCatenary(GetRailType(ti->tile))) {
 			DrawCatenary(ti);
 		}
 
@@ -1043,10 +1064,12 @@
 	if (transport_type == TRANSPORT_ROAD) StartSpriteCombine();
 
 	/* Draw floor and far part of bridge*/
-	if (axis == AXIS_X) {
-		AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 1, 0x28, z, IsTransparencySet(TO_BRIDGES), 0, 0, BRIDGE_Z_START);
-	} else {
-		AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 1, 16, 0x28, z, IsTransparencySet(TO_BRIDGES), 0, 0, BRIDGE_Z_START);
+	if (!IsInvisibilitySet(TO_BRIDGES)) {
+		if (axis == AXIS_X) {
+			AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 1, 0x28, z, IsTransparencySet(TO_BRIDGES), 0, 0, BRIDGE_Z_START);
+		} else {
+			AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 1, 16, 0x28, z, IsTransparencySet(TO_BRIDGES), 0, 0, BRIDGE_Z_START);
+		}
 	}
 
 	psid++;
@@ -1056,27 +1079,32 @@
 
 		if (HasBit(rts, ROADTYPE_TRAM)) {
 			/* DrawBridgeTramBits() calls EndSpriteCombine() and StartSpriteCombine() */
-			DrawBridgeTramBits(x, y, bridge_z, axis ^ 1, HasBit(rts, ROADTYPE_ROAD));
+			DrawBridgeTramBits(x, y, bridge_z, axis ^ 1, HasBit(rts, ROADTYPE_ROAD), false);
 		} else {
 			EndSpriteCombine();
 			StartSpriteCombine();
 		}
-	} else if (GetRailType(rampsouth) == RAILTYPE_ELECTRIC) {
+	} else if (HasCatenary(GetRailType(rampsouth))) {
 		DrawCatenary(ti);
 	}
 
 	/* draw roof, the component of the bridge which is logically between the vehicle and the camera */
-	if (axis == AXIS_X) {
-		y += 12;
-		if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 4, 0x28, z, IsTransparencySet(TO_BRIDGES), 0, 3, BRIDGE_Z_START);
-	} else {
-		x += 12;
-		if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 4, 16, 0x28, z, IsTransparencySet(TO_BRIDGES), 3, 0, BRIDGE_Z_START);
+	if (!IsInvisibilitySet(TO_BRIDGES)) {
+		if (axis == AXIS_X) {
+			y += 12;
+			if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 16, 4, 0x28, z, IsTransparencySet(TO_BRIDGES), 0, 3, BRIDGE_Z_START);
+		} else {
+			x += 12;
+			if (psid->sprite & SPRITE_MASK) AddSortableSpriteToDraw(psid->sprite, psid->pal, x, y, 4, 16, 0x28, z, IsTransparencySet(TO_BRIDGES), 3, 0, BRIDGE_Z_START);
+		}
 	}
 
 	/* Draw TramFront as SpriteCombine */
 	if (transport_type == TRANSPORT_ROAD) EndSpriteCombine();
 
+	/* Do not draw anything more if bridges are invisible */
+	if (IsInvisibilitySet(TO_BRIDGES)) return;
+
 	psid++;
 	if (ti->z + 5 == z) {
 		/* draw poles below for small bridges */
--- a/src/unmovable_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/unmovable_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -11,7 +11,6 @@
 #include "player_func.h"
 #include "player_base.h"
 #include "gui.h"
-#include "station.h"
 #include "town.h"
 #include "sprite.h"
 #include "bridge_map.h"
@@ -172,6 +171,8 @@
 			if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED);
 			DrawClearLandTile(ti, 2);
 
+			if (IsInvisibilitySet(TO_STRUCTURES)) break;
+
 			AddSortableSpriteToDraw(
 				dtu->image.sprite, PAL_NONE, ti->x | dtu->delta_x, ti->y | dtu->delta_y,
 				dtu->size_x, dtu->size_y, dtu->size_z, ti->z,
@@ -186,6 +187,8 @@
 
 			DrawGroundSprite(SPR_CONCRETE_GROUND, PAL_NONE);
 
+			if (IsInvisibilitySet(TO_STRUCTURES)) break;
+
 			AddSortableSpriteToDraw(SPR_STATUE_COMPANY, PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)), ti->x, ti->y, 16, 16, 25, ti->z, IsTransparencySet(TO_STRUCTURES));
 			break;
 
@@ -212,6 +215,8 @@
 			t = &_unmovable_display_datas[GetCompanyHQSection(ti->tile)];
 			DrawGroundSprite(t->ground.sprite, palette);
 
+			if (IsInvisibilitySet(TO_STRUCTURES)) break;
+
 			foreach_draw_tile_seq(dtss, t->seq) {
 				AddSortableSpriteToDraw(
 					dtss->image.sprite, palette,
--- a/src/vehicle.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/vehicle.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -13,15 +13,13 @@
 #include "timetable.h"
 #include "viewport_func.h"
 #include "gfx_func.h"
-#include "news.h"
+#include "news_func.h"
 #include "command_func.h"
 #include "saveload.h"
 #include "player_func.h"
-#include "engine.h"
 #include "debug.h"
 #include "vehicle_gui.h"
 #include "depot.h"
-#include "station.h"
 #include "rail_type.h"
 #include "train.h"
 #include "aircraft.h"
@@ -34,7 +32,7 @@
 #include "newgrf_engine.h"
 #include "newgrf_sound.h"
 #include "group.h"
-#include "order.h"
+#include "order_func.h"
 #include "strings_func.h"
 #include "zoom_func.h"
 #include "functions.h"
@@ -48,6 +46,7 @@
 #include "autoreplace_gui.h"
 #include "string_func.h"
 #include "settings_type.h"
+#include "oldpool_func.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -119,22 +118,27 @@
 	InvalidateWindow(WC_VEHICLE_DETAILS, v->index); // ensure that last service date and reliability are updated
 }
 
-bool VehicleNeedsService(const Vehicle *v)
+bool Vehicle::NeedsServicing() const
 {
-	if (v->vehstatus & (VS_STOPPED | VS_CRASHED))       return false;
-	if (v->current_order.type != OT_GOTO_DEPOT || !(v->current_order.flags & OFB_PART_OF_ORDERS)) { // Don't interfere with a depot visit by the order list
-		if (_patches.gotodepot && VehicleHasDepotOrders(v)) return false;
-		if (v->current_order.type == OT_LOADING)            return false;
-		if (v->current_order.type == OT_GOTO_DEPOT && v->current_order.flags & OFB_HALT_IN_DEPOT) return false;
-	}
+	if (this->vehstatus & (VS_STOPPED | VS_CRASHED)) return false;
 
 	if (_patches.no_servicing_if_no_breakdowns && _opt.diff.vehicle_breakdowns == 0) {
-		return EngineHasReplacementForPlayer(GetPlayer(v->owner), v->engine_type, v->group_id);  /* Vehicles set for autoreplacing needs to go to a depot even if breakdowns are turned off */
+		/* Vehicles set for autoreplacing needs to go to a depot even if breakdowns are turned off.
+		 * Note: If servicing is enabled, we postpone replacement till next service. */
+		return EngineHasReplacementForPlayer(GetPlayer(this->owner), this->engine_type, this->group_id);
 	}
 
 	return _patches.servint_ispercent ?
-		(v->reliability < GetEngine(v->engine_type)->reliability * (100 - v->service_interval) / 100) :
-		(v->date_of_last_service + v->service_interval < _date);
+		(this->reliability < GetEngine(this->engine_type)->reliability * (100 - this->service_interval) / 100) :
+		(this->date_of_last_service + this->service_interval < _date);
+}
+
+bool Vehicle::NeedsAutomaticServicing() const
+{
+	if (_patches.gotodepot && VehicleHasDepotOrders(this)) return false;
+	if (this->current_order.IsType(OT_LOADING))            return false;
+	if (this->current_order.IsType(OT_GOTO_DEPOT) && this->current_order.GetDepotActionType() & ODATFB_HALT) return false;
+	return NeedsServicing();
 }
 
 StringID VehicleInTheWayErrMsg(const Vehicle* v)
@@ -633,7 +637,7 @@
 {
 	/* We need to set v->leave_depot_instantly as we have no control of it's contents at this time.
 	 * Vehicle should stop in the depot if it was in 'stopping' state - train intered depot while slowing down. */
-	if ((HasBit(v->current_order.flags, OF_HALT_IN_DEPOT) && !HasBit(v->current_order.flags, OF_PART_OF_ORDERS) && v->current_order.type == OT_GOTO_DEPOT) ||
+	if (((v->current_order.GetDepotActionType() & ODATFB_HALT) && !(v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) && v->current_order.IsType(OT_GOTO_DEPOT)) ||
 			(v->vehstatus & VS_STOPPED)) {
 		/* we keep the vehicle in the depot since the user ordered it to stay */
 		v->leave_depot_instantly = false;
@@ -769,7 +773,7 @@
 	}
 
 	AddSortableSpriteToDraw(image, pal, v->x_pos + v->x_offs, v->y_pos + v->y_offs,
-		v->sprite_width, v->sprite_height, v->z_height, v->z_pos, (v->vehstatus & VS_SHADOW) != 0);
+		v->x_extent, v->y_extent, v->z_extent, v->z_pos, (v->vehstatus & VS_SHADOW) != 0);
 }
 
 void ViewportAddVehicles(DrawPixelInfo *dpi)
@@ -1544,7 +1548,7 @@
 
 	SetDParam(0, _vehicle_type_names[v->type]);
 	SetDParam(1, v->unitnumber);
-	AddNewsItem(msg, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
+	AddNewsItem(msg, NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE, v->index, 0);
 }
 
 void AgeVehicle(Vehicle *v)
@@ -1687,24 +1691,28 @@
 }
 
 /** Autoreplace all vehicles in the depot
+ * Note: this command can make incorrect cost estimations
+ * Luckily the final price can only drop, not increase. This is due to the fact that
+ * estimation can't predict wagon removal so it presumes worst case which is no income from selling wagons.
  * @param tile Tile of the depot where the vehicles are
  * @param flags type of operation
  * @param p1 Type of vehicle
- * @param p2 Unused
+ * @param p2 If bit 0 is set, then either replace all or nothing (instead of replacing until money runs out)
  */
 CommandCost CmdDepotMassAutoReplace(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Vehicle **vl = NULL;
 	uint16 engine_list_length = 0;
 	uint16 engine_count = 0;
-	uint i, x = 0, y = 0, z = 0;
-	CommandCost cost;
+	uint i;
+	CommandCost cost = CommandCost(EXPENSES_NEW_VEHICLES);
 	VehicleType vehicle_type = (VehicleType)GB(p1, 0, 8);
+	bool all_or_nothing = HasBit(p2, 0);
 
 	if (!IsDepotTile(tile) || !IsTileOwner(tile, _current_player)) return CMD_ERROR;
 
 	/* Get the list of vehicles in the depot */
-	BuildDepotVehicleList(vehicle_type, tile, &vl, &engine_list_length, &engine_count, NULL, NULL, NULL);
+	BuildDepotVehicleList(vehicle_type, tile, &vl, &engine_list_length, &engine_count, &vl, &engine_list_length, &engine_count);
 
 
 	for (i = 0; i < engine_count; i++) {
@@ -1715,10 +1723,6 @@
 		/* Ensure that the vehicle completely in the depot */
 		if (!v->IsInDepot()) continue;
 
-		x = v->x_pos;
-		y = v->y_pos;
-		z = v->z_pos;
-
 		if (stopped) {
 			v->vehstatus |= VS_STOPPED; // Stop the vehicle
 			v->leave_depot_instantly = true;
@@ -1727,24 +1731,25 @@
 
 		if (CmdSucceeded(ret)) {
 			cost.AddCost(ret);
-			if (!(flags & DC_EXEC)) break;
-			/* There is a problem with autoreplace and newgrf
-			 * It's impossible to tell the length of a train after it's being replaced before it's actually done
-			 * Because of this, we can't estimate costs due to wagon removal and we will have to always return 0 and pay manually
-			 * Since we pay after each vehicle is replaced and MaybeReplaceVehicle() check if the player got enough money
-			 * we should never reach a condition where the player will end up with negative money from doing this */
-			SubtractMoneyFromPlayer(ret);
+		} else {
+			if (all_or_nothing) {
+				/* We failed to replace a vehicle even though we set all or nothing.
+				 * We should never reach this if DC_EXEC is set since then it should
+				 * have failed the estimation guess. */
+				assert(!(flags & DC_EXEC));
+				/* Now we will have to return an error.
+				 * This goto will leave the loop and it's ok to do so because
+				 * there is no point in the rest of the loop. */
+				goto error;
+			}
 		}
 	}
 
 	if (cost.GetCost() == 0) {
+error:
+		/* Either we didn't replace anything or something went wrong.
+		 * Either way we want to return an error and not execute this command. */
 		cost = CMD_ERROR;
-	} else {
-		if (flags & DC_EXEC) {
-			/* Display the cost animation now that DoCommandP() can't do it for us (see previous comments) */
-			if (IsLocalPlayer()) ShowCostOrIncomeAnimation(x, y, z, cost.GetCost());
-		}
-		cost = CommandCost();
 	}
 
 	free(vl);
@@ -2034,7 +2039,7 @@
 					const Order *order;
 
 					FOR_VEHICLE_ORDERS(v, order) {
-						if (order->type == OT_GOTO_STATION && order->dest == index) {
+						if (order->IsType(OT_GOTO_STATION) && order->GetDestination() == index) {
 							if (n == *length_of_array) ExtendVehicleListSize(sort_list, length_of_array, 50);
 							(*sort_list)[n++] = v;
 							break;
@@ -2078,7 +2083,7 @@
 					const Order *order;
 
 					FOR_VEHICLE_ORDERS(v, order) {
-						if (order->type == OT_GOTO_DEPOT && order->dest == index) {
+						if (order->IsType(OT_GOTO_DEPOT) && order->GetDestination() == index) {
 							if (n == *length_of_array) ExtendVehicleListSize(sort_list, length_of_array, 25);
 							(*sort_list)[n++] = v;
 							break;
@@ -2175,7 +2180,7 @@
 		max += v->cargo_cap;
 		if (v->cargo_cap != 0) {
 			unloading += HasBit(v->vehicle_flags, VF_CARGO_UNLOADING) ? 1 : 0;
-			loading |= (u->current_order.flags & OFB_UNLOAD) == 0 && st->goods[v->cargo_type].days_since_pickup != 255;
+			loading |= !(u->current_order.GetUnloadType() & OUFB_UNLOAD) && st->goods[v->cargo_type].days_since_pickup != 255;
 			cars++;
 		}
 	}
@@ -2236,20 +2241,19 @@
 
 	TriggerVehicle(v, VEHICLE_TRIGGER_DEPOT);
 
-	if (v->current_order.type == OT_GOTO_DEPOT) {
+	if (v->current_order.IsType(OT_GOTO_DEPOT)) {
 		Order t;
 
 		InvalidateWindow(WC_VEHICLE_VIEW, v->index);
 
 		t = v->current_order;
-		v->current_order.type = OT_DUMMY;
-		v->current_order.flags = 0;
-
-		if (t.refit_cargo < NUM_CARGO) {
+		v->current_order.MakeDummy();
+
+		if (t.IsRefit()) {
 			CommandCost cost;
 
 			_current_player = v->owner;
-			cost = DoCommand(v->tile, v->index, t.refit_cargo | t.refit_subtype << 8, DC_EXEC, GetCmdRefitVeh(v));
+			cost = DoCommand(v->tile, v->index, t.GetRefitCargo() | t.GetRefitSubtype() << 8, DC_EXEC, GetCmdRefitVeh(v));
 
 			if (CmdFailed(cost)) {
 				v->leave_depot_instantly = false; // We ensure that the vehicle stays in the depot
@@ -2257,18 +2261,18 @@
 					/* Notify the user that we stopped the vehicle */
 					SetDParam(0, _vehicle_type_names[v->type]);
 					SetDParam(1, v->unitnumber);
-					AddNewsItem(STR_ORDER_REFIT_FAILED, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
+					AddNewsItem(STR_ORDER_REFIT_FAILED, NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE, v->index, 0);
 				}
 			} else if (v->owner == _local_player && cost.GetCost() != 0) {
 				ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost.GetCost());
 			}
 		}
 
-		if (HasBit(t.flags, OF_PART_OF_ORDERS)) {
+		if (t.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) {
 			/* Part of orders */
 			UpdateVehicleTimetable(v, true);
 			v->cur_order_index++;
-		} else if (HasBit(t.flags, OF_HALT_IN_DEPOT)) {
+		} else if (t.GetDepotActionType() & ODATFB_HALT) {
 			/* Force depot visit */
 			v->vehstatus |= VS_STOPPED;
 			if (v->owner == _local_player) {
@@ -2283,7 +2287,7 @@
 				}
 
 				SetDParam(0, v->unitnumber);
-				AddNewsItem(string, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
+				AddNewsItem(string, NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE, v->index, 0);
 			}
 		}
 	}
@@ -3057,7 +3061,7 @@
 }
 
 /** Will be called when vehicles need to be loaded. */
-static void Load_VEHS()
+void Load_VEHS()
 {
 	int index;
 	Vehicle *v;
@@ -3100,7 +3104,7 @@
 		if (CheckSavegameVersion(5)) {
 			/* Convert the current_order.type (which is a mix of type and flags, because
 			 *  in those versions, they both were 4 bits big) to type and flags */
-			v->current_order.flags = (v->current_order.type & 0xF0) >> 4;
+			v->current_order.flags = GB(v->current_order.type, 4, 4);
 			v->current_order.type.m_val &= 0x0F;
 		}
 
@@ -3134,25 +3138,22 @@
 {
 	assert(IsTileType(tile, MP_STATION) || type == VEH_SHIP);
 
-	if (this->current_order.type == OT_GOTO_STATION &&
-			this->current_order.dest == this->last_station_visited) {
-		/* Arriving at the ordered station.
-		 * Keep the load/unload flags, as we (obviously) still need them. */
-		this->current_order.flags &= OFB_FULL_LOAD | OFB_UNLOAD | OFB_TRANSFER;
-
+	if (this->current_order.IsType(OT_GOTO_STATION) &&
+			this->current_order.GetDestination() == this->last_station_visited) {
 		/* Furthermore add the Non Stop flag to mark that this station
 		 * is the actual destination of the vehicle, which is (for example)
 		 * necessary to be known for HandleTrainLoading to determine
 		 * whether the train is lost or not; not marking a train lost
 		 * that arrives at random stations is bad. */
-		this->current_order.flags |= OFB_NON_STOP;
+		this->current_order.SetNonStopType(ONSF_NO_STOP_AT_ANY_STATION);
+
+		current_order.MakeLoading(true);
 		UpdateVehicleTimetable(this, true);
 	} else {
-		/* This is just an unordered intermediate stop */
-		this->current_order.flags = 0;
+		this->current_order.SetNonStopType(ONSF_STOP_EVERYWHERE);
+		current_order.MakeLoading(false);
 	}
 
-	current_order.type = OT_LOADING;
 	GetStation(this->last_station_visited)->loading_vehicles.push_back(this);
 
 	VehiclePayment(this);
@@ -3168,13 +3169,12 @@
 
 void Vehicle::LeaveStation()
 {
-	assert(current_order.type == OT_LOADING);
+	assert(current_order.IsType(OT_LOADING));
 
 	/* Only update the timetable if the vehicle was supposed to stop here. */
-	if (current_order.flags & OFB_NON_STOP) UpdateVehicleTimetable(this, false);
-
-	current_order.type = OT_LEAVESTATION;
-	current_order.flags = 0;
+	if (current_order.GetNonStopType() != ONSF_STOP_EVERYWHERE) UpdateVehicleTimetable(this, false);
+
+	current_order.MakeLeaveStation();
 	GetStation(this->last_station_visited)->loading_vehicles.remove(this);
 
 	HideFillingPercent(this->fill_percent_te_id);
@@ -3184,7 +3184,7 @@
 
 void Vehicle::HandleLoading(bool mode)
 {
-	switch (this->current_order.type) {
+	switch (this->current_order.GetType()) {
 		case OT_LOADING: {
 			uint wait_time = max(this->current_order.wait_time - this->lateness_counter, 0);
 
@@ -3194,11 +3194,11 @@
 
 			this->PlayLeaveStationSound();
 
-			Order b = this->current_order;
+			bool at_destination_station = this->current_order.GetNonStopType() != ONSF_STOP_EVERYWHERE;
 			this->LeaveStation();
 
 			/* If this was not the final order, don't remove it from the list. */
-			if (!(b.flags & OFB_NON_STOP)) return;
+			if (!at_destination_station) return;
 			break;
 		}
 
@@ -3237,9 +3237,9 @@
 {
 	this->x_offs        = 0;
 	this->y_offs        = 0;
-	this->sprite_width  = 1;
-	this->sprite_height = 1;
-	this->z_height      = 1;
+	this->x_extent      = 1;
+	this->y_extent      = 1;
+	this->z_extent      = 1;
 }
 
 void StopAllVehicles()
--- a/src/vehicle_base.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/vehicle_base.h	Tue Apr 15 00:47:19 2008 +0000
@@ -17,9 +17,11 @@
 #include "date_type.h"
 #include "player_type.h"
 #include "oldpool.h"
-#include "order.h"
+#include "order_base.h"
 #include "cargopacket.h"
 #include "texteff.hpp"
+#include "group_type.h"
+#include "engine_type.h"
 #include "fsmblockmap.h"
 
 /** Road vehicle states */
@@ -223,9 +225,9 @@
 	                         // 0xfd == custom sprite, 0xfe == custom second head sprite
 	                         // 0xff == reserved for another custom sprite
 	uint16 cur_image;        // sprite number for this vehicle
-	byte sprite_width;       // width of vehicle sprite
-	byte sprite_height;      // height of vehicle sprite
-	byte z_height;           // z-height of vehicle sprite
+	byte x_extent;           // x-extent of vehicle bounding box
+	byte y_extent;           // y-extent of vehicle bounding box
+	byte z_extent;           // z-extent of vehicle bounding box
 	int8 x_offs;             // x offset for vehicle sprite
 	int8 y_offs;             // y offset for vehicle sprite
 	EngineID engine_type;
@@ -488,6 +490,30 @@
 	inline bool IsOrderListShared() const { return this->next_shared != NULL || this->prev_shared != NULL; };
 
 	bool NeedsAutorenewing(const Player *p) const;
+
+	/**
+	 * Check if the vehicle needs to go to a depot in near future (if a opportunity presents itself) for service or replacement.
+	 *
+	 * @see NeedsAutomaticServicing()
+	 * @return true if the vehicle should go to a depot if a opportunity presents itself.
+	 */
+	bool NeedsServicing() const;
+
+	/**
+	 * Checks if the current order should be interupted for a service-in-depot-order.
+	 * @see NeedsServicing()
+	 * @return true if the current order should be interupted.
+	 */
+	bool NeedsAutomaticServicing() const;
+
+	/**
+	 * Determine the location for the station where the vehicle goes to next.
+	 * Things done for example are allocating slots in a road stop or exact
+	 * location of the platform is determined for ships.
+	 * @param station the station to make the next location of the vehicle.
+	 * @return the location (tile) to aim for.
+	 */
+	virtual TileIndex GetOrderStationLocation(StationID station) { return INVALID_TILE; }
 };
 
 /**
--- a/src/vehicle_func.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/vehicle_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -12,6 +12,7 @@
 #include "cargo_type.h"
 #include "command_type.h"
 #include "vehicle_type.h"
+#include "engine_type.h"
 
 #define is_custom_sprite(x) (x >= 0xFD)
 #define IS_CUSTOM_FIRSTHEAD_SPRITE(x) (x == 0xFD)
@@ -50,8 +51,6 @@
 Vehicle *FindVehicleBetween(TileIndex from, TileIndex to, byte z, bool without_crashed = false);
 Vehicle *GetVehicleTunnelBridge(TileIndex tile, TileIndex endtile);
 
-Vehicle *CheckClickOnVehicle(const ViewPort *vp, int x, int y);
-
 void DecreaseVehicleValue(Vehicle *v);
 void CheckVehicleBreakdown(Vehicle *v);
 void AgeVehicle(Vehicle *v);
@@ -67,8 +66,6 @@
 void TrainPowerChanged(Vehicle *v);
 Money GetTrainRunningCost(const Vehicle *v);
 
-bool VehicleNeedsService(const Vehicle *v);
-
 uint GenerateVehicleSortList(const Vehicle*** sort_list, uint16 *length_of_array, VehicleType type, PlayerID owner, uint32 index, uint16 window_type);
 void BuildDepotVehicleList(VehicleType type, TileIndex tile, Vehicle ***engine_list, uint16 *engine_list_length, uint16 *engine_count, Vehicle ***wagon_list, uint16 *wagon_list_length, uint16 *wagon_count);
 CommandCost SendAllVehiclesToDepot(VehicleType type, uint32 flags, bool service, PlayerID owner, uint16 vlw_flag, uint32 id);
--- a/src/vehicle_gui.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/vehicle_gui.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -6,8 +6,6 @@
 #include "openttd.h"
 #include "debug.h"
 #include "player_func.h"
-#include "station.h"
-#include "engine.h"
 #include "gui.h"
 #include "window_gui.h"
 #include "textbuf_gui.h"
@@ -36,10 +34,20 @@
 #include "string_func.h"
 #include "settings_type.h"
 #include "widgets/dropdown_func.h"
+#include "order_func.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
 
+struct refit_d {
+	int sel;
+	struct RefitOption *cargo;
+	struct RefitList *list;
+	uint length;
+	VehicleOrderID order;
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(refit_d));
+
 struct Sorting {
 	Listing aircraft;
 	Listing roadveh;
@@ -909,10 +917,10 @@
 		if (sel == 0) DrawString(x - 6, y, STR_SMALL_RIGHT_ARROW, TC_BLACK);
 		sel--;
 
-		if (order->type == OT_GOTO_STATION) {
-			if (v->type == VEH_SHIP && GetStation(order->dest)->IsBuoy()) continue;
+		if (order->IsType(OT_GOTO_STATION)) {
+			if (v->type == VEH_SHIP && GetStation(order->GetDestination())->IsBuoy()) continue;
 
-			SetDParam(0, order->dest);
+			SetDParam(0, order->GetDestination());
 			DrawString(x, y, STR_A036, TC_FROMSTRING);
 
 			y += 6;
@@ -1944,9 +1952,9 @@
 			str = STR_8861_STOPPED;
 		}
 	} else { // vehicle is in a "normal" state, show current order
-		switch (v->current_order.type) {
+		switch (v->current_order.GetType()) {
 			case OT_GOTO_STATION: {
-				SetDParam(0, v->current_order.dest);
+				SetDParam(0, v->current_order.GetDestination());
 				SetDParam(1, v->GetDisplaySpeed());
 				str = STR_HEADING_FOR_STATION + _patches.vehicle_speed;
 			} break;
@@ -1954,14 +1962,14 @@
 			case OT_GOTO_DEPOT: {
 				if (v->type == VEH_AIRCRAFT) {
 					/* Aircrafts always go to a station, even if you say depot */
-					SetDParam(0, v->current_order.dest);
+					SetDParam(0, v->current_order.GetDestination());
 					SetDParam(1, v->GetDisplaySpeed());
 				} else {
-					Depot *depot = GetDepot(v->current_order.dest);
+					Depot *depot = GetDepot(v->current_order.GetDestination());
 					SetDParam(0, depot->town_index);
 					SetDParam(1, v->GetDisplaySpeed());
 				}
-				if (HasBit(v->current_order.flags, OF_HALT_IN_DEPOT) && !HasBit(v->current_order.flags, OF_PART_OF_ORDERS)) {
+				if ((v->current_order.GetDepotActionType() & ODATFB_HALT) && !(v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS)) {
 					str = _heading_for_depot_strings[v->type] + _patches.vehicle_speed;
 				} else {
 					str = _heading_for_depot_service_strings[v->type] + _patches.vehicle_speed;
@@ -1974,7 +1982,7 @@
 
 			case OT_GOTO_WAYPOINT: {
 				assert(v->type == VEH_TRAIN);
-				SetDParam(0, v->current_order.dest);
+				SetDParam(0, v->current_order.GetDestination());
 				str = STR_HEADING_FOR_WAYPOINT + _patches.vehicle_speed;
 				SetDParam(1, v->GetDisplaySpeed());
 				break;
@@ -2079,7 +2087,11 @@
 					ShowVehicleRefitWindow(v, INVALID_VEH_ORDER_ID);
 					break;
 				case VVW_WIDGET_SHOW_ORDERS: /* show orders */
-					ShowOrdersWindow(v);
+					if (_ctrl_pressed) {
+						ShowTimetableWindow(v);
+					} else {
+						ShowOrdersWindow(v);
+					}
 					break;
 				case VVW_WIDGET_SHOW_DETAILS: /* show details */
 					ShowVehicleDetailsWindow(v);
--- a/src/vehicle_gui.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/vehicle_gui.h	Tue Apr 15 00:47:19 2008 +0000
@@ -7,6 +7,9 @@
 
 #include "window_gui.h"
 #include "vehicle_type.h"
+#include "order_type.h"
+#include "station_type.h"
+#include "engine_type.h"
 
 void DrawVehicleProfitButton(const Vehicle *v, int x, int y);
 void ShowVehicleRefitWindow(const Vehicle *v, VehicleOrderID order);
@@ -99,4 +102,6 @@
 /* Unified window procedure */
 void ShowVehicleViewWindow(const Vehicle *v);
 
+Vehicle *CheckClickOnVehicle(const ViewPort *vp, int x, int y);
+
 #endif /* VEHICLE_GUI_H */
--- a/src/viewport.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/viewport.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -10,9 +10,10 @@
 #include "spritecache.h"
 #include "landscape.h"
 #include "viewport_func.h"
-#include "station.h"
+#include "station_base.h"
 #include "town.h"
-#include "signs.h"
+#include "signs_base.h"
+#include "signs_func.h"
 #include "waypoint.h"
 #include "variables.h"
 #include "train.h"
@@ -26,11 +27,16 @@
 #include "vehicle_func.h"
 #include "player_func.h"
 #include "settings_type.h"
+#include "station_func.h"
+#include "core/alloc_func.hpp"
 
 #include "table/sprites.h"
 #include "table/strings.h"
 
-#define VIEWPORT_DRAW_MEM (65536 * 2)
+enum {
+	VIEWPORT_DRAW_MEM = (65536 * 2),
+	PARENT_LIST_SIZE  = 6144,
+};
 
 PlaceProc *_place_proc;
 Point _tile_fract_coords;
@@ -942,10 +948,8 @@
 static void DrawTileSelection(const TileInfo *ti)
 {
 	/* Draw a red error square? */
-	if (_thd.redsq != 0 && _thd.redsq == ti->tile) {
-		DrawTileSelectionRect(ti, PALETTE_TILE_RED_PULSATING);
-		return;
-	}
+	bool is_redsq = _thd.redsq != 0 && _thd.redsq == ti->tile;
+	if (is_redsq) DrawTileSelectionRect(ti, PALETTE_TILE_RED_PULSATING);
 
 	/* no selection active? */
 	if (_thd.drawstyle == 0) return;
@@ -979,6 +983,7 @@
 			if (_thd.FSMportLayout == NULL) {
 				DrawTileSelectionRect(ti, _thd.make_square_red ? PALETTE_SEL_TILE_RED : PAL_NONE);
 			}
+			if (!is_redsq) DrawTileSelectionRect(ti, _thd.make_square_red ? PALETTE_SEL_TILE_RED : PAL_NONE);
 		} else if (_thd.drawstyle & HT_POINT) {
 			/* Figure out the Z coordinate for the single dot. */
 			byte z = 0;
@@ -1019,7 +1024,7 @@
 	}
 
 	/* Check if it's inside the outer area? */
-	if (_thd.outersize.x &&
+	if (!is_redsq && _thd.outersize.x &&
 			_thd.size.x < _thd.size.x + _thd.outersize.x &&
 			IsInsideBS(ti->x, _thd.pos.x + _thd.offs.x, _thd.size.x + _thd.outersize.x) &&
 			IsInsideBS(ti->y, _thd.pos.y + _thd.offs.y, _thd.size.y + _thd.outersize.y)) {
@@ -1251,8 +1256,8 @@
 	const Sign *si;
 	int left, top, right, bottom;
 
-	if (!HasBit(_display_opt, DO_SHOW_SIGNS))
-		return;
+	/* Signs are turned off or are invisible */
+	if (!HasBit(_display_opt, DO_SHOW_SIGNS) || IsInvisibilitySet(TO_SIGNS)) return;
 
 	left = dpi->left;
 	top = dpi->top;
@@ -1516,6 +1521,12 @@
 		uint16 colour;
 
 		if (ss->width != 0) {
+			/* Do not draw signs nor station names if they are set invisible */
+			if (IsInvisibilitySet(TO_SIGNS) && ss->string != STR_2806) {
+				ss = ss->next;
+				continue;
+			}
+
 			int x = UnScaleByZoom(ss->x, zoom) - 1;
 			int y = UnScaleByZoom(ss->y, zoom) - 1;
 			int bottom = y + 11;
@@ -1566,8 +1577,8 @@
 	int y;
 	DrawPixelInfo *old_dpi;
 
-	byte mem[VIEWPORT_DRAW_MEM];
-	ParentSpriteToDraw *parent_list[6144];
+	SmallStackSafeStackAlloc<byte, VIEWPORT_DRAW_MEM> mem;
+	SmallStackSafeStackAlloc<ParentSpriteToDraw*, PARENT_LIST_SIZE> parent_list;
 
 	_cur_vd = &vd;
 
@@ -1591,9 +1602,9 @@
 	vd.dpi.dst_ptr = BlitterFactoryBase::GetCurrentBlitter()->MoveTo(old_dpi->dst_ptr, x - old_dpi->left, y - old_dpi->top);
 
 	vd.parent_list = parent_list;
-	vd.eof_parent_list = endof(parent_list);
+	vd.eof_parent_list = parent_list.EndOf();
 	vd.spritelist_mem = mem;
-	vd.eof_spritelist_mem = endof(mem) - sizeof(LARGEST_SPRITELIST_STRUCT);
+	vd.eof_spritelist_mem = mem.EndOf() - sizeof(LARGEST_SPRITELIST_STRUCT);
 	vd.last_string = &vd.first_string;
 	vd.first_string = NULL;
 	vd.last_tile = &vd.first_tile;
@@ -1979,7 +1990,8 @@
 {
 	const Sign *si;
 
-	if (!HasBit(_display_opt, DO_SHOW_SIGNS) || _current_player == PLAYER_SPECTATOR) return false;
+	/* Signs are turned off, or they are transparent and invisibility is ON, or player is a spectator */
+	if (!HasBit(_display_opt, DO_SHOW_SIGNS) || IsInvisibilitySet(TO_SIGNS) || _current_player == PLAYER_SPECTATOR) return false;
 
 	switch (vp->zoom) {
 		case ZOOM_LVL_NORMAL:
--- a/src/viewport_type.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/viewport_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -11,12 +11,19 @@
 #include "tile_type.h"
 #include "newgrf_fsmports.h"
 
+/**
+ * Data structure for viewport, display of a part of the world
+ */
 struct ViewPort {
-	int left,top;                       // screen coordinates for the viewport
-	int width, height;                  // screen width/height for the viewport
+	int left;    ///< Screen coordinate left egde of the viewport
+	int top;     ///< Screen coordinate top edge of the viewport
+	int width;   ///< Screen width of the viewport
+	int height;  ///< Screen height of the viewport
 
-	int virtual_left, virtual_top;      // virtual coordinates
-	int virtual_width, virtual_height;  // these are just width << zoom, height << zoom
+	int virtual_left;    ///< Virtual left coordinate
+	int virtual_top;     ///< Virtual top coordinate
+	int virtual_width;   ///< width << zoom
+	int virtual_height;  ///< height << zoom
 
 	ZoomLevel zoom;
 };
@@ -59,7 +66,7 @@
 	VHM_RAIL    = 5, ///< rail pieces
 };
 
-/* highlighting draw styles */
+/** Highlighting draw styles */
 enum HighLightStyle {
 	HT_NONE   = 0x00,
 	HT_RECT   = 0x80,
--- a/src/water_cmd.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/water_cmd.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -13,7 +13,7 @@
 #include "viewport_func.h"
 #include "command_func.h"
 #include "town.h"
-#include "news.h"
+#include "news_func.h"
 #include "depot.h"
 #include "vehicle_gui.h"
 #include "train.h"
@@ -35,6 +35,9 @@
 #include "settings_type.h"
 #include "clear_map.h"
 #include "tree_map.h"
+#include "station_base.h"
+#include "airport.h"
+#include "newgrf_cargo.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -594,6 +597,9 @@
 	if (image < 4) image += water_base;
 	if (draw_ground) DrawGroundSprite(image, PAL_NONE);
 
+	/* End now if buildings are invisible */
+	if (IsInvisibilitySet(TO_BUILDINGS)) return;
+
 	for (; wdts->delta_x != 0x80; wdts++) {
 		AddSortableSpriteToDraw(wdts->image + base + ((wdts->image < 24) ? locks_base : 0), palette,
 			ti->x + wdts->delta_x, ti->y + wdts->delta_y,
@@ -859,7 +865,7 @@
 
 		SetDParam(0, pass);
 		AddNewsItem(STR_B006_FLOOD_VEHICLE_DESTROYED,
-			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
+			NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
 			v->index,
 			0);
 		CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
@@ -1044,7 +1050,7 @@
 				if (IsTileType(dest, MP_WATER)) continue;
 
 				uint z_dest;
-				Slope slope_dest = (Slope)(GetFoundationSlope(dest, &z_dest) & ~SLOPE_HALFTILE_MASK & ~SLOPE_STEEP);
+				Slope slope_dest = GetFoundationSlope(dest, &z_dest) & ~SLOPE_HALFTILE_MASK & ~SLOPE_STEEP;
 				if (z_dest > 0) continue;
 
 				if (!HasBit(_flood_from_dirs[slope_dest], ReverseDir(dir))) continue;
@@ -1054,7 +1060,7 @@
 			break;
 
 		case FLOOD_DRYUP: {
-			Slope slope_here = (Slope)(GetFoundationSlope(tile, NULL) & ~SLOPE_HALFTILE_MASK & ~SLOPE_STEEP);
+			Slope slope_here = GetFoundationSlope(tile, NULL) & ~SLOPE_HALFTILE_MASK & ~SLOPE_STEEP;
 			uint check_dirs = _flood_from_dirs[slope_here];
 			uint dir;
 			FOR_EACH_SET_BIT(dir, check_dirs) {
@@ -1101,7 +1107,7 @@
 					uint dir;
 					FOR_EACH_SET_BIT(dir, check_dirs) {
 						TileIndex dest = TILE_ADD(tile, TileOffsByDir((Direction)dir));
-						Slope slope_dest = (Slope)(GetTileSlope(dest, NULL) & ~SLOPE_STEEP);
+						Slope slope_dest = GetTileSlope(dest, NULL) & ~SLOPE_STEEP;
 						if (slope_dest == SLOPE_FLAT || IsSlopeWithOneCornerRaised(slope_dest)) {
 							MakeShore(tile);
 							break;
--- a/src/waypoint.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/waypoint.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -7,12 +7,12 @@
 
 #include "command_func.h"
 #include "landscape.h"
-#include "order.h"
+#include "order_func.h"
 #include "rail_map.h"
 #include "rail.h"
 #include "bridge_map.h"
 #include "saveload.h"
-#include "station.h"
+#include "station_base.h"
 #include "town.h"
 #include "waypoint.h"
 #include "variables.h"
@@ -31,6 +31,8 @@
 #include "signal_func.h"
 #include "player_func.h"
 #include "settings_type.h"
+#include "newgrf_station.h"
+#include "oldpool_func.h"
 
 #include "table/strings.h"
 
@@ -235,7 +237,7 @@
 		FOR_ALL_VEHICLES(v) {
 			if (v->type == VEH_TRAIN &&
 					v->First() == v &&
-					v->current_order.type == OT_GOTO_WAYPOINT &&
+					v->current_order.IsType(OT_GOTO_WAYPOINT) &&
 					v->dest_tile == wp->xy) {
 				v->dest_tile = tile;
 			}
--- a/src/waypoint.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/waypoint.h	Tue Apr 15 00:47:19 2008 +0000
@@ -5,11 +5,12 @@
 #ifndef WAYPOINT_H
 #define WAYPOINT_H
 
+#include "waypoint_type.h"
 #include "oldpool.h"
 #include "rail_map.h"
 #include "command_type.h"
+#include "station_type.h"
 
-struct Waypoint;
 DECLARE_OLD_POOL(Waypoint, Waypoint, 3, 8000)
 
 struct Waypoint : PoolItem<Waypoint, WaypointID, &_Waypoint_pool> {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/waypoint_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -0,0 +1,11 @@
+/* $Id$ */
+
+/** @file waypoint_type.h Types related to waypoints. */
+
+#ifndef WAYPOINT_TYPE_H
+#define WAYPOINT_TYPE_H
+
+typedef uint16 WaypointID;
+struct Waypoint;
+
+#endif /* WAYPOINT_TYPE_H */
--- a/src/widget.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/widget.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -54,7 +54,7 @@
 	Scrollbar *sb;
 
 	switch (wi->type) {
-		case WWT_SCROLLBAR: {
+		case WWT_SCROLLBAR:
 			/* vertical scroller */
 			w->flags4 &= ~WF_HSCROLL;
 			w->flags4 &= ~WF_SCROLL2;
@@ -63,8 +63,8 @@
 			pos = y;
 			sb = &w->vscroll;
 			break;
-		}
-		case WWT_SCROLL2BAR: {
+
+		case WWT_SCROLL2BAR:
 			/* 2nd vertical scroller */
 			w->flags4 &= ~WF_HSCROLL;
 			w->flags4 |= WF_SCROLL2;
@@ -73,8 +73,8 @@
 			pos = y;
 			sb = &w->vscroll2;
 			break;
-		}
-		case  WWT_HSCROLLBAR: {
+
+		case  WWT_HSCROLLBAR:
 			/* horizontal scroller */
 			w->flags4 &= ~WF_SCROLL2;
 			w->flags4 |= WF_HSCROLL;
@@ -83,8 +83,8 @@
 			pos = x;
 			sb = &w->hscroll;
 			break;
-		}
-		default: return; //this should never happen
+
+		default: NOT_REACHED();
 	}
 	if (pos <= mi+9) {
 		/* Pressing the upper button? */
@@ -94,7 +94,7 @@
 			if (sb->pos != 0) sb->pos--;
 		}
 		_left_button_clicked = false;
-	} else if (pos >= ma-10) {
+	} else if (pos >= ma - 10) {
 		/* Pressing the lower button? */
 		w->flags4 |= WF_SCROLL_DOWN;
 
@@ -186,6 +186,10 @@
 }
 
 
+/**
+ * Paint all widgets of a window.
+ * @param w Window
+ */
 void DrawWindowWidgets(const Window *w)
 {
 	const DrawPixelInfo* dpi = _cur_dpi;
@@ -216,17 +220,19 @@
 			break;
 		}
 
-		case WWT_PANEL: {
+		case WWT_PANEL:
 			assert(wi->data == 0);
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
 			break;
-		}
+
+		case WWT_EDITBOX:
+			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_LOWERED | FR_DARKENED);
+			break;
 
 		case WWT_TEXTBTN:
-		case WWT_TEXTBTN_2: {
+		case WWT_TEXTBTN_2:
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
-			}
-		/* fall through */
+			/* FALL THROUGH */
 
 		case WWT_LABEL: {
 			StringID str = wi->data;
@@ -253,28 +259,24 @@
 		}
 
 		case WWT_MATRIX: {
-			int c, d, ctr;
-			int x, amt1, amt2;
-			int color;
-
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
 
-			c = GB(wi->data, 0, 8);
-			amt1 = (wi->right - wi->left + 1) / c;
+			int c = GB(wi->data, 0, 8);
+			int amt1 = (wi->right - wi->left + 1) / c;
 
-			d = GB(wi->data, 8, 8);
-			amt2 = (wi->bottom - wi->top + 1) / d;
+			int d = GB(wi->data, 8, 8);
+			int amt2 = (wi->bottom - wi->top + 1) / d;
 
-			color = _colour_gradient[wi->color & 0xF][6];
+			int color = _colour_gradient[wi->color & 0xF][6];
 
-			x = r.left;
-			for (ctr = c; ctr > 1; ctr--) {
+			int x = r.left;
+			for (int ctr = c; ctr > 1; ctr--) {
 				x += amt1;
 				GfxFillRect(x, r.top + 1, x, r.bottom - 1, color);
 			}
 
 			x = r.top;
-			for (ctr = d; ctr > 1; ctr--) {
+			for (int ctr = d; ctr > 1; ctr--) {
 				x += amt2;
 				GfxFillRect(r.left + 1, x, r.right - 1, x, color);
 			}
@@ -282,13 +284,13 @@
 			color = _colour_gradient[wi->color & 0xF][4];
 
 			x = r.left - 1;
-			for (ctr = c; ctr > 1; ctr--) {
+			for (int ctr = c; ctr > 1; ctr--) {
 				x += amt1;
 				GfxFillRect(x, r.top + 1, x, r.bottom - 1, color);
 			}
 
 			x = r.top - 1;
-			for (ctr = d; ctr > 1; ctr--) {
+			for (int ctr = d; ctr > 1; ctr--) {
 				x += amt2;
 				GfxFillRect(r.left + 1, x, r.right - 1, x, color);
 			}
@@ -298,11 +300,8 @@
 
 		/* vertical scrollbar */
 		case WWT_SCROLLBAR: {
-			Point pt;
-			int c1, c2;
-
 			assert(wi->data == 0);
-			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
+			assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
 
 			/* draw up/down buttons */
 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_UP);
@@ -313,8 +312,8 @@
 			DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
 			DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, TC_BLACK);
 
-			c1 = _colour_gradient[wi->color & 0xF][3];
-			c2 = _colour_gradient[wi->color & 0xF][7];
+			int c1 = _colour_gradient[wi->color & 0xF][3];
+			int c2 = _colour_gradient[wi->color & 0xF][7];
 
 			/* draw "shaded" background */
 			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
@@ -326,16 +325,14 @@
 			GfxFillRect(r.left + 7, r.top + 10, r.left + 7, r.bottom - 10, c1);
 			GfxFillRect(r.left + 8, r.top + 10, r.left + 8, r.bottom - 10, c2);
 
-			pt = HandleScrollbarHittest(&w->vscroll, r.top, r.bottom);
+			Point pt = HandleScrollbarHittest(&w->vscroll, r.top, r.bottom);
 			DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_MIDDLE ? FR_LOWERED : FR_NONE);
 			break;
 		}
+
 		case WWT_SCROLL2BAR: {
-			Point pt;
-			int c1, c2;
-
 			assert(wi->data == 0);
-			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
+			assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
 
 			/* draw up/down buttons */
 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_UP | WF_SCROLL2));
@@ -346,8 +343,8 @@
 			DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, wi->color,  (clicked) ? FR_LOWERED : FR_NONE);
 			DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, TC_BLACK);
 
-			c1 = _colour_gradient[wi->color & 0xF][3];
-			c2 = _colour_gradient[wi->color & 0xF][7];
+			int c1 = _colour_gradient[wi->color & 0xF][3];
+			int c2 = _colour_gradient[wi->color & 0xF][7];
 
 			/* draw "shaded" background */
 			GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
@@ -359,18 +356,15 @@
 			GfxFillRect(r.left + 7, r.top + 10, r.left + 7, r.bottom - 10, c1);
 			GfxFillRect(r.left + 8, r.top + 10, r.left + 8, r.bottom - 10, c2);
 
-			pt = HandleScrollbarHittest(&w->vscroll2, r.top, r.bottom);
+			Point pt = HandleScrollbarHittest(&w->vscroll2, r.top, r.bottom);
 			DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_MIDDLE | WF_SCROLL2) ? FR_LOWERED : FR_NONE);
 			break;
 		}
 
 		/* horizontal scrollbar */
 		case WWT_HSCROLLBAR: {
-			Point pt;
-			int c1, c2;
-
 			assert(wi->data == 0);
-			assert(r.bottom - r.top == 11); // XXX - to ensure the same sizes are used everywhere!
+			assert(r.bottom - r.top == 11); // To ensure the same sizes are used everywhere!
 
 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL)) == (WF_SCROLL_UP | WF_HSCROLL));
 			DrawFrameRect(r.left, r.top, r.left + 9, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
@@ -380,8 +374,8 @@
 			DrawFrameRect(r.right - 9, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
 			DrawSprite(SPR_ARROW_RIGHT, PAL_NONE, r.right - 8 + clicked, r.top + 1 + clicked);
 
-			c1 = _colour_gradient[wi->color & 0xF][3];
-			c2 = _colour_gradient[wi->color & 0xF][7];
+			int c1 = _colour_gradient[wi->color & 0xF][3];
+			int c2 = _colour_gradient[wi->color & 0xF][7];
 
 			/* draw "shaded" background */
 			GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c2);
@@ -394,7 +388,7 @@
 			GfxFillRect(r.left + 10, r.top + 8, r.right - 10, r.top + 8, c2);
 
 			/* draw actual scrollbar */
-			pt = HandleScrollbarHittest(&w->hscroll, r.left, r.right);
+			Point pt = HandleScrollbarHittest(&w->hscroll, r.left, r.right);
 			DrawFrameRect(pt.x, r.top, pt.y, r.bottom, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL)) == (WF_SCROLL_MIDDLE | WF_HSCROLL) ? FR_LOWERED : FR_NONE);
 
 			break;
@@ -402,13 +396,12 @@
 
 		case WWT_FRAME: {
 			const StringID str = wi->data;
-			int c1, c2;
 			int x2 = r.left; // by default the left side is the left side of the widget
 
 			if (str != STR_NULL) x2 = DrawString(r.left + 6, r.top, str, TC_FROMSTRING);
 
-			c1 = _colour_gradient[wi->color][3];
-			c2 = _colour_gradient[wi->color][7];
+			int c1 = _colour_gradient[wi->color][3];
+			int c2 = _colour_gradient[wi->color][7];
 
 			/* Line from upper left corner to start of text */
 			GfxFillRect(r.left, r.top + 4, r.left + 4, r.top + 4, c1);
@@ -432,39 +425,37 @@
 			break;
 		}
 
-		case WWT_STICKYBOX: {
+		case WWT_STICKYBOX:
 			assert(wi->data == 0);
-			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
+			assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
 
 			clicked = !!(w->flags4 & WF_STICKY);
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
 			DrawSprite((clicked) ? SPR_PIN_UP : SPR_PIN_DOWN, PAL_NONE, r.left + 2 + clicked, r.top + 3 + clicked);
 			break;
-		}
 
-		case WWT_RESIZEBOX: {
+		case WWT_RESIZEBOX:
 			assert(wi->data == 0);
-			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
+			assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
 
 			clicked = !!(w->flags4 & WF_SIZING);
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
 			DrawSprite(SPR_WINDOW_RESIZE, PAL_NONE, r.left + 3 + clicked, r.top + 3 + clicked);
 			break;
-		}
 
 		case WWT_CLOSEBOX: {
 			const StringID str = wi->data;
 
 			assert(str == STR_00C5 || str == STR_00C6); // black or silver cross
-			assert(r.right - r.left == 10); // ensure the same sizes are used everywhere
+			assert(r.right - r.left == 10); // To ensure the same sizes are used everywhere
 
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_NONE);
 			DrawString(r.left + 2, r.top + 2, str, TC_FROMSTRING);
 			break;
 		}
 
-		case WWT_CAPTION: {
-			assert(r.bottom - r.top == 13); // XXX - to ensure the same sizes are used everywhere!
+		case WWT_CAPTION:
+			assert(r.bottom - r.top == 13); // To ensure the same sizes are used everywhere!
 			DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_BORDERONLY);
 			DrawFrameRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, wi->color, (w->caption_color == 0xFF) ? FR_LOWERED | FR_DARKENED : FR_LOWERED | FR_DARKENED | FR_BORDERONLY);
 
@@ -474,7 +465,6 @@
 
 			DrawStringCenteredTruncated(r.left + 2, r.right - 2, r.top + 2, wi->data, 0x84);
 			break;
-		}
 
 		case WWT_DROPDOWN: {
 			assert(r.bottom - r.top == 11); // ensure consistent size
@@ -516,7 +506,7 @@
 	int16 offset = w->widget[a].left;
 	int16 length = w->widget[b].right - offset;
 
-	w->widget[a].right  = (length / 2) + offset;
+	w->widget[a].right = (length / 2) + offset;
 
 	w->widget[b].left  = w->widget[a].right + 1;
 }
@@ -583,6 +573,7 @@
 	}
 }
 
+/** Resize a widget and shuffle other widgets around to fit. */
 void ResizeWindowForWidget(Window *w, int widget, int delta_x, int delta_y)
 {
 	int right  = w->widget[widget].right;
--- a/src/widgets/dropdown.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/widgets/dropdown.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -201,7 +201,7 @@
 	}
 }
 
-void ShowDropDownList(Window *w, DropDownList *list, int selected, int button)
+void ShowDropDownList(Window *w, DropDownList *list, int selected, int button, uint width)
 {
 	bool is_dropdown_menu_shown = w->IsWidgetLowered(button);
 
@@ -246,17 +246,19 @@
 		}
 	}
 
+	if (width == 0) width = wi->right - wi->left + 1;
+
 	Window *dw = AllocateWindow(
 		w->left + wi->left,
 		top,
-		wi->right - wi->left + 1,
+		width,
 		height,
 		DropDownMenuWndProc,
 		WC_DROPDOWN_MENU,
 		_dropdown_menu_widgets);
 
 	dw->widget[0].color = wi->color;
-	dw->widget[0].right = wi->right - wi->left;
+	dw->widget[0].right = width + 1;
 	dw->widget[0].bottom = height - 1;
 
 	dw->SetWidgetHiddenState(1, !scroll);
@@ -286,7 +288,7 @@
 	WP(dw, dropdown_d).drag_mode        = true;
 }
 
-void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int button, uint32 disabled_mask, uint32 hidden_mask)
+void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int button, uint32 disabled_mask, uint32 hidden_mask, uint width)
 {
 	/* Don't create a new list if we're just closing an existing menu */
 	if (w->IsWidgetLowered(button)) {
@@ -310,9 +312,13 @@
 		return;
 	}
 
-	ShowDropDownList(w, list, selected, button);
+	ShowDropDownList(w, list, selected, button, width);
 }
 
+/**
+ * Delete the drop-down menu from window \a pw
+ * @param pw Parent window of the drop-down menu window
+ */
 void HideDropDownMenu(Window *pw)
 {
 	Window **wz;
--- a/src/widgets/dropdown_func.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/widgets/dropdown_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -4,7 +4,7 @@
 #define WIDGETS_DROPDOWN_FUNC_H
 
 /* Show drop down menu containing a fixed list of strings */
-void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int button, uint32 disabled_mask, uint32 hidden_mask);
+void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int button, uint32 disabled_mask, uint32 hidden_mask, uint width = 0);
 
 /* Hide drop down menu of a parent window */
 void HideDropDownMenu(Window *pw);
--- a/src/widgets/dropdown_type.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/widgets/dropdown_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -60,7 +60,8 @@
  * @param selected The initially selected list item.
  * @param button   The widget within the parent window that is used to determine
  *                 the list's location.
+ * @param width    Override the width determined by the selected widget.
  */
-void ShowDropDownList(Window *w, DropDownList *list, int selected, int button);
+void ShowDropDownList(Window *w, DropDownList *list, int selected, int button, uint width = 0);
 
 #endif /* WIDGETS_DROPDOWN_TYPE_H */
--- a/src/window.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/window.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -22,10 +22,16 @@
 
 #include "table/sprites.h"
 
-/* delta between mouse cursor and upper left corner of dragged window */
+/** delta between mouse cursor and upper left corner of dragged window */
 static Point _drag_delta;
 
 static Window _windows[MAX_NUMBER_OF_WINDOWS];
+
+/**
+ * List of windows opened at the screen.
+ * Uppermost window is at  _z_windows[_last_z_window - 1],
+ * bottom window is at _z_windows[0]
+ */
 Window *_z_windows[lengthof(_windows)];
 Window **_last_z_window; ///< always points to the next free space in the z-array
 
@@ -116,6 +122,13 @@
 static void StartWindowDrag(Window *w);
 static void StartWindowSizing(Window *w);
 
+/**
+ * Dispatch left mouse-button (possibly double) click in window.
+ * @param w Window to dispatch event in
+ * @param x X coordinate of the click
+ * @param y Y coordinate of the click
+ * @param double_click Was it a double click?
+ */
 static void DispatchLeftClickEvent(Window *w, int x, int y, bool double_click)
 {
 	WindowEvent e;
@@ -175,6 +188,12 @@
 	w->wndproc(w, &e);
 }
 
+/**
+ * Dispatch right mouse-button click in window.
+ * @param w Window to dispatch event in
+ * @param x X coordinate of the click
+ * @param y Y coordinate of the click
+ */
 static void DispatchRightClickEvent(Window *w, int x, int y)
 {
 	WindowEvent e;
@@ -197,9 +216,10 @@
 	w->wndproc(w, &e);
 }
 
-/** Dispatch the mousewheel-action to the window which will scroll any
- * compatible scrollbars if the mouse is pointed over the bar or its contents
- * @param *w Window
+/**
+ * Dispatch the mousewheel-action to the window.
+ * The window will scroll any compatible scrollbars if the mouse is pointed over the bar or its contents
+ * @param w Window
  * @param widget the widget where the scrollwheel was used
  * @param wheel scroll up or down
  */
@@ -232,6 +252,14 @@
 
 static void DrawOverlappedWindow(Window* const *wz, int left, int top, int right, int bottom);
 
+/**
+ * From a rectangle that needs redrawing, find the windows that intersect with the rectangle.
+ * These windows should be re-painted.
+ * @param left Left edge of the rectangle that should be repainted
+ * @param top Top edge of the rectangle that should be repainted
+ * @param right Right edge of the rectangle that should be repainted
+ * @param bottom Bottom edge of the rectangle that should be repainted
+ */
 void DrawOverlappedWindowForAll(int left, int top, int right, int bottom)
 {
 	Window* const *wz;
@@ -249,10 +277,23 @@
 	}
 }
 
+/**
+ * Generate repaint events for the visible part of window *wz within the rectangle.
+ *
+ * The function goes recursively upwards in the window stack, and splits the rectangle
+ * into multiple pieces at the window edges, so obscured parts are not redrawn.
+ *
+ * @param wz Pointer into window stack, pointing at the window that needs to be repainted
+ * @param left Left edge of the rectangle that should be repainted
+ * @param top Top edge of the rectangle that should be repainted
+ * @param right Right edge of the rectangle that should be repainted
+ * @param bottom Bottom edge of the rectangle that should be repainted
+ *
+ * @todo Swap this function to above DrawOverlappedWindowForAll() to eliminate the forward declaration
+ */
 static void DrawOverlappedWindow(Window* const *wz, int left, int top, int right, int bottom)
 {
 	Window* const *vz = wz;
-	int x;
 
 	while (++vz != _last_z_window) {
 		const Window *v = *vz;
@@ -261,6 +302,9 @@
 				bottom > v->top &&
 				left < v->left + v->width &&
 				top < v->top + v->height) {
+			/* v and rectangle intersect with eeach other */
+			int x;
+
 			if (left < (x = v->left)) {
 				DrawOverlappedWindow(wz, left, top, x, bottom);
 				DrawOverlappedWindow(wz, x, top, right, bottom);
@@ -302,6 +346,12 @@
 	}
 }
 
+/**
+ * Dispatch an event to a possibly non-existing window.
+ * If the window pointer w is \c NULL, the event is not dispatched
+ * @param w Window to dispatch the event to, may be \c NULL
+ * @param event Event to dispatch
+ */
 void CallWindowEventNP(Window *w, int event)
 {
 	WindowEvent e;
@@ -310,6 +360,11 @@
 	w->wndproc(w, &e);
 }
 
+/**
+ * Mark entire window as dirty (in need of re-paint)
+ * @param w Window to redraw
+ * @ingroup dirty
+ */
 void SetWindowDirty(const Window *w)
 {
 	if (w == NULL) return;
@@ -334,12 +389,13 @@
 /** Find the z-value of a window. A window must already be open
  * or the behaviour is undefined but function should never fail
  * @param w window to query Z Position
- * @return the window that matches it */
+ * @return Pointer into the window-list at the position of \a w
+ */
 Window **FindWindowZPosition(const Window *w)
 {
 	Window **wz;
 
-	for (wz = _z_windows; wz != _last_z_window; wz++) {
+	FOR_ALL_WINDOWS(wz) {
 		if (*wz == w) return wz;
 	}
 
@@ -348,14 +404,15 @@
 	return NULL;
 }
 
+/**
+ * Remove window and all its child windows from the window stack
+ */
 void DeleteWindow(Window *w)
 {
-	Window *v;
-	Window **wz;
 	if (w == NULL) return;
 
 	/* Delete any children a window might have in a head-recursive manner */
-	v = FindChildWindow(w);
+	Window *v = FindChildWindow(w);
 	if (v != NULL) DeleteWindow(v);
 
 	if (_thd.place_mode != VHM_NONE &&
@@ -375,12 +432,18 @@
 
 	/* Find the window in the z-array, and effectively remove it
 	 * by moving all windows after it one to the left */
-	wz = FindWindowZPosition(w);
+	Window **wz = FindWindowZPosition(w);
 	if (wz == NULL) return;
 	memmove(wz, wz + 1, (byte*)_last_z_window - (byte*)wz);
 	_last_z_window--;
 }
 
+/**
+ * Find a window by its class and window number
+ * @param cls Window class
+ * @param number Number of the window within the window class
+ * @return Pointer to the found window, or \c NULL if not available
+ */
 Window *FindWindowById(WindowClass cls, WindowNumber number)
 {
 	Window* const *wz;
@@ -393,11 +456,20 @@
 	return NULL;
 }
 
+/**
+ * Delete a window by its class and window number (if it is open).
+ * @param cls Window class
+ * @param number Number of the window within the window class
+ */
 void DeleteWindowById(WindowClass cls, WindowNumber number)
 {
 	DeleteWindow(FindWindowById(cls, number));
 }
 
+/**
+ * Delete all windows of a given class
+ * @param cls Window class of windows to delete
+ */
 void DeleteWindowByClass(WindowClass cls)
 {
 	Window* const *wz;
@@ -625,9 +697,8 @@
  * @param window_number number being assigned to the new window
  * @param data the data to be given during the WE_CREATE message
  * @return Window pointer of the newly created window */
-static Window *LocalAllocateWindow(
-							int x, int y, int min_width, int min_height, int def_width, int def_height,
-							WindowProc *proc, WindowClass cls, const Widget *widget, int window_number, void *data)
+static Window *LocalAllocateWindow(int x, int y, int min_width, int min_height, int def_width, int def_height,
+				WindowProc *proc, WindowClass cls, const Widget *widget, int window_number, void *data)
 {
 	Window *w = FindFreeWindow();
 
@@ -751,18 +822,14 @@
  * @param *proc see WindowProc function to call when any messages/updates happen to the window
  * @param cls see WindowClass class of the window, used for identification and grouping
  * @param *widget see Widget pointer to the window layout and various elements
- * @return Window pointer of the newly created window */
-Window *AllocateWindow(
-							int x, int y, int width, int height,
-							WindowProc *proc, WindowClass cls, const Widget *widget, void *data)
+ * @return Window pointer of the newly created window
+ */
+Window *AllocateWindow(int x, int y, int width, int height,
+			WindowProc *proc, WindowClass cls, const Widget *widget, void *data)
 {
 	return LocalAllocateWindow(x, y, width, height, width, height, proc, cls, widget, 0, data);
 }
 
-struct SizeRect {
-	int left,top,width,height;
-};
-
 
 static bool IsGoodAutoPlace1(int left, int top, int width, int height, Point &pos)
 {
@@ -1002,7 +1069,7 @@
 
 restart_search:
 	/* Delete all windows, reset z-array.
-	 *When we find the window to delete, we need to restart the search
+	 * When we find the window to delete, we need to restart the search
 	 * as deleting this window could cascade in deleting (many) others
 	 * anywhere in the z-array. We call DeleteWindow() so that it can properly
 	 * release own alloc'd memory, which otherwise could result in memleaks */
@@ -1158,12 +1225,15 @@
 	return true;
 }
 
-/** Update all the widgets of a window based on their resize flags
+/**
+ * Resize the window.
+ * Update all the widgets of a window based on their resize flags
  * Both the areas of the old window and the new sized window are set dirty
  * ensuring proper redrawal.
  * @param w Window to resize
  * @param x delta x-size of changed window (positive if larger, etc.)
- * @param y delta y-size of changed window */
+ * @param y delta y-size of changed window
+ */
 void ResizeWindow(Window *w, int x, int y)
 {
 	Widget *wi;
@@ -1409,6 +1479,10 @@
 	return false;
 }
 
+/**
+ * Start window dragging
+ * @param w Window to start dragging
+ */
 static void StartWindowDrag(Window *w)
 {
 	w->flags4 |= WF_DRAGGING;
@@ -1421,6 +1495,10 @@
 	DeleteWindowById(WC_DROPDOWN_MENU, 0);
 }
 
+/**
+ * Start resizing a window
+ * @param w Window to start resizing
+ */
 static void StartWindowSizing(Window *w)
 {
 	w->flags4 |= WF_SIZING;
@@ -1632,11 +1710,10 @@
 }
 
 /** Handle keyboard input.
- * @param key Lower 8 bits contain the ASCII character, the higher
- * 16 bits the keycode */
+ * @param key Lower 8 bits contain the ASCII character, the higher 16 bits the keycode
+ */
 void HandleKeypress(uint32 key)
 {
-	Window* const *wz;
 	WindowEvent e;
 	/* Stores if a window with a textfield for typing is open
 	 * If this is the case, keypress events are only passed to windows with text fields and
@@ -1685,7 +1762,7 @@
 	}
 
 	/* Call the event, start with the uppermost window. */
-	for (wz = _last_z_window; wz != _z_windows;) {
+	for (Window* const *wz = _last_z_window; wz != _z_windows;) {
 		Window *w = *--wz;
 
 		/* if a query window is open, only call the event for certain window types */
@@ -1709,6 +1786,9 @@
 	}
 }
 
+/**
+ * State of CONTROL key has changed
+ */
 void HandleCtrlChanged()
 {
 	WindowEvent e;
@@ -1727,8 +1807,18 @@
 extern void UpdateTileSelection();
 extern bool VpHandlePlaceSizingDrag();
 
+/**
+ * Local counter that is incremented each time an mouse input event is detected.
+ * The counter is used to stop auto-scrolling.
+ * @see HandleAutoscroll()
+ * @see HandleMouseEvents()
+ */
 static int _input_events_this_tick = 0;
 
+/**
+ * If needed and switched on, perform auto scrolling (automatically
+ * moving window contents when mouse is near edge of the window).
+ */
 static void HandleAutoscroll()
 {
 	Window *w;
@@ -1870,6 +1960,9 @@
 	}
 }
 
+/**
+ * Handle a mouse event from the video driver
+ */
 void HandleMouseEvents()
 {
 	static int double_click_time = 0;
@@ -1919,12 +2012,18 @@
 	MouseLoop(click, mousewheel);
 }
 
+/**
+ * Regular call from the global game loop
+ */
 void InputLoop()
 {
 	HandleMouseEvents();
 	HandleAutoscroll();
 }
 
+/**
+ * Update the continuously changing contents of the windows, such as the viewports
+ */
 void UpdateWindows()
 {
 	Window* const *wz;
@@ -1959,6 +2058,13 @@
 }
 
 
+/**
+ * In a window with menu_d custom extension, retrieve the menu item number from a position
+ * @param w Window holding the menu items
+ * @param x X coordinate of the position
+ * @param y Y coordinate of the position
+ * @return Index number of the menu item, or \c -1 if no valid selection under position
+ */
 int GetMenuItemIndex(const Window *w, int x, int y)
 {
 	if ((x -= w->left) >= 0 && x < w->width && (y -= w->top + 1) >= 0) {
@@ -1972,6 +2078,10 @@
 	return -1;
 }
 
+/**
+ * Mark window data as invalid (in need of re-computing)
+ * @param w Window with invalid data
+ */
 void InvalidateWindow(WindowClass cls, WindowNumber number)
 {
 	Window* const *wz;
@@ -1982,6 +2092,12 @@
 	}
 }
 
+/*
+ * Mark a particular widget in a particular window as dirty (in need of repainting)
+ * @param cls Window class
+ * @param number Window number in that class
+ * @param widget_index Index number of the widget that needs repainting
+ */
 void InvalidateWindowWidget(WindowClass cls, WindowNumber number, byte widget_index)
 {
 	Window* const *wz;
@@ -1994,6 +2110,10 @@
 	}
 }
 
+/*
+ * Mark all windows of a particular class as dirty (in need of repainting)
+ * @param cls Window class
+ */
 void InvalidateWindowClasses(WindowClass cls)
 {
 	Window* const *wz;
@@ -2003,12 +2123,21 @@
 	}
 }
 
+/**
+ * Mark window data as invalid (in need of re-computing)
+ * @param w Window with invalid data
+ */
 void InvalidateThisWindowData(Window *w)
 {
 	CallWindowEventNP(w, WE_INVALIDATE_DATA);
 	SetWindowDirty(w);
 }
 
+/**
+ * Mark window data the window of a given class and specific window number as invalid (in need of re-computing)
+ * @param cls Window class
+ * @param number Window number within the class
+ */
 void InvalidateWindowData(WindowClass cls, WindowNumber number)
 {
 	Window* const *wz;
@@ -2019,6 +2148,10 @@
 	}
 }
 
+/**
+ * Mark window data of all windows of a given class as invalid (in need of re-computing)
+ * @param cls Window class
+ */
 void InvalidateWindowClassesData(WindowClass cls)
 {
 	Window* const *wz;
@@ -2028,6 +2161,9 @@
 	}
 }
 
+/**
+ * Dispatch WE_TICK event over all windows
+ */
 void CallWindowTickEvent()
 {
 	Window* const *wz;
@@ -2093,6 +2229,11 @@
 	DeleteWindowById(WC_STATUS_BAR, 0);
 }
 
+/**
+ * (Re)position main toolbar window at the screen
+ * @param w Window structure of the main toolbar window, may also be \c NULL
+ * @return X coordinate of left edge of the repositioned toolbar window
+ */
 int PositionMainToolbar(Window *w)
 {
 	DEBUG(misc, 5, "Repositioning Main Toolbar...");
@@ -2110,6 +2251,11 @@
 	return w->left;
 }
 
+/**
+ * Relocate all windows to fit the new size of the game application screen
+ * @param neww New width of the game application screen
+ * @param newh New height of the game appliction screen
+ */
 void RelocateAllWindows(int neww, int newh)
 {
 	Window* const *wz;
@@ -2175,15 +2321,22 @@
 				IConsoleResize(w);
 				continue;
 
-			default:
+			default: {
 				left = w->left;
 				if (left + (w->width >> 1) >= neww) left = neww - w->width;
 				if (left < 0) left = 0;
 
 				top = w->top;
 				if (top + (w->height >> 1) >= newh) top = newh - w->height;
-				if (top < 0) top = 0;
-				break;
+
+				const Window *wt = FindWindowById(WC_MAIN_TOOLBAR, 0);
+				if (wt != NULL) {
+					if (top < wt->height) top = wt->height;
+					if (top >= newh) top = newh - 1;
+				} else {
+					if (top < 0) top = 0;
+				}
+			} break;
 		}
 
 		if (w->viewport != NULL) {
--- a/src/window_func.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/window_func.h	Tue Apr 15 00:47:19 2008 +0000
@@ -8,11 +8,6 @@
 #include "window_type.h"
 #include "player_type.h"
 
-/**
- * Marks the window as dirty for repaint.
- *
- * @ingroup dirty
- */
 void SetWindowDirty(const Window *w);
 void SendWindowMessage(WindowClass wnd_class, WindowNumber wnd_num, int msg, int wparam, int lparam);
 void SendWindowMessageClass(WindowClass wnd_class, int msg, int wparam, int lparam);
--- a/src/window_gui.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/window_gui.h	Tue Apr 15 00:47:19 2008 +0000
@@ -73,6 +73,9 @@
 	WIDGET_LIST_END = -1, ///< indicate the end of widgets' list for vararg functions
 };
 
+/**
+ * Window widget data structure
+ */
 struct Widget {
 	byte type;                        ///< Widget type, see WindowWidgetTypes
 	byte display_flags;               ///< Resize direction, alignment, etc. during resizing, see ResizeFlags
@@ -82,6 +85,9 @@
 	StringID tooltips;                ///< Tooltips that are shown when rightclicking on a widget
 };
 
+/**
+ * Flags to describe the look of the frame
+ */
 enum FrameFlags {
 	FR_NONE         =  0,
 	FR_TRANSPARENT  =  1 << 0,  ///< Makes the background transparent if set
@@ -92,21 +98,25 @@
 
 DECLARE_ENUM_AS_BIT_SET(FrameFlags);
 
+/* wiget.cpp */
 void DrawFrameRect(int left, int top, int right, int bottom, int color, FrameFlags flags);
 
+/**
+ * Available window events
+ */
 enum WindowEventCodes {
-	WE_CREATE,
-	WE_DESTROY,
-	WE_PAINT,
-	WE_KEYPRESS,
-	WE_CLICK,
-	WE_DOUBLE_CLICK,
-	WE_RCLICK,
+	WE_CREATE,       ///< Initialize the Window
+	WE_DESTROY,      ///< Prepare for deletion of the window
+	WE_PAINT,        ///< Repaint the window contents
+	WE_KEYPRESS,     ///< Key pressed
+	WE_CLICK,        ///< Left mouse button click
+	WE_DOUBLE_CLICK, ///< Left mouse button double click
+	WE_RCLICK,       ///< Right mouse button click
 	WE_MOUSEOVER,
 	WE_MOUSELOOP,
 	WE_MOUSEWHEEL,
-	WE_TICK,
-	WE_4,
+	WE_TICK,         ///< Regularly occurring event (about once every 20 seconds orso, 10 days) for slowly changing content (typically list sorting)
+	WE_4,            ///< Regularly occurring event for updating continuously changing window content (other than view ports), or timer expiring
 	WE_TIMEOUT,
 	WE_PLACE_OBJ,
 	WE_ABORT_PLACE_OBJ,
@@ -119,13 +129,17 @@
 	WE_PLACE_MOUSEUP,
 	WE_PLACE_PRESIZE,
 	WE_DROPDOWN_SELECT,
-	WE_RESIZE,
-	WE_MESSAGE,
+	WE_RESIZE,          ///< Request to resize the window, @see WindowEvent.we.resize
+	WE_MESSAGE,         ///< Receipt of a message from another window. @see WindowEvent.we.message, SendWindowMessage(), SendWindowMessageClass()
 	WE_SCROLL,
-	WE_INVALIDATE_DATA,
-	WE_CTRL_CHANGED,
+	WE_INVALIDATE_DATA, ///< Notification that data displayed by the window is obsolete
+	WE_CTRL_CHANGED,    ///< CTRL key has changed state
 };
 
+/**
+ * Data structures for additional data associated with a window event
+ * @see WindowEventCodes
+ */
 struct WindowEvent {
 	byte event;
 	union {
@@ -200,27 +214,40 @@
 	} we;
 };
 
+/**
+ * High level window description
+ */
 struct WindowDesc {
-	int16 left, top, minimum_width, minimum_height, default_width, default_height;
-	WindowClass cls;
-	WindowClass parent_cls;
-	uint32 flags;
-	const Widget *widgets;
-	WindowProc *proc;
+	int16 left;             ///< Prefered x position of left edge of the window, @see WindowDefaultPosition()
+	int16 top;              ///< Prefered y position of the top of the window, @see WindowDefaultPosition()
+	int16 minimum_width;    ///< Minimal width of the window
+	int16 minimum_height;   ///< Minimal height of the window
+	int16 default_width;    ///< Prefered initial width of the window
+	int16 default_height;   ///< Prefered initial height of the window
+	WindowClass cls;        ///< Class of the window, @see WindowClass
+	WindowClass parent_cls; ///< Class of the parent window, @see WindowClass
+	uint32 flags;           ///< Flags, @see WindowDefaultFlags
+	const Widget *widgets;  ///< List of widgets with their position and size for the window
+	WindowProc *proc;       ///< Window event handler function for the window
 };
 
+/**
+ * Window default widget/window handling flags
+ */
 enum WindowDefaultFlag {
 	WDF_STD_TOOLTIPS    =   1 << 0, ///< use standard routine when displaying tooltips
-	WDF_DEF_WIDGET      =   1 << 1, ///< default widget control for some widgets in the on click event
-	WDF_STD_BTN         =   1 << 2, ///< default handling for close and drag widgets (widget no 0 and 1)
+	WDF_DEF_WIDGET      =   1 << 1, ///< Default widget control for some widgets in the on click event, @see DispatchLeftClickEvent()
+	WDF_STD_BTN         =   1 << 2, ///< Default handling for close and titlebar widgets (widget no 0 and 1)
 
-	WDF_UNCLICK_BUTTONS =   1 << 4, ///< Unclick buttons when the window event times out */
+	WDF_UNCLICK_BUTTONS =   1 << 4, ///< Unclick buttons when the window event times out
 	WDF_STICKY_BUTTON   =   1 << 5, ///< Set window to sticky mode; they are not closed unless closed with 'X' (widget 2)
-	WDF_RESIZABLE       =   1 << 6, ///< A window can be resized
+	WDF_RESIZABLE       =   1 << 6, ///< Window can be resized
 	WDF_MODAL           =   1 << 7, ///< The window is a modal child of some other window, meaning the parent is 'inactive'
 };
 
-/* can be used as x or y coordinates to cause a specific placement */
+/**
+ * Special values for 'left' and 'top' to cause a specific placement
+ */
 enum WindowDefaultPosition {
 	WDP_AUTO      = -1, ///< Find a place automatically
 	WDP_CENTER    = -2, ///< Center the window (left/right or top/bottom)
@@ -230,46 +257,65 @@
 
 #define WP(ptr, str) (*(str*)(ptr)->custom)
 
+/**
+ * Scrollbar data structure
+ */
 struct Scrollbar {
-	uint16 count, cap, pos;
+	uint16 count;  ///< Number of elements in the list
+	uint16 cap;    ///< Number of visible elements of the scroll bar
+	uint16 pos;
 };
 
+/**
+ * Data structure for resizing a window
+ */
 struct ResizeInfo {
-	uint width; ///< Minimum width and height
-	uint height;
-	uint step_width; ///< In how big steps the width and height go
-	uint step_height;
+	uint width;       ///< Minimum allowed width of the window
+	uint height;      ///< Minimum allowed height of the window
+	uint step_width;  ///< Step-size of width resize changes
+	uint step_height; ///< Step-size of height resize changes
 };
 
+/**
+ * Message data structure for messages sent between winodows
+ * @see SendWindowMessageW()
+ */
 struct WindowMessage {
 	int msg;
 	int wparam;
 	int lparam;
 };
 
+/**
+ * Data structure for an opened window
+ */
 struct Window {
-	uint16 flags4;
-	WindowClass window_class;
-	WindowNumber window_number;
-
-	int left, top;
-	int width, height;
-
-	Scrollbar hscroll, vscroll, vscroll2;
-	ResizeInfo resize;
+	uint16 flags4;              ///< Window flags, @see WindowFlags
+	WindowClass window_class;   ///< Window class
+	WindowNumber window_number; ///< Window number within the window class
 
-	byte caption_color;
+	int left;   ///< x position of left edge of the window
+	int top;    ///< y position of top edge of the window
+	int width;  ///< width of the window (number of pixels to the right in x direction)
+	int height; ///< Height of the window (number of pixels down in y direction)
 
-	WindowProc *wndproc;
-	ViewPort *viewport;
-	const Widget *original_widget;
-	Widget *widget;
-	uint widget_count;
-	uint32 desc_flags;
+	Scrollbar hscroll;  ///< Horizontal scroll bar
+	Scrollbar vscroll;  ///< First vertical scroll bar
+	Scrollbar vscroll2; ///< Second vertical scroll bar
+	ResizeInfo resize;  ///< Resize information
 
-	WindowMessage message;
-	Window *parent;
-	byte custom[WINDOW_CUSTOM_SIZE];
+	byte caption_color; ///< Background color of the window caption, contains PlayerID
+
+	WindowProc *wndproc;   ///< Event handler function for the window
+	ViewPort *viewport;    ///< Pointer to viewport, if present (structure is part of derived class)
+	const Widget *original_widget; ///< Original widget layout, copied from WindowDesc
+	Widget *widget;        ///< Widgets of the window
+	uint widget_count;     ///< Number of widgets of the window
+	uint32 desc_flags;     ///< Window/widgets default flags setting, @see WindowDefaultFlag
+
+	WindowMessage message; ///< Buffer for storing received messages (for communication between different window events)
+	Window *parent;        ///< Parent window
+	byte custom[WINDOW_CUSTOM_SIZE]; ///< Additional data depending on window type
 
 	void HandleButtonClick(byte widget);
 
@@ -331,19 +377,6 @@
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(tooltips_d));
 
-struct replaceveh_d {
-	byte sel_index[2];
-	EngineID sel_engine[2];
-	uint16 count[2];
-	bool wagon_btnstate; ///< true means engine is selected
-	EngineList list[2];
-	bool update_left;
-	bool update_right;
-	bool init_lists;
-	GroupID sel_group;
-};
-assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(replaceveh_d));
-
 struct depot_d {
 	VehicleID sel;
 	VehicleType type;
@@ -374,15 +407,6 @@
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(smallmap_d));
 
-struct refit_d {
-	int sel;
-	struct RefitOption *cargo;
-	struct RefitList *list;
-	uint length;
-	VehicleOrderID order;
-};
-assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(refit_d));
-
 struct vp_d {
 	VehicleID follow_vehicle;
 	int32 scrollpos_x;
@@ -392,16 +416,6 @@
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(vp_d));
 
-struct news_d {
-	uint16 follow_vehicle;
-	int32 scrollpos_x;
-	int32 scrollpos_y;
-	int32 dest_scrollpos_x;
-	int32 dest_scrollpos_y;
-	NewsItem *ni;
-};
-assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(news_d));
-
 struct highscore_d {
 	uint32 background_img;
 	int8 rank;
@@ -453,20 +467,6 @@
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(vehiclelist_d));
 
-struct grouplist_d {
-	const Group **sort_list;
-	list_d l;                   // General list struct
-};
-assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(grouplist_d));
-
-struct groupveh_d : vehiclelist_d {
-	GroupID group_sel;
-	VehicleID vehicle_sel;
-
-	grouplist_d gl;
-};
-assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(groupveh_d));
-
 /****************** THESE ARE NOT WIDGET TYPES!!!!! *******************/
 enum WindowWidgetBehaviours {
 	WWB_PUSHBUTTON  = 1 << 5,
@@ -475,30 +475,34 @@
 };
 
 
+/**
+ * Window widget types
+ */
 enum WindowWidgetTypes {
-	WWT_EMPTY,
-
-	WWT_PANEL,      ///< simple depressed panel
-	WWT_INSET,      ///< pressed (inset) panel, most commonly used as combo box _text_ area
-	WWT_IMGBTN,     ///< button with image
-	WWT_IMGBTN_2,   ///< button with diff image when clicked
+	WWT_EMPTY,      ///< Empty widget, place holder to reserve space in widget array
 
-	WWT_TEXTBTN,    ///< button with text
-	WWT_TEXTBTN_2,  ///< button with diff text when clicked
-	WWT_LABEL,      ///< centered label
-	WWT_TEXT,       ///< pure simple text
-	WWT_MATRIX,
-	WWT_SCROLLBAR,
-	WWT_FRAME,      ///< frame
-	WWT_CAPTION,
+	WWT_PANEL,      ///< Simple depressed panel
+	WWT_INSET,      ///< Pressed (inset) panel, most commonly used as combo box _text_ area
+	WWT_IMGBTN,     ///< Button with image
+	WWT_IMGBTN_2,   ///< Button with diff image when clicked
 
-	WWT_HSCROLLBAR,
-	WWT_STICKYBOX,
+	WWT_TEXTBTN,    ///< Button with text
+	WWT_TEXTBTN_2,  ///< Button with diff text when clicked
+	WWT_LABEL,      ///< Centered label
+	WWT_TEXT,       ///< Pure simple text
+	WWT_MATRIX,     ///< List of items underneath each other
+	WWT_SCROLLBAR,  ///< Vertical scrollbar
+	WWT_FRAME,      ///< Frame
+	WWT_CAPTION,    ///< Window caption (window title between closebox and stickybox)
+
+	WWT_HSCROLLBAR, ///< Horizontal scrollbar
+	WWT_STICKYBOX,  ///< Sticky box (normally at top-right of a window)
 	WWT_SCROLL2BAR, ///< 2nd vertical scrollbar
-	WWT_RESIZEBOX,
-	WWT_CLOSEBOX,
+	WWT_RESIZEBOX,  ///< Resize box (normally at bottom-right of a window)
+	WWT_CLOSEBOX,   ///< Close box (at top-left of a window)
 	WWT_DROPDOWN,   ///< Raised drop down list (regular)
 	WWT_DROPDOWNIN, ///< Inset drop down list (used on game options only)
+	WWT_EDITBOX,    ///< a textbox for typing (don't forget to call ShowOnScreenKeyboard() when clicked)
 	WWT_LAST,       ///< Last Item. use WIDGETS_END to fill up padding!!
 
 	WWT_MASK = 0x1F,
@@ -510,18 +514,21 @@
 
 #define WIDGETS_END WWT_LAST,   RESIZE_NONE,     0,     0,     0,     0,     0, 0, STR_NULL
 
+/**
+ * Window flags
+ */
 enum WindowFlags {
-	WF_TIMEOUT_SHL       = 0,
-	WF_TIMEOUT_MASK      = 7,
-	WF_DRAGGING          = 1 <<  3,
-	WF_SCROLL_UP         = 1 <<  4,
-	WF_SCROLL_DOWN       = 1 <<  5,
-	WF_SCROLL_MIDDLE     = 1 <<  6,
+	WF_TIMEOUT_SHL       = 0,       ///< Window timeout counter shift
+	WF_TIMEOUT_MASK      = 7,       ///< Window timeout counter bit mask (3 bits), @see WF_TIMEOUT_SHL
+	WF_DRAGGING          = 1 <<  3, ///< Window is being dragged
+	WF_SCROLL_UP         = 1 <<  4, ///< Upper scroll button has been pressed, @see ScrollbarClickHandler()
+	WF_SCROLL_DOWN       = 1 <<  5, ///< Lower scroll button has been pressed, @see ScrollbarClickHandler()
+	WF_SCROLL_MIDDLE     = 1 <<  6, ///< Scrollbar scrolling, @see ScrollbarClickHandler()
 	WF_HSCROLL           = 1 <<  7,
 	WF_SIZING            = 1 <<  8,
-	WF_STICKY            = 1 <<  9,
+	WF_STICKY            = 1 <<  9, ///< Window is made sticky by user
 
-	WF_DISABLE_VP_SCROLL = 1 << 10,
+	WF_DISABLE_VP_SCROLL = 1 << 10, ///< Window does not do autoscroll, @see HandleAutoscroll()
 
 	WF_WHITE_BORDER_ONE  = 1 << 11,
 	WF_WHITE_BORDER_MASK = 1 << 12 | WF_WHITE_BORDER_ONE,
@@ -532,11 +539,6 @@
 void CallWindowEventNP(Window *w, int event);
 void CallWindowTickEvent();
 
-/**
- * Marks the window as dirty for repaint.
- *
- * @ingroup dirty
- */
 void SetWindowDirty(const Window *w);
 void SendWindowMessage(WindowClass wnd_class, WindowNumber wnd_num, int msg, int wparam, int lparam);
 void SendWindowMessageClass(WindowClass wnd_class, int msg, int wparam, int lparam);
@@ -627,16 +629,8 @@
 
 void ScrollbarClickHandler(Window *w, const Widget *wi, int x, int y);
 
-/** Evenly distribute some widgets when resizing horizontally (often a button row)
- *  The widgets are presumed to be in a line and numberef from left to right (without gaps)
- * @param w widow to modify
- * @param left The leftmost widget to resize
- * @param right The rightmost widget to resize. Since right side of it is used, remember to set it to RESIZE_RIGHT
- */
 void ResizeButtons(Window *w, byte left, byte right);
 
-/** Resize a widget an shuffle other widgets around to fit.
- */
 void ResizeWindowForWidget(Window *w, int widget, int delta_x, int delta_y);
 
 
--- a/src/window_type.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/window_type.h	Tue Apr 15 00:47:19 2008 +0000
@@ -90,6 +90,7 @@
 	WC_VEHICLE_TIMETABLE,
 	WC_BUILD_SIGNAL,
 	WC_COMPANY_PASSWORD_WINDOW,
+	WC_OSK,
 };
 
 struct Window;
--- a/src/yapf/yapf.h	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/yapf/yapf.h	Tue Apr 15 00:47:19 2008 +0000
@@ -6,6 +6,8 @@
 #define  YAPF_H
 
 #include "../debug.h"
+#include "../depot_type.h"
+#include "../direction_type.h"
 
 /** Finds the best path for given ship.
  * @param v        the ship that needs to find a path
--- a/src/yapf/yapf.hpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/yapf/yapf.hpp	Tue Apr 15 00:47:19 2008 +0000
@@ -14,7 +14,7 @@
 #include "../bridge_map.h"
 #include "../tunnelbridge_map.h"
 #include "../bridge.h"
-#include "../station.h"
+#include "../station_base.h"
 #include "../station_map.h"
 #include "../tile_cmd.h"
 #include "../landscape.h"
--- a/src/yapf/yapf_destrail.hpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/yapf/yapf_destrail.hpp	Tue Apr 15 00:47:19 2008 +0000
@@ -86,18 +86,18 @@
 public:
 	void SetDestination(Vehicle* v)
 	{
-		switch (v->current_order.type) {
+		switch (v->current_order.GetType()) {
 			case OT_GOTO_STATION:
-				m_destTile = CalcStationCenterTile(v->current_order.dest);
-				m_dest_station_id = v->current_order.dest;
+				m_destTile = CalcStationCenterTile(v->current_order.GetDestination());
+				m_dest_station_id = v->current_order.GetDestination();
 				m_destTrackdirs = INVALID_TRACKDIR_BIT;
 				break;
 
 			case OT_GOTO_WAYPOINT: {
-				Waypoint *wp = GetWaypoint(v->current_order.dest);
+				Waypoint *wp = GetWaypoint(v->current_order.GetDestination());
 				if (wp == NULL) {
 					/* Invalid waypoint in orders! */
-					DEBUG(yapf, 0, "Invalid waypoint in orders == 0x%04X (train %d, player %d)", v->current_order.dest, v->unitnumber, (PlayerID)v->owner);
+					DEBUG(yapf, 0, "Invalid waypoint in orders == 0x%04X (train %d, player %d)", v->current_order.GetDestination(), v->unitnumber, (PlayerID)v->owner);
 					break;
 				}
 				m_destTile = wp->xy;
--- a/src/yapf/yapf_road.cpp	Mon Apr 14 20:32:36 2008 +0000
+++ b/src/yapf/yapf_road.cpp	Tue Apr 15 00:47:19 2008 +0000
@@ -84,7 +84,7 @@
 
 			const Vehicle* v = Yapf().GetVehicle();
 			// we have reached the vehicle's destination - segment should end here to avoid target skipping
-			if (v->current_order.type == OT_GOTO_STATION && tile == v->dest_tile) break;
+			if (v->current_order.IsType(OT_GOTO_STATION) && tile == v->dest_tile) break;
 
 			// stop if we have just entered the depot
 			if (IsTileDepotType(tile, TRANSPORT_ROAD) && trackdir == DiagdirToDiagTrackdir(ReverseDiagDir(GetRoadDepotDirection(tile)))) {