[minetest-v04x] 03/09: New upstream version 0.4.15+repack

Markus Koschany apo at moszumanska.debian.org
Wed Dec 28 01:50:28 UTC 2016


This is an automated email from the git hooks/post-receive script.

apo pushed a commit to branch master
in repository minetest-v04x.

commit 768e3d52303d43261979ef73763290c621a5def7
Author: Markus Koschany <apo at debian.org>
Date:   Tue Dec 27 20:11:48 2016 +0100

    New upstream version 0.4.15+repack
---
 .travis.yml                                        |   36 +-
 CMakeLists.txt                                     |    6 +-
 README.txt                                         |  102 +-
 build/android/Makefile                             |   30 +-
 build/android/build.gradle                         |    2 +-
 build/android/jni/Android.mk                       |   13 +-
 build/android/patches/sqlite3-readonly-fix.patch   |   17 +
 .../net.minetest.minetest/MtNativeActivity.java    |    5 -
 builtin/common/misc_helpers.lua                    |    1 -
 builtin/common/strict.lua                          |    3 +
 builtin/common/vector.lua                          |    9 +-
 builtin/game/auth.lua                              |   16 +
 builtin/game/chatcommands.lua                      |  124 +-
 builtin/game/constants.lua                         |   10 +
 builtin/game/detached_inventory.lua                |    4 +-
 builtin/game/falling.lua                           |  110 +-
 builtin/game/forceloading.lua                      |   41 +-
 builtin/game/init.lua                              |   14 +-
 builtin/game/item.lua                              |   11 +-
 builtin/game/item_entity.lua                       |    4 -
 builtin/game/misc.lua                              |   64 +-
 builtin/game/mod_profiling.lua                     |  356 ---
 builtin/game/privileges.lua                        |   64 +-
 builtin/game/register.lua                          |   43 +
 builtin/game/voxelarea.lua                         |   49 +-
 builtin/mainmenu/common.lua                        |   10 +-
 builtin/mainmenu/dlg_config_world.lua              |   48 +-
 builtin/mainmenu/dlg_settings_advanced.lua         |  108 +-
 builtin/mainmenu/generate_from_settingtypes.lua    |   99 +
 builtin/mainmenu/modmgr.lua                        |   18 +-
 builtin/mainmenu/tab_credits.lua                   |   17 +-
 builtin/mainmenu/tab_mods.lua                      |   24 +-
 builtin/mainmenu/tab_texturepacks.lua              |    6 +-
 builtin/profiler/init.lua                          |   72 +
 builtin/profiler/instrumentation.lua               |  232 ++
 builtin/profiler/reporter.lua                      |  277 ++
 builtin/profiler/sampling.lua                      |  206 ++
 builtin/settingtypes.txt                           |  197 +-
 client/shaders/minimap_shader/opengl_vertex.glsl   |    2 -
 client/shaders/nodes_shader/opengl_fragment.glsl   |   33 +-
 client/shaders/nodes_shader/opengl_vertex.glsl     |    2 -
 .../water_surface_shader/opengl_fragment.glsl      |   33 +-
 .../water_surface_shader/opengl_vertex.glsl        |    2 -
 client/shaders/wielded_shader/opengl_fragment.glsl |   16 +-
 client/shaders/wielded_shader/opengl_vertex.glsl   |    2 -
 cmake/Modules/FindJson.cmake                       |    4 +-
 cmake/Modules/FindNcursesw.cmake                   |    2 +-
 doc/lua_api.txt                                    |  510 +++-
 doc/menu_lua_api.txt                               |    6 +-
 doc/old/ancient_main_comment.txt                   |  345 ---
 doc/old/changelog.txt                              |  147 --
 doc/texture_overrides.txt                          |   35 -
 doc/texture_packs.txt                              |  158 ++
 games/minetest_game/.gitignore                     |   27 +-
 games/minetest_game/.luacheckrc                    |   17 +
 games/minetest_game/.travis.yml                    |   12 +
 games/minetest_game/game_api.txt                   |  257 +-
 games/minetest_game/minetest.conf.example          |   15 +-
 games/minetest_game/mods/beds/README.txt           |   44 +-
 games/minetest_game/mods/beds/api.lua              |   17 +-
 games/minetest_game/mods/beds/beds.lua             |   16 +-
 games/minetest_game/mods/beds/functions.lua        |   37 +-
 games/minetest_game/mods/beds/license.txt          |   60 +
 games/minetest_game/mods/beds/spawns.lua           |    4 +-
 games/minetest_game/mods/boats/README.txt          |   23 +-
 games/minetest_game/mods/boats/init.lua            |   43 +-
 games/minetest_game/mods/boats/license.txt         |   63 +
 games/minetest_game/mods/bones/README.txt          |   21 +-
 games/minetest_game/mods/bones/init.lua            |  148 +-
 games/minetest_game/mods/bones/license.txt         |   58 +
 .../mods/bones/textures/bones_bottom.png           |  Bin 181 -> 740 bytes
 .../mods/bones/textures/bones_front.png            |  Bin 183 -> 656 bytes
 .../mods/bones/textures/bones_rear.png             |  Bin 187 -> 637 bytes
 .../mods/bones/textures/bones_side.png             |  Bin 188 -> 700 bytes
 .../mods/bones/textures/bones_top.png              |  Bin 182 -> 662 bytes
 games/minetest_game/mods/bucket/README.txt         |   31 +-
 games/minetest_game/mods/bucket/init.lua           |   83 +-
 games/minetest_game/mods/bucket/license.txt        |   51 +
 games/minetest_game/mods/carts/README.txt          |   22 +
 games/minetest_game/mods/carts/cart_entity.lua     |  392 +++
 .../mods/{creative => carts}/depends.txt           |    0
 games/minetest_game/mods/carts/functions.lua       |  221 ++
 games/minetest_game/mods/carts/init.lua            |   20 +
 games/minetest_game/mods/carts/license.txt         |   54 +
 .../minetest_game/mods/carts/models/carts_cart.b3d |  Bin 0 -> 3008 bytes
 .../mods/carts/models/carts_cart.blend             |  Bin 0 -> 544408 bytes
 games/minetest_game/mods/carts/rails.lua           |   59 +
 .../mods/carts/sounds/carts_cart_moving.1.ogg      |  Bin 0 -> 14761 bytes
 .../mods/carts/sounds/carts_cart_moving.2.ogg      |  Bin 0 -> 14749 bytes
 .../mods/carts/sounds/carts_cart_moving.3.ogg      |  Bin 0 -> 14989 bytes
 .../mods/carts/textures/carts_cart.png             |  Bin 0 -> 1103 bytes
 .../textures/carts_cart_front.png}                 |  Bin 3046 -> 3108 bytes
 .../textures/carts_cart_side.png}                  |  Bin 3046 -> 3135 bytes
 .../textures/carts_cart_top.png}                   |  Bin 3046 -> 3171 bytes
 .../mods/carts/textures/carts_rail_crossing.png    |  Bin 0 -> 612 bytes
 .../carts/textures/carts_rail_crossing_brk.png     |  Bin 0 -> 684 bytes
 .../carts/textures/carts_rail_crossing_pwr.png     |  Bin 0 -> 676 bytes
 .../mods/carts/textures/carts_rail_curved.png      |  Bin 0 -> 580 bytes
 .../mods/carts/textures/carts_rail_curved_brk.png  |  Bin 0 -> 618 bytes
 .../mods/carts/textures/carts_rail_curved_pwr.png  |  Bin 0 -> 614 bytes
 .../mods/carts/textures/carts_rail_straight.png    |  Bin 0 -> 602 bytes
 .../carts/textures/carts_rail_straight_brk.png     |  Bin 0 -> 660 bytes
 .../carts/textures/carts_rail_straight_pwr.png     |  Bin 0 -> 661 bytes
 .../mods/carts/textures/carts_rail_t_junction.png  |  Bin 0 -> 707 bytes
 .../carts/textures/carts_rail_t_junction_brk.png   |  Bin 0 -> 698 bytes
 .../carts/textures/carts_rail_t_junction_pwr.png   |  Bin 0 -> 697 bytes
 games/minetest_game/mods/creative/README.txt       |   27 +-
 games/minetest_game/mods/creative/depends.txt      |    1 +
 games/minetest_game/mods/creative/init.lua         |  233 +-
 games/minetest_game/mods/creative/inventory.lua    |  180 ++
 games/minetest_game/mods/creative/license.txt      |   60 +
 games/minetest_game/mods/default/README.txt        |  120 +-
 games/minetest_game/mods/default/aliases.lua       |    5 +-
 games/minetest_game/mods/default/crafting.lua      |  308 ++-
 games/minetest_game/mods/default/craftitems.lua    |   17 +-
 games/minetest_game/mods/default/functions.lua     |  257 +-
 games/minetest_game/mods/default/furnace.lua       |  140 +-
 games/minetest_game/mods/default/init.lua          |   26 +-
 games/minetest_game/mods/default/item_entity.lua   |   74 +
 games/minetest_game/mods/default/legacy.lua        |    2 +-
 games/minetest_game/mods/default/license.txt       |  174 ++
 games/minetest_game/mods/default/mapgen.lua        |  648 +++--
 .../mods/default/models/character.b3d              |  Bin 86830 -> 84526 bytes
 .../mods/default/models/character.blend            |  Bin 697616 -> 634876 bytes
 .../mods/default/models/torch_ceiling.obj          |   58 +
 .../mods/default/models/torch_floor.obj            |   50 +
 .../mods/default/models/torch_wall.obj             |   64 +
 games/minetest_game/mods/default/nodes.lua         |  566 ++--
 games/minetest_game/mods/default/player.lua        |    3 +-
 .../mods/default/schematics/acacia_bush.mts        |  Bin 0 -> 113 bytes
 .../mods/default/schematics/aspen_tree.mts         |  Bin 179 -> 176 bytes
 .../default/schematics/aspen_tree_from_sapling.mts |  Bin 171 -> 175 bytes
 .../minetest_game/mods/default/schematics/bush.mts |  Bin 0 -> 99 bytes
 .../mods/default/schematics/corals.mts             |  Bin 0 -> 171 bytes
 .../mods/default/schematics/papyrus.mts            |  Bin 99 -> 73 bytes
 .../mods/default/sounds/default_dig_metal.ogg      |  Bin 0 -> 5245 bytes
 .../mods/default/sounds/default_dig_snappy.ogg     |  Bin 0 -> 7258 bytes
 .../mods/default/sounds/default_dug_metal.1.ogg    |  Bin 0 -> 7076 bytes
 .../mods/default/sounds/default_dug_metal.2.ogg    |  Bin 0 -> 7260 bytes
 .../mods/default/sounds/default_item_smoke.ogg     |  Bin 0 -> 6651 bytes
 .../default/sounds/default_metal_footstep.1.ogg    |  Bin 0 -> 6847 bytes
 .../default/sounds/default_metal_footstep.2.ogg    |  Bin 0 -> 6926 bytes
 .../default/sounds/default_metal_footstep.3.ogg    |  Bin 0 -> 6970 bytes
 .../default/sounds/default_place_node_metal.1.ogg  |  Bin 0 -> 7518 bytes
 .../default/sounds/default_place_node_metal.2.ogg  |  Bin 0 -> 7854 bytes
 .../mods/default/sounds/default_tool_breaks.1.ogg  |  Bin 0 -> 6019 bytes
 .../mods/default/sounds/default_tool_breaks.2.ogg  |  Bin 0 -> 8440 bytes
 .../mods/default/sounds/default_tool_breaks.3.ogg  |  Bin 0 -> 6875 bytes
 .../default/sounds/default_water_footstep.1.ogg    |  Bin 0 -> 31719 bytes
 .../default/sounds/default_water_footstep.2.ogg    |  Bin 0 -> 29335 bytes
 .../default/sounds/default_water_footstep.3.ogg    |  Bin 0 -> 32107 bytes
 .../default/sounds/default_water_footstep.4.ogg    |  Bin 0 -> 3974 bytes
 .../mods/default/sounds/player_damage.ogg          |  Bin 0 -> 6176 bytes
 .../default/textures/default_acacia_bush_stem.png  |  Bin 0 -> 476 bytes
 .../textures/default_acacia_leaves_simple.png      |  Bin 0 -> 688 bytes
 .../mods/default/textures/default_acacia_tree.png  |  Bin 682 -> 579 bytes
 .../default/textures/default_acacia_tree_top.png   |  Bin 731 -> 5010 bytes
 .../mods/default/textures/default_aspen_tree.png   |  Bin 695 -> 4429 bytes
 .../mods/default/textures/default_aspen_wood.png   |  Bin 373 -> 4023 bytes
 .../default/textures/default_bookshelf_slot.png    |  Bin 0 -> 216 bytes
 .../mods/default/textures/default_bush_stem.png    |  Bin 0 -> 428 bytes
 .../mods/default/textures/default_coral_brown.png  |  Bin 0 -> 401 bytes
 .../mods/default/textures/default_coral_orange.png |  Bin 0 -> 358 bytes
 .../default/textures/default_coral_skeleton.png    |  Bin 0 -> 256 bytes
 .../textures/default_desert_stone_block.png        |  Bin 0 -> 4368 bytes
 .../textures/default_desert_stone_brick.png        |  Bin 611 -> 4420 bytes
 .../default/textures/default_fence_aspen_wood.png  |  Bin 450 -> 4170 bytes
 .../mods/default/textures/default_gravel.png       |  Bin 3570 -> 4715 bytes
 .../mods/default/textures/default_ice.png          |  Bin 3046 -> 4114 bytes
 .../mods/default/textures/default_item_smoke.png   |  Bin 0 -> 307 bytes
 .../mods/default/textures/default_jungleleaves.png |  Bin 184 -> 425 bytes
 .../textures/default_jungleleaves_simple.png       |  Bin 430 -> 417 bytes
 .../mods/default/textures/default_jungletree.png   |  Bin 736 -> 5592 bytes
 .../default/textures/default_jungletree_top.png    |  Bin 823 -> 5175 bytes
 .../{default_meselamp.png => default_key.png}      |  Bin 3399 -> 3037 bytes
 ...fault_meselamp.png => default_key_skeleton.png} |  Bin 3399 -> 3043 bytes
 .../mods/default/textures/default_lava.png         |  Bin 685 -> 5706 bytes
 .../mods/default/textures/default_leaves.png       |  Bin 304 -> 773 bytes
 .../default/textures/default_leaves_simple.png     |  Bin 817 -> 838 bytes
 .../mods/default/textures/default_mese_block.png   |  Bin 224 -> 188 bytes
 .../mods/default/textures/default_meselamp.png     |  Bin 3399 -> 5103 bytes
 .../default/textures/default_obsidian_block.png    |  Bin 0 -> 3913 bytes
 .../mods/default/textures/default_pine_needles.png |  Bin 203 -> 391 bytes
 .../mods/default/textures/default_rail.png         |  Bin 242 -> 0 bytes
 .../default/textures/default_rail_crossing.png     |  Bin 262 -> 0 bytes
 .../mods/default/textures/default_rail_curved.png  |  Bin 241 -> 0 bytes
 .../default/textures/default_rail_t_junction.png   |  Bin 247 -> 0 bytes
 .../default/textures/default_sandstone_block.png   |  Bin 0 -> 4548 bytes
 .../mods/default/textures/default_silver_sand.png  |  Bin 0 -> 4069 bytes
 .../mods/default/textures/default_snow.png         |  Bin 164 -> 4577 bytes
 .../mods/default/textures/default_snow_side.png    |  Bin 376 -> 3445 bytes
 .../mods/default/textures/default_snowball.png     |  Bin 183 -> 3102 bytes
 .../mods/default/textures/default_stone_block.png  |  Bin 0 -> 498 bytes
 .../mods/default/textures/default_stone_brick.png  |  Bin 583 -> 4196 bytes
 games/minetest_game/mods/default/tools.lua         |  132 +-
 games/minetest_game/mods/default/torch.lua         |  147 ++
 games/minetest_game/mods/default/trees.lua         |  189 +-
 games/minetest_game/mods/doors/README.txt          |   71 +-
 games/minetest_game/mods/doors/init.lua            |  448 ++--
 games/minetest_game/mods/doors/license.txt         |  164 ++
 .../mods/doors/sounds/doors_glass_door_close.ogg   |  Bin 0 -> 7289 bytes
 .../mods/doors/sounds/doors_glass_door_open.ogg    |  Bin 0 -> 7288 bytes
 games/minetest_game/mods/dye/README.txt            |   18 +-
 games/minetest_game/mods/dye/license.txt           |   60 +
 games/minetest_game/mods/farming/README.txt        |   35 +-
 games/minetest_game/mods/farming/api.lua           |  217 +-
 games/minetest_game/mods/farming/hoes.lua          |    3 +-
 games/minetest_game/mods/farming/init.lua          |   35 +-
 games/minetest_game/mods/farming/license.txt       |   61 +
 games/minetest_game/mods/farming/nodes.lua         |   14 +-
 games/minetest_game/mods/fire/README.txt           |   49 +-
 .../mods/{creative => fire}/depends.txt            |    0
 games/minetest_game/mods/fire/init.lua             |  355 +--
 games/minetest_game/mods/fire/license.txt          |   84 +
 .../minetest_game/mods/fire/sounds/fire_fire.1.ogg |  Bin 0 -> 57957 bytes
 .../minetest_game/mods/fire/sounds/fire_fire.2.ogg |  Bin 0 -> 60497 bytes
 .../minetest_game/mods/fire/sounds/fire_fire.3.ogg |  Bin 0 -> 56781 bytes
 .../mods/fire/sounds/fire_flint_and_steel.ogg      |  Bin 0 -> 10443 bytes
 games/minetest_game/mods/flowers/README.txt        |   37 +-
 games/minetest_game/mods/flowers/init.lua          |   81 +-
 games/minetest_game/mods/flowers/license.txt       |   62 +
 games/minetest_game/mods/flowers/mapgen.lua        |   18 +-
 .../mods/flowers/schematics/waterlily.mts          |  Bin 92 -> 75 bytes
 .../flowers/textures/flowers_waterlily_bottom.png  |  Bin 0 -> 327 bytes
 .../mods/give_initial_stuff/README.txt             |    8 +
 .../mods/give_initial_stuff/license.txt            |   25 +
 games/minetest_game/mods/nyancat/README.txt        |   16 +
 .../mods/{creative => nyancat}/depends.txt         |    0
 games/minetest_game/mods/nyancat/init.lua          |   89 +
 games/minetest_game/mods/nyancat/license.txt       |   50 +
 .../textures/nyancat_back.png}                     |  Bin
 .../textures/nyancat_front.png}                    |  Bin
 .../textures/nyancat_rainbow.png}                  |  Bin
 .../textures/nyancat_side.png}                     |  Bin
 games/minetest_game/mods/screwdriver/README.txt    |   13 +
 games/minetest_game/mods/screwdriver/init.lua      |    1 +
 games/minetest_game/mods/screwdriver/license.txt   |   50 +
 games/minetest_game/mods/screwdriver/readme.txt    |   21 -
 games/minetest_game/mods/sethome/README.txt        |    7 +
 games/minetest_game/mods/sethome/init.lua          |  123 +-
 games/minetest_game/mods/sethome/license.txt       |   24 +
 games/minetest_game/mods/sfinv/README.md           |   21 +
 games/minetest_game/mods/sfinv/api.lua             |  161 ++
 .../mods/{creative => sfinv}/depends.txt           |    0
 games/minetest_game/mods/sfinv/init.lua            |   22 +
 games/minetest_game/mods/stairs/README.txt         |   30 +-
 games/minetest_game/mods/stairs/init.lua           |  610 +++--
 games/minetest_game/mods/stairs/license.txt        |   51 +
 games/minetest_game/mods/tnt/README.txt            |   56 +-
 games/minetest_game/mods/tnt/init.lua              |  169 +-
 games/minetest_game/mods/tnt/license.txt           |   65 +
 games/minetest_game/mods/vessels/README.txt        |   63 +-
 games/minetest_game/mods/vessels/init.lua          |  106 +-
 games/minetest_game/mods/vessels/license.txt       |   52 +
 .../vessels/textures/vessels_drinking_glass.png    |  Bin 188 -> 371 bytes
 .../textures/vessels_drinking_glass_inv.png        |  Bin 188 -> 313 bytes
 .../mods/vessels/textures/vessels_glass_bottle.png |  Bin 200 -> 229 bytes
 .../vessels/textures/vessels_glass_bottle_inv.png  |  Bin 200 -> 0 bytes
 .../mods/vessels/textures/vessels_shelf_slot.png   |  Bin 0 -> 201 bytes
 .../mods/vessels/textures/vessels_steel_bottle.png |  Bin 257 -> 348 bytes
 .../vessels/textures/vessels_steel_bottle_inv.png  |  Bin 257 -> 0 bytes
 games/minetest_game/mods/walls/README.txt          |    7 +
 games/minetest_game/mods/walls/init.lua            |   15 -
 games/minetest_game/mods/walls/license.txt         |   14 +
 games/minetest_game/mods/wool/README.txt           |   36 +-
 games/minetest_game/mods/wool/init.lua             |   47 +-
 games/minetest_game/mods/wool/license.txt          |   60 +
 .../mods/wool/textures/wool_black.png              |  Bin 213 -> 209 bytes
 .../minetest_game/mods/wool/textures/wool_blue.png |  Bin 269 -> 264 bytes
 .../minetest_game/mods/wool/textures/wool_cyan.png |  Bin 305 -> 302 bytes
 .../mods/wool/textures/wool_dark_green.png         |  Bin 259 -> 254 bytes
 .../mods/wool/textures/wool_dark_grey.png          |  Bin 265 -> 260 bytes
 .../mods/wool/textures/wool_green.png              |  Bin 308 -> 304 bytes
 .../minetest_game/mods/wool/textures/wool_grey.png |  Bin 315 -> 248 bytes
 .../mods/wool/textures/wool_magenta.png            |  Bin 301 -> 296 bytes
 .../mods/wool/textures/wool_orange.png             |  Bin 288 -> 284 bytes
 .../minetest_game/mods/wool/textures/wool_pink.png |  Bin 221 -> 218 bytes
 .../minetest_game/mods/wool/textures/wool_red.png  |  Bin 292 -> 288 bytes
 .../mods/wool/textures/wool_violet.png             |  Bin 251 -> 244 bytes
 .../mods/wool/textures/wool_white.png              |  Bin 306 -> 243 bytes
 .../mods/wool/textures/wool_yellow.png             |  Bin 263 -> 255 bytes
 games/minetest_game/mods/xpanes/README.txt         |   27 +-
 games/minetest_game/mods/xpanes/init.lua           |  269 +-
 games/minetest_game/mods/xpanes/license.txt        |   64 +
 .../mods/xpanes/textures/xpanes_bar.png            |  Bin 180 -> 155 bytes
 .../mods/xpanes/textures/xpanes_bar_top.png        |  Bin 0 -> 3516 bytes
 .../mods/xpanes/textures/xpanes_grey.png           |  Bin 82 -> 0 bytes
 .../mods/xpanes/textures/xpanes_white.png          |  Bin 148 -> 3496 bytes
 games/minetest_game/settingtypes.txt               |   45 +
 minetest.conf.example                              |  241 +-
 misc/minetest-xorg-icon-128.png                    |  Bin 0 -> 11241 bytes
 misc/minetest.appdata.xml                          |    9 +
 misc/minetest.desktop                              |    2 +-
 misc/minetest.exe.manifest                         |   15 +
 po/be/minetest.po                                  |  256 +-
 po/ca/minetest.po                                  |  371 ++-
 po/cs/minetest.po                                  |  578 +++--
 po/da/minetest.po                                  | 1491 +++++++----
 po/de/minetest.po                                  | 1092 ++++----
 po/eo/minetest.po                                  |  382 ++-
 po/es/minetest.po                                  |  455 +++-
 po/et/minetest.po                                  |  426 ++-
 po/fr/minetest.po                                  | 1429 ++++++-----
 po/he/minetest.po                                  |  315 ++-
 po/hu/minetest.po                                  |  615 +++--
 po/id/minetest.po                                  |  792 +++---
 po/it/minetest.po                                  |  553 ++--
 po/ja/minetest.po                                  |  551 ++--
 po/jbo/minetest.po                                 |  280 +-
 po/ko/minetest.po                                  | 1465 +++++++----
 po/ky/minetest.po                                  |  377 ++-
 po/lt/minetest.po                                  |  355 ++-
 po/minetest.pot                                    |  248 +-
 po/nb/minetest.po                                  |  348 ++-
 po/nl/minetest.po                                  | 1552 ++++++-----
 po/pl/minetest.po                                  | 1577 ++++++++----
 po/pt/minetest.po                                  |  772 +++---
 po/pt_BR/minetest.po                               | 1520 ++++++-----
 po/ro/minetest.po                                  |  376 ++-
 po/ru/minetest.po                                  |  844 ++++--
 po/{ky => sr_Cyrl}/minetest.po                     | 1209 +++++----
 po/{ru => sw}/minetest.po                          | 2699 ++++++++++----------
 po/tr/minetest.po                                  |  336 ++-
 po/uk/minetest.po                                  |  433 ++--
 po/zh_CN/minetest.po                               |  576 +++--
 po/zh_TW/minetest.po                               |  529 ++--
 src/CMakeLists.txt                                 |   96 +-
 src/camera.cpp                                     |   19 +-
 src/camera.h                                       |    1 +
 src/cavegen.cpp                                    |  835 +++---
 src/cavegen.h                                      |  187 +-
 src/cguittfont/CGUITTFont.cpp                      |   30 +-
 src/cguittfont/CGUITTFont.h                        |    7 +
 src/chat.cpp                                       |   40 +-
 src/chat.h                                         |   19 +-
 src/client.cpp                                     |  140 +-
 src/client.h                                       |   24 +-
 src/client/CMakeLists.txt                          |    1 +
 src/client/clientlauncher.cpp                      |   27 +-
 src/client/inputhandler.h                          |   50 +-
 src/client/joystick_controller.cpp                 |  179 ++
 src/client/joystick_controller.h                   |  163 ++
 src/client/keys.h                                  |   86 +
 src/client/tile.cpp                                |  134 +-
 src/clientiface.cpp                                |  122 +-
 src/clientiface.h                                  |    9 +-
 src/clientmap.cpp                                  |   24 +-
 src/clientmap.h                                    |    7 +-
 src/clientobject.cpp                               |   10 +-
 src/clientobject.h                                 |    4 +-
 src/cmake_config.h.in                              |    2 +
 src/collision.cpp                                  |  124 +-
 src/constants.h                                    |    2 +-
 src/content_cao.cpp                                |  190 +-
 src/content_cao.h                                  |   11 +-
 src/content_mapblock.cpp                           |  203 +-
 src/content_nodemeta.cpp                           |    2 +-
 src/content_sao.cpp                                |  404 +--
 src/content_sao.h                                  |  104 +-
 src/convert_json.h                                 |    2 +-
 src/craftdef.cpp                                   |   90 +
 src/craftdef.h                                     |    4 +
 src/database-dummy.cpp                             |   11 +-
 src/database-dummy.h                               |    8 +-
 src/database-leveldb.cpp                           |    9 +-
 src/database-leveldb.h                             |    8 +-
 src/database-postgresql.cpp                        |  286 +++
 src/database-postgresql.h                          |   95 +
 src/database-redis.cpp                             |   31 +-
 src/database-redis.h                               |   12 +-
 src/database-sqlite3.cpp                           |   25 +-
 src/database-sqlite3.h                             |   16 +-
 src/database.h                                     |    2 +-
 src/defaultsettings.cpp                            |   22 +-
 src/dungeongen.cpp                                 |  150 +-
 src/dungeongen.h                                   |   36 +-
 src/emerge.cpp                                     |  114 +-
 src/emerge.h                                       |   20 +-
 src/environment.cpp                                |  457 ++--
 src/environment.h                                  |   57 +-
 src/exceptions.h                                   |    5 +
 src/filesys.cpp                                    |   35 +-
 src/game.cpp                                       |  883 ++++---
 src/game.h                                         |    7 +
 src/genericobject.cpp                              |   12 +
 src/genericobject.h                                |    5 +-
 src/gettext.h                                      |   10 +
 src/guiChatConsole.cpp                             |   33 +-
 src/guiEngine.cpp                                  |   41 +-
 src/guiEngine.h                                    |   10 +-
 src/guiFormSpecMenu.cpp                            |  317 ++-
 src/guiFormSpecMenu.h                              |   98 +-
 src/guiKeyChangeMenu.cpp                           |    4 +-
 src/guiTable.cpp                                   |    4 +-
 src/guiVolumeChange.cpp                            |   82 +-
 src/guiVolumeChange.h                              |    3 +-
 src/hud.cpp                                        |    6 +
 src/hud.h                                          |    9 +-
 src/intlGUIEditBox.cpp                             |    2 +-
 src/inventory.h                                    |    5 +-
 src/irrlicht_changes/CMakeLists.txt                |    7 +
 src/irrlicht_changes/static_text.cpp               |  679 +++++
 src/irrlicht_changes/static_text.h                 |  268 ++
 src/itemdef.cpp                                    |   14 +-
 src/itemdef.h                                      |    3 +-
 src/itemgroup.h                                    |    6 +-
 src/keycode.cpp                                    |  560 ++--
 src/keycode.h                                      |    2 -
 src/light.h                                        |    6 +-
 src/localplayer.cpp                                |   50 +-
 src/localplayer.h                                  |   75 +-
 src/main.cpp                                       |   14 +-
 src/map.cpp                                        |  615 +----
 src/map.h                                          |   29 +-
 src/map_settings_manager.cpp                       |  194 ++
 src/map_settings_manager.h                         |   79 +
 src/mapblock.h                                     |    4 +-
 src/mapblock_mesh.cpp                              |   55 +-
 src/mapblock_mesh.h                                |   15 +-
 src/mapgen.cpp                                     |  646 ++++-
 src/mapgen.h                                       |  158 +-
 src/mapgen_flat.cpp                                |  409 +--
 src/mapgen_flat.h                                  |   65 +-
 src/mapgen_fractal.cpp                             |  407 +--
 src/mapgen_fractal.h                               |   70 +-
 src/mapgen_singlenode.h                            |   19 +-
 src/mapgen_v5.cpp                                  |  390 +--
 src/mapgen_v5.h                                    |   66 +-
 src/mapgen_v6.cpp                                  |   82 +-
 src/mapgen_v6.h                                    |   20 +-
 src/mapgen_v7.cpp                                  |  688 ++---
 src/mapgen_v7.h                                    |  103 +-
 src/mapgen_valleys.cpp                             |  390 +--
 src/mapgen_valleys.h                               |   65 +-
 src/mapnode.cpp                                    |   16 +-
 src/mapnode.h                                      |    9 +
 src/mapsector.cpp                                  |   28 +-
 src/mapsector.h                                    |    4 +-
 src/mesh.cpp                                       |   20 +
 src/mesh.h                                         |    4 +
 src/mg_biome.cpp                                   |  172 +-
 src/mg_biome.h                                     |  172 +-
 src/mg_decoration.cpp                              |  131 +-
 src/mg_decoration.h                                |   14 +-
 src/mg_ore.cpp                                     |   10 +-
 src/mg_ore.h                                       |    3 +-
 src/mg_schematic.cpp                               |    4 +-
 src/mods.h                                         |    2 +-
 src/nameidmapping.cpp                              |    2 +-
 src/nameidmapping.h                                |   12 +-
 src/network/clientpackethandler.cpp                |   39 +-
 src/network/connection.cpp                         |   33 +-
 src/network/connection.h                           |   19 +-
 src/network/networkpacket.h                        |    1 +
 src/network/networkprotocol.h                      |    8 +-
 src/network/serverpackethandler.cpp                |  176 +-
 src/nodedef.cpp                                    |  595 +++--
 src/nodedef.h                                      |   33 +
 src/nodemetadata.cpp                               |   23 +-
 src/nodemetadata.h                                 |    3 +
 src/nodetimer.cpp                                  |   72 +-
 src/nodetimer.h                                    |   77 +-
 src/noise.cpp                                      |   57 +-
 src/noise.h                                        |   32 +-
 src/particles.cpp                                  |  133 +-
 src/particles.h                                    |    8 +-
 src/player.cpp                                     |  183 +-
 src/player.h                                       |  281 +-
 src/porting.cpp                                    |  129 +-
 src/porting.h                                      |   13 +-
 src/reflowscan.cpp                                 |  206 ++
 src/{database-leveldb.h => reflowscan.h}           |   45 +-
 src/remoteplayer.cpp                               |  232 ++
 src/remoteplayer.h                                 |  160 ++
 src/rollback.cpp                                   |   71 +-
 src/rollback.h                                     |    2 +-
 src/script/common/c_content.cpp                    |   44 +-
 src/script/common/c_content.h                      |    6 +-
 src/script/common/c_converter.cpp                  |   20 +-
 src/script/common/c_converter.h                    |    4 +-
 src/script/cpp_api/s_async.cpp                     |    3 +-
 src/script/cpp_api/s_async.h                       |    2 +-
 src/script/cpp_api/s_env.cpp                       |    4 +-
 src/script/cpp_api/s_node.cpp                      |    1 +
 src/script/cpp_api/s_player.cpp                    |    6 +-
 src/script/cpp_api/s_player.h                      |    2 +-
 src/script/cpp_api/s_security.cpp                  |  148 +-
 src/script/cpp_api/s_security.h                    |   21 +-
 src/script/lua_api/l_areastore.cpp                 |    7 +-
 src/script/lua_api/l_craft.cpp                     |   92 +-
 src/script/lua_api/l_craft.h                       |    1 +
 src/script/lua_api/l_env.cpp                       |   10 +-
 src/script/lua_api/l_inventory.cpp                 |    9 +-
 src/script/lua_api/l_inventory.h                   |    9 +-
 src/script/lua_api/l_item.cpp                      |   22 +
 src/script/lua_api/l_item.h                        |    1 +
 src/script/lua_api/l_mainmenu.cpp                  |   13 +-
 src/script/lua_api/l_mainmenu.h                    |    2 -
 src/script/lua_api/l_mapgen.cpp                    |  218 +-
 src/script/lua_api/l_mapgen.h                      |   12 +
 src/script/lua_api/l_nodetimer.cpp                 |    4 +-
 src/script/lua_api/l_noise.cpp                     |    2 +-
 src/script/lua_api/l_noise.h                       |    4 +-
 src/script/lua_api/l_object.cpp                    |  175 +-
 src/script/lua_api/l_object.h                      |   20 +-
 src/script/lua_api/l_particles.cpp                 |   35 +-
 src/script/lua_api/l_server.cpp                    |   31 +-
 src/script/lua_api/l_server.h                      |    3 +
 src/script/lua_api/l_settings.cpp                  |   13 +-
 src/script/lua_api/l_settings.h                    |    3 +-
 src/script/lua_api/l_util.cpp                      |  109 +-
 src/script/lua_api/l_util.h                        |   12 +
 src/script/lua_api/l_vmanip.cpp                    |   10 +-
 src/serialization.cpp                              |    2 +-
 src/server.cpp                                     |  399 ++-
 src/server.h                                       |  106 +-
 src/serverlist.cpp                                 |    2 +-
 src/serverlist.h                                   |    2 +-
 src/serverobject.cpp                               |    1 -
 src/serverobject.h                                 |   41 +-
 src/settings.cpp                                   |   71 +-
 src/settings.h                                     |   39 +-
 src/settings_translation_file.cpp                  |   97 +-
 src/shader.cpp                                     |  151 +-
 src/shader.h                                       |   63 +-
 src/sky.cpp                                        |  533 ++--
 src/sound_openal.cpp                               |   27 +-
 src/subgame.cpp                                    |    4 +-
 src/terminal_chat_console.cpp                      |   10 +-
 src/threading/event.cpp                            |   16 +-
 src/threading/event.h                              |   17 +-
 src/threading/mutex.cpp                            |   19 +-
 src/threading/mutex.h                              |   15 +-
 src/threading/mutex_auto_lock.h                    |    4 +-
 src/threading/thread.cpp                           |   28 +-
 src/threading/thread.h                             |   13 +-
 src/threads.h                                      |   18 +-
 src/tool.cpp                                       |   23 +-
 src/tool.h                                         |   15 +-
 src/touchscreengui.cpp                             |   20 +-
 src/touchscreengui.h                               |   12 +-
 src/treegen.cpp                                    |   14 +-
 src/treegen.h                                      |    8 +-
 src/unittest/CMakeLists.txt                        |    6 +
 src/unittest/test_filepath.cpp                     |    3 +
 src/unittest/test_keycode.cpp                      |  129 +
 src/unittest/test_map_settings_manager.cpp         |  261 ++
 src/unittest/test_player.cpp                       |   88 +
 src/unittest/test_settings.cpp                     |    7 +-
 src/unittest/test_threading.cpp                    |    3 +
 src/util/CMakeLists.txt                            |    1 +
 src/util/areastore.cpp                             |    1 +
 src/util/auth.h                                    |    2 +-
 src/{itemgroup.h => util/cpp11_container.h}        |   35 +-
 src/util/enriched_string.cpp                       |  166 ++
 src/util/enriched_string.h                         |   91 +
 src/util/numeric.cpp                               |   17 +-
 src/util/numeric.h                                 |   37 +-
 src/util/srp.cpp                                   |    2 +-
 src/util/string.cpp                                |   19 +-
 src/util/string.h                                  |   86 +-
 src/voxelalgorithms.cpp                            |  594 +++++
 src/voxelalgorithms.h                              |   21 +
 textures/base/pack/halo.png                        |  Bin 144 -> 144 bytes
 textures/base/pack/no_screenshot.png               |  Bin 140 -> 586 bytes
 textures/base/pack/smoke_puff.png                  |  Bin 1233 -> 202 bytes
 util/buildbot/buildwin32.sh                        |   75 +-
 util/buildbot/buildwin64.sh                        |   56 +-
 util/travis/before_install.sh                      |   18 +-
 util/travis/common.sh                              |    8 +
 util/travis/script.sh                              |    7 +
 571 files changed, 37342 insertions(+), 21327 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 9d16008..534479e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,14 +1,4 @@
 language: cpp
-compiler:
-  - gcc
-  - clang
-os:
-  - osx
-  - linux
-env:
-  - PLATFORM=Win32
-  - PLATFORM=Win64
-  - PLATFORM=Unix
 before_install: ./util/travis/before_install.sh
 script: ./util/travis/script.sh
 sudo: required
@@ -16,14 +6,26 @@ notifications:
   email: false
 matrix:
   fast_finish: true
-  exclude:
+  include:
     - env: PLATFORM=Win32
-      compiler: clang
+      compiler: gcc
+      os: linux
     - env: PLATFORM=Win64
+      compiler: gcc
+      os: linux
+    - env: PLATFORM=Unix COMPILER=clang
       compiler: clang
-    - env: PLATFORM=Win32
-      os: osx
-    - env: PLATFORM=Win64
-      os: osx
-    - compiler: gcc
       os: osx
+    - env: PLATFORM=Unix COMPILER=g++
+      compiler: gcc
+      os: linux
+    - env: PLATFORM=Unix COMPILER=clang
+      compiler: clang
+      os: linux
+    - env: PLATFORM=Unix COMPILER=g++-6
+      compiler: gcc
+      os: linux
+addons:
+  apt:
+    sources: &sources
+      - ubuntu-toolchain-r-test
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 998cdc9..11ebe94 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,7 +13,7 @@ set(PROJECT_NAME_CAPITALIZED "Minetest")
 # Also remember to set PROTOCOL_VERSION in network/networkprotocol.h when releasing
 set(VERSION_MAJOR 0)
 set(VERSION_MINOR 4)
-set(VERSION_PATCH 14)
+set(VERSION_PATCH 15)
 set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string")
 
 # Change to false for releases
@@ -167,6 +167,7 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/fonts" DESTINATION "${SHAREDIR}")
 install(FILES "README.txt" DESTINATION "${DOCDIR}")
 install(FILES "doc/lua_api.txt" DESTINATION "${DOCDIR}")
 install(FILES "doc/menu_lua_api.txt" DESTINATION "${DOCDIR}")
+install(FILES "doc/texture_packs.txt" DESTINATION "${DOCDIR}")
 install(FILES "doc/world_format.txt" DESTINATION "${DOCDIR}")
 install(FILES "minetest.conf.example" DESTINATION "${EXAMPLE_CONF_DIR}")
 
@@ -175,6 +176,9 @@ if(UNIX AND NOT APPLE)
 	install(FILES "misc/minetest.desktop" DESTINATION "${XDG_APPS_DIR}")
 	install(FILES "misc/minetest.appdata.xml" DESTINATION "${APPDATADIR}")
 	install(FILES "misc/minetest.svg" DESTINATION "${ICONDIR}/hicolor/scalable/apps")
+	install(FILES "misc/minetest-xorg-icon-128.png"
+		DESTINATION "${ICONDIR}/hicolor/128x128/apps"
+		RENAME "minetest.png")
 endif()
 
 if(APPLE)
diff --git a/README.txt b/README.txt
index 9ca9b33..5d4d152 100644
--- a/README.txt
+++ b/README.txt
@@ -27,39 +27,47 @@ This game is not finished
 - Don't expect it to work as well as a finished game will.
 - Please report any bugs. When doing that, debug.txt is useful.
 
-Default Controls
+Default controls
 -----------------
-- WASD: move
-- Space: jump/climb
-- Shift: sneak/go down
-- Q: drop itemstack (+ SHIFT for single item)
-- I: inventory
-- Mouse: turn/look
-- Mouse left: dig/punch
-- Mouse right: place/use
-- Mouse wheel: select item
-- T: chat
-- 1-8: select item
-
-- Esc: pause menu (pauses only singleplayer game)
-- R: Enable/Disable full range view
+- Move mouse: Look around
+- W, A, S, D: Move
+- Space: Jump/move up
+- Shift: Sneak/move down
+- Q: Drop itemstack
+- Shift + Q: Drop single item
+- Left mouse button: Dig/punch/take item
+- Right mouse button: Place/use
+- Shift + right mouse button: Build (without using)
+- I: Inventory menu
+- Mouse wheel: Select item
+- 0-9: Select item
+- Z: Zoom (needs zoom privilege)
+- T: Chat
+- /: Commad
+
+- Esc: Pause menu/abort/exit (pauses only singleplayer game)
+- R: Enable/disable full range view
 - +: Increase view range
 - -: Decrease view range
-- K: Enable/Disable fly (needs fly privilege)
-- J: Enable/Disable fast (needs fast privilege)
-- H: Enable/Disable noclip (needs noclip privilege)
-
-- F1:  Hide/Show HUD
-- F2:  Hide/Show Chat
-- F3:  Disable/Enable Fog
-- F4:  Disable/Enable Camera update (Mapblocks are not updated anymore when disabled)
-- F5:  Toogle through debug info screens
-- F6:  Toogle through output data
-- F7:  Toggle through camera modes
-- F10: Show/Hide console
+- K: Enable/disable fly mode (needs fly privilege)
+- J: Enable/disable fast mode (needs fast privilege)
+- H: Enable/disable noclip mode (needs noclip privilege)
+
+- F1:  Hide/show HUD
+- F2:  Hide/show chat
+- F3:  Disable/enable fog
+- F4:  Disable/enable camera update (Mapblocks are not updated anymore when disabled, disabled in release builds)
+- F5:  Cycle through debug info screens
+- F6:  Cycle through profiler info screens
+- F7:  Cycle through camera modes
+- F8:  Toggle cinematic mode
+- F9:  Cycle through minimap modes
+- Shift + F9: Change minimap orientation
+- F10: Show/hide console
 - F12: Take screenshot
+- P: Write stack traces into debug.txt
 
-- Settable in the configuration file, see the section below.
+Most controls are settable in the configuration file, see the section below.
 
 Paths
 ------
@@ -103,7 +111,7 @@ Compiling on GNU/Linux:
 -----------------------
 
 Install dependencies. Here's an example for Debian/Ubuntu:
-$ sudo apt-get install build-essential libirrlicht-dev cmake libbz2-dev libpng12-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev
+$ sudo apt-get install build-essential libirrlicht-dev cmake libbz2-dev libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev
 
 For Fedora users:
 $ sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl* openal* libvorbis* libXxf86vm-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel irrlicht-devel bzip2-libs gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel doxygen spatialindex-devel bzip2-devel
@@ -111,10 +119,10 @@ $ sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl* openal*
 You can install git for easily keeping your copy up to date.
 If you dont want git, read below on how to get the source without git.
 This is an example for installing git on Debian/Ubuntu:
-$ sudo apt-get install git-core
+$ sudo apt-get install git
 
 For Fedora users:
-$ sudo dnf install git-core
+$ sudo dnf install git
 
 Download source (this is the URL to the latest of source repository, which might not work at all times) using git:
 $ git clone --depth 1 https://github.com/minetest/minetest.git
@@ -169,7 +177,8 @@ ENABLE_CURSES       - Build with (n)curses; Enables a server side terminal (comm
 ENABLE_FREETYPE     - Build with FreeType2; Allows using TTF fonts
 ENABLE_GETTEXT      - Build with Gettext; Allows using translations
 ENABLE_GLES         - Search for Open GLES headers & libraries and use them
-ENABLE_LEVELDB      - Build with LevelDB; Enables use of LevelDB map backend (faster than SQLite3)
+ENABLE_LEVELDB      - Build with LevelDB; Enables use of LevelDB map backend
+ENABLE_POSTGRESQL   - Build with libpq; Enables use of PostgreSQL map backend (PostgreSQL 9.5 or greater required)
 ENABLE_REDIS        - Build with libhiredis; Enables use of Redis map backend
 ENABLE_SPATIAL      - Build with LibSpatial; Speeds up AreaStores
 ENABLE_SOUND        - Build with OpenAL, libogg & libvorbis; in-game Sounds
@@ -203,6 +212,8 @@ IRRLICHT_LIBRARY                - Path to libIrrlicht.a/libIrrlicht.so/libIrrlic
 LEVELDB_INCLUDE_DIR             - Only when building with LevelDB; directory that contains db.h
 LEVELDB_LIBRARY                 - Only when building with LevelDB; path to libleveldb.a/libleveldb.so/libleveldb.dll.a
 LEVELDB_DLL                     - Only when building with LevelDB on Windows; path to libleveldb.dll
+POSTGRESQL_INCLUDE_DIR          - Only when building with PostgreSQL; directory that contains libpq-fe.h
+POSTGRESQL_LIBRARY              - Only when building with PostgreSQL; path to libpq.a/libpq.so
 REDIS_INCLUDE_DIR               - Only when building with Redis; directory that contains hiredis.h
 REDIS_LIBRARY                   - Only when building with Redis; path to libhiredis.a/libhiredis.so
 SPATIAL_INCLUDE_DIR             - Only when building with LibSpatial; directory that contains spatialindex/SpatialIndex.h
@@ -249,6 +260,8 @@ Compiling on Windows:
 		http://www.winimage.com/zLibDll/index.html
 	* Zlib library (zlibwapi.lib and zlibwapi.dll from zlib125dll.zip):
 		http://www.winimage.com/zLibDll/index.html
+	* SQLite3 headers and library
+		https://www.sqlite.org/download.html
 	* Optional: gettext library and tools:
 		http://gnuwin32.sourceforge.net/downlinks/gettext.php
 		- This is used for other UI languages. Feel free to leave it out.
@@ -260,6 +273,10 @@ Compiling on Windows:
 	- Download all the other stuff to DIR and extract them into there.
 	  ("extract here", not "extract to packagename/")
 	  NOTE: zlib125dll.zip needs to be extracted into zlib125dll
+	  NOTE: You need to extract sqlite3.h & sqlite3ext.h from sqlite3 source
+	      and sqlite3.dll & sqlite3.def from sqlite3 precompiled binaries
+	      into "sqlite3" directory, and generate sqlite3.lib using command
+	      "LIB /DEF:sqlite3.def /OUT:sqlite3.lib"
 	- All those packages contain a nice base directory in them, which
 	  should end up being the direct subdirectories of DIR.
 	- You will end up with a directory structure like this (+=dir, -=file):
@@ -267,7 +284,9 @@ Compiling on Windows:
 	+ DIR
 		- zlib-1.2.5.tar.gz
 		- zlib125dll.zip
-		- irrlicht-1.7.1.zip
+		- irrlicht-1.8.3.zip
+		- sqlite-amalgamation-3130000.zip (SQLite3 headers)
+		- sqlite-dll-win32-x86-3130000.zip (SQLite3 library for 32bit system)
 		- 110214175330.zip (or whatever, this is the minetest source)
 		+ zlib-1.2.5
 			- zlib.h
@@ -277,10 +296,15 @@ Compiling on Windows:
 			- readme.txt
 			+ dll32
 			...
-		+ irrlicht-1.7.1
+		+ irrlicht-1.8.3
 			+ lib
 			+ include
 			...
+		+ sqlite3
+			sqlite3.h
+			sqlite3ext.h
+			sqlite3.lib
+			sqlite3.dll
 		+ gettext (optional)
 			+bin
 			+include
@@ -307,7 +331,7 @@ Compiling on Windows:
 	BUILD_SERVER             [ ]
 	CMAKE_BUILD_TYPE         Release
 	CMAKE_INSTALL_PREFIX     DIR/minetest-install
-	IRRLICHT_SOURCE_DIR      DIR/irrlicht-1.7.1
+	IRRLICHT_SOURCE_DIR      DIR/irrlicht-1.8.3
 	RUN_IN_PLACE             [X]
 	WARN_ALL                 [ ]
 	ZLIB_DLL                 DIR/zlib125dll/dll32/zlibwapi.dll
@@ -318,6 +342,11 @@ Compiling on Windows:
 	GETTEXT_LIBRARIES        DIR/gettext/lib/intl.lib
 	GETTEXT_MSGFMT           DIR/gettext/bin/msgfmt
 	-----------------
+	- If CMake complains it couldn't find SQLITE3, choose "Advanced" box on the
+	  right top corner, then specify the location of SQLITE3_INCLUDE_DIR and
+	  SQLITE3_LIBRARY manually.
+	- If you want to build 64-bit minetest, you will need to build 64-bit version
+	  of irrlicht engine manually, as only 32-bit pre-built library is provided.
 	- Hit "Configure"
 	- Hit "Configure" once again 8)
 	- If something is still coloured red, you have a problem.
@@ -382,6 +411,9 @@ Authors of media files
 Everything not listed in here:
 Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55 at gmail.com>
 
+ShadowNinja:
+  textures/base/pack/smoke_puff.png
+
 Paramat:
   textures/base/pack/menu_header.png
 
diff --git a/build/android/Makefile b/build/android/Makefile
index 4ac9760..6e7a389 100644
--- a/build/android/Makefile
+++ b/build/android/Makefile
@@ -91,7 +91,7 @@ IRRLICHT_TIMESTAMP = $(IRRLICHT_DIR)timestamp
 IRRLICHT_TIMESTAMP_INT = $(ANDR_ROOT)/deps/irrlicht_timestamp
 IRRLICHT_URL_SVN = https://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@$(IRRLICHT_REVISION)
 
-OPENSSL_VERSION = 1.0.2h
+OPENSSL_VERSION = 1.0.2j
 OPENSSL_BASEDIR = openssl-$(OPENSSL_VERSION)
 OPENSSL_DIR = $(ANDR_ROOT)/deps/$(OPENSSL_BASEDIR)/
 OPENSSL_LIB = $(OPENSSL_DIR)/libssl.so.1.0.0
@@ -99,14 +99,14 @@ OPENSSL_TIMESTAMP = $(OPENSSL_DIR)timestamp
 OPENSSL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/openssl_timestamp
 OPENSSL_URL = https://www.openssl.org/source/openssl-$(OPENSSL_VERSION).tar.gz
 
-CURL_VERSION = 7.48.0
+CURL_VERSION = 7.52.0
 CURL_DIR = $(ANDR_ROOT)/deps/curl-$(CURL_VERSION)
 CURL_LIB = $(CURL_DIR)/lib/.libs/libcurl.a
 CURL_TIMESTAMP = $(CURL_DIR)/timestamp
 CURL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/curl_timestamp
 CURL_URL_HTTP = https://curl.haxx.se/download/curl-${CURL_VERSION}.tar.bz2
 
-GMP_VERSION = 6.1.0
+GMP_VERSION = 6.1.2
 GMP_DIR = $(ANDR_ROOT)/deps/gmp-$(GMP_VERSION)
 GMP_LIB = $(GMP_DIR)/usr/lib/libgmp.so
 GMP_TIMESTAMP = $(GMP_DIR)/timestamp
@@ -126,7 +126,7 @@ ICONV_TIMESTAMP = $(ICONV_DIR)timestamp
 ICONV_TIMESTAMP_INT = $(ANDR_ROOT)/deps/iconv_timestamp
 ICONV_URL_HTTP = https://ftp.gnu.org/pub/gnu/libiconv/libiconv-$(ICONV_VERSION).tar.gz
 
-SQLITE3_FOLDER = sqlite-amalgamation-3120200
+SQLITE3_FOLDER = sqlite-amalgamation-3150200
 SQLITE3_URL = https://www.sqlite.org/2016/$(SQLITE3_FOLDER).zip
 
 ANDROID_SDK = $(shell grep '^sdk\.dir' local.properties | sed 's/^.*=[[:space:]]*//')
@@ -220,6 +220,8 @@ $(OPENAL_LIB): $(OPENAL_TIMESTAMP)
 	${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG}                                  \
 		NDK_MODULE_PATH=${NDK_MODULE_PATH} APP_ABI=${TARGET_ABI}               \
 		TARGET_ARCH_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM}             \
+		PRIVATE_CC=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}gcc \
+		PRIVATE_CXX=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}g++ \
 		TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                \
 		TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                              \
 		TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                 \
@@ -266,6 +268,8 @@ $(OGG_LIB): $(OGG_TIMESTAMP)
 	${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG}                                  \
 		NDK_MODULE_PATH=${NDK_MODULE_PATH}                                     \
 		APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM}                     \
+		PRIVATE_CC=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}gcc \
+		PRIVATE_CXX=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}g++ \
 		TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                \
 		TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                              \
 		TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                 \
@@ -313,6 +317,7 @@ $(OPENSSL_LIB): $(OPENSSL_TIMESTAMP) $(GMP_LIB)
 	export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-openssl;                          \
 	${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
 		--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
+		--platform=android-9                                                   \
 		--install-dir=$${TOOLCHAIN};                                           \
 	export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
 	CC=${CROSS_PREFIX}gcc ./Configure enable-gmp -DL_ENDIAN -I${GMP_DIR} -L${GMP_DIR}/usr/lib android-${TARGET_ARCH};\
@@ -363,6 +368,7 @@ $(LEVELDB_LIB): $(LEVELDB_TIMESTAMP)
 	export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-leveldb;                          \
 	${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
 		--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
+		--platform=android-9                                                   \
 		--install-dir=$${TOOLCHAIN};                                           \
 	export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
 	export CC=${CROSS_PREFIX}gcc;                                              \
@@ -416,6 +422,8 @@ $(FREETYPE_LIB) : $(FREETYPE_TIMESTAMP)
 	${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG}                                  \
 		NDK_MODULE_PATH=${NDK_MODULE_PATH}                                     \
 		APP_PLATFORM=${APP_PLATFORM} APP_ABI=${TARGET_ABI}                     \
+		PRIVATE_CC=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}gcc \
+		PRIVATE_CXX=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}g++ \
 		TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                \
 		TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                              \
 		TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                 \
@@ -469,6 +477,7 @@ $(ICONV_LIB) : $(ICONV_TIMESTAMP)
 	export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-iconv;                            \
 	${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
 		--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
+		--platform=android-9                                                   \
 		--install-dir=$${TOOLCHAIN};                                           \
 	export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
 	export CC=${CROSS_PREFIX}gcc;                                              \
@@ -531,6 +540,8 @@ $(IRRLICHT_LIB): $(IRRLICHT_TIMESTAMP) $(FREETYPE_LIB)
 	${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG}                                  \
 		NDK_MODULE_PATH=${NDK_MODULE_PATH}                                     \
 		APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM}                     \
+		PRIVATE_CC=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}gcc \
+		PRIVATE_CXX=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}g++ \
 		TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                \
 		TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                              \
 		TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1;                 \
@@ -581,6 +592,7 @@ $(CURL_LIB): $(CURL_TIMESTAMP) $(OPENSSL_LIB)
 	export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-curl;                             \
 	${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
 		--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
+		--platform=android-9                                                   \
 		--install-dir=$${TOOLCHAIN};                                           \
 	export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
 	export CC=${CROSS_PREFIX}gcc;                                              \
@@ -640,6 +652,7 @@ $(GMP_LIB): $(GMP_TIMESTAMP)
 	export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-gmp;                              \
 	${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh                    \
 		--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION}                     \
+		--platform=android-9                                                   \
 		--install-dir=$${TOOLCHAIN};                                           \
 	export PATH="$${TOOLCHAIN}/bin:$${PATH}";                                  \
 	export CC=${CROSS_PREFIX}gcc;                                              \
@@ -665,7 +678,9 @@ deps/${SQLITE3_FOLDER}/sqlite3.c :
 	cd deps;                                                                    \
 	wget ${SQLITE3_URL};                                                        \
 	unzip ${SQLITE3_FOLDER}.zip;                                                \
-	ln -s ${SQLITE3_FOLDER} sqlite
+	ln -s ${SQLITE3_FOLDER} sqlite;                                             \
+	cd ${SQLITE3_FOLDER};                                                       \
+	patch sqlite3.c < ${ANDR_ROOT}/patches/sqlite3-readonly-fix.patch
 
 clean_sqlite3:
 	cd deps && $(RM) -rf ${SQLITE3_FOLDER} && $(RM) -f ${SQLITE3_FOLDER}.zip && \
@@ -752,9 +767,11 @@ clean_assets :
 apk: local.properties assets $(ICONV_LIB) $(IRRLICHT_LIB) $(CURL_LIB) $(GMP_LIB) $(LEVELDB_TARGET)       \
 	$(OPENAL_LIB) $(OGG_LIB) prep_srcdir $(ANDR_ROOT)/jni/src/android_version.h    \
 	$(ANDR_ROOT)/jni/src/android_version_githash.h sqlite3_download
-	@${ANDROID_NDK}/ndk-build NDK_MODULE_PATH=${NDK_MODULE_PATH}               \
+	+ @${ANDROID_NDK}/ndk-build NDK_MODULE_PATH=${NDK_MODULE_PATH}             \
 		GPROF=${GPROF} APP_ABI=${TARGET_ABI} HAVE_LEVELDB=${HAVE_LEVELDB}      \
 		APP_PLATFORM=${APP_PLATFORM}                                           \
+		PRIVATE_CC=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}gcc \
+		PRIVATE_CXX=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}g++ \
 		TARGET_LIBDIR=${TARGET_LIBDIR}                                         \
 		TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}"                                \
 		TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}"                              \
@@ -831,4 +848,3 @@ $(ANDR_ROOT)/jni/src/android_version.h : prep_srcdir
 	fi
 
 clean : clean_apk clean_assets
-
diff --git a/build/android/build.gradle b/build/android/build.gradle
index 391e250..20c13e3 100644
--- a/build/android/build.gradle
+++ b/build/android/build.gradle
@@ -14,7 +14,7 @@ android {
 	buildToolsVersion "23.0.3"
 
 	defaultConfig {
-		versionCode 14
+		versionCode 16
 		versionName "${System.env.VERSION_STR}.${versionCode}"
 		minSdkVersion 9
 		targetSdkVersion 9
diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk
index e8534ea..c2186ef 100644
--- a/build/android/jni/Android.mk
+++ b/build/android/jni/Android.mk
@@ -99,7 +99,7 @@ LOCAL_C_INCLUDES := \
 		jni/src                                   \
 		jni/src/script                            \
 		jni/src/lua/src                           \
-		jni/src/json                              \
+		jni/src/jsoncpp                           \
 		jni/src/cguittfont                        \
 		deps/irrlicht/include                     \
 		deps/libiconv/include                     \
@@ -169,6 +169,7 @@ LOCAL_SRC_FILES := \
 		jni/src/log.cpp                           \
 		jni/src/main.cpp                          \
 		jni/src/map.cpp                           \
+		jni/src/map_settings_manager.cpp          \
 		jni/src/mapblock.cpp                      \
 		jni/src/mapblock_mesh.cpp                 \
 		jni/src/mapgen.cpp                        \
@@ -202,6 +203,8 @@ LOCAL_SRC_FILES := \
 		jni/src/porting.cpp                       \
 		jni/src/profiler.cpp                      \
 		jni/src/quicktune.cpp                     \
+		jni/src/reflowscan.cpp                    \
+		jni/src/remoteplayer.cpp                  \
 		jni/src/rollback.cpp                      \
 		jni/src/rollback_interface.cpp            \
 		jni/src/serialization.cpp                 \
@@ -224,6 +227,7 @@ LOCAL_SRC_FILES := \
 		jni/src/util/auth.cpp                     \
 		jni/src/util/base64.cpp                   \
 		jni/src/util/directiontables.cpp          \
+		jni/src/util/enriched_string.cpp          \
 		jni/src/util/numeric.cpp                  \
 		jni/src/util/pointedthing.cpp             \
 		jni/src/util/serialize.cpp                \
@@ -237,6 +241,7 @@ LOCAL_SRC_FILES := \
 		jni/src/unittest/test_connection.cpp      \
 		jni/src/unittest/test_filepath.cpp        \
 		jni/src/unittest/test_inventory.cpp       \
+		jni/src/unittest/test_map_settings_manager.cpp \
 		jni/src/unittest/test_mapnode.cpp         \
 		jni/src/unittest/test_nodedef.cpp         \
 		jni/src/unittest/test_noderesolver.cpp    \
@@ -256,7 +261,9 @@ LOCAL_SRC_FILES := \
 		jni/src/settings.cpp                      \
 		jni/src/wieldmesh.cpp                     \
 		jni/src/client/clientlauncher.cpp         \
-		jni/src/client/tile.cpp
+		jni/src/client/tile.cpp                   \
+		jni/src/client/joystick_controller.cpp    \
+		jni/src/irrlicht_changes/static_text.cpp
 
 # intentionally kept out (we already build openssl itself): jni/src/util/sha256.c
 
@@ -356,7 +363,7 @@ LOCAL_SRC_FILES += \
 		jni/src/threading/thread.cpp
 
 # JSONCPP
-LOCAL_SRC_FILES += jni/src/json/jsoncpp.cpp
+LOCAL_SRC_FILES += jni/src/jsoncpp/json/jsoncpp.cpp
 
 LOCAL_SHARED_LIBRARIES := iconv openal ogg vorbis gmp
 LOCAL_STATIC_LIBRARIES := Irrlicht freetype curl ssl crypto android_native_app_glue $(PROFILER_LIBS)
diff --git a/build/android/patches/sqlite3-readonly-fix.patch b/build/android/patches/sqlite3-readonly-fix.patch
new file mode 100644
index 0000000..be19055
--- /dev/null
+++ b/build/android/patches/sqlite3-readonly-fix.patch
@@ -0,0 +1,17 @@
+--- sqlite3.c	2016-11-29 02:29:24.000000000 +0000
++++ sqlite3.c	2016-12-08 22:54:54.206465377 +0000
+@@ -30445,7 +30445,14 @@
+ #if OS_VXWORKS
+   struct vxworksFileId *pId;  /* Unique file ID for vxworks. */
+ #else
+-  ino_t ino;                  /* Inode number */
++  #ifdef ANDROID
++    // Bionic's struct stat has a 64 bit st_ino on both 32 and
++    // 64 bit architectures. ino_t remains 32 bits wide on 32 bit
++    // architectures and can lead to inode truncation.
++    unsigned long long ino;     /* Inode number */
++  #else
++    ino_t ino;     /* Inode number */
++  #endif
+ #endif
+ };
diff --git a/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java b/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
index 3173a71..159521a 100644
--- a/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
+++ b/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
@@ -19,11 +19,6 @@ public class MtNativeActivity extends NativeActivity {
 	public void onDestroy() {
 		super.onDestroy();
 	}
-	
-	@Override
-	public void onBackPressed() {
-	}
-
 
 	public void copyAssets() {
 		Intent intent = new Intent(this, MinetestAssetCopy.class);
diff --git a/builtin/common/misc_helpers.lua b/builtin/common/misc_helpers.lua
index e4653d4..c2dc751 100644
--- a/builtin/common/misc_helpers.lua
+++ b/builtin/common/misc_helpers.lua
@@ -382,7 +382,6 @@ if INIT == "game" then
 					itemstack, pointed_thing)
 			return
 		end
-		local pitch = placer:get_look_pitch()
 		local fdir = core.dir_to_facedir(placer:get_look_dir())
 		local wield_name = itemstack:get_name()
 
diff --git a/builtin/common/strict.lua b/builtin/common/strict.lua
index 05ceadf..23ba3d7 100644
--- a/builtin/common/strict.lua
+++ b/builtin/common/strict.lua
@@ -5,6 +5,9 @@ local WARN_INIT = false
 
 
 function core.global_exists(name)
+	if type(name) ~= "string" then
+		error("core.global_exists: " .. tostring(name) .. " is not a string")
+	end
 	return rawget(_G, name) ~= nil
 end
 
diff --git a/builtin/common/vector.lua b/builtin/common/vector.lua
index e9ed3aa..90ba3cc 100644
--- a/builtin/common/vector.lua
+++ b/builtin/common/vector.lua
@@ -31,6 +31,14 @@ function vector.normalize(v)
 	end
 end
 
+function vector.floor(v)
+	return {
+		x = math.floor(v.x),
+		y = math.floor(v.y),
+		z = math.floor(v.z)
+	}
+end
+
 function vector.round(v)
 	return {
 		x = math.floor(v.x + 0.5),
@@ -130,4 +138,3 @@ function vector.divide(a, b)
 			z = a.z / b}
 	end
 end
-
diff --git a/builtin/game/auth.lua b/builtin/game/auth.lua
index deb811b..46fe3d3 100644
--- a/builtin/game/auth.lua
+++ b/builtin/game/auth.lua
@@ -199,3 +199,19 @@ core.register_on_joinplayer(function(player)
 	record_login(player:get_player_name())
 end)
 
+core.register_on_prejoinplayer(function(name, ip)
+	local auth = core.auth_table
+	if auth[name] ~= nil then
+		return
+	end
+
+	local name_lower = name:lower()
+	for k in pairs(auth) do
+		if k:lower() == name_lower then
+			return string.format("\nCannot create new player called '%s'. "..
+					"Another account called '%s' is already registered. "..
+					"Please check the spelling if it's your account "..
+					"or use a different nickname.", name, k)
+		end
+	end
+end)
diff --git a/builtin/game/chatcommands.lua b/builtin/game/chatcommands.lua
index 3350140..2bd9385 100644
--- a/builtin/game/chatcommands.lua
+++ b/builtin/game/chatcommands.lua
@@ -14,19 +14,6 @@ function core.register_chatcommand(cmd, def)
 	core.chatcommands[cmd] = def
 end
 
-if core.setting_getbool("mod_profiling") then
-	local tracefct = profiling_print_log
-	profiling_print_log = nil
-	core.register_chatcommand("save_mod_profile",
-			{
-				params      = "",
-				description = "save mod profiling data to logfile " ..
-						"(depends on default loglevel)",
-				func        = tracefct,
-				privs       = { server=true }
-			})
-end
-
 core.register_on_chat_message(function(name, message)
 	local cmd, param = string.match(message, "^/([^ ]+) *(.*)")
 	if not param then
@@ -51,6 +38,12 @@ core.register_on_chat_message(function(name, message)
 	return true  -- Handled chat message
 end)
 
+if core.setting_getbool("profiler.load") then
+	-- Run after register_chatcommand and its register_on_chat_message
+	-- Before any chattcommands that should be profiled
+	profiler.init_chatcommand()
+end
+
 -- Parses a "range" string in the format of "here (number)" or
 -- "(x1, y1, z1) (x2, y2, z2)", returning two position vectors
 local function parse_range_str(player_name, str)
@@ -102,7 +95,7 @@ core.register_chatcommand("help", {
 	description = "Get help for commands or list privileges",
 	func = function(name, param)
 		local function format_help_line(cmd, def)
-			local msg = "/"..cmd
+			local msg = core.colorize("#00ffff", "/"..cmd)
 			if def.params and def.params ~= "" then
 				msg = msg .. " " .. def.params
 			end
@@ -154,60 +147,79 @@ core.register_chatcommand("help", {
 core.register_chatcommand("privs", {
 	params = "<name>",
 	description = "print out privileges of player",
-	func = function(name, param)
-		param = (param ~= "" and param or name)
-		return true, "Privileges of " .. param .. ": "
+	func = function(caller, param)
+		param = param:trim()
+		local name = (param ~= "" and param or caller)
+		return true, "Privileges of " .. name .. ": "
 			.. core.privs_to_string(
-				core.get_player_privs(param), ' ')
+				core.get_player_privs(name), ' ')
 	end,
 })
+
+local function handle_grant_command(caller, grantname, grantprivstr)
+	local caller_privs = minetest.get_player_privs(caller)
+	if not (caller_privs.privs or caller_privs.basic_privs) then
+		return false, "Your privileges are insufficient."
+	end
+	
+	if not core.auth_table[grantname] then
+		return false, "Player " .. grantname .. " does not exist."
+	end
+	local grantprivs = core.string_to_privs(grantprivstr)
+	if grantprivstr == "all" then
+		grantprivs = core.registered_privileges
+	end
+	local privs = core.get_player_privs(grantname)
+	local privs_unknown = ""
+	local basic_privs =
+		core.string_to_privs(core.setting_get("basic_privs") or "interact,shout")
+	for priv, _ in pairs(grantprivs) do
+		if not basic_privs[priv] and not caller_privs.privs then
+			return false, "Your privileges are insufficient."
+		end
+		if not core.registered_privileges[priv] then
+			privs_unknown = privs_unknown .. "Unknown privilege: " .. priv .. "\n"
+		end
+		privs[priv] = true
+	end
+	if privs_unknown ~= "" then
+		return false, privs_unknown
+	end
+	core.set_player_privs(grantname, privs)
+	core.log("action", caller..' granted ('..core.privs_to_string(grantprivs, ', ')..') privileges to '..grantname)
+	if grantname ~= caller then
+		core.chat_send_player(grantname, caller
+				.. " granted you privileges: "
+				.. core.privs_to_string(grantprivs, ' '))
+	end
+	return true, "Privileges of " .. grantname .. ": "
+		.. core.privs_to_string(
+			core.get_player_privs(grantname), ' ')
+end
+
 core.register_chatcommand("grant", {
 	params = "<name> <privilege>|all",
 	description = "Give privilege to player",
 	func = function(name, param)
-		if not core.check_player_privs(name, {privs=true}) and
-				not core.check_player_privs(name, {basic_privs=true}) then
-			return false, "Your privileges are insufficient."
-		end
 		local grantname, grantprivstr = string.match(param, "([^ ]+) (.+)")
 		if not grantname or not grantprivstr then
 			return false, "Invalid parameters (see /help grant)"
-		elseif not core.auth_table[grantname] then
-			return false, "Player " .. grantname .. " does not exist."
-		end
-		local grantprivs = core.string_to_privs(grantprivstr)
-		if grantprivstr == "all" then
-			grantprivs = core.registered_privileges
-		end
-		local privs = core.get_player_privs(grantname)
-		local privs_unknown = ""
-		local basic_privs =
-			core.string_to_privs(core.setting_get("basic_privs") or "interact,shout")
-		for priv, _ in pairs(grantprivs) do
-			if not basic_privs[priv] and
-					not core.check_player_privs(name, {privs=true}) then
-				return false, "Your privileges are insufficient."
-			end
-			if not core.registered_privileges[priv] then
-				privs_unknown = privs_unknown .. "Unknown privilege: " .. priv .. "\n"
-			end
-			privs[priv] = true
-		end
-		if privs_unknown ~= "" then
-			return false, privs_unknown
-		end
-		core.set_player_privs(grantname, privs)
-		core.log("action", name..' granted ('..core.privs_to_string(grantprivs, ', ')..') privileges to '..grantname)
-		if grantname ~= name then
-			core.chat_send_player(grantname, name
-					.. " granted you privileges: "
-					.. core.privs_to_string(grantprivs, ' '))
-		end
-		return true, "Privileges of " .. grantname .. ": "
-			.. core.privs_to_string(
-				core.get_player_privs(grantname), ' ')
+		end	
+		return handle_grant_command(name, grantname, grantprivstr)
+	end,
+})
+
+core.register_chatcommand("grantme", {
+	params = "<privilege>|all",
+	description = "Grant privileges to yourself",
+	func = function(name, param)
+		if param == "" then
+			return false, "Invalid parameters (see /help grantme)"
+		end	
+		return handle_grant_command(name, name, param)
 	end,
 })
+
 core.register_chatcommand("revoke", {
 	params = "<name> <privilege>|all",
 	description = "Remove privilege from player",
diff --git a/builtin/game/constants.lua b/builtin/game/constants.lua
index d0b7c75..50c515b 100644
--- a/builtin/game/constants.lua
+++ b/builtin/game/constants.lua
@@ -4,14 +4,24 @@
 -- Constants values for use with the Lua API
 --
 
+-- mapnode.h
 -- Built-in Content IDs (for use with VoxelManip API)
 core.CONTENT_UNKNOWN = 125
 core.CONTENT_AIR     = 126
 core.CONTENT_IGNORE  = 127
 
+-- emerge.h
 -- Block emerge status constants (for use with core.emerge_area)
 core.EMERGE_CANCELLED   = 0
 core.EMERGE_ERRORED     = 1
 core.EMERGE_FROM_MEMORY = 2
 core.EMERGE_FROM_DISK   = 3
 core.EMERGE_GENERATED   = 4
+
+-- constants.h
+-- Size of mapblocks in nodes
+core.MAP_BLOCKSIZE = 16
+
+-- light.h
+-- Maximum value for node 'light_source' parameter
+core.LIGHT_MAX = 14
diff --git a/builtin/game/detached_inventory.lua b/builtin/game/detached_inventory.lua
index b5d106b..420e89f 100644
--- a/builtin/game/detached_inventory.lua
+++ b/builtin/game/detached_inventory.lua
@@ -2,7 +2,7 @@
 
 core.detached_inventories = {}
 
-function core.create_detached_inventory(name, callbacks)
+function core.create_detached_inventory(name, callbacks, player_name)
 	local stuff = {}
 	stuff.name = name
 	if callbacks then
@@ -15,6 +15,6 @@ function core.create_detached_inventory(name, callbacks)
 	end
 	stuff.mod_origin = core.get_current_modname() or "??"
 	core.detached_inventories[name] = stuff
-	return core.create_detached_inventory_raw(name)
+	return core.create_detached_inventory_raw(name, player_name)
 end
 
diff --git a/builtin/game/falling.lua b/builtin/game/falling.lua
index 57bb98c..4696ce4 100644
--- a/builtin/game/falling.lua
+++ b/builtin/game/falling.lua
@@ -1,5 +1,7 @@
 -- Minetest: builtin/item.lua
 
+local builtin_shared = ...
+
 --
 -- Falling stuff
 --
@@ -41,19 +43,20 @@ core.register_entity(":__builtin:falling_node", {
 	end,
 
 	on_step = function(self, dtime)
-		 -- Set gravity
+		-- Set gravity
 		local acceleration = self.object:getacceleration()
 		if not vector.equals(acceleration, {x = 0, y = -10, z = 0}) then
 			self.object:setacceleration({x = 0, y = -10, z = 0})
 		end
-		-- Turn to actual sand when collides to ground or just move
+		-- Turn to actual node when colliding with ground, or continue to move
 		local pos = self.object:getpos()
-		local bcp = {x = pos.x, y = pos.y - 0.7, z = pos.z} -- Position of bottom center point
-		local bcn = core.get_node(bcp)
-		local bcd = core.registered_nodes[bcn.name]
-		-- Note: walkable is in the node definition, not in item groups
-		if not bcd or
-				(bcd.walkable or
+		-- Position of bottom center point
+		local bcp = {x = pos.x, y = pos.y - 0.7, z = pos.z}
+		-- Avoid bugs caused by an unloaded node below
+		local bcn = core.get_node_or_nil(bcp)
+		local bcd = bcn and core.registered_nodes[bcn.name]
+		if bcn and
+				(not bcd or bcd.walkable or
 				(core.get_item_group(self.node.name, "float") ~= 0 and
 				bcd.liquidtype ~= "none")) then
 			if bcd and bcd.leveled and
@@ -75,20 +78,20 @@ core.register_entity(":__builtin:falling_node", {
 			local np = {x = bcp.x, y = bcp.y + 1, z = bcp.z}
 			-- Check what's here
 			local n2 = core.get_node(np)
+			local nd = core.registered_nodes[n2.name]
 			-- If it's not air or liquid, remove node and replace it with
 			-- it's drops
-			if n2.name ~= "air" and (not core.registered_nodes[n2.name] or
-					core.registered_nodes[n2.name].liquidtype == "none") then
+			if n2.name ~= "air" and (not nd or nd.liquidtype == "none") then
 				core.remove_node(np)
-				if core.registered_nodes[n2.name].buildable_to == false then
+				if nd.buildable_to == false then
 					-- Add dropped items
 					local drops = core.get_node_drops(n2.name, "")
-					for _, dropped_item in ipairs(drops) do
+					for _, dropped_item in pairs(drops) do
 						core.add_item(np, dropped_item)
 					end
 				end
 				-- Run script hook
-				for _, callback in ipairs(core.registered_on_dignodes) do
+				for _, callback in pairs(core.registered_on_dignodes) do
 					callback(np, n2)
 				end
 			end
@@ -97,7 +100,7 @@ core.register_entity(":__builtin:falling_node", {
 				core.add_node(np, self.node)
 			end
 			self.object:remove()
-			nodeupdate(np)
+			core.check_for_falling(np)
 			return
 		end
 		local vel = self.object:getvelocity()
@@ -108,15 +111,17 @@ core.register_entity(":__builtin:falling_node", {
 	end
 })
 
-function spawn_falling_node(p, node)
+local function spawn_falling_node(p, node)
 	local obj = core.add_entity(p, "__builtin:falling_node")
-	obj:get_luaentity():set_node(node)
+	if obj then
+		obj:get_luaentity():set_node(node)
+	end
 end
 
-function drop_attached_node(p)
+local function drop_attached_node(p)
 	local nn = core.get_node(p).name
 	core.remove_node(p)
-	for _, item in ipairs(core.get_node_drops(nn, "")) do
+	for _, item in pairs(core.get_node_drops(nn, "")) do
 		local pos = {
 			x = p.x + math.random()/2 - 0.25,
 			y = p.y + math.random()/2 - 0.25,
@@ -126,11 +131,15 @@ function drop_attached_node(p)
 	end
 end
 
-function check_attached_node(p, n)
+function builtin_shared.check_attached_node(p, n)
 	local def = core.registered_nodes[n.name]
 	local d = {x = 0, y = 0, z = 0}
 	if def.paramtype2 == "wallmounted" then
-		d = core.wallmounted_to_dir(n.param2)
+		-- The fallback vector here is in case 'wallmounted to dir' is nil due
+		-- to voxelmanip placing a wallmounted node without resetting a
+		-- pre-existing param2 value that is out-of-range for wallmounted.
+		-- The fallback vector corresponds to param2 = 0.
+		d = core.wallmounted_to_dir(n.param2) or {x = 0, y = 1, z = 0}
 	else
 		d.y = -1
 	end
@@ -147,19 +156,23 @@ end
 -- Some common functions
 --
 
-function nodeupdate_single(p)
+function core.check_single_for_falling(p)
 	local n = core.get_node(p)
 	if core.get_item_group(n.name, "falling_node") ~= 0 then
 		local p_bottom = {x = p.x, y = p.y - 1, z = p.z}
-		local n_bottom = core.get_node(p_bottom)
-		-- Note: walkable is in the node definition, not in item groups
-		if core.registered_nodes[n_bottom.name] and
+		-- Only spawn falling node if node below is loaded
+		local n_bottom = core.get_node_or_nil(p_bottom)
+		local d_bottom = n_bottom and core.registered_nodes[n_bottom.name]
+		if d_bottom and
+
 				(core.get_item_group(n.name, "float") == 0 or
-					core.registered_nodes[n_bottom.name].liquidtype == "none") and
-				(n.name ~= n_bottom.name or (core.registered_nodes[n_bottom.name].leveled and
-					core.get_node_level(p_bottom) < core.get_node_max_level(p_bottom))) and
-				(not core.registered_nodes[n_bottom.name].walkable or
-					core.registered_nodes[n_bottom.name].buildable_to) then
+				d_bottom.liquidtype == "none") and
+
+				(n.name ~= n_bottom.name or (d_bottom.leveled and
+				core.get_node_level(p_bottom) <
+				core.get_node_max_level(p_bottom))) and
+
+				(not d_bottom.walkable or d_bottom.buildable_to) then
 			n.level = core.get_node_level(p)
 			core.remove_node(p)
 			spawn_falling_node(p, n)
@@ -168,7 +181,7 @@ function nodeupdate_single(p)
 	end
 
 	if core.get_item_group(n.name, "attached_node") ~= 0 then
-		if not check_attached_node(p, n) then
+		if not builtin_shared.check_attached_node(p, n) then
 			drop_attached_node(p)
 			return true
 		end
@@ -181,7 +194,7 @@ end
 -- We don't walk diagonals, only our direct neighbors, and self.
 -- Down first as likely case, but always before self. The same with sides.
 -- Up must come last, so that things above self will also fall all at once.
-local nodeupdate_neighbors = {
+local check_for_falling_neighbors = {
 	{x = -1, y = -1, z = 0},
 	{x = 1, y = -1, z = 0},
 	{x = 0, y = -1, z = -1},
@@ -195,7 +208,7 @@ local nodeupdate_neighbors = {
 	{x = 0, y = 1, z = 0},
 }
 
-function nodeupdate(p)
+function core.check_for_falling(p)
 	-- Round p to prevent falling entities to get stuck.
 	p = vector.round(p)
 
@@ -214,10 +227,10 @@ function nodeupdate(p)
 		n = n + 1
 		s[n] = {p = p, v = v}
 		-- Select next node from neighbor list.
-		p = vector.add(p, nodeupdate_neighbors[v])
+		p = vector.add(p, check_for_falling_neighbors[v])
 		-- Now we check out the node. If it is in need of an update,
 		-- it will let us know in the return value (true = updated).
-		if not nodeupdate_single(p) then
+		if not core.check_single_for_falling(p) then
 			-- If we don't need to "recurse" (walk) to it then pop
 			-- our previous pos off the stack and continue from there,
 			-- with the v value we were at when we last were at that
@@ -249,12 +262,33 @@ end
 -- Global callbacks
 --
 
-function on_placenode(p, node)
-	nodeupdate(p)
+local function on_placenode(p, node)
+	core.check_for_falling(p)
 end
 core.register_on_placenode(on_placenode)
 
-function on_dignode(p, node)
-	nodeupdate(p)
+local function on_dignode(p, node)
+	core.check_for_falling(p)
 end
 core.register_on_dignode(on_dignode)
+
+local function on_punchnode(p, node)
+	core.check_for_falling(p)
+end
+core.register_on_punchnode(on_punchnode)
+
+--
+-- Globally exported functions
+--
+
+-- TODO remove this function after the 0.4.15 release
+function nodeupdate(p)
+	core.log("deprecated", "nodeupdate: deprecated, please use core.check_for_falling instead")
+	core.check_for_falling(p)
+end
+
+-- TODO remove this function after the 0.4.15 release
+function nodeupdate_single(p)
+	core.log("deprecated", "nodeupdate_single: deprecated, please use core.check_single_for_falling instead")
+	core.check_single_for_falling(p)
+end
diff --git a/builtin/game/forceloading.lua b/builtin/game/forceloading.lua
index 8c9fbf5..8a05de3 100644
--- a/builtin/game/forceloading.lua
+++ b/builtin/game/forceloading.lua
@@ -5,9 +5,10 @@ core.forceload_block = nil
 core.forceload_free_block = nil
 
 local blocks_forceloaded
+local blocks_temploaded = {}
 local total_forceloaded = 0
 
-local BLOCKSIZE = 16
+local BLOCKSIZE = core.MAP_BLOCKSIZE
 local function get_blockpos(pos)
 	return {
 		x = math.floor(pos.x/BLOCKSIZE),
@@ -15,32 +16,52 @@ local function get_blockpos(pos)
 		z = math.floor(pos.z/BLOCKSIZE)}
 end
 
-function core.forceload_block(pos)
+-- When we create/free a forceload, it's either transient or persistent. We want
+-- to add to/remove from the table that corresponds to the type of forceload, but
+-- we also need the other table because whether we forceload a block depends on
+-- both tables.
+-- This function returns the "primary" table we are adding to/removing from, and
+-- the other table.
+local function get_relevant_tables(transient)
+	if transient then
+		return blocks_temploaded, blocks_forceloaded
+	else
+		return blocks_forceloaded, blocks_temploaded
+	end
+end
+
+function core.forceload_block(pos, transient)
 	local blockpos = get_blockpos(pos)
 	local hash = core.hash_node_position(blockpos)
-	if blocks_forceloaded[hash] ~= nil then
-		blocks_forceloaded[hash] = blocks_forceloaded[hash] + 1
+	local relevant_table, other_table = get_relevant_tables(transient)
+	if relevant_table[hash] ~= nil then
+		relevant_table[hash] = relevant_table[hash] + 1
 		return true
+	elseif other_table[hash] ~= nil then
+		relevant_table[hash] = 1
 	else
 		if total_forceloaded >= (tonumber(core.setting_get("max_forceloaded_blocks")) or 16) then
 			return false
 		end
 		total_forceloaded = total_forceloaded+1
-		blocks_forceloaded[hash] = 1
+		relevant_table[hash] = 1
 		forceload_block(blockpos)
 		return true
 	end
 end
 
-function core.forceload_free_block(pos)
+function core.forceload_free_block(pos, transient)
 	local blockpos = get_blockpos(pos)
 	local hash = core.hash_node_position(blockpos)
-	if blocks_forceloaded[hash] == nil then return end
-	if blocks_forceloaded[hash] > 1 then
-		blocks_forceloaded[hash] = blocks_forceloaded[hash] - 1
+	local relevant_table, other_table = get_relevant_tables(transient)
+	if relevant_table[hash] == nil then return end
+	if relevant_table[hash] > 1 then
+		relevant_table[hash] = relevant_table[hash] - 1
+	elseif other_table[hash] ~= nil then
+		relevant_table[hash] = nil
 	else
 		total_forceloaded = total_forceloaded-1
-		blocks_forceloaded[hash] = nil
+		relevant_table[hash] = nil
 		forceload_free_block(blockpos)
 	end
 end
diff --git a/builtin/game/init.lua b/builtin/game/init.lua
index a6cfa3b..b5e2f7c 100644
--- a/builtin/game/init.lua
+++ b/builtin/game/init.lua
@@ -3,14 +3,18 @@ local scriptpath = core.get_builtin_path()..DIR_DELIM
 local commonpath = scriptpath.."common"..DIR_DELIM
 local gamepath = scriptpath.."game"..DIR_DELIM
 
+-- Shared between builtin files, but
+-- not exposed to outer context
+local builtin_shared = {}
+
 dofile(commonpath.."vector.lua")
 
 dofile(gamepath.."constants.lua")
-dofile(gamepath.."item.lua")
+assert(loadfile(gamepath.."item.lua"))(builtin_shared)
 dofile(gamepath.."register.lua")
 
-if core.setting_getbool("mod_profiling") then
-	dofile(gamepath.."mod_profiling.lua")
+if core.setting_getbool("profiler.load") then
+	profiler = dofile(scriptpath.."profiler"..DIR_DELIM.."init.lua")
 end
 
 dofile(gamepath.."item_entity.lua")
@@ -21,8 +25,10 @@ dofile(gamepath.."auth.lua")
 dofile(gamepath.."chatcommands.lua")
 dofile(gamepath.."static_spawn.lua")
 dofile(gamepath.."detached_inventory.lua")
-dofile(gamepath.."falling.lua")
+assert(loadfile(gamepath.."falling.lua"))(builtin_shared)
 dofile(gamepath.."features.lua")
 dofile(gamepath.."voxelarea.lua")
 dofile(gamepath.."forceloading.lua")
 dofile(gamepath.."statbars.lua")
+
+profiler = nil
diff --git a/builtin/game/item.lua b/builtin/game/item.lua
index 36c2c1a..bf456a4 100644
--- a/builtin/game/item.lua
+++ b/builtin/game/item.lua
@@ -1,5 +1,7 @@
 -- Minetest: builtin/item.lua
 
+local builtin_shared = ...
+
 local function copy_pointed_thing(pointed_thing)
 	return {
 		type  = pointed_thing.type,
@@ -250,7 +252,9 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2)
 	local newnode = {name = def.name, param1 = 0, param2 = param2}
 
 	-- Calculate direction for wall mounted stuff like torches and signs
-	if def.paramtype2 == 'wallmounted' and not param2 then
+	if def.place_param2 ~= nil then
+		newnode.param2 = def.place_param2
+	elseif def.paramtype2 == 'wallmounted' and not param2 then
 		local dir = {
 			x = under.x - above.x,
 			y = under.y - above.y,
@@ -273,7 +277,7 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2)
 
 	-- Check if the node is attached and if it can be placed there
 	if core.get_item_group(def.name, "attached_node") ~= 0 and
-		not check_attached_node(place_to, newnode) then
+		not builtin_shared.check_attached_node(place_to, newnode) then
 		core.log("action", "attached node " .. def.name ..
 			" can not be placed at " .. core.pos_to_string(place_to))
 		return itemstack, false
@@ -470,6 +474,9 @@ function core.node_dig(pos, node, digger)
 		-- Wear out tool
 		if not core.setting_getbool("creative_mode") then
 			wielded:add_wear(dp.wear)
+			if wielded:get_count() == 0 and wdef.sound and wdef.sound.breaks then
+				core.sound_play(wdef.sound.breaks, {pos = pos, gain = 0.5})
+			end
 		end
 	end
 	digger:set_wielded_item(wielded)
diff --git a/builtin/game/item_entity.lua b/builtin/game/item_entity.lua
index a66bf33..be158c1 100644
--- a/builtin/game/item_entity.lua
+++ b/builtin/game/item_entity.lua
@@ -31,7 +31,6 @@ core.register_entity(":__builtin:item", {
 		spritediv = {x = 1, y = 1},
 		initial_sprite_basepos = {x = 0, y = 0},
 		is_visible = false,
-		infotext = "",
 	},
 
 	itemstring = '',
@@ -51,7 +50,6 @@ core.register_entity(":__builtin:item", {
 		local c = s
 		local itemtable = stack:to_table()
 		local itemname = nil
-		local description = ""
 		if itemtable then
 			itemname = stack:to_table().name
 		end
@@ -60,7 +58,6 @@ core.register_entity(":__builtin:item", {
 		if core.registered_items[itemname] then
 			item_texture = core.registered_items[itemname].inventory_image
 			item_type = core.registered_items[itemname].type
-			description = core.registered_items[itemname].description
 		end
 		local prop = {
 			is_visible = true,
@@ -69,7 +66,6 @@ core.register_entity(":__builtin:item", {
 			visual_size = {x = s, y = s},
 			collisionbox = {-c, -c, -c, c, c, c},
 			automatic_rotate = math.pi * 0.5,
-			infotext = description,
 		}
 		self.object:set_properties(prop)
 	end,
diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua
index de41cfc..7caa9e7 100644
--- a/builtin/game/misc.lua
+++ b/builtin/game/misc.lua
@@ -38,7 +38,7 @@ core.register_globalstep(function(dtime)
 end)
 
 function core.after(after, func, ...)
-	assert(tonumber(time) and type(func) == "function",
+	assert(tonumber(after) and type(func) == "function",
 			"Invalid core.after invocation")
 	jobs[#jobs + 1] = {
 		func = func,
@@ -48,11 +48,13 @@ function core.after(after, func, ...)
 	}
 end
 
-function core.check_player_privs(player_or_name, ...)
-	local name = player_or_name
-	-- Check if we have been provided with a Player object.
-	if type(name) ~= "string" then
+function core.check_player_privs(name, ...)
+	local arg_type = type(name)
+	if (arg_type == "userdata" or arg_type == "table") and
+			name.get_player_name then -- If it quacks like a Player...
 		name = name:get_player_name()
+	elseif arg_type ~= "string" then
+		error("Invalid core.check_player_privs argument type: " .. arg_type, 2)
 	end
 	
 	local requested_privs = {...}
@@ -85,11 +87,21 @@ end
 local player_list = {}
 
 core.register_on_joinplayer(function(player)
-	player_list[player:get_player_name()] = player
+	local player_name = player:get_player_name()
+	player_list[player_name] = player
+	if not minetest.is_singleplayer() then
+		core.chat_send_all("*** " .. player_name .. " joined the game.")
+	end
 end)
 
-core.register_on_leaveplayer(function(player)
-	player_list[player:get_player_name()] = nil
+core.register_on_leaveplayer(function(player, timed_out)
+	local player_name = player:get_player_name()
+	player_list[player_name] = nil
+	local announcement = "*** " ..  player_name .. " left the game."
+	if timed_out then
+		announcement = announcement .. " (timed out)"
+	end
+	core.chat_send_all(announcement)
 end)
 
 function core.get_connected_players()
@@ -197,3 +209,39 @@ function core.http_add_fetch(httpenv)
 
 	return httpenv
 end
+
+if minetest.setting_getbool("disable_escape_sequences") then
+
+	function core.get_color_escape_sequence(color)
+		return ""
+	end
+
+	function core.get_background_escape_sequence(color)
+		return ""
+	end
+
+	function core.colorize(color, message)
+		return message
+	end
+
+else
+
+	local ESCAPE_CHAR = string.char(0x1b)
+	function core.get_color_escape_sequence(color)
+		return ESCAPE_CHAR .. "(c@" .. color .. ")"
+	end
+
+	function core.get_background_escape_sequence(color)
+		return ESCAPE_CHAR .. "(b@" .. color .. ")"
+	end
+
+	function core.colorize(color, message)
+		return core.get_color_escape_sequence(color) .. message .. core.get_color_escape_sequence("#ffffff")
+	end
+
+end
+
+function core.close_formspec(player_name, formname)
+	return minetest.show_formspec(player_name, formname, "")
+end
+
diff --git a/builtin/game/mod_profiling.lua b/builtin/game/mod_profiling.lua
deleted file mode 100644
index df2d102..0000000
--- a/builtin/game/mod_profiling.lua
+++ /dev/null
@@ -1,356 +0,0 @@
--- Minetest: builtin/game/mod_profiling.lua
-
-local mod_statistics = {}
-mod_statistics.step_total = 0
-mod_statistics.data = {}
-mod_statistics.stats = {}
-mod_statistics.stats["total"] = {
-	min_us = math.huge,
-	max_us = 0,
-	avg_us = 0,
-	min_per = 100,
-	max_per = 100,
-	avg_per = 100
-}
-
-local replacement_table = {
-	"register_globalstep",
-	"register_on_placenode",
-	"register_on_dignode",
-	"register_on_punchnode",
-	"register_on_generated",
-	"register_on_newplayer",
-	"register_on_dieplayer",
-	"register_on_respawnplayer",
-	"register_on_prejoinplayer",
-	"register_on_joinplayer",
-	"register_on_leaveplayer",
-	"register_on_cheat",
-	"register_on_chat_message",
-	"register_on_player_receive_fields",
-	"register_on_mapgen_init",
-	"register_on_craft",
-	"register_craft_predict",
-	"register_on_item_eat"
-}
-
---------------------------------------------------------------------------------
-function mod_statistics.log_time(type, modname, time_in_us)
-
-	if modname == nil then
-		modname = "builtin"
-	end
-	
-	if mod_statistics.data[modname] == nil then
-		mod_statistics.data[modname] = {}
-	end
-	
-	if mod_statistics.data[modname][type] == nil then
-		mod_statistics.data[modname][type] = 0
-	end
-	
-	mod_statistics.data[modname][type] =
-		mod_statistics.data[modname][type] + time_in_us
-	mod_statistics.step_total = mod_statistics.step_total + time_in_us
-end
-
---------------------------------------------------------------------------------
-function mod_statistics.update_statistics(dtime)
-	for modname,types in pairs(mod_statistics.data) do
-		
-		if mod_statistics.stats[modname] == nil then
-			mod_statistics.stats[modname] = {
-				min_us = math.huge,
-				max_us = 0,
-				avg_us = 0,
-				min_per = 100,
-				max_per = 0,
-				avg_per = 0
-			}
-		end
-		
-		local modtime = 0
-		for type,time in pairs(types) do
-			modtime = modtime + time
-			if mod_statistics.stats[modname].types == nil then
-				mod_statistics.stats[modname].types = {}
-			end
-			if mod_statistics.stats[modname].types[type] == nil then
-				mod_statistics.stats[modname].types[type] = {
-					min_us = math.huge,
-					max_us = 0,
-					avg_us = 0,
-					min_per = 100,
-					max_per = 0,
-					avg_per = 0
-				}
-			end
-			
-			local toupdate = mod_statistics.stats[modname].types[type]
-			
-			--update us values
-			toupdate.min_us = math.min(time, toupdate.min_us)
-			toupdate.max_us = math.max(time, toupdate.max_us)
-			--TODO find better algorithm
-			toupdate.avg_us = toupdate.avg_us * 0.99 + modtime * 0.01
-				
-			--update percentage values
-			local cur_per = (time/mod_statistics.step_total) * 100
-			toupdate.min_per = math.min(toupdate.min_per, cur_per)
-				
-			toupdate.max_per = math.max(toupdate.max_per, cur_per)
-				
-			--TODO find better algorithm
-			toupdate.avg_per = toupdate.avg_per * 0.99 + cur_per * 0.01
-			
-			mod_statistics.data[modname][type] = 0
-		end
-		
-		--per mod statistics
-		--update us values
-		mod_statistics.stats[modname].min_us =
-			math.min(modtime, mod_statistics.stats[modname].min_us)
-		mod_statistics.stats[modname].max_us =
-			math.max(modtime, mod_statistics.stats[modname].max_us)
-		--TODO find better algorithm
-		mod_statistics.stats[modname].avg_us =
-			mod_statistics.stats[modname].avg_us * 0.99 + modtime * 0.01
-			
-		--update percentage values
-		local cur_per = (modtime/mod_statistics.step_total) * 100
-		mod_statistics.stats[modname].min_per =
-			math.min(mod_statistics.stats[modname].min_per, cur_per)
-			
-		mod_statistics.stats[modname].max_per =
-			math.max(mod_statistics.stats[modname].max_per, cur_per)
-			
-		--TODO find better algorithm
-		mod_statistics.stats[modname].avg_per =
-			mod_statistics.stats[modname].avg_per * 0.99 + cur_per * 0.01
-	end
-	
-	--update "total"
-	mod_statistics.stats["total"].min_us =
-		math.min(mod_statistics.step_total, mod_statistics.stats["total"].min_us)
-	mod_statistics.stats["total"].max_us =
-		math.max(mod_statistics.step_total, mod_statistics.stats["total"].max_us)
-	--TODO find better algorithm
-	mod_statistics.stats["total"].avg_us =
-		mod_statistics.stats["total"].avg_us * 0.99 +
-		mod_statistics.step_total * 0.01
-	
-	mod_statistics.step_total = 0
-end
-
---------------------------------------------------------------------------------
-local function build_callback(log_id, fct)
-	return function( toregister )
-		local modname = core.get_current_modname()
-		
-		fct(function(...)
-			local starttime = core.get_us_time()
-			-- note maximum 10 return values are supported unless someone finds
-			-- a way to store a variable lenght return value list
-			local r0, r1, r2, r3, r4, r5, r6, r7, r8, r9 = toregister(...)
-			local delta = core.get_us_time() - starttime
-			mod_statistics.log_time(log_id, modname, delta)
-			return r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
-			end
-		)
-	end
-end
-
---------------------------------------------------------------------------------
-function profiling_print_log(cmd, filter)
-
-	print("Filter:" .. dump(filter))
-
-	core.log("action", "Values below show times/percentages per server step.")
-	core.log("action", "Following suffixes are used for entities:")
-	core.log("action", "\t#oa := on_activate, #os := on_step, #op := on_punch, #or := on_rightclick, #gs := get_staticdata")
-	core.log("action",
-		string.format("%16s | %25s | %10s | %10s | %10s | %9s | %9s | %9s",
-		"modname", "type" , "min µs", "max µs", "avg µs", "min %", "max %", "avg %")
-	)
-	core.log("action",
-		"-----------------+---------------------------+-----------+" ..
-		"-----------+-----------+-----------+-----------+-----------")
-	for modname,statistics in pairs(mod_statistics.stats) do
-		if modname ~= "total" then
-		
-			if (filter == "") or (modname == filter) then
-				if modname:len() > 16 then
-					modname = "..." .. modname:sub(-13)
-				end
-			
-				core.log("action",
-					string.format("%16s | %25s | %9d | %9d | %9d | %9d | %9d | %9d",
-					modname,
-					" ",
-					statistics.min_us,
-					statistics.max_us,
-					statistics.avg_us,
-					statistics.min_per,
-					statistics.max_per,
-					statistics.avg_per)
-				)
-				if core.setting_getbool("detailed_profiling") then
-					if statistics.types ~= nil then
-						for type,typestats in pairs(statistics.types) do
-						
-							if type:len() > 25 then
-								type = "..." .. type:sub(-22)
-							end
-						
-							core.log("action",
-								string.format(
-								"%16s | %25s | %9d | %9d | %9d | %9d | %9d | %9d",
-								" ",
-								type,
-								typestats.min_us,
-								typestats.max_us,
-								typestats.avg_us,
-								typestats.min_per,
-								typestats.max_per,
-								typestats.avg_per)
-							)
-						end
-					end
-				end
-			end
-		end
-	end
-		core.log("action",
-			"-----------------+---------------------------+-----------+" ..
-			"-----------+-----------+-----------+-----------+-----------")
-			
-	if filter == "" then
-		core.log("action",
-			string.format("%16s | %25s | %9d | %9d | %9d | %9d | %9d | %9d",
-			"total",
-			" ",
-			mod_statistics.stats["total"].min_us,
-			mod_statistics.stats["total"].max_us,
-			mod_statistics.stats["total"].avg_us,
-			mod_statistics.stats["total"].min_per,
-			mod_statistics.stats["total"].max_per,
-			mod_statistics.stats["total"].avg_per)
-		)
-	end
-	core.log("action", " ")
-	
-	return true
-end
-
---------------------------------------------------------------------------------
-local function initialize_profiling()
-	core.log("action", "Initialize tracing")
-	
-	mod_statistics.entity_callbacks = {}
-	
-	-- first register our own globalstep handler
-	core.register_globalstep(mod_statistics.update_statistics)
-	
-	local rp_register_entity = core.register_entity
-	core.register_entity = function(name, prototype)
-		local modname = core.get_current_modname()
-		local new_on_activate = nil
-		local new_on_step = nil
-		local new_on_punch = nil
-		local new_rightclick = nil
-		local new_get_staticdata = nil
-		
-		if prototype.on_activate ~= nil then
-			local cbid = name .. "#oa"
-			mod_statistics.entity_callbacks[cbid] = prototype.on_activate
-			new_on_activate = function(self, staticdata, dtime_s)
-				local starttime = core.get_us_time()
-				mod_statistics.entity_callbacks[cbid](self, staticdata, dtime_s)
-				local delta = core.get_us_time() -starttime
-				mod_statistics.log_time(cbid, modname, delta)
-			end
-		end
-		
-		if prototype.on_step ~= nil then
-			local cbid = name .. "#os"
-			mod_statistics.entity_callbacks[cbid] = prototype.on_step
-			new_on_step = function(self, dtime)
-				local starttime = core.get_us_time()
-				mod_statistics.entity_callbacks[cbid](self, dtime)
-				local delta = core.get_us_time() -starttime
-				mod_statistics.log_time(cbid, modname, delta)
-			end
-		end
-	
-		if prototype.on_punch ~= nil then
-			local cbid = name .. "#op"
-			mod_statistics.entity_callbacks[cbid] = prototype.on_punch
-			new_on_punch = function(self, hitter)
-				local starttime = core.get_us_time()
-				mod_statistics.entity_callbacks[cbid](self, hitter)
-				local delta = core.get_us_time() -starttime
-				mod_statistics.log_time(cbid, modname, delta)
-			end
-		end
-		
-		if prototype.rightclick ~= nil then
-			local cbid = name .. "#rc"
-			mod_statistics.entity_callbacks[cbid] = prototype.rightclick
-			new_rightclick = function(self, clicker)
-				local starttime = core.get_us_time()
-				mod_statistics.entity_callbacks[cbid](self, clicker)
-				local delta = core.get_us_time() -starttime
-				mod_statistics.log_time(cbid, modname, delta)
-			end
-		end
-		
-		if prototype.get_staticdata ~= nil then
-			local cbid = name .. "#gs"
-			mod_statistics.entity_callbacks[cbid] = prototype.get_staticdata
-			new_get_staticdata = function(self)
-				local starttime = core.get_us_time()
-				local retval = mod_statistics.entity_callbacks[cbid](self)
-				local delta = core.get_us_time() -starttime
-				mod_statistics.log_time(cbid, modname, delta)
-				return retval
-			end
-		end
-	
-		prototype.on_activate = new_on_activate
-		prototype.on_step = new_on_step
-		prototype.on_punch = new_on_punch
-		prototype.rightclick = new_rightclick
-		prototype.get_staticdata = new_get_staticdata
-		
-		rp_register_entity(name,prototype)
-	end
-	
-	for i,v in ipairs(replacement_table) do
-		local to_replace = core[v]
-		core[v] = build_callback(v, to_replace)
-	end
-	
-	local rp_register_abm = core.register_abm
-	core.register_abm = function(spec)
-	
-		local modname = core.get_current_modname()
-	
-		local replacement_spec = {
-			nodenames = spec.nodenames,
-			neighbors = spec.neighbors,
-			interval  = spec.interval,
-			chance    = spec.chance,
-			action = function(pos, node, active_object_count, active_object_count_wider)
-				local starttime = core.get_us_time()
-				spec.action(pos, node, active_object_count, active_object_count_wider)
-				local delta = core.get_us_time() - starttime
-				mod_statistics.log_time("abm", modname, delta)
-			end
-		}
-		rp_register_abm(replacement_spec)
-	end
-	
-	core.log("action", "Mod profiling initialized")
-end
-
-initialize_profiling()
diff --git a/builtin/game/privileges.lua b/builtin/game/privileges.lua
index bd5ead6..56e090f 100644
--- a/builtin/game/privileges.lua
+++ b/builtin/game/privileges.lua
@@ -26,18 +26,46 @@ function core.register_privilege(name, param)
 end
 
 core.register_privilege("interact", "Can interact with things and modify the world")
-core.register_privilege("teleport", "Can use /teleport command")
-core.register_privilege("bring", "Can teleport other players")
-core.register_privilege("settime", "Can use /time")
-core.register_privilege("privs", "Can modify privileges")
-core.register_privilege("basic_privs", "Can modify 'shout' and 'interact' privileges")
-core.register_privilege("server", "Can do server maintenance stuff")
-core.register_privilege("protection_bypass", "Can bypass node protection in the world")
 core.register_privilege("shout", "Can speak in chat")
-core.register_privilege("ban", "Can ban and unban players")
-core.register_privilege("kick", "Can kick players")
-core.register_privilege("give", "Can use /give and /giveme")
-core.register_privilege("password", "Can use /setpassword and /clearpassword")
+core.register_privilege("basic_privs", "Can modify 'shout' and 'interact' privileges")
+core.register_privilege("privs", "Can modify privileges")
+
+core.register_privilege("teleport", {
+	description = "Can use /teleport command",
+	give_to_singleplayer = false,
+})
+core.register_privilege("bring", {
+	description = "Can teleport other players",
+	give_to_singleplayer = false,
+})
+core.register_privilege("settime", {
+	description = "Can use /time",
+	give_to_singleplayer = false,
+})
+core.register_privilege("server", {
+	description = "Can do server maintenance stuff",
+	give_to_singleplayer = false,
+})
+core.register_privilege("protection_bypass", {
+	description = "Can bypass node protection in the world",
+	give_to_singleplayer = false,
+})
+core.register_privilege("ban", {
+	description = "Can ban and unban players",
+	give_to_singleplayer = false,
+})
+core.register_privilege("kick", {
+	description = "Can kick players",
+	give_to_singleplayer = false,
+})
+core.register_privilege("give", {
+	description = "Can use /give and /giveme",
+	give_to_singleplayer = false,
+})
+core.register_privilege("password", {
+	description = "Can use /setpassword and /clearpassword",
+	give_to_singleplayer = false,
+})
 core.register_privilege("fly", {
 	description = "Can fly using the free_move mode",
 	give_to_singleplayer = false,
@@ -50,5 +78,15 @@ core.register_privilege("noclip", {
 	description = "Can fly through walls",
 	give_to_singleplayer = false,
 })
-core.register_privilege("rollback", "Can use the rollback functionality")
-
+core.register_privilege("rollback", {
+	description = "Can use the rollback functionality",
+	give_to_singleplayer = false,
+})
+core.register_privilege("zoom", {
+	description = "Can zoom the camera",
+	give_to_singleplayer = false,
+})
+core.register_privilege("debug", {
+	description = "Allows enabling various debug options that may affect gameplay",
+	give_to_singleplayer = false,
+})
diff --git a/builtin/game/register.lua b/builtin/game/register.lua
index f330491..90f095e 100644
--- a/builtin/game/register.lua
+++ b/builtin/game/register.lua
@@ -7,6 +7,9 @@
 local register_item_raw = core.register_item_raw
 core.register_item_raw = nil
 
+local unregister_item_raw = core.unregister_item_raw
+core.unregister_item_raw = nil
+
 local register_alias_raw = core.register_alias_raw
 core.register_alias_raw = nil
 
@@ -124,6 +127,11 @@ function core.register_item(name, itemdef)
 				fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8},
 			}
 		end
+		if itemdef.light_source and itemdef.light_source > core.LIGHT_MAX then
+			itemdef.light_source = core.LIGHT_MAX
+			core.log("warning", "Node 'light_source' value exceeds maximum," ..
+				" limiting to maximum: " ..name)
+		end
 		setmetatable(itemdef, {__index = core.nodedef_default})
 		core.registered_nodes[itemdef.name] = itemdef
 	elseif itemdef.type == "craft" then
@@ -172,6 +180,27 @@ function core.register_item(name, itemdef)
 	register_item_raw(itemdef)
 end
 
+function core.unregister_item(name)
+	if not core.registered_items[name] then
+		core.log("warning", "Not unregistering item " ..name..
+			" because it doesn't exist.")
+		return
+	end
+	-- Erase from registered_* table
+	local type = core.registered_items[name].type
+	if type == "node" then
+		core.registered_nodes[name] = nil
+	elseif type == "craft" then
+		core.registered_craftitems[name] = nil
+	elseif type == "tool" then
+		core.registered_tools[name] = nil
+	end
+	core.registered_items[name] = nil
+
+
+	unregister_item_raw(name)
+end
+
 function core.register_node(name, nodedef)
 	nodedef.type = "node"
 	core.register_item(name, nodedef)
@@ -242,6 +271,20 @@ function core.register_alias(name, convert_to)
 	end
 end
 
+function core.register_alias_force(name, convert_to)
+	if forbidden_item_names[name] then
+		error("Unable to register alias: Name is forbidden: " .. name)
+	end
+	if core.registered_items[name] ~= nil then
+		core.unregister_item(name)
+		core.log("info", "Removed item " ..name..
+			" while attempting to force add an alias")
+	end
+	--core.log("Registering alias: " .. name .. " -> " .. convert_to)
+	core.registered_aliases[name] = convert_to
+	register_alias_raw(name, convert_to)
+end
+
 function core.on_craft(itemstack, player, old_craft_list, craft_inv)
 	for _, func in ipairs(core.registered_on_crafts) do
 		itemstack = func(itemstack, player, old_craft_list, craft_inv) or itemstack
diff --git a/builtin/game/voxelarea.lua b/builtin/game/voxelarea.lua
index 6d926c9..7247614 100644
--- a/builtin/game/voxelarea.lua
+++ b/builtin/game/voxelarea.lua
@@ -50,7 +50,7 @@ end
 function VoxelArea:position(i)
 	local p = {}
 	local MinEdge = self.MinEdge
- 
+
 	i = i - 1
 
 	p.z = math.floor(i / self.zstride) + MinEdge.z
@@ -84,23 +84,46 @@ end
 
 function VoxelArea:iter(minx, miny, minz, maxx, maxy, maxz)
 	local i = self:index(minx, miny, minz) - 1
-	local last = self:index(maxx, maxy, maxz)
-	local ystride = self.ystride
-	local zstride = self.zstride
-	local yoff = (last+1) % ystride
-	local zoff = (last+1) % zstride
-	local ystridediff = (i - last) % ystride
-	local zstridediff = (i - last) % zstride
+	local xrange = maxx - minx + 1
+	local nextaction = i + 1 + xrange
+
+	local y = 0
+	local yrange = maxy - miny + 1
+	local yreqstride = self.ystride - xrange
+
+	local z = 0
+	local zrange = maxz - minz + 1
+	local multistride = self.zstride - ((yrange - 1) * self.ystride + xrange)
+
 	return function()
+		-- continue i until it needs to jump
 		i = i + 1
-		if i % zstride == zoff then
-			i = i + zstridediff
-		elseif i % ystride == yoff then
-			i = i + ystridediff
+		if i ~= nextaction then
+			return i
 		end
-		if i <= last then
+
+		-- continue y until maxy is exceeded
+		y = y + 1
+		if y ~= yrange then
+			-- set i to index(minx, miny + y, minz + z) - 1
+			i = i + yreqstride
+			nextaction = i + xrange
 			return i
 		end
+
+		-- continue z until maxz is exceeded
+		z = z + 1
+		if z == zrange then
+			-- cuboid finished, return nil
+			return
+		end
+
+		-- set i to index(minx, miny, minz + z) - 1
+		i = i + multistride
+
+		y = 0
+		nextaction = i + xrange
+		return i
 	end
 end
 
diff --git a/builtin/mainmenu/common.lua b/builtin/mainmenu/common.lua
index 1fd89ff..da36678 100644
--- a/builtin/mainmenu/common.lua
+++ b/builtin/mainmenu/common.lua
@@ -248,14 +248,18 @@ end
 
 --------------------------------------------------------------------------------
 function is_server_protocol_compat(server_proto_min, server_proto_max)
-	return min_supp_proto <= (server_proto_max or 24) and max_supp_proto >= (server_proto_min or 13)
+	if (not server_proto_min) or (not server_proto_max) then
+		-- There is no info. Assume the best and act as if we would be compatible.
+		return true
+	end
+	return min_supp_proto <= server_proto_max and max_supp_proto >= server_proto_min
 end
 --------------------------------------------------------------------------------
 function is_server_protocol_compat_or_error(server_proto_min, server_proto_max)
 	if not is_server_protocol_compat(server_proto_min, server_proto_max) then
 		local server_prot_ver_info, client_prot_ver_info
-		local s_p_min = server_proto_min or 13
-		local s_p_max = server_proto_max or 24
+		local s_p_min = server_proto_min
+		local s_p_max = server_proto_max
 
 		if s_p_min ~= s_p_max then
 			server_prot_ver_info = fgettext_ne("Server supports protocol versions between $1 and $2. ",
diff --git a/builtin/mainmenu/dlg_config_world.lua b/builtin/mainmenu/dlg_config_world.lua
index eb0319b..7b3ab98 100644
--- a/builtin/mainmenu/dlg_config_world.lua
+++ b/builtin/mainmenu/dlg_config_world.lua
@@ -16,6 +16,9 @@
 --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 --------------------------------------------------------------------------------
+
+local enabled_all = false 
+
 local function modname_valid(name)
 	return not name:find("[^a-z0-9_]")
 end
@@ -44,13 +47,18 @@ local function get_formspec(data)
 	if mod == nil then
 		mod = {name=""}
 	end
+
+	local hard_deps, soft_deps = modmgr.get_dependencies(mod.path)
 	
 	retval = retval ..
 		"label[0,0.7;" .. fgettext("Mod:") .. "]" ..
 		"label[0.75,0.7;" .. mod.name .. "]" ..
-		"label[0,1.25;" .. fgettext("Depends:") .. "]" ..
-		"textlist[0,1.75;5,4.25;world_config_depends;" ..
-		modmgr.get_dependencies(mod.path) .. ";0]" ..
+		"label[0,1.25;" .. fgettext("Dependencies:") .. "]" ..
+		"textlist[0,1.75;5,2.125;world_config_depends;" ..
+		hard_deps .. ";0]" ..
+		"label[0,3.875;" .. fgettext("Optional dependencies:") .. "]" ..
+		"textlist[0,4.375;5,1.8;world_config_optdepends;" ..
+		soft_deps .. ";0]" ..
 		"button[3.25,7;2.5,0.5;btn_config_world_save;" .. fgettext("Save") .. "]" ..
 		"button[5.75,7;2.5,0.5;btn_config_world_cancel;" .. fgettext("Cancel") .. "]"
 
@@ -80,11 +88,15 @@ local function get_formspec(data)
 			end
 		end
 	end
-
-	retval = retval ..
-		"button[8.75,0.125;2.5,0.5;btn_all_mods;" .. fgettext("Enable all") .. "]" ..
-		"textlist[5.5,0.75;5.75,5.25;world_config_modlist;"
-
+	if enabled_all then 
+		retval = retval ..
+			"button[8.75,0.125;2.5,0.5;btn_disable_all_mods;" .. fgettext("Disable all") .. "]" ..
+			"textlist[5.5,0.75;5.75,5.4;world_config_modlist;"
+	else
+		retval = retval ..
+			"button[8.75,0.125;2.5,0.5;btn_enable_all_mods;" .. fgettext("Enable all") .. "]" ..
+			"textlist[5.5,0.75;5.75,5.4;world_config_modlist;"
+	end
 	retval = retval .. modmgr.render_modlist(data.list)
 	retval = retval .. ";" .. data.selected_mod .."]"
 
@@ -229,15 +241,27 @@ local function handle_buttons(this, fields)
 		return true
 	end
 
-	if fields["btn_all_mods"] then
+	if fields.btn_enable_all_mods then
 		local list = this.data.list:get_raw_list()
 
-		for i=1,#list,1 do
-			if list[i].typ ~= "game_mod" and
-				not list[i].is_modpack then
+		for i = 1, #list do
+			if list[i].typ ~= "game_mod" and not list[i].is_modpack then
 				list[i].enabled = true
 			end
 		end
+		enabled_all = true
+		return true
+	end
+	
+	if fields.btn_disable_all_mods then
+		local list = this.data.list:get_raw_list()
+
+		for i = 1, #list do
+			if list[i].typ ~= "game_mod" and not list[i].is_modpack then
+				list[i].enabled = false
+			end
+		end
+		enabled_all = false
 		return true
 	end
 
diff --git a/builtin/mainmenu/dlg_settings_advanced.lua b/builtin/mainmenu/dlg_settings_advanced.lua
index f5e80c2..b0d9237 100644
--- a/builtin/mainmenu/dlg_settings_advanced.lua
+++ b/builtin/mainmenu/dlg_settings_advanced.lua
@@ -479,13 +479,13 @@ local function handle_change_setting_buttons(this, fields)
 				return true
 			end
 			if setting.min and new_value < setting.min then
-				this.data.error_message = fgettext_ne("The value must be greater than $1.", setting.min)
+				this.data.error_message = fgettext_ne("The value must be at least $1.", setting.min)
 				this.data.entered_text = fields["te_setting_value"]
 				core.update_formspec(this:get_formspec())
 				return true
 			end
 			if setting.max and new_value > setting.max then
-				this.data.error_message = fgettext_ne("The value must be lower than $1.", setting.max)
+				this.data.error_message = fgettext_ne("The value must not be larger than $1.", setting.max)
 				this.data.entered_text = fields["te_setting_value"]
 				core.update_formspec(this:get_formspec())
 				return true
@@ -659,102 +659,12 @@ function create_adv_settings_dlg()
 				return dlg
 end
 
-local function create_minetest_conf_example()
-	local result = "#    This file contains a list of all available settings and their default value for minetest.conf\n" ..
-			"\n" ..
-			"#    By default, all the settings are commented and not functional.\n" ..
-			"#    Uncomment settings by removing the preceding #.\n" ..
-			"\n" ..
-			"#    minetest.conf is read by default from:\n" ..
-			"#    ../minetest.conf\n" ..
-			"#    ../../minetest.conf\n" ..
-			"#    Any other path can be chosen by passing the path as a parameter\n" ..
-			"#    to the program, eg. \"minetest.exe --config ../minetest.conf.example\".\n" ..
-			"\n" ..
-			"#    Further documentation:\n" ..
-			"#    http://wiki.minetest.net/\n" ..
-			"\n"
-
-	local settings = parse_config_file(true, false)
-	for _, entry in ipairs(settings) do
-		if entry.type == "category" then
-			if entry.level == 0 then
-				result = result .. "#\n# " .. entry.name .. "\n#\n\n"
-			else
-				for i = 1, entry.level do
-					result = result .. "#"
-				end
-				result = result .. "# " .. entry.name .. "\n\n"
-			end
-		else
-			if entry.comment ~= "" then
-				for _, comment_line in ipairs(entry.comment:split("\n", true)) do
-					result = result .."#    " .. comment_line .. "\n"
-				end
-			end
-			result = result .. "#    type: " .. entry.type
-			if entry.min then
-				result = result .. " min: " .. entry.min
-			end
-			if entry.max then
-				result = result .. " max: " .. entry.max
-			end
-			if entry.values then
-				result = result .. " values: " .. table.concat(entry.values, ", ")
-			end
-			if entry.possible then
-				result = result .. " possible values: " .. entry.possible:gsub(",", ", ")
-			end
-			result = result .. "\n"
-			local append = ""
-			if entry.default ~= "" then
-				append = " " .. entry.default
-			end
-			result = result .. "# " .. entry.name .. " =" .. append .. "\n\n"
-		end
-	end
-	return result
-end
+-- Generate minetest.conf.example and settings_translation_file.cpp
 
-local function create_translation_file()
-	local result = "// This file is automatically generated\n" ..
-			"// It conatins a bunch of fake gettext calls, to tell xgettext about the strings in config files\n" ..
-			"// To update it, refer to the bottom of builtin/mainmenu/tab_settings.lua\n\n" ..
-			"fake_function() {\n"
+-- *** Please note ***
+-- There is text in minetest.conf.example that will not be generated from
+-- settingtypes.txt but must be preserved:
+-- The documentation of mapgen noise parameter formats (title plus 16 lines)
+-- Noise parameter 'mgv5_np_ground' in group format (13 lines)
 
-	local settings = parse_config_file(true, false)
-	for _, entry in ipairs(settings) do
-		if entry.type == "category" then
-			local name_escaped = entry.name:gsub("\"", "\\\"")
-			result = result .. "\tgettext(\"" .. name_escaped .. "\");\n"
-		else
-			if entry.readable_name then
-				local readable_name_escaped = entry.readable_name:gsub("\"", "\\\"")
-				result = result .. "\tgettext(\"" .. readable_name_escaped .. "\");\n"
-			end
-			if entry.comment ~= "" then
-				local comment_escaped = entry.comment:gsub("\n", "\\n")
-				comment_escaped = comment_escaped:gsub("\"", "\\\"")
-				result = result .. "\tgettext(\"" .. comment_escaped .. "\");\n"
-			end
-		end
-	end
-	result = result .. "}\n"
-	return result
-end
-
-if false then
-	local file = io.open("minetest.conf.example", "w")
-	if file then
-		file:write(create_minetest_conf_example())
-		file:close()
-	end
-end
-
-if false then
-	local file = io.open("src/settings_translation_file.cpp", "w")
-	if file then
-		file:write(create_translation_file())
-		file:close()
-	end
-end
+--assert(loadfile(core.get_mainmenu_path()..DIR_DELIM.."generate_from_settingtypes.lua"))(parse_config_file(true, false))
diff --git a/builtin/mainmenu/generate_from_settingtypes.lua b/builtin/mainmenu/generate_from_settingtypes.lua
new file mode 100644
index 0000000..6c9ba27
--- /dev/null
+++ b/builtin/mainmenu/generate_from_settingtypes.lua
@@ -0,0 +1,99 @@
+local settings = ...
+
+local concat = table.concat
+local insert = table.insert
+local sprintf = string.format
+local rep = string.rep
+
+local minetest_example_header = [[
+#    This file contains a list of all available settings and their default value for minetest.conf
+
+#    By default, all the settings are commented and not functional.
+#    Uncomment settings by removing the preceding #.
+
+#    minetest.conf is read by default from:
+#    ../minetest.conf
+#    ../../minetest.conf
+#    Any other path can be chosen by passing the path as a parameter
+#    to the program, eg. "minetest.exe --config ../minetest.conf.example".
+
+#    Further documentation:
+#    http://wiki.minetest.net/
+
+]]
+
+local function create_minetest_conf_example()
+	local result = { minetest_example_header }
+	for _, entry in ipairs(settings) do
+		if entry.type == "category" then
+			if entry.level == 0 then
+				insert(result, "#\n# " .. entry.name .. "\n#\n\n")
+			else
+				insert(result, rep("#", entry.level))
+				insert(result, "# " .. entry.name .. "\n\n")
+			end
+		else
+			if entry.comment ~= "" then
+				for _, comment_line in ipairs(entry.comment:split("\n", true)) do
+					insert(result, "#    " .. comment_line .. "\n")
+				end
+			end
+			insert(result, "#    type: " .. entry.type)
+			if entry.min then
+				insert(result, " min: " .. entry.min)
+			end
+			if entry.max then
+				insert(result, " max: " .. entry.max)
+			end
+			if entry.values then
+				insert(result, " values: " .. concat(entry.values, ", "))
+			end
+			if entry.possible then
+				insert(result, " possible values: " .. entry.possible:gsub(",", ", "))
+			end
+			insert(result, "\n")
+			local append
+			if entry.default ~= "" then
+				append = " " .. entry.default
+			end
+			insert(result, sprintf("# %s =%s\n\n", entry.name, append or ""))
+		end
+	end
+	return concat(result)
+end
+
+local translation_file_header = [[
+// This file is automatically generated
+// It conatins a bunch of fake gettext calls, to tell xgettext about the strings in config files
+// To update it, refer to the bottom of builtin/mainmenu/dlg_settings_advanced.lua
+
+fake_function() {]]
+
+local function create_translation_file()
+	local result = { translation_file_header }
+	for _, entry in ipairs(settings) do
+		if entry.type == "category" then
+			insert(result, sprintf("\tgettext(%q);", entry.name))
+		else
+			if entry.readable_name then
+				insert(result, sprintf("\tgettext(%q);", entry.readable_name))
+			end
+			if entry.comment ~= "" then
+				local comment_escaped = entry.comment:gsub("\n", "\\n")
+				comment_escaped = comment_escaped:gsub("\"", "\\\"")
+				insert(result, "\tgettext(\"" .. comment_escaped .. "\");")
+			end
+		end
+	end
+	insert(result, "}\n")
+	return concat(result, "\n")
+end
+
+local file = assert(io.open("minetest.conf.example", "w"))
+file:write(create_minetest_conf_example())
+file:close()
+
+file = assert(io.open("src/settings_translation_file.cpp", "w"))
+file:write(create_translation_file())
+file:close()
+
diff --git a/builtin/mainmenu/modmgr.lua b/builtin/mainmenu/modmgr.lua
index f996df7..2b7b371 100644
--- a/builtin/mainmenu/modmgr.lua
+++ b/builtin/mainmenu/modmgr.lua
@@ -284,27 +284,33 @@ end
 
 --------------------------------------------------------------------------------
 function modmgr.get_dependencies(modfolder)
-	local toadd = ""
+	local toadd_hard = ""
+	local toadd_soft = ""
 	if modfolder ~= nil then
 		local filename = modfolder ..
 					DIR_DELIM .. "depends.txt"
 
+		local hard_dependencies = {}
+		local soft_dependencies = {}
 		local dependencyfile = io.open(filename,"r")
-
 		if dependencyfile then
 			local dependency = dependencyfile:read("*l")
 			while dependency do
-				if toadd ~= "" then
-					toadd = toadd .. ","
+				dependency = dependency:gsub("\r", "")
+				if string.sub(dependency, -1, -1) == "?" then
+					table.insert(soft_dependencies, string.sub(dependency, 1, -2))
+				else
+					table.insert(hard_dependencies, dependency)
 				end
-				toadd = toadd .. dependency
 				dependency = dependencyfile:read()
 			end
 			dependencyfile:close()
 		end
+		toadd_hard = table.concat(hard_dependencies, ",")
+		toadd_soft = table.concat(soft_dependencies, ",")
 	end
 
-	return toadd
+	return toadd_hard, toadd_soft
 end
 
 --------------------------------------------------------------------------------
diff --git a/builtin/mainmenu/tab_credits.lua b/builtin/mainmenu/tab_credits.lua
index 4d2ffd7..c2ad191 100644
--- a/builtin/mainmenu/tab_credits.lua
+++ b/builtin/mainmenu/tab_credits.lua
@@ -29,20 +29,23 @@ local core_developers = {
 	"Loic Blot (nerzhul/nrz) <loic.blot at unix-experience.fr>",
 	"Matt Gregory (paramat)",
 	"est31 <MTest31 at outlook.com>",
-	"Craig Robbins (Zeno)",
+	"Craig Robbins (Zeno) <craig.d.robbins at gmail.com>",
+	"Auke Kok (sofar) <sofar at foo-projects.org>",
+	"Andrew Ward (rubenwardy) <rubenwardy at gmail.com>",
 }
 
 local active_contributors = {
-	"Auke Kok (sofar) <sofar at foo-projects.org>",
 	"Duane Robertson <duane at duanerobertson.com>",
 	"SmallJoker <mk939 at ymail.com>",
-	"Andrew Ward (rubenwardy) <rubenwardy at gmail.com>",
+	"Lars Hofhansl <larsh at apache.org>",
 	"Jeija <jeija at mesecons.net>",
 	"Gregory Currie (gregorycu)",
 	"Sokomine <wegwerf at anarres.dyndns.org>",
 	"TeTpaAka",
 	"Jean-Patrick G (kilbith) <jeanpatrick.guerrero at gmail.com>",
 	"Diego Martínez (kaeza) <kaeza at users.sf.net>",
+	"Dániel Juhász (juhdanad) <juhdanad at gmail.com>",
+	"Rogier <rogier777 at gmail.com>",
 }
 
 local previous_core_developers = {
@@ -76,17 +79,13 @@ return {
 	caption = fgettext("Credits"),
 	cbf_formspec = function(tabview, name, tabdata)
 		local logofile = defaulttexturedir .. "logo.png"
+		local version = core.get_version()
 		return "image[0.5,1;" .. core.formspec_escape(logofile) .. "]" ..
-			"label[0.5,3.2;Minetest " .. core.get_version() .. "]" ..
+			"label[0.5,3.2;" .. version.project .. " " .. version.string .. "]" ..
 			"label[0.5,3.5;http://minetest.net]" ..
 			"tablecolumns[color;text]" ..
 			"tableoptions[background=#00000000;highlight=#00000000;border=false]" ..
 			"table[3.5,-0.25;8.5,5.8;list_credits;" ..
-			"#FFFF00," .. "Dedication of the current release" .. ",," ..
-			"The 0.4.14 release is dedicated to the memory of" .. ",," ..
-			"Minetest developer Maciej Kasatkin (RealBadAngel)" .. ",," ..
-			"who died on March 24 2016." .. ",," ..
-			"Our thoughts are with his family and friends." .. ",,," ..
 			"#FFFF00," .. fgettext("Core Developers") .. ",," ..
 			table.concat(core_developers, ",,") .. ",,," ..
 			"#FFFF00," .. fgettext("Active Contributors") .. ",," ..
diff --git a/builtin/mainmenu/tab_mods.lua b/builtin/mainmenu/tab_mods.lua
index 5b59aa1..4a5b6c0 100644
--- a/builtin/mainmenu/tab_mods.lua
+++ b/builtin/mainmenu/tab_mods.lua
@@ -98,12 +98,24 @@ local function get_formspec(tabview, name, tabdata)
 				.. fgettext("Uninstall selected modpack") .. "]"
 		else
 			--show dependencies
-
-			retval = retval .. "," .. fgettext("Depends:") .. ","
-
-			local toadd = modmgr.get_dependencies(selected_mod.path)
-
-			retval = retval .. toadd .. ";0]"
+			local toadd_hard, toadd_soft = modmgr.get_dependencies(selected_mod.path)
+			if toadd_hard == "" and toadd_soft == "" then
+				retval = retval .. "," .. fgettext("No dependencies.")
+			else
+				if toadd_hard ~= "" then
+					retval = retval .. "," .. fgettext("Dependencies:") .. ","
+					retval = retval .. toadd_hard
+				end
+				if toadd_soft ~= "" then
+					if toadd_hard ~= "" then
+						retval = retval .. ","
+					end
+					retval = retval .. "," .. fgettext("Optional dependencies:") .. ","
+					retval = retval .. toadd_soft
+				end
+			end
+
+			retval = retval .. ";0]"
 
 			retval = retval .. "button[5.5,4.85;4.5,0.5;btn_mod_mgr_delete_mod;"
 				.. fgettext("Uninstall selected mod") .. "]"
diff --git a/builtin/mainmenu/tab_texturepacks.lua b/builtin/mainmenu/tab_texturepacks.lua
index a102fd6..4638bea 100644
--- a/builtin/mainmenu/tab_texturepacks.lua
+++ b/builtin/mainmenu/tab_texturepacks.lua
@@ -73,7 +73,7 @@ local function get_formspec(tabview, name, tabdata)
 	if not file_exists(infofile) then
 		infofile = current_texture_path .. DIR_DELIM .. "info.txt"
 		if file_exists(infofile) then
-			core.log("info.txt is depreciated. description.txt should be used instead.")
+			core.log("deprecated", "info.txt is deprecated. description.txt should be used instead.")
 		end
 	end
 
@@ -96,8 +96,8 @@ local function get_formspec(tabview, name, tabdata)
 	return	retval ..
 			render_texture_pack_list(list) ..
 			";" .. index .. "]" ..
-			"image[0.25,0.25;4.0,3.7;" .. core.formspec_escape(screenfile or no_screenshot) .. "]" ..
-			"textarea[0.6,3.5;3.7,1.5;;" .. core.formspec_escape(infotext or "") .. ";]"
+			"image[0.25,0.25;4.05,2.7;" .. core.formspec_escape(screenfile or no_screenshot) .. "]" ..
+			"textarea[0.6,2.85;3.7,1.5;;" .. core.formspec_escape(infotext or "") .. ";]"
 end
 
 --------------------------------------------------------------------------------
diff --git a/builtin/profiler/init.lua b/builtin/profiler/init.lua
new file mode 100644
index 0000000..c1597d2
--- /dev/null
+++ b/builtin/profiler/init.lua
@@ -0,0 +1,72 @@
+--Minetest
+--Copyright (C) 2016 T4im
+--
+--This program is free software; you can redistribute it and/or modify
+--it under the terms of the GNU Lesser General Public License as published by
+--the Free Software Foundation; either version 2.1 of the License, or
+--(at your option) any later version.
+--
+--This program is distributed in the hope that it will be useful,
+--but WITHOUT ANY WARRANTY; without even the implied warranty of
+--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--GNU Lesser General Public License for more details.
+--
+--You should have received a copy of the GNU Lesser General Public License along
+--with this program; if not, write to the Free Software Foundation, Inc.,
+--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+local profiler_path = core.get_builtin_path()..DIR_DELIM.."profiler"..DIR_DELIM
+local profiler = {}
+local sampler = assert(loadfile(profiler_path .. "sampling.lua"))(profiler)
+local instrumentation  = assert(loadfile(profiler_path .. "instrumentation.lua"))(profiler, sampler)
+local reporter = dofile(profiler_path .. "reporter.lua")
+profiler.instrument = instrumentation.instrument
+
+---
+-- Delayed registration of the /profiler chat command
+-- Is called later, after `core.register_chatcommand` was set up.
+--
+function profiler.init_chatcommand()
+	local instrument_profiler = core.setting_getbool("instrument.profiler") or false
+	if instrument_profiler then
+		instrumentation.init_chatcommand()
+	end
+
+	local param_usage = "print [filter] | dump [filter] | save [format [filter]] | reset"
+	core.register_chatcommand("profiler", {
+		description = "handle the profiler and profiling data",
+		params = param_usage,
+		privs = { server=true },
+		func = function(name, param)
+			local command, arg0 = string.match(param, "([^ ]+) ?(.*)")
+			local args = arg0 and string.split(arg0, " ")
+
+			if command == "dump" then
+				core.log("action", reporter.print(sampler.profile, arg0))
+				return true, "Statistics written to action log"
+			elseif command == "print" then
+				return true, reporter.print(sampler.profile, arg0)
+			elseif command == "save" then
+				return reporter.save(sampler.profile, args[1] or "txt", args[2])
+			elseif command == "reset" then
+				sampler.reset()
+				return true, "Statistics were reset"
+			end
+
+			return false, string.format(
+				"Usage: %s\n" ..
+				"Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).",
+				param_usage
+			)
+		end
+	})
+
+	if not instrument_profiler then
+		instrumentation.init_chatcommand()
+	end
+end
+
+sampler.init()
+instrumentation.init()
+
+return profiler
diff --git a/builtin/profiler/instrumentation.lua b/builtin/profiler/instrumentation.lua
new file mode 100644
index 0000000..4311215
--- /dev/null
+++ b/builtin/profiler/instrumentation.lua
@@ -0,0 +1,232 @@
+--Minetest
+--Copyright (C) 2016 T4im
+--
+--This program is free software; you can redistribute it and/or modify
+--it under the terms of the GNU Lesser General Public License as published by
+--the Free Software Foundation; either version 2.1 of the License, or
+--(at your option) any later version.
+--
+--This program is distributed in the hope that it will be useful,
+--but WITHOUT ANY WARRANTY; without even the implied warranty of
+--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--GNU Lesser General Public License for more details.
+--
+--You should have received a copy of the GNU Lesser General Public License along
+--with this program; if not, write to the Free Software Foundation, Inc.,
+--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+local format, pairs, type = string.format, pairs, type
+local core, get_current_modname = core, core.get_current_modname
+local profiler, sampler = ...
+local instrument_builtin = core.setting_getbool("instrument.builtin") or false
+
+local register_functions = {
+	register_globalstep = 0,
+	register_playerevent = 0,
+	register_on_placenode = 0,
+	register_on_dignode = 0,
+	register_on_punchnode = 0,
+	register_on_generated = 0,
+	register_on_newplayer = 0,
+	register_on_dieplayer = 0,
+	register_on_respawnplayer = 0,
+	register_on_prejoinplayer = 0,
+	register_on_joinplayer = 0,
+	register_on_leaveplayer = 0,
+	register_on_cheat = 0,
+	register_on_chat_message = 0,
+	register_on_player_receive_fields = 0,
+	register_on_craft = 0,
+	register_craft_predict = 0,
+	register_on_protection_violation = 0,
+	register_on_item_eat = 0,
+	register_on_punchplayer = 0,
+	register_on_player_hpchange = 0,
+}
+
+---
+-- Create an unique instrument name.
+-- Generate a missing label with a running index number.
+--
+local counts = {}
+local function generate_name(def)
+	local class, label, func_name = def.class, def.label, def.func_name
+	if label then
+		if class or func_name then
+			return format("%s '%s' %s", class or "", label, func_name or ""):trim()
+		end
+		return format("%s", label):trim()
+	elseif label == false then
+		return format("%s", class or func_name):trim()
+	end
+
+	local index_id = def.mod .. (class or func_name)
+	local index = counts[index_id] or 1
+	counts[index_id] = index + 1
+	return format("%s[%d] %s", class or func_name, index, class and func_name or ""):trim()
+end
+
+---
+-- Keep `measure` and the closure in `instrument` lean, as these, and their
+-- directly called functions are the overhead that is caused by instrumentation.
+--
+local time, log = core.get_us_time, sampler.log
+local function measure(modname, instrument_name, start, ...)
+	log(modname, instrument_name, time() - start)
+	return ...
+end
+--- Automatically instrument a function to measure and log to the sampler.
+-- def = {
+-- 		mod = "",
+-- 		class = "",
+-- 		func_name = "",
+-- 		-- if nil, will create a label based on registration order
+-- 		label = "" | false,
+-- }
+local function instrument(def)
+	if not def or not def.func then
+		return
+	end
+	def.mod = def.mod or get_current_modname()
+	local modname = def.mod
+	local instrument_name = generate_name(def)
+	local func = def.func
+
+	if not instrument_builtin and modname == "*builtin*" then
+		return func
+	end
+
+	return function(...)
+		-- This tail-call allows passing all return values of `func`
+		-- also called https://en.wikipedia.org/wiki/Continuation_passing_style
+		-- Compared to table creation and unpacking it won't lose `nil` returns
+		-- and is expected to be faster
+		-- `measure` will be executed after time() and func(...)
+		return measure(modname, instrument_name, time(), func(...))
+	end
+end
+
+local function can_be_called(func)
+	-- It has to be a function or callable table
+	return type(func) == "function" or
+		((type(func) == "table" or type(func) == "userdata") and
+		getmetatable(func) and getmetatable(func).__call)
+end
+
+local function assert_can_be_called(func, func_name, level)
+	if not can_be_called(func) then
+		-- Then throw an *helpful* error, by pointing on our caller instead of us.
+		error(format("Invalid argument to %s. Expected function-like type instead of '%s'.", func_name, type(func)), level + 1)
+	end
+end
+
+---
+-- Wraps a registration function `func` in such a way,
+-- that it will automatically instrument any callback function passed as first argument.
+--
+local function instrument_register(func, func_name)
+	local register_name = func_name:gsub("^register_", "", 1)
+	return function(callback, ...)
+		assert_can_be_called(callback, func_name, 2)
+		register_functions[func_name] = register_functions[func_name] + 1
+		return func(instrument {
+			func = callback,
+			func_name = register_name
+		}), ...
+	end
+end
+
+local function init_chatcommand()
+	if core.setting_getbool("instrument.chatcommand") or true then
+		local orig_register_chatcommand = core.register_chatcommand
+		core.register_chatcommand = function(cmd, def)
+			def.func = instrument {
+				func = def.func,
+				label = "/" .. cmd,
+			}
+			orig_register_chatcommand(cmd, def)
+		end
+	end
+end
+
+---
+-- Start instrumenting selected functions
+--
+local function init()
+	local is_set = core.setting_getbool
+	if is_set("instrument.entity") or true then
+		-- Explicitly declare entity api-methods.
+		-- Simple iteration would ignore lookup via __index.
+		local entity_instrumentation = {
+			"on_activate",
+			"on_step",
+			"on_punch",
+			"rightclick",
+			"get_staticdata",
+		}
+		-- Wrap register_entity() to instrument them on registration.
+		local orig_register_entity = core.register_entity
+		core.register_entity = function(name, prototype)
+			local modname = get_current_modname()
+			for _, func_name in pairs(entity_instrumentation) do
+				prototype[func_name] = instrument {
+					func = prototype[func_name],
+					mod = modname,
+					func_name = func_name,
+					label = prototype.label,
+				}
+			end
+			orig_register_entity(name,prototype)
+		end
+	end
+
+	if is_set("instrument.abm") or true then
+		-- Wrap register_abm() to automatically instrument abms.
+		local orig_register_abm = core.register_abm
+		core.register_abm = function(spec)
+			spec.action = instrument {
+				func = spec.action,
+				class = "ABM",
+				label = spec.label,
+			}
+			orig_register_abm(spec)
+		end
+	end
+
+	if is_set("instrument.lbm") or true then
+		-- Wrap register_lbm() to automatically instrument lbms.
+		local orig_register_lbm = core.register_lbm
+		core.register_lbm = function(spec)
+			spec.action = instrument {
+				func = spec.action,
+				class = "LBM",
+				label = spec.label or spec.name,
+			}
+			orig_register_lbm(spec)
+		end
+	end
+
+	if is_set("instrument.global_callback") or true then
+		for func_name, _ in pairs(register_functions) do
+			core[func_name] = instrument_register(core[func_name], func_name)
+		end
+	end
+
+	if is_set("instrument.profiler") or false then
+		-- Measure overhead of instrumentation, but keep it down for functions
+		-- So keep the `return` for better optimization.
+		profiler.empty_instrument = instrument {
+			func = function() return end,
+			mod = "*profiler*",
+			class = "Instrumentation overhead",
+			label = false,
+		}
+	end
+end
+
+return {
+	register_functions = register_functions,
+	instrument = instrument,
+	init = init,
+	init_chatcommand = init_chatcommand,
+}
diff --git a/builtin/profiler/reporter.lua b/builtin/profiler/reporter.lua
new file mode 100644
index 0000000..5b38ed4
--- /dev/null
+++ b/builtin/profiler/reporter.lua
@@ -0,0 +1,277 @@
+--Minetest
+--Copyright (C) 2016 T4im
+--
+--This program is free software; you can redistribute it and/or modify
+--it under the terms of the GNU Lesser General Public License as published by
+--the Free Software Foundation; either version 2.1 of the License, or
+--(at your option) any later version.
+--
+--This program is distributed in the hope that it will be useful,
+--but WITHOUT ANY WARRANTY; without even the implied warranty of
+--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--GNU Lesser General Public License for more details.
+--
+--You should have received a copy of the GNU Lesser General Public License along
+--with this program; if not, write to the Free Software Foundation, Inc.,
+--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+local DIR_DELIM, LINE_DELIM = DIR_DELIM, "\n"
+local table, unpack, string, pairs, io, os = table, unpack, string, pairs, io, os
+local rep, sprintf, tonumber = string.rep, string.format, tonumber
+local core, setting_get = core, core.setting_get
+local reporter = {}
+
+---
+-- Shorten a string. End on an ellipsis if shortened.
+--
+local function shorten(str, length)
+	if str and str:len() > length then
+		return "..." .. str:sub(-(length-3))
+	end
+	return str
+end
+
+local function filter_matches(filter, text)
+	return not filter or string.match(text, filter)
+end
+
+local function format_number(number, fmt)
+	number = tonumber(number)
+	if not number then
+		return "N/A"
+	end
+	return sprintf(fmt or "%d", number)
+end
+
+local Formatter = {
+	new = function(self, object)
+		object = object or {}
+		object.out = {} -- output buffer
+		self.__index = self
+		return setmetatable(object, self)
+	end,
+	__tostring = function (self)
+		return table.concat(self.out, LINE_DELIM)
+	end,
+	print = function(self, text, ...)
+		if (...) then
+			text = sprintf(text, ...)
+		end
+
+		if text then
+			-- Avoid format unicode issues.
+			text = text:gsub("Ms", "µs")
+		end
+
+		table.insert(self.out, text or LINE_DELIM)
+	end,
+	flush = function(self)
+		table.insert(self.out, LINE_DELIM)
+		local text = table.concat(self.out, LINE_DELIM)
+		self.out = {}
+		return text
+	end
+}
+
+local widths = { 55, 9, 9, 9, 5, 5, 5 }
+local txt_row_format = sprintf(" %%-%ds | %%%ds | %%%ds | %%%ds | %%%ds | %%%ds | %%%ds", unpack(widths))
+
+local HR = {}
+for i=1, #widths do
+	HR[i]= rep("-", widths[i])
+end
+-- ' | ' should break less with github than '-+-', when people are pasting there
+HR = sprintf("-%s-", table.concat(HR, " | "))
+
+local TxtFormatter = Formatter:new {
+	format_row = function(self, modname, instrument_name, statistics)
+		local label
+		if instrument_name then
+			label = shorten(instrument_name, widths[1] - 5)
+			label = sprintf(" - %s %s", label, rep(".", widths[1] - 5 - label:len()))
+		else -- Print mod_stats
+			label = shorten(modname, widths[1] - 2) .. ":"
+		end
+
+		self:print(txt_row_format, label,
+			format_number(statistics.time_min),
+			format_number(statistics.time_max),
+			format_number(statistics:get_time_avg()),
+			format_number(statistics.part_min, "%.1f"),
+			format_number(statistics.part_max, "%.1f"),
+			format_number(statistics:get_part_avg(), "%.1f")
+		)
+	end,
+	format = function(self, filter)
+		local profile = self.profile
+		self:print("Values below show absolute/relative times spend per server step by the instrumented function.")
+		self:print("A total of %d samples were taken", profile.stats_total.samples)
+
+		if filter then
+			self:print("The output is limited to '%s'", filter)
+		end
+
+		self:print()
+		self:print(
+			txt_row_format,
+			"instrumentation", "min Ms", "max Ms", "avg Ms", "min %", "max %", "avg %"
+		)
+		self:print(HR)
+		for modname,mod_stats in pairs(profile.stats) do
+			if filter_matches(filter, modname) then
+				self:format_row(modname, nil, mod_stats)
+
+				if mod_stats.instruments ~= nil then
+					for instrument_name, instrument_stats in pairs(mod_stats.instruments) do
+						self:format_row(nil, instrument_name, instrument_stats)
+					end
+				end
+			end
+		end
+		self:print(HR)
+		if not filter then
+			self:format_row("total", nil, profile.stats_total)
+		end
+	end
+}
+
+local CsvFormatter = Formatter:new {
+	format_row = function(self, modname, instrument_name, statistics)
+		self:print(
+			"%q,%q,%d,%d,%d,%d,%d,%f,%f,%f",
+			modname, instrument_name,
+			statistics.samples,
+			statistics.time_min,
+			statistics.time_max,
+			statistics:get_time_avg(),
+			statistics.time_all,
+			statistics.part_min,
+			statistics.part_max,
+			statistics:get_part_avg()
+		)
+	end,
+	format = function(self, filter)
+		self:print(
+			"%q,%q,%q,%q,%q,%q,%q,%q,%q,%q",
+			"modname", "instrumentation",
+			"samples",
+			"time min µs",
+			"time max µs",
+			"time avg µs",
+			"time all µs",
+			"part min %",
+			"part max %",
+			"part avg %"
+		)
+		for modname, mod_stats in pairs(self.profile.stats) do
+			if filter_matches(filter, modname) then
+				self:format_row(modname, "*", mod_stats)
+
+				if mod_stats.instruments ~= nil then
+					for instrument_name, instrument_stats in pairs(mod_stats.instruments) do
+						self:format_row(modname, instrument_name, instrument_stats)
+					end
+				end
+			end
+		end
+	end
+}
+
+local function format_statistics(profile, format, filter)
+	local formatter
+	if format == "csv" then
+		formatter = CsvFormatter:new {
+			profile = profile
+		}
+	else
+		formatter = TxtFormatter:new {
+			profile = profile
+		}
+	end
+	formatter:format(filter)
+	return formatter:flush()
+end
+
+---
+-- Format the profile ready for display and
+-- @return string to be printed to the console
+--
+function reporter.print(profile, filter)
+	if filter == "" then filter = nil end
+	return format_statistics(profile, "txt", filter)
+end
+
+---
+-- Serialize the profile data and
+-- @return serialized data to be saved to a file
+--
+local function serialize_profile(profile, format, filter)
+	if format == "lua" or format == "json" or format == "json_pretty" then
+		local stats = filter and {} or profile.stats
+		if filter then
+			for modname, mod_stats in pairs(profile.stats) do
+				if filter_matches(filter, modname) then
+					stats[modname] = mod_stats
+				end
+			end
+		end
+		if format == "lua" then
+			return core.serialize(stats)
+		elseif format == "json" then
+			return core.write_json(stats)
+		elseif format == "json_pretty" then
+			return core.write_json(stats, true)
+		end
+	end
+	-- Fall back to textual formats.
+	return format_statistics(profile, format, filter)
+end
+
+local worldpath = core.get_worldpath()
+local function get_save_path(format, filter)
+	local report_path = setting_get("profiler.report_path") or ""
+	if report_path ~= "" then
+		core.mkdir(sprintf("%s%s%s", worldpath, DIR_DELIM, report_path))
+	end
+	return (sprintf(
+		"%s/%s/profile-%s%s.%s",
+		worldpath,
+		report_path,
+		os.date("%Y%m%dT%H%M%S"),
+		filter and ("-" .. filter) or "",
+		format
+	):gsub("[/\\]+", DIR_DELIM))-- Clean up delims
+end
+
+---
+-- Save the profile to the world path.
+-- @return success, log message
+--
+function reporter.save(profile, format, filter)
+	if not format or format == "" then
+		format = setting_get("profiler.default_report_format") or "txt"
+	end
+	if filter == "" then
+		filter = nil
+	end
+
+	local path = get_save_path(format, filter)
+
+	local output, io_err = io.open(path, "w")
+	if not output then
+		return false, "Saving of profile failed with: " .. io_err
+	end
+	local content, err = serialize_profile(profile, format, filter)
+	if not content then
+		output:close()
+		return false, "Saving of profile failed with: " .. err
+	end
+	output:write(content)
+	output:close()
+
+	local logmessage = "Profile saved to " .. path
+	core.log("action", logmessage)
+	return true, logmessage
+end
+
+return reporter
diff --git a/builtin/profiler/sampling.lua b/builtin/profiler/sampling.lua
new file mode 100644
index 0000000..1d1ef25
--- /dev/null
+++ b/builtin/profiler/sampling.lua
@@ -0,0 +1,206 @@
+--Minetest
+--Copyright (C) 2016 T4im
+--
+--This program is free software; you can redistribute it and/or modify
+--it under the terms of the GNU Lesser General Public License as published by
+--the Free Software Foundation; either version 2.1 of the License, or
+--(at your option) any later version.
+--
+--This program is distributed in the hope that it will be useful,
+--but WITHOUT ANY WARRANTY; without even the implied warranty of
+--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--GNU Lesser General Public License for more details.
+--
+--You should have received a copy of the GNU Lesser General Public License along
+--with this program; if not, write to the Free Software Foundation, Inc.,
+--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+local setmetatable = setmetatable
+local pairs, format = pairs, string.format
+local min, max, huge = math.min, math.max, math.huge
+local core = core
+
+local profiler = ...
+-- Split sampler and profile up, to possibly allow for rotation later.
+local sampler = {}
+local profile
+local stats_total
+local logged_time, logged_data
+
+local _stat_mt = {
+	get_time_avg = function(self)
+		return self.time_all/self.samples
+	end,
+	get_part_avg = function(self)
+		if not self.part_all then
+			return 100 -- Extra handling for "total"
+		end
+		return self.part_all/self.samples
+	end,
+}
+_stat_mt.__index = _stat_mt
+
+function sampler.reset()
+	-- Accumulated logged time since last sample.
+	-- This helps determining, the relative time a mod used up.
+	logged_time = 0
+	-- The measurements taken through instrumentation since last sample.
+	logged_data = {}
+
+	profile = {
+		-- Current mod statistics (max/min over the entire mod lifespan)
+		-- Mod specific instrumentation statistics are nested within.
+		stats = {},
+		-- Current stats over all mods.
+		stats_total = setmetatable({
+			samples = 0,
+			time_min = huge,
+			time_max = 0,
+			time_all = 0,
+			part_min = 100,
+			part_max = 100
+		}, _stat_mt)
+	}
+	stats_total = profile.stats_total
+
+	-- Provide access to the most recent profile.
+	sampler.profile = profile
+end
+
+---
+-- Log a measurement for the sampler to pick up later.
+-- Keep `log` and its often called functions lean.
+-- It will directly add to the instrumentation overhead.
+--
+function sampler.log(modname, instrument_name, time_diff)
+	if time_diff <= 0 then
+		if time_diff < 0 then
+			-- This **might** have happened on a semi-regular basis with huge mods,
+			-- resulting in negative statistics (perhaps midnight time jumps or ntp corrections?).
+			core.log("warning", format(
+					"Time travel of %s::%s by %dµs.",
+					modname, instrument_name, time_diff
+			))
+		end
+		-- Throwing these away is better, than having them mess with the overall result.
+		return
+	end
+
+	local mod_data = logged_data[modname]
+	if mod_data == nil then
+		mod_data = {}
+		logged_data[modname] = mod_data
+	end
+
+	mod_data[instrument_name] = (mod_data[instrument_name] or 0) + time_diff
+	-- Update logged time since last sample.
+	logged_time = logged_time + time_diff
+end
+
+---
+-- Return a requested statistic.
+-- Initialize if necessary.
+--
+local function get_statistic(stats_table, name)
+	local statistic = stats_table[name]
+	if statistic == nil then
+		statistic = setmetatable({
+			samples = 0,
+			time_min = huge,
+			time_max = 0,
+			time_all = 0,
+			part_min = 100,
+			part_max = 0,
+			part_all = 0,
+		}, _stat_mt)
+		stats_table[name] = statistic
+	end
+	return statistic
+end
+
+---
+-- Update a statistic table
+--
+local function update_statistic(stats_table, time)
+	stats_table.samples = stats_table.samples + 1
+
+	-- Update absolute time (µs) spend by the subject
+	stats_table.time_min = min(stats_table.time_min, time)
+	stats_table.time_max = max(stats_table.time_max, time)
+	stats_table.time_all = stats_table.time_all + time
+
+	-- Update relative time (%) of this sample spend by the subject
+	local current_part = (time/logged_time) * 100
+	stats_table.part_min = min(stats_table.part_min, current_part)
+	stats_table.part_max = max(stats_table.part_max, current_part)
+	stats_table.part_all = stats_table.part_all + current_part
+end
+
+---
+-- Sample all logged measurements each server step.
+-- Like any globalstep function, this should not be too heavy,
+-- but does not add to the instrumentation overhead.
+--
+local function sample(dtime)
+	-- Rare, but happens and is currently of no informational value.
+	if logged_time == 0 then
+		return
+	end
+
+	for modname, instruments in pairs(logged_data) do
+		local mod_stats = get_statistic(profile.stats, modname)
+		if mod_stats.instruments == nil then
+			-- Current statistics for each instrumentation component
+			mod_stats.instruments = {}
+		end
+
+		local mod_time = 0
+		for instrument_name, time in pairs(instruments) do
+			if time > 0 then
+				mod_time = mod_time + time
+				local instrument_stats = get_statistic(mod_stats.instruments, instrument_name)
+
+				-- Update time of this sample spend by the instrumented function.
+				update_statistic(instrument_stats, time)
+				-- Reset logged data for the next sample.
+				instruments[instrument_name] = 0
+			end
+		end
+
+		-- Update time of this sample spend by this mod.
+		update_statistic(mod_stats, mod_time)
+	end
+
+	-- Update the total time spend over all mods.
+	stats_total.time_min = min(stats_total.time_min, logged_time)
+	stats_total.time_max = max(stats_total.time_max, logged_time)
+	stats_total.time_all = stats_total.time_all + logged_time
+
+	stats_total.samples = stats_total.samples + 1
+	logged_time = 0
+end
+
+---
+-- Setup empty profile and register the sampling function
+--
+function sampler.init()
+	sampler.reset()
+
+	if core.setting_getbool("instrument.profiler") then
+		core.register_globalstep(function()
+			if logged_time == 0 then
+				return
+			end
+			return profiler.empty_instrument()
+		end)
+		core.register_globalstep(profiler.instrument {
+			func = sample,
+			mod = "*profiler*",
+			class = "Sampler (update stats)",
+			label = false,
+		})
+	else
+		core.register_globalstep(sample)
+	end
+end
+
+return sampler
diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt
index ad269d8..1818b5a 100644
--- a/builtin/settingtypes.txt
+++ b/builtin/settingtypes.txt
@@ -3,7 +3,7 @@
 # General format:
 #    name (Readable name) type type_args
 #
-# Note that the parts are seperated by exactly one space
+# Note that the parts are separated by exactly one space
 #
 # `type` can be:
 #    - int
@@ -70,7 +70,7 @@ fast_move (Fast movement) bool false
 #    This requires the "noclip" privilege on the server.
 noclip (Noclip) bool false
 
-#    Smooths camera when moving and looking around.
+#    Smooths camera when looking around. Also called look or mouse smoothing.
 #    Useful for recording videos.
 cinematic (Cinematic mode) bool false
 
@@ -104,6 +104,17 @@ random_input (Random input) bool false
 #    Continuous forward movement (only used for testing).
 continuous_forward (Continuous forward) bool false
 
+#    Enable Joysticks
+enable_joysticks (Enable Joysticks) bool false
+
+#    The time in seconds it takes between repeated events
+#    when holding down a joystick button combination.
+repeat_joystick_button_time (Joystick button repetition interval) float 0.17
+
+#    The sensitivity of the joystick axes for moving the
+#    ingame view frustum around.
+joystick_frustum_sensitivity (Joystick frustum sensitivity) float 170
+
 #    Key for moving the player forward.
 #    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
 keymap_forward (Forward key) key KEY_KEY_W
@@ -165,9 +176,13 @@ keymap_fastmove (Fast key) key KEY_KEY_J
 #    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
 keymap_noclip (Noclip key) key KEY_KEY_H
 
+#    Key for toggling autorun.
+#    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_autorun (Autorun key) key
+
 #    Key for toggling cinematic mode.
 #    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_cinematic (Cinematic mode key) key KEY_F8
+keymap_cinematic (Cinematic mode key) key
 
 #    Key for toggling display of minimap.
 #    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
@@ -193,7 +208,7 @@ keymap_toggle_chat (Chat toggle key) key KEY_F2
 #    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
 keymap_toggle_force_fog_off (Fog toggle key) key KEY_F3
 
-#    Key for toggling the camrea update. Only used for development
+#    Key for toggling the camera update. Only used for development
 #    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
 keymap_toggle_update_camera (Camera update toggle key) key
 
@@ -236,7 +251,7 @@ remote_port (Remote port) int 30000 1 65535
 #    Enable if you want to connect to 0.4.12 servers and before.
 #    Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.
 #    Disabling this option will protect your password better.
-send_pre_v25_init (Support older servers) bool true
+send_pre_v25_init (Support older servers) bool false
 
 #    Save the map received by the client on disk.
 enable_local_map_saving (Saving map received from server) bool false
@@ -324,7 +339,7 @@ fsaa (FSAA) enum 0 0,1,2,4,8,16
 
 [***Shaders]
 
-#    Shaders allow advanced visul effects and may increase performance on some video cards.
+#    Shaders allow advanced visual effects and may increase performance on some video cards.
 #    Thy only work with the OpenGL video backend.
 enable_shaders (Shaders) bool true
 
@@ -403,8 +418,7 @@ fps_max (Maximum FPS) int 60
 pause_fps_max (FPS in pause menu) int 20
 
 #    View distance in nodes.
-#    Min = 20
-viewing_range (Viewing range) int 100
+viewing_range (Viewing range) int 100 20 4000
 
 #    Width component of the initial window size.
 screenW (Screen width) int 800
@@ -424,6 +438,10 @@ vsync (V-Sync) bool false
 #    Field of view in degrees.
 fov (Field of view) int 72 30 160
 
+#    Field of view while zooming in degrees.
+#    This requires the "zoom" privilege on the server.
+zoom_fov (Field of view for zoom) int 15 15 160
+
 #    Adjust the gamma encoding for the light tables. Lower numbers are brighter.
 #    This setting is for the client only and is ignored by the server.
 display_gamma (Gamma) float 1.8 1.0 3.0
@@ -510,6 +528,9 @@ ambient_occlusion_gamma (Ambient occlusion gamma) float 2.2 0.25 4.0
 #    Enables animation of inventory items.
 inventory_items_animations (Inventory items animations) bool false
 
+#    Fraction of the visible distance at which fog starts to be rendered
+fog_start (Fog Start) float 0.4 0.0 0.99
+
 [**Menus]
 
 #    Use a cloud animation for the main menu background.
@@ -530,7 +551,7 @@ gui_scaling_filter (GUI scaling filter) bool false
 #    When gui_scaling_filter_txr2img is true, copy those images
 #    from hardware to software for scaling.  When false, fall back
 #    to the old scaling method, for video drivers that don't
-#    propery support downloading textures back from hardware.
+#    properly support downloading textures back from hardware.
 gui_scaling_filter_txr2img (GUI scaling filter txr2img) bool true
 
 #    Delay showing tooltips, stated in milliseconds.
@@ -542,13 +563,13 @@ freetype (Freetype fonts) bool true
 #    Path to TrueTypeFont or bitmap.
 font_path (Font path) path fonts/liberationsans.ttf
 
-font_size (Font size) int 15
+font_size (Font size) int 16
 
 #    Font shadow offset, if 0 then shadow will not be drawn.
 font_shadow (Font shadow) int 1
 
 #    Font shadow alpha (opaqueness, between 0 and 255).
-font_shadow_alpha (Font shadow alpha) int 128 0 255
+font_shadow_alpha (Font shadow alpha) int 127 0 255
 
 mono_font_path (Monospace font path) path fonts/liberationmono.ttf
 
@@ -615,6 +636,11 @@ server_announce (Announce server) bool false
 #    If you want to announce your ipv6 address, use  serverlist_url = v6.servers.minetest.net.
 serverlist_url (Serverlist URL) string servers.minetest.net
 
+#    Disable escape sequences, e.g. chat coloring.
+#    Use this if you want to run a server with pre-0.4.14 clients and you want to disable
+#    the escape sequences generated by mods.
+disable_escape_sequences (Disable escape sequences) bool false
+
 [*Network]
 
 #    Network port to listen (UDP).
@@ -642,15 +668,15 @@ ipv6_server (IPv6 server) bool false
 
 [**Advanced]
 
-#    How many blocks are flying in the wire simultaneously per client.
-max_simultaneous_block_sends_per_client (Maximum simultaneously blocks send per client) int 10
+#    Maximum number of blocks that are simultaneously sent per client.
+max_simultaneous_block_sends_per_client (Maximum simultaneous block sends per client) int 10
 
-#    How many blocks are flying in the wire simultaneously for the whole server.
-max_simultaneous_block_sends_server_total (Maximum simultaneously bocks send total) int 40
+#   Maximum number of blocks that are simultaneously sent in total.
+max_simultaneous_block_sends_server_total (Maximum simultaneous block sends total) int 40
 
 #    To reduce lag, block transfers are slowed down when a player is building something.
 #    This determines how long they are slowed down after placing or removing a node.
-full_block_send_enable_min_time_from_building () float 2.0
+full_block_send_enable_min_time_from_building (Delay in sending blocks after building) float 2.0
 
 #    Maximum number of packets sent per send step, if you have a slow connection
 #    try reducing it, but don't reduce it to a number below double of targeted
@@ -750,6 +776,15 @@ time_speed (Time speed) int 72
 #    Interval of saving important changes in the world, stated in seconds.
 server_map_save_interval (Map save interval) float 5.3
 
+#    Set the maximum character length of a chat message sent by clients.
+# chat_message_max_size int 500
+
+#    Limit a single player to send X messages per 10 seconds.
+# chat_message_limit_per_10sec float 10.0
+
+#    Kick player if send more than X messages per 10 seconds.
+# chat_message_limit_trigger_kick int 50
+
 [**Physics]
 
 movement_acceleration_default (Default acceleration) float 3
@@ -774,15 +809,6 @@ movement_gravity (Gravity) float 9.81
 #    -    error: abort on usage of deprecated call (suggested for mod developers).
 deprecated_lua_api_handling (Deprecated Lua API handling) enum legacy legacy,log,error
 
-#    Useful for mod developers.
-mod_profiling (Mod profiling) bool false
-
-#    Detailed mod profile data. Useful for mod developers.
-detailed_profiling (Detailed mod profiling) bool false
-
-#    Profiler data print interval. 0 = disable. Useful for developers.
-profiler_print_interval (Profiling print interval) int 0
-
 #    Number of extra blocks that can be loaded by /clearobjects at once.
 #    This is a trade-off between sqlite transaction overhead and
 #    memory consumption (4096=100MB, as a rule of thumb).
@@ -793,7 +819,7 @@ max_clearobjects_extra_loaded_blocks (Max. clearobjects extra blocks) int 4096
 server_unload_unused_data_timeout (Unload unused server data) int 29
 
 #    Maximum number of statically stored objects in a block.
-max_objects_per_block (Maxmimum objects per block) int 49
+max_objects_per_block (Maximum objects per block) int 64
 
 #    See http://www.sqlite.org/pragma.html#pragma_synchronous
 sqlite_synchronous (Synchronous SQLite) enum 2 0,1,2
@@ -825,11 +851,18 @@ liquid_queue_purge_time (Liquid queue purge time) int 0
 #    Liquid update interval in seconds.
 liquid_update (Liquid update tick) float 1.0
 
+#    At this distance the server will aggressively optimize which blocks are sent to clients.
+#    Small values potentially improve performance a lot, at the expense of visible rendering glitches.
+#    (some blocks will not be rendered under water and in caves, as well as sometimes on land)
+#    Setting this to a value greater than max_block_send_distance disables this optimization.
+#    Stated in mapblocks (16 nodes)
+block_send_optimize_distance (block send optimize distance) int 4 2
+
 [*Mapgen]
 
 #    Name of map generator to be used when creating a new world.
 #    Creating a world in the main menu will override this.
-mg_name (Mapgen name) enum v6 v5,v6,v7,flat,valleys,fractal,singlenode
+mg_name (Mapgen name) enum v7 v5,v6,v7,flat,valleys,fractal,singlenode
 
 #    Water surface level of the world.
 water_level (Water level) int 1
@@ -848,8 +881,6 @@ map_generation_limit (Map generation limit) int 31000 0 31000
 #    Global map generation attributes.
 #    In Mapgen v6 the 'decorations' flag controls all decorations except trees
 #    and junglegrass, in all other mapgens this flag controls all decorations.
-#    The default flags set in the engine are: caves, light, decorations
-#    The flags string modifies the engine defaults.
 #    Flags that are not specified in the flag string are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 mg_flags (Mapgen flags) flags caves,dungeons,light,decorations caves,dungeons,light,decorations,nocaves,nodungeons,nolight,nodecorations
@@ -910,8 +941,6 @@ mgv5_np_cave2 (Mapgen v5 cave2 noise parameters) noise_params 0, 12, (50, 50, 50
 
 #    Map generation attributes specific to Mapgen v6.
 #    When snowbiomes are enabled jungles are automatically enabled, the 'jungles' flag is ignored.
-#    The default flags set in the engine are: biomeblend, mudflow
-#    The flags string modifies the engine defaults.
 #    Flags that are not specified in the flag string are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 mgv6_spflags (Mapgen v6 flags) flags jungles,biomeblend,mudflow,snowbiomes,trees jungles,biomeblend,mudflow,snowbiomes,flat,trees,nojungles,nobiomeblend,nomudflow,nosnowbiomes,noflat,notrees
@@ -936,15 +965,27 @@ mgv6_np_apple_trees (Mapgen v6 apple trees noise parameters) noise_params 0, 1,
 [***Mapgen v7]
 
 #    Map generation attributes specific to Mapgen v7.
-#    The 'ridges' flag controls the rivers.
-#    The default flags set in the engine are: mountains, ridges
-#    The flags string modifies the engine defaults.
+#    The 'ridges' flag enables the rivers.
+#    Floatlands are currently experimental and subject to change.
 #    Flags that are not specified in the flag string are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
-mgv7_spflags (Mapgen v7 flags) flags mountains,ridges mountains,ridges,nomountains,noridges
+mgv7_spflags (Mapgen v7 flags) flags mountains,ridges mountains,ridges,floatlands,nomountains,noridges,nofloatlands
 
 #    Controls width of tunnels, a smaller value creates wider tunnels.
-mgv7_cave_width (Mapgen v7 cave width) float 0.3
+mgv7_cave_width (Mapgen v7 cave width) float 0.09
+
+#    Controls the density of floatland mountain terrain.
+#    Is an offset added to the 'np_mountain' noise value.
+mgv7_float_mount_density (Mapgen v7 floatland mountain density) float 0.6
+
+#    Typical maximum height, above and below midpoint, of floatland mountain terrain.
+mgv7_float_mount_height (Mapgen v7 floatland mountain height) float 128.0
+
+#    Y-level of floatland midpoint and lake surface.
+mgv7_floatland_level (Mapgen v7 floatland level) int 1280
+
+#    Y-level to which floatland shadows extend.
+mgv7_shadow_limit (Mapgen v7 shadow limit) int 1024
 
 mgv7_np_terrain_base (Mapgen v7 terrain base noise parameters) noise_params 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0
 mgv7_np_terrain_alt (Mapgen v7 terrain altitude noise parameters) noise_params 4, 25, (600, 600, 600), 5934, 5, 0.6, 2.0
@@ -952,18 +993,18 @@ mgv7_np_terrain_persist (Mapgen v7 terrain persistation noise parameters) noise_
 mgv7_np_height_select (Mapgen v7 height select noise parameters) noise_params -8, 16, (500, 500, 500), 4213, 6, 0.7, 2.0
 mgv7_np_filler_depth (Mapgen v7 filler depth noise parameters) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
 mgv7_np_mount_height (Mapgen v7 mount height noise parameters) noise_params 256, 112, (1000, 1000, 1000), 72449, 3, 0.6, 2.0
-mgv7_np_ridge_uwater (Mapgen v7 ridge water noise parameters) noise_params 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0
+mgv7_np_ridge_uwater (Mapgen v7 river course noise parameters) noise_params 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0
+mgv7_np_floatland_base (Mapgen v7 floatland base terrain noise parameters) noise_params -0.6, 1.5, (600, 600, 600), 114, 5, 0.6, 2.0
+mgv7_np_float_base_height (Mapgen v7 floatland base terrain height noise parameters) noise_params 48, 24, (300, 300, 300), 907, 4, 0.7, 2.0
 mgv7_np_mountain (Mapgen v7 mountain noise parameters) noise_params -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0
-mgv7_np_ridge (Mapgen v7 ridge noise parameters) noise_params 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0
-mgv7_np_cave1 (Mapgen v7 cave1 noise parameters) noise_params 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0
-mgv7_np_cave2 (Mapgen v7 cave2 noise parameters) noise_params 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0
+mgv7_np_ridge (Mapgen v7 river channel wall noise parameters) noise_params 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0
+mgv7_np_cave1 (Mapgen v7 cave1 noise parameters) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+mgv7_np_cave2 (Mapgen v7 cave2 noise parameters) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 [***Mapgen flat]
 
 #    Map generation attributes specific to Mapgen flat.
 #    Occasional lakes and hills can be added to the flat world.
-#    The default flags set in the engine are: none
-#    The flags string modifies the engine defaults.
 #    Flags that are not specified in the flag string are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 mgflat_spflags (Mapgen flat flags) flags  lakes,hills,,nolakes,nohills
@@ -975,7 +1016,7 @@ mgflat_ground_level (Mapgen flat ground level) int 8
 mgflat_large_cave_depth (Mapgen flat large cave depth) int -33
 
 #    Controls width of tunnels, a smaller value creates wider tunnels.
-mgflat_cave_width (Mapgen flat cave width) float 0.3
+mgflat_cave_width (Mapgen flat cave width) float 0.09
 
 #    Terrain noise threshold for lakes.
 #    Controls proportion of world area covered by lakes.
@@ -999,13 +1040,13 @@ mgflat_hill_steepness (Mapgen flat hill steepness) float 64.0
 mgflat_np_terrain (Mapgen flat terrain noise parameters) noise_params 0, 1, (600, 600, 600), 7244, 5, 0.6, 2.0
 
 mgflat_np_filler_depth (Mapgen flat filler depth noise parameters) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
-mgflat_np_cave1 (Mapgen flat cave1 noise parameters) noise_params 0, 12, (128, 128, 128), 52534, 4, 0.5, 2.0
-mgflat_np_cave2 (Mapgen flat cave2 noise parameters) noise_params 0, 12, (128, 128, 128), 10325, 4, 0.5, 2.0
+mgflat_np_cave1 (Mapgen flat cave1 noise parameters) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+mgflat_np_cave2 (Mapgen flat cave2 noise parameters) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 [***Mapgen fractal]
 
 #    Controls width of tunnels, a smaller value creates wider tunnels.
-mgfractal_cave_width (Mapgen fractal cave width) float 0.3
+mgfractal_cave_width (Mapgen fractal cave width) float 0.09
 
 #    Choice of 18 fractals from 9 formulas.
 #    1 = 4D "Roundy" mandelbrot set.
@@ -1066,8 +1107,8 @@ mgfractal_julia_w (Mapgen fractal julia w) float 0.33
 
 mgfractal_np_seabed (Mapgen fractal seabed noise parameters) noise_params -14, 9, (600, 600, 600), 41900, 5, 0.6, 2.0
 mgfractal_np_filler_depth (Mapgen fractal filler depth noise parameters) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
-mgfractal_np_cave1 (Mapgen fractal cave1 noise parameters) noise_params 0, 12, (128, 128, 128), 52534, 4, 0.5, 2.0
-mgfractal_np_cave2 (Mapgen fractal cave2 noise parameters) noise_params 0, 12, (128, 128, 128), 10325, 4, 0.5, 2.0
+mgfractal_np_cave1 (Mapgen fractal cave1 noise parameters) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+mgfractal_np_cave2 (Mapgen fractal cave2 noise parameters) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 # Mapgen Valleys parameters
 [***Mapgen Valleys]
@@ -1079,8 +1120,6 @@ mgfractal_np_cave2 (Mapgen fractal cave2 noise parameters) noise_params 0, 12, (
 #    'altitude_chill' makes higher elevations colder, which may cause biome issues.
 #    'humid_rivers' modifies the humidity around rivers and in areas where water would tend to pool,
 #    it may interfere with delicately adjusted biomes.
-#    The default flags set in the engine are: altitude_chill, humid_rivers
-#    The flags string modifies the engine defaults.
 #    Flags that are not specified in the flag string are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 mg_valleys_spflags (Valleys C Flags) flags altitude_chill,humid_rivers altitude_chill,noaltitude_chill,humid_rivers,nohumid_rivers
@@ -1109,16 +1148,16 @@ mgvalleys_river_size (River Size) int 5
 mgvalleys_water_features (Water Features) int 0
 
 #    Controls width of tunnels, a smaller value creates wider tunnels.
-mgvalleys_cave_width (Cave width) float 0.3
+mgvalleys_cave_width (Cave width) float 0.09
 
 # Noise parameters
 [****Noises]
 
 # Caves and tunnels form at the intersection of the two noises
-mgvalleys_np_cave1 (Cave noise #1) noise_params 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0
+mgvalleys_np_cave1 (Cave noise #1) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
 
 # Caves and tunnels form at the intersection of the two noises
-mgvalleys_np_cave2 (Cave noise #2) noise_params 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0
+mgvalleys_np_cave2 (Cave noise #2) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 # The depth of dirt or other filler
 mgvalleys_np_filler_depth (Filler Depth) noise_params 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0
@@ -1153,10 +1192,55 @@ secure.enable_security (Enable mod security) bool false
 #    functions even when mod security is on (via request_insecure_environment()).
 secure.trusted_mods (Trusted mods) string
 
-#	Comma-seperated list of mods that are allowed to access HTTP APIs, which
+#	Comma-separated list of mods that are allowed to access HTTP APIs, which
 #	allow them to upload and download data to/from the internet.
 secure.http_mods (HTTP Mods) string
 
+[*Advanced]
+
+[**Profiling]
+#    Load the game profiler to collect game profiling data.
+#    Provides a /profiler command to access the compiled profile.
+#    Useful for mod developers and server operators.
+profiler.load (Load the game profiler) bool false
+
+#    The default format in which profiles are being saved,
+#    when calling `/profiler save [format]` without format.
+profiler.default_report_format (Default report format) enum txt txt,csv,lua,json,json_pretty
+
+#    The file path relative to your worldpath in which profiles will be saved to.
+#
+profiler.report_path (Report path) string ""
+
+[***Instrumentation]
+
+#    Instrument the methods of entities on registration.
+instrument.entity (Entity methods) bool true
+
+#    Instrument the action function of Active Block Modifiers on registration.
+instrument.abm (Active Block Modifiers) bool true
+
+#    Instrument the action function of Loading Block Modifiers on registration.
+instrument.lbm (Loading Block Modifiers) bool true
+
+#    Instrument chatcommands on registration.
+instrument.chatcommand (Chatcommands) bool true
+
+#    Instrument global callback functions on registration.
+#    (anything you pass to a minetest.register_*() function)
+instrument.global_callback (Global callbacks) bool true
+
+[****Advanced]
+#    Instrument builtin.
+#    This is usually only needed by core/builtin contributors
+instrument.builtin (Builtin) bool false
+
+#    Have the profiler instrument itself:
+#     * Instrument an empty function.
+#       This estimates the overhead, that instrumentation is adding (+1 function call).
+#     * Instrument the sampler being used to update the statistics.
+instrument.profiler (Profiler) bool false
+
 [Client and Server]
 
 #    Name of the player.
@@ -1166,7 +1250,7 @@ name (Player name) string
 
 #    Set the language. Leave empty to use the system language.
 #    A restart is required after changing this.
-language (Language) enum   ,be,cs,da,de,eo,es,et,fr,hu,id,it,ja,jbo,ko,ky,lt,nb,nl,pl,pt,pt_BR,ro,ru,tr,uk,zh_CN,zh_TW
+language (Language) enum   ,be,ca,cs,da,de,en,eo,es,et,fr,he,hu,id,it,ja,jbo,ko,ky,lt,nb,nl,pl,pt,pt_BR,ro,ru,sr_Cyrl,tr,uk,zh_CN,zh_TW
 
 #    Level of logging to be written to debug.txt:
 #    -    <nothing> (no logging)
@@ -1212,3 +1296,6 @@ modstore_download_url (Modstore download URL) string https://forum.minetest.net/
 modstore_listmods_url (Modstore mods list URL) string https://forum.minetest.net/mmdb/mods/
 
 modstore_details_url (Modstore details URL) string https://forum.minetest.net/mmdb/mod/*/
+
+#    Print the engine's profiling data in regular intervals (in seconds). 0 = disable. Useful for developers.
+profiler_print_interval (Engine profiling data print interval) int 0
diff --git a/client/shaders/minimap_shader/opengl_vertex.glsl b/client/shaders/minimap_shader/opengl_vertex.glsl
index 06df5a3..88f9356 100644
--- a/client/shaders/minimap_shader/opengl_vertex.glsl
+++ b/client/shaders/minimap_shader/opengl_vertex.glsl
@@ -1,6 +1,4 @@
 uniform mat4 mWorldViewProj;
-uniform mat4 mInvWorld;
-uniform mat4 mTransWorld;
 uniform mat4 mWorld;
 
 void main(void)
diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl
index 6862842..71ded2b 100644
--- a/client/shaders/nodes_shader/opengl_fragment.glsl
+++ b/client/shaders/nodes_shader/opengl_fragment.glsl
@@ -19,6 +19,8 @@ bool normalTexturePresent = false;
 
 const float e = 2.718281828459;
 const float BS = 10.0;
+const float fogStart = FOG_START;
+const float fogShadingParameter = 1 / ( 1 - fogStart);
 
 #ifdef ENABLE_TONE_MAPPING
 
@@ -194,24 +196,25 @@ void main(void)
 
 	vec4 col = vec4(color.rgb * gl_Color.rgb, 1.0); 
 	
-#if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT
-	float alpha = gl_Color.a;
-	if (fogDistance != 0.0) {
-		float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
-		alpha = mix(alpha, 0.0, d);
-	}
-	col = vec4(col.rgb, alpha);
-#else
+#ifdef ENABLE_TONE_MAPPING
+	col = applyToneMapping(col);
+#endif
+
 	if (fogDistance != 0.0) {
-		float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
-		col = mix(col, skyBgColor, d);
+		// Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?),
+		// the fog will only be rendered correctly if the last operation before the
+		// clamp() is an addition. Else, the clamp() seems to be ignored.
+		// E.g. the following won't work:
+		//      float clarity = clamp(fogShadingParameter
+		//		* (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0);
+		// As additions usually come for free following a multiplication, the new formula
+		// should be more efficient as well.
+		// Note: clarity = (1 - fogginess)
+		float clarity = clamp(fogShadingParameter
+			- fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
+		col = mix(skyBgColor, col, clarity);
 	}
 	col = vec4(col.rgb, base.a);
-#endif
 
-#ifdef ENABLE_TONE_MAPPING
-	gl_FragColor = applyToneMapping(col);
-#else
 	gl_FragColor = col;
-#endif
 }
diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl
index 28c5f19..44c48cc 100644
--- a/client/shaders/nodes_shader/opengl_vertex.glsl
+++ b/client/shaders/nodes_shader/opengl_vertex.glsl
@@ -1,6 +1,4 @@
 uniform mat4 mWorldViewProj;
-uniform mat4 mInvWorld;
-uniform mat4 mTransWorld;
 uniform mat4 mWorld;
 
 uniform float dayNightRatio;
diff --git a/client/shaders/water_surface_shader/opengl_fragment.glsl b/client/shaders/water_surface_shader/opengl_fragment.glsl
index 1fa6695..c4e7847 100644
--- a/client/shaders/water_surface_shader/opengl_fragment.glsl
+++ b/client/shaders/water_surface_shader/opengl_fragment.glsl
@@ -21,6 +21,8 @@ bool texSeamless = false;
 
 const float e = 2.718281828459;
 const float BS = 10.0;
+const float fogStart = FOG_START;
+const float fogShadingParameter = 1 / ( 1 - fogStart);
 
 #ifdef ENABLE_TONE_MAPPING
 
@@ -150,24 +152,25 @@ vec4 base = texture2D(baseTexture, uv).rgba;
 
 	vec4 col = vec4(color.rgb * gl_Color.rgb, 1.0); 
 
-#if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE
-	float alpha = gl_Color.a;
-	if (fogDistance != 0.0) {
-		float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
-		alpha = mix(alpha, 0.0, d);
-	}
-	col = vec4(col.rgb, alpha);
-#else
+#ifdef ENABLE_TONE_MAPPING
+	col = applyToneMapping(col);
+#endif
+
 	if (fogDistance != 0.0) {
-		float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
-		col = mix(col, skyBgColor, d);
+		// Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?),
+		// the fog will only be rendered correctly if the last operation before the
+		// clamp() is an addition. Else, the clamp() seems to be ignored.
+		// E.g. the following won't work:
+		//      float clarity = clamp(fogShadingParameter
+		//		* (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0);
+		// As additions usually come for free following a multiplication, the new formula
+		// should be more efficient as well.
+		// Note: clarity = (1 - fogginess)
+		float clarity = clamp(fogShadingParameter
+			- fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
+		col = mix(skyBgColor, col, clarity);
 	}
 	col = vec4(col.rgb, base.a);
-#endif
 
-#ifdef ENABLE_TONE_MAPPING
-	gl_FragColor = applyToneMapping(col);
-#else
 	gl_FragColor = col;
-#endif
 }
diff --git a/client/shaders/water_surface_shader/opengl_vertex.glsl b/client/shaders/water_surface_shader/opengl_vertex.glsl
index 9b461f4..a930e7b 100644
--- a/client/shaders/water_surface_shader/opengl_vertex.glsl
+++ b/client/shaders/water_surface_shader/opengl_vertex.glsl
@@ -1,6 +1,4 @@
 uniform mat4 mWorldViewProj;
-uniform mat4 mInvWorld;
-uniform mat4 mTransWorld;
 uniform mat4 mWorld;
 
 uniform float dayNightRatio;
diff --git a/client/shaders/wielded_shader/opengl_fragment.glsl b/client/shaders/wielded_shader/opengl_fragment.glsl
index 75dd1b6..ba7a8f1 100644
--- a/client/shaders/wielded_shader/opengl_fragment.glsl
+++ b/client/shaders/wielded_shader/opengl_fragment.glsl
@@ -19,6 +19,8 @@ bool texSeamless = false;
 
 const float e = 2.718281828459;
 const float BS = 10.0;
+const float fogStart = FOG_START;
+const float fogShadingParameter = 1 / ( 1 - fogStart);
 
 void get_texture_flags()
 {
@@ -107,8 +109,18 @@ void main(void)
 	vec4 col = vec4(color.rgb, base.a);
 	col *= gl_Color;
 	if (fogDistance != 0.0) {
-		float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
-		col = mix(col, skyBgColor, d);
+		// Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?),
+		// the fog will only be rendered correctly if the last operation before the
+		// clamp() is an addition. Else, the clamp() seems to be ignored.
+		// E.g. the following won't work:
+		//      float clarity = clamp(fogShadingParameter
+		//		* (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0);
+		// As additions usually come for free following a multiplication, the new formula
+		// should be more efficient as well.
+		// Note: clarity = (1 - fogginess)
+		float clarity = clamp(fogShadingParameter
+			- fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
+		col = mix(skyBgColor, col, clarity);
 	}
 	gl_FragColor = vec4(col.rgb, base.a);
 }
diff --git a/client/shaders/wielded_shader/opengl_vertex.glsl b/client/shaders/wielded_shader/opengl_vertex.glsl
index c33b0a7..86c6268 100644
--- a/client/shaders/wielded_shader/opengl_vertex.glsl
+++ b/client/shaders/wielded_shader/opengl_vertex.glsl
@@ -1,6 +1,4 @@
 uniform mat4 mWorldViewProj;
-uniform mat4 mInvWorld;
-uniform mat4 mTransWorld;
 uniform mat4 mWorld;
 
 uniform float dayNightRatio;
diff --git a/cmake/Modules/FindJson.cmake b/cmake/Modules/FindJson.cmake
index 1558b0f..e69d6c4 100644
--- a/cmake/Modules/FindJson.cmake
+++ b/cmake/Modules/FindJson.cmake
@@ -20,8 +20,8 @@ endif()
 
 if(NOT JSONCPP_FOUND)
 	message(STATUS "Using bundled JSONCPP library.")
-	set(JSON_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/json)
+	set(JSON_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/jsoncpp)
 	set(JSON_LIBRARY jsoncpp)
-	add_subdirectory(json)
+	add_subdirectory(jsoncpp/json)
 endif()
 
diff --git a/cmake/Modules/FindNcursesw.cmake b/cmake/Modules/FindNcursesw.cmake
index b8c7f78..e572c70 100644
--- a/cmake/Modules/FindNcursesw.cmake
+++ b/cmake/Modules/FindNcursesw.cmake
@@ -115,7 +115,7 @@ if(CURSES_USE_NCURSESW)
   get_filename_component(_cursesParentDir "${_cursesLibDir}" PATH)
 
   find_path(CURSES_INCLUDE_PATH
-    NAMES ncursesw/ncurses.h ncursesw/curses.h
+    NAMES ncursesw/ncurses.h ncursesw/curses.h ncurses.h curses.h
     HINTS "${_cursesParentDir}/include"
     )
 
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 593e0c4..34c64b8 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -1,4 +1,4 @@
-Minetest Lua Modding API Reference 0.4.14
+Minetest Lua Modding API Reference 0.4.15
 =========================================
 * More information at <http://www.minetest.net/>
 * Developer Wiki: <http://dev.minetest.net/>
@@ -65,15 +65,19 @@ e.g.
 The game directory can contain the file minetest.conf, which will be used
 to set default settings when running the particular game.
 It can also contain a settingtypes.txt in the same format as the one in builtin.
-This settingtypes.txt will be parsed by the menu and the settings will be displayed in the "Games" category in the settings tab.
+This settingtypes.txt will be parsed by the menu and the settings will be displayed
+in the "Games" category in the settings tab.
 
 ### Menu images
 
-Games can provide custom main menu images. They are put inside a `menu` directory inside the game directory.
+Games can provide custom main menu images. They are put inside a `menu` directory
+inside the game directory.
 
-The images are named `$identifier.png`, where `$identifier` is one of `overlay,background,footer,header`.
-If you want to specify multiple images for one identifier, add additional images named like `$identifier.$n.png`, with an ascending number $n starting with 1,
-and a random image will be chosen from the provided ones.
+The images are named `$identifier.png`, where `$identifier` is
+one of `overlay,background,footer,header`.
+If you want to specify multiple images for one identifier, add additional images named
+like `$identifier.$n.png`, with an ascending number $n starting with 1, and a random
+image will be chosen from the provided ones.
 
 
 Mod load path
@@ -153,7 +157,8 @@ to a single modname. Their meaning is that if the specified mod
 is missing, that does not prevent this mod from being loaded.
 
 ### `screenshot.png`
-A screenshot shown in modmanager within mainmenu.
+A screenshot shown in the mod manager within the main menu. It should
+have an aspect ratio of 3:2 and a minimum size of 300×200 pixels.
 
 ### `description.txt`
 A File containing description to be shown within mainmenu.
@@ -203,11 +208,17 @@ when registering it.
 The `:` prefix can also be used for maintaining backwards compatibility.
 
 ### Aliases
-Aliases can be added by using `minetest.register_alias(name, convert_to)`.
+Aliases can be added by using `minetest.register_alias(name, convert_to)` or
+`minetest.register_alias_force(name, convert_to).
 
 This will make Minetest to convert things called name to things called
 `convert_to`.
 
+The only difference between `minetest.register_alias` and
+`minetest.register_alias_force` is that if an item called `name` exists,
+`minetest.register_alias` will do nothing while
+`minetest.register_alias_force` will unregister it.
+
 This can be used for maintaining backwards compatibility.
 
 This can be also used for setting quick access names for things, e.g. if
@@ -243,7 +254,8 @@ Example:
     default_dirt.png^default_grass_side.png
 
 `default_grass_side.png` is overlayed over `default_dirt.png`.
-The texture with the lower resolution will be automatically upscaled to the higher resolution texture.
+The texture with the lower resolution will be automatically upscaled to
+the higher resolution texture.
 
 ### Texture grouping
 Textures can be grouped together by enclosing them in `(` and `)`.
@@ -251,7 +263,17 @@ Textures can be grouped together by enclosing them in `(` and `)`.
 Example: `cobble.png^(thing1.png^thing2.png)`
 
 A texture for `thing1.png^thing2.png` is created and the resulting
-texture is overlaid over `cobble.png`.
+texture is overlaid on top of `cobble.png`.
+
+### Escaping
+Modifiers that accept texture names (e.g. `[combine`) accept escaping to allow
+passing complex texture names as arguments. Escaping is done with backslash and
+is required for `^` and `:`.
+
+Example: `cobble.png^[lowpart:50:color.png\^[mask\:trans.png`
+
+The lower 50 percent of `color.png^[mask:trans.png` are overlaid
+on top of `cobble.png`.
 
 ### Advanced texture modifiers
 
@@ -286,6 +308,25 @@ Example:
 
     default_sandstone.png^[resize:16x16
 
+#### `[opacity:<r>`
+    Makes the base image transparent according to the given ratio.
+    r must be between 0 and 255.
+    0 means totally transparent.
+    255 means totally opaque.
+
+Example:
+
+    default_sandstone.png^[opacity:127
+
+#### `[invert:<mode>`
+Inverts the given channels of the base image.
+Mode may contain the characters "r", "g", "b", "a".
+Only the channels that are mentioned in the mode string will be inverted.
+
+Example:
+
+	default_apple.png^[invert:rgb
+
 #### `[brighten`
 Brightens the texture.
 
@@ -329,7 +370,7 @@ Example:
     default_stone.png^[transformFXR90
 
 #### `[inventorycube{<top>{<left>{<right>`
-`^` is replaced by `&` in texture names.
+Escaping does not apply here and `^` is replaced by `&` in texture names instead.
 
 Create an inventory cube texture using the side textures.
 
@@ -400,18 +441,24 @@ from the available ones of the following files:
 
 Examples of sound parameter tables:
 
-    -- Play location-less on all clients
+    -- Play locationless on all clients
     {
         gain = 1.0, -- default
     }
-    -- Play location-less to a player
+    -- Play locationless to one player
+    {
+        to_player = name,
+        gain = 1.0, -- default
+    }
+    -- Play locationless to one player, looped
     {
         to_player = name,
         gain = 1.0, -- default
+        loop = true,
     }
     -- Play in a location
     {
-        pos = {x=1,y=2,z=3},
+        pos = {x = 1, y = 2, z = 3},
         gain = 1.0, -- default
         max_hear_distance = 32, -- default, uses an euclidean metric
     }
@@ -420,15 +467,18 @@ Examples of sound parameter tables:
         object = <an ObjectRef>,
         gain = 1.0, -- default
         max_hear_distance = 32, -- default, uses an euclidean metric
-        loop = true, -- only sounds connected to objects can be looped
+        loop = true,
     }
 
+Looped sounds must either be connected to an object or played locationless to
+one player using `to_player = name,`
+
 ### `SimpleSoundSpec`
 * e.g. `""`
 * e.g. `"default_place_node"`
 * e.g. `{}`
-* e.g. `{name="default_place_node"}`
-* e.g. `{name="default_place_node", gain=1.0}`
+* e.g. `{name = "default_place_node"}`
+* e.g. `{name = "default_place_node", gain = 1.0}`
 
 Registered definitions of stuff
 -------------------------------
@@ -448,6 +498,11 @@ the global `minetest.registered_*` tables.
 * `minetest.register_craftitem(name, item definition)`
     * added to `minetest.registered_items[name]`
 
+* `minetest.unregister_item(name)`
+    * Unregisters the item name from engine, and deletes the entry with key
+    * `name` from `minetest.registered_items` and from the associated item
+    * table according to its nature: minetest.registered_nodes[] etc
+
 * `minetest.register_biome(biome definition)`
     * returns an integer uniquely identifying the registered biome
     * added to `minetest.registered_biome` with the key of `biome.name`
@@ -468,8 +523,8 @@ the global `minetest.registered_*` tables.
     * added to `minetest.registered_schematic` with the key of `schematic.name`
     * if `schematic.name` is nil, the key is the returned ID
     * if the schematic is loaded from a file, schematic.name is set to the filename
-    * if the function is called when loading the mod, and schematic.name is a relative path,
-    * then the current mod path will be prepended to the schematic filename
+    * if the function is called when loading the mod, and schematic.name is a relative
+      path, then the current mod path will be prepended to the schematic filename
 
 * `minetest.clear_registered_biomes()`
     * clears all biomes currently registered
@@ -562,6 +617,22 @@ node definition:
     ^ The rotation of this node is stored in param2. Plants are rotated this way.
       Values range 0 - 179. The value stored in param2 is multiplied by two to
       get the actual rotation of the node.
+    paramtype2 == "meshoptions"
+    ^ Only valid for "plantlike". The value of param2 becomes a bitfield which can
+      be used to change how the client draws plantlike nodes. Bits 0, 1 and 2 form
+      a mesh selector. Currently the following meshes are choosable:
+        0 = a "x" shaped plant (ordinary plant)
+        1 = a "+" shaped plant (just rotated 45 degrees)
+        2 = a "*" shaped plant with 3 faces instead of 2
+        3 = a "#" shaped plant with 4 faces instead of 2
+        4 = a "#" shaped plant with 4 faces that lean outwards
+        5-7 are unused and reserved for future meshes.
+      Bits 3 through 7 are optional flags that can be combined and give these
+      effects:
+        bit 3 (0x08) - Makes the plant slightly vary placement horizontally
+        bit 4 (0x10) - Makes the plant mesh 1.4x larger
+        bit 5 (0x20) - Moves each face randomly a small bit down (1/8 max)
+        bits 6-7 are reserved for future use.
     collision_box = {
       type = "fixed",
       fixed = {
@@ -1407,6 +1478,15 @@ examples.
 * `fixed_size`: `true`/`false` (optional)
 * deprecated: `invsize[<W>,<H>;]`
 
+#### `container[<X>,<Y>]`
+* Start of a container block, moves all physical elements in the container by (X, Y)
+* Must have matching container_end
+* Containers can be nested, in which case the offsets are added
+  (child containers are relative to parent containers)
+
+#### `container_end[]`
+* End of a container, following elements are no longer relative to this container
+
 #### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]`
 * Show an inventory list
 
@@ -1416,13 +1496,13 @@ examples.
 #### `listring[<inventory location>;<list name>]`
 * Allows to create a ring of inventory lists
 * Shift-clicking on items in one element of the ring
-* will send them to the next inventory list inside the ring
+  will send them to the next inventory list inside the ring
 * The first occurrence of an element inside the ring will
-* determine the inventory where items will be sent to
+  determine the inventory where items will be sent to
 
 #### `listring[]`
 * Shorthand for doing `listring[<inventory location>;<list name>]`
-* for the last two inventory lists added by list[...]
+  for the last two inventory lists added by list[...]
 
 #### `listcolors[<slot_bg_normal>;<slot_bg_hover>]`
 * Sets background color of slots as `ColorString`
@@ -1473,18 +1553,23 @@ examples.
 
 #### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]`
 * Textual password style field; will be sent to server when a button is clicked
+* When enter is pressed in field, fields.key_enter_field will be sent with the name
+  of this field.
 * `x` and `y` position the field relative to the top left of the menu
 * `w` and `h` are the size of the field
-* fields are a set height, but will be vertically centred on `h`
+* Fields are a set height, but will be vertically centred on `h`
 * Position and size units are inventory slots
 * `name` is the name of the field as returned in fields to `on_receive_fields`
 * `label`, if not blank, will be text printed on the top left above the field
+* See field_close_on_enter to stop enter closing the formspec
 
 #### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
 * Textual field; will be sent to server when a button is clicked
+* When enter is pressed in field, fields.key_enter_field will be sent with the name
+  of this field.
 * `x` and `y` position the field relative to the top left of the menu
 * `w` and `h` are the size of the field
-* fields are a set height, but will be vertically centred on `h`
+* Fields are a set height, but will be vertically centred on `h`
 * Position and size units are inventory slots
 * `name` is the name of the field as returned in fields to `on_receive_fields`
 * `label`, if not blank, will be text printed on the top left above the field
@@ -1492,15 +1577,24 @@ examples.
     * `default` may contain variable references such as `${text}'` which
       will fill the value from the metadata value `text`
     * **Note**: no extra text or more than a single variable is supported ATM.
+* See field_close_on_enter to stop enter closing the formspec
 
 #### `field[<name>;<label>;<default>]`
-* as above, but without position/size units
-* special field for creating simple forms, such as sign text input
-* must be used without a `size[]` element
-* a "Proceed" button will be added automatically
+* As above, but without position/size units
+* When enter is pressed in field, fields.key_enter_field will be sent with the name
+  of this field.
+* Special field for creating simple forms, such as sign text input
+* Must be used without a `size[]` element
+* A "Proceed" button will be added automatically
+* See field_close_on_enter to stop enter closing the formspec
+
+#### `field_close_on_enter[<name>;<close_on_enter>]`
+* <name> is the name of the field
+* if <close_on_enter> is false, pressing enter in the field will submit the form but not close it
+* defaults to true when not specified (ie: no tag for a field)
 
 #### `textarea[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
-* same as fields above, but with multi-line input
+* Same as fields above, but with multi-line input
 
 #### `label[<X>,<Y>;<label>]`
 * `x` and `y` work as per field
@@ -1561,12 +1655,12 @@ examples.
 * `name` fieldname sent to server on doubleclick value is current selected element
 * `listelements` can be prepended by #RRGGBB (only) in hexadecimal format
      * if you want a listelement to start with "#" write "##"
-* index to be selected within textlist
+* Index to be selected within textlist
 * `true`/`false`: draw transparent background
-* see also `minetest.explode_textlist_event` (main menu: `engine.explode_textlist_event`)
+* See also `minetest.explode_textlist_event` (main menu: `engine.explode_textlist_event`)
 
 #### `tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
-* show a tab**header** at specific position (ignores formsize)
+* Show a tab**header** at specific position (ignores formsize)
 * `x` and `y` position the itemlist relative to the top left of the menu
 * `name` fieldname data is transferred to Lua
 * `caption 1`...: name shown on top of tab
@@ -1575,54 +1669,53 @@ examples.
 * `draw_border` (optional): draw border
 
 #### `box[<X>,<Y>;<W>,<H>;<color>]`
-* simple colored semitransparent box
+* Simple colored semitransparent box
 * `x` and `y` position the box relative to the top left of the menu
 * `w` and `h` are the size of box
 * `color` is color specified as a `ColorString`
 
 #### `dropdown[<X>,<Y>;<W>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]`
-* show a dropdown field
+* Show a dropdown field
 * **Important note**: There are two different operation modes:
      1. handle directly on change (only changed dropdown is submitted)
      2. read the value on pressing a button (all dropdown values are available)
 * `x` and `y` position of dropdown
-* width of dropdown
-* fieldname data is transferred to Lua
-* items to be shown in dropdown
-* index of currently selected dropdown item
+* Width of dropdown
+* Fieldname data is transferred to Lua
+* Items to be shown in dropdown
+* Index of currently selected dropdown item
 
-#### `checkbox[<X>,<Y>;<name>;<label>;<selected>;<tooltip>]`
-* show a checkbox
+#### `checkbox[<X>,<Y>;<name>;<label>;<selected>]`
+* Show a checkbox
 * `x` and `y`: position of checkbox
 * `name` fieldname data is transferred to Lua
 * `label` to be shown left of checkbox
 * `selected` (optional): `true`/`false`
-* `tooltip` (optional)
 
 #### `scrollbar[<X>,<Y>;<W>,<H>;<orientation>;<name>;<value>]`
-* show a scrollbar
-* there are two ways to use it:
+* Show a scrollbar
+* There are two ways to use it:
      1. handle the changed event (only changed scrollbar is available)
      2. read the value on pressing a button (all scrollbars are available)
 * `x` and `y`: position of trackbar
 * `w` and `h`: width and height
 * `orientation`:  `vertical`/`horizontal`
-* fieldname data is transferred to Lua
-* value this trackbar is set to (`0`-`1000`)
-* see also `minetest.explode_scrollbar_event` (main menu: `engine.explode_scrollbar_event`)
+* Fieldname data is transferred to Lua
+* Value this trackbar is set to (`0`-`1000`)
+* See also `minetest.explode_scrollbar_event` (main menu: `engine.explode_scrollbar_event`)
 
 #### `table[<X>,<Y>;<W>,<H>;<name>;<cell 1>,<cell 2>,...,<cell n>;<selected idx>]`
-* show scrollable table using options defined by the previous `tableoptions[]`
-* displays cells as defined by the previous `tablecolumns[]`
+* Show scrollable table using options defined by the previous `tableoptions[]`
+* Displays cells as defined by the previous `tablecolumns[]`
 * `x` and `y`: position the itemlist relative to the top left of the menu
 * `w` and `h` are the size of the itemlist
 * `name`: fieldname sent to server on row select or doubleclick
 * `cell 1`...`cell n`: cell contents given in row-major order
 * `selected idx`: index of row to be selected within table (first row = `1`)
-* see also `minetest.explode_table_event` (main menu: `engine.explode_table_event`)
+* See also `minetest.explode_table_event` (main menu: `engine.explode_table_event`)
 
 #### `tableoptions[<opt 1>;<opt 2>;...]`
-* sets options for `table[]`
+* Sets options for `table[]`
 * `color=#RRGGBB`
      * default text color (`ColorString`), defaults to `#FFFFFF`
 * `background=#RRGGBB`
@@ -1638,14 +1731,14 @@ examples.
      * only useful when there is a column of type "tree"
 
 #### `tablecolumns[<type 1>,<opt 1a>,<opt 1b>,...;<type 2>,<opt 2a>,<opt 2b>;...]`
-* sets columns for `table[]`
-* types: `text`, `image`, `color`, `indent`, `tree`
+* Sets columns for `table[]`
+* Types: `text`, `image`, `color`, `indent`, `tree`
     * `text`:   show cell contents as text
     * `image`:  cell contents are an image index, use column options to define images
     * `color`:   cell contents are a ColorString and define color of following cell
     * `indent`: cell contents are a number and define indentation of following cell
     * `tree`:   same as indent, but user can open and close subtrees (treeview-like)
-* column options:
+* Column options:
     * `align=<value>`
         * for `text` and `image`: content alignment within cells.
           Available values: `left` (default), `center`, `right`, `inline`
@@ -1675,6 +1768,13 @@ Inventory locations
 * `"nodemeta:<X>,<Y>,<Z>"`: Any node metadata
 * `"detached:<name>"`: A detached inventory
 
+Player Inventory lists
+----------------------
+* `main`: list containing the default inventory
+* `craft`: list containing the craft input
+* `craftpreview`: list containing the craft output
+* `hand`: list containing an override for the empty hand
+
 `ColorString`
 -------------
 `#RGB` defines a color in hexadecimal format.
@@ -1701,6 +1801,24 @@ numerical form, the raw integer value of an ARGB8 quad:
 or string form, a ColorString (defined above):
     `colorspec = "green"`
 
+Escape sequences
+----------------
+Most text can contain escape sequences, that can for example color the text.
+There are a few exceptions: tab headers, dropdowns and vertical labels can't.
+The following functions provide escape sequences:
+* `core.get_color_escape_sequence(color)`:
+    * `color` is a ColorString
+    * The escape sequence sets the text color to `color`
+* `core.colorize(color, message)`:
+    * Equivalent to:
+      `core.get_color_escape_sequence(color) ..
+       message ..
+       core.get_color_escape_sequence("#ffffff")`
+* `color.get_background_escape_sequence(color)`
+    * `color` is a ColorString
+    * The escape sequence sets the background of the whole text element to
+      `color`. Only defined for item descriptions and tooltips.
+
 Spatial Vectors
 ---------------
 * `vector.new(a[, b, c])`: returns a vector:
@@ -1710,7 +1828,8 @@ Spatial Vectors
 * `vector.distance(p1, p2)`: returns a number
 * `vector.length(v)`: returns a number
 * `vector.normalize(v)`: returns a vector
-* `vector.round(v)`: returns a vector, each dimension rounded to floor
+* `vector.floor(v)`: returns a vector, each dimension rounded down
+* `vector.round(v)`: returns a vector, each dimension rounded to nearest int
 * `vector.apply(v, func)`: returns a vector
 * `vector.equals(v1, v2)`: returns a boolean
 
@@ -1805,6 +1924,17 @@ Helper functions
       * nil: return all entries,
       * true: return only subdirectory names, or
       * false: return only file names.
+* `minetest.get_version()`: returns a table containing components of the
+   engine version.  Components:
+    * `project`: Name of the project, eg, "Minetest"
+    * `string`: Simple version, eg, "1.2.3-dev"
+    * `hash`: Full git version (only set if available), eg, "1.2.3-dev-01234567-dirty"
+  Use this for informational purposes only. The information in the returned
+  table does not represent the capabilities of the engine, nor is it
+  reliable or verifyable. Compatible forks will have a different name and
+  version entirely. To check for the presence of engine features, test
+  whether the functions exported by the wanted features exist. For example:
+  `if core.nodeupdate then ... end`.
 
 ### Logging
 * `minetest.debug(...)`
@@ -1822,16 +1952,27 @@ Call these functions only at load time!
 * `minetest.register_node(name, node definition)`
 * `minetest.register_tool(name, item definition)`
 * `minetest.register_craftitem(name, item definition)`
+* `minetest.unregister_item(name)`
 * `minetest.register_alias(name, convert_to)`
+* `minetest.register_alias_force(name, convert_to)`
 * `minetest.register_craft(recipe)`
+    * Check recipe table syntax for different types below.
+* `minetest.clear_craft(recipe)`
+    * Will erase existing craft based either on output item or on input recipe.
+    * Specify either output or input only. If you specify both, input will be ignored. For input use the same recipe table
+      syntax as for `minetest.register_craft(recipe)`. For output specify only the item, without a quantity.
+    * If no erase candidate could be found, Lua exception will be thrown.
+    * Warning! The type field ("shaped","cooking" or any other) will be ignored if the recipe
+      contains output. Erasing is then done independently from the crafting method.
 * `minetest.register_ore(ore definition)`
+* `minetest.register_biome(biome definition)`
 * `minetest.register_decoration(decoration definition)`
 * `minetest.override_item(name, redefinition)`
     * Overrides fields of an item registered with register_node/tool/craftitem.
     * Note: Item must already be defined, (opt)depend on the mod defining it.
     * Example: `minetest.override_item("default:mese", {light_source=LIGHT_MAX})`
-
 * `minetest.clear_registered_ores()`
+* `minetest.clear_registered_biomes()`
 * `minetest.clear_registered_decorations()`
 
 ### Global callback registration functions
@@ -1889,8 +2030,9 @@ Call these functions only at load time!
      * If it returns a string, the player is disconnected with that string as reason
 * `minetest.register_on_joinplayer(func(ObjectRef))`
     * Called when a player joins the game
-* `minetest.register_on_leaveplayer(func(ObjectRef))`
+* `minetest.register_on_leaveplayer(func(ObjectRef, timed_out))`
     * Called when a player leaves the game
+    * `timed_out`: True for timeout, false for other reasons.
 * `minetest.register_on_cheat(func(ObjectRef, cheat))`
     * Called when a player cheats
     * `cheat`: `{type=<cheat_type>}`, where `<cheat_type>` is one of:
@@ -1930,7 +2072,8 @@ Call these functions only at load time!
 * `minetest.register_chatcommand(cmd, chatcommand definition)`
 * `minetest.register_privilege(name, definition)`
     * `definition`: `"description text"`
-    * `definition`: `{ description = "description text", give_to_singleplayer = boolean, -- default: true }`
+    * `definition`: `{ description = "description text", give_to_singleplayer = boolean}`
+      the default of `give_to_singleplayer` is true
     * To allow players with basic_privs to grant, see basic_privs minetest.conf setting.
 * `minetest.register_authentication_handler(handler)`
     * See `minetest.builtin_auth_handler` in `builtin.lua` for reference
@@ -1951,12 +2094,21 @@ Call these functions only at load time!
 * `minetest.notify_authentication_modified(name)`
     * Should be called by the authentication handler if privileges changes.
     * To report everybody, set `name=nil`.
+* `minetest.check_password_entry(name, entry, password)`
+    * Returns true if the "db entry" for a player with name matches given
+    * password, false otherwise.
+    * The "db entry" is the usually player-individual value that is derived
+    * from the player's chosen password and stored on the server in order to allow
+    * authentication whenever the player desires to log in.
+    * Only use this function for making it possible to log in via the password from
+    * via protocols like IRC, other uses for inside the game are frowned upon.
 * `minetest.get_password_hash(name, raw_password)`
     * Convert a name-password pair to a password hash that Minetest can use.
     * The returned value alone is not a good basis for password checks based
     * on comparing the password hash in the database with the password hash
     * from the function, with an externally provided password, as the hash
     * in the db might use the new SRP verifier format.
+    * For this purpose, use minetest.check_password_entry instead.
 * `minetest.string_to_privs(str)`: returns `{priv1=true,...}`
 * `minetest.privs_to_string(privs)`: returns `"priv1,priv2,..."`
     * Convert between two privilege representations
@@ -1982,7 +2134,7 @@ and `minetest.auth_reload` call the authetification handler.
 * `minetest.set_node(pos, node)`
 * `minetest.add_node(pos, node): alias set_node(pos, node)`
     * Set node at position (`node = {name="foo", param1=0, param2=0}`)
-* `minetest.swap_node(pos, node`
+* `minetest.swap_node(pos, node)`
     * Set node at position, but don't remove metadata
 * `minetest.remove_node(pos)`
     * Equivalent to `set_node(pos, "air")`
@@ -2055,7 +2207,9 @@ and `minetest.auth_reload` call the authetification handler.
       given biome_name string.
 * `minetest.get_mapgen_params()` Returns mapgen parameters, a table containing
   `mgname`, `seed`, `chunksize`, `water_level`, and `flags`.
+  * Deprecated: use minetest.get_mapgen_setting(name) instead
 * `minetest.set_mapgen_params(MapgenParams)`
+    * Deprecated: use minetest.set_mapgen_setting(name, value, override) instead
     * Set map generation parameters
     * Function cannot be called after the registration period; only initialization
       and `on_mapgen_init`
@@ -2065,6 +2219,24 @@ and `minetest.auth_reload` call the authetification handler.
         * `flags` contains a comma-delimited string of flags to set,
           or if the prefix `"no"` is attached, clears instead.
         * `flags` is in the same format and has the same options as `mg_flags` in `minetest.conf`
+* `minetest.get_mapgen_setting(name)`
+    * Gets the *active* mapgen setting (or nil if none exists) in string format with the following
+      order of precedence:
+        1) Settings loaded from map_meta.txt or overrides set during mod execution
+        2) Settings set by mods without a metafile override
+        3) Settings explicitly set in the user config file, minetest.conf
+        4) Settings set as the user config default
+* `minetest.get_mapgen_setting_noiseparams(name)`
+    * Same as above, but returns the value as a NoiseParams table if the setting `name` exists
+      and is a valid NoiseParams
+* `minetest.set_mapgen_setting(name, value, [override_meta])`
+   * Sets a mapgen param to `value`, and will take effect if the corresponding mapgen setting
+     is not already present in map_meta.txt.
+   * `override_meta` is an optional boolean (default: `false`). If this is set to true,
+     the setting will become the active setting regardless of the map metafile contents.
+   * Note: to set the seed, use "seed", not "fixed_map_seed"
+* `minetest.set_mapgen_setting_noiseparams(name, value, [override_meta])`
+   * Same as above, except value is a NoiseParams table.
 * `minetest.set_noiseparams(name, noiseparams, set_default)`
     * Sets the noiseparams setting of `name` to the noiseparams table specified in `noiseparams`.
     * `set_default` is an optional boolean (default: `true`) that specifies whether the setting
@@ -2130,6 +2302,15 @@ and `minetest.auth_reload` call the authetification handler.
     * increase level of leveled node by level, default `level` equals `1`
     * if `totallevel > maxlevel`, returns rest (`total-max`)
     * can be negative for decreasing
+* `core.check_single_for_falling(pos)`
+    * causes an unsupported `group:falling_node` node to fall and causes an
+      unattached `group:attached_node` node to fall.
+    * does not spread these updates to neighbours.
+* `core.check_for_falling(pos)`
+    * causes an unsupported `group:falling_node` node to fall and causes an
+      unattached `group:attached_node` node to fall.
+    * spread these updates to neighbours and can cause a cascade
+      of nodes to fall.
 
 ### Inventory
 `minetest.get_inventory(location)`: returns an `InvRef`
@@ -2138,8 +2319,11 @@ and `minetest.auth_reload` call the authetification handler.
     * `{type="player", name="celeron55"}`
     * `{type="node", pos={x=, y=, z=}}`
     * `{type="detached", name="creative"}`
-* `minetest.create_detached_inventory(name, callbacks)`: returns an `InvRef`
+* `minetest.create_detached_inventory(name, callbacks, [player_name])`: returns an `InvRef`
     * callbacks: See "Detached inventory callbacks"
+    * player_name: Make detached inventory available to one player exclusively,
+      by default they will be sent to every player (even if not used).
+      Note that this parameter is mostly just a workaround and will be removed in future releases.
     * Creates a detached inventory. If it already exists, it is cleared.
 * `minetest.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing)`:
    returns left over ItemStack
@@ -2151,6 +2335,13 @@ and `minetest.auth_reload` call the authetification handler.
     * `formname`: name passed to `on_player_receive_fields` callbacks.
       It should follow the `"modname:<whatever>"` naming convention
     * `formspec`: formspec to display
+* `minetest.close_formspec(playername, formname)`
+    * `playername`: name of player to close formspec
+    * `formname`: has to exactly match the one given in show_formspec, or the formspec will
+       not close.
+    * calling show_formspec(playername, formname, "") is equal to this expression
+    * to close a formspec regardless of the formname, call
+      minetest.close_formspec(playername, ""). USE THIS ONLY WHEN ABSOLUTELY NECESSARY!
 * `minetest.formspec_escape(string)`: returns a string
     * escapes the characters "[", "]", "\", "," and ";", which can not be used in formspecs
 * `minetest.explode_table_event(string)`: returns a table
@@ -2287,6 +2478,7 @@ These functions return the leftover itemstack.
 * `minetest.request_shutdown([message],[reconnect])`: request for server shutdown. Will display `message` to clients,
     and `reconnect` == true displays a reconnect button.
 * `minetest.get_server_status()`: returns server status string
+* `minetest.get_server_uptime()`: returns the server uptime in seconds
 
 ### Bans
 * `minetest.get_ban_list()`: returns the ban list (same as `minetest.get_ban_description("")`)
@@ -2378,12 +2570,16 @@ These functions return the leftover itemstack.
     * callback: `function(HTTPRequestResult res)`
     * Use this HTTP function if you are unsure, the others are for advanced use.
 * `HTTPApiTable.fetch_async(HTTPRequest req)`: returns handle
-    * Performs given request asynchronously and returns handle for `minetest.http_fetch_async_get`
+    * Performs given request asynchronously and returns handle for `HTTPApiTable.fetch_async_get`
 * `HTTPApiTable.fetch_async_get(handle)`: returns HTTPRequestResult
     * Return response data for given asynchronous HTTP request
 
 ### Misc.
 * `minetest.get_connected_players()`: returns list of `ObjectRefs`
+* `minetest.hud_replace_builtin(name, hud_definition)`
+    * Replaces definition of a builtin hud element
+    * `name`: `"breath"` or `"health"`
+    * `hud_definition`: definition to replace builtin definition
 * `minetest.hash_node_position({x=,y=,z=})`: returns an 48-bit integer
     * Gives a unique hash number for a node position (16+16+16=48bit)
 * `minetest.get_position_from_hash(hash)`: returns a position
@@ -2438,6 +2634,10 @@ These functions return the leftover itemstack.
     * See documentation on `minetest.compress()` for supported compression methods.
     * currently supported.
     * `...` indicates method-specific arguments. Currently, no methods use this.
+* `minetest.encode_base64(string)`: returns string encoded in base64
+    * Encodes a string in base64.
+* `minetest.decode_base64(string)`: returns string
+    * Decodes a string encoded in base64.
 * `minetest.is_protected(pos, name)`: returns boolean
     * Returns true, if player `name` shouldn't be abled to dig at `pos` or do other
       actions, defineable by mods, due to some mod-defined ownership-like concept.
@@ -2478,13 +2678,17 @@ These functions return the leftover itemstack.
        the creative mode setting, and checks for "sneak" to set the `invert_wall`
        parameter.
 
-* `minetest.forceload_block(pos)`
+* `minetest.forceload_block(pos[, transient])`
     * forceloads the position `pos`.
     * returns `true` if area could be forceloaded
-    * Please note that forceloaded areas are saved when the server restarts.
+    * If `transient` is `false` or absent, the forceload will be persistent
+      (saved between server runs). If `true`, the forceload will be transient
+      (not saved between server runs).
 
-* `minetest.forceload_free_block(pos)`
+* `minetest.forceload_free_block(pos[, transient])`
     * stops forceloading the position `pos`
+    * If `transient` is `false` or absent, frees a persistent forceload.
+      If `true`, frees a transient forceload.
 
 * `minetest.request_insecure_environment()`: returns an environment containing
   insecure functions if the calling mod has been listed as trusted in the
@@ -2542,6 +2746,7 @@ Can be gotten via `minetest.get_meta(pos)`.
 * `get_inventory()`: returns `InvRef`
 * `to_table()`: returns `nil` or `{fields = {...}, inventory = {list1 = {}, ...}}`
 * `from_table(nil or {})`
+    * to clear metadata, use from_table(nil)
     * See "Node Metadata"
 
 ### `NodeTimerRef`
@@ -2638,12 +2843,23 @@ This is basically a reference to a C++ `ServerActiveObject`
 
 ##### Player-only (no-op for other objects)
 * `get_player_name()`: returns `""` if is not a player
-* `get_player_velocity()`: returns `nil` if is not a player otherwise a table {x, y, z} representing the player's instantaneous velocity in nodes/s
+* `get_player_velocity()`: returns `nil` if is not a player, otherwise a
+  table {x, y, z} representing the player's instantaneous velocity in nodes/s
 * `get_look_dir()`: get camera direction as a unit vector
-* `get_look_pitch()`: pitch in radians
-* `get_look_yaw()`: yaw in radians (wraps around pretty randomly as of now)
-* `set_look_pitch(radians)`: sets look pitch
-* `set_look_yaw(radians)`: sets look yaw
+* `get_look_vertical()`: pitch in radians
+     * Angle ranges between -pi/2 and pi/2, which are straight up and down respectively.
+* `get_look_horizontal()`: yaw in radians
+     * Angle is counter-clockwise from the +z direction.
+* `set_look_vertical(radians)`: sets look pitch
+     * radians - Angle from looking forward, where positive is downwards.
+* `set_look_horizontal(radians)`: sets look yaw
+     * radians - Angle from the +z direction, where positive is counter-clockwise.
+* `get_look_pitch()`: pitch in radians - Deprecated as broken. Use get_look_vertical.
+     * Angle ranges between -pi/2 and pi/2, which are straight down and up respectively.
+* `get_look_yaw()`: yaw in radians - Deprecated as broken. Use get_look_horizontal.
+     * Angle is counter-clockwise from the +x direction.
+* `set_look_pitch(radians)`: sets look pitch - Deprecated. Use set_look_vertical.
+* `set_look_yaw(radians)`: sets look yaw - Deprecated. Use set_look_horizontal.
 * `get_breath()`: returns players breath
 * `set_breath(value)`: sets players breath
      * values:
@@ -2689,10 +2905,6 @@ This is basically a reference to a C++ `ServerActiveObject`
 * `hud_set_hotbar_selected_image(texturename)`
     * sets image for selected item of hotbar
 * `hud_get_hotbar_selected_image`: returns texturename
-* `hud_replace_builtin(name, hud_definition)`
-    * replace definition of a builtin hud element
-    * `name`: `"breath"` or `"health"`
-    * `hud_definition`: definition to replace builtin definition
 * `set_sky(bgcolor, type, {texture names})`
     * `bgcolor`: ColorSpec, defaults to white
     * Available types:
@@ -2752,25 +2964,41 @@ An `InvRef` is a reference to an inventory.
 A fast access data structure to store areas, and find areas near a given position or area.
 Every area has a `data` string attribute to store additional information.
 You can create an empty `AreaStore` by calling `AreaStore()`, or `AreaStore(type_name)`.
-If you chose the parameter-less constructor, a fast implementation will be automatically chosen for you.
+If you chose the parameter-less constructor, a fast implementation will be automatically
+chosen for you.
 
 #### Methods
-* `get_area(id, include_borders, include_data)`: returns the area with the id `id`. (optional) Boolean values `include_borders` and `include_data` control what's copied.
-* `get_areas_for_pos(pos, include_borders, include_data)`: returns all areas that contain the position `pos`. (optional) Boolean values `include_borders` and `include_data` control what's copied.
-* `get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data)`: returns all areas that contain all nodes inside the area specified by `edge1` and `edge2` (inclusive). If `accept_overlap` is true, also areas are returned that have nodes in common with the specified area. (optional) Boolean values `include_borders` and `include_data` control what's copied.
-* `insert_area(edge1, edge2, data, [id])`: inserts an area into the store. Returns the new area's ID, or nil if the insertion failed. The (inclusive) positions `edge1` and `edge2` describe the area. `data` is a string stored with the area.  If passed, `id` will be used as the internal area ID, it must be a unique number between 0 and 2^32-2. If you use the `id` parameter you must always use it, or insertions are likely to fail due to conflicts.
-* `reserve(count)`: reserves resources for at most `count` many contained areas. Only needed for efficiency, and only some implementations profit.
+* `get_area(id, include_borders, include_data)`: returns the area with the id `id`.
+  (optional) Boolean values `include_borders` and `include_data` control what's copied.
+  Returns nil if specified area id does not exist.
+* `get_areas_for_pos(pos, include_borders, include_data)`: returns all areas that contain
+  the position `pos`. (optional) Boolean values `include_borders` and `include_data` control
+  what's copied.
+* `get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data)`:
+  returns all areas that contain all nodes inside the area specified by `edge1` and `edge2` (inclusive).
+  If `accept_overlap` is true, also areas are returned that have nodes in common with the specified area.
+  (optional) Boolean values `include_borders` and `include_data` control what's copied.
+* `insert_area(edge1, edge2, data, [id])`: inserts an area into the store. Returns the new area's ID,
+  or nil if the insertion failed. The (inclusive) positions `edge1` and `edge2` describe the area.
+  `data` is a string stored with the area.  If passed, `id` will be used as the internal area ID,
+  it must be a unique number between 0 and 2^32-2. If you use the `id` parameter you must always use it,
+  or insertions are likely to fail due to conflicts.
+* `reserve(count)`: reserves resources for at most `count` many contained areas.
+  Only needed for efficiency, and only some implementations profit.
 * `remove_area(id)`: removes the area with the given id from the store, returns success.
-* `set_cache_params(params)`: sets params for the included prefiltering cache. Calling invalidates the cache, so that its elements have to be newly generated.
+* `set_cache_params(params)`: sets params for the included prefiltering cache.
+  Calling invalidates the cache, so that its elements have to be newly generated.
     * `params`:
       {
         enabled = boolean, -- whether to enable, default true
-        block_radius = number, -- the radius (in nodes) of the areas the cache generates prefiltered lists for, minimum 16, default 64
+        block_radius = number, -- the radius (in nodes) of the areas the cache generates
+                                  prefiltered lists for, minimum 16, default 64
         limit = number, -- the cache's size, minimum 20, default 1000
       }
 * `to_string()`: Experimental. Returns area store serialized as a (binary) string.
 * `to_file(filename)`: Experimental. Like `to_string()`, but writes the data to a file.
-* `from_string(str)`: Experimental. Deserializes string and loads it into the AreaStore.  Returns success and, optionally, an error message.
+* `from_string(str)`: Experimental. Deserializes string and loads it into the AreaStore.
+  Returns success and, optionally, an error message.
 * `from_file(filename)`: Experimental. Like `from_string()`, but reads the data from a file.
 
 ### `ItemStack`
@@ -2782,13 +3010,11 @@ an itemstring, a table or `nil`.
 #### Methods
 * `is_empty()`: Returns `true` if stack is empty.
 * `get_name()`: Returns item name (e.g. `"default:stone"`).
-* `set_name(item_name)`: Returns boolean success.
-  Clears item on failure.
+* `set_name(item_name)`: Returns boolean whether item was cleared
 * `get_count()`: Returns number of items on the stack.
-* `set_count(count)`
+* `set_count(count)`: Returns boolean whether item was cleared
 * `get_wear()`: Returns tool wear (`0`-`65535`), `0` for non-tools.
-* `set_wear(wear)`: Returns boolean success.
-  Clears item on failure.
+* `set_wear(wear)`: Returns boolean whether item was cleared
 * `get_metadata()`: Returns metadata (a string attached to an item stack).
 * `set_metadata(metadata)`: Returns true.
 * `clear()`: removes all items from the stack, making it empty.
@@ -2834,7 +3060,9 @@ It can be created via `PcgRandom(seed)` or `PcgRandom(seed, sequence)`.
 * `next()`: return next integer random number [`-2147483648`...`2147483647`]
 * `next(min, max)`: return next integer random number [`min`...`max`]
 * `rand_normal_dist(min, max, num_trials=6)`: return normally distributed random number [`min`...`max`]
-    * This is only a rough approximation of a normal distribution with mean=(max-min)/2 and variance=1
+    * This is only a rough approximation of a normal distribution with:
+    *   mean = (max - min) / 2, and
+    *   variance = (((max - min + 1) ^ 2) - 1) / (12 * num_trials)
     * Increasing num_trials improves accuracy of the approximation
 
 ### `SecureRandom`
@@ -3077,7 +3305,9 @@ will place the schematic inside of the VoxelManip.
 * `set_light_data(light_data)`: Sets the `param1` (light) contents of each node
   in the `VoxelManip`
     * expects lighting data in the same format that `get_light_data()` returns
-* `get_param2_data()`: Gets the raw `param2` data read into the `VoxelManip` object
+* `get_param2_data([buffer])`: Gets the raw `param2` data read into the `VoxelManip` object
+    * Returns an array (indices 1 to volume) of integers ranging from `0` to `255`
+    * If the param `buffer` is present, this table will be used to store the result instead
 * `set_param2_data(param2_data)`: Sets the `param2` contents of each node in the `VoxelManip`
 * `calc_lighting([p1, p2], [propagate_shadow])`:  Calculate lighting within the `VoxelManip`
     * To be used only by a `VoxelManip` object from `minetest.get_mapgen_object`
@@ -3183,13 +3413,15 @@ Registered entities
     * It has the member `.object`, which is an `ObjectRef` pointing to the object
     * The original prototype stuff is visible directly via a metatable
 * Callbacks:
-    * `on_activate(self, staticdata)`
+    * `on_activate(self, staticdata, dtime_s)`
         * Called when the object is instantiated.
+        * `dtime_s` is the time passed since the object was unloaded, which can
+          be used for updating the entity state.
     * `on_step(self, dtime)`
         * Called on every server tick, after movement and collision processing.
           `dtime` is usually 0.1 seconds, as per the `dedicated_server_step` setting
           `in minetest.conf`.
-    * `on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir`
+    * `on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir)`
         * Called when somebody punches the object.
         * Note that you probably want to handle most punches using the
           automatic armor group system.
@@ -3317,19 +3549,23 @@ Definition tables
 
         on_activate = function(self, staticdata, dtime_s),
         on_step = function(self, dtime),
-        on_punch = function(self, hitter),
+        on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir),
         on_rightclick = function(self, clicker),
         get_staticdata = function(self),
     --  ^ Called sometimes; the string returned is passed to on_activate when
     --    the entity is re-activated from static state
 
-        -- Also you can define arbitrary member variables here
-        myvariable = whatever,
+        -- Also you can define arbitrary member variables here (see item definition for
+        -- more info)
+        _custom_field = whatever,
     }
 
 ### ABM (ActiveBlockModifier) definition (`register_abm`)
 
     {
+        label = "Lava cooling",
+    --  ^ Descriptive label for profiling purposes (optional).
+    --    Definitions with identical labels will be listed as one.
     --  In the following two fields, also group:groupname will work.
         nodenames = {"default:lava_source"},
         neighbors = {"default:water_source", "default:water_flowing"}, -- Any of these --[[
@@ -3346,6 +3582,9 @@ Definition tables
 ### LBM (LoadingBlockModifier) definition (`register_lbm`)
 
     {
+        label = "Upgrade legacy doors",
+    --  ^ Descriptive label for profiling purposes (optional).
+    --    Definitions with identical labels will be listed as one.
         name = "modname:replace_legacy_door",
         nodenames = {"default:lava_source"},
     --  ^ List of node names to trigger the LBM on.
@@ -3362,27 +3601,26 @@ Definition tables
 
     {
         description = "Steel Axe",
-        groups = {}, -- key=name, value=rating; rating=1..3.
+        groups = {}, -- key = name, value = rating; rating = 1..3.
                         if rating not applicable, use 1.
-                        e.g. {wool=1, fluffy=3}
-                            {soil=2, outerspace=1, crumbly=1}
-                            {bendy=2, snappy=1},
-                            {hard=1, metal=1, spikes=1}
+                        e.g. {wool = 1, fluffy = 3}
+                            {soil = 2, outerspace = 1, crumbly = 1}
+                            {bendy = 2, snappy = 1},
+                            {hard = 1, metal = 1, spikes = 1}
         inventory_image = "default_tool_steelaxe.png",
         wield_image = "",
-        wield_scale = {x=1,y=1,z=1},
+        wield_scale = {x = 1, y = 1, z = 1},
         stack_max = 99,
         range = 4.0,
         liquids_pointable = false,
         tool_capabilities = {
             full_punch_interval = 1.0,
-            max_drop_level=0,
-            groupcaps={
+            max_drop_level = 0,
+            groupcaps = {
                 -- For example:
-                snappy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1},
-                choppy={times={[3]=0.90}, maxwear=0.05, maxlevel=0}
+                choppy = {times = {[1] = 2.50, [2] = 1.40, [3] = 1.00}, uses = 20, maxlevel = 2},
             },
-            damage_groups = {groupname=damage},
+            damage_groups = {groupname = damage},
         },
         node_placement_prediction = nil,
         --[[
@@ -3394,21 +3632,25 @@ Definition tables
           actual result to client in a short moment.
         ]]
         sound = {
+            breaks = "default_tool_break", -- tools only
             place = --[[<SimpleSoundSpec>]],
         },
 
         on_place = func(itemstack, placer, pointed_thing),
         --[[
         ^ Shall place item and return the leftover itemstack
+        ^ The placer may be any ObjectRef or nil.
         ^ default: minetest.item_place ]]
         on_secondary_use = func(itemstack, user, pointed_thing),
         --[[
         ^ Same as on_place but called when pointing at nothing.
+        ^ The user may be any ObjectRef or nil.
         ^ pointed_thing : always { type = "nothing" }
         ]]
         on_drop = func(itemstack, dropper, pos),
         --[[
         ^ Shall drop item and return the leftover itemstack
+        ^ The dropper may be any ObjectRef or nil.
         ^ default: minetest.item_drop ]]
         on_use = func(itemstack, user, pointed_thing),
         --[[
@@ -3417,6 +3659,7 @@ Definition tables
           inventory, or an itemstack to replace the original itemstack.
             e.g. itemstack:take_item(); return itemstack
         ^ Otherwise, the function is free to do what it wants.
+        ^ The user may be any ObjectRef or nil.
         ^ The default functions handle regular use cases.
         ]]
         after_use = func(itemstack, user, node, digparams),
@@ -3429,6 +3672,13 @@ Definition tables
               itemstack:add_wear(digparams.wear)
               return itemstack
             end
+        ^ The user may be any ObjectRef or nil.
+        ]]
+        _custom_field = whatever,
+        --[[
+        ^ Add your own custom fields. By convention, all custom field names
+          should start with `_` to avoid naming collisions with future engine
+          usage.
         ]]
     }
 
@@ -3472,6 +3722,7 @@ Definition tables
         ^ paramtype = "light" allows light to propagate from or through the node with light value
         ^ falling by 1 per node. This line is essential for a light source node to spread its light. ]]
         paramtype2 = "none", -- See "Nodes"
+        place_param2 = nil, -- Force value for param2 when player places node
         is_ground_content = true, -- If false, the cave generator will not carve through this
         sunlight_propagates = false, -- If true, sunlight will go infinitely through this
         walkable = true, -- If true, objects collide with node
@@ -3484,13 +3735,17 @@ Definition tables
         liquid_alternative_flowing = "", -- Flowing version of source liquid
         liquid_alternative_source = "", -- Source version of flowing liquid
         liquid_viscosity = 0, -- Higher viscosity = slower flow (max. 7)
-        liquid_renewable = true, -- Can new liquid source be created by placing two or more sources nearby?
+        liquid_renewable = true, --[[
+        ^ If true, a new liquid source can be created by placing two or more sources nearby ]]
         leveled = 0, --[[
         ^ Block contains level in param2. Value is default level, used for snow.
         ^ Don't forget to use "leveled" type nodebox. ]]
         liquid_range = 8, -- number of flowing nodes around source (max. 8)
         drowning = 0, -- Player will take this amount of damage if no bubbles are left
-        light_source = 0, -- Amount of light emitted by node
+        light_source = 0, --[[
+        ^ Amount of light emitted by node.
+        ^ To set the maximum (currently 14), use the value 'minetest.LIGHT_MAX'.
+        ^ A value outside the range 0 to minetest.LIGHT_MAX causes undefined behavior.]]
         damage_per_second = 0, -- If player is inside node, this damage is caused
         node_box = {type="regular"}, -- See "Node boxes"
         connects_to = nodenames, --[[
@@ -3517,8 +3772,8 @@ Definition tables
             max_items = 1,  -- Maximum number of items to drop.
             items = { -- Choose max_items randomly from this list.
                 {
-                    items = {"foo:bar", "baz:frob"},  -- Choose one item randomly from this list.
-                    rarity = 1,  -- Probability of getting is 1 / rarity.
+                    items = {"foo:bar", "baz:frob"},  -- Items to drop.
+                    rarity = 1,  -- Probability of dropping is 1 / rarity.
                 },
             },
         },
@@ -3690,6 +3945,9 @@ Definition tables
 
 ### Biome definition (`register_biome`)
 
+**Note**
+The Biome API is still in an experimental phase and subject to change.
+
     {
         name = "tundra",
         node_dust = "default:snow",
@@ -3709,6 +3967,9 @@ Definition tables
     --  ^ Node that replaces all seawater nodes not in the defined surface layer.
         node_river_water = "default:ice",
     --  ^ Node that replaces river water in mapgens that use default:river_water.
+        node_riverbed = "default:gravel",
+        depth_riverbed = 2,
+    --  ^ Node placed under river water and thickness of this layer.
         y_min = 1,
         y_max = 31000,
     --  ^ Lower and upper limits for biome.
@@ -3738,7 +3999,7 @@ Definition tables
     {
         deco_type = "simple", -- See "Decoration types"
         place_on = "default:dirt_with_grass",
-    --  ^ Node that decoration can be placed on
+    --  ^ Node (or list of nodes) that the decoration can be placed on
         sidelen = 8,
     --  ^ Size of divisions made in the chunk being generated.
     --  ^ If the chunk size is not evenly divisible by sidelen, sidelen is made equal to the chunk size.
@@ -3757,6 +4018,13 @@ Definition tables
     -- ^ Minimum and maximum `y` positions these decorations can be generated at.
     -- ^ This parameter refers to the `y` position of the decoration base, so
     --   the actual maximum height would be `height_max + size.Y`.
+        spawn_by = "default:water",
+    --  ^ Node (or list of nodes) that the decoration only spawns next to.
+    --  ^ Checks two horizontal planes of neighbouring nodes (including diagonal neighbours),
+    --  ^ one plane at Y = surface and one plane at Y = surface = + 1.
+        num_spawn_by = 1,
+    --  ^ Number of spawn_by nodes that must be surrounding the decoration position to occur.
+    --  ^ If absent or -1, decorations occur next to any nodes.
         flags = "liquid_surface, force_placement",
     --  ^ Flags for all decoration types.
     --  ^ "liquid_surface": Instead of placement on the highest solid surface
@@ -3772,15 +4040,10 @@ Definition tables
     --  ^ Number of nodes high the decoration is made.
     --  ^ If height_max is not 0, this is the lower bound of the randomly selected height.
         height_max = 0,
-    --      ^ Number of nodes the decoration can be at maximum.
+    --  ^ Number of nodes the decoration can be at maximum.
     --  ^ If absent, the parameter 'height' is used as a constant.
-        spawn_by = "default:water",
-    --  ^ Node that the decoration only spawns next to.
-    --  ^ The neighbours checked are the 8 nodes horizontally surrounding the lowest node of the
-    --  ^ decoration, and the 8 nodes horizontally surrounding the ground node below the decoration.
-        num_spawn_by = 1,
-    --  ^ Number of spawn_by nodes that must be surrounding the decoration position to occur.
-    --  ^ If absent or -1, decorations occur next to any nodes.
+        param2 = 0,
+    --  ^ Param2 value of placed decoration node.
 
         ----- Schematic-type parameters
         schematic = "foobar.mts",
@@ -3881,6 +4144,9 @@ Definition tables
         size = 1,
         collisiondetection = false,
     --  ^ collisiondetection: if true collides with physical objects
+        collision_removal = false,
+    --  ^ collision_removal: if true then particle is removed when it collides,
+    --  ^ requires collisiondetection = true to have any effect
         vertical = false,
     --  ^ vertical: if true faces player using y axis only
         texture = "image.png",
@@ -3910,6 +4176,12 @@ Definition tables
     --  ^ minsize/maxsize, minexptime/maxexptime (expirationtime)
         collisiondetection = false,
     --  ^ collisiondetection: if true uses collision detection
+        collision_removal = false,
+    --  ^ collision_removal: if true then particle is removed when it collides,
+    --  ^ requires collisiondetection = true to have any effect
+        attached = ObjectRef,
+    --  ^ attached: if defined, particle positions, velocities and accelerations
+    --  ^ are relative to this object's position and yaw.
         vertical = false,
     --  ^ vertical: if true faces player using y axis only
         texture = "image.png",
@@ -3918,7 +4190,7 @@ Definition tables
     --  ^ Playername is optional, if specified spawns particle only on the player's client
     }
 
-### `HTTPRequest` definition (`http_fetch`, `http_fetch_async`)
+### `HTTPRequest` definition (`HTTPApiTable.fetch_async`, `HTTPApiTable.fetch_async`)
 
     {
         url = "http://example.org",
@@ -3938,7 +4210,7 @@ Definition tables
      -- ^ Optional, if true performs a multipart HTTP request. Default is false.
     }
 
-### `HTTPRequestResult` definition (`http_fetch` callback, `http_fetch_async_get`)
+### `HTTPRequestResult` definition (`HTTPApiTable.fetch` callback, `HTTPApiTable.fetch_async_get`)
 
     {
         completed = true,
diff --git a/doc/menu_lua_api.txt b/doc/menu_lua_api.txt
index ac8713a..423b8bb 100644
--- a/doc/menu_lua_api.txt
+++ b/doc/menu_lua_api.txt
@@ -1,4 +1,4 @@
-Minetest Lua Mainmenu API Reference 0.4.14
+Minetest Lua Mainmenu API Reference 0.4.15
 ========================================
 
 Introduction
@@ -210,6 +210,10 @@ string:trim()
 ^ eg. string.trim("\n \t\tfoo bar\t ") == "foo bar"
 core.is_yes(arg) (possible in async calls)
 ^ returns whether arg can be interpreted as yes
+minetest.encode_base64(string) (possible in async calls)
+^ Encodes a string in base64.
+minetest.decode_base64(string) (possible in async calls)
+^ Decodes a string encoded in base64.
 
 Version compat:
 core.get_min_supp_proto()
diff --git a/doc/old/ancient_main_comment.txt b/doc/old/ancient_main_comment.txt
deleted file mode 100644
index d7b0e30..0000000
--- a/doc/old/ancient_main_comment.txt
+++ /dev/null
@@ -1,345 +0,0 @@
-------------------------------------------------------------------
-The ancient comment from the beginning of main.cpp is stored here.
-------------------------------------------------------------------
-
-/*
-=============================== NOTES ==============================
-NOTE: Things starting with TODO are sometimes only suggestions.
-
-NOTE: iostream.imbue(std::locale("C")) is very slow
-NOTE: Global locale is now set at initialization
-
-NOTE: If VBO (EHM_STATIC) is used, remember to explicitly free the
-      hardware buffer (it is not freed automatically)
-
-NOTE: A random to-do list saved here as documentation:
-A list of "active blocks" in which stuff happens. (+=done)
-	+ Add a never-resetted game timer to the server
-	+ Add a timestamp value to blocks
-	+ The simple rule: All blocks near some player are "active"
-	- Do stuff in real time in active blocks
-		+ Handle objects
-		- Grow grass, delete leaves without a tree
-		- Spawn some mobs based on some rules
-		- Transform cobble to mossy cobble near water
-		- Run a custom script
-		- ...And all kinds of other dynamic stuff
-	+ Keep track of when a block becomes active and becomes inactive
-	+ When a block goes inactive:
-		+ Store objects statically to block
-		+ Store timer value as the timestamp
-	+ When a block goes active:
-		+ Create active objects out of static objects
-		- Simulate the results of what would have happened if it would have
-		  been active for all the time
-		  	- Grow a lot of grass and so on
-	+ Initially it is fine to send information about every active object
-	  to every player. Eventually it should be modified to only send info
-	  about the nearest ones.
-	  	+ This was left to be done by the old system and it sends only the
-		  nearest ones.
-
-NOTE: Seeds in 1260:6c77e7dbfd29:
-5721858502589302589:
-	Spawns you on a small sand island with a surface dungeon
-2983455799928051958:
-	Enormous jungle + a surface dungeon at ~(250,0,0)
-
-Old, wild and random suggestions that probably won't be done:
--------------------------------------------------------------
-
-SUGG: If player is on ground, mainly fetch ground-level blocks
-
-SUGG: Expose Connection's seqnums and ACKs to server and client.
-      - This enables saving many packets and making a faster connection
-	  - This also enables server to check if client has received the
-	    most recent block sent, for example.
-SUGG: Add a sane bandwidth throttling system to Connection
-
-SUGG: More fine-grained control of client's dumping of blocks from
-      memory
-	  - ...What does this mean in the first place?
-
-SUGG: A map editing mode (similar to dedicated server mode)
-
-SUGG: Transfer more blocks in a single packet
-SUGG: A blockdata combiner class, to which blocks are added and at
-      destruction it sends all the stuff in as few packets as possible.
-SUGG: Make a PACKET_COMBINED which contains many subpackets. Utilize
-      it by sending more stuff in a single packet.
-	  - Add a packet queue to RemoteClient, from which packets will be
-	    combined with object data packets
-		- This is not exactly trivial: the object data packets are
-		  sometimes very big by themselves
-	  - This might not give much network performance gain though.
-
-SUGG: Precalculate lighting translation table at runtime (at startup)
-      - This is not doable because it is currently hand-made and not
-	    based on some mathematical function.
-		- Note: This has been changing lately
-
-SUGG: A version number to blocks, which increments when the block is
-      modified (node add/remove, water update, lighting update)
-	  - This can then be used to make sure the most recent version of
-	    a block has been sent to client, for example
-
-SUGG: Make the amount of blocks sending to client and the total
-	  amount of blocks dynamically limited. Transferring blocks is the
-	  main network eater of this system, so it is the one that has
-	  to be throttled so that RTTs stay low.
-
-SUGG: Meshes of blocks could be split into 6 meshes facing into
-      different directions and then only those drawn that need to be
-
-SUGG: Background music based on cellular automata?
-      http://www.earslap.com/projectslab/otomata
-
-SUGG: Simple light color information to air
-
-SUGG: Server-side objects could be moved based on nodes to enable very
-      lightweight operation and simple AI
-	- Not practical; client would still need to show smooth movement.
-
-SUGG: Make a system for pregenerating quick information for mapblocks, so
-	  that the client can show them as cubes before they are actually sent
-	  or even generated.
-
-SUGG: Erosion simulation at map generation time
-    - This might be plausible if larger areas of map were pregenerated
-	  without lighting (which is slow)
-	- Simulate water flows, which would carve out dirt fast and
-	  then turn stone into gravel and sand and relocate it.
-	- How about relocating minerals, too? Coal and gold in
-	  downstream sand and gravel would be kind of cool
-	  - This would need a better way of handling minerals, mainly
-		to have mineral content as a separate field. the first
-		parameter field is free for this.
-	- Simulate rock falling from cliffs when water has removed
-	  enough solid rock from the bottom
-
-SUGG: For non-mapgen FarMesh: Add a per-sector database to store surface
-      stuff as simple flags/values
-      - Light?
-	  - A building?
-	  And at some point make the server send this data to the client too,
-	  instead of referring to the noise functions
-	  - Ground height
-	  - Surface ground type
-	  - Trees?
-
-Gaming ideas:
--------------
-
-- Aim for something like controlling a single dwarf in Dwarf Fortress
-- The player could go faster by a crafting a boat, or riding an animal
-- Random NPC traders. what else?
-
-Game content:
--------------
-
-- When furnace is destroyed, move items to player's inventory
-- Add lots of stuff
-- Glass blocks
-- Growing grass, decaying leaves
-	- This can be done in the active blocks I guess.
-	- Lots of stuff can be done in the active blocks.
-	- Uh, is there an active block list somewhere? I think not. Add it.
-- Breaking weak structures
-	- This can probably be accomplished in the same way as grass
-- Player health points
-	- When player dies, throw items on map (needs better item-on-map
-	  implementation)
-- Cobble to get mossy if near water
-- More slots in furnace source list, so that multiple ingredients
-  are possible.
-- Keys to chests?
-
-- The Treasure Guard; a big monster with a hammer
-	- The hammer does great damage, shakes the ground and removes a block
-	- You can drop on top of it, and have some time to attack there
-	  before he shakes you off
-
-- Maybe the difficulty could come from monsters getting tougher in
-  far-away places, and the player starting to need something from
-  there when time goes by.
-  - The player would have some of that stuff at the beginning, and
-    would need new supplies of it when it runs out
-
-- A bomb
-- A spread-items-on-map routine for the bomb, and for dying players
-
-- Fighting:
-  - Proper sword swing simulation
-  - Player should get damage from colliding to a wall at high speed
-
-Documentation:
---------------
-
-Build system / running:
------------------------
-
-Networking and serialization:
------------------------------
-
-SUGG: Fix address to be ipv6 compatible
-
-User Interface:
----------------
-
-Graphics:
----------
-
-SUGG: Combine MapBlock's face caches to so big pieces that VBO
-      can be used
-      - That is >500 vertices
-	  - This is not easy; all the MapBlocks close to the player would
-	    still need to be drawn separately and combining the blocks
-		would have to happen in a background thread
-
-SUGG: Make fetching sector's blocks more efficient when rendering
-      sectors that have very large amounts of blocks (on client)
-	  - Is this necessary at all?
-
-SUGG: Draw cubes in inventory directly with 3D drawing commands, so that
-      animating them is easier.
-
-SUGG: Option for enabling proper alpha channel for textures
-
-TODO: Flowing water animation
-
-TODO: A setting for enabling bilinear filtering for textures
-
-TODO: Better control of draw_control.wanted_max_blocks
-
-TODO: Further investigate the use of GPU lighting in addition to the
-      current one
-
-TODO: Artificial (night) light could be more yellow colored than sunlight.
-      - This is technically doable.
-	  - Also the actual colors of the textures could be made less colorful
-	    in the dark but it's a bit more difficult.
-
-SUGG: Somehow make the night less colorful
-
-TODO: Occlusion culling
-      - At the same time, move some of the renderMap() block choosing code
-        to the same place as where the new culling happens.
-      - Shoot some rays per frame and when ready, make a new list of
-	    blocks for usage of renderMap and give it a new pointer to it.
-
-Configuration:
---------------
-
-Client:
--------
-
-TODO: Untie client network operations from framerate
-      - Needs some input queues or something
-	  - This won't give much performance boost because calculating block
-	    meshes takes so long
-
-SUGG: Make morning and evening transition more smooth and maybe shorter
-
-TODO: Don't update all meshes always on single node changes, but
-      check which ones should be updated
-	  - implement Map::updateNodeMeshes() and the usage of it
-	  - It will give almost always a 4x boost in mesh update performance.
-
-- A weapon engine
-
-- Tool/weapon visualization
-
-FIXME: When disconnected to the menu, memory is not freed properly
-
-TODO: Investigate how much the mesh generator thread gets used when
-      transferring map data
-
-Server:
--------
-
-SUGG: Make an option to the server to disable building and digging near
-      the starting position
-
-FIXME: Server sometimes goes into some infinite PeerNotFoundException loop
-
-* Fix the problem with the server constantly saving one or a few
-  blocks? List the first saved block, maybe it explains.
-  - It is probably caused by oscillating water
-  - TODO: Investigate if this still happens (this is a very old one)
-* Make a small history check to transformLiquids to detect and log
-  continuous oscillations, in such detail that they can be fixed.
-
-FIXME: The new optimized map sending doesn't sometimes send enough blocks
-       from big caves and such
-FIXME: Block send distance configuration does not take effect for some reason
-
-Environment:
-------------
-
-TODO: Add proper hooks to when adding and removing active blocks
-
-TODO: Finish the ActiveBlockModifier stuff and use it for something
-
-Objects:
---------
-
-TODO: Get rid of MapBlockObjects and use only ActiveObjects
-	- Skipping the MapBlockObject data is nasty - there is no "total
-	  length" stored; have to make a SkipMBOs function which contains
-	  enough of the current code to skip them properly.
-
-SUGG: MovingObject::move and Player::move are basically the same.
-      combine them.
-	- NOTE: This is a bit tricky because player has the sneaking ability
-	- NOTE: Player::move is more up-to-date.
-	- NOTE: There is a simple move implementation now in collision.{h,cpp}
-	- NOTE: MovingObject will be deleted (MapBlockObject)
-
-TODO: Add a long step function to objects that is called with the time
-      difference when block activates
-
-Map:
-----
-
-TODO: Flowing water to actually contain flow direction information
-      - There is a space for this - it just has to be implemented.
-
-TODO: Consider smoothening cave floors after generating them
-
-TODO: Fix make_tree, make_* to use seed-position-consistent pseudorandom
-	  - delta also
-
-Misc. stuff:
-------------
-TODO: Make sure server handles removing grass when a block is placed (etc)
-      - The client should not do it by itself
-	  - NOTE: I think nobody does it currently...
-TODO: Block cube placement around player's head
-TODO: Protocol version field
-TODO: Think about using same bits for material for fences and doors, for
-	  example
-
-SUGG: Restart irrlicht completely when coming back to main menu from game.
-	- This gets rid of everything that is stored in irrlicht's caches.
-	- This might be needed for texture pack selection in menu
-
-TODO: Merge bahamada's audio stuff (clean patch available)
-
-Making it more portable:
-------------------------
- 
-Stuff to do before release:
----------------------------
-
-Fixes to the current release:
------------------------------
-
-Stuff to do after release:
----------------------------
-
-Doing currently:
-----------------
-
-======================================================================
-
-*/
diff --git a/doc/old/changelog.txt b/doc/old/changelog.txt
deleted file mode 100644
index 1750d71..0000000
--- a/doc/old/changelog.txt
+++ /dev/null
@@ -1,147 +0,0 @@
-Minetest changelog
-----------------------
-This should contain all the major changes.
-For minor stuff, refer to the commit log of the repository.
-
-0.3.1: (released on 2011-11-09)
-- Fix frustum culling (previous versions have rendered too much stuff that is not actually visible (about 180 degrees, while should have been more like 100.))
-- Add occlusion culling (improves performance a lot)
-- Add “3d clouds” on/off checkbox in main menu
-- Add “opaque water” on/off checkbox
-- Fix some random minor stuff
-- Turn mipmapping off (This makes far-away textures a bit noisier but better looking)
-- Add Command-line signal handler for Windows (contributed by SpeedProg)
-- Fix network layer segmentation fault introduced in 0.3.dev-20111021
-- Fix water-glass and water-lava and lava-glass surfaces
-
-0.3.0: (released on 2011-11-01)
-- Some small fixes
-0.3.dev-20111021:
-- Modify dungeon masters to only try to shoot players
-- Fix object duplication bug at block load/unload bug
-- Improve network layer
-0.3.dev-20111016:
-- Locked chest (contributed)
-- Server user limit setting (max_users)
-- Wielded tool is shown in HUD (contributed)
-- View bobbing (contributed)
-- Saplings that drop from leaf blocks and when placed on ground will grow to trees (contributed)
-- Optimized map saving (does not re-save everything all the time)
-- New mob system and new mob: dungeon master
-- Death/respawn screen
-
-0.2.20110922_3:
-- Fix the build for MSVC2010; also released for windows using MSVC2010.
-
-0.2.20110922_1:
-- Make client report a newer version number to the server than 2011-07-31 does and make server disallow old clients
-
-0.2.20110922:
-- Map is saved in an SQLite database file (by Queatz)
-- Ladders (MarkTraceur)
-- Lava
-- Apple trees (sfan5)
-- Slightly better looking inventory with transparency
-- /me chat command (Oblomov)
-- Using chosen map seed possible through fixed_map_seed configuration option (kahrl)
-- Fix the long-existed PeerNotFound loop bug
-- Some translations and localization-related fixes
-- Lots of small fixes
-
-2011-07-31_3:
-- Fixes a bug that made the server to deny non-empty passwords from players connecting the first time
-
-2011-07-31_2:
-- Fixes a bug that caused the server to always read an empty password from the client when a client connected.
-
-2011-07-31:
-- A number of small fixes, build system stuff and such (refer to version control log)
-- Map generator no longer crashes at generation limit
-- Fixed mapgen producing lots of cut-down trees
-- Some minor tweaks in map generator (some contributed)
-- Volumetric clouds (contributed)
-- Icon added (graphic contributed)
-- Key configuration menu (contributed)
-- Decorative blocks and items: bookshelf, sandstone, cactus, clay, brick, papyrus, rail, paper, book (contributed)
-- Jungles!
-- Hotbar is a bit smaller
-- Health is now enabled by default; You can now eat cooked rats to heal yourself.
-- Finally added sword textures, altough sword is still of no use
-- Creative mode now preserves normal mode inventory
-
-2011-07-04:
-- Many small fixes
-- Code reorganizing to aid further development
-- Renewed map generator
-
-2011-06-02:
-- Password crash on windows fixed
-- Optimized server CPU usage a lot
-- Furnaces now work also while players are not near to them
-
-2011-05-29:
-- Optimized smooth lighting
-- A number of small fixes
-- Added clouds and simple skyboxes
-- The glass block added
-- Added key configuration to config file
-- Player privileges on server
-- Slightly updated map format
-- Player passwords
-- All textures first searched from texture_path
-- Map directory ("map") has been renamed to "world" (just rename it to load an old world)
-- Mouse inversion (invert_mouse)
-- Grass doesn't grow immediately anymore
-- Fence added
-
-2011-04-24:
-- Smooth lighting with simple ambient occlusion
-- Updated main menu
-
-2011-04-23_0_test:
-- Small bug fixes
-- Item drop multiplication fixed
-- HP added
-- Added A simple monster which spawns to dark places at map generation time
-- Some code refactoring and cleaning (possibly new bugs)
-
-2011-04-11:
-- Fixed crafting a bit
-
-2011-04-10_0:
-- Asynchronous map generation
-- New object system
-
-2011-04-06:
-- Mesh update of node addition/removal is now done asynchronously on client, removing frametime spike
-- Node addition/removal is sent directly only to clients that are closer than 100 nodes to the modification. For the others, the modified blocks are set unsent. (and are re-sent when applicable)
-
-2011-04-05:
-- Made furnace usable
-- Added cobblestone
-- Added wood, stone and steel tools: pickaxes, shovels and axes
-- Incremented to version 0.0.2
-
-2011-04-04:
-- Cleaned client to be completely synchronous, except for the mesh calculation, which is now done with queues in a separate thread.
-- Added node metadata support
-- Added chests
-
-2011-02-17:
-- Added better handling of textures. Now many file extensions are searched. Also too large textures are not put on the texture atlas, and the construction of the texture atlas is stopped when it is full.
-
-2011-02-16:
-- Better handling of Ctrl-C on POSIX systems
-
-2011-02-15:
-- Fixed a problem of not saving and loading the "lighting expired" value of MapBlocks properly. This caused high server CPU usage.
-- Ctrl-C handling on POSIX systems
-- Added simple command support to server
-- Added settings enable_texture_atlas and texture_path
-
-2011-02-14:
-- Created changelog.txt
-- Added sneaking/crouching
-- Modified the looks of the hotbar and cleaned code
-- Added code to allow generating 3D cube images for inventory
-
diff --git a/doc/texture_overrides.txt b/doc/texture_overrides.txt
deleted file mode 100644
index 1a4e11a..0000000
--- a/doc/texture_overrides.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-Texture Overrides
-=================
-
-You can override the textures of a node from a texture pack using
-texture overrides. To do this, create a file in a texture pack
-called override.txt
-
-Basic Format
-------------
-
-Each line in an override.txt file is a rule. It consists of
-
-	nodename face-selector texture
-
-For example,
-
-	default:dirt_with_grass sides default_stone.png
-
-You can use ^ operators as usual:
-
-	default:dirt_with_grass sides default_stone.png^[brighten
-
-Face Selectors
---------------
-
-| face-selector | behavior                                          |
-|---------------|---------------------------------------------------|
-| left          | x-                                                |
-| right         | x+                                                |
-| front         | z-                                                |
-| back          | z+                                                |
-| top           | y+                                                |
-| bottom        | y-                                                |
-| sides         | x-, x+, z-, z+                                    |
-| all           | All faces. You can also use '*' instead of 'all'. |
diff --git a/doc/texture_packs.txt b/doc/texture_packs.txt
new file mode 100644
index 0000000..5c535a9
--- /dev/null
+++ b/doc/texture_packs.txt
@@ -0,0 +1,158 @@
+Minetest Texture Pack Reference
+===============================
+
+Texture packs allow you to replace textures provided by a mod with your own
+textures.
+
+Texture pack directory structure
+--------------------------------
+
+    textures
+    |-- Texture Pack
+    |   |-- screenshot.png
+    |   |-- description.txt
+    |   |-- override.txt
+    |   |-- your_texture_1.png
+    |   |-- your_texture_2.png
+    `-- Another Texture Pack
+
+### Texture Pack
+This is a directory containing the entire contents of a single texture pack.
+It can be chosen more or less freely and will also become the name of the
+texture pack. The name must not be “base”.
+
+### `description.txt`
+A file containing a short description of the texture pack to be shown in the
+texture packs tab.
+
+### `screenshot.png`
+A preview image showing an in-game screenshot of this texture pack; it will be
+shown in the texture packs tab. It should have an aspect ratio of 3:2 and a
+minimum size of 300×200 pixels.
+
+### `your_texture_1.png`, `your_texture_2.png`, etc.
+Any other PNG files will be interpreted as textures. They must have the same
+names as the textures they are supposed to override. For example, to override
+the apple texture of Minetest Game, add a PNG file named `default_apple.png`.
+
+The custom textures do not necceessarily require the same size as their
+originals, but this might be required for a few particular textures. When
+unsure, just test your texture pack in-game.
+
+Texture modifiers
+-----------------
+
+See lua_api.txt for texture modifiers
+
+Special textures
+----------------
+
+These texture names are hardcoded into the engine but can also be overwritten
+by texture packs. All existing fallback textures can be found in the directory
+`textures/base/pack`.
+
+### Gameplay textures
+
+* `bubble.png`: the bubble texture when the player is drowning
+
+* `crack_anylength.png`: node overlay texture when digging
+
+* `crosshair.png`
+    * the crosshair texture in the center of the screen. The settings
+      `crosshair_color` and `crosshair_alpha` are used to create a cross
+      when no texture was found
+
+* `halo.png`: used for the node highlighting mesh
+
+* `heart.png`: used to display the health points of the player
+
+* `minimap_mask_round.png`: round minimap mask, white gets replaced by the map
+* `minimap_mask_square.png`: mask used for the square minimap
+* `minimap_overlay_round.png`: overlay texture for the round minimap
+* `minimap_overlay_square.png`: overlay texture for the square minimap
+* `object_marker_red.png`: texture for players on the minimap
+* `player_marker.png`: texture for the own player on the square minimap
+
+* `player.png`: front texture of the 2D upright sprite player
+* `player_back.png`: back texture of the 2D upright sprite player
+
+* `moon.png`: texture of the moon. Default texture is generated by Minetest
+* `moon_tonemap.png`: tonemap to be used when `moon.png` was found
+* `sun.png`: texture of the sun. Default texture is generated by Minetest
+* `sun_tonemap.png`: tonemap to be used when `sun.png` was found
+* `sunrisebg.png`: shown sky texture when the sun rises
+
+* `smoke_puff.png`: texture used when an object died by punching
+
+* `unknown_item.png`: shown texture when an item definition was not found
+* `unknown_node.png`: shown texture when a node definition was not found
+* `unknown_object.png`: shown texture when an entity definition was not found
+
+* `wieldhand.png`: texture of the wieldhand
+
+### Mainmenu textures
+
+* `menu_bg.png`: used as mainmenu background when the clouds are disabled
+* `menu_header.png`: header texture when no texture pack is selected
+
+* `no_screenshot.png`
+    * texture when no screenshot was found for a texture pack or mod
+
+* `server_flags_creative.png`: icon for creative servers
+* `server_flags_damage.png`: icon for enabled damage on servers
+* `server_flags_favorite.png`: icon for your favorite servers
+* `server_flags_pvp.png`: icon for enabled PvP on servers
+
+### Android textures
+
+* `down_arrow.png`
+* `left_arrow.png`
+* `right_arrow.png`
+* `up_arrow.png`
+
+* `drop_btn.png`
+* `fast_btn.png`
+* `fly_btn.png`
+* `jump_btn.png`
+* `noclip_btn.png`
+
+* `camera_btn.png`
+* `chat_btn.png`
+* `inventory_btn.png`
+* `rangeview_btn.png`
+
+* `debug_btn.png`
+* `gear_icon.png`
+* `rare_controls.png`
+
+Texture Overrides
+-----------------
+
+You can override the textures of a node from a texture pack using
+texture overrides. To do this, create a file in a texture pack
+called override.txt
+
+Each line in an override.txt file is a rule. It consists of
+
+	nodename face-selector texture
+
+For example,
+
+	default:dirt_with_grass sides default_stone.png
+
+You can use ^ operators as usual:
+
+	default:dirt_with_grass sides default_stone.png^[brighten
+
+Here are face selectors you can choose from:
+
+| face-selector | behavior                                          |
+|---------------|---------------------------------------------------|
+| left          | x-                                                |
+| right         | x+                                                |
+| front         | z-                                                |
+| back          | z+                                                |
+| top           | y+                                                |
+| bottom        | y-                                                |
+| sides         | x-, x+, z-, z+                                    |
+| all           | All faces. You can also use '*' instead of 'all'. |
diff --git a/games/minetest_game/.gitignore b/games/minetest_game/.gitignore
index 717f5fe..ef02689 100644
--- a/games/minetest_game/.gitignore
+++ b/games/minetest_game/.gitignore
@@ -1,9 +1,22 @@
-## Generic ignorable patterns and files
+## Files related to minetest development cycle
+/*.patch
+# GNU Patch reject file
+*.rej
+
+## Editors and Development environments
 *~
-.*.swp
-*bak*
-tags
+*.swp
+*.bak*
+*.orig
+# Vim
 *.vim
-
-## Files related to minetest development cycle
-*.patch
+# Kate
+.*.kate-swp
+.swp.*
+# Eclipse (LDT)
+.project
+.settings/
+.buildpath
+.metadata
+# Idea IDE
+.idea/*
diff --git a/games/minetest_game/.luacheckrc b/games/minetest_game/.luacheckrc
new file mode 100644
index 0000000..52b2513
--- /dev/null
+++ b/games/minetest_game/.luacheckrc
@@ -0,0 +1,17 @@
+unused_args = false
+allow_defined_top = true
+
+read_globals = {
+	"DIR_DELIM",
+	"minetest", "core",
+	"dump",
+	"vector",
+	"VoxelManip", "VoxelArea",
+	"PseudoRandom", "ItemStack",
+}
+
+-- Overwrites minetest.handle_node_drops
+files["mods/creative/init.lua"].globals = { "minetest" }
+
+-- Don't report on legacy definitions of globals.
+files["mods/default/legacy.lua"].global = false
diff --git a/games/minetest_game/.travis.yml b/games/minetest_game/.travis.yml
new file mode 100644
index 0000000..5253938
--- /dev/null
+++ b/games/minetest_game/.travis.yml
@@ -0,0 +1,12 @@
+language: generic
+sudo: false
+addons:
+  apt:
+    packages:
+    - luarocks
+before_install:
+  - luarocks install --local luacheck
+script: 
+- $HOME/.luarocks/bin/luacheck --no-color ./mods
+notifications:
+  email: false
diff --git a/games/minetest_game/game_api.txt b/games/minetest_game/game_api.txt
index 634b7f2..38718c3 100644
--- a/games/minetest_game/game_api.txt
+++ b/games/minetest_game/game_api.txt
@@ -12,22 +12,28 @@ Please note:
 
  * [XYZ] refers to a section the Minetest API
  * [#ABC] refers to a section in this document
+ * [pos] refers to a position table `{x = -5, y = 0, z = 200}`
 
 Bucket API
 ----------
 
 The bucket API allows registering new types of buckets for non-default liquids.
 
-
 	bucket.register_liquid(
 		"default:lava_source",   -- name of the source node
 		"default:lava_flowing",  -- name of the flowing node
 		"bucket:bucket_lava",    -- name of the new bucket item (or nil if liquid is not takeable)
 		"bucket_lava.png",       -- texture of the new bucket item (ignored if itemname == nil)
 		"Lava Bucket",           -- text description of the bucket item
-		{lava_bucket = 1}        -- groups of the bucket item, OPTIONAL
+		{lava_bucket = 1},       -- groups of the bucket item, OPTIONAL
+		false                    -- force-renew, OPTIONAL. Force the liquid source to renew if it has
+		                         -- a source neighbour, even if defined as 'liquid_renewable = false'.
+		                         -- Needed to avoid creating holes in sloping rivers.
 	)
 
+The filled bucket item is returned to the player that uses an empty bucket pointing to the given liquid source.
+When punching with an empty bucket pointing to an entity or a non-liquid node, the on_punch of the entity or node will be triggered.
+
 Beds API
 --------
 
@@ -61,6 +67,21 @@ Beds API
 		}
 	}
 
+Creative API
+------------
+
+Use `creative.register_tab(name, title, items)` to add a tab with filtered items.
+For example,
+
+	creative.register_tab("tools", "Tools", minetest.registered_tools)
+
+is used to show all tools. Name is used in the sfinv page name, title is the
+human readable title.
+
+The contents of `creative.formspec_add` is appended to every creative inventory
+page. Mods can use it to add additional formspec elements onto the default
+creative inventory formspec to be drawn after each update.
+
 Doors API
 ---------
 
@@ -177,6 +198,9 @@ The farming API allows you to easily register plants and hoes.
 `farming.register_plant(name, Plant definition)`
  * Register a new growing plant, see [#Plant definition]
 
+`farming.registered_plants[name] = definition`
+ * Table of registered plants, indexed by plant name
+
 ### Hoe Definition
 
 
@@ -213,6 +237,14 @@ New node def property:
  * Called when fire attempts to remove a burning node.
  * `pos` Position of the burning node.
 
+ `on_ignite(pos, igniter)`
+
+  * Called when Flint and steel (or a mod defined ignitor) is used on a node.
+    Defining it may prevent the default action (spawning flames) from triggering.
+  * `pos` Position of the ignited node.
+  * `igniter` Player that used the tool, when available.
+
+
 Give Initial Stuff API
 ----------------------
 
@@ -244,6 +276,18 @@ Give Initial Stuff API
 ^ str is a comma separated list of initial stuff
 ^ Adds items to the list of items to be given
 
+Nyancat API
+-----------
+
+`nyancat.place(pos, facedir, length)`
+
+^ Place a cat at `pos` facing `facedir` with tail length `length`
+  Only accepts facedir 0-3, if facedir > 3 then it will be interpreted as facedir = 0
+
+`nyancat.generate(minp, maxp, seed)`
+
+^ Called by `minetest.register_on_generated`. To disable nyancat generation,
+  you can redefine nyancat.generate() to be an empty function
 
 TNT API
 ----------
@@ -272,9 +316,9 @@ TNT API
 * `position` The center of explosion.
 * `definition` The TNT definion as passed to `tnt.register`
 
-`tnt.burn(position)`
+`tnt.burn(position, [nodename])`
 
-^ Ignite TNT at position
+^ Ignite TNT at position, nodename isn't required unless already known.
 
 
 To make dropping items from node inventories easier, you can use the
@@ -330,9 +374,127 @@ To use it, add the `on_screwdriver` function to the node definition.
  * `new_param2` the new value of param2 that would have been set if on_rotate wasn't there
  * return value: false to disallow rotation, nil to keep default behaviour, true to allow
  	it but to indicate that changed have already been made (so the screwdriver will wear out)
- * use `on_rotate = screwdriver.disallow` to always disallow rotation
+ * use `on_rotate = false` to always disallow rotation
  * use `on_rotate = screwdriver.rotate_simple` to allow only face rotation
 
+
+Sethome API
+-----------
+
+The sethome API adds three global functions to allow mods to read a players home position,
+set a players home position and teleport a player to home position.
+
+`sethome.get(name)`
+
+ * `name` Player who's home position you wish to get
+ * return value: false if no player home coords exist, position table if true
+
+`sethome.set(name, pos)`
+
+ * `name` Player who's home position you wish to set
+ * `pos` Position table containing coords of home position
+ * return value: false if unable to set and save new home position, otherwise true
+
+`sethome.go(name)`
+
+ * `name` Player you wish to teleport to their home position
+ * return value: false if player cannot be sent home, otherwise true
+
+
+Sfinv API
+---------
+
+### sfinv Methods
+
+* sfinv.set_player_inventory_formspec(player, context) - builds page formspec
+            and calls set_inventory_formspec().
+            If context is nil, it is either found or created.
+* sfinv.get_formspec(player, context) - builds current page's formspec
+* sfinv.get_nav_fs(player, context, nav, current_idx) - see above
+* sfinv.get_homepage_name(player) - get the page name of the first page to show to a player
+* sfinv.make_formspec(player, context, content, show_inv, size) - adds a theme to a formspec
+    * show_inv, defaults to false. Whether to show the player's main inventory
+    * size, defaults to `size[8,8.6]` if not specified
+* sfinv.register_page(name, def) - register a page, see section below
+* sfinv.override_page(name, def) - overrides fields of an page registered with register_page.
+    * Note: Page must already be defined, (opt)depend on the mod defining it.
+
+### sfinv Members
+
+* pages - table of pages[pagename] = def
+* pages_unordered - array table of pages in order of addition (used to build navigation tabs).
+* contexts - contexts[playername] = player_context
+* enabled - set to false to disable. Good for inventory rehaul mods like unified inventory
+
+### Context
+
+A table with these keys:
+
+* page - current page name
+* nav - a list of page names
+* nav_titles - a list of page titles
+* nav_idx - current nav index (in nav and nav_titles)
+* any thing you want to store
+    * sfinv will clear the stored data on log out / log in
+
+### sfinv.register_page
+
+sfinv.register_page(name, def)
+
+def is a table containing:
+
+* `title` - human readable page name (required)
+* `get(self, player, context)` - returns a formspec string. See formspec variables. (required)
+* `is_in_nav(self, player, context)` - return true to show in the navigation (the tab header, by default)
+* `on_player_receive_fields(self, player, context, fields)` - on formspec submit.
+* `on_enter(self, player, context)` - called when the player changes pages, usually using the tabs.
+* `on_leave(self, player, context)` - when leaving this page to go to another, called before other's on_enter
+
+### get formspec
+
+Use sfinv.make_formspec to apply a layout:
+
+	return sfinv.make_formspec(player, context, [[
+		list[current_player;craft;1.75,0.5;3,3;]
+		list[current_player;craftpreview;5.75,1.5;1,1;]
+		image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]
+		listring[current_player;main]
+		listring[current_player;craft]
+		image[0,4.25;1,1;gui_hb_bg.png]
+		image[1,4.25;1,1;gui_hb_bg.png]
+		image[2,4.25;1,1;gui_hb_bg.png]
+		image[3,4.25;1,1;gui_hb_bg.png]
+		image[4,4.25;1,1;gui_hb_bg.png]
+		image[5,4.25;1,1;gui_hb_bg.png]
+		image[6,4.25;1,1;gui_hb_bg.png]
+		image[7,4.25;1,1;gui_hb_bg.png]
+	]], true)
+
+See above (methods section) for more options.
+
+### Customising themes
+
+Simply override this function to change the navigation:
+
+	function sfinv.get_nav_fs(player, context, nav, current_idx)
+		return "navformspec"
+	end
+
+And override this function to change the layout:
+
+	function sfinv.make_formspec(player, context, content, show_inv, size)
+		local tmp = {
+			size or "size[8,8.6]",
+			theme_main,
+			sfinv.get_nav_fs(player, context, context.nav_titles, context.nav_idx),
+			content
+		}
+		if show_inv then
+			tmp[4] = theme_inv
+		end
+		return table.concat(tmp, "")
+	end
+
 Stairs API
 ----------
 
@@ -343,7 +505,7 @@ delivered with Minetest Game, to keep them compatible with other mods.
 
  * Registers a stair.
  * `subname`: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname"
- * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble"
+ * `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil`
  * `groups`: see [Known damage and digging time defining groups]
  * `images`: see [Tile definition]
  * `description`: used for the description field in the stair's definition
@@ -379,7 +541,7 @@ Creates panes that automatically connect to each other
 ### Pane definition
 
 	{
-		textures = {"texture_Bottom_top", "texture_left_right", "texture_front_back"}, -- More tiles aren't supported
+		textures = {"texture for sides", (unused), "texture for top and bottom"}, -- More tiles aren't supported
 		groups = {group = rating}, -- Uses the known node groups, see [Known damage and digging time defining groups]
 		sounds = SoundSpec,        -- See [#Default sounds]
 		recipe = {{"","","","","","","","",""}}, -- Recipe field only
@@ -416,6 +578,7 @@ Sounds inside the default table can be used within the sounds field of node defi
  * `default.node_sound_wood_defaults()`
  * `default.node_sound_leaves_defaults()`
  * `default.node_sound_glass_defaults()`
+ * `default.node_sound_metal_defaults()`
 
 Default constants
 -----------------
@@ -591,3 +754,83 @@ Trees
 
  * `default.grow_new_snowy_pine_tree(pos)`
   * Grows a new design snowy pine tree at pos
+
+Carts
+-----
+
+	carts.register_rail(
+		"mycarts:myrail", -- Rail name
+		nodedef,          -- standard nodedef
+		railparams        -- rail parameter struct (optional)
+	)
+
+	railparams = {
+		on_step(obj, dtime), -- Event handler called when
+		                     -- cart is on rail
+		acceleration, -- integer acceleration factor (negative
+		              -- values to brake)
+	}
+
+	The event handler is called after all default calculations
+	are made, so the custom on_step handler can override things
+	like speed, acceleration, player attachment. The handler will
+	likely be called many times per second, so the function needs
+	to make sure that the event is handled properly.
+
+Key API
+-------
+
+The key API allows mods to add key functionality to nodes that have
+ownership or specific permissions. Using the API will make it so
+that a node owner can use skeleton keys on their nodes to create keys
+for that node in that location, and give that key to other players,
+allowing them some sort of access that they otherwise would not have
+due to node protection.
+
+To make your new nodes work with the key API, you need to register
+two callback functions in each nodedef:
+
+
+`on_key_use(pos, player)`
+ * Is called when a player right-clicks (uses) a normal key on your
+ * node.
+ * `pos` - position of the node
+ * `player` - PlayerRef
+ * return value: none, ignored
+
+The `on_key_use` callback should validate that the player is wielding
+a key item with the right key meta secret. If needed the code should
+deny access to the node functionality.
+
+If formspecs are used, the formspec callbacks should duplicate these
+checks in the metadata callback functions.
+
+
+`on_skeleton_key_use(pos, player, newsecret)`
+
+ * Is called when a player right-clicks (uses) a skeleton key on your
+ * node.
+ * `pos` - position of the node
+ * `player` - PlayerRef
+ * `newsecret` - a secret value(string)
+ * return values:
+ * `secret` - `nil` or the secret value that unlocks the door
+ * `name` - a string description of the node ("a locked chest")
+ * `owner` - name of the node owner
+
+The `on_skeleton_key_use` function should validate that the player has
+the right permissions to make a new key for the item. The newsecret
+value is useful if the node has no secret value. The function should
+store this secret value somewhere so that in the future it may compare
+key secrets and match them to allow access. If a node already has a
+secret value, the function should return that secret value instead
+of the newsecret value. The secret value stored for the node should
+not be overwritten, as this would invalidate existing keys.
+
+Aside from the secret value, the function should retun a descriptive
+name for the node and the owner name. The return values are all
+encoded in the key that will be given to the player in replacement
+for the wielded skeleton key.
+
+if `nil` is returned, it is assumed that the wielder did not have
+permissions to create a key for this node, and no key is created.
diff --git a/games/minetest_game/minetest.conf.example b/games/minetest_game/minetest.conf.example
index 813f195..3f20eb7 100644
--- a/games/minetest_game/minetest.conf.example
+++ b/games/minetest_game/minetest.conf.example
@@ -5,6 +5,12 @@
 # Whether creative mode (fast digging of all blocks, unlimited resources) should be enabled
 #creative_mode = false
 
+# Sets the behaviour of the inventory items when a player dies.
+#  "bones": Store all items inside a bone node but drop items if inside protected area
+#  "drop": Drop all items on the ground
+#  "keep": Player keeps all items
+#bones_mode = "bones"
+
 # The time in seconds after which the bones of a dead player can be looted by everyone
 # 0 to disable
 #share_bones_time = 1200
@@ -14,9 +20,12 @@
 # 0 to disable. By default it is "share_bones_time" divide by four.
 #share_bones_time_early = 300
 
-# Whether standard fire should be disabled ('basic flame' nodes will disappear)
-# 'permanent flame' nodes will remain with either setting
-#disable_fire = false
+# Whether fire should be enabled. If disabled, 'basic flame' nodes will disappear.
+# 'permanent flame' nodes will remain with either setting.
+#enable_fire = true
+
+# Enable flame sound.
+#flame_sound = true
 
 # Whether the stuff in initial_stuff should be given to new players
 #give_initial_stuff = false
diff --git a/games/minetest_game/mods/beds/README.txt b/games/minetest_game/mods/beds/README.txt
index 9710c45..cda6ebd 100644
--- a/games/minetest_game/mods/beds/README.txt
+++ b/games/minetest_game/mods/beds/README.txt
@@ -1,30 +1,26 @@
 Minetest Game mod: beds
 =======================
-by BlockMen (c) 2014-2015
+See license.txt for license information.
 
-Version: 1.1.1
+Authors of source code
+----------------------
+Originally by BlockMen (MIT)
+Various Minetest developers and contributors (MIT)
 
-About
-~~~~~
-This mod adds a bed to Minetest which allows to skip the night. To sleep rightclick the bed, if playing 
-in singleplayer mode the night gets skipped imideatly. If playing on server you get shown how many other
-players are in bed too. If all players are sleeping the night gets skipped aswell. Also the night skip can be forced
-if more than 50% of the players are lying in bed and use this option.
+Authors of media (textures)
+---------------------------
+BlockMen (CC BY-SA 3.0)
 
-Another feature is a controled respawning. If you have slept in bed (not just lying in it) your respawn point
-is set to the beds location and you will respawn there after death.
-You can disable the respawn at beds by setting "enable_bed_respawn = false" in minetest.conf
-You can also disable the night skip feature by setting "enable_bed_night_skip = false" in minetest.conf or by using
-the /set command ingame.
+This mod adds a bed to Minetest which allows to skip the night.
+To sleep, rightclick the bed. If playing in singleplayer mode the night gets skipped
+immediately. If playing multiplayer you get shown how many other players are in bed too,
+if all players are sleeping the night gets skipped. The night skip can be forced if more
+than 50% of the players are lying in bed and use this option.
 
-
-License of source code, textures: WTFPL
----------------------------------------
-(c) Copyright BlockMen (2014-2015)
-
-
-This program is free software. It comes without any warranty, to
-the extent permitted by applicable law. You can redistribute it
-and/or modify it under the terms of the Do What The Fuck You Want
-To Public License, Version 2, as published by Sam Hocevar. See
-http://sam.zoy.org/wtfpl/COPYING for more details.
+Another feature is a controlled respawning. If you have slept in bed (not just lying in
+it) your respawn point is set to the beds location and you will respawn there after
+death.
+You can disable the respawn at beds by setting "enable_bed_respawn = false" in
+minetest.conf.
+You can disable the night skip feature by setting "enable_bed_night_skip = false" in
+minetest.conf or by using the /set command in-game.
diff --git a/games/minetest_game/mods/beds/api.lua b/games/minetest_game/mods/beds/api.lua
index 53d4e48..3b2bb0d 100644
--- a/games/minetest_game/mods/beds/api.lua
+++ b/games/minetest_game/mods/beds/api.lua
@@ -16,7 +16,7 @@ local function destruct_bed(pos, n)
 	if reverse then
 		reverse = not reverse
 		minetest.remove_node(other)
-		nodeupdate(other)
+		minetest.check_for_falling(other)
 	else
 		reverse = not reverse
 	end
@@ -33,7 +33,7 @@ function beds.register_bed(name, def)
 		paramtype2 = "facedir",
 		is_ground_content = false,
 		stack_max = 1,
-		groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1},
+		groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1},
 		sounds = default.node_sound_wood_defaults(),
 		node_box = {
 			type = "fixed",
@@ -59,8 +59,8 @@ function beds.register_bed(name, def)
 				return itemstack
 			end
 
-			local def = minetest.registered_nodes[minetest.get_node(pos).name]
-			if not def or not def.buildable_to then
+			local node_def = minetest.registered_nodes[minetest.get_node(pos).name]
+			if not node_def or not node_def.buildable_to then
 				return itemstack
 			end
 
@@ -91,8 +91,9 @@ function beds.register_bed(name, def)
 			destruct_bed(pos, 1)
 		end,
 
-		on_rightclick = function(pos, node, clicker)
+		on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
 			beds.on_rightclick(pos, clicker)
+			return itemstack
 		end,
 
 		on_rotate = function(pos, node, user, mode, new_param2)
@@ -112,8 +113,8 @@ function beds.register_bed(name, def)
 			end
 			local newp = vector.add(pos, minetest.facedir_to_dir(new_param2))
 			local node3 = minetest.get_node_or_nil(newp)
-			local def = node3 and minetest.registered_nodes[node3.name]
-			if not def or not def.buildable_to then
+			local node_def = node3 and minetest.registered_nodes[node3.name]
+			if not node_def or not node_def.buildable_to then
 				return false
 			end
 			if minetest.is_protected(newp, user:get_player_name()) then
@@ -136,7 +137,7 @@ function beds.register_bed(name, def)
 		paramtype2 = "facedir",
 		is_ground_content = false,
 		pointable = false,
-		groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2},
+		groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2},
 		sounds = default.node_sound_wood_defaults(),
 		drop = name .. "_bottom",
 		node_box = {
diff --git a/games/minetest_game/mods/beds/beds.lua b/games/minetest_game/mods/beds/beds.lua
index 5f31f13..bb2fd5d 100644
--- a/games/minetest_game/mods/beds/beds.lua
+++ b/games/minetest_game/mods/beds/beds.lua
@@ -66,7 +66,7 @@ beds.register_bed("beds:bed", {
 		},
 		top = {
 			"beds_bed_top_top.png^[transformR90",
-			"default_wood.png", 
+			"default_wood.png",
 			"beds_bed_side_top_r.png",
 			"beds_bed_side_top_r.png^[transformfx",
 			"beds_bed_side_top.png",
@@ -88,3 +88,17 @@ beds.register_bed("beds:bed", {
 
 minetest.register_alias("beds:bed_bottom_red", "beds:bed_bottom")
 minetest.register_alias("beds:bed_top_red", "beds:bed_top")
+
+-- Fuel
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "beds:fancy_bed_bottom",
+	burntime = 13,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "beds:bed_bottom",
+	burntime = 12,
+})
diff --git a/games/minetest_game/mods/beds/functions.lua b/games/minetest_game/mods/beds/functions.lua
index afc8e15..896844e 100644
--- a/games/minetest_game/mods/beds/functions.lua
+++ b/games/minetest_game/mods/beds/functions.lua
@@ -70,7 +70,7 @@ local function lay_down(player, pos, bed_pos, state, skip)
 
 		-- physics, eye_offset, etc
 		player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
-		player:set_look_yaw(math.random(1, 180) / 100)
+		player:set_look_horizontal(math.random(1, 180) / 100)
 		default.player_attached[name] = false
 		player:set_physics_override(1, 1, 1)
 		hud_flags.wielditem = true
@@ -85,7 +85,7 @@ local function lay_down(player, pos, bed_pos, state, skip)
 		-- physics, eye_offset, etc
 		player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0})
 		local yaw, param2 = get_look_yaw(bed_pos)
-		player:set_look_yaw(yaw)
+		player:set_look_horizontal(yaw)
 		local dir = minetest.facedir_to_dir(param2)
 		local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2}
 		player:set_physics_override(0, 0, 0)
@@ -100,7 +100,7 @@ end
 
 local function update_formspecs(finished)
 	local ges = #minetest.get_connected_players()
-	local form_n = ""
+	local form_n
 	local is_majority = (ges / 2) < player_in_bed
 
 	if finished then
@@ -130,7 +130,6 @@ end
 
 function beds.skip_night()
 	minetest.set_timeofday(0.23)
-	beds.set_spawns()
 end
 
 function beds.on_rightclick(pos, player)
@@ -149,6 +148,7 @@ function beds.on_rightclick(pos, player)
 	-- move to bed
 	if not beds.player[name] then
 		lay_down(player, ppos, pos)
+		beds.set_spawns() -- save respawn positions when entering bed
 	else
 		lay_down(player, nil, nil, false)
 	end
@@ -173,23 +173,18 @@ end
 
 
 -- Callbacks
-
-minetest.register_on_joinplayer(function(player)
-	beds.read_spawns()
-end)
-
--- respawn player at bed if enabled and valid position is found
-minetest.register_on_respawnplayer(function(player)
-	if not enable_respawn then
-		return false
-	end
-	local name = player:get_player_name()
-	local pos = beds.spawn[name] or nil
-	if pos then
-		player:setpos(pos)
-		return true
-	end
-end)
+-- Only register respawn callback if respawn enabled
+if enable_respawn then
+	-- respawn player at bed if enabled and valid position is found
+	minetest.register_on_respawnplayer(function(player)
+		local name = player:get_player_name()
+		local pos = beds.spawn[name]
+		if pos then
+			player:setpos(pos)
+			return true
+		end
+	end)
+end
 
 minetest.register_on_leaveplayer(function(player)
 	local name = player:get_player_name()
diff --git a/games/minetest_game/mods/beds/license.txt b/games/minetest_game/mods/beds/license.txt
new file mode 100644
index 0000000..0494b36
--- /dev/null
+++ b/games/minetest_game/mods/beds/license.txt
@@ -0,0 +1,60 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2014-2016 BlockMen
+Copyright (C) 2014-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2014-2016 BlockMen
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/beds/spawns.lua b/games/minetest_game/mods/beds/spawns.lua
index 48b8a66..6b1f404 100644
--- a/games/minetest_game/mods/beds/spawns.lua
+++ b/games/minetest_game/mods/beds/spawns.lua
@@ -32,11 +32,11 @@ function beds.read_spawns()
 		beds.save_spawns()
 		os.rename(file, file .. ".backup")
 		file = org_file
-	else
-		spawns = {}
 	end
 end
 
+beds.read_spawns()
+
 function beds.save_spawns()
 	if not beds.spawn then
 		return
diff --git a/games/minetest_game/mods/boats/README.txt b/games/minetest_game/mods/boats/README.txt
index 1de7167..59631d9 100644
--- a/games/minetest_game/mods/boats/README.txt
+++ b/games/minetest_game/mods/boats/README.txt
@@ -1,16 +1,15 @@
 Minetest Game mod: boats
 ========================
-by PilzAdam
+See license.txt for license information.
 
-License of source code:
------------------------
-WTFPL
+Authors of source code
+----------------------
+Originally by PilzAdam (MIT)
+Various Minetest developers and contributors (MIT)
 
-License of media (textures and sounds):
----------------------------------------
-WTFPL
-
-Authors of media files:
------------------------
-textures: Zeg9
-model: thetoon and Zeg9, modified by PavelS(SokolovPavel)
+Authors of media (textures and model)
+-------------------------------------
+Textures: Zeg9 (CC BY-SA 3.0)
+Model: thetoon and Zeg9 (CC BY-SA 3.0),
+  modified by PavelS(SokolovPavel) (CC BY-SA 3.0),
+  modified by sofar (CC BY-SA 3.0)
diff --git a/games/minetest_game/mods/boats/init.lua b/games/minetest_game/mods/boats/init.lua
index f8d0ccb..0591ef2 100644
--- a/games/minetest_game/mods/boats/init.lua
+++ b/games/minetest_game/mods/boats/init.lua
@@ -34,6 +34,8 @@ end
 
 local boat = {
 	physical = true,
+	-- Warning: Do not change the position of the collisionbox top surface,
+	-- lowering it causes the boat to fall through the world if underwater
 	collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5},
 	visual = "mesh",
 	mesh = "boats_boat.obj",
@@ -77,7 +79,7 @@ function boat.on_rightclick(self, clicker)
 		minetest.after(0.2, function()
 			default.player_set_animation(clicker, "sit" , 30)
 		end)
-		self.object:setyaw(clicker:get_look_yaw() - math.pi / 2)
+		clicker:set_look_horizontal(self.object:getyaw())
 	end
 end
 
@@ -107,18 +109,19 @@ function boat.on_punch(self, puncher)
 	end
 	if not self.driver then
 		self.removed = true
+		local inv = puncher:get_inventory()
+		if not minetest.setting_getbool("creative_mode")
+				or not inv:contains_item("main", "boats:boat") then
+			local leftover = inv:add_item("main", "boats:boat")
+			-- if no room in inventory add a replacement boat to the world
+			if not leftover:is_empty() then
+				minetest.add_item(self.object:getpos(), leftover)
+			end
+		end
 		-- delay remove to ensure player is detached
 		minetest.after(0.1, function()
 			self.object:remove()
 		end)
-		if not minetest.setting_getbool("creative_mode") then
-			local inv = puncher:get_inventory()
-			if inv:room_for_item("main", "boats:boat") then
-				inv:add_item("main", "boats:boat")
-			else
-				minetest.add_item(self.object:getpos(), "boats:boat")
-			end
-		end
 	end
 end
 
@@ -165,7 +168,7 @@ function boat.on_step(self, dtime)
 
 	local p = self.object:getpos()
 	p.y = p.y - 0.5
-	local new_velo = {x = 0, y = 0, z = 0}
+	local new_velo
 	local new_acce = {x = 0, y = 0, z = 0}
 	if not is_water(p) then
 		local nodedef = minetest.registered_nodes[minetest.get_node(p).name]
@@ -219,18 +222,22 @@ minetest.register_craftitem("boats:boat", {
 	wield_image = "boats_wield.png",
 	wield_scale = {x = 2, y = 2, z = 1},
 	liquids_pointable = true,
+	groups = {flammable = 2},
 
 	on_place = function(itemstack, placer, pointed_thing)
 		if pointed_thing.type ~= "node" then
-			return
+			return itemstack
 		end
 		if not is_water(pointed_thing.under) then
-			return
+			return itemstack
 		end
 		pointed_thing.under.y = pointed_thing.under.y + 0.5
-		minetest.add_entity(pointed_thing.under, "boats:boat")
-		if not minetest.setting_getbool("creative_mode") then
-			itemstack:take_item()
+		boat = minetest.add_entity(pointed_thing.under, "boats:boat")
+		if boat then
+			boat:setyaw(placer:get_look_horizontal())
+			if not minetest.setting_getbool("creative_mode") then
+				itemstack:take_item()
+			end
 		end
 		return itemstack
 	end,
@@ -245,3 +252,9 @@ minetest.register_craft({
 		{"group:wood", "group:wood", "group:wood"},
 	},
 })
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "boats:boat",
+	burntime = 20,
+})
diff --git a/games/minetest_game/mods/boats/license.txt b/games/minetest_game/mods/boats/license.txt
new file mode 100644
index 0000000..d4afe75
--- /dev/null
+++ b/games/minetest_game/mods/boats/license.txt
@@ -0,0 +1,63 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2012-2016 PilzAdam
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+Licenses of media (textures and model)
+--------------------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2012-2016 Zeg9
+Copyright (C) 2012-2016 thetoon
+Copyright (C) 2012-2016 PavelS(SokolovPavel)
+Copyright (C) 2016 sofar (sofar at foo-projects.org)
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/bones/README.txt b/games/minetest_game/mods/bones/README.txt
index b40a384..91bcd10 100644
--- a/games/minetest_game/mods/bones/README.txt
+++ b/games/minetest_game/mods/bones/README.txt
@@ -1,17 +1,12 @@
 Minetest Game mod: bones
 ========================
+See license.txt for license information.
 
-License of source code:
------------------------
-Copyright (C) 2012 PilzAdam
-
-WTFPL
-
-License of media (textures and sounds)
---------------------------------------
-Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
-http://creativecommons.org/licenses/by-sa/3.0/
-
-Authors of media files
+Authors of source code
 ----------------------
-Bad_Command_
+Originally by PilzAdam (MIT)
+Various Minetest developers and contributors (MIT)
+
+Authors of media (textures)
+---------------------------
+All textures: paramat (CC BY-SA 3.0)
diff --git a/games/minetest_game/mods/bones/init.lua b/games/minetest_game/mods/bones/init.lua
index 661bbab..9542cab 100644
--- a/games/minetest_game/mods/bones/init.lua
+++ b/games/minetest_game/mods/bones/init.lua
@@ -1,7 +1,5 @@
 -- Minetest 0.4 mod: bones
--- See README.txt for licensing and other information. 
-
-bones = {}
+-- See README.txt for licensing and other information.
 
 local function is_owner(pos, name)
 	local owner = minetest.get_meta(pos):get_string("owner")
@@ -11,7 +9,7 @@ local function is_owner(pos, name)
 	return false
 end
 
-bones.bones_formspec =
+local bones_formspec =
 	"size[8,9]" ..
 	default.gui_bg ..
 	default.gui_bg_img ..
@@ -29,7 +27,7 @@ local share_bones_time_early = tonumber(minetest.setting_get("share_bones_time_e
 minetest.register_node("bones:bones", {
 	description = "Bones",
 	tiles = {
-		"bones_top.png",
+		"bones_top.png^[transform2",
 		"bones_bottom.png",
 		"bones_side.png",
 		"bones_side.png",
@@ -37,12 +35,9 @@ minetest.register_node("bones:bones", {
 		"bones_front.png"
 	},
 	paramtype2 = "facedir",
-	groups = {dig_immediate=2},
-	sounds = default.node_sound_dirt_defaults({
-		footstep = {name="default_gravel_footstep", gain=0.5},
-		dug = {name="default_gravel_footstep", gain=1.0},
-	}),
-	
+	groups = {dig_immediate = 2},
+	sounds = default.node_sound_gravel_defaults(),
+
 	can_dig = function(pos, player)
 		local inv = minetest.get_meta(pos):get_inventory()
 		local name = ""
@@ -51,46 +46,46 @@ minetest.register_node("bones:bones", {
 		end
 		return is_owner(pos, name) and inv:is_empty("main")
 	end,
-	
+
 	allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
 		if is_owner(pos, player:get_player_name()) then
 			return count
 		end
 		return 0
 	end,
-	
+
 	allow_metadata_inventory_put = function(pos, listname, index, stack, player)
 		return 0
 	end,
-	
+
 	allow_metadata_inventory_take = function(pos, listname, index, stack, player)
 		if is_owner(pos, player:get_player_name()) then
 			return stack:get_count()
 		end
 		return 0
 	end,
-	
+
 	on_metadata_inventory_take = function(pos, listname, index, stack, player)
 		local meta = minetest.get_meta(pos)
 		if meta:get_inventory():is_empty("main") then
 			minetest.remove_node(pos)
 		end
 	end,
-	
+
 	on_punch = function(pos, node, player)
-		if(not is_owner(pos, player:get_player_name())) then
+		if not is_owner(pos, player:get_player_name()) then
 			return
 		end
-		
-		if(minetest.get_meta(pos):get_string("infotext") == "") then
+
+		if minetest.get_meta(pos):get_string("infotext") == "" then
 			return
 		end
-		
+
 		local inv = minetest.get_meta(pos):get_inventory()
 		local player_inv = player:get_inventory()
 		local has_space = true
-		
-		for i=1,inv:get_size("main") do
+
+		for i = 1, inv:get_size("main") do
 			local stk = inv:get_stack("main", i)
 			if player_inv:room_for_item("main", stk) then
 				inv:set_stack("main", i, nil)
@@ -100,7 +95,7 @@ minetest.register_node("bones:bones", {
 				break
 			end
 		end
-		
+
 		-- remove bones if player emptied them
 		if has_space then
 			if player_inv:room_for_item("main", {name = "bones:bones"}) then
@@ -111,12 +106,12 @@ minetest.register_node("bones:bones", {
 			minetest.remove_node(pos)
 		end
 	end,
-	
+
 	on_timer = function(pos, elapsed)
 		local meta = minetest.get_meta(pos)
 		local time = meta:get_int("time") + elapsed
 		if time >= share_bones_time then
-			meta:set_string("infotext", meta:get_string("owner").."'s old bones")
+			meta:set_string("infotext", meta:get_string("owner") .. "'s old bones")
 			meta:set_string("owner", "")
 		else
 			meta:set_int("time", time)
@@ -131,13 +126,9 @@ local function may_replace(pos, player)
 	local node_name = minetest.get_node(pos).name
 	local node_definition = minetest.registered_nodes[node_name]
 
-	-- if the node is unknown, we let the protection mod decide
-	-- this is consistent with when a player could dig or not dig it
-	-- unknown decoration would often be removed
-	-- while unknown building materials in use would usually be left
+	-- if the node is unknown, we return false
 	if not node_definition then
-		-- only replace nodes that are not protected
-		return not minetest.is_protected(pos, player:get_player_name())
+		return false
 	end
 
 	-- allow replacing air and liquids
@@ -157,71 +148,92 @@ local function may_replace(pos, player)
 	return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name())
 end
 
+local drop = function(pos, itemstack)
+	local obj = minetest.add_item(pos, itemstack:take_item(itemstack:get_count()))
+	if obj then
+		obj:setvelocity({
+			x = math.random(-10, 10) / 9,
+			y = 5,
+			z = math.random(-10, 10) / 9,
+		})
+	end
+end
+
 minetest.register_on_dieplayer(function(player)
-	if minetest.setting_getbool("creative_mode") then
+
+	local bones_mode = minetest.setting_get("bones_mode") or "bones"
+	if bones_mode ~= "bones" and bones_mode ~= "drop" and bones_mode ~= "keep" then
+		bones_mode = "bones"
+	end
+
+	-- return if keep inventory set or in creative mode
+	if bones_mode == "keep" or minetest.setting_getbool("creative_mode") then
 		return
 	end
-	
+
 	local player_inv = player:get_inventory()
 	if player_inv:is_empty("main") and
 		player_inv:is_empty("craft") then
 		return
 	end
 
-	local pos = player:getpos()
-	pos.x = math.floor(pos.x+0.5)
-	pos.y = math.floor(pos.y+0.5)
-	pos.z = math.floor(pos.z+0.5)
-	local param2 = minetest.dir_to_facedir(player:get_look_dir())
+	local pos = vector.round(player:getpos())
 	local player_name = player:get_player_name()
-	local player_inv = player:get_inventory()
 
-	if (not may_replace(pos, player)) then
-		if (may_replace({x=pos.x, y=pos.y+1, z=pos.z}, player)) then
-			-- drop one node above if there's space
-			-- this should solve most cases of protection related deaths in which players dig straight down
-			-- yet keeps the bones reachable
-			pos.y = pos.y+1
+	-- check if it's possible to place bones, if not find space near player
+	if bones_mode == "bones" and not may_replace(pos, player) then
+		local air = minetest.find_node_near(pos, 1, {"air"})
+		if air and not minetest.is_protected(air, player_name) then
+			pos = air
 		else
-			-- drop items instead of delete
-			for i=1,player_inv:get_size("main") do
-				minetest.add_item(pos, player_inv:get_stack("main", i))
-			end
-			for i=1,player_inv:get_size("craft") do
-				minetest.add_item(pos, player_inv:get_stack("craft", i))
-			end
-			-- empty lists main and craft
-			player_inv:set_list("main", {})
-			player_inv:set_list("craft", {})
-			return
+			bones_mode = "drop"
+		end
+	end
+
+	if bones_mode == "drop" then
+
+		-- drop inventory items
+		for i = 1, player_inv:get_size("main") do
+			drop(pos, player_inv:get_stack("main", i))
+		end
+		player_inv:set_list("main", {})
+
+		-- drop crafting grid items
+		for i = 1, player_inv:get_size("craft") do
+			drop(pos, player_inv:get_stack("craft", i))
 		end
+		player_inv:set_list("craft", {})
+
+		drop(pos, ItemStack("bones:bones"))
+		return
 	end
-	
-	minetest.set_node(pos, {name="bones:bones", param2=param2})
-	
+
+	local param2 = minetest.dir_to_facedir(player:get_look_dir())
+	minetest.set_node(pos, {name = "bones:bones", param2 = param2})
+
 	local meta = minetest.get_meta(pos)
 	local inv = meta:get_inventory()
-	inv:set_size("main", 8*4)
+	inv:set_size("main", 8 * 4)
 	inv:set_list("main", player_inv:get_list("main"))
-	
-	for i=1,player_inv:get_size("craft") do
+
+	for i = 1, player_inv:get_size("craft") do
 		local stack = player_inv:get_stack("craft", i)
 		if inv:room_for_item("main", stack) then
 			inv:add_item("main", stack)
 		else
 			--drop if no space left
-			minetest.add_item(pos, stack)
+			drop(pos, stack)
 		end
 	end
-	
+
 	player_inv:set_list("main", {})
 	player_inv:set_list("craft", {})
-	
-	meta:set_string("formspec", bones.bones_formspec)
+
+	meta:set_string("formspec", bones_formspec)
 	meta:set_string("owner", player_name)
-	
+
 	if share_bones_time ~= 0 then
-		meta:set_string("infotext", player_name.."'s fresh bones")
+		meta:set_string("infotext", player_name .. "'s fresh bones")
 
 		if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then
 			meta:set_int("time", 0)
diff --git a/games/minetest_game/mods/bones/license.txt b/games/minetest_game/mods/bones/license.txt
new file mode 100644
index 0000000..fe52584
--- /dev/null
+++ b/games/minetest_game/mods/bones/license.txt
@@ -0,0 +1,58 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2012-2016 PilzAdam
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2016 paramat
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
diff --git a/games/minetest_game/mods/bones/textures/bones_bottom.png b/games/minetest_game/mods/bones/textures/bones_bottom.png
index ada72ce..859c6bb 100644
Binary files a/games/minetest_game/mods/bones/textures/bones_bottom.png and b/games/minetest_game/mods/bones/textures/bones_bottom.png differ
diff --git a/games/minetest_game/mods/bones/textures/bones_front.png b/games/minetest_game/mods/bones/textures/bones_front.png
index 9dcbb97..1e52437 100644
Binary files a/games/minetest_game/mods/bones/textures/bones_front.png and b/games/minetest_game/mods/bones/textures/bones_front.png differ
diff --git a/games/minetest_game/mods/bones/textures/bones_rear.png b/games/minetest_game/mods/bones/textures/bones_rear.png
index 8e1ac10..4cfe236 100644
Binary files a/games/minetest_game/mods/bones/textures/bones_rear.png and b/games/minetest_game/mods/bones/textures/bones_rear.png differ
diff --git a/games/minetest_game/mods/bones/textures/bones_side.png b/games/minetest_game/mods/bones/textures/bones_side.png
index 3b4810c..a07595f 100644
Binary files a/games/minetest_game/mods/bones/textures/bones_side.png and b/games/minetest_game/mods/bones/textures/bones_side.png differ
diff --git a/games/minetest_game/mods/bones/textures/bones_top.png b/games/minetest_game/mods/bones/textures/bones_top.png
index 6119864..198a8a2 100644
Binary files a/games/minetest_game/mods/bones/textures/bones_top.png and b/games/minetest_game/mods/bones/textures/bones_top.png differ
diff --git a/games/minetest_game/mods/bucket/README.txt b/games/minetest_game/mods/bucket/README.txt
index a6674b4..45e0ec5 100644
--- a/games/minetest_game/mods/bucket/README.txt
+++ b/games/minetest_game/mods/bucket/README.txt
@@ -1,26 +1,13 @@
 Minetest Game mod: bucket
 =========================
+See license.txt for license information.
 
-License of source code:
------------------------
-Copyright (C) 2011-2012 Kahrl <kahrl at gmx.net>
-Copyright (C) 2011-2012 celeron55, Perttu Ahola <celeron55 at gmail.com>
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-http://www.gnu.org/licenses/lgpl-2.1.html
-
-License of media (textures and sounds)
---------------------------------------
-Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)                                 
-http://creativecommons.org/licenses/by-sa/3.0/
-
-Authors of media files
------------------------
-Everything not listed in here:
-Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55 at gmail.com>
-
+Authors of source code
+----------------------
+Kahrl <kahrl at gmx.net> (LGPL 2.1)
+celeron55, Perttu Ahola <celeron55 at gmail.com> (LGPL 2.1)
+Various Minetest developers and contributors (LGPL 2.1)
 
+Authors of media (textures)
+---------------------------
+ElementW (CC BY-SA 3.0)
diff --git a/games/minetest_game/mods/bucket/init.lua b/games/minetest_game/mods/bucket/init.lua
index 89730de..5076dec 100644
--- a/games/minetest_game/mods/bucket/init.lua
+++ b/games/minetest_game/mods/bucket/init.lua
@@ -36,12 +36,17 @@ end
 --    inventory_image = texture of the new bucket item (ignored if itemname == nil)
 --    name = text description of the bucket item
 --    groups = (optional) groups of the bucket item, for example {water_bucket = 1}
+--    force_renew = (optional) bool. Force the liquid source to renew if it has a
+--                  source neighbour, even if defined as 'liquid_renewable = false'.
+--                  Needed to avoid creating holes in sloping rivers.
 -- This function can be called from any mod (that depends on bucket).
-function bucket.register_liquid(source, flowing, itemname, inventory_image, name, groups)
+function bucket.register_liquid(source, flowing, itemname, inventory_image, name,
+		groups, force_renew)
 	bucket.liquids[source] = {
 		source = source,
 		flowing = flowing,
 		itemname = itemname,
+		force_renew = force_renew,
 	}
 	bucket.liquids[flowing] = bucket.liquids[source]
 
@@ -52,54 +57,53 @@ function bucket.register_liquid(source, flowing, itemname, inventory_image, name
 			stack_max = 1,
 			liquids_pointable = true,
 			groups = groups,
+
 			on_place = function(itemstack, user, pointed_thing)
 				-- Must be pointing to node
 				if pointed_thing.type ~= "node" then
 					return
 				end
-				
+
 				local node = minetest.get_node_or_nil(pointed_thing.under)
-				local ndef
-				if node then
-					ndef = minetest.registered_nodes[node.name]
-				end
+				local ndef = node and minetest.registered_nodes[node.name]
+
 				-- Call on_rightclick if the pointed node defines it
 				if ndef and ndef.on_rightclick and
 				   user and not user:get_player_control().sneak then
 					return ndef.on_rightclick(
 						pointed_thing.under,
 						node, user,
-						itemstack) or itemstack
+						itemstack)
 				end
 
-				local place_liquid = function(pos, node, source, flowing)
-					if check_protection(pos,
-							user and user:get_player_name() or "",
-							"place "..source) then
-						return
-					end
-					minetest.add_node(pos, {name=source})
-				end
+				local lpos
 
 				-- Check if pointing to a buildable node
 				if ndef and ndef.buildable_to then
 					-- buildable; replace the node
-					place_liquid(pointed_thing.under, node,
-							source, flowing)
+					lpos = pointed_thing.under
 				else
 					-- not buildable to; place the liquid above
 					-- check if the node above can be replaced
-					local node = minetest.get_node_or_nil(pointed_thing.above)
-					if node and minetest.registered_nodes[node.name].buildable_to then
-						place_liquid(pointed_thing.above,
-								node, source,
-								flowing)
-					else
+
+					lpos = pointed_thing.above
+					node = minetest.get_node_or_nil(lpos)
+					local above_ndef = node and minetest.registered_nodes[node.name]
+
+					if not above_ndef or not above_ndef.buildable_to then
 						-- do not remove the bucket with the liquid
-						return
+						return itemstack
 					end
 				end
-				return {name="bucket:bucket_empty"}
+
+				if check_protection(lpos, user
+						and user:get_player_name()
+						or "", "place "..source) then
+					return
+				end
+
+				minetest.set_node(lpos, {name = source})
+				return ItemStack("bucket:bucket_empty")
 			end
 		})
 	end
@@ -111,8 +115,11 @@ minetest.register_craftitem("bucket:bucket_empty", {
 	stack_max = 99,
 	liquids_pointable = true,
 	on_use = function(itemstack, user, pointed_thing)
-		-- Must be pointing to node
-		if pointed_thing.type ~= "node" then
+		if pointed_thing.type == "object" then
+			pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil)
+			return user:get_wielded_item()
+		elseif pointed_thing.type ~= "node" then
+			-- do nothing if it's neither object nor node
 			return
 		end
 		-- Check if pointing to a liquid source
@@ -142,7 +149,7 @@ minetest.register_craftitem("bucket:bucket_empty", {
 				else
 					local pos = user:getpos()
 					pos.y = math.floor(pos.y + 0.5)
-					core.add_item(pos, liquiddef.itemname)
+					minetest.add_item(pos, liquiddef.itemname)
 				end
 
 				-- set to return empty buckets minus 1
@@ -150,9 +157,24 @@ minetest.register_craftitem("bucket:bucket_empty", {
 
 			end
 
-			minetest.add_node(pointed_thing.under, {name="air"})
+			-- force_renew requires a source neighbour
+			local source_neighbor = false
+			if liquiddef.force_renew then
+				source_neighbor =
+					minetest.find_node_near(pointed_thing.under, 1, liquiddef.source)
+			end
+			if not (source_neighbor and liquiddef.force_renew) then
+				minetest.add_node(pointed_thing.under, {name = "air"})
+			end
 
 			return ItemStack(giving_back)
+		else
+			-- non-liquid nodes will have their on_punch triggered
+			local node_def = minetest.registered_nodes[node.name]
+			if node_def then
+				node_def.on_punch(pointed_thing.under, node, user, pointed_thing)
+			end
+			return user:get_wielded_item()
 		end
 	end,
 })
@@ -172,7 +194,8 @@ bucket.register_liquid(
 	"bucket:bucket_river_water",
 	"bucket_river_water.png",
 	"River Water Bucket",
-	{water_bucket = 1}
+	{water_bucket = 1},
+	true
 )
 
 bucket.register_liquid(
diff --git a/games/minetest_game/mods/bucket/license.txt b/games/minetest_game/mods/bucket/license.txt
new file mode 100644
index 0000000..a5156ae
--- /dev/null
+++ b/games/minetest_game/mods/bucket/license.txt
@@ -0,0 +1,51 @@
+License of source code
+----------------------
+
+GNU Lesser General Public License, version 2.1
+Copyright (C) 2011-2016 Kahrl <kahrl at gmx.net>
+Copyright (C) 2011-2016 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Copyright (C) 2011-2016 Various Minetest developers and contributors
+
+This program is free software; you can redistribute it and/or modify it under the terms
+of the GNU Lesser General Public License as published by the Free Software Foundation;
+either version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU Lesser General Public License for more details:
+https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2015-2016 ElementW
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/carts/README.txt b/games/minetest_game/mods/carts/README.txt
new file mode 100644
index 0000000..31ce644
--- /dev/null
+++ b/games/minetest_game/mods/carts/README.txt
@@ -0,0 +1,22 @@
+Carts (formerly boost_cart)
+==========================
+
+Carts, based almost entirely on the mod boost_cart [1], which
+itself is based on (and fully compatible with) the carts mod [2].
+
+The model was originally designed by stujones11 [3] (CC-0).
+
+Cart textures are based on original work from PixelBOX (WTFPL).
+
+
+[1] https://github.com/SmallJoker/boost_cart/
+[2] https://github.com/PilzAdam/carts/
+[3] https://github.com/stujones11/railcart/
+
+
+Features
+----------
+- A fast cart for your railway or roller coaster (up to 7 m/s!)
+- Boost and brake rails
+- Rail junction switching with the 'right-left' walking keys
+- Handbrake with the 'back' key
diff --git a/games/minetest_game/mods/carts/cart_entity.lua b/games/minetest_game/mods/carts/cart_entity.lua
new file mode 100644
index 0000000..e8707fb
--- /dev/null
+++ b/games/minetest_game/mods/carts/cart_entity.lua
@@ -0,0 +1,392 @@
+local cart_entity = {
+	physical = false, -- otherwise going uphill breaks
+	collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+	visual = "mesh",
+	mesh = "carts_cart.b3d",
+	visual_size = {x=1, y=1},
+	textures = {"carts_cart.png"},
+
+	driver = nil,
+	punched = false, -- used to re-send velocity and position
+	velocity = {x=0, y=0, z=0}, -- only used on punch
+	old_dir = {x=1, y=0, z=0}, -- random value to start the cart on punch
+	old_pos = nil,
+	old_switch = 0,
+	railtype = nil,
+	attached_items = {}
+}
+
+function cart_entity:on_rightclick(clicker)
+	if not clicker or not clicker:is_player() then
+		return
+	end
+	local player_name = clicker:get_player_name()
+	if self.driver and player_name == self.driver then
+		self.driver = nil
+		carts:manage_attachment(clicker, nil)
+	elseif not self.driver then
+		self.driver = player_name
+		carts:manage_attachment(clicker, self.object)
+	end
+end
+
+function cart_entity:on_activate(staticdata, dtime_s)
+	self.object:set_armor_groups({immortal=1})
+	if string.sub(staticdata, 1, string.len("return")) ~= "return" then
+		return
+	end
+	local data = minetest.deserialize(staticdata)
+	if not data or type(data) ~= "table" then
+		return
+	end
+	self.railtype = data.railtype
+	if data.old_dir then
+		self.old_dir = data.old_dir
+	end
+	if data.old_vel then
+		self.old_vel = data.old_vel
+	end
+end
+
+function cart_entity:get_staticdata()
+	return minetest.serialize({
+		railtype = self.railtype,
+		old_dir = self.old_dir,
+		old_vel = self.old_vel
+	})
+end
+
+function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction)
+	local pos = self.object:getpos()
+	if not self.railtype then
+		local node = minetest.get_node(pos).name
+		self.railtype = minetest.get_item_group(node, "connect_to_raillike")
+	end
+	-- Punched by non-player
+	if not puncher or not puncher:is_player() then
+		local cart_dir = carts:get_rail_direction(pos, self.old_dir, nil, nil, self.railtype)
+		if vector.equals(cart_dir, {x=0, y=0, z=0}) then
+			return
+		end
+		self.velocity = vector.multiply(cart_dir, 2)
+		self.punched = true
+		return
+	end
+	-- Player digs cart by sneak-punch
+	if puncher:get_player_control().sneak then
+		if self.sound_handle then
+			minetest.sound_stop(self.sound_handle)
+		end
+		-- Detach driver and items
+		if self.driver then
+			if self.old_pos then
+				self.object:setpos(self.old_pos)
+			end
+			local player = minetest.get_player_by_name(self.driver)
+			carts:manage_attachment(player, nil)
+		end
+		for _,obj_ in ipairs(self.attached_items) do
+			if obj_ then
+				obj_:set_detach()
+			end
+		end
+		-- Pick up cart
+		local inv = puncher:get_inventory()
+		if not minetest.setting_getbool("creative_mode")
+				or not inv:contains_item("main", "carts:cart") then
+			local leftover = inv:add_item("main", "carts:cart")
+			-- If no room in inventory add a replacement cart to the world
+			if not leftover:is_empty() then
+				minetest.add_item(self.object:getpos(), leftover)
+			end
+		end
+		self.object:remove()
+		return
+	end
+	-- Player punches cart to alter velocity
+	local vel = self.object:getvelocity()
+	if puncher:get_player_name() == self.driver then
+		if math.abs(vel.x + vel.z) > carts.punch_speed_max then
+			return
+		end
+	end
+
+	local punch_dir = carts:velocity_to_dir(puncher:get_look_dir())
+	punch_dir.y = 0
+	local cart_dir = carts:get_rail_direction(pos, punch_dir, nil, nil, self.railtype)
+	if vector.equals(cart_dir, {x=0, y=0, z=0}) then
+		return
+	end
+
+	local punch_interval = 1
+	if tool_capabilities and tool_capabilities.full_punch_interval then
+		punch_interval = tool_capabilities.full_punch_interval
+	end
+	time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval)
+	local f = 2 * (time_from_last_punch / punch_interval)
+
+	self.velocity = vector.multiply(cart_dir, f)
+	self.old_dir = cart_dir
+	self.punched = true
+end
+
+local function rail_on_step_event(handler, obj, dtime)
+	if handler then
+		handler(obj, dtime)
+	end
+end
+
+-- sound refresh interval = 1.0sec
+local function rail_sound(self, dtime)
+	if not self.sound_ttl then
+		self.sound_ttl = 1.0
+		return
+	elseif self.sound_ttl > 0 then
+		self.sound_ttl = self.sound_ttl - dtime
+		return
+	end
+	self.sound_ttl = 1.0
+	if self.sound_handle then
+		local handle = self.sound_handle
+		self.sound_handle = nil
+		minetest.after(0.2, minetest.sound_stop, handle)
+	end
+	local vel = self.object:getvelocity()
+	local speed = vector.length(vel)
+	if speed > 0 then
+		self.sound_handle = minetest.sound_play(
+			"carts_cart_moving", {
+			object = self.object,
+			gain = (speed / carts.speed_max) / 2,
+			loop = true,
+		})
+	end
+end
+
+local function get_railparams(pos)
+	local node = minetest.get_node(pos)
+	return carts.railparams[node.name] or {}
+end
+
+local function rail_on_step(self, dtime)
+	local vel = self.object:getvelocity()
+	if self.punched then
+		vel = vector.add(vel, self.velocity)
+		self.object:setvelocity(vel)
+		self.old_dir.y = 0
+	elseif vector.equals(vel, {x=0, y=0, z=0}) then
+		return
+	end
+
+	local pos = self.object:getpos()
+	local update = {}
+
+	-- stop cart if velocity vector flips
+	if self.old_vel and self.old_vel.y == 0 and
+			(self.old_vel.x * vel.x < 0 or self.old_vel.z * vel.z < 0) then
+		self.old_vel = {x = 0, y = 0, z = 0}
+		self.old_pos = pos
+		self.object:setvelocity(vector.new())
+		self.object:setacceleration(vector.new())
+		rail_on_step_event(get_railparams(pos).on_step, self, dtime)
+		return
+	end
+	self.old_vel = vector.new(vel)
+
+	if self.old_pos and not self.punched then
+		local flo_pos = vector.round(pos)
+		local flo_old = vector.round(self.old_pos)
+		if vector.equals(flo_pos, flo_old) then
+			-- Do not check one node multiple times
+			return
+		end
+	end
+
+	local ctrl, player
+
+	-- Get player controls
+	if self.driver then
+		player = minetest.get_player_by_name(self.driver)
+		if player then
+			ctrl = player:get_player_control()
+		end
+	end
+
+	if self.old_pos then
+		-- Detection for "skipping" nodes
+		local found_path = carts:pathfinder(
+			pos, self.old_pos, self.old_dir, ctrl, self.old_switch, self.railtype
+		)
+
+		if not found_path then
+			-- No rail found: reset back to the expected position
+			pos = vector.new(self.old_pos)
+			update.pos = true
+		end
+	end
+
+	local cart_dir = carts:velocity_to_dir(vel)
+	local railparams
+
+	-- dir:         New moving direction of the cart
+	-- switch_keys: Currently pressed L/R key, used to ignore the key on the next rail node
+	local dir, switch_keys = carts:get_rail_direction(
+		pos, cart_dir, ctrl, self.old_switch, self.railtype
+	)
+
+	local new_acc = {x=0, y=0, z=0}
+	if vector.equals(dir, {x=0, y=0, z=0}) then
+		vel = {x = 0, y = 0, z = 0}
+		pos = vector.round(pos)
+		update.pos = true
+		update.vel = true
+	else
+		-- Direction change detected
+		if not vector.equals(dir, self.old_dir) then
+			vel = vector.multiply(dir, math.abs(vel.x + vel.z))
+			update.vel = true
+			if dir.y ~= self.old_dir.y then
+				pos = vector.round(pos)
+				update.pos = true
+			end
+		end
+		-- Center on the rail
+		if dir.z ~= 0 and math.floor(pos.x + 0.5) ~= pos.x then
+			pos.x = math.floor(pos.x + 0.5)
+			update.pos = true
+		end
+		if dir.x ~= 0 and math.floor(pos.z + 0.5) ~= pos.z then
+			pos.z = math.floor(pos.z + 0.5)
+			update.pos = true
+		end
+
+		-- Slow down or speed up..
+		local acc = dir.y * -4.0
+
+		-- Get rail for corrected position
+		railparams = get_railparams(pos)
+
+		-- no need to check for railparams == nil since we always make it exist.
+		local speed_mod = railparams.acceleration
+		if speed_mod and speed_mod ~= 0 then
+			-- Try to make it similar to the original carts mod
+			acc = acc + speed_mod
+		else
+			-- Handbrake or coast
+			if ctrl and ctrl.down then
+				acc = acc - 3
+			else
+				acc = acc - 0.4
+			end
+		end
+
+		new_acc = vector.multiply(dir, acc)
+	end
+
+	-- Limits
+	local max_vel = carts.speed_max
+	for _, v in pairs({"x","y","z"}) do
+		if math.abs(vel[v]) > max_vel then
+			vel[v] = carts:get_sign(vel[v]) * max_vel
+			new_acc[v] = 0
+			update.vel = true
+		end
+	end
+
+	self.object:setacceleration(new_acc)
+	self.old_pos = vector.new(pos)
+	if not vector.equals(dir, {x=0, y=0, z=0}) then
+		self.old_dir = vector.new(dir)
+	end
+	self.old_switch = switch_keys
+
+	if self.punched then
+		-- Collect dropped items
+		for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do
+			if not obj_:is_player() and
+					obj_:get_luaentity() and
+					not obj_:get_luaentity().physical_state and
+					obj_:get_luaentity().name == "__builtin:item" then
+
+				obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0})
+				self.attached_items[#self.attached_items + 1] = obj_
+			end
+		end
+		self.punched = false
+		update.vel = true
+	end
+
+	railparams = railparams or get_railparams(pos)
+
+	if not (update.vel or update.pos) then
+		rail_on_step_event(railparams.on_step, self, dtime)
+		return
+	end
+
+	local yaw = 0
+	if self.old_dir.x < 0 then
+		yaw = 0.5
+	elseif self.old_dir.x > 0 then
+		yaw = 1.5
+	elseif self.old_dir.z < 0 then
+		yaw = 1
+	end
+	self.object:setyaw(yaw * math.pi)
+
+	local anim = {x=0, y=0}
+	if dir.y == -1 then
+		anim = {x=1, y=1}
+	elseif dir.y == 1 then
+		anim = {x=2, y=2}
+	end
+	self.object:set_animation(anim, 1, 0)
+
+	self.object:setvelocity(vel)
+	if update.pos then
+		self.object:setpos(pos)
+	end
+
+	-- call event handler
+	rail_on_step_event(railparams.on_step, self, dtime)
+end
+
+function cart_entity:on_step(dtime)
+	rail_on_step(self, dtime)
+	rail_sound(self, dtime)
+end
+
+minetest.register_entity("carts:cart", cart_entity)
+
+minetest.register_craftitem("carts:cart", {
+	description = "Cart (Sneak+Click to pick up)",
+	inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_side.png", "carts_cart_side.png"),
+	wield_image = "carts_cart_side.png",
+	on_place = function(itemstack, placer, pointed_thing)
+		if not pointed_thing.type == "node" then
+			return
+		end
+		if carts:is_rail(pointed_thing.under) then
+			minetest.add_entity(pointed_thing.under, "carts:cart")
+		elseif carts:is_rail(pointed_thing.above) then
+			minetest.add_entity(pointed_thing.above, "carts:cart")
+		else
+			return
+		end
+
+		minetest.sound_play({name = "default_place_node_metal", gain = 0.5},
+			{pos = pointed_thing.above})
+
+		if not minetest.setting_getbool("creative_mode") then
+			itemstack:take_item()
+		end
+		return itemstack
+	end,
+})
+
+minetest.register_craft({
+	output = "carts:cart",
+	recipe = {
+		{"default:steel_ingot", "", "default:steel_ingot"},
+		{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
+	},
+})
diff --git a/games/minetest_game/mods/creative/depends.txt b/games/minetest_game/mods/carts/depends.txt
similarity index 100%
copy from games/minetest_game/mods/creative/depends.txt
copy to games/minetest_game/mods/carts/depends.txt
diff --git a/games/minetest_game/mods/carts/functions.lua b/games/minetest_game/mods/carts/functions.lua
new file mode 100644
index 0000000..285645c
--- /dev/null
+++ b/games/minetest_game/mods/carts/functions.lua
@@ -0,0 +1,221 @@
+function carts:get_sign(z)
+	if z == 0 then
+		return 0
+	else
+		return z / math.abs(z)
+	end
+end
+
+function carts:manage_attachment(player, obj)
+	if not player then
+		return
+	end
+	local status = obj ~= nil
+	local player_name = player:get_player_name()
+	if default.player_attached[player_name] == status then
+		return
+	end
+	default.player_attached[player_name] = status
+
+	if status then
+		player:set_attach(obj, "", {x=0, y=6, z=0}, {x=0, y=0, z=0})
+		player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0})
+	else
+		player:set_detach()
+		player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0})
+	end
+end
+
+function carts:velocity_to_dir(v)
+	if math.abs(v.x) > math.abs(v.z) then
+		return {x=carts:get_sign(v.x), y=carts:get_sign(v.y), z=0}
+	else
+		return {x=0, y=carts:get_sign(v.y), z=carts:get_sign(v.z)}
+	end
+end
+
+function carts:is_rail(pos, railtype)
+	local node = minetest.get_node(pos).name
+	if node == "ignore" then
+		local vm = minetest.get_voxel_manip()
+		local emin, emax = vm:read_from_map(pos, pos)
+		local area = VoxelArea:new{
+			MinEdge = emin,
+			MaxEdge = emax,
+		}
+		local data = vm:get_data()
+		local vi = area:indexp(pos)
+		node = minetest.get_name_from_content_id(data[vi])
+	end
+	if minetest.get_item_group(node, "rail") == 0 then
+		return false
+	end
+	if not railtype then
+		return true
+	end
+	return minetest.get_item_group(node, "connect_to_raillike") == railtype
+end
+
+function carts:check_front_up_down(pos, dir_, check_up, railtype)
+	local dir = vector.new(dir_)
+	local cur
+
+	-- Front
+	dir.y = 0
+	cur = vector.add(pos, dir)
+	if carts:is_rail(cur, railtype) then
+		return dir
+	end
+	-- Up
+	if check_up then
+		dir.y = 1
+		cur = vector.add(pos, dir)
+		if carts:is_rail(cur, railtype) then
+			return dir
+		end
+	end
+	-- Down
+	dir.y = -1
+	cur = vector.add(pos, dir)
+	if carts:is_rail(cur, railtype) then
+		return dir
+	end
+	return nil
+end
+
+function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype)
+	local pos = vector.round(pos_)
+	local cur
+	local left_check, right_check = true, true
+
+	-- Check left and right
+	local left = {x=0, y=0, z=0}
+	local right = {x=0, y=0, z=0}
+	if dir.z ~= 0 and dir.x == 0 then
+		left.x = -dir.z
+		right.x = dir.z
+	elseif dir.x ~= 0 and dir.z == 0 then
+		left.z = dir.x
+		right.z = -dir.x
+	end
+
+	if ctrl then
+		if old_switch == 1 then
+			left_check = false
+		elseif old_switch == 2 then
+			right_check = false
+		end
+		if ctrl.left and left_check then
+			cur = carts:check_front_up_down(pos, left, false, railtype)
+			if cur then
+				return cur, 1
+			end
+			left_check = false
+		end
+		if ctrl.right and right_check then
+			cur = carts:check_front_up_down(pos, right, false, railtype)
+			if cur then
+				return cur, 2
+			end
+			right_check = true
+		end
+	end
+
+	-- Normal
+	cur = carts:check_front_up_down(pos, dir, true, railtype)
+	if cur then
+		return cur
+	end
+
+	-- Left, if not already checked
+	if left_check then
+		cur = carts:check_front_up_down(pos, left, false, railtype)
+		if cur then
+			return cur
+		end
+	end
+
+	-- Right, if not already checked
+	if right_check then
+		cur = carts:check_front_up_down(pos, right, false, railtype)
+		if cur then
+			return cur
+		end
+	end
+
+	-- Backwards
+	if not old_switch then
+		cur = carts:check_front_up_down(pos, {
+				x = -dir.x,
+				y = dir.y,
+				z = -dir.z
+			}, true, railtype)
+		if cur then
+			return cur
+		end
+	end
+
+	return {x=0, y=0, z=0}
+end
+
+function carts:pathfinder(pos_, old_pos, old_dir, ctrl, pf_switch, railtype)
+	local pos = vector.round(pos_)
+	local pf_pos = vector.round(old_pos)
+	local pf_dir = vector.new(old_dir)
+
+	for i = 1, 3 do
+		if vector.equals(pf_pos, pos) then
+			-- Success! Cart moved on correctly
+			return true
+		end
+
+		pf_dir, pf_switch = carts:get_rail_direction(pf_pos, pf_dir, ctrl, pf_switch, railtype)
+		if vector.equals(pf_dir, {x=0, y=0, z=0}) then
+			-- No way forwards
+			return false
+		end
+
+		pf_pos = vector.add(pf_pos, pf_dir)
+	end
+	-- Cart not found
+	return false
+end
+
+function carts:register_rail(name, def, railparams)
+	local def_default = {
+		drawtype = "raillike",
+		paramtype = "light",
+		sunlight_propagates = true,
+		is_ground_content = false,
+		walkable = false,
+		selection_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
+		},
+		sounds = default.node_sound_metal_defaults()
+	}
+	for k, v in pairs(def_default) do
+		def[k] = v
+	end
+	if not def.inventory_image then
+		def.wield_image = def.tiles[1]
+		def.inventory_image = def.tiles[1]
+	end
+
+	if railparams then
+		carts.railparams[name] = table.copy(railparams)
+	end
+
+	minetest.register_node(name, def)
+end
+
+function carts:get_rail_groups(additional_groups)
+	-- Get the default rail groups and add more when a table is given
+	local groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1}
+	if type(additional_groups) == "table" then
+		for k, v in pairs(additional_groups) do
+			groups[k] = v
+		end
+	end
+	return groups
+end
diff --git a/games/minetest_game/mods/carts/init.lua b/games/minetest_game/mods/carts/init.lua
new file mode 100644
index 0000000..53b33cc
--- /dev/null
+++ b/games/minetest_game/mods/carts/init.lua
@@ -0,0 +1,20 @@
+
+carts = {}
+carts.modpath = minetest.get_modpath("carts")
+carts.railparams = {}
+
+-- Maximal speed of the cart in m/s (min = -1)
+carts.speed_max = 7
+-- Set to -1 to disable punching the cart from inside (min = -1)
+carts.punch_speed_max = 5
+
+
+dofile(carts.modpath.."/functions.lua")
+dofile(carts.modpath.."/rails.lua")
+
+-- Support for non-default games
+if not default.player_attached then
+	default.player_attached = {}
+end
+
+dofile(carts.modpath.."/cart_entity.lua")
diff --git a/games/minetest_game/mods/carts/license.txt b/games/minetest_game/mods/carts/license.txt
new file mode 100644
index 0000000..6c5beb4
--- /dev/null
+++ b/games/minetest_game/mods/carts/license.txt
@@ -0,0 +1,54 @@
+
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2012-2016 PilzAdam
+Copyright (C) 2014-2016 SmallJoker
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+Licenses of media
+-----------------
+
+CC-0, see: https://creativecommons.org/share-your-work/public-domain/cc0/, except
+if other license is mentioned.
+
+
+Authors
+---------
+Originally from PixelBOX (Gambit):
+	carts_cart_side.png
+	carts_cart_top.png
+	carts_cart_front.png*
+	carts_cart.png*
+
+sofar + stujones11:
+	carts_cart.b3d and carts_cart.blend
+
+hexafraction, modified by sofar
+	carts_rail_*.png
+
+http://www.freesound.org/people/YleArkisto/sounds/253159/ - YleArkisto - CC-BY-3.0
+	carts_cart_moving.*.ogg
diff --git a/games/minetest_game/mods/carts/models/carts_cart.b3d b/games/minetest_game/mods/carts/models/carts_cart.b3d
new file mode 100644
index 0000000..4e7eba3
Binary files /dev/null and b/games/minetest_game/mods/carts/models/carts_cart.b3d differ
diff --git a/games/minetest_game/mods/carts/models/carts_cart.blend b/games/minetest_game/mods/carts/models/carts_cart.blend
new file mode 100644
index 0000000..7d2515e
Binary files /dev/null and b/games/minetest_game/mods/carts/models/carts_cart.blend differ
diff --git a/games/minetest_game/mods/carts/rails.lua b/games/minetest_game/mods/carts/rails.lua
new file mode 100644
index 0000000..5da4ac4
--- /dev/null
+++ b/games/minetest_game/mods/carts/rails.lua
@@ -0,0 +1,59 @@
+carts:register_rail("carts:rail", {
+	description = "Rail",
+	tiles = {
+		"carts_rail_straight.png", "carts_rail_curved.png",
+		"carts_rail_t_junction.png", "carts_rail_crossing.png"
+	},
+	inventory_image = "carts_rail_straight.png",
+	wield_image = "carts_rail_straight.png",
+	groups = carts:get_rail_groups(),
+}, {})
+
+minetest.register_craft({
+	output = "carts:rail 16",
+	recipe = {
+		{"default:steel_ingot", "", "default:steel_ingot"},
+		{"default:steel_ingot", "group:stick", "default:steel_ingot"},
+		{"default:steel_ingot", "", "default:steel_ingot"},
+	}
+})
+
+minetest.register_alias("default:rail", "carts:rail")
+
+
+carts:register_rail("carts:powerrail", {
+	description = "Powered rail",
+	tiles = {
+		"carts_rail_straight_pwr.png", "carts_rail_curved_pwr.png",
+		"carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png"
+	},
+	groups = carts:get_rail_groups(),
+}, {acceleration = 5})
+
+minetest.register_craft({
+	output = "carts:powerrail 8",
+	recipe = {
+		{"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"},
+		{"default:steel_ingot", "group:stick", "default:steel_ingot"},
+		{"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"},
+	}
+})
+
+
+carts:register_rail("carts:brakerail", {
+	description = "Brake rail",
+	tiles = {
+		"carts_rail_straight_brk.png", "carts_rail_curved_brk.png",
+		"carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png"
+	},
+	groups = carts:get_rail_groups(),
+}, {acceleration = -3})
+
+minetest.register_craft({
+	output = "carts:brakerail 8",
+	recipe = {
+		{"default:steel_ingot", "default:coal_lump", "default:steel_ingot"},
+		{"default:steel_ingot", "group:stick", "default:steel_ingot"},
+		{"default:steel_ingot", "default:coal_lump", "default:steel_ingot"},
+	}
+})
diff --git a/games/minetest_game/mods/carts/sounds/carts_cart_moving.1.ogg b/games/minetest_game/mods/carts/sounds/carts_cart_moving.1.ogg
new file mode 100644
index 0000000..869e765
Binary files /dev/null and b/games/minetest_game/mods/carts/sounds/carts_cart_moving.1.ogg differ
diff --git a/games/minetest_game/mods/carts/sounds/carts_cart_moving.2.ogg b/games/minetest_game/mods/carts/sounds/carts_cart_moving.2.ogg
new file mode 100644
index 0000000..b4cc508
Binary files /dev/null and b/games/minetest_game/mods/carts/sounds/carts_cart_moving.2.ogg differ
diff --git a/games/minetest_game/mods/carts/sounds/carts_cart_moving.3.ogg b/games/minetest_game/mods/carts/sounds/carts_cart_moving.3.ogg
new file mode 100644
index 0000000..e19a782
Binary files /dev/null and b/games/minetest_game/mods/carts/sounds/carts_cart_moving.3.ogg differ
diff --git a/games/minetest_game/mods/carts/textures/carts_cart.png b/games/minetest_game/mods/carts/textures/carts_cart.png
new file mode 100644
index 0000000..965347c
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_cart.png differ
diff --git a/games/minetest_game/mods/default/textures/default_ice.png b/games/minetest_game/mods/carts/textures/carts_cart_front.png
similarity index 79%
copy from games/minetest_game/mods/default/textures/default_ice.png
copy to games/minetest_game/mods/carts/textures/carts_cart_front.png
index be8eadd..b85696f 100644
Binary files a/games/minetest_game/mods/default/textures/default_ice.png and b/games/minetest_game/mods/carts/textures/carts_cart_front.png differ
diff --git a/games/minetest_game/mods/default/textures/default_ice.png b/games/minetest_game/mods/carts/textures/carts_cart_side.png
similarity index 78%
copy from games/minetest_game/mods/default/textures/default_ice.png
copy to games/minetest_game/mods/carts/textures/carts_cart_side.png
index be8eadd..4362d6b 100644
Binary files a/games/minetest_game/mods/default/textures/default_ice.png and b/games/minetest_game/mods/carts/textures/carts_cart_side.png differ
diff --git a/games/minetest_game/mods/default/textures/default_ice.png b/games/minetest_game/mods/carts/textures/carts_cart_top.png
similarity index 77%
copy from games/minetest_game/mods/default/textures/default_ice.png
copy to games/minetest_game/mods/carts/textures/carts_cart_top.png
index be8eadd..5f775ff 100644
Binary files a/games/minetest_game/mods/default/textures/default_ice.png and b/games/minetest_game/mods/carts/textures/carts_cart_top.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_crossing.png b/games/minetest_game/mods/carts/textures/carts_rail_crossing.png
new file mode 100644
index 0000000..e10f3b1
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_crossing.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_crossing_brk.png b/games/minetest_game/mods/carts/textures/carts_rail_crossing_brk.png
new file mode 100644
index 0000000..0bf455e
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_crossing_brk.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_crossing_pwr.png b/games/minetest_game/mods/carts/textures/carts_rail_crossing_pwr.png
new file mode 100644
index 0000000..d763d50
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_crossing_pwr.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_curved.png b/games/minetest_game/mods/carts/textures/carts_rail_curved.png
new file mode 100644
index 0000000..b320f0d
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_curved.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_curved_brk.png b/games/minetest_game/mods/carts/textures/carts_rail_curved_brk.png
new file mode 100644
index 0000000..ca40723
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_curved_brk.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_curved_pwr.png b/games/minetest_game/mods/carts/textures/carts_rail_curved_pwr.png
new file mode 100644
index 0000000..781bbd0
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_curved_pwr.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_straight.png b/games/minetest_game/mods/carts/textures/carts_rail_straight.png
new file mode 100644
index 0000000..30dcafe
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_straight.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_straight_brk.png b/games/minetest_game/mods/carts/textures/carts_rail_straight_brk.png
new file mode 100644
index 0000000..0c69052
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_straight_brk.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_straight_pwr.png b/games/minetest_game/mods/carts/textures/carts_rail_straight_pwr.png
new file mode 100644
index 0000000..e067ff1
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_straight_pwr.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_t_junction.png b/games/minetest_game/mods/carts/textures/carts_rail_t_junction.png
new file mode 100644
index 0000000..8b1b946
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_t_junction.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_t_junction_brk.png b/games/minetest_game/mods/carts/textures/carts_rail_t_junction_brk.png
new file mode 100644
index 0000000..6b4f6fa
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_t_junction_brk.png differ
diff --git a/games/minetest_game/mods/carts/textures/carts_rail_t_junction_pwr.png b/games/minetest_game/mods/carts/textures/carts_rail_t_junction_pwr.png
new file mode 100644
index 0000000..dd0eede
Binary files /dev/null and b/games/minetest_game/mods/carts/textures/carts_rail_t_junction_pwr.png differ
diff --git a/games/minetest_game/mods/creative/README.txt b/games/minetest_game/mods/creative/README.txt
index fa73552..82357f3 100644
--- a/games/minetest_game/mods/creative/README.txt
+++ b/games/minetest_game/mods/creative/README.txt
@@ -1,23 +1,12 @@
 Minetest Game mod: creative
 ===========================
+See license.txt for license information.
 
-Implements creative mode.
-
-Switch on by using the "creative_mode" setting.
-
-Registered items that
-- have a description, and
-- do not have the group not_in_creative_inventory
-are added to the creative inventory.
-
-License of source code and media files:
----------------------------------------
-Copyright (C) 2012 Perttu Ahola (celeron55) <celeron55 at gmail.com>
-Copyright (C) 2016 Jean-Patrick G. (kilbith) <jeanpatrick.guerrero at gmail.com>
-
-This program is free software. It comes without any warranty, to
-the extent permitted by applicable law. You can redistribute it
-and/or modify it under the terms of the Do What The Fuck You Want
-To Public License, Version 2, as published by Sam Hocevar. See
-http://sam.zoy.org/wtfpl/COPYING for more details.
+Authors of source code
+----------------------
+Originally by Perttu Ahola (celeron55) <celeron55 at gmail.com> (MIT)
+Jean-Patrick G. (kilbith) <jeanpatrick.guerrero at gmail.com> (MIT)
 
+Author of media (textures)
+--------------------------
+Jean-Patrick G. (kilbith) <jeanpatrick.guerrero at gmail.com> (CC BY-SA 3.0)
diff --git a/games/minetest_game/mods/creative/depends.txt b/games/minetest_game/mods/creative/depends.txt
index 4ad96d5..975e652 100644
--- a/games/minetest_game/mods/creative/depends.txt
+++ b/games/minetest_game/mods/creative/depends.txt
@@ -1 +1,2 @@
 default
+sfinv
diff --git a/games/minetest_game/mods/creative/init.lua b/games/minetest_game/mods/creative/init.lua
index bc4687f..868b802 100644
--- a/games/minetest_game/mods/creative/init.lua
+++ b/games/minetest_game/mods/creative/init.lua
@@ -1,225 +1,14 @@
--- minetest/creative/init.lua
-
-creative = {}
-local player_inventory = {}
-local creative_mode = minetest.setting_getbool("creative_mode")
-
--- Create detached creative inventory after loading all mods
-creative.init_creative_inventory = function(player)
-	local player_name = player:get_player_name()
-	player_inventory[player_name] = {}
-	player_inventory[player_name].size = 0
-	player_inventory[player_name].filter = ""
-	player_inventory[player_name].start_i = 1
-	player_inventory[player_name].tab_id = 2
-
-	minetest.create_detached_inventory("creative_" .. player_name, {
-		allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
-			if creative_mode and not to_list == "main" then
-				return count
-			else
-				return 0
-			end
-		end,
-		allow_put = function(inv, listname, index, stack, player)
-			return 0
-		end,
-		allow_take = function(inv, listname, index, stack, player)
-			if creative_mode then
-				return -1
-			else
-				return 0
-			end
-		end,
-		on_move = function(inv, from_list, from_index, to_list, to_index, count, player)
-		end,
-		on_put = function(inv, listname, index, stack, player)
-		end,
-		on_take = function(inv, listname, index, stack, player)
-			local player_name, stack_name = player:get_player_name(), stack:get_name()
-			--print(player_name .. " takes item from creative inventory; listname = " .. listname .. ", index = " .. index .. ", stack = " .. dump(stack:to_table()))
-			if stack then
-				minetest.log("action", player_name .. " takes " .. stack_name .. " from creative inventory")
-				--print("Stack name: " .. stack_name .. ", Stack count: " .. stack:get_count())
-			end
-		end,
-	})
-
-	creative.update_creative_inventory(player_name)
-	--print("creative inventory size: " .. player_inventory[player_name].size)
-end
-
-local function tab_category(tab_id)
-	local id_category = {
-		nil, -- Reserved for crafting tab.
-		minetest.registered_items,
-		minetest.registered_nodes,
-		minetest.registered_tools,
-		minetest.registered_craftitems
-	}
-
-	-- If index out of range, show default ("All") page.
-	return id_category[tab_id] or id_category[2]
-end
-
-function creative.update_creative_inventory(player_name)
-	local creative_list = {}
-	local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name})
-	local inv = player_inventory[player_name]
-
-	for name, def in pairs(tab_category(inv.tab_id)) do
-		if not (def.groups.not_in_creative_inventory == 1) and
-				def.description and def.description ~= "" and
-				(def.name:find(inv.filter, 1, true) or
-					def.description:lower():find(inv.filter, 1, true)) then
-			creative_list[#creative_list+1] = name
-		end
-	end
-
-	table.sort(creative_list)
-	player_inv:set_size("main", #creative_list)
-	player_inv:set_list("main", creative_list)
-	inv.size = #creative_list
-end
-
--- Create the trash field
-local trash = minetest.create_detached_inventory("creative_trash", {
-	-- Allow the stack to be placed and remove it in on_put()
-	-- This allows the creative inventory to restore the stack
-	allow_put = function(inv, listname, index, stack, player)
-		if creative_mode then
-			return stack:get_count()
-		else
-			return 0
-		end
-	end,
-	on_put = function(inv, listname)
-		inv:set_list(listname, {})
-	end,
-})
-trash:set_size("main", 1)
-
-creative.formspec_add = ""
-
-creative.set_creative_formspec = function(player, start_i)
-	local player_name = player:get_player_name()
-	local inv = player_inventory[player_name]
-	local pagenum = math.floor(start_i / (3*8) + 1)
-	local pagemax = math.ceil(inv.size / (3*8))
-
-	player:set_inventory_formspec([[
-		size[8,8.6]
-		image[4.06,3.4;0.8,0.8;creative_trash_icon.png]
-		list[current_player;main;0,4.7;8,1;]
-		list[current_player;main;0,5.85;8,3;8]
-		list[detached:creative_trash;main;4,3.3;1,1;]
-		listring[]
-		tablecolumns[color;text;color;text]
-		tableoptions[background=#00000000;highlight=#00000000;border=false]
-		button[5.4,3.2;0.8,0.9;creative_prev;<]
-		button[7.25,3.2;0.8,0.9;creative_next;>]
-		button[2.1,3.4;0.8,0.5;creative_search;?]
-		button[2.75,3.4;0.8,0.5;creative_clear;X]
-		tooltip[creative_search;Search]
-		tooltip[creative_clear;Reset]
-		listring[current_player;main]
-		]] ..
-		"field[0.3,3.5;2.2,1;creative_filter;;" .. inv.filter .. "]" ..
-		"listring[detached:creative_" .. player_name .. ";main]" ..
-		"tabheader[0,0;creative_tabs;Crafting,All,Nodes,Tools,Items;" .. tostring(inv.tab_id) .. ";true;false]" ..
-		"list[detached:creative_" .. player_name .. ";main;0,0;8,3;" .. tostring(start_i) .. "]" ..
-		"table[6.05,3.35;1.15,0.5;pagenum;#FFFF00," .. tostring(pagenum) .. ",#FFFFFF,/ " .. tostring(pagemax) .. "]" ..
-		default.get_hotbar_bg(0,4.7) ..
-		default.gui_bg .. default.gui_bg_img .. default.gui_slots
-		.. creative.formspec_add
-	)
-end
-
-creative.set_crafting_formspec = function(player)
-	player:set_inventory_formspec([[
-		size[8,8.6]
-		list[current_player;craft;2,0.75;3,3;]
-		list[current_player;craftpreview;6,1.75;1,1;]
-		list[current_player;main;0,4.7;8,1;]
-		list[current_player;main;0,5.85;8,3;8]
-		list[detached:creative_trash;main;0,2.75;1,1;]
-		image[0.06,2.85;0.8,0.8;creative_trash_icon.png]
-		image[5,1.75;1,1;gui_furnace_arrow_bg.png^[transformR270]
-		tabheader[0,0;creative_tabs;Crafting,All,Nodes,Tools,Items;1;true;false]
-		listring[current_player;main]
-		listring[current_player;craft]
-		]] ..
-		default.get_hotbar_bg(0,4.7) ..
-		default.gui_bg .. default.gui_bg_img .. default.gui_slots
-	)
-end
-
-minetest.register_on_joinplayer(function(player)
-	-- If in creative mode, modify player's inventory forms
-	if not creative_mode then
-		return
-	end
-	creative.init_creative_inventory(player)
-	creative.set_creative_formspec(player, 0)
-end)
-
-minetest.register_on_player_receive_fields(function(player, formname, fields)
-	if formname ~= "" or not creative_mode then
-		return
-	end
-
-	local player_name = player:get_player_name()
-	local inv = player_inventory[player_name]
-
-	if fields.quit then
-		if inv.tab_id == 1 then
-			creative.set_crafting_formspec(player)
-		end
-	elseif fields.creative_tabs then
-		local tab = tonumber(fields.creative_tabs)
-		inv.tab_id = tab
-
-		if tab == 1 then
-			creative.set_crafting_formspec(player)
-		else
-			creative.update_creative_inventory(player_name)
-			creative.set_creative_formspec(player, 0)
-		end
-	elseif fields.creative_clear then
-		inv.filter = ""
-		creative.update_creative_inventory(player_name)
-		creative.set_creative_formspec(player, 0)
-	elseif fields.creative_search then
-		inv.filter = fields.creative_filter:lower()
-		creative.update_creative_inventory(player_name)
-		creative.set_creative_formspec(player, 0)
-	else
-		local formspec = player:get_inventory_formspec()
-		local start_i = player_inventory[player_name].start_i or 0
-
-		if fields.creative_prev then
-			start_i = start_i - 3*8
-			if start_i < 0 then
-				start_i = inv.size - (inv.size % (3*8))
-				if inv.size == start_i then
-					start_i = math.max(0, inv.size - (3*8))
-				end
-			end
-		elseif fields.creative_next then
-			start_i = start_i + 3*8
-			if start_i >= inv.size then
-				start_i = 0
-			end
-		end
-
-		player_inventory[player_name].start_i = start_i
-		creative.set_creative_formspec(player, start_i)
-	end
-end)
-
-if creative_mode then
-	local digtime = 0.5
-	local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 3}
+dofile(minetest.get_modpath("creative") .. "/inventory.lua")
+
+if minetest.setting_getbool("creative_mode") then
+	-- Dig time is modified according to difference (leveldiff) between tool
+	-- 'maxlevel' and node 'level'. Digtime is divided by the larger of
+	-- leveldiff and 1.
+	-- To speed up digging in creative, hand 'maxlevel' and 'digtime' have been
+	-- increased such that nodes of differing levels have an insignificant
+	-- effect on digtime.
+	local digtime = 42
+	local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256}
 
 	minetest.register_item(":", {
 		type = "none",
diff --git a/games/minetest_game/mods/creative/inventory.lua b/games/minetest_game/mods/creative/inventory.lua
new file mode 100644
index 0000000..be24b3a
--- /dev/null
+++ b/games/minetest_game/mods/creative/inventory.lua
@@ -0,0 +1,180 @@
+creative = {}
+local player_inventory = {}
+
+function creative.init_creative_inventory(player)
+	local player_name = player:get_player_name()
+	player_inventory[player_name] = {
+		size = 0,
+		filter = "",
+		start_i = 0
+	}
+
+	minetest.create_detached_inventory("creative_" .. player_name, {
+		allow_move = function(inv, from_list, from_index, to_list, to_index, count, player2)
+			if not to_list == "main" then
+				return count
+			else
+				return 0
+			end
+		end,
+		allow_put = function(inv, listname, index, stack, player2)
+			return 0
+		end,
+		allow_take = function(inv, listname, index, stack, player2)
+			return -1
+		end,
+		on_move = function(inv, from_list, from_index, to_list, to_index, count, player2)
+		end,
+		on_put = function(inv, listname, index, stack, player2)
+		end,
+		on_take = function(inv, listname, index, stack, player2)
+			if stack and stack:get_count() > 0 then
+				minetest.log("action", player_name .. " takes " .. stack:get_name().. " from creative inventory")
+			end
+		end,
+	}, player_name)
+
+	creative.update_creative_inventory(player_name, minetest.registered_items)
+end
+
+function creative.update_creative_inventory(player_name, tab_content)
+	local creative_list = {}
+	local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name})
+	local inv = player_inventory[player_name]
+	if not inv then
+		creative.init_creative_inventory(minetest.get_player_by_name(player_name))
+	end
+
+	for name, def in pairs(tab_content) do
+		if not (def.groups.not_in_creative_inventory == 1) and
+				def.description and def.description ~= "" and
+				(def.name:find(inv.filter, 1, true) or
+					def.description:lower():find(inv.filter, 1, true)) then
+			creative_list[#creative_list+1] = name
+		end
+	end
+
+	table.sort(creative_list)
+	player_inv:set_size("main", #creative_list)
+	player_inv:set_list("main", creative_list)
+	inv.size = #creative_list
+end
+
+-- Create the trash field
+local trash = minetest.create_detached_inventory("creative_trash", {
+	-- Allow the stack to be placed and remove it in on_put()
+	-- This allows the creative inventory to restore the stack
+	allow_put = function(inv, listname, index, stack, player)
+		return stack:get_count()
+	end,
+	on_put = function(inv, listname)
+		inv:set_list(listname, {})
+	end,
+})
+trash:set_size("main", 1)
+
+creative.formspec_add = ""
+
+function creative.register_tab(name, title, items)
+	sfinv.register_page("creative:" .. name, {
+		title = title,
+		is_in_nav = function(self, player, context)
+			return minetest.setting_getbool("creative_mode")
+		end,
+		get = function(self, player, context)
+			local player_name = player:get_player_name()
+			creative.update_creative_inventory(player_name, items)
+			local inv = player_inventory[player_name]
+			local start_i = inv.start_i or 0
+			local pagenum = math.floor(start_i / (3*8) + 1)
+			local pagemax = math.ceil(inv.size / (3*8))
+			return sfinv.make_formspec(player, context,
+				"label[6.2,3.35;" .. minetest.colorize("#FFFF00", tostring(pagenum)) .. " / " .. tostring(pagemax) .. "]" ..
+				[[
+					image[4.06,3.4;0.8,0.8;creative_trash_icon.png]
+					listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]
+					list[current_player;main;0,4.7;8,1;]
+					list[current_player;main;0,5.85;8,3;8]
+					list[detached:creative_trash;main;4,3.3;1,1;]
+					listring[]
+					button[5.4,3.2;0.8,0.9;creative_prev;<]
+					button[7.25,3.2;0.8,0.9;creative_next;>]
+					button[2.1,3.4;0.8,0.5;creative_search;?]
+					button[2.75,3.4;0.8,0.5;creative_clear;X]
+					tooltip[creative_search;Search]
+					tooltip[creative_clear;Reset]
+					listring[current_player;main]
+					field_close_on_enter[creative_filter;false]
+				]] ..
+				"field[0.3,3.5;2.2,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. "]" ..
+				"listring[detached:creative_" .. player_name .. ";main]" ..
+				"list[detached:creative_" .. player_name .. ";main;0,0;8,3;" .. tostring(start_i) .. "]" ..
+				default.get_hotbar_bg(0,4.7) ..
+				default.gui_bg .. default.gui_bg_img .. default.gui_slots
+				.. creative.formspec_add, false)
+		end,
+		on_enter = function(self, player, context)
+			local player_name = player:get_player_name()
+			local inv = player_inventory[player_name]
+			if inv then
+				inv.start_i = 0
+			end
+		end,
+		on_player_receive_fields = function(self, player, context, fields)
+			local player_name = player:get_player_name()
+			local inv = player_inventory[player_name]
+			assert(inv)
+
+			if fields.creative_clear then
+				inv.start_i = 0
+				inv.filter = ""
+				creative.update_creative_inventory(player_name, items)
+				sfinv.set_player_inventory_formspec(player, context)
+			elseif fields.creative_search or
+					fields.key_enter_field == "creative_filter" then
+				inv.start_i = 0
+				inv.filter = fields.creative_filter:lower()
+				creative.update_creative_inventory(player_name, items)
+				sfinv.set_player_inventory_formspec(player, context)
+			elseif not fields.quit then
+				local start_i = inv.start_i or 0
+
+				if fields.creative_prev then
+					start_i = start_i - 3*8
+					if start_i < 0 then
+						start_i = inv.size - (inv.size % (3*8))
+						if inv.size == start_i then
+							start_i = math.max(0, inv.size - (3*8))
+						end
+					end
+				elseif fields.creative_next then
+					start_i = start_i + 3*8
+					if start_i >= inv.size then
+						start_i = 0
+					end
+				end
+
+				inv.start_i = start_i
+				sfinv.set_player_inventory_formspec(player, context)
+			end
+		end
+	})
+end
+
+minetest.register_on_joinplayer(function(player)
+	creative.init_creative_inventory(player)
+end)
+
+creative.register_tab("all", "All", minetest.registered_items)
+creative.register_tab("nodes", "Nodes", minetest.registered_nodes)
+creative.register_tab("tools", "Tools", minetest.registered_tools)
+creative.register_tab("craftitems", "Items", minetest.registered_craftitems)
+
+local old_homepage_name = sfinv.get_homepage_name
+function sfinv.get_homepage_name(player)
+	if minetest.setting_getbool("creative_mode") then
+		return "creative:all"
+	else
+		return old_homepage_name(player)
+	end
+end
diff --git a/games/minetest_game/mods/creative/license.txt b/games/minetest_game/mods/creative/license.txt
new file mode 100644
index 0000000..4ad1d5f
--- /dev/null
+++ b/games/minetest_game/mods/creative/license.txt
@@ -0,0 +1,60 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2012-2016 Perttu Ahola (celeron55) <celeron55 at gmail.com>
+Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) <jeanpatrick.guerrero at gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2016 Jean-Patrick G. (kilbith) <jeanpatrick.guerrero at gmail.com>
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/default/README.txt b/games/minetest_game/mods/default/README.txt
index 8e72ca5..d261b6b 100644
--- a/games/minetest_game/mods/default/README.txt
+++ b/games/minetest_game/mods/default/README.txt
@@ -1,28 +1,18 @@
 Minetest Game mod: default
 ==========================
+See license.txt for license information.
 
-License of source code:
------------------------
-Copyright (C) 2011-2012 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Authors of source code
+----------------------
+Originally by celeron55, Perttu Ahola <celeron55 at gmail.com> (LGPL 2.1)
+Various Minetest developers and contributors (LGPL 2.1)
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or
-(at your option) any later version.
-
-http://www.gnu.org/licenses/lgpl-2.1.html
-
-License of media (textures and sounds)
---------------------------------------
-Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
-http://creativecommons.org/licenses/by-sa/3.0/
-
-Authors of media files
------------------------
+Authors of media (textures, models and sounds)
+----------------------------------------------
 Everything not listed in here:
-Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55 at gmail.com>
+celeron55, Perttu Ahola <celeron55 at gmail.com> (CC BY-SA 3.0)
 
-Cisoun's WTFPL texture pack:
+Cisoun's texture pack (CC BY-SA 3.0):
   default_jungletree.png
   default_lava.png
   default_leaves.png
@@ -32,61 +22,57 @@ Cisoun's WTFPL texture pack:
   default_tree_top.png
   default_water.png
 
-Cisoun's conifers mod (WTFPL):
+Cisoun's conifers mod (CC BY-SA 3.0):
   default_pine_needles.png
 
-Originating from G4JC's Almost MC Texture Pack:
+Originating from G4JC's Almost MC Texture Pack (CC BY-SA 3.0):
   default_torch.png
   default_torch_on_ceiling.png
   default_torch_on_floor.png
 
-VanessaE's animated torches (WTFPL):
+VanessaE's animated torches (CC BY-SA 3.0):
   default_torch_animated.png
   default_torch_on_ceiling_animated.png
   default_torch_on_floor_animated.png
   default_torch_on_floor.png
 
-RealBadAngel's animated water (WTFPL):
+RealBadAngel's animated water (CC BY-SA 3.0):
   default_water_source_animated.png
   default_water_flowing_animated.png
 
-VanessaE (WTFPL):
-  default_nc_back.png
-  default_nc_front.png
-  default_nc_rb.png
-  default_nc_side.png
+VanessaE (CC BY-SA 3.0):
   default_desert_sand.png
   default_desert_stone.png
   default_sand.png
+  default_mese_crystal.png
+  default_mese_crystal_fragment.png
 
-Calinou (CC BY-SA):
+Calinou (CC BY-SA 3.0):
   default_brick.png
   default_papyrus.png
   default_mineral_copper.png
   default_glass_detail.png
 
-MirceaKitsune (WTFPL):
+MirceaKitsune (CC BY-SA 3.0):
   character.x
 
 Jordach (CC BY-SA 3.0):
   character.png
 
-PilzAdam (WTFPL):
+PilzAdam (CC BY-SA 3.0):
   default_jungleleaves.png
   default_junglesapling.png
   default_obsidian_glass.png
   default_obsidian_shard.png
   default_mineral_gold.png
-  default_snowball.png
 
-jojoa1997 (WTFPL):
+jojoa1997 (CC BY-SA 3.0):
   default_obsidian.png
 
-InfinityProject (WTFPL):
+InfinityProject (CC BY-SA 3.0):
   default_mineral_diamond.png
 
 Splizard (CC BY-SA 3.0):
-  default_snow.png
   default_pine_sapling.png
 
 Zeg9 (CC BY-SA 3.0):
@@ -102,16 +88,23 @@ paramat (CC BY-SA 3.0):
   default_pinetree_top.png
   default_pinewood.png
   default_acacia_leaves.png
+  default_acacia_leaves_simple.png
   default_acacia_sapling.png
   default_acacia_tree.png
   default_acacia_tree_top.png
   default_acacia_wood.png
+  default_acacia_bush_stem.png
+  default_bush_stem.png
   default_junglewood.png
   default_jungletree_top.png
   default_sandstone_brick.png
   default_obsidian_brick.png
   default_stone_brick.png
   default_desert_stone_brick.png
+  default_sandstone_block.png
+  default_obsidian_block.png
+  default_stone_block.png
+  default_desert_stone_block.png
   default_river_water.png
   default_river_water_source_animated.png
   default_river_water_flowing_animated.png
@@ -120,7 +113,8 @@ paramat (CC BY-SA 3.0):
   default_dry_grass_*.png
   default_grass.png
   default_grass_side.png
-  default_snow_side.png
+  default_mese_block.png
+  default_silver_sand.png
 
 brunob.santos (CC BY-SA 4.0):
   default_desert_cobble.png
@@ -146,6 +140,9 @@ BlockMen (CC BY-SA 3.0):
   bubble.png
   gui_*.png
 
+Wuzzy (CC BY-SA 3.0):
+  default_bookshelf_slot.png (based on default_book.png)
+
 sofar (CC BY-SA 3.0):
   default_book_written.png, based on default_book.png
   default_aspen_sapling
@@ -153,18 +150,17 @@ sofar (CC BY-SA 3.0):
   default_aspen_tree
   default_aspen_tree_top, derived from default_pine_tree_top (by paramat)
   default_aspen_wood, derived from default_pine_wood (by paramat)
-
-sofar (WTFPL):
   default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel
 
 Neuromancer (CC BY-SA 2.0):
   default_cobble.png, based on texture by Brane praefect
   default_mossycobble.png, based on texture by Brane praefect
+
 Neuromancer (CC BY-SA 3.0):
   default_dirt.png
   default_furnace_*.png
 
-Gambit (WTFPL):
+Gambit (CC BY-SA 3.0):
   default_bronze_ingot.png
   default_copper_ingot.png
   default_copper_lump.png
@@ -178,19 +174,37 @@ Gambit (WTFPL):
   default_ladder_steel.png
   default_sign_wall_wood.png
   default_flint.png
+  default_snow.png
+  default_snow_side.png
+  default_snowball.png
+  default_key.png
+  default_key_skeleton.png
 
-asl97 (WTFPL):
+asl97 (CC BY-SA 3.0):
   default_ice.png
 
 KevDoy (CC BY-SA 3.0)
   heart.png
 
+Pithydon (CC BY-SA 3.0)
+  default_coral_brown.png
+  default_coral_orange.png
+  default_coral_skeleton.png
+
+Ferk (CC0 1.0)
+  default_item_smoke.png
+  default_item_smoke.ogg, based on sound by http://opengameart.org/users/bart
+
 Glass breaking sounds (CC BY 3.0):
   1: http://www.freesound.org/people/cmusounddesign/sounds/71947/
   2: http://www.freesound.org/people/Tomlija/sounds/97669/
   3: http://www.freesound.org/people/lsprice/sounds/88808/
 
-Mito551 (sounds) (CC BY-SA):
+sonictechtonic (CC BY 3.0):
+https://www.freesound.org/people/sonictechtonic/sounds/241872/
+  player_damage.ogg
+
+Mito551 (sounds) (CC BY-SA 3.0):
   default_dig_choppy.ogg
   default_dig_cracky.ogg
   default_dig_crumbly.1.ogg
@@ -224,3 +238,27 @@ Mito551 (sounds) (CC BY-SA):
   default_dirt_footstep.1.ogg
   default_dirt_footstep.2.ogg
   default_glass_footstep.ogg
+
+Metal sounds:
+  default_dig_metal.ogg - yadronoff - CC-BY-3.0
+  - https://www.freesound.org/people/yadronoff/sounds/320397/
+  default_dug_metal.*.ogg - Iwan Gabovitch - qubodup - CC0
+  - http://opengameart.org/users/qubodup
+  default_metal_footstep.*.ogg - Ottomaani138 - CC0
+  - https://www.freesound.org/people/Ottomaani138/sounds/232692/
+  default_place_node_metal.*.ogg - Ogrebane - CC0
+  - http://opengameart.org/content/wood-and-metal-sound-effects-volume-2
+
+Tool breaking sounds added by sofar: CC-BY-3.0
+  default_tool_breaks.* - http://www.freesound.org/people/HerbertBoland/sounds/33206/
+
+AGFX (CC BY 3.0)
+https://www.freesound.org/people/AGFX/packs/1253/
+  default_water_footstep.1.ogg
+  default_water_footstep.2.ogg
+  default_water_footstep.3.ogg
+(default_water_footstep.4.ogg is silent)
+
+blukotek (CC0 1.0)
+https://www.freesound.org/people/blukotek/sounds/251660/
+  default_dig_snappy.ogg
diff --git a/games/minetest_game/mods/default/aliases.lua b/games/minetest_game/mods/default/aliases.lua
index 63fe59b..6db3fc8 100644
--- a/games/minetest_game/mods/default/aliases.lua
+++ b/games/minetest_game/mods/default/aliases.lua
@@ -22,7 +22,7 @@ minetest.register_alias("papyrus", "default:papyrus")
 minetest.register_alias("bookshelf", "default:bookshelf")
 minetest.register_alias("glass", "default:glass")
 minetest.register_alias("wooden_fence", "default:fence_wood")
-minetest.register_alias("rail", "default:rail")
+minetest.register_alias("rail", "carts:rail")
 minetest.register_alias("ladder", "default:ladder_wood")
 minetest.register_alias("wood", "default:wood")
 minetest.register_alias("mese", "default:mese")
@@ -39,8 +39,6 @@ minetest.register_alias("locked_chest", "default:chest_locked")
 minetest.register_alias("cobble", "default:cobble")
 minetest.register_alias("mossycobble", "default:mossycobble")
 minetest.register_alias("steelblock", "default:steelblock")
-minetest.register_alias("nyancat", "default:nyancat")
-minetest.register_alias("nyancat_rainbow", "default:nyancat_rainbow")
 minetest.register_alias("sapling", "default:sapling")
 minetest.register_alias("apple", "default:apple")
 
@@ -77,4 +75,3 @@ minetest.register_alias("default:pinewood", "default:pine_wood")
 
 minetest.register_alias("default:ladder", "default:ladder_wood")
 minetest.register_alias("default:sign_wall", "default:sign_wall_wood")
-
diff --git a/games/minetest_game/mods/default/crafting.lua b/games/minetest_game/mods/default/crafting.lua
index 998d86b..483245c 100644
--- a/games/minetest_game/mods/default/crafting.lua
+++ b/games/minetest_game/mods/default/crafting.lua
@@ -36,6 +36,20 @@ minetest.register_craft({
 })
 
 minetest.register_craft({
+	output = 'default:wood',
+	recipe = {
+		{'default:bush_stem'},
+	}
+})
+
+minetest.register_craft({
+	output = 'default:acacia_wood',
+	recipe = {
+		{'default:acacia_bush_stem'},
+	}
+})
+
+minetest.register_craft({
 	output = 'default:stick 4',
 	recipe = {
 		{'group:wood'},
@@ -339,11 +353,9 @@ minetest.register_craft({
 })
 
 minetest.register_craft({
-	output = 'default:rail 24',
+	output = 'default:skeleton_key',
 	recipe = {
-		{'default:steel_ingot', '', 'default:steel_ingot'},
-		{'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
-		{'default:steel_ingot', '', 'default:steel_ingot'},
+		{'default:gold_ingot'},
 	}
 })
 
@@ -365,6 +377,12 @@ minetest.register_craft({
 	}
 })
 
+minetest.register_craft( {
+	type = "shapeless",
+	output = "default:chest_locked",
+	recipe = {"default:chest", "default:steel_ingot"},
+})
+
 minetest.register_craft({
 	output = 'default:furnace',
 	recipe = {
@@ -500,6 +518,15 @@ minetest.register_craft({
 })
 
 minetest.register_craft({
+	output = 'default:sandstone_block 9',
+	recipe = {
+		{'default:sandstone', 'default:sandstone', 'default:sandstone'},
+		{'default:sandstone', 'default:sandstone', 'default:sandstone'},
+		{'default:sandstone', 'default:sandstone', 'default:sandstone'},
+	}
+})
+
+minetest.register_craft({
 	output = 'default:clay',
 	recipe = {
 		{'default:clay_lump', 'default:clay_lump'},
@@ -596,6 +623,15 @@ minetest.register_craft({
 })
 
 minetest.register_craft({
+	output = "default:mese_crystal",
+	recipe = {
+		{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
+		{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
+		{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
+	}
+})
+
+minetest.register_craft({
 	output = 'default:meselamp 1',
 	recipe = {
 		{'', 'default:mese_crystal',''},
@@ -628,6 +664,15 @@ minetest.register_craft({
 })
 
 minetest.register_craft({
+	output = 'default:obsidian_block 9',
+	recipe = {
+		{'default:obsidian', 'default:obsidian', 'default:obsidian'},
+		{'default:obsidian', 'default:obsidian', 'default:obsidian'},
+		{'default:obsidian', 'default:obsidian', 'default:obsidian'},
+	}
+})
+
+minetest.register_craft({
 	output = 'default:stonebrick 4',
 	recipe = {
 		{'default:stone', 'default:stone'},
@@ -636,6 +681,15 @@ minetest.register_craft({
 })
 
 minetest.register_craft({
+	output = 'default:stone_block 9',
+	recipe = {
+		{'default:stone', 'default:stone', 'default:stone'},
+		{'default:stone', 'default:stone', 'default:stone'},
+		{'default:stone', 'default:stone', 'default:stone'},
+	}
+})
+
+minetest.register_craft({
 	output = 'default:desert_stonebrick 4',
 	recipe = {
 		{'default:desert_stone', 'default:desert_stone'},
@@ -644,6 +698,15 @@ minetest.register_craft({
 })
 
 minetest.register_craft({
+	output = 'default:desert_stone_block 9',
+	recipe = {
+		{'default:desert_stone', 'default:desert_stone', 'default:desert_stone'},
+		{'default:desert_stone', 'default:desert_stone', 'default:desert_stone'},
+		{'default:desert_stone', 'default:desert_stone', 'default:desert_stone'},
+	}
+})
+
+minetest.register_craft({
 	output = 'default:snowblock',
 	recipe = {
 		{'default:snow', 'default:snow', 'default:snow'},
@@ -725,86 +788,219 @@ minetest.register_craft({
 	recipe = "default:clay_lump",
 })
 
+minetest.register_craft({
+	type = 'cooking',
+	output = 'default:gold_ingot',
+	recipe = 'default:skeleton_key',
+	cooktime = 5,
+})
+
+minetest.register_craft({
+	type = 'cooking',
+	output = 'default:gold_ingot',
+	recipe = 'default:key',
+	cooktime = 5,
+})
+
 --
 -- Fuels
 --
 
+-- Support use of group:tree
 minetest.register_craft({
 	type = "fuel",
 	recipe = "group:tree",
 	burntime = 30,
 })
 
+-- Burn time for all woods are in order of wood density,
+-- which is also the order of wood colour darkness:
+-- aspen, pine, apple, acacia, jungle
+
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:junglegrass",
-	burntime = 2,
+	recipe = "default:aspen_tree",
+	burntime = 22,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "group:leaves",
-	burntime = 1,
+	recipe = "default:pine_tree",
+	burntime = 26,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:cactus",
-	burntime = 15,
+	recipe = "default:tree",
+	burntime = 30,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:papyrus",
-	burntime = 1,
+	recipe = "default:acacia_tree",
+	burntime = 34,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:bookshelf",
-	burntime = 30,
+	recipe = "default:jungletree",
+	burntime = 38,
+})
+
+
+-- Support use of group:wood
+minetest.register_craft({
+	type = "fuel",
+	recipe = "group:wood",
+	burntime = 7,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:aspen_wood",
+	burntime = 5,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:pine_wood",
+	burntime = 6,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:wood",
+	burntime = 7,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:acacia_wood",
+	burntime = 8,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:junglewood",
+	burntime = 9,
+})
+
+
+-- Support use of group:sapling
+minetest.register_craft({
+	type = "fuel",
+	recipe = "group:sapling",
+	burntime = 10,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:aspen_sapling",
+	burntime = 8,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:pine_sapling",
+	burntime = 9,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:sapling",
+	burntime = 10,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:acacia_sapling",
+	burntime = 11,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:junglesapling",
+	burntime = 12,
+})
+
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:fence_aspen_wood",
+	burntime = 5,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:fence_pine_wood",
+	burntime = 6,
 })
 
 minetest.register_craft({
 	type = "fuel",
 	recipe = "default:fence_wood",
-	burntime = 15,
+	burntime = 7,
 })
 
 minetest.register_craft({
 	type = "fuel",
 	recipe = "default:fence_acacia_wood",
-	burntime = 15,
+	burntime = 8,
 })
 
 minetest.register_craft({
 	type = "fuel",
 	recipe = "default:fence_junglewood",
-	burntime = 15,
+	burntime = 9,
 })
 
+
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:fence_pine_wood",
-	burntime = 15,
+	recipe = "default:bush_stem",
+	burntime = 7,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:fence_aspen_wood",
+	recipe = "default:acacia_bush_stem",
+	burntime = 8,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:junglegrass",
+	burntime = 2,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "group:leaves",
+	burntime = 1,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:cactus",
 	burntime = 15,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:ladder_wood",
-	burntime = 5,
+	recipe = "default:papyrus",
+	burntime = 1,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "group:wood",
-	burntime = 7,
+	recipe = "default:bookshelf",
+	burntime = 30,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:ladder_wood",
+	burntime = 2,
 })
 
 minetest.register_craft({
@@ -839,49 +1035,85 @@ minetest.register_craft({
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:nyancat",
-	burntime = 1,
+	recipe = "default:apple",
+	burntime = 3,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:coal_lump",
+	burntime = 40,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:coalblock",
+	burntime = 370,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:grass_1",
+	burntime = 2,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:dry_grass_1",
+	burntime = 2,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:nyancat_rainbow",
+	recipe = "default:paper",
 	burntime = 1,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "group:sapling",
-	burntime = 10,
+	recipe = "default:book",
+	burntime = 3,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:apple",
+	recipe = "default:book_written",
 	burntime = 3,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:coal_lump",
-	burntime = 40,
+	recipe = "default:dry_shrub",
+	burntime = 2,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:coalblock",
-	burntime = 370,
+	recipe = "group:stick",
+	burntime = 1,
 })
 
+
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:grass_1",
-	burntime = 2,
+	recipe = "default:pick_wood",
+	burntime = 6,
 })
 
 minetest.register_craft({
 	type = "fuel",
-	recipe = "default:dry_grass_1",
-	burntime = 2,
+	recipe = "default:shovel_wood",
+	burntime = 4,
 })
 
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:axe_wood",
+	burntime = 6,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "default:sword_wood",
+	burntime = 5,
+})
diff --git a/games/minetest_game/mods/default/craftitems.lua b/games/minetest_game/mods/default/craftitems.lua
index 2fe5978..0c51c71 100644
--- a/games/minetest_game/mods/default/craftitems.lua
+++ b/games/minetest_game/mods/default/craftitems.lua
@@ -3,19 +3,20 @@
 minetest.register_craftitem("default:stick", {
 	description = "Stick",
 	inventory_image = "default_stick.png",
-	groups = {stick = 1},
+	groups = {stick = 1, flammable = 2},
 })
 
 minetest.register_craftitem("default:paper", {
 	description = "Paper",
 	inventory_image = "default_paper.png",
+	groups = {flammable = 3},
 })
 
 local lpp = 14 -- Lines per book's page
 local function book_on_use(itemstack, user)
 	local player_name = user:get_player_name()
 	local data = minetest.deserialize(itemstack:get_metadata())
-	local formspec, title, text, owner = "", "", "", player_name
+	local title, text, owner = "", "", player_name
 	local page, page_max, lines, string = 1, 1, {}, ""
 
 	if data then
@@ -38,6 +39,7 @@ local function book_on_use(itemstack, user)
 		end
 	end
 
+	local formspec
 	if owner == player_name then
 		formspec = "size[8,8]" .. default.gui_bg ..
 			default.gui_bg_img ..
@@ -104,7 +106,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 
 	elseif fields.book_next or fields.book_prev then
 		local data = minetest.deserialize(stack:get_metadata())
-		if not data.page then return end
+		if not data or not data.page then
+			return
+		end
 
 		if fields.book_next then
 			data.page = data.page + 1
@@ -129,14 +133,14 @@ end)
 minetest.register_craftitem("default:book", {
 	description = "Book",
 	inventory_image = "default_book.png",
-	groups = {book = 1},
+	groups = {book = 1, flammable = 3},
 	on_use = book_on_use,
 })
 
 minetest.register_craftitem("default:book_written", {
 	description = "Book With Text",
 	inventory_image = "default_book_written.png",
-	groups = {book = 1, not_in_creative_inventory = 1},
+	groups = {book = 1, not_in_creative_inventory = 1, flammable = 3},
 	stack_max = 1,
 	on_use = book_on_use,
 })
@@ -152,7 +156,6 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv
 		return
 	end
 
-	local copy = ItemStack("default:book_written")
 	local original
 	local index
 	for i = 1, player:get_inventory():get_size("craft") do
@@ -174,7 +177,7 @@ end)
 minetest.register_craftitem("default:coal_lump", {
 	description = "Coal Lump",
 	inventory_image = "default_coal_lump.png",
-	groups = {coal = 1}
+	groups = {coal = 1, flammable = 1}
 })
 
 minetest.register_craftitem("default:iron_lump", {
diff --git a/games/minetest_game/mods/default/functions.lua b/games/minetest_game/mods/default/functions.lua
index 7e594b3..3bda4bf 100644
--- a/games/minetest_game/mods/default/functions.lua
+++ b/games/minetest_game/mods/default/functions.lua
@@ -18,7 +18,7 @@ end
 function default.node_sound_stone_defaults(table)
 	table = table or {}
 	table.footstep = table.footstep or
-			{name = "default_hard_footstep", gain = 0.5}
+			{name = "default_hard_footstep", gain = 0.3}
 	table.dug = table.dug or
 			{name = "default_hard_footstep", gain = 1.0}
 	default.node_sound_defaults(table)
@@ -28,9 +28,9 @@ end
 function default.node_sound_dirt_defaults(table)
 	table = table or {}
 	table.footstep = table.footstep or
-			{name = "default_dirt_footstep", gain = 1.0}
+			{name = "default_dirt_footstep", gain = 0.4}
 	table.dug = table.dug or
-			{name = "default_dirt_footstep", gain = 1.5}
+			{name = "default_dirt_footstep", gain = 1.0}
 	table.place = table.place or
 			{name = "default_place_node", gain = 1.0}
 	default.node_sound_defaults(table)
@@ -52,7 +52,7 @@ end
 function default.node_sound_gravel_defaults(table)
 	table = table or {}
 	table.footstep = table.footstep or
-			{name = "default_gravel_footstep", gain = 0.5}
+			{name = "default_gravel_footstep", gain = 0.4}
 	table.dug = table.dug or
 			{name = "default_gravel_footstep", gain = 1.0}
 	table.place = table.place or
@@ -64,7 +64,7 @@ end
 function default.node_sound_wood_defaults(table)
 	table = table or {}
 	table.footstep = table.footstep or
-			{name = "default_wood_footstep", gain = 0.5}
+			{name = "default_wood_footstep", gain = 0.3}
 	table.dug = table.dug or
 			{name = "default_wood_footstep", gain = 1.0}
 	default.node_sound_defaults(table)
@@ -74,7 +74,7 @@ end
 function default.node_sound_leaves_defaults(table)
 	table = table or {}
 	table.footstep = table.footstep or
-			{name = "default_grass_footstep", gain = 0.35}
+			{name = "default_grass_footstep", gain = 0.45}
 	table.dug = table.dug or
 			{name = "default_grass_footstep", gain = 0.7}
 	table.dig = table.dig or
@@ -88,6 +88,8 @@ end
 function default.node_sound_glass_defaults(table)
 	table = table or {}
 	table.footstep = table.footstep or
+			{name = "default_glass_footstep", gain = 0.3}
+	table.dig = table.dig or
 			{name = "default_glass_footstep", gain = 0.5}
 	table.dug = table.dug or
 			{name = "default_break_glass", gain = 1.0}
@@ -95,6 +97,27 @@ function default.node_sound_glass_defaults(table)
 	return table
 end
 
+function default.node_sound_metal_defaults(table)
+	table = table or {}
+	table.footstep = table.footstep or
+			{name = "default_metal_footstep", gain = 0.4}
+	table.dig = table.dig or
+			{name = "default_dig_metal", gain = 0.5}
+	table.dug = table.dug or
+			{name = "default_dug_metal", gain = 0.5}
+	table.place = table.place or
+			{name = "default_place_node_metal", gain = 0.5}
+	default.node_sound_defaults(table)
+	return table
+end
+
+function default.node_sound_water_defaults(table)
+	table = table or {}
+	table.footstep = table.footstep or
+			{name = "default_water_footstep", gain = 0.2}
+	default.node_sound_defaults(table)
+	return table
+end
 
 --
 -- Lavacooling
@@ -111,8 +134,9 @@ default.cool_lava = function(pos, node)
 end
 
 minetest.register_abm({
+	label = "Lava cooling",
 	nodenames = {"default:lava_source", "default:lava_flowing"},
-	neighbors = {"group:water"},
+	neighbors = {"group:cools_lava", "group:water"},
 	interval = 1,
 	chance = 1,
 	catch_up = false,
@@ -125,6 +149,7 @@ minetest.register_abm({
 --
 -- optimized helper to put all items in an inventory into a drops list
 --
+
 function default.get_inventory_drops(pos, inventory, drops)
 	local inv = minetest.get_meta(pos):get_inventory()
 	local n = #drops
@@ -189,6 +214,7 @@ function default.grow_papyrus(pos, node)
 end
 
 minetest.register_abm({
+	label = "Grow cactus",
 	nodenames = {"default:cactus"},
 	neighbors = {"group:sand"},
 	interval = 12,
@@ -199,6 +225,7 @@ minetest.register_abm({
 })
 
 minetest.register_abm({
+	label = "Grow papyrus",
 	nodenames = {"default:papyrus"},
 	neighbors = {"default:dirt", "default:dirt_with_grass"},
 	interval = 14,
@@ -226,6 +253,7 @@ end
 --
 -- Fence registration helper
 --
+
 function default.register_fence(name, def)
 	minetest.register_craft({
 		output = name .. " 4",
@@ -283,16 +311,7 @@ end
 -- Leafdecay
 --
 
-default.leafdecay_trunk_cache = {}
-default.leafdecay_enable_cache = true
--- Spread the load of finding trunks
-default.leafdecay_trunk_find_allow_accumulator = 0
-
-minetest.register_globalstep(function(dtime)
-	local finds_per_second = 5000
-	default.leafdecay_trunk_find_allow_accumulator =
-			math.floor(dtime * finds_per_second)
-end)
+-- Prevent decay of placed leaves
 
 default.after_place_leaves = function(pos, placer, itemstack, pointed_thing)
 	if placer and not placer:get_player_control().sneak then
@@ -302,79 +321,44 @@ default.after_place_leaves = function(pos, placer, itemstack, pointed_thing)
 	end
 end
 
+-- Leafdecay ABM
+
 minetest.register_abm({
+	label = "Leaf decay",
 	nodenames = {"group:leafdecay"},
-	neighbors = {"air", "group:liquid"},
-	-- A low interval and a high inverse chance spreads the load
+	neighbors = {"air"},
 	interval = 2,
-	chance = 5,
+	chance = 10,
+	catch_up = false,
 
-	action = function(p0, node, _, _)
-		--print("leafdecay ABM at "..p0.x..", "..p0.y..", "..p0.z..")")
-		local do_preserve = false
-		local d = minetest.registered_nodes[node.name].groups.leafdecay
-		if not d or d == 0 then
-			--print("not groups.leafdecay")
-			return
-		end
-		local n0 = minetest.get_node(p0)
-		if n0.param2 ~= 0 then
-			--print("param2 ~= 0")
+	action = function(pos, node, _, _)
+		-- Check if leaf is placed
+		if node.param2 ~= 0 then
 			return
 		end
-		local p0_hash = nil
-		if default.leafdecay_enable_cache then
-			p0_hash = minetest.hash_node_position(p0)
-			local trunkp = default.leafdecay_trunk_cache[p0_hash]
-			if trunkp then
-				local n = minetest.get_node(trunkp)
-				local reg = minetest.registered_nodes[n.name]
-				-- Assume ignore is a trunk, to make the thing
-				-- work at the border of the active area
-				if n.name == "ignore" or (reg and reg.groups.tree and
-						reg.groups.tree ~= 0) then
-					--print("cached trunk still exists")
-					return
-				end
-				--print("cached trunk is invalid")
-				-- Cache is invalid
-				table.remove(default.leafdecay_trunk_cache, p0_hash)
-			end
-		end
-		if default.leafdecay_trunk_find_allow_accumulator <= 0 then
+
+		local rad = minetest.registered_nodes[node.name].groups.leafdecay
+		-- Assume ignore is a trunk, to make this
+		-- work at the border of a loaded area
+		if minetest.find_node_near(pos, rad, {"ignore", "group:tree"}) then
 			return
 		end
-		default.leafdecay_trunk_find_allow_accumulator =
-				default.leafdecay_trunk_find_allow_accumulator - 1
-		-- Assume ignore is a trunk, to make the thing
-		-- work at the border of the active area
-		local p1 = minetest.find_node_near(p0, d, {"ignore", "group:tree"})
-		if p1 then
-			do_preserve = true
-			if default.leafdecay_enable_cache then
-				--print("caching trunk")
-				-- Cache the trunk
-				default.leafdecay_trunk_cache[p0_hash] = p1
-			end
-		end
-		if not do_preserve then
-			-- Drop stuff other than the node itself
-			local itemstacks = minetest.get_node_drops(n0.name)
-			for _, itemname in ipairs(itemstacks) do
-				if minetest.get_item_group(n0.name, "leafdecay_drop") ~= 0 or
-						itemname ~= n0.name then
-					local p_drop = {
-						x = p0.x - 0.5 + math.random(),
-						y = p0.y - 0.5 + math.random(),
-						z = p0.z - 0.5 + math.random(),
-					}
-					minetest.add_item(p_drop, itemname)
-				end
+		-- Drop stuff
+		local itemstacks = minetest.get_node_drops(node.name)
+		for _, itemname in ipairs(itemstacks) do
+			if itemname ~= node.name or
+					minetest.get_item_group(node.name, "leafdecay_drop") ~= 0 then
+				local p_drop = {
+					x = pos.x - 0.5 + math.random(),
+					y = pos.y - 0.5 + math.random(),
+					z = pos.z - 0.5 + math.random(),
+				}
+				minetest.add_item(p_drop, itemname)
 			end
-			-- Remove node
-			minetest.remove_node(p0)
-			nodeupdate(p0)
 		end
+		-- Remove node
+		minetest.remove_node(pos)
+		minetest.check_for_falling(pos)
 	end
 })
 
@@ -384,49 +368,39 @@ minetest.register_abm({
 --
 
 minetest.register_abm({
+	label = "Grass spread",
 	nodenames = {"default:dirt"},
 	neighbors = {
-		"default:dirt_with_grass",
-		"default:dirt_with_dry_grass",
-		"default:dirt_with_snow",
+		"air",
 		"group:grass",
 		"group:dry_grass",
 		"default:snow",
 	},
 	interval = 6,
-	chance = 67,
+	chance = 50,
 	catch_up = false,
 	action = function(pos, node)
-		-- Most likely case, half the time it's too dark for this.
+		-- Check for darkness: night, shadow or under a light-blocking node
+		-- Returns if ignore above
 		local above = {x = pos.x, y = pos.y + 1, z = pos.z}
 		if (minetest.get_node_light(above) or 0) < 13 then
 			return
 		end
 
-		-- Look for likely neighbors.
-		local p2 = minetest.find_node_near(pos, 1, {"default:dirt_with_grass",
-				"default:dirt_with_dry_grass", "default:dirt_with_snow"})
+		-- Look for spreading dirt-type neighbours
+		local p2 = minetest.find_node_near(pos, 1, "group:spreading_dirt_type")
 		if p2 then
-			-- But the node needs to be under air in this case.
-			local n2 = minetest.get_node(above)
-			if n2 and n2.name == "air" then
-				local n3 = minetest.get_node(p2)
-				minetest.set_node(pos, {name = n3.name})
-				return
-			end
-		end
-
-		-- Anything on top?
-		local n2 = minetest.get_node(above)
-		if not n2 then
+			local n3 = minetest.get_node(p2)
+			minetest.set_node(pos, {name = n3.name})
 			return
 		end
 
-		local name = n2.name
-		-- Snow check is cheapest, so comes first.
+		-- Else, any seeding nodes on top?
+		local name = minetest.get_node(above).name
+		-- Snow check is cheapest, so comes first
 		if name == "default:snow" then
 			minetest.set_node(pos, {name = "default:dirt_with_snow"})
-		-- Most likely case first.
+		-- Most likely case first
 		elseif minetest.get_item_group(name, "grass") ~= 0 then
 			minetest.set_node(pos, {name = "default:dirt_with_grass"})
 		elseif minetest.get_item_group(name, "dry_grass") ~= 0 then
@@ -435,16 +409,14 @@ minetest.register_abm({
 	end
 })
 
+
 --
 -- Grass and dry grass removed in darkness
 --
 
 minetest.register_abm({
-	nodenames = {
-		"default:dirt_with_grass",
-		"default:dirt_with_dry_grass",
-		"default:dirt_with_snow",
-	},
+	label = "Grass covered",
+	nodenames = {"group:spreading_dirt_type"},
 	interval = 8,
 	chance = 50,
 	catch_up = false,
@@ -466,12 +438,77 @@ minetest.register_abm({
 --
 
 minetest.register_abm({
-	nodenames = {"default:cobble"},
+	label = "Moss growth",
+	nodenames = {"default:cobble", "stairs:slab_cobble", "stairs:stair_cobble", "walls:cobble"},
 	neighbors = {"group:water"},
 	interval = 16,
 	chance = 200,
 	catch_up = false,
 	action = function(pos, node)
-		minetest.set_node(pos, {name = "default:mossycobble"})
+		if node.name == "default:cobble" then
+			minetest.set_node(pos, {name = "default:mossycobble"})
+		elseif node.name == "stairs:slab_cobble" then
+			minetest.set_node(pos, {name = "stairs:slab_mossycobble", param2 = node.param2})
+		elseif node.name == "stairs:stair_cobble" then
+			minetest.set_node(pos, {name = "stairs:stair_mossycobble", param2 = node.param2})
+		elseif node.name == "walls:cobble" then
+			minetest.set_node(pos, {name = "walls:mossycobble", param2 = node.param2})
+		end
 	end
 })
+
+
+--
+-- Checks if specified volume intersects a protected volume
+--
+
+function default.intersects_protection(minp, maxp, player_name, interval)
+	-- 'interval' is the largest allowed interval for the 3D lattice of checks
+
+	-- Compute the optimal float step 'd' for each axis so that all corners and
+	-- borders are checked. 'd' will be smaller or equal to 'interval'.
+	-- Subtracting 1e-4 ensures that the max co-ordinate will be reached by the
+	-- for loop (which might otherwise not be the case due to rounding errors).
+	local d = {}
+	for _, c in pairs({"x", "y", "z"}) do
+		if maxp[c] > minp[c] then
+			d[c] = (maxp[c] - minp[c]) / math.ceil((maxp[c] - minp[c]) / interval) - 1e-4
+		elseif maxp[c] == minp[c] then
+			d[c] = 1 -- Any value larger than 0 to avoid division by zero
+		else -- maxp[c] < minp[c], print error and treat as protection intersected
+			minetest.log("error", "maxp < minp in 'default.intersects_protection()'")
+			return true
+		end
+	end
+
+	for zf = minp.z, maxp.z, d.z do
+		local z = math.floor(zf + 0.5)
+		for yf = minp.y, maxp.y, d.y do
+			local y = math.floor(yf + 0.5)
+			for xf = minp.x, maxp.x, d.x do
+				local x = math.floor(xf + 0.5)
+				if minetest.is_protected({x = x, y = y, z = z}, player_name) then
+					return true
+				end
+			end
+		end
+	end
+
+	return false
+end
+
+
+--
+-- Coral death near air
+--
+
+minetest.register_abm({
+	nodenames = {"default:coral_brown", "default:coral_orange"},
+	neighbors = {"air"},
+	interval = 17,
+	chance = 5,
+	catch_up = false,
+	action = function(pos, node)
+		minetest.set_node(pos, {name = "default:coral_skeleton"})
+	end,
+})
diff --git a/games/minetest_game/mods/default/furnace.lua b/games/minetest_game/mods/default/furnace.lua
index 3047dc4..4b82205 100644
--- a/games/minetest_game/mods/default/furnace.lua
+++ b/games/minetest_game/mods/default/furnace.lua
@@ -4,7 +4,7 @@
 --
 
 local function active_formspec(fuel_percent, item_percent)
-	local formspec = 
+	local formspec =
 		"size[8,8.5]"..
 		default.gui_bg..
 		default.gui_bg_img..
@@ -22,6 +22,8 @@ local function active_formspec(fuel_percent, item_percent)
 		"listring[current_player;main]"..
 		"listring[current_name;src]"..
 		"listring[current_player;main]"..
+		"listring[current_name;fuel]"..
+		"listring[current_player;main]"..
 		default.get_hotbar_bg(0, 4.25)
 	return formspec
 end
@@ -42,6 +44,8 @@ local inactive_formspec =
 	"listring[current_player;main]"..
 	"listring[current_name;src]"..
 	"listring[current_player;main]"..
+	"listring[current_name;fuel]"..
+	"listring[current_player;main]"..
 	default.get_hotbar_bg(0, 4.25)
 
 --
@@ -109,74 +113,93 @@ local function furnace_node_timer(pos, elapsed)
 	local fuel_totaltime = meta:get_float("fuel_totaltime") or 0
 
 	local inv = meta:get_inventory()
-	local srclist = inv:get_list("src")
-	local fuellist = inv:get_list("fuel")
-	local dstlist = inv:get_list("dst")
-
-	--
-	-- Cooking
-	--
-
-	-- Check if we have cookable content
-	local cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
-	local cookable = true
-
-	if cooked.time == 0 then
-		cookable = false
-	end
-
-	-- Check if we have enough fuel to burn
-	if fuel_time < fuel_totaltime then
-		-- The furnace is currently active and has enough fuel
-		fuel_time = fuel_time + 1
-
-		-- If there is a cookable item then check if it is ready yet
-		if cookable then
-			src_time = src_time + 1
-			if src_time >= cooked.time then
-				-- Place result in dst list if possible
-				if inv:room_for_item("dst", cooked.item) then
-					inv:add_item("dst", cooked.item)
-					inv:set_stack("src", 1, aftercooked.items[1])
-					src_time = 0
+	local srclist, fuellist
+
+	local cookable, cooked
+	local fuel
+
+	local update = true
+	while update do
+		update = false
+
+		srclist = inv:get_list("src")
+		fuellist = inv:get_list("fuel")
+
+		--
+		-- Cooking
+		--
+
+		-- Check if we have cookable content
+		local aftercooked
+		cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
+		cookable = cooked.time ~= 0
+
+		-- Check if we have enough fuel to burn
+		if fuel_time < fuel_totaltime then
+			-- The furnace is currently active and has enough fuel
+			fuel_time = fuel_time + elapsed
+			-- If there is a cookable item then check if it is ready yet
+			if cookable then
+				src_time = src_time + elapsed
+				if src_time >= cooked.time then
+					-- Place result in dst list if possible
+					if inv:room_for_item("dst", cooked.item) then
+						inv:add_item("dst", cooked.item)
+						inv:set_stack("src", 1, aftercooked.items[1])
+						src_time = src_time - cooked.time
+						update = true
+					end
 				end
 			end
-		end
-	else
-		-- Furnace ran out of fuel
-		if cookable then
-			-- We need to get new fuel
-			local fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
-
-			if fuel.time == 0 then
-				-- No valid fuel in fuel list
+		else
+			-- Furnace ran out of fuel
+			if cookable then
+				-- We need to get new fuel
+				local afterfuel
+				fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
+
+				if fuel.time == 0 then
+					-- No valid fuel in fuel list
+					fuel_totaltime = 0
+					src_time = 0
+				else
+					-- Take fuel from fuel list
+					inv:set_stack("fuel", 1, afterfuel.items[1])
+					update = true
+					fuel_totaltime = fuel.time + (fuel_time - fuel_totaltime)
+					src_time = src_time + elapsed
+				end
+			else
+				-- We don't need to get new fuel since there is no cookable item
 				fuel_totaltime = 0
-				fuel_time = 0
 				src_time = 0
-			else
-				-- Take fuel from fuel list
-				inv:set_stack("fuel", 1, afterfuel.items[1])
-
-				fuel_totaltime = fuel.time
-				fuel_time = 0
 			end
-		else
-			-- We don't need to get new fuel since there is no cookable item
-			fuel_totaltime = 0
 			fuel_time = 0
-			src_time = 0
 		end
+
+		elapsed = 0
+	end
+
+	if fuel and fuel_totaltime > fuel.time then
+		fuel_totaltime = fuel.time
+	end
+	if srclist[1]:is_empty() then
+		src_time = 0
 	end
 
 	--
 	-- Update formspec, infotext and node
 	--
 	local formspec = inactive_formspec
-	local item_state = ""
+	local item_state
 	local item_percent = 0
 	if cookable then
 		item_percent = math.floor(src_time / cooked.time * 100)
-		item_state = item_percent .. "%"
+		if item_percent > 100 then
+			item_state = "100% (output full)"
+		else
+			item_state = item_percent .. "%"
+		end
 	else
 		if srclist[1]:is_empty() then
 			item_state = "Empty"
@@ -189,7 +212,7 @@ local function furnace_node_timer(pos, elapsed)
 	local active = "inactive "
 	local result = false
 
-	if fuel_time <= fuel_totaltime and fuel_totaltime ~= 0 then
+	if fuel_totaltime ~= 0 then
 		active = "active "
 		local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100)
 		fuel_state = fuel_percent .. "%"
@@ -203,8 +226,7 @@ local function furnace_node_timer(pos, elapsed)
 		end
 		swap_node(pos, "default:furnace")
 		-- stop timer on the inactive furnace
-		local timer = minetest.get_node_timer(pos)
-		timer:stop()
+		minetest.get_node_timer(pos):stop()
 	end
 
 	local infotext = "Furnace " .. active .. "(Item: " .. item_state .. "; Fuel: " .. fuel_state .. ")"
@@ -252,13 +274,11 @@ minetest.register_node("default:furnace", {
 	end,
 
 	on_metadata_inventory_move = function(pos)
-		local timer = minetest.get_node_timer(pos)
-		timer:start(1.0)
+		minetest.get_node_timer(pos):start(1.0)
 	end,
 	on_metadata_inventory_put = function(pos)
 		-- start timer function, it will sort out whether furnace can burn or not.
-		local timer = minetest.get_node_timer(pos)
-		timer:start(1.0)
+		minetest.get_node_timer(pos):start(1.0)
 	end,
 	on_blast = function(pos)
 		local drops = {}
diff --git a/games/minetest_game/mods/default/init.lua b/games/minetest_game/mods/default/init.lua
index 6f1b148..7b5f62f 100644
--- a/games/minetest_game/mods/default/init.lua
+++ b/games/minetest_game/mods/default/init.lua
@@ -35,14 +35,18 @@ default.gui_survival_form = "size[8,8.5]"..
 			default.get_hotbar_bg(0,4.25)
 
 -- Load files
-dofile(minetest.get_modpath("default").."/functions.lua")
-dofile(minetest.get_modpath("default").."/nodes.lua")
-dofile(minetest.get_modpath("default").."/furnace.lua")
-dofile(minetest.get_modpath("default").."/tools.lua")
-dofile(minetest.get_modpath("default").."/craftitems.lua")
-dofile(minetest.get_modpath("default").."/crafting.lua")
-dofile(minetest.get_modpath("default").."/mapgen.lua")
-dofile(minetest.get_modpath("default").."/player.lua")
-dofile(minetest.get_modpath("default").."/trees.lua")
-dofile(minetest.get_modpath("default").."/aliases.lua")
-dofile(minetest.get_modpath("default").."/legacy.lua")
+local default_path = minetest.get_modpath("default")
+
+dofile(default_path.."/functions.lua")
+dofile(default_path.."/trees.lua")
+dofile(default_path.."/nodes.lua")
+dofile(default_path.."/furnace.lua")
+dofile(default_path.."/torch.lua")
+dofile(default_path.."/tools.lua")
+dofile(default_path.."/item_entity.lua")
+dofile(default_path.."/craftitems.lua")
+dofile(default_path.."/crafting.lua")
+dofile(default_path.."/mapgen.lua")
+dofile(default_path.."/player.lua")
+dofile(default_path.."/aliases.lua")
+dofile(default_path.."/legacy.lua")
diff --git a/games/minetest_game/mods/default/item_entity.lua b/games/minetest_game/mods/default/item_entity.lua
new file mode 100644
index 0000000..c34e60e
--- /dev/null
+++ b/games/minetest_game/mods/default/item_entity.lua
@@ -0,0 +1,74 @@
+-- mods/default/item_entity.lua
+
+local builtin_item = minetest.registered_entities["__builtin:item"]
+
+local item = {
+	set_item = function(self, itemstring)
+		builtin_item.set_item(self, itemstring)
+
+		local stack = ItemStack(itemstring)
+		local itemdef = minetest.registered_items[stack:get_name()]
+		if itemdef and itemdef.groups.flammable ~= 0 then
+			self.flammable = itemdef.groups.flammable
+		end
+	end,
+
+	burn_up = function(self)
+		-- disappear in a smoke puff
+		self.object:remove()
+		local p = self.object:getpos()
+		minetest.sound_play("default_item_smoke", {
+			pos = p,
+			max_hear_distance = 8,
+		})
+		minetest.add_particlespawner({
+			amount = 3,
+			time = 0.1,
+			minpos = {x = p.x - 0.1, y = p.y + 0.1, z = p.z - 0.1 },
+			maxpos = {x = p.x + 0.1, y = p.y + 0.2, z = p.z + 0.1 },
+			minvel = {x = 0, y = 2.5, z = 0},
+			maxvel = {x = 0, y = 2.5, z = 0},
+			minacc = {x = -0.15, y = -0.02, z = -0.15},
+			maxacc = {x = 0.15, y = -0.01, z = 0.15},
+			minexptime = 4,
+			maxexptime = 6,
+			minsize = 5,
+			maxsize = 5,
+			collisiondetection = true,
+			texture = "default_item_smoke.png"
+		})
+	end,
+
+	on_step = function(self, dtime)
+		builtin_item.on_step(self, dtime)
+
+		if self.flammable then
+			-- flammable, check for igniters
+			self.ignite_timer = (self.ignite_timer or 0) + dtime
+			if self.ignite_timer > 10 then
+				self.ignite_timer = 0
+
+				local node = minetest.get_node_or_nil(self.object:getpos())
+				if not node then
+					return
+				end
+
+				-- Immediately burn up flammable items in lava
+				if minetest.get_item_group(node.name, "lava") > 0 then
+					self:burn_up()
+				else
+					--  otherwise there'll be a chance based on its igniter value
+					local burn_chance = self.flammable
+						* minetest.get_item_group(node.name, "igniter")
+					if burn_chance > 0 and math.random(0, burn_chance) ~= 0 then
+						self:burn_up()
+					end
+				end
+			end
+		end
+	end,
+}
+
+-- set defined item as new __builtin:item, with the old one as fallback table
+setmetatable(item, builtin_item)
+minetest.register_entity(":__builtin:item", item)
diff --git a/games/minetest_game/mods/default/legacy.lua b/games/minetest_game/mods/default/legacy.lua
index 76fcc8e..a8c8ad5 100644
--- a/games/minetest_game/mods/default/legacy.lua
+++ b/games/minetest_game/mods/default/legacy.lua
@@ -1,6 +1,6 @@
 -- mods/default/legacy.lua
 
--- Horrible crap to support old code registering falling nodes
+-- Horrible stuff to support old code registering falling nodes
 -- Don't use this and never do what this does, it's completely wrong!
 -- (More specifically, the client and the C++ code doesn't get the group)
 function default.register_falling_node(nodename, texture)
diff --git a/games/minetest_game/mods/default/license.txt b/games/minetest_game/mods/default/license.txt
new file mode 100644
index 0000000..e926736
--- /dev/null
+++ b/games/minetest_game/mods/default/license.txt
@@ -0,0 +1,174 @@
+License of source code
+----------------------
+
+GNU Lesser General Public License, version 2.1
+Copyright (C) 2011-2016 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Copyright (C) 2011-2016 Various Minetest developers and contributors
+
+This program is free software; you can redistribute it and/or modify it under the terms
+of the GNU Lesser General Public License as published by the Free Software Foundation;
+either version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU Lesser General Public License for more details:
+https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+
+
+Licenses of media (textures, models and sounds)
+-----------------------------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2010-2016:
+  celeron55, Perttu Ahola <celeron55 at gmail.com>
+  Cisoun
+  G4JC
+  VanessaE
+  RealBadAngel
+  Calinou
+  MirceaKitsune
+  Jordach
+  PilzAdam
+  jojoa1997
+  InfinityProject
+  Splizard
+  Zeg9
+  paramat
+  BlockMen
+  sofar
+  Neuromancer
+  Gambit
+  asl97
+  KevDoy
+  Mito551
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
+
+-----------------------
+
+Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
+Copyright (C) 2014-2016 brunob.santos
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/4.0/
+
+-----------------------
+
+Attribution-ShareAlike 2.0 Generic (CC BY-SA 2.0)
+Copyright (C) 2014-2016 Neuromancer
+
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/2.0/
+
+-----------------------
+
+Attribution 3.0 Unported (CC BY 3.0)
+Copyright (C) 2009 cmusounddesign
+Copyright (C) 2010 Tomlija
+Copyright (C) 2010 lsprice
+Copyright (C) 2014 sonictechtonic
+Copyright (C) 2015 yadronoff
+Copyright (C) 2007 HerbertBoland
+Copyright (C) 2006 AGFX
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by/3.0/
diff --git a/games/minetest_game/mods/default/mapgen.lua b/games/minetest_game/mods/default/mapgen.lua
index 016d58d..d786a84 100644
--- a/games/minetest_game/mods/default/mapgen.lua
+++ b/games/minetest_game/mods/default/mapgen.lua
@@ -42,14 +42,15 @@ minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebr
 -- Register ores
 --
 
--- All mapgens except singlenode
--- Blob ore first to avoid other ores inside blobs
-
 function default.register_ores()
+	minetest.clear_registered_ores()
+	-- Blob ores
+	-- These first to avoid other ores in blobs
 
 	-- Clay
+	-- This first to avoid clay in sand blobs
 
-	minetest.register_ore({ 
+	minetest.register_ore({
 		ore_type        = "blob",
 		ore             = "default:clay",
 		wherein         = {"default:sand"},
@@ -70,7 +71,7 @@ function default.register_ores()
 
 	-- Sand
 
-	minetest.register_ore({ 
+	minetest.register_ore({
 		ore_type        = "blob",
 		ore             = "default:sand",
 		wherein         = {"default:stone", "default:sandstone",
@@ -78,7 +79,7 @@ function default.register_ores()
 		clust_scarcity  = 16 * 16 * 16,
 		clust_size      = 5,
 		y_min           = -31,
-		y_max           = 4,
+		y_max           = 0,
 		noise_threshold = 0.0,
 		noise_params    = {
 			offset = 0.5,
@@ -95,7 +96,7 @@ function default.register_ores()
 	minetest.register_ore({
 		ore_type        = "blob",
 		ore             = "default:dirt",
-		wherein         = {"default:stone", "default:sandstone"},
+		wherein         = {"default:stone"},
 		clust_scarcity  = 16 * 16 * 16,
 		clust_size      = 5,
 		y_min           = -31,
@@ -109,6 +110,8 @@ function default.register_ores()
 			octaves = 1,
 			persist = 0.0
 		},
+		biomes = {"taiga", "snowy_grassland", "grassland", "coniferous_forest",
+			"deciduous_forest", "savanna", "rainforest"}
 	})
 
 	-- Gravel
@@ -132,6 +135,8 @@ function default.register_ores()
 		},
 	})
 
+	-- Scatter ores
+
 	-- Coal
 
 	minetest.register_ore({
@@ -139,6 +144,17 @@ function default.register_ores()
 		ore            = "default:stone_with_coal",
 		wherein        = "default:stone",
 		clust_scarcity = 8 * 8 * 8,
+		clust_num_ores = 9,
+		clust_size     = 3,
+		y_min          = 1025,
+		y_max          = 31000,
+	})
+
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "default:stone_with_coal",
+		wherein        = "default:stone",
+		clust_scarcity = 8 * 8 * 8,
 		clust_num_ores = 8,
 		clust_size     = 3,
 		y_min          = -31000,
@@ -162,53 +178,88 @@ function default.register_ores()
 		ore_type       = "scatter",
 		ore            = "default:stone_with_iron",
 		wherein        = "default:stone",
-		clust_scarcity = 12 * 12 * 12,
-		clust_num_ores = 3,
-		clust_size     = 2,
-		y_min          = -15,
-		y_max          = 2,
+		clust_scarcity = 9 * 9 * 9,
+		clust_num_ores = 12,
+		clust_size     = 3,
+		y_min          = 1025,
+		y_max          = 31000,
 	})
 
 	minetest.register_ore({
 		ore_type       = "scatter",
 		ore            = "default:stone_with_iron",
 		wherein        = "default:stone",
+		clust_scarcity = 7 * 7 * 7,
+		clust_num_ores = 5,
+		clust_size     = 3,
+		y_min          = -31000,
+		y_max          = 0,
+	})
+
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "default:stone_with_iron",
+		wherein        = "default:stone",
+		clust_scarcity = 24 * 24 * 24,
+		clust_num_ores = 27,
+		clust_size     = 6,
+		y_min          = -31000,
+		y_max          = -64,
+	})
+
+	-- Copper
+
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "default:stone_with_copper",
+		wherein        = "default:stone",
 		clust_scarcity = 9 * 9 * 9,
 		clust_num_ores = 5,
 		clust_size     = 3,
+		y_min          = 1025,
+		y_max          = 31000,
+	})
+
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "default:stone_with_copper",
+		wherein        = "default:stone",
+		clust_scarcity = 12 * 12 * 12,
+		clust_num_ores = 4,
+		clust_size     = 3,
 		y_min          = -63,
 		y_max          = -16,
 	})
 
 	minetest.register_ore({
 		ore_type       = "scatter",
-		ore            = "default:stone_with_iron",
+		ore            = "default:stone_with_copper",
 		wherein        = "default:stone",
-		clust_scarcity = 7 * 7 * 7,
+		clust_scarcity = 9 * 9 * 9,
 		clust_num_ores = 5,
 		clust_size     = 3,
 		y_min          = -31000,
 		y_max          = -64,
 	})
 
+	-- Gold
+
 	minetest.register_ore({
 		ore_type       = "scatter",
-		ore            = "default:stone_with_iron",
+		ore            = "default:stone_with_gold",
 		wherein        = "default:stone",
-		clust_scarcity = 24 * 24 * 24,
-		clust_num_ores = 27,
-		clust_size     = 6,
-		y_min          = -31000,
-		y_max          = -64,
+		clust_scarcity = 13 * 13 * 13,
+		clust_num_ores = 5,
+		clust_size     = 3,
+		y_min          = 1025,
+		y_max          = 31000,
 	})
 
-	--Mese
-
 	minetest.register_ore({
 		ore_type       = "scatter",
-		ore            = "default:stone_with_mese",
+		ore            = "default:stone_with_gold",
 		wherein        = "default:stone",
-		clust_scarcity = 18 * 18 * 18,
+		clust_scarcity = 15 * 15 * 15,
 		clust_num_ores = 3,
 		clust_size     = 2,
 		y_min          = -255,
@@ -217,33 +268,33 @@ function default.register_ores()
 
 	minetest.register_ore({
 		ore_type       = "scatter",
-		ore            = "default:stone_with_mese",
+		ore            = "default:stone_with_gold",
 		wherein        = "default:stone",
-		clust_scarcity = 14 * 14 * 14,
+		clust_scarcity = 13 * 13 * 13,
 		clust_num_ores = 5,
 		clust_size     = 3,
 		y_min          = -31000,
 		y_max          = -256,
 	})
 
+	-- Mese crystal
+
 	minetest.register_ore({
 		ore_type       = "scatter",
-		ore            = "default:mese",
+		ore            = "default:stone_with_mese",
 		wherein        = "default:stone",
-		clust_scarcity = 36 * 36 * 36,
-		clust_num_ores = 3,
-		clust_size     = 2,
-		y_min          = -31000,
-		y_max          = -1024,
+		clust_scarcity = 14 * 14 * 14,
+		clust_num_ores = 5,
+		clust_size     = 3,
+		y_min          = 1025,
+		y_max          = 31000,
 	})
 
-	-- Gold
-
 	minetest.register_ore({
 		ore_type       = "scatter",
-		ore            = "default:stone_with_gold",
+		ore            = "default:stone_with_mese",
 		wherein        = "default:stone",
-		clust_scarcity = 15 * 15 * 15,
+		clust_scarcity = 18 * 18 * 18,
 		clust_num_ores = 3,
 		clust_size     = 2,
 		y_min          = -255,
@@ -252,9 +303,9 @@ function default.register_ores()
 
 	minetest.register_ore({
 		ore_type       = "scatter",
-		ore            = "default:stone_with_gold",
+		ore            = "default:stone_with_mese",
 		wherein        = "default:stone",
-		clust_scarcity = 13 * 13 * 13,
+		clust_scarcity = 14 * 14 * 14,
 		clust_num_ores = 5,
 		clust_size     = 3,
 		y_min          = -31000,
@@ -267,6 +318,17 @@ function default.register_ores()
 		ore_type       = "scatter",
 		ore            = "default:stone_with_diamond",
 		wherein        = "default:stone",
+		clust_scarcity = 15 * 15 * 15,
+		clust_num_ores = 4,
+		clust_size     = 3,
+		y_min          = 1025,
+		y_max          = 31000,
+	})
+
+	minetest.register_ore({
+		ore_type       = "scatter",
+		ore            = "default:stone_with_diamond",
+		wherein        = "default:stone",
 		clust_scarcity = 17 * 17 * 17,
 		clust_num_ores = 4,
 		clust_size     = 3,
@@ -285,28 +347,28 @@ function default.register_ores()
 		y_max          = -256,
 	})
 
-	-- Copper
+	-- Mese block
 
 	minetest.register_ore({
 		ore_type       = "scatter",
-		ore            = "default:stone_with_copper",
+		ore            = "default:mese",
 		wherein        = "default:stone",
-		clust_scarcity = 12 * 12 * 12,
-		clust_num_ores = 4,
-		clust_size     = 3,
-		y_min          = -63,
-		y_max          = -16,
+		clust_scarcity = 36 * 36 * 36,
+		clust_num_ores = 3,
+		clust_size     = 2,
+		y_min          = 1025,
+		y_max          = 31000,
 	})
 
 	minetest.register_ore({
 		ore_type       = "scatter",
-		ore            = "default:stone_with_copper",
+		ore            = "default:mese",
 		wherein        = "default:stone",
-		clust_scarcity = 9 * 9 * 9,
-		clust_num_ores = 5,
-		clust_size     = 3,
+		clust_scarcity = 36 * 36 * 36,
+		clust_num_ores = 3,
+		clust_size     = 2,
 		y_min          = -31000,
-		y_max          = -64,
+		y_max          = -1024,
 	})
 end
 
@@ -320,10 +382,10 @@ end
 function default.register_biomes()
 	minetest.clear_registered_biomes()
 
-	-- Permanent ice
+	-- Icesheet
 
 	minetest.register_biome({
-		name = "glacier",
+		name = "icesheet",
 		node_dust = "default:snowblock",
 		node_top = "default:snowblock",
 		depth_top = 1,
@@ -334,48 +396,52 @@ function default.register_biomes()
 		depth_water_top = 10,
 		--node_water = "",
 		node_river_water = "default:ice",
+		node_riverbed = "default:gravel",
+		depth_riverbed = 2,
 		y_min = -8,
 		y_max = 31000,
 		heat_point = 0,
-		humidity_point = 50,
+		humidity_point = 73,
 	})
 
 	minetest.register_biome({
-		name = "glacier_ocean",
+		name = "icesheet_ocean",
 		node_dust = "default:snowblock",
 		node_top = "default:sand",
 		depth_top = 1,
 		node_filler = "default:sand",
 		depth_filler = 3,
 		--node_stone = "",
-		--node_water_top = "",
-		--depth_water_top = ,
+		node_water_top = "default:ice",
+		depth_water_top = 10,
 		--node_water = "",
 		--node_river_water = "",
 		y_min = -112,
 		y_max = -9,
 		heat_point = 0,
-		humidity_point = 50,
+		humidity_point = 73,
 	})
 
-	-- Cold
+	-- Tundra
 
 	minetest.register_biome({
 		name = "tundra",
-		--node_dust = "",
-		node_top = "default:dirt_with_snow",
-		depth_top = 1,
-		node_filler = "default:dirt",
-		depth_filler = 1,
+		node_dust = "default:snowblock",
+		--node_top = ,
+		--depth_top = ,
+		--node_filler = ,
+		--depth_filler = ,
 		--node_stone = "",
 		--node_water_top = "",
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:gravel",
+		depth_riverbed = 2,
 		y_min = 2,
 		y_max = 31000,
-		heat_point = 15,
-		humidity_point = 35,
+		heat_point = 0,
+		humidity_point = 40,
 	})
 
 	minetest.register_biome({
@@ -390,10 +456,12 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:gravel",
+		depth_riverbed = 2,
 		y_min = -3,
 		y_max = 1,
-		heat_point = 15,
-		humidity_point = 35,
+		heat_point = 0,
+		humidity_point = 40,
 	})
 
 	minetest.register_biome({
@@ -408,12 +476,15 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:gravel",
+		depth_riverbed = 2,
 		y_min = -112,
 		y_max = -4,
-		heat_point = 15,
-		humidity_point = 35,
+		heat_point = 0,
+		humidity_point = 40,
 	})
 
+	-- Taiga
 
 	minetest.register_biome({
 		name = "taiga",
@@ -427,10 +498,12 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = 2,
 		y_max = 31000,
-		heat_point = 15,
-		humidity_point = 65,
+		heat_point = 25,
+		humidity_point = 70,
 	})
 
 	minetest.register_biome({
@@ -445,16 +518,60 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = -112,
 		y_max = 1,
-		heat_point = 15,
-		humidity_point = 65,
+		heat_point = 25,
+		humidity_point = 70,
 	})
 
-	-- Temperate
+	-- Snowy grassland
 
 	minetest.register_biome({
-		name = "stone_grassland",
+		name = "snowy_grassland",
+		node_dust = "default:snow",
+		node_top = "default:dirt_with_snow",
+		depth_top = 1,
+		node_filler = "default:dirt",
+		depth_filler = 1,
+		--node_stone = "",
+		--node_water_top = "",
+		--depth_water_top = ,
+		--node_water = "",
+		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
+		y_min = 5,
+		y_max = 31000,
+		heat_point = 20,
+		humidity_point = 35,
+	})
+
+	minetest.register_biome({
+		name = "snowy_grassland_ocean",
+		--node_dust = "",
+		node_top = "default:sand",
+		depth_top = 1,
+		node_filler = "default:sand",
+		depth_filler = 3,
+		--node_stone = "",
+		--node_water_top = "",
+		--depth_water_top = ,
+		--node_water = "",
+		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
+		y_min = -112,
+		y_max = 4,
+		heat_point = 20,
+		humidity_point = 35,
+	})
+
+	-- Grassland
+
+	minetest.register_biome({
+		name = "grassland",
 		--node_dust = "",
 		node_top = "default:dirt_with_grass",
 		depth_top = 1,
@@ -465,14 +582,16 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = 6,
 		y_max = 31000,
-		heat_point = 40,
+		heat_point = 50,
 		humidity_point = 35,
 	})
 
 	minetest.register_biome({
-		name = "stone_grassland_dunes",
+		name = "grassland_dunes",
 		--node_dust = "",
 		node_top = "default:sand",
 		depth_top = 1,
@@ -483,14 +602,16 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = 5,
 		y_max = 5,
-		heat_point = 40,
+		heat_point = 50,
 		humidity_point = 35,
 	})
 
 	minetest.register_biome({
-		name = "stone_grassland_ocean",
+		name = "grassland_ocean",
 		--node_dust = "",
 		node_top = "default:sand",
 		depth_top = 1,
@@ -501,12 +622,15 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = -112,
 		y_max = 4,
-		heat_point = 40,
+		heat_point = 50,
 		humidity_point = 35,
 	})
 
+	-- Coniferous forest
 
 	minetest.register_biome({
 		name = "coniferous_forest",
@@ -520,10 +644,12 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = 6,
 		y_max = 31000,
-		heat_point = 40,
-		humidity_point = 65,
+		heat_point = 45,
+		humidity_point = 70,
 	})
 
 	minetest.register_biome({
@@ -538,10 +664,12 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = 5,
 		y_max = 5,
-		heat_point = 40,
-		humidity_point = 65,
+		heat_point = 45,
+		humidity_point = 70,
 	})
 
 	minetest.register_biome({
@@ -556,160 +684,203 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = -112,
 		y_max = 4,
-		heat_point = 40,
-		humidity_point = 65,
+		heat_point = 45,
+		humidity_point = 70,
 	})
 
+	-- Deciduous forest
 
 	minetest.register_biome({
-		name = "sandstone_grassland",
+		name = "deciduous_forest",
 		--node_dust = "",
 		node_top = "default:dirt_with_grass",
 		depth_top = 1,
 		node_filler = "default:dirt",
-		depth_filler = 1,
-		node_stone = "default:sandstone",
+		depth_filler = 3,
+		--node_stone = "",
 		--node_water_top = "",
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
-		y_min = 6,
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
+		y_min = 1,
 		y_max = 31000,
 		heat_point = 60,
-		humidity_point = 35,
+		humidity_point = 68,
 	})
 
 	minetest.register_biome({
-		name = "sandstone_grassland_dunes",
+		name = "deciduous_forest_shore",
 		--node_dust = "",
-		node_top = "default:sand",
+		node_top = "default:dirt",
 		depth_top = 1,
-		node_filler = "default:sand",
-		depth_filler = 2,
-		node_stone = "default:sandstone",
+		node_filler = "default:dirt",
+		depth_filler = 3,
+		--node_stone = "",
 		--node_water_top = "",
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
-		y_min = 5,
-		y_max = 5,
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
+		y_min = -1,
+		y_max = 0,
 		heat_point = 60,
-		humidity_point = 35,
+		humidity_point = 68,
 	})
 
 	minetest.register_biome({
-		name = "sandstone_grassland_ocean",
+		name = "deciduous_forest_ocean",
 		--node_dust = "",
 		node_top = "default:sand",
 		depth_top = 1,
 		node_filler = "default:sand",
 		depth_filler = 3,
-		node_stone = "default:sandstone",
+		--node_stone = "",
 		--node_water_top = "",
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = -112,
-		y_max = 4,
+		y_max = -2,
 		heat_point = 60,
-		humidity_point = 35,
+		humidity_point = 68,
 	})
 
+	-- Desert
 
 	minetest.register_biome({
-		name = "deciduous_forest",
+		name = "desert",
 		--node_dust = "",
-		node_top = "default:dirt_with_grass",
+		node_top = "default:desert_sand",
 		depth_top = 1,
-		node_filler = "default:dirt",
-		depth_filler = 3,
-		--node_stone = "",
+		node_filler = "default:desert_sand",
+		depth_filler = 1,
+		node_stone = "default:desert_stone",
 		--node_water_top = "",
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
-		y_min = 1,
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
+		y_min = 5,
 		y_max = 31000,
-		heat_point = 60,
-		humidity_point = 65,
+		heat_point = 92,
+		humidity_point = 16,
 	})
 
 	minetest.register_biome({
-		name = "deciduous_forest_swamp",
+		name = "desert_ocean",
 		--node_dust = "",
-		node_top = "default:dirt",
+		node_top = "default:sand",
 		depth_top = 1,
-		node_filler = "default:dirt",
+		node_filler = "default:sand",
 		depth_filler = 3,
-		--node_stone = "",
+		node_stone = "default:desert_stone",
 		--node_water_top = "",
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
-		y_min = -3,
-		y_max = 0,
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
+		y_min = -112,
+		y_max = 4,
+		heat_point = 92,
+		humidity_point = 16,
+	})
+
+	-- Sandstone desert
+
+	minetest.register_biome({
+		name = "sandstone_desert",
+		--node_dust = "",
+		node_top = "default:sand",
+		depth_top = 1,
+		node_filler = "default:sand",
+		depth_filler = 0,
+		node_stone = "default:sandstone",
+		--node_water_top = "",
+		--depth_water_top = ,
+		--node_water = "",
+		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
+		y_min = 5,
+		y_max = 31000,
 		heat_point = 60,
-		humidity_point = 65,
+		humidity_point = 0,
 	})
 
 	minetest.register_biome({
-		name = "deciduous_forest_ocean",
+		name = "sandstone_desert_ocean",
 		--node_dust = "",
 		node_top = "default:sand",
 		depth_top = 1,
 		node_filler = "default:sand",
 		depth_filler = 3,
-		--node_stone = "",
+		node_stone = "default:sandstone",
 		--node_water_top = "",
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = -112,
-		y_max = -4,
+		y_max = 4,
 		heat_point = 60,
-		humidity_point = 65,
+		humidity_point = 0,
 	})
 
-	-- Hot
+	-- Cold desert
 
 	minetest.register_biome({
-		name = "desert",
+		name = "cold_desert",
 		--node_dust = "",
-		node_top = "default:desert_sand",
+		node_top = "default:silver_sand",
 		depth_top = 1,
-		node_filler = "default:desert_sand",
+		node_filler = "default:silver_sand",
 		depth_filler = 1,
-		node_stone = "default:desert_stone",
+		--node_stone = "",
 		--node_water_top = "",
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = 5,
 		y_max = 31000,
-		heat_point = 85,
-		humidity_point = 20,
+		heat_point = 40,
+		humidity_point = 0,
 	})
 
 	minetest.register_biome({
-		name = "desert_ocean",
+		name = "cold_desert_ocean",
 		--node_dust = "",
 		node_top = "default:sand",
 		depth_top = 1,
 		node_filler = "default:sand",
 		depth_filler = 3,
-		node_stone = "default:desert_stone",
+		--node_stone = "",
 		--node_water_top = "",
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = -112,
 		y_max = 4,
-		heat_point = 85,
-		humidity_point = 20,
+		heat_point = 40,
+		humidity_point = 0,
 	})
 
+	-- Savanna
 
 	minetest.register_biome({
 		name = "savanna",
@@ -723,14 +894,16 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = 1,
 		y_max = 31000,
-		heat_point = 85,
-		humidity_point = 50,
+		heat_point = 89,
+		humidity_point = 42,
 	})
 
 	minetest.register_biome({
-		name = "savanna_swamp",
+		name = "savanna_shore",
 		--node_dust = "",
 		node_top = "default:dirt",
 		depth_top = 1,
@@ -741,10 +914,12 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
-		y_min = -3,
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
+		y_min = -1,
 		y_max = 0,
-		heat_point = 85,
-		humidity_point = 50,
+		heat_point = 89,
+		humidity_point = 42,
 	})
 
 	minetest.register_biome({
@@ -759,12 +934,15 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = -112,
-		y_max = -4,
-		heat_point = 85,
-		humidity_point = 50,
+		y_max = -2,
+		heat_point = 89,
+		humidity_point = 42,
 	})
 
+	-- Rainforest
 
 	minetest.register_biome({
 		name = "rainforest",
@@ -778,10 +956,12 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = 1,
 		y_max = 31000,
-		heat_point = 85,
-		humidity_point = 80,
+		heat_point = 86,
+		humidity_point = 65,
 	})
 
 	minetest.register_biome({
@@ -796,10 +976,12 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
-		y_min = -3,
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
+		y_min = -1,
 		y_max = 0,
-		heat_point = 85,
-		humidity_point = 80,
+		heat_point = 86,
+		humidity_point = 65,
 	})
 
 	minetest.register_biome({
@@ -814,10 +996,12 @@ function default.register_biomes()
 		--depth_water_top = ,
 		--node_water = "",
 		--node_river_water = "",
+		node_riverbed = "default:sand",
+		depth_riverbed = 2,
 		y_min = -112,
-		y_max = -4,
-		heat_point = 85,
-		humidity_point = 80,
+		y_max = -2,
+		heat_point = 86,
+		humidity_point = 65,
 	})
 
 	-- Underground
@@ -936,7 +1120,8 @@ function default.register_mgv6_decorations()
 	})
 end
 
--- All mapgens except mgv6 and singlenode
+
+-- All mapgens except mgv6
 
 local function register_grass_decoration(offset, scale, length)
 	minetest.register_decoration({
@@ -951,13 +1136,11 @@ local function register_grass_decoration(offset, scale, length)
 			octaves = 3,
 			persist = 0.6
 		},
-		biomes = {"stone_grassland", "sandstone_grassland",
-			"deciduous_forest", "coniferous_forest",
-			"stone_grassland_dunes", "sandstone_grassland_dunes",
-			"coniferous_forest_dunes"},
+		biomes = {"grassland", "grassland_dunes", "deciduous_forest",
+			"coniferous_forest", "coniferous_forest_dunes"},
 		y_min = 1,
 		y_max = 31000,
-		decoration = "default:grass_"..length,
+		decoration = "default:grass_" .. length,
 	})
 end
 
@@ -977,10 +1160,11 @@ local function register_dry_grass_decoration(offset, scale, length)
 		biomes = {"savanna"},
 		y_min = 1,
 		y_max = 31000,
-		decoration = "default:dry_grass_"..length,
+		decoration = "default:dry_grass_" .. length,
 	})
 end
 
+
 function default.register_decorations()
 	minetest.clear_registered_decorations()
 
@@ -1001,7 +1185,7 @@ function default.register_decorations()
 		biomes = {"deciduous_forest"},
 		y_min = 1,
 		y_max = 31000,
-		schematic = minetest.get_modpath("default").."/schematics/apple_tree.mts",
+		schematic = minetest.get_modpath("default") .. "/schematics/apple_tree.mts",
 		flags = "place_center_x, place_center_z",
 	})
 
@@ -1046,9 +1230,9 @@ function default.register_decorations()
 		sidelen = 80,
 		fill_ratio = 0.1,
 		biomes = {"rainforest", "rainforest_swamp"},
-		y_min = 0,
+		y_min = -1,
 		y_max = 31000,
-		schematic = minetest.get_modpath("default").."/schematics/jungle_tree.mts",
+		schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts",
 		flags = "place_center_x, place_center_z",
 		rotation = "random",
 	})
@@ -1096,7 +1280,7 @@ function default.register_decorations()
 		biomes = {"taiga", "coniferous_forest"},
 		y_min = 2,
 		y_max = 31000,
-		schematic = minetest.get_modpath("default").."/schematics/pine_tree.mts",
+		schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts",
 		flags = "place_center_x, place_center_z",
 	})
 
@@ -1150,7 +1334,7 @@ function default.register_decorations()
 		biomes = {"savanna"},
 		y_min = 1,
 		y_max = 31000,
-		schematic = minetest.get_modpath("default").."/schematics/acacia_tree.mts",
+		schematic = minetest.get_modpath("default") .. "/schematics/acacia_tree.mts",
 		flags = "place_center_x, place_center_z",
 		rotation = "random",
 	})
@@ -1202,7 +1386,7 @@ function default.register_decorations()
 		biomes = {"deciduous_forest"},
 		y_min = 1,
 		y_max = 31000,
-		schematic = minetest.get_modpath("default").."/schematics/aspen_tree.mts",
+		schematic = minetest.get_modpath("default") .. "/schematics/aspen_tree.mts",
 		flags = "place_center_x, place_center_z",
 	})
 
@@ -1238,6 +1422,7 @@ function default.register_decorations()
 		flags = "place_center_x",
 		rotation = "random",
 	})
+
 	-- Large cactus
 
 	minetest.register_decoration({
@@ -1255,7 +1440,7 @@ function default.register_decorations()
 		biomes = {"desert"},
 		y_min = 5,
 		y_max = 31000,
-		schematic = minetest.get_modpath("default").."/schematics/large_cactus.mts",
+		schematic = minetest.get_modpath("default") .. "/schematics/large_cactus.mts",
 		flags = "place_center_x",
 		rotation = "random",
 	})
@@ -1296,10 +1481,52 @@ function default.register_decorations()
 			octaves = 3,
 			persist = 0.7
 		},
-		biomes = {"savanna_swamp"},
+		biomes = {"savanna_shore"},
 		y_min = 0,
 		y_max = 0,
-		schematic = minetest.get_modpath("default").."/schematics/papyrus.mts",
+		schematic = minetest.get_modpath("default") .. "/schematics/papyrus.mts",
+	})
+
+	-- Bush
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"default:dirt_with_grass", "default:dirt_with_snow"},
+		sidelen = 16,
+		noise_params = {
+			offset = -0.004,
+			scale = 0.01,
+			spread = {x = 100, y = 100, z = 100},
+			seed = 137,
+			octaves = 3,
+			persist = 0.7,
+		},
+		biomes = {"snowy_grassland", "grassland", "deciduous_forest"},
+		y_min = 1,
+		y_max = 31000,
+		schematic = minetest.get_modpath("default") .. "/schematics/bush.mts",
+		flags = "place_center_x, place_center_z",
+	})
+
+	-- Acacia bush
+
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"default:dirt_with_dry_grass"},
+		sidelen = 16,
+		noise_params = {
+			offset = -0.004,
+			scale = 0.01,
+			spread = {x = 100, y = 100, z = 100},
+			seed = 90155,
+			octaves = 3,
+			persist = 0.7,
+		},
+		biomes = {"savanna"},
+		y_min = 1,
+		y_max = 31000,
+		schematic = minetest.get_modpath("default") .. "/schematics/acacia_bush.mts",
+		flags = "place_center_x, place_center_z",
 	})
 
 	-- Grasses
@@ -1335,7 +1562,8 @@ function default.register_decorations()
 
 	minetest.register_decoration({
 		deco_type = "simple",
-		place_on = {"default:desert_sand", "default:dirt_with_snow"},
+		place_on = {"default:desert_sand",
+			"default:sand", "default:silver_sand"},
 		sidelen = 16,
 		noise_params = {
 			offset = 0,
@@ -1345,63 +1573,36 @@ function default.register_decorations()
 			octaves = 3,
 			persist = 0.6
 		},
-		biomes = {"desert", "tundra"},
+		biomes = {"desert", "sandstone_desert", "cold_desert"},
 		y_min = 2,
 		y_max = 31000,
 		decoration = "default:dry_shrub",
 	})
-end
 
+	-- Coral reef
 
---
--- Generate nyan cats
---
-
--- All mapgens except singlenode
-
-function default.make_nyancat(pos, facedir, length)
-	local tailvec = {x = 0, y = 0, z = 0}
-	if facedir == 0 then
-		tailvec.z = 1
-	elseif facedir == 1 then
-		tailvec.x = 1
-	elseif facedir == 2 then
-		tailvec.z = -1
-	elseif facedir == 3 then
-		tailvec.x = -1
-	else
-		facedir = 0
-		tailvec.z = 1
-	end
-	local p = {x = pos.x, y = pos.y, z = pos.z}
-	minetest.set_node(p, {name = "default:nyancat", param2 = facedir})
-	for i = 1, length do
-		p.x = p.x + tailvec.x
-		p.z = p.z + tailvec.z
-		minetest.set_node(p, {name = "default:nyancat_rainbow", param2 = facedir})
-	end
-end
-
-function default.generate_nyancats(minp, maxp, seed)
-	local height_min = -31000
-	local height_max = -32
-	if maxp.y < height_min or minp.y > height_max then
-		return
-	end
-	local y_min = math.max(minp.y, height_min)
-	local y_max = math.min(maxp.y, height_max)
-	local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
-	local pr = PseudoRandom(seed + 9324342)
-	local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
-	for i = 1, max_num_nyancats do
-		if pr:next(0, 1000) == 0 then
-			local x0 = pr:next(minp.x, maxp.x)
-			local y0 = pr:next(minp.y, maxp.y)
-			local z0 = pr:next(minp.z, maxp.z)
-			local p0 = {x = x0, y = y0, z = z0}
-			default.make_nyancat(p0, pr:next(0, 3), pr:next(3, 15))
-		end
-	end
+	minetest.register_decoration({
+		deco_type = "schematic",
+		place_on = {"default:sand"},
+		noise_params = {
+			offset = -0.1,
+			scale = 0.1,
+			spread = {x = 200, y = 200, z = 200},
+			seed = 7013,
+			octaves = 3,
+			persist = 1,
+		},
+		biomes = {
+			"desert_ocean",
+			"savanna_ocean",
+			"rainforest_ocean",
+		},
+		y_min = -8,
+		y_max = -2,
+		schematic = minetest.get_modpath("default") .. "/schematics/corals.mts",
+		flags = "place_center_x, place_center_z",
+		rotation = "random",
+	})
 end
 
 
@@ -1409,17 +1610,12 @@ end
 -- Detect mapgen to select functions
 --
 
--- Mods using singlenode mapgen can call these functions to enable
--- the use of minetest.generate_ores or minetest.generate_decorations
-
-local mg_params = minetest.get_mapgen_params()
-if mg_params.mgname == "v6" then
+local mg_name = minetest.get_mapgen_setting("mg_name")
+if mg_name == "v6" then
 	default.register_ores()
 	default.register_mgv6_decorations()
-	minetest.register_on_generated(default.generate_nyancats)
-elseif mg_params.mgname ~= "singlenode" then
+else
 	default.register_biomes()
 	default.register_ores()
 	default.register_decorations()
-	minetest.register_on_generated(default.generate_nyancats)
 end
diff --git a/games/minetest_game/mods/default/models/character.b3d b/games/minetest_game/mods/default/models/character.b3d
index 2699d65..9ab4543 100644
Binary files a/games/minetest_game/mods/default/models/character.b3d and b/games/minetest_game/mods/default/models/character.b3d differ
diff --git a/games/minetest_game/mods/default/models/character.blend b/games/minetest_game/mods/default/models/character.blend
index b5c7fc3..fca9f65 100644
Binary files a/games/minetest_game/mods/default/models/character.blend and b/games/minetest_game/mods/default/models/character.blend differ
diff --git a/games/minetest_game/mods/default/models/torch_ceiling.obj b/games/minetest_game/mods/default/models/torch_ceiling.obj
new file mode 100644
index 0000000..ea51f3c
--- /dev/null
+++ b/games/minetest_game/mods/default/models/torch_ceiling.obj
@@ -0,0 +1,58 @@
+# Blender v2.77 (sub 0) OBJ File: 'torch_ceiling.blend'
+# www.blender.org
+mtllib torch_ceiling.mtl
+o Cube_Cube.001
+v -0.062469 -0.047331 0.068152
+v -0.062469 -0.559515 -0.164388
+v -0.062469 0.004344 -0.045667
+v -0.062469 -0.507839 -0.278206
+v 0.062531 -0.047331 0.068152
+v 0.062531 -0.559515 -0.164388
+v 0.062531 0.004344 -0.045667
+v 0.062531 -0.507839 -0.278206
+v 0.353584 0.040000 0.363553
+v 0.353584 -0.397500 0.363553
+v -0.353522 0.040000 -0.343553
+v -0.353522 -0.397500 -0.343553
+v 0.353584 0.040000 -0.343553
+v -0.353522 0.040000 0.363553
+v 0.353584 -0.397500 -0.343553
+v -0.353522 -0.397500 0.363553
+vt 0.5625 0.5000
+vt 0.5625 0.6250
+vt 0.4375 0.6250
+vt 0.4375 0.5000
+vt 0.4375 0.0000
+vt 0.5625 0.0000
+vt 0.5625 0.1250
+vt 0.4375 0.1250
+vt 0.5625 0.6250
+vt 0.4375 0.6250
+vt 0.4375 0.6250
+vt 0.4375 0.0000
+vt 0.5625 0.6250
+vt 0.5625 0.0000
+vt 1.0000 0.5625
+vt 1.0000 1.0000
+vt 0.0000 1.0000
+vt 0.0000 0.5625
+vt 0.0000 0.5625
+vt 1.0000 0.5625
+vt 1.0000 1.0000
+vt 0.0000 1.0000
+vn 0.0000 0.9105 0.4134
+vn -0.0000 -0.4134 0.9105
+vn -1.0000 0.0000 0.0000
+vn 0.7071 0.0000 -0.7071
+vn 0.7071 0.0000 0.7071
+usemtl Material.001
+s off
+f 3/1/1 1/2/1 5/3/1 7/4/1
+f 8/5/1 4/6/1 2/7/1 6/8/1
+f 3/9/2 4/6/2 8/5/2 7/10/2
+f 1/11/3 3/9/3 4/6/3 2/12/3
+f 5/13/2 1/11/2 2/12/2 6/14/2
+f 7/10/3 8/5/3 6/14/3 5/13/3
+usemtl Material.002
+f 9/15/4 10/16/4 12/17/4 11/18/4
+f 13/19/5 14/20/5 16/21/5 15/22/5
diff --git a/games/minetest_game/mods/default/models/torch_floor.obj b/games/minetest_game/mods/default/models/torch_floor.obj
new file mode 100644
index 0000000..e2487ef
--- /dev/null
+++ b/games/minetest_game/mods/default/models/torch_floor.obj
@@ -0,0 +1,50 @@
+# Blender v2.76 (sub 11) OBJ File: 'torch_floor.blend'
+# www.blender.org
+mtllib torch_floor.mtl
+o Cube_Cube.001
+v 0.062500 0.062500 -0.062500
+v 0.062500 -0.500000 -0.062500
+v 0.062500 0.062500 0.062500
+v 0.062500 -0.500000 0.062500
+v -0.062500 0.062500 -0.062500
+v -0.062500 -0.500000 -0.062500
+v -0.062500 0.062500 0.062500
+v -0.062500 -0.500000 0.062500
+v -0.353553 -0.500000 0.353553
+v -0.353553 0.500000 0.353553
+v 0.353553 -0.500000 -0.353553
+v 0.353553 0.500000 -0.353553
+v -0.353553 -0.500000 -0.353553
+v 0.353553 -0.500000 0.353553
+v -0.353553 0.500000 -0.353553
+v 0.353553 0.500000 0.353553
+vt 0.562500 0.500000
+vt 0.562500 0.625000
+vt 0.437500 0.625000
+vt 0.437500 0.500000
+vt 0.437500 0.000000
+vt 0.562500 0.000000
+vt 0.562500 0.125000
+vt 0.437500 0.125000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn -0.707100 0.000000 -0.707100
+vn -0.707100 -0.000000 0.707100
+g Cube_Cube.001_Cube_Cube.001_Material.001
+usemtl Material.001
+s off
+f 3/1/1 1/2/1 5/3/1 7/4/1
+f 8/5/1 4/6/1 2/7/1 6/8/1
+f 3/2/2 4/6/2 8/5/2 7/3/2
+f 1/3/3 3/2/3 4/6/3 2/5/3
+f 5/2/2 1/3/2 2/5/2 6/6/2
+f 7/3/3 8/5/3 6/6/3 5/2/3
+g Cube_Cube.001_Cube_Cube.001_Material.002
+usemtl Material.002
+f 9/9/4 10/10/4 12/11/4 11/12/4
+f 13/12/5 14/9/5 16/10/5 15/11/5
diff --git a/games/minetest_game/mods/default/models/torch_wall.obj b/games/minetest_game/mods/default/models/torch_wall.obj
new file mode 100644
index 0000000..57baa9e
--- /dev/null
+++ b/games/minetest_game/mods/default/models/torch_wall.obj
@@ -0,0 +1,64 @@
+# Blender v2.76 (sub 11) OBJ File: 'torch_wall.blend'
+# www.blender.org
+mtllib torch_wall.mtl
+o Cube_Cube.001
+v 0.062469 -0.195248 0.023570
+v 0.062469 -0.476498 -0.463570
+v 0.062469 -0.303502 0.086070
+v 0.062469 -0.584752 -0.401070
+v -0.062531 -0.195248 0.023570
+v -0.062531 -0.476498 -0.463570
+v -0.062531 -0.303502 0.086070
+v -0.062531 -0.584752 -0.401070
+v -0.353584 -0.613553 0.022500
+v -0.353584 -0.613553 0.460000
+v 0.353522 0.093553 0.022500
+v 0.353522 0.093553 0.460000
+v -0.353584 0.093553 0.022500
+v 0.353522 -0.613553 0.022500
+v -0.353584 0.093553 0.460000
+v 0.353522 -0.613553 0.460000
+v 0.353553 0.056811 -0.121957
+v 0.353553 -0.224439 -0.609096
+v -0.353553 -0.555561 0.231596
+v -0.353553 -0.836811 -0.255543
+v -0.353553 0.056811 -0.121957
+v -0.353553 -0.224439 -0.609096
+v 0.353553 -0.555561 0.231596
+v 0.353553 -0.836811 -0.255543
+vt 0.562500 0.500000
+vt 0.562500 0.625000
+vt 0.437500 0.625000
+vt 0.437500 0.500000
+vt 0.437500 0.000000
+vt 0.562500 0.000000
+vt 0.562500 0.125000
+vt 0.437500 0.125000
+vt 0.000000 0.562500
+vt 0.000000 -0.000000
+vt 1.000000 0.000000
+vt 1.000000 0.562500
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vn -0.000000 0.500000 0.866000
+vn -0.000000 0.866000 -0.500000
+vn 1.000000 0.000000 0.000000
+vn -0.707100 0.612400 -0.353600
+vn -0.707100 -0.612400 0.353600
+vn -0.707100 0.707100 -0.000000
+vn -0.707100 -0.707100 -0.000000
+g Cube_Cube.001_Cube_Cube.001_Material.001
+usemtl Material.001
+s off
+f 3/1/1 1/2/1 5/3/1 7/4/1
+f 8/5/1 4/6/1 2/7/1 6/8/1
+f 3/2/2 4/6/2 8/5/2 7/3/2
+f 1/3/3 3/2/3 4/6/3 2/5/3
+f 5/2/2 1/3/2 2/5/2 6/6/2
+f 7/3/3 8/5/3 6/6/3 5/2/3
+f 17/9/4 18/10/4 20/11/4 19/12/4
+f 21/9/5 22/10/5 24/11/5 23/12/5
+g Cube_Cube.001_Cube_Cube.001_Material.002
+usemtl Material.002
+f 9/12/6 10/13/6 12/14/6 11/9/6
+f 13/9/7 14/12/7 16/13/7 15/14/7
diff --git a/games/minetest_game/mods/default/nodes.lua b/games/minetest_game/mods/default/nodes.lua
index d494e1a..3e78109 100644
--- a/games/minetest_game/mods/default/nodes.lua
+++ b/games/minetest_game/mods/default/nodes.lua
@@ -19,17 +19,21 @@ Stone
 default:stone
 default:cobble
 default:stonebrick
+default:stone_block
 default:mossycobble
 
 default:desert_stone
 default:desert_cobble
 default:desert_stonebrick
+default:desert_stone_block
 
 default:sandstone
 default:sandstonebrick
+default:sandstone_block
 
 default:obsidian
 default:obsidianbrick
+default:obsidian_block
 
 Soft / Non-Stone
 ----------------
@@ -43,6 +47,7 @@ default:dirt_with_snow
 
 default:sand
 default:desert_sand
+default:silver_sand
 
 default:gravel
 
@@ -106,8 +111,8 @@ default:mese
 default:stone_with_diamond
 default:diamondblock
 
-Plantlife (non-cubic)
----------------------
+Plantlife
+---------
 
 default:cactus
 default:papyrus
@@ -126,6 +131,18 @@ default:dry_grass_3
 default:dry_grass_4
 default:dry_grass_5
 
+default:bush_stem
+default:bush_leaves
+default:acacia_bush_stem
+default:acacia_bush_leaves
+
+Corals
+------
+
+default:coral_brown
+default:coral_orange
+default:coral_skeleton
+
 Liquids
 -------
 (1. Source 2. Flowing)
@@ -142,8 +159,6 @@ default:lava_flowing
 Tools / "Advanced" crafting / Non-"natural"
 -------------------------------------------
 
-default:torch
-
 default:chest
 default:chest_locked
 
@@ -164,8 +179,6 @@ default:fence_aspen_wood
 default:glass
 default:obsidian_glass
 
-default:rail
-
 default:brick
 
 default:meselamp
@@ -174,8 +187,6 @@ Misc
 ----
 
 default:cloud
-default:nyancat
-default:nyancat_rainbow
 
 --]]
 
@@ -202,12 +213,22 @@ minetest.register_node("default:cobble", {
 
 minetest.register_node("default:stonebrick", {
 	description = "Stone Brick",
+	paramtype2 = "facedir",
+	place_param2 = 0,
 	tiles = {"default_stone_brick.png"},
 	is_ground_content = false,
 	groups = {cracky = 2, stone = 1},
 	sounds = default.node_sound_stone_defaults(),
 })
 
+minetest.register_node("default:stone_block", {
+	description = "Stone Block",
+	tiles = {"default_stone_block.png"},
+	is_ground_content = false,
+	groups = {cracky = 2, stone = 1},
+	sounds = default.node_sound_stone_defaults(),
+})
+
 minetest.register_node("default:mossycobble", {
 	description = "Mossy Cobblestone",
 	tiles = {"default_mossycobble.png"},
@@ -236,12 +257,22 @@ minetest.register_node("default:desert_cobble", {
 
 minetest.register_node("default:desert_stonebrick", {
 	description = "Desert Stone Brick",
+	paramtype2 = "facedir",
+	place_param2 = 0,
 	tiles = {"default_desert_stone_brick.png"},
 	is_ground_content = false,
 	groups = {cracky = 2, stone = 1},
 	sounds = default.node_sound_stone_defaults(),
 })
 
+minetest.register_node("default:desert_stone_block", {
+	description = "Desert Stone Block",
+	tiles = {"default_desert_stone_block.png"},
+	is_ground_content = false,
+	groups = {cracky = 2, stone = 1},
+	sounds = default.node_sound_stone_defaults(),
+})
+
 
 minetest.register_node("default:sandstone", {
 	description = "Sandstone",
@@ -252,12 +283,22 @@ minetest.register_node("default:sandstone", {
 
 minetest.register_node("default:sandstonebrick", {
 	description = "Sandstone Brick",
+	paramtype2 = "facedir",
+	place_param2 = 0,
 	tiles = {"default_sandstone_brick.png"},
 	is_ground_content = false,
 	groups = {cracky = 2},
 	sounds = default.node_sound_stone_defaults(),
 })
 
+minetest.register_node("default:sandstone_block", {
+	description = "Sandstone Block",
+	tiles = {"default_sandstone_block.png"},
+	is_ground_content = false,
+	groups = {cracky = 2},
+	sounds = default.node_sound_stone_defaults(),
+})
+
 
 minetest.register_node("default:obsidian", {
 	description = "Obsidian",
@@ -268,12 +309,22 @@ minetest.register_node("default:obsidian", {
 
 minetest.register_node("default:obsidianbrick", {
 	description = "Obsidian Brick",
+	paramtype2 = "facedir",
+	place_param2 = 0,
 	tiles = {"default_obsidian_brick.png"},
 	is_ground_content = false,
 	sounds = default.node_sound_stone_defaults(),
 	groups = {cracky = 1, level = 2},
 })
 
+minetest.register_node("default:obsidian_block", {
+	description = "Obsidian Block",
+	tiles = {"default_obsidian_block.png"},
+	is_ground_content = false,
+	sounds = default.node_sound_stone_defaults(),
+	groups = {cracky = 1, level = 2},
+})
+
 --
 -- Soft / Non-Stone
 --
@@ -290,7 +341,7 @@ minetest.register_node("default:dirt_with_grass", {
 	tiles = {"default_grass.png", "default_dirt.png",
 		{name = "default_dirt.png^default_grass_side.png",
 			tileable_vertical = false}},
-	groups = {crumbly = 3, soil = 1},
+	groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
 	drop = 'default:dirt',
 	sounds = default.node_sound_dirt_defaults({
 		footstep = {name = "default_grass_footstep", gain = 0.25},
@@ -315,7 +366,7 @@ minetest.register_node("default:dirt_with_dry_grass", {
 		"default_dirt.png",
 		{name = "default_dirt.png^default_dry_grass_side.png",
 			tileable_vertical = false}},
-	groups = {crumbly = 3, soil = 1},
+	groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
 	drop = 'default:dirt',
 	sounds = default.node_sound_dirt_defaults({
 		footstep = {name = "default_grass_footstep", gain = 0.4},
@@ -327,7 +378,7 @@ minetest.register_node("default:dirt_with_snow", {
 	tiles = {"default_snow.png", "default_dirt.png",
 		{name = "default_dirt.png^default_snow_side.png",
 			tileable_vertical = false}},
-	groups = {crumbly = 3, soil = 1},
+	groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
 	drop = 'default:dirt',
 	sounds = default.node_sound_dirt_defaults({
 		footstep = {name = "default_snow_footstep", gain = 0.15},
@@ -348,6 +399,13 @@ minetest.register_node("default:desert_sand", {
 	sounds = default.node_sound_sand_defaults(),
 })
 
+minetest.register_node("default:silver_sand", {
+	description = "Silver Sand",
+	tiles = {"default_silver_sand.png"},
+	groups = {crumbly = 3, falling_node = 1, sand = 1},
+	sounds = default.node_sound_sand_defaults(),
+})
+
 
 minetest.register_node("default:gravel", {
 	description = "Gravel",
@@ -405,12 +463,19 @@ minetest.register_node("default:snow", {
 minetest.register_node("default:snowblock", {
 	description = "Snow Block",
 	tiles = {"default_snow.png"},
-	groups = {crumbly = 3, puts_out_fire = 1},
+	groups = {crumbly = 3, puts_out_fire = 1, cools_lava = 1},
 	sounds = default.node_sound_dirt_defaults({
 		footstep = {name = "default_snow_footstep", gain = 0.15},
 		dug = {name = "default_snow_footstep", gain = 0.2},
 		dig = {name = "default_snow_footstep", gain = 0.2}
 	}),
+
+	on_construct = function(pos)
+		pos.y = pos.y - 1
+		if minetest.get_node(pos).name == "default:dirt_with_grass" then
+			minetest.set_node(pos, {name = "default:dirt_with_snow"})
+		end
+	end,
 })
 
 minetest.register_node("default:ice", {
@@ -418,7 +483,7 @@ minetest.register_node("default:ice", {
 	tiles = {"default_ice.png"},
 	is_ground_content = false,
 	paramtype = "light",
-	groups = {cracky = 3, puts_out_fire = 1},
+	groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1},
 	sounds = default.node_sound_glass_defaults(),
 })
 
@@ -439,9 +504,11 @@ minetest.register_node("default:tree", {
 
 minetest.register_node("default:wood", {
 	description = "Wooden Planks",
+	paramtype2 = "facedir",
+	place_param2 = 0,
 	tiles = {"default_wood.png"},
 	is_ground_content = false,
-	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
+	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
 	sounds = default.node_sound_wood_defaults(),
 })
 
@@ -455,20 +522,37 @@ minetest.register_node("default:sapling", {
 	paramtype = "light",
 	sunlight_propagates = true,
 	walkable = false,
+	on_timer = default.grow_sapling,
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
+		fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
 	},
 	groups = {snappy = 2, dig_immediate = 3, flammable = 2,
 		attached_node = 1, sapling = 1},
 	sounds = default.node_sound_leaves_defaults(),
+
+	on_construct = function(pos)
+		minetest.get_node_timer(pos):start(math.random(2400,4800))
+	end,
+
+	on_place = function(itemstack, placer, pointed_thing)
+		itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
+			"default:sapling",
+			-- minp, maxp to be checked, relative to sapling pos
+			-- minp_relative.y = 1 because sapling pos has been checked
+			{x = -2, y = 1, z = -2},
+			{x = 2, y = 6, z = 2},
+			-- maximum interval of interior volume check
+			4)
+
+		return itemstack
+	end,
 })
 
 minetest.register_node("default:leaves", {
 	description = "Leaves",
 	drawtype = "allfaces_optional",
 	waving = 1,
-	visual_scale = 1.3,
 	tiles = {"default_leaves.png"},
 	special_tiles = {"default_leaves_simple.png"},
 	paramtype = "light",
@@ -506,7 +590,7 @@ minetest.register_node("default:apple", {
 	is_ground_content = false,
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
+		fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16}
 	},
 	groups = {fleshy = 3, dig_immediate = 3, flammable = 2,
 		leafdecay = 3, leafdecay_drop = 1},
@@ -535,9 +619,11 @@ minetest.register_node("default:jungletree", {
 
 minetest.register_node("default:junglewood", {
 	description = "Junglewood Planks",
+	paramtype2 = "facedir",
+	place_param2 = 0,
 	tiles = {"default_junglewood.png"},
 	is_ground_content = false,
-	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
+	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
 	sounds = default.node_sound_wood_defaults(),
 })
 
@@ -545,7 +631,6 @@ minetest.register_node("default:jungleleaves", {
 	description = "Jungle Leaves",
 	drawtype = "allfaces_optional",
 	waving = 1,
-	visual_scale = 1.3,
 	tiles = {"default_jungleleaves.png"},
 	special_tiles = {"default_jungleleaves_simple.png"},
 	paramtype = "light",
@@ -573,13 +658,31 @@ minetest.register_node("default:junglesapling", {
 	paramtype = "light",
 	sunlight_propagates = true,
 	walkable = false,
+	on_timer = default.grow_sapling,
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
+		fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
 	},
 	groups = {snappy = 2, dig_immediate = 3, flammable = 2,
 		attached_node = 1, sapling = 1},
 	sounds = default.node_sound_leaves_defaults(),
+
+	on_construct = function(pos)
+		minetest.get_node_timer(pos):start(math.random(2400,4800))
+	end,
+
+	on_place = function(itemstack, placer, pointed_thing)
+		itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
+			"default:junglesapling",
+			-- minp, maxp to be checked, relative to sapling pos
+			-- minp_relative.y = 1 because sapling pos has been checked
+			{x = -2, y = 1, z = -2},
+			{x = 2, y = 15, z = 2},
+			-- maximum interval of interior volume check
+			4)
+
+		return itemstack
+	end,
 })
 
 
@@ -589,7 +692,7 @@ minetest.register_node("default:pine_tree", {
 		"default_pine_tree.png"},
 	paramtype2 = "facedir",
 	is_ground_content = false,
-	groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
+	groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3},
 	sounds = default.node_sound_wood_defaults(),
 
 	on_place = minetest.rotate_node
@@ -597,16 +700,17 @@ minetest.register_node("default:pine_tree", {
 
 minetest.register_node("default:pine_wood", {
 	description = "Pine Wood Planks",
+	paramtype2 = "facedir",
+	place_param2 = 0,
 	tiles = {"default_pine_wood.png"},
 	is_ground_content = false,
-	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
+	groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
 	sounds = default.node_sound_wood_defaults(),
 })
 
 minetest.register_node("default:pine_needles",{
 	description = "Pine Needles",
 	drawtype = "allfaces_optional",
-	visual_scale = 1.3,
 	tiles = {"default_pine_needles.png"},
 	waving = 1,
 	paramtype = "light",
@@ -634,13 +738,31 @@ minetest.register_node("default:pine_sapling", {
 	paramtype = "light",
 	sunlight_propagates = true,
 	walkable = false,
+	on_timer = default.grow_sapling,
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
+		fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
 	},
-	groups = {snappy = 2, dig_immediate = 3, flammable = 2,
+	groups = {snappy = 2, dig_immediate = 3, flammable = 3,
 		attached_node = 1, sapling = 1},
 	sounds = default.node_sound_leaves_defaults(),
+
+	on_construct = function(pos)
+		minetest.get_node_timer(pos):start(math.random(2400,4800))
+	end,
+
+	on_place = function(itemstack, placer, pointed_thing)
+		itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
+			"default:pine_sapling",
+			-- minp, maxp to be checked, relative to sapling pos
+			-- minp_relative.y = 1 because sapling pos has been checked
+			{x = -2, y = 1, z = -2},
+			{x = 2, y = 12, z = 2},
+			-- maximum interval of interior volume check
+			4)
+
+		return itemstack
+	end,
 })
 
 
@@ -658,17 +780,19 @@ minetest.register_node("default:acacia_tree", {
 
 minetest.register_node("default:acacia_wood", {
 	description = "Acacia Wood Planks",
+	paramtype2 = "facedir",
+	place_param2 = 0,
 	tiles = {"default_acacia_wood.png"},
 	is_ground_content = false,
-	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
+	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
 	sounds = default.node_sound_wood_defaults(),
 })
 
 minetest.register_node("default:acacia_leaves", {
 	description = "Acacia Leaves",
 	drawtype = "allfaces_optional",
-	visual_scale = 1.3,
 	tiles = {"default_acacia_leaves.png"},
+	special_tiles = {"default_acacia_leaves_simple.png"},
 	waving = 1,
 	paramtype = "light",
 	is_ground_content = false,
@@ -695,13 +819,31 @@ minetest.register_node("default:acacia_sapling", {
 	paramtype = "light",
 	sunlight_propagates = true,
 	walkable = false,
+	on_timer = default.grow_sapling,
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
+		fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
 	},
 	groups = {snappy = 2, dig_immediate = 3, flammable = 2,
 		attached_node = 1, sapling = 1},
 	sounds = default.node_sound_leaves_defaults(),
+
+	on_construct = function(pos)
+		minetest.get_node_timer(pos):start(math.random(2400,4800))
+	end,
+
+	on_place = function(itemstack, placer, pointed_thing)
+		itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
+			"default:acacia_sapling",
+			-- minp, maxp to be checked, relative to sapling pos
+			-- minp_relative.y = 1 because sapling pos has been checked
+			{x = -4, y = 1, z = -4},
+			{x = 4, y = 6, z = 4},
+			-- maximum interval of interior volume check
+			4)
+
+		return itemstack
+	end,
 })
 
 minetest.register_node("default:aspen_tree", {
@@ -710,7 +852,7 @@ minetest.register_node("default:aspen_tree", {
 		"default_aspen_tree.png"},
 	paramtype2 = "facedir",
 	is_ground_content = false,
-	groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
+	groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3},
 	sounds = default.node_sound_wood_defaults(),
 
 	on_place = minetest.rotate_node
@@ -718,16 +860,17 @@ minetest.register_node("default:aspen_tree", {
 
 minetest.register_node("default:aspen_wood", {
 	description = "Aspen Wood Planks",
+	paramtype2 = "facedir",
+	place_param2 = 0,
 	tiles = {"default_aspen_wood.png"},
 	is_ground_content = false,
-	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
+	groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
 	sounds = default.node_sound_wood_defaults(),
 })
 
 minetest.register_node("default:aspen_leaves", {
 	description = "Aspen Leaves",
 	drawtype = "allfaces_optional",
-	visual_scale = 1.3,
 	tiles = {"default_aspen_leaves.png"},
 	waving = 1,
 	paramtype = "light",
@@ -755,14 +898,33 @@ minetest.register_node("default:aspen_sapling", {
 	paramtype = "light",
 	sunlight_propagates = true,
 	walkable = false,
+	on_timer = default.grow_sapling,
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
+		fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16}
 	},
-	groups = {snappy = 2, dig_immediate = 3, flammable = 2,
+	groups = {snappy = 2, dig_immediate = 3, flammable = 3,
 		attached_node = 1, sapling = 1},
 	sounds = default.node_sound_leaves_defaults(),
+
+	on_construct = function(pos)
+		minetest.get_node_timer(pos):start(math.random(2400,4800))
+	end,
+
+	on_place = function(itemstack, placer, pointed_thing)
+		itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
+			"default:aspen_sapling",
+			-- minp, maxp to be checked, relative to sapling pos
+			-- minp_relative.y = 1 because sapling pos has been checked
+			{x = -2, y = 1, z = -2},
+			{x = 2, y = 12, z = 2},
+			-- maximum interval of interior volume check
+			4)
+
+		return itemstack
+	end,
 })
+
 --
 -- Ores
 --
@@ -797,7 +959,7 @@ minetest.register_node("default:steelblock", {
 	tiles = {"default_steel_block.png"},
 	is_ground_content = false,
 	groups = {cracky = 1, level = 2},
-	sounds = default.node_sound_stone_defaults(),
+	sounds = default.node_sound_metal_defaults(),
 })
 
 
@@ -814,7 +976,7 @@ minetest.register_node("default:copperblock", {
 	tiles = {"default_copper_block.png"},
 	is_ground_content = false,
 	groups = {cracky = 1, level = 2},
-	sounds = default.node_sound_stone_defaults(),
+	sounds = default.node_sound_metal_defaults(),
 })
 
 minetest.register_node("default:bronzeblock", {
@@ -822,7 +984,7 @@ minetest.register_node("default:bronzeblock", {
 	tiles = {"default_bronze_block.png"},
 	is_ground_content = false,
 	groups = {cracky = 1, level = 2},
-	sounds = default.node_sound_stone_defaults(),
+	sounds = default.node_sound_metal_defaults(),
 })
 
 
@@ -857,7 +1019,7 @@ minetest.register_node("default:goldblock", {
 	tiles = {"default_gold_block.png"},
 	is_ground_content = false,
 	groups = {cracky = 1},
-	sounds = default.node_sound_stone_defaults(),
+	sounds = default.node_sound_metal_defaults(),
 })
 
 
@@ -886,7 +1048,7 @@ minetest.register_node("default:cactus", {
 	tiles = {"default_cactus_top.png", "default_cactus_top.png",
 		"default_cactus_side.png"},
 	paramtype2 = "facedir",
-	groups = {snappy = 1, choppy = 3},
+	groups = {choppy = 3},
 	sounds = default.node_sound_wood_defaults(),
 	on_place = minetest.rotate_node,
 })
@@ -902,7 +1064,7 @@ minetest.register_node("default:papyrus", {
 	walkable = false,
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}
+		fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16},
 	},
 	groups = {snappy = 3, flammable = 2},
 	sounds = default.node_sound_leaves_defaults(),
@@ -928,7 +1090,7 @@ minetest.register_node("default:dry_shrub", {
 	sounds = default.node_sound_leaves_defaults(),
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
+		fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, 4 / 16, 5 / 16},
 	},
 })
 
@@ -944,11 +1106,11 @@ minetest.register_node("default:junglegrass", {
 	sunlight_propagates = true,
 	walkable = false,
 	buildable_to = true,
-	groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1},
+	groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1},
 	sounds = default.node_sound_leaves_defaults(),
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
+		fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 1.19, 7 / 16},
 	},
 })
 
@@ -965,11 +1127,11 @@ minetest.register_node("default:grass_1", {
 	sunlight_propagates = true,
 	walkable = false,
 	buildable_to = true,
-	groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1},
+	groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1},
 	sounds = default.node_sound_leaves_defaults(),
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
+		fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16},
 	},
 
 	on_place = function(itemstack, placer, pointed_thing)
@@ -995,11 +1157,11 @@ for i = 2, 5 do
 		buildable_to = true,
 		drop = "default:grass_1",
 		groups = {snappy = 3, flora = 1, attached_node = 1,
-			not_in_creative_inventory = 1, grass = 1},
+			not_in_creative_inventory = 1, grass = 1, flammable = 1},
 		sounds = default.node_sound_leaves_defaults(),
 		selection_box = {
 			type = "fixed",
-			fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
+			fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16},
 		},
 	})
 end
@@ -1021,7 +1183,7 @@ minetest.register_node("default:dry_grass_1", {
 	sounds = default.node_sound_leaves_defaults(),
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
+		fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16},
 	},
 
 	on_place = function(itemstack, placer, pointed_thing)
@@ -1051,11 +1213,95 @@ for i = 2, 5 do
 		sounds = default.node_sound_leaves_defaults(),
 		selection_box = {
 			type = "fixed",
-			fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
+			fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -1 / 16, 6 / 16},
 		},
 	})
 end
 
+
+minetest.register_node("default:bush_stem", {
+	description = "Bush Stem",
+	drawtype = "plantlike",
+	visual_scale = 1.18,
+	tiles = {"default_bush_stem.png"},
+	inventory_image = "default_bush_stem.png",
+	wield_image = "default_bush_stem.png",
+	paramtype = "light",
+	sunlight_propagates = true,
+	groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
+	sounds = default.node_sound_wood_defaults(),
+	selection_box = {
+		type = "fixed",
+		fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.54, 7 / 16},
+	},
+})
+
+minetest.register_node("default:bush_leaves", {
+	description = "Bush Leaves",
+	drawtype = "allfaces_optional",
+	waving = 1,
+	tiles = {"default_leaves_simple.png"},
+	paramtype = "light",
+	groups = {snappy = 3, flammable = 2, leaves = 1},
+	sounds = default.node_sound_leaves_defaults(),
+})
+
+minetest.register_node("default:acacia_bush_stem", {
+	description = "Acacia Bush Stem",
+	drawtype = "plantlike",
+	visual_scale = 1.18,
+	tiles = {"default_acacia_bush_stem.png"},
+	inventory_image = "default_acacia_bush_stem.png",
+	wield_image = "default_acacia_bush_stem.png",
+	paramtype = "light",
+	sunlight_propagates = true,
+	groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
+	sounds = default.node_sound_wood_defaults(),
+	selection_box = {
+		type = "fixed",
+		fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.54, 7 / 16},
+	},
+})
+
+minetest.register_node("default:acacia_bush_leaves", {
+	description = "Acacia Bush Leaves",
+	drawtype = "allfaces_optional",
+	waving = 1,
+	tiles = {"default_acacia_leaves_simple.png"},
+	paramtype = "light",
+	groups = {snappy = 3, flammable = 2, leaves = 1},
+	sounds = default.node_sound_leaves_defaults(),
+})
+
+
+--
+-- Corals
+--
+
+minetest.register_node("default:coral_brown", {
+	description = "Brown Coral",
+	tiles = {"default_coral_brown.png"},
+	groups = {cracky = 3},
+	drop = "default:coral_skeleton",
+	sounds = default.node_sound_stone_defaults(),
+})
+
+minetest.register_node("default:coral_orange", {
+	description = "Orange Coral",
+	tiles = {"default_coral_orange.png"},
+	groups = {cracky = 3},
+	drop = "default:coral_skeleton",
+	sounds = default.node_sound_stone_defaults(),
+})
+
+minetest.register_node("default:coral_skeleton", {
+	description = "Coral Skeleton",
+	tiles = {"default_coral_skeleton.png"},
+	groups = {cracky = 3},
+	sounds = default.node_sound_stone_defaults(),
+})
+
+
 --
 -- Liquids
 --
@@ -1101,7 +1347,8 @@ minetest.register_node("default:water_source", {
 	liquid_alternative_source = "default:water_source",
 	liquid_viscosity = 1,
 	post_effect_color = {a = 103, r = 30, g = 60, b = 90},
-	groups = {water = 3, liquid = 3, puts_out_fire = 1},
+	groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1},
+	sounds = default.node_sound_water_defaults(),
 })
 
 minetest.register_node("default:water_flowing", {
@@ -1146,7 +1393,8 @@ minetest.register_node("default:water_flowing", {
 	liquid_viscosity = 1,
 	post_effect_color = {a = 103, r = 30, g = 60, b = 90},
 	groups = {water = 3, liquid = 3, puts_out_fire = 1,
-		not_in_creative_inventory = 1},
+		not_in_creative_inventory = 1, cools_lava = 1},
+	sounds = default.node_sound_water_defaults(),
 })
 
 
@@ -1192,7 +1440,8 @@ minetest.register_node("default:river_water_source", {
 	liquid_renewable = false,
 	liquid_range = 2,
 	post_effect_color = {a = 103, r = 30, g = 76, b = 90},
-	groups = {water = 3, liquid = 3, puts_out_fire = 1},
+	groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1},
+	sounds = default.node_sound_water_defaults(),
 })
 
 minetest.register_node("default:river_water_flowing", {
@@ -1239,7 +1488,8 @@ minetest.register_node("default:river_water_flowing", {
 	liquid_range = 2,
 	post_effect_color = {a = 103, r = 30, g = 76, b = 90},
 	groups = {water = 3, liquid = 3, puts_out_fire = 1,
-		not_in_creative_inventory = 1},
+		not_in_creative_inventory = 1, cools_lava = 1},
+	sounds = default.node_sound_water_defaults(),
 })
 
 
@@ -1286,7 +1536,7 @@ minetest.register_node("default:lava_source", {
 	liquid_renewable = false,
 	damage_per_second = 4 * 2,
 	post_effect_color = {a = 191, r = 255, g = 64, b = 0},
-	groups = {lava = 3, liquid = 2, hot = 3, igniter = 1},
+	groups = {lava = 3, liquid = 2, igniter = 1},
 })
 
 minetest.register_node("default:lava_flowing", {
@@ -1332,7 +1582,7 @@ minetest.register_node("default:lava_flowing", {
 	liquid_renewable = false,
 	damage_per_second = 4 * 2,
 	post_effect_color = {a = 191, r = 255, g = 64, b = 0},
-	groups = {lava = 3, liquid = 2, hot = 3, igniter = 1,
+	groups = {lava = 3, liquid = 2, igniter = 1,
 		not_in_creative_inventory = 1},
 })
 
@@ -1340,58 +1590,6 @@ minetest.register_node("default:lava_flowing", {
 -- Tools / "Advanced" crafting / Non-"natural"
 --
 
-minetest.register_node("default:torch", {
-	description = "Torch",
-	drawtype = "torchlike",
-	tiles = {
-		{
-			name = "default_torch_on_floor_animated.png",
-			animation = {
-				type = "vertical_frames",
-				aspect_w = 16,
-				aspect_h = 16,
-				length = 3.0
-			},
-		},
-		{
-			name="default_torch_on_ceiling_animated.png",
-			animation = {
-				type = "vertical_frames",
-				aspect_w = 16,
-				aspect_h = 16,
-				length = 3.0
-			},
-		},
-		{
-			name="default_torch_animated.png",
-			animation = {
-				type = "vertical_frames",
-				aspect_w = 16,
-				aspect_h = 16,
-				length = 3.0
-			},
-		},
-	},
-	inventory_image = "default_torch_on_floor.png",
-	wield_image = "default_torch_on_floor.png",
-	paramtype = "light",
-	paramtype2 = "wallmounted",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	walkable = false,
-	light_source = default.LIGHT_MAX - 1,
-	selection_box = {
-		type = "wallmounted",
-		wall_top = {-0.1, 0.5 - 0.6, -0.1, 0.1, 0.5, 0.1},
-		wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5 + 0.6, 0.1},
-		wall_side = {-0.5, -0.3, -0.1, -0.5 + 0.3, 0.3, 0.1},
-	},
-	groups = {choppy = 2, dig_immediate = 3, flammable = 1, attached_node = 1},
-	legacy_wallmounted = true,
-	sounds = default.node_sound_defaults(),
-})
-
-
 local chest_formspec =
 	"size[8,9]" ..
 	default.gui_bg ..
@@ -1421,16 +1619,30 @@ local function get_locked_chest_formspec(pos)
 end
 
 local function has_locked_chest_privilege(meta, player)
-	local name = ""
 	if player then
 		if minetest.check_player_privs(player, "protection_bypass") then
 			return true
 		end
-		name = player:get_player_name()
+	else
+		return false
+	end
+
+	-- is player wielding the right key?
+	local item = player:get_wielded_item()
+	if item:get_name() == "default:key" then
+		local key_meta = minetest.parse_json(item:get_metadata())
+		local secret = meta:get_string("key_lock_secret")
+		if secret ~= key_meta.secret then
+			return false
+		end
+
+		return true
 	end
-	if name ~= meta:get_string("owner") then
+
+	if player:get_player_name() ~= meta:get_string("owner") then
 		return false
 	end
+
 	return true
 end
 
@@ -1447,7 +1659,6 @@ minetest.register_node("default:chest", {
 	on_construct = function(pos)
 		local meta = minetest.get_meta(pos)
 		meta:set_string("formspec", chest_formspec)
-		meta:set_string("infotext", "Chest")
 		local inv = meta:get_inventory()
 		inv:set_size("main", 8*4)
 	end,
@@ -1498,7 +1709,6 @@ minetest.register_node("default:chest_locked", {
 	end,
 	on_construct = function(pos)
 		local meta = minetest.get_meta(pos)
-		meta:set_string("infotext", "Locked Chest")
 		meta:set_string("owner", "")
 		local inv = meta:get_inventory()
 		inv:set_size("main", 8 * 4)
@@ -1540,7 +1750,7 @@ minetest.register_node("default:chest_locked", {
 			" takes " .. stack:get_name()  ..
 			" from locked chest at " .. minetest.pos_to_string(pos))
 	end,
-	on_rightclick = function(pos, node, clicker)
+	on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
 		local meta = minetest.get_meta(pos)
 		if has_locked_chest_privilege(meta, clicker) then
 			minetest.show_formspec(
@@ -1549,8 +1759,44 @@ minetest.register_node("default:chest_locked", {
 				get_locked_chest_formspec(pos)
 			)
 		end
+		return itemstack
 	end,
 	on_blast = function() end,
+	on_key_use = function(pos, player)
+		local secret = minetest.get_meta(pos):get_string("key_lock_secret")
+		local itemstack = player:get_wielded_item()
+		local key_meta = minetest.parse_json(itemstack:get_metadata())
+
+		if secret ~= key_meta.secret then
+			return
+		end
+
+		minetest.show_formspec(
+			player:get_player_name(),
+			"default:chest_locked",
+			get_locked_chest_formspec(pos)
+		)
+	end,
+	on_skeleton_key_use = function(pos, player, newsecret)
+		local meta = minetest.get_meta(pos)
+		local owner = meta:get_string("owner")
+		local name = player:get_player_name()
+
+		-- verify placer is owner of lockable chest
+		if owner ~= name then
+			minetest.record_protection_violation(pos, name)
+			minetest.chat_send_player(name, "You do not own this chest.")
+			return nil
+		end
+
+		local secret = meta:get_string("key_lock_secret")
+		if secret == "" then
+			secret = newsecret
+			meta:set_string("key_lock_secret", secret)
+		end
+
+		return secret, "a locked chest", owner
+	end,
 })
 
 
@@ -1566,16 +1812,37 @@ local bookshelf_formspec =
 	"listring[current_player;main]" ..
 	default.get_hotbar_bg(0,2.85)
 
+local function get_bookshelf_formspec(inv)
+	local formspec = bookshelf_formspec
+	local invlist = inv and inv:get_list("books")
+	-- Inventory slots overlay
+	local bx, by = 0, 0.3
+	for i = 1, 16 do
+		if i == 9 then
+			bx = 0
+			by = by + 1
+		end
+		if not invlist or invlist[i]:is_empty() then
+			formspec = formspec ..
+				"image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]"
+		end
+		bx = bx + 1
+	end
+	return formspec
+end
+
 minetest.register_node("default:bookshelf", {
 	description = "Bookshelf",
-	tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
+	tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
+		"default_wood.png", "default_bookshelf.png", "default_bookshelf.png"},
+	paramtype2 = "facedir",
 	is_ground_content = false,
 	groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
 	sounds = default.node_sound_wood_defaults(),
 
 	on_construct = function(pos)
 		local meta = minetest.get_meta(pos)
-		meta:set_string("formspec", bookshelf_formspec)
+		meta:set_string("formspec", get_bookshelf_formspec(nil))
 		local inv = meta:get_inventory()
 		inv:set_size("books", 8 * 2)
 	end,
@@ -1592,14 +1859,20 @@ minetest.register_node("default:bookshelf", {
 	on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
 		minetest.log("action", player:get_player_name() ..
 			" moves stuff in bookshelf at " .. minetest.pos_to_string(pos))
+		local meta = minetest.get_meta(pos)
+		meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory()))
 	end,
 	on_metadata_inventory_put = function(pos, listname, index, stack, player)
 		minetest.log("action", player:get_player_name() ..
 			" moves stuff to bookshelf at " .. minetest.pos_to_string(pos))
+		local meta = minetest.get_meta(pos)
+		meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory()))
 	end,
 	on_metadata_inventory_take = function(pos, listname, index, stack, player)
 		minetest.log("action", player:get_player_name() ..
 			" takes stuff from bookshelf at " .. minetest.pos_to_string(pos))
+		local meta = minetest.get_meta(pos)
+		meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory()))
 	end,
 	on_blast = function(pos)
 		local drops = {}
@@ -1636,7 +1909,6 @@ local function register_sign(material, desc, def)
 			--local n = minetest.get_node(pos)
 			local meta = minetest.get_meta(pos)
 			meta:set_string("formspec", "field[text;;${text}]")
-			meta:set_string("infotext", "\"\"")
 		end,
 		on_receive_fields = function(pos, formname, fields, sender)
 			--print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
@@ -1661,7 +1933,7 @@ register_sign("wood", "Wooden", {
 })
 
 register_sign("steel", "Steel", {
-	sounds = default.node_sound_defaults(),
+	sounds = default.node_sound_metal_defaults(),
 	groups = {cracky = 2, attached_node = 1}
 })
 
@@ -1707,12 +1979,14 @@ minetest.register_node("default:ladder_steel", {
 		--wall_side = = <default>
 	},
 	groups = {cracky = 2},
-	sounds = default.node_sound_stone_defaults(),
+	sounds = default.node_sound_metal_defaults(),
 })
 
 default.register_fence("default:fence_wood", {
 	description = "Wooden Fence",
 	texture = "default_fence_wood.png",
+	inventory_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
+	wield_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
 	material = "default:wood",
 	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
 	sounds = default.node_sound_wood_defaults()
@@ -1721,6 +1995,8 @@ default.register_fence("default:fence_wood", {
 default.register_fence("default:fence_acacia_wood", {
 	description = "Acacia Fence",
 	texture = "default_fence_acacia_wood.png",
+	inventory_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
+	wield_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
 	material = "default:acacia_wood",
 	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
 	sounds = default.node_sound_wood_defaults()
@@ -1729,6 +2005,8 @@ default.register_fence("default:fence_acacia_wood", {
 default.register_fence("default:fence_junglewood", {
 	description = "Junglewood Fence",
 	texture = "default_fence_junglewood.png",
+	inventory_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126",
+	wield_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126",
 	material = "default:junglewood",
 	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
 	sounds = default.node_sound_wood_defaults()
@@ -1737,16 +2015,20 @@ default.register_fence("default:fence_junglewood", {
 default.register_fence("default:fence_pine_wood", {
 	description = "Pine Fence",
 	texture = "default_fence_pine_wood.png",
+	inventory_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
+	wield_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
 	material = "default:pine_wood",
-	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
+	groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
 	sounds = default.node_sound_wood_defaults()
 })
 
 default.register_fence("default:fence_aspen_wood", {
 	description = "Aspen Fence",
 	texture = "default_fence_aspen_wood.png",
+	inventory_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
+	wield_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
 	material = "default:aspen_wood",
-	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
+	groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
 	sounds = default.node_sound_wood_defaults()
 })
 
@@ -1773,29 +2055,10 @@ minetest.register_node("default:obsidian_glass", {
 })
 
 
-minetest.register_node("default:rail", {
-	description = "Rail",
-	drawtype = "raillike",
-	tiles = {"default_rail.png", "default_rail_curved.png",
-		"default_rail_t_junction.png", "default_rail_crossing.png"},
-	inventory_image = "default_rail.png",
-	wield_image = "default_rail.png",
-	paramtype = "light",
-	sunlight_propagates = true,
-	walkable = false,
-	is_ground_content = false,
-	selection_box = {
-		type = "fixed",
-                -- but how to specify the dimensions for curved and sideways rails?
-                fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
-	},
-	groups = {bendy = 2, dig_immediate = 2, attached_node = 1,
-		connect_to_raillike = minetest.raillike_group("rail")},
-})
-
-
 minetest.register_node("default:brick", {
 	description = "Brick Block",
+	paramtype2 = "facedir",
+	place_param2 = 0,
 	tiles = {"default_brick.png"},
 	is_ground_content = false,
 	groups = {cracky = 3},
@@ -1826,26 +2089,3 @@ minetest.register_node("default:cloud", {
 	sounds = default.node_sound_defaults(),
 	groups = {not_in_creative_inventory = 1},
 })
-
-minetest.register_node("default:nyancat", {
-	description = "Nyan Cat",
-	tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
-		"default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
-	paramtype2 = "facedir",
-	groups = {cracky = 2},
-	is_ground_content = false,
-	legacy_facedir_simple = true,
-	sounds = default.node_sound_defaults(),
-})
-
-minetest.register_node("default:nyancat_rainbow", {
-	description = "Nyan Cat Rainbow",
-	tiles = {
-		"default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90",
-		"default_nc_rb.png", "default_nc_rb.png"
-	},
-	paramtype2 = "facedir",
-	groups = {cracky = 2},
-	is_ground_content = false,
-	sounds = default.node_sound_defaults(),
-})
diff --git a/games/minetest_game/mods/default/player.lua b/games/minetest_game/mods/default/player.lua
index e4fb2ad..fd7341f 100644
--- a/games/minetest_game/mods/default/player.lua
+++ b/games/minetest_game/mods/default/player.lua
@@ -25,7 +25,6 @@ default.player_register_model("character.b3d", {
 		walk      = { x=168, y=187, },
 		mine      = { x=189, y=198, },
 		walk_mine = { x=200, y=219, },
-		-- Extra animations (not currently used by the game).
 		sit       = { x= 81, y=160, },
 	},
 })
@@ -95,7 +94,7 @@ minetest.register_on_joinplayer(function(player)
 	default.player_attached[player:get_player_name()] = false
 	default.player_set_model(player, "character.b3d")
 	player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30)
-	
+
 	-- set GUI
 	if not minetest.setting_getbool("creative_mode") then
 		player:set_inventory_formspec(default.gui_survival_form)
diff --git a/games/minetest_game/mods/default/schematics/acacia_bush.mts b/games/minetest_game/mods/default/schematics/acacia_bush.mts
new file mode 100644
index 0000000..df95586
Binary files /dev/null and b/games/minetest_game/mods/default/schematics/acacia_bush.mts differ
diff --git a/games/minetest_game/mods/default/schematics/aspen_tree.mts b/games/minetest_game/mods/default/schematics/aspen_tree.mts
index 3bccd4b..724aae0 100644
Binary files a/games/minetest_game/mods/default/schematics/aspen_tree.mts and b/games/minetest_game/mods/default/schematics/aspen_tree.mts differ
diff --git a/games/minetest_game/mods/default/schematics/aspen_tree_from_sapling.mts b/games/minetest_game/mods/default/schematics/aspen_tree_from_sapling.mts
index 6bf0f18..b7ca161 100644
Binary files a/games/minetest_game/mods/default/schematics/aspen_tree_from_sapling.mts and b/games/minetest_game/mods/default/schematics/aspen_tree_from_sapling.mts differ
diff --git a/games/minetest_game/mods/default/schematics/bush.mts b/games/minetest_game/mods/default/schematics/bush.mts
new file mode 100644
index 0000000..d08cf5f
Binary files /dev/null and b/games/minetest_game/mods/default/schematics/bush.mts differ
diff --git a/games/minetest_game/mods/default/schematics/corals.mts b/games/minetest_game/mods/default/schematics/corals.mts
new file mode 100644
index 0000000..e1bd7de
Binary files /dev/null and b/games/minetest_game/mods/default/schematics/corals.mts differ
diff --git a/games/minetest_game/mods/default/schematics/papyrus.mts b/games/minetest_game/mods/default/schematics/papyrus.mts
index a3b6777..1333a7c 100644
Binary files a/games/minetest_game/mods/default/schematics/papyrus.mts and b/games/minetest_game/mods/default/schematics/papyrus.mts differ
diff --git a/games/minetest_game/mods/default/sounds/default_dig_metal.ogg b/games/minetest_game/mods/default/sounds/default_dig_metal.ogg
new file mode 100644
index 0000000..0b58509
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_dig_metal.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_dig_snappy.ogg b/games/minetest_game/mods/default/sounds/default_dig_snappy.ogg
new file mode 100644
index 0000000..3686fcd
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_dig_snappy.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_dug_metal.1.ogg b/games/minetest_game/mods/default/sounds/default_dug_metal.1.ogg
new file mode 100644
index 0000000..5d6cb5b
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_dug_metal.1.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_dug_metal.2.ogg b/games/minetest_game/mods/default/sounds/default_dug_metal.2.ogg
new file mode 100644
index 0000000..63567fc
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_dug_metal.2.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_item_smoke.ogg b/games/minetest_game/mods/default/sounds/default_item_smoke.ogg
new file mode 100644
index 0000000..038a46e
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_item_smoke.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_metal_footstep.1.ogg b/games/minetest_game/mods/default/sounds/default_metal_footstep.1.ogg
new file mode 100644
index 0000000..841286b
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_metal_footstep.1.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_metal_footstep.2.ogg b/games/minetest_game/mods/default/sounds/default_metal_footstep.2.ogg
new file mode 100644
index 0000000..aa61ed3
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_metal_footstep.2.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_metal_footstep.3.ogg b/games/minetest_game/mods/default/sounds/default_metal_footstep.3.ogg
new file mode 100644
index 0000000..4cc1ca4
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_metal_footstep.3.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_place_node_metal.1.ogg b/games/minetest_game/mods/default/sounds/default_place_node_metal.1.ogg
new file mode 100644
index 0000000..5da085e
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_place_node_metal.1.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_place_node_metal.2.ogg b/games/minetest_game/mods/default/sounds/default_place_node_metal.2.ogg
new file mode 100644
index 0000000..5ee67fc
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_place_node_metal.2.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_tool_breaks.1.ogg b/games/minetest_game/mods/default/sounds/default_tool_breaks.1.ogg
new file mode 100644
index 0000000..2a571ae
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_tool_breaks.1.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_tool_breaks.2.ogg b/games/minetest_game/mods/default/sounds/default_tool_breaks.2.ogg
new file mode 100644
index 0000000..1789352
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_tool_breaks.2.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_tool_breaks.3.ogg b/games/minetest_game/mods/default/sounds/default_tool_breaks.3.ogg
new file mode 100644
index 0000000..a99c4b7
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_tool_breaks.3.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_water_footstep.1.ogg b/games/minetest_game/mods/default/sounds/default_water_footstep.1.ogg
new file mode 100644
index 0000000..63b9744
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_water_footstep.1.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_water_footstep.2.ogg b/games/minetest_game/mods/default/sounds/default_water_footstep.2.ogg
new file mode 100644
index 0000000..8d79c1f
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_water_footstep.2.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_water_footstep.3.ogg b/games/minetest_game/mods/default/sounds/default_water_footstep.3.ogg
new file mode 100644
index 0000000..f889150
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_water_footstep.3.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/default_water_footstep.4.ogg b/games/minetest_game/mods/default/sounds/default_water_footstep.4.ogg
new file mode 100644
index 0000000..6f1eab8
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/default_water_footstep.4.ogg differ
diff --git a/games/minetest_game/mods/default/sounds/player_damage.ogg b/games/minetest_game/mods/default/sounds/player_damage.ogg
new file mode 100644
index 0000000..7888087
Binary files /dev/null and b/games/minetest_game/mods/default/sounds/player_damage.ogg differ
diff --git a/games/minetest_game/mods/default/textures/default_acacia_bush_stem.png b/games/minetest_game/mods/default/textures/default_acacia_bush_stem.png
new file mode 100644
index 0000000..2903915
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_acacia_bush_stem.png differ
diff --git a/games/minetest_game/mods/default/textures/default_acacia_leaves_simple.png b/games/minetest_game/mods/default/textures/default_acacia_leaves_simple.png
new file mode 100644
index 0000000..3c7015b
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_acacia_leaves_simple.png differ
diff --git a/games/minetest_game/mods/default/textures/default_acacia_tree.png b/games/minetest_game/mods/default/textures/default_acacia_tree.png
index 169823d..58bb3c4 100644
Binary files a/games/minetest_game/mods/default/textures/default_acacia_tree.png and b/games/minetest_game/mods/default/textures/default_acacia_tree.png differ
diff --git a/games/minetest_game/mods/default/textures/default_acacia_tree_top.png b/games/minetest_game/mods/default/textures/default_acacia_tree_top.png
index 2cf5ef0..a8a0ce0 100644
Binary files a/games/minetest_game/mods/default/textures/default_acacia_tree_top.png and b/games/minetest_game/mods/default/textures/default_acacia_tree_top.png differ
diff --git a/games/minetest_game/mods/default/textures/default_aspen_tree.png b/games/minetest_game/mods/default/textures/default_aspen_tree.png
index 933b9ca..cfb05fc 100644
Binary files a/games/minetest_game/mods/default/textures/default_aspen_tree.png and b/games/minetest_game/mods/default/textures/default_aspen_tree.png differ
diff --git a/games/minetest_game/mods/default/textures/default_aspen_wood.png b/games/minetest_game/mods/default/textures/default_aspen_wood.png
index d16fdc9..2b584b3 100644
Binary files a/games/minetest_game/mods/default/textures/default_aspen_wood.png and b/games/minetest_game/mods/default/textures/default_aspen_wood.png differ
diff --git a/games/minetest_game/mods/default/textures/default_bookshelf_slot.png b/games/minetest_game/mods/default/textures/default_bookshelf_slot.png
new file mode 100644
index 0000000..31c4eb5
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_bookshelf_slot.png differ
diff --git a/games/minetest_game/mods/default/textures/default_bush_stem.png b/games/minetest_game/mods/default/textures/default_bush_stem.png
new file mode 100644
index 0000000..18b615f
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_bush_stem.png differ
diff --git a/games/minetest_game/mods/default/textures/default_coral_brown.png b/games/minetest_game/mods/default/textures/default_coral_brown.png
new file mode 100644
index 0000000..8a775fe
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_coral_brown.png differ
diff --git a/games/minetest_game/mods/default/textures/default_coral_orange.png b/games/minetest_game/mods/default/textures/default_coral_orange.png
new file mode 100644
index 0000000..cefac62
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_coral_orange.png differ
diff --git a/games/minetest_game/mods/default/textures/default_coral_skeleton.png b/games/minetest_game/mods/default/textures/default_coral_skeleton.png
new file mode 100644
index 0000000..fa48f15
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_coral_skeleton.png differ
diff --git a/games/minetest_game/mods/default/textures/default_desert_stone_block.png b/games/minetest_game/mods/default/textures/default_desert_stone_block.png
new file mode 100644
index 0000000..9eb8e92
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_desert_stone_block.png differ
diff --git a/games/minetest_game/mods/default/textures/default_desert_stone_brick.png b/games/minetest_game/mods/default/textures/default_desert_stone_brick.png
index 42d9f27..a603d18 100644
Binary files a/games/minetest_game/mods/default/textures/default_desert_stone_brick.png and b/games/minetest_game/mods/default/textures/default_desert_stone_brick.png differ
diff --git a/games/minetest_game/mods/default/textures/default_fence_aspen_wood.png b/games/minetest_game/mods/default/textures/default_fence_aspen_wood.png
index 7fb624d..0a6558e 100644
Binary files a/games/minetest_game/mods/default/textures/default_fence_aspen_wood.png and b/games/minetest_game/mods/default/textures/default_fence_aspen_wood.png differ
diff --git a/games/minetest_game/mods/default/textures/default_gravel.png b/games/minetest_game/mods/default/textures/default_gravel.png
index 25a78b6..8852d38 100644
Binary files a/games/minetest_game/mods/default/textures/default_gravel.png and b/games/minetest_game/mods/default/textures/default_gravel.png differ
diff --git a/games/minetest_game/mods/default/textures/default_ice.png b/games/minetest_game/mods/default/textures/default_ice.png
index be8eadd..2874e1e 100644
Binary files a/games/minetest_game/mods/default/textures/default_ice.png and b/games/minetest_game/mods/default/textures/default_ice.png differ
diff --git a/games/minetest_game/mods/default/textures/default_item_smoke.png b/games/minetest_game/mods/default/textures/default_item_smoke.png
new file mode 100644
index 0000000..d62fb3b
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_item_smoke.png differ
diff --git a/games/minetest_game/mods/default/textures/default_jungleleaves.png b/games/minetest_game/mods/default/textures/default_jungleleaves.png
index 870b4bb..5afcc36 100644
Binary files a/games/minetest_game/mods/default/textures/default_jungleleaves.png and b/games/minetest_game/mods/default/textures/default_jungleleaves.png differ
diff --git a/games/minetest_game/mods/default/textures/default_jungleleaves_simple.png b/games/minetest_game/mods/default/textures/default_jungleleaves_simple.png
index 689195f..7165100 100644
Binary files a/games/minetest_game/mods/default/textures/default_jungleleaves_simple.png and b/games/minetest_game/mods/default/textures/default_jungleleaves_simple.png differ
diff --git a/games/minetest_game/mods/default/textures/default_jungletree.png b/games/minetest_game/mods/default/textures/default_jungletree.png
index bf0403e..2cf77a6 100644
Binary files a/games/minetest_game/mods/default/textures/default_jungletree.png and b/games/minetest_game/mods/default/textures/default_jungletree.png differ
diff --git a/games/minetest_game/mods/default/textures/default_jungletree_top.png b/games/minetest_game/mods/default/textures/default_jungletree_top.png
index 4844682..439f078 100644
Binary files a/games/minetest_game/mods/default/textures/default_jungletree_top.png and b/games/minetest_game/mods/default/textures/default_jungletree_top.png differ
diff --git a/games/minetest_game/mods/default/textures/default_meselamp.png b/games/minetest_game/mods/default/textures/default_key.png
similarity index 80%
copy from games/minetest_game/mods/default/textures/default_meselamp.png
copy to games/minetest_game/mods/default/textures/default_key.png
index b227a25..d59bfb6 100644
Binary files a/games/minetest_game/mods/default/textures/default_meselamp.png and b/games/minetest_game/mods/default/textures/default_key.png differ
diff --git a/games/minetest_game/mods/default/textures/default_meselamp.png b/games/minetest_game/mods/default/textures/default_key_skeleton.png
similarity index 80%
copy from games/minetest_game/mods/default/textures/default_meselamp.png
copy to games/minetest_game/mods/default/textures/default_key_skeleton.png
index b227a25..eafcc19 100644
Binary files a/games/minetest_game/mods/default/textures/default_meselamp.png and b/games/minetest_game/mods/default/textures/default_key_skeleton.png differ
diff --git a/games/minetest_game/mods/default/textures/default_lava.png b/games/minetest_game/mods/default/textures/default_lava.png
index b0d429e..e8958de 100644
Binary files a/games/minetest_game/mods/default/textures/default_lava.png and b/games/minetest_game/mods/default/textures/default_lava.png differ
diff --git a/games/minetest_game/mods/default/textures/default_leaves.png b/games/minetest_game/mods/default/textures/default_leaves.png
index e39535c..ba09fe1 100644
Binary files a/games/minetest_game/mods/default/textures/default_leaves.png and b/games/minetest_game/mods/default/textures/default_leaves.png differ
diff --git a/games/minetest_game/mods/default/textures/default_leaves_simple.png b/games/minetest_game/mods/default/textures/default_leaves_simple.png
index e492a32..eb60f9f 100644
Binary files a/games/minetest_game/mods/default/textures/default_leaves_simple.png and b/games/minetest_game/mods/default/textures/default_leaves_simple.png differ
diff --git a/games/minetest_game/mods/default/textures/default_mese_block.png b/games/minetest_game/mods/default/textures/default_mese_block.png
index 2e6895d..e30994e 100644
Binary files a/games/minetest_game/mods/default/textures/default_mese_block.png and b/games/minetest_game/mods/default/textures/default_mese_block.png differ
diff --git a/games/minetest_game/mods/default/textures/default_meselamp.png b/games/minetest_game/mods/default/textures/default_meselamp.png
index b227a25..0c3a1a1 100644
Binary files a/games/minetest_game/mods/default/textures/default_meselamp.png and b/games/minetest_game/mods/default/textures/default_meselamp.png differ
diff --git a/games/minetest_game/mods/default/textures/default_obsidian_block.png b/games/minetest_game/mods/default/textures/default_obsidian_block.png
new file mode 100644
index 0000000..7e1d4d3
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_obsidian_block.png differ
diff --git a/games/minetest_game/mods/default/textures/default_pine_needles.png b/games/minetest_game/mods/default/textures/default_pine_needles.png
index 1a32f63..ad7373b 100644
Binary files a/games/minetest_game/mods/default/textures/default_pine_needles.png and b/games/minetest_game/mods/default/textures/default_pine_needles.png differ
diff --git a/games/minetest_game/mods/default/textures/default_rail.png b/games/minetest_game/mods/default/textures/default_rail.png
deleted file mode 100644
index 26fed02..0000000
Binary files a/games/minetest_game/mods/default/textures/default_rail.png and /dev/null differ
diff --git a/games/minetest_game/mods/default/textures/default_rail_crossing.png b/games/minetest_game/mods/default/textures/default_rail_crossing.png
deleted file mode 100644
index ba66e01..0000000
Binary files a/games/minetest_game/mods/default/textures/default_rail_crossing.png and /dev/null differ
diff --git a/games/minetest_game/mods/default/textures/default_rail_curved.png b/games/minetest_game/mods/default/textures/default_rail_curved.png
deleted file mode 100644
index 9084ac2..0000000
Binary files a/games/minetest_game/mods/default/textures/default_rail_curved.png and /dev/null differ
diff --git a/games/minetest_game/mods/default/textures/default_rail_t_junction.png b/games/minetest_game/mods/default/textures/default_rail_t_junction.png
deleted file mode 100644
index 486c416..0000000
Binary files a/games/minetest_game/mods/default/textures/default_rail_t_junction.png and /dev/null differ
diff --git a/games/minetest_game/mods/default/textures/default_sandstone_block.png b/games/minetest_game/mods/default/textures/default_sandstone_block.png
new file mode 100644
index 0000000..2e06491
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_sandstone_block.png differ
diff --git a/games/minetest_game/mods/default/textures/default_silver_sand.png b/games/minetest_game/mods/default/textures/default_silver_sand.png
new file mode 100644
index 0000000..c4a8f73
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_silver_sand.png differ
diff --git a/games/minetest_game/mods/default/textures/default_snow.png b/games/minetest_game/mods/default/textures/default_snow.png
index 2a2439f..4ac3593 100644
Binary files a/games/minetest_game/mods/default/textures/default_snow.png and b/games/minetest_game/mods/default/textures/default_snow.png differ
diff --git a/games/minetest_game/mods/default/textures/default_snow_side.png b/games/minetest_game/mods/default/textures/default_snow_side.png
index f13ec94..f95b3af 100644
Binary files a/games/minetest_game/mods/default/textures/default_snow_side.png and b/games/minetest_game/mods/default/textures/default_snow_side.png differ
diff --git a/games/minetest_game/mods/default/textures/default_snowball.png b/games/minetest_game/mods/default/textures/default_snowball.png
index ecdba9a..e952b79 100644
Binary files a/games/minetest_game/mods/default/textures/default_snowball.png and b/games/minetest_game/mods/default/textures/default_snowball.png differ
diff --git a/games/minetest_game/mods/default/textures/default_stone_block.png b/games/minetest_game/mods/default/textures/default_stone_block.png
new file mode 100644
index 0000000..3b771e7
Binary files /dev/null and b/games/minetest_game/mods/default/textures/default_stone_block.png differ
diff --git a/games/minetest_game/mods/default/textures/default_stone_brick.png b/games/minetest_game/mods/default/textures/default_stone_brick.png
index be949ab..4dbb49d 100644
Binary files a/games/minetest_game/mods/default/textures/default_stone_brick.png and b/games/minetest_game/mods/default/textures/default_stone_brick.png differ
diff --git a/games/minetest_game/mods/default/tools.lua b/games/minetest_game/mods/default/tools.lua
index a948886..9147f9b 100644
--- a/games/minetest_game/mods/default/tools.lua
+++ b/games/minetest_game/mods/default/tools.lua
@@ -32,7 +32,10 @@ minetest.register_tool("default:pick_wood", {
 		},
 		damage_groups = {fleshy=2},
 	},
+	groups = {flammable = 2},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:pick_stone", {
 	description = "Stone Pickaxe",
 	inventory_image = "default_tool_stonepick.png",
@@ -44,7 +47,9 @@ minetest.register_tool("default:pick_stone", {
 		},
 		damage_groups = {fleshy=3},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:pick_steel", {
 	description = "Steel Pickaxe",
 	inventory_image = "default_tool_steelpick.png",
@@ -56,7 +61,9 @@ minetest.register_tool("default:pick_steel", {
 		},
 		damage_groups = {fleshy=4},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:pick_bronze", {
 	description = "Bronze Pickaxe",
 	inventory_image = "default_tool_bronzepick.png",
@@ -68,7 +75,9 @@ minetest.register_tool("default:pick_bronze", {
 		},
 		damage_groups = {fleshy=4},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:pick_mese", {
 	description = "Mese Pickaxe",
 	inventory_image = "default_tool_mesepick.png",
@@ -80,7 +89,9 @@ minetest.register_tool("default:pick_mese", {
 		},
 		damage_groups = {fleshy=5},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:pick_diamond", {
 	description = "Diamond Pickaxe",
 	inventory_image = "default_tool_diamondpick.png",
@@ -92,6 +103,7 @@ minetest.register_tool("default:pick_diamond", {
 		},
 		damage_groups = {fleshy=5},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
 
 --
@@ -110,7 +122,10 @@ minetest.register_tool("default:shovel_wood", {
 		},
 		damage_groups = {fleshy=2},
 	},
+	groups = {flammable = 2},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:shovel_stone", {
 	description = "Stone Shovel",
 	inventory_image = "default_tool_stoneshovel.png",
@@ -123,7 +138,9 @@ minetest.register_tool("default:shovel_stone", {
 		},
 		damage_groups = {fleshy=2},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:shovel_steel", {
 	description = "Steel Shovel",
 	inventory_image = "default_tool_steelshovel.png",
@@ -136,7 +153,9 @@ minetest.register_tool("default:shovel_steel", {
 		},
 		damage_groups = {fleshy=3},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:shovel_bronze", {
 	description = "Bronze Shovel",
 	inventory_image = "default_tool_bronzeshovel.png",
@@ -149,7 +168,9 @@ minetest.register_tool("default:shovel_bronze", {
 		},
 		damage_groups = {fleshy=3},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:shovel_mese", {
 	description = "Mese Shovel",
 	inventory_image = "default_tool_meseshovel.png",
@@ -162,7 +183,9 @@ minetest.register_tool("default:shovel_mese", {
 		},
 		damage_groups = {fleshy=4},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:shovel_diamond", {
 	description = "Diamond Shovel",
 	inventory_image = "default_tool_diamondshovel.png",
@@ -175,6 +198,7 @@ minetest.register_tool("default:shovel_diamond", {
 		},
 		damage_groups = {fleshy=4},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
 
 --
@@ -192,7 +216,10 @@ minetest.register_tool("default:axe_wood", {
 		},
 		damage_groups = {fleshy=2},
 	},
+	groups = {flammable = 2},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:axe_stone", {
 	description = "Stone Axe",
 	inventory_image = "default_tool_stoneaxe.png",
@@ -204,7 +231,9 @@ minetest.register_tool("default:axe_stone", {
 		},
 		damage_groups = {fleshy=3},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:axe_steel", {
 	description = "Steel Axe",
 	inventory_image = "default_tool_steelaxe.png",
@@ -216,7 +245,9 @@ minetest.register_tool("default:axe_steel", {
 		},
 		damage_groups = {fleshy=4},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:axe_bronze", {
 	description = "Bronze Axe",
 	inventory_image = "default_tool_bronzeaxe.png",
@@ -228,7 +259,9 @@ minetest.register_tool("default:axe_bronze", {
 		},
 		damage_groups = {fleshy=4},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:axe_mese", {
 	description = "Mese Axe",
 	inventory_image = "default_tool_meseaxe.png",
@@ -240,7 +273,9 @@ minetest.register_tool("default:axe_mese", {
 		},
 		damage_groups = {fleshy=6},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:axe_diamond", {
 	description = "Diamond Axe",
 	inventory_image = "default_tool_diamondaxe.png",
@@ -252,6 +287,7 @@ minetest.register_tool("default:axe_diamond", {
 		},
 		damage_groups = {fleshy=7},
 	},
+	sound = {breaks = "default_tool_breaks"},
 })
 
 --
@@ -268,8 +304,11 @@ minetest.register_tool("default:sword_wood", {
 			snappy={times={[2]=1.6, [3]=0.40}, uses=10, maxlevel=1},
 		},
 		damage_groups = {fleshy=2},
-	}
+	},
+	groups = {flammable = 2},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:sword_stone", {
 	description = "Stone Sword",
 	inventory_image = "default_tool_stonesword.png",
@@ -280,8 +319,10 @@ minetest.register_tool("default:sword_stone", {
 			snappy={times={[2]=1.4, [3]=0.40}, uses=20, maxlevel=1},
 		},
 		damage_groups = {fleshy=4},
-	}
+	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:sword_steel", {
 	description = "Steel Sword",
 	inventory_image = "default_tool_steelsword.png",
@@ -292,8 +333,10 @@ minetest.register_tool("default:sword_steel", {
 			snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=30, maxlevel=2},
 		},
 		damage_groups = {fleshy=6},
-	}
+	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:sword_bronze", {
 	description = "Bronze Sword",
 	inventory_image = "default_tool_bronzesword.png",
@@ -304,8 +347,10 @@ minetest.register_tool("default:sword_bronze", {
 			snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=40, maxlevel=2},
 		},
 		damage_groups = {fleshy=6},
-	}
+	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:sword_mese", {
 	description = "Mese Sword",
 	inventory_image = "default_tool_mesesword.png",
@@ -316,8 +361,10 @@ minetest.register_tool("default:sword_mese", {
 			snappy={times={[1]=2.0, [2]=1.00, [3]=0.35}, uses=30, maxlevel=3},
 		},
 		damage_groups = {fleshy=7},
-	}
+	},
+	sound = {breaks = "default_tool_breaks"},
 })
+
 minetest.register_tool("default:sword_diamond", {
 	description = "Diamond Sword",
 	inventory_image = "default_tool_diamondsword.png",
@@ -328,5 +375,78 @@ minetest.register_tool("default:sword_diamond", {
 			snappy={times={[1]=1.90, [2]=0.90, [3]=0.30}, uses=40, maxlevel=3},
 		},
 		damage_groups = {fleshy=8},
-	}
+	},
+	sound = {breaks = "default_tool_breaks"},
+})
+
+minetest.register_tool("default:skeleton_key", {
+	description = "Skeleton Key",
+	inventory_image = "default_key_skeleton.png",
+	groups = {key = 1},
+	on_place = function(itemstack, placer, pointed_thing)
+		if pointed_thing.type ~= "node" then
+			return itemstack
+		end
+
+		local pos = pointed_thing.under
+		local node = minetest.get_node(pos)
+
+		if not node then
+			return itemstack
+		end
+
+		local on_skeleton_key_use = minetest.registered_nodes[node.name].on_skeleton_key_use
+		if on_skeleton_key_use then
+			-- make a new key secret in case the node callback needs it
+			local random = math.random
+			local newsecret = string.format(
+				"%04x%04x%04x%04x",
+				random(2^16) - 1, random(2^16) - 1,
+				random(2^16) - 1, random(2^16) - 1)
+
+			local secret, _, _ = on_skeleton_key_use(pos, placer, newsecret)
+
+			if secret then
+				-- finish and return the new key
+				itemstack:take_item()
+				itemstack:add_item("default:key")
+				itemstack:set_metadata(minetest.write_json({
+					secret = secret
+				}))
+				return itemstack
+			end
+		end
+		return nil
+	end
+})
+
+minetest.register_tool("default:key", {
+	description = "Key",
+	inventory_image = "default_key.png",
+	groups = {key = 1, not_in_creative_inventory = 1},
+	stack_max = 1,
+	on_place = function(itemstack, placer, pointed_thing)
+		if pointed_thing.type ~= "node" then
+			return itemstack
+		end
+
+		local pos = pointed_thing.under
+		local node = minetest.get_node(pos)
+
+		if not node or node.name == "ignore" then
+			return itemstack
+		end
+
+		local ndef = minetest.registered_nodes[node.name]
+		if not ndef then
+			return itemstack
+		end
+
+		local on_key_use = ndef.on_key_use
+		if on_key_use then
+			on_key_use(pos, placer)
+		end
+
+		return nil
+	end
 })
diff --git a/games/minetest_game/mods/default/torch.lua b/games/minetest_game/mods/default/torch.lua
new file mode 100644
index 0000000..e94c5bd
--- /dev/null
+++ b/games/minetest_game/mods/default/torch.lua
@@ -0,0 +1,147 @@
+
+--[[
+
+Torch mod - formerly mod "Torches"
+======================
+
+(c) Copyright BlockMen (2013-2015)
+(C) Copyright sofar <sofar at foo-projects.org> (2016)
+
+This mod changes the default torch drawtype from "torchlike" to "mesh",
+giving the torch a three dimensional appearance. The mesh contains the
+proper pixel mapping to make the animation appear as a particle above
+the torch, while in fact the animation is just the texture of the mesh.
+
+
+License:
+~~~~~~~~
+(c) Copyright BlockMen (2013-2015)
+
+Textures and Meshes/Models:
+CC-BY 3.0 BlockMen
+Note that the models were entirely done from scratch by sofar.
+
+Code:
+Licensed under the GNU LGPL version 2.1 or higher.
+You can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License
+as published by the Free Software Foundation;
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt
+
+--]]
+
+minetest.register_node("default:torch", {
+	description = "Torch",
+	drawtype = "mesh",
+	mesh = "torch_floor.obj",
+	inventory_image = "default_torch_on_floor.png",
+	wield_image = "default_torch_on_floor.png",
+	tiles = {{
+		    name = "default_torch_on_floor_animated.png",
+		    animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3}
+	}},
+	paramtype = "light",
+	paramtype2 = "wallmounted",
+	sunlight_propagates = true,
+	walkable = false,
+	liquids_pointable = false,
+	light_source = 13,
+	groups = {choppy=2, dig_immediate=3, flammable=1, attached_node=1, torch=1},
+	drop = "default:torch",
+	selection_box = {
+		type = "wallmounted",
+		wall_bottom = {-1/8, -1/2, -1/8, 1/8, 2/16, 1/8},
+	},
+	sounds = default.node_sound_wood_defaults(),
+	on_place = function(itemstack, placer, pointed_thing)
+		local under = pointed_thing.under
+		local node = minetest.get_node(under)
+		local def = minetest.registered_nodes[node.name]
+		if def and def.on_rightclick and
+			((not placer) or (placer and not placer:get_player_control().sneak)) then
+			return def.on_rightclick(under, node, placer, itemstack,
+				pointed_thing) or itemstack
+		end
+
+		local above = pointed_thing.above
+		local wdir = minetest.dir_to_wallmounted(vector.subtract(under, above))
+		local fakestack = itemstack
+		if wdir == 0 then
+			fakestack:set_name("default:torch_ceiling")
+		elseif wdir == 1 then
+			fakestack:set_name("default:torch")
+		else
+			fakestack:set_name("default:torch_wall")
+		end
+
+		itemstack = minetest.item_place(fakestack, placer, pointed_thing, wdir)
+		itemstack:set_name("default:torch")
+
+		return itemstack
+	end
+})
+
+minetest.register_node("default:torch_wall", {
+	drawtype = "mesh",
+	mesh = "torch_wall.obj",
+	tiles = {{
+		    name = "default_torch_on_floor_animated.png",
+		    animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3}
+	}},
+	paramtype = "light",
+	paramtype2 = "wallmounted",
+	sunlight_propagates = true,
+	walkable = false,
+	light_source = 13,
+	groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1},
+	drop = "default:torch",
+	selection_box = {
+		type = "wallmounted",
+		wall_side = {-1/2, -1/2, -1/8, -1/8, 1/8, 1/8},
+	},
+	sounds = default.node_sound_wood_defaults(),
+})
+
+minetest.register_node("default:torch_ceiling", {
+	drawtype = "mesh",
+	mesh = "torch_ceiling.obj",
+	tiles = {{
+		    name = "default_torch_on_floor_animated.png",
+		    animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3}
+	}},
+	paramtype = "light",
+	paramtype2 = "wallmounted",
+	sunlight_propagates = true,
+	walkable = false,
+	light_source = 13,
+	groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1},
+	drop = "default:torch",
+	selection_box = {
+		type = "wallmounted",
+		wall_top = {-1/8, -1/16, -5/16, 1/8, 1/2, 1/8},
+	},
+	sounds = default.node_sound_wood_defaults(),
+})
+
+minetest.register_lbm({
+	name = "default:3dtorch",
+	nodenames = {"default:torch", "torches:floor", "torches:wall"},
+	action = function(pos, node)
+		if node.param2 == 0 then
+			minetest.set_node(pos, {name = "default:torch_ceiling",
+				param2 = node.param2})
+		elseif node.param2 == 1 then
+			minetest.set_node(pos, {name = "default:torch",
+				param2 = node.param2})
+		else
+			minetest.set_node(pos, {name = "default:torch_wall",
+				param2 = node.param2})
+		end
+	end
+})
+
diff --git a/games/minetest_game/mods/default/trees.lua b/games/minetest_game/mods/default/trees.lua
index de2452e..0b95742 100644
--- a/games/minetest_game/mods/default/trees.lua
+++ b/games/minetest_game/mods/default/trees.lua
@@ -27,89 +27,69 @@ end
 -- 'is snow nearby' function
 
 local function is_snow_nearby(pos)
-	local x, y, z = pos.x, pos.y, pos.z
-	local c_snow = minetest.get_content_id("default:snow")
-	local c_snowblock = minetest.get_content_id("default:snowblock")
-	local c_dirtsnow = minetest.get_content_id("default:dirt_with_snow")
-
-	local vm = minetest.get_voxel_manip()
-	local minp, maxp = vm:read_from_map(
-		{x = x - 1, y = y - 1, z = z - 1},
-		{x = x + 1, y = y + 1, z = z + 1}
-	)
-	local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
-	local data = vm:get_data()
-
-	for yy = y - 1, y + 1 do
-	for zz = z - 1, z + 1 do
-		local vi  = a:index(x - 1, yy, zz)
-		for xx = x - 1, x + 1 do
-			local nodid = data[vi]
-			if nodid == c_snow or nodid == c_snowblock or nodid == c_dirtsnow then
-				return true
-			end
-			vi  = vi + 1
-		end
-	end
-	end
-
-	return false
+	return minetest.find_node_near(pos, 1,
+		{"default:snow", "default:snowblock", "default:dirt_with_snow"})
 end
 
 
 -- Sapling ABM
 
-minetest.register_abm({
-	nodenames = {"default:sapling", "default:junglesapling",
-		"default:pine_sapling", "default:acacia_sapling",
-		"default:aspen_sapling"},
-	interval = 10,
-	chance = 50,
-	action = function(pos, node)
-		if not default.can_grow(pos) then
-			return
-		end
+function default.grow_sapling(pos)
+	if not default.can_grow(pos) then
+		-- try a bit later again
+		minetest.get_node_timer(pos):start(math.random(240, 600))
+		return
+	end
 
-		local mapgen = minetest.get_mapgen_params().mgname
-		if node.name == "default:sapling" then
-			minetest.log("action", "A sapling grows into a tree at "..
-				minetest.pos_to_string(pos))
-			if mapgen == "v6" then
-				default.grow_tree(pos, random(1, 4) == 1)
-			else
-				default.grow_new_apple_tree(pos)
-			end
-		elseif node.name == "default:junglesapling" then
-			minetest.log("action", "A jungle sapling grows into a tree at "..
-				minetest.pos_to_string(pos))
-			if mapgen == "v6" then
-				default.grow_jungle_tree(pos)
-			else
-				default.grow_new_jungle_tree(pos)
-			end
-		elseif node.name == "default:pine_sapling" then
-			minetest.log("action", "A pine sapling grows into a tree at "..
-				minetest.pos_to_string(pos))
-			local snow = is_snow_nearby(pos)
-			if mapgen == "v6" then
-				default.grow_pine_tree(pos, snow)
-			elseif snow then
-				default.grow_new_snowy_pine_tree(pos)
-			else
-				default.grow_new_pine_tree(pos)
-			end
-		elseif node.name == "default:acacia_sapling" then
-			minetest.log("action", "An acacia sapling grows into a tree at "..
-				minetest.pos_to_string(pos))
-			default.grow_new_acacia_tree(pos)
-		elseif node.name == "default:aspen_sapling" then
-			minetest.log("action", "An aspen sapling grows into a tree at "..
-				minetest.pos_to_string(pos))
-			default.grow_new_aspen_tree(pos)
+	local mg_name = minetest.get_mapgen_setting("mg_name")
+	local node = minetest.get_node(pos)
+	if node.name == "default:sapling" then
+		minetest.log("action", "A sapling grows into a tree at "..
+			minetest.pos_to_string(pos))
+		if mg_name == "v6" then
+			default.grow_tree(pos, random(1, 4) == 1)
+		else
+			default.grow_new_apple_tree(pos)
+		end
+	elseif node.name == "default:junglesapling" then
+		minetest.log("action", "A jungle sapling grows into a tree at "..
+			minetest.pos_to_string(pos))
+		if mg_name == "v6" then
+			default.grow_jungle_tree(pos)
+		else
+			default.grow_new_jungle_tree(pos)
+		end
+	elseif node.name == "default:pine_sapling" then
+		minetest.log("action", "A pine sapling grows into a tree at "..
+			minetest.pos_to_string(pos))
+		local snow = is_snow_nearby(pos)
+		if mg_name == "v6" then
+			default.grow_pine_tree(pos, snow)
+		elseif snow then
+			default.grow_new_snowy_pine_tree(pos)
+		else
+			default.grow_new_pine_tree(pos)
 		end
+	elseif node.name == "default:acacia_sapling" then
+		minetest.log("action", "An acacia sapling grows into a tree at "..
+			minetest.pos_to_string(pos))
+		default.grow_new_acacia_tree(pos)
+	elseif node.name == "default:aspen_sapling" then
+		minetest.log("action", "An aspen sapling grows into a tree at "..
+			minetest.pos_to_string(pos))
+		default.grow_new_aspen_tree(pos)
 	end
-})
+end
 
+minetest.register_lbm({
+	name = "default:convert_saplings_to_node_timer",
+	nodenames = {"default:sapling", "default:junglesapling",
+			"default:pine_sapling", "default:acacia_sapling",
+			"default:aspen_sapling"},
+	action = function(pos)
+		minetest.get_node_timer(pos):start(math.random(1200, 2400))
+	end
+})
 
 --
 -- Tree generation
@@ -194,8 +174,8 @@ function default.grow_tree(pos, is_apple_tree, bad)
 
 	local vm = minetest.get_voxel_manip()
 	local minp, maxp = vm:read_from_map(
-		{x = pos.x - 2, y = pos.y, z = pos.z - 2},
-		{x = pos.x + 2, y = pos.y + height + 1, z = pos.z + 2}
+		{x = x - 2, y = y, z = z - 2},
+		{x = x + 2, y = y + height + 1, z = z + 2}
 	)
 	local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
 	local data = vm:get_data()
@@ -229,8 +209,8 @@ function default.grow_jungle_tree(pos, bad)
 
 	local vm = minetest.get_voxel_manip()
 	local minp, maxp = vm:read_from_map(
-		{x = pos.x - 3, y = pos.y - 1, z = pos.z - 3},
-		{x = pos.x + 3, y = pos.y + height + 1, z = pos.z + 3}
+		{x = x - 3, y = y - 1, z = z - 3},
+		{x = x + 3, y = y + height + 1, z = z + 3}
 	)
 	local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
 	local data = vm:get_data()
@@ -349,7 +329,7 @@ function default.grow_pine_tree(pos, snow)
 		end
 	end
 
-	local dev = 2
+	dev = 2
 	for yy = my + 1, my + 2 do
 		for zz = z - dev, z + dev do
 			local vi = a:index(x - dev, yy, zz)
@@ -436,6 +416,7 @@ function default.grow_new_acacia_tree(pos)
 		path, "random", nil, false)
 end
 
+
 -- New aspen tree
 
 function default.grow_new_aspen_tree(pos)
@@ -444,3 +425,53 @@ function default.grow_new_aspen_tree(pos)
 	minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2},
 		path, "0", nil, false)
 end
+
+
+--
+-- Sapling 'on place' function to check protection of node and resulting tree volume
+--
+
+function default.sapling_on_place(itemstack, placer, pointed_thing,
+		sapling_name, minp_relative, maxp_relative, interval)
+	-- Position of sapling
+	local pos = pointed_thing.under
+	local node = minetest.get_node_or_nil(pos)
+	local pdef = node and minetest.registered_nodes[node.name]
+
+	if pdef and pdef.on_rightclick and not placer:get_player_control().sneak then
+		return pdef.on_rightclick(pos, node, placer, itemstack, pointed_thing)
+	end
+
+	if not pdef or not pdef.buildable_to then
+		pos = pointed_thing.above
+		node = minetest.get_node_or_nil(pos)
+		pdef = node and minetest.registered_nodes[node.name]
+		if not pdef or not pdef.buildable_to then
+			return itemstack
+		end
+	end
+
+	local player_name = placer:get_player_name()
+	-- Check sapling position for protection
+	if minetest.is_protected(pos, player_name) then
+		minetest.record_protection_violation(pos, player_name)
+		return itemstack
+	end
+	-- Check tree volume for protection
+	if not default.intersects_protection(
+			vector.add(pos, minp_relative),
+			vector.add(pos, maxp_relative),
+			player_name,
+			interval) then
+		minetest.set_node(pos, {name = sapling_name})
+		if not minetest.setting_getbool("creative_mode") then
+			itemstack:take_item()
+		end
+	else
+		minetest.record_protection_violation(pos, player_name)
+		-- Print extra information to explain
+		minetest.chat_send_player(player_name, "Tree will intersect protection")
+	end
+
+	return itemstack
+end
diff --git a/games/minetest_game/mods/doors/README.txt b/games/minetest_game/mods/doors/README.txt
index b1c1363..9ad7093 100644
--- a/games/minetest_game/mods/doors/README.txt
+++ b/games/minetest_game/mods/doors/README.txt
@@ -1,62 +1,62 @@
 Minetest Game mod: doors
 ========================
-version: 2.0
-
-License of source code:
------------------------
-Copyright (C) 2012 PilzAdam
-modified by BlockMen (added sounds, glassdoors[glass, obsidian glass], trapdoor)
-Steel trapdoor added by sofar.
-Copyright (C) 2016 sofar at foo-projects.org
-Re-implemented most of the door algorithms, added meshes, UV wrapped texture
+See license.txt for license information.
+
+Authors of source code
+----------------------
+Originally by PilzAdam (MIT)
+
+Modified by BlockMen (MIT): Added sounds, glass doors (glass, obsidian glass) and trapdoor.
+
+Modified by sofar (sofar at foo-projects.org) (MIT):
+Added Steel trapdoor.
+Re-implemented most of the door algorithms, added meshes, UV wrapped texture.
 Added doors API to facilitate coding mods accessing and operating doors.
-Added Fence Gate model, code, and sounds
+Added Fence Gate model, code, and sounds.
+
+Various Minetest developers and contributors (MIT)
 
-This program is free software. It comes without any warranty, to
-the extent permitted by applicable law. You can redistribute it
-and/or modify it under the terms of the Do What The Fuck You Want
-To Public License, Version 2, as published by Sam Hocevar. See
-http://sam.zoy.org/wtfpl/COPYING for more details.
 
-License of textures
---------------------------------------
-following Textures created by Fernando Zapata (CC BY-SA 3.0):
+Authors of media (textures)
+---------------------------
+Following textures created by Fernando Zapata (CC BY-SA 3.0):
   door_wood.png
   door_wood_a.png
   door_wood_a_r.png
   door_wood_b.png
   door_wood_b_r.png
 
-following Textures created by BlockMen (WTFPL):
+Following textures created by BlockMen (CC BY-SA 3.0):
   door_trapdoor.png
   door_obsidian_glass_side.png
 
-following textures created by celeron55 (CC BY-SA 3.0):
+Following textures created by celeron55 (CC BY-SA 3.0):
   door_glass_a.png
   door_glass_b.png
 
-following Textures created by PenguinDad (CC BY-SA 4.0):
+Following textures created by PenguinDad (CC BY-SA 4.0):
   door_glass.png
   door_obsidian_glass.png
 
-following textures created by sofar (CC-BY-SA-3.0)
+Following textures created by sofar (CC-BY-SA-3.0):
   doors_trapdoor_steel.png
   doors_trapdoor_steel_side.png
   door_trapdoor_side.png
 
-
-Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen: WTFPL
+Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen (CC BY-SA 3.0):
   door_obsidian_glass.png
 
-Glass door textures by red-001 based on textures by celeron55: CC BY-SA 3.0
+Glass door textures by red-001 based on textures by celeron55 (CC BY-SA 3.0):
   door_glass.png
-All other textures (created by PilzAdam): WTFPL
+
+All other textures (created by PilzAdam) (CC BY-SA 3.0):
 
 Door textures were converted to the new texture map by sofar, paramat and
 red-001, under the same license as the originals.
 
-Models:
---------------------------------------
+
+Authors of media (models)
+-------------------------
 Door 3d models by sofar (CC-BY-SA-3.0)
  - door_a.obj
  - door_b.obj
@@ -64,18 +64,21 @@ Fence gate models by sofar (CC-BY-SA-3.0)
  - fencegate_open.obj
  - fencegate_closed.obj
 
-License of sounds
---------------------------------------
+
+Authors of media (sounds)
+-------------------------
 Opening-Sound created by CGEffex (CC BY 3.0), modified by BlockMen
   door_open.ogg
 Closing-Sound created by bennstir (CC BY 3.0)
   door_close.ogg
 fencegate_open.ogg:
-  http://www.freesound.org/people/mhtaylor67/sounds/126041/ - CC0
+  http://www.freesound.org/people/mhtaylor67/sounds/126041/ - (CC0 1.0)
 fencegate_close.ogg:
-  http://www.freesound.org/people/BarkersPinhead/sounds/274807/ - CC-BY-3.0
-  http://www.freesound.org/people/rivernile7/sounds/249573/ - CC-BY-3.0
-Steel door sounds (open & close (CC-BY-3.0) by HazMatt
+  http://www.freesound.org/people/BarkersPinhead/sounds/274807/ - (CC-BY-3.0)
+  http://www.freesound.org/people/rivernile7/sounds/249573/ - (CC-BY-3.0)
+Steel door sounds open & close (CC-BY-3.0) by HazMatt
   - http://www.freesound.org/people/HazMattt/sounds/187283/
   doors_steel_door_open.ogg
   doors_steel_door_close.ogg
+doors_glass_door_open.ogg, doors_glass_door_close.ogg:
+  https://www.freesound.org/people/SkeetMasterFunk69/sounds/235546/ (CC0 1.0)
diff --git a/games/minetest_game/mods/doors/init.lua b/games/minetest_game/mods/doors/init.lua
index 90ddcc3..c5d4a14 100644
--- a/games/minetest_game/mods/doors/init.lua
+++ b/games/minetest_game/mods/doors/init.lua
@@ -1,12 +1,3 @@
-
---[[
-
-Copyright (C) 2012 PilzAdam
-  modified by BlockMen (added sounds, glassdoors[glass, obsidian glass], trapdoor)
-Copyright (C) 2015 - Auke Kok <sofar at foo-projects.org>
-
---]]
-
 -- our API object
 doors = {}
 
@@ -17,7 +8,8 @@ _doors.registered_trapdoors = {}
 
 -- returns an object to a door object or nil
 function doors.get(pos)
-	if _doors.registered_doors[minetest.get_node(pos).name] then
+	local node_name = minetest.get_node(pos).name
+	if _doors.registered_doors[node_name] then
 		-- A normal upright door
 		return {
 			pos = pos,
@@ -25,23 +17,23 @@ function doors.get(pos)
 				if self:state() then
 					return false
 				end
-				return _doors.door_toggle(self.pos, player)
+				return _doors.door_toggle(self.pos, nil, player)
 			end,
 			close = function(self, player)
 				if not self:state() then
 					return false
 				end
-				return _doors.door_toggle(self.pos, player)
+				return _doors.door_toggle(self.pos, nil, player)
 			end,
 			toggle = function(self, player)
-				return _doors.door_toggle(self.pos, player)
+				return _doors.door_toggle(self.pos, nil, player)
 			end,
 			state = function(self)
 				local state = minetest.get_meta(self.pos):get_int("state")
 				return state %2 == 1
 			end
 		}
-	elseif _doors.registered_trapdoors[minetest.get_node(pos).name] then
+	elseif _doors.registered_trapdoors[node_name] then
 		-- A trapdoor
 		return {
 			pos = pos,
@@ -49,20 +41,19 @@ function doors.get(pos)
 				if self:state() then
 					return false
 				end
-				return _doors.trapdoor_toggle(self.pos, player)
+				return _doors.trapdoor_toggle(self.pos, nil, player)
 			end,
 			close = function(self, player)
 				if not self:state() then
 					return false
 				end
-				return _doors.trapdoor_toggle(self.pos, player)
+				return _doors.trapdoor_toggle(self.pos, nil, player)
 			end,
 			toggle = function(self, player)
-				return _doors.trapdoor_toggle(self.pos, player)
+				return _doors.trapdoor_toggle(self.pos, nil, player)
 			end,
 			state = function(self)
-				local name = minetest.get_node(pos).name
-				return name:sub(-5) == "_open"
+				return minetest.get_node(self.pos).name:sub(-5) == "_open"
 			end
 		}
 	else
@@ -105,56 +96,67 @@ minetest.register_node("doors:hidden", {
 -- table used to aid door opening/closing
 local transform = {
 	{
-		{ v = "_a", param2 = 3 },
-		{ v = "_a", param2 = 0 },
-		{ v = "_a", param2 = 1 },
-		{ v = "_a", param2 = 2 },
+		{v = "_a", param2 = 3},
+		{v = "_a", param2 = 0},
+		{v = "_a", param2 = 1},
+		{v = "_a", param2 = 2},
 	},
 	{
-		{ v = "_b", param2 = 1 },
-		{ v = "_b", param2 = 2 },
-		{ v = "_b", param2 = 3 },
-		{ v = "_b", param2 = 0 },
+		{v = "_b", param2 = 1},
+		{v = "_b", param2 = 2},
+		{v = "_b", param2 = 3},
+		{v = "_b", param2 = 0},
 	},
 	{
-		{ v = "_b", param2 = 1 },
-		{ v = "_b", param2 = 2 },
-		{ v = "_b", param2 = 3 },
-		{ v = "_b", param2 = 0 },
+		{v = "_b", param2 = 1},
+		{v = "_b", param2 = 2},
+		{v = "_b", param2 = 3},
+		{v = "_b", param2 = 0},
 	},
 	{
-		{ v = "_a", param2 = 3 },
-		{ v = "_a", param2 = 0 },
-		{ v = "_a", param2 = 1 },
-		{ v = "_a", param2 = 2 },
+		{v = "_a", param2 = 3},
+		{v = "_a", param2 = 0},
+		{v = "_a", param2 = 1},
+		{v = "_a", param2 = 2},
 	},
 }
 
-function _doors.door_toggle(pos, clicker)
+function _doors.door_toggle(pos, node, clicker)
 	local meta = minetest.get_meta(pos)
-	local def = minetest.registered_nodes[minetest.get_node(pos).name]
+	node = node or minetest.get_node(pos)
+	local def = minetest.registered_nodes[node.name]
 	local name = def.door.name
 
 	local state = meta:get_string("state")
 	if state == "" then
 		-- fix up lvm-placed right-hinged doors, default closed
-		if minetest.get_node(pos).name:sub(-2) == "_b" then
+		if node.name:sub(-2) == "_b" then
 			state = 2
+		else
+			state = 0
 		end
 	else
 		state = tonumber(state)
 	end
 
 	if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then
+		-- is player wielding the right key?
+		local item = clicker:get_wielded_item()
 		local owner = meta:get_string("doors_owner")
-		if owner ~= "" then
+		if item:get_name() == "default:key" then
+			local key_meta = minetest.parse_json(item:get_metadata())
+			local secret = meta:get_string("key_lock_secret")
+			if secret ~= key_meta.secret then
+				return false
+			end
+
+		elseif owner ~= "" then
 			if clicker:get_player_name() ~= owner then
 				return false
 			end
 		end
 	end
 
-	local old = state
 	-- until Lua-5.2 we have no bitwise operators :(
 	if state % 2 == 1 then
 		state = state - 1
@@ -162,11 +164,13 @@ function _doors.door_toggle(pos, clicker)
 		state = state + 1
 	end
 
-	local dir = minetest.get_node(pos).param2
+	local dir = node.param2
 	if state % 2 == 0 then
-		minetest.sound_play(def.door.sounds[1], {pos = pos, gain = 0.3, max_hear_distance = 10})
+		minetest.sound_play(def.door.sounds[1],
+			{pos = pos, gain = 0.3, max_hear_distance = 10})
 	else
-		minetest.sound_play(def.door.sounds[2], {pos = pos, gain = 0.3, max_hear_distance = 10})
+		minetest.sound_play(def.door.sounds[2],
+			{pos = pos, gain = 0.3, max_hear_distance = 10})
 	end
 
 	minetest.swap_node(pos, {
@@ -179,22 +183,33 @@ function _doors.door_toggle(pos, clicker)
 end
 
 
-local function on_place_node(place_to, newnode, placer, oldnode, itemstack, pointed_thing)
+local function on_place_node(place_to, newnode,
+	placer, oldnode, itemstack, pointed_thing)
 	-- Run script hook
-	local _, callback
-	for _, callback in ipairs(core.registered_on_placenodes) do
+	for _, callback in ipairs(minetest.registered_on_placenodes) do
 		-- Deepcopy pos, node and pointed_thing because callback can modify them
 		local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z}
-		local newnode_copy = {name = newnode.name, param1 = newnode.param1, param2 = newnode.param2}
-		local oldnode_copy = {name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2}
+		local newnode_copy =
+			{name = newnode.name, param1 = newnode.param1, param2 = newnode.param2}
+		local oldnode_copy =
+			{name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2}
 		local pointed_thing_copy = {
 			type  = pointed_thing.type,
 			above = vector.new(pointed_thing.above),
 			under = vector.new(pointed_thing.under),
 			ref   = pointed_thing.ref,
 		}
-		callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy)
+		callback(place_to_copy, newnode_copy, placer,
+			oldnode_copy, itemstack, pointed_thing_copy)
+	end
+end
+
+local function can_dig_door(pos, digger)
+	local digger_name = digger and digger:get_player_name()
+	if digger_name and minetest.get_player_privs(digger_name).protection_bypass then
+		return true
 	end
+	return minetest.get_meta(pos):get_string("doors_owner") == digger_name
 end
 
 function doors.register(name, def)
@@ -212,8 +227,8 @@ function doors.register(name, def)
 			local h = meta:get_int("right") + 1
 			local p2 = node.param2
 			local replace = {
-				{ { type = "a", state = 0 }, { type = "a", state = 3 } },
-				{ { type = "b", state = 1 }, { type = "b", state = 2 } }
+				{{type = "a", state = 0}, {type = "a", state = 3}},
+				{{type = "b", state = 1}, {type = "b", state = 2}}
 			}
 			local new = replace[l][h]
 			-- retain infotext and doors_owner fields
@@ -242,7 +257,7 @@ function doors.register(name, def)
 		inventory_image = def.inventory_image,
 
 		on_place = function(itemstack, placer, pointed_thing)
-			local pos = nil
+			local pos
 
 			if not pointed_thing.type == "node" then
 				return itemstack
@@ -252,7 +267,7 @@ function doors.register(name, def)
 			local pdef = minetest.registered_nodes[node.name]
 			if pdef and pdef.on_rightclick then
 				return pdef.on_rightclick(pointed_thing.under,
-						node, placer, itemstack)
+						node, placer, itemstack, pointed_thing)
 			end
 
 			if pdef and pdef.buildable_to then
@@ -266,8 +281,11 @@ function doors.register(name, def)
 				end
 			end
 
-			local above = { x = pos.x, y = pos.y + 1, z = pos.z }
-			if not minetest.registered_nodes[minetest.get_node(above).name].buildable_to then
+			local above = {x = pos.x, y = pos.y + 1, z = pos.z}
+			local top_node = minetest.get_node_or_nil(above)
+			local topdef = top_node and minetest.registered_nodes[top_node.name]
+
+			if not topdef or not topdef.buildable_to then
 				return itemstack
 			end
 
@@ -279,10 +297,10 @@ function doors.register(name, def)
 			local dir = minetest.dir_to_facedir(placer:get_look_dir())
 
 			local ref = {
-				{ x = -1, y = 0, z = 0 },
-				{ x = 0, y = 0, z = 1 },
-				{ x = 1, y = 0, z = 0 },
-				{ x = 0, y = 0, z = -1 },
+				{x = -1, y = 0, z = 0},
+				{x = 0, y = 0, z = 1},
+				{x = 1, y = 0, z = 0},
+				{x = 0, y = 0, z = -1},
 			}
 
 			local aside = {
@@ -305,7 +323,6 @@ function doors.register(name, def)
 			meta:set_int("state", state)
 
 			if def.protected then
-				local pn = placer:get_player_name()
 				meta:set_string("doors_owner", pn)
 				meta:set_string("infotext", "Owned by " .. pn)
 			end
@@ -314,26 +331,21 @@ function doors.register(name, def)
 				itemstack:take_item()
 			end
 
-			on_place_node(pos, minetest.get_node(pos), placer, node, itemstack, pointed_thing)
+			on_place_node(pos, minetest.get_node(pos),
+				placer, node, itemstack, pointed_thing)
 
 			return itemstack
 		end
 	})
+	def.inventory_image = nil
 
-	local can_dig = function(pos, digger)
-		if not def.protected then
-			return true
-		end
-		if minetest.check_player_privs(digger, "protection_bypass") then
-			return true
-		end
-		local meta = minetest.get_meta(pos)
-		local name = ""
-		if digger then
-			name = digger:get_player_name()
-		end
-		return meta:get_string("doors_owner") == name
+	if def.recipe then
+		minetest.register_craft({
+			output = name,
+			recipe = def.recipe,
+		})
 	end
+	def.recipe = nil
 
 	if not def.sounds then
 		def.sounds = default.node_sound_wood_defaults()
@@ -355,22 +367,43 @@ function doors.register(name, def)
 		sounds = { def.sound_close, def.sound_open },
 	}
 
-	def.on_rightclick = function(pos, node, clicker)
-		_doors.door_toggle(pos, clicker)
+	def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
+		_doors.door_toggle(pos, node, clicker)
+		return itemstack
 	end
 	def.after_dig_node = function(pos, node, meta, digger)
 		minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z})
-		nodeupdate({x = pos.x, y = pos.y + 1, z = pos.z})
-	end
-	def.can_dig = function(pos, player)
-		return can_dig(pos, player)
-	end
-	def.on_rotate = function(pos, node, user, mode, new_param2)
-		return false
+		minetest.check_for_falling({x = pos.x, y = pos.y + 1, z = pos.z})
 	end
+	def.on_rotate = false
 
 	if def.protected then
+		def.can_dig = can_dig_door
 		def.on_blast = function() end
+		def.on_key_use = function(pos, player)
+			local door = doors.get(pos)
+			door:toggle(player)
+		end
+		def.on_skeleton_key_use = function(pos, player, newsecret)
+			local meta = minetest.get_meta(pos)
+			local owner = meta:get_string("doors_owner")
+			local pname = player:get_player_name()
+
+			-- verify placer is owner of lockable door
+			if owner ~= pname then
+				minetest.record_protection_violation(pos, pname)
+				minetest.chat_send_player(pname, "You do not own this locked door.")
+				return nil
+			end
+
+			local secret = meta:get_string("key_lock_secret")
+			if secret == "" then
+				secret = newsecret
+				meta:set_string("key_lock_secret", secret)
+			end
+
+			return secret, "a locked door", owner
+		end
 	else
 		def.on_blast = function(pos, intensity)
 			minetest.remove_node(pos)
@@ -384,76 +417,21 @@ function doors.register(name, def)
 		minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z})
 	end
 
-	minetest.register_node(":" .. name .. "_a", {
-		description = def.description,
-		visual = "mesh",
-		mesh = "door_a.obj",
-		tiles = def.tiles,
-		drawtype = "mesh",
-		paramtype = "light",
-		paramtype2 = "facedir",
-		sunlight_propagates = true,
-		walkable = true,
-		is_ground_content = false,
-		buildable_to = false,
-		drop = def.drop,
-		groups = def.groups,
-		sounds = def.sounds,
-		door = def.door,
-		on_rightclick = def.on_rightclick,
-		after_dig_node = def.after_dig_node,
-		can_dig = def.can_dig,
-		on_rotate = def.on_rotate,
-		on_blast = def.on_blast,
-		on_destruct = def.on_destruct,
-		selection_box = {
-			type = "fixed",
-			fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16}
-		},
-		collision_box = {
-			type = "fixed",
-			fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16}
-		},
-	})
+	def.drawtype = "mesh"
+	def.paramtype = "light"
+	def.paramtype2 = "facedir"
+	def.sunlight_propagates = true
+	def.walkable = true
+	def.is_ground_content = false
+	def.buildable_to = false
+	def.selection_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}}
+	def.collision_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}}
 
-	minetest.register_node(":" .. name .. "_b", {
-		description = def.description,
-		visual = "mesh",
-		mesh = "door_b.obj",
-		tiles = def.tiles,
-		drawtype = "mesh",
-		paramtype = "light",
-		paramtype2 = "facedir",
-		sunlight_propagates = true,
-		walkable = true,
-		is_ground_content = false,
-		buildable_to = false,
-		drop = def.drop,
-		groups = def.groups,
-		sounds = def.sounds,
-		door = def.door,
-		on_rightclick = def.on_rightclick,
-		after_dig_node = def.after_dig_node,
-		can_dig = def.can_dig,
-		on_rotate = def.on_rotate,
-		on_blast = def.on_blast,
-		on_destruct = def.on_destruct,
-		selection_box = {
-			type = "fixed",
-			fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16}
-		},
-		collision_box = {
-			type = "fixed",
-			fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16}
-		},
-	})
+	def.mesh = "door_a.obj"
+	minetest.register_node(":" .. name .. "_a", def)
 
-	if def.recipe then
-		minetest.register_craft({
-			output = name,
-			recipe = def.recipe,
-		})
-	end
+	def.mesh = "door_b.obj"
+	minetest.register_node(":" .. name .. "_b", def)
 
 	_doors.registered_doors[name .. "_a"] = true
 	_doors.registered_doors[name .. "_b"] = true
@@ -463,7 +441,7 @@ doors.register("door_wood", {
 		tiles = {{ name = "doors_door_wood.png", backface_culling = true }},
 		description = "Wooden Door",
 		inventory_image = "doors_item_wood.png",
-		groups = { snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
+		groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
 		recipe = {
 			{"group:wood", "group:wood"},
 			{"group:wood", "group:wood"},
@@ -472,11 +450,12 @@ doors.register("door_wood", {
 })
 
 doors.register("door_steel", {
-		tiles = {{ name = "doors_door_steel.png", backface_culling = true }},
+		tiles = {{name = "doors_door_steel.png", backface_culling = true}},
 		description = "Steel Door",
 		inventory_image = "doors_item_steel.png",
 		protected = true,
-		groups = { snappy = 1, bendy = 2, cracky = 1, melty = 2, level = 2 },
+		groups = {cracky = 1, level = 2},
+		sounds = default.node_sound_metal_defaults(),
 		sound_open = "doors_steel_door_open",
 		sound_close = "doors_steel_door_close",
 		recipe = {
@@ -487,11 +466,13 @@ doors.register("door_steel", {
 })
 
 doors.register("door_glass", {
-		tiles = { "doors_door_glass.png"},
+		tiles = {"doors_door_glass.png"},
 		description = "Glass Door",
 		inventory_image = "doors_item_glass.png",
-		groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 },
+		groups = {cracky=3, oddly_breakable_by_hand=3},
 		sounds = default.node_sound_glass_defaults(),
+		sound_open = "doors_glass_door_open",
+		sound_close = "doors_glass_door_close",
 		recipe = {
 			{"default:glass", "default:glass"},
 			{"default:glass", "default:glass"},
@@ -500,11 +481,13 @@ doors.register("door_glass", {
 })
 
 doors.register("door_obsidian_glass", {
-		tiles = { "doors_door_obsidian_glass.png" },
+		tiles = {"doors_door_obsidian_glass.png"},
 		description = "Obsidian Glass Door",
 		inventory_image = "doors_item_obsidian_glass.png",
-		groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 },
+		groups = {cracky=3},
 		sounds = default.node_sound_glass_defaults(),
+		sound_open = "doors_glass_door_open",
+		sound_close = "doors_glass_door_close",
 		recipe = {
 			{"default:obsidian_glass", "default:obsidian_glass"},
 			{"default:obsidian_glass", "default:obsidian_glass"},
@@ -538,44 +521,53 @@ end
 
 ----trapdoor----
 
-function _doors.trapdoor_toggle(pos, clicker)
+function _doors.trapdoor_toggle(pos, node, clicker)
+	node = node or minetest.get_node(pos)
 	if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then
+		-- is player wielding the right key?
+		local item = clicker:get_wielded_item()
 		local meta = minetest.get_meta(pos)
 		local owner = meta:get_string("doors_owner")
-		if owner ~= "" then
+		if item:get_name() == "default:key" then
+			local key_meta = minetest.parse_json(item:get_metadata())
+			local secret = meta:get_string("key_lock_secret")
+			if secret ~= key_meta.secret then
+				return false
+			end
+
+		elseif owner ~= "" then
 			if clicker:get_player_name() ~= owner then
 				return false
 			end
 		end
 	end
 
-	local node = minetest.get_node(pos)
 	local def = minetest.registered_nodes[node.name]
 
 	if string.sub(node.name, -5) == "_open" then
-		minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 10})
-		minetest.swap_node(pos, {name = string.sub(node.name, 1, string.len(node.name) - 5), param1 = node.param1, param2 = node.param2})
+		minetest.sound_play(def.sound_close,
+			{pos = pos, gain = 0.3, max_hear_distance = 10})
+		minetest.swap_node(pos, {name = string.sub(node.name, 1,
+			string.len(node.name) - 5), param1 = node.param1, param2 = node.param2})
 	else
-		minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 10})
-		minetest.swap_node(pos, {name = node.name .. "_open", param1 = node.param1, param2 = node.param2})
+		minetest.sound_play(def.sound_open,
+			{pos = pos, gain = 0.3, max_hear_distance = 10})
+		minetest.swap_node(pos, {name = node.name .. "_open",
+			param1 = node.param1, param2 = node.param2})
 	end
 end
 
 function doors.register_trapdoor(name, def)
+	if not name:find(":") then
+		name = "doors:" .. name
+	end
+
 	local name_closed = name
 	local name_opened = name.."_open"
 
-	local function check_player_priv(pos, player)
-		if not def.protected or minetest.check_player_privs(player, "protection_bypass") then
-			return true
-		end
-		local meta = minetest.get_meta(pos)
-		local pn = player:get_player_name()
-		return meta:get_string("doors_owner") == pn
-	end
-
-	def.on_rightclick = function(pos, node, clicker)
-		_doors.trapdoor_toggle(pos, clicker)
+	def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
+		_doors.trapdoor_toggle(pos, node, clicker)
+		return itemstack
 	end
 
 	-- Common trapdoor configuration
@@ -583,9 +575,9 @@ function doors.register_trapdoor(name, def)
 	def.paramtype = "light"
 	def.paramtype2 = "facedir"
 	def.is_ground_content = false
-	def.can_dig = check_player_priv
 
 	if def.protected then
+		def.can_dig = can_dig_door
 		def.after_place_node = function(pos, placer, itemstack, pointed_thing)
 			local pn = placer:get_player_name()
 			local meta = minetest.get_meta(pos)
@@ -596,11 +588,34 @@ function doors.register_trapdoor(name, def)
 		end
 
 		def.on_blast = function() end
+		def.on_key_use = function(pos, player)
+			local door = doors.get(pos)
+			door:toggle(player)
+		end
+		def.on_skeleton_key_use = function(pos, player, newsecret)
+			local meta = minetest.get_meta(pos)
+			local owner = meta:get_string("doors_owner")
+			local pname = player:get_player_name()
+
+			-- verify placer is owner of lockable door
+			if owner ~= pname then
+				minetest.record_protection_violation(pos, pname)
+				minetest.chat_send_player(pname, "You do not own this trapdoor.")
+				return nil
+			end
+
+			local secret = meta:get_string("key_lock_secret")
+			if secret == "" then
+				secret = newsecret
+				meta:set_string("key_lock_secret", secret)
+			end
+
+			return secret, "a locked trapdoor", owner
+		end
 	else
 		def.on_blast = function(pos, intensity)
 			minetest.remove_node(pos)
-			minetest.remove_node({ x = pos.x, y = pos.y + 1, z = pos.z})
-			return { name }
+			return {name}
 		end
 	end
 
@@ -627,8 +642,10 @@ function doors.register_trapdoor(name, def)
 		type = "fixed",
 		fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5}
 	}
-	def_closed.tiles = { def.tile_front, def.tile_front, def.tile_side, def.tile_side,
-		def.tile_side, def.tile_side }
+	def_closed.tiles = {def.tile_front,
+			def.tile_front .. '^[transformFY',
+			def.tile_side, def.tile_side,
+			def.tile_side, def.tile_side}
 
 	def_opened.node_box = {
 		type = "fixed",
@@ -638,10 +655,11 @@ function doors.register_trapdoor(name, def)
 		type = "fixed",
 		fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5}
 	}
-	def_opened.tiles = { def.tile_side, def.tile_side,
+	def_opened.tiles = {def.tile_side, def.tile_side,
 			def.tile_side .. '^[transform3',
 			def.tile_side .. '^[transform1',
-			def.tile_front, def.tile_front }
+			def.tile_front .. '^[transform46',
+			def.tile_front .. '^[transform6'}
 
 	def_opened.drop = name_closed
 	def_opened.groups.not_in_creative_inventory = 1
@@ -659,7 +677,7 @@ doors.register_trapdoor("doors:trapdoor", {
 	wield_image = "doors_trapdoor.png",
 	tile_front = "doors_trapdoor.png",
 	tile_side = "doors_trapdoor_side.png",
-	groups = {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=2, door=1},
+	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1},
 })
 
 doors.register_trapdoor("doors:trapdoor_steel", {
@@ -669,9 +687,10 @@ doors.register_trapdoor("doors:trapdoor_steel", {
 	tile_front = "doors_trapdoor_steel.png",
 	tile_side = "doors_trapdoor_steel_side.png",
 	protected = true,
+	sounds = default.node_sound_metal_defaults(),
 	sound_open = "doors_steel_door_open",
 	sound_close = "doors_steel_door_close",
-	groups = {snappy=1, bendy=2, cracky=1, melty=2, level=2, door=1},
+	groups = {cracky = 1, level = 2, door = 1},
 })
 
 minetest.register_craft({
@@ -698,21 +717,21 @@ function doors.register_fencegate(name, def)
 	local fence = {
 		description = def.description,
 		drawtype = "mesh",
-		tiles = { def.texture },
+		tiles = {def.texture},
 		paramtype = "light",
 		paramtype2 = "facedir",
 		sunlight_propagates = true,
 		is_ground_content = false,
 		drop = name .. "_closed",
-		connect_sides = { "left", "right" },
+		connect_sides = {"left", "right"},
 		groups = def.groups,
 		sounds = def.sounds,
-		on_rightclick = function(pos, clicker)
-			local node = minetest.get_node(pos)
+		on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
 			local node_def = minetest.registered_nodes[node.name]
 			minetest.swap_node(pos, {name = node_def.gate, param2 = node.param2})
 			minetest.sound_play(node_def.sound, {pos = pos, gain = 0.3,
 				max_hear_distance = 8})
+			return itemstack
 		end,
 		selection_box = {
 			type = "fixed",
@@ -743,7 +762,7 @@ function doors.register_fencegate(name, def)
 	fence_open.collision_box = {
 		type = "fixed",
 		fixed = {{-1/2, -1/2, -1/4, -3/8, 1/2, 1/4},
-			{-5/8, -3/8, -14/16, -3/8, 3/8, 0}},
+			{-1/2, -3/8, -1/2, -3/8, 3/8, 0}},
 	}
 
 	minetest.register_node(":" .. name .. "_closed", fence_closed)
@@ -783,12 +802,57 @@ doors.register_fencegate("doors:gate_pine_wood", {
 	description = "Pine Fence Gate",
 	texture = "default_pine_wood.png",
 	material = "default:pine_wood",
-	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}
+	groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}
 })
 
 doors.register_fencegate("doors:gate_aspen_wood", {
 	description = "Aspen Fence Gate",
 	texture = "default_aspen_wood.png",
 	material = "default:aspen_wood",
-	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}
+	groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}
+})
+
+
+----fuels----
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "doors:trapdoor",
+	burntime = 7,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "doors:door_wood",
+	burntime = 14,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "doors:gate_wood_closed",
+	burntime = 7,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "doors:gate_acacia_wood_closed",
+	burntime = 8,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "doors:gate_junglewood_closed",
+	burntime = 9,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "doors:gate_pine_wood_closed",
+	burntime = 6,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "doors:gate_aspen_wood_closed",
+	burntime = 5,
 })
diff --git a/games/minetest_game/mods/doors/license.txt b/games/minetest_game/mods/doors/license.txt
new file mode 100644
index 0000000..8ce73c4
--- /dev/null
+++ b/games/minetest_game/mods/doors/license.txt
@@ -0,0 +1,164 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2012-2016 PilzAdam
+Copyright (C) 2014-2016 BlockMen
+Copyright (C) 2015-2016 sofar (sofar at foo-projects.org)
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+Licenses of media (textures, models and sounds)
+-----------------------------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2011-2016 Fernando Zapata
+Copyright (C) 2014-2016 celeron55
+Copyright (C) 2012-2016 PilzAdam
+Copyright (C) 2014-2016 BlockMen
+Copyright (C) 2015-2016 sofar
+Copyright (C) 2016 red-001
+Copyright (C) 2016 paramat
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
+
+-----------------------
+
+Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
+Copyright (C) 2014-2016 PenguinDad
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/4.0/
+
+-----------------------
+
+Attribution 3.0 Unported (CC BY 3.0)
+Copyright (C) 2014 CGEffex
+Copyright (C) 2014 bennstir
+Copyright (C) 2016 BarkersPinhead
+Copyright (C) 2016 rivernile7
+Copyright (C) 2016 HazMatt
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by/3.0/
+
+-----------------------
+
+CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
+mhtaylor67
+SkeetMasterFunk69
+
+No Copyright
+
+The person who associated a work with this deed has dedicated the work to the public
+domain by waiving all of his or her rights to the work worldwide under copyright law,
+including all related and neighboring rights, to the extent allowed by law.
+
+You can copy, modify, distribute and perform the work, even for commercial purposes, all
+without asking permission. See Other Information below.
+
+Other Information
+
+In no way are the patent or trademark rights of any person affected by CC0, nor are the
+rights that other persons may have in the work or in how the work is used, such as
+publicity or privacy rights.
+Unless expressly stated otherwise, the person who associated a work with this deed makes
+no warranties about the work, and disclaims liability for all uses of the work, to the
+fullest extent permitted by applicable law.
+When using or citing the work, you should not imply endorsement by the author or the
+affirmer.
+
+For more details:
+https://creativecommons.org/publicdomain/zero/1.0/
diff --git a/games/minetest_game/mods/doors/sounds/doors_glass_door_close.ogg b/games/minetest_game/mods/doors/sounds/doors_glass_door_close.ogg
new file mode 100644
index 0000000..b3c1355
Binary files /dev/null and b/games/minetest_game/mods/doors/sounds/doors_glass_door_close.ogg differ
diff --git a/games/minetest_game/mods/doors/sounds/doors_glass_door_open.ogg b/games/minetest_game/mods/doors/sounds/doors_glass_door_open.ogg
new file mode 100644
index 0000000..66e6812
Binary files /dev/null and b/games/minetest_game/mods/doors/sounds/doors_glass_door_open.ogg differ
diff --git a/games/minetest_game/mods/dye/README.txt b/games/minetest_game/mods/dye/README.txt
index b103541..a2fbdd2 100644
--- a/games/minetest_game/mods/dye/README.txt
+++ b/games/minetest_game/mods/dye/README.txt
@@ -1,15 +1,13 @@
 Minetest Game mod: dye
 ======================
-
+See license.txt for license information.
 See init.lua for documentation.
 
-License of source code and media files:
----------------------------------------
-Copyright (C) 2012 Perttu Ahola (celeron55) <celeron55 at gmail.com>
-
-This program is free software. It comes without any warranty, to
-the extent permitted by applicable law. You can redistribute it
-and/or modify it under the terms of the Do What The Fuck You Want
-To Public License, Version 2, as published by Sam Hocevar. See
-http://sam.zoy.org/wtfpl/COPYING for more details.
+Authors of source code
+----------------------
+Originally by Perttu Ahola (celeron55) <celeron55 at gmail.com> (MIT)
+Various Minetest developers and contributors (MIT)
 
+Authors of media (textures)
+---------------------------
+Perttu Ahola (celeron55) <celeron55 at gmail.com> (CC BY-SA 3.0)
diff --git a/games/minetest_game/mods/dye/license.txt b/games/minetest_game/mods/dye/license.txt
new file mode 100644
index 0000000..bf9d350
--- /dev/null
+++ b/games/minetest_game/mods/dye/license.txt
@@ -0,0 +1,60 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2012-2016 Perttu Ahola (celeron55) <celeron55 at gmail.com>
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2012-2016 Perttu Ahola (celeron55) <celeron55 at gmail.com>
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/farming/README.txt b/games/minetest_game/mods/farming/README.txt
index 143cf38..3ccd8c3 100644
--- a/games/minetest_game/mods/farming/README.txt
+++ b/games/minetest_game/mods/farming/README.txt
@@ -1,34 +1,23 @@
 Minetest Game mod: farming
 ==========================
+See license.txt for license information.
 
-License of source code:
------------------------
-Copyright (C) 2014 webdesigner97
+Authors of source code
+----------------------
+Originally by PilzAdam (MIT)
+webdesigner97 (MIT)
+Various Minetest developers and contributors (MIT)
 
-            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
-                    Version 2, December 2004
-
- Copyright (C) 2004 Sam Hocevar <sam at hocevar.net>
-
- Everyone is permitted to copy and distribute verbatim or modified
- copies of this license document, and changing it is allowed as long
- as the name is changed.
-
-            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. You just DO WHAT THE FUCK YOU WANT TO. 
-
-License of media (textures):
-----------------------------
-Created by PilzAdam (License: WTFPL):
+Authors of media (textures)
+---------------------------
+Created by PilzAdam (CC BY 3.0):
   farming_bread.png
   farming_soil.png
   farming_soil_wet.png
   farming_soil_wet_side.png
   farming_string.png
 
-Created by BlockMen (License: CC BY 3.0):
+Created by BlockMen (CC BY 3.0):
   farming_tool_diamondhoe.png
   farming_tool_mesehoe.png
   farming_tool_bronzehoe.png
@@ -36,10 +25,10 @@ Created by BlockMen (License: CC BY 3.0):
   farming_tool_stonehoe.png
   farming_tool_woodhoe.png
 
-Created by MasterGollum (License: WTFPL):
+Created by MasterGollum (CC BY 3.0):
   farming_straw.png
 
-Created by Gambit (License: WTFPL):
+Created by Gambit (CC BY 3.0):
   farming_wheat.png
   farming_wheat_*.png
   farming_cotton_*.png
diff --git a/games/minetest_game/mods/farming/api.lua b/games/minetest_game/mods/farming/api.lua
index 68f7be7..182e1b2 100644
--- a/games/minetest_game/mods/farming/api.lua
+++ b/games/minetest_game/mods/farming/api.lua
@@ -1,5 +1,8 @@
+
 -- Wear out hoes, place soil
 -- TODO Ignore group:flower
+farming.registered_plants = {}
+
 farming.hoe_on_use = function(itemstack, user, pointed_thing, uses)
 	local pt = pointed_thing
 	-- check if pointing at a node
@@ -9,11 +12,11 @@ farming.hoe_on_use = function(itemstack, user, pointed_thing, uses)
 	if pt.type ~= "node" then
 		return
 	end
-	
+
 	local under = minetest.get_node(pt.under)
 	local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z}
 	local above = minetest.get_node(p)
-	
+
 	-- return if any of the nodes is not registered
 	if not minetest.registered_nodes[under.name] then
 		return
@@ -21,23 +24,23 @@ farming.hoe_on_use = function(itemstack, user, pointed_thing, uses)
 	if not minetest.registered_nodes[above.name] then
 		return
 	end
-	
+
 	-- check if the node above the pointed thing is air
 	if above.name ~= "air" then
 		return
 	end
-	
+
 	-- check if pointing at soil
 	if minetest.get_item_group(under.name, "soil") ~= 1 then
 		return
 	end
-	
+
 	-- check if (wet) soil defined
 	local regN = minetest.registered_nodes
 	if regN[under.name].soil == nil or regN[under.name].soil.wet == nil or regN[under.name].soil.dry == nil then
 		return
 	end
-	
+
 	if minetest.is_protected(pt.under, user:get_player_name()) then
 		minetest.record_protection_violation(pt.under, user:get_player_name())
 		return
@@ -47,16 +50,21 @@ farming.hoe_on_use = function(itemstack, user, pointed_thing, uses)
 		return
 	end
 
-	
-	-- turn the node into soil, wear out item and play sound
+	-- turn the node into soil and play sound
 	minetest.set_node(pt.under, {name = regN[under.name].soil.dry})
 	minetest.sound_play("default_dig_crumbly", {
 		pos = pt.under,
 		gain = 0.5,
 	})
-	
+
 	if not minetest.setting_getbool("creative_mode") then
+		-- wear tool
+		local wdef = itemstack:get_definition()
 		itemstack:add_wear(65535/(uses-1))
+		-- tool break sound
+		if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then
+			minetest.sound_play(wdef.sound.breaks, {pos = pt.above, gain = 0.5})
+		end
 	end
 	return itemstack
 end
@@ -90,7 +98,9 @@ farming.register_hoe = function(name, def)
 		inventory_image = def.inventory_image,
 		on_use = function(itemstack, user, pointed_thing)
 			return farming.hoe_on_use(itemstack, user, pointed_thing, def.max_uses)
-		end
+		end,
+		groups = def.groups,
+		sound = {breaks = "default_tool_breaks"},
 	})
 	-- Register its recipe
 	if def.material == nil then
@@ -119,20 +129,29 @@ farming.register_hoe = function(name, def)
 	end
 end
 
+-- how often node timers for plants will tick, +/- some random value
+local function tick(pos)
+	minetest.get_node_timer(pos):start(math.random(166, 286))
+end
+-- how often a growth failure tick is retried (e.g. too dark)
+local function tick_again(pos)
+	minetest.get_node_timer(pos):start(math.random(40, 80))
+end
+
 -- Seed placement
 farming.place_seed = function(itemstack, placer, pointed_thing, plantname)
 	local pt = pointed_thing
 	-- check if pointing at a node
 	if not pt then
-		return
+		return itemstack
 	end
 	if pt.type ~= "node" then
-		return
+		return itemstack
 	end
-	
+
 	local under = minetest.get_node(pt.under)
 	local above = minetest.get_node(pt.above)
-	
+
 	if minetest.is_protected(pt.under, placer:get_player_name()) then
 		minetest.record_protection_violation(pt.under, placer:get_player_name())
 		return
@@ -142,38 +161,101 @@ farming.place_seed = function(itemstack, placer, pointed_thing, plantname)
 		return
 	end
 
-	
 	-- return if any of the nodes is not registered
 	if not minetest.registered_nodes[under.name] then
-		return
+		return itemstack
 	end
 	if not minetest.registered_nodes[above.name] then
-		return
+		return itemstack
 	end
-	
+
 	-- check if pointing at the top of the node
 	if pt.above.y ~= pt.under.y+1 then
-		return
+		return itemstack
 	end
-	
+
 	-- check if you can replace the node above the pointed node
 	if not minetest.registered_nodes[above.name].buildable_to then
-		return
+		return itemstack
 	end
-	
+
 	-- check if pointing at soil
 	if minetest.get_item_group(under.name, "soil") < 2 then
-		return
+		return itemstack
 	end
-	
+
 	-- add the node and remove 1 item from the itemstack
 	minetest.add_node(pt.above, {name = plantname, param2 = 1})
+	tick(pt.above)
 	if not minetest.setting_getbool("creative_mode") then
 		itemstack:take_item()
 	end
 	return itemstack
 end
 
+farming.grow_plant = function(pos, elapsed)
+	local node = minetest.get_node(pos)
+	local name = node.name
+	local def = minetest.registered_nodes[name]
+
+	if not def.next_plant then
+		-- disable timer for fully grown plant
+		return
+	end
+
+	-- grow seed
+	if minetest.get_item_group(node.name, "seed") and def.fertility then
+		local soil_node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z})
+		if not soil_node then
+			tick_again(pos)
+			return
+		end
+		-- omitted is a check for light, we assume seeds can germinate in the dark.
+		for _, v in pairs(def.fertility) do
+			if minetest.get_item_group(soil_node.name, v) ~= 0 then
+				local placenode = {name = def.next_plant}
+				if def.place_param2 then
+					placenode.param2 = def.place_param2
+				end
+				minetest.swap_node(pos, placenode)
+				if minetest.registered_nodes[def.next_plant].next_plant then
+					tick(pos)
+					return
+				end
+			end
+		end
+
+		return
+	end
+
+	-- check if on wet soil
+	local below = minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z})
+	if minetest.get_item_group(below.name, "soil") < 3 then
+		tick_again(pos)
+		return
+	end
+
+	-- check light
+	local light = minetest.get_node_light(pos)
+	if not light or light < def.minlight or light > def.maxlight then
+		tick_again(pos)
+		return
+	end
+
+	-- grow
+	local placenode = {name = def.next_plant}
+	if def.place_param2 then
+		placenode.param2 = def.place_param2
+	end
+	minetest.swap_node(pos, placenode)
+
+	-- new timer needed?
+	if minetest.registered_nodes[def.next_plant].next_plant then
+		tick(pos)
+	end
+	return
+end
+
 -- Register plants
 farming.register_plant = function(name, def)
 	local mname = name:split(":")[1]
@@ -199,8 +281,11 @@ farming.register_plant = function(name, def)
 		def.fertility = {}
 	end
 
+	farming.registered_plants[pname] = def
+
 	-- Register seed
-	local g = {seed = 1, snappy = 3, attached_node = 1}
+	local lbm_nodes = {mname .. ":seed_" .. pname}
+	local g = {seed = 1, snappy = 3, attached_node = 1, flammable = 2}
 	for k, v in pairs(def.fertility) do
 		g[v] = 1
 	end
@@ -213,6 +298,7 @@ farming.register_plant = function(name, def)
 		groups = g,
 		paramtype = "light",
 		paramtype2 = "wallmounted",
+		place_param2 = def.place_param2 or nil, -- this isn't actually used for placement
 		walkable = false,
 		sunlight_propagates = true,
 		selection_box = {
@@ -221,6 +307,7 @@ farming.register_plant = function(name, def)
 		},
 		fertility = def.fertility,
 		sounds = default.node_sound_dirt_defaults({
+			dig = {name = "", gain = 0},
 			dug = {name = "default_grass_footstep", gain = 0.2},
 			place = {name = "default_place_node", gain = 0.25},
 		}),
@@ -228,16 +315,21 @@ farming.register_plant = function(name, def)
 		on_place = function(itemstack, placer, pointed_thing)
 			return farming.place_seed(itemstack, placer, pointed_thing, mname .. ":seed_" .. pname)
 		end,
+		next_plant = mname .. ":" .. pname .. "_1",
+		on_timer = farming.grow_plant,
+		minlight = def.minlight,
+		maxlight = def.maxlight,
 	})
 
 	-- Register harvest
 	minetest.register_craftitem(":" .. mname .. ":" .. pname, {
 		description = pname:gsub("^%l", string.upper),
 		inventory_image = mname .. "_" .. pname .. ".png",
+		groups = {flammable = 2},
 	})
 
 	-- Register growing steps
-	for i=1,def.steps do
+	for i = 1, def.steps do
 		local drop = {
 			items = {
 				{items = {mname .. ":" .. pname}, rarity = 9 - i},
@@ -248,11 +340,21 @@ farming.register_plant = function(name, def)
 		}
 		local nodegroups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1}
 		nodegroups[pname] = i
-		minetest.register_node(mname .. ":" .. pname .. "_" .. i, {
+
+		local next_plant = nil
+
+		if i < def.steps then
+			next_plant = mname .. ":" .. pname .. "_" .. (i + 1)
+			lbm_nodes[#lbm_nodes + 1] = mname .. ":" .. pname .. "_" .. i
+		end
+
+		minetest.register_node(":" .. mname .. ":" .. pname .. "_" .. i, {
 			drawtype = "plantlike",
 			waving = 1,
 			tiles = {mname .. "_" .. pname .. "_" .. i .. ".png"},
 			paramtype = "light",
+			paramtype2 = def.paramtype2 or nil,
+			place_param2 = def.place_param2 or nil,
 			walkable = false,
 			buildable_to = true,
 			drop = drop,
@@ -262,61 +364,20 @@ farming.register_plant = function(name, def)
 			},
 			groups = nodegroups,
 			sounds = default.node_sound_leaves_defaults(),
+			next_plant = next_plant,
+			on_timer = farming.grow_plant,
+			minlight = def.minlight,
+			maxlight = def.maxlight,
 		})
 	end
 
-	-- Growing ABM
-	minetest.register_abm({
-		nodenames = {"group:" .. pname, "group:seed"},
-		neighbors = {"group:soil"},
-		interval = 9,
-		chance = 20,
+	-- replacement LBM for pre-nodetimer plants
+	minetest.register_lbm({
+		name = ":" .. mname .. ":start_nodetimer_" .. pname,
+		nodenames = lbm_nodes,
 		action = function(pos, node)
-			local plant_height = minetest.get_item_group(node.name, pname)
-
-			-- return if already full grown
-			if plant_height == def.steps then
-				return
-			end
-
-			local node_def = minetest.registered_items[node.name] or nil
-
-			-- grow seed
-			if minetest.get_item_group(node.name, "seed") and node_def.fertility then
-				local can_grow = false
-				local soil_node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z})
-				if not soil_node then
-					return
-				end
-				for _, v in pairs(node_def.fertility) do
-					if minetest.get_item_group(soil_node.name, v) ~= 0 then
-						can_grow = true
-					end
-				end
-				if can_grow then
-					minetest.set_node(pos, {name = node.name:gsub("seed_", "") .. "_1"})
-				end
-				return
-			end
-
-			-- check if on wet soil
-			pos.y = pos.y - 1
-			local n = minetest.get_node(pos)
-			if minetest.get_item_group(n.name, "soil") < 3 then
-				return
-			end
-			pos.y = pos.y + 1
-
-			-- check light
-			local ll = minetest.get_node_light(pos)
-
-			if not ll or ll < def.minlight or ll > def.maxlight then
-				return
-			end
-
-			-- grow
-			minetest.set_node(pos, {name = mname .. ":" .. pname .. "_" .. plant_height + 1})
-		end
+			tick_again(pos)
+		end,
 	})
 
 	-- Return
diff --git a/games/minetest_game/mods/farming/hoes.lua b/games/minetest_game/mods/farming/hoes.lua
index 31da19f..5aae390 100644
--- a/games/minetest_game/mods/farming/hoes.lua
+++ b/games/minetest_game/mods/farming/hoes.lua
@@ -2,7 +2,8 @@ farming.register_hoe(":farming:hoe_wood", {
 	description = "Wooden Hoe",
 	inventory_image = "farming_tool_woodhoe.png",
 	max_uses = 30,
-	material = "group:wood"
+	material = "group:wood",
+	groups = {flammable = 2},
 })
 
 farming.register_hoe(":farming:hoe_stone", {
diff --git a/games/minetest_game/mods/farming/init.lua b/games/minetest_game/mods/farming/init.lua
index 45370e7..97dc9b4 100644
--- a/games/minetest_game/mods/farming/init.lua
+++ b/games/minetest_game/mods/farming/init.lua
@@ -10,21 +10,26 @@ dofile(farming.path .. "/hoes.lua")
 -- WHEAT
 farming.register_plant("farming:wheat", {
 	description = "Wheat seed",
+	paramtype2 = "meshoptions",
 	inventory_image = "farming_wheat_seed.png",
 	steps = 8,
 	minlight = 13,
 	maxlight = default.LIGHT_MAX,
-	fertility = {"grassland"}
+	fertility = {"grassland"},
+	groups = {flammable = 4},
+	place_param2 = 3,
 })
 minetest.register_craftitem("farming:flour", {
 	description = "Flour",
 	inventory_image = "farming_flour.png",
+	groups = {flammable = 1},
 })
 
 minetest.register_craftitem("farming:bread", {
 	description = "Bread",
 	inventory_image = "farming_bread.png",
 	on_use = minetest.item_eat(5),
+	groups = {flammable = 2},
 })
 
 minetest.register_craft({
@@ -47,7 +52,8 @@ farming.register_plant("farming:cotton", {
 	steps = 8,
 	minlight = 13,
 	maxlight = default.LIGHT_MAX,
-	fertility = {"grassland", "desert"}
+	fertility = {"grassland", "desert"},
+	groups = {flammable = 4},
 })
 
 minetest.register_alias("farming:string", "farming:cotton")
@@ -76,3 +82,28 @@ minetest.register_craft({
 		{"farming:straw"},
 	}
 })
+
+-- Fuels
+minetest.register_craft({
+	type = "fuel",
+	recipe = "farming:straw",
+	burntime = 3,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "farming:wheat",
+	burntime = 1,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "farming:cotton",
+	burntime = 1,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "farming:hoe_wood",
+	burntime = 5,
+})
diff --git a/games/minetest_game/mods/farming/license.txt b/games/minetest_game/mods/farming/license.txt
new file mode 100644
index 0000000..8cbb63a
--- /dev/null
+++ b/games/minetest_game/mods/farming/license.txt
@@ -0,0 +1,61 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2012-2016 PilzAdam
+Copyright (C) 2014-2016 webdesigner97
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+License of media (textures)
+---------------------------
+
+Attribution 3.0 Unported (CC BY 3.0)
+Copyright (C) 2012-2016 PilzAdam
+Copyright (C) 2014-2016 BlockMen
+Copyright (C) 2015-2016 MasterGollum
+Copyright (C) 2015-2016 Gambit
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by/3.0/
diff --git a/games/minetest_game/mods/farming/nodes.lua b/games/minetest_game/mods/farming/nodes.lua
index b55a1aa..09ad36f 100644
--- a/games/minetest_game/mods/farming/nodes.lua
+++ b/games/minetest_game/mods/farming/nodes.lua
@@ -1,5 +1,4 @@
 minetest.override_item("default:dirt", {
-	groups = {crumbly=3, soil=1},
 	soil = {
 		base = "default:dirt",
 		dry = "farming:soil",
@@ -8,7 +7,6 @@ minetest.override_item("default:dirt", {
 })
 
 minetest.override_item("default:dirt_with_grass", {
-	groups = {crumbly=3, soil=1},
 	soil = {
 		base = "default:dirt_with_grass",
 		dry = "farming:soil",
@@ -17,7 +15,6 @@ minetest.override_item("default:dirt_with_grass", {
 })
 
 minetest.override_item("default:dirt_with_dry_grass", {
-	groups = {crumbly=3, soil=1},
 	soil = {
 		base = "default:dirt_with_dry_grass",
 		dry = "farming:soil",
@@ -89,11 +86,12 @@ minetest.register_node("farming:straw", {
 	description = "Straw",
 	tiles = {"farming_straw.png"},
 	is_ground_content = false,
-	groups = {snappy=3, flammable=4},
+	groups = {snappy=3, flammable=4, fall_damage_add_percent=-30},
 	sounds = default.node_sound_leaves_defaults(),
 })
 
 minetest.register_abm({
+	label = "Farming soil",
 	nodenames = {"group:field"},
 	interval = 15,
 	chance = 4,
@@ -113,7 +111,7 @@ minetest.register_abm({
 		end
 		local nn_def = minetest.registered_nodes[nn.name] or nil
 		pos.y = pos.y - 1
-		
+
 		if nn_def and nn_def.walkable and minetest.get_item_group(nn.name, "plant") == 0 then
 			minetest.set_node(pos, {name = base})
 			return
@@ -135,7 +133,7 @@ minetest.register_abm({
 					if minetest.get_item_group(nn.name, "plant") == 0 and minetest.get_item_group(nn.name, "seed") == 0 then
 						minetest.set_node(pos, {name = base})
 					end
-					
+
 				-- if its wet turn it back into dry soil
 				elseif wet_lvl == 1 then
 					minetest.set_node(pos, {name = dry})
@@ -146,7 +144,7 @@ minetest.register_abm({
 })
 
 
-for i = 1, 5 do		
+for i = 1, 5 do
 	minetest.override_item("default:grass_"..i, {drop = {
 		max_items = 1,
 		items = {
@@ -155,7 +153,7 @@ for i = 1, 5 do
 		}
 	}})
 end
-	
+
 minetest.override_item("default:junglegrass", {drop = {
 	max_items = 1,
 	items = {
diff --git a/games/minetest_game/mods/fire/README.txt b/games/minetest_game/mods/fire/README.txt
index 14022f0..099da1c 100644
--- a/games/minetest_game/mods/fire/README.txt
+++ b/games/minetest_game/mods/fire/README.txt
@@ -1,36 +1,35 @@
 Minetest Game mod: fire
 =======================
+See license.txt for license information.
 
-License of source code:
------------------------
-Copyright (C) 2012 Perttu Ahola (celeron55) <celeron55 at gmail.com>
+Authors of source code
+----------------------
+Originally by Perttu Ahola (celeron55) <celeron55 at gmail.com> (LGPL 2.1)
+Various Minetest developers and contributors (LGPL 2.1)
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or
-(at your option) any later version.
-
-http://www.gnu.org/licenses/lgpl-2.1.html
-
-License of media (textures and sounds)
+Authors of media (textures and sounds)
 --------------------------------------
-Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)                                 
-http://creativecommons.org/licenses/by-sa/3.0/
-
-Authors of media files
------------------------
 Everything not listed in here:
-Copyright (C) 2012 Perttu Ahola (celeron55) <celeron55 at gmail.com>
+Copyright (C) 2012 Perttu Ahola (celeron55) <celeron55 at gmail.com> (CC BY-SA 3.0)
+
+Muadtralk (CC BY-SA 3.0)
+  fire_basic_flame_animated.png
 
-fire_small.ogg sampled from:
-  http://www.freesound.org/people/dobroide/sounds/4211/
+Gambit (CC BY-SA 3.0)
+  fire_flint_steel.png
 
-fire_large.ogg sampled from:
-  http://www.freesound.org/people/Dynamicell/sounds/17548/
+dobroide (CC BY 3.0)
+http://www.freesound.org/people/dobroide/sounds/4211/
+  fire_small.ogg
 
-fire_basic_flame_animated.png:
-  Muadtralk
+Dynamicell (CC BY 3.0)
+http://www.freesound.org/people/Dynamicell/sounds/17548/
+  fire_large.ogg
+  fire_fire.*.ogg
 
-fire_flint_steel.png
-  Gambit (WTFPL)
+fire_small.ogg and fire_large.ogg are unused but kept temporarily to not break
+other mods that may use them.
 
+Benboncan (CC BY 3.0)
+https://www.freesound.org/people/Benboncan/sounds/66457/
+  fire_flint_and_steel.ogg
diff --git a/games/minetest_game/mods/creative/depends.txt b/games/minetest_game/mods/fire/depends.txt
similarity index 100%
copy from games/minetest_game/mods/creative/depends.txt
copy to games/minetest_game/mods/fire/depends.txt
diff --git a/games/minetest_game/mods/fire/init.lua b/games/minetest_game/mods/fire/init.lua
index 457f6b5..bee487a 100644
--- a/games/minetest_game/mods/fire/init.lua
+++ b/games/minetest_game/mods/fire/init.lua
@@ -1,11 +1,13 @@
--- minetest/fire/init.lua
-
 -- Global namespace for functions
 
 fire = {}
 
 
--- Register flame nodes
+--
+-- Items
+--
+
+-- Flame nodes
 
 minetest.register_node("fire:basic_flame", {
 	drawtype = "firelike",
@@ -28,18 +30,23 @@ minetest.register_node("fire:basic_flame", {
 	sunlight_propagates = true,
 	damage_per_second = 4,
 	groups = {igniter = 2, dig_immediate = 3, not_in_creative_inventory = 1},
+	on_timer = function(pos)
+		local f = minetest.find_node_near(pos, 1, {"group:flammable"})
+		if not f then
+			minetest.remove_node(pos)
+			return
+		end
+		-- Restart timer
+		return true
+	end,
 	drop = "",
 
 	on_construct = function(pos)
-		minetest.after(0, fire.on_flame_add_at, pos)
+		minetest.get_node_timer(pos):start(math.random(30, 60))
 	end,
 
-	on_destruct = function(pos)
-		minetest.after(0, fire.on_flame_remove_at, pos)
+	on_blast = function() -- Unaffected by explosions
 	end,
-
-	on_blast = function()
-	end, -- unaffected by explosions
 })
 
 minetest.register_node("fire:permanent_flame", {
@@ -66,31 +73,50 @@ minetest.register_node("fire:permanent_flame", {
 	groups = {igniter = 2, dig_immediate = 3},
 	drop = "",
 
-	on_blast = function()
+	on_blast = function() -- Unaffected by explosions
 	end,
 })
 
+
+-- Flint and steel
+
 minetest.register_tool("fire:flint_and_steel", {
 	description = "Flint and Steel",
 	inventory_image = "fire_flint_steel.png",
+	sound = {breaks = "default_tool_breaks"},
+
 	on_use = function(itemstack, user, pointed_thing)
-		local player_name = user:get_player_name()
 		local pt = pointed_thing
-
-		if pt.type == "node" and minetest.get_node(pt.above).name == "air" then
-			itemstack:add_wear(1000)
+		minetest.sound_play(
+			"fire_flint_and_steel",
+			{pos = pt.above, gain = 0.5, max_hear_distance = 8}
+		)
+		if pt.type == "node" then
 			local node_under = minetest.get_node(pt.under).name
-
-			if minetest.get_item_group(node_under, "flammable") >= 1 then
-				if not minetest.is_protected(pt.above, player_name) then
-					minetest.set_node(pt.above, {name = "fire:basic_flame"})
-				else
-					minetest.chat_send_player(player_name, "This area is protected")
-				end
+			local nodedef = minetest.registered_nodes[node_under]
+			if not nodedef then
+				return
+			end
+			local player_name = user:get_player_name()
+			if minetest.is_protected(pt.under, player_name) then
+				minetest.chat_send_player(player_name, "This area is protected")
+				return
+			end
+			if nodedef.on_ignite then
+				nodedef.on_ignite(pt.under, user)
+			elseif minetest.get_item_group(node_under, "flammable") >= 1
+					and minetest.get_node(pt.above).name == "air" then
+				minetest.set_node(pt.above, {name = "fire:basic_flame"})
 			end
 		end
-
 		if not minetest.setting_getbool("creative_mode") then
+			-- Wear tool
+			local wdef = itemstack:get_definition()
+			itemstack:add_wear(1000)
+			-- Tool break sound
+			if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then
+				minetest.sound_play(wdef.sound.breaks, {pos = pt.above, gain = 0.5})
+			end
 			return itemstack
 		end
 	end
@@ -103,210 +129,237 @@ minetest.register_craft({
 	}
 })
 
--- Get sound area of position
 
-fire.D = 6 -- size of sound areas
-
-function fire.get_area_p0p1(pos)
-	local p0 = {
-		x = math.floor(pos.x / fire.D) * fire.D,
-		y = math.floor(pos.y / fire.D) * fire.D,
-		z = math.floor(pos.z / fire.D) * fire.D,
-	}
-	local p1 = {
-		x = p0.x + fire.D - 1,
-		y = p0.y + fire.D - 1,
-		z = p0.z + fire.D - 1
-	}
-	return p0, p1
-end
+-- Override coalblock to enable permanent flame above
+-- Coalblock is non-flammable to avoid unwanted basic_flame nodes
 
+minetest.override_item("default:coalblock", {
+	after_destruct = function(pos, oldnode)
+		pos.y = pos.y + 1
+		if minetest.get_node(pos).name == "fire:permanent_flame" then
+			minetest.remove_node(pos)
+		end
+	end,
+	on_ignite = function(pos, igniter)
+		local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z}
+		if minetest.get_node(flame_pos).name == "air" then
+			minetest.set_node(flame_pos, {name = "fire:permanent_flame"})
+		end
+	end,
+})
 
--- Fire sounds table
--- key: position hash of low corner of area
--- value: {handle=sound handle, name=sound name}
-fire.sounds = {}
 
+--
+-- Sound
+--
 
--- Update fire sounds in sound area of position
+local flame_sound = minetest.setting_getbool("flame_sound")
+if flame_sound == nil then
+	-- Enable if no setting present
+	flame_sound = true
+end
 
-function fire.update_sounds_around(pos)
-	local p0, p1 = fire.get_area_p0p1(pos)
-	local cp = {x = (p0.x + p1.x) / 2, y = (p0.y + p1.y) / 2, z = (p0.z + p1.z) / 2}
-	local flames_p = minetest.find_nodes_in_area(p0, p1, {"fire:basic_flame"})
-	--print("number of flames at "..minetest.pos_to_string(p0).."/"
-	--		..minetest.pos_to_string(p1)..": "..#flames_p)
-	local should_have_sound = (#flames_p > 0)
-	local wanted_sound = nil
-	if #flames_p >= 9 then
-		wanted_sound = {name = "fire_large", gain = 0.7}
-	elseif #flames_p > 0 then
-		wanted_sound = {name = "fire_small", gain = 0.9}
-	end
-	local p0_hash = minetest.hash_node_position(p0)
-	local sound = fire.sounds[p0_hash]
-	if not sound then
-		if should_have_sound then
-			fire.sounds[p0_hash] = {
-				handle = minetest.sound_play(wanted_sound,
-					{pos = cp, max_hear_distance = 16, loop = true}),
-				name = wanted_sound.name,
-			}
+if flame_sound then
+
+	local handles = {}
+	local timer = 0
+
+	-- Parameters
+
+	local radius = 8 -- Flame node search radius around player
+	local cycle = 3 -- Cycle time for sound updates
+
+	-- Update sound for player
+
+	function fire.update_player_sound(player)
+		local player_name = player:get_player_name()
+		-- Search for flame nodes in radius around player
+		local ppos = player:getpos()
+		local areamin = vector.subtract(ppos, radius)
+		local areamax = vector.add(ppos, radius)
+		local fpos, num = minetest.find_nodes_in_area(
+			areamin,
+			areamax,
+			{"fire:basic_flame", "fire:permanent_flame"}
+		)
+		-- Total number of flames in radius
+		local flames = (num["fire:basic_flame"] or 0) +
+			(num["fire:permanent_flame"] or 0)
+		-- Stop previous sound
+		if handles[player_name] then
+			minetest.sound_stop(handles[player_name])
+			handles[player_name] = nil
 		end
-	else
-		if not wanted_sound then
-			minetest.sound_stop(sound.handle)
-			fire.sounds[p0_hash] = nil
-		elseif sound.name ~= wanted_sound.name then
-			minetest.sound_stop(sound.handle)
-			fire.sounds[p0_hash] = {
-				handle = minetest.sound_play(wanted_sound,
-					{pos = cp, max_hear_distance = 16, loop = true}),
-				name = wanted_sound.name,
-			}
+		-- If flames
+		if flames > 0 then
+			-- Find centre of flame positions
+			local fposmid = fpos[1]
+			-- If more than 1 flame
+			if #fpos > 1 then
+				local fposmin = areamax
+				local fposmax = areamin
+				for i = 1, #fpos do
+					local fposi = fpos[i]
+					if fposi.x > fposmax.x then
+						fposmax.x = fposi.x
+					end
+					if fposi.y > fposmax.y then
+						fposmax.y = fposi.y
+					end
+					if fposi.z > fposmax.z then
+						fposmax.z = fposi.z
+					end
+					if fposi.x < fposmin.x then
+						fposmin.x = fposi.x
+					end
+					if fposi.y < fposmin.y then
+						fposmin.y = fposi.y
+					end
+					if fposi.z < fposmin.z then
+						fposmin.z = fposi.z
+					end
+				end
+				fposmid = vector.divide(vector.add(fposmin, fposmax), 2)
+			end
+			-- Play sound
+			local handle = minetest.sound_play(
+				"fire_fire",
+				{
+					pos = fposmid,
+					to_player = player_name,
+					gain = math.min(0.06 * (1 + flames * 0.125), 0.18),
+					max_hear_distance = 32,
+					loop = true, -- In case of lag
+				}
+			)
+			-- Store sound handle for this player
+			if handle then
+				handles[player_name] = handle
+			end
 		end
 	end
-end
 
+	-- Cycle for updating players sounds
 
--- Update fire sounds on flame node construct or destruct
+	minetest.register_globalstep(function(dtime)
+		timer = timer + dtime
+		if timer < cycle then
+			return
+		end
 
-function fire.on_flame_add_at(pos)
-	fire.update_sounds_around(pos)
-end
+		timer = 0
+		local players = minetest.get_connected_players()
+		for n = 1, #players do
+			fire.update_player_sound(players[n])
+		end
+	end)
 
+	-- Stop sound and clear handle on player leave
 
-function fire.on_flame_remove_at(pos)
-	fire.update_sounds_around(pos)
+	minetest.register_on_leaveplayer(function(player)
+		local player_name = player:get_player_name()
+		if handles[player_name] then
+			minetest.sound_stop(handles[player_name])
+			handles[player_name] = nil
+		end
+	end)
 end
 
 
--- Return positions for flames around a burning node
+-- Deprecated function kept temporarily to avoid crashes if mod fire nodes call it
 
-function fire.find_pos_for_flame_around(pos)
-	return minetest.find_node_near(pos, 1, {"air"})
+function fire.update_sounds_around(pos)
 end
 
 
--- Detect nearby extinguishing nodes
-
-function fire.flame_should_extinguish(pos)
-	return minetest.find_node_near(pos, 1, {"group:puts_out_fire"})
-end
-
+--
+-- ABMs
+--
 
 -- Extinguish all flames quickly with water, snow, ice
 
 minetest.register_abm({
+	label = "Extinguish flame",
 	nodenames = {"fire:basic_flame", "fire:permanent_flame"},
 	neighbors = {"group:puts_out_fire"},
 	interval = 3,
 	chance = 1,
 	catch_up = false,
-	action = function(p0, node, _, _)
-		minetest.remove_node(p0)
+	action = function(pos, node, active_object_count, active_object_count_wider)
+		minetest.remove_node(pos)
 		minetest.sound_play("fire_extinguish_flame",
-			{pos = p0, max_hear_distance = 16, gain = 0.25})
+			{pos = pos, max_hear_distance = 16, gain = 0.15})
 	end,
 })
 
 
--- Enable the following ABMs according to 'disable fire' setting
+-- Enable the following ABMs according to 'enable fire' setting
+
+local fire_enabled = minetest.setting_getbool("enable_fire")
+if fire_enabled == nil then
+	-- New setting not specified, check for old setting.
+	-- If old setting is also not specified, 'not nil' is true.
+	fire_enabled = not minetest.setting_getbool("disable_fire")
+end
 
-if minetest.setting_getbool("disable_fire") then
+if not fire_enabled then
 
-	-- Remove basic flames only
+	-- Remove basic flames only if fire disabled
 
 	minetest.register_abm({
+		label = "Remove disabled fire",
 		nodenames = {"fire:basic_flame"},
 		interval = 7,
 		chance = 1,
 		catch_up = false,
-		action = function(p0, node, _, _)
-			minetest.remove_node(p0)
-		end,
+		action = minetest.remove_node,
 	})
 
-else
+else -- Fire enabled
 
 	-- Ignite neighboring nodes, add basic flames
 
 	minetest.register_abm({
+		label = "Ignite flame",
 		nodenames = {"group:flammable"},
 		neighbors = {"group:igniter"},
 		interval = 7,
 		chance = 12,
 		catch_up = false,
-		action = function(p0, node, _, _)
+		action = function(pos, node, active_object_count, active_object_count_wider)
 			-- If there is water or stuff like that around node, don't ignite
-			if fire.flame_should_extinguish(p0) then
+			if minetest.find_node_near(pos, 1, {"group:puts_out_fire"}) then
 				return
 			end
-			local p = fire.find_pos_for_flame_around(p0)
+			local p = minetest.find_node_near(pos, 1, {"air"})
 			if p then
 				minetest.set_node(p, {name = "fire:basic_flame"})
 			end
 		end,
 	})
 
-	-- Remove basic flames and flammable nodes
+	-- Remove flammable nodes around basic flame
 
 	minetest.register_abm({
+		label = "Remove flammable nodes",
 		nodenames = {"fire:basic_flame"},
+		neighbors = "group:flammable",
 		interval = 5,
-		chance = 6,
+		chance = 18,
 		catch_up = false,
-		action = function(p0, node, _, _)
-			-- If there are no flammable nodes around flame, remove flame
-			local p = minetest.find_node_near(p0, 1, {"group:flammable"})
-			if not p then
-				minetest.remove_node(p0)
-				return
-			end
-			if math.random(1, 3) == 1 then
-				-- remove flammable nodes around flame
-				local node = minetest.get_node(p)
-				local def = minetest.registered_nodes[node.name]
+		action = function(pos, node, active_object_count, active_object_count_wider)
+			local p = minetest.find_node_near(pos, 1, {"group:flammable"})
+			if p then
+				local flammable_node = minetest.get_node(p)
+				local def = minetest.registered_nodes[flammable_node.name]
 				if def.on_burn then
 					def.on_burn(p)
 				else
 					minetest.remove_node(p)
-					nodeupdate(p)
+					minetest.check_for_falling(p)
 				end
 			end
 		end,
 	})
 
 end
-
-
--- Rarely ignite things from far
-
---[[ Currently disabled to reduce the chance of uncontrollable spreading
-	fires that disrupt servers. Also for less lua processing load.
-
-minetest.register_abm({
-	nodenames = {"group:igniter"},
-	neighbors = {"air"},
-	interval = 5,
-	chance = 10,
-	action = function(p0, node, _, _)
-		local reg = minetest.registered_nodes[node.name]
-		if not reg or not reg.groups.igniter or reg.groups.igniter < 2 then
-			return
-		end
-		local d = reg.groups.igniter
-		local p = minetest.find_node_near(p0, d, {"group:flammable"})
-		if p then
-			-- If there is water or stuff like that around flame, don't ignite
-			if fire.flame_should_extinguish(p) then
-				return
-			end
-			local p2 = fire.find_pos_for_flame_around(p)
-			if p2 then
-				minetest.set_node(p2, {name = "fire:basic_flame"})
-			end
-		end
-	end,
-})
---]]
diff --git a/games/minetest_game/mods/fire/license.txt b/games/minetest_game/mods/fire/license.txt
new file mode 100644
index 0000000..43f9cd7
--- /dev/null
+++ b/games/minetest_game/mods/fire/license.txt
@@ -0,0 +1,84 @@
+License of source code
+----------------------
+
+GNU Lesser General Public License, version 2.1
+Copyright (C) 2012-2016 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+This program is free software; you can redistribute it and/or modify it under the terms
+of the GNU Lesser General Public License as published by the Free Software Foundation;
+either version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU Lesser General Public License for more details:
+https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+
+
+Licenses of media (textures and sounds)
+---------------------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2012-2016 Perttu Ahola (celeron55) <celeron55 at gmail.com>
+Copyright (C) 2012-2016 Muadtralk
+Copyright (C) 2013-2016 Gambit
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
+
+-----------------------
+
+Attribution 3.0 Unported (CC BY 3.0)
+Copyright (C) 2005 dobroide
+Copyright (C) 2006 Dynamicell
+Copyright (C) 2009 Benboncan
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by/3.0/
diff --git a/games/minetest_game/mods/fire/sounds/fire_fire.1.ogg b/games/minetest_game/mods/fire/sounds/fire_fire.1.ogg
new file mode 100644
index 0000000..cbfee4c
Binary files /dev/null and b/games/minetest_game/mods/fire/sounds/fire_fire.1.ogg differ
diff --git a/games/minetest_game/mods/fire/sounds/fire_fire.2.ogg b/games/minetest_game/mods/fire/sounds/fire_fire.2.ogg
new file mode 100644
index 0000000..e8d0eb1
Binary files /dev/null and b/games/minetest_game/mods/fire/sounds/fire_fire.2.ogg differ
diff --git a/games/minetest_game/mods/fire/sounds/fire_fire.3.ogg b/games/minetest_game/mods/fire/sounds/fire_fire.3.ogg
new file mode 100644
index 0000000..5cad3d9
Binary files /dev/null and b/games/minetest_game/mods/fire/sounds/fire_fire.3.ogg differ
diff --git a/games/minetest_game/mods/fire/sounds/fire_flint_and_steel.ogg b/games/minetest_game/mods/fire/sounds/fire_flint_and_steel.ogg
new file mode 100644
index 0000000..6996e16
Binary files /dev/null and b/games/minetest_game/mods/fire/sounds/fire_flint_and_steel.ogg differ
diff --git a/games/minetest_game/mods/flowers/README.txt b/games/minetest_game/mods/flowers/README.txt
index ebd4a21..2a5e4de 100644
--- a/games/minetest_game/mods/flowers/README.txt
+++ b/games/minetest_game/mods/flowers/README.txt
@@ -1,23 +1,26 @@
 Minetest Game mod: flowers
 ==========================
+See license.txt for license information.
 
-License of source code:
------------------------
-Copyright (C) 2012-2013 Ironzorg, VanessaE
+Authors of source code
+----------------------
+Originally by Ironzorg (MIT) and VanessaE (MIT)
+Various Minetest developers and contributors (MIT)
 
-This program is free software. It comes without any warranty, to
-the extent permitted by applicable law. You can redistribute it
-and/or modify it under the terms of the Do What The Fuck You Want
-To Public License, Version 2, as published by Sam Hocevar. See
-http://sam.zoy.org/wtfpl/COPYING for more details.
+Authors of media (textures)
+---------------------------
+RHRhino (CC BY-SA 3.0):
+  flowers_dandelion_white.png
+  flowers_dandelion_yellow.png
+  flowers_geranium.png
+  flowers_rose.png
+  flowers_tulip.png
+  flowers_viola.png
 
-License of media (textures and sounds)
---------------------------------------
-WTFPL
+Gambit (CC BY-SA 3.0):
+  flowers_mushroom_brown.png
+  flowers_mushroom_red.png
+  flowers_waterlily.png
 
-Gambit (WTFPL):
-    flowers_mushroom_*.png
-    flowers_waterlily.png
-
-DanDuncombe (WTFPL):
-    flowers_spores_*.png
+yyt16384 (CC BY-SA 3.0):
+  flowers_waterlily_bottom.png, derived from Gambit's texture
diff --git a/games/minetest_game/mods/flowers/init.lua b/games/minetest_game/mods/flowers/init.lua
index 2d8c93e..c7cc670 100644
--- a/games/minetest_game/mods/flowers/init.lua
+++ b/games/minetest_game/mods/flowers/init.lua
@@ -57,12 +57,42 @@ local function add_simple_flower(name, desc, box, f_groups)
 end
 
 flowers.datas = {
-	{"rose", "Rose", {-0.15, -0.5, -0.15, 0.15, 0.3, 0.15}, {color_red = 1}},
-	{"tulip", "Orange Tulip", {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_orange = 1}},
-	{"dandelion_yellow", "Yellow Dandelion", {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_yellow = 1}},
-	{"geranium", "Blue Geranium", {-0.15, -0.5, -0.15, 0.15, 0.2, 0.15}, {color_blue = 1}},
-	{"viola", "Viola", {-0.5, -0.5, -0.5, 0.5, -0.2, 0.5}, {color_violet = 1}},
-	{"dandelion_white", "White dandelion", {-0.5, -0.5, -0.5, 0.5, -0.2, 0.5}, {color_white = 1}}
+	{
+		"rose",
+		"Rose",
+		{-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16},
+		{color_red = 1, flammable = 1}
+	},
+	{
+		"tulip",
+		"Orange Tulip",
+		{-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
+		{color_orange = 1, flammable = 1}
+	},
+	{
+		"dandelion_yellow",
+		"Yellow Dandelion",
+		{-2 / 16, -0.5, -2 / 16, 2 / 16, 4 / 16, 2 / 16},
+		{color_yellow = 1, flammable = 1}
+	},
+	{
+		"geranium",
+		"Blue Geranium",
+		{-2 / 16, -0.5, -2 / 16, 2 / 16, 2 / 16, 2 / 16},
+		{color_blue = 1, flammable = 1}
+	},
+	{
+		"viola",
+		"Viola",
+		{-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16},
+		{color_violet = 1, flammable = 1}
+	},
+	{
+		"dandelion_white",
+		"White dandelion",
+		{-5 / 16, -0.5, -5 / 16, 5 / 16, -2 / 16, 5 / 16},
+		{color_white = 1, flammable = 1}
+	},
 }
 
 for _,item in pairs(flowers.datas) do
@@ -110,6 +140,7 @@ function flowers.flower_spread(pos, node)
 end
 
 minetest.register_abm({
+	label = "Flower spread",
 	nodenames = {"group:flora"},
 	neighbors = {"default:dirt_with_grass", "default:dirt_with_dry_grass",
 		"default:desert_sand"},
@@ -135,12 +166,12 @@ minetest.register_node("flowers:mushroom_red", {
 	sunlight_propagates = true,
 	walkable = false,
 	buildable_to = true,
-	groups = {snappy = 3, attached_node = 1},
+	groups = {snappy = 3, attached_node = 1, flammable = 1},
 	sounds = default.node_sound_leaves_defaults(),
 	on_use = minetest.item_eat(-5),
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3}
+		fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16},
 	}
 })
 
@@ -154,12 +185,12 @@ minetest.register_node("flowers:mushroom_brown", {
 	sunlight_propagates = true,
 	walkable = false,
 	buildable_to = true,
-	groups = {snappy = 3, attached_node = 1},
+	groups = {snappy = 3, attached_node = 1, flammable = 1},
 	sounds = default.node_sound_leaves_defaults(),
 	on_use = minetest.item_eat(1),
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3}
+		fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, -2 / 16, 3 / 16},
 	}
 })
 
@@ -167,6 +198,7 @@ minetest.register_node("flowers:mushroom_brown", {
 -- Mushroom spread and death
 
 minetest.register_abm({
+	label = "Mushroom spread",
 	nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"},
 	interval = 11,
 	chance = 50,
@@ -206,6 +238,8 @@ minetest.register_alias("flowers:mushroom_spores_brown", "flowers:mushroom_brown
 minetest.register_alias("flowers:mushroom_spores_red", "flowers:mushroom_red")
 minetest.register_alias("flowers:mushroom_fertile_brown", "flowers:mushroom_brown")
 minetest.register_alias("flowers:mushroom_fertile_red", "flowers:mushroom_red")
+minetest.register_alias("mushroom:brown_natural", "flowers:mushroom_brown")
+minetest.register_alias("mushroom:red_natural", "flowers:mushroom_red")
 
 
 --
@@ -217,23 +251,24 @@ minetest.register_node("flowers:waterlily", {
 	drawtype = "nodebox",
 	paramtype = "light",
 	paramtype2 = "facedir",
-	tiles = {"flowers_waterlily.png"},
+	tiles = {"flowers_waterlily.png", "flowers_waterlily_bottom.png"},
 	inventory_image = "flowers_waterlily.png",
 	wield_image = "flowers_waterlily.png",
 	liquids_pointable = true,
 	walkable = false,
 	buildable_to = true,
 	sunlight_propagates = true,
-	groups = {snappy = 3, flower = 1},
+	floodable = true,
+	groups = {snappy = 3, flower = 1, flammable = 1},
 	sounds = default.node_sound_leaves_defaults(),
 	node_placement_prediction = "",
 	node_box = {
 		type = "fixed",
-		fixed = {-0.5, -0.5, -0.5, 0.5, -0.46875, 0.5}
+		fixed = {-0.5, -0.5, -0.5, 0.5, -15 / 32, 0.5}
 	},
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}
+		fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16}
 	},
 
 	on_place = function(itemstack, placer, pointed_thing)
@@ -242,16 +277,20 @@ minetest.register_node("flowers:waterlily", {
 		local def = minetest.registered_nodes[node]
 		local player_name = placer:get_player_name()
 
-		if def and def.liquidtype == "source" and minetest.get_item_group(node, "water") > 0 then
+		if def and def.liquidtype == "source" and
+				minetest.get_item_group(node, "water") > 0 then
 			if not minetest.is_protected(pos, player_name) then
-				minetest.set_node(pos, {name = "flowers:waterlily", param2 = math.random(0, 3)})
+				minetest.set_node(pos, {name = "flowers:waterlily",
+					param2 = math.random(0, 3)})
+				if not minetest.setting_getbool("creative_mode") then
+					itemstack:take_item()
+				end
 			else
-				minetest.chat_send_player(player_name, "This area is protected")
-			end
-			if not minetest.setting_getbool("creative_mode") then
-				itemstack:take_item()
-				return itemstack
+				minetest.chat_send_player(player_name, "Node is protected")
+				minetest.record_protection_violation(pos, player_name)
 			end
 		end
+
+		return itemstack
 	end
 })
diff --git a/games/minetest_game/mods/flowers/license.txt b/games/minetest_game/mods/flowers/license.txt
new file mode 100644
index 0000000..d301162
--- /dev/null
+++ b/games/minetest_game/mods/flowers/license.txt
@@ -0,0 +1,62 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2012-2016 Ironzorg, VanessaE
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2014-2016 RHRhino
+Copyright (C) 2015-2016 Gambit
+Copyright (C) 2016 yyt16384
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/flowers/mapgen.lua b/games/minetest_game/mods/flowers/mapgen.lua
index 59ce97a..ec03c9b 100644
--- a/games/minetest_game/mods/flowers/mapgen.lua
+++ b/games/minetest_game/mods/flowers/mapgen.lua
@@ -94,8 +94,7 @@ local function register_flower(seed, name)
 			octaves = 3,
 			persist = 0.6
 		},
-		biomes = {"stone_grassland", "sandstone_grassland",
-			"deciduous_forest", "coniferous_forest"},
+		biomes = {"grassland", "deciduous_forest", "coniferous_forest"},
 		y_min = 1,
 		y_max = 31000,
 		decoration = "flowers:"..name,
@@ -110,7 +109,7 @@ local function register_mushroom(name)
 		noise_params = {
 			offset = 0,
 			scale = 0.006,
-			spread = {x = 200, y = 200, z = 200},
+			spread = {x = 250, y = 250, z = 250},
 			seed = 2,
 			octaves = 3,
 			persist = 0.66
@@ -135,10 +134,10 @@ local function register_waterlily()
 			octaves = 3,
 			persist = 0.7
 		},
-		biomes = {"rainforest_swamp", "savanna_swamp", "deciduous_forest_swamp"},
+		biomes = {"rainforest_swamp", "savanna_shore", "deciduous_forest_shore"},
 		y_min = 0,
 		y_max = 0,
-		schematic = minetest.get_modpath("flowers").."/schematics/waterlily.mts",
+		schematic = minetest.get_modpath("flowers") .. "/schematics/waterlily.mts",
 		rotation = "random",
 	})
 end
@@ -162,12 +161,9 @@ end
 -- Detect mapgen to select functions
 --
 
--- Mods using singlenode mapgen can call these functions to enable
--- the use of minetest.generate_ores or minetest.generate_decorations
-
-local mg_params = minetest.get_mapgen_params()
-if mg_params.mgname == "v6" then
+local mg_name = minetest.get_mapgen_setting("mg_name")
+if mg_name == "v6" then
 	flowers.register_mgv6_decorations()
-elseif mg_params.mgname ~= "singlenode" then
+else
 	flowers.register_decorations()
 end
diff --git a/games/minetest_game/mods/flowers/schematics/waterlily.mts b/games/minetest_game/mods/flowers/schematics/waterlily.mts
index 876310c..69e1d8e 100644
Binary files a/games/minetest_game/mods/flowers/schematics/waterlily.mts and b/games/minetest_game/mods/flowers/schematics/waterlily.mts differ
diff --git a/games/minetest_game/mods/flowers/textures/flowers_waterlily_bottom.png b/games/minetest_game/mods/flowers/textures/flowers_waterlily_bottom.png
new file mode 100644
index 0000000..3dbeaf4
Binary files /dev/null and b/games/minetest_game/mods/flowers/textures/flowers_waterlily_bottom.png differ
diff --git a/games/minetest_game/mods/give_initial_stuff/README.txt b/games/minetest_game/mods/give_initial_stuff/README.txt
new file mode 100644
index 0000000..cbd240f
--- /dev/null
+++ b/games/minetest_game/mods/give_initial_stuff/README.txt
@@ -0,0 +1,8 @@
+Minetest Game mod: give_initial_stuff
+=====================================
+See license.txt for license information.
+
+Authors of source code
+----------------------
+Perttu Ahola (celeron55) <celeron55 at gmail.com> (MIT)
+Various Minetest developers and contributors (MIT)
diff --git a/games/minetest_game/mods/give_initial_stuff/license.txt b/games/minetest_game/mods/give_initial_stuff/license.txt
new file mode 100644
index 0000000..8134c92
--- /dev/null
+++ b/games/minetest_game/mods/give_initial_stuff/license.txt
@@ -0,0 +1,25 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2012-2016 Perttu Ahola (celeron55) <celeron55 at gmail.com>
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
diff --git a/games/minetest_game/mods/nyancat/README.txt b/games/minetest_game/mods/nyancat/README.txt
new file mode 100644
index 0000000..fadc1d2
--- /dev/null
+++ b/games/minetest_game/mods/nyancat/README.txt
@@ -0,0 +1,16 @@
+Minetest Game mod: nyancat
+==========================
+See license.txt for license information.
+
+Authors of source code
+----------------------
+Originally by celeron55, Perttu Ahola <celeron55 at gmail.com> (LGPL 2.1)
+Various Minetest developers and contributors (LGPL 2.1)
+
+Authors of media files
+----------------------
+VanessaE (CC BY-SA 3.0):
+  nyancat_front.png
+  nyancat_back.png
+  nyancat_side.png
+  nyancat_rainbow.png
diff --git a/games/minetest_game/mods/creative/depends.txt b/games/minetest_game/mods/nyancat/depends.txt
similarity index 100%
copy from games/minetest_game/mods/creative/depends.txt
copy to games/minetest_game/mods/nyancat/depends.txt
diff --git a/games/minetest_game/mods/nyancat/init.lua b/games/minetest_game/mods/nyancat/init.lua
new file mode 100644
index 0000000..7192beb
--- /dev/null
+++ b/games/minetest_game/mods/nyancat/init.lua
@@ -0,0 +1,89 @@
+minetest.register_node("nyancat:nyancat", {
+	description = "Nyan Cat",
+	tiles = {"nyancat_side.png", "nyancat_side.png", "nyancat_side.png",
+		"nyancat_side.png", "nyancat_back.png", "nyancat_front.png"},
+	paramtype = "light",
+	light_source = default.LIGHT_MAX,
+	paramtype2 = "facedir",
+	groups = {cracky = 2},
+	is_ground_content = false,
+	legacy_facedir_simple = true,
+	sounds = default.node_sound_defaults(),
+})
+
+minetest.register_node("nyancat:nyancat_rainbow", {
+	description = "Nyan Cat Rainbow",
+	tiles = {
+		"nyancat_rainbow.png^[transformR90",
+		"nyancat_rainbow.png^[transformR90",
+		"nyancat_rainbow.png"
+	},
+	paramtype = "light",
+	light_source = default.LIGHT_MAX,
+	paramtype2 = "facedir",
+	groups = {cracky = 2},
+	is_ground_content = false,
+	sounds = default.node_sound_defaults(),
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "nyancat:nyancat",
+	burntime = 1,
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "nyancat:nyancat_rainbow",
+	burntime = 1,
+})
+
+nyancat = {}
+
+function nyancat.place(pos, facedir, length)
+	if facedir > 3 then
+		facedir = 0
+	end
+	local tailvec = minetest.facedir_to_dir(facedir)
+	local p = {x = pos.x, y = pos.y, z = pos.z}
+	minetest.set_node(p, {name = "nyancat:nyancat", param2 = facedir})
+	for i = 1, length do
+		p.x = p.x + tailvec.x
+		p.z = p.z + tailvec.z
+		minetest.set_node(p, {name = "nyancat:nyancat_rainbow", param2 = facedir})
+	end
+end
+
+function nyancat.generate(minp, maxp, seed)
+	local height_min = -31000
+	local height_max = -32
+	if maxp.y < height_min or minp.y > height_max then
+		return
+	end
+	local y_min = math.max(minp.y, height_min)
+	local y_max = math.min(maxp.y, height_max)
+	local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
+	local pr = PseudoRandom(seed + 9324342)
+	local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
+	for i = 1, max_num_nyancats do
+		if pr:next(0, 1000) == 0 then
+			local x0 = pr:next(minp.x, maxp.x)
+			local y0 = pr:next(minp.y, maxp.y)
+			local z0 = pr:next(minp.z, maxp.z)
+			local p0 = {x = x0, y = y0, z = z0}
+			nyancat.place(p0, pr:next(0, 3), pr:next(3, 15))
+		end
+	end
+end
+
+minetest.register_on_generated(function(minp, maxp, seed)
+	nyancat.generate(minp, maxp, seed)
+end)
+
+-- Legacy
+minetest.register_alias("default:nyancat", "nyancat:nyancat")
+minetest.register_alias("default:nyancat_rainbow", "nyancat:nyancat_rainbow")
+minetest.register_alias("nyancat", "nyancat:nyancat")
+minetest.register_alias("nyancat_rainbow", "nyancat:nyancat_rainbow")
+default.make_nyancat = nyancat.place
+default.generate_nyancats = nyancat.generate
diff --git a/games/minetest_game/mods/nyancat/license.txt b/games/minetest_game/mods/nyancat/license.txt
new file mode 100644
index 0000000..3aa3861
--- /dev/null
+++ b/games/minetest_game/mods/nyancat/license.txt
@@ -0,0 +1,50 @@
+License of source code
+----------------------
+
+GNU Lesser General Public License, version 2.1
+Copyright (C) 2011-2016 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+This program is free software; you can redistribute it and/or modify it under the terms
+of the GNU Lesser General Public License as published by the Free Software Foundation;
+either version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU Lesser General Public License for more details:
+https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2012-2016 VanessaE
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/default/textures/default_nc_back.png b/games/minetest_game/mods/nyancat/textures/nyancat_back.png
similarity index 100%
rename from games/minetest_game/mods/default/textures/default_nc_back.png
rename to games/minetest_game/mods/nyancat/textures/nyancat_back.png
diff --git a/games/minetest_game/mods/default/textures/default_nc_front.png b/games/minetest_game/mods/nyancat/textures/nyancat_front.png
similarity index 100%
rename from games/minetest_game/mods/default/textures/default_nc_front.png
rename to games/minetest_game/mods/nyancat/textures/nyancat_front.png
diff --git a/games/minetest_game/mods/default/textures/default_nc_rb.png b/games/minetest_game/mods/nyancat/textures/nyancat_rainbow.png
similarity index 100%
rename from games/minetest_game/mods/default/textures/default_nc_rb.png
rename to games/minetest_game/mods/nyancat/textures/nyancat_rainbow.png
diff --git a/games/minetest_game/mods/default/textures/default_nc_side.png b/games/minetest_game/mods/nyancat/textures/nyancat_side.png
similarity index 100%
rename from games/minetest_game/mods/default/textures/default_nc_side.png
rename to games/minetest_game/mods/nyancat/textures/nyancat_side.png
diff --git a/games/minetest_game/mods/screwdriver/README.txt b/games/minetest_game/mods/screwdriver/README.txt
new file mode 100644
index 0000000..9d39c58
--- /dev/null
+++ b/games/minetest_game/mods/screwdriver/README.txt
@@ -0,0 +1,13 @@
+Minetest Game mod: screwdriver
+==============================
+See license.txt for license information.
+
+License of source code
+----------------------
+Originally by RealBadAngel, Maciej Kasatkin (LGPL 2.1)
+Various Minetest developers and contributors (LGPL 2.1)
+
+License of media (textures)
+---------------------------
+Created by Gambit (CC BY-SA 3.0):
+  screwdriver.png
diff --git a/games/minetest_game/mods/screwdriver/init.lua b/games/minetest_game/mods/screwdriver/init.lua
index 5e6df62..e73b618 100644
--- a/games/minetest_game/mods/screwdriver/init.lua
+++ b/games/minetest_game/mods/screwdriver/init.lua
@@ -64,6 +64,7 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses)
 		end
 	else
 		if not ndef or not ndef.paramtype2 == "facedir" or
+				ndef.on_rotate == false or
 				(ndef.drawtype == "nodebox" and
 				not ndef.node_box.type == "fixed") or
 				node.param2 == nil then
diff --git a/games/minetest_game/mods/screwdriver/license.txt b/games/minetest_game/mods/screwdriver/license.txt
new file mode 100644
index 0000000..d9b721b
--- /dev/null
+++ b/games/minetest_game/mods/screwdriver/license.txt
@@ -0,0 +1,50 @@
+License of source code
+----------------------
+
+GNU Lesser General Public License, version 2.1
+Copyright (C) 2013-2016 RealBadAngel, Maciej Kasatkin
+Copyright (C) 2013-2016 Various Minetest developers and contributors
+
+This program is free software; you can redistribute it and/or modify it under the terms
+of the GNU Lesser General Public License as published by the Free Software Foundation;
+either version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU Lesser General Public License for more details:
+https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2013-2016 Gambit
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/screwdriver/readme.txt b/games/minetest_game/mods/screwdriver/readme.txt
deleted file mode 100644
index bdf109b..0000000
--- a/games/minetest_game/mods/screwdriver/readme.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-Minetest Game mod: screwdriver
-==============================
-
-License of source code:
------------------------
-Copyright (C) 2013 RealBadAngel, Maciej Kasatkin <mk at realbadangel.pl>
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-http://www.gnu.org/licenses/lgpl-2.1.html
-
-License of media (textures and sounds)
---------------------------------------
-Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)                                 
-http://creativecommons.org/licenses/by-sa/3.0/
-
-Created by Gambit (WTFPL):
-  screwdriver.png
diff --git a/games/minetest_game/mods/sethome/README.txt b/games/minetest_game/mods/sethome/README.txt
new file mode 100644
index 0000000..6f0a282
--- /dev/null
+++ b/games/minetest_game/mods/sethome/README.txt
@@ -0,0 +1,7 @@
+Minetest Game mod: sethome
+==========================
+See license.txt for license information.
+
+Authors of source code
+----------------------
+sfan5 (MIT)
diff --git a/games/minetest_game/mods/sethome/init.lua b/games/minetest_game/mods/sethome/init.lua
index 590086b..e0fc453 100644
--- a/games/minetest_game/mods/sethome/init.lua
+++ b/games/minetest_game/mods/sethome/init.lua
@@ -1,65 +1,88 @@
+
+sethome = {}
+
 local homes_file = minetest.get_worldpath() .. "/homes"
 local homepos = {}
 
 local function loadhomes()
-    local input = io.open(homes_file, "r")
-    if input then
-		repeat
-            local x = input:read("*n")
-            if x == nil then
-            	break
-            end
-            local y = input:read("*n")
-            local z = input:read("*n")
-            local name = input:read("*l")
-            homepos[name:sub(2)] = {x = x, y = y, z = z}
-        until input:read(0) == nil
-        io.close(input)
-    else
-        homepos = {}
-    end
+	local input, err = io.open(homes_file, "r")
+	if not input then
+		return minetest.log("info", "Could not load player homes file: " .. err)
+	end
+
+	-- Iterate over all stored positions in the format "x y z player" for each line
+	for pos, name in input:read("*a"):gmatch("(%S+ %S+ %S+)%s([%w_-]+)[\r\n]") do
+		homepos[name] = minetest.string_to_pos(pos)
+	end
+	input:close()
 end
 
 loadhomes()
 
-minetest.register_privilege("home", "Can use /sethome and /home")
+sethome.set = function(name, pos)
+	local player = minetest.get_player_by_name(name)
+	if not player or not pos then
+		return false
+	end
+
+	local data = {}
+	local output, err = io.open(homes_file, "w")
+	if output then
+		homepos[name] = pos
+		for i, v in pairs(homepos) do
+			table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, i))
+		end
+		output:write(table.concat(data))
+		io.close(output)
+		return true
+	end
+	minetest.log("action", "Unable to write to player homes file: " .. err)
+	return false
+end
+
+sethome.get = function(name)
+	local pos = homepos[name]
+	if pos then
+		return vector.new(pos)
+	else
+		return nil
+	end
+end
 
-local changed = false
+sethome.go = function(name)
+	local player = minetest.get_player_by_name(name)
+	if player and homepos[name] then
+		player:setpos(homepos[name])
+		return true
+	end
+	return false
+end
+
+minetest.register_privilege("home", {
+	description = "Can use /sethome and /home",
+	give_to_singleplayer = false
+})
 
 minetest.register_chatcommand("home", {
-    description = "Teleport you to your home point",
-    privs = {home=true},
-    func = function(name)
-        local player = minetest.get_player_by_name(name)
-        if player == nil then
-            -- just a check to prevent the server crashing
-            return false
-        end
-        if homepos[player:get_player_name()] then
-            player:setpos(homepos[player:get_player_name()])
-            minetest.chat_send_player(name, "Teleported to home!")
-        else
-            minetest.chat_send_player(name, "Set a home using /sethome")
-        end
-    end,
+	description = "Teleport you to your home point",
+	privs = {home = true},
+	func = function(name)
+		if sethome.go(name) then
+			return true, "Teleported to home!"
+		end
+		return false, "Set a home using /sethome"
+	end,
 })
 
 minetest.register_chatcommand("sethome", {
-    description = "Set your home point",
-    privs = {home=true},
-    func = function(name)
-        local player = minetest.get_player_by_name(name)
-        local pos = player:getpos()
-        homepos[player:get_player_name()] = pos
-        minetest.chat_send_player(name, "Home set!")
-        changed = true
-        if changed then
-        	local output = io.open(homes_file, "w")
-            for i, v in pairs(homepos) do
-                output:write(v.x.." "..v.y.." "..v.z.." "..i.."\n")
-            end
-            io.close(output)
-            changed = false
-        end
-    end,
+	description = "Set your home point",
+	privs = {home = true},
+	func = function(name)
+		name = name or "" -- fallback to blank name if nil
+		local player = minetest.get_player_by_name(name)
+		if player and sethome.set(name, player:getpos()) then
+			return true, "Home set!"
+		end
+		return false, "Player not found!"
+	end,
 })
diff --git a/games/minetest_game/mods/sethome/license.txt b/games/minetest_game/mods/sethome/license.txt
new file mode 100644
index 0000000..09f03b0
--- /dev/null
+++ b/games/minetest_game/mods/sethome/license.txt
@@ -0,0 +1,24 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2014-2016 sfan5
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
diff --git a/games/minetest_game/mods/sfinv/README.md b/games/minetest_game/mods/sfinv/README.md
new file mode 100644
index 0000000..6ff3392
--- /dev/null
+++ b/games/minetest_game/mods/sfinv/README.md
@@ -0,0 +1,21 @@
+Simple Fast Inventory
+====================
+
+![SFINV Screeny](https://cdn.pbrd.co/images/1yQhd1TI.png)
+
+A cleaner, simpler, solution to having an advanced inventory in Minetest.
+
+Written by rubenwardy.  
+License: MIT
+
+See game_api.txt for this mod's API
+
+License of source code and media files:
+---------------------------------------
+Copyright (C) 2016 rubenwardy <rubenwardy at gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/games/minetest_game/mods/sfinv/api.lua b/games/minetest_game/mods/sfinv/api.lua
new file mode 100644
index 0000000..2fef3c8
--- /dev/null
+++ b/games/minetest_game/mods/sfinv/api.lua
@@ -0,0 +1,161 @@
+sfinv = {
+	pages = {},
+	pages_unordered = {},
+	contexts = {},
+	enabled = true
+}
+
+function sfinv.register_page(name, def)
+	assert(name, "Invalid sfinv page. Requires a name")
+	assert(def, "Invalid sfinv page. Requires a def[inition] table")
+	assert(def.get, "Invalid sfinv page. Def requires a get function.")
+	assert(not sfinv.pages[name], "Attempt to register already registered sfinv page " .. dump(name))
+
+	sfinv.pages[name] = def
+	def.name = name
+	table.insert(sfinv.pages_unordered, def)
+end
+
+function sfinv.override_page(name, def)
+	assert(name, "Invalid sfinv page override. Requires a name")
+	assert(def, "Invalid sfinv page override. Requires a def[inition] table")
+	local page = sfinv.pages[name]
+	assert(page, "Attempt to override sfinv page " .. dump(name) .. " which does not exist.")
+	for key, value in pairs(def) do
+		page[key] = value
+	end
+end
+
+function sfinv.get_nav_fs(player, context, nav, current_idx)
+	-- Only show tabs if there is more than one page
+	if #nav > 1 then
+		return "tabheader[0,0;tabs;" .. table.concat(nav, ",") .. ";" .. current_idx .. ";true;false]"
+	else
+		return ""
+	end
+end
+
+local theme_main = "bgcolor[#080808BB;true]" .. default.gui_bg ..
+		default.gui_bg_img
+
+local theme_inv = default.gui_slots .. [[
+		list[current_player;main;0,4.7;8,1;]
+		list[current_player;main;0,5.85;8,3;8]
+	]]
+
+function sfinv.make_formspec(player, context, content, show_inv, size)
+	local tmp = {
+		size or "size[8,8.6]",
+		theme_main,
+		sfinv.get_nav_fs(player, context, context.nav_titles, context.nav_idx),
+		content
+	}
+	if show_inv then
+		tmp[#tmp + 1] = theme_inv
+	end
+	return table.concat(tmp, "")
+end
+
+function sfinv.get_homepage_name(player)
+	return "sfinv:crafting"
+end
+
+function sfinv.get_formspec(player, context)
+	-- Generate navigation tabs
+	local nav = {}
+	local nav_ids = {}
+	local current_idx = 1
+	for i, pdef in pairs(sfinv.pages_unordered) do
+		if not pdef.is_in_nav or pdef:is_in_nav(player, context) then
+			nav[#nav + 1] = pdef.title
+			nav_ids[#nav_ids + 1] = pdef.name
+			if pdef.name == context.page then
+				current_idx = i
+			end
+		end
+	end
+	context.nav = nav_ids
+	context.nav_titles = nav
+	context.nav_idx = current_idx
+
+	-- Generate formspec
+	local page = sfinv.pages[context.page] or sfinv.pages["404"]
+	if page then
+		return page:get(player, context)
+	else
+		local old_page = context.page
+		context.page = sfinv.get_homepage_name(player)
+		assert(sfinv.pages[context.page], "[sfinv] Invalid homepage")
+		minetest.log("warning", "[sfinv] Couldn't find " .. dump(old_page) .. " so using switching to homepage")
+		return sfinv.get_formspec(player, context)
+	end
+end
+
+function sfinv.set_player_inventory_formspec(player, context)
+	if not context then
+		local name = player:get_player_name()
+		context = sfinv.contexts[name]
+		if not context then
+			context = {
+				page = sfinv.get_homepage_name(player)
+			}
+			sfinv.contexts[name] = context
+		end
+	end
+
+	local fs = sfinv.get_formspec(player, context)
+	player:set_inventory_formspec(fs)
+end
+
+minetest.register_on_joinplayer(function(player)
+	if sfinv.enabled then
+		minetest.after(0.5, function()
+			sfinv.set_player_inventory_formspec(player)
+		end)
+	end
+end)
+
+minetest.register_on_leaveplayer(function(player)
+	sfinv.contexts[player:get_player_name()] = nil
+end)
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+	if formname ~= "" or not sfinv.enabled then
+		return false
+	end
+
+	-- Get Context
+	local name = player:get_player_name()
+	local context = sfinv.contexts[name]
+	if not context then
+		sfinv.set_player_inventory_formspec(player)
+		return false
+	end
+
+	-- Handle Events
+	if fields.tabs and context.nav then
+		local tid = tonumber(fields.tabs)
+		if tid and tid > 0 then
+			local id = context.nav[tid]
+			local page = sfinv.pages[id]
+			if id and page then
+				local oldpage = sfinv.pages[context.page]
+				if oldpage and oldpage.on_leave then
+					oldpage:on_leave(player, context)
+				end
+				context.page = id
+				if page.on_enter then
+					page:on_enter(player, context)
+				end
+				sfinv.set_player_inventory_formspec(player, context)
+			end
+		end
+		return
+	end
+
+	-- Pass to page
+	local page = sfinv.pages[context.page]
+	if page and page.on_player_receive_fields then
+		return page:on_player_receive_fields(player, context, fields)
+	end
+end)
diff --git a/games/minetest_game/mods/creative/depends.txt b/games/minetest_game/mods/sfinv/depends.txt
similarity index 100%
copy from games/minetest_game/mods/creative/depends.txt
copy to games/minetest_game/mods/sfinv/depends.txt
diff --git a/games/minetest_game/mods/sfinv/init.lua b/games/minetest_game/mods/sfinv/init.lua
new file mode 100644
index 0000000..f030222
--- /dev/null
+++ b/games/minetest_game/mods/sfinv/init.lua
@@ -0,0 +1,22 @@
+dofile(minetest.get_modpath("sfinv") .. "/api.lua")
+
+sfinv.register_page("sfinv:crafting", {
+	title = "Crafting",
+	get = function(self, player, context)
+		return sfinv.make_formspec(player, context, [[
+				list[current_player;craft;1.75,0.5;3,3;]
+				list[current_player;craftpreview;5.75,1.5;1,1;]
+				image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]
+				listring[current_player;main]
+				listring[current_player;craft]
+				image[0,4.75;1,1;gui_hb_bg.png]
+				image[1,4.75;1,1;gui_hb_bg.png]
+				image[2,4.75;1,1;gui_hb_bg.png]
+				image[3,4.75;1,1;gui_hb_bg.png]
+				image[4,4.75;1,1;gui_hb_bg.png]
+				image[5,4.75;1,1;gui_hb_bg.png]
+				image[6,4.75;1,1;gui_hb_bg.png]
+				image[7,4.75;1,1;gui_hb_bg.png]
+			]], true)
+	end
+})
diff --git a/games/minetest_game/mods/stairs/README.txt b/games/minetest_game/mods/stairs/README.txt
index 9bd0b21..d32cd71 100644
--- a/games/minetest_game/mods/stairs/README.txt
+++ b/games/minetest_game/mods/stairs/README.txt
@@ -1,26 +1,16 @@
 Minetest Game mod: stairs
 =========================
+See license.txt for license information.
 
-License of source code:
------------------------
-Copyright (C) 2011-2012 Kahrl <kahrl at gmx.net>
-Copyright (C) 2011-2012 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Authors of source code
+----------------------
+Originally by Kahrl <kahrl at gmx.net> (LGPL 2.1) and
+celeron55, Perttu Ahola <celeron55 at gmail.com> (LGPL 2.1)
+Various Minetest developers and contributors (LGPL 2.1)
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-http://www.gnu.org/licenses/lgpl-2.1.html
-
-License of media (textures and sounds)
---------------------------------------
-Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)                                 
-http://creativecommons.org/licenses/by-sa/3.0/
-
-Authors of media files
------------------------
-Everything not listed in here:
-Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Authors of media (models)
+-------------------------
+Jean-Patrick G. (kilbith) <jeanpatrick.guerrero at gmail.com> (CC BY-SA 3.0):
+  stairs_stair.obj
 
 
diff --git a/games/minetest_game/mods/stairs/init.lua b/games/minetest_game/mods/stairs/init.lua
index 7c28fa4..191c78d 100644
--- a/games/minetest_game/mods/stairs/init.lua
+++ b/games/minetest_game/mods/stairs/init.lua
@@ -87,27 +87,48 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
 		})
 	end
 
-	minetest.register_craft({
-		output = 'stairs:stair_' .. subname .. ' 6',
-		recipe = {
-			{recipeitem, "", ""},
-			{recipeitem, recipeitem, ""},
-			{recipeitem, recipeitem, recipeitem},
-		},
-	})
+	if recipeitem then
+		minetest.register_craft({
+			output = 'stairs:stair_' .. subname .. ' 8',
+			recipe = {
+				{recipeitem, "", ""},
+				{recipeitem, recipeitem, ""},
+				{recipeitem, recipeitem, recipeitem},
+			},
+		})
 
-	-- Flipped recipe for the silly minecrafters
-	minetest.register_craft({
-		output = 'stairs:stair_' .. subname .. ' 6',
-		recipe = {
-			{"", "", recipeitem},
-			{"", recipeitem, recipeitem},
-			{recipeitem, recipeitem, recipeitem},
-		},
-	})
+		-- Flipped recipe for the silly minecrafters
+		minetest.register_craft({
+			output = 'stairs:stair_' .. subname .. ' 8',
+			recipe = {
+				{"", "", recipeitem},
+				{"", recipeitem, recipeitem},
+				{recipeitem, recipeitem, recipeitem},
+			},
+		})
+
+		-- Fuel
+		local baseburntime = minetest.get_craft_result({
+			method = "fuel",
+			width = 1,
+			items = {recipeitem}
+		}).time
+		if baseburntime > 0 then
+			minetest.register_craft({
+				type = "fuel",
+				recipe = 'stairs:stair_' .. subname,
+				burntime = math.floor(baseburntime * 0.75),
+			})
+		end
+	end
 end
 
 
+-- Slab facedir to placement 6d matching table
+local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4}
+-- Slab facedir when placing initial slab against other surface
+local slab_trans_dir_place = {[0] = 0, 20, 12, 16, 4, 8}
+
 -- Register slabs.
 -- Node will be called stairs:slab_<subname>
 
@@ -127,86 +148,61 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 			fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
 		},
 		on_place = function(itemstack, placer, pointed_thing)
-			if pointed_thing.type ~= "node" then
-				return itemstack
-			end
+			local under = minetest.get_node(pointed_thing.under)
+			local wield_item = itemstack:get_name()
 
-			-- If it's being placed on an another similar one, replace it with
-			-- a full block
-			local slabpos = nil
-			local slabnode = nil
-			local p0 = pointed_thing.under
-			local p1 = pointed_thing.above
-			local n0 = minetest.get_node(p0)
-			local n1 = minetest.get_node(p1)
-			local param2 = 0
+			if under and wield_item == under.name then
+				-- place slab using under node orientation
+				local dir = minetest.dir_to_facedir(vector.subtract(
+					pointed_thing.above, pointed_thing.under), true)
 
-			local n0_is_upside_down = (n0.name == "stairs:slab_" .. subname and
-					n0.param2 >= 20)
+				local p2 = under.param2
 
-			if n0.name == "stairs:slab_" .. subname and not n0_is_upside_down and
-					p0.y + 1 == p1.y then
-				slabpos = p0
-				slabnode = n0
-			elseif n1.name == "stairs:slab_" .. subname then
-				slabpos = p1
-				slabnode = n1
-			end
-			if slabpos then
-				-- Remove the slab at slabpos
-				minetest.remove_node(slabpos)
-				-- Make a fake stack of a single item and try to place it
-				local fakestack = ItemStack(recipeitem)
-				fakestack:set_count(itemstack:get_count())
-
-				pointed_thing.above = slabpos
-				local success
-				fakestack, success = minetest.item_place(fakestack, placer,
-					pointed_thing)
-				-- If the item was taken from the fake stack, decrement original
-				if success then
-					itemstack:set_count(fakestack:get_count())
-				-- Else put old node back
-				else
-					minetest.set_node(slabpos, slabnode)
-				end
-				return itemstack
-			end
-			
-			-- Upside down slabs
-			if p0.y - 1 == p1.y then
-				-- Turn into full block if pointing at a existing slab
-				if n0_is_upside_down  then
-					-- Remove the slab at the position of the slab
-					minetest.remove_node(p0)
-					-- Make a fake stack of a single item and try to place it
-					local fakestack = ItemStack(recipeitem)
-					fakestack:set_count(itemstack:get_count())
-
-					pointed_thing.above = p0
-					local success
-					fakestack, success = minetest.item_place(fakestack, placer,
-						pointed_thing)
-					-- If the item was taken from the fake stack, decrement original
-					if success then
-						itemstack:set_count(fakestack:get_count())
-					-- Else put old node back
-					else
-						minetest.set_node(p0, n0)
+				-- combine two slabs if possible
+				if slab_trans_dir[math.floor(p2 / 4)] == dir then
+					if not recipeitem then
+						return itemstack
+					end
+					local player_name = placer:get_player_name()
+					if minetest.is_protected(pointed_thing.under, player_name) and not
+							minetest.check_player_privs(placer, "protection_bypass") then
+						minetest.record_protection_violation(pointed_thing.under,
+							player_name)
+						return
+					end
+					minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2})
+					if not minetest.setting_getbool("creative_mode") then
+						itemstack:take_item()
 					end
 					return itemstack
 				end
 
-				-- Place upside down slab
-				param2 = 20
-			end
+				-- Placing a slab on an upside down slab should make it right-side up.
+				if p2 >= 20 and dir == 8 then
+					p2 = p2 - 20
+				-- same for the opposite case: slab below normal slab
+				elseif p2 <= 3 and dir == 4 then
+					p2 = p2 + 20
+				end
 
-			-- If pointing at the side of a upside down slab
-			if n0_is_upside_down and p0.y + 1 ~= p1.y then
-				param2 = 20
-			end
+				-- else attempt to place node with proper param2
+				minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2)
+				if not minetest.setting_getbool("creative_mode") then
+					itemstack:take_item()
+				end
+				return itemstack
+			else
+				-- place slab using look direction of player
+				local dir = minetest.dir_to_wallmounted(vector.subtract(
+					pointed_thing.above, pointed_thing.under), true)
+
+				local rot = slab_trans_dir_place[dir]
+				if rot == 0 or rot == 20 then
+					rot = rot + minetest.dir_to_facedir(placer:get_look_dir())
+				end
 
-			return minetest.item_place(itemstack, placer, pointed_thing, param2)
+				return minetest.item_place(itemstack, placer, pointed_thing, rot)
+			end
 		end,
 	})
 
@@ -218,12 +214,28 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 		})
 	end
 
-	minetest.register_craft({
-		output = 'stairs:slab_' .. subname .. ' 6',
-		recipe = {
-			{recipeitem, recipeitem, recipeitem},
-		},
-	})
+	if recipeitem then
+		minetest.register_craft({
+			output = 'stairs:slab_' .. subname .. ' 6',
+			recipe = {
+				{recipeitem, recipeitem, recipeitem},
+			},
+		})
+
+		-- Fuel
+		local baseburntime = minetest.get_craft_result({
+			method = "fuel",
+			width = 1,
+			items = {recipeitem}
+		}).time
+		if baseburntime > 0 then
+			minetest.register_craft({
+				type = "fuel",
+				recipe = 'stairs:slab_' .. subname,
+				burntime = math.floor(baseburntime * 0.5),
+			})
+		end
+	end
 end
 
 
@@ -232,6 +244,7 @@ end
 
 if replace then
 	minetest.register_abm({
+		label = "Slab replace",
 		nodenames = {"group:slabs_replace"},
 		interval = 16,
 		chance = 1,
@@ -252,8 +265,8 @@ end
 -- Stair/slab registration function.
 -- Nodes will be called stairs:{stair,slab}_<subname>
 
-function stairs.register_stair_and_slab(subname, recipeitem, groups, images,
-		desc_stair, desc_slab, sounds)
+function stairs.register_stair_and_slab(subname, recipeitem,
+		groups, images, desc_stair, desc_slab, sounds)
 	stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds)
 	stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds)
 end
@@ -261,149 +274,262 @@ end
 
 -- Register default stairs and slabs
 
-stairs.register_stair_and_slab("wood", "default:wood",
-		{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3},
-		{"default_wood.png"},
-		"Wooden Stair",
-		"Wooden Slab",
-		default.node_sound_wood_defaults())
-
-stairs.register_stair_and_slab("junglewood", "default:junglewood",
-		{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3},
-		{"default_junglewood.png"},
-		"Junglewood Stair",
-		"Junglewood Slab",
-		default.node_sound_wood_defaults())
-
-stairs.register_stair_and_slab("pine_wood", "default:pine_wood",
-		{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3},
-		{"default_pine_wood.png"},
-		"Pine Wood Stair",
-		"Pine Wood Slab",
-		default.node_sound_wood_defaults())
-
-stairs.register_stair_and_slab("acacia_wood", "default:acacia_wood",
-		{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3},
-		{"default_acacia_wood.png"},
-		"Acacia Wood Stair",
-		"Acacia Wood Slab",
-		default.node_sound_wood_defaults())
-
-stairs.register_stair_and_slab("aspen_wood", "default:aspen_wood",
-		{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3},
-		{"default_aspen_wood.png"},
-		"Aspen Wood Stair",
-		"Aspen Wood Slab",
-		default.node_sound_wood_defaults())
-
-stairs.register_stair_and_slab("stone", "default:stone",
-		{cracky = 3},
-		{"default_stone.png"},
-		"Stone Stair",
-		"Stone Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("cobble", "default:cobble",
-		{cracky = 3},
-		{"default_cobble.png"},
-		"Cobblestone Stair",
-		"Cobblestone Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("stonebrick", "default:stonebrick",
-		{cracky = 3},
-		{"default_stone_brick.png"},
-		"Stone Brick Stair",
-		"Stone Brick Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("desert_stone", "default:desert_stone",
-		{cracky = 3},
-		{"default_desert_stone.png"},
-		"Desertstone Stair",
-		"Desertstone Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("desert_cobble", "default:desert_cobble",
-		{cracky = 3},
-		{"default_desert_cobble.png"},
-		"Desert Cobblestone Stair",
-		"Desert Cobblestone Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("desert_stonebrick", "default:desert_stonebrick",
-		{cracky = 3},
-		{"default_desert_stone_brick.png"},
-		"Desert Stone Brick Stair",
-		"Desert Stone Brick Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("sandstone", "default:sandstone",
-		{crumbly = 1, cracky = 3},
-		{"default_sandstone.png"},
-		"Sandstone Stair",
-		"Sandstone Slab",
-		default.node_sound_stone_defaults())
-		
-stairs.register_stair_and_slab("sandstonebrick", "default:sandstonebrick",
-		{cracky = 2},
-		{"default_sandstone_brick.png"},
-		"Sandstone Brick Stair",
-		"Sandstone Brick Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("obsidian", "default:obsidian",
-		{cracky = 1, level = 2},
-		{"default_obsidian.png"},
-		"Obsidian Stair",
-		"Obsidian Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("obsidianbrick", "default:obsidianbrick",
-		{cracky = 1, level = 2},
-		{"default_obsidian_brick.png"},
-		"Obsidian Brick Stair",
-		"Obsidian Brick Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("brick", "default:brick",
-		{cracky = 3},
-		{"default_brick.png"},
-		"Brick Stair",
-		"Brick Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("straw", "farming:straw",
-		{snappy = 3, flammable = 4},
-		{"farming_straw.png"},
-		"Straw Stair",
-		"Straw Slab",
-		default.node_sound_leaves_defaults())
-
-stairs.register_stair_and_slab("steelblock", "default:steelblock",
-		{cracky = 1, level = 2},
-		{"default_steel_block.png"},
-		"Steel Block Stair",
-		"Steel Block Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("copperblock", "default:copperblock",
-		{cracky = 1, level = 2},
-		{"default_copper_block.png"},
-		"Copper Block Stair",
-		"Copper Block Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("bronzeblock", "default:bronzeblock",
-		{cracky = 1, level = 2},
-		{"default_bronze_block.png"},
-		"Bronze Block Stair",
-		"Bronze Block Slab",
-		default.node_sound_stone_defaults())
-
-stairs.register_stair_and_slab("goldblock", "default:goldblock",
-		{cracky = 1},
-		{"default_gold_block.png"},
-		"Gold Block Stair",
-		"Gold Block Slab",
-		default.node_sound_stone_defaults())
+stairs.register_stair_and_slab(
+	"wood",
+	"default:wood",
+	{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
+	{"default_wood.png"},
+	"Wooden Stair",
+	"Wooden Slab",
+	default.node_sound_wood_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"junglewood",
+	"default:junglewood",
+	{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
+	{"default_junglewood.png"},
+	"Jungle Wood Stair",
+	"Jungle Wood Slab",
+	default.node_sound_wood_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"pine_wood",
+	"default:pine_wood",
+	{choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
+	{"default_pine_wood.png"},
+	"Pine Wood Stair",
+	"Pine Wood Slab",
+	default.node_sound_wood_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"acacia_wood",
+	"default:acacia_wood",
+	{choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
+	{"default_acacia_wood.png"},
+	"Acacia Wood Stair",
+	"Acacia Wood Slab",
+	default.node_sound_wood_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"aspen_wood",
+	"default:aspen_wood",
+	{choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
+	{"default_aspen_wood.png"},
+	"Aspen Wood Stair",
+	"Aspen Wood Slab",
+	default.node_sound_wood_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"stone",
+	"default:stone",
+	{cracky = 3},
+	{"default_stone.png"},
+	"Stone Stair",
+	"Stone Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"cobble",
+	"default:cobble",
+	{cracky = 3},
+	{"default_cobble.png"},
+	"Cobblestone Stair",
+	"Cobblestone Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"mossycobble",
+	nil,
+	{cracky = 3},
+	{"default_mossycobble.png"},
+	"Mossy Cobblestone Stair",
+	"Mossy Cobblestone Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"stonebrick",
+	"default:stonebrick",
+	{cracky = 2},
+	{"default_stone_brick.png"},
+	"Stone Brick Stair",
+	"Stone Brick Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"stone_block",
+	"default:stone_block",
+	{cracky = 2},
+	{"default_stone_block.png"},
+	"Stone Block Stair",
+	"Stone Block Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"desert_stone",
+	"default:desert_stone",
+	{cracky = 3},
+	{"default_desert_stone.png"},
+	"Desert Stone Stair",
+	"Desert Stone Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"desert_cobble",
+	"default:desert_cobble",
+	{cracky = 3},
+	{"default_desert_cobble.png"},
+	"Desert Cobblestone Stair",
+	"Desert Cobblestone Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"desert_stonebrick",
+	"default:desert_stonebrick",
+	{cracky = 2},
+	{"default_desert_stone_brick.png"},
+	"Desert Stone Brick Stair",
+	"Desert Stone Brick Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"desert_stone_block",
+	"default:desert_stone_block",
+	{cracky = 2},
+	{"default_desert_stone_block.png"},
+	"Desert Stone Block Stair",
+	"Desert Stone Block Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"sandstone",
+	"default:sandstone",
+	{crumbly = 1, cracky = 3},
+	{"default_sandstone.png"},
+	"Sandstone Stair",
+	"Sandstone Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"sandstonebrick",
+	"default:sandstonebrick",
+	{cracky = 2},
+	{"default_sandstone_brick.png"},
+	"Sandstone Brick Stair",
+	"Sandstone Brick Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"sandstone_block",
+	"default:sandstone_block",
+	{cracky = 2},
+	{"default_sandstone_block.png"},
+	"Sandstone Block Stair",
+	"Sandstone Block Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"obsidian",
+	"default:obsidian",
+	{cracky = 1, level = 2},
+	{"default_obsidian.png"},
+	"Obsidian Stair",
+	"Obsidian Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"obsidianbrick",
+	"default:obsidianbrick",
+	{cracky = 1, level = 2},
+	{"default_obsidian_brick.png"},
+	"Obsidian Brick Stair",
+	"Obsidian Brick Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"obsidian_block",
+	"default:obsidian_block",
+	{cracky = 1, level = 2},
+	{"default_obsidian_block.png"},
+	"Obsidian Block Stair",
+	"Obsidian Block Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"brick",
+	"default:brick",
+	{cracky = 3},
+	{"default_brick.png"},
+	"Brick Stair",
+	"Brick Slab",
+	default.node_sound_stone_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"straw",
+	"farming:straw",
+	{snappy = 3, flammable = 4},
+	{"farming_straw.png"},
+	"Straw Stair",
+	"Straw Slab",
+	default.node_sound_leaves_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"steelblock",
+	"default:steelblock",
+	{cracky = 1, level = 2},
+	{"default_steel_block.png"},
+	"Steel Block Stair",
+	"Steel Block Slab",
+	default.node_sound_metal_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"copperblock",
+	"default:copperblock",
+	{cracky = 1, level = 2},
+	{"default_copper_block.png"},
+	"Copper Block Stair",
+	"Copper Block Slab",
+	default.node_sound_metal_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"bronzeblock",
+	"default:bronzeblock",
+	{cracky = 1, level = 2},
+	{"default_bronze_block.png"},
+	"Bronze Block Stair",
+	"Bronze Block Slab",
+	default.node_sound_metal_defaults()
+)
+
+stairs.register_stair_and_slab(
+	"goldblock",
+	"default:goldblock",
+	{cracky = 1},
+	{"default_gold_block.png"},
+	"Gold Block Stair",
+	"Gold Block Slab",
+	default.node_sound_metal_defaults()
+)
diff --git a/games/minetest_game/mods/stairs/license.txt b/games/minetest_game/mods/stairs/license.txt
new file mode 100644
index 0000000..8f16bbd
--- /dev/null
+++ b/games/minetest_game/mods/stairs/license.txt
@@ -0,0 +1,51 @@
+License of source code
+----------------------
+
+GNU Lesser General Public License, version 2.1
+Copyright (C) 2011-2016 Kahrl <kahrl at gmx.net>
+Copyright (C) 2011-2016 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+This program is free software; you can redistribute it and/or modify it under the terms
+of the GNU Lesser General Public License as published by the Free Software Foundation;
+either version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU Lesser General Public License for more details:
+https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+
+
+Licenses of media (models)
+--------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) <jeanpatrick.guerrero at gmail.com>
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/tnt/README.txt b/games/minetest_game/mods/tnt/README.txt
index df98f7e..c1ca88d 100644
--- a/games/minetest_game/mods/tnt/README.txt
+++ b/games/minetest_game/mods/tnt/README.txt
@@ -1,37 +1,41 @@
 Minetest Game mod: tnt
 ======================
-by PilzAdam and ShadowNinja
+See license.txt for license information.
 
-Introduction:
-This mod adds TNT to Minetest. TNT is a tool to help the player
-in mining.
+Authors of source code
+----------------------
+PilzAdam (MIT)
+ShadowNinja (MIT)
+sofar (sofar at foo-projects.org) (MIT)
+Various Minetest developers and contributors (MIT)
 
-How to use the mod:
-Craft gunpowder by placing coal and gravel in the crafting area. The
-gunpowder can be used to craft TNT or as fuze for TNT. To craft TNT
-surround gunpowder with 4 wood in a + shape.
-There are different ways to blow up TNT:
-  1. Hit it with a torch.
-  2. Hit a gunpowder fuze that leads to a TNT block with a torch.
-  3. Activate it with mesecons (fastest way)
-Be aware of the damage radius of 7 blocks!
+Authors of media (textures)
+---------------------------
+BlockMen (CC BY-SA 3.0):
+All textures not mentioned below.
 
-License:
-WTFPL (see below)
+ShadowNinja (CC BY-SA 3.0):
+tnt_smoke.png
 
-See also:
-http://minetest.net/
+Wuzzy (CC BY-SA 3.0):
+All gunpowder textures except tnt_gunpowder_inventory.png.
 
-         DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
-                    Version 2, December 2004
+sofar (sofar at foo-projects.org) (CC BY-SA 3.0):
+tnt_blast.png
 
- Copyright (C) 2004 Sam Hocevar <sam at hocevar.net>
+Introduction
+------------
+This mod adds TNT to Minetest. TNT is a tool to help the player
+in mining.
 
- Everyone is permitted to copy and distribute verbatim or modified
- copies of this license document, and changing it is allowed as long
- as the name is changed.
+How to use the mod:
+Craft gunpowder by placing coal and gravel in the crafting area.
+The gunpowder can be used to craft TNT or as fuse for TNT.
+To craft TNT surround gunpowder with 4 wood in a + shape.
 
-            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+There are different ways to blow up TNT:
+  1. Hit it with a torch.
+  2. Hit a gunpowder fuse that leads to a TNT block with a torch or flint-and-steel.
+  3. Activate it with mesecons (fastest way).
 
-  0. You just DO WHAT THE FUCK YOU WANT TO.
+Be aware of the damage radius of 6 blocks!
diff --git a/games/minetest_game/mods/tnt/init.lua b/games/minetest_game/mods/tnt/init.lua
index 9fd97f4..f9bc307 100644
--- a/games/minetest_game/mods/tnt/init.lua
+++ b/games/minetest_game/mods/tnt/init.lua
@@ -1,10 +1,9 @@
 tnt = {}
--- Default to enabled in singleplayer and disabled in multiplayer
-local singleplayer = minetest.is_singleplayer()
-local setting = minetest.setting_getbool("enable_tnt")
-if (not singleplayer and setting ~= true) or
-		(singleplayer and setting == false) then
-	return
+
+-- Default to enabled when in singleplayer
+local enable_tnt = minetest.setting_getbool("enable_tnt")
+if enable_tnt == nil then
+	enable_tnt = minetest.is_singleplayer()
 end
 
 -- loss probabilities array (one in X will be lost)
@@ -13,7 +12,7 @@ local loss_prob = {}
 loss_prob["default:cobble"] = 3
 loss_prob["default:dirt"] = 4
 
-local radius = tonumber(minetest.setting_get("tnt_radius") or 3)
+local tnt_radius = tonumber(minetest.setting_get("tnt_radius") or 3)
 
 -- Fill a list with data for content IDs, after all nodes are registered
 local cid_data = {}
@@ -48,7 +47,7 @@ end
 local function eject_drops(drops, pos, radius)
 	local drop_pos = vector.new(pos)
 	for _, item in pairs(drops) do
-		local count = item:get_count()
+		local count = math.min(item:get_count(), item:get_stack_max())
 		while count > 0 do
 			local take = math.max(1,math.min(radius * radius,
 					count,
@@ -84,7 +83,6 @@ local function add_drop(drops, item)
 	end
 end
 
-
 local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_protection, ignore_on_blast)
 	if not ignore_protection and minetest.is_protected(npos, "") then
 		return cid
@@ -101,14 +99,13 @@ local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_p
 		return c_fire
 	else
 		local node_drops = minetest.get_node_drops(def.name, "")
-		for _, item in ipairs(node_drops) do
+		for _, item in pairs(node_drops) do
 			add_drop(drops, item)
 		end
 		return c_air
 	end
 end
 
-
 local function calc_velocity(pos1, pos2, old_vel, power)
 	-- Avoid errors caused by a vector of zero length
 	if vector.equals(pos1, pos2) then
@@ -156,7 +153,7 @@ local function entity_physics(pos, radius, drops)
 			local dir = vector.normalize(vector.subtract(obj_pos, pos))
 			local moveoff = vector.multiply(dir, dist + 1.0)
 			local newpos = vector.add(pos, moveoff)
-			local newpos = vector.add(newpos, {x = 0, y = 0.2, z = 0})
+			newpos = vector.add(newpos, {x = 0, y = 0.2, z = 0})
 			obj:setpos(newpos)
 
 			obj:set_hp(obj:get_hp() - damage)
@@ -184,7 +181,7 @@ local function entity_physics(pos, radius, drops)
 					}, nil)
 				end
 			end
-			for _, item in ipairs(entity_drops) do
+			for _, item in pairs(entity_drops) do
 				add_drop(drops, item)
 			end
 		end
@@ -251,8 +248,8 @@ local function add_effects(pos, radius, drops)
 	})
 end
 
-function tnt.burn(pos)
-	local name = minetest.get_node(pos).name
+function tnt.burn(pos, nodename)
+	local name = nodename or minetest.get_node(pos).name
 	local group = minetest.get_item_group(name, "tnt")
 	if group > 0 then
 		minetest.sound_play("tnt_ignite", {pos = pos})
@@ -264,7 +261,7 @@ function tnt.burn(pos)
 end
 
 local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast)
-	local pos = vector.round(pos)
+	pos = vector.round(pos)
 	-- scan for adjacent TNT nodes first, and enlarge the explosion
 	local vm1 = VoxelManip()
 	local p1 = vector.subtract(pos, 2)
@@ -301,11 +298,11 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast)
 	-- perform the explosion
 	local vm = VoxelManip()
 	local pr = PseudoRandom(os.time())
-	local p1 = vector.subtract(pos, radius)
-	local p2 = vector.add(pos, radius)
-	local minp, maxp = vm:read_from_map(p1, p2)
-	local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
-	local data = vm:get_data()
+	p1 = vector.subtract(pos, radius)
+	p2 = vector.add(pos, radius)
+	minp, maxp = vm:read_from_map(p1, p2)
+	a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
+	data = vm:get_data()
 
 	local drops = {}
 	local on_blast_queue = {}
@@ -335,25 +332,26 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast)
 	vm:update_map()
 	vm:update_liquids()
 
-	-- call nodeupdate for everything within 1.5x blast radius
+	-- call check_single_for_falling for everything within 1.5x blast radius
+	for y = -radius * 1.5, radius * 1.5 do
 	for z = -radius * 1.5, radius * 1.5 do
 	for x = -radius * 1.5, radius * 1.5 do
-	for y = -radius * 1.5, radius * 1.5 do
-		local s = vector.add(pos, {x = x, y = y, z = z})
-		local r = vector.distance(pos, s)
+		local rad = {x = x, y = y, z = z}
+		local s = vector.add(pos, rad)
+		local r = vector.length(rad)
 		if r / radius < 1.4 then
-			nodeupdate(s)
+			minetest.check_single_for_falling(s)
 		end
 	end
 	end
 	end
 
-	for _, data in ipairs(on_blast_queue) do
-		local dist = math.max(1, vector.distance(data.pos, pos))
+	for _, queued_data in pairs(on_blast_queue) do
+		local dist = math.max(1, vector.distance(queued_data.pos, pos))
 		local intensity = (radius * radius) / (dist * dist)
-		local node_drops = data.on_blast(data.pos, intensity)
+		local node_drops = queued_data.on_blast(queued_data.pos, intensity)
 		if node_drops then
-			for _, item in ipairs(node_drops) do
+			for _, item in pairs(node_drops) do
 				add_drop(drops, item)
 			end
 		end
@@ -406,16 +404,23 @@ minetest.register_node("tnt:gunpowder", {
 		type = "fixed",
 		fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
 	},
-	groups = {dig_immediate = 2, attached_node = 1, connect_to_raillike = minetest.raillike_group("gunpowder")},
+	groups = {dig_immediate = 2, attached_node = 1, flammable = 5,
+		connect_to_raillike = minetest.raillike_group("gunpowder")},
 	sounds = default.node_sound_leaves_defaults(),
 
 	on_punch = function(pos, node, puncher)
 		if puncher:get_wielded_item():get_name() == "default:torch" then
-			tnt.burn(pos)
+			minetest.set_node(pos, {name = "tnt:gunpowder_burning"})
 		end
 	end,
 	on_blast = function(pos, intensity)
-		tnt.burn(pos)
+		minetest.set_node(pos, {name = "tnt:gunpowder_burning"})
+	end,
+	on_burn = function(pos)
+		minetest.set_node(pos, {name = "tnt:gunpowder_burning"})
+	end,
+	on_ignite = function(pos, igniter)
+		minetest.set_node(pos, {name = "tnt:gunpowder_burning"})
 	end,
 })
 
@@ -492,31 +497,36 @@ minetest.register_node("tnt:gunpowder_burning", {
 	end,
 })
 
-minetest.register_abm({
-	nodenames = {"group:tnt", "tnt:gunpowder"},
-	neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"},
-	interval = 4,
-	chance = 1,
-	action = tnt.burn,
-})
-
 minetest.register_craft({
 	output = "tnt:gunpowder",
 	type = "shapeless",
 	recipe = {"default:coal_lump", "default:gravel"}
 })
 
-minetest.register_craft({
-	output = "tnt:tnt",
-	recipe = {
-		{"",           "group:wood",    ""},
-		{"group:wood", "tnt:gunpowder", "group:wood"},
-		{"",           "group:wood",    ""}
-	}
-})
+if enable_tnt then
+	minetest.register_craft({
+		output = "tnt:tnt",
+		recipe = {
+			{"",           "group:wood",    ""},
+			{"group:wood", "tnt:gunpowder", "group:wood"},
+			{"",           "group:wood",    ""}
+		}
+	})
+
+	minetest.register_abm({
+		label = "TNT ignition",
+		nodenames = {"group:tnt", "tnt:gunpowder"},
+		neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"},
+		interval = 4,
+		chance = 1,
+		action = function(pos, node)
+			tnt.burn(pos, node.name)
+		end,
+	})
+end
 
 function tnt.register_tnt(def)
-	local name = ""
+	local name
 	if not def.name:find(':') then
 		name = "tnt:" .. def.name
 	else
@@ -530,30 +540,38 @@ function tnt.register_tnt(def)
 	local tnt_burning = def.tiles.burning or def.name .. "_top_burning_animated.png"
 	if not def.damage_radius then def.damage_radius = def.radius * 2 end
 
-	minetest.register_node(":" .. name, {
-		description = def.description,
-		tiles = {tnt_top, tnt_bottom, tnt_side},
-		is_ground_content = false,
-		groups = {dig_immediate = 2, mesecon = 2, tnt = 1},
-		sounds = default.node_sound_wood_defaults(),
-		on_punch = function(pos, node, puncher)
-			if puncher:get_wielded_item():get_name() == "default:torch" then
-				minetest.set_node(pos, {name = name .. "_burning"})
-			end
-		end,
-		on_blast = function(pos, intensity)
-			minetest.after(0.1, function()
-				tnt.boom(pos, def)
-			end)
-		end,
-		mesecons = {effector =
-			{action_on =
-				function(pos)
-					tnt.boom(pos, def)
+	if enable_tnt then
+		minetest.register_node(":" .. name, {
+			description = def.description,
+			tiles = {tnt_top, tnt_bottom, tnt_side},
+			is_ground_content = false,
+			groups = {dig_immediate = 2, mesecon = 2, tnt = 1, flammable = 5},
+			sounds = default.node_sound_wood_defaults(),
+			on_punch = function(pos, node, puncher)
+				if puncher:get_wielded_item():get_name() == "default:torch" then
+					minetest.set_node(pos, {name = name .. "_burning"})
 				end
-			}
-		},
-	})
+			end,
+			on_blast = function(pos, intensity)
+				minetest.after(0.1, function()
+					tnt.boom(pos, def)
+				end)
+			end,
+			mesecons = {effector =
+				{action_on =
+					function(pos)
+						tnt.boom(pos, def)
+					end
+				}
+			},
+			on_burn = function(pos)
+				minetest.set_node(pos, {name = name .. "_burning"})
+			end,
+			on_ignite = function(pos, igniter)
+				minetest.set_node(pos, {name = name .. "_burning"})
+			end,
+		})
+	end
 
 	minetest.register_node(":" .. name .. "_burning", {
 		tiles = {
@@ -580,7 +598,7 @@ function tnt.register_tnt(def)
 		on_construct = function(pos)
 			minetest.sound_play("tnt_ignite", {pos = pos})
 			minetest.get_node_timer(pos):start(4)
-			nodeupdate(pos)
+			minetest.check_for_falling(pos)
 		end,
 	})
 end
@@ -588,6 +606,5 @@ end
 tnt.register_tnt({
 	name = "tnt:tnt",
 	description = "TNT",
-	radius = radius,
+	radius = tnt_radius,
 })
-
diff --git a/games/minetest_game/mods/tnt/license.txt b/games/minetest_game/mods/tnt/license.txt
new file mode 100644
index 0000000..210f2bd
--- /dev/null
+++ b/games/minetest_game/mods/tnt/license.txt
@@ -0,0 +1,65 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2014-2016 PilzAdam
+Copyright (C) 2014-2016 ShadowNinja
+Copyright (C) 2016 sofar (sofar at foo-projects.org)
+Copyright (C) 2014-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2014-2016 BlockMen
+Copyright (C) 2014-2016 ShadowNinja
+Copyright (C) 2015-2016 Wuzzy
+Copyright (C) 2016 sofar (sofar at foo-projects.org)
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/vessels/README.txt b/games/minetest_game/mods/vessels/README.txt
index d5c3da8..5bb798c 100644
--- a/games/minetest_game/mods/vessels/README.txt
+++ b/games/minetest_game/mods/vessels/README.txt
@@ -1,45 +1,22 @@
 Minetest Game mod: vessels
 ==========================
-
-Crafts
--------
-Glass bottle (yields 10)
-
-   G - G
-   G - G
-   - G -
-
-Drinking Glass (yields 14)
-
-   G - G
-   G - G
-   G G G
-
-Heavy Steel Bottle (yields 5)
-
-   S - S
-   S - S
-   - S -
-
-License of source code:
------------------------
-Copyright (C) 2012 Vanessa Ezekowitz
-Version 2012-09-02
-Modifications by Perttu Ahola <celeron55 at gmail.com>
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or
-(at your option) any later version.
-
-http://www.gnu.org/licenses/lgpl-2.1.html
-
-License of media (textures and sounds)
---------------------------------------
-WTFPL
-
-Authors of media files
------------------------
-Unless specifically noted,
-Copyright (C) 2012 Vanessa Ezekowitz
-
+See license.txt for license information.
+
+Authors of source code
+----------------------
+Originally by Vanessa Ezekowitz (LGPL 2.1)
+Modified by Perttu Ahola <celeron55 at gmail.com> (LGPL 2.1)
+Various Minetest developers and contributors (LGPL 2.1)
+
+Authors of media (textures)
+---------------------------
+All not listed below, Vanessa Ezekowitz (CC BY-SA 3.0)
+
+The following textures were modified by Thomas-S (CC BY-SA 3.0):
+  vessels_drinking_glass.png
+  vessels_drinking_glass_inv.png
+  vessels_glass_bottle.png
+  vessels_steel_bottle.png
+
+The following texture was created by Wuzzy (CC BY-SA 3.0):
+  vessels_shelf_slot.png (based on vessels_glass_bottle.png)
diff --git a/games/minetest_game/mods/vessels/init.lua b/games/minetest_game/mods/vessels/init.lua
index 165efbd..688413f 100644
--- a/games/minetest_game/mods/vessels/init.lua
+++ b/games/minetest_game/mods/vessels/init.lua
@@ -2,27 +2,48 @@
 -- See README.txt for licensing and other information.
 
 local vessels_shelf_formspec =
-	"size[8,7;]"..
-	default.gui_bg..
-	default.gui_bg_img..
-	default.gui_slots..
-	"list[context;vessels;0,0.3;8,2;]"..
-	"list[current_player;main;0,2.85;8,1;]"..
-	"list[current_player;main;0,4.08;8,3;8]"..
-	"listring[context;vessels]"..
-	"listring[current_player;main]"..
-	default.get_hotbar_bg(0,2.85)
+	"size[8,7;]" ..
+	default.gui_bg ..
+	default.gui_bg_img ..
+	default.gui_slots ..
+	"list[context;vessels;0,0.3;8,2;]" ..
+	"list[current_player;main;0,2.85;8,1;]" ..
+	"list[current_player;main;0,4.08;8,3;8]" ..
+	"listring[context;vessels]" ..
+	"listring[current_player;main]" ..
+	default.get_hotbar_bg(0, 2.85)
+
+local function get_vessels_shelf_formspec(inv)
+	local formspec = vessels_shelf_formspec
+	local invlist = inv and inv:get_list("vessels")
+	-- Inventory slots overlay
+	local vx, vy = 0, 0.3
+	for i = 1, 16 do
+		if i == 9 then
+			vx = 0
+			vy = vy + 1
+		end
+		if not invlist or invlist[i]:is_empty() then
+			formspec = formspec ..
+				"image[" .. vx .. "," .. vy .. ";1,1;vessels_shelf_slot.png]"
+		end
+		vx = vx + 1
+	end
+	return formspec
+end
 
 minetest.register_node("vessels:shelf", {
-	description = "Vessels shelf",
-	tiles = {"default_wood.png", "default_wood.png", "vessels_shelf.png"},
+	description = "Vessels Shelf",
+	tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
+		"default_wood.png", "vessels_shelf.png", "vessels_shelf.png"},
+	paramtype2 = "facedir",
 	is_ground_content = false,
-	groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3},
+	groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
 	sounds = default.node_sound_wood_defaults(),
 
 	on_construct = function(pos)
 		local meta = minetest.get_meta(pos)
-		meta:set_string("formspec", vessels_shelf_formspec)
+		meta:set_string("formspec", get_vessels_shelf_formspec(nil))
 		local inv = meta:get_inventory()
 		inv:set_size("vessels", 8 * 2)
 	end,
@@ -39,30 +60,36 @@ minetest.register_node("vessels:shelf", {
 	on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
 		minetest.log("action", player:get_player_name() ..
 			   " moves stuff in vessels shelf at ".. minetest.pos_to_string(pos))
+		local meta = minetest.get_meta(pos)
+		meta:set_string("formspec", get_vessels_shelf_formspec(meta:get_inventory()))
 	end,
 	on_metadata_inventory_put = function(pos, listname, index, stack, player)
 		minetest.log("action", player:get_player_name() ..
 			   " moves stuff to vessels shelf at ".. minetest.pos_to_string(pos))
+		local meta = minetest.get_meta(pos)
+		meta:set_string("formspec", get_vessels_shelf_formspec(meta:get_inventory()))
 	end,
 	on_metadata_inventory_take = function(pos, listname, index, stack, player)
 		minetest.log("action", player:get_player_name() ..
 			   " takes stuff from vessels shelf at ".. minetest.pos_to_string(pos))
+		local meta = minetest.get_meta(pos)
+		meta:set_string("formspec", get_vessels_shelf_formspec(meta:get_inventory()))
 	end,
 	on_blast = function(pos)
 		local drops = {}
 		default.get_inventory_drops(pos, "vessels", drops)
-		drops[#drops+1] = "vessels:shelf"
+		drops[#drops + 1] = "vessels:shelf"
 		minetest.remove_node(pos)
 		return drops
 	end,
 })
 
 minetest.register_craft({
-	output = 'vessels:shelf',
+	output = "vessels:shelf",
 	recipe = {
-		{'group:wood', 'group:wood', 'group:wood'},
-		{'group:vessel', 'group:vessel', 'group:vessel'},
-		{'group:wood', 'group:wood', 'group:wood'},
+		{"group:wood", "group:wood", "group:wood"},
+		{"group:vessel", "group:vessel", "group:vessel"},
+		{"group:wood", "group:wood", "group:wood"},
 	}
 })
 
@@ -70,25 +97,25 @@ minetest.register_node("vessels:glass_bottle", {
 	description = "Glass Bottle (empty)",
 	drawtype = "plantlike",
 	tiles = {"vessels_glass_bottle.png"},
-	inventory_image = "vessels_glass_bottle_inv.png",
+	inventory_image = "vessels_glass_bottle.png",
 	wield_image = "vessels_glass_bottle.png",
 	paramtype = "light",
 	is_ground_content = false,
 	walkable = false,
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25}
+		fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25}
 	},
-	groups = {vessel=1,dig_immediate=3,attached_node=1},
+	groups = {vessel = 1, dig_immediate = 3, attached_node = 1},
 	sounds = default.node_sound_glass_defaults(),
 })
 
 minetest.register_craft( {
 	output = "vessels:glass_bottle 10",
 	recipe = {
-		{ "default:glass", "", "default:glass" },
-		{ "default:glass", "", "default:glass" },
-		{ "", "default:glass", "" }
+		{"default:glass", "", "default:glass"},
+		{"default:glass", "", "default:glass"},
+		{"", "default:glass", ""}
 	}
 })
 
@@ -103,18 +130,18 @@ minetest.register_node("vessels:drinking_glass", {
 	walkable = false,
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25}
+		fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25}
 	},
-	groups = {vessel=1,dig_immediate=3,attached_node=1},
+	groups = {vessel = 1, dig_immediate = 3, attached_node = 1},
 	sounds = default.node_sound_glass_defaults(),
 })
 
 minetest.register_craft( {
 	output = "vessels:drinking_glass 14",
 	recipe = {
-		{ "default:glass", "", "default:glass" },
-		{ "default:glass", "", "default:glass" },
-		{ "default:glass", "default:glass", "default:glass" }
+		{"default:glass", "", "default:glass"},
+		{"default:glass", "", "default:glass"},
+		{"default:glass", "default:glass", "default:glass"}
 	}
 })
 
@@ -122,30 +149,30 @@ minetest.register_node("vessels:steel_bottle", {
 	description = "Heavy Steel Bottle (empty)",
 	drawtype = "plantlike",
 	tiles = {"vessels_steel_bottle.png"},
-	inventory_image = "vessels_steel_bottle_inv.png",
+	inventory_image = "vessels_steel_bottle.png",
 	wield_image = "vessels_steel_bottle.png",
 	paramtype = "light",
 	is_ground_content = false,
 	walkable = false,
 	selection_box = {
 		type = "fixed",
-		fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25}
+		fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25}
 	},
-	groups = {vessel=1,dig_immediate=3,attached_node=1},
+	groups = {vessel = 1, dig_immediate = 3, attached_node = 1},
 	sounds = default.node_sound_defaults(),
 })
 
 minetest.register_craft( {
 	output = "vessels:steel_bottle 5",
 	recipe = {
-		{ "default:steel_ingot", "", "default:steel_ingot" },
-		{ "default:steel_ingot", "", "default:steel_ingot" },
-		{ "", "default:steel_ingot", "" }
+		{"default:steel_ingot", "", "default:steel_ingot"},
+		{"default:steel_ingot", "", "default:steel_ingot"},
+		{"", "default:steel_ingot", ""}
 	}
 })
 
 
--- Make sure we can recycle them
+-- Glass and steel recycling
 
 minetest.register_craftitem("vessels:glass_fragments", {
 	description = "Pile of Glass Fragments",
@@ -182,3 +209,8 @@ minetest.register_craft( {
 	recipe = "vessels:steel_bottle",
 })
 
+minetest.register_craft({
+	type = "fuel",
+	recipe = "vessels:shelf",
+	burntime = 30,
+})
diff --git a/games/minetest_game/mods/vessels/license.txt b/games/minetest_game/mods/vessels/license.txt
new file mode 100644
index 0000000..de16a3b
--- /dev/null
+++ b/games/minetest_game/mods/vessels/license.txt
@@ -0,0 +1,52 @@
+License of source code
+----------------------
+
+GNU Lesser General Public License, version 2.1
+Copyright (C) 2012-2016 Vanessa Ezekowitz
+Copyright (C) 2012-2016 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+This program is free software; you can redistribute it and/or modify it under the terms
+of the GNU Lesser General Public License as published by the Free Software Foundation;
+either version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU Lesser General Public License for more details:
+https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2012-2016 Vanessa Ezekowitz
+Copyright (C) 2016 Thomas-S
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/vessels/textures/vessels_drinking_glass.png b/games/minetest_game/mods/vessels/textures/vessels_drinking_glass.png
index 4cff308..d5037b8 100644
Binary files a/games/minetest_game/mods/vessels/textures/vessels_drinking_glass.png and b/games/minetest_game/mods/vessels/textures/vessels_drinking_glass.png differ
diff --git a/games/minetest_game/mods/vessels/textures/vessels_drinking_glass_inv.png b/games/minetest_game/mods/vessels/textures/vessels_drinking_glass_inv.png
index 4cff308..9992bd9 100644
Binary files a/games/minetest_game/mods/vessels/textures/vessels_drinking_glass_inv.png and b/games/minetest_game/mods/vessels/textures/vessels_drinking_glass_inv.png differ
diff --git a/games/minetest_game/mods/vessels/textures/vessels_glass_bottle.png b/games/minetest_game/mods/vessels/textures/vessels_glass_bottle.png
index e9dc683..6ea37db 100644
Binary files a/games/minetest_game/mods/vessels/textures/vessels_glass_bottle.png and b/games/minetest_game/mods/vessels/textures/vessels_glass_bottle.png differ
diff --git a/games/minetest_game/mods/vessels/textures/vessels_glass_bottle_inv.png b/games/minetest_game/mods/vessels/textures/vessels_glass_bottle_inv.png
deleted file mode 100644
index e9dc683..0000000
Binary files a/games/minetest_game/mods/vessels/textures/vessels_glass_bottle_inv.png and /dev/null differ
diff --git a/games/minetest_game/mods/vessels/textures/vessels_shelf_slot.png b/games/minetest_game/mods/vessels/textures/vessels_shelf_slot.png
new file mode 100644
index 0000000..ff29082
Binary files /dev/null and b/games/minetest_game/mods/vessels/textures/vessels_shelf_slot.png differ
diff --git a/games/minetest_game/mods/vessels/textures/vessels_steel_bottle.png b/games/minetest_game/mods/vessels/textures/vessels_steel_bottle.png
index 834a3d5..61d3071 100644
Binary files a/games/minetest_game/mods/vessels/textures/vessels_steel_bottle.png and b/games/minetest_game/mods/vessels/textures/vessels_steel_bottle.png differ
diff --git a/games/minetest_game/mods/vessels/textures/vessels_steel_bottle_inv.png b/games/minetest_game/mods/vessels/textures/vessels_steel_bottle_inv.png
deleted file mode 100644
index 834a3d5..0000000
Binary files a/games/minetest_game/mods/vessels/textures/vessels_steel_bottle_inv.png and /dev/null differ
diff --git a/games/minetest_game/mods/walls/README.txt b/games/minetest_game/mods/walls/README.txt
new file mode 100644
index 0000000..0389174
--- /dev/null
+++ b/games/minetest_game/mods/walls/README.txt
@@ -0,0 +1,7 @@
+Minetest Game mod: walls
+========================
+See license.txt for license information.
+
+Authors of source code
+----------------------
+Auke Kok <sofar at foo-projects.org> (LGPL 2.1)
diff --git a/games/minetest_game/mods/walls/init.lua b/games/minetest_game/mods/walls/init.lua
index 0b51bdb..bee8e46 100644
--- a/games/minetest_game/mods/walls/init.lua
+++ b/games/minetest_game/mods/walls/init.lua
@@ -1,18 +1,3 @@
-
---[[
-
-Walls mod for Minetest
-
-Copyright (C) 2015 Auke Kok <sofar at foo-projects.org>
-
-This program is free software. It comes without any warranty, to
-the extent permitted by applicable law. You can redistribute it
-and/or modify it under the terms of the Do What The Fuck You Want
-To Public License, Version 2, as published by Sam Hocevar. See
-http://sam.zoy.org/wtfpl/COPYING for more details.
-
---]]
-
 walls = {}
 
 walls.register = function(wall_name, wall_desc, wall_texture, wall_mat, wall_sounds)
diff --git a/games/minetest_game/mods/walls/license.txt b/games/minetest_game/mods/walls/license.txt
new file mode 100644
index 0000000..ccfaf1c
--- /dev/null
+++ b/games/minetest_game/mods/walls/license.txt
@@ -0,0 +1,14 @@
+License of source code
+----------------------
+
+GNU Lesser General Public License, version 2.1
+Copyright (C) 2015 Auke Kok <sofar at foo-projects.org>
+
+This program is free software; you can redistribute it and/or modify it under the terms
+of the GNU Lesser General Public License as published by the Free Software Foundation;
+either version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU Lesser General Public License for more details:
+https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
diff --git a/games/minetest_game/mods/wool/README.txt b/games/minetest_game/mods/wool/README.txt
index f57b6dd..a66677d 100644
--- a/games/minetest_game/mods/wool/README.txt
+++ b/games/minetest_game/mods/wool/README.txt
@@ -1,28 +1,16 @@
 Minetest Game mod: wool
 =======================
+See license.txt for license information.
 
-Mostly backward-compatible with jordach's 16-color wool mod.
-
-License of source code:
------------------------
-Copyright (C) 2012 Perttu Ahola (celeron55) <celeron55 at gmail.com>
-
-This program is free software. It comes without any warranty, to
-the extent permitted by applicable law. You can redistribute it
-and/or modify it under the terms of the Do What The Fuck You Want
-To Public License, Version 2, as published by Sam Hocevar. See
-http://sam.zoy.org/wtfpl/COPYING for more details.
-
-License of media (textures and sounds)
---------------------------------------
-Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
-http://creativecommons.org/licenses/by-sa/3.0/
-
-Authors of media files
------------------------
-Cisoun:
-- wool_black.png wool_brown.png wool_dark_green.png wool_green.png
-- wool_magenta.png wool_pink.png wool_violet.png wool_yellow.png wool_blue.png
-- wool_cyan.png wool_dark_grey.png wool_grey.png wool_orange.png wool_red.png
-- wool_white.png
+Authors of source code
+----------------------
+Originally by Perttu Ahola (celeron55) <celeron55 at gmail.com> (MIT)
+Various Minetest developers and contributors (MIT)
 
+Authors of media (textures)
+---------------------------
+Cisoun (CC BY-SA 3.0):
+  wool_black.png wool_brown.png wool_dark_green.png wool_green.png
+  wool_magenta.png wool_pink.png wool_violet.png wool_yellow.png
+  wool_blue.png wool_cyan.png wool_dark_grey.png wool_grey.png
+  wool_orange.png wool_red.png wool_white.png
diff --git a/games/minetest_game/mods/wool/init.lua b/games/minetest_game/mods/wool/init.lua
index f485e4f..a36e4dd 100644
--- a/games/minetest_game/mods/wool/init.lua
+++ b/games/minetest_game/mods/wool/init.lua
@@ -1,14 +1,8 @@
--- minetest/wool/init.lua
-
--- Backwards compatibility with jordach's 16-color wool mod
-minetest.register_alias("wool:dark_blue", "wool:blue")
-minetest.register_alias("wool:gold", "wool:yellow")
-
-local wool = {}
 -- This uses a trick: you can first define the recipes using all of the base
 -- colors, and then some recipes using more specific colors for a few non-base
 -- colors available. When crafting, the last recipes will be checked first.
-wool.dyes = {
+
+local dyes = {
 	{"white",      "White",      "basecolor_white"},
 	{"grey",       "Grey",       "basecolor_grey"},
 	{"black",      "Black",      "basecolor_black"},
@@ -26,25 +20,28 @@ wool.dyes = {
 	{"dark_green", "Dark Green", "unicolor_dark_green"},
 }
 
-for _, row in ipairs(wool.dyes) do
-	local name = row[1]
-	local desc = row[2]
-	local craft_color_group = row[3]
-	-- Node Definition
-	minetest.register_node("wool:"..name, {
-		description = desc.." Wool",
-		tiles = {"wool_"..name..".png"},
+for i = 1, #dyes do
+	local name, desc, craft_color_group = unpack(dyes[i])
+
+	minetest.register_node("wool:" .. name, {
+		description = desc .. " Wool",
+		tiles = {"wool_" .. name .. ".png"},
 		is_ground_content = false,
-		groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3,flammable=3,wool=1},
+		groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3,
+				flammable = 3, wool = 1},
 		sounds = default.node_sound_defaults(),
 	})
-	if craft_color_group then
-		-- Crafting from dye and white wool
-		minetest.register_craft({
-			type = "shapeless",
-			output = 'wool:'..name,
-			recipe = {'group:dye,'..craft_color_group, 'group:wool'},
-		})
-	end
+
+	minetest.register_craft{
+		type = "shapeless",
+		output = "wool:" .. name,
+		recipe = {"group:dye," .. craft_color_group, "group:wool"},
+	}
 end
 
+
+-- legacy
+
+-- Backwards compatibility with jordach's 16-color wool mod
+minetest.register_alias("wool:dark_blue", "wool:blue")
+minetest.register_alias("wool:gold", "wool:yellow")
diff --git a/games/minetest_game/mods/wool/license.txt b/games/minetest_game/mods/wool/license.txt
new file mode 100644
index 0000000..9310163
--- /dev/null
+++ b/games/minetest_game/mods/wool/license.txt
@@ -0,0 +1,60 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2012-2016 Perttu Ahola (celeron55) <celeron55 at gmail.com>
+Copyright (C) 2012-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2012-2016 Cisoun
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/wool/textures/wool_black.png b/games/minetest_game/mods/wool/textures/wool_black.png
index a9e566b..700d439 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_black.png and b/games/minetest_game/mods/wool/textures/wool_black.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_blue.png b/games/minetest_game/mods/wool/textures/wool_blue.png
index 035a8da..a074986 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_blue.png and b/games/minetest_game/mods/wool/textures/wool_blue.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_cyan.png b/games/minetest_game/mods/wool/textures/wool_cyan.png
index 4e1e4a3..395b6ac 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_cyan.png and b/games/minetest_game/mods/wool/textures/wool_cyan.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_dark_green.png b/games/minetest_game/mods/wool/textures/wool_dark_green.png
index 92c5631..0e73999 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_dark_green.png and b/games/minetest_game/mods/wool/textures/wool_dark_green.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_dark_grey.png b/games/minetest_game/mods/wool/textures/wool_dark_grey.png
index 0624525..7253696 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_dark_grey.png and b/games/minetest_game/mods/wool/textures/wool_dark_grey.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_green.png b/games/minetest_game/mods/wool/textures/wool_green.png
index 554471a..dcb663b 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_green.png and b/games/minetest_game/mods/wool/textures/wool_green.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_grey.png b/games/minetest_game/mods/wool/textures/wool_grey.png
index ff38bf7..2f4c338 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_grey.png and b/games/minetest_game/mods/wool/textures/wool_grey.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_magenta.png b/games/minetest_game/mods/wool/textures/wool_magenta.png
index 5b254e4..5c2c4a7 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_magenta.png and b/games/minetest_game/mods/wool/textures/wool_magenta.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_orange.png b/games/minetest_game/mods/wool/textures/wool_orange.png
index 64f34c0..a059f36 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_orange.png and b/games/minetest_game/mods/wool/textures/wool_orange.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_pink.png b/games/minetest_game/mods/wool/textures/wool_pink.png
index 0513540..8e90140 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_pink.png and b/games/minetest_game/mods/wool/textures/wool_pink.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_red.png b/games/minetest_game/mods/wool/textures/wool_red.png
index de05af1..da12ecf 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_red.png and b/games/minetest_game/mods/wool/textures/wool_red.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_violet.png b/games/minetest_game/mods/wool/textures/wool_violet.png
index a41a9f4..d7d6783 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_violet.png and b/games/minetest_game/mods/wool/textures/wool_violet.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_white.png b/games/minetest_game/mods/wool/textures/wool_white.png
index 2bbb9cf..88f1e2f 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_white.png and b/games/minetest_game/mods/wool/textures/wool_white.png differ
diff --git a/games/minetest_game/mods/wool/textures/wool_yellow.png b/games/minetest_game/mods/wool/textures/wool_yellow.png
index a95bb34..2b0f048 100644
Binary files a/games/minetest_game/mods/wool/textures/wool_yellow.png and b/games/minetest_game/mods/wool/textures/wool_yellow.png differ
diff --git a/games/minetest_game/mods/xpanes/README.txt b/games/minetest_game/mods/xpanes/README.txt
index b89e74a..bcbc129 100644
--- a/games/minetest_game/mods/xpanes/README.txt
+++ b/games/minetest_game/mods/xpanes/README.txt
@@ -1,16 +1,21 @@
 Minetest Game mod: xpanes
 =========================
+See license.txt for license information.
 
-License:
---------
-Copyright (C) xyz
-modified by BlockMen (iron bars)
+Authors of source code
+----------------------
+Originally by xyz (MIT)
+BlockMen (MIT)
+sofar (MIT)
+Various Minetest developers and contributors (MIT)
 
-Gambit (WTFPL):
- xpanes_bar.png
+Authors of media (textures)
+---------------------------
+xyz (CC BY-SA 3.0):
+  All textures not mentioned below.
 
-This program is free software. It comes without any warranty, to
-the extent permitted by applicable law. You can redistribute it
-and/or modify it under the terms of the Do What The Fuck You Want
-To Public License, Version 2, as published by Sam Hocevar. See
-http://sam.zoy.org/wtfpl/COPYING for more details.
+Gambit (CC BY-SA 3.0):
+  xpanes_bar.png
+
+paramat (CC BY-SA 3.0):
+  xpanes_bar_top.png
diff --git a/games/minetest_game/mods/xpanes/init.lua b/games/minetest_game/mods/xpanes/init.lua
index 9189912..77278a5 100644
--- a/games/minetest_game/mods/xpanes/init.lua
+++ b/games/minetest_game/mods/xpanes/init.lua
@@ -1,156 +1,146 @@
-xpanes = {}
 
-local function rshift(x, by)
-	return math.floor(x / 2 ^ by)
+local function is_pane(pos)
+	return minetest.get_item_group(minetest.get_node(pos).name, "pane") > 0
 end
 
-local directions = {
-	{x = 1, y = 0, z = 0},
-	{x = 0, y = 0, z = 1},
-	{x = -1, y = 0, z = 0},
-	{x = 0, y = 0, z = -1},
-}
-
-local function update_pane(pos, name)
-	if not minetest.get_node(pos).name:find("^xpanes:"..name) then
-		return
+local function connects_dir(pos, name, dir)
+	local aside = vector.add(pos, minetest.facedir_to_dir(dir))
+	if is_pane(aside) then
+		return true
 	end
-	local sum = 0
-	for i, dir in pairs(directions) do
-		local node = minetest.get_node(vector.add(pos, dir))
-		local def = minetest.registered_nodes[node.name]
-		local pane_num = def and def.groups.pane or 0
-		if pane_num > 0 or not def or (def.walkable ~= false and
-				def.drawtype ~= "nodebox") then
-			sum = sum + 2 ^ (i - 1)
-		end
+
+	local connects_to = minetest.registered_nodes[name].connects_to
+	if not connects_to then
+		return false
 	end
-	if sum == 0 then
-		sum = 15
+	local list = minetest.find_nodes_in_area(aside, aside, connects_to)
+
+	if #list > 0 then
+		return true
 	end
-	minetest.set_node(pos, {name = "xpanes:"..name.."_"..sum})
+
+	return false
 end
 
-local function update_nearby(pos, node)
-	node = node or minetest.get_node(pos)
-	local name = node.name
-	if not name or node.name:sub(1, 7) ~= "xpanes:" then
+local function swap(pos, node, name, param2)
+	if node.name == name and node.param2 == param2 then
 		return
 	end
-	local underscore_pos = string.find(name, "_[^_]*$") or 0
-	local len = name:len()
-	local num = tonumber(name:sub(underscore_pos+1, len))
-	if not num or num < 1 or num > 15 then
-		name = name:sub(8)
-	else
-		name = name:sub(8, underscore_pos - 1)
-	end
-	for i, dir in pairs(directions) do
-		update_pane(vector.add(pos, dir), name)
-	end
+
+	minetest.set_node(pos, {name = name, param2 = param2})
 end
 
-minetest.register_on_placenode(update_nearby)
-minetest.register_on_dignode(update_nearby)
-
-local half_boxes = {
-	{0,     -0.5, -1/32, 0.5,  0.5, 1/32},
-	{-1/32, -0.5, 0,     1/32, 0.5, 0.5},
-	{-0.5,  -0.5, -1/32, 0,    0.5, 1/32},
-	{-1/32, -0.5, -0.5,  1/32, 0.5, 0}
-}
-
-local full_boxes = {
-	{-0.5,  -0.5, -1/32, 0.5,  0.5, 1/32},
-	{-1/32, -0.5, -0.5,  1/32, 0.5, 0.5}
-}
-
-local sb_half_boxes = {
-	{0,     -0.5, -0.06, 0.5,  0.5, 0.06},
-	{-0.06, -0.5, 0,     0.06, 0.5, 0.5},
-	{-0.5,  -0.5, -0.06, 0,    0.5, 0.06},
-	{-0.06, -0.5, -0.5,  0.06, 0.5, 0}
-}
-
-local sb_full_boxes = {
-	{-0.5,  -0.5, -0.06, 0.5,  0.5, 0.06},
-	{-0.06, -0.5, -0.5,  0.06, 0.5, 0.5}
-}
-
-local pane_def_fields = {
-	drawtype = "airlike",
-	paramtype = "light",
-	is_ground_content = false,
-	sunlight_propagates = true,
-	walkable = false,
-	pointable = false,
-	diggable = false,
-	buildable_to = true,
-	air_equivalent = true,
-}
+local function update_pane(pos)
+	if not is_pane(pos) then
+		return
+	end
+	local node = minetest.get_node(pos)
+	local name = node.name
+	if name:sub(-5) == "_flat" then
+		name = name:sub(1, -6)
+	end
 
-function xpanes.register_pane(name, def)
-	for i = 1, 15 do
-		local need = {}
-		local cnt = 0
-		for j = 1, 4 do
-			if rshift(i, j - 1) % 2 == 1 then
-				need[j] = true
-				cnt = cnt + 1
-			end
-		end
-		local take = {}
-		local take2 = {}
-		if need[1] == true and need[3] == true then
-			need[1] = nil
-			need[3] = nil
-			table.insert(take, full_boxes[1])
-			table.insert(take2, sb_full_boxes[1])
+	local any = node.param2
+	local c = {}
+	local count = 0
+	for dir = 0, 3 do
+		c[dir] = connects_dir(pos, name, dir)
+		if c[dir] then
+			any = dir
+			count = count + 1
 		end
-		if need[2] == true and need[4] == true then
-			need[2] = nil
-			need[4] = nil
-			table.insert(take, full_boxes[2])
-			table.insert(take2, sb_full_boxes[2])
-		end
-		for k in pairs(need) do
-			table.insert(take, half_boxes[k])
-			table.insert(take2, sb_half_boxes[k])
-		end
-		local texture = def.textures[1]
-		if cnt == 1 then
-			texture = def.textures[1].."^"..def.textures[2]
+	end
+
+	if count == 0 then
+		swap(pos, node, name .. "_flat", any)
+	elseif count == 1 then
+		swap(pos, node, name .. "_flat", (any + 1) % 4)
+	elseif count == 2 then
+		if (c[0] and c[2]) or (c[1] and c[3]) then
+			swap(pos, node, name .. "_flat", (any + 1) % 4)
+		else
+			swap(pos, node, name, 0)
 		end
-		minetest.register_node(":xpanes:"..name.."_"..i, {
-			drawtype = "nodebox",
-			tiles = {def.textures[3], def.textures[3], texture},
-			paramtype = "light",
-			groups = def.groups,
-			drop = "xpanes:"..name,
-			sounds = def.sounds,
-			node_box = {
-				type = "fixed",
-				fixed = take
-			},
-			selection_box = {
-				type = "fixed",
-				fixed = take2
-			}
-		})
+	else
+		swap(pos, node, name, 0)
+	end
+end
+
+minetest.register_on_placenode(function(pos, node)
+	if minetest.get_item_group(node, "pane") then
+		update_pane(pos)
+	end
+	for i = 0, 3 do
+		local dir = minetest.facedir_to_dir(i)
+		update_pane(vector.add(pos, dir))
 	end
+end)
 
-	for k, v in pairs(pane_def_fields) do
-		def[k] = def[k] or v
+minetest.register_on_dignode(function(pos)
+	for i = 0, 3 do
+		local dir = minetest.facedir_to_dir(i)
+		update_pane(vector.add(pos, dir))
 	end
+end)
 
-	def.on_construct = function(pos)
-		update_pane(pos, name)
+xpanes = {}
+function xpanes.register_pane(name, def)
+	for i = 1, 15 do
+		minetest.register_alias("xpanes:" .. name .. "_" .. i, "xpanes:" .. name .. "_flat")
 	end
 
-	minetest.register_node(":xpanes:"..name, def)
+	local flatgroups = table.copy(def.groups)
+	flatgroups.pane = 1
+	minetest.register_node(":xpanes:" .. name .. "_flat", {
+		description = def.description,
+		drawtype = "nodebox",
+		paramtype = "light",
+		is_ground_content = false,
+		sunlight_propagates = true,
+		inventory_image = def.inventory_image,
+		wield_image = def.wield_image,
+		paramtype2 = "facedir",
+		tiles = {def.textures[3], def.textures[3], def.textures[1]},
+		groups = flatgroups,
+		drop = "xpanes:" .. name .. "_flat",
+		sounds = def.sounds,
+		node_box = {
+			type = "fixed",
+			fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}},
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {{-1/2, -1/2, -1/32, 1/2, 1/2, 1/32}},
+		},
+		connect_sides = { "left", "right" },
+	})
+
+	local groups = table.copy(def.groups)
+	groups.pane = 1
+	groups.not_in_creative_inventory = 1
+	minetest.register_node(":xpanes:" .. name, {
+		drawtype = "nodebox",
+		paramtype = "light",
+		is_ground_content = false,
+		sunlight_propagates = true,
+		description = def.description,
+		tiles = {def.textures[3], def.textures[3], def.textures[1]},
+		groups = groups,
+		drop = "xpanes:" .. name .. "_flat",
+		sounds = def.sounds,
+		node_box = {
+			type = "connected",
+			fixed = {{-1/32, -1/2, -1/32, 1/32, 1/2, 1/32}},
+			connect_front = {{-1/32, -1/2, -1/2, 1/32, 1/2, -1/32}},
+			connect_left = {{-1/2, -1/2, -1/32, -1/32, 1/2, 1/32}},
+			connect_back = {{-1/32, -1/2, 1/32, 1/32, 1/2, 1/2}},
+			connect_right = {{1/32, -1/2, -1/32, 1/2, 1/2, 1/32}},
+		},
+		connects_to = {"group:pane", "group:stone", "group:glass", "group:wood", "group:tree"},
+	})
 
 	minetest.register_craft({
-		output = "xpanes:"..name.." 16",
+		output = "xpanes:" .. name .. "_flat 16",
 		recipe = def.recipe
 	})
 end
@@ -161,7 +151,7 @@ xpanes.register_pane("pane", {
 	inventory_image = "default_glass.png",
 	wield_image = "default_glass.png",
 	sounds = default.node_sound_glass_defaults(),
-	groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3, pane=1},
+	groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3},
 	recipe = {
 		{"default:glass", "default:glass", "default:glass"},
 		{"default:glass", "default:glass", "default:glass"}
@@ -170,14 +160,25 @@ xpanes.register_pane("pane", {
 
 xpanes.register_pane("bar", {
 	description = "Iron bar",
-	textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_space.png"},
+	textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_bar_top.png"},
 	inventory_image = "xpanes_bar.png",
 	wield_image = "xpanes_bar.png",
-	groups = {cracky=2, pane=1},
-	sounds = default.node_sound_stone_defaults(),
+	groups = {cracky=2},
+	sounds = default.node_sound_metal_defaults(),
 	recipe = {
 		{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
 		{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
 	}
 })
 
+minetest.register_lbm({
+	name = "xpanes:gen2",
+	nodenames = {"group:pane"},
+	action = function(pos, node)
+		update_pane(pos)
+		for i = 0, 3 do
+			local dir = minetest.facedir_to_dir(i)
+			update_pane(vector.add(pos, dir))
+		end
+	end
+})
diff --git a/games/minetest_game/mods/xpanes/license.txt b/games/minetest_game/mods/xpanes/license.txt
new file mode 100644
index 0000000..dff7227
--- /dev/null
+++ b/games/minetest_game/mods/xpanes/license.txt
@@ -0,0 +1,64 @@
+License of source code
+----------------------
+
+The MIT License (MIT)
+Copyright (C) 2014-2016 xyz
+Copyright (C) 2014-2016 BlockMen
+Copyright (C) 2016 Auke Kok <sofar at foo-projects.org>
+Copyright (C) 2014-2016 Various Minetest developers and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+For more details:
+https://opensource.org/licenses/MIT
+
+
+Licenses of media (textures)
+----------------------------
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+Copyright (C) 2014-2016 xyz
+Copyright (C) 2013-2016 Gambit
+Copyright (C) 2016 paramat
+
+You are free to:
+Share — copy and redistribute the material in any medium or format.
+Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+Attribution — You must give appropriate credit, provide a link to the license, and
+indicate if changes were made. You may do so in any reasonable manner, but not in any way
+that suggests the licensor endorses you or your use.
+
+ShareAlike — If you remix, transform, or build upon the material, you must distribute
+your contributions under the same license as the original.
+
+No additional restrictions — You may not apply legal terms or technological measures that
+legally restrict others from doing anything the license permits.
+
+Notices:
+
+You do not have to comply with the license for elements of the material in the public
+domain or where your use is permitted by an applicable exception or limitation.
+No warranties are given. The license may not give you all of the permissions necessary
+for your intended use. For example, other rights such as publicity, privacy, or moral
+rights may limit how you use the material.
+
+For more details:
+http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/games/minetest_game/mods/xpanes/textures/xpanes_bar.png b/games/minetest_game/mods/xpanes/textures/xpanes_bar.png
index 4d17ceb..3ea62a9 100644
Binary files a/games/minetest_game/mods/xpanes/textures/xpanes_bar.png and b/games/minetest_game/mods/xpanes/textures/xpanes_bar.png differ
diff --git a/games/minetest_game/mods/xpanes/textures/xpanes_bar_top.png b/games/minetest_game/mods/xpanes/textures/xpanes_bar_top.png
new file mode 100644
index 0000000..887518a
Binary files /dev/null and b/games/minetest_game/mods/xpanes/textures/xpanes_bar_top.png differ
diff --git a/games/minetest_game/mods/xpanes/textures/xpanes_grey.png b/games/minetest_game/mods/xpanes/textures/xpanes_grey.png
deleted file mode 100644
index e1c6f76..0000000
Binary files a/games/minetest_game/mods/xpanes/textures/xpanes_grey.png and /dev/null differ
diff --git a/games/minetest_game/mods/xpanes/textures/xpanes_white.png b/games/minetest_game/mods/xpanes/textures/xpanes_white.png
index 777bd60..a2f4b63 100644
Binary files a/games/minetest_game/mods/xpanes/textures/xpanes_white.png and b/games/minetest_game/mods/xpanes/textures/xpanes_white.png differ
diff --git a/games/minetest_game/settingtypes.txt b/games/minetest_game/settingtypes.txt
new file mode 100644
index 0000000..eeea0bf
--- /dev/null
+++ b/games/minetest_game/settingtypes.txt
@@ -0,0 +1,45 @@
+# This file contains settings of minetest_game that can be changed in
+# minetest.conf
+
+#    In creative mode players are able to dig all kind of blocks nearly
+#    instantly, and have access to unlimited resources.
+#    Some of the functionality is only available if this setting is present
+#    at startup.
+creative_mode (Creative mode) bool false
+
+#    Flammable nodes will be ignited by nearby igniters. Spreading fire may
+#    cause severe destruction.
+#    Spreading fire nodes will disappear when fire is disabled, but
+#    'permanent_flame' nodes are unaffected.
+enable_fire (Fire) bool true
+
+#    Enable flame sound.
+flame_sound (Flame sound) bool true
+
+#    If enabled, steel tools, torches and cobblestone will be given to new
+#    players.
+give_initial_stuff (Give initial items) bool false
+
+#    If enabled, players respawn at the bed they last lay on instead of normal
+#    spawn.
+#    This setting is only read at startup.
+enable_bed_respawn (Respawn at bed) bool true
+
+#    If enabled, the night can be skipped if more than half of the players are
+#    in beds.
+enable_bed_night_skip (Skip night when sleeping) bool true
+
+#    When TNT explodes, it destroys nearby nodes and damages nearby players.
+#    This setting is disabled by default on servers.
+enable_tnt (TNT) bool true
+
+#    The radius in which nodes will be destroyed by a TNT explosion.
+tnt_radius (TNT radius) int 3 0
+
+#    The time in seconds after which the bones of a dead player can be looted
+#    by everyone.
+#    Setting this to 0 will disable sharing of bones completely.
+share_bones_time (Bone share time) int 1200 0
+
+#    Replaces old stairs with new ones. Only required for older worlds.
+enable_stairs_replace_abm (Replace old stairs) bool false
diff --git a/minetest.conf.example b/minetest.conf.example
index 5090a62..867d985 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -38,7 +38,7 @@
 #    type: bool
 # noclip = false
 
-#    Smooths camera when moving and looking around.
+#    Smooths camera when looking around. Also called look or mouse smoothing.
 #    Useful for recording videos.
 #    type: bool
 # cinematic = false
@@ -83,6 +83,20 @@
 #    type: bool
 # continuous_forward = false
 
+#    Enable Joysticks
+#    type: bool
+# enable_joysticks = false
+
+#    The time in seconds it takes between repeated events
+#    when holding down a joystick button combination.
+#    type: float
+# repeat_joystick_button_time = 0.17
+
+#    The sensitivity of the joystick axes for moving the
+#    ingame view frustum around.
+#    type: float
+# joystick_frustum_sensitivity = 170
+
 #    Key for moving the player forward.
 #    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
 #    type: key
@@ -159,10 +173,15 @@
 #    type: key
 # keymap_noclip = KEY_KEY_H
 
+#    Key for toggling autorun.
+#    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+#    type: key
+# keymap_autorun =
+
 #    Key for toggling cinematic mode.
 #    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
 #    type: key
-# keymap_cinematic = KEY_F8
+# keymap_cinematic =
 
 #    Key for toggling display of minimap.
 #    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
@@ -194,7 +213,7 @@
 #    type: key
 # keymap_toggle_force_fog_off = KEY_F3
 
-#    Key for toggling the camrea update. Only used for development
+#    Key for toggling the camera update. Only used for development
 #    See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
 #    type: key
 # keymap_toggle_update_camera =
@@ -247,7 +266,7 @@
 #    Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.
 #    Disabling this option will protect your password better.
 #    type: bool
-# send_pre_v25_init = true
+# send_pre_v25_init = false
 
 #    Save the map received by the client on disk.
 #    type: bool
@@ -355,7 +374,7 @@
 
 #### Shaders
 
-#    Shaders allow advanced visul effects and may increase performance on some video cards.
+#    Shaders allow advanced visual effects and may increase performance on some video cards.
 #    Thy only work with the OpenGL video backend.
 #    type: bool
 # enable_shaders = true
@@ -454,8 +473,7 @@
 # pause_fps_max = 20
 
 #    View distance in nodes.
-#    Min = 20
-#    type: int
+#    type: int min: 20 max: 4000
 # viewing_range = 100
 
 #    Width component of the initial window size.
@@ -482,6 +500,11 @@
 #    type: int min: 30 max: 160
 # fov = 72
 
+#    Field of view while zooming in degrees.
+#    This requires the "zoom" privilege on the server.
+#    type: int min: 15 max: 160
+# zoom_fov = 15
+
 #    Adjust the gamma encoding for the light tables. Lower numbers are brighter.
 #    This setting is for the client only and is ignored by the server.
 #    type: float min: 1 max: 3
@@ -591,6 +614,10 @@
 #    type: bool
 # inventory_items_animations = false
 
+#    Fraction of the visible distance at which fog starts to be rendered
+#    type: float min: 0 max: 0.99
+# fog_start = 0.4
+
 ### Menus
 
 #    Use a cloud animation for the main menu background.
@@ -614,7 +641,7 @@
 #    When gui_scaling_filter_txr2img is true, copy those images
 #    from hardware to software for scaling.  When false, fall back
 #    to the old scaling method, for video drivers that don't
-#    propery support downloading textures back from hardware.
+#    properly support downloading textures back from hardware.
 #    type: bool
 # gui_scaling_filter_txr2img = true
 
@@ -631,7 +658,7 @@
 # font_path = fonts/liberationsans.ttf
 
 #    type: int
-# font_size = 15
+# font_size = 16
 
 #    Font shadow offset, if 0 then shadow will not be drawn.
 #    type: int
@@ -639,7 +666,7 @@
 
 #    Font shadow alpha (opaqueness, between 0 and 255).
 #    type: int min: 0 max: 255
-# font_shadow_alpha = 128
+# font_shadow_alpha = 127
 
 #    type: path
 # mono_font_path = fonts/liberationmono.ttf
@@ -732,6 +759,12 @@
 #    type: string
 # serverlist_url = servers.minetest.net
 
+#    Disable escape sequences, e.g. chat coloring.
+#    Use this if you want to run a server with pre-0.4.14 clients and you want to disable
+#    the escape sequences generated by mods.
+#    type: bool
+# disable_escape_sequences = false
+
 ## Network
 
 #    Network port to listen (UDP).
@@ -764,11 +797,11 @@
 
 ### Advanced
 
-#    How many blocks are flying in the wire simultaneously per client.
+#    Maximum number of blocks that are simultaneously sent per client.
 #    type: int
 # max_simultaneous_block_sends_per_client = 10
 
-#    How many blocks are flying in the wire simultaneously for the whole server.
+#    Maximum number of blocks that are simultaneously sent in total.
 #    type: int
 # max_simultaneous_block_sends_server_total = 40
 
@@ -953,18 +986,6 @@
 #    type: enum values: legacy, log, error
 # deprecated_lua_api_handling = legacy
 
-#    Useful for mod developers.
-#    type: bool
-# mod_profiling = false
-
-#    Detailed mod profile data. Useful for mod developers.
-#    type: bool
-# detailed_profiling = false
-
-#    Profiler data print interval. 0 = disable. Useful for developers.
-#    type: int
-# profiler_print_interval = 0
-
 #    Number of extra blocks that can be loaded by /clearobjects at once.
 #    This is a trade-off between sqlite transaction overhead and
 #    memory consumption (4096=100MB, as a rule of thumb).
@@ -978,7 +999,7 @@
 
 #    Maximum number of statically stored objects in a block.
 #    type: int
-# max_objects_per_block = 49
+# max_objects_per_block = 64
 
 #    See http://www.sqlite.org/pragma.html#pragma_synchronous
 #    type: enum values: 0, 1, 2
@@ -1019,12 +1040,20 @@
 #    type: float
 # liquid_update = 1.0
 
+#    At this distance the server will aggressively optimize which blocks are sent to clients.
+#    Small values potentially improve performance a lot, at the expense of visible rendering glitches.
+#    (some blocks will not be rendered under water and in caves, as well as sometimes on land)
+#    Setting this to a value greater than max_block_send_distance disables this optimization.
+#    Stated in mapblocks (16 nodes)
+#    type: int min: 2
+# block_send_optimize_distance = 4
+
 ## Mapgen
 
 #    Name of map generator to be used when creating a new world.
 #    Creating a world in the main menu will override this.
 #    type: enum values: v5, v6, v7, flat, valleys, fractal, singlenode
-# mg_name = v6
+# mg_name = v7
 
 #    Water surface level of the world.
 #    type: int
@@ -1046,8 +1075,6 @@
 #    Global map generation attributes.
 #    In Mapgen v6 the 'decorations' flag controls all decorations except trees
 #    and junglegrass, in all other mapgens this flag controls all decorations.
-#    The default flags set in the engine are: caves, light, decorations
-#    The flags string modifies the engine defaults.
 #    Flags that are not specified in the flag string are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 #    type: flags possible values: caves, dungeons, light, decorations, nocaves, nodungeons, nolight, nodecorations
@@ -1083,6 +1110,25 @@
 #    type: int
 # num_emerge_threads = 1
 
+#### Noise parameters and formats
+
+#    Noise parameters can be specified as a set of positional values, for example:
+#    Offset, scale, (spread factors), seed offset, number of octaves, persistence, lacunarity
+# mgv6_np_terrain_base = -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0
+#    Or the group format can be used instead, for example:
+# mgv6_np_terrain_base = {
+#    offset      = -4,
+#    scale       = 20,
+#    spread      = (250, 250, 250),
+#    seed        = 82341,
+#    octaves     = 5,
+#    persistence = 0.6,
+#    lacunarity  = 2.0,
+#    flags       = "defaults"
+# }
+#    Only the group format supports noise flags which are needed for eased noise.
+#    Mgv5 uses eased noise for np_ground so this is shown in group format below.
+
 #    Noise parameters for biome API temperature, humidity and biome blend.
 #    type: noise_params
 # mg_biome_np_heat = 50, 50, (750, 750, 750), 5349, 3, 0.5, 2.0
@@ -1117,12 +1163,24 @@
 #    type: noise_params
 # mgv5_np_cave2 = 0, 12, (50, 50, 50), 10325, 4, 0.5, 2.0
 
+#    Noise parameters in group format, unsupported by advanced settings
+#    menu but settable in minetest.conf.
+#    See documentation of noise parameter formats above.
+# mgv5_np_ground = {
+#    offset      = 0,
+#    scale       = 40,
+#    spread      = (80, 80, 80),
+#    seed        = 983240,
+#    octaves     = 4,
+#    persistence = 0.55,
+#    lacunarity  = 2.0,
+#    flags       = "eased"
+# }
+
 #### Mapgen v6
 
 #    Map generation attributes specific to Mapgen v6.
 #    When snowbiomes are enabled jungles are automatically enabled, the 'jungles' flag is ignored.
-#    The default flags set in the engine are: biomeblend, mudflow
-#    The flags string modifies the engine defaults.
 #    Flags that are not specified in the flag string are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 #    type: flags possible values: jungles, biomeblend, mudflow, snowbiomes, flat, trees, nojungles, nobiomeblend, nomudflow, nosnowbiomes, noflat, notrees
@@ -1172,17 +1230,33 @@
 #### Mapgen v7
 
 #    Map generation attributes specific to Mapgen v7.
-#    The 'ridges' flag controls the rivers.
-#    The default flags set in the engine are: mountains, ridges
-#    The flags string modifies the engine defaults.
+#    The 'ridges' flag enables the rivers.
+#    Floatlands are currently experimental and subject to change.
 #    Flags that are not specified in the flag string are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
-#    type: flags possible values: mountains, ridges, nomountains, noridges
+#    type: flags possible values: mountains, ridges, floatlands, nomountains, noridges, nofloatlands
 # mgv7_spflags = mountains,ridges
 
 #    Controls width of tunnels, a smaller value creates wider tunnels.
 #    type: float
-# mgv7_cave_width = 0.3
+# mgv7_cave_width = 0.09
+
+#    Controls the density of floatland mountain terrain.
+#    Is an offset added to the 'np_mountain' noise value.
+#    type: float
+# mgv7_float_mount_density = 0.6
+
+#    Typical maximum height, above and below midpoint, of floatland mountain terrain.
+#    type: float
+# mgv7_float_mount_height = 128.0
+
+#    Y-level of floatland midpoint and lake surface.
+#    type: int
+# mgv7_floatland_level = 1280
+
+#    Y-level to which floatland shadows extend.
+#    type: int
+# mgv7_shadow_limit = 1024
 
 #    type: noise_params
 # mgv7_np_terrain_base = 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0
@@ -1206,23 +1280,27 @@
 # mgv7_np_ridge_uwater = 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0
 
 #    type: noise_params
+# mgv7_np_floatland_base = -0.6, 1.5, (600, 600, 600), 114, 5, 0.6, 2.0
+
+#    type: noise_params
+# mgv7_np_float_base_height = 48, 24, (300, 300, 300), 907, 4, 0.7, 2.0
+
+#    type: noise_params
 # mgv7_np_mountain = -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0
 
 #    type: noise_params
 # mgv7_np_ridge = 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0
 
 #    type: noise_params
-# mgv7_np_cave1 = 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0
+# mgv7_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
 
 #    type: noise_params
-# mgv7_np_cave2 = 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0
+# mgv7_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 #### Mapgen flat
 
 #    Map generation attributes specific to Mapgen flat.
 #    Occasional lakes and hills can be added to the flat world.
-#    The default flags set in the engine are: none
-#    The flags string modifies the engine defaults.
 #    Flags that are not specified in the flag string are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 #    type: flags possible values: lakes, hills, , nolakes, nohills
@@ -1238,7 +1316,7 @@
 
 #    Controls width of tunnels, a smaller value creates wider tunnels.
 #    type: float
-# mgflat_cave_width = 0.3
+# mgflat_cave_width = 0.09
 
 #    Terrain noise threshold for lakes.
 #    Controls proportion of world area covered by lakes.
@@ -1270,16 +1348,16 @@
 # mgflat_np_filler_depth = 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
 
 #    type: noise_params
-# mgflat_np_cave1 = 0, 12, (128, 128, 128), 52534, 4, 0.5, 2.0
+# mgflat_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
 
 #    type: noise_params
-# mgflat_np_cave2 = 0, 12, (128, 128, 128), 10325, 4, 0.5, 2.0
+# mgflat_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 #### Mapgen fractal
 
 #    Controls width of tunnels, a smaller value creates wider tunnels.
 #    type: float
-# mgfractal_cave_width = 0.3
+# mgfractal_cave_width = 0.09
 
 #    Choice of 18 fractals from 9 formulas.
 #    1 = 4D "Roundy" mandelbrot set.
@@ -1354,10 +1432,10 @@
 # mgfractal_np_filler_depth = 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
 
 #    type: noise_params
-# mgfractal_np_cave1 = 0, 12, (128, 128, 128), 52534, 4, 0.5, 2.0
+# mgfractal_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
 
 #    type: noise_params
-# mgfractal_np_cave2 = 0, 12, (128, 128, 128), 10325, 4, 0.5, 2.0
+# mgfractal_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 #### Mapgen Valleys
 
@@ -1367,8 +1445,6 @@
 #    'altitude_chill' makes higher elevations colder, which may cause biome issues.
 #    'humid_rivers' modifies the humidity around rivers and in areas where water would tend to pool,
 #    it may interfere with delicately adjusted biomes.
-#    The default flags set in the engine are: altitude_chill, humid_rivers
-#    The flags string modifies the engine defaults.
 #    Flags that are not specified in the flag string are not modified from the default.
 #    Flags starting with 'no' are used to explicitly disable them.
 #    type: flags possible values: altitude_chill, noaltitude_chill, humid_rivers, nohumid_rivers
@@ -1406,17 +1482,17 @@
 
 #    Controls width of tunnels, a smaller value creates wider tunnels.
 #    type: float
-# mgvalleys_cave_width = 0.3
+# mgvalleys_cave_width = 0.09
 
 ##### Noises
 
 #    Caves and tunnels form at the intersection of the two noises
 #    type: noise_params
-# mgvalleys_np_cave1 = 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0
+# mgvalleys_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
 
 #    Caves and tunnels form at the intersection of the two noises
 #    type: noise_params
-# mgvalleys_np_cave2 = 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0
+# mgvalleys_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
 #    The depth of dirt or other filler
 #    type: noise_params
@@ -1461,11 +1537,68 @@
 #    type: string
 # secure.trusted_mods =
 
-#    Comma-seperated list of mods that are allowed to access HTTP APIs, which
+#    Comma-separated list of mods that are allowed to access HTTP APIs, which
 #    allow them to upload and download data to/from the internet.
 #    type: string
 # secure.http_mods =
 
+## Advanced
+
+### Profiling
+
+#    Load the game profiler to collect game profiling data.
+#    Provides a /profiler command to access the compiled profile.
+#    Useful for mod developers and server operators.
+#    type: bool
+# profiler.load = false
+
+#    The default format in which profiles are being saved,
+#    when calling `/profiler save [format]` without format.
+#    type: enum values: txt, csv, lua, json, json_pretty
+# profiler.default_report_format = txt
+
+#    The file path relative to your worldpath in which profiles will be saved to.
+#    
+#    type: string
+# profiler.report_path = ""
+
+#### Instrumentation
+
+#    Instrument the methods of entities on registration.
+#    type: bool
+# instrument.entity = true
+
+#    Instrument the action function of Active Block Modifiers on registration.
+#    type: bool
+# instrument.abm = true
+
+#    Instrument the action function of Loading Block Modifiers on registration.
+#    type: bool
+# instrument.lbm = true
+
+#    Instrument chatcommands on registration.
+#    type: bool
+# instrument.chatcommand = true
+
+#    Instrument global callback functions on registration.
+#    (anything you pass to a minetest.register_*() function)
+#    type: bool
+# instrument.global_callback = true
+
+##### Advanced
+
+#    Instrument builtin.
+#    This is usually only needed by core/builtin contributors
+#    type: bool
+# instrument.builtin = false
+
+#    Have the profiler instrument itself:
+#    * Instrument an empty function.
+#    This estimates the overhead, that instrumentation is adding (+1 function call).
+#    * Instrument the sampler being used to update the statistics.
+#    type: bool
+# instrument.profiler = false
+
 #
 # Client and Server
 #
@@ -1478,7 +1611,7 @@
 
 #    Set the language. Leave empty to use the system language.
 #    A restart is required after changing this.
-#    type: enum values: , be, cs, da, de, eo, es, et, fr, hu, id, it, ja, jbo, ko, ky, lt, nb, nl, pl, pt, pt_BR, ro, ru, tr, uk, zh_CN, zh_TW
+#    type: enum values: , be, ca, cs, da, de, en, eo, es, et, fr, he, hu, id, it, ja, jbo, ko, ky, lt, nb, nl, pl, pt, pt_BR, ro, ru, sr_Cyrl, tr, uk, zh_CN, zh_TW
 # language =
 
 #    Level of logging to be written to debug.txt:
@@ -1538,3 +1671,7 @@
 #    type: string
 # modstore_details_url = https://forum.minetest.net/mmdb/mod/*/
 
+#    Print the engine's profiling data in regular intervals (in seconds). 0 = disable. Useful for developers.
+#    type: int
+# profiler_print_interval = 0
+
diff --git a/misc/minetest-xorg-icon-128.png b/misc/minetest-xorg-icon-128.png
new file mode 100644
index 0000000..0241a91
Binary files /dev/null and b/misc/minetest-xorg-icon-128.png differ
diff --git a/misc/minetest.appdata.xml b/misc/minetest.appdata.xml
index 19d0428..65acf96 100644
--- a/misc/minetest.appdata.xml
+++ b/misc/minetest.appdata.xml
@@ -32,6 +32,15 @@
 		<screenshot width="1920" height="1080">http://www.minetest.net/media/gallery/3.jpg</screenshot>
 		<screenshot width="1920" height="1080">http://www.minetest.net/media/gallery/5.jpg</screenshot>
 	</screenshots>
+	<keywords>
+		<keyword>sandbox</keyword>
+		<keyword>world</keyword>
+		<keyword>mining</keyword>
+		<keyword>multiplayer</keyword>
+	</keywords>
 	<url type="homepage">http://minetest.net</url>
+	<url type="bugtracker">http://www.minetest.net/development/#reporting-issues</url>
+	<url type="translate">http://dev.minetest.net/Translation</url>
+	<url type="donation">http://www.minetest.net/development/#donate</url>
 	<updatecontact>sfan5 at live.de</updatecontact>
 </application>
diff --git a/misc/minetest.desktop b/misc/minetest.desktop
index 1d2430a..ca493c4 100644
--- a/misc/minetest.desktop
+++ b/misc/minetest.desktop
@@ -12,6 +12,6 @@ Exec=minetest
 Icon=minetest
 Terminal=false
 Type=Application
-Categories=Game;
+Categories=Game;Simulation;
 StartupNotify=false
 Keywords=sandbox;world;mining;crafting;blocks;nodes;multiplayer;roleplaying;
diff --git a/misc/minetest.exe.manifest b/misc/minetest.exe.manifest
new file mode 100644
index 0000000..3c32b0f
--- /dev/null
+++ b/misc/minetest.exe.manifest
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+        <security>
+            <requestedPrivileges>
+                <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
+            </requestedPrivileges>
+        </security>
+    </trustInfo>
+    <application xmlns="urn:schemas-microsoft-com:asm.v3">
+        <windowsSettings>
+            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
+        </windowsSettings>
+    </application>
+</assembly>
diff --git a/po/be/minetest.po b/po/be/minetest.po
index c8a707a..25d8bf0 100644
--- a/po/be/minetest.po
+++ b/po/be/minetest.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
 "PO-Revision-Date: 2013-11-23 17:37+0100\n"
 "Last-Translator: Selat <LongExampleTestName at gmail.com>\n"
 "Language-Team: Belarusian\n"
@@ -583,6 +583,10 @@ msgid "Particles"
 msgstr ""
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr ""
 
@@ -931,6 +935,10 @@ msgstr ""
 msgid "Use"
 msgstr ""
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr ""
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr ""
@@ -1247,10 +1255,6 @@ msgstr ""
 msgid "X Button 2"
 msgstr ""
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1317,6 +1321,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1391,6 +1399,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr ""
 
@@ -1423,6 +1435,10 @@ msgid "Build inside player"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr ""
 
@@ -1463,6 +1479,10 @@ msgid "Chat toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1535,14 +1555,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1689,6 +1709,10 @@ msgid "Default privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1705,6 +1729,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1735,22 +1763,26 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1778,6 +1810,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr ""
 
@@ -1860,6 +1896,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -1920,11 +1964,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2058,12 +2112,14 @@ msgid "Generate normalmaps"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2094,6 +2150,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2122,15 +2187,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2224,6 +2280,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2258,6 +2348,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2417,6 +2515,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2452,7 +2557,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2603,6 +2708,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2635,8 +2755,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2646,8 +2764,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2658,8 +2774,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2669,8 +2783,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3029,6 +3141,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3070,17 +3190,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3092,10 +3216,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr ""
 
@@ -3136,10 +3256,6 @@ msgid "Mipmapping"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3344,11 +3460,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3356,7 +3478,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3391,6 +3513,10 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr ""
 
@@ -3548,7 +3674,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3585,7 +3711,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3664,10 +3790,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3683,6 +3821,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3698,6 +3842,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3800,10 +3950,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -3929,7 +4075,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
diff --git a/po/ca/minetest.po b/po/ca/minetest.po
index c81cfa7..eaf350f 100644
--- a/po/ca/minetest.po
+++ b/po/ca/minetest.po
@@ -7,9 +7,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-04-20 13:21+0000\n"
-"Last-Translator: Joan Ciprià Moreno Teodoro <joancipria at gmail.com>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-26 09:14+0000\n"
+"Last-Translator: tonibm19 <bennasar99 at gmail.com>\n"
 "Language-Team: Catalan <https://hosted.weblate.org/projects/minetest/"
 "minetest/ca/>\n"
 "Language: ca\n"
@@ -17,11 +17,11 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr "S'ha produït un error en un script Lua, com per exemple un mod :"
+msgstr "S'ha produït un error en un script Lua, com per exemple un mod."
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
@@ -412,9 +412,8 @@ msgid "Uninstall selected modpack"
 msgstr "Desinstal·lar el paquet de mods seleccionat"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "Adreça / Port:"
+msgstr "Adreça / Port"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
@@ -434,16 +433,15 @@ msgstr "Dany activat"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Del. Favorite"
-msgstr ""
+msgstr "Esborra preferit"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Favorite"
-msgstr ""
+msgstr "Preferit"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Nom / Contrasenya:"
+msgstr "Nom / Contrasenya"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -520,9 +518,8 @@ msgid "8x"
 msgstr "8x"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Advanced Settings"
-msgstr "Configuració"
+msgstr "Configuració avançada"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Antialiasing:"
@@ -537,7 +534,6 @@ msgid "Bilinear Filter"
 msgstr "Filtre Bilineal"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
 msgstr "Mapat de relleu"
 
@@ -546,9 +542,8 @@ msgid "Change keys"
 msgstr "Configurar controls"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Connected Glass"
-msgstr "Connectar"
+msgstr "Vidres connectats"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Fancy Leaves"
@@ -589,7 +584,7 @@ msgstr "Ningun"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Normal Mapping"
-msgstr ""
+msgstr "Mapping normal."
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
@@ -604,9 +599,13 @@ msgid "Parallax Occlusion"
 msgstr "Oclusió de paral·laxi"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "Activar tot"
+msgstr "Partícules"
+
+#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Reiniciar el mon individual"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
@@ -984,6 +983,10 @@ msgstr "Activar noclip"
 msgid "Use"
 msgstr "Utilitzar"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "Premsa una tecla"
@@ -1305,11 +1308,6 @@ msgstr "X Botó 1"
 msgid "X Button 2"
 msgstr "X Botó 2"
 
-#: src/keycode.cpp
-#, fuzzy
-msgid "Zoom"
-msgstr "Zoom"
-
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid ""
@@ -1399,6 +1397,11 @@ msgid "Active Block Modifier interval"
 msgstr "Rang del bloc actiu"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "Rang del bloc actiu"
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr "Rang del bloc actiu"
 
@@ -1430,6 +1433,9 @@ msgid ""
 "Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n"
 "This setting is for the client only and is ignored by the server."
 msgstr ""
+"Ajusta la codificació gamma per les taules de llum. Els nombrés nés petits "
+"n'augmentaràn la brillantor.\n"
+"Aquesta configuració només afecta al client, el servidor l'ignora."
 
 #: src/settings_translation_file.cpp
 msgid "Advanced"
@@ -1482,6 +1488,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr "Automàticament informar a la llista del servidor."
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "Tecla de retrocés"
 
@@ -1515,6 +1525,10 @@ msgid "Build inside player"
 msgstr "Construir dins el jugador"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Mapat de relleu"
 
@@ -1540,7 +1554,7 @@ msgstr "Soroll de cova #2"
 
 #: src/settings_translation_file.cpp
 msgid "Cave width"
-msgstr ""
+msgstr "Amplada de les coves"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1555,6 +1569,10 @@ msgid "Chat toggle key"
 msgstr "Tecla alternativa per al xat"
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Comands de xat"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1646,6 +1664,15 @@ msgstr "Boira de color"
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Llista de mods separada per comes que tenen permís per accedir a les APIs "
+"HTTP,\n"
+"les quals els permeten pujar/descarregar informació de/cap a internet."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Comma-separated list of trusted mods that are allowed to access insecure\n"
 "functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
@@ -1655,15 +1682,6 @@ msgstr ""
 "request_insecure_environment ())."
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Llista de mods separada per comes que tenen permís per accedir a les APIs "
-"HTTP,\n"
-"les quals els permeten pujar/descarregar informació de/cap a internet."
-
-#: src/settings_translation_file.cpp
 msgid "Command key"
 msgstr "Tecla comandament"
 
@@ -1733,6 +1751,7 @@ msgstr "Controla la pendent i alçada dels turons."
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
 msgstr ""
+"Controla l'amplada dels túnels, un valor més petit crea túnels més amples."
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
@@ -1819,6 +1838,10 @@ msgid "Default privileges"
 msgstr "Privilegis per defecte"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1837,6 +1860,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Retràs per enviar blocs després de col•locarlos"
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1846,11 +1873,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "Profunditat davall la qual trobaràs grans coves."
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find massive caves."
-msgstr ""
+msgstr "Profunditat davall la qual podràs trobar coves gegants."
 
 #: src/settings_translation_file.cpp
 msgid "Descending speed"
@@ -1867,22 +1894,26 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1910,9 +1941,12 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
-msgstr "Activar MP"
+msgstr "Activar VBO"
 
 #: src/settings_translation_file.cpp
 msgid "Enable mod security"
@@ -1993,6 +2027,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2055,11 +2097,23 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Camp de visió mentre s'usa el zoom (en graus)\n"
+"Això requereix el privilegi \"zoom\" en el servidor."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2193,12 +2247,14 @@ msgid "Generate normalmaps"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2213,9 +2269,8 @@ msgid "Gravity"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "HTTP Mods"
-msgstr "Mods"
+msgstr "Mods HTTP"
 
 #: src/settings_translation_file.cpp
 msgid "HUD toggle key"
@@ -2230,6 +2285,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2258,15 +2322,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2360,6 +2415,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2394,6 +2483,16 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "Interval de repetició del click dret"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "Sensibilitat del ratolí"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2431,14 +2530,14 @@ msgid "Jumping speed"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Key for decreasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Tecla per obrir el inventari.\n"
-"Veure http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Tecla per disminuir el rang de visió.\n"
+"Mira\n"
+"http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2449,14 +2548,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Key for increasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Tecla per obrir el inventari.\n"
-"Veure http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Tecla per incrementar el rang de visió.\n"
+"Mira\n"
+"http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2578,6 +2677,17 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tecla per botar.\n"
+"Veure http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
@@ -2613,11 +2723,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tecla per moure el jugador cap a l'esquerra.\n"
+"Veure http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2765,6 +2879,22 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "Rang del bloc actiu"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2797,8 +2927,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2808,8 +2936,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2820,8 +2946,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2831,8 +2955,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2880,14 +3002,12 @@ msgid "Mapgen flags"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat"
-msgstr "Generador de mapes"
+msgstr "Generador de mapes plans"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat cave width"
-msgstr "Generador de mapes"
+msgstr "Amplada de les coves del generador de mapes plans"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave1 noise parameters"
@@ -3195,6 +3315,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3236,17 +3364,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3258,10 +3390,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr ""
 
@@ -3302,10 +3430,6 @@ msgid "Mipmapping"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3510,11 +3634,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3522,7 +3652,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3557,6 +3687,11 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Seleccioneu la ruta"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "Tecla dreta"
 
@@ -3714,7 +3849,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3751,10 +3886,10 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
-"Suavitza la càmera quan estiga movent-se i mirant al seu voltant.\n"
+"Suavitzat de càmara durant el seu moviment.\n"
 "Útil per a la gravació de vídeos."
 
 #: src/settings_translation_file.cpp
@@ -3833,10 +3968,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3852,6 +3999,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3866,6 +4019,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"El temps en segons que es pren entre la repetició de clicks drets quan "
+"s'està mantenint el botó dret del ratolí."
+
+#: src/settings_translation_file.cpp
 msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
@@ -3971,10 +4133,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4049,9 +4207,8 @@ msgid "Walking speed"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Water Features"
-msgstr "Textures de objectes ..."
+msgstr "Característiques de l'aigua"
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
@@ -4101,7 +4258,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4180,6 +4337,8 @@ msgid ""
 "World directory (everything in the world is stored here).\n"
 "Not needed if starting from the main menu."
 msgstr ""
+"Directori del món (totes les seves dades es guarden aquí).\n"
+"No necessari si s'inicia des de el menú principal."
 
 #: src/settings_translation_file.cpp
 msgid "Y of flat ground."
@@ -4201,14 +4360,14 @@ msgstr ""
 msgid "cURL timeout"
 msgstr ""
 
-#~ msgid "No!!!"
-#~ msgstr "No!!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generar Mapes Normals"
+#~ msgid "No of course not!"
+#~ msgstr "No, per descomptat que no!"
 
 #~ msgid "Public Serverlist"
 #~ msgstr "Llista de servidors públics"
 
-#~ msgid "No of course not!"
-#~ msgstr "No, per descomptat que no!"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generar Mapes Normals"
+
+#~ msgid "No!!!"
+#~ msgstr "No!!!"
diff --git a/po/cs/minetest.po b/po/cs/minetest.po
index a3d57a4..c7d1720 100644
--- a/po/cs/minetest.po
+++ b/po/cs/minetest.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-03-04 04:45+0000\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-25 11:59+0000\n"
 "Last-Translator: Jakub Vaněk <vanek.jakub4 at seznam.cz>\n"
 "Language-Team: Czech <https://hosted.weblate.org/projects/minetest/minetest/"
 "cs/>\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 2.5-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
@@ -214,7 +214,7 @@ msgstr "(Nebyl zadán popis nastavení)"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "< Back to Settings page"
-msgstr ""
+msgstr "< Zpět do Nastavení"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Browse"
@@ -406,9 +406,8 @@ msgid "Uninstall selected modpack"
 msgstr "Odinstalovat označený balíček"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "Adresa / Port :"
+msgstr "Adresa / Port"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
@@ -432,14 +431,12 @@ msgid "Del. Favorite"
 msgstr "Oblíbené:"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Favorite"
-msgstr "Oblíbené:"
+msgstr "Oblíbené"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Jméno / Heslo :"
+msgstr "Jméno / Heslo"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -485,7 +482,7 @@ msgstr "Veřejný"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "Select World:"
-msgstr "Vyber svět:"
+msgstr "Vyberte svět:"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Server"
@@ -501,20 +498,19 @@ msgstr "Spustit hru"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "2x"
-msgstr ""
+msgstr "2x"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "3D Clouds"
 msgstr "3D mraky"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "4x"
-msgstr ""
+msgstr "4x"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "8x"
-msgstr ""
+msgstr "8x"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Advanced Settings"
@@ -522,14 +518,13 @@ msgstr "Pokročilá nastavení"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Antialiasing:"
-msgstr ""
+msgstr "Antialiasing:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Are you sure to reset your singleplayer world?"
 msgstr "Jste si jisti, že chcete resetovat místní svět?"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bilinear Filter"
 msgstr "Bilineární filtrování"
 
@@ -565,7 +560,7 @@ msgstr "Ne"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No Filter"
-msgstr "Žádné filtr"
+msgstr "Žádné filtrování"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No Mipmap"
@@ -573,12 +568,11 @@ msgstr "Žádné Mipmapy"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Node Highlighting"
-msgstr "Zvýraznění bloků"
+msgstr "Osvícení bloku"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Outlining"
-msgstr "Zvýraznění bloků"
+msgstr "Obrys bloku"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
@@ -599,12 +593,15 @@ msgstr "Neprůhledná voda"
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Parallax Occlusion"
-msgstr "Parallax Occlusion"
+msgstr "Paralaxní okluze"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "Povolit částice"
+msgstr "Částice"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Reset místního světa"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
@@ -619,7 +616,6 @@ msgid "Simple Leaves"
 msgstr "Jednoduché listí"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Smooth Lighting"
 msgstr "Plynulé osvětlení"
 
@@ -640,22 +636,18 @@ msgid "Touchthreshold (px)"
 msgstr "Dosah dotyku (px)"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Trilinear Filter"
 msgstr "Trilineární filtrování"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Leaves"
 msgstr "Vlnění listů"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Plants"
 msgstr "Vlnění rostlin"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Water"
 msgstr "Vlnění vody"
 
@@ -988,6 +980,10 @@ msgstr "Duch"
 msgid "Use"
 msgstr "Použít"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Přiblížení"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "stiskni klávesu"
@@ -1304,10 +1300,6 @@ msgstr "X Tlačítko 1"
 msgid "X Button 2"
 msgstr "X Tlačítko 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Přiblížení"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1386,6 +1378,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1443,7 +1439,7 @@ msgstr "Anizotropní filtrování"
 
 #: src/settings_translation_file.cpp
 msgid "Announce server"
-msgstr ""
+msgstr "Zveřejnit server"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1451,6 +1447,9 @@ msgid ""
 "If you want to announce your ipv6 address, use  serverlist_url = v6.servers."
 "minetest.net."
 msgstr ""
+"Zveřejnit do tohoto seznamu serverů.\n"
+"Jestliže chcete zveřejnit vaši ipv6 adresu, použijte  serverlist_url = v6."
+"servers.minetest.net."
 
 #: src/settings_translation_file.cpp
 msgid "Approximate (X,Y,Z) scale of fractal in nodes."
@@ -1465,6 +1464,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr "Automaticky hlásit seznamu serverů."
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "Vzad"
 
@@ -1477,9 +1480,8 @@ msgid "Basic"
 msgstr "Základní"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Basic Privileges"
-msgstr "Výchozí práva"
+msgstr "Základní práva"
 
 #: src/settings_translation_file.cpp
 msgid "Bilinear filtering"
@@ -1498,16 +1500,20 @@ msgid "Build inside player"
 msgstr "Stavění uvnitř hráče"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Bump mapování"
 
 #: src/settings_translation_file.cpp
 msgid "Camera smoothing"
-msgstr ""
+msgstr "Plynulost pohybu kamery"
 
 #: src/settings_translation_file.cpp
 msgid "Camera smoothing in cinematic mode"
-msgstr ""
+msgstr "Plynulost pohybu kamery ve filmovém režimu"
 
 #: src/settings_translation_file.cpp
 msgid "Camera update toggle key"
@@ -1522,9 +1528,8 @@ msgid "Cave noise #2"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Cave width"
-msgstr "Šířka obrazovky"
+msgstr "Šířka jeskyně"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1539,6 +1544,10 @@ msgid "Chat toggle key"
 msgstr "Klávesa zobrazení chatu"
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Příkazy"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1611,19 +1620,20 @@ msgstr "Barevná mlha"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
-"Seznam důvěryhodných modů oddělených čárkami, které mohou používat "
-"potenciálně nebezpečné\n"
-"funkce ve chvílích, kdy je zapnuto zabezpečení modů (pomocí "
-"request_insecure_environment())."
+"Seznam modů, oddělených čárkami, které mohou přistupovat k HTTP API,\n"
+"které jim dovoluje nahrávat a stahovat data na/z internetu."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
+"Seznam důvěryhodných modů, oddělených čárkami, které mohou používat\n"
+"nebezpečné funkce i když je zapnuto zabezpečení modů (pomocí "
+"request_insecure_environment())."
 
 #: src/settings_translation_file.cpp
 msgid "Command key"
@@ -1655,11 +1665,11 @@ msgstr "Klávesa konzole"
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward"
-msgstr ""
+msgstr "Neustálý pohyb vpřed"
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward movement (only used for testing)."
-msgstr ""
+msgstr "Neustálý pohyb vpřed (jen pro testování)."
 
 #: src/settings_translation_file.cpp
 msgid "Controls"
@@ -1691,7 +1701,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Ovládá šířku tunelů, menší hodnota vytváří širší tunely."
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
@@ -1711,23 +1721,23 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair alpha"
-msgstr ""
+msgstr "Průhlednost zaměřovače"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Průhlednost zaměřovače (mezi 0 a 255)."
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair color"
-msgstr ""
+msgstr "Barva zaměřovače"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair color (R,G,B)."
-msgstr ""
+msgstr "Barva zaměřovače (R,G,B)."
 
 #: src/settings_translation_file.cpp
 msgid "Crouch speed"
-msgstr ""
+msgstr "Rychlost při plížení"
 
 #: src/settings_translation_file.cpp
 msgid "DPI"
@@ -1774,6 +1784,10 @@ msgid "Default privileges"
 msgstr "Výchozí práva"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1790,6 +1804,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr "Definuje maximální posun hráče v blocích (0 = bez limitu)."
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr "Prodleva před zobrazením bublinové nápovědy, uvádějte v milisekundách."
 
@@ -1799,11 +1817,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "Hloubka pod kterou najdete velké jeskyně."
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find massive caves."
-msgstr ""
+msgstr "Hloubka pod kterou najdete obrovské jeskyně."
 
 #: src/settings_translation_file.cpp
 msgid "Descending speed"
@@ -1822,14 +1840,6 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "Detailní profilovací data modů. Užitečné pro vývojáře modů."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Detailní profilování modů"
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1841,6 +1851,18 @@ msgid "Disable anticheat"
 msgstr "Zakázat anticheat"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "Zakázat prázdná hesla"
 
@@ -1865,6 +1887,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "Povolit VBO"
 
@@ -1954,6 +1980,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2016,11 +2050,23 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Zorné pole při postupném přibližování.\n"
+"Vyžaduje na serveru přidělené právo \"zoom\"."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2091,7 +2137,7 @@ msgstr "Velikost písma"
 
 #: src/settings_translation_file.cpp
 msgid "Format of screenshots."
-msgstr ""
+msgstr "Formát snímků obrazovky."
 
 #: src/settings_translation_file.cpp
 msgid "Forward key"
@@ -2147,19 +2193,21 @@ msgstr "Gamma"
 
 #: src/settings_translation_file.cpp
 msgid "General"
-msgstr ""
+msgstr "Hlavní"
 
 #: src/settings_translation_file.cpp
 msgid "Generate normalmaps"
 msgstr "Generovat normálové mapy"
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2190,6 +2238,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2207,7 +2264,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "How deep to make rivers"
-msgstr ""
+msgstr "Jak hluboké dělat řeky"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2218,22 +2275,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "How wide to make rivers"
-msgstr ""
+msgstr "Jak široké dělat řeky"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6"
@@ -2301,7 +2349,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "If this is set, players will always (re)spawn at the given position."
-msgstr ""
+msgstr "Jestliže je toto nastaveno, hráči se budou oživovat na uvedeném místě."
 
 #: src/settings_translation_file.cpp
 msgid "Ignore world errors"
@@ -2320,6 +2368,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2337,7 +2419,7 @@ msgstr "Klávesa inventáře"
 
 #: src/settings_translation_file.cpp
 msgid "Invert mouse"
-msgstr ""
+msgstr "Invertovat myš"
 
 #: src/settings_translation_file.cpp
 msgid "Invert vertical mouse movement."
@@ -2354,6 +2436,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2388,7 +2478,7 @@ msgstr "Skok"
 
 #: src/settings_translation_file.cpp
 msgid "Jumping speed"
-msgstr ""
+msgstr "Rychlost skákání"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2513,6 +2603,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2548,7 +2645,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2597,7 +2694,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Key use for climbing/descending"
-msgstr ""
+msgstr "Klávesa Použít pro šplhání/slézání"
 
 #: src/settings_translation_file.cpp
 msgid "Language"
@@ -2605,15 +2702,15 @@ msgstr "Jazyk"
 
 #: src/settings_translation_file.cpp
 msgid "Large cave depth"
-msgstr ""
+msgstr "Hloubka velké jeskyně"
 
 #: src/settings_translation_file.cpp
 msgid "Lava Features"
-msgstr ""
+msgstr "Vlastnosti lávy"
 
 #: src/settings_translation_file.cpp
 msgid "Leaves style"
-msgstr ""
+msgstr "Styl listí"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2699,6 +2796,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2731,8 +2843,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2742,8 +2852,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2754,8 +2862,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2765,8 +2871,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2778,7 +2882,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Map save interval"
-msgstr ""
+msgstr "Interval ukládání mapy"
 
 #: src/settings_translation_file.cpp
 msgid "Mapblock limit"
@@ -3082,7 +3186,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave depth"
-msgstr ""
+msgstr "Hloubka obrovské jeskyně"
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave noise"
@@ -3114,7 +3218,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Maximum FPS"
-msgstr ""
+msgstr "Maximální FPS"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum FPS when game is paused."
@@ -3129,6 +3233,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3170,17 +3282,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3192,10 +3308,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "Nabídky"
 
@@ -3205,7 +3317,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Message of the day"
-msgstr ""
+msgstr "Zpráva dne"
 
 #: src/settings_translation_file.cpp
 msgid "Message of the day displayed to players connecting."
@@ -3217,7 +3329,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Minimap"
-msgstr ""
+msgstr "Minimapa"
 
 #: src/settings_translation_file.cpp
 msgid "Minimap key"
@@ -3229,17 +3341,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Minimum texture size for filters"
-msgstr ""
+msgstr "Minimální velikost textury k filtrování"
 
 #: src/settings_translation_file.cpp
 msgid "Mipmapping"
 msgstr "Mip-mapování"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3253,15 +3361,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Monospace font path"
-msgstr ""
+msgstr "Cesta k neproporcionálnímu písmu"
 
 #: src/settings_translation_file.cpp
 msgid "Monospace font size"
-msgstr ""
+msgstr "Velikost neproporcionálního písma"
 
 #: src/settings_translation_file.cpp
 msgid "Mouse sensitivity"
-msgstr ""
+msgstr "Citlivost myši"
 
 #: src/settings_translation_file.cpp
 msgid "Mouse sensitivity multiplier."
@@ -3299,7 +3407,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Network"
-msgstr ""
+msgstr "Síť"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3445,11 +3553,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3457,7 +3571,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3492,24 +3606,29 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Cesta k písmu"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "Klávesa doprava"
 
 #: src/settings_translation_file.cpp
 msgid "Rightclick repetition interval"
-msgstr ""
+msgstr "Interval opakování pravého kliknutí"
 
 #: src/settings_translation_file.cpp
 msgid "River Depth"
-msgstr ""
+msgstr "Hloubka řeky"
 
 #: src/settings_translation_file.cpp
 msgid "River Noise"
-msgstr ""
+msgstr "Hlučnost řeky"
 
 #: src/settings_translation_file.cpp
 msgid "River Size"
-msgstr ""
+msgstr "Velikost řeky"
 
 #: src/settings_translation_file.cpp
 msgid "River noise -- rivers occur close to zero"
@@ -3557,14 +3676,12 @@ msgid "Screenshot folder"
 msgstr "Složka se snímky obrazovky"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot format"
-msgstr "Složka se snímky obrazovky"
+msgstr "Formát snímků obrazovky"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot quality"
-msgstr "Snímek obrazovky"
+msgstr "Kvalita snímků obrazovky"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3572,6 +3689,9 @@ msgid ""
 "1 means worst quality; 100 means best quality.\n"
 "Use 0 for default quality."
 msgstr ""
+"Kvalita snímků obrazovky. Použito jen na formát JPEG.\n"
+"1 znamená nejhorší kvalita; 100 znamená nejlepší kvalita.\n"
+"Použijte 0 pro výchozí kvalitu."
 
 #: src/settings_translation_file.cpp
 msgid "Security"
@@ -3587,11 +3707,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Selection box color"
-msgstr ""
+msgstr "Barva obrysu bloku"
 
 #: src/settings_translation_file.cpp
 msgid "Selection box width"
-msgstr ""
+msgstr "Šířka obrysu bloku"
 
 #: src/settings_translation_file.cpp
 msgid "Server / Singleplayer"
@@ -3651,7 +3771,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3670,7 +3790,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Shutdown message"
-msgstr ""
+msgstr "Zpráva o vypnutí"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3688,7 +3808,7 @@ msgstr "Plynulé osvětlení"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3718,7 +3838,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Static spawnpoint"
-msgstr ""
+msgstr "Stálé místo oživení"
 
 #: src/settings_translation_file.cpp
 msgid "Strength of generated normalmaps."
@@ -3734,7 +3854,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Support older servers"
-msgstr ""
+msgstr "Podpora starších serverů"
 
 #: src/settings_translation_file.cpp
 msgid "Synchronous SQLite"
@@ -3767,10 +3887,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3786,6 +3918,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3801,6 +3939,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3825,7 +3969,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Time speed"
-msgstr ""
+msgstr "Rychlost času"
 
 #: src/settings_translation_file.cpp
 msgid "Timeout for client to remove unused map data from memory."
@@ -3845,7 +3989,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Tooltip delay"
-msgstr ""
+msgstr "Zpoždění nápovědy"
 
 #: src/settings_translation_file.cpp
 msgid "Trilinear filtering"
@@ -3860,7 +4004,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Trusted mods"
-msgstr ""
+msgstr "Důvěryhodné mody"
 
 #: src/settings_translation_file.cpp
 msgid "URL to the server list displayed in the Multiplayer Tab."
@@ -3903,10 +4047,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Užitečné pro vývojáře modů."
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr "Vertikální synchronizace"
 
@@ -3986,7 +4126,7 @@ msgstr "Vlastnosti vody"
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
-msgstr ""
+msgstr "Hladina vody"
 
 #: src/settings_translation_file.cpp
 msgid "Water surface level of the world."
@@ -4032,7 +4172,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4132,114 +4272,120 @@ msgstr "cURL limit paralelních stahování"
 msgid "cURL timeout"
 msgstr "cURL timeout"
 
-#~ msgid "Preload inventory textures"
-#~ msgstr "Přednačíst inventářové textury"
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "Detailní profilovací data modů. Užitečné pro vývojáře modů."
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Reset místního světa"
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Detailní profilování modů"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Měřítko aplikované na prvky menu: "
+#~ msgid "Useful for mod developers."
+#~ msgstr "Užitečné pro vývojáře modů."
 
-#~ msgid "Touch free target"
-#~ msgstr "Středový kurzor"
+#~ msgid "No of course not!"
+#~ msgstr "Jistě že ne!"
 
-#~ msgid " KB/s"
-#~ msgstr " KB/s"
+#~ msgid "Public Serverlist"
+#~ msgstr "Seznam veřejných serverů"
 
-#~ msgid " MB/s"
-#~ msgstr " MB/s"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generovat normálové mapy"
 
-#~ msgid "Downloading"
-#~ msgstr "Stahuji"
+#~ msgid "No!!!"
+#~ msgstr "Ne!!!"
 
-#~ msgid "Game Name"
-#~ msgstr "Název hry"
+#~ msgid "\""
+#~ msgstr "\""
 
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Nepovedlo se zkopírovat mod \"$1\" do hry \"$2\""
+#~ msgid "If disabled "
+#~ msgstr "Je-li zakázáno "
 
-#~ msgid "GAMES"
-#~ msgstr "HRY"
+#~ msgid "If enabled, "
+#~ msgstr "Je-li povoleno, "
 
-#~ msgid "Mods:"
-#~ msgstr "Mody:"
+#~ msgid "Rendering:"
+#~ msgstr "Renderování:"
 
-#~ msgid "new game"
-#~ msgstr "nová hra"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Aby se změna ovladače projevila, restartujte Minetest"
 
-#~ msgid "EDIT GAME"
-#~ msgstr "UPRAVIT HRU"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Levý klik: Přesunout všechny předměty, Pravý klik: Přesunout jeden předmět"
 
-#~ msgid "Remove selected mod"
-#~ msgstr "Odstranit vybraný mod"
+#~ msgid "Local install"
+#~ msgstr "Místní instalace"
 
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Přidat mod"
+#~ msgid "Add mod:"
+#~ msgstr "Přidat mod:"
 
-#~ msgid "CLIENT"
-#~ msgstr "KLIENT"
+#~ msgid "MODS"
+#~ msgstr "MODY"
 
-#~ msgid "START SERVER"
-#~ msgstr "MÍSTNÍ SERVER"
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "BALÍČKY TEXTUR"
 
-#~ msgid "Name"
-#~ msgstr "Jméno"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "HRA JEDNOHO HRÁČE"
 
-#~ msgid "Password"
-#~ msgstr "Heslo"
+#~ msgid "Finite Liquid"
+#~ msgstr "Konečná voda"
+
+#~ msgid "Preload item visuals"
+#~ msgstr "Přednačíst textury předmětů"
 
 #~ msgid "SETTINGS"
 #~ msgstr "NASTAVENÍ"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Přednačíst textury předmětů"
+#~ msgid "Password"
+#~ msgstr "Heslo"
 
-#~ msgid "Finite Liquid"
-#~ msgstr "Konečná voda"
+#~ msgid "Name"
+#~ msgstr "Jméno"
 
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "HRA JEDNOHO HRÁČE"
+#~ msgid "START SERVER"
+#~ msgstr "MÍSTNÍ SERVER"
 
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "BALÍČKY TEXTUR"
+#~ msgid "CLIENT"
+#~ msgstr "KLIENT"
 
-#~ msgid "MODS"
-#~ msgstr "MODY"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Přidat mod"
 
-#~ msgid "Add mod:"
-#~ msgstr "Přidat mod:"
+#~ msgid "Remove selected mod"
+#~ msgstr "Odstranit vybraný mod"
 
-#~ msgid "Local install"
-#~ msgstr "Místní instalace"
+#~ msgid "EDIT GAME"
+#~ msgstr "UPRAVIT HRU"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Levý klik: Přesunout všechny předměty, Pravý klik: Přesunout jeden předmět"
+#~ msgid "new game"
+#~ msgstr "nová hra"
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Aby se změna ovladače projevila, restartujte Minetest"
+#~ msgid "Mods:"
+#~ msgstr "Mody:"
 
-#~ msgid "Rendering:"
-#~ msgstr "Renderování:"
+#~ msgid "GAMES"
+#~ msgstr "HRY"
 
-#~ msgid "If enabled, "
-#~ msgstr "Je-li povoleno, "
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Nepovedlo se zkopírovat mod \"$1\" do hry \"$2\""
 
-#~ msgid "If disabled "
-#~ msgstr "Je-li zakázáno "
+#~ msgid "Game Name"
+#~ msgstr "Název hry"
 
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid "Downloading"
+#~ msgstr "Stahuji"
 
-#~ msgid "No!!!"
-#~ msgstr "Ne!!!"
+#~ msgid " MB/s"
+#~ msgstr " MB/s"
 
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generovat normálové mapy"
+#~ msgid " KB/s"
+#~ msgstr " KB/s"
 
-#~ msgid "Public Serverlist"
-#~ msgstr "Seznam veřejných serverů"
+#~ msgid "Touch free target"
+#~ msgstr "Středový kurzor"
 
-#~ msgid "No of course not!"
-#~ msgstr "Jistě že ne!"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Měřítko aplikované na prvky menu: "
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "Přednačíst inventářové textury"
diff --git a/po/da/minetest.po b/po/da/minetest.po
index 6337ba1..b1aa649 100644
--- a/po/da/minetest.po
+++ b/po/da/minetest.po
@@ -1,23 +1,23 @@
-# German translations for minetest-c55 package.
-# Copyright (C) 2011 celeron
-# This file is distributed under the same license as the minetest-c55 package.
-# Frederik Helth <Guides at live.dk>, 2011.
-#
+# German translations for minetest-c55 package.
+# Copyright (C) 2011 celeron
+# This file is distributed under the same license as the minetest-c55 package.
+# Frederik Helth <Guides at live.dk>, 2011.
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-06 13:58+0000\n"
-"Last-Translator: Thomas Wagner Nielsen <thomas at viawords.com>\n"
-"Language-Team: Danish "
-"<https://hosted.weblate.org/projects/minetest/minetest/da/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-11-24 16:48+0100\n"
+"Last-Translator: Joe Hansen <joedalton2 at yahoo.dk>\n"
+"Language-Team: Danish <https://hosted.weblate.org/projects/minetest/minetest/"
+"da/>\n"
 "Language: da\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
@@ -132,7 +132,7 @@ msgstr "aktiveret"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "A world named \"$1\" already exists"
-msgstr "En verden med navnet \"$1\" eksisterer allerede"
+msgstr "En verden med navnet »$1« findes allerede"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Create"
@@ -140,7 +140,7 @@ msgstr "Skab"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Hent et subgame, så som minetest_game fra minetest.net"
+msgstr "Hent et underspil, såsom minetest_game fra minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download one from minetest.net"
@@ -155,7 +155,6 @@ msgid "Mapgen"
 msgstr "Mapgen"
 
 #: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
 msgid "No worldname given or no game selected"
 msgstr "Intet navn på verden angivet eller intet spil valgt"
 
@@ -178,7 +177,7 @@ msgstr "Du har ikke installeret nogle subgames."
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Are you sure you want to delete \"$1\"?"
-msgstr "Er du sikker på du vil slette \"$1\"?"
+msgstr "Er du sikker på, at du vil slette »$1«?"
 
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
@@ -215,12 +214,10 @@ msgid "(No description of setting given)"
 msgstr "(Der er ikke nogen beskrivelse af denne indstilling)"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
 msgid "< Back to Settings page"
 msgstr "< Tilbage til siden Indstillinger"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
 msgid "Browse"
 msgstr "Gennemse"
 
@@ -259,7 +256,7 @@ msgstr "Mods"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Optionally the lacunarity can be appended with a leading comma."
-msgstr ""
+msgstr "Valgfrit kan »lacunarity'en« tilføjes med et foranstillet komma."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a comma seperated list of flags."
@@ -436,14 +433,12 @@ msgid "Del. Favorite"
 msgstr "Vis favoritter"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Favorite"
-msgstr "Vis favoritter"
+msgstr "Favorit"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Navn/kodeord:"
+msgstr "Navn/adgangskode"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -451,7 +446,7 @@ msgstr "Spiller mod spiller aktiveret"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Bind Address"
-msgstr ""
+msgstr "Bind adresse"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "Configure"
@@ -476,9 +471,8 @@ msgid "New"
 msgstr "Ny"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
-#, fuzzy
 msgid "No world created or selected!"
-msgstr "Ingen verden skabt eller valgt!"
+msgstr "Ingen verden oprettet eller valgt!"
 
 #: builtin/mainmenu/tab_server.lua
 #, fuzzy
@@ -506,7 +500,6 @@ msgid "Start Game"
 msgstr "Start spil / Forbind"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "2x"
 msgstr "2x"
 
@@ -515,12 +508,10 @@ msgid "3D Clouds"
 msgstr "3D-skyer"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "4x"
 msgstr "4x"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "8x"
 msgstr "8x"
 
@@ -530,7 +521,7 @@ msgstr "Avancerede indstillinger"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Antialiasing:"
-msgstr ""
+msgstr "Udjævning:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Are you sure to reset your singleplayer world?"
@@ -554,18 +545,17 @@ msgid "Connected Glass"
 msgstr "Forbundet glas"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Fancy Leaves"
-msgstr "Opakt (uigennemsigtigt) vand"
+msgstr "Smukke blade"
 
 #: builtin/mainmenu/tab_settings.lua
 #, fuzzy
 msgid "Mipmap"
-msgstr "Mip-mapping"
+msgstr "Mipmap"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Mipmap + Aniso. Filter"
-msgstr ""
+msgstr "Mipmap + Aniso-filter"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No"
@@ -576,47 +566,44 @@ msgid "No Filter"
 msgstr "Intet filter"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "No Mipmap"
-msgstr "Mip-mapping"
+msgstr "Ingen Mipmap"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Highlighting"
-msgstr "Glat belysning"
+msgstr "Knudepunktsfremhævelse"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Outlining"
-msgstr "Glat belysning"
+msgstr "Knudepunktsomrids"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
 msgstr "Ingen"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Normal Mapping"
-msgstr "Mip-mapping"
+msgstr "Normal oversættelse"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Opaque Leaves"
-msgstr "Opakt (uigennemsigtigt) vand"
+msgstr "Uuigennemsigtige blade"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Opaque Water"
-msgstr "Opakt (uigennemsigtigt) vand"
+msgstr "Uigennemsigtigt vand"
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Parallax Occlusion"
-msgstr ""
+msgstr "Parallax-okklusion"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "Aktivér partikler"
+msgstr "Partikler"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Nulstil spillerverden"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
@@ -624,7 +611,7 @@ msgstr "Indstillinger"
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Shaders"
-msgstr "Shadere"
+msgstr "Dybdeskabere"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Simple Leaves"
@@ -636,39 +623,35 @@ msgstr "Glat belysning"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Texturing:"
-msgstr ""
+msgstr "Teksturering:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr ""
+msgstr "For at aktivere dybdeskabere skal OpenGL-driveren bruges."
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
-#, fuzzy
 msgid "Tone Mapping"
-msgstr "Mip-mapping"
+msgstr "Toneoversættelse"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Touchthreshold (px)"
-msgstr ""
+msgstr "Føletærskel (px)"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Trilinear Filter"
 msgstr "Tri-lineær filtréring"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Leaves"
-msgstr "\"Smarte\" træer"
+msgstr "Bølgende blade"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Plants"
-msgstr "\"Smarte\" træer"
+msgstr "Bølgende planter"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Water"
-msgstr "\"Smarte\" træer"
+msgstr "Bølgende vand"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Yes"
@@ -700,11 +683,11 @@ msgstr "Der er ikke nogen information tilgængelig"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "Select texture pack:"
-msgstr ""
+msgstr "Vælg teksturpakke:"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "Texturepacks"
-msgstr ""
+msgstr "Teksturpakker"
 
 #: src/client.cpp
 msgid "Connection timed out."
@@ -724,11 +707,11 @@ msgstr "Initialiserer noder..."
 
 #: src/client.cpp
 msgid "Loading textures..."
-msgstr ""
+msgstr "Indlæser teksturer..."
 
 #: src/client.cpp
 msgid "Rebuilding shaders..."
-msgstr ""
+msgstr "Genbygger dybdeskabere ..."
 
 #: src/client/clientlauncher.cpp
 msgid "Connection error (timed out?)"
@@ -756,13 +739,12 @@ msgid "Player name too long."
 msgstr "Spillerens navn er for langt."
 
 #: src/client/clientlauncher.cpp
-#, fuzzy
 msgid "Provided world path doesn't exist: "
-msgstr "Den angivne sti til verdenen findes ikke: "
+msgstr "Angivne sti til verdenen findes ikke: "
 
 #: src/fontengine.cpp
 msgid "needs_fallback_font"
-msgstr ""
+msgstr "kræver_reserve_skrifttype"
 
 #: src/game.cpp
 msgid ""
@@ -789,17 +771,14 @@ msgid "Continue"
 msgstr "Fortsæt"
 
 #: src/game.cpp
-#, fuzzy
 msgid "Creating client..."
-msgstr "Opretter klient..."
+msgstr "Opretter klient ..."
 
 #: src/game.cpp
-#, fuzzy
 msgid "Creating server..."
-msgstr "Opretter server..."
+msgstr "Opretter server ..."
 
 #: src/game.cpp
-#, fuzzy
 msgid ""
 "Default Controls:\n"
 "- WASD: move\n"
@@ -813,7 +792,7 @@ msgid ""
 "- Mouse wheel: select item\n"
 "- T: chat\n"
 msgstr ""
-"Standard-styring:\n"
+"Standardstyring:\n"
 "- WASD: Bevæge sig rundt\n"
 "- Mellemrumstast: Hoppe/klatre\n"
 "- Skift: Snige/gå nedad\n"
@@ -823,10 +802,9 @@ msgstr ""
 "- Mus venstre: Grave/slå\n"
 "- Mus højre: Placere/bruge\n"
 "- Musehjul: Vælge genstand\n"
-"- T: Chat\n"
+"- T: Snakke (chat)\n"
 
 #: src/game.cpp
-#, fuzzy
 msgid ""
 "Default Controls:\n"
 "No menu visible:\n"
@@ -841,7 +819,7 @@ msgid ""
 "- touch&drag, tap 2nd finger\n"
 " --> place single item to slot\n"
 msgstr ""
-"Standard-styring:\n"
+"Standardstyring:\n"
 "Ingen menu synlig:\n"
 "- Enkelt tryk: Aktivér knap\n"
 "- Dobbelt tryk: Placér/brug\n"
@@ -864,10 +842,9 @@ msgstr "Afslut til operativsystemet"
 
 #: src/game.cpp
 msgid "Item definitions..."
-msgstr ""
+msgstr "Elementdefinitioner ..."
 
 #: src/game.cpp
-#, fuzzy
 msgid "KiB/s"
 msgstr "KiB/s"
 
@@ -876,18 +853,16 @@ msgid "Media..."
 msgstr "Medier..."
 
 #: src/game.cpp
-#, fuzzy
 msgid "MiB/s"
 msgstr "MiB/s"
 
 #: src/game.cpp
-#, fuzzy
 msgid "Node definitions..."
-msgstr "Blokdefinitioner..."
+msgstr "Knudepunktsdefinitioner ..."
 
 #: src/game.cpp
 msgid "Resolving address..."
-msgstr ""
+msgstr "Slår adresse op ..."
 
 #: src/game.cpp
 msgid "Respawn"
@@ -911,7 +886,7 @@ msgstr "ok"
 
 #: src/guiFormSpecMenu.cpp
 msgid "Enter "
-msgstr ""
+msgstr " "
 
 #: src/guiFormSpecMenu.cpp
 msgid "Proceed"
@@ -990,9 +965,8 @@ msgid "Sneak"
 msgstr "Snige"
 
 #: src/guiKeyChangeMenu.cpp
-#, fuzzy
 msgid "Toggle Cinematic"
-msgstr "Omstil hurtig"
+msgstr "Aktiver filmisk"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle fast"
@@ -1010,6 +984,10 @@ msgstr "Omstil fylde"
 msgid "Use"
 msgstr "Brug"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "Tryk på en tast"
@@ -1035,18 +1013,16 @@ msgid "Passwords do not match!"
 msgstr "Kodeordene er ikke ens!"
 
 #: src/guiVolumeChange.cpp
-#, fuzzy
 msgid "Exit"
 msgstr "Afslut"
 
 #: src/guiVolumeChange.cpp
-#, fuzzy
 msgid "Sound Volume: "
 msgstr "Lydstyrke: "
 
 #: src/keycode.cpp
 msgid "Apps"
-msgstr "Apps"
+msgstr "Prg."
 
 #: src/keycode.cpp
 msgid "Attn"
@@ -1057,7 +1033,6 @@ msgid "Back"
 msgstr "Tilbage"
 
 #: src/keycode.cpp
-#, fuzzy
 msgid "Capital"
 msgstr "Store bogstaver"
 
@@ -1306,9 +1281,8 @@ msgid "Sleep"
 msgstr "Sov"
 
 #: src/keycode.cpp
-#, fuzzy
 msgid "Snapshot"
-msgstr "Tilstandsbillede"
+msgstr "Øjebliksbillede"
 
 #: src/keycode.cpp
 msgid "Space"
@@ -1330,10 +1304,6 @@ msgstr "X knap 1"
 msgid "X Button 2"
 msgstr "X knap 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1342,20 +1312,24 @@ msgid ""
 "sets.\n"
 "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
 msgstr ""
+"(X,Y,Z)-forskydning for fraktal fra verdencentrum i enheder af »skala«.\n"
+"Brugt til at flytte en egnet udlægning af lavt land tæt på (0, 0).\n"
+"Standarden er egnet til mandelbrot-sæt, skal redigeres for julia-sæt.\n"
+"Interval cirka -2 til 2. Gang med »skala« i knudepunkter."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "0 = parallax occlusion with slope information (faster).\n"
 "1 = relief mapping (slower, more accurate)."
 msgstr ""
+"0 = parallax-okklusion med kurveinformation (hurtigere).\n"
+"1 = relief-oversættelse (langsommere, mere præcis)."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "3D clouds"
-msgstr "3D skyer"
+msgstr "3D-skyer"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "3D mode"
 msgstr "3D-tilstand"
 
@@ -1370,47 +1344,59 @@ msgid ""
 "-    sidebyside: split screen side by side.\n"
 "-    pageflip: quadbuffer based 3d."
 msgstr ""
+"Understøttelse af 3D.\n"
+"Understøttet på nuværende tidspunkt:\n"
+"-    none: ingen 3d-udgang.\n"
+"-    anaglyph: cyan/magenta farve 3d.\n"
+"-    interlaced: ulige/lige linjebaseret polarisering for "
+"skærmunderstøttelsen\n"
+"-    topbottom: opdel skærm top/bund.\n"
+"-    sidebyside: opdel skærm side om side.\n"
+"-    pageflip: quadbuffer baseret 3d."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "A chosen map seed for a new map, leave empty for random.\n"
 "Will be overridden when creating a new world in the main menu."
 msgstr ""
+"En valgt kortfødning for et nyt kort, efterlad tom for vilkårlig.\n"
+"Vil blive overskrevet når en ny verden oprettes i hovedmenuen."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "A message to be displayed to all clients when the server crashes."
 msgstr "Besked, som skal vises til alle klienter, når serveren går ned."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "A message to be displayed to all clients when the server shuts down."
 msgstr "Besked, som skal vises til alle klienter, når serveren lukker ned."
 
 #: src/settings_translation_file.cpp
 msgid "Absolute limit of emerge queues"
-msgstr ""
+msgstr "Absolut begrænsning af fremkomstkøer"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Acceleration in air"
 msgstr "Acceleration i luft"
 
 #: src/settings_translation_file.cpp
 msgid "Active Block Management interval"
-msgstr ""
+msgstr "Aktiv blokhåndteringsinterval"
 
 #: src/settings_translation_file.cpp
 msgid "Active Block Modifier interval"
-msgstr ""
+msgstr "Aktivt blokændringsinterval"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Aktive blokændringer"
 
 #: src/settings_translation_file.cpp
 msgid "Active block range"
-msgstr ""
+msgstr "Aktiv blokinterval"
 
 #: src/settings_translation_file.cpp
 msgid "Active object send range"
-msgstr ""
+msgstr "Aktivt objektafsendelsesinterval"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1418,14 +1404,16 @@ msgid ""
 "Leave this blank to start a local server.\n"
 "Note that the address field in the main menu overrides this setting."
 msgstr ""
+"Adressen, der skal forbindes til.\n"
+"Lad dette være tomt for at starte en lokal server.\n"
+"Bemærk, at adressefeltet i hovedmenuen tilsidesætter denne indstilling."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
 "screens."
 msgstr ""
-"Justér DPI-konfigurationen til din skærm (ikke-X11 / kun Andorid) f.eks. til "
+"Justér DPI-konfigurationen til din skærm (ikke-X11 / kun Android) f.eks. til "
 "4k-skærme."
 
 #: src/settings_translation_file.cpp
@@ -1433,6 +1421,8 @@ msgid ""
 "Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n"
 "This setting is for the client only and is ignored by the server."
 msgstr ""
+"Juster gammakodningen for lystabellerne. Et mindre tal betyder lysere.\n"
+"Denne indstilling gælder kun for klienten og ignoreres af serveren."
 
 #: src/settings_translation_file.cpp
 msgid "Advanced"
@@ -1440,30 +1430,27 @@ msgstr "Avanceret"
 
 #: src/settings_translation_file.cpp
 msgid "Altitude Chill"
-msgstr ""
+msgstr "Højdekulde"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Always fly and fast"
 msgstr "Flyv altid og hurtigt"
 
 #: src/settings_translation_file.cpp
 msgid "Ambient occlusion gamma"
-msgstr ""
+msgstr "Ambient okklusiongamma"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Amplifies the valleys"
 msgstr "Forstærker dalene"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Anisotropic filtering"
-msgstr "Anisotropisk filtréring"
+msgstr "Anisotropisk filtrering"
 
 #: src/settings_translation_file.cpp
 msgid "Announce server"
-msgstr ""
+msgstr "Meddelelsesserver"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1471,55 +1458,61 @@ msgid ""
 "If you want to announce your ipv6 address, use  serverlist_url = v6.servers."
 "minetest.net."
 msgstr ""
+"Meddel på denne serverliste\n"
+"Hvis du ønsker at annoncere din ipv6-adresse, så brug serverlist_url = v6."
+"servers.minetest.net."
 
 #: src/settings_translation_file.cpp
 msgid "Approximate (X,Y,Z) scale of fractal in nodes."
-msgstr ""
+msgstr "Omtrentlig (X, Y, Z) fraktalskala i knudepunkter."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Ask to reconnect after crash"
-msgstr "Spørg om at forbinde igen, efter den er gået ned."
+msgstr "Spørg om at forbinde igen efter nedbrud"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Automaticaly report to the serverlist."
-msgstr "Rapportér automatisk til serverlisten."
+msgstr "Rapporter automatisk til serverlisten."
+
+#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Tast til automatisk løb"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Backward key"
-msgstr "Baglæns"
+msgstr "Tilbage-tast"
 
 #: src/settings_translation_file.cpp
 msgid "Base terrain height"
-msgstr ""
+msgstr "Baseterrænhøjde"
 
 #: src/settings_translation_file.cpp
 msgid "Basic"
-msgstr ""
+msgstr "Grundlæggende"
 
 #: src/settings_translation_file.cpp
 msgid "Basic Privileges"
-msgstr ""
+msgstr "Grundlæggende privilegier"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Bilinear filtering"
-msgstr "Bi-lineær filtréring"
+msgstr "Bilineær filtrering"
 
 #: src/settings_translation_file.cpp
 msgid "Bind address"
-msgstr ""
+msgstr "Bind adresse"
 
 #: src/settings_translation_file.cpp
 msgid "Bits per pixel (aka color depth) in fullscreen mode."
-msgstr ""
+msgstr "Bit per billedpunkt (a.k.a. farvedybde) i fuldskærmtilstand."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Build inside player"
-msgstr "Flerspiller"
+msgstr "Byg intern spiller"
+
+#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Indbygget"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -1528,41 +1521,43 @@ msgstr "Mip-mapping"
 
 #: src/settings_translation_file.cpp
 msgid "Camera smoothing"
-msgstr ""
+msgstr "Kameraudjævning"
 
 #: src/settings_translation_file.cpp
 msgid "Camera smoothing in cinematic mode"
-msgstr ""
+msgstr "Kameraudjævning i biograftilstand"
 
 #: src/settings_translation_file.cpp
 msgid "Camera update toggle key"
-msgstr ""
+msgstr "Tast til ændring af kameraopdatering"
 
 #: src/settings_translation_file.cpp
 msgid "Cave noise #1"
-msgstr ""
+msgstr "Hulestøj #1"
 
 #: src/settings_translation_file.cpp
 msgid "Cave noise #2"
-msgstr ""
+msgstr "Hulestøj #2"
 
 #: src/settings_translation_file.cpp
 msgid "Cave width"
-msgstr ""
+msgstr "Grottebredde"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
-msgstr ""
+msgstr "Huler og tunneler dannes ved skæringspunktet for de to støjkilder"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Chat key"
-msgstr "Skift bindinger"
+msgstr "Snakketast"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Chat toggle key"
-msgstr "Skift bindinger"
+msgstr "Tast for snak (chat)"
+
+#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Snakkekommandoer"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1586,40 +1581,57 @@ msgid ""
 "17 = 4D \"Mandelbulb\" mandelbrot set.\n"
 "18 = 4D \"Mandelbulb\" julia set."
 msgstr ""
+"Valg af 18 fraktaler fra 9 formler.\n"
+"1 = 4D »Roundy« mandelbrot-sæt.\n"
+"2 = 4D »Roundy« julia-sæt.\n"
+"3 = 4D »Squarry« mandelbrot-sæt.\n"
+"4 = 4D »Squarry\" julia-sæt.\n"
+"5 = 4D »Mandy Cousin« mandelbrot-sæt.\n"
+"6 = 4D »Mandy Cousin« julia-sæt.\n"
+"7 = 4D »Variation« mandelbrot-sæt.\n"
+"8 = 4D »Variation« julia-sæt.\n"
+"9 = 3D »Mandelbrot/Mandelbar« mandelbrot-sæt.\n"
+"10 = 3D »Mandelbrot/Mandelbar« julia-sæt.\n"
+"11 = 3D »Christmas Tree« mandelbrot-sæt.\n"
+"12 = 3D »Christmas Tree« julia-sæt.\n"
+"13 = 3D »Mandelbulb« mandelbrot-sæt.\n"
+"14 = 3D »Mandelbulb« julia-sæt.\n"
+"15 = 3D »Cosine Mandelbulb« mandelbrot-sæt.\n"
+"16 = 3D »Cosine Mandelbulb« julia-sæt.\n"
+"17 = 4D »Mandelbulb« mandelbrot-sæt.\n"
+"18 = 4D »Mandelbulb« julia-sæt."
 
 #: src/settings_translation_file.cpp
 msgid "Chunk size"
-msgstr ""
+msgstr "Klumpstørrelse"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Cinematic mode"
-msgstr "Kreativ tilstand"
+msgstr "Filmisk tilstand"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Cinematic mode key"
-msgstr "Kreativ tilstand"
+msgstr "Tast for filmisk tilstand"
 
 #: src/settings_translation_file.cpp
 msgid "Clean transparent textures"
-msgstr ""
+msgstr "Rene gennemsigtige teksturer"
 
 #: src/settings_translation_file.cpp
 msgid "Client and Server"
-msgstr ""
+msgstr "Klient og server"
 
 #: src/settings_translation_file.cpp
 msgid "Climbing speed"
-msgstr ""
+msgstr "Klatringshastighed"
 
 #: src/settings_translation_file.cpp
 msgid "Cloud height"
-msgstr ""
+msgstr "Skyhøjde"
 
 #: src/settings_translation_file.cpp
 msgid "Cloud radius"
-msgstr ""
+msgstr "Skyradius"
 
 #: src/settings_translation_file.cpp
 msgid "Clouds"
@@ -1627,74 +1639,74 @@ msgstr "Skyer"
 
 #: src/settings_translation_file.cpp
 msgid "Clouds are a client side effect."
-msgstr ""
+msgstr "Skyer er en klientsideeffekt."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Clouds in menu"
-msgstr "Hovedmenu"
+msgstr "Skyer i menu"
 
 #: src/settings_translation_file.cpp
 msgid "Colored fog"
-msgstr ""
+msgstr "Farvet tåge"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
+"Kommaadskilt liste af mod'er som har tilladelse til at tilgå HTTP API'er, "
+"som\n"
+"tillader dem at hente og overføre data fra internettet."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
+"Kommaadskil liste over troværdige mod'er som har tilladelse til at tilgå "
+"usikre\n"
+"funktioner selv når mod-sikkerhed er aktiveret (via "
+"request_insecure_environment())."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Command key"
-msgstr "Kommando"
+msgstr "Kommandotast"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Connect glass"
-msgstr "Forbind"
+msgstr "Forbind glas"
 
 #: src/settings_translation_file.cpp
 msgid "Connect to external media server"
-msgstr ""
+msgstr "Opret forbindelse til ekstern medieserver"
 
 #: src/settings_translation_file.cpp
 msgid "Connects glass if supported by node."
-msgstr ""
+msgstr "Forbinder glass hvis understøttet af knudepunkt."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Console alpha"
-msgstr "Konsol"
+msgstr "Konsolalfa"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Console color"
-msgstr "Konsol"
+msgstr "Konsolfarve"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Console key"
-msgstr "Konsol"
+msgstr "Konsoltast"
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward"
-msgstr ""
+msgstr "Kontinuerlig fremad"
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward movement (only used for testing)."
-msgstr ""
+msgstr "Kontinuerlig bevægelse fremad (bruges kun til test)."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Controls"
-msgstr "Control"
+msgstr "Styring"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1702,158 +1714,170 @@ msgid ""
 "Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays "
 "unchanged."
 msgstr ""
+"Styrer længden af dag-/natcyklussen.\n"
+"Eksempler: 72 = 20 min, 360 = 4 min, 1 = 24 timer, 0 = dag/nat/hvad som "
+"helst forbliver uændret."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Controls size of deserts and beaches in Mapgen v6.\n"
 "When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
 msgstr ""
+"Kontroller størrelse for ørkener og strande i Mapgen v6.\n"
+"Når snebiomer er aktiveret ignoreres »mgv6_freq_desert«."
 
 #: src/settings_translation_file.cpp
 msgid "Controls steepness/depth of lake depressions."
-msgstr ""
+msgstr "Kontrollerer hældning/dybe for sødybder."
 
 #: src/settings_translation_file.cpp
 msgid "Controls steepness/height of hills."
-msgstr ""
+msgstr "Styrer stejlheden/højden af bakkerne."
 
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Styrer bredden af tunneller. En lavere værdi giver bredere tunneller."
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
-msgstr ""
+msgstr "Nedbrudsbesked"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Creates unpredictable lava features in caves.\n"
 "These can make mining difficult. Zero disables them. (0-10)"
-msgstr ""
+msgstr " "
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Creates unpredictable water features in caves.\n"
 "These can make mining difficult. Zero disables them. (0-10)"
 msgstr ""
+"Opretter uforudsigelige vandfunktioner i huler.\n"
+"Disse kan gøre vanskeliggøre minedrift. Nul deaktiverer dem (0-10)"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair alpha"
-msgstr ""
+msgstr "Crosshair alpha"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Crosshair alpha (uigennemsigtighed, mellem 0 og 255)."
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair color"
-msgstr ""
+msgstr "Crosshair-farve"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair color (R,G,B)."
-msgstr ""
+msgstr "Crosshair-farve (R,G,B)."
 
 #: src/settings_translation_file.cpp
 msgid "Crouch speed"
-msgstr ""
+msgstr "Krybehastighed"
 
 #: src/settings_translation_file.cpp
 msgid "DPI"
-msgstr ""
+msgstr "DPI"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Damage"
-msgstr "Aktivér skade"
+msgstr "Skade"
 
 #: src/settings_translation_file.cpp
 msgid "Debug info toggle key"
-msgstr ""
+msgstr "Tast til aktivering af fejlsøgningsinfo"
 
 #: src/settings_translation_file.cpp
 msgid "Debug log level"
-msgstr ""
+msgstr "Logniveau for fejlsøgning"
 
 #: src/settings_translation_file.cpp
 msgid "Dedicated server step"
-msgstr ""
+msgstr "Dedikeret server-trin"
 
 #: src/settings_translation_file.cpp
 msgid "Default acceleration"
-msgstr ""
+msgstr "Standardacceleration"
 
 #: src/settings_translation_file.cpp
 msgid "Default game"
-msgstr ""
+msgstr "Standard spil"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Default game when creating a new world.\n"
 "This will be overridden when creating a world from the main menu."
-msgstr ""
+msgstr "Standard spil, når du skaber en ny verden."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Default password"
-msgstr "Nyt kodeord"
+msgstr "Standardadgangskode"
 
 #: src/settings_translation_file.cpp
 msgid "Default privileges"
-msgstr ""
+msgstr "Standardprivilegier"
+
+#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Standardformat for rapport"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
 msgstr ""
+"Standardtidsudløb for cURL, angivet i millisekunder.\n"
+"Har kun effekt hvis kompileret med cURL."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Defines sampling step of texture.\n"
 "A higher value results in smoother normal maps."
 msgstr ""
+"Definerer sampling-trin for tekstur.\n"
+"En højere værdi resulterer i en mere rullende normale kort."
 
 #: src/settings_translation_file.cpp
 msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
+"Definerer den maksimale spillerflytningsafstand i blokke (0 = ubegrænset)."
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Forsinkelse i afsendelse af blokke efter bygning"
 
 #: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
-msgstr ""
+msgstr "Forsinkelse ved visning af værktøjsfif, angivet i millisekunder."
 
 #: src/settings_translation_file.cpp
 msgid "Deprecated Lua API handling"
-msgstr ""
+msgstr "Forældet Lua API-håndtering"
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "Dybde hvorunder du kan finde store huler."
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find massive caves."
-msgstr ""
+msgstr "Dybde hvorunder du finder kæmpestore huler."
 
 #: src/settings_translation_file.cpp
 msgid "Descending speed"
-msgstr ""
+msgstr "Faldende hastighed"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Description of server, to be displayed when players join and in the "
 "serverlist."
 msgstr ""
+"Beskrivelse af server, som vises når spillere tilslutter sig og i "
+"serverlisten."
 
 #: src/settings_translation_file.cpp
 msgid "Desynchronize block animation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
+msgstr "Afsynkroniser blokanimation"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1861,64 +1885,82 @@ msgid ""
 "The 3 numbers in brackets control the scale of the\n"
 "terrain, the 3 numbers should be identical."
 msgstr ""
+"Bestemmer terrænform.\n"
+"De tre tal i parenteser kontrollerer skalaen for\n"
+"terrænet, de tre tal skal være identiske."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Disable anticheat"
-msgstr "Aktivér partikler"
+msgstr "Deaktiver antisnyd"
 
 #: src/settings_translation_file.cpp
-msgid "Disallow empty passwords"
+msgid "Disable escape sequences"
+msgstr "Deaktiver undvigesekvenser"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
 msgstr ""
+"Deaktiver undvigesekvenser, f.eks. snak-farvelægning.\n"
+"Brug denne hvis du ønsker at afvikle en server med pre-0.4.14-klienter og du "
+"ønsker\n"
+"at deaktivere undvigesekvenserne oprettet af mod'er."
+
+#: src/settings_translation_file.cpp
+msgid "Disallow empty passwords"
+msgstr "Tillad ikke tomme adgangskoder"
 
 #: src/settings_translation_file.cpp
 msgid "Domain name of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Domænenavn for server, til visning i serverlisten."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Double tap jump for fly"
-msgstr ""
-"Tryk på \"hop\" hurtigt to gange for at skifte frem og tilbage mellem flyve-"
-"tilstand"
+msgstr "Tryk to gange på »hop« for at flyve"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Double-tapping the jump key toggles fly mode."
 msgstr ""
-"Tryk på \"hop\" hurtigt to gange for at skifte frem og tilbage mellem flyve-"
-"tilstand"
+"Tryk på »hop« to gange for at skifte frem og tilbage fra flyvetilstand."
 
 #: src/settings_translation_file.cpp
 msgid "Drop item key"
-msgstr ""
+msgstr "Drop element-tast"
 
 #: src/settings_translation_file.cpp
 msgid "Dump the mapgen debug infos."
-msgstr ""
+msgstr "Dump mapgen-fejlsøgningsinfo."
+
+#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Aktivér joysticks"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Enable VBO"
-msgstr "Aktivér MP"
+msgstr "Aktiver VBO"
 
 #: src/settings_translation_file.cpp
 msgid "Enable mod security"
-msgstr ""
+msgstr "Aktiver mod-sikkerhed"
 
 #: src/settings_translation_file.cpp
 msgid "Enable players getting damage and dying."
-msgstr ""
+msgstr "Aktiver at spillere kan skades og dø."
 
 #: src/settings_translation_file.cpp
 msgid "Enable random user input (only used for testing)."
-msgstr ""
+msgstr "Aktiver vilkårlig brugerinddata (kun til test)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Enable smooth lighting with simple ambient occlusion.\n"
 "Disable for speed or for different looks."
 msgstr ""
+"Aktiver blød lyssætning med simpel ambient okklusion.\n"
+"Deaktiver for hastighed eller for anderledes udseender."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1928,6 +1970,10 @@ msgid ""
 "to new servers, but they may not support all new features that you are "
 "expecting."
 msgstr ""
+"Aktiver for at nægte gamle klienter i at forbinde.\n"
+"Ældre klienter er kompatible på den måde, at de ikke vil stoppe ved "
+"tilkobling\n"
+"til nye servere, men de understøtter ikke alle nye funktioner."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1936,6 +1982,10 @@ msgid ""
 "textures)\n"
 "when connecting to the server."
 msgstr ""
+"Aktiver brug af ekstern medieserver (hvis tilbudt af server).\n"
+"Eksterne servere tilbyder en signifikant hurtigere måde at hente medier (f."
+"eks. teksturer\n"
+"ved forbindelse til serveren."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1943,10 +1993,14 @@ msgid ""
 "to IPv6 clients, depending on system configuration.\n"
 "Ignored if bind_address is set."
 msgstr ""
+"Aktivere/deaktivere afvikling af en IPv6-server. En IPv6-server kan være "
+"begrænset\n"
+"til IPv6-klienter, afhængig af systemkonfiguration.\n"
+"Ignoreret hvis bind_address er angivet."
 
 #: src/settings_translation_file.cpp
 msgid "Enables animation of inventory items."
-msgstr ""
+msgstr "Aktiverer animation af lagerelementer."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1955,110 +2009,142 @@ msgid ""
 "or need to be auto-generated.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Aktiverer bumpmapping for teksturer. Normalmaps skal være angivet af "
+"teksturpakken\n"
+"eller skal være automatisk oprettet.\n"
+"Kræver at dybdeskabere er aktiveret."
 
 #: src/settings_translation_file.cpp
 msgid "Enables caching of facedir rotated meshes."
-msgstr ""
+msgstr "Aktiverer mellemlagring af facedir-roterede mesher."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Enables filmic tone mapping"
-msgstr "Aktivér skade"
+msgstr "Aktiverer filmisk toneoversættelse"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Enables minimap."
-msgstr "Aktivér skade"
+msgstr "Aktiverer minikort."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Enables on the fly normalmap generation (Emboss effect).\n"
 "Requires bumpmapping to be enabled."
 msgstr ""
+"Aktiverer løbende normalmap-oprettelse (Emboss-effekt).\n"
+"Kræver bumpmapping for at være aktiveret."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Enables parallax occlusion mapping.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Aktiverer parallax-okklusionoversættelse.\n"
+"Kræver at dybdeskabere er aktiveret."
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Udskrivningsinterval for motorprofileringsdata"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Entitetmetoder"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
 msgstr ""
+"Eksperimentelt tilvalg, kan medføre synlige mellemrum mellem blokke\n"
+"når angivet til et højere nummer end 0."
 
 #: src/settings_translation_file.cpp
 msgid "FPS in pause menu"
-msgstr ""
+msgstr "FPS i pausemenu"
 
 #: src/settings_translation_file.cpp
 msgid "FSAA"
-msgstr ""
+msgstr "FSAA"
 
 #: src/settings_translation_file.cpp
 msgid "Fall bobbing"
-msgstr ""
+msgstr "Faldrystelse"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font"
-msgstr ""
+msgstr "Reserveskrifttype"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font shadow"
-msgstr ""
+msgstr "Skygge for reserveskrifttypen"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font shadow alpha"
-msgstr ""
+msgstr "Skyggealfa for reserveskrifttypen"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font size"
-msgstr ""
+msgstr "Størrelse for reserveskrifttypen"
 
 #: src/settings_translation_file.cpp
 msgid "Fast key"
-msgstr ""
+msgstr "Hurtigtast"
 
 #: src/settings_translation_file.cpp
 msgid "Fast mode acceleration"
-msgstr ""
+msgstr "Hurtig tilstandsacceleration"
 
 #: src/settings_translation_file.cpp
 msgid "Fast mode speed"
-msgstr ""
+msgstr "Hurtig tilstandshastighed"
 
 #: src/settings_translation_file.cpp
 msgid "Fast movement"
-msgstr ""
+msgstr "Hurtig bevægelse"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Fast movement (via use key).\n"
 "This requires the \"fast\" privilege on the server."
 msgstr ""
+"Hurtig bevægelse (via tast).\n"
+"Dette kræver privilegiet »fast« på serveren."
 
 #: src/settings_translation_file.cpp
 msgid "Field of view"
-msgstr ""
+msgstr "Visningsområde"
+
+#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Zoom for visningsområde"
 
 #: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
+msgstr "Visningsområde i grader."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
 msgstr ""
+"Visningsområde under zoom i grader.\n"
+"Dette kræver privilegiet »zoom« på serveren."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
+"Fil i client/serverlist/ som indeholder dine favoritservere vist i "
+"fanebladet for flere spillere."
 
 #: src/settings_translation_file.cpp
 msgid "Filler Depth"
-msgstr ""
+msgstr "Fyldstofdybde"
 
 #: src/settings_translation_file.cpp
 msgid "Filmic tone mapping"
-msgstr ""
+msgstr "Filmisk toneoversættelse"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2067,149 +2153,168 @@ msgid ""
 "light edge to transparent textures.  Apply this filter to clean that up\n"
 "at texture load time."
 msgstr ""
+"Filtrerede teksturer kan blande RGB-værdier med fuldt gennemsigtige naboer,\n"
+"som PNG-optimeringsprogrammer normalt fjerner, undertiden resulterende i "
+"en \n"
+"mørk eller lys kant  for gennemsigtige teksturer. Anvend dette filter for at "
+"rydde\n"
+"op i dette på indlæsningstidspunktet for tekstur."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Filtering"
-msgstr "Anisotropisk filtréring"
+msgstr "Filtrering"
 
 #: src/settings_translation_file.cpp
 msgid "Fixed map seed"
-msgstr ""
+msgstr "Fast kortfødning"
 
 #: src/settings_translation_file.cpp
 msgid "Fly key"
-msgstr ""
+msgstr "Flyvetast"
 
 #: src/settings_translation_file.cpp
 msgid "Flying"
-msgstr ""
+msgstr "Flyver"
 
 #: src/settings_translation_file.cpp
 msgid "Fog"
-msgstr ""
+msgstr "Tåge"
 
 #: src/settings_translation_file.cpp
 msgid "Fog toggle key"
-msgstr ""
+msgstr "Tast for tåge"
 
 #: src/settings_translation_file.cpp
 msgid "Font path"
-msgstr ""
+msgstr "Sti til font"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow"
-msgstr ""
+msgstr "Fontskygge"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow alpha"
-msgstr ""
+msgstr "Alfa for skrifttypeskygge"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Alfa for skrifttypeskygge (uigennemsigtighed, mellem 0 og 255)."
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow offset, if 0 then shadow will not be drawn."
 msgstr ""
+"Forskydning for skrifttypeskygge, hvis 0 så vil skygge ikke blive tegnet."
 
 #: src/settings_translation_file.cpp
 msgid "Font size"
-msgstr ""
+msgstr "Skriftstørrelse"
 
 #: src/settings_translation_file.cpp
 msgid "Format of screenshots."
-msgstr ""
+msgstr "Format for skærmbilleder."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Forward key"
-msgstr "Fremad"
+msgstr "Fremadtast"
 
 #: src/settings_translation_file.cpp
 msgid "Freetype fonts"
-msgstr ""
+msgstr "Freetype-skrifttyper"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "From how far blocks are generated for clients, stated in mapblocks (16 "
 "nodes)."
 msgstr ""
+"Fra hvor langt væk blokke oprettes for klienten, angivet i kortblokke (16 "
+"knudepunkter)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
 msgstr ""
+"Fra hvor langt væk blokke sendes til klienter, angivet i kortblokke (16 "
+"knudepunker)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "From how far clients know about objects, stated in mapblocks (16 nodes)."
 msgstr ""
+"Fra hvor langt væk klinter ved om objekter, angivet i kortblokke (16 "
+"knudepunkter)."
 
 #: src/settings_translation_file.cpp
 msgid "Full screen"
-msgstr ""
+msgstr "Fuld skærm"
 
 #: src/settings_translation_file.cpp
 msgid "Full screen BPP"
-msgstr ""
+msgstr "Fuldskærm BPP"
 
 #: src/settings_translation_file.cpp
 msgid "Fullscreen mode."
-msgstr ""
+msgstr "Fuldskærmstilstand."
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling"
-msgstr ""
+msgstr "Skalering af grafisk brugerflade"
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling filter"
-msgstr ""
+msgstr "GUI-skaleringsfilter"
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling filter txr2img"
-msgstr ""
+msgstr "GUI-skaleringsfilter txr2img"
 
 #: src/settings_translation_file.cpp
 msgid "Gamma"
-msgstr ""
+msgstr "Gamma"
 
 #: src/settings_translation_file.cpp
 msgid "General"
-msgstr ""
+msgstr "Generelt"
 
 #: src/settings_translation_file.cpp
 msgid "Generate normalmaps"
-msgstr ""
+msgstr "Opret normalkort"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr "Globale tilbagekald"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Globale kortoprettelsesattributter.\n"
+"I Mapgen v6 kontrollerer flaget »decorations« alle dekorationer undtagen "
+"træer\n"
+"og junglegræs, i alle andre mapgen'er kontrollerer dette flag alle "
+"dekorationer.\n"
+"Flag som ikke er angivet i flagstrengen ændres ikke fra standarden.\n"
+"Flag startende med »no« (nej) bruges til eksplicit at deaktivere dem."
 
 #: src/settings_translation_file.cpp
 msgid "Graphics"
-msgstr ""
+msgstr "Grafik"
 
 #: src/settings_translation_file.cpp
 msgid "Gravity"
-msgstr ""
+msgstr "Tyngdekraft"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "HTTP Mods"
-msgstr "Mods"
+msgstr "HTTP-Mod'er"
 
 #: src/settings_translation_file.cpp
 msgid "HUD toggle key"
-msgstr ""
+msgstr "Tast for HUD"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2218,26 +2323,45 @@ msgid ""
 "-    log: mimic and log backtrace of deprecated call (default for debug).\n"
 "-    error: abort on usage of deprecated call (suggested for mod developers)."
 msgstr ""
+"Håndtering for forældede lua api-kald:\n"
+"-    legacy: (prøv at) efterligne gammel opførsel (standard for udgivelse).\n"
+"-    log: efterlign og log tilbagesporing for forældede kald (standard for "
+"fejlsøgning).\n"
+"-    error: afbryd ved brug af forældede kald (foreslået af mod-udviklere)."
 
 #: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
 msgstr ""
+"Få profilprogrammet til at instruere sig selv:\n"
+"* Instruer en tom funktion.\n"
+"Dette estimerer belastningen, som instrumenteringen tilføjer (+1 "
+"funktionkald).\n"
+"* Instruer sampleren i brug til at opdatere statistikken."
+
+#: src/settings_translation_file.cpp
+msgid "Height component of the initial window size."
+msgstr "Højdekomponent for den oprindelige vinduestørrelse."
 
 #: src/settings_translation_file.cpp
 msgid "Height on which clouds are appearing."
-msgstr ""
+msgstr "Højde hvor skyer fremkommer."
 
 #: src/settings_translation_file.cpp
 msgid "High-precision FPU"
-msgstr ""
+msgstr "Højpræcisions FPU"
 
 #: src/settings_translation_file.cpp
 msgid "Homepage of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Hjemmeside for serveren, som vist i serverlisten."
 
 #: src/settings_translation_file.cpp
 msgid "How deep to make rivers"
-msgstr ""
+msgstr "Dybde for floder"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2245,49 +2369,49 @@ msgid ""
 "mapblocks (16 nodes).\n"
 "In active blocks objects are loaded and ABMs run."
 msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
+"Hvordan store områder af blokke påvirkes af det aktive blokindhold, angivet "
+"i mapblocks (16 knudepunkter).\n"
+"I aktive blokke bliver objekter indlæst og ABM'er afviklet."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
+"Hvor lang tid serveren vil vente før ubrugt kortblokke fjernes.\n"
+"Højere værdier er længere tid, men vil bruge mere RAM."
 
 #: src/settings_translation_file.cpp
 msgid "How wide to make rivers"
-msgstr ""
+msgstr "Hvor brede floder skal være"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6"
-msgstr ""
+msgstr "IPv6"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 server"
-msgstr ""
+msgstr "IPv6-server"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 support."
-msgstr ""
+msgstr "Understøttelse af IPv6."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If FPS would go higher than this, limit it by sleeping\n"
 "to not waste CPU power for no benefit."
 msgstr ""
+"Hvis FPS skal være højere end dette, så begræns ved at sove\n"
+"for ikke at spilde CPU-kraft uden nogen fordel."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If disabled \"use\" key is used to fly fast if both fly and fast mode are "
 "enabled."
 msgstr ""
+"Hvis deaktiveret bruges »brug«-tasten til at flyve hurtig hvis både flyvning "
+"og hurtig tilstand er aktiveret."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2295,32 +2419,43 @@ msgid ""
 "nodes.\n"
 "This requires the \"noclip\" privilege on the server."
 msgstr ""
+"Hvis aktiveret sammen med fly-tilstand, kan spilleren flyve igennem faste "
+"knudepunkter.\n"
+"Dette kræver privilegiet »noclip« på serveren."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
 "and descending."
 msgstr ""
+"Hvis aktiveret bruges »brug«-tasten i stedet for »snig«-tasten til at klatre "
+"ned og aftagende."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If enabled, actions are recorded for rollback.\n"
 "This option is only read when server starts."
 msgstr ""
+"Hvis aktiveret, optages handlinger for tilbagerulning.\n"
+"Dette tilvalg læses kun når serveren starter."
 
 #: src/settings_translation_file.cpp
 msgid "If enabled, disable cheat prevention in multiplayer."
 msgstr ""
+"Hvis aktiveret så deaktiver forhindring af snyd i spil med flere deltagere."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If enabled, invalid world data won't cause the server to shut down.\n"
 "Only enable this if you know what you are doing."
 msgstr ""
+"Hvis aktiveret, så vil ugyldige data ikke medføre at serveren lukke ned.\n"
+"Aktiver kun hvis du ved hvad du gør."
 
 #: src/settings_translation_file.cpp
 msgid "If enabled, new players cannot join with an empty password."
 msgstr ""
+"Hvis aktiveret kan nye spillere ikke slutte sig til uden en tom adgangskode."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2328,62 +2463,116 @@ msgid ""
 "you stand.\n"
 "This is helpful when working with nodeboxes in small areas."
 msgstr ""
+"Hvis aktiveret så kan du placere blokke ved positionen (fod + øje niveau) "
+"hvor du står.\n"
+"Dette er nyttigt under arbejde med knudepunktbokse i små områder."
 
 #: src/settings_translation_file.cpp
 msgid "If this is set, players will always (re)spawn at the given position."
 msgstr ""
+"Hvis aktiveret, så vil spillere altid (gen)starte ved den angivne position."
 
 #: src/settings_translation_file.cpp
 msgid "Ignore world errors"
-msgstr ""
+msgstr "Ignorer verdensfejl"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "In-Game"
-msgstr "Spil"
+msgstr "I-spil"
 
 #: src/settings_translation_file.cpp
 msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
 msgstr ""
+"Baggrundsalfa for snakkekonsollen i spillet (uigennemsigtighed, mellem 0 og "
+"255)."
 
 #: src/settings_translation_file.cpp
 msgid "In-game chat console background color (R,G,B)."
+msgstr "Baggrundsfarve for snakkekonsollen i spillet (R,G,B)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"Instrumenteringsindbygning.\n"
+"Er normalt kun krævet af kerne/indbygningsbidragydere"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Udstyr chatkommandoer ved registrering."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Udstyr globale tilbagekaldsfunktioner ved registrering.\n"
+"(alt du sender til en minetest.register_*()-funktion)"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr "Udstyr handlingsfunktionen for Aktiv blokændringer ved registrering."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
 msgstr ""
+"Udstyr handlingsfunktionen for Indlæsning af blokændringer ved registrering."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Udstyr metoderne for enheder ved registrering."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Instrumentering"
 
 #: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
+"Interval for lagring af vigtige ændringer i verden, angivet i sekunder."
 
 #: src/settings_translation_file.cpp
 msgid "Interval of sending time of day to clients."
-msgstr ""
+msgstr "Interval for afsendelse af tidspunkt på dagen til klienter."
 
 #: src/settings_translation_file.cpp
 msgid "Inventory items animations"
-msgstr ""
+msgstr "Animationer for lagerelementer"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Inventory key"
-msgstr "Beholdning"
+msgstr "Lagertast"
 
 #: src/settings_translation_file.cpp
 msgid "Invert mouse"
-msgstr ""
+msgstr "Invertér mus"
 
 #: src/settings_translation_file.cpp
 msgid "Invert vertical mouse movement."
-msgstr ""
+msgstr "Vend lodret musebevægelse om."
 
 #: src/settings_translation_file.cpp
 msgid "Item entity TTL"
-msgstr ""
+msgstr "Elemententitet TTL"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Iterations of the recursive function.\n"
 "Controls the amount of fine detail."
 msgstr ""
+"Gennemløb for den rekursive funktion.\n"
+"Kontrollerer mængden af små detaljer."
+
+#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Joystick-knaps gentagelsesinterval"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "Joystick frustum-sensitivitet"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2392,6 +2581,10 @@ msgid ""
 "Has no effect on 3D fractals.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Kun Juliasæt: W-komponent for hyperkompleks konstant der bestemmer "
+"Juliaform.\n"
+"Har ingen effekt på 3D-fraktaler.\n"
+"Interval cirka -2 til 2."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2399,6 +2592,9 @@ msgid ""
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Kun Juliasæt: X-komponent for hyperkompleks konstant der bestemmer "
+"Juliaform.\n"
+"Interval cirka -2 til 2."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2406,6 +2602,9 @@ msgid ""
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Kun Juliasæt: Y-komponent for hyperkompleks konstant der bestemmer "
+"Juliaform.\n"
+"Interval cirka -2 til 2."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2413,15 +2612,17 @@ msgid ""
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Kun Juliasæt: Z-komponent for hyperkompleks konstant der bestemmer "
+"Juliaform.\n"
+"Interval cirka -2 til 2."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Jump key"
-msgstr "Hop"
+msgstr "Hop-tast"
 
 #: src/settings_translation_file.cpp
 msgid "Jumping speed"
-msgstr ""
+msgstr "Hoppehastighed"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2429,6 +2630,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast for mindskning af den sete afstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2436,6 +2640,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast som smider det nuværende valgte element.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2443,6 +2650,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast for øgning af den sete afstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2450,6 +2660,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast for hop.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2457,6 +2670,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at bevæge sig hurtigt i tilstanden hurtig.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2464,6 +2680,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at bevæge spilleren baglæns.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2471,6 +2690,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at bevæge spilleren fremad.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2478,6 +2700,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at bevæge spilleren mod venstre.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2485,6 +2710,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at bevæge spilleren mod højre.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2492,6 +2720,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at åbne snakkekonsollen (chat).\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2499,6 +2730,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at åbne snakkevinduet for at indtaste kommandoer.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2506,6 +2740,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at åbne snakkevinduet (chat).\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2513,6 +2750,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at åbne lageret.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2520,6 +2760,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at udskrive fejlsøgningsstakke. Brugt til udvikling.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2529,6 +2772,11 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til snigning.\n"
+"Bruges også til at klatre ned og synke ned i vand hvis aux1_descends er "
+"deaktiveret.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2536,6 +2784,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at skifte mellem første- og tredjepersons kamera.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2543,6 +2794,19 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at lave skærmbilleder.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tast til at skifte til automatisk løb.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2550,6 +2814,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at skifte til biograftilstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2557,6 +2824,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at skifte til visning af minikort.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2564,6 +2834,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at skifte til hurtig tilstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2571,6 +2844,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at skifte til flyvning.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2578,13 +2854,19 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at skifte til noclip-tilstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast for at skifte kameraopdateringen. Bruges kun til udvikling\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2592,6 +2874,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at skifte til visning af fejlsøgningsinformation.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2599,6 +2884,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til skift af visningen for HUD'en.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2606,6 +2894,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at skifte visningen af snakken (chat).\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2613,6 +2904,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at skifte visningen af tåge.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2620,6 +2914,10 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at skifte visningen af profileringsprogrammet. Brugt til "
+"udvikling.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2627,26 +2925,29 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tast til at skifte til ubegrænset se-afstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid "Key use for climbing/descending"
-msgstr ""
+msgstr "Tast brugt til at klatre op/ned"
 
 #: src/settings_translation_file.cpp
 msgid "Language"
-msgstr ""
+msgstr "Sprog"
 
 #: src/settings_translation_file.cpp
 msgid "Large cave depth"
-msgstr ""
+msgstr "Dybde for stor hule"
 
 #: src/settings_translation_file.cpp
 msgid "Lava Features"
-msgstr ""
+msgstr "Lavafunktioner"
 
 #: src/settings_translation_file.cpp
 msgid "Leaves style"
-msgstr ""
+msgstr "Bladstil"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2655,25 +2956,30 @@ msgid ""
 "-   Simple: only outer faces, if defined special_tiles are used\n"
 "-   Opaque: disable transparency"
 msgstr ""
+"Bladstil:\n"
+"-   Fancy:  alle sider synlige\n"
+"-   Simple: kun ydre sider, hvis defineret special_tiles anvendes\n"
+"-   Opaque: deaktiver gennemsigtighed"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Left key"
-msgstr "Venstre Menu"
+msgstr "Venstretast"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Length of a server tick and the interval at which objects are generally "
 "updated over network."
 msgstr ""
+"Længde på serveraktivering og intervallet som objekter opdateres efter over "
+"netværket."
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between ABM execution cycles"
-msgstr ""
+msgstr "Tidslængde mellem ABM-kørselscyklusser"
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "Tidslængde mellem NodeTimer-kørselscyklusser"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2686,14 +2992,22 @@ msgid ""
 "-    info\n"
 "-    verbose"
 msgstr ""
+"Niveau for logning der skrives til debug.txt:\n"
+"-    <nothing> (ingen logning)\n"
+"-    none (beskeder uden niveau)\n"
+"-    error\n"
+"-    warning\n"
+"-    action\n"
+"-    info\n"
+"-    verbose"
 
 #: src/settings_translation_file.cpp
 msgid "Limit of emerge queues on disk"
-msgstr ""
+msgstr "Begrænsning af fremkomsten af forespørgsler på disk"
 
 #: src/settings_translation_file.cpp
 msgid "Limit of emerge queues to generate"
-msgstr ""
+msgstr "Begrænsning af fremkomsten af køer at oprette"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2703,61 +3017,85 @@ msgid ""
 "-    Downloads performed by main menu (e.g. mod manager).\n"
 "Only has an effect if compiled with cURL."
 msgstr ""
+"Begrænser antallet af parallelle HTTP-forespørgsler. Påvirker:\n"
+"-    Medioverførsel hvis serveren bruger indstillingen remote_media.\n"
+"-    Serverlist-overførsel og serverbesked.\n"
+"-    Overførsler udført af hovedmenuen (f.eks. mod-håndtering).\n"
+"Har kun en effekt hvis kompileret med cURL."
 
 #: src/settings_translation_file.cpp
 msgid "Liquid fluidity"
-msgstr ""
+msgstr "Væskes evne til at flyde"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid fluidity smoothing"
-msgstr ""
+msgstr "Blødgøring af væskes evne til at flyde"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid loop max"
-msgstr ""
+msgstr "Væske loop maks."
 
 #: src/settings_translation_file.cpp
 msgid "Liquid queue purge time"
-msgstr ""
+msgstr "Køfjernelsestid for væske"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid sink"
-msgstr ""
+msgstr "Synkehastighed for væske"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid update interval in seconds."
-msgstr ""
+msgstr "Væskeopdateringsinterval i sekunder."
 
 #: src/settings_translation_file.cpp
 msgid "Liquid update tick"
+msgstr "Væskeopdateringsudløsning"
+
+#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Indlæs spilprofileringsprogrammet"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
 msgstr ""
+"Indlæs spilprofileringsprogrammet for at indsamle profileringsdata.\n"
+"Tilbyder en kommando /profiler til at tilgå den indsamlede profil.\n"
+"Nyttig for mod-udviklere og serveroperatører."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Indlæser blokændringer"
 
 #: src/settings_translation_file.cpp
 msgid "Main menu game manager"
-msgstr ""
+msgstr "Hovedmenus spilhåndtering"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Main menu mod manager"
-msgstr "Hovedmenu"
+msgstr "Hovedmenus mod-håndtering"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Main menu script"
-msgstr "Hovedmenu"
+msgstr "Hovedmenuskript"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
 msgstr ""
+"Tåge- og himmelfarver afhænger af tid på dagen (solopgang/solnedgang) og den "
+"sete retning."
 
 #: src/settings_translation_file.cpp
 msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
 msgstr ""
+"Får DirectX til at fungere med LuaJIT. Deaktiver hvis det giver problemer."
 
 #: src/settings_translation_file.cpp
 msgid "Map directory"
-msgstr ""
+msgstr "Kortmappe"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2767,274 +3105,283 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Kortoprettelsesattributer specifik for Mapgen Valleys.\n"
+"»altitude_chill« gør højere områder koldere, hvilket kan medføre "
+"habitatproblemstillinger.\n"
+"»humid_rivers« ændrer fugtighed omkring floder og i områder hvor vand har "
+"tendens til at samle sig,\n"
+"det kan influere med ømtålelige habitatter.\n"
+"Flag som ikke er specificeret i flag-strengen ændres ikke fra standarden.\n"
+"Flag der starter med »no« bruges til eksplicit at deaktivere dem."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Kortoprettelsesattributter specifikke for Mapgen flat.\n"
+"Undtagelsesvis kan søer og bakker tilføjes til den flade verden.\n"
+"Flag som ikke er specificeret i flag-strengen ændres ikke fra standarden.\n"
+"Flag der starter med »no« bruges til eksplicit at deaktivere dem."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Kortoprettelsesattributter specifikke for Mapgen v6.\n"
+"Når snehabitatter er aktiveret bliver jungler automatisk aktiveret, flaget "
+"»jungles« ignoreres.\n"
+"Flag som ikke er specificeret i flag-strengen ændres ikke fra standarden.\n"
+"Flag der starter med »no« bruges til eksplicit at deaktivere dem."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Kortoprettelsesattributter specifikek til Mapgen v7.\n"
+"Flaget »ridges« kontroller floderne.\n"
+"Flag som ikke er specificeret i flag-strengen ændres ikke fra standarden.\n"
+"Flag der starter med »no« bruges til eksplicit at deaktivere dem."
 
 #: src/settings_translation_file.cpp
 msgid "Map generation limit"
-msgstr ""
+msgstr "Kortoprettelsesbegrænsning"
 
 #: src/settings_translation_file.cpp
 msgid "Map save interval"
-msgstr ""
+msgstr "Interval for kortlagring"
 
 #: src/settings_translation_file.cpp
 msgid "Mapblock limit"
-msgstr ""
+msgstr "Kortblokbegrænsning"
 
 #: src/settings_translation_file.cpp
 msgid "Mapblock unload timeout"
-msgstr ""
+msgstr "Tidsudløb for kortblokfjernelse"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen Valleys"
-msgstr "Mapgen"
+msgstr "Mapgen-daler"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen biome heat noise parameters"
-msgstr ""
+msgstr "Støjparametre til biotopvarme for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen biome humidity blend noise parameters"
-msgstr ""
+msgstr "Støjparametre til biotopfugtighedsblanding for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen biome humidity noise parameters"
-msgstr ""
+msgstr "Støjparametre for biotopfugtighed for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen debug"
-msgstr ""
+msgstr "Fejlsøgning for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flags"
-msgstr ""
+msgstr "Flag for Mapgen"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat"
-msgstr "Mapgen"
+msgstr "Mapgen-flad"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat cave width"
-msgstr "Mapgen"
+msgstr "Mapgen - flad hulebredde"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave1 noise parameters"
-msgstr ""
+msgstr "Støjparametre til flade cave1 for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave2 noise parameters"
-msgstr ""
+msgstr "Støjparametre til flade cave2 for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat filler depth noise parameters"
-msgstr ""
+msgstr "Mapgen - støjparametre for flad fyldstofdybde"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat flags"
-msgstr ""
+msgstr "Flade flag for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat ground level"
-msgstr ""
+msgstr "Flade grundniveauer for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill steepness"
-msgstr ""
+msgstr "Flad bakkestejlhed for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill threshold"
-msgstr ""
+msgstr "Flad bakketærskel for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat lake steepness"
-msgstr ""
+msgstr "Flad søstejlhed for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat lake threshold"
-msgstr ""
+msgstr "Flad søtærskel for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat large cave depth"
-msgstr ""
+msgstr "Flad stor hule-dybde for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat terrain noise parameters"
-msgstr ""
+msgstr "Støjparametre til flad terræn for Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal"
-msgstr ""
+msgstr "Fraktral for Mapgen"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal cave width"
-msgstr "Mapgen"
+msgstr "Mapgen - fraktal hulebredde"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave1 noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen fraktal grotte1"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave2 noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen fraktal grotte2"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal filler depth noise parameters"
-msgstr ""
+msgstr "Mapgen - støjparametre for fraktal fyldstofdybde"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal fractal"
-msgstr ""
+msgstr "Mapgen fraktal fraktal"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal iterations"
-msgstr ""
+msgstr "Mapgen fraktaliterationer"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia w"
-msgstr ""
+msgstr "Mapgen fraktal Julia w"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia x"
-msgstr ""
+msgstr "Mapgen fraktal Julia x"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia y"
-msgstr ""
+msgstr "Mapgen fraktal Julia y"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia z"
-msgstr ""
+msgstr "Mapgen fraktal Julia z"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal offset"
-msgstr ""
+msgstr "Mapgen fraktal forskydning"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal scale"
-msgstr ""
+msgstr "Mapgen fraktal skalering"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal seabed noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen fraktal havbund"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal slice w"
-msgstr ""
+msgstr "Mapgen fraktal udsnit w"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen heat blend noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen varmeblanding"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen name"
-msgstr ""
+msgstr "Mapgen-navn"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5"
-msgstr ""
+msgstr "Mapgen v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave width"
-msgstr ""
+msgstr "Mapgen v5 grottebredde"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave1 noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen v5 grotte1"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave2 noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen v5 grotte2"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 factor noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen v5 faktor"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 filler depth noise parameters"
-msgstr ""
+msgstr "Mapgen v5 - støjparametre for fyldstofdybde"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 height noise parameters"
-msgstr ""
+msgstr "Mapgen v5 – støjparametre for højde"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6"
-msgstr ""
+msgstr "Mapgen v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 apple trees noise parameters"
-msgstr ""
+msgstr "Mapgen v6 – støjparametre for æbletræer"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 beach frequency"
-msgstr ""
+msgstr "Mapgen v6 – strandhyppighed"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 beach noise parameters"
-msgstr ""
+msgstr "Mapgen v6 – støjparametre for strand"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 biome noise parameters"
-msgstr ""
+msgstr "Mapgen v6 – støjparametre for økosystem"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 cave noise parameters"
-msgstr ""
+msgstr "Mapgen v6 – støjparametre for grotter"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 desert frequency"
-msgstr ""
+msgstr "Mapgen v6 – ørkenhyppighed"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 flags"
-msgstr ""
+msgstr "Mapgen v6 – flag"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 height select noise parameters"
-msgstr ""
+msgstr "Mapgen v6 – støjparametre for højdevalg"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 humidity noise parameters"
@@ -3062,7 +3409,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7"
-msgstr ""
+msgstr "Mapgen v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave width"
@@ -3078,15 +3425,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 filler depth noise parameters"
-msgstr ""
+msgstr "Mapgen v7 - støjparametre for fyldstofdybde"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 flags"
-msgstr ""
+msgstr "Mapgen v7 – flag"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 height select noise parameters"
-msgstr ""
+msgstr "Mapgen v7 – støjparametre for højdevalg"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 mount height noise parameters"
@@ -3150,7 +3497,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Maximum FPS"
-msgstr ""
+msgstr "Maksimal FPS"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum FPS when game is paused."
@@ -3165,6 +3512,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3206,17 +3561,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3225,16 +3584,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Maximum users"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
+msgstr "Maksimum antal brugere"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Menus"
-msgstr "Menu"
+msgstr "Menuer"
 
 #: src/settings_translation_file.cpp
 msgid "Mesh cache"
@@ -3242,11 +3596,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Message of the day"
-msgstr ""
+msgstr "Dagens besked"
 
 #: src/settings_translation_file.cpp
 msgid "Message of the day displayed to players connecting."
-msgstr ""
+msgstr "Dagens besked"
 
 #: src/settings_translation_file.cpp
 msgid "Method used to highlight selected object."
@@ -3254,11 +3608,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Minimap"
-msgstr ""
+msgstr "Minikort"
 
 #: src/settings_translation_file.cpp
 msgid "Minimap key"
-msgstr ""
+msgstr "Minikorttast"
 
 #: src/settings_translation_file.cpp
 msgid "Minimap scan height"
@@ -3271,11 +3625,7 @@ msgstr ""
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Mipmapping"
-msgstr "Mip-mapping"
-
-#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
+msgstr "Mipmapping"
 
 #: src/settings_translation_file.cpp
 msgid "Modstore details URL"
@@ -3337,7 +3687,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Network"
-msgstr ""
+msgstr "Netværk"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3371,7 +3721,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Noises"
-msgstr ""
+msgstr "Lyde"
 
 #: src/settings_translation_file.cpp
 msgid "Normalmaps sampling"
@@ -3451,7 +3801,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Physics"
-msgstr ""
+msgstr "Fysik"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3461,7 +3811,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Player name"
-msgstr ""
+msgstr "Spillerens navn"
 
 #: src/settings_translation_file.cpp
 msgid "Player transfer distance"
@@ -3482,11 +3832,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3494,7 +3850,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3523,16 +3879,19 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Remote port"
-msgstr ""
+msgstr "Fjernport"
 
 #: src/settings_translation_file.cpp
 msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Report path"
+msgstr "Rapportsti"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
-msgstr "Højre Menu"
+msgstr "Højretast"
 
 #: src/settings_translation_file.cpp
 msgid "Rightclick repetition interval"
@@ -3540,15 +3899,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "River Depth"
-msgstr ""
+msgstr "Floddybde"
 
 #: src/settings_translation_file.cpp
 msgid "River Noise"
-msgstr ""
+msgstr "Flodstøj"
 
 #: src/settings_translation_file.cpp
 msgid "River Size"
-msgstr ""
+msgstr "Flodstørrelse"
 
 #: src/settings_translation_file.cpp
 msgid "River noise -- rivers occur close to zero"
@@ -3560,7 +3919,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Round minimap"
-msgstr ""
+msgstr "Rundt minikort"
 
 #: src/settings_translation_file.cpp
 msgid "Save the map received by the client on disk."
@@ -3581,30 +3940,27 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Screen height"
-msgstr ""
+msgstr "Skærmhøjde"
 
 #: src/settings_translation_file.cpp
 msgid "Screen width"
-msgstr ""
+msgstr "Skærmbredde"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot"
-msgstr "Tilstandsbillede"
+msgstr "Skærmbillede"
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot folder"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot format"
-msgstr "Tilstandsbillede"
+msgstr "Skærmbilledformat"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot quality"
-msgstr "Tilstandsbillede"
+msgstr "Skærmbilledkvalitet"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3615,7 +3971,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Security"
-msgstr ""
+msgstr "Sikkerhed"
 
 #: src/settings_translation_file.cpp
 msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -3634,29 +3990,28 @@ msgid "Selection box width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Server / Singleplayer"
-msgstr "Enligspiller"
+msgstr "Server/alene"
 
 #: src/settings_translation_file.cpp
 msgid "Server URL"
-msgstr ""
+msgstr "Server-URL"
 
 #: src/settings_translation_file.cpp
 msgid "Server address"
-msgstr ""
+msgstr "Serveradresse"
 
 #: src/settings_translation_file.cpp
 msgid "Server description"
-msgstr ""
+msgstr "Serverbeskrivelse"
 
 #: src/settings_translation_file.cpp
 msgid "Server name"
-msgstr ""
+msgstr "Servernavn"
 
 #: src/settings_translation_file.cpp
 msgid "Server port"
-msgstr ""
+msgstr "Serverport"
 
 #: src/settings_translation_file.cpp
 msgid "Serverlist URL"
@@ -3677,25 +4032,34 @@ msgid ""
 "Set to true enables waving leaves.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Sat til true (sand) aktiverer bølgende blade.\n"
+"Kræver at dybdeskabere er aktiveret."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set to true enables waving plants.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Angivet til true (sand) aktiverer bølgende planter.\n"
+"Kræver at dybdeskabere er aktiveret."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set to true enables waving water.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Angivet til true (sand) aktiverer bølgende vand.\n"
+"Kræver at dybdeskabere er aktiveret."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
+"Dybdeskabere tillader avancerede visuelle effekter og kan forøge ydelsen på "
+"nogle videokort.\n"
+"De fungerer kun med OpenGL-videomotoren."
 
 #: src/settings_translation_file.cpp
 msgid "Shape of the minimap. Enabled = round, disabled = square."
@@ -3711,7 +4075,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Shutdown message"
-msgstr ""
+msgstr "Nedlukningsbesked"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3724,13 +4088,12 @@ msgid "Slope and fill work together to modify the heights"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Smooth lighting"
-msgstr "Glat belysning"
+msgstr "Blød belysning"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3743,13 +4106,12 @@ msgid "Smooths rotation of camera. 0 to disable."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Sneak key"
-msgstr "Snige"
+msgstr "Snigetast"
 
 #: src/settings_translation_file.cpp
 msgid "Sound"
-msgstr ""
+msgstr "Lyd"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3777,7 +4139,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Support older servers"
-msgstr ""
+msgstr "Understøt ældre servere"
 
 #: src/settings_translation_file.cpp
 msgid "Synchronous SQLite"
@@ -3785,7 +4147,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Terrain Height"
-msgstr ""
+msgstr "Terrænhøjde"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3810,7 +4172,19 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
+msgstr "Dybde for smuds eller andet fyldstof"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3829,6 +4203,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3844,6 +4224,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3868,7 +4254,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Time speed"
-msgstr ""
+msgstr "Tidshastighed"
 
 #: src/settings_translation_file.cpp
 msgid "Timeout for client to remove unused map data from memory."
@@ -3891,9 +4277,8 @@ msgid "Tooltip delay"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Trilinear filtering"
-msgstr "Tri-lineær filtréring"
+msgstr "Trilineær filtrering"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3935,9 +4320,8 @@ msgid "Use bilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Use key"
-msgstr "Tryk på en tast"
+msgstr "Brug-tast"
 
 #: src/settings_translation_file.cpp
 msgid "Use mip mapping to scale textures. May slightly increase performance."
@@ -3948,16 +4332,12 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
-msgstr ""
+msgstr "V-Sync"
 
 #: src/settings_translation_file.cpp
 msgid "VBO"
-msgstr ""
+msgstr "VBO"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Depth"
@@ -4011,7 +4391,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Volume"
-msgstr ""
+msgstr "Lydstyrke"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4023,7 +4403,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Walking speed"
-msgstr ""
+msgstr "Ganghastighed"
 
 #: src/settings_translation_file.cpp
 msgid "Water Features"
@@ -4031,7 +4411,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
-msgstr ""
+msgstr "Vandstand"
 
 #: src/settings_translation_file.cpp
 msgid "Water surface level of the world."
@@ -4042,9 +4422,8 @@ msgid "Waving Nodes"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving leaves"
-msgstr "\"Smarte\" træer"
+msgstr "Bølgende blade"
 
 #: src/settings_translation_file.cpp
 msgid "Waving plants"
@@ -4078,7 +4457,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4176,56 +4555,49 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "cURL timeout"
-msgstr ""
-
-#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Ned"
-
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Venstre klik: flyt alle enheder. Højre klik: flyt en enkelt enhed"
-
-#~ msgid "is required by:"
-#~ msgstr "er påkrævet af:"
-
-#~ msgid "Configuration saved.  "
-#~ msgstr "Konfiguration gemt.  "
-
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Advarsel: konfigurationen er ikke sammenhængende.  "
-
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Kan ikke skabe verden: navnet indeholder ugyldige bogstaver"
+msgstr "cURL-tidsudløb"
 
-#~ msgid "Show Public"
-#~ msgstr "Vis offentlig"
+#~ msgid "No of course not!"
+#~ msgstr "Nej selvfølgelig ikke!"
 
-#~ msgid "Show Favorites"
-#~ msgstr "Vis favoritter"
+#~ msgid "Public Serverlist"
+#~ msgstr "Offentlig serverliste"
 
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Lad adresse-feltet være tomt for at starte en lokal server."
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Deaktivér alle"
 
-#~ msgid "Create world"
-#~ msgstr "Skab verden"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "aktiveret"
 
-#~ msgid "Address required."
-#~ msgstr "Adresse påkrævet."
+#, fuzzy
+#~ msgid "Game Name"
+#~ msgstr "Spil"
 
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Kan ikke slette verden: ingenting valgt"
+#, fuzzy
+#~ msgid "Password"
+#~ msgstr "Gammelt kodeord"
 
-#~ msgid "Files to be deleted"
-#~ msgstr "Filer som slettes"
+#~ msgid "Preload item visuals"
+#~ msgstr "For-indlæs elementernes grafik"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Kan ikke skabe verden: ingen spil fundet"
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration.  "
+#~ msgstr ""
+#~ "Advarsel: nogle modifikationer er endnu ikke konfigureret.\n"
+#~ "De vil blive aktiveret som standard når du gemmer konfigurationen.  "
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Kan ikke konfigurere verden: ingenting valgt"
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration.  "
+#~ msgstr ""
+#~ "Advarsel: nogle konfigurerede modifikationer mangler.\n"
+#~ "Deres indstillinger vil blive fjernet når du gemmer konfigurationen.  "
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Mislykkedes i at slette alle verdenens filer"
+#~ msgid "Delete map"
+#~ msgstr "Slet mappen"
 
 #~ msgid ""
 #~ "Default Controls:\n"
@@ -4252,44 +4624,51 @@ msgstr ""
 #~ "- ESC: denne menu\n"
 #~ "- T: snak\n"
 
-#~ msgid "Delete map"
-#~ msgstr "Slet mappen"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Mislykkedes i at slette alle verdenens filer"
 
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
-#~ msgstr ""
-#~ "Advarsel: nogle konfigurerede modifikationer mangler.\n"
-#~ "Deres indstillinger vil blive fjernet når du gemmer konfigurationen.  "
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Kan ikke konfigurere verden: ingenting valgt"
 
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration.  "
-#~ msgstr ""
-#~ "Advarsel: nogle modifikationer er endnu ikke konfigureret.\n"
-#~ "De vil blive aktiveret som standard når du gemmer konfigurationen.  "
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Kan ikke skabe verden: ingen spil fundet"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "For-indlæs elementernes grafik"
+#~ msgid "Files to be deleted"
+#~ msgstr "Filer som slettes"
 
-#, fuzzy
-#~ msgid "Password"
-#~ msgstr "Gammelt kodeord"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Kan ikke slette verden: ingenting valgt"
 
-#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Spil"
+#~ msgid "Address required."
+#~ msgstr "Adresse påkrævet."
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "aktiveret"
+#~ msgid "Create world"
+#~ msgstr "Skab verden"
 
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Deaktivér alle"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Lad adresse-feltet være tomt for at starte en lokal server."
 
-#~ msgid "Public Serverlist"
-#~ msgstr "Offentlig serverliste"
+#~ msgid "Show Favorites"
+#~ msgstr "Vis favoritter"
 
-#~ msgid "No of course not!"
-#~ msgstr "Nej selvfølgelig ikke!"
+#~ msgid "Show Public"
+#~ msgstr "Vis offentlig"
+
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Kan ikke skabe verden: navnet indeholder ugyldige bogstaver"
+
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Advarsel: konfigurationen er ikke sammenhængende.  "
+
+#~ msgid "Configuration saved.  "
+#~ msgstr "Konfiguration gemt.  "
+
+#~ msgid "is required by:"
+#~ msgstr "er påkrævet af:"
+
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Venstre klik: flyt alle enheder. Højre klik: flyt en enkelt enhed"
+
+#, fuzzy
+#~ msgid "Downloading"
+#~ msgstr "Ned"
diff --git a/po/de/minetest.po b/po/de/minetest.po
index b9db120..a81fd0d 100644
--- a/po/de/minetest.po
+++ b/po/de/minetest.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-06 02:25+0000\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-14 02:46+0000\n"
 "Last-Translator: Wuzzy <almikes at aol.com>\n"
 "Language-Team: German "
 "<https://hosted.weblate.org/projects/minetest/minetest/de/>\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.10-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
@@ -246,8 +246,8 @@ msgid ""
 "<octaves>, <persistence>"
 msgstr ""
 "Format: <Offset>, <Skalierung>, (<AusbreitungX>, <AusbreitungY>, "
-"<AusbreitungZ>), <Seed>,\n"
-"<Oktaven>, <Persistenz>"
+"<AusbreitungZ>),\n"
+"<Seed>, <Oktaven>, <Persistenz>"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Games"
@@ -260,7 +260,8 @@ msgstr "Mods"
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Optionally the lacunarity can be appended with a leading comma."
 msgstr ""
-"Optional kann die Lacunarity, mit einem weiteren Komma abgetrennt, angehängt "
+"Optional kann die Lückenhaftigkeit, mit einem weiteren Komma abgetrennt, "
+"angehängt\n"
 "werden."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
@@ -333,7 +334,7 @@ msgstr "Schließen"
 
 #: builtin/mainmenu/store.lua
 msgid "Downloading $1, please wait..."
-msgstr "$1 wird heruntergeladen, bitte warten ..."
+msgstr "$1 wird heruntergeladen, bitte warten …"
 
 #: builtin/mainmenu/store.lua
 msgid "Install"
@@ -606,6 +607,10 @@ msgid "Particles"
 msgstr "Partikel"
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Einzelspielerwelt zurücksetzen"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Einstellungen"
 
@@ -703,15 +708,15 @@ msgstr "Initialisiere Blöcke"
 
 #: src/client.cpp
 msgid "Initializing nodes..."
-msgstr "Initialisiere Blöcke..."
+msgstr "Initialisiere Blöcke …"
 
 #: src/client.cpp
 msgid "Loading textures..."
-msgstr "Lade Texturen..."
+msgstr "Lade Texturen …"
 
 #: src/client.cpp
 msgid "Rebuilding shaders..."
-msgstr "Shader wiederherstellen..."
+msgstr "Shader wiederherstellen …"
 
 #: src/client/clientlauncher.cpp
 msgid "Connection error (timed out?)"
@@ -763,7 +768,7 @@ msgstr "Passwort ändern"
 
 #: src/game.cpp
 msgid "Connecting to server..."
-msgstr "Verbinde mit Server..."
+msgstr "Verbinde mit Server …"
 
 #: src/game.cpp
 msgid "Continue"
@@ -771,11 +776,11 @@ msgstr "Weiter"
 
 #: src/game.cpp
 msgid "Creating client..."
-msgstr "Client erstellen ..."
+msgstr "Client erstellen …"
 
 #: src/game.cpp
 msgid "Creating server..."
-msgstr "Erstelle Server..."
+msgstr "Erstelle Server …"
 
 #: src/game.cpp
 msgid ""
@@ -841,7 +846,7 @@ msgstr "Programm beenden"
 
 #: src/game.cpp
 msgid "Item definitions..."
-msgstr "Item-Definitionen..."
+msgstr "Item-Definitionen …"
 
 #: src/game.cpp
 msgid "KiB/s"
@@ -849,7 +854,7 @@ msgstr "KiB/s"
 
 #: src/game.cpp
 msgid "Media..."
-msgstr "Medien..."
+msgstr "Medien …"
 
 #: src/game.cpp
 msgid "MiB/s"
@@ -857,11 +862,11 @@ msgstr "MiB/s"
 
 #: src/game.cpp
 msgid "Node definitions..."
-msgstr "Blockdefinitionen..."
+msgstr "Blockdefinitionen …"
 
 #: src/game.cpp
 msgid "Resolving address..."
-msgstr "Löse Adresse auf..."
+msgstr "Löse Adresse auf …"
 
 #: src/game.cpp
 msgid "Respawn"
@@ -869,7 +874,7 @@ msgstr "Wiederbeleben"
 
 #: src/game.cpp
 msgid "Shutting down..."
-msgstr "Herunterfahren..."
+msgstr "Herunterfahren …"
 
 #: src/game.cpp
 msgid "Sound Volume"
@@ -981,6 +986,10 @@ msgstr "Geistmodus"
 msgid "Use"
 msgstr "Benutzen"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "Taste drücken"
@@ -1297,10 +1306,6 @@ msgstr "X-Knopf 1"
 msgid "X Button 2"
 msgstr "X-Knopf 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1373,7 +1378,8 @@ msgstr ""
 msgid "A message to be displayed to all clients when the server shuts down."
 msgstr ""
 "Eine Nachricht, die an alle verbundene Clients gesendet wird, wenn der "
-"Server herunterfährt."
+"Server\n"
+"herunterfährt."
 
 #: src/settings_translation_file.cpp
 msgid "Absolute limit of emerge queues"
@@ -1392,6 +1398,10 @@ msgid "Active Block Modifier interval"
 msgstr "Active-Block-Modifier-Intervall"
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Active Block Modifiers"
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr "Reichweite aktiver Kartenblöcke"
 
@@ -1474,6 +1484,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr "Automatisch bei der Serverliste melden."
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Automatisch-gehen-Taste"
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "Rückwärtstaste"
 
@@ -1506,6 +1520,10 @@ msgid "Build inside player"
 msgstr "Innerhalb des Spielers bauen"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Builtin"
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Bumpmapping"
 
@@ -1546,6 +1564,10 @@ msgid "Chat toggle key"
 msgstr "Taste zum Umschalten des Chatprotokolls"
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Chatbefehle"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1637,6 +1659,14 @@ msgstr "Gefärbter Nebel"
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Kommagetrennte Liste von Mods, welche auf HTTP-APIs zugreifen dürfen, was\n"
+"es ihnen erlaubt, Daten aus und Daten zum Internet herunter- und hochzuladen."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Comma-separated list of trusted mods that are allowed to access insecure\n"
 "functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
@@ -1647,14 +1677,6 @@ msgstr ""
 "(mit request_insecure_environment())."
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Kommagetrente Liste von Mods, welche auf HTTP-APIs zugreifen dürfen, was\n"
-"es ihnen erlaubt, Daten aus und Daten zum Internet herunter- und hochzuladen."
-
-#: src/settings_translation_file.cpp
 msgid "Command key"
 msgstr "Befehlstaste"
 
@@ -1812,6 +1834,10 @@ msgid "Default privileges"
 msgstr "Standardprivilegien"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Standard-Berichtsformat"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1830,8 +1856,12 @@ msgstr ""
 #: src/settings_translation_file.cpp
 msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
-"Setzt die maximale Distanz, in der die Spieler übertragen werden, in "
-"Kartenblöcken (0 = unbegrenzt)."
+"Setzt die maximale Distanz, in der die Spieler übertragen werden,\n"
+"in Kartenblöcken (0 = unbegrenzt)."
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Verzögerung beim Senden von Blöcken nach dem Bauen"
 
 #: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
@@ -1866,14 +1896,6 @@ msgid "Desynchronize block animation"
 msgstr "Blockanimationen desynchronisieren"
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "Detaillierte Mod-Profildaten. Nützlich für Mod-Entwickler."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Detailliertes Mod-Profiling"
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1888,6 +1910,23 @@ msgid "Disable anticheat"
 msgstr "Anti-Cheat deaktivieren"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Escape-Sequenzen deaktivieren"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Escape-Sequenzen deaktivieren, z.B. Chatfarben.\n"
+"Benutzen Sie dies, falls Sie einen Server laufen lassen möchten, der Clients "
+"vor\n"
+"0.4.14 bedienen soll und Sie die von Mods generierten Escape-Sequenzen\n"
+"deaktivieren wollen."
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "Leere Passwörter verbieten"
 
@@ -1912,6 +1951,10 @@ msgid "Dump the mapgen debug infos."
 msgstr "Die Kartengenerator-Debuginformationen auf Konsole ausgeben."
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Joysticks aktivieren"
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "VBO aktivieren"
 
@@ -2021,6 +2064,14 @@ msgstr ""
 "Hierfür müssen Shader aktiviert sein."
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Engine-Profiling-Datenausgabeintervall"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Entity-Methoden"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2082,11 +2133,23 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Field of view"
-msgstr "Gesichtsfeld"
+msgstr "Sichtfeld"
+
+#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Sichtfeld für Zoom"
 
 #: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
-msgstr "Gesichtsfeld in Grad."
+msgstr "Sichtfeld in Grad."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Sichtfeld beim Zoomen, in Grad.\n"
+"Dazu wird das „zoom“-Privileg auf dem Server benötigt."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2199,8 +2262,8 @@ msgstr ""
 msgid ""
 "From how far clients know about objects, stated in mapblocks (16 nodes)."
 msgstr ""
-"Maximale Entfernung, in der Clients über Objekte bescheid wissen, in\n"
-"Kartenblöcken (16 Blöcke) angegeben."
+"Maximale Entfernung, in der Clients über die Existenz von Objekte wissen,\n"
+"in Kartenblöcken (16 Blöcke) angegeben."
 
 #: src/settings_translation_file.cpp
 msgid "Full screen"
@@ -2239,23 +2302,22 @@ msgid "Generate normalmaps"
 msgstr "Normalmaps generieren"
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr "Globale Rückruffunktionen"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
 "Globale Kartengenerierungsattribute.\n"
 "Im Kartengenerator v6 wird das „decorations“-Flag alle Dekorationen außer\n"
-"Bäume und Dschungelgras aktivieren, in allen anderen Kartengeneratoren\n"
-"wird dieses Flag alle Dekorationen aktivieren.\n"
-"Die von der Engine standardmäßig gesetzten Flags lauten:\n"
-"„caves, light, decorations“.\n"
-"Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
+"Bäume und Dschungelgras beinflussen, in allen anderen Kartengeneratoren\n"
+"wird es alle Dekorationen beinflussen.\n"
 "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
 "werden von der Standardeinstellung unverändert gelassen.\n"
 "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
@@ -2287,13 +2349,28 @@ msgstr ""
 "Handhabung für veraltete Lua-API-Aufrufe:\n"
 "- legacy: Versuchen, altes Verhalten zu imitieren (Standard für Release).\n"
 "- log: Imitieren, und den Backtrace des veralteten Funktionsaufrufs "
-"protokollieren (Standard für\n"
-"  Debug).\n"
+"protokollieren\n"
+"  (Standard für Debug).\n"
 "- error: Bei Verwendung eines veralteten Funktionsaufrufs abbrechen ("
 "empfohlen für Mod-\n"
 "  Entwickler)."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+"Den Profiler sich selbst instrumentieren lassen:\n"
+"* Instrumentiert eine leere Funktion.\n"
+"Dies schätzt den Overhead, der von der Instrumentierung hinzugefügt wird, ab "
+"(+1 Funktionsaufruf).\n"
+"* Instrumentiert die Abtastfunktion, die zur Aktualisierung der Statistiken "
+"benutzt wird."
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr "Höhenkomponente der anfänglichen Fenstergröße."
 
@@ -2320,24 +2397,11 @@ msgid ""
 "In active blocks objects are loaded and ABMs run."
 msgstr ""
 "Wie groß das Gebiet ist, in dem Kartenblöcke aktiv sind.\n"
-"In aktiven Blöcken werden Objekte geladen und ABMs ausgeführt.\n"
+"In aktiven Kartenblöcken werden Objekte geladen und ABMs ausgeführt.\n"
 "1 Kartenblock = 16×16×16 Blöcke."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-"Wie viele Kartenblöcke gleichzeitig für den gesamten Server auf der Leitung "
-"unterwegs sind."
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-"Wie viele Kartenblöcke gleichzeitig pro Client auf der Leitung unterwegs "
-"sind."
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2462,6 +2526,48 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr "Hintergrundfarbe (R,G,B) der Chat-Konsole im Spiel."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"„builtin“ instrumentieren.\n"
+"Dies wird normalerweise nur von Haupt-/builtin-Entwicklern benötigt"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Chatbefehle bei ihrer Registrierung instrumentieren."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Globale Rückruffunktionen bei ihrer Registrierung instrumentieren\n"
+"(alles, was man einer Funktion wie minetest.register_*() übergibt)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+"Die action-Funktion von Active-Block-Modifiers bei ihrer Registrierung "
+"instrumentieren."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+"Die action-Funktion von Loading-Block-Modifiers bei ihrer Registrierung "
+"instrumentieren."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Die Methoden von Entitys bei ihrer Registrierung instrumentieren."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Instrumentierung"
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 "Zeitintervall des Abspeicherns wichtiger Änderungen in der Welt,\n"
@@ -2500,6 +2606,14 @@ msgstr ""
 "Steuert die Skalierung mit einem sehr hohem Detailgrad."
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Joystick-Button-Wiederholungsrate"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "Joystick-Pyramidenstumpf-Empfindlichkeit"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2507,8 +2621,8 @@ msgid ""
 "Range roughly -2 to 2."
 msgstr ""
 "Nur für Juliamenge: W-Komponente der hyperkomplexen Konstanten, welche die "
-"Juliaform festlegt.\n"
-"Hat keine Wirkung auf 3D-Fraktale.\n"
+"Juliaform\n"
+"festlegt. Hat keine Wirkung auf 3D-Fraktale.\n"
 "Reichweite liegt grob zwischen -2 und 2."
 
 #: src/settings_translation_file.cpp
@@ -2725,6 +2839,16 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Taste zum Umschalten des automatischen Vorwärtsgehens.\n"
+"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2775,7 +2899,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2887,8 +3011,8 @@ msgid ""
 "updated over network."
 msgstr ""
 "Länge eines Servertakts und dem Zeitintervall, in dem Objekte über das "
-"Netzwerk üblicherweise\n"
-"aktualisiert werden."
+"Netzwerk\n"
+"üblicherweise aktualisiert werden."
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between ABM execution cycles"
@@ -2944,7 +3068,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Liquid fluidity"
-msgstr "Flüssigkeitswiederstand"
+msgstr "Flüssigkeitswiderstand"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid fluidity smoothing"
@@ -2971,6 +3095,24 @@ msgid "Liquid update tick"
 msgstr "Flüssigkeitsaktualisierungstakt"
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Spielprofiler laden"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+"Den Spielprofiler laden, um Profilingdaten für das Spiel zu sammeln.\n"
+"Aktiviert den „/profiler“-Befehl, um auf das erzeugte Profil zuzugreifen.\n"
+"Nützlich für Modentwickler und Serverbetreiber."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Loading Block Modifiers"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr "Hauptmenü-Spiel-Manager"
 
@@ -3007,20 +3149,17 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
 "Kartengenerierungsattribute speziell für den Kartengenerator „Täler“.\n"
 "„altitude_chill“ macht höhere Höhen kälter, was ein paar Biomprobleme "
-"hervorrufen könnte.\n"
+"hervorrufen\n"
+"könnte.\n"
 "„humid_rivers“ modifiert die Luftfeuchtigkeit um Flüssen und in Gebieten, wo "
-"sich Wasser\n"
-"ansammeln würde; es könnte fein abgestimmte Biomen beeinträchtigen.\n"
-"Die von der Engine standardmäßig gesetzten Flags lauten:\n"
-"„altitude_chill, humid_rivers“.\n"
+"sich\n"
+"Wasser ansammeln würde; es könnte fein abgestimmte Biomen beeinträchtigen.\n"
 "Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
 "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
 "werden von der Standardeinstellung unverändert gelassen.\n"
@@ -3031,16 +3170,13 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
 "Kartengenerierungsattribute speziell für den flachen Kartengenerator.\n"
-"Gelegentlich werden Seen und Hügel zur flachen Welt hinzugefügt.\n"
-"Die von der Engine standardmäßig gesetzten Flags sind: keine.\n"
-"Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
+"Zu einer flachen Welt können gelegentliche Seen und Hügel hinzugefügt "
+"werden.\n"
 "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
 "werden von der Standardeinstellung unverändert gelassen.\n"
 "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
@@ -3051,8 +3187,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3061,9 +3195,6 @@ msgstr ""
 "Falls Schneebiome aktiviert, werden Dschungel aktiviert und das „jungles“-"
 "Flag\n"
 "wird ignoriert.\n"
-"Die von der Engine standardmäßig gesetzten Flags lauten:\n"
-"„biomeblend, mudflow“.\n"
-"Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
 "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
 "werden von der Standardeinstellung unverändert gelassen.\n"
 "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
@@ -3073,17 +3204,12 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Kartengenerierungsattribute speziell für den Kartengenerator v7.\n"
+"Kartengenerierungsattribute speziell für Kartengenerator v7.\n"
 "Das „ridges“-Flag steuert die Flüsse.\n"
-"Die von der Engine standardmäßig gesetzten Flags lauten:\n"
-"„mountains, ridges“.\n"
-"Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
 "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
 "werden von der Standardeinstellung unverändert gelassen.\n"
 "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
@@ -3442,6 +3568,15 @@ msgid "Maximum hotbar width"
 msgstr "Max. Breite der Schnellzugriffsleiste"
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "Maximale Gesamtanzahl der Blöcke, die gleichzeitig gesendet werden."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+"Maximale Anzahl der Blöcke, die gleichzeitig je Client gesendet werden."
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr "Maximale Anzahl der Kartenblöcke in der Ladewarteschlange."
 
@@ -3499,6 +3634,10 @@ msgstr ""
 "Maximale Anzahl der statisch gespeicherten Objekte in einem Kartenblock."
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Maximale Objekte pro Block"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
@@ -3508,12 +3647,12 @@ msgstr ""
 "etwas gibt, was links oder rechts von ihr angezeigt werden soll."
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr "Max. gleichzeitig versendete Kartenblöcke pro Client"
+msgid "Maximum simultaneous block sends per client"
+msgstr "Max. gleichzeitig versendete Blöcke pro Client"
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
-msgstr "Max. gleichzeitig versendete Kartenblöcke"
+msgid "Maximum simultaneous block sends total"
+msgstr "Max. gleichzeitig versendete Blöcke (gesamt)"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum time in ms a file download (e.g. a mod download) may take."
@@ -3526,10 +3665,6 @@ msgid "Maximum users"
 msgstr "Maximale Benutzerzahl"
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Maximale Objekte pro Kartenblock"
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "Menüs"
 
@@ -3573,10 +3708,6 @@ msgid "Mipmapping"
 msgstr "Mip-Mapping"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr "Mod-Profiling"
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr "Modspeicher: Details-URL"
 
@@ -3820,21 +3951,29 @@ msgstr ""
 "Shell-Kommandos, benutzen können."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+"Gibt die Profiling-Daten der Engine in regelmäßigen Abständen aus (in "
+"Sekunden).\n"
+"„0“ deaktiviert das Profiling. Nützlich für Entwickler."
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr "Privilegien, die Spieler mit basic_privs gewähren können"
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr ""
-"Profiler-Datenausgabeintervall. 0 = deaktivieren. Nützlich für Entwickler."
+msgid "Profiler"
+msgstr "Profiler"
 
 #: src/settings_translation_file.cpp
 msgid "Profiler toggle key"
 msgstr "Profiler-Umschalten-Taste"
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "Profiler-Ausgabeintervall"
+msgid "Profiling"
+msgstr "Profiling"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3842,7 +3981,7 @@ msgid ""
 "Values larger than 26 will start to produce sharp cutoffs at cloud area "
 "corners."
 msgstr ""
-"Radius des Wolkenbereichs; In Einheiten von 64 Blöcken.\n"
+"Radius des Wolkenbereichs; In Einheiten von 64 Wolkenquadraten.\n"
 "Werte größer als 26 werden scharfe Schnittkanten an den Ecken des Wolken-\n"
 "bereichs erzeugen."
 
@@ -3871,6 +4010,10 @@ msgid "Replaces the default main menu with a custom one."
 msgstr "Ersetzt das Standardhauptmenü mit einem benutzerdefinierten Hauptmenü."
 
 #: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Berichtspfad"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "Rechtstaste"
 
@@ -4045,14 +4188,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
 "Shader werden für fortgeschrittene visuelle Effekte benötigt und können die "
-"Performanz\n"
-"auf einigen Grafikkarten erhöhen.\n"
-"Funktioniert nur mit dem OpenGL-Backend."
+"Performanz auf einigen Grafikkarten erhöhen.\n"
+"Sie funktionieren nur mit dem OpenGL-Grafik-Backend."
 
 #: src/settings_translation_file.cpp
 msgid "Shape of the minimap. Enabled = round, disabled = square."
@@ -4064,7 +4206,7 @@ msgstr "Debug-Info zeigen"
 
 #: src/settings_translation_file.cpp
 msgid "Show entity selection boxes"
-msgstr "Entitiy-Auswahlboxen zeigen"
+msgstr "Entity-Auswahlboxen zeigen"
 
 #: src/settings_translation_file.cpp
 msgid "Shutdown message"
@@ -4088,11 +4230,12 @@ msgstr "Geglättetes Licht"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
-"Glättet Kamerabewegungen bei der Fortbewegung und\n"
-"beim Umsehen. Nützlich zum Aufnehmen von Videos."
+"Glättet Kamerabewegungen bei der Fortbewegung und beim Umsehen. Auch bekannt "
+"als „Look Smoothing“ oder „Mouse Smoothing“.\n"
+"Nützlich zum Aufnehmen von Videos."
 
 #: src/settings_translation_file.cpp
 msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
@@ -4182,10 +4325,26 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr "Die Höhe, ab der die Temperatur um 20 °C fällt"
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+"Das Standardformat, in dem Profile gespeichert werden,\n"
+"wenn „/profiler save [Format]“ ohne Format aufgerufen wird."
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr "Die Tiefe von Erde oder einem anderem Füller"
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+"Der Dateipfad relativ zu Ihrem Weltpfad, in dem Profile abgespeichert "
+"werden.\n"
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr "Die Netzwerkschnittstelle, auf die der Server lauscht."
 
@@ -4205,6 +4364,14 @@ msgstr "Das Render-Backend für Irrlicht."
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+"Die Empfindlichkeit der Joystick-Achsen, um den\n"
+"Pyramidenstumpf der Spielansicht herumzubewegen."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -4231,6 +4398,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"Das Intervall in Sekunden, in dem Ereignisse wiederholt werden,\n"
+"wenn eine Joystick-Tastenkombination gedrückt gehalten wird."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -4275,11 +4450,10 @@ msgid ""
 "This determines how long they are slowed down after placing or removing a "
 "node."
 msgstr ""
-"Um Verzögerungen zu reduzieren, werden Kartenblockübertragungen verlangsamt, "
-"während\n"
-"ein Spieler etwas baut. Diese Einstellung bestimmt, wie lange sie "
-"verlangsamt sind,\n"
-"nachdem ein Block platziert oder entfernt wurde."
+"Um Verzögerungen zu reduzieren, werden Kartenblockübertragungen verlangsamt,"
+"\n"
+"wenn ein Spieler etwas baut. Diese Einstellung bestimmt, wie lange sie\n"
+"verlangsamt werden, nachdem ein Block platziert oder entfernt wurde."
 
 #: src/settings_translation_file.cpp
 msgid "Toggle camera mode key"
@@ -4354,10 +4528,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr "Trilineare Filterung bei der Skalierung von Texturen benutzen."
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Nützlich für Mod-Entwickler."
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr "Vertikale Synchronisation"
 
@@ -4493,13 +4663,14 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 "Falls gui_scaling_filter_txr2img auf „wahr“ gesetzt ist, werden\n"
 "diese Bilder von der Hardware zur Software für die Skalierung\n"
-"kopiert. Falls es auf „falsch“ gesetzt ist, wird für alte Videotreiber,\n"
-"die das Herunterladen von Texturen zurück von der Hardware\n"
-"nicht vernünftig unterstützen."
+"kopiert. Falls es auf „falsch“ gesetzt ist, wird die alte Skalierungs-\n"
+"methode angewandt, für Grafiktreiber, welche das\n"
+"Herunterladen von Texturen zurück von der Hardware nicht\n"
+"korrekt unterstützen."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4534,12 +4705,12 @@ msgstr ""
 "Wo der Kartengenerator aufhört.\n"
 "Bitte beachten Sie:\n"
 "-    Begrenzt auf 31000 (größere Werte sind wirkungslos).\n"
-"-    Der Kartengenerator arbeitet in Gruppen von 80×80×80 Blöcken (5×5×5 "
-"Kartenblöcke).\n"
+"-    Der Kartengenerator arbeitet in Gruppen von 80×80×80 Blöcken\n"
+"     (5×5×5 Kartenblöcke).\n"
 "-    Diese Gruppen haben einen Abstand von [-32, -32] Blöcken vom Ursprung.\n"
 "-    Nur Gruppen, welche innerhalb der von map_generation_limit definierten "
-"Grenze liegen,\n"
-"     werden erzeugt."
+"Grenze\n"
+"     liegen, werden erzeugt."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4635,409 +4806,450 @@ msgstr "cURL-Parallel-Begrenzung"
 msgid "cURL timeout"
 msgstr "cURL-Zeitüberschreitung"
 
-#~ msgid "Item textures..."
-#~ msgstr "Inventarbilder ..."
-
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
-#~ msgstr ""
-#~ "Eine etwas niedrigere Wasseroberfläche aktivieren, damit der Node\n"
-#~ "nicht vollständig „gefüllt“ wird. Beachten Sie, dass dies nicht wirklich\n"
-#~ "optimiert wurde, und dass weiches Licht auf der Wasseroberfläche\n"
-#~ "nicht mit dieser Einstellung funktioniert."
-
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
-#~ msgstr "Blöcke bei Auswahl aufleuchten lassen (Deaktiviert die Auswahlbox)."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "Detaillierte Mod-Profildaten. Nützlich für Mod-Entwickler."
 
-#~ msgid ""
-#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
-#~ msgstr ""
-#~ "Julia-Menge: (X,Y,Z)-Versatz vom Mittelpunkt der Welt.\n"
-#~ "Reichweite liegt grob von -2 bis 2, wird mit j_scale für Versätze in\n"
-#~ "Nodes multipliziert."
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Detailliertes Mod-Profiling"
 
 #~ msgid ""
-#~ "Julia set: W value determining the 4D shape.\n"
-#~ "Range roughly -2 to 2."
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
 #~ msgstr ""
-#~ "Julia-Menge: W-Wert, der die 4D-Form festlegt.\n"
-#~ "Weite liegt grob zwischen -2 und 2."
+#~ "Wie viele Kartenblöcke gleichzeitig für den gesamten Server auf der "
+#~ "Leitung unterwegs sind."
 
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
 #~ msgstr ""
-#~ "Taste zur Reduzierung der Sichtweite. Verändert die minimale Sichtweite.\n"
-#~ "Siehe http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ "Wie viele Kartenblöcke gleichzeitig pro Client auf der Leitung unterwegs "
+#~ "sind."
 
-#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Taste zur Erhöhung der Sichtweite. Verändert die minimale Sichtweite.\n"
-#~ "Siehe http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Nützlich für Mod-Entwickler."
 
-#~ msgid ""
-#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
-#~ msgstr ""
-#~ "Mandelbrotmenge: (X,Y,Z)-Versatz vom Mittelpunkt der Welt.\n"
-#~ "Reichweite liegt grob von -2 bis 2, wird mit m_scale für\n"
-#~ "Versätze in Nodes multipliziert."
+#~ msgid "No of course not!"
+#~ msgstr "Nein, natürlich nicht!"
 
-#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
-#~ msgstr "Mandelbrotmenge: Approximative (X,Y,Z)-Skalierungen in Nodes."
+#~ msgid "Public Serverlist"
+#~ msgstr "Öffentliche Serverliste"
 
-#~ msgid ""
-#~ "Mandelbrot set: Iterations of the recursive function.\n"
-#~ "Controls scale of finest detail."
-#~ msgstr ""
-#~ "Mandelbrotmenge: Iterationen der rekursiven Funktion.\n"
-#~ "Steuert die Skalierung mit einem sehr hohem Detailgrad."
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Normalmaps generieren"
 
-#~ msgid ""
-#~ "Mandelbrot set: W co-ordinate of the generated 3D slice of the 4D shape.\n"
-#~ "Range roughly -2 to 2."
-#~ msgstr ""
-#~ "Madnelbrotmenge: W-Koordinate des generierten 3D-Ausschnitts der 4D-"
-#~ "Form.\n"
-#~ "Die Weite liegt grob zwischen -2 und 2."
+#~ msgid "No!!!"
+#~ msgstr "Nein!!!"
 
 #~ msgid ""
-#~ "Map generation attributes specific to Mapgen fractal.\n"
-#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
 #~ msgstr ""
-#~ "Kartengenerierungsattribute, die speziell für den Fraktale-\n"
-#~ "Kartenerzeuger sind.\n"
-#~ "„julia“ wählt für die Erzeugung eine Julia-Menge statt einer\n"
-#~ "Mandelbrotmenge aus.\n"
-#~ "Bitschalter, welche in der Bitschalterzeichenkette nicht angegeben sind,\n"
+#~ "Kartengenerierungsattribute speziell für den Täler-Kartengenerator.\n"
+#~ "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
 #~ "werden von der Standardeinstellung unverändert gelassen.\n"
-#~ "Bitschalter, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
-#~ "zu deaktivieren."
+#~ "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
+#~ "zu deaktivieren.\n"
+#~ "„altitude_chill“ macht höhere Höhen kälter, was zu einigen Biomproblemen "
+#~ "führen könnte.\n"
+#~ "„humid_rivers“ modifiziert die Luftfeuchtigkeit um Flüssen und in "
+#~ "Gebieten, in denen das Wasser sich in Pfützen ansammeln würde.\n"
+#~ "Dies könnte mit fein abgestimmten Biomen zu Konflikten führen."
 
-#~ msgid "Mapgen fractal mandelbrot iterations"
-#~ msgstr "Mandelbrotiterationen für Fraktale-Kartenerzeuger"
+#, fuzzy
+#~ msgid "\""
+#~ msgstr "”"
 
-#~ msgid "Mapgen fractal mandelbrot offset"
-#~ msgstr "Mandelbrotversatz für Fraktale-Kartenerzeuger"
+#~ msgid "Enable a bit lower water surface, so it doesn't "
+#~ msgstr "Senkt ein bisschen den Wasserspiegel, so tut es nicht "
 
-#~ msgid "Mapgen fractal mandelbrot scale"
-#~ msgstr "Mandelbrotskalierung für Fraktale-Kartenerzeuger"
+#~ msgid "If disabled "
+#~ msgstr "Wenn deaktiviert "
 
-#~ msgid "Mapgen fractal mandelbrot slice w"
-#~ msgstr "Mandelbrot-w-Ausschnitt für Fraktale-Kartenerzeuger"
+#~ msgid "If enabled, "
+#~ msgstr "Wenn aktiviert, "
 
-#~ msgid ""
-#~ "Maximum distance above water level for player spawn.\n"
-#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
-#~ "Smaller values may result in a suitable spawn point not being found,\n"
-#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
-#~ msgstr ""
-#~ "Höchstabstand über dem Meeresspiegel für den Spieler-\n"
-#~ "startpunkt. Größere Werte führen zu Startpunkten näher an\n"
-#~ "(x = 0, z = 0). Kleinere Werte können dazu führen, dass kein\n"
-#~ "brauchbarer Startpunkt gefunden wird, was wiederum zu einem\n"
-#~ "Startpunkt bei (0, 0, 0) führt, der möglicherweise im Untergrund\n"
-#~ "eingegraben ist."
+#~ msgid "Rendering:"
+#~ msgstr "Rendering:"
+
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Neustart nach Ändern des Treibers erforderlich"
+
+#~ msgid "Downloading"
+#~ msgstr "Lade herunter"
+
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Linksklick: Alle Items bewegen, Rechtsklick: Einzelnes Item bewegen"
+
+#~ msgid "is required by:"
+#~ msgstr "wird benötigt von:"
+
+#~ msgid "Configuration saved.  "
+#~ msgstr "Konfiguration gespeichert.  "
+
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Warnung: Konfiguration nicht konsistent.  "
+
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Kann Welt nicht erstellen: Name enthält ungültige Zeichen"
+
+#~ msgid "Show Public"
+#~ msgstr "Zeige öffentliche"
+
+#~ msgid "Show Favorites"
+#~ msgstr "Zeige Favoriten"
+
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Lasse die Adresse frei um einen eigenen Server zu starten."
+
+#~ msgid "Create world"
+#~ msgstr "Welt erstellen"
+
+#~ msgid "Address required."
+#~ msgstr "Adresse benötigt."
+
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Kann Welt nicht löchen: Nichts ausgewählt"
+
+#~ msgid "Files to be deleted"
+#~ msgstr "Zu löschende Dateien"
+
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Kann Welt nicht erstellen: Keine Spiele gefunden"
+
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Kann Welt nicht konfigurieren: Nichts ausgewählt"
+
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Es konnten nicht alle Welt Dateien gelöscht werden"
 
 #~ msgid ""
-#~ "Minimum wanted FPS.\n"
-#~ "The amount of rendered stuff is dynamically set according to this. and "
-#~ "viewing range min and max."
+#~ "Default Controls:\n"
+#~ "- WASD: Walk\n"
+#~ "- Mouse left: dig/hit\n"
+#~ "- Mouse right: place/use\n"
+#~ "- Mouse wheel: select item\n"
+#~ "- 0...9: select item\n"
+#~ "- Shift: sneak\n"
+#~ "- R: Toggle viewing all loaded chunks\n"
+#~ "- I: Inventory menu\n"
+#~ "- ESC: This menu\n"
+#~ "- T: Chat\n"
 #~ msgstr ""
-#~ "Minimal gewünschte Bildwiederholrate.\n"
-#~ "Die Anzahl der berechneten Dinge wird anhand dieses Werts dynamisch "
-#~ "angepasst; auch\n"
-#~ "die minimale und maximale Sichtweite werden angepasst."
+#~ "Steuerung:\n"
+#~ "- WASD: Gehen\n"
+#~ "- Linksklick: Graben/Schlagen\n"
+#~ "- Rechtsklick: Platzieren\n"
+#~ "- Mausrad: Item auswählen\n"
+#~ "- 0...9: Item auswählen\n"
+#~ "- Shift: Schleichen\n"
+#~ "- R: alle geladenen Blöcke anzeigen (wechseln)\n"
+#~ "- I: Inventar\n"
+#~ "- T: Chat\n"
 
-#~ msgid "New style water"
-#~ msgstr "Wasser im neuen Stil"
+#~ msgid "Delete map"
+#~ msgstr "Karte löschen"
+
+#~ msgid "KEYBINDINGS"
+#~ msgstr "TASTEN EINST."
 
 #~ msgid ""
-#~ "Pre-generate all item visuals used in the inventory.\n"
-#~ "This increases startup time, but runs smoother in-game.\n"
-#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
-#~ "the inventory."
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration.  "
 #~ msgstr ""
-#~ "Alle Itembilder im Inventar vor dem Spielstart erzeugen.\n"
-#~ "Dies erhöht die Vorbereitungszeit, wird aber zu einem flüssigerem Spiel "
-#~ "führen.\n"
-#~ "Die erzeugten Texturen können Ihr VRAM leicht überlasten, was Artefakte "
-#~ "im Inventar\n"
-#~ "verursachen kann."
-
-#~ msgid "Preload inventory textures"
-#~ msgstr "Texturen vorgenerieren"
+#~ "Warnung: Einige konfigurierte Mods fehlen.\n"
+#~ "Mod Einstellungen werden gelöscht wenn die Konfiguration gespeichert "
+#~ "wird.  "
 
 #~ msgid ""
-#~ "The allowed adjustment range for the automatic rendering range "
-#~ "adjustment.\n"
-#~ "Set this to be equal to viewing range minimum to disable the auto-"
-#~ "adjustment algorithm."
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration.  "
 #~ msgstr ""
-#~ "Die erlaubte Anpassungsreichweite für die automatische Render-"
-#~ "Reichweitenanpassung.\n"
-#~ "Setzen Sie den Wert auf den gleichen Wert wie die minimale Sichtweite, um "
-#~ "den automatischen\n"
-#~ "Anpassungsalgorithmus zu deaktivieren."
+#~ "Warnung: Einige Mods sind noch nicht konfiguriert.\n"
+#~ "Sie werden aktiviert wenn die Konfiguration gespeichert wird.  "
 
-#~ msgid "Vertical initial window size."
-#~ msgstr "Anfängliche Fensterhöhe."
+#~ msgid "Local install"
+#~ msgstr "Lokale Install."
 
-#~ msgid "Vertical spawn range"
-#~ msgstr "Vertikaler Startpunktbereich"
+#~ msgid "Add mod:"
+#~ msgstr "Modifikation hinzufügen:"
 
-#~ msgid "Viewing range minimum"
-#~ msgstr "Minimale Sichtweite"
+#~ msgid "MODS"
+#~ msgstr "MODS"
 
-#~ msgid "Wanted FPS"
-#~ msgstr "Gewünschte Bildwiederholrate"
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "TEXTUREN PAKETE"
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Einzelspielerwelt zurücksetzen"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "EINZELSPIELER"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Auf Menüelemente angewandter Skalierfaktor: "
+#~ msgid "Finite Liquid"
+#~ msgstr "Endliches Wasser"
 
-#~ msgid "Touch free target"
-#~ msgstr "Berührungsfreies Ziel"
+#~ msgid "Preload item visuals"
+#~ msgstr "Lade Inventarbilder vor"
 
-#~ msgid " KB/s"
-#~ msgstr " KB/s"
+#~ msgid "SETTINGS"
+#~ msgstr "EINSTELLUNGEN"
 
-#~ msgid " MB/s"
-#~ msgstr " MB/s"
+#~ msgid "Password"
+#~ msgstr "Passwort"
 
-#~ msgid "Game Name"
-#~ msgstr "Spielname"
+#~ msgid "Name"
+#~ msgstr "Name"
 
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Kann mod \"$1\" nicht in Spiel \"$2\" kopieren"
+#~ msgid "START SERVER"
+#~ msgstr "SERVER STARTEN"
 
-#~ msgid "GAMES"
-#~ msgstr "SPIELE"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENT"
 
-#~ msgid "Mods:"
-#~ msgstr "Mods:"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Mod hinzufügen"
 
-#~ msgid "new game"
-#~ msgstr "neues Spiel"
+#~ msgid "Remove selected mod"
+#~ msgstr "Ausgewählte Mod löschen"
 
 #~ msgid "EDIT GAME"
 #~ msgstr "SPIEL ÄNDERN"
 
-#~ msgid "Remove selected mod"
-#~ msgstr "Ausgewählte Mod löschen"
-
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Mod hinzufügen"
+#~ msgid "new game"
+#~ msgstr "neues Spiel"
 
-#~ msgid "CLIENT"
-#~ msgstr "CLIENT"
+#~ msgid "Mods:"
+#~ msgstr "Mods:"
 
-#~ msgid "START SERVER"
-#~ msgstr "SERVER STARTEN"
+#~ msgid "GAMES"
+#~ msgstr "SPIELE"
 
-#~ msgid "Name"
-#~ msgstr "Name"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Kann mod \"$1\" nicht in Spiel \"$2\" kopieren"
 
-#~ msgid "Password"
-#~ msgstr "Passwort"
+#~ msgid "Game Name"
+#~ msgstr "Spielname"
 
-#~ msgid "SETTINGS"
-#~ msgstr "EINSTELLUNGEN"
+#~ msgid " MB/s"
+#~ msgstr " MB/s"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Lade Inventarbilder vor"
+#~ msgid " KB/s"
+#~ msgstr " KB/s"
 
-#~ msgid "Finite Liquid"
-#~ msgstr "Endliches Wasser"
+#~ msgid "Touch free target"
+#~ msgstr "Berührungsfreies Ziel"
 
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "EINZELSPIELER"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Auf Menüelemente angewandter Skalierfaktor: "
 
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "TEXTUREN PAKETE"
+#~ msgid "Wanted FPS"
+#~ msgstr "Gewünschte Bildwiederholrate"
 
-#~ msgid "MODS"
-#~ msgstr "MODS"
+#~ msgid "Viewing range minimum"
+#~ msgstr "Minimale Sichtweite"
 
-#~ msgid "Add mod:"
-#~ msgstr "Modifikation hinzufügen:"
+#~ msgid "Vertical spawn range"
+#~ msgstr "Vertikaler Startpunktbereich"
 
-#~ msgid "Local install"
-#~ msgstr "Lokale Install."
+#~ msgid "Vertical initial window size."
+#~ msgstr "Anfängliche Fensterhöhe."
 
 #~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration.  "
+#~ "The allowed adjustment range for the automatic rendering range "
+#~ "adjustment.\n"
+#~ "Set this to be equal to viewing range minimum to disable the auto-"
+#~ "adjustment algorithm."
 #~ msgstr ""
-#~ "Warnung: Einige Mods sind noch nicht konfiguriert.\n"
-#~ "Sie werden aktiviert wenn die Konfiguration gespeichert wird.  "
+#~ "Die erlaubte Anpassungsreichweite für die automatische Render-"
+#~ "Reichweitenanpassung.\n"
+#~ "Setzen Sie den Wert auf den gleichen Wert wie die minimale Sichtweite, um "
+#~ "den automatischen\n"
+#~ "Anpassungsalgorithmus zu deaktivieren."
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "Texturen vorgenerieren"
 
 #~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
+#~ "Pre-generate all item visuals used in the inventory.\n"
+#~ "This increases startup time, but runs smoother in-game.\n"
+#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
+#~ "the inventory."
 #~ msgstr ""
-#~ "Warnung: Einige konfigurierte Mods fehlen.\n"
-#~ "Mod Einstellungen werden gelöscht wenn die Konfiguration gespeichert "
-#~ "wird.  "
-
-#~ msgid "KEYBINDINGS"
-#~ msgstr "TASTEN EINST."
+#~ "Alle Itembilder im Inventar vor dem Spielstart erzeugen.\n"
+#~ "Dies erhöht die Vorbereitungszeit, wird aber zu einem flüssigerem Spiel "
+#~ "führen.\n"
+#~ "Die erzeugten Texturen können Ihr VRAM leicht überlasten, was Artefakte "
+#~ "im Inventar\n"
+#~ "verursachen kann."
 
-#~ msgid "Delete map"
-#~ msgstr "Karte löschen"
+#~ msgid "New style water"
+#~ msgstr "Wasser im neuen Stil"
 
 #~ msgid ""
-#~ "Default Controls:\n"
-#~ "- WASD: Walk\n"
-#~ "- Mouse left: dig/hit\n"
-#~ "- Mouse right: place/use\n"
-#~ "- Mouse wheel: select item\n"
-#~ "- 0...9: select item\n"
-#~ "- Shift: sneak\n"
-#~ "- R: Toggle viewing all loaded chunks\n"
-#~ "- I: Inventory menu\n"
-#~ "- ESC: This menu\n"
-#~ "- T: Chat\n"
+#~ "Minimum wanted FPS.\n"
+#~ "The amount of rendered stuff is dynamically set according to this. and "
+#~ "viewing range min and max."
 #~ msgstr ""
-#~ "Steuerung:\n"
-#~ "- WASD: Gehen\n"
-#~ "- Linksklick: Graben/Schlagen\n"
-#~ "- Rechtsklick: Platzieren\n"
-#~ "- Mausrad: Item auswählen\n"
-#~ "- 0...9: Item auswählen\n"
-#~ "- Shift: Schleichen\n"
-#~ "- R: alle geladenen Blöcke anzeigen (wechseln)\n"
-#~ "- I: Inventar\n"
-#~ "- T: Chat\n"
-
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Es konnten nicht alle Welt Dateien gelöscht werden"
-
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Kann Welt nicht konfigurieren: Nichts ausgewählt"
-
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Kann Welt nicht erstellen: Keine Spiele gefunden"
-
-#~ msgid "Files to be deleted"
-#~ msgstr "Zu löschende Dateien"
-
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Kann Welt nicht löchen: Nichts ausgewählt"
+#~ "Minimal gewünschte Bildwiederholrate.\n"
+#~ "Die Anzahl der berechneten Dinge wird anhand dieses Werts dynamisch "
+#~ "angepasst; auch\n"
+#~ "die minimale und maximale Sichtweite werden angepasst."
 
-#~ msgid "Address required."
-#~ msgstr "Adresse benötigt."
+#~ msgid ""
+#~ "Maximum distance above water level for player spawn.\n"
+#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
+#~ "Smaller values may result in a suitable spawn point not being found,\n"
+#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
+#~ msgstr ""
+#~ "Höchstabstand über dem Meeresspiegel für den Spieler-\n"
+#~ "startpunkt. Größere Werte führen zu Startpunkten näher an\n"
+#~ "(x = 0, z = 0). Kleinere Werte können dazu führen, dass kein\n"
+#~ "brauchbarer Startpunkt gefunden wird, was wiederum zu einem\n"
+#~ "Startpunkt bei (0, 0, 0) führt, der möglicherweise im Untergrund\n"
+#~ "eingegraben ist."
 
-#~ msgid "Create world"
-#~ msgstr "Welt erstellen"
+#~ msgid "Mapgen fractal mandelbrot slice w"
+#~ msgstr "Mandelbrot-w-Ausschnitt für Fraktale-Kartenerzeuger"
 
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Lasse die Adresse frei um einen eigenen Server zu starten."
+#~ msgid "Mapgen fractal mandelbrot scale"
+#~ msgstr "Mandelbrotskalierung für Fraktale-Kartenerzeuger"
 
-#~ msgid "Show Favorites"
-#~ msgstr "Zeige Favoriten"
+#~ msgid "Mapgen fractal mandelbrot offset"
+#~ msgstr "Mandelbrotversatz für Fraktale-Kartenerzeuger"
 
-#~ msgid "Show Public"
-#~ msgstr "Zeige öffentliche"
+#~ msgid "Mapgen fractal mandelbrot iterations"
+#~ msgstr "Mandelbrotiterationen für Fraktale-Kartenerzeuger"
 
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Kann Welt nicht erstellen: Name enthält ungültige Zeichen"
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen fractal.\n"
+#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ msgstr ""
+#~ "Kartengenerierungsattribute, die speziell für den Fraktale-\n"
+#~ "Kartenerzeuger sind.\n"
+#~ "„julia“ wählt für die Erzeugung eine Julia-Menge statt einer\n"
+#~ "Mandelbrotmenge aus.\n"
+#~ "Bitschalter, welche in der Bitschalterzeichenkette nicht angegeben sind,\n"
+#~ "werden von der Standardeinstellung unverändert gelassen.\n"
+#~ "Bitschalter, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
+#~ "zu deaktivieren."
 
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Warnung: Konfiguration nicht konsistent.  "
+#~ msgid ""
+#~ "Mandelbrot set: W co-ordinate of the generated 3D slice of the 4D shape.\n"
+#~ "Range roughly -2 to 2."
+#~ msgstr ""
+#~ "Madnelbrotmenge: W-Koordinate des generierten 3D-Ausschnitts der 4D-"
+#~ "Form.\n"
+#~ "Die Weite liegt grob zwischen -2 und 2."
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "Konfiguration gespeichert.  "
+#~ msgid ""
+#~ "Mandelbrot set: Iterations of the recursive function.\n"
+#~ "Controls scale of finest detail."
+#~ msgstr ""
+#~ "Mandelbrotmenge: Iterationen der rekursiven Funktion.\n"
+#~ "Steuert die Skalierung mit einem sehr hohem Detailgrad."
 
-#~ msgid "is required by:"
-#~ msgstr "wird benötigt von:"
+#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
+#~ msgstr "Mandelbrotmenge: Approximative (X,Y,Z)-Skalierungen in Nodes."
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Linksklick: Alle Items bewegen, Rechtsklick: Einzelnes Item bewegen"
+#~ msgid ""
+#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Mandelbrotmenge: (X,Y,Z)-Versatz vom Mittelpunkt der Welt.\n"
+#~ "Reichweite liegt grob von -2 bis 2, wird mit m_scale für\n"
+#~ "Versätze in Nodes multipliziert."
 
-#~ msgid "Downloading"
-#~ msgstr "Lade herunter"
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Taste zur Erhöhung der Sichtweite. Verändert die minimale Sichtweite.\n"
+#~ "Siehe http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Neustart nach Ändern des Treibers erforderlich"
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Taste zur Reduzierung der Sichtweite. Verändert die minimale Sichtweite.\n"
+#~ "Siehe http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
 
-#~ msgid "Rendering:"
-#~ msgstr "Rendering:"
+#~ msgid ""
+#~ "Julia set: W value determining the 4D shape.\n"
+#~ "Range roughly -2 to 2."
+#~ msgstr ""
+#~ "Julia-Menge: W-Wert, der die 4D-Form festlegt.\n"
+#~ "Weite liegt grob zwischen -2 und 2."
 
-#~ msgid "If enabled, "
-#~ msgstr "Wenn aktiviert, "
+#~ msgid ""
+#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Julia-Menge: (X,Y,Z)-Versatz vom Mittelpunkt der Welt.\n"
+#~ "Reichweite liegt grob von -2 bis 2, wird mit j_scale für Versätze in\n"
+#~ "Nodes multipliziert."
 
-#~ msgid "If disabled "
-#~ msgstr "Wenn deaktiviert "
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr "Blöcke bei Auswahl aufleuchten lassen (Deaktiviert die Auswahlbox)."
 
-#~ msgid "Enable a bit lower water surface, so it doesn't "
-#~ msgstr "Senkt ein bisschen den Wasserspiegel, so tut es nicht "
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Eine etwas niedrigere Wasseroberfläche aktivieren, damit der Node\n"
+#~ "nicht vollständig „gefüllt“ wird. Beachten Sie, dass dies nicht wirklich\n"
+#~ "optimiert wurde, und dass weiches Licht auf der Wasseroberfläche\n"
+#~ "nicht mit dieser Einstellung funktioniert."
 
-#, fuzzy
-#~ msgid "\""
-#~ msgstr "”"
+#~ msgid "Item textures..."
+#~ msgstr "Inventarbilder ..."
 
 #~ msgid ""
 #~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with 'no' are used to explicitly disable them."
 #~ msgstr ""
-#~ "Kartengenerierungsattribute speziell für Kartengenerator v7.\n"
-#~ "„ridges“ sind die Flüsse.\n"
-#~ "Flags, welche in der Bitschalterzeichenkette nicht angegeben sind,\n"
+#~ "Kartengenerierungsattribute speziell für den Kartengenerator v7.\n"
+#~ "Das „ridges“-Flag steuert die Flüsse.\n"
+#~ "Die von der Engine standardmäßig gesetzten Flags lauten:\n"
+#~ "„mountains, ridges“.\n"
+#~ "Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
+#~ "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
 #~ "werden von der Standardeinstellung unverändert gelassen.\n"
 #~ "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
 #~ "zu deaktivieren."
 
 #~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Flags starting with 'no' are used to explicitly disable them."
 #~ msgstr ""
-#~ "Kartengenerierungsattribute speziell für den Täler-Kartengenerator.\n"
+#~ "Kartengenerierungsattribute speziell für den flachen Kartengenerator.\n"
+#~ "Gelegentlich werden Seen und Hügel zur flachen Welt hinzugefügt.\n"
+#~ "Die von der Engine standardmäßig gesetzten Flags sind: keine.\n"
+#~ "Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
 #~ "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
 #~ "werden von der Standardeinstellung unverändert gelassen.\n"
 #~ "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
-#~ "zu deaktivieren.\n"
-#~ "„altitude_chill“ macht höhere Höhen kälter, was zu einigen Biomproblemen "
-#~ "führen könnte.\n"
-#~ "„humid_rivers“ modifiziert die Luftfeuchtigkeit um Flüssen und in "
-#~ "Gebieten, in denen das Wasser sich in Pfützen ansammeln würde.\n"
-#~ "Dies könnte mit fein abgestimmten Biomen zu Konflikten führen."
-
-#~ msgid "No!!!"
-#~ msgstr "Nein!!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Normalmaps generieren"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Öffentliche Serverliste"
-
-#~ msgid "No of course not!"
-#~ msgstr "Nein, natürlich nicht!"
+#~ "zu deaktivieren."
diff --git a/po/eo/minetest.po b/po/eo/minetest.po
index d1c137f..adf29a0 100644
--- a/po/eo/minetest.po
+++ b/po/eo/minetest.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2015-09-13 12:36+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-06-04 13:18+0000\n"
 "Last-Translator: Tim <t4im at openmailbox.org>\n"
 "Language-Team: Esperanto <https://hosted.weblate.org/projects/minetest/"
 "minetest/eo/>\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.4-dev\n"
+"X-Generator: Weblate 2.7-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
@@ -220,18 +220,16 @@ msgid "Browse"
 msgstr ""
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
 msgid "Disabled"
-msgstr "Malŝaltu modifaron"
+msgstr "Malŝaltita"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Edit"
-msgstr ""
+msgstr "Redakti"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
 msgid "Enabled"
-msgstr "ŝaltita"
+msgstr "Ŝaltita"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Format is 3 numbers separated by commas and inside brackets."
@@ -244,9 +242,8 @@ msgid ""
 msgstr ""
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
 msgid "Games"
-msgstr "Ludo"
+msgstr "Ludoj"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
 msgid "Mods"
@@ -407,9 +404,8 @@ msgid "Uninstall selected modpack"
 msgstr "Malinstali selektan modifaron"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "Adreso / Pordo:"
+msgstr "Adreso / Pordo"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
@@ -436,9 +432,8 @@ msgid "Favorite"
 msgstr ""
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Nomo / Pasvorto:"
+msgstr "Nomo / Pasvorto"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -503,7 +498,6 @@ msgid "2x"
 msgstr "2x"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "3D Clouds"
 msgstr "3D nuboj"
 
@@ -516,9 +510,8 @@ msgid "8x"
 msgstr "8x"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Advanced Settings"
-msgstr "Agordoj"
+msgstr "Pliaj Agordoj"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Antialiasing:"
@@ -529,12 +522,10 @@ msgid "Are you sure to reset your singleplayer world?"
 msgstr "Ĉu vi certas, ke vi volas nuligi vian solludantan mondon?"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bilinear Filter"
 msgstr "Bilineara filtrilo"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
 msgstr "Protuberancmapado"
 
@@ -543,7 +534,6 @@ msgid "Change keys"
 msgstr "Ŝanĝi klavojn"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Connected Glass"
 msgstr "Ligata glaco"
 
@@ -564,7 +554,6 @@ msgid "No"
 msgstr "Ne"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "No Filter"
 msgstr "Neniu filtrilo"
 
@@ -573,23 +562,20 @@ msgid "No Mipmap"
 msgstr "Neniu Mipmapo"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Highlighting"
-msgstr "Marki nodaĵojn"
+msgstr "Nodaĵa emfazado"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Outlining"
-msgstr "Marki nodaĵojn"
+msgstr "Nodaĵa kadrado"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
-msgstr ""
+msgstr "Neniu"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Normal Mapping"
-msgstr "Protuberancmapado"
+msgstr "Normalmapado"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
@@ -609,6 +595,10 @@ msgid "Particles"
 msgstr "Ŝaltu ĉiujn"
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Nuligi solludantan mondon"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Agordoj"
 
@@ -643,22 +633,18 @@ msgid "Touchthreshold (px)"
 msgstr "Tuŝa sojlo (px)"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Trilinear Filter"
-msgstr "Triineara filtrilo"
+msgstr "Trilineara filtrilo"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Leaves"
 msgstr "Ondantaj foliaĵoj"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Plants"
 msgstr "Ondantaj plantoj"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Water"
 msgstr "Ondanta akvo"
 
@@ -989,6 +975,10 @@ msgstr "Baskuli nekolizian reĝimon"
 msgid "Use"
 msgstr "Uzi"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zomo"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "premi klavon"
@@ -1305,10 +1295,6 @@ msgstr "X-Butono 1"
 msgid "X Button 2"
 msgstr "X-Butono 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zomo"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1325,7 +1311,6 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "3D clouds"
 msgstr "3D nuboj"
 
@@ -1376,6 +1361,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1450,6 +1439,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Backward key"
 msgstr "Malantaŭen"
@@ -1468,7 +1461,6 @@ msgid "Basic Privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Bilinear filtering"
 msgstr "Bilineara filtrilo"
 
@@ -1486,6 +1478,10 @@ msgid "Build inside player"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Protuberancmapado"
 
@@ -1528,6 +1524,11 @@ msgid "Chat toggle key"
 msgstr "Ŝanĝi klavojn"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Komando"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1585,9 +1586,8 @@ msgid "Cloud radius"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Clouds"
-msgstr "3D nuboj"
+msgstr "Nuboj"
 
 #: src/settings_translation_file.cpp
 msgid "Clouds are a client side effect."
@@ -1604,14 +1604,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1639,14 +1639,12 @@ msgid "Console alpha"
 msgstr "Konzolo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Console color"
-msgstr "Konzolo"
+msgstr "Konzola koloro"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Console key"
-msgstr "Konzolo"
+msgstr "Konzola klavo"
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward"
@@ -1657,9 +1655,8 @@ msgid "Continuous forward movement (only used for testing)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Controls"
-msgstr "Stiro"
+msgstr "Stirado"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1727,9 +1724,8 @@ msgid "DPI"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Damage"
-msgstr "Ŝalti damaĝon"
+msgstr "Damaĝon"
 
 #: src/settings_translation_file.cpp
 msgid "Debug info toggle key"
@@ -1758,15 +1754,18 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Default password"
-msgstr "Nova pasvorto"
+msgstr "Defaŭlta pasvorto"
 
 #: src/settings_translation_file.cpp
 msgid "Default privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1783,6 +1782,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1813,14 +1816,6 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1833,6 +1828,18 @@ msgid "Disable anticheat"
 msgstr "Ŝalti partiklojn"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr ""
 
@@ -1859,6 +1866,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Enable VBO"
 msgstr "Ŝaltu modifaron"
@@ -1945,6 +1956,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2006,11 +2025,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2148,12 +2177,14 @@ msgid "Generate normalmaps"
 msgstr "Generi Normalmapojn"
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2185,6 +2216,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2213,15 +2253,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2316,6 +2347,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2351,6 +2416,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2511,6 +2584,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2546,7 +2626,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2698,6 +2778,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2732,8 +2827,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2743,8 +2836,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2755,8 +2846,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2766,8 +2855,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3148,6 +3235,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3189,17 +3284,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3211,10 +3310,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Menus"
 msgstr "Menuo"
@@ -3257,10 +3352,6 @@ msgid "Mipmapping"
 msgstr "Protuberancmapado"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3473,11 +3564,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3485,7 +3582,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3522,6 +3619,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Report path"
+msgstr "Selekto"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Right key"
 msgstr "Dekstra Menuo"
 
@@ -3690,7 +3792,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3728,7 +3830,7 @@ msgstr "Glatiga lumo"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3810,10 +3912,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3829,6 +3943,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3844,6 +3964,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3948,11 +4074,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Eksaj kernprogramistoj"
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4042,22 +4163,18 @@ msgid "Water surface level of the world."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving Nodes"
-msgstr "Ondantaj foliaĵoj"
+msgstr "Ondantaj nodaĵoj"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving leaves"
 msgstr "Ondantaj foliaĵoj"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving plants"
 msgstr "Ondantaj plantoj"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving water"
 msgstr "Ondanta akvo"
 
@@ -4088,7 +4205,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4189,41 +4306,42 @@ msgid "cURL timeout"
 msgstr ""
 
 #, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Ŝargi teksturojn…"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Eksaj kernprogramistoj"
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Nuligi solludantan mondon"
+#~ msgid "No of course not!"
+#~ msgstr "Ne, memkompreneble!"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Skala faktoro por menuoj "
+#~ msgid "Public Serverlist"
+#~ msgstr "Publika servilolisto"
 
-#~ msgid "Touch free target"
-#~ msgstr "Sentuŝa celo"
+#, fuzzy
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generi Normalmapojn"
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Restartigu Minetest-on por efikigi pelilan ŝanĝon"
+#~ msgid "No!!!"
+#~ msgstr "Ne!!!"
 
-#~ msgid "Rendering:"
-#~ msgstr "Bildigo:"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Malŝaltu modifaron"
 
 #, fuzzy
 #~ msgid "If enabled, "
 #~ msgstr "ŝaltita"
 
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Malŝaltu modifaron"
+#~ msgid "Rendering:"
+#~ msgstr "Bildigo:"
 
-#~ msgid "No!!!"
-#~ msgstr "Ne!!!"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Restartigu Minetest-on por efikigi pelilan ŝanĝon"
 
-#, fuzzy
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generi Normalmapojn"
+#~ msgid "Touch free target"
+#~ msgstr "Sentuŝa celo"
 
-#~ msgid "Public Serverlist"
-#~ msgstr "Publika servilolisto"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Skala faktoro por menuoj "
 
-#~ msgid "No of course not!"
-#~ msgstr "Ne, memkompreneble!"
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "Ŝargi teksturojn…"
diff --git a/po/es/minetest.po b/po/es/minetest.po
index 03df1d5..72438dc 100644
--- a/po/es/minetest.po
+++ b/po/es/minetest.po
@@ -7,17 +7,17 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-10 18:21+0000\n"
-"Last-Translator: Diego Martínez <lkaezadl3 at gmail.com>\n"
-"Language-Team: Spanish "
-"<https://hosted.weblate.org/projects/minetest/minetest/es/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-04 03:39+0000\n"
+"Last-Translator: Alfonso R. Zepeda R. <ing.a.zepeda at gmx.com>\n"
+"Language-Team: Spanish <https://hosted.weblate.org/projects/minetest/"
+"minetest/es/>\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
@@ -49,11 +49,11 @@ msgstr "Cargando..."
 
 #: builtin/mainmenu/common.lua
 msgid "Protocol version mismatch. "
-msgstr "Desajuste con la versión del protocolo. "
+msgstr "La versión del protocolo no coincide. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr "El servidor hace respetar la versión $1 del protocolo "
+msgstr "El servidor utiliza el protocolo versión $1. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
@@ -103,7 +103,7 @@ msgid ""
 "chararacters [a-z0-9_] are allowed."
 msgstr ""
 "Error al activar el mod \"$1\" por contener caracteres no permitidos. Solo "
-"los caracteres [a-z0-9_] estan permitidos."
+"los caracteres [a-z0-9_] están permitidos."
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide Game"
@@ -257,7 +257,9 @@ msgstr "Mods"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Optionally the lacunarity can be appended with a leading comma."
-msgstr "Opcionalmente, el lacunaridad puede ser anexado con una coma líder."
+msgstr ""
+"Opcionalmente, el parámetro \"lacunarity\" puede ser anexado separándolo "
+"mediante una coma."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a comma seperated list of flags."
@@ -603,6 +605,10 @@ msgid "Particles"
 msgstr "Partículas"
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Reiniciar mundo de un jugador"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Configuración"
 
@@ -981,6 +987,10 @@ msgstr "Activar noclip"
 msgid "Use"
 msgstr "Usar"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "pulsa una tecla"
@@ -1152,7 +1162,7 @@ msgstr "Bloq Núm"
 
 #: src/keycode.cpp
 msgid "Numpad *"
-msgstr "Numpad *"
+msgstr "Teclado Numérico *"
 
 #: src/keycode.cpp
 msgid "Numpad +"
@@ -1298,10 +1308,6 @@ msgstr "X Botón 1"
 msgid "X Button 2"
 msgstr "X Botón 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1389,12 +1395,17 @@ msgid "Active Block Modifier interval"
 msgstr "Intervalo de modificador de bloques activos"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "Intervalo de modificador de bloques activos"
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr "Rango de bloque activo"
 
 #: src/settings_translation_file.cpp
 msgid "Active object send range"
-msgstr "Alcance de objetos activos a enviar"
+msgstr "Rango de envío en objetos activos"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1437,7 +1448,7 @@ msgstr "Siempre volar y rápido"
 
 #: src/settings_translation_file.cpp
 msgid "Ambient occlusion gamma"
-msgstr "Gamma de oclusión de ambiente"
+msgstr "Oclusión ambiental gamma"
 
 #: src/settings_translation_file.cpp
 msgid "Amplifies the valleys"
@@ -1463,7 +1474,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Approximate (X,Y,Z) scale of fractal in nodes."
-msgstr "Escala aproximada (X,Y,Z) en nodos, de los fractales"
+msgstr "Escala aproximada (X,Y,Z) del fractal en nodos."
 
 #: src/settings_translation_file.cpp
 msgid "Ask to reconnect after crash"
@@ -1474,6 +1485,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr "Automáticamente informar a la lista del servidor."
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Tecla de Auto Ejecutar"
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "Tecla retroceso"
 
@@ -1508,6 +1523,10 @@ msgid "Build inside player"
 msgstr "Construir dentro de jugador"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Mapeado de relieve"
 
@@ -1548,6 +1567,10 @@ msgid "Chat toggle key"
 msgstr "Tecla alternativa para el chat"
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Comandos de Chat"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1638,17 +1661,9 @@ msgid "Colored fog"
 msgstr "Niebla colorida"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
-msgstr ""
-"Lista de mods de fiar separada por coma que se permiten acceder a funciones\n"
-"inseguras incluso quando securidad de mods está puesto (vía "
-"request_insecure_environment())."
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
 "allow them to upload and download data to/from the internet."
 msgstr ""
 "Lista separada por comas de los mods a los que se les permite usar las\n"
@@ -1657,6 +1672,15 @@ msgstr ""
 "la Internet."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
+msgstr ""
+"Lista de mods de fiar separada por coma que se permiten acceder a funciones\n"
+"inseguras incluso quando securidad de mods está puesto (vía "
+"request_insecure_environment())."
+
+#: src/settings_translation_file.cpp
 msgid "Command key"
 msgstr "Tecla comando"
 
@@ -1812,6 +1836,10 @@ msgid "Default privileges"
 msgstr "Privilegios por defecto"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Formato de Reporte por defecto"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1834,6 +1862,11 @@ msgstr ""
 "límite)."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Delay in sending blocks after building"
+msgstr "Retraso en enviar bloques después de construir"
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr "Demora para mostrar información sobre herramientas, en milisegundos."
 
@@ -1866,15 +1899,6 @@ msgid "Desynchronize block animation"
 msgstr "Desincronizar animación de bloques"
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-"Datos detallados de perfilación de mod. Útil para desarrolladores de mods."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Perfilador detallado de los mods"
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1889,6 +1913,23 @@ msgid "Disable anticheat"
 msgstr "Desactivar Anticheat"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Desactivar secuencias de escape"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Deshabilita las secuencias de escape, por ejemplo: colorear el chat.\n"
+"Usa esto si tu quieres correr un servidor con clientes pre-0.4.14  y quieres "
+"deshabilitar\n"
+"las secuencias de escape generadas por los mods."
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "No permitir contraseñas vacías"
 
@@ -1914,6 +1955,11 @@ msgid "Dump the mapgen debug infos."
 msgstr "Imprimir información de depuración del generador de mapas."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Enable Joysticks"
+msgstr "Activar Control"
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "Activar VBO"
 
@@ -2004,8 +2050,8 @@ msgid ""
 "Enables on the fly normalmap generation (Emboss effect).\n"
 "Requires bumpmapping to be enabled."
 msgstr ""
-"Habilita la generación de mapas de normales (efecto realzado) en el momento."
-"\n"
+"Habilita la generación de mapas de normales (efecto realzado) en el "
+"momento.\n"
 "Requiere habilitar mapeado de relieve."
 
 #: src/settings_translation_file.cpp
@@ -2017,6 +2063,14 @@ msgstr ""
 "Requiere habilitar sombreadores."
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Métodos de entidad"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2030,7 +2084,7 @@ msgstr "FPS (cuadros/s) en el menú de pausa"
 
 #: src/settings_translation_file.cpp
 msgid "FSAA"
-msgstr ""
+msgstr "FSAA"
 
 #: src/settings_translation_file.cpp
 msgid "Fall bobbing"
@@ -2081,10 +2135,23 @@ msgid "Field of view"
 msgstr "Campo visual"
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Campo visual del zoom"
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr "Campo visual en grados."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Movimiento rápido (por medio de tecla de \"Uso\").\n"
+"Requiere privilegio \"fast\" (rápido) en el servidor."
+
+#: src/settings_translation_file.cpp
 msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
@@ -2221,23 +2288,25 @@ msgstr "Filtro de escala de IGU \"txr2img\""
 
 #: src/settings_translation_file.cpp
 msgid "Gamma"
-msgstr ""
+msgstr "Gamma"
 
 #: src/settings_translation_file.cpp
 msgid "General"
-msgstr ""
+msgstr "General"
 
 #: src/settings_translation_file.cpp
 msgid "Generate normalmaps"
 msgstr "Generar mapas normales"
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2245,20 +2314,19 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Graphics"
-msgstr ""
+msgstr "Gráficos"
 
 #: src/settings_translation_file.cpp
 msgid "Gravity"
-msgstr ""
+msgstr "Gravedad"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "HTTP Mods"
-msgstr "Mods"
+msgstr "HTTP Mods"
 
 #: src/settings_translation_file.cpp
 msgid "HUD toggle key"
-msgstr ""
+msgstr "Tecla de cambio del HUD"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2267,26 +2335,43 @@ msgid ""
 "-    log: mimic and log backtrace of deprecated call (default for debug).\n"
 "-    error: abort on usage of deprecated call (suggested for mod developers)."
 msgstr ""
+"Manejo de las llamadas de la API LUA obsoletas:\n"
+"- legacy: (intenta)imita el antiguo comportamiento (por defecto para "
+"lanzamientos).\n"
+"- log: imita y guarda el seguimiento de las llamadas obsoletas (por defecto "
+"para depuración).\n"
+"- error: Cancela en el uso de llamadas obsoletas (sugerido para los "
+"desarrolladores de Mods)."
 
 #: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Height component of the initial window size."
+msgstr "Componente de altura del tamaño inicial de la ventana."
+
+#: src/settings_translation_file.cpp
 msgid "Height on which clouds are appearing."
-msgstr ""
+msgstr "Altura sobre la cual están apareciendo las nubes."
 
 #: src/settings_translation_file.cpp
 msgid "High-precision FPU"
-msgstr ""
+msgstr "Alta-precisión FPU"
 
 #: src/settings_translation_file.cpp
 msgid "Homepage of server, to be displayed in the serverlist."
 msgstr ""
+"Página de inicio del servidor, que se mostrará en la lista de servidores."
 
 #: src/settings_translation_file.cpp
 msgid "How deep to make rivers"
-msgstr ""
+msgstr "Profundidad para los ríos"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2297,40 +2382,37 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
+"Cuanto espera el servidor antes de descargar los bloques de mapa no "
+"utilizados.\n"
+"Con valores mayores es mas fluido, pero se utiliza mas RAM."
 
 #: src/settings_translation_file.cpp
 msgid "How wide to make rivers"
-msgstr ""
+msgstr "Ancho de los ríos"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6"
-msgstr ""
+msgstr "IPv6"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 server"
-msgstr ""
+msgstr "servidor IPv6"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 support."
-msgstr ""
+msgstr "soporte IPv6."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "If FPS would go higher than this, limit it by sleeping\n"
 "to not waste CPU power for no benefit."
 msgstr ""
+"Si los FPS llegan a ser mas altos que esto, limítelos con interrupciones\n"
+"no gaste recursos del CPU en algo que no tiene beneficio."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2352,14 +2434,18 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "If enabled, actions are recorded for rollback.\n"
 "This option is only read when server starts."
 msgstr ""
+"Si esta activiado, las accione son guardadas para un rollback.\n"
+"Esta opciones es de solo lectura cuando el servidor inicia."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "If enabled, disable cheat prevention in multiplayer."
-msgstr ""
+msgstr "Si esta habilitado, desactiva la prevención de trampas en multijugador"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2368,8 +2454,11 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "If enabled, new players cannot join with an empty password."
 msgstr ""
+"Si esta activado, los nuevos jugadores no pueden unirse con contraseñas "
+"vacías."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2379,24 +2468,60 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "If this is set, players will always (re)spawn at the given position."
-msgstr ""
+msgstr "Si se activa, los jugadores siempre reaparecerán en la posición dada."
 
 #: src/settings_translation_file.cpp
 msgid "Ignore world errors"
-msgstr ""
+msgstr "Ignora los errores del mundo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "In-Game"
-msgstr "Juego"
+msgstr "Dentro del Juego"
 
 #: src/settings_translation_file.cpp
 msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
 msgstr ""
+"Valor alfa del fondo de la consola de chat durante el juego (opacidad, entre "
+"0 y 255)."
 
 #: src/settings_translation_file.cpp
 msgid "In-game chat console background color (R,G,B)."
+msgstr "Color del fondo de la consola de chat durante el juego (R, G, B)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -2434,6 +2559,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2593,6 +2726,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2628,7 +2768,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2779,6 +2919,22 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "Intervalo de modificador de bloques activos"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2811,8 +2967,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2822,8 +2976,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2834,8 +2986,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2845,8 +2995,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3226,6 +3374,15 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Cantidad de bloques que flotan simultáneamente por cliente."
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3267,17 +3424,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3289,10 +3450,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "Menús"
 
@@ -3334,10 +3491,6 @@ msgid "Mipmapping"
 msgstr "Mapeado de relieve"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3548,11 +3701,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3560,7 +3719,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3595,6 +3754,11 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Ruta de fuentes"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "Tecla derecha"
 
@@ -3754,7 +3918,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3791,7 +3955,7 @@ msgstr "Iluminación suave"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3872,10 +4036,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3891,6 +4067,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3906,6 +4088,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -4008,10 +4196,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Útil para los desarrolladores de mods."
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4116,9 +4300,8 @@ msgid "Waving water"
 msgstr "Oleaje en el agua"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving water height"
-msgstr "Oleaje en el agua"
+msgstr "Altura de las ondulaciones del agua"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -4141,7 +4324,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4223,7 +4406,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Y of flat ground."
-msgstr ""
+msgstr "Y de suelo plano."
 
 #: src/settings_translation_file.cpp
 msgid "Y of upper limit of large pseudorandom caves."
@@ -4241,47 +4424,59 @@ msgstr ""
 msgid "cURL timeout"
 msgstr "Tiempo de espera de cURL"
 
-#~ msgid "Preload inventory textures"
-#~ msgstr "Precarga de las texturas del inventario"
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr ""
+#~ "Datos detallados de perfilación de mod. Útil para desarrolladores de mods."
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Reiniciar mundo de un jugador"
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Perfilador detallado de los mods"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Factor de escala aplicado a los elementos del menú: "
+#~ msgid ""
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
+#~ msgstr "Cantidad de bloques que flotan simultáneamente en todo el servidor."
 
-#~ msgid "Touch free target"
-#~ msgstr "Tocar para interactuar"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Útil para los desarrolladores de mods."
 
-#~ msgid " KB/s"
-#~ msgstr " KB/s"
+#~ msgid "No of course not!"
+#~ msgstr "¡No, claro que no!"
 
-#~ msgid " MB/s"
-#~ msgstr " MB/s"
+#~ msgid "Public Serverlist"
+#~ msgstr "Lista de servidores públicos"
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr ""
-#~ "Reinicia minetest para que los cambios en el controlador tengan efecto"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generar mapas normales"
 
-#~ msgid "Rendering:"
-#~ msgstr "Renderizado:"
+#~ msgid "No!!!"
+#~ msgstr "¡¡¡No!!!"
+
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Desactivar paquete"
 
 #, fuzzy
 #~ msgid "If enabled, "
 #~ msgstr "Activado"
 
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Desactivar paquete"
+#~ msgid "Rendering:"
+#~ msgstr "Renderizado:"
 
-#~ msgid "No!!!"
-#~ msgstr "¡¡¡No!!!"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr ""
+#~ "Reinicia minetest para que los cambios en el controlador tengan efecto"
 
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generar mapas normales"
+#~ msgid " MB/s"
+#~ msgstr " MB/s"
 
-#~ msgid "Public Serverlist"
-#~ msgstr "Lista de servidores públicos"
+#~ msgid " KB/s"
+#~ msgstr " KB/s"
 
-#~ msgid "No of course not!"
-#~ msgstr "¡No, claro que no!"
+#~ msgid "Touch free target"
+#~ msgstr "Tocar para interactuar"
+
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Factor de escala aplicado a los elementos del menú: "
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "Precarga de las texturas del inventario"
diff --git a/po/et/minetest.po b/po/et/minetest.po
index 15cfe12..94c9c72 100644
--- a/po/et/minetest.po
+++ b/po/et/minetest.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
 "PO-Revision-Date: 2016-04-09 13:53+0000\n"
 "Last-Translator: Jan Harald <kuus29 at gmail.com>\n"
 "Language-Team: Estonian <https://hosted.weblate.org/projects/minetest/"
@@ -616,6 +616,11 @@ msgid "Particles"
 msgstr "Luba kõik"
 
 #: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Üksikmäng"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Sätted"
 
@@ -982,6 +987,10 @@ msgstr "Lülita läbi seinte minek sisse"
 msgid "Use"
 msgstr "Tegevus"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Suumi"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "Vajuta nuppu"
@@ -1298,10 +1307,6 @@ msgstr "X Nuppp 1"
 msgid "X Button 2"
 msgstr "X Nupp 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Suumi"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1369,6 +1374,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1444,6 +1453,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Backward key"
 msgstr "Tagasi"
@@ -1479,6 +1492,10 @@ msgid "Build inside player"
 msgstr "Mitmikmäng"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Bumpmapping"
 msgstr "Väga hea kvaliteet"
@@ -1522,6 +1539,11 @@ msgid "Chat toggle key"
 msgstr "Vaheta nuppe"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Käsklus"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1598,14 +1620,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1761,6 +1783,10 @@ msgid "Default privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1777,6 +1803,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1807,14 +1837,6 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1827,6 +1849,18 @@ msgid "Disable anticheat"
 msgstr "Lülita osakesed sisse"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr ""
 
@@ -1853,6 +1887,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Enable VBO"
 msgstr "Luba MP"
@@ -1938,6 +1976,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -1998,11 +2044,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2138,12 +2194,14 @@ msgid "Generate normalmaps"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2174,6 +2232,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2202,15 +2269,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2305,6 +2363,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2340,6 +2432,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2500,6 +2600,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2535,7 +2642,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2687,6 +2794,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2721,8 +2843,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2732,8 +2852,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2744,8 +2862,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2755,8 +2871,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3137,6 +3251,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3178,17 +3300,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3200,10 +3326,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Menus"
 msgstr "Menüü"
@@ -3246,10 +3368,6 @@ msgid "Mipmapping"
 msgstr "Väga hea kvaliteet"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3454,11 +3572,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3466,7 +3590,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3503,6 +3627,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Report path"
+msgstr "Vali"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Right key"
 msgstr "Parem Menüü"
 
@@ -3666,7 +3795,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3704,7 +3833,7 @@ msgstr "Ilus valgustus"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3785,10 +3914,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3804,6 +3945,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3819,6 +3966,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3923,11 +4076,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Põhiline arendaja"
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4055,7 +4203,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4156,55 +4304,70 @@ msgid "cURL timeout"
 msgstr ""
 
 #, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Alla"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Põhiline arendaja"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Vasak hiireklõps: Liiguta kõiki asju, Parem hiireklõps: Liiguta üksikut "
-#~ "asja"
+#~ msgid "Public Serverlist"
+#~ msgstr "Avalikud serverid"
 
-#~ msgid "is required by:"
-#~ msgstr "Seda vajavad:"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Lülita kõik välja"
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "Konfiguratsioon salvestatud. "
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "Sisse lülitatud"
 
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Hoiatus: Konfiguratsioon pole kindel."
+#, fuzzy
+#~ msgid "Game Name"
+#~ msgstr "Mäng"
 
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Maailma loomine ebaõnnestus: Nimes esineb keelatud tähti"
+#~ msgid "GAMES"
+#~ msgstr "MÄNGUD"
 
-#~ msgid "Show Public"
-#~ msgstr "Näita avalikke"
+#~ msgid "new game"
+#~ msgstr "uus mängu"
 
-#~ msgid "Show Favorites"
-#~ msgstr "Näita lemmikuid"
+#~ msgid "EDIT GAME"
+#~ msgstr "MUUDA MÄNGU"
 
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Jäta IP lahter tühjaks et alustada LAN serverit."
+#, fuzzy
+#~ msgid "Remove selected mod"
+#~ msgstr "Eemalda valitud muutus"
 
-#~ msgid "Create world"
-#~ msgstr "Loo maailm"
+#, fuzzy
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Lisama muutus"
 
-#~ msgid "Address required."
-#~ msgstr "IP on vajalkik."
+#~ msgid "Name"
+#~ msgstr "Nimi"
 
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Maailma kustutamine ebaõnnestus: Maailma pole valitud"
+#~ msgid "Password"
+#~ msgstr "Parool"
 
-#~ msgid "Files to be deleted"
-#~ msgstr "Failid mida kustutada"
+#~ msgid "SETTINGS"
+#~ msgstr "Seaded"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Maailma loomine ebaõnnestus: Mängu ei leitud"
+#~ msgid "Preload item visuals"
+#~ msgstr "Lae asjade visuaale"
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Maailma konfigureerimine ebaõnnestus: Pole midagi valitud"
+#, fuzzy
+#~ msgid "Finite Liquid"
+#~ msgstr "Löppev vedelik"
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Kõigi maailma failide kustutamine ebaõnnestus"
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration.  "
+#~ msgstr ""
+#~ "Hoiatus: Mõned modifikatsioonid pole sätitud veel.\n"
+#~ "Need lülitatakse sisse kohe pärast sätete salvestamist."
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration.  "
+#~ msgstr ""
+#~ "Hoiatus: Mõned konfigureeritud modifikatsioonid on kaotsi läinud.\n"
+#~ "Nende sätted kustutatakse kui salvestada konfiguratsioon."
 
 #~ msgid ""
 #~ "Default Controls:\n"
@@ -4231,64 +4394,53 @@ msgstr ""
 #~ "- ESC: Menüü\n"
 #~ "- T: Jututupa\n"
 
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
-#~ msgstr ""
-#~ "Hoiatus: Mõned konfigureeritud modifikatsioonid on kaotsi läinud.\n"
-#~ "Nende sätted kustutatakse kui salvestada konfiguratsioon."
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Kõigi maailma failide kustutamine ebaõnnestus"
 
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration.  "
-#~ msgstr ""
-#~ "Hoiatus: Mõned modifikatsioonid pole sätitud veel.\n"
-#~ "Need lülitatakse sisse kohe pärast sätete salvestamist."
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Maailma konfigureerimine ebaõnnestus: Pole midagi valitud"
 
-#, fuzzy
-#~ msgid "Finite Liquid"
-#~ msgstr "Löppev vedelik"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Maailma loomine ebaõnnestus: Mängu ei leitud"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Lae asjade visuaale"
+#~ msgid "Files to be deleted"
+#~ msgstr "Failid mida kustutada"
 
-#~ msgid "SETTINGS"
-#~ msgstr "Seaded"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Maailma kustutamine ebaõnnestus: Maailma pole valitud"
 
-#~ msgid "Password"
-#~ msgstr "Parool"
+#~ msgid "Address required."
+#~ msgstr "IP on vajalkik."
 
-#~ msgid "Name"
-#~ msgstr "Nimi"
+#~ msgid "Create world"
+#~ msgstr "Loo maailm"
 
-#, fuzzy
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Lisama muutus"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Jäta IP lahter tühjaks et alustada LAN serverit."
 
-#, fuzzy
-#~ msgid "Remove selected mod"
-#~ msgstr "Eemalda valitud muutus"
+#~ msgid "Show Favorites"
+#~ msgstr "Näita lemmikuid"
 
-#~ msgid "EDIT GAME"
-#~ msgstr "MUUDA MÄNGU"
+#~ msgid "Show Public"
+#~ msgstr "Näita avalikke"
 
-#~ msgid "new game"
-#~ msgstr "uus mängu"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Maailma loomine ebaõnnestus: Nimes esineb keelatud tähti"
 
-#~ msgid "GAMES"
-#~ msgstr "MÄNGUD"
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Hoiatus: Konfiguratsioon pole kindel."
 
-#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Mäng"
+#~ msgid "Configuration saved.  "
+#~ msgstr "Konfiguratsioon salvestatud. "
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "Sisse lülitatud"
+#~ msgid "is required by:"
+#~ msgstr "Seda vajavad:"
 
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Lülita kõik välja"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Vasak hiireklõps: Liiguta kõiki asju, Parem hiireklõps: Liiguta üksikut "
+#~ "asja"
 
-#~ msgid "Public Serverlist"
-#~ msgstr "Avalikud serverid"
+#, fuzzy
+#~ msgid "Downloading"
+#~ msgstr "Alla"
diff --git a/po/fr/minetest.po b/po/fr/minetest.po
index 523c73b..f3aec72 100644
--- a/po/fr/minetest.po
+++ b/po/fr/minetest.po
@@ -7,21 +7,21 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-07 11:19+0000\n"
-"Last-Translator: Yvan YR <yvan_yr at yahoo.fr>\n"
-"Language-Team: French "
-"<https://hosted.weblate.org/projects/minetest/minetest/fr/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-11-27 10:39+0000\n"
+"Last-Translator: Onyx Steinheim <thevoxelmanonyx at gmail.com>\n"
+"Language-Team: French <https://hosted.weblate.org/projects/minetest/minetest/"
+"fr/>\n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.10-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr "Une erreur est survenue avec un script Lua, il peut s'agir d'un mod :"
+msgstr "Une erreur est survenue dans un script Lua, il peut s'agir d'un mod :"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
@@ -53,7 +53,7 @@ msgstr "La version du protocole ne correspond pas. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr "Le serveur impose une version du protocole $1. "
+msgstr "Le serveur impose la version $1 du protocole. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
@@ -103,7 +103,7 @@ msgid ""
 msgstr ""
 "Échec du chargement du mod \"$1\" car il contient des caractères non-"
 "autorisés.\n"
-"Seulement les caractères alphanumériques [a-z0-9_] sont autorisés."
+"Seuls les caractères alphanumériques [a-z0-9_] sont autorisés."
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide Game"
@@ -111,7 +111,7 @@ msgstr "Cacher le jeu"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide mp content"
-msgstr "Cacher le pack de mods"
+msgstr "Cacher le contenu du mod"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Mod:"
@@ -235,7 +235,8 @@ msgstr "Activé"
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Format is 3 numbers separated by commas and inside brackets."
 msgstr ""
-"Le format est 3 nombres séparés par des virgules et entre les parenthèses."
+"Le format est composé de 3 nombres séparés par des virgules et entre "
+"parenthèses."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid ""
@@ -341,7 +342,7 @@ msgstr "Page $1 de $2"
 
 #: builtin/mainmenu/store.lua
 msgid "Rating"
-msgstr "Note"
+msgstr "Évaluation"
 
 #: builtin/mainmenu/store.lua
 msgid "Search"
@@ -361,7 +362,7 @@ msgstr "Non-trié"
 
 #: builtin/mainmenu/store.lua
 msgid "re-Install"
-msgstr "Ré-installer"
+msgstr "Réinstaller"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Active Contributors"
@@ -393,7 +394,7 @@ msgstr "Informations du mod :"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "No mod description available"
-msgstr "Pas de description disponible"
+msgstr "Pas de description du mod disponible"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Rename"
@@ -401,18 +402,17 @@ msgstr "Renommer"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Select Mod File:"
-msgstr "Sélectionner un fichier de mod :"
+msgstr "Sélectionner le fichier du mod :"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Uninstall selected mod"
-msgstr "Désinstaller le mod"
+msgstr "Désinstaller le mod sélectionné"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Uninstall selected modpack"
-msgstr "Désinstaller le pack de mods"
+msgstr "Désinstaller le pack de mods sélectionné"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
 msgstr "Adresse / Port :"
 
@@ -433,19 +433,16 @@ msgid "Damage enabled"
 msgstr "Dégâts activés"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Del. Favorite"
-msgstr "Supprimer favoris :"
+msgstr "Supprimer favori :"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Favorite"
-msgstr "Favoris :"
+msgstr "Favori"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Nom / Mot de passe :"
+msgstr "Nom / Mot de passe"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -538,16 +535,14 @@ msgid "Bilinear Filter"
 msgstr "Filtrage bilinéaire"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
-msgstr "Bump mapping"
+msgstr "Placage de relief"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Change keys"
 msgstr "Changer les touches"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Connected Glass"
 msgstr "Verre unifié"
 
@@ -576,23 +571,20 @@ msgid "No Mipmap"
 msgstr "Sans MIP map"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Highlighting"
 msgstr "Surbrillance des blocs"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Outlining"
-msgstr "Surbrillance des blocs"
+msgstr "Non-surbrillance des blocs"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
 msgstr "Aucun"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Normal Mapping"
-msgstr "Échantillonnage de normalmaps"
+msgstr "Mappage de texture"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
@@ -607,11 +599,14 @@ msgid "Parallax Occlusion"
 msgstr "Occlusion parallaxe"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
 msgstr "Activer les particules"
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Réinitialiser le monde"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Réglages"
 
@@ -633,12 +628,12 @@ msgstr "Textures :"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "Pour activer les shaders, le pilote OpenGL doit être utilisé."
+msgstr ""
+"Pour activer les textures nuancées, le pilote OpenGL doit être utilisé."
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
-#, fuzzy
 msgid "Tone Mapping"
-msgstr "Mip-mapping"
+msgstr "mappage tonal"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Touchthreshold (px)"
@@ -670,7 +665,7 @@ msgstr "Configurer les mods"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Main"
-msgstr "Menu principal"
+msgstr "Principal"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Start Singleplayer"
@@ -718,7 +713,7 @@ msgstr "Chargement des textures..."
 
 #: src/client.cpp
 msgid "Rebuilding shaders..."
-msgstr "Reconstruction des shaders..."
+msgstr "Reconstruction des textures nuancées..."
 
 #: src/client/clientlauncher.cpp
 msgid "Connection error (timed out?)"
@@ -726,7 +721,7 @@ msgstr "Erreur de connexion (perte de connexion ?)"
 
 #: src/client/clientlauncher.cpp
 msgid "Could not find or load game \""
-msgstr "Le jeu \" n'a pas pu être trouvé"
+msgstr "Impossible de trouver ou charger le jeu"
 
 #: src/client/clientlauncher.cpp
 msgid "Invalid gamespec."
@@ -750,7 +745,8 @@ msgstr "Le chemin du monde spécifié n'existe pas : "
 
 #: src/fontengine.cpp
 msgid "needs_fallback_font"
-msgstr "yes"
+msgstr ""
+"needs_fallback_font (besoin ou pas des caractères spéciaux dans une police)"
 
 #: src/game.cpp
 msgid ""
@@ -833,7 +829,7 @@ msgstr ""
 "Menu / Inventaire visible :\n"
 "- double-appui (en dehors) : fermeture\n"
 "- objet(s) dans l'inventaire : déplacement\n"
-"- appui, glissement et appui : placement d'un seul item par slot\n"
+"- appui, glissement et appui : pose d'un seul item par emplacement\n"
 
 #: src/game.cpp
 msgid "Exit to Menu"
@@ -983,6 +979,10 @@ msgstr "Mode sans collision"
 msgid "Use"
 msgstr "Utiliser"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoomer"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "appuyez sur une touche"
@@ -1299,10 +1299,6 @@ msgstr "Bouton X 1"
 msgid "X Button 2"
 msgstr "Bouton X 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoomer"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1311,6 +1307,14 @@ msgid ""
 "sets.\n"
 "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
 msgstr ""
+"(X,Y,Z) décalage de fractale à partir du centre du monde en unités "
+"\"d'échelle\".\n"
+"Utilisé pour déplacer une zone de frai convenable à proximité des basses "
+"terres (0, 0).\n"
+"La valeur par défaut est adaptée pour les ensembles de Mandelbrot, elle doit "
+"être modifiée pour les ensembles de julia.\n"
+"Portée environ -2 à 2. A multiplier par \"l'échelle\" pour le décalage dans "
+"les nœuds."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1376,14 +1380,16 @@ msgid "Acceleration in air"
 msgstr "Accélération en l'air"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Management interval"
-msgstr "Portée des mapblocks actifs"
+msgstr "intervalle de gestion des blocs actifs"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Modifier interval"
-msgstr "Portée des mapblocks actifs"
+msgstr "Intervalle du modificateur de bloc actif"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Modificateurs de bloc actif"
 
 #: src/settings_translation_file.cpp
 msgid "Active block range"
@@ -1401,13 +1407,16 @@ msgid ""
 msgstr ""
 "Adresse où se connecter.\n"
 "Laisser vide pour démarrer un serveur local.\n"
-"Le champ de l'adresse dans le menu peut annuler cette option."
+"Notez que le champ de l'adresse dans le menu principal passe outre ce "
+"réglage."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
 "screens."
-msgstr "Ajuster le DPI de votre écran (non-X11 / Android seulement)."
+msgstr ""
+"Ajuster la résolution de votre écran (non-X11 / Android seulement) ex. pour "
+"les écrans 4k."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1422,9 +1431,8 @@ msgid "Advanced"
 msgstr "Avancé"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Altitude Chill"
-msgstr "Altitude d'état de froid"
+msgstr "Refroidissement en altitude"
 
 #: src/settings_translation_file.cpp
 msgid "Always fly and fast"
@@ -1457,9 +1465,8 @@ msgstr ""
 "servers.minetest.net."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Approximate (X,Y,Z) scale of fractal in nodes."
-msgstr "Série Julia : échelles (X,Y,Z) en blocs."
+msgstr "Série Julia: échelles (X,Y,Z) en blocs."
 
 #: src/settings_translation_file.cpp
 msgid "Ask to reconnect after crash"
@@ -1471,6 +1478,10 @@ msgstr ""
 "Déclarer automatiquement votre serveur à la liste des serveurs publics."
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Touche pour courir"
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "Reculer"
 
@@ -1483,7 +1494,6 @@ msgid "Basic"
 msgstr "Principal"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Basic Privileges"
 msgstr "Privilèges par défaut"
 
@@ -1504,6 +1514,10 @@ msgid "Build inside player"
 msgstr "Placement de bloc à la position du joueur"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Intégré"
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Bump mapping"
 
@@ -1525,16 +1539,15 @@ msgstr "Bruit de cave #1"
 
 #: src/settings_translation_file.cpp
 msgid "Cave noise #2"
-msgstr "Bruit de cave #2"
+msgstr "Bruit de grotte #2"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Cave width"
-msgstr "Largeur de la fenêtre"
+msgstr "Largeur de la grotte"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
-msgstr "Les caves et tunnels se forment à l'intersection de deux bruits"
+msgstr "Les grottes et tunnels se forment à l'intersection de deux bruits"
 
 #: src/settings_translation_file.cpp
 msgid "Chat key"
@@ -1545,6 +1558,10 @@ msgid "Chat toggle key"
 msgstr "Afficher le chat"
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Commandes de chat"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1566,6 +1583,25 @@ msgid ""
 "17 = 4D \"Mandelbulb\" mandelbrot set.\n"
 "18 = 4D \"Mandelbulb\" julia set."
 msgstr ""
+"Choix de 18 fractales provenant de 9 formules.\n"
+"1 = réglage Mandelbrot \"Roundy\" 4D.\n"
+"2 = réglage Julia \"Roundy\" 4D.\n"
+"3 = réglage Mandelbrot \"Squarry\" 4D.\n"
+"4 = réglage Julia \"Squarry\" 4D.\n"
+"5 = réglage Mandelbrot \"Cousin Mandy\" 4D.\n"
+"6 = réglage Julia \"Cousin Mandy\" 4D.\n"
+"7 = réglage Mandelbrot \"Variation\" 4D.\n"
+"8 = réglage Julia \"Variation\" 4D.\n"
+"9 = réglage Mandelbrot \"Mandelbrot/Mandelbar\" 3D.\n"
+"10 = réglage Julia \"Mandelbrot/Mandelbar\" 3D.\n"
+"11 = réglage Mandelbrot \"Christmas Tree\" 3D.\n"
+"12 = réglage Julia \"Christmas Tree\" 3D.\n"
+"13 = réglage Mandelbrot \"Mandelbulb\" 3D.\n"
+"14 = réglage Julia \"Mandelbulb\" 3D.\n"
+"15 = réglage Mandelbrot \"Cosine Mandelbulb\" 3D.\n"
+"16 = réglage Julia \"Cosine Mandelbulb\" 3D.\n"
+"17 = réglage Mandelbrot \"Mandelbulb\" 4D.\n"
+"18 = réglage Julia \"Mandelbulb\" 4D."
 
 #: src/settings_translation_file.cpp
 msgid "Chunk size"
@@ -1617,6 +1653,16 @@ msgstr "Brume colorée"
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Liste des mods de confiance séparés par des virgules qui sont autorisés à "
+"accéder\n"
+"aux API HTTP, leur permettant d'envoyer et de télécharger des données vers/"
+"depuis Internet."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Comma-separated list of trusted mods that are allowed to access insecure\n"
 "functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
@@ -1626,16 +1672,6 @@ msgstr ""
 "request_insecure_environment())."
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Liste séparée par des virgules des mods de confiance qui sont autorisés à "
-"accéder\n"
-"aux API HTTP, leur permettant d'envoyer et de télécharger des données vers/"
-"depuis Internet."
-
-#: src/settings_translation_file.cpp
 msgid "Command key"
 msgstr "Commande"
 
@@ -1705,6 +1741,8 @@ msgstr "Contrôle l'élévation/hauteur des collines."
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
 msgstr ""
+"Contrôle la largeur des tunnels, une valeur plus petite crée des tunnels "
+"plus larges."
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
@@ -1791,6 +1829,10 @@ msgid "Default privileges"
 msgstr "Privilèges par défaut"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Format de rapport par défaut"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1813,6 +1855,10 @@ msgstr ""
 "illimité)."
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Retard dans les blocs envoyés après la construction"
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr "Latence d'apparition des infobulles, établie en millisecondes."
 
@@ -1843,15 +1889,6 @@ msgid "Desynchronize block animation"
 msgstr "Désynchroniser les textures animées par mapblock"
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-"Profil détaillé des données du mod. Utile pour les développeurs de mods."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Profil détaillé des mods"
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1866,6 +1903,22 @@ msgid "Disable anticheat"
 msgstr "Désactiver l'anti-triche"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Désactive les séquences d'échappement"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Désactive les séquences d'échappement. ex : chat coloré.\n"
+"Utilisez cette option si vous voulez exécuter un serveur avec des clients "
+"antérieurs à la 0. 4. 14 et que vous souhaitez désactiver\n"
+"les séquences d'échappement générées par les mods."
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "Refuser les mots de passe vides"
 
@@ -1890,9 +1943,12 @@ msgid "Dump the mapgen debug infos."
 msgstr "Afficher les infos de débogage de la génération de terrain."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Enable Joysticks"
+msgstr "Activer souris"
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
-msgstr "Activer le pack de mods"
+msgstr "Activer Vertex Buffer Object: objet tampon de vertex"
 
 #: src/settings_translation_file.cpp
 msgid "Enable mod security"
@@ -1974,9 +2030,8 @@ msgid "Enables caching of facedir rotated meshes."
 msgstr "Active la mise en cache des meshnodes."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Enables filmic tone mapping"
-msgstr "Active la mini-carte."
+msgstr "Autorise le mappage tonal cinématographique"
 
 #: src/settings_translation_file.cpp
 msgid "Enables minimap."
@@ -1999,6 +2054,14 @@ msgstr ""
 "Nécessite les shaders pour être activé."
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Intervalle d'impression des données du moteur de profil"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Systèmes d'entité"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2016,7 +2079,7 @@ msgstr "FSAA"
 
 #: src/settings_translation_file.cpp
 msgid "Fall bobbing"
-msgstr "Fréquence du mouvement du bras en tombant"
+msgstr "Fréquence de mouvement du bras en tombant"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font"
@@ -2063,11 +2126,23 @@ msgid "Field of view"
 msgstr "Champ de vision"
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Champ de vision du zoom"
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr "Champ de vision en degrés."
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Champ de vision en degrés pendant le zoom.  \n"
+"Ceci nécessite le privilège \"zoom\" sur le serveur."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2076,11 +2151,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Filler Depth"
-msgstr ""
+msgstr "Profondeur du remplissage"
 
 #: src/settings_translation_file.cpp
 msgid "Filmic tone mapping"
-msgstr "Tone Mapping"
+msgstr "Mappage tonal cinématographique"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2146,9 +2221,8 @@ msgid "Font size"
 msgstr "Taille de la police"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Format of screenshots."
-msgstr "Chemin où les captures d'écran sont sauvegardées."
+msgstr "Format de captures d'écran."
 
 #: src/settings_translation_file.cpp
 msgid "Forward key"
@@ -2217,20 +2291,24 @@ msgid "Generate normalmaps"
 msgstr "Normal mapping"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Global callbacks"
+msgstr "Rappels globaux"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Attributs spécifiques à Mapgen V6.\n"
-"Quand les terrains neigeux sont activés, les jungles sont activés et les "
-"drapeaux jungle est ignoré.\n"
+"Attributs de génération de terrain globaux.\n"
+"Dans le générateur de terrain V6, le drapeau 'décorations' contrôle toutes "
+"les décorations sauf les arbres\n"
+"et l'herbe de la jungle, dans tous les autres générateurs de terrain, ce "
+"drapeau contrôle toutes les décorations.\n"
+"La chaîne de drapeaux modifie les paramètres par défaut du moteur.\n"
 "Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs par "
 "défaut.\n"
 "Les drapeaux commençant par \"non\" sont désactivés."
@@ -2244,9 +2322,8 @@ msgid "Gravity"
 msgstr "Gravité"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "HTTP Mods"
-msgstr "Mods"
+msgstr "Mods utilisant le protocole de transfert hypertexte"
 
 #: src/settings_translation_file.cpp
 msgid "HUD toggle key"
@@ -2261,12 +2338,27 @@ msgid ""
 msgstr ""
 "Traitement des appels d'API Lua obsolètes :\n"
 "- legacy : imite l'ancien comportement (par défaut en mode release).\n"
-"- log : imite et registre les appels obsolètes (par défaut en mode debug).\n"
+"- log : imite et enregistre les appels obsolètes (par défaut en mode "
+"debug).\n"
 "- error : interruption à l'usage d'un appel obsolète (recommandé pour les "
 "développeurs de mods)."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+"Auto-instrumentaliser le profileur:\n"
+"* Instrumentalise une fonction vide.\n"
+"La surcharge sera évaluée. (l'auto-instrumentalisation ajoute 1 appel de "
+"fonction à chaque fois).\n"
+"* Instrumentalise l’échantillonneur utilisé pour mettre à jour les "
+"statistiques."
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr "Résolution verticale de la fenêtre de jeu."
 
@@ -2298,15 +2390,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr "Nombre maximum de mapblocks simultanés envoyés sur le serveur."
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr "Nombre maximum de mapblocks simultanés envoyés par client."
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2423,6 +2506,49 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr "Couleur de fond de la console du jeu (R,G,B)."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"Instrument d'intégration.\n"
+"Ceci est habituellement nécessaire pour les contributeurs d'intégration au "
+"noyau"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Instrument d'enregistrement des commandes de chat."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Instrument des fonctions de rappel global enregistrées.\n"
+"(tout ce que vous passez dans une fonction minetest.register_*())"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+"Instrumentalise la fonction d'action des modificateurs actifs de bloc lors "
+"de l'enregistrement."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+"Instrumentalise la fonction d'action des modificateurs de blocs chargés lors "
+"de l'enregistrement."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Instrumentalise les systèmes d'entités lors de l'enregistrement."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Instrumentalisation"
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 "Intervalle de sauvegarde des changements importants dans le monde, établie "
@@ -2430,7 +2556,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Interval of sending time of day to clients."
-msgstr "Intervalle d'envoi de l'heure de jeu aux clients."
+msgstr "Intervalle d'envoi de l'heure aux clients."
 
 #: src/settings_translation_file.cpp
 msgid "Inventory items animations"
@@ -2438,7 +2564,7 @@ msgstr "Animation des items d'inventaire"
 
 #: src/settings_translation_file.cpp
 msgid "Inventory key"
-msgstr "Inventaire"
+msgstr "Touche d'inventaire"
 
 #: src/settings_translation_file.cpp
 msgid "Invert mouse"
@@ -2453,13 +2579,20 @@ msgid "Item entity TTL"
 msgstr "Durée de vie des items abandonnés"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Iterations of the recursive function.\n"
 "Controls the amount of fine detail."
 msgstr ""
-"Série Julia : itérations de la fonction récursive.\n"
-"Contrôle l'échelle du détail le plus subtil."
+"Itérations de la fonction récursive.\n"
+"Contrôle la quantité de détails fins."
+
+#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Intervalle de répétition du bouton du Joystick"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "Sensibilité tronconique du joystick"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2468,36 +2601,40 @@ msgid ""
 "Has no effect on 3D fractals.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Réglage Julia uniquement: composante W de la constante \"hypercomplex\" "
+"déterminant la forme Julia.\n"
+"N'a aucun effet sur fractales 3D.\n"
+"Portée environ -2 et 2."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Julia set only: X component of hypercomplex constant determining julia "
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
-"Série Julia : valeur X déterminant la forme 4D.\n"
-"La portée est environ entre -2 et 2."
+"Série Julia uniquement: composant X de la constante \"hypercomplex\" "
+"déterminant la forme Julia.\n"
+"Portée environ -2 et 2."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Julia set only: Y component of hypercomplex constant determining julia "
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
-"Série Julia : valeur Y déterminant la forme 4D.\n"
-"La portée est environ entre -2 et 2."
+"Série Julia uniquement: composante Y de la constante \"hypercomplex\" "
+"determinant la forme Julia.\n"
+"La portée est d'environ -2 à 2."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Julia set only: Z component of hypercomplex constant determining julia "
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
-"Série Julia : valeur Z déterminant la forme 4D.\n"
-"La portée est environ entre -2 et 2."
+"Série Julia uniquement: composante Z de la constante \"hypercomplex\" "
+"déterminant la forme Julia.\n"
+"La portée est d'environ -2 à 2."
 
 #: src/settings_translation_file.cpp
 msgid "Jump key"
@@ -2508,13 +2645,12 @@ msgid "Jumping speed"
 msgstr "Vitesse de saut du joueur"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Key for decreasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Touche pour activer/désactiver la distance de vue illimitée.\n"
+"Touche pour diminuer le champ de vision.\n"
 "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
@@ -2529,13 +2665,12 @@ msgstr ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Key for increasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Touche pour activer/désactiver la distance de vue illimitée.\n"
+"Touche pour accroitre le champ de vision.\n"
 "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
@@ -2605,7 +2740,7 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Touche pour ouvrir la console de jeu.\n"
+"Touche pour ouvrir la console de chat.\n"
 "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
@@ -2615,7 +2750,7 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Touche pour ouvrir la fenêtre de chat pour entrer des commandes.\n"
+"Touche pour ouvrir la fenêtre du chat pour entrer des commandes.\n"
 "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
@@ -2657,8 +2792,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Touche pour se déplacer lentement.\n"
-"Utilisé pour descendre si aux1_descends est désactivé.\n"
+"Touche pour se faufiler.\n"
+"Egalement utilisée pour descendre et plonger dans l'eau si aux1_descends est "
+"désactivé.\n"
 "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
@@ -2684,6 +2820,16 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Touche d’exécution automatique.\n"
+"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2734,7 +2880,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2759,7 +2905,7 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Touche pour afficher/cacher le HUD.\n"
+"Touche pour afficher/masquer le HUD ( Affichage tête haute).\n"
 "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
@@ -2806,7 +2952,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Key use for climbing/descending"
-msgstr "Touche \"utiliser\" pour monter/descendre"
+msgstr "Touche utilisée pour monter/descendre"
 
 #: src/settings_translation_file.cpp
 msgid "Language"
@@ -2838,7 +2984,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Left key"
-msgstr "Gauche"
+msgstr "Touche gauche"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2848,11 +2994,11 @@ msgstr "Temps d'intervalle entre la mise à jour des objets sur le réseau."
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between ABM execution cycles"
-msgstr ""
+msgstr "Durée entre les cycles d’exécution ABM"
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "Durée entre les cycles d’exécution NodeTimer"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2906,7 +3052,7 @@ msgstr "Régularité de la fluidité des liquides"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid loop max"
-msgstr "Itérations maximum pendant la transformation des liquides"
+msgstr "Itérations maximales pendant la transformation des liquides"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid queue purge time"
@@ -2925,23 +3071,41 @@ msgid "Liquid update tick"
 msgstr "Intervalle de mise-à-jour des liquides"
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Charger le profil de jeu"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+"Charge le profil du jeu pour collecter des données de profil du jeu.\n"
+"Fournit une commande /profiler pour accéder au profil compilé.\n"
+"Utile pour les développeurs de mod et les opérateurs de serveurs."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Chargement des modificateurs de blocs"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
-msgstr "Gestionnaire de jeux du menu"
+msgstr "Gestionnaire du menu principal du jeu"
 
 #: src/settings_translation_file.cpp
 msgid "Main menu mod manager"
-msgstr "Gestionnaire de mods du menu"
+msgstr "Gestionnaire du menu principal du mod"
 
 #: src/settings_translation_file.cpp
 msgid "Main menu script"
-msgstr "Script de menu personnalisé"
+msgstr "Script du menu principal"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
 msgstr ""
-"Rendre la couleur de la brume et du ciel différente selon l'heure du jour et "
-"la direction du regard."
+"Rendre la couleur de la brume et du ciel différents selon l'heure du jour "
+"(aube/crépuscule) et la direction du regard."
 
 #: src/settings_translation_file.cpp
 msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
@@ -2951,10 +3115,9 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Map directory"
-msgstr "Chemin du monde"
+msgstr "Répertoire de la carte du monde"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen Valleys.\n"
 "'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2962,72 +3125,65 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Attributs spécifiques à Mapgen V6.\n"
-"Quand les terrains neigeux sont activés, les jungles sont activés et les "
-"drapeaux jungle est ignoré.\n"
+"Attributs spécifiques au générateur de terrain: Mapgen Valleys.\n"
+"Le paramètre: 'altitude_chill' provoque un refroidissement à des altitudes "
+"élevées, ce qui cause des problèmes dans les biomes.\n"
+"Le paramètre 'humid_rivers' modifie l'humidité autour des rivières et dans "
+"les zones où l'eau est assez présente,\n"
+"cela peut interférer avec des biomes ajustés délicatement.\n"
+"La chaîne de drapeaux modifie les paramètres par défaut du moteur.\n"
 "Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs par "
 "défaut.\n"
-"Les drapeaux commençant par \"non\" sont désactivés."
+"Les drapeaux commençant par \"non\" sont utilisés pour désactiver de manière "
+"explicite."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Attributs de terrain spécifiques à Mapgen V7.\n"
-"'ridges' sont les rivières.\n"
-"Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs par "
+"Attributs de terrain spécifiques à Mapgen flat.\n"
+"Des lacs et des collines occasionnels peuvent être ajoutés au monde plat.\n"
+"Les drapeaux qui ne sont spécifiés dans le champ ne sont pas modifiés par "
 "défaut.\n"
-"Les drapeaux commençant par \"non\" sont désactivés."
+"Les drapeaux commençant par \"non\" sont désactivés explicitement."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
 "Attributs spécifiques à Mapgen V6.\n"
-"Quand les terrains neigeux sont activés, les jungles sont activés et les "
-"drapeaux jungle est ignoré.\n"
+"Quand les terrains neigeux sont activés, les jungles sont activées "
+"automatiquement, les drapeaux \"jungles\" sont ignorés.\n"
 "Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs par "
 "défaut.\n"
-"Les drapeaux commençant par \"non\" sont désactivés."
+"Les drapeaux commençant par \"non\" sont désactivés explicitement."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Attributs spécifiques à Mapgen V6.\n"
-"Quand les terrains neigeux sont activés, les jungles sont activés et les "
-"drapeaux jungle est ignoré.\n"
-"Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs par "
-"défaut.\n"
-"Les drapeaux commençant par \"non\" sont désactivés."
+"Attributs de terrain spécifiques au Mapgen V7.\n"
+"Le drapeau 'des crêtes' contrôle les rivières.\n"
+"Les drapeaux qui ne sont pas spécifiés dans la chaîne de drapeau ne sont pas "
+"modifiés par rapport à la valeur par défaut.\n"
+"Les drapeaux commençant par \"non\" sont désactivés explicitement."
 
 #: src/settings_translation_file.cpp
 msgid "Map generation limit"
@@ -3046,9 +3202,8 @@ msgid "Mapblock unload timeout"
 msgstr "Délais d'interruption du déchargement des mapblocks"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen Valleys"
-msgstr "Nom du générateur de carte"
+msgstr "Générateur de carte avec des vallées"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen biome heat noise parameters"
@@ -3071,76 +3226,64 @@ msgid "Mapgen flags"
 msgstr "Drapeaux de génération de terrain"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat"
-msgstr "Drapeaux de génération de terrain"
+msgstr "Générateur de terrain plat"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat cave width"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Ampleur de grotte du générateur de terrain plat"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat cave1 noise parameters"
-msgstr "Mapgen V5 : paramètres de bruit cave1"
+msgstr "Générateur de terrain plat: paramètres de bruit grotte1"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat cave2 noise parameters"
-msgstr "Mapgen V5 : paramètre de bruit cave2"
+msgstr "Générateur de terrain plat: paramètres de bruit grotte2"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat filler depth noise parameters"
-msgstr "Mapgen V5 : paramètres de bruit sur la profondeur"
+msgstr "Générateur de terrain plat: paramètres de bruit sur la profondeur"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat flags"
-msgstr "Drapeaux des fractales de la génération de terrain"
+msgstr "Drapeaux du générateur de terrain plat"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat ground level"
-msgstr "Drapeaux de génération de terrain"
+msgstr "Niveau du sol du générateur de terrain plat"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill steepness"
-msgstr "Élévation des collines plates"
+msgstr "Élévation des collines dans le générateur de terrain plat"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill threshold"
-msgstr ""
+msgstr "Seuil du générateur de cartes avec de faibles collines"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat lake steepness"
-msgstr "Mapgen Julia : itérations fractales"
+msgstr "Escarpement des lacs du générateur de terrain plat"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat lake threshold"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Seuil des lacs du générateur de terrain plat"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat large cave depth"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Profondeur des grandes grottes du générateur de terrain plat"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat terrain noise parameters"
-msgstr "Mapgen V6 : paramètres de bruit du terrain de base"
+msgstr "Paramètres de bruit du générateur de terrain plat"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal"
-msgstr "Fractales de la génération de terrain"
+msgstr "Fractales du générateur de terrain"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal cave width"
-msgstr "Mapgen Julia : couche fractale W"
+msgstr "Ampleur des grottes du générateur de terrain Julia"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave1 noise parameters"
@@ -3155,14 +3298,12 @@ msgid "Mapgen fractal filler depth noise parameters"
 msgstr "Mapgen V5 : paramètres de bruit sur la profondeur"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal fractal"
-msgstr "Drapeaux des fractales de la génération de terrain"
+msgstr "Drapeaux des fractales du générateur de terrain"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal iterations"
-msgstr "Mapgen Julia : itérations fractales"
+msgstr "Itérations du générateur de terrain julia"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia w"
@@ -3181,27 +3322,25 @@ msgid "Mapgen fractal julia z"
 msgstr "Mapgen Julia : fractale Z"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal offset"
-msgstr "Mapgen Julia : décalages fractals"
+msgstr "Générateur de terrain Julia: décalages fractals"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal scale"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Générateur de terrain Julia: échelles fractales"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal seabed noise parameters"
-msgstr "Mapgen : paramètres de bruit du fond de l'eau"
+msgstr "Paramètres de bruit du fond marin pour le générateur de terrain julia"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal slice w"
-msgstr "Mapgen Julia : couche fractale W"
+msgstr "Générateur de terrain Julia: couche fractale W"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen heat blend noise parameters"
-msgstr "Mapgen : paramètres de mélange de la température"
+msgstr ""
+"Paramètres de bruit du mélange de température pour le générateur de terrain"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen name"
@@ -3209,40 +3348,41 @@ msgstr "Nom du générateur de carte"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5"
-msgstr "Mapgen V5"
+msgstr "Générateur de terrain V5"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v5 cave width"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Ampleur des grottes du générateur de terrain V5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave1 noise parameters"
-msgstr "Mapgen V5 : paramètres de bruit cave1"
+msgstr "Paramètres du bruit cave1 du générateur de terrain v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave2 noise parameters"
-msgstr "Mapgen V5 : paramètre de bruit cave2"
+msgstr "Paramètres du bruit cave2 du générateur de terrain v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 factor noise parameters"
-msgstr "Mapgen V5 : paramètres de facteur de dispersion"
+msgstr "Paramètres du facteur de dispersion du générateur de terrain v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 filler depth noise parameters"
-msgstr "Mapgen V5 : paramètres de bruit sur la profondeur"
+msgstr ""
+"Paramètres du bruit de la profondeur de remplissage du générateur de terrain "
+"v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 height noise parameters"
-msgstr "Mapgen V5 : paramètres de bruit de la hauteur"
+msgstr "Paramètres du bruit en altitude du générateur de terrain v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6"
-msgstr "Mapgen V6"
+msgstr "Générateur de terrain V6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 apple trees noise parameters"
-msgstr "Mapgen V6 : paramètres de bruit des pommiers"
+msgstr "Paramètres du bruit des pommiers du générateur de terrain v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 beach frequency"
@@ -3301,9 +3441,8 @@ msgid "Mapgen v7"
 msgstr "Mapgen V7"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v7 cave width"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Ampleur des grottes du générateur de terrain: Mapgen V7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave1 noise parameters"
@@ -3402,6 +3541,14 @@ msgid "Maximum hotbar width"
 msgstr "Largeur maximale de la barre d'inventaire"
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "Nombre maximal de blocs pouvant être envoyés simultanément."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Nombre maximal de blocs pouvant être envoyés simultanément par client."
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr "Nombre maximum de mapblocks qui peuvent être listés pour chargement."
 
@@ -3448,13 +3595,17 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Maximum number of players that can connect simultaneously."
-msgstr "Nombre maximum de joueurs qui peuvent être connectés en même temps."
+msgstr "Nombre maximal de joueurs qui peuvent être connectés en même temps."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum number of statically stored objects in a block."
 msgstr "Nombre maximum d'objets sauvegardés dans un mapblock (16^3 blocs)."
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Nombre maximal d'objets par bloc"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
@@ -3463,17 +3614,17 @@ msgstr ""
 "Utile quand il y a quelque chose à afficher à gauche ou à droite de la barre."
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr "Nombre maximum de mapblocks simultanés envoyés par client"
+msgid "Maximum simultaneous block sends per client"
+msgstr "Nombre maximal de blocs simultanés envoyés par client"
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
-msgstr "Nombre maximum total de mapblocks simultanés envoyés"
+msgid "Maximum simultaneous block sends total"
+msgstr "Nombre maximal de blocs simultanés envoyés"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum time in ms a file download (e.g. a mod download) may take."
 msgstr ""
-"Délais maximum de téléchargement d'un fichier (ex.: un mod), établi en "
+"Délais maximaux de téléchargement d'un fichier (ex.: un mod), établi en "
 "millisecondes."
 
 #: src/settings_translation_file.cpp
@@ -3481,10 +3632,6 @@ msgid "Maximum users"
 msgstr "Joueurs maximum"
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Nombre maximum d'objets par mapblock"
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "Menus"
 
@@ -3525,10 +3672,6 @@ msgid "Mipmapping"
 msgstr "Mip-mapping"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr "Profilage des mods"
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr "URL des détails du magasin de mods"
 
@@ -3624,17 +3767,16 @@ msgstr "Mode sans collision"
 
 #: src/settings_translation_file.cpp
 msgid "Node highlighting"
-msgstr "Eclairage des blocs"
+msgstr "Surbrillance des blocs"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "NodeTimer interval"
-msgstr "Intervalle d'envoi du temps"
+msgstr "Intervalle de temps d'un nœud"
 
 #: src/settings_translation_file.cpp
 msgid "Noise parameters for biome API temperature, humidity and biome blend."
 msgstr ""
-"Paramètres de mélange pour la température, humidité et mélange de biomes."
+"Paramètres de bruit pour la température, l'humidité et le mélange de biomes."
 
 #: src/settings_translation_file.cpp
 msgid "Noises"
@@ -3650,7 +3792,7 @@ msgstr "Force des normalmaps"
 
 #: src/settings_translation_file.cpp
 msgid "Number of emerge threads"
-msgstr "Nombre de threads"
+msgstr "Nombre de tâches en cours"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3660,11 +3802,11 @@ msgid ""
 "speed greatly\n"
 "at the cost of slightly buggy caves."
 msgstr ""
-"Nombre de threads à utiliser. Laisser ce champ vide, ou augmenter cette "
-"valeur\n"
-"pour utiliser le multi-threading. Sur des systèmes multi-processeurs, cela "
-"va améliorer grandement\n"
-"la génération de terrain au détriment de quelques caves altérées."
+"Nombre de tâches en cours à utiliser. Laisser ce champ vide, ou augmenter "
+"cette valeur\n"
+"pour utiliser le multi-tâches. Sur des systèmes multi-processeurs, cela va "
+"améliorer grandement\n"
+"la génération de terrain au détriment de quelques altérations de grottes."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3684,12 +3826,11 @@ msgstr "Nombre d'itérations sur l'occlusion parallaxe."
 
 #: src/settings_translation_file.cpp
 msgid "Overall bias of parallax occlusion effect, usually scale/2."
-msgstr ""
-"Bias général de l'occlusion parallaxe, habituellement échelle divisée par 2."
+msgstr "Bias général de l'occlusion parallaxe, habituellement échelle/2."
 
 #: src/settings_translation_file.cpp
 msgid "Overall scale of parallax occlusion effect."
-msgstr "Echelle générale de l'occlusion parallaxe."
+msgstr "Echelle générale de l'effet de l'occlusion parallaxe."
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion"
@@ -3759,7 +3900,7 @@ msgid ""
 "Note that the port field in the main menu overrides this setting."
 msgstr ""
 "Port où se connecter (UDP).\n"
-"Le champ de port dans le menu va annuler ce paramètre."
+"Notez que le champ de port dans le menu principal passe outre ce réglage."
 
 #: src/settings_translation_file.cpp
 msgid "Prevent mods from doing insecure things like running shell commands."
@@ -3768,23 +3909,31 @@ msgstr ""
 "système)."
 
 #: src/settings_translation_file.cpp
-msgid "Privileges that players with basic_privs can grant"
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
 msgstr ""
+"Imprime les données de profilage du moteur à intervalles réguliers. 0 = "
+"désactivation.\n"
+"Utile pour les développeurs."
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Privileges that players with basic_privs can grant"
 msgstr ""
-"Délais d’intervalle d'affichage du profilage des données. 0 = "
-"désactivation.\n"
-"Utile pour les développeurs."
+"Les privilèges que les joueurs ayant le privilège basic_privs peuvent "
+"accorder"
+
+#: src/settings_translation_file.cpp
+msgid "Profiler"
+msgstr "Profileur"
 
 #: src/settings_translation_file.cpp
 msgid "Profiler toggle key"
 msgstr "Profilage"
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "Délais d'intervale du profilage"
+msgid "Profiling"
+msgstr "Profilage"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3792,7 +3941,7 @@ msgid ""
 "Values larger than 26 will start to produce sharp cutoffs at cloud area "
 "corners."
 msgstr ""
-"Rayon de l'aire des nuages où se trouve 64 blocs de nuage.\n"
+"Rayon de l'aire des nuages où se trouve 64 blocs carrés de nuages.\n"
 "Les valeurs plus grandes que 26 entraînent une \"coupure\" nette des nuages "
 "aux coins de l'aire."
 
@@ -3821,6 +3970,10 @@ msgid "Replaces the default main menu with a custom one."
 msgstr "Remplace le menu par défaut par un menu personnalisé."
 
 #: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Chemin du rapport"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "Droite"
 
@@ -3842,7 +3995,7 @@ msgstr "Taille des rivières"
 
 #: src/settings_translation_file.cpp
 msgid "River noise -- rivers occur close to zero"
-msgstr "Bruit des rivières"
+msgstr "Bruit des rivières -- les rivières se forment près de zéro"
 
 #: src/settings_translation_file.cpp
 msgid "Rollback recording"
@@ -3892,14 +4045,12 @@ msgid "Screenshot folder"
 msgstr "Dossier des captures d'écran"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot format"
-msgstr "Dossier des captures d'écran"
+msgstr "Format des captures d'écran"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot quality"
-msgstr "Capture d'écran"
+msgstr "Qualité des captures d'écran"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3907,6 +4058,9 @@ msgid ""
 "1 means worst quality; 100 means best quality.\n"
 "Use 0 for default quality."
 msgstr ""
+"Qualité de capture d'écran. Utilisé uniquement pour le format JPEG.\n"
+"1 signifie mauvaise qualité; 100 signifie la meilleure qualité.\n"
+"Utilisez 0 pour la qualité par défaut."
 
 #: src/settings_translation_file.cpp
 msgid "Security"
@@ -3989,22 +4143,22 @@ msgid ""
 "Set to true enables waving water.\n"
 "Requires shaders to be enabled."
 msgstr ""
-"Mettre sur \"true\" active les liquides mouvants.\n"
+"Mettre sur \"true\" active les vagues.\n"
 "Nécessite les shaders pour être activé."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
-"Les shaders permettent des effets visuels avancés et peut améliorer les "
+"Les shaders permettent des effets visuels avancés et peuvent améliorer les "
 "performances sur certaines cartes graphiques.\n"
 "Fonctionne seulement avec OpenGL."
 
 #: src/settings_translation_file.cpp
 msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr "Forme de la mini-carte. Activé = ronde, désactivé = carré."
+msgstr "Forme de la mini-carte. Activé = ronde, désactivé = carrée."
 
 #: src/settings_translation_file.cpp
 msgid "Show debug info"
@@ -4012,7 +4166,7 @@ msgstr "Afficher les infos de débogage"
 
 #: src/settings_translation_file.cpp
 msgid "Show entity selection boxes"
-msgstr ""
+msgstr "Afficher les boîtes de sélection de l'entité"
 
 #: src/settings_translation_file.cpp
 msgid "Shutdown message"
@@ -4027,6 +4181,7 @@ msgstr "Taille des chunks à générer, établie en mapblocks (16^3 blocs)."
 #: src/settings_translation_file.cpp
 msgid "Slope and fill work together to modify the heights"
 msgstr ""
+"La pente et le remplissage fonctionnent ensemble pour modifier les hauteurs"
 
 #: src/settings_translation_file.cpp
 msgid "Smooth lighting"
@@ -4034,7 +4189,7 @@ msgstr "Lumière douce"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 "Lisse les mouvement de la caméra en se déplaçant et en regardant autour.\n"
@@ -4068,11 +4223,12 @@ msgstr ""
 "$filename doit être accessible depuis $remote_media$filename via cURL "
 "(évidemment, remote_media devrait\n"
 "se terminer avec un slash).\n"
-"Les fichiers qui ne sont pas présents seront obtenus avec le moyen usuel."
+"Les fichiers qui ne sont pas présents seront récupérés de la manière "
+"habituelle."
 
 #: src/settings_translation_file.cpp
 msgid "Static spawnpoint"
-msgstr "Emplacement du spawn"
+msgstr "Emplacement du spawn statique"
 
 #: src/settings_translation_file.cpp
 msgid "Strength of generated normalmaps."
@@ -4088,7 +4244,7 @@ msgstr "Vérification stricte du protocole"
 
 #: src/settings_translation_file.cpp
 msgid "Support older servers"
-msgstr ""
+msgstr "Fonctionne sur d'anciens serveurs"
 
 #: src/settings_translation_file.cpp
 msgid "Synchronous SQLite"
@@ -4104,6 +4260,9 @@ msgid ""
 "Controls proportion of world area covered by hills.\n"
 "Adjust towards 0.0 for a larger proportion."
 msgstr ""
+"Seuil du bruit de relief pour les collines.\n"
+"Contrôle la proportion sur la superficie d'un monde recouvert de collines.\n"
+"Ajuster vers 0. 0 pour une plus grande proportion."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4111,6 +4270,9 @@ msgid ""
 "Controls proportion of world area covered by lakes.\n"
 "Adjust towards 0.0 for a larger proportion."
 msgstr ""
+"Seuil du bruit de relief pour les lacs.\n"
+"Contrôle la proportion sur la superficie d'un monde recouvert de lacs.\n"
+"Ajuster vers 0. 0 pour une plus grande proportion."
 
 #: src/settings_translation_file.cpp
 msgid "Texture path"
@@ -4121,12 +4283,28 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr "L'altitude à laquelle la température descend de 20°C"
 
 #: src/settings_translation_file.cpp
-msgid "The depth of dirt or other filler"
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
 msgstr ""
+"Le format par défaut dans lequel les profils seront sauvegardés,\n"
+"lorsque la commande `/profiler save [format]` est entrée sans format."
 
 #: src/settings_translation_file.cpp
-msgid "The network interface that the server listens on."
-msgstr "L'interface réseau que le serveur écoute."
+msgid "The depth of dirt or other filler"
+msgstr "La profondeur de la terre ou autre matériau"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+"Le chemin d'accès au fichier relatif au monde dans lequel les profils seront "
+"sauvegardés.\n"
+
+#: src/settings_translation_file.cpp
+msgid "The network interface that the server listens on."
+msgstr "L'interface réseau que le serveur écoute."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4142,6 +4320,14 @@ msgstr "Le pilote vidéo pour Irrlicht."
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+"Sensibilité de la souris pour déplacer la \n"
+"vue en jeu autour du tronc."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -4162,9 +4348,17 @@ msgid ""
 msgstr ""
 "Le temps (en secondes) où la file des liquides peut s'agrandir au-delà de "
 "sa\n"
-"capacité de traitement jusqu'à ce qu'une tentative est faite pour réduire sa "
-"taille en vidant\n"
-"l'ancienne file d'items. Une valeur de 0 désactive cette fonctionnalité."
+"capacité de traitement jusqu'à ce qu'une tentative soit faite pour réduire "
+"sa taille en vidant\n"
+"l'ancienne file d'articles. Une valeur de 0 désactive cette fonctionnalité."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"L'intervalle en secondes entre des clics droits répétés lors de l'appui sur "
+"le bouton droit de la souris."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4180,15 +4374,15 @@ msgstr "Cette police sera utilisée pour certaines langues."
 
 #: src/settings_translation_file.cpp
 msgid "Time in between active block management cycles"
-msgstr ""
+msgstr "Temps entre les cycles de gestion des blocs actifs"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Time in seconds for item entity (dropped items) to live.\n"
 "Setting it to -1 disables the feature."
 msgstr ""
-"Durée de visibilité des objets jetés.\n"
-"Définir ceci à -1 pour désactiver cette fonctionnalité."
+"Durée en secondes pendant laquelle les objets jetés sont présents.\n"
+"Définir à -1 pour désactiver cette fonctionnalité."
 
 #: src/settings_translation_file.cpp
 msgid "Time send interval"
@@ -4201,7 +4395,7 @@ msgstr "Vitesse du temps"
 #: src/settings_translation_file.cpp
 msgid "Timeout for client to remove unused map data from memory."
 msgstr ""
-"Temps de délais pour le client pour supprimer les données de la carte de sa "
+"Délai pendant lequel le client supprime les données de la carte de sa "
 "mémoire."
 
 #: src/settings_translation_file.cpp
@@ -4211,7 +4405,7 @@ msgid ""
 "This determines how long they are slowed down after placing or removing a "
 "node."
 msgstr ""
-"Pour réduire le lag, le transfert des mapblocks sont ralentis quand un "
+"Pour réduire le lag, les transferts des mapblocks sont ralentis quand un "
 "joueur\n"
 "est en train de construire quelque chose.\n"
 "Cela détermine la durée du ralentissement après placement ou destruction "
@@ -4219,7 +4413,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Toggle camera mode key"
-msgstr "Changer de caméra"
+msgstr "Basculement en mode caméra"
 
 #: src/settings_translation_file.cpp
 msgid "Tooltip delay"
@@ -4258,15 +4452,18 @@ msgstr "Purger les données de serveur inutiles"
 
 #: src/settings_translation_file.cpp
 msgid "Use 3D cloud look instead of flat."
-msgstr "Activation des nuages 3D au lieu des nuages 2D (plats)."
+msgstr "Activer les nuages 3D au lieu des nuages 2D (plats)."
 
 #: src/settings_translation_file.cpp
 msgid "Use a cloud animation for the main menu background."
-msgstr "Mouvement des nuages dans le menu."
+msgstr ""
+"Utiliser une animation de nuages pour l'arrière-plan du menu principal."
 
 #: src/settings_translation_file.cpp
 msgid "Use anisotropic filtering when viewing at textures from an angle."
-msgstr "Utilisation du filtrage anisotrope."
+msgstr ""
+"Utilisation du filtrage anisotrope lors de la visualisation des textures de "
+"biais."
 
 #: src/settings_translation_file.cpp
 msgid "Use bilinear filtering when scaling textures."
@@ -4278,17 +4475,14 @@ msgstr "Utiliser"
 
 #: src/settings_translation_file.cpp
 msgid "Use mip mapping to scale textures. May slightly increase performance."
-msgstr "Utilisation du mip-mapping. Peut impacter les performances."
+msgstr ""
+"Utilisation du mip-mapping. Peut augmenter légèrement les performances."
 
 #: src/settings_translation_file.cpp
 msgid "Use trilinear filtering when scaling textures."
 msgstr "Utilisation du filtrage trilinéaire."
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Utile pour les développeurs de mods."
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr "Synchronisation verticale"
 
@@ -4302,7 +4496,7 @@ msgstr "Profondeur des vallées"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Fill"
-msgstr ""
+msgstr "Comblement de vallée"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Profile"
@@ -4314,7 +4508,7 @@ msgstr "Inclinaison des vallées"
 
 #: src/settings_translation_file.cpp
 msgid "Valleys C Flags"
-msgstr ""
+msgstr "Drapeaux de Valleys C"
 
 #: src/settings_translation_file.cpp
 msgid "Vertical screen synchronization."
@@ -4345,16 +4539,14 @@ msgid "View range increase key"
 msgstr "Augmenter la distance d'affichage"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Viewing range"
-msgstr "Distance de vue maximum"
+msgstr "Plage de visualisation"
 
 #: src/settings_translation_file.cpp
 msgid "Volume"
 msgstr "Volume du son"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "W co-ordinate of the generated 3D slice of a 4D fractal.\n"
 "Determines which 3D slice of the 4D shape is generated.\n"
@@ -4362,6 +4554,8 @@ msgid ""
 "Range roughly -2 to 2."
 msgstr ""
 "Série Julia : coordonnée W de la couche 3D de la forme 4D.\n"
+"Détermine la tranche 3D de la forme 4D qui est générée.\n"
+"N'a aucun effet sur les fractales 3D.\n"
 "La portée est environ entre -2 et 2."
 
 #: src/settings_translation_file.cpp
@@ -4369,9 +4563,8 @@ msgid "Walking speed"
 msgstr "Vitesse de marche"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Water Features"
-msgstr "Niveau de l'eau"
+msgstr "Caractéristiques de l'eau"
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
@@ -4379,7 +4572,7 @@ msgstr "Niveau de l'eau"
 
 #: src/settings_translation_file.cpp
 msgid "Water surface level of the world."
-msgstr "Niveau de la surface de l'eau dans le monde."
+msgstr "Niveau de la surface de l'eau du monde."
 
 #: src/settings_translation_file.cpp
 msgid "Waving Nodes"
@@ -4395,11 +4588,11 @@ msgstr "Plantes mouvantes"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water"
-msgstr "Liquides mouvants"
+msgstr "Vagues"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water height"
-msgstr "Hauteur des liquides mouvants"
+msgstr "Hauteur des vagues"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water length"
@@ -4424,13 +4617,13 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
-"Quand gui_scaling_filter_txr2img est activé, cela copie les images depuis\n"
-"votre matériel vers Minetest pour mise à l'échelle. Si désactivé, retour à "
-"la méthode par défaut\n"
-"pour les pilotes vidéo qui ne supportent pas le chargement des textures "
-"depuis le matériel."
+"Quand gui_scaling_filter_txr2img est activé, c'est Minetest qui s'occupe de\n"
+"la mise à l'échelle des images et non votre matériel. Si désactivé,\n"
+"l'ancienne méthode de mise à l'échelle est utilisée, pour les pilotes "
+"vidéos\n"
+"qui ne supportent pas le chargement des textures depuis le matériel."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4444,16 +4637,16 @@ msgid ""
 msgstr ""
 "En utilisant le filtrage bilinéaire / trilinéaire / anisotrope, les textures "
 "de basse résolution\n"
-"peuvent être floues en agrandissat automatiquement les textures avec une "
+"peuvent être floues en agrandissant automatiquement les textures avec une "
 "interpolation précise\n"
 "pour préserver les pixels hasardeux.\n"
 "\n"
-"Ceci détermine la taille de la texture minimale pour les textures agrandie. "
+"Ceci détermine la taille de la texture minimale pour les textures agrandies. "
 "Les valeurs plus hautes rendent\n"
 "les textures plus détaillées, mais nécessitent plus de mémoire.\n"
 "Les valeurs en puissance de 2 sont recommandées. Définir une valeur "
 "supérieure à 1 peut ne pas\n"
-"avoir un effet visible sauf le filtrage bilinéaire / trilinéaire / "
+"avoir un effet visible sauf si le filtrage bilinéaire / trilinéaire / "
 "anisotrope est activé."
 
 #: src/settings_translation_file.cpp
@@ -4502,9 +4695,9 @@ msgid ""
 "Whether to ask clients to reconnect after a (Lua) crash.\n"
 "Set this to true if your server is set up to restart automatically."
 msgstr ""
-"Détermine la possibilité des clients de se re-connecter après une "
-"interruption de serveur.\n"
-"Activé-le si votre serveur est paramétré pour redémarrer automatiquement."
+"Détermine la possibilité des clients à se reconnecter après une extinction "
+"du serveur.\n"
+"Activez-le si votre serveur est paramétré pour redémarrer automatiquement."
 
 #: src/settings_translation_file.cpp
 msgid "Whether to fog out the end of the visible area."
@@ -4524,9 +4717,14 @@ msgid ""
 "Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n"
 "Disabling this option will protect your password better."
 msgstr ""
+"Supporte les anciens serveurs antérieurs au protocole version 25.\n"
+"A activer si vous souhaitez vous connecter aux serveurs version 0.4.12 et "
+"antérieure.\n"
+"Les serveurs démarrant en 0.4.13 vont fonctionner, pas ceux en 0.4.12-dev.\n"
+"La désactivation de cette option permettra de mieux protéger votre mot de "
+"passe."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Width component of the initial window size."
 msgstr "Résolution verticale de la fenêtre de jeu."
 
@@ -4544,11 +4742,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Y of flat ground."
-msgstr ""
+msgstr "Coordonnée Y des terrains plats."
 
 #: src/settings_translation_file.cpp
 msgid "Y of upper limit of large pseudorandom caves."
 msgstr ""
+"Coordonnée Y de la limite supérieure des grandes grottes pseudo-aléatoires."
 
 #: src/settings_translation_file.cpp
 msgid "cURL file download timeout"
@@ -4562,237 +4761,150 @@ msgstr "Limite parallèle de cURL"
 msgid "cURL timeout"
 msgstr "Délais d'interruption de cURL"
 
-#~ msgid "Item textures..."
-#~ msgstr "Textures d'items..."
-
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
-#~ msgstr ""
-#~ "Rend la surface de l'eau légèrement plus basse, de façon à ce qu'elle ne "
-#~ "submerge pas\n"
-#~ "entièrement le bloc voisin.\n"
-#~ "Cette fonctionnalité est encore expérimentale et la lumière douce "
-#~ "n’apparaît pas à la\n"
-#~ "surface de l'eau."
-
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
 #~ msgstr ""
-#~ "Active l'éclairage des blocs pointés (et supprime les bordures noires de "
-#~ "sélection)."
+#~ "Profil détaillé des données du mod. Utile pour les développeurs de mods."
 
-#~ msgid ""
-#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
-#~ msgstr ""
-#~ "Série Julia : décalages (X,Y,Z) à partir du centre du monde.\n"
-#~ "La portée est environ entre -2 et 2. Multiplier par j_scale pour décaler "
-#~ "en nombre de blocs."
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Profil détaillé des mods"
 
 #~ msgid ""
-#~ "Julia set: W value determining the 4D shape.\n"
-#~ "Range roughly -2 to 2."
-#~ msgstr ""
-#~ "Série Julia : valeur W déterminant la forme 4D.\n"
-#~ "La portée est environ entre -2 et 2."
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
+#~ msgstr "Nombre maximum de mapblocks simultanés envoyés sur le serveur."
 
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Touche pour réduire la distance de vue. Modifie la distance de vue "
-#~ "minimale.\n"
-#~ "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
+#~ msgstr "Nombre maximum de mapblocks simultanés envoyés par client."
 
-#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Touche pour augmenter la distance de vue. Modifie la distance de vue "
-#~ "minimale.\n"
-#~ "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Utile pour les développeurs de mods."
 
-#~ msgid ""
-#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
-#~ msgstr ""
-#~ "Série Mandelbrot : décalages (X,Y,Z) à partir du centre du monde.\n"
-#~ "La portée est environ entre -2 et 2. Multiplier par m_scale pour décaler "
-#~ "en nombre de blocs."
+#~ msgid "No of course not!"
+#~ msgstr "Non, bien sûr que non !"
 
-#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
-#~ msgstr "Série Mandelbrot : échelles (X,Y,Z) en blocs."
+#~ msgid "Public Serverlist"
+#~ msgstr "Liste de serveurs publics"
 
-#~ msgid ""
-#~ "Mandelbrot set: Iterations of the recursive function.\n"
-#~ "Controls scale of finest detail."
-#~ msgstr ""
-#~ "Série Mandelbrot : itérations de la fonction récursive.\n"
-#~ "Contrôle l'échelle du détail le plus subtil."
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Normal Mapping"
 
-#~ msgid ""
-#~ "Mandelbrot set: W co-ordinate of the generated 3D slice of the 4D shape.\n"
-#~ "Range roughly -2 to 2."
-#~ msgstr ""
-#~ "Série Mandelbrot : coordonnée W de la couche 3D de la forme 4D.\n"
-#~ "La portée est environ entre -2 et 2."
+#~ msgid "No!!!"
+#~ msgstr "Non !"
 
+#, fuzzy
 #~ msgid ""
-#~ "Map generation attributes specific to Mapgen fractal.\n"
-#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
 #~ msgstr ""
-#~ "Attributs de terrain spécifiques à Mapgen V7.\n"
-#~ "'ridges' sont les rivières.\n"
-#~ "Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs "
-#~ "par défaut.\n"
-#~ "Les drapeaux commençant par \"non\" sont désactivés."
+#~ "Attributs généraux de la génération de terrain.\n"
+#~ "Les drapeaux qui ne sont spécifiés dans leur champ respectif gardent "
+#~ "leurs valeurs par défaut."
 
-#~ msgid "Mapgen fractal mandelbrot iterations"
-#~ msgstr "Mapgen Mandelbrot : itérations fractales"
+#~ msgid "\""
+#~ msgstr "\""
 
-#~ msgid "Mapgen fractal mandelbrot offset"
-#~ msgstr "Mapgen Mandelbrot : décalages fractals"
+#~ msgid "Enable a bit lower water surface, so it doesn't "
+#~ msgstr ""
+#~ "Rend l'eau légèrement plus basse, de façon à ce qu'elle ne submerge pas "
+#~ "le bloc complètement.\n"
+#~ "Note : cette fonctionnalité est assez expérimentale et l'éclairage doux "
+#~ "ne fonctionne pas dessus. "
 
-#~ msgid "Mapgen fractal mandelbrot scale"
-#~ msgstr "Mapgen Mandelbrot : échelles fractales"
+#~ msgid "If disabled "
+#~ msgstr "Si désactivé "
 
-#~ msgid "Mapgen fractal mandelbrot slice w"
-#~ msgstr "Mapgen Mandelbrot : couche fractale W"
+#~ msgid "If enabled, "
+#~ msgstr "Si activé, "
 
-#~ msgid ""
-#~ "Maximum distance above water level for player spawn.\n"
-#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
-#~ "Smaller values may result in a suitable spawn point not being found,\n"
-#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
-#~ msgstr ""
-#~ "Distance maximum au-dessus du niveau de l'eau où le joueur apparaît.\n"
-#~ "Des valeurs plus grandes aboutissent à des locations plus proches de (x = "
-#~ "0, z = 0).\n"
-#~ "Des valeurs plus petites peut résulter à une location de spawn non-"
-#~ "trouvée, résultant\n"
-#~ "à une location située à (0, 0, 0) probablement enterrée sous le sol."
+#~ msgid "Rendering:"
+#~ msgstr "Affichage :"
 
-#~ msgid ""
-#~ "Minimum wanted FPS.\n"
-#~ "The amount of rendered stuff is dynamically set according to this. and "
-#~ "viewing range min and max."
-#~ msgstr ""
-#~ "Images par seconde (FPS) minimum.\n"
-#~ "Le niveau de rendu est dynamiquement adapté selon ce paramètre et la "
-#~ "distance de vue (minimale et maximale)."
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Redémarrez Minetest pour que le changement du pilote prenne effet"
 
-#~ msgid "New style water"
-#~ msgstr "Nouveau style de liquide"
+#~ msgid "Game Name"
+#~ msgstr "Nom du jeu"
 
-#~ msgid ""
-#~ "Pre-generate all item visuals used in the inventory.\n"
-#~ "This increases startup time, but runs smoother in-game.\n"
-#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
-#~ "the inventory."
-#~ msgstr ""
-#~ "Pré-générer tous les visuels d'items utilisés dans l'inventaire.\n"
-#~ "Cela augmente le temps de démarrage, mais rend les inventaires plus "
-#~ "fluides.\n"
-#~ "Les textures générées peuvent facilement déborder votre VRAM, causant des "
-#~ "bugs dans votre inventaire."
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr : Impossible de copier le mod \"$1\" dans le jeu \"$2\""
 
-#~ msgid "Preload inventory textures"
-#~ msgstr "Pré-chargement des textures d'inventaire"
+#~ msgid "GAMES"
+#~ msgstr "JEUX"
 
-#~ msgid ""
-#~ "The allowed adjustment range for the automatic rendering range "
-#~ "adjustment.\n"
-#~ "Set this to be equal to viewing range minimum to disable the auto-"
-#~ "adjustment algorithm."
-#~ msgstr ""
-#~ "Distance d'affichage maximum.\n"
-#~ "Définir cette valeur égale à la distance de vue minimum pour désactiver\n"
-#~ "l'auto-ajustement dynamique de la distance d'affichage."
+#~ msgid "Mods:"
+#~ msgstr "Mods :"
 
-#~ msgid "Vertical initial window size."
-#~ msgstr "Largeur initiale de la fenêtre de jeu."
+#~ msgid "new game"
+#~ msgstr "nouveau jeu"
 
-#~ msgid "Vertical spawn range"
-#~ msgstr "Portée verticale du spawn"
+#~ msgid "EDIT GAME"
+#~ msgstr "MODIFIER LE JEU"
 
-#~ msgid "Viewing range minimum"
-#~ msgstr "Distance de vue minimum"
+#~ msgid "Remove selected mod"
+#~ msgstr "Supprimer le mod sélectionné"
 
-#~ msgid "Wanted FPS"
-#~ msgstr "FPS minimum"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Ajouter un mod"
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Réinitialiser le monde"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENT"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Taille appliquée aux menus : "
+#~ msgid "START SERVER"
+#~ msgstr "DÉMARRER LE SERVEUR"
 
-#~ msgid "Downloading"
-#~ msgstr "Téléchargement"
+#~ msgid "Name"
+#~ msgstr "Nom"
 
-#~ msgid " KB/s"
-#~ msgstr " Ko/s"
+#~ msgid "Password"
+#~ msgstr "Mot de passe"
 
-#~ msgid " MB/s"
-#~ msgstr " Mo/s"
+#~ msgid "SETTINGS"
+#~ msgstr "PARAMÈTRES"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Clic gauche : déplacer tous les objets -- Clic droit : déplacer un objet"
+#~ msgid "Preload item visuals"
+#~ msgstr "Précharger les objets"
 
-#~ msgid "is required by:"
-#~ msgstr "est requis par :"
+#~ msgid "Finite Liquid"
+#~ msgstr "Liquides limités"
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "Configuration enregistrée. "
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "PARTIE SOLO"
 
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Attention : configuration incorrecte. "
-
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr ""
-#~ "Impossible de créer le monde : le nom contient des caractères invalides"
-
-#~ msgid "Show Public"
-#~ msgstr "Voir les serveurs publics"
-
-#~ msgid "Show Favorites"
-#~ msgstr "Voir les serveurs favoris"
-
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Laisser l'adresse vide pour lancer un serveur local."
-
-#~ msgid "Create world"
-#~ msgstr "Créer un monde"
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "PACKS DE TEXTURES"
 
-#~ msgid "Address required."
-#~ msgstr "Adresse requise."
+#~ msgid "MODS"
+#~ msgstr "MODS"
 
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Impossible de supprimer le monde : rien n'est sélectionné"
+#~ msgid "Add mod:"
+#~ msgstr "Ajouter un mod :"
 
-#~ msgid "Files to be deleted"
-#~ msgstr "Fichiers à supprimer"
+#~ msgid "Local install"
+#~ msgstr "Installation locale"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Impossible de créer le monde : aucun jeu n'est présent"
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration.  "
+#~ msgstr ""
+#~ "Attention : certains mods ne sont pas encore configurés.\n"
+#~ "Ils seront activés par défaut quand vous enregistrerez la configuration. "
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Impossible de configurer ce monde : aucune sélection active"
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration.  "
+#~ msgstr ""
+#~ "Attention : certains mods configurés sont introuvables.\n"
+#~ "Leurs réglages seront effacés quand vous enregistrerez la configuration. "
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Tous les fichiers du monde n'ont pu être supprimés"
+#~ msgid "Delete map"
+#~ msgstr "Supprimer la carte"
 
 #~ msgid ""
 #~ "Default Controls:\n"
@@ -4819,108 +4931,142 @@ msgstr "Délais d'interruption de cURL"
 #~ "- Échap : ce menu\n"
 #~ "- T : discuter\n"
 
-#~ msgid "Delete map"
-#~ msgstr "Supprimer la carte"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Tous les fichiers du monde n'ont pu être supprimés"
 
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
-#~ msgstr ""
-#~ "Attention : certains mods configurés sont introuvables.\n"
-#~ "Leurs réglages seront effacés quand vous enregistrerez la configuration. "
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Impossible de configurer ce monde : aucune sélection active"
 
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration.  "
-#~ msgstr ""
-#~ "Attention : certains mods ne sont pas encore configurés.\n"
-#~ "Ils seront activés par défaut quand vous enregistrerez la configuration. "
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Impossible de créer le monde : aucun jeu n'est présent"
 
-#~ msgid "Local install"
-#~ msgstr "Installation locale"
+#~ msgid "Files to be deleted"
+#~ msgstr "Fichiers à supprimer"
 
-#~ msgid "Add mod:"
-#~ msgstr "Ajouter un mod :"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Impossible de supprimer le monde : rien n'est sélectionné"
 
-#~ msgid "MODS"
-#~ msgstr "MODS"
+#~ msgid "Address required."
+#~ msgstr "Adresse requise."
 
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "PACKS DE TEXTURES"
+#~ msgid "Create world"
+#~ msgstr "Créer un monde"
 
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "PARTIE SOLO"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Laisser l'adresse vide pour lancer un serveur local."
 
-#~ msgid "Finite Liquid"
-#~ msgstr "Liquides limités"
+#~ msgid "Show Favorites"
+#~ msgstr "Voir les serveurs favoris"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Précharger les objets"
+#~ msgid "Show Public"
+#~ msgstr "Voir les serveurs publics"
 
-#~ msgid "SETTINGS"
-#~ msgstr "PARAMÈTRES"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr ""
+#~ "Impossible de créer le monde : le nom contient des caractères invalides"
 
-#~ msgid "Password"
-#~ msgstr "Mot de passe"
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Attention : configuration incorrecte. "
 
-#~ msgid "Name"
-#~ msgstr "Nom"
+#~ msgid "Configuration saved.  "
+#~ msgstr "Configuration enregistrée. "
 
-#~ msgid "START SERVER"
-#~ msgstr "DÉMARRER LE SERVEUR"
+#~ msgid "is required by:"
+#~ msgstr "est requis par :"
 
-#~ msgid "CLIENT"
-#~ msgstr "CLIENT"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Clic gauche : déplacer tous les objets -- Clic droit : déplacer un objet"
 
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Ajouter un mod"
+#~ msgid " MB/s"
+#~ msgstr " Mo/s"
 
-#~ msgid "Remove selected mod"
-#~ msgstr "Supprimer le mod sélectionné"
+#~ msgid " KB/s"
+#~ msgstr " Ko/s"
 
-#~ msgid "EDIT GAME"
-#~ msgstr "MODIFIER LE JEU"
+#~ msgid "Downloading"
+#~ msgstr "Téléchargement"
 
-#~ msgid "new game"
-#~ msgstr "nouveau jeu"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Taille appliquée aux menus : "
 
-#~ msgid "Mods:"
-#~ msgstr "Mods :"
+#~ msgid "Wanted FPS"
+#~ msgstr "FPS minimum"
 
-#~ msgid "GAMES"
-#~ msgstr "JEUX"
+#~ msgid "Viewing range minimum"
+#~ msgstr "Distance de vue minimum"
 
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr : Impossible de copier le mod \"$1\" dans le jeu \"$2\""
+#~ msgid "Vertical spawn range"
+#~ msgstr "Portée verticale du spawn"
 
-#~ msgid "Game Name"
-#~ msgstr "Nom du jeu"
+#~ msgid "Vertical initial window size."
+#~ msgstr "Largeur initiale de la fenêtre de jeu."
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Redémarrez Minetest pour que le changement du pilote prenne effet"
+#~ msgid ""
+#~ "The allowed adjustment range for the automatic rendering range "
+#~ "adjustment.\n"
+#~ "Set this to be equal to viewing range minimum to disable the auto-"
+#~ "adjustment algorithm."
+#~ msgstr ""
+#~ "Distance d'affichage maximum.\n"
+#~ "Définir cette valeur égale à la distance de vue minimum pour désactiver\n"
+#~ "l'auto-ajustement dynamique de la distance d'affichage."
 
-#~ msgid "Rendering:"
-#~ msgstr "Affichage :"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Pré-chargement des textures d'inventaire"
 
-#~ msgid "If enabled, "
-#~ msgstr "Si activé, "
+#~ msgid ""
+#~ "Pre-generate all item visuals used in the inventory.\n"
+#~ "This increases startup time, but runs smoother in-game.\n"
+#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
+#~ "the inventory."
+#~ msgstr ""
+#~ "Pré-générer tous les visuels d'items utilisés dans l'inventaire.\n"
+#~ "Cela augmente le temps de démarrage, mais rend les inventaires plus "
+#~ "fluides.\n"
+#~ "Les textures générées peuvent facilement déborder votre VRAM, causant des "
+#~ "bugs dans votre inventaire."
 
-#~ msgid "If disabled "
-#~ msgstr "Si désactivé "
+#~ msgid "New style water"
+#~ msgstr "Nouveau style de liquide"
 
-#~ msgid "Enable a bit lower water surface, so it doesn't "
+#~ msgid ""
+#~ "Minimum wanted FPS.\n"
+#~ "The amount of rendered stuff is dynamically set according to this. and "
+#~ "viewing range min and max."
 #~ msgstr ""
-#~ "Rend l'eau légèrement plus basse, de façon à ce qu'elle ne submerge pas "
-#~ "le bloc complètement.\n"
-#~ "Note : cette fonctionnalité est assez expérimentale et l'éclairage doux "
-#~ "ne fonctionne pas dessus. "
+#~ "Images par seconde (FPS) minimum.\n"
+#~ "Le niveau de rendu est dynamiquement adapté selon ce paramètre et la "
+#~ "distance de vue (minimale et maximale)."
 
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid ""
+#~ "Maximum distance above water level for player spawn.\n"
+#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
+#~ "Smaller values may result in a suitable spawn point not being found,\n"
+#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
+#~ msgstr ""
+#~ "Distance maximum au-dessus du niveau de l'eau où le joueur apparaît.\n"
+#~ "Des valeurs plus grandes aboutissent à des locations plus proches de (x = "
+#~ "0, z = 0).\n"
+#~ "Des valeurs plus petites peut résulter à une location de spawn non-"
+#~ "trouvée, résultant\n"
+#~ "à une location située à (0, 0, 0) probablement enterrée sous le sol."
+
+#~ msgid "Mapgen fractal mandelbrot slice w"
+#~ msgstr "Mapgen Mandelbrot : couche fractale W"
+
+#~ msgid "Mapgen fractal mandelbrot scale"
+#~ msgstr "Mapgen Mandelbrot : échelles fractales"
+
+#~ msgid "Mapgen fractal mandelbrot offset"
+#~ msgstr "Mapgen Mandelbrot : décalages fractals"
+
+#~ msgid "Mapgen fractal mandelbrot iterations"
+#~ msgstr "Mapgen Mandelbrot : itérations fractales"
 
 #~ msgid ""
-#~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
+#~ "Map generation attributes specific to Mapgen fractal.\n"
+#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
 #~ "Flags starting with \"no\" are used to explicitly disable them."
@@ -4931,30 +5077,119 @@ msgstr "Délais d'interruption de cURL"
 #~ "par défaut.\n"
 #~ "Les drapeaux commençant par \"non\" sont désactivés."
 
-#, fuzzy
 #~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
-#~ "Flags that are not specified in the flag string are not modified from the "
-#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Mandelbrot set: W co-ordinate of the generated 3D slice of the 4D shape.\n"
+#~ "Range roughly -2 to 2."
 #~ msgstr ""
-#~ "Attributs généraux de la génération de terrain.\n"
-#~ "Les drapeaux qui ne sont spécifiés dans leur champ respectif gardent "
-#~ "leurs valeurs par défaut."
+#~ "Série Mandelbrot : coordonnée W de la couche 3D de la forme 4D.\n"
+#~ "La portée est environ entre -2 et 2."
 
-#~ msgid "No!!!"
-#~ msgstr "Non !"
+#~ msgid ""
+#~ "Mandelbrot set: Iterations of the recursive function.\n"
+#~ "Controls scale of finest detail."
+#~ msgstr ""
+#~ "Série Mandelbrot : itérations de la fonction récursive.\n"
+#~ "Contrôle l'échelle du détail le plus subtil."
 
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Normal Mapping"
+#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
+#~ msgstr "Série Mandelbrot : échelles (X,Y,Z) en blocs."
 
-#~ msgid "Public Serverlist"
-#~ msgstr "Liste de serveurs publics"
+#~ msgid ""
+#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Série Mandelbrot : décalages (X,Y,Z) à partir du centre du monde.\n"
+#~ "La portée est environ entre -2 et 2. Multiplier par m_scale pour décaler "
+#~ "en nombre de blocs."
 
-#~ msgid "No of course not!"
-#~ msgstr "Non, bien sûr que non !"
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Touche pour augmenter la distance de vue. Modifie la distance de vue "
+#~ "minimale.\n"
+#~ "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Touche pour réduire la distance de vue. Modifie la distance de vue "
+#~ "minimale.\n"
+#~ "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#~ msgid ""
+#~ "Julia set: W value determining the 4D shape.\n"
+#~ "Range roughly -2 to 2."
+#~ msgstr ""
+#~ "Série Julia : valeur W déterminant la forme 4D.\n"
+#~ "La portée est environ entre -2 et 2."
+
+#~ msgid ""
+#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Série Julia : décalages (X,Y,Z) à partir du centre du monde.\n"
+#~ "La portée est environ entre -2 et 2. Multiplier par j_scale pour décaler "
+#~ "en nombre de blocs."
+
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr ""
+#~ "Active l'éclairage des blocs pointés (et supprime les bordures noires de "
+#~ "sélection)."
+
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Rend la surface de l'eau légèrement plus basse, de façon à ce qu'elle ne "
+#~ "submerge pas\n"
+#~ "entièrement le bloc voisin.\n"
+#~ "Cette fonctionnalité est encore expérimentale et la lumière douce "
+#~ "n’apparaît pas à la\n"
+#~ "surface de l'eau."
+
+#~ msgid "Item textures..."
+#~ msgstr "Textures d'items..."
+
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen v7.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with 'no' are used to explicitly disable them."
+#~ msgstr ""
+#~ "Attributs spécifiques à Mapgen V7.\n"
+#~ "Le drapeau 'des crêtes' contrôle les rivières.\n"
+#~ "Les drapeaux par défaut définis dans le moteur sont: montagnes, crêtes.\n"
+#~ "La chaîne de drapeaux modifie les paramètres par défaut du moteur.\n"
+#~ "Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs "
+#~ "par défaut.\n"
+#~ "Les drapeaux commençant par \"non\" sont désactivés."
+
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with 'no' are used to explicitly disable them."
+#~ msgstr ""
+#~ "Attributs de terrain spécifiques au générateur de carte plate.\n"
+#~ "Lacs et collines peuvent partiellement être ajoutés à un monde plat.\n"
+#~ "Aucun drapeau par défaut défini dans le moteur.\n"
+#~ "La chaîne de drapeaux modifie les paramètres par défaut du moteur.\n"
+#~ "Les drapeaux qui ne sont pas spécifiés dans le champ gardent leurs "
+#~ "valeurs par défaut.\n"
+#~ "Les drapeaux commençant par \"non\" sont désactivés."
diff --git a/po/he/minetest.po b/po/he/minetest.po
index f422920..2e5367a 100644
--- a/po/he/minetest.po
+++ b/po/he/minetest.po
@@ -7,9 +7,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2015-10-26 16:22+0200\n"
-"Last-Translator: ChaosWormz <chaoswormz at openmailbox.org>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-05-26 21:01+0000\n"
+"Last-Translator: yuval hreman <huckvrni at gmail.com>\n"
 "Language-Team: Hebrew <https://hosted.weblate.org/projects/minetest/minetest/"
 "he/>\n"
 "Language: he\n"
@@ -17,11 +17,11 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.5-dev\n"
+"X-Generator: Weblate 2.7-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr ""
+msgstr "אירעה שגיאה בקוד לואה (Lua), כנראה באחד המודים:"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
@@ -41,7 +41,7 @@ msgstr "התחבר מחדש"
 
 #: builtin/fstk/ui.lua
 msgid "The server has requested a reconnect:"
-msgstr ""
+msgstr "השרת מבקש שתתחבר מחדש:"
 
 #: builtin/mainmenu/common.lua src/game.cpp
 msgid "Loading..."
@@ -49,27 +49,27 @@ msgstr "טוען..."
 
 #: builtin/mainmenu/common.lua
 msgid "Protocol version mismatch. "
-msgstr ""
+msgstr "שגיאה בגרסאות הפרוטוקול. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr ""
+msgstr "השרת יפעיל את פרוטוקול גרסה $1. בכוח "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
-msgstr ""
+msgstr "השרת תומך בפרוטוקולים בין גרסה $1 וגרסה $2. "
 
 #: builtin/mainmenu/common.lua
 msgid "Try reenabling public serverlist and check your internet connection."
-msgstr ""
+msgstr "נסה לצאת והכנס מחדש לרשימת השרתים ובדוק את חיבור האינטרנט שלך."
 
 #: builtin/mainmenu/common.lua
 msgid "We only support protocol version $1."
-msgstr ""
+msgstr "אנו תומכים רק בגירסה 1$ של הפרוטוקול."
 
 #: builtin/mainmenu/common.lua
 msgid "We support protocol versions between version $1 and $2."
-msgstr ""
+msgstr "אנו תומכים בגרסאות בין 1$ ל-2$ של הפרוטוקול."
 
 #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -93,13 +93,15 @@ msgstr ""
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Enable all"
-msgstr "אפשר בכל"
+msgstr "אפשר הכל"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid ""
 "Failed to enable mod \"$1\" as it contains disallowed characters. Only "
 "chararacters [a-z0-9_] are allowed."
 msgstr ""
+"טעינת המוד \"1$\" נכשלה מכיוון שהוא מכיל תווים לא חוקיים. רק התווים [a-"
+"z0-9_] מותרים."
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide Game"
@@ -128,7 +130,7 @@ msgstr "מופעל"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "A world named \"$1\" already exists"
-msgstr ""
+msgstr "עולם בשם \"1$\" כבר קיים"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Create"
@@ -136,11 +138,11 @@ msgstr "ליצור"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr ""
+msgstr "הורד מפעיל משחק, למשל \"minetest_game\", מהאתר: minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download one from minetest.net"
-msgstr ""
+msgstr "הורד אחד מ-\"minetest.net\""
 
 #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
 msgid "Game"
@@ -148,11 +150,11 @@ msgstr "משחק"
 
 #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
 msgid "Mapgen"
-msgstr ""
+msgstr "מנוע מפות"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "No worldname given or no game selected"
-msgstr ""
+msgstr "לא נבחר שם לעולם או שאף מפעיל משחק לא נבחר"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Seed"
@@ -160,7 +162,7 @@ msgstr ""
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Warning: The minimal development test is meant for developers."
-msgstr ""
+msgstr "אזהרה: מצב המפתחים נועד למפתחים!."
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "World name"
@@ -168,7 +170,7 @@ msgstr "שם העולם"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "You have no subgames installed."
-msgstr ""
+msgstr "אין לך אף מפעיל משחק מותקן."
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Are you sure you want to delete \"$1\"?"
@@ -397,9 +399,8 @@ msgid "Uninstall selected modpack"
 msgstr ""
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "כתובת / פורט :"
+msgstr "כתובת / פורט"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
@@ -426,9 +427,8 @@ msgid "Favorite"
 msgstr ""
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "שם/סיסמה :"
+msgstr "שם/סיסמה"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -505,9 +505,8 @@ msgid "8x"
 msgstr ""
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Advanced Settings"
-msgstr "הגדרות"
+msgstr "הגדרות מתקדמות"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Antialiasing:"
@@ -587,9 +586,13 @@ msgid "Parallax Occlusion"
 msgstr ""
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "אפשר בכל"
+msgstr "חלקיקים"
+
+#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "שרת"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
@@ -940,6 +943,10 @@ msgstr ""
 msgid "Use"
 msgstr ""
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr ""
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr ""
@@ -1256,10 +1263,6 @@ msgstr ""
 msgid "X Button 2"
 msgstr ""
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1326,6 +1329,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1400,6 +1407,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr ""
 
@@ -1432,6 +1443,10 @@ msgid "Build inside player"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr ""
 
@@ -1472,6 +1487,10 @@ msgid "Chat toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1544,14 +1563,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1698,6 +1717,10 @@ msgid "Default privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1714,6 +1737,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1744,22 +1771,26 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1787,6 +1818,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Enable VBO"
 msgstr "אפשר בכל"
@@ -1870,6 +1905,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -1930,11 +1973,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2068,12 +2121,14 @@ msgid "Generate normalmaps"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2105,6 +2160,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2133,15 +2197,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2235,6 +2290,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2269,6 +2358,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2428,6 +2525,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2463,7 +2567,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2614,6 +2718,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2646,8 +2765,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2657,8 +2774,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2669,8 +2784,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2680,8 +2793,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3040,6 +3151,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3081,17 +3200,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3103,10 +3226,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr ""
 
@@ -3147,10 +3266,6 @@ msgid "Mipmapping"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3355,11 +3470,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3367,7 +3488,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3402,6 +3523,10 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr ""
 
@@ -3559,7 +3684,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3596,7 +3721,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3675,10 +3800,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3694,6 +3831,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3709,6 +3852,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3811,10 +3960,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -3940,7 +4085,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4040,8 +4185,8 @@ msgstr ""
 msgid "cURL timeout"
 msgstr ""
 
-#~ msgid "Public Serverlist"
-#~ msgstr "רשימת שרתים פומבי"
-
 #~ msgid "No of course not!"
 #~ msgstr "לא ברור שלא!"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "רשימת שרתים פומבי"
diff --git a/po/hu/minetest.po b/po/hu/minetest.po
index 776ce69..a461b6a 100644
--- a/po/hu/minetest.po
+++ b/po/hu/minetest.po
@@ -7,11 +7,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
 "PO-Revision-Date: 2016-05-07 03:17+0000\n"
 "Last-Translator: Kisbenedek Márton <martonkisbenedek at gmail.com>\n"
-"Language-Team: Hungarian "
-"<https://hosted.weblate.org/projects/minetest/minetest/hu/>\n"
+"Language-Team: Hungarian <https://hosted.weblate.org/projects/minetest/"
+"minetest/hu/>\n"
 "Language: hu\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -600,6 +600,10 @@ msgid "Particles"
 msgstr "Részecskék"
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Egyjátékos világ visszaállítása"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Beállítások"
 
@@ -976,6 +980,10 @@ msgstr "Váltás noclip-re"
 msgid "Use"
 msgstr "Használat"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Nagyítás"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "Nyomj meg egy gombot"
@@ -1303,10 +1311,6 @@ msgstr "X gomb 1"
 msgid "X Button 2"
 msgstr "X Gomb 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Nagyítás"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1386,6 +1390,11 @@ msgid "Active Block Modifier interval"
 msgstr "Aktív blokk módosító időköze"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "Aktív blokk módosító időköze"
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr "Aktív blokk kiterjedési terület"
 
@@ -1470,6 +1479,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr "Automatikus bejelentés a szerverlistára."
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "Vissza gomb"
 
@@ -1503,6 +1516,10 @@ msgid "Build inside player"
 msgstr "Építés játékos helyére"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Bumpmapping"
 msgstr "Bumpmapping"
@@ -1544,6 +1561,11 @@ msgid "Chat toggle key"
 msgstr "Csevegés váltás gomb"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Parancs"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1615,6 +1637,16 @@ msgid "Colored fog"
 msgstr "Színezett köd"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Modok vesszővel elválasztott listája, melyeknek engedélyezett HTTP API-k "
+"elérése, amik\n"
+"lehetővé teszik, hogy feltöltsenek és letöltsenek adatokat a netről/netre."
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Comma-separated list of trusted mods that are allowed to access insecure\n"
 "functions even when mod security is on (via request_insecure_environment())."
@@ -1625,15 +1657,6 @@ msgstr ""
 "(request_insecure_environment())."
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Modok vesszővel elválasztott listája, melyeknek engedélyezett HTTP API-k "
-"elérése, amik\n"
-"lehetővé teszik, hogy feltöltsenek és letöltsenek adatokat a netről/netre."
-
-#: src/settings_translation_file.cpp
 msgid "Command key"
 msgstr "Parancs gomb"
 
@@ -1791,6 +1814,10 @@ msgid "Default privileges"
 msgstr "Alap jogosultságok"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1807,6 +1834,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr "Eszköztippek megjelenítésének késleltetése, ezredmásodpercben megadva."
 
@@ -1839,14 +1870,6 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "Részletes mod profil adat. Mod fejlesztőknek hasznos."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1861,6 +1884,18 @@ msgid "Disable anticheat"
 msgstr "Csalás elleni védelem letiltása"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "Üres jelszavak tiltása"
 
@@ -1885,6 +1920,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "VBO engedélyez"
 
@@ -1981,6 +2020,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2045,10 +2092,24 @@ msgid "Field of view"
 msgstr "Látótávolság"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Field of view for zoom"
+msgstr "Látótávolság"
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr "Látóterület fokokban."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Gyors mozgás (a használat gombbal).\n"
+"Szükséges hozzá a \"fast\" (gyorsaság) jogosultság a szerveren."
+
+#: src/settings_translation_file.cpp
 msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
@@ -2191,16 +2252,26 @@ msgid "Generate normalmaps"
 msgstr "Normálfelületek generálása"
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Térkép generálási jellemzők csak a Flat (lapos) térképgenerátor esetében.\n"
+"Esetenkénti tavak és dombok generálása a lapos világba.\n"
+"The default flags set in the engine are: none\n"
+"The flags string modifies the engine defaults.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with \"no\" are used to explicitly disable them."
 
 #: src/settings_translation_file.cpp
 msgid "Graphics"
@@ -2227,6 +2298,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr "A kezdeti ablak méret magasság összetevője."
 
@@ -2255,15 +2335,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2380,6 +2451,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr "Játékon belüli csevegő konzol hátterének színe (R,G,B)."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 "Fontos változások mentésének időköze a világban, másodpercekben megadva."
@@ -2415,6 +2520,16 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "Jobb kattintás ismétlés időköz"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "Egér érzékenység"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2623,6 +2738,17 @@ msgstr ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Gomb a gyors (fast) módra váltáshoz.\n"
+"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
@@ -2673,8 +2799,9 @@ msgstr ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2848,6 +2975,22 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "Aktív blokk módosító időköze"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr "Főmenü játék kezelő"
 
@@ -2884,8 +3027,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2907,8 +3048,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2927,8 +3066,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2943,15 +3080,21 @@ msgstr ""
 "Flags starting with \"no\" are used to explicitly disable them."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Térkép generálási jellemzők csak a Flat (lapos) térképgenerátor esetében.\n"
+"Esetenkénti tavak és dombok generálása a lapos világba.\n"
+"The default flags set in the engine are: none\n"
+"The flags string modifies the engine defaults.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with \"no\" are used to explicitly disable them."
 
 #: src/settings_translation_file.cpp
 msgid "Map generation limit"
@@ -3306,6 +3449,16 @@ msgid "Maximum hotbar width"
 msgstr "Maximum hotbar szélesség"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "Az egy időben csatlakozó játékosok maximális száma."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Maximum blokkok száma, amik sorban állhatnak betöltésre."
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr "Maximum blokkok száma, amik sorban állhatnak betöltésre."
 
@@ -3353,6 +3506,11 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr "Statikusan tárolt objektumok maximális száma egy térképblokkban."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum objects per block"
+msgstr "Maximum objektum térképblokkonként"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
@@ -3361,11 +3519,13 @@ msgstr ""
 "Hasznos, ha valamit el kell helyezni a hotbar jobb, vagy bal oldalán."
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+#, fuzzy
+msgid "Maximum simultaneous block sends per client"
 msgstr "Az egyidejűleg a kliensenként küldött térképblokkok maximális száma"
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+#, fuzzy
+msgid "Maximum simultaneous block sends total"
 msgstr "Egyidejűleg küldött térképblokkok maximális száma összesen"
 
 #: src/settings_translation_file.cpp
@@ -3379,10 +3539,6 @@ msgid "Maximum users"
 msgstr "Maximum felhasználók"
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Maximum objektum térképblokkonként"
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "Menük"
 
@@ -3424,10 +3580,6 @@ msgid "Mipmapping"
 msgstr "Mip-mapping"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr "Mod áruház részletek URL"
 
@@ -3649,11 +3801,17 @@ msgstr ""
 "shell parancsok."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr "Jogosultságok, amiket a basic_privs adhat a játékosoknak"
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3661,7 +3819,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3696,6 +3854,11 @@ msgid "Replaces the default main menu with a custom one."
 msgstr "Az alapértelmezett főmenüt lecseréli egy másikkal."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Betűtípus helye"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "Jobb gomb"
 
@@ -3869,8 +4032,9 @@ msgstr ""
 "A shaderek engedélyezése szükséges hozzá."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3913,8 +4077,9 @@ msgid "Smooth lighting"
 msgstr "Simított megvilágítás"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 "Kamera mozgásának simítása mozgáskor és körbenézéskor.\n"
@@ -3996,10 +4161,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr "A magasság, ahol a hőmérséklet 20 fokkal csökken"
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -4018,6 +4195,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -4032,6 +4215,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"Ennyi másodperc szükséges az ismételt jobb kattintáshoz a jobb egérgomb "
+"nyomva tartásakor."
+
+#: src/settings_translation_file.cpp
 msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
@@ -4148,10 +4340,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr "Trilineáris szűrés a textúrák méretezéséhez."
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Mod fejlesztőknek hasznos."
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4279,7 +4467,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4392,204 +4580,207 @@ msgstr ""
 msgid "cURL timeout"
 msgstr ""
 
-#~ msgid "Item textures..."
-#~ msgstr "Elem textúrák..."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "Részletes mod profil adat. Mod fejlesztőknek hasznos."
 
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
-#~ msgstr ""
-#~ "Kicsivel alacsonyabb víz felszín engedélyezése, hogy ne töltse meg "
-#~ "teljesen a blokkot.\n"
-#~ "Megjegyzés: ez nem teljesen optimalizált, és a simított megvilágítás\n"
-#~ "így nem működik a víz felszínén."
+#~ msgid "Useful for mod developers."
+#~ msgstr "Mod fejlesztőknek hasznos."
 
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
-#~ msgstr ""
-#~ "Kijelölés kiemelés (kivilágítás) engedélyezése a blokkoknál (letiltja a "
-#~ "kijelölődobozt)."
+#~ msgid "No of course not!"
+#~ msgstr "Persze, hogy nem!"
 
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "A látóterület csökkentésének gombja. A minimum látóterületet módosítja.\n"
-#~ "Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "Public Serverlist"
+#~ msgstr "Nyilvános szerverlista"
 
-#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "A látóterület növelésének gombja. A minimum látótávolságot módosítja.\n"
-#~ "Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Normálfelületek generálása"
 
-#~ msgid ""
-#~ "Maximum distance above water level for player spawn.\n"
-#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
-#~ "Smaller values may result in a suitable spawn point not being found,\n"
-#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
-#~ msgstr ""
-#~ "Maximum távolság a vízszinttől, ahol a játékosok újraéledhetnek/"
-#~ "megjelenhetnek csatlakozáskor (spawn).\n"
-#~ "Magasabb értékek közelebb visznek az (x = 0, z = 0)-hoz.\n"
-#~ "Alacsonyabb értékek azt eredményezhetik, hogy nem lesz megfelelő pont a "
-#~ "feléledéshez,\n"
-#~ "(0,0,0) pozícióban történő feléledést, ami valószínűleg a föld alatt lesz."
+#~ msgid "No!!!"
+#~ msgstr "Nem!!!"
 
 #, fuzzy
 #~ msgid ""
-#~ "Minimum wanted FPS.\n"
-#~ "The amount of rendered stuff is dynamically set according to this. and "
-#~ "viewing range min and max."
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
 #~ msgstr ""
-#~ "Minimum kívánt FPS.\n"
-#~ "A renderelt cuccok mennyisége dinamikusan ez alapján állítódik be (és a "
-#~ "látórerület min és max)."
-
-#~ msgid "New style water"
-#~ msgstr "Új stílusú víz"
-
-#~ msgid "Preload inventory textures"
-#~ msgstr "Eszköztár textúráinak előtöltése"
-
-#~ msgid "Vertical initial window size."
-#~ msgstr "Függőleges kezdeti ablak méret."
-
-#~ msgid "Vertical spawn range"
-#~ msgstr "Az (újra)éledés függőleges irányú területe"
+#~ "Térkép generálási jellemzők csak a Valleys térképgenerátor esetében.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
 
-#~ msgid "Viewing range minimum"
-#~ msgstr "Minimum látóterület"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Csomag letiltás"
 
-#~ msgid "Wanted FPS"
-#~ msgstr "Kívánt FPS"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "Engedélyez"
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Egyjátékos világ visszaállítása"
+#~ msgid "Rendering:"
+#~ msgstr "Renderelés:"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "A méretarány alkalmazva a menü elemekre: "
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "A driver változások életbe lépéséhez indítsd újra a Minetestet"
 
 #, fuzzy
-#~ msgid "Touch free target"
-#~ msgstr "Touch free target"
+#~ msgid "Game Name"
+#~ msgstr "Játék"
 
 #, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Le"
+#~ msgid "Password"
+#~ msgstr "Régi jelszó"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Ball gomb: Tárgyak mozgatása, Jobb gomb: egy tárgyat mozgat"
+#~ msgid "Preload item visuals"
+#~ msgstr "Előretöltött tárgy láthatóság"
 
-#~ msgid "is required by:"
-#~ msgstr "kell neki:"
+#, fuzzy
+#~ msgid "Finite Liquid"
+#~ msgstr "Végtelen folyadék"
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "Beállítások mentve.  "
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Hiba az összes világ törlése közben"
 
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Figyelem: A beállítások nem egyformák.  "
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Nem sikerült a világ beállítása: Nincs kiválasztva"
 
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Nem sikerült a világ létrehozása: A névben nem jó karakterek vannak"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Nem sikerült a világot létrehozni: Nem található a játék"
 
-#~ msgid "Show Public"
-#~ msgstr "Publikus mutatása"
+#~ msgid "Files to be deleted"
+#~ msgstr "A fájl törölve lett"
 
-#~ msgid "Show Favorites"
-#~ msgstr "Kedvencek mutatása"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Nem törölhető a világ: Nincs kiválasztva"
 
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Hagyd el a nevét, hogy helyi szervert indíts."
+#~ msgid "Address required."
+#~ msgstr "Cím szükséges."
 
 #~ msgid "Create world"
 #~ msgstr "Világ létrehozása"
 
-#~ msgid "Address required."
-#~ msgstr "Cím szükséges."
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Hagyd el a nevét, hogy helyi szervert indíts."
 
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Nem törölhető a világ: Nincs kiválasztva"
+#~ msgid "Show Favorites"
+#~ msgstr "Kedvencek mutatása"
 
-#~ msgid "Files to be deleted"
-#~ msgstr "A fájl törölve lett"
+#~ msgid "Show Public"
+#~ msgstr "Publikus mutatása"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Nem sikerült a világot létrehozni: Nem található a játék"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Nem sikerült a világ létrehozása: A névben nem jó karakterek vannak"
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Nem sikerült a világ beállítása: Nincs kiválasztva"
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Figyelem: A beállítások nem egyformák.  "
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Hiba az összes világ törlése közben"
+#~ msgid "Configuration saved.  "
+#~ msgstr "Beállítások mentve.  "
 
-#, fuzzy
-#~ msgid "Finite Liquid"
-#~ msgstr "Végtelen folyadék"
+#~ msgid "is required by:"
+#~ msgstr "kell neki:"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Előretöltött tárgy láthatóság"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Ball gomb: Tárgyak mozgatása, Jobb gomb: egy tárgyat mozgat"
 
 #, fuzzy
-#~ msgid "Password"
-#~ msgstr "Régi jelszó"
+#~ msgid "Downloading"
+#~ msgstr "Le"
 
 #, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Játék"
+#~ msgid "Touch free target"
+#~ msgstr "Touch free target"
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "A driver változások életbe lépéséhez indítsd újra a Minetestet"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "A méretarány alkalmazva a menü elemekre: "
 
-#~ msgid "Rendering:"
-#~ msgstr "Renderelés:"
+#~ msgid "Wanted FPS"
+#~ msgstr "Kívánt FPS"
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "Engedélyez"
+#~ msgid "Viewing range minimum"
+#~ msgstr "Minimum látóterület"
 
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Csomag letiltás"
+#~ msgid "Vertical spawn range"
+#~ msgstr "Az (újra)éledés függőleges irányú területe"
+
+#~ msgid "Vertical initial window size."
+#~ msgstr "Függőleges kezdeti ablak méret."
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "Eszköztár textúráinak előtöltése"
+
+#~ msgid "New style water"
+#~ msgstr "Új stílusú víz"
 
 #, fuzzy
 #~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
-#~ "Flags that are not specified in the flag string are not modified from the "
-#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Minimum wanted FPS.\n"
+#~ "The amount of rendered stuff is dynamically set according to this. and "
+#~ "viewing range min and max."
 #~ msgstr ""
-#~ "Térkép generálási jellemzők csak a Valleys térképgenerátor esetében.\n"
-#~ "Flags that are not specified in the flag string are not modified from the "
-#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Minimum kívánt FPS.\n"
+#~ "A renderelt cuccok mennyisége dinamikusan ez alapján állítódik be (és a "
+#~ "látórerület min és max)."
 
-#~ msgid "No!!!"
-#~ msgstr "Nem!!!"
+#~ msgid ""
+#~ "Maximum distance above water level for player spawn.\n"
+#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
+#~ "Smaller values may result in a suitable spawn point not being found,\n"
+#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
+#~ msgstr ""
+#~ "Maximum távolság a vízszinttől, ahol a játékosok újraéledhetnek/"
+#~ "megjelenhetnek csatlakozáskor (spawn).\n"
+#~ "Magasabb értékek közelebb visznek az (x = 0, z = 0)-hoz.\n"
+#~ "Alacsonyabb értékek azt eredményezhetik, hogy nem lesz megfelelő pont a "
+#~ "feléledéshez,\n"
+#~ "(0,0,0) pozícióban történő feléledést, ami valószínűleg a föld alatt lesz."
 
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Normálfelületek generálása"
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "A látóterület növelésének gombja. A minimum látótávolságot módosítja.\n"
+#~ "Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
 
-#~ msgid "Public Serverlist"
-#~ msgstr "Nyilvános szerverlista"
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "A látóterület csökkentésének gombja. A minimum látóterületet módosítja.\n"
+#~ "Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
 
-#~ msgid "No of course not!"
-#~ msgstr "Persze, hogy nem!"
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr ""
+#~ "Kijelölés kiemelés (kivilágítás) engedélyezése a blokkoknál (letiltja a "
+#~ "kijelölődobozt)."
+
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Kicsivel alacsonyabb víz felszín engedélyezése, hogy ne töltse meg "
+#~ "teljesen a blokkot.\n"
+#~ "Megjegyzés: ez nem teljesen optimalizált, és a simított megvilágítás\n"
+#~ "így nem működik a víz felszínén."
+
+#~ msgid "Item textures..."
+#~ msgstr "Elem textúrák..."
diff --git a/po/id/minetest.po b/po/id/minetest.po
index 3505fca..137caaf 100644
--- a/po/id/minetest.po
+++ b/po/id/minetest.po
@@ -6,10 +6,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-04-12 19:07+0000\n"
-"Last-Translator: Muhammad Rifqi Priyo Susanto "
-"<muhammadrifqipriyosusanto at gmail.com>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-10 10:03+0000\n"
+"Last-Translator: Alvin Hikmawan <alvin.hikmawan at gmail.com>\n"
 "Language-Team: Indonesian <https://hosted.weblate.org/projects/minetest/"
 "minetest/id/>\n"
 "Language: id\n"
@@ -17,11 +16,11 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"X-Generator: Weblate 2.10-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr "Sebuah kesalahan terjadi di sebuah skrip Lua, seperti sebuah mod:"
+msgstr "Sebuah kesalahan terjadi di salah satu skrip Lua, misalnya sebuah mod:"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
@@ -53,7 +52,7 @@ msgstr "Versi protokol tidak cocok. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr "Server memberlakukan protokol versi $1. "
+msgstr "Server menjalankan protokol versi $1. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
@@ -143,7 +142,7 @@ msgstr "Buat"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Unduh sebuah sub-permainan, seperti minetest_game, dari minetest.net"
+msgstr "Unduh sebuah sub-permainan, misalnya minetest_game, dari minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download one from minetest.net"
@@ -241,7 +240,6 @@ msgstr ""
 "Format adalah 3 angka yang dipisahkan oleh koma dan di dalam tanda kurung."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
 msgid ""
 "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
 "<octaves>, <persistence>"
@@ -261,7 +259,7 @@ msgstr "Mod"
 #, fuzzy
 msgid "Optionally the lacunarity can be appended with a leading comma."
 msgstr ""
-"lacunarity (celah, opsional) dapat ditambahkan dengan awalan tanda koma."
+"Lacunarity (celah, opsional) dapat ditambahkan dengan awalan tanda koma."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a comma seperated list of flags."
@@ -414,9 +412,8 @@ msgid "Uninstall selected modpack"
 msgstr "Copot pemasangan paket mod terpilih"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "Alamat / Port :"
+msgstr "Alamat / Port"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
@@ -436,16 +433,15 @@ msgstr "Kerusakan diaktifkan"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Del. Favorite"
-msgstr ""
+msgstr "Hapus Favorit"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Favorite"
-msgstr ""
+msgstr "Favorit"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Nama / Kata sandi :"
+msgstr "Nama / Kata sandi"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -526,7 +522,6 @@ msgid "Advanced Settings"
 msgstr "Pengaturan Lanjutan"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Antialiasing:"
 msgstr "Antialiasing:"
 
@@ -535,14 +530,12 @@ msgid "Are you sure to reset your singleplayer world?"
 msgstr "Apakah Anda yakin ingin mengatur ulang dunia Anda?"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bilinear Filter"
 msgstr "Bilinear Filter"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
-msgstr "Bumpmapping"
+msgstr "Bump Mapping"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Change keys"
@@ -557,12 +550,10 @@ msgid "Fancy Leaves"
 msgstr "Daun Megah"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Mipmap"
 msgstr "Mipmap"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Mipmap + Aniso. Filter"
 msgstr "Mipmap + Aniso. Filter"
 
@@ -586,7 +577,7 @@ msgstr "Node Highlighting"
 #: builtin/mainmenu/tab_settings.lua
 #, fuzzy
 msgid "Node Outlining"
-msgstr "Node Highlighting"
+msgstr "Node Outlining"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
@@ -595,7 +586,7 @@ msgstr "Tidak ada"
 #: builtin/mainmenu/tab_settings.lua
 #, fuzzy
 msgid "Normal Mapping"
-msgstr "Tone Mapping"
+msgstr "Normal Mapping"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
@@ -606,14 +597,16 @@ msgid "Opaque Water"
 msgstr "Air Buram"
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
-#, fuzzy
 msgid "Parallax Occlusion"
 msgstr "Parallax Occlusion"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "Aktifkan Partikel"
+msgstr "Partikel"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Atur ulang dunia pemain tunggal"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
@@ -637,7 +630,7 @@ msgstr "Penteksturan:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "Untuk mengaktifkan shaders OpenGL driver harus digunakan."
+msgstr "Untuk mengaktifkan shader, driver OpenGL harus digunakan."
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Tone Mapping"
@@ -648,7 +641,6 @@ msgid "Touchthreshold (px)"
 msgstr "Batas sentuhan (px)"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Trilinear Filter"
 msgstr "Trilinear Filter"
 
@@ -722,7 +714,7 @@ msgstr "Memuat tekstur..."
 
 #: src/client.cpp
 msgid "Rebuilding shaders..."
-msgstr "Membangun ulang shaders..."
+msgstr "Membangun ulang shader..."
 
 #: src/client/clientlauncher.cpp
 msgid "Connection error (timed out?)"
@@ -805,7 +797,7 @@ msgstr ""
 "Kontrol Bawaan:\n"
 "- WASD: bergerak\n"
 "- Space: lompat/panjat\n"
-"- Shift: merayap/turun\n"
+"- Shift: menyelinap/turun\n"
 "- Q: jatuhkan barang\n"
 "- I: inventaris\n"
 "- Mouse: belok/melihat\n"
@@ -924,9 +916,7 @@ msgstr "Konsol"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Double tap \"jump\" to toggle fly"
-msgstr ""
-"Tekan ganda \"lompat\" untuk\n"
-"beralih terbang"
+msgstr "Tekan ganda \"lompat\" untuk terbang"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Drop"
@@ -976,7 +966,7 @@ msgstr "Menyelinap"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle Cinematic"
-msgstr "Toggle Sinematik"
+msgstr "Mode sinema"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle fast"
@@ -988,12 +978,16 @@ msgstr "Terbang"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle noclip"
-msgstr "Beralih tembus blok"
+msgstr "Tembus blok"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Use"
 msgstr "Pakai"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "tekan tombol"
@@ -1310,10 +1304,6 @@ msgstr "Tombol X 1"
 msgid "X Button 2"
 msgstr "Tombol X 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1322,6 +1312,11 @@ msgid ""
 "sets.\n"
 "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
 msgstr ""
+"Pergeseran (X,Y,Z) fraktal dari tengah dunia dalam satuan 'scale'.\n"
+"Digunakan untuk memindahkan daerah bangkit dataran rendah mendekati (0, 0).\n"
+"Nilai bawaan cocok untuk mandelbrot sets, butuh diganti untuk julia sets.\n"
+"Berjangkauan sekitar -2 ke 2. Kalikan dengan 'scale' untuk pergeseran dalam "
+"node."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1356,7 +1351,7 @@ msgstr ""
 "-    anaglyph: 3d berwarna cyan/magenta.\n"
 "-    interlaced: garis ganjil/genap berdasarkan polarisasi dukungan layar.\n"
 "-    topbottom: pisahkan layar atas/bawah.\n"
-"-    sidebyside: pisahkan layar berdampingan."
+"-    sidebyside: pisahkan layar kiri/kanan."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1385,18 +1380,20 @@ msgid "Acceleration in air"
 msgstr "Percepatan di udara"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Management interval"
-msgstr "Batas blok aktif"
+msgstr "Jarak Pengelola Blok Aktif"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Modifier interval"
-msgstr "Batas blok aktif"
+msgstr "Jarak Pengubah Blok Aktif"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Pengubah Blok Aktif"
 
 #: src/settings_translation_file.cpp
 msgid "Active block range"
-msgstr "Batas blok aktif"
+msgstr "Jangkauan blok aktif"
 
 #: src/settings_translation_file.cpp
 msgid "Active object send range"
@@ -1408,7 +1405,7 @@ msgid ""
 "Leave this blank to start a local server.\n"
 "Note that the address field in the main menu overrides this setting."
 msgstr ""
-"Alamat untuk menghubungkan.\n"
+"Alamat tujuan.\n"
 "Biarkan kosong untuk memulai sebuah server lokal.\n"
 "Perhatikan bahwa bidang alamat dalam menu utama menimpa pengaturan ini."
 
@@ -1447,9 +1444,8 @@ msgid "Ambient occlusion gamma"
 msgstr "Ambient occlusion gamma"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Amplifies the valleys"
-msgstr "Menguatkan lembah"
+msgstr "Memperbesar lembah"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -1472,7 +1468,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Approximate (X,Y,Z) scale of fractal in nodes."
-msgstr "Memperkirakan skala (X,Y,Z) dari fraktal pada node."
+msgstr "Memperkirakan skala (X,Y,Z) fraktal pada node."
 
 #: src/settings_translation_file.cpp
 msgid "Ask to reconnect after crash"
@@ -1483,26 +1479,26 @@ msgid "Automaticaly report to the serverlist."
 msgstr "Secara otomatis melaporkan ke daftar server."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
-msgstr "Mundur"
+msgstr "Tombol mundur"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Base terrain height"
-msgstr "Air Berombak"
+msgstr "Tinggi dasar medan"
 
 #: src/settings_translation_file.cpp
 msgid "Basic"
 msgstr "Dasar"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Basic Privileges"
-msgstr "Izin bawaan"
+msgstr "Izin Dasar"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Bilinear filtering"
 msgstr "Bilinear filtering"
 
@@ -1519,7 +1515,10 @@ msgid "Build inside player"
 msgstr "Bangun di dalam pemain"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Builtin"
+msgstr "Terpasang bawaan"
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Bumpmapping"
 
@@ -1545,7 +1544,7 @@ msgstr "Noise #2 gua"
 
 #: src/settings_translation_file.cpp
 msgid "Cave width"
-msgstr ""
+msgstr "Lebar gua"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1560,6 +1559,10 @@ msgid "Chat toggle key"
 msgstr "Tombol beralih obrolan"
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Perintah obrolan"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1651,6 +1654,15 @@ msgstr "Kabut berwarna"
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Daftar yang dipisahkan koma dari mod yang dibolehkan untuk mengakses\n"
+"HTTP API, membolehkan mereka untuk mengunggah dan mengunduh data\n"
+"ke/dari internet."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Comma-separated list of trusted mods that are allowed to access insecure\n"
 "functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
@@ -1659,15 +1671,6 @@ msgstr ""
 "(melalui request_insecure_environment())."
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Daftar yang dipisahkan koma dari mod yang dibolehkan untuk mengakses\n"
-"HTTP API, membolehkan mereka untuk mengunggah dan mengunduh data\n"
-"ke/dari internet."
-
-#: src/settings_translation_file.cpp
 msgid "Command key"
 msgstr "Tombol perintah"
 
@@ -1677,7 +1680,7 @@ msgstr "Sambungkan kaca"
 
 #: src/settings_translation_file.cpp
 msgid "Connect to external media server"
-msgstr "Menyambungkan ke server media eksternal"
+msgstr "Sambungkan ke server media eksternal"
 
 #: src/settings_translation_file.cpp
 msgid "Connects glass if supported by node."
@@ -1685,7 +1688,7 @@ msgstr "Sambungkan kaca jika didukung oleh node."
 
 #: src/settings_translation_file.cpp
 msgid "Console alpha"
-msgstr "Alpha konsol"
+msgstr "Keburaman konsol"
 
 #: src/settings_translation_file.cpp
 msgid "Console color"
@@ -1723,19 +1726,19 @@ msgid ""
 "When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
 msgstr ""
 "Mengatur ukuran padang gurun dan pantai dalam Mapgen v6.\n"
-"Jika snowbiomes di aktifkan 'mgv6_freq_desert' akan dihiraukan."
+"Jika snowbiomes di aktifkan 'mgv6_freq_desert' akan diabaikan."
 
 #: src/settings_translation_file.cpp
 msgid "Controls steepness/depth of lake depressions."
-msgstr "Mengatur kecuraman/kedalaman dari lekukan danau."
+msgstr "Mengatur kecuraman/kedalaman lekukan danau."
 
 #: src/settings_translation_file.cpp
 msgid "Controls steepness/height of hills."
-msgstr "Mengatur kecuraman/ketinggian dari bukit."
+msgstr "Mengatur kecuraman/ketinggian bukit."
 
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Mengatur lebar terowongan, nilai lebih kecil terowongan semakin lebar."
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
@@ -1747,7 +1750,7 @@ msgid ""
 "These can make mining difficult. Zero disables them. (0-10)"
 msgstr ""
 "Membuat lava yang tidak dapat diprediksi di dalam gua.\n"
-"Ini dapat menyebabkan menambang menjadi sulit. Nol menonaktifkannya. (0-10)"
+"Ini dapat menyebabkan penambangan menjadi sulit. Nol menonaktifkannya. (0-10)"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1755,7 +1758,7 @@ msgid ""
 "These can make mining difficult. Zero disables them. (0-10)"
 msgstr ""
 "Membuat air yang tidak dapat diprediksi di dalam gua.\n"
-"Ini dapat menyebabkan menambang menjadi sulit. Nol menonaktifkannya. (0-10)"
+"Ini dapat menyebabkan penambangan menjadi sulit. Nol menonaktifkannya. (0-10)"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair alpha"
@@ -1771,11 +1774,11 @@ msgstr "Warna crosshair"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair color (R,G,B)."
-msgstr "Warna crosshair (merah,hijau,biru atau R,G,B)."
+msgstr "Warna crosshair: (merah,hijau,biru) atau (R,G,B)."
 
 #: src/settings_translation_file.cpp
 msgid "Crouch speed"
-msgstr ""
+msgstr "Kecepatan jalan merunduk"
 
 #: src/settings_translation_file.cpp
 msgid "DPI"
@@ -1787,7 +1790,7 @@ msgstr "Kerusakan"
 
 #: src/settings_translation_file.cpp
 msgid "Debug info toggle key"
-msgstr "Tombol beralih info debug"
+msgstr "Tombol info debug"
 
 #: src/settings_translation_file.cpp
 msgid "Debug log level"
@@ -1822,6 +1825,10 @@ msgid "Default privileges"
 msgstr "Izin bawaan"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Format laporan bawaan"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1834,14 +1841,22 @@ msgid ""
 "Defines sampling step of texture.\n"
 "A higher value results in smoother normal maps."
 msgstr ""
+"Menentukan tahap sampling atas tekstur\n"
+"Nilai yg lebih tinggi menghasilkan peta yg lebih halus"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
+"Menentukan jarak maksimal perpindahan pemain dalam blok (0 = tak terhingga)"
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Jeda dalam mengirim blok setelah membangun"
 
 #: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
-msgstr ""
+msgstr "Jeda menampilkan tooltip, dalam milidetik."
 
 #: src/settings_translation_file.cpp
 msgid "Deprecated Lua API handling"
@@ -1864,20 +1879,12 @@ msgid ""
 "Description of server, to be displayed when players join and in the "
 "serverlist."
 msgstr ""
-"Deskripsi dari server yang akan ditampilkan saat pemain bergabung dan pada "
-"daftar server."
+"Deskripsi dari server, ditampilkan saat pemain bergabung dan dalam daftar "
+"server."
 
 #: src/settings_translation_file.cpp
 msgid "Desynchronize block animation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
+msgstr "Putuskan sinkronasi animasi blok"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1894,6 +1901,21 @@ msgid "Disable anticheat"
 msgstr "Nonaktifkan anticurang (anticheat)"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Nonaktifkan karakter kabur"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Nonaktifkan karakter kabur (escape sequences), misal: pewarnaan obrolan.\n"
+"Gunakan ini jika Anda ingin menjalankan server dengan klien pre-0.4.14 dan\n"
+"Anda ingin menonaktifkan karakter kabur yang dihasilkan oleh mods."
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "Larang kata sandi kosong"
 
@@ -1907,7 +1929,7 @@ msgstr "Tekan ganda \"lompat\" untuk terbang"
 
 #: src/settings_translation_file.cpp
 msgid "Double-tapping the jump key toggles fly mode."
-msgstr "Menekan ganda tombol \"lompat\" untuk beralih terbang."
+msgstr "Menekan ganda tombol lompat untuk beralih terbang."
 
 #: src/settings_translation_file.cpp
 msgid "Drop item key"
@@ -1918,6 +1940,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Aktifkan Joystick"
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "Aktifkan VBO"
 
@@ -1934,7 +1960,6 @@ msgid "Enable random user input (only used for testing)."
 msgstr "Aktifkan masukan acak dari pengguna (hanya digunakan untuk pengujian)."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Enable smooth lighting with simple ambient occlusion.\n"
 "Disable for speed or for different looks."
@@ -1950,7 +1975,7 @@ msgid ""
 "to new servers, but they may not support all new features that you are "
 "expecting."
 msgstr ""
-"Membolehkan untuk melarang klien lawas untuk terhubung.\n"
+"Aktifkan untuk melarang klien lawas untuk terhubung.\n"
 "Klien-klien lawas dianggap sesuai jika mereka tidak rusak saat "
 "menghubungkan\n"
 "ke server-server baru, tetapi mereka mungkin tidak mendukung semua fitur "
@@ -1964,8 +1989,9 @@ msgid ""
 "textures)\n"
 "when connecting to the server."
 msgstr ""
-"Membolehkan penggunaan server media asing (jika diberikan oleh server).\n"
-"Server asing menawarkan cara lebih cepat untuk mengunduh media (misal.: "
+"Membolehkan penggunaan server media jarak jauh (jika diberikan oleh "
+"server).\n"
+"Server jarak jauh menawarkan cara lebih cepat untuk mengunduh media (misal: "
 "tekstur)\n"
 "saat terhubung ke server."
 
@@ -2017,6 +2043,16 @@ msgid ""
 "Enables parallax occlusion mapping.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Mengaktifkan pemetaan parallax occlusion.\n"
+"Membutuhkan shader diaktifkan."
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2057,7 +2093,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Fast key"
-msgstr ""
+msgstr "Tombol gerak cepat"
 
 #: src/settings_translation_file.cpp
 msgid "Fast mode acceleration"
@@ -2069,24 +2105,36 @@ msgstr "Mode cepat"
 
 #: src/settings_translation_file.cpp
 msgid "Fast movement"
-msgstr ""
+msgstr "Gerakan cepat"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Fast movement (via use key).\n"
 "This requires the \"fast\" privilege on the server."
 msgstr ""
+"Gerakan cepat (lewat tombol gunakan).\n"
+"Membutuhkan izin \"fast\" pada server."
 
 #: src/settings_translation_file.cpp
 msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2134,19 +2182,19 @@ msgstr "Tombol beralih kabut"
 
 #: src/settings_translation_file.cpp
 msgid "Font path"
-msgstr ""
+msgstr "Jalur font"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow"
-msgstr ""
+msgstr "Bayangan font"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow alpha"
-msgstr ""
+msgstr "Keburaman bayangan font"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Keburaman bayangan font (keopakan, antara 0 sampai 255)."
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow offset, if 0 then shadow will not be drawn."
@@ -2158,12 +2206,11 @@ msgstr "Ukuran font"
 
 #: src/settings_translation_file.cpp
 msgid "Format of screenshots."
-msgstr ""
+msgstr "Format tangkapan layar."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Forward key"
-msgstr "Maju"
+msgstr "Tombol maju"
 
 #: src/settings_translation_file.cpp
 msgid "Freetype fonts"
@@ -2199,11 +2246,11 @@ msgstr "Mode layar penuh."
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling"
-msgstr "Skala antarmuka"
+msgstr "Skala GUI"
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling filter"
-msgstr "Filter skala antarmuka"
+msgstr "Filter skala GUI"
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling filter txr2img"
@@ -2218,17 +2265,18 @@ msgid "General"
 msgstr "Umum"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Generate normalmaps"
-msgstr "Gunakan Normalmaps"
+msgstr "Hasilkan normalmaps"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2257,6 +2305,21 @@ msgid ""
 "-    log: mimic and log backtrace of deprecated call (default for debug).\n"
 "-    error: abort on usage of deprecated call (suggested for mod developers)."
 msgstr ""
+"Penanganan panggilan lua api usang:\n"
+"-    legacy: (mencoba untuk) menyerupai aturan lawas (bawaan untuk rilis).\n"
+"-    log: menyerupai dan mencatat asal-usul panggilan usang (bawaan untuk "
+"debug).\n"
+"-    error: batalkan penggunaan panggilan usang (disarankan untuk pengembang "
+"mod)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
@@ -2268,15 +2331,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "High-precision FPU"
-msgstr ""
+msgstr "FPU (satuan titik mengambang) berketelitian tinggi"
 
 #: src/settings_translation_file.cpp
 msgid "Homepage of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Halaman awal server, ditampilkan di daftar server."
 
 #: src/settings_translation_file.cpp
 msgid "How deep to make rivers"
-msgstr ""
+msgstr "Seberapa dalam sungai yang dibuat"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2287,22 +2350,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "How wide to make rivers"
-msgstr ""
+msgstr "Seberapa lebar sungai yang dibuat"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6"
@@ -2310,7 +2364,7 @@ msgstr "IPv6"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 server"
-msgstr ""
+msgstr "Server IPv6"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 support."
@@ -2348,6 +2402,8 @@ msgid ""
 "If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
 "and descending."
 msgstr ""
+"Jika diaktifkan, tombol \"gunakan\" akan digunakan untuk memanjat turun "
+"danbergerak turun dari pada tombol \"menyelinap\"."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2378,7 +2434,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "If this is set, players will always (re)spawn at the given position."
-msgstr ""
+msgstr "Jika diatur, pemain akan bangkit (ulang) pada posisi yang diberikan."
 
 #: src/settings_translation_file.cpp
 msgid "Ignore world errors"
@@ -2391,9 +2447,44 @@ msgstr "Dalam Permainan"
 #: src/settings_translation_file.cpp
 msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
 msgstr ""
+"Keburaman konsol obrolan dalam permainan (keopakan, antara 0 sampai 255)."
 
 #: src/settings_translation_file.cpp
 msgid "In-game chat console background color (R,G,B)."
+msgstr "Warna latar belakang konsol obrolan dalam permainan (R,G,B)"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -2402,16 +2493,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Interval of sending time of day to clients."
-msgstr ""
+msgstr "Jarak pengiriman waktu ke klien."
 
 #: src/settings_translation_file.cpp
 msgid "Inventory items animations"
-msgstr ""
+msgstr "Animasi barang inventaris"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Inventory key"
-msgstr "Inventaris"
+msgstr "Tombol inventaris"
 
 #: src/settings_translation_file.cpp
 msgid "Invert mouse"
@@ -2432,6 +2522,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2461,22 +2559,20 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Jump key"
-msgstr "Lompat"
+msgstr "Tombol lompat"
 
 #: src/settings_translation_file.cpp
 msgid "Jumping speed"
-msgstr ""
+msgstr "Kecepatan lompat"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Key for decreasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Tombol untuk bergerak cepat dalam mode cepat.\n"
+"Tombol untuk mengurangi jarak pandang.\n"
 "Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
@@ -2491,13 +2587,12 @@ msgstr ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Key for increasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Tombol untuk bergerak cepat dalam mode cepat.\n"
+"Tombol untuk menambah jarak pandang.\n"
 "Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
@@ -2567,6 +2662,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tombol untuk membuka konsol obrolan.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2574,6 +2672,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tombol untuk membuka jendela obrolan untuk mengetik perintah.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2581,6 +2682,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tombol untuk membuka jendela obrolan.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2607,6 +2711,11 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tombol untuk menyelinap.\n"
+"Juga digunakan untuk turun dan menyelam dalam air jika aux1_descends "
+"dinonaktifkan.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2630,6 +2739,16 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tombol untuk beralih lari otomatis.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2644,7 +2763,7 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Tombol untuk mennganti tampilan peta mini.\n"
+"Tombol untuk mengganti tampilan peta mini.\n"
 "Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
@@ -2680,10 +2799,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tombol untuk beralih pembaruan kamera. Hanya digunakan dalam pengembangan.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2691,6 +2813,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tombol untuk beralih tampilan info debug.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2698,6 +2823,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tombol untuk beralih tampilan HUD.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2705,6 +2833,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tombol untuk beralih tampilan obrolan.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2712,6 +2843,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tombol untuk beralih tampilan kabut.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2726,10 +2860,13 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tombol untuk beralih menjadi jarak pandang tanpa batas.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid "Key use for climbing/descending"
-msgstr ""
+msgstr "Tombol untuk memanjat/turun"
 
 #: src/settings_translation_file.cpp
 msgid "Language"
@@ -2737,7 +2874,7 @@ msgstr "Bahasa"
 
 #: src/settings_translation_file.cpp
 msgid "Large cave depth"
-msgstr ""
+msgstr "Kedalaman gua besar"
 
 #: src/settings_translation_file.cpp
 msgid "Lava Features"
@@ -2754,11 +2891,15 @@ msgid ""
 "-   Simple: only outer faces, if defined special_tiles are used\n"
 "-   Opaque: disable transparency"
 msgstr ""
+"Gaya daun:\n"
+"-   Fancy:  semua sisi terlihat\n"
+"-   Simple: hanya sisi terluar, jika special_tiles yang didefinisikan "
+"digunakan\n"
+"-   Opaque: menonaktifkan transparansi"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Left key"
-msgstr "Left Menu"
+msgstr "Tombol kiri"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2785,6 +2926,14 @@ msgid ""
 "-    info\n"
 "-    verbose"
 msgstr ""
+"Tingkatan pencatatan yang ditulis ke debug.txt:\n"
+"-    <nothing> (tanpa pencatatan)\n"
+"-    none (pesan tanpa tingkatan)\n"
+"-    error\n"
+"-    warning\n"
+"-    action\n"
+"-    info\n"
+"-    verbose"
 
 #: src/settings_translation_file.cpp
 msgid "Limit of emerge queues on disk"
@@ -2832,10 +2981,25 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Main menu game manager"
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Main menu game manager"
+msgstr "Pengelola permainan menu utama"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu mod manager"
 msgstr "Pengelola mod menu utama"
 
@@ -2847,10 +3011,13 @@ msgstr "Skrip menu utama"
 msgid ""
 "Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
 msgstr ""
+"Buat warna kabut dan langit tergantung pada waktu (fajar/matahari "
+"tenggelam)\n"
+"dan arah melihat."
 
 #: src/settings_translation_file.cpp
 msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
-msgstr ""
+msgstr "Buat DirectX bekerja dengan LuaJIT. Nonaktifkan jika bermasalah."
 
 #: src/settings_translation_file.cpp
 msgid "Map directory"
@@ -2864,8 +3031,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2875,8 +3040,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2887,8 +3050,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2898,8 +3059,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2911,11 +3070,11 @@ msgstr "Batas generasi peta"
 
 #: src/settings_translation_file.cpp
 msgid "Map save interval"
-msgstr ""
+msgstr "Jarak menyimpan peta"
 
 #: src/settings_translation_file.cpp
 msgid "Mapblock limit"
-msgstr ""
+msgstr "Batas mapblock"
 
 #: src/settings_translation_file.cpp
 msgid "Mapblock unload timeout"
@@ -2938,24 +3097,20 @@ msgid "Mapgen biome humidity noise parameters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen debug"
-msgstr "Generator peta"
+msgstr "Debug generator peta"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flags"
-msgstr "Generator peta"
+msgstr "Flag generator peta"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat"
-msgstr "Generator peta"
+msgstr "Generator peta flat"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat cave width"
-msgstr "Generator peta"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave1 noise parameters"
@@ -2970,14 +3125,12 @@ msgid "Mapgen flat filler depth noise parameters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat flags"
-msgstr "Generator peta"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat ground level"
-msgstr "Generator peta"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill steepness"
@@ -2988,14 +3141,12 @@ msgid "Mapgen flat hill threshold"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat lake steepness"
-msgstr "Parallax Occlusion"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat lake threshold"
-msgstr "Generator peta"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat large cave depth"
@@ -3006,14 +3157,12 @@ msgid "Mapgen flat terrain noise parameters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal"
-msgstr "Generator peta"
+msgstr "Generator peta fraktal"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal cave width"
-msgstr "Generator peta"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave1 noise parameters"
@@ -3028,14 +3177,12 @@ msgid "Mapgen fractal filler depth noise parameters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal fractal"
-msgstr "Generator peta"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal iterations"
-msgstr "Parallax Occlusion"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia w"
@@ -3054,23 +3201,20 @@ msgid "Mapgen fractal julia z"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal offset"
-msgstr "Generator peta"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal scale"
-msgstr "Generator peta"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal seabed noise parameters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal slice w"
-msgstr "Generator peta"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen heat blend noise parameters"
@@ -3085,9 +3229,8 @@ msgid "Mapgen v5"
 msgstr "Generator peta v5"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v5 cave width"
-msgstr "Generator peta v5"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave1 noise parameters"
@@ -3119,7 +3262,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 beach frequency"
-msgstr ""
+msgstr "Frekuensi pantai pada generator peta v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 beach noise parameters"
@@ -3139,7 +3282,7 @@ msgstr "Frekuensi padang gurun pada generator peta v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 flags"
-msgstr ""
+msgstr "Flag pada generator peta v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 height select noise parameters"
@@ -3174,9 +3317,8 @@ msgid "Mapgen v7"
 msgstr "Generator peta v7"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v7 cave width"
-msgstr "Generator peta v7"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave1 noise parameters"
@@ -3228,7 +3370,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave depth"
-msgstr ""
+msgstr "Kedalaman gua raksasa"
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave noise"
@@ -3275,6 +3417,14 @@ msgid "Maximum hotbar width"
 msgstr "Lebar maksimal hotbar"
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr "Jumlah maksimal blok yang dapat diantrikan untuk dimuat."
 
@@ -3326,6 +3476,10 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr "Jumlah maksimal objek yang disimpan secara statis dalam satu blok."
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Jumlah objek maksimal tiap blok"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
@@ -3334,12 +3488,12 @@ msgstr ""
 "Berguna jika ada sesuatu yang akan ditampilkan di kanan atau kiri hotbar."
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr "Jumlah maksimal blok yang dikirim serentak tiap klien"
+msgid "Maximum simultaneous block sends per client"
+msgstr "Jumlah maksimal blok yang dikirim serentak ke tiap klien"
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
-msgstr "Jumlah maksimal total blok yang dikirim"
+msgid "Maximum simultaneous block sends total"
+msgstr "Jumlah maksimal total blok yang dikirim serentak"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum time in ms a file download (e.g. a mod download) may take."
@@ -3351,10 +3505,6 @@ msgid "Maximum users"
 msgstr "Jumlah pengguna maksimal"
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Jumlah objek maksimal tiap blok"
-
-#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Menus"
 msgstr "Alt"
@@ -3373,7 +3523,7 @@ msgstr "Pesan hari ini yang ditampilkan ke pemain yang terhubung."
 
 #: src/settings_translation_file.cpp
 msgid "Method used to highlight selected object."
-msgstr ""
+msgstr "Metode yang digunakan untuk memilih objek."
 
 #: src/settings_translation_file.cpp
 msgid "Minimap"
@@ -3396,10 +3546,6 @@ msgid "Mipmapping"
 msgstr "Mipmapping"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3413,19 +3559,19 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Monospace font path"
-msgstr ""
+msgstr "Jalur font monospace"
 
 #: src/settings_translation_file.cpp
 msgid "Monospace font size"
-msgstr ""
+msgstr "Ukuran font monospace"
 
 #: src/settings_translation_file.cpp
 msgid "Mouse sensitivity"
-msgstr ""
+msgstr "Sensitivitas mouse"
 
 #: src/settings_translation_file.cpp
 msgid "Mouse sensitivity multiplier."
-msgstr ""
+msgstr "Pengali sensitivitas mouse"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3451,15 +3597,18 @@ msgid ""
 "When running a server, clients connecting with this name are admins.\n"
 "When starting from the main menu, this is overridden."
 msgstr ""
+"Nama pemain.\n"
+"Saat menjalankan server, klien yang terhubung dengan nama ini adalah admin.\n"
+"Saat menjalankan dari menu utama, nilai ini ditimpa."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Name of the server, to be displayed when players join and in the serverlist."
-msgstr ""
+msgstr "Nama server, ditampilkan saat pemain bergabung dan di daftar server."
 
 #: src/settings_translation_file.cpp
 msgid "Network"
-msgstr ""
+msgstr "Jaringan"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3469,7 +3618,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "New users need to input this password."
-msgstr ""
+msgstr "Pengguna baru butuh memasukkan kata sandi."
 
 #: src/settings_translation_file.cpp
 msgid "Noclip"
@@ -3540,28 +3689,24 @@ msgid "Parallax occlusion"
 msgstr "Parallax occlusion"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Parallax occlusion Scale"
 msgstr "Skala parallax occlusion"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Parallax occlusion bias"
-msgstr "Parallax Occlusion"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Parallax occlusion iterations"
-msgstr "Parallax Occlusion"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion mode"
 msgstr "Mode parallax occlusion"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Parallax occlusion strength"
-msgstr "Parallax Occlusion"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Path to TrueTypeFont or bitmap."
@@ -3569,7 +3714,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Path to save screenshots at."
-msgstr ""
+msgstr "Jalur untuk menyimpan tangkapan layar."
 
 #: src/settings_translation_file.cpp
 msgid "Path to texture directory. All textures are first searched from here."
@@ -3608,11 +3753,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3620,7 +3771,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3636,29 +3787,31 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Random input"
-msgstr ""
+msgstr "Masukan acak"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Range select key"
-msgstr "Jarak pandang"
+msgstr "Tombol memilih jarak pandang"
 
 #: src/settings_translation_file.cpp
 msgid "Remote media"
-msgstr ""
+msgstr "Media jarak jauh"
 
 #: src/settings_translation_file.cpp
 msgid "Remote port"
-msgstr ""
+msgstr "Port server jarak jauh"
 
 #: src/settings_translation_file.cpp
 msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Report path"
+msgstr "Jalur laporan"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
-msgstr "Right Menu"
+msgstr "Tombol kanan"
 
 #: src/settings_translation_file.cpp
 msgid "Rightclick repetition interval"
@@ -3666,7 +3819,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "River Depth"
-msgstr ""
+msgstr "Kedalaman Sungai"
 
 #: src/settings_translation_file.cpp
 msgid "River Noise"
@@ -3674,7 +3827,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "River Size"
-msgstr ""
+msgstr "Ukuran sungai"
 
 #: src/settings_translation_file.cpp
 msgid "River noise -- rivers occur close to zero"
@@ -3686,7 +3839,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Round minimap"
-msgstr ""
+msgstr "Peta mini bundar"
 
 #: src/settings_translation_file.cpp
 msgid "Save the map received by the client on disk."
@@ -3707,11 +3860,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Screen height"
-msgstr ""
+msgstr "Tinggi layar"
 
 #: src/settings_translation_file.cpp
 msgid "Screen width"
-msgstr ""
+msgstr "Lebar layar"
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot"
@@ -3719,17 +3872,15 @@ msgstr "Tangkapan layar"
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot folder"
-msgstr ""
+msgstr "Folder tangkapan layar"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot format"
-msgstr "Tangkapan layar"
+msgstr "Format tangkapan layar"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot quality"
-msgstr "Tangkapan layar"
+msgstr "Kualitas tangkapan layar"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3737,14 +3888,17 @@ msgid ""
 "1 means worst quality; 100 means best quality.\n"
 "Use 0 for default quality."
 msgstr ""
+"Kualitas tangkapan layar. Hanya digunakan untuk format JPEG.\n"
+"1 berarti kualitas terburuk; 100 berarti kualitas terbaik.\n"
+"Gunakan 0 untuk kualitas bawaan."
 
 #: src/settings_translation_file.cpp
 msgid "Security"
-msgstr ""
+msgstr "Keamanan"
 
 #: src/settings_translation_file.cpp
 msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
-msgstr ""
+msgstr "Lihat http://www.sqlite.org/pragma.html#pragma_synchronous"
 
 #: src/settings_translation_file.cpp
 msgid "Selection box border color (R,G,B)."
@@ -3795,39 +3949,47 @@ msgid ""
 "Set the language. Leave empty to use the system language.\n"
 "A restart is required after changing this."
 msgstr ""
+"Atur bahasa. Biarkan kosong untuk menggunakan bahasa sistem.\n"
+"Diharuskan mulai ulang setelah mengganti ini."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set to true enables waving leaves.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Atur ke true untuk mengaktifkan daun melambai.\n"
+"Membutuhkan shader diaktifkan."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set to true enables waving plants.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Atur ke true untuk mengaktifkan tanaman berayun.\n"
+"Membutuhkan shader diaktifkan."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set to true enables waving water.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Atur ke true untuk mengaktifkan air berombak.\n"
+"Membutuhkan shader diaktifkan."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr ""
+msgstr "Bentuk dari peta mini. Aktifkan = bundar, nonaktifkan = persegi."
 
 #: src/settings_translation_file.cpp
 msgid "Show debug info"
-msgstr ""
+msgstr "Tampilkan info debug"
 
 #: src/settings_translation_file.cpp
 msgid "Show entity selection boxes"
@@ -3835,7 +3997,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Shutdown message"
-msgstr ""
+msgstr "Pesan server mati"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3853,9 +4015,11 @@ msgstr "Pencahayaan halus"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
+"Memperhalus kamera saat melihat sekeliling. Juga disebut penghalusan mouse.\n"
+"Berguna untuk perekaman video."
 
 #: src/settings_translation_file.cpp
 msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
@@ -3863,16 +4027,15 @@ msgstr "Menghaluskan rotasi kamera dalam modus sinema. 0 untuk menonaktifkan."
 
 #: src/settings_translation_file.cpp
 msgid "Smooths rotation of camera. 0 to disable."
-msgstr ""
+msgstr "Penghalusan perputaran kamera. 0 untuk menonaktifkan."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Sneak key"
-msgstr "Menyelinap"
+msgstr "Tombol menyelinap"
 
 #: src/settings_translation_file.cpp
 msgid "Sound"
-msgstr ""
+msgstr "Suara"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3887,9 +4050,8 @@ msgid "Static spawnpoint"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Strength of generated normalmaps."
-msgstr "Gunakan Normalmaps"
+msgstr "Gunakan Normalmaps."
 
 #: src/settings_translation_file.cpp
 msgid "Strength of parallax."
@@ -3897,11 +4059,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Strict protocol checking"
-msgstr ""
+msgstr "Pengecekan protokol ketat"
 
 #: src/settings_translation_file.cpp
 msgid "Support older servers"
-msgstr ""
+msgstr "Dukung server lawas"
 
 #: src/settings_translation_file.cpp
 msgid "Synchronous SQLite"
@@ -3926,16 +4088,27 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Texture path"
-msgstr "Paket Tekstur"
+msgstr "Jalur tekstur"
 
 #: src/settings_translation_file.cpp
 msgid "The altitude at which temperature drops by 20C"
+msgstr "Ketinggian saat suhu turun sebesar 20C"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
+msgstr "Kedalaman dari tanah atau pengisi lainnya"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3954,6 +4127,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3969,6 +4148,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3989,11 +4174,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Time send interval"
-msgstr ""
+msgstr "Jarak pengiriman waktu"
 
 #: src/settings_translation_file.cpp
 msgid "Time speed"
-msgstr ""
+msgstr "Kecepatan waktu"
 
 #: src/settings_translation_file.cpp
 msgid "Timeout for client to remove unused map data from memory."
@@ -4013,7 +4198,7 @@ msgstr "Tombol beralih mode kamera"
 
 #: src/settings_translation_file.cpp
 msgid "Tooltip delay"
-msgstr ""
+msgstr "Jeda tooltip"
 
 #: src/settings_translation_file.cpp
 msgid "Trilinear filtering"
@@ -4028,7 +4213,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Trusted mods"
-msgstr ""
+msgstr "Mod terpercaya"
 
 #: src/settings_translation_file.cpp
 msgid "URL to the server list displayed in the Multiplayer Tab."
@@ -4059,9 +4244,8 @@ msgid "Use bilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Use key"
-msgstr "tekan tombol"
+msgstr "Tombol gunakan"
 
 #: src/settings_translation_file.cpp
 msgid "Use mip mapping to scale textures. May slightly increase performance."
@@ -4072,10 +4256,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Berguna untuk pengembang mod."
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4123,15 +4303,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "View range decrease key"
-msgstr ""
+msgstr "Tombol mengurangi jarak pandang"
 
 #: src/settings_translation_file.cpp
 msgid "View range increase key"
-msgstr ""
+msgstr "Tombol menambah jarak pandang"
 
 #: src/settings_translation_file.cpp
 msgid "Viewing range"
-msgstr ""
+msgstr "Jarak pandang"
 
 #: src/settings_translation_file.cpp
 msgid "Volume"
@@ -4150,9 +4330,8 @@ msgid "Walking speed"
 msgstr "Kecepatan berjalan"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Water Features"
-msgstr "Tekstur barang..."
+msgstr "Corak air"
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
@@ -4163,9 +4342,8 @@ msgid "Water surface level of the world."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving Nodes"
-msgstr "Daun Melambai"
+msgstr "Node Melambai"
 
 #: src/settings_translation_file.cpp
 msgid "Waving leaves"
@@ -4203,7 +4381,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4303,53 +4481,53 @@ msgstr "Batas cURL paralel"
 msgid "cURL timeout"
 msgstr "Batas waktu cURL"
 
-#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Memuat tekstur..."
+#~ msgid "Useful for mod developers."
+#~ msgstr "Berguna untuk pengembang mod."
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Atur ulang dunia pemain tunggal"
+#~ msgid "No of course not!"
+#~ msgstr "Tentu tidak!"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Faktor skala yang diatur untuk elemen menu: "
+#~ msgid "Public Serverlist"
+#~ msgstr "Daftar Server Publik"
 
-#~ msgid "Touch free target"
-#~ msgstr "Bebas sentuhan"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Hasilkan Normalmaps"
 
-#~ msgid "Downloading"
-#~ msgstr "Mengunduh"
+#~ msgid "No!!!"
+#~ msgstr "Tidak!!!"
 
-#~ msgid " KB/s"
-#~ msgstr " KB/detik"
+#~ msgid "\""
+#~ msgstr "\""
 
-#~ msgid " MB/s"
-#~ msgstr " MB/detik"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Nonaktifkan PM"
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Mulai ulang minetest untuk beralih ke driver yang dipilih"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "diaktifkan"
 
 #~ msgid "Rendering:"
 #~ msgstr "Rendering:"
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "diaktifkan"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Mulai ulang minetest untuk beralih ke driver yang dipilih"
 
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Nonaktifkan PM"
+#~ msgid " MB/s"
+#~ msgstr " MB/detik"
 
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid " KB/s"
+#~ msgstr " KB/detik"
 
-#~ msgid "No!!!"
-#~ msgstr "Tidak!!!"
+#~ msgid "Downloading"
+#~ msgstr "Mengunduh"
 
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Hasilkan Normalmaps"
+#~ msgid "Touch free target"
+#~ msgstr "Bebas sentuhan"
 
-#~ msgid "Public Serverlist"
-#~ msgstr "Daftar Server Publik"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Faktor skala yang diatur untuk elemen menu: "
 
-#~ msgid "No of course not!"
-#~ msgstr "Tentu tidak!"
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "Memuat tekstur..."
diff --git a/po/it/minetest.po b/po/it/minetest.po
index 83ff7c1..a6f49ef 100644
--- a/po/it/minetest.po
+++ b/po/it/minetest.po
@@ -6,11 +6,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Minetest 0.4.9\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-08 17:01+0000\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-05-14 13:34+0000\n"
 "Last-Translator: Emon Omen <emon at openmailbox.org>\n"
-"Language-Team: Italian "
-"<https://hosted.weblate.org/projects/minetest/minetest/it/>\n"
+"Language-Team: Italian <https://hosted.weblate.org/projects/minetest/"
+"minetest/it/>\n"
 "Language: it\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -598,6 +598,11 @@ msgid "Particles"
 msgstr "Particelle"
 
 #: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Siete certi di volere azzerare il vostro mondo di giocatore singolo?"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Impostazioni"
 
@@ -973,6 +978,10 @@ msgstr "Attivare noclip"
 msgid "Use"
 msgstr "Usare"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "prem. il tasto"
@@ -1289,10 +1298,6 @@ msgstr "Pulsante X 1"
 msgid "X Button 2"
 msgstr "Pulsante X 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1380,6 +1385,11 @@ msgid "Active Block Modifier interval"
 msgstr "Intervallo del modificatore di blocco attivo"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "Intervallo del modificatore di blocco attivo"
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr "Portata del blocco attivo"
 
@@ -1466,6 +1476,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr "Rapporto automatico all'elenco dei server."
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "Tasto all'indietro"
 
@@ -1498,6 +1512,10 @@ msgid "Build inside player"
 msgstr "Costruisci nel giocatore"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Bumpmapping"
 
@@ -1538,6 +1556,11 @@ msgid "Chat toggle key"
 msgstr "Tasto di scelta della messaggistica"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Comando"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1628,17 +1651,9 @@ msgid "Colored fog"
 msgstr "Nebbia colorata"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
-msgstr ""
-"Lista separata da virgole dei mod affidabili ai quali è permesso accedere a "
-"funzioni non sicure anche quando il valore \"mod security\" è impostato su \""
-"on\" (utilizzando request_insecure_environment())."
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
 "allow them to upload and download data to/from the internet."
 msgstr ""
 "Elenco separato da virgole di mod. a cui è permesso l'accesso alle API "
@@ -1646,6 +1661,15 @@ msgstr ""
 "che gli permettono di caricare e scaricare dati su/da internet."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
+msgstr ""
+"Lista separata da virgole dei mod affidabili ai quali è permesso accedere a "
+"funzioni non sicure anche quando il valore \"mod security\" è impostato su "
+"\"on\" (utilizzando request_insecure_environment())."
+
+#: src/settings_translation_file.cpp
 msgid "Command key"
 msgstr "Tasto di comando"
 
@@ -1802,6 +1826,10 @@ msgid "Default privileges"
 msgstr "Privilegi predefiniti"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1824,6 +1852,10 @@ msgstr ""
 "blocchi (0 = illimitata)."
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr "Ritardo nella comparsa dei suggerimenti, espresso in millisecondi."
 
@@ -1856,15 +1888,6 @@ msgid "Desynchronize block animation"
 msgstr "De-sincronizza l'animazione del blocco"
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-"Dati di profilo del mod. dettagliati. Utile per gli sviluppatori di mod."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Profilo dettagliato del mod."
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1879,6 +1902,18 @@ msgid "Disable anticheat"
 msgstr "Disabilita anti-trucchi"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "Rifiutare le password vuote"
 
@@ -1904,6 +1939,10 @@ msgid "Dump the mapgen debug infos."
 msgstr "Pubblica le informazioni di debug del generatore della mappa."
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "Abilitare VBO"
 
@@ -1950,8 +1989,8 @@ msgid ""
 "textures)\n"
 "when connecting to the server."
 msgstr ""
-"Abilita l'utilizzo di un server di materiale remoto (se fornito dal server)."
-"\n"
+"Abilita l'utilizzo di un server di materiale remoto (se fornito dal "
+"server).\n"
 "I server remoti offrono un modo significativamente più veloce di "
 "scaricamento\n"
 "del materiale (ad es. le immagini) quando ci si collega al server."
@@ -2012,6 +2051,15 @@ msgstr ""
 "Richiede l'attivazione degli shader."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiling data print interval"
+msgstr "Intervallo di stampa del profilamento"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2076,10 +2124,24 @@ msgid "Field of view"
 msgstr "Campo visivo"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Field of view for zoom"
+msgstr "Campo visivo"
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr "Campo visivo in gradi."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Movimento veloce (tramite il tasto usare).\n"
+"Ciò richiede il privilegio \"fast\" sul server."
+
+#: src/settings_translation_file.cpp
 msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
@@ -2230,12 +2292,15 @@ msgid "Generate normalmaps"
 msgstr "Generare le normalmap"
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2284,6 +2349,15 @@ msgstr ""
 "sviluppatori di mod.)."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr "Componente dell'altezza della dimensione della finestra iniziale."
 
@@ -2315,15 +2389,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr "Quanti blocchi vengono inviati simultaneamente per l'intero server."
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr "Quanti blocchi volano nel cavo simultaneamente per ogni client."
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2441,6 +2506,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr "Colore in gioco dello sfondo della console dei messaggi (R,G,B)."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 "Intervallo di salvataggio dei cambiamenti importanti nel mondo, espresso in "
@@ -2479,6 +2578,16 @@ msgstr ""
 "Controlla l'ammontare del dettaglio fine."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "Intervallo di ripetizione del click destro"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "Sensibilità del mouse"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2704,6 +2813,17 @@ msgstr ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tasto per attivare la modalità veloce.\n"
+"Si veda http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
@@ -2754,8 +2874,9 @@ msgstr ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2831,7 +2952,7 @@ msgstr "Tasto \"Usare\" per arrampicarsi/scendere"
 
 #: src/settings_translation_file.cpp
 msgid "Language"
-msgstr "Linua"
+msgstr "Lingua"
 
 #: src/settings_translation_file.cpp
 msgid "Large cave depth"
@@ -2948,6 +3069,22 @@ msgid "Liquid update tick"
 msgstr "Scatto di aggiornamento del liquido"
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "Intervallo del modificatore di blocco attivo"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr "Menu principale gestore giochi"
 
@@ -2975,6 +3112,7 @@ msgid "Map directory"
 msgstr "Cartella della mappa"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen Valleys.\n"
 "'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2982,14 +3120,12 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Attributi di generazione della mappa specifici per il Generatore mappa valli."
-"\n"
+"Attributi di generazione della mappa specifici per il Generatore mappa "
+"valli.\n"
 "'altitude_chill' rende più fredde le altitudini più elevate, il che potrebbe "
 "causare problemi di bioma.\n"
 "'humid_rivers' modifica l'umidità attorno ai fiumi e in aree dove l'acqua "
@@ -3004,32 +3140,27 @@ msgstr ""
 "esplicitamente."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Attributi di generazione della mappa specifici per Generatore mappa piatto.\n"
-"Laghi e colline occasionali possono essere aggiunti al mondo piatto.\n"
-"Le impostazioni predefinite impostate nel motore sono: nessuna\n"
-"La stringa delle impostazioni modifica le impostazioni predefinite del "
-"motore.\n"
+"Attributi di generazione della mappa specifici per Generatore mappa v. 7.\n"
+"'ridges' sono i fiumi.\n"
 "Le impostazioni che non sono specificate nella stringa mantengono i valori "
 "predefiniti.\n"
 "Le impostazioni che iniziano con \"no\" sono usate per disabilitarle "
 "esplicitamente."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3046,20 +3177,16 @@ msgstr ""
 "esplicitamente."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Attributi di generazione della mappa specifici per Generatore mappa v. 6.\n"
-"L'impostazione 'ridges' controlla i fiumi.\n"
-"Le impostazioni predefinite impostate nel motore sono: mountains, ridges\n"
-"La stringa delle impostazioni modifica le impostazioni predefinite del "
-"motore.\n"
+"Attributi di generazione della mappa specifici per Generatore mappa v. 7.\n"
+"'ridges' sono i fiumi.\n"
 "Le impostazioni che non sono specificate nella stringa mantengono i valori "
 "predefiniti.\n"
 "Le impostazioni che iniziano con \"no\" sono usate per disabilitarle "
@@ -3420,6 +3547,18 @@ msgid "Maximum hotbar width"
 msgstr "Larghezza massima della barra oggetti"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+"Numero massimo di giocatori che possono connettersi contemporaneamente."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+"Numero massimo di blocchi che possono essere accodati per il caricamento."
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 "Numero massimo di blocchi che possono essere accodati per il caricamento."
@@ -3474,6 +3613,11 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr "Numero massimo di oggetti immagazzinati stabilmente in un blocco."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum objects per block"
+msgstr "Oggetti massimi per blocco"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
@@ -3482,11 +3626,13 @@ msgstr ""
 "Utile se c'è qualcosa da mostrare a destra o sinistra della barra."
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+#, fuzzy
+msgid "Maximum simultaneous block sends per client"
 msgstr "Num. mass. di blocchi inviati contemp. per client"
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+#, fuzzy
+msgid "Maximum simultaneous block sends total"
 msgstr "Totale massimo di invio contemporaneo di blocchi"
 
 #: src/settings_translation_file.cpp
@@ -3500,10 +3646,6 @@ msgid "Maximum users"
 msgstr "Utenti massimi"
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Oggetti massimi per blocco"
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "Menu"
 
@@ -3544,10 +3686,6 @@ msgid "Mipmapping"
 msgstr "Mipmapping"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr "Creazione del profilo dei mod."
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr "URL dei dettagli del deposito mod."
 
@@ -3787,22 +3925,31 @@ msgstr ""
 "shell."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+"Intervallo di stampa del profilatore. 0 = disabilitato. Utile per gli "
+"sviluppatori."
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr "Privilegi che possono essere assegnati dai giocatori con basic_privs"
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr ""
-"Intervallo di stampa del profilatore. 0 = disabilitato. Utile per gli "
-"sviluppatori."
+#, fuzzy
+msgid "Profiler"
+msgstr "Profilo valli"
 
 #: src/settings_translation_file.cpp
 msgid "Profiler toggle key"
 msgstr "Tasto di attivazione del profilatore"
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "Intervallo di stampa del profilamento"
+#, fuzzy
+msgid "Profiling"
+msgstr "Creazione del profilo dei mod."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3840,6 +3987,11 @@ msgid "Replaces the default main menu with a custom one."
 msgstr "Sostituisce il menu principale predefinito con uno personalizzato."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Percorso del font"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "Tasto destro"
 
@@ -4013,8 +4165,9 @@ msgstr ""
 "Necessita l'attivazione degli shader."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -4055,8 +4208,9 @@ msgid "Smooth lighting"
 msgstr "Illuminazione uniforme"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 "Rende fluida la camera quando ci si muove e si guarda attorno.\n"
@@ -4150,10 +4304,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr "L'altitudine a cui le temperature crollano di 20°C"
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr "La profondità della terra o altri riempitori"
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr "L'interfaccia di rete ascoltata dal server."
 
@@ -4172,6 +4338,12 @@ msgstr "Il supporto di rendering per Irrlicht."
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -4198,6 +4370,15 @@ msgstr ""
 "funzionalità."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"Il tempo in secondi richiesto tra click destri ripetuti quando si tiene il "
+"pulsante mouse destro."
+
+#: src/settings_translation_file.cpp
 msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
@@ -4318,10 +4499,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr "Usare il filtro trilineare quando si ridimensionano le immagini."
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Utile per gli sviluppatori di mod."
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr "Sincronia verticale"
 
@@ -4453,11 +4630,12 @@ msgstr ""
 "nell'inventario)."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 "Quando gui_scaling_filter_txr2img è vero, copia quelle immagini\n"
 "dall'hardware al software per il ridimensionamento. Quando è falso,\n"
@@ -4596,132 +4774,175 @@ msgstr "Limite cURL parallelo"
 msgid "cURL timeout"
 msgstr "Tempo di scadenza cURL"
 
-#~ msgid "Item textures..."
-#~ msgstr "Immagini degli oggetti..."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr ""
+#~ "Dati di profilo del mod. dettagliati. Utile per gli sviluppatori di mod."
 
-#~ msgid "Preload inventory textures"
-#~ msgstr "Precaricamento delle textures dell'inventario"
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Profilo dettagliato del mod."
 
-#~ msgid "Viewing range minimum"
-#~ msgstr "Distanza minima di visibilità"
+#~ msgid ""
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
+#~ msgstr "Quanti blocchi vengono inviati simultaneamente per l'intero server."
 
-#~ msgid "Wanted FPS"
-#~ msgstr "FPS desiderati"
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
+#~ msgstr "Quanti blocchi volano nel cavo simultaneamente per ogni client."
 
-#~ msgid "Local install"
-#~ msgstr "Installazione locale"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Utile per gli sviluppatori di mod."
 
-#~ msgid "Add mod:"
-#~ msgstr "Aggiungere un modulo:"
+#~ msgid "No of course not!"
+#~ msgstr "No, certo che no!"
 
-#~ msgid "MODS"
-#~ msgstr "MODULI"
+#~ msgid "Public Serverlist"
+#~ msgstr "Elenco dei server pubblici"
 
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "PACCH. DI IMM."
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generare normalmap"
 
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "GIOC. SING."
+#~ msgid "No!!!"
+#~ msgstr "No!!!"
 
-#~ msgid "Finite Liquid"
-#~ msgstr "Liquido limitato"
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
+#~ msgstr ""
+#~ "Attributi di generazione della mappa specifici per Generatore mappa "
+#~ "valli.\n"
+#~ "Le impostazioni che non sono specificate nella stringa mantengono i "
+#~ "valori predefiniti.\n"
+#~ "Le impostazioni che iniziano con \"no\" sono usate per disabilitarle "
+#~ "esplicitamente.\n"
+#~ "\"altitude_chill\" rende più fredde le elevazioni maggiori, il che "
+#~ "potrebbe causare problemi ai biomi.\n"
+#~ "\"humid_rivers\" modifica l'umidità attorno ai fiumi e nelle aree in cui "
+#~ "l'acqua tenderebbe a stagnare. Potrebbe interferire con biomi"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Precaricare le immagini"
+#~ msgid "If disabled "
+#~ msgstr "Disatt. pacch."
 
-#~ msgid "SETTINGS"
-#~ msgstr "IMPOSTAZIONI"
+#~ msgid "If enabled, "
+#~ msgstr "attivata"
 
-#~ msgid "Password"
-#~ msgstr "Password"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Riavviare minetest per rendere effettive le modifiche"
 
-#~ msgid "Name"
-#~ msgstr "Nome"
+#~ msgid "Game Name"
+#~ msgstr "Nome del gioco"
 
-#~ msgid "START SERVER"
-#~ msgstr "AVVIO SERVER"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gestore del gioco: impossibile il modulo \"$1\" nel gioco \"$2\""
 
-#~ msgid "CLIENT"
-#~ msgstr "CLIENT"
+#~ msgid "GAMES"
+#~ msgstr "GIOCHI"
 
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Aggiungere il modulo"
+#~ msgid "Mods:"
+#~ msgstr "Moduli:"
 
-#~ msgid "Remove selected mod"
-#~ msgstr "Rimuovere il modulo selezionato"
+#~ msgid "new game"
+#~ msgstr "nuovo gioco"
 
 #~ msgid "EDIT GAME"
 #~ msgstr "MODIFICARE IL GIOCO"
 
-#~ msgid "new game"
-#~ msgstr "nuovo gioco"
+#~ msgid "Remove selected mod"
+#~ msgstr "Rimuovere il modulo selezionato"
 
-#~ msgid "Mods:"
-#~ msgstr "Moduli:"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Aggiungere il modulo"
 
-#~ msgid "GAMES"
-#~ msgstr "GIOCHI"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENT"
 
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gestore del gioco: impossibile il modulo \"$1\" nel gioco \"$2\""
+#~ msgid "START SERVER"
+#~ msgstr "AVVIO SERVER"
 
-#~ msgid "Game Name"
-#~ msgstr "Nome del gioco"
+#~ msgid "Name"
+#~ msgstr "Nome"
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Riavviare minetest per rendere effettive le modifiche"
+#~ msgid "Password"
+#~ msgstr "Password"
 
-#~ msgid "If enabled, "
-#~ msgstr "attivata"
+#~ msgid "SETTINGS"
+#~ msgstr "IMPOSTAZIONI"
 
-#~ msgid "If disabled "
-#~ msgstr "Disatt. pacch."
+#~ msgid "Preload item visuals"
+#~ msgstr "Precaricare le immagini"
+
+#~ msgid "Finite Liquid"
+#~ msgstr "Liquido limitato"
+
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "GIOC. SING."
+
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "PACCH. DI IMM."
+
+#~ msgid "MODS"
+#~ msgstr "MODULI"
+
+#~ msgid "Add mod:"
+#~ msgstr "Aggiungere un modulo:"
+
+#~ msgid "Local install"
+#~ msgstr "Installazione locale"
+
+#~ msgid "Wanted FPS"
+#~ msgstr "FPS desiderati"
+
+#~ msgid "Viewing range minimum"
+#~ msgstr "Distanza minima di visibilità"
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "Precaricamento delle textures dell'inventario"
+
+#~ msgid "Item textures..."
+#~ msgstr "Immagini degli oggetti..."
 
 #~ msgid ""
 #~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with 'no' are used to explicitly disable them."
 #~ msgstr ""
 #~ "Attributi di generazione della mappa specifici per Generatore mappa v. "
-#~ "7.\n"
-#~ "'ridges' sono i fiumi.\n"
+#~ "6.\n"
+#~ "L'impostazione 'ridges' controlla i fiumi.\n"
+#~ "Le impostazioni predefinite impostate nel motore sono: mountains, ridges\n"
+#~ "La stringa delle impostazioni modifica le impostazioni predefinite del "
+#~ "motore.\n"
 #~ "Le impostazioni che non sono specificate nella stringa mantengono i "
 #~ "valori predefiniti.\n"
 #~ "Le impostazioni che iniziano con \"no\" sono usate per disabilitarle "
 #~ "esplicitamente."
 
 #~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Flags starting with 'no' are used to explicitly disable them."
 #~ msgstr ""
 #~ "Attributi di generazione della mappa specifici per Generatore mappa "
-#~ "valli.\n"
+#~ "piatto.\n"
+#~ "Laghi e colline occasionali possono essere aggiunti al mondo piatto.\n"
+#~ "Le impostazioni predefinite impostate nel motore sono: nessuna\n"
+#~ "La stringa delle impostazioni modifica le impostazioni predefinite del "
+#~ "motore.\n"
 #~ "Le impostazioni che non sono specificate nella stringa mantengono i "
 #~ "valori predefiniti.\n"
 #~ "Le impostazioni che iniziano con \"no\" sono usate per disabilitarle "
-#~ "esplicitamente.\n"
-#~ "\"altitude_chill\" rende più fredde le elevazioni maggiori, il che "
-#~ "potrebbe causare problemi ai biomi.\n"
-#~ "\"humid_rivers\" modifica l'umidità attorno ai fiumi e nelle aree in cui "
-#~ "l'acqua tenderebbe a stagnare. Potrebbe interferire con biomi"
-
-#~ msgid "No!!!"
-#~ msgstr "No!!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generare normalmap"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Elenco dei server pubblici"
-
-#~ msgid "No of course not!"
-#~ msgstr "No, certo che no!"
+#~ "esplicitamente."
diff --git a/po/ja/minetest.po b/po/ja/minetest.po
index c6bc38d..f260367 100644
--- a/po/ja/minetest.po
+++ b/po/ja/minetest.po
@@ -2,21 +2,21 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-07 16:10+0000\n"
-"Last-Translator: BreadW <toshiharu.uno at gmail.com>\n"
-"Language-Team: Japanese "
-"<https://hosted.weblate.org/projects/minetest/minetest/ja/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-11-16 13:08+0000\n"
+"Last-Translator: Rui <rui.minetest at gmail.com>\n"
+"Language-Team: Japanese <https://hosted.weblate.org/projects/minetest/"
+"minetest/ja/>\n"
 "Language: ja\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.10-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr "以下のModのLuaスクリプト内でエラーが発生しました:"
+msgstr "以下のModのLuaスクリプトでエラーが発生しました:"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
@@ -44,15 +44,15 @@ msgstr "読み込み中..."
 
 #: builtin/mainmenu/common.lua
 msgid "Protocol version mismatch. "
-msgstr "プロトコルバージョンが一致していません。 "
+msgstr "プロトコルのバージョンが一致していません。 "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr "サーバのプロトコルバージョンは$1が適用されます。 "
+msgstr "サーバはバージョン$1のプロトコルを強制しています。 "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
-msgstr "サーバは$1から$2までのプロトコルバージョンをサポートしています。 "
+msgstr "サーバは$1から$2までのプロトコルのバージョンをサポートしています。 "
 
 #: builtin/mainmenu/common.lua
 msgid "Try reenabling public serverlist and check your internet connection."
@@ -60,11 +60,11 @@ msgstr "インターネット接続を確認し、公開サーバ一覧を再有
 
 #: builtin/mainmenu/common.lua
 msgid "We only support protocol version $1."
-msgstr "プロトコルバージョンは$1のみサポートしています。"
+msgstr "プロトコルはバージョン$1のみをサポートしています。"
 
 #: builtin/mainmenu/common.lua
 msgid "We support protocol versions between version $1 and $2."
-msgstr "プロトコルバージョンは$1から$2までをサポートしています。"
+msgstr "バージョン$1から$2までのプロトコルをサポートしています。"
 
 #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -80,11 +80,11 @@ msgstr "依存Mod:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Disable MP"
-msgstr "無効化"
+msgstr "Modパックを無効化"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Enable MP"
-msgstr "有効化"
+msgstr "Modパックを有効化"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Enable all"
@@ -95,7 +95,7 @@ msgid ""
 "Failed to enable mod \"$1\" as it contains disallowed characters. Only "
 "chararacters [a-z0-9_] are allowed."
 msgstr ""
-"許可されていない文字が使用されているためMod \"$1\"を有効化できませんでした。"
+"許可されていない文字が使用されているため、Mod「$1」を有効化できませんでした。"
 "文字は[a-z0-9_]のみ使用できます。"
 
 #: builtin/mainmenu/dlg_config_world.lua
@@ -104,7 +104,7 @@ msgstr "ゲームを非表示"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide mp content"
-msgstr "Modパックを非表示"
+msgstr "Modパックの内容を非表示"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Mod:"
@@ -125,7 +125,7 @@ msgstr "有効化"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "A world named \"$1\" already exists"
-msgstr "ワールド名\"$1\"は既に使用されています"
+msgstr "ワールド名「$1」は既に存在します"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Create"
@@ -134,7 +134,7 @@ msgstr "作成"
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download a subgame, such as minetest_game, from minetest.net"
 msgstr ""
-"minetest.netから、minetest_gameなどのサブゲームをダウンロードしてください"
+"minetest.netからminetest_gameなどのサブゲームをダウンロードしてください"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download one from minetest.net"
@@ -158,7 +158,7 @@ msgstr "Seed値"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Warning: The minimal development test is meant for developers."
-msgstr "警告: Minimal development testは開発者用です。"
+msgstr "警告: minimal development testは開発者用です。"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "World name"
@@ -170,7 +170,7 @@ msgstr "サブゲームがインストールされていません。"
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Are you sure you want to delete \"$1\"?"
-msgstr "本当に\"$1\"を削除してよろしいですか?"
+msgstr "本当に「$1」を削除してよろしいですか?"
 
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
@@ -180,15 +180,15 @@ msgstr "削除"
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Modmgr: failed to delete \"$1\""
-msgstr "Modマネージャー: \"$1\"の削除に失敗しました"
+msgstr "Modマネージャ: 「$1」の削除に失敗しました"
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Modmgr: invalid modpath \"$1\""
-msgstr "Modマネージャー: Mod\"$1\"の場所が不明です"
+msgstr "Modマネージャ: Mod「$1」の場所が無効です"
 
 #: builtin/mainmenu/dlg_delete_world.lua
 msgid "Delete World \"$1\"?"
-msgstr "ワールド\"$1\"を削除しますか?"
+msgstr "ワールド「$1」を削除しますか?"
 
 #: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp
 msgid "Accept"
@@ -200,7 +200,7 @@ msgstr "Modパック名を変更:"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "\"$1\" is not a valid flag."
-msgstr "\"$1\"は有効なフラグではありません。"
+msgstr "「$1」は有効なフラグではありません。"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "(No description of setting given)"
@@ -231,6 +231,7 @@ msgid "Format is 3 numbers separated by commas and inside brackets."
 msgstr "括弧内に3つの数字をカンマで区切って入力してください。"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
 msgid ""
 "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
 "<octaves>, <persistence>"
@@ -247,12 +248,14 @@ msgid "Mods"
 msgstr "Mod"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
 msgid "Optionally the lacunarity can be appended with a leading comma."
-msgstr "空隙性の値には、任意でカンマを付けて読みやすくすることができます。"
+msgstr "空隙性の値は、必要に応じ読みやすくカンマを付けることができます。"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
 msgid "Please enter a comma seperated list of flags."
-msgstr "フラグ一覧はカンマで区切って入力してください。"
+msgstr "フラグはカンマで区切った一覧で入力してください。"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a valid integer."
@@ -264,7 +267,7 @@ msgstr "有効な数字を入力してください。"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Possible values are: "
-msgstr "使用可能な値: "
+msgstr "可能な値: "
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Restore Default"
@@ -272,7 +275,7 @@ msgstr "初期設定に戻す"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Select path"
-msgstr "ファイルの場所を選択"
+msgstr "場所を選択"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Show technical names"
@@ -280,11 +283,11 @@ msgstr "パラメータ名を表示"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "The value must be greater than $1."
-msgstr "$1より大きい値でなければいけません。"
+msgstr "値は$1より大きくなければなりません。"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "The value must be lower than $1."
-msgstr "$1より小さい値でなければいけません。"
+msgstr "値は$1より小さくなければなりません。"
 
 #: builtin/mainmenu/modmgr.lua
 msgid ""
@@ -292,7 +295,7 @@ msgid ""
 "Install Mod: unsupported filetype \"$1\" or broken archive"
 msgstr ""
 "\n"
-"Modインストール: ファイル\"$1\"は非対応の形式か、壊れています"
+"Modインストール: 「$1」は非対応の形式か、壊れたアーカイブです"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Failed to install $1 to $2"
@@ -300,17 +303,15 @@ msgstr "$2へ$1をインストールできませんでした"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: file: \"$1\""
-msgstr "Modインストール: ファイル: \"$1\""
+msgstr "Modインストール: ファイル: 「$1」"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: unable to find real modname for: $1"
-msgstr "Modインストール: $1の本来のMod名が不明です"
+msgstr "Modインストール: $1の正しいMod名が不明です"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: unable to find suitable foldername for modpack $1"
-msgstr ""
-"Modインストール: Modパック$1に適したフォルダ名を見つけることができませんでし"
-"た"
+msgstr "Modインストール: Modパック$1に適したフォルダ名が不明です"
 
 #: builtin/mainmenu/store.lua
 msgid "Close store"
@@ -318,7 +319,7 @@ msgstr "ストアを閉じる"
 
 #: builtin/mainmenu/store.lua
 msgid "Downloading $1, please wait..."
-msgstr "$1をダウンロードしています。しばらくお待ちください..."
+msgstr "$1をダウンロードしています、しばらくお待ちください..."
 
 #: builtin/mainmenu/store.lua
 msgid "Install"
@@ -354,7 +355,7 @@ msgstr "再インストール"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Active Contributors"
-msgstr "活動中の開発協力者"
+msgstr "活動中の貢献者"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Core Developers"
@@ -366,7 +367,7 @@ msgstr "クレジット"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Previous Contributors"
-msgstr "以前の開発協力者"
+msgstr "以前の貢献者"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Previous Core Developers"
@@ -528,7 +529,7 @@ msgstr "バンプマッピング"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Change keys"
-msgstr "操作変更"
+msgstr "キー変更"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Connected Glass"
@@ -544,7 +545,7 @@ msgstr "ミップマップ"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Mipmap + Aniso. Filter"
-msgstr "異方性フィルタ"
+msgstr "ミップマップと異方性フィルタ"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No"
@@ -560,11 +561,11 @@ msgstr "ミップマップ無し"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Node Highlighting"
-msgstr "ノードのハイライト"
+msgstr "ノードを高輝度表示"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Node Outlining"
-msgstr "ノードの輪郭線描画"
+msgstr "ノードの輪郭線を描画"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
@@ -588,7 +589,11 @@ msgstr "視差遮蔽マッピング"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Particles"
-msgstr "パーティクル有効化"
+msgstr "パーティクル"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "シングルプレイヤーのワールドをリセット"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
@@ -612,15 +617,15 @@ msgstr "テクスチャリング:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "シェーダーを有効にするにはOpenGLを使用する必要があります。"
+msgstr "シェーダーを有効にするにはOpenGLのドライバを使用する必要があります。"
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Tone Mapping"
-msgstr "ミップマッピング"
+msgstr "トーンマッピング"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Touchthreshold (px)"
-msgstr "タッチのしきい値(ピクセル)"
+msgstr "タッチのしきい値(ピクセル単位)"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Trilinear Filter"
@@ -672,7 +677,7 @@ msgstr "テクスチャパックを選択:"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "Texturepacks"
-msgstr "テクスチャ"
+msgstr "テクスチャパック"
 
 #: src/client.cpp
 msgid "Connection timed out."
@@ -740,7 +745,7 @@ msgstr ""
 
 #: src/game.cpp
 msgid "Change Keys"
-msgstr "操作変更"
+msgstr "キー変更"
 
 #: src/game.cpp
 msgid "Change Password"
@@ -756,11 +761,11 @@ msgstr "再開"
 
 #: src/game.cpp
 msgid "Creating client..."
-msgstr "クライアントを起動中..."
+msgstr "クライアントを作成中..."
 
 #: src/game.cpp
 msgid "Creating server..."
-msgstr "サーバを起動中..."
+msgstr "サーバを作成中..."
 
 #: src/game.cpp
 msgid ""
@@ -818,7 +823,7 @@ msgstr ""
 
 #: src/game.cpp
 msgid "Exit to Menu"
-msgstr "タイトル"
+msgstr "タイトルに戻る"
 
 #: src/game.cpp
 msgid "Exit to OS"
@@ -830,15 +835,15 @@ msgstr "アイテムを定義中..."
 
 #: src/game.cpp
 msgid "KiB/s"
-msgstr "KB/秒"
+msgstr "KiB/秒"
 
 #: src/game.cpp
 msgid "Media..."
-msgstr "通信中..."
+msgstr "メディアを受信中..."
 
 #: src/game.cpp
 msgid "MiB/s"
-msgstr "MB/秒"
+msgstr "MiB/秒"
 
 #: src/game.cpp
 msgid "Node definitions..."
@@ -862,7 +867,7 @@ msgstr "音量"
 
 #: src/game.cpp
 msgid "You died."
-msgstr "死にました。"
+msgstr "あなたは死にました。"
 
 #: src/game.cpp src/guiFormSpecMenu.cpp
 msgid "ok"
@@ -878,7 +883,7 @@ msgstr "決定"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "\"Use\" = climb down"
-msgstr "「使用」キーで降りる"
+msgstr "「使用」で降りる"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Backward"
@@ -898,7 +903,7 @@ msgstr "コンソール"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Double tap \"jump\" to toggle fly"
-msgstr "「ジャンプ」キー二回押しで飛行モード"
+msgstr "「ジャンプ」の二度押しで飛行モードを切り替え"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Drop"
@@ -923,8 +928,8 @@ msgstr "キーが重複しています"
 #: src/guiKeyChangeMenu.cpp
 msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
 msgstr ""
-"操作設定です。 (変更に失敗した場合、minetest.confから該当する設定を削除してく"
-"ださい)"
+"キー設定です。 (このメニューで失敗する場合は、minetest.confから該当する設定を"
+"削除してください)"
 
 #: src/guiKeyChangeMenu.cpp src/keycode.cpp
 msgid "Left"
@@ -932,11 +937,11 @@ msgstr "左"
 
 #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
 msgid "Print stacks"
-msgstr "スタックの表示"
+msgstr "スタックの出力"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Range select"
-msgstr "視野範囲変更"
+msgstr "視野の範囲を変更"
 
 #: src/guiKeyChangeMenu.cpp src/keycode.cpp
 msgid "Right"
@@ -947,18 +952,22 @@ msgid "Sneak"
 msgstr "スニーク"
 
 #: src/guiKeyChangeMenu.cpp
+#, fuzzy
 msgid "Toggle Cinematic"
 msgstr "映画風カメラ"
 
 #: src/guiKeyChangeMenu.cpp
+#, fuzzy
 msgid "Toggle fast"
 msgstr "高速移動モード"
 
 #: src/guiKeyChangeMenu.cpp
+#, fuzzy
 msgid "Toggle fly"
 msgstr "飛行モード"
 
 #: src/guiKeyChangeMenu.cpp
+#, fuzzy
 msgid "Toggle noclip"
 msgstr "すり抜けモード"
 
@@ -966,7 +975,12 @@ msgstr "すり抜けモード"
 msgid "Use"
 msgstr "使用"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "ズーム"
+
 #: src/guiKeyChangeMenu.cpp
+#, fuzzy
 msgid "press key"
 msgstr "キー入力待ち"
 
@@ -1000,27 +1014,27 @@ msgstr "音量: "
 
 #: src/keycode.cpp
 msgid "Apps"
-msgstr "アプリ"
+msgstr "アプリケーション"
 
 #: src/keycode.cpp
 msgid "Attn"
-msgstr ":"
+msgstr "Attn"
 
 #: src/keycode.cpp
 msgid "Back"
-msgstr "戻るキー"
+msgstr "Back"
 
 #: src/keycode.cpp
 msgid "Capital"
-msgstr "Caps Lock"
+msgstr "Capital"
 
 #: src/keycode.cpp
 msgid "Clear"
-msgstr "クリア"
+msgstr "Clear"
 
 #: src/keycode.cpp
 msgid "Comma"
-msgstr ","
+msgstr "カンマ"
 
 #: src/keycode.cpp
 msgid "Control"
@@ -1036,11 +1050,11 @@ msgstr "CrSel"
 
 #: src/keycode.cpp
 msgid "Down"
-msgstr "下"
+msgstr "Down"
 
 #: src/keycode.cpp
 msgid "End"
-msgstr "エンド"
+msgstr "End"
 
 #: src/keycode.cpp
 msgid "Erase OEF"
@@ -1048,7 +1062,7 @@ msgstr "Erase OEF"
 
 #: src/keycode.cpp
 msgid "Escape"
-msgstr "Esc"
+msgstr "Escape"
 
 #: src/keycode.cpp
 msgid "ExSel"
@@ -1056,15 +1070,15 @@ msgstr "ExSel"
 
 #: src/keycode.cpp
 msgid "Execute"
-msgstr "実行キー"
+msgstr "Execute"
 
 #: src/keycode.cpp
 msgid "Final"
-msgstr "Finalキー"
+msgstr "Final"
 
 #: src/keycode.cpp
 msgid "Help"
-msgstr "ヘルプ"
+msgstr "Help"
 
 #: src/keycode.cpp
 msgid "Home"
@@ -1076,7 +1090,7 @@ msgstr "Insert"
 
 #: src/keycode.cpp
 msgid "Junja"
-msgstr "Junjaキー"
+msgstr "Junja"
 
 #: src/keycode.cpp
 msgid "Kana"
@@ -1084,7 +1098,7 @@ msgstr "かな"
 
 #: src/keycode.cpp
 msgid "Kanji"
-msgstr "半角/全角"
+msgstr "漢字"
 
 #: src/keycode.cpp
 msgid "Left Button"
@@ -1096,7 +1110,7 @@ msgstr "左Ctrl"
 
 #: src/keycode.cpp
 msgid "Left Menu"
-msgstr "左メニュー"
+msgstr "左Alt"
 
 #: src/keycode.cpp
 msgid "Left Shift"
@@ -1108,7 +1122,7 @@ msgstr "左Windows"
 
 #: src/keycode.cpp
 msgid "Menu"
-msgstr "メニュー"
+msgstr "Alt"
 
 #: src/keycode.cpp
 msgid "Middle Button"
@@ -1116,7 +1130,7 @@ msgstr "中ボタン"
 
 #: src/keycode.cpp
 msgid "Minus"
-msgstr "-"
+msgstr "マイナス"
 
 #: src/keycode.cpp
 msgid "Mode Change"
@@ -1124,7 +1138,7 @@ msgstr "モード変更"
 
 #: src/keycode.cpp
 msgid "Next"
-msgstr "Page Down"
+msgstr "PageDown"
 
 #: src/keycode.cpp
 msgid "Nonconvert"
@@ -1132,67 +1146,67 @@ msgstr "無変換"
 
 #: src/keycode.cpp
 msgid "Num Lock"
-msgstr "Num Lock"
+msgstr "NumLock"
 
 #: src/keycode.cpp
 msgid "Numpad *"
-msgstr "テンキー *"
+msgstr "数値キーパッド *"
 
 #: src/keycode.cpp
 msgid "Numpad +"
-msgstr "テンキー +"
+msgstr "数値キーパッド +"
 
 #: src/keycode.cpp
 msgid "Numpad -"
-msgstr "テンキー -"
+msgstr "数値キーパッド -"
 
 #: src/keycode.cpp
 msgid "Numpad /"
-msgstr "テンキー /"
+msgstr "数値キーパッド /"
 
 #: src/keycode.cpp
 msgid "Numpad 0"
-msgstr "テンキー 0"
+msgstr "数値キーパッド 0"
 
 #: src/keycode.cpp
 msgid "Numpad 1"
-msgstr "テンキー 1"
+msgstr "数値キーパッド 1"
 
 #: src/keycode.cpp
 msgid "Numpad 2"
-msgstr "テンキー 2"
+msgstr "数値キーパッド 2"
 
 #: src/keycode.cpp
 msgid "Numpad 3"
-msgstr "テンキー 3"
+msgstr "数値キーパッド 3"
 
 #: src/keycode.cpp
 msgid "Numpad 4"
-msgstr "テンキー 4"
+msgstr "数値キーパッド 4"
 
 #: src/keycode.cpp
 msgid "Numpad 5"
-msgstr "テンキー 5"
+msgstr "数値キーパッド 5"
 
 #: src/keycode.cpp
 msgid "Numpad 6"
-msgstr "テンキー 6"
+msgstr "数値キーパッド 6"
 
 #: src/keycode.cpp
 msgid "Numpad 7"
-msgstr "テンキー 7"
+msgstr "数値キーパッド 7"
 
 #: src/keycode.cpp
 msgid "Numpad 8"
-msgstr "テンキー 8"
+msgstr "数値キーパッド 8"
 
 #: src/keycode.cpp
 msgid "Numpad 9"
-msgstr "テンキー 9"
+msgstr "数値キーパッド 9"
 
 #: src/keycode.cpp
 msgid "OEM Clear"
-msgstr "OEMクリア"
+msgstr "OEM Clear"
 
 #: src/keycode.cpp
 msgid "PA1"
@@ -1200,11 +1214,11 @@ msgstr "PA1"
 
 #: src/keycode.cpp
 msgid "Pause"
-msgstr "ポーズ"
+msgstr "Pause"
 
 #: src/keycode.cpp
 msgid "Period"
-msgstr "."
+msgstr "ピリオド"
 
 #: src/keycode.cpp
 msgid "Plus"
@@ -1212,7 +1226,7 @@ msgstr "プラス"
 
 #: src/keycode.cpp
 msgid "Print"
-msgstr "印刷キー"
+msgstr "Print"
 
 #: src/keycode.cpp
 msgid "Prior"
@@ -1282,10 +1296,6 @@ msgstr "Xボタン1"
 msgid "X Button 2"
 msgstr "Xボタン2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "ズーム"
-
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid ""
@@ -1374,6 +1384,11 @@ msgid "Active Block Modifier interval"
 msgstr "アクティブなブロックの範囲"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "アクティブなブロックの範囲"
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr "アクティブなブロックの範囲"
 
@@ -1464,6 +1479,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr "自動的にサーバ一覧に報告します。"
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "オートランキー"
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "後キー"
 
@@ -1499,6 +1518,10 @@ msgid "Build inside player"
 msgstr "プレイヤーの位置に設置"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "ビルトイン"
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "バンプマッピング"
 
@@ -1529,7 +1552,7 @@ msgstr "洞窟ノイズ#2"
 
 #: src/settings_translation_file.cpp
 msgid "Cave width"
-msgstr ""
+msgstr "洞窟の幅"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -1546,6 +1569,11 @@ msgstr "チャットトグルキー"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Chatcommands"
+msgstr "コマンド"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1638,22 +1666,22 @@ msgstr "色つきの霧"
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
-"流行の最先端の安全対策がオンの(request_insecure_environment()を通して)と"
-"きでも、不安定な機能にアクセスしてもよい信用されたモッズのコンマで区切られた"
-"リスト。"
+"HTTP API(彼らがインターネットに出入りするデータをアップロードして、ダウン"
+"ロードするのを許します)にアクセスしてもよいモッズのコンマseperatedされたリス"
+"ト。"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
-"HTTP API(彼らがインターネットに出入りするデータをアップロードして、ダウン"
-"ロードするのを許します)にアクセスしてもよいモッズのコンマseperatedされたリス"
-"ト。"
+"流行の最先端の安全対策がオンの(request_insecure_environment()を通して)と"
+"きでも、不安定な機能にアクセスしてもよい信用されたモッズのコンマで区切られた"
+"リスト。"
 
 #: src/settings_translation_file.cpp
 msgid "Command key"
@@ -1824,6 +1852,10 @@ msgid "Default privileges"
 msgstr "標準権限"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
@@ -1847,6 +1879,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr "ブロック(0無制限の=)で、最大限のプレーヤー移転距離を定めます。"
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr "ツールチップを表示するまでの遅延です。ミリ秒で指定してください。"
@@ -1885,16 +1921,6 @@ msgstr "ブロックのアニメーションの非同期化"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "詳細なModのプロファイルデータです。Mod開発者に便利です。"
-
-#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Detailed mod profiling"
-msgstr "詳細なModのプロファイル化"
-
-#: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1909,6 +1935,18 @@ msgid "Disable anticheat"
 msgstr "対チート機関無効化"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Disallow empty passwords"
 msgstr "空のパスワードを無効化"
@@ -1938,6 +1976,10 @@ msgid "Dump the mapgen debug infos."
 msgstr "マップ生成のデバッグ情報を出力します。"
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "有効化"
 
@@ -2053,6 +2095,14 @@ msgstr ""
 "シェーダーが有効である必要があります。"
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
@@ -2131,12 +2181,26 @@ msgstr "視野"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Field of view for zoom"
+msgstr "視野"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Field of view in degrees."
 msgstr "視野角。"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"高速移動 (使用キー)。\n"
+"サーバによる「fast」権限が必要です。"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2286,12 +2350,14 @@ msgid "Generate normalmaps"
 msgstr "ノーマルマップの生成"
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2322,6 +2388,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2351,15 +2426,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2453,6 +2519,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2487,6 +2587,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2646,6 +2754,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2681,7 +2796,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2832,6 +2947,22 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "アクティブなブロックの範囲"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2864,8 +2995,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2875,8 +3004,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2887,8 +3014,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2898,8 +3023,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3262,6 +3385,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3303,17 +3434,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3325,10 +3460,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "メニュー"
 
@@ -3369,10 +3500,6 @@ msgid "Mipmapping"
 msgstr "ミップマッピング"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3577,11 +3704,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3589,7 +3722,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3624,6 +3757,11 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "フォントパス"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "右キー"
 
@@ -3783,7 +3921,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3820,7 +3958,7 @@ msgstr "滑らかな照明"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3899,10 +4037,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3918,6 +4068,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3933,6 +4089,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -4035,16 +4197,12 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Mod開発に便利。"
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "VBO"
-msgstr ""
+msgstr "VBO"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Depth"
@@ -4164,7 +4322,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4269,9 +4427,8 @@ msgid "Y of flat ground."
 msgstr "フラットマップの地面の高さ"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Y of upper limit of large pseudorandom caves."
-msgstr "大きい擬似ランダム洞窟の高さ(Y)の上限。"
+msgstr "擬似乱数による大きい洞窟の高さ(Y)の上限。"
 
 #: src/settings_translation_file.cpp
 msgid "cURL file download timeout"
@@ -4279,51 +4436,59 @@ msgstr "cURLファイルダウンロードタイムアウト"
 
 #: src/settings_translation_file.cpp
 msgid "cURL parallel limit"
-msgstr "cURLパラレル制限"
+msgstr "cURL並行処理制限"
 
 #: src/settings_translation_file.cpp
 msgid "cURL timeout"
 msgstr "cURLタイムアウト"
 
 #, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "テクスチャ読み込み中..."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "詳細なModのプロファイルデータです。Mod開発者に便利です。"
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "シングルプレイヤーのワールドをリセット"
+#, fuzzy
+#~ msgid "Detailed mod profiling"
+#~ msgstr "詳細なModのプロファイル化"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "メニューの大きさとして設定されている数値: "
+#~ msgid "Useful for mod developers."
+#~ msgstr "Mod開発に便利。"
 
-#~ msgid "Touch free target"
-#~ msgstr "タッチ位置を自由にする"
+#~ msgid "No of course not!"
+#~ msgstr "いいえ!"
 
-#~ msgid " KB/s"
-#~ msgstr " KB/秒"
+#~ msgid "Public Serverlist"
+#~ msgstr "公開サーバ一覧"
 
-#~ msgid " MB/s"
-#~ msgstr " MB/秒"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "ノーマルマップの生成"
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "ドライバーを変更するためMinetestを再起動します"
+#~ msgid "No!!!"
+#~ msgstr "いいえ!!!"
 
-#~ msgid "Rendering:"
-#~ msgstr "レンダリング:"
+#~ msgid "If disabled "
+#~ msgstr "無効化の場合 "
 
 #~ msgid "If enabled, "
 #~ msgstr "有効化の場合 "
 
-#~ msgid "If disabled "
-#~ msgstr "無効化の場合 "
+#~ msgid "Rendering:"
+#~ msgstr "レンダリング:"
 
-#~ msgid "No!!!"
-#~ msgstr "いいえ!!!"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "ドライバーを変更するためMinetestを再起動します"
 
-#~ msgid "Generate Normalmaps"
-#~ msgstr "ノーマルマップの生成"
+#~ msgid " MB/s"
+#~ msgstr " MB/秒"
 
-#~ msgid "Public Serverlist"
-#~ msgstr "公開サーバ一覧"
+#~ msgid " KB/s"
+#~ msgstr " KB/秒"
 
-#~ msgid "No of course not!"
-#~ msgstr "いいえ!"
+#~ msgid "Touch free target"
+#~ msgstr "タッチ位置を自由にする"
+
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "メニューの大きさとして設定されている数値: "
+
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "テクスチャ読み込み中..."
diff --git a/po/jbo/minetest.po b/po/jbo/minetest.po
index 522433c..12ac80a 100644
--- a/po/jbo/minetest.po
+++ b/po/jbo/minetest.po
@@ -7,11 +7,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
 "PO-Revision-Date: 2016-05-08 17:39+0000\n"
 "Last-Translator: senpi <saikos at openmailbox.org>\n"
-"Language-Team: Lojban "
-"<https://hosted.weblate.org/projects/minetest/minetest/jbo/>\n"
+"Language-Team: Lojban <https://hosted.weblate.org/projects/minetest/minetest/"
+"jbo/>\n"
 "Language: jbo\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -607,6 +607,10 @@ msgid "Particles"
 msgstr "lo kantu"
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "kraga'igau le za'e pavykelci munje"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr ""
 
@@ -964,6 +968,10 @@ msgstr ""
 msgid "Use"
 msgstr "mu'e pilno"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr ""
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "ko da'ergau le batke"
@@ -1280,10 +1288,6 @@ msgstr "la'o gy.X Button 1.gy."
 msgid "X Button 2"
 msgstr "la'o gy.X Button 2.gy."
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1351,6 +1355,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1425,6 +1433,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Backward key"
 msgstr "za'i ti'a muvdu"
@@ -1460,6 +1472,10 @@ msgid "Build inside player"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr ""
 
@@ -1501,6 +1517,11 @@ msgid "Chat toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "minde"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1577,14 +1598,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1735,6 +1756,10 @@ msgid "Default privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1751,6 +1776,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1781,14 +1810,6 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1801,6 +1822,18 @@ msgid "Disable anticheat"
 msgstr "lo kantu"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr ""
 
@@ -1825,6 +1858,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Enable VBO"
 msgstr "selpli"
@@ -1908,6 +1945,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -1969,11 +2014,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2108,12 +2163,14 @@ msgid "Generate normalmaps"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2144,6 +2201,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2172,15 +2238,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2274,6 +2331,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2309,6 +2400,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2469,6 +2568,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2504,7 +2610,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2656,6 +2762,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2690,8 +2811,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2701,8 +2820,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2713,8 +2830,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2724,8 +2839,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3084,6 +3197,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3125,17 +3246,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3147,10 +3272,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr ""
 
@@ -3192,10 +3313,6 @@ msgid "Mipmapping"
 msgstr "lo puvrmipmepi"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3400,11 +3517,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3412,7 +3535,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3448,6 +3571,10 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Right key"
 msgstr "za'i ri'u muvdu"
@@ -3613,7 +3740,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3651,7 +3778,7 @@ msgstr "lo xutla se gusni"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3731,10 +3858,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3750,6 +3889,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3765,6 +3910,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3869,10 +4020,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4002,7 +4149,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4102,19 +4249,16 @@ msgstr ""
 msgid "cURL timeout"
 msgstr ""
 
-#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr ".i ca'o samymo'i le tengu datnyvei"
+#~ msgid "No of course not!"
+#~ msgstr "nasai go'i"
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "kraga'igau le za'e pavykelci munje"
+#~ msgid "No!!!"
+#~ msgstr "nasai go'i"
 
 #, fuzzy
 #~ msgid "If enabled, "
 #~ msgstr "selpli"
 
-#~ msgid "No!!!"
-#~ msgstr "nasai go'i"
-
-#~ msgid "No of course not!"
-#~ msgstr "nasai go'i"
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr ".i ca'o samymo'i le tengu datnyvei"
diff --git a/po/ko/minetest.po b/po/ko/minetest.po
index bf5ba3d..9f1219d 100644
--- a/po/ko/minetest.po
+++ b/po/ko/minetest.po
@@ -2,34 +2,33 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
-#
 msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2015-07-08 23:30+0200\n"
-"Last-Translator: Tae Lim Kook <tkook11 at gmail.com>\n"
-"Language-Team: Korean <https://hosted.weblate.org/projects/minetest/minetest/"
-"ko/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-31 05:41+0000\n"
+"Last-Translator: Han So Ri <2_0_2_0_ at naver.com>\n"
+"Language-Team: Korean "
+"<https://hosted.weblate.org/projects/minetest/minetest/ko/>\n"
 "Language: ko\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 2.4-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr ""
+msgstr "Lua 스크립트에서 오류가 발생하였습니다. 해당 모드:"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
-msgstr ""
+msgstr "오류가 발생하였습니다:"
 
 #: builtin/fstk/ui.lua
 msgid "Main menu"
-msgstr ""
+msgstr "주 메뉴"
 
 #: builtin/fstk/ui.lua builtin/mainmenu/store.lua
 msgid "Ok"
@@ -37,39 +36,39 @@ msgstr "확인"
 
 #: builtin/fstk/ui.lua
 msgid "Reconnect"
-msgstr ""
+msgstr "재접속"
 
 #: builtin/fstk/ui.lua
 msgid "The server has requested a reconnect:"
-msgstr ""
+msgstr "재연결이 필요합니다:"
 
 #: builtin/mainmenu/common.lua src/game.cpp
 msgid "Loading..."
-msgstr ""
+msgstr "로딩중..."
 
 #: builtin/mainmenu/common.lua
 msgid "Protocol version mismatch. "
-msgstr ""
+msgstr "프로토콜 버전이 맞지 않습니다. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr ""
+msgstr "서버는 프로토콜 버전 $1 을(를) 사용합니다. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
-msgstr ""
+msgstr "서버는 프로토콜 버전 $1과(와) $2 사이를 제공합니다. "
 
 #: builtin/mainmenu/common.lua
 msgid "Try reenabling public serverlist and check your internet connection."
-msgstr ""
+msgstr "인터넷 연결을 확인한 후 서버 리스트를 확인하세요."
 
 #: builtin/mainmenu/common.lua
 msgid "We only support protocol version $1."
-msgstr ""
+msgstr "프로토콜 버전 $1만 제공합니다."
 
 #: builtin/mainmenu/common.lua
 msgid "We support protocol versions between version $1 and $2."
-msgstr ""
+msgstr "프로토콜 버전 $1과(와) $2 사이를 제공합니다."
 
 #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -85,33 +84,33 @@ msgstr ""
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Disable MP"
-msgstr ""
+msgstr "MP 미적용"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Enable MP"
-msgstr ""
+msgstr "MP 적용"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Enable all"
-msgstr ""
+msgstr "모두 적용"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid ""
 "Failed to enable mod \"$1\" as it contains disallowed characters. Only "
 "chararacters [a-z0-9_] are allowed."
-msgstr ""
+msgstr "\"$1\"는(은) 허락되지 않은 캐릭터로 사용할 수 없습니다. [a-z0-9_]만 사용할 수 있습니다."
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide Game"
-msgstr ""
+msgstr "숨겨진 게임"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide mp content"
-msgstr ""
+msgstr "숨겨진 맵 콘텐츠"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Mod:"
-msgstr ""
+msgstr "모드:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
@@ -120,131 +119,133 @@ msgstr "저장"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "World:"
-msgstr ""
+msgstr "월드:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "enabled"
-msgstr ""
+msgstr "적용"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "A world named \"$1\" already exists"
-msgstr ""
+msgstr "\"$1\" 는(은) 이미 존재합니다"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Create"
-msgstr ""
+msgstr "만들기"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr ""
+msgstr "minetest.net 에서 minetest_game같은 서브게임을 다운로드 하세요"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download one from minetest.net"
-msgstr ""
+msgstr "minetest.net 에서 다운로드 하세요"
 
 #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
 msgid "Game"
-msgstr ""
+msgstr "게임"
 
 #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
 msgid "Mapgen"
-msgstr ""
+msgstr "맵젠"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "No worldname given or no game selected"
-msgstr ""
+msgstr "게임을 선택하지 않았거나 게임 이름이 없습니다"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Seed"
-msgstr ""
+msgstr "시드"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Warning: The minimal development test is meant for developers."
-msgstr ""
+msgstr "경고: 최소한의 개발 테스트는 개발자를 위한 것입니다."
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "World name"
-msgstr ""
+msgstr "월드 이름"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "You have no subgames installed."
-msgstr ""
+msgstr "서브게임을 설치하지 않았습니다."
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Are you sure you want to delete \"$1\"?"
-msgstr ""
+msgstr "$1 를(을) 삭제하겠습니까?"
 
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 #: src/keycode.cpp
 msgid "Delete"
-msgstr ""
+msgstr "삭제"
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Modmgr: failed to delete \"$1\""
-msgstr ""
+msgstr "Modmgr: \"$1\"를(을) 삭제할 수 없습니다"
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Modmgr: invalid modpath \"$1\""
-msgstr ""
+msgstr "Modmgr: \"$1\" 를(을) 인식할 수 없습니다"
 
 #: builtin/mainmenu/dlg_delete_world.lua
 msgid "Delete World \"$1\"?"
-msgstr ""
+msgstr "\"$1\"를(을) 삭제하겠습니까?"
 
 #: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp
 msgid "Accept"
-msgstr ""
+msgstr "확인"
 
 #: builtin/mainmenu/dlg_rename_modpack.lua
 msgid "Rename Modpack:"
-msgstr ""
+msgstr "모드팩 이름바꾸기:"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "\"$1\" is not a valid flag."
-msgstr ""
+msgstr "\"$1\" 는(은) 유효한 플래그가 아닙니다."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "(No description of setting given)"
-msgstr ""
+msgstr "(설정의 설명이 없습니다)"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "< Back to Settings page"
-msgstr ""
+msgstr "설정 페이지로 돌아가기"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Browse"
-msgstr ""
+msgstr "열기"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Disabled"
-msgstr ""
+msgstr "적용 안함"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Edit"
-msgstr ""
+msgstr "수정"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Enabled"
-msgstr ""
+msgstr "적용"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Format is 3 numbers separated by commas and inside brackets."
-msgstr ""
+msgstr "3개의 수가 쉼표와 괄호로 구분되는 형식입니다."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid ""
 "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
 "<octaves>, <persistence>"
 msgstr ""
+"형식: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, <octaves>, "
+"<persistence>"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Games"
-msgstr ""
+msgstr "게임"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
 msgid "Mods"
-msgstr ""
+msgstr "모드"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Optionally the lacunarity can be appended with a leading comma."
@@ -252,61 +253,63 @@ msgstr ""
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a comma seperated list of flags."
-msgstr ""
+msgstr "플래그의 리스트를 쉼표로 구분하여 입력 하십시오."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a valid integer."
-msgstr ""
+msgstr "유효한 정수를 입력해주세요."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a valid number."
-msgstr ""
+msgstr "유효한 숫자를 입력해주세요."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Possible values are: "
-msgstr ""
+msgstr "가능한 값: "
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Restore Default"
-msgstr ""
+msgstr "기본값 복원"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Select path"
-msgstr ""
+msgstr "경로 선택"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Show technical names"
-msgstr ""
+msgstr "기술적 이름 보기"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "The value must be greater than $1."
-msgstr ""
+msgstr "값은 $1 (이)보다 커야 합니다."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "The value must be lower than $1."
-msgstr ""
+msgstr "값은 $1 (이)보다 더 낮아야합니다."
 
 #: builtin/mainmenu/modmgr.lua
 msgid ""
 "\n"
 "Install Mod: unsupported filetype \"$1\" or broken archive"
 msgstr ""
+"\n"
+"설치 모드: \"$1\"는(은) 지원 되지 않는 파일 형식 이거나 깨진 압축 파일입니다"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Failed to install $1 to $2"
-msgstr ""
+msgstr "$1에서 $2는(은) 설치 할 수 없습니다"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: file: \"$1\""
-msgstr ""
+msgstr "설치 모드: 파일: \"$1\""
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: unable to find real modname for: $1"
-msgstr ""
+msgstr "설치 모드: $1를(을) 찾을 수 없습니다"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: unable to find suitable foldername for modpack $1"
-msgstr ""
+msgstr "설치 모드: 모드 팩 $1 (이)의 올바른 폴더를 찾을 수 없습니다"
 
 #: builtin/mainmenu/store.lua
 msgid "Close store"
@@ -314,123 +317,123 @@ msgstr ""
 
 #: builtin/mainmenu/store.lua
 msgid "Downloading $1, please wait..."
-msgstr ""
+msgstr "$1 를(을) 다운로드중입니다. 기다려주세요..."
 
 #: builtin/mainmenu/store.lua
 msgid "Install"
-msgstr ""
+msgstr "설치"
 
 #: builtin/mainmenu/store.lua
 msgid "Page $1 of $2"
-msgstr ""
+msgstr "$2페이지 중 $1"
 
 #: builtin/mainmenu/store.lua
 msgid "Rating"
-msgstr ""
+msgstr "순위"
 
 #: builtin/mainmenu/store.lua
 msgid "Search"
-msgstr ""
+msgstr "검색"
 
 #: builtin/mainmenu/store.lua
 msgid "Shortname:"
-msgstr ""
+msgstr "짧은 이름:"
 
 #: builtin/mainmenu/store.lua
 msgid "Successfully installed:"
-msgstr ""
+msgstr "설치 완료:"
 
 #: builtin/mainmenu/store.lua
 msgid "Unsorted"
-msgstr ""
+msgstr "기타"
 
 #: builtin/mainmenu/store.lua
 msgid "re-Install"
-msgstr ""
+msgstr "재설치"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Active Contributors"
-msgstr ""
+msgstr "활동적인 공헌자"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Core Developers"
-msgstr ""
+msgstr "코어 개발자"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Credits"
-msgstr ""
+msgstr "만든이"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Previous Contributors"
-msgstr ""
+msgstr "이전 공헌자들"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Previous Core Developers"
-msgstr ""
+msgstr "이전 코어 개발자들"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Installed Mods:"
-msgstr ""
+msgstr "설치한 모드:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Mod information:"
-msgstr ""
+msgstr "모드 정보:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "No mod description available"
-msgstr ""
+msgstr "모드 설명이 없습니다"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Rename"
-msgstr ""
+msgstr "이름 바꾸기"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Select Mod File:"
-msgstr ""
+msgstr "선택한 모드 파일:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Uninstall selected mod"
-msgstr ""
+msgstr "선택한 모드 삭제"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Uninstall selected modpack"
-msgstr ""
+msgstr "선택한 모드팩 삭제"
 
 #: builtin/mainmenu/tab_multiplayer.lua
 msgid "Address / Port"
-msgstr ""
+msgstr "주소/포트"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
-msgstr ""
+msgstr "클라이언트"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Connect"
-msgstr ""
+msgstr "연결"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Creative mode"
-msgstr ""
+msgstr "크리에이티브 모드"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Damage enabled"
-msgstr ""
+msgstr "데미지를 입을 수 있습니다"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Del. Favorite"
-msgstr ""
+msgstr "즐겨찾기 삭제"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Favorite"
-msgstr ""
+msgstr "즐겨찾기"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Name / Password"
-msgstr ""
+msgstr "이름/비밀번호"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
-msgstr ""
+msgstr "PvP 가능"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Bind Address"
@@ -438,93 +441,93 @@ msgstr ""
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "Configure"
-msgstr ""
+msgstr "환경설정"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
 #: builtin/mainmenu/tab_singleplayer.lua
 msgid "Creative Mode"
-msgstr ""
+msgstr "크리에이티브 모드"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
 #: builtin/mainmenu/tab_singleplayer.lua
 msgid "Enable Damage"
-msgstr ""
+msgstr "데미지를 받을 수 있습니다"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Name/Password"
-msgstr ""
+msgstr "이름/비밀번호"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "New"
-msgstr ""
+msgstr "새로 만들기"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "No world created or selected!"
-msgstr ""
+msgstr "월드를 만들거나 선택하지 않았습니다!"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Port"
-msgstr ""
+msgstr "포트"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Public"
-msgstr ""
+msgstr "일반"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "Select World:"
-msgstr ""
+msgstr "비밀 월드:"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Server"
-msgstr ""
+msgstr "서버"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Server Port"
-msgstr ""
+msgstr "서버 포트"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Start Game"
-msgstr ""
+msgstr "게임 시작"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "2x"
-msgstr ""
+msgstr "2 x"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "3D Clouds"
-msgstr ""
+msgstr "3D 구름 효과"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "4x"
-msgstr ""
+msgstr "4 x"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "8x"
-msgstr ""
+msgstr "8 배속"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Advanced Settings"
-msgstr ""
+msgstr "고급 설정"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Antialiasing:"
-msgstr ""
+msgstr "매끄럽게 표현하기:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Are you sure to reset your singleplayer world?"
-msgstr ""
+msgstr "싱글 플레이어 월드를 다시 시작하겠습니까?"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Bilinear Filter"
-msgstr ""
+msgstr "이중 선형 필터"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Bump Mapping"
-msgstr ""
+msgstr "범프 매핑"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Change keys"
-msgstr ""
+msgstr "키 변경"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Connected Glass"
@@ -532,11 +535,11 @@ msgstr ""
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Fancy Leaves"
-msgstr ""
+msgstr "아름다운 나무 효과"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Mipmap"
-msgstr ""
+msgstr "밉 맵"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Mipmap + Aniso. Filter"
@@ -544,39 +547,39 @@ msgstr ""
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No"
-msgstr ""
+msgstr "아니오"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No Filter"
-msgstr ""
+msgstr "필터 없음"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No Mipmap"
-msgstr ""
+msgstr "밉 맵 없음"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Node Highlighting"
-msgstr ""
+msgstr "Node 강조"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Node Outlining"
-msgstr ""
+msgstr "Node 설명"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
-msgstr ""
+msgstr "없음"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Normal Mapping"
-msgstr ""
+msgstr "노멀 매핑"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
-msgstr ""
+msgstr "불투명한 나뭇잎 효과"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Water"
-msgstr ""
+msgstr "불투명한 물 효과"
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Parallax Occlusion"
@@ -584,143 +587,147 @@ msgstr ""
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Particles"
-msgstr ""
+msgstr "입자 효과"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "싱글 플레이어 월드 다시 시작"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
-msgstr ""
+msgstr "설정"
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Shaders"
-msgstr ""
+msgstr "쉐이더"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Simple Leaves"
-msgstr ""
+msgstr "단순한 나뭇잎 효과"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Smooth Lighting"
-msgstr ""
+msgstr "부드러운 조명 효과"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Texturing:"
-msgstr ""
+msgstr "질감:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr ""
+msgstr "쉐이더를 사용하려면 OpenGL 드라이버를 사용할 필요가 있습니다."
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Tone Mapping"
-msgstr ""
+msgstr "톤 매핑"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Touchthreshold (px)"
-msgstr ""
+msgstr "터치임계값 (픽셀)"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Trilinear Filter"
-msgstr ""
+msgstr "선형 필터"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Waving Leaves"
-msgstr ""
+msgstr "움직이는 나뭇잎 효과"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Waving Plants"
-msgstr ""
+msgstr "움직이는 식물 효과"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Waving Water"
-msgstr ""
+msgstr "물결 효과"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Yes"
-msgstr ""
+msgstr "예"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Config mods"
-msgstr ""
+msgstr "모드 설정"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Main"
-msgstr ""
+msgstr "메인"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Start Singleplayer"
-msgstr ""
+msgstr "싱글 플레이어 시작"
 
 #: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
 msgid "Play"
-msgstr ""
+msgstr "시작"
 
 #: builtin/mainmenu/tab_singleplayer.lua
 msgid "Singleplayer"
-msgstr ""
+msgstr "싱글 플레이어"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "No information available"
-msgstr ""
+msgstr "정보가 없습니다"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "Select texture pack:"
-msgstr ""
+msgstr "선택한 텍스쳐 팩:"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "Texturepacks"
-msgstr ""
+msgstr "텍스쳐 팩"
 
 #: src/client.cpp
 msgid "Connection timed out."
-msgstr ""
+msgstr "연결 시간이 초과했습니다."
 
 #: src/client.cpp
 msgid "Done!"
-msgstr ""
+msgstr "실행 중입니다!"
 
 #: src/client.cpp
 msgid "Initializing nodes"
-msgstr ""
+msgstr "node 초기값 설정중"
 
 #: src/client.cpp
 msgid "Initializing nodes..."
-msgstr ""
+msgstr "node 초기값 설정중..."
 
 #: src/client.cpp
 msgid "Loading textures..."
-msgstr ""
+msgstr "텍스쳐 로딩중..."
 
 #: src/client.cpp
 msgid "Rebuilding shaders..."
-msgstr ""
+msgstr "쉐이더 개축중..."
 
 #: src/client/clientlauncher.cpp
 msgid "Connection error (timed out?)"
-msgstr ""
+msgstr "연결 오류 (시간초과)"
 
 #: src/client/clientlauncher.cpp
 msgid "Could not find or load game \""
-msgstr ""
+msgstr "게임을 찾지 못했거나 로딩할 수 없습니다\""
 
 #: src/client/clientlauncher.cpp
 msgid "Invalid gamespec."
-msgstr ""
+msgstr "인식할 수 없는 게임 사양입니다."
 
 #: src/client/clientlauncher.cpp
 msgid "Main Menu"
-msgstr ""
+msgstr "주 메뉴"
 
 #: src/client/clientlauncher.cpp
 msgid "No world selected and no address provided. Nothing to do."
-msgstr ""
+msgstr "월드를 선택하지 않아 주소를 받을 수 없습니다."
 
 #: src/client/clientlauncher.cpp
 msgid "Player name too long."
-msgstr ""
+msgstr "이름이 너무 깁니다."
 
 #: src/client/clientlauncher.cpp
 msgid "Provided world path doesn't exist: "
-msgstr ""
+msgstr "월드가 존재하지 않습니다: "
 
 #: src/fontengine.cpp
 msgid "needs_fallback_font"
@@ -731,30 +738,32 @@ msgid ""
 "\n"
 "Check debug.txt for details."
 msgstr ""
+"\n"
+"자세한 내용은 debug.txt을 확인 합니다."
 
 #: src/game.cpp
 msgid "Change Keys"
-msgstr ""
+msgstr "키 변경"
 
 #: src/game.cpp
 msgid "Change Password"
-msgstr ""
+msgstr "비밀번호 변경"
 
 #: src/game.cpp
 msgid "Connecting to server..."
-msgstr ""
+msgstr "서버 연결중..."
 
 #: src/game.cpp
 msgid "Continue"
-msgstr ""
+msgstr "계속"
 
 #: src/game.cpp
 msgid "Creating client..."
-msgstr ""
+msgstr "클라이언트 만드는 중..."
 
 #: src/game.cpp
 msgid "Creating server..."
-msgstr ""
+msgstr "서버 만드는 중..."
 
 #: src/game.cpp
 msgid ""
@@ -770,6 +779,16 @@ msgid ""
 "- Mouse wheel: select item\n"
 "- T: chat\n"
 msgstr ""
+"기본 컨트롤:-WASD: 이동\n"
+"-스페이스: 점프/오르기\n"
+"-쉬프트:살금살금/내려가기\n"
+"-Q: 아이템 드롭\n"
+"-I: 인벤토리\n"
+"-마우스: 돌아보기/보기\n"
+"-마우스 왼쪽: 파내기/공격\n"
+"-마우스 오른쪽: 배치/사용\n"
+"-마우스 휠: 아이템 선택\n"
+"-T: 채팅\n"
 
 #: src/game.cpp
 msgid ""
@@ -786,86 +805,98 @@ msgid ""
 "- touch&drag, tap 2nd finger\n"
 " --> place single item to slot\n"
 msgstr ""
+"기본 컨트롤: \n"
+"표시가 없는 메뉴:\n"
+"- 단일 탭: 버튼 활성화\n"
+"- 더블 탭: 배치/사용\n"
+"- 드래그: 둘러보기\n"
+" 메뉴/인벤토리:\n"
+"- 더블 탭 (외부):\n"
+" -->닫기\n"
+"- 무더기(stack) 터치, 슬롯 터치: \n"
+" --> 무더기(stack) 이동 \n"
+"- 터치 및 드래그, 검지로 탭\n"
+" --> 슬롯에 한개의 아이템 배치\n"
 
 #: src/game.cpp
 msgid "Exit to Menu"
-msgstr ""
+msgstr "메뉴 나가기"
 
 #: src/game.cpp
 msgid "Exit to OS"
-msgstr ""
+msgstr "게임 종료"
 
 #: src/game.cpp
 msgid "Item definitions..."
-msgstr ""
+msgstr "아이템 정의중..."
 
 #: src/game.cpp
 msgid "KiB/s"
-msgstr ""
+msgstr "KiB/s"
 
 #: src/game.cpp
 msgid "Media..."
-msgstr ""
+msgstr "미디어..."
 
 #: src/game.cpp
 msgid "MiB/s"
-msgstr ""
+msgstr "MiB/s"
 
 #: src/game.cpp
 msgid "Node definitions..."
-msgstr ""
+msgstr "Node 정의중..."
 
 #: src/game.cpp
 msgid "Resolving address..."
-msgstr ""
+msgstr "주소 분석중..."
 
 #: src/game.cpp
 msgid "Respawn"
-msgstr ""
+msgstr "리스폰"
 
 #: src/game.cpp
 msgid "Shutting down..."
-msgstr ""
+msgstr "서버가 닫혔습니다..."
 
 #: src/game.cpp
 msgid "Sound Volume"
-msgstr ""
+msgstr "볼륨 조절"
 
 #: src/game.cpp
 msgid "You died."
-msgstr ""
+msgstr "당신은 죽었습니다."
 
 #: src/game.cpp src/guiFormSpecMenu.cpp
 msgid "ok"
-msgstr ""
+msgstr "확인"
 
 #: src/guiFormSpecMenu.cpp
 msgid "Enter "
-msgstr ""
+msgstr "들어가기 "
 
 #: src/guiFormSpecMenu.cpp
 msgid "Proceed"
-msgstr ""
+msgstr "계속하기"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "\"Use\" = climb down"
-msgstr ""
+msgstr "\"Use\" = 내려가기"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Backward"
-msgstr ""
+msgstr "뒤로"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Chat"
-msgstr ""
+msgstr "채팅"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Command"
-msgstr ""
+msgstr "명령어"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Console"
-msgstr ""
+msgstr "콘솔"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Double tap \"jump\" to toggle fly"
@@ -873,31 +904,31 @@ msgstr ""
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Drop"
-msgstr ""
+msgstr "떨어뜨리기"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Forward"
-msgstr ""
+msgstr "앞으로"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Inventory"
-msgstr ""
+msgstr "인벤토리"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Jump"
-msgstr ""
+msgstr "점프"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Key already in use"
-msgstr ""
+msgstr "이미 사용하고 있는 키입니다"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
-msgstr ""
+msgstr "Keybindings. (이 메뉴를 고정하려면 minetest.cof에서 stuff를 제거해야합니다.)"
 
 #: src/guiKeyChangeMenu.cpp src/keycode.cpp
 msgid "Left"
-msgstr ""
+msgstr "왼쪽"
 
 #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
 msgid "Print stacks"
@@ -905,83 +936,87 @@ msgstr ""
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Range select"
-msgstr ""
+msgstr "범위 선택"
 
 #: src/guiKeyChangeMenu.cpp src/keycode.cpp
 msgid "Right"
-msgstr ""
+msgstr "오른쪽"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Sneak"
-msgstr ""
+msgstr "살금살금"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle Cinematic"
-msgstr ""
+msgstr "시네마틱 스위치"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle fast"
-msgstr ""
+msgstr "고속 스위치"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle fly"
-msgstr ""
+msgstr "비행 스위치"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle noclip"
-msgstr ""
+msgstr "자유시점 스위치"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Use"
-msgstr ""
+msgstr "사용"
+
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "확대/축소"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
-msgstr ""
+msgstr "키를 누르세요"
 
 #: src/guiPasswordChange.cpp
 msgid "Change"
-msgstr ""
+msgstr "변경"
 
 #: src/guiPasswordChange.cpp
 msgid "Confirm Password"
-msgstr ""
+msgstr "비밀번호 확인"
 
 #: src/guiPasswordChange.cpp
 msgid "New Password"
-msgstr ""
+msgstr "새로운 비밀번호"
 
 #: src/guiPasswordChange.cpp
 msgid "Old Password"
-msgstr ""
+msgstr "현재 비밀번호"
 
 #: src/guiPasswordChange.cpp
 msgid "Passwords do not match!"
-msgstr ""
+msgstr "비밀번호가 맞지 않습니다!"
 
 #: src/guiVolumeChange.cpp
 msgid "Exit"
-msgstr ""
+msgstr "나가기"
 
 #: src/guiVolumeChange.cpp
 msgid "Sound Volume: "
-msgstr ""
+msgstr "볼륨 조절: "
 
 #: src/keycode.cpp
 msgid "Apps"
-msgstr ""
+msgstr "애플 리 케이 션"
 
 #: src/keycode.cpp
 msgid "Attn"
-msgstr ""
+msgstr "담당자"
 
 #: src/keycode.cpp
 msgid "Back"
-msgstr ""
+msgstr "뒤로"
 
 #: src/keycode.cpp
 msgid "Capital"
-msgstr ""
+msgstr "자본"
 
 #: src/keycode.cpp
 msgid "Clear"
@@ -989,7 +1024,7 @@ msgstr ""
 
 #: src/keycode.cpp
 msgid "Comma"
-msgstr ""
+msgstr "쉼표"
 
 #: src/keycode.cpp
 msgid "Control"
@@ -997,7 +1032,7 @@ msgstr ""
 
 #: src/keycode.cpp
 msgid "Convert"
-msgstr ""
+msgstr "변환"
 
 #: src/keycode.cpp
 msgid "CrSel"
@@ -1009,7 +1044,7 @@ msgstr ""
 
 #: src/keycode.cpp
 msgid "End"
-msgstr ""
+msgstr "끝"
 
 #: src/keycode.cpp
 msgid "Erase OEF"
@@ -1025,23 +1060,23 @@ msgstr ""
 
 #: src/keycode.cpp
 msgid "Execute"
-msgstr ""
+msgstr "실행"
 
 #: src/keycode.cpp
 msgid "Final"
-msgstr ""
+msgstr "최종"
 
 #: src/keycode.cpp
 msgid "Help"
-msgstr ""
+msgstr "도움말"
 
 #: src/keycode.cpp
 msgid "Home"
-msgstr ""
+msgstr "Home"
 
 #: src/keycode.cpp
 msgid "Insert"
-msgstr ""
+msgstr "Insert"
 
 #: src/keycode.cpp
 msgid "Junja"
@@ -1057,107 +1092,109 @@ msgstr ""
 
 #: src/keycode.cpp
 msgid "Left Button"
-msgstr ""
+msgstr "왼쪽된 버튼"
 
 #: src/keycode.cpp
 msgid "Left Control"
-msgstr ""
+msgstr "왼쪽 컨트롤"
 
 #: src/keycode.cpp
 msgid "Left Menu"
-msgstr ""
+msgstr "왼쪽 메뉴"
 
 #: src/keycode.cpp
 msgid "Left Shift"
-msgstr ""
+msgstr "왼쪽 쉬프트"
 
 #: src/keycode.cpp
 msgid "Left Windows"
-msgstr ""
+msgstr "왼쪽 창"
 
 #: src/keycode.cpp
 msgid "Menu"
-msgstr ""
+msgstr "메뉴"
 
 #: src/keycode.cpp
 msgid "Middle Button"
-msgstr ""
+msgstr "가운데 버튼"
 
 #: src/keycode.cpp
 msgid "Minus"
-msgstr ""
+msgstr "마이너스"
 
 #: src/keycode.cpp
 msgid "Mode Change"
-msgstr ""
+msgstr "모드 변경"
 
 #: src/keycode.cpp
 msgid "Next"
-msgstr ""
+msgstr "다음"
 
 #: src/keycode.cpp
+#, fuzzy
 msgid "Nonconvert"
-msgstr ""
+msgstr "변환 안함"
 
 #: src/keycode.cpp
+#, fuzzy
 msgid "Num Lock"
-msgstr ""
+msgstr "Num Lock"
 
 #: src/keycode.cpp
 msgid "Numpad *"
-msgstr ""
+msgstr "숫자 키패드 *"
 
 #: src/keycode.cpp
 msgid "Numpad +"
-msgstr ""
+msgstr "숫자 키패드 +"
 
 #: src/keycode.cpp
 msgid "Numpad -"
-msgstr ""
+msgstr "숫자 키패드 -"
 
 #: src/keycode.cpp
 msgid "Numpad /"
-msgstr ""
+msgstr "숫자 키패드 /"
 
 #: src/keycode.cpp
 msgid "Numpad 0"
-msgstr ""
+msgstr "숫자 키패드 0"
 
 #: src/keycode.cpp
 msgid "Numpad 1"
-msgstr ""
+msgstr "숫자 키패드 1"
 
 #: src/keycode.cpp
 msgid "Numpad 2"
-msgstr ""
+msgstr "숫자 키패드 2"
 
 #: src/keycode.cpp
 msgid "Numpad 3"
-msgstr ""
+msgstr "숫자 키패드 3"
 
 #: src/keycode.cpp
 msgid "Numpad 4"
-msgstr ""
+msgstr "숫자 키패드 4"
 
 #: src/keycode.cpp
 msgid "Numpad 5"
-msgstr ""
+msgstr "숫자 키패드 5"
 
 #: src/keycode.cpp
 msgid "Numpad 6"
-msgstr ""
+msgstr "숫자 키패드 6"
 
 #: src/keycode.cpp
 msgid "Numpad 7"
-msgstr ""
+msgstr "숫자 키패드 7"
 
 #: src/keycode.cpp
 msgid "Numpad 8"
-msgstr ""
+msgstr "숫자 키패드 8"
 
 #: src/keycode.cpp
 msgid "Numpad 9"
-msgstr ""
+msgstr "숫자 키패드 9"
 
 #: src/keycode.cpp
 msgid "OEM Clear"
@@ -1168,76 +1205,81 @@ msgid "PA1"
 msgstr ""
 
 #: src/keycode.cpp
+#, fuzzy
 msgid "Pause"
-msgstr ""
+msgstr "일시 중지"
 
 #: src/keycode.cpp
 msgid "Period"
-msgstr ""
+msgstr "기간"
 
 #: src/keycode.cpp
 msgid "Plus"
-msgstr ""
+msgstr "플러스"
 
 #: src/keycode.cpp
+#, fuzzy
 msgid "Print"
-msgstr ""
+msgstr "인쇄"
 
 #: src/keycode.cpp
 msgid "Prior"
-msgstr ""
+msgstr "이전"
 
 #: src/keycode.cpp
 msgid "Return"
-msgstr ""
+msgstr "되돌리기"
 
 #: src/keycode.cpp
 msgid "Right Button"
-msgstr ""
+msgstr "오른쪽 버튼"
 
 #: src/keycode.cpp
 msgid "Right Control"
-msgstr ""
+msgstr "오른쪽 컨트롤"
 
 #: src/keycode.cpp
 msgid "Right Menu"
-msgstr ""
+msgstr "오른쪽 메뉴"
 
 #: src/keycode.cpp
 msgid "Right Shift"
-msgstr ""
+msgstr "오른쪽 쉬프트"
 
 #: src/keycode.cpp
 msgid "Right Windows"
-msgstr ""
+msgstr "오른쪽 창"
 
 #: src/keycode.cpp
+#, fuzzy
 msgid "Scroll Lock"
-msgstr ""
+msgstr "스크롤 락"
 
 #: src/keycode.cpp
 msgid "Select"
-msgstr ""
+msgstr "선택"
 
 #: src/keycode.cpp
 msgid "Shift"
-msgstr ""
+msgstr "쉬프트"
 
 #: src/keycode.cpp
 msgid "Sleep"
-msgstr ""
+msgstr "잠자기"
 
 #: src/keycode.cpp
+#, fuzzy
 msgid "Snapshot"
-msgstr ""
+msgstr "스냅숏"
 
 #: src/keycode.cpp
+#, fuzzy
 msgid "Space"
-msgstr ""
+msgstr "스페이스"
 
 #: src/keycode.cpp
 msgid "Tab"
-msgstr ""
+msgstr "탭"
 
 #: src/keycode.cpp
 msgid "Up"
@@ -1251,10 +1293,6 @@ msgstr ""
 msgid "X Button 2"
 msgstr ""
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1272,13 +1310,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "3D clouds"
-msgstr ""
+msgstr "3D 구름 효과"
 
 #: src/settings_translation_file.cpp
 msgid "3D mode"
-msgstr ""
+msgstr "3D 모드"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "3D support.\n"
 "Currently supported:\n"
@@ -1289,20 +1328,30 @@ msgid ""
 "-    sidebyside: split screen side by side.\n"
 "-    pageflip: quadbuffer based 3d."
 msgstr ""
+"3D 지원.\n"
+"현재 지원되는 것:\n"
+"- 없음: 3d 출력 없음.\n"
+"- 입체 사진: 청록색/자홍색 3d.\n"
+"- interlaced: odd/even line based polarisation screen support.↵\n"
+"- topbottom: split screen top/bottom.↵\n"
+"- sidebyside: split screen side by side.↵\n"
+"- pageflip: quadbuffer based 3d."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "A chosen map seed for a new map, leave empty for random.\n"
 "Will be overridden when creating a new world in the main menu."
 msgstr ""
+"새로운 맵을 위해 선택한 맵 시드가 무작위로 비워져있다면\n"
+"메인메뉴에서 새로운 월드를 만들때 재정의 될 것입니다."
 
 #: src/settings_translation_file.cpp
 msgid "A message to be displayed to all clients when the server crashes."
-msgstr ""
+msgstr "서버 충돌 하는 경우 모든 사용자들에게 표시 될 메시지입니다."
 
 #: src/settings_translation_file.cpp
 msgid "A message to be displayed to all clients when the server shuts down."
-msgstr ""
+msgstr "서버가 닫힐 때 모든 사용자들에게 표시 될 메시지입니다."
 
 #: src/settings_translation_file.cpp
 msgid "Absolute limit of emerge queues"
@@ -1321,8 +1370,12 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "블록 수식어 활성"
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
-msgstr ""
+msgstr "블록 범위 활성"
 
 #: src/settings_translation_file.cpp
 msgid "Active object send range"
@@ -1364,23 +1417,28 @@ msgid "Ambient occlusion gamma"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Amplifies the valleys"
-msgstr ""
+msgstr "계곡 증폭"
 
 #: src/settings_translation_file.cpp
 msgid "Anisotropic filtering"
-msgstr ""
+msgstr "이방성 필터링"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Announce server"
-msgstr ""
+msgstr "서버 발표"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Announce to this serverlist.\n"
 "If you want to announce your ipv6 address, use  serverlist_url = v6.servers."
 "minetest.net."
 msgstr ""
+"서버리스트에 발표합니다.\n"
+"만약 당신의 Ipv6 주소를 알리기 원한다면 serverlist_url = v6.servers.minetest.net 을 사용하세요."
 
 #: src/settings_translation_file.cpp
 msgid "Approximate (X,Y,Z) scale of fractal in nodes."
@@ -1388,31 +1446,35 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Ask to reconnect after crash"
-msgstr ""
+msgstr "충돌 후 재연결 요청"
 
 #: src/settings_translation_file.cpp
 msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Backward key"
+msgid "Autorun key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Backward key"
+msgstr "뒤로 이동하는 키"
+
+#: src/settings_translation_file.cpp
 msgid "Base terrain height"
-msgstr ""
+msgstr "기본 지형 높이"
 
 #: src/settings_translation_file.cpp
 msgid "Basic"
-msgstr ""
+msgstr "기본"
 
 #: src/settings_translation_file.cpp
 msgid "Basic Privileges"
-msgstr ""
+msgstr "기본 권한"
 
 #: src/settings_translation_file.cpp
 msgid "Bilinear filtering"
-msgstr ""
+msgstr "이중 선형 필터링"
 
 #: src/settings_translation_file.cpp
 msgid "Bind address"
@@ -1427,6 +1489,10 @@ msgid "Build inside player"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr ""
 
@@ -1444,15 +1510,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Cave noise #1"
-msgstr ""
+msgstr "동굴 잡음 #1"
 
 #: src/settings_translation_file.cpp
 msgid "Cave noise #2"
-msgstr ""
+msgstr "동굴 잡음 #2"
 
 #: src/settings_translation_file.cpp
 msgid "Cave width"
-msgstr ""
+msgstr "동굴 너비"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1460,11 +1526,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Chat key"
-msgstr ""
+msgstr "채팅"
 
 #: src/settings_translation_file.cpp
 msgid "Chat toggle key"
-msgstr ""
+msgstr "채팅 스위치"
+
+#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "채팅 명렁어"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1490,40 +1560,42 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Chunk size"
-msgstr ""
+msgstr "덩어리 크기"
 
 #: src/settings_translation_file.cpp
 msgid "Cinematic mode"
-msgstr ""
+msgstr "시네마틱 모드"
 
 #: src/settings_translation_file.cpp
 msgid "Cinematic mode key"
-msgstr ""
+msgstr "시네마틱 모드 스위치"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Clean transparent textures"
-msgstr ""
+msgstr "깨끗하고 투명한 텍스처"
 
 #: src/settings_translation_file.cpp
 msgid "Client and Server"
-msgstr ""
+msgstr "클라이언트와 서버"
 
 #: src/settings_translation_file.cpp
 msgid "Climbing speed"
-msgstr ""
+msgstr "오르기 속도"
 
 #: src/settings_translation_file.cpp
 msgid "Cloud height"
-msgstr ""
+msgstr "구름 높이"
 
 #: src/settings_translation_file.cpp
 msgid "Cloud radius"
-msgstr ""
+msgstr "구름 반지름"
 
 #: src/settings_translation_file.cpp
 msgid "Clouds"
-msgstr ""
+msgstr "구름"
 
 #: src/settings_translation_file.cpp
 msgid "Clouds are a client side effect."
@@ -1535,23 +1607,26 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Colored fog"
-msgstr ""
+msgstr "색깔있는 안개"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
+"쉼표로 구분된 모드의 리스트는 HTTP API에 접근 할 수 있습니다.\n"
+"인터넷에서 데이터를 다운로드 하거나 업로드 할 수 있습니다."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Command key"
-msgstr ""
+msgstr "명령 키"
 
 #: src/settings_translation_file.cpp
 msgid "Connect glass"
@@ -1616,7 +1691,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
-msgstr ""
+msgstr "충돌 메시지"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1652,11 +1727,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "DPI"
-msgstr ""
+msgstr "감도(DPI)"
 
 #: src/settings_translation_file.cpp
 msgid "Damage"
-msgstr ""
+msgstr "데미지"
 
 #: src/settings_translation_file.cpp
 msgid "Debug info toggle key"
@@ -1676,20 +1751,27 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Default game"
-msgstr ""
+msgstr "기본 게임"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Default game when creating a new world.\n"
 "This will be overridden when creating a world from the main menu."
 msgstr ""
+"새로운 월드를 만들 때 기본 게임으로 시작합니다.\n"
+"주 메뉴에서 월드를 만들 때 재정의 될 것입니다."
 
 #: src/settings_translation_file.cpp
 msgid "Default password"
-msgstr ""
+msgstr "기본 비밀 번호"
 
 #: src/settings_translation_file.cpp
 msgid "Default privileges"
+msgstr "기본 권한"
+
+#: src/settings_translation_file.cpp
+msgid "Default report format"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1699,14 +1781,22 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Defines sampling step of texture.\n"
 "A higher value results in smoother normal maps."
 msgstr ""
+"텍스처의 샘플링 단계를 정의합니다.\n"
+"일반 맵에 부드럽게 높은 값을 나타냅니다."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
-msgstr ""
+msgstr "블록에 최대 플레이어 전송 거리를 정의 합니다 (0 = 무제한)."
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "건축 후 블록 전송 지연"
 
 #: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
@@ -1739,31 +1829,35 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
-msgstr ""
+msgstr "비밀번호 없으면 불가"
 
 #: src/settings_translation_file.cpp
 msgid "Domain name of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "도메인 서버의 이름은 서버리스트에 표시 됩니다."
 
 #: src/settings_translation_file.cpp
 msgid "Double tap jump for fly"
@@ -1775,23 +1869,27 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Drop item key"
-msgstr ""
+msgstr "아이템 드랍 키"
 
 #: src/settings_translation_file.cpp
 msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "조이스틱 적용"
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
-msgstr ""
+msgstr "VBO 적용"
 
 #: src/settings_translation_file.cpp
 msgid "Enable mod security"
-msgstr ""
+msgstr "보안 모드 적용"
 
 #: src/settings_translation_file.cpp
 msgid "Enable players getting damage and dying."
-msgstr ""
+msgstr "플레이어는 데미지를 받거나 죽을 수 있습니다."
 
 #: src/settings_translation_file.cpp
 msgid "Enable random user input (only used for testing)."
@@ -1829,7 +1927,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Enables animation of inventory items."
-msgstr ""
+msgstr "인벤토리 아이템의 애니메이션 적용."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1838,6 +1936,8 @@ msgid ""
 "or need to be auto-generated.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"텍스처에 bumpmapping을 할 수 있습니다. Normalmaps는 텍스쳐 팩에서 받거나 자동 생성될 필요가 있습니다.\n"
+"쉐이더를 활성화 해야 합니다."
 
 #: src/settings_translation_file.cpp
 msgid "Enables caching of facedir rotated meshes."
@@ -1849,13 +1949,16 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Enables minimap."
-msgstr ""
+msgstr "미니맵 적용."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Enables on the fly normalmap generation (Emboss effect).\n"
 "Requires bumpmapping to be enabled."
 msgstr ""
+"비행 노멀맵 생성 적용 (엠보스 효과).\n"
+"Bumpmapping를 활성화 해야 합니다."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1864,6 +1967,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -1925,11 +2036,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -1952,35 +2073,35 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Filtering"
-msgstr ""
+msgstr "필터링"
 
 #: src/settings_translation_file.cpp
 msgid "Fixed map seed"
-msgstr ""
+msgstr "수정된 맵 시드"
 
 #: src/settings_translation_file.cpp
 msgid "Fly key"
-msgstr ""
+msgstr "비행 키"
 
 #: src/settings_translation_file.cpp
 msgid "Flying"
-msgstr ""
+msgstr "비행"
 
 #: src/settings_translation_file.cpp
 msgid "Fog"
-msgstr ""
+msgstr "안개"
 
 #: src/settings_translation_file.cpp
 msgid "Fog toggle key"
-msgstr ""
+msgstr "안개 스위치"
 
 #: src/settings_translation_file.cpp
 msgid "Font path"
-msgstr ""
+msgstr "글꼴 경로"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow"
-msgstr ""
+msgstr "글꼴 그림자"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow alpha"
@@ -1996,7 +2117,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Font size"
-msgstr ""
+msgstr "글꼴 크기"
 
 #: src/settings_translation_file.cpp
 msgid "Format of screenshots."
@@ -2028,7 +2149,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Full screen"
-msgstr ""
+msgstr "전체 화면"
 
 #: src/settings_translation_file.cpp
 msgid "Full screen BPP"
@@ -2036,7 +2157,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Fullscreen mode."
-msgstr ""
+msgstr "전체 화면 모드."
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling"
@@ -2052,14 +2173,18 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Gamma"
-msgstr ""
+msgstr "감마"
 
 #: src/settings_translation_file.cpp
 msgid "General"
-msgstr ""
+msgstr "일반"
 
 #: src/settings_translation_file.cpp
 msgid "Generate normalmaps"
+msgstr "Normalmaps 생성"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -2067,8 +2192,6 @@ msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2076,7 +2199,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Graphics"
-msgstr ""
+msgstr "그래픽"
 
 #: src/settings_translation_file.cpp
 msgid "Gravity"
@@ -2084,7 +2207,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "HTTP Mods"
-msgstr ""
+msgstr "HTTP 모드"
 
 #: src/settings_translation_file.cpp
 msgid "HUD toggle key"
@@ -2099,6 +2222,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2112,11 +2244,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Homepage of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "서버의 홈페이지는 서버 리스트에 나타납니다."
 
 #: src/settings_translation_file.cpp
 msgid "How deep to make rivers"
-msgstr ""
+msgstr "얼마나 강을 깊게 만들건가요"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2127,15 +2259,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2146,11 +2269,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "IPv6"
-msgstr ""
+msgstr "IPv6"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 server"
-msgstr ""
+msgstr "IPv6 서버"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 support."
@@ -2209,23 +2332,58 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "If this is set, players will always (re)spawn at the given position."
+msgid "If this is set, players will always (re)spawn at the given position."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Ignore world errors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "In-Game"
+msgstr "인게임"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
+msgstr "게임 내에서 채팅 콘솔 배경 알파 (불투명 함, 0와 255 사이)."
+
+#: src/settings_translation_file.cpp
+msgid "In-game chat console background color (R,G,B)."
+msgstr "게임 내에서 채팅 콘솔 배경 색상 (빨,초,파)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Ignore world errors"
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "In-Game"
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
+msgid "Instrument the methods of entities on registration."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "In-game chat console background color (R,G,B)."
+msgid "Instrumentation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -2242,7 +2400,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Inventory key"
-msgstr ""
+msgstr "인벤토리 키"
 
 #: src/settings_translation_file.cpp
 msgid "Invert mouse"
@@ -2263,6 +2421,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2293,11 +2459,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Jump key"
-msgstr ""
+msgstr "점프 키"
 
 #: src/settings_translation_file.cpp
 msgid "Jumping speed"
-msgstr ""
+msgstr "점프 속도"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2305,6 +2471,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"보여지는 범위 감소에 대한 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2312,6 +2481,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"현재 선택된 아이템 드롭에 대한 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2319,6 +2491,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"보여지는 범위 증가에 대한 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2326,6 +2501,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"점프키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2333,6 +2511,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"고속 모드에서 빠르게 이동하는 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2340,6 +2521,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"플레이어가 뒤쪽으로 움직이는 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2347,6 +2531,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"플레이어가 앞으로 움직이는 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2354,6 +2541,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"플레이어가 왼쪽으로 움직이는 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2361,6 +2551,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"플레이어가 오른쪽으로 움직이는 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2368,6 +2561,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"채팅 창을 여는 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2375,6 +2571,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"명령어를 입력하기 위해 채팅창을 여는 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2382,6 +2581,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"채팅창을 여는 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2389,6 +2591,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"인벤토리를 여는 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2396,6 +2601,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"디버그 무더기(stacks) 인쇄 키. 개발을 위해 사용됨.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2405,6 +2613,10 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"살금살금걷기 키입니다.\n"
+"만약 aux1_descends를 사용할 수 없는 경우에 물에서 내려가거나 올라올 수 있습니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2412,6 +2624,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"1인칭에서 3인칭간 카메라 전환키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2419,6 +2634,16 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"스크린샷키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2426,6 +2651,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"시네마틱 모드 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2433,6 +2661,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"미니 맵 표시 설정/해제 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2440,6 +2671,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"고속 모드 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2447,6 +2681,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"비행 모드 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2454,13 +2691,19 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"자유시점 모드 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"카메라 업데이트 스위치 키입니다. 개발을 위해서만 사용됩니다. \n"
+"참조 http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e"
+"3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2468,6 +2711,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"디버그 정보 표시 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2475,6 +2721,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"HUD 표시 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2482,6 +2731,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"채팅 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2489,6 +2741,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"안개 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2503,6 +2758,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"제한없이 보여지는 범위에 대한 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
 
 #: src/settings_translation_file.cpp
 msgid "Key use for climbing/descending"
@@ -2510,11 +2768,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Language"
-msgstr ""
+msgstr "언어"
 
 #: src/settings_translation_file.cpp
 msgid "Large cave depth"
-msgstr ""
+msgstr "큰 동굴 깊이"
 
 #: src/settings_translation_file.cpp
 msgid "Lava Features"
@@ -2522,15 +2780,20 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Leaves style"
-msgstr ""
+msgstr "나뭇잎 스타일"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Leaves style:\n"
 "-   Fancy:  all faces visible\n"
 "-   Simple: only outer faces, if defined special_tiles are used\n"
 "-   Opaque: disable transparency"
 msgstr ""
+"나뭇잎 스타일:\n"
+"- 아름다운: 모든 면 표시\n"
+"- 간단: 외부 면만 표시, special_tiles를 정의 하는 경우만 사용\n"
+"- 불투명: 투명도 사용 안 함"
 
 #: src/settings_translation_file.cpp
 msgid "Left key"
@@ -2608,18 +2871,33 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Main menu game manager"
+msgid "Load the game profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Main menu mod manager"
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Main menu script"
+msgid "Loading Block Modifiers"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Main menu game manager"
+msgstr "주 메뉴 게임 관리자"
+
+#: src/settings_translation_file.cpp
+msgid "Main menu mod manager"
+msgstr "주 메뉴 모드 관리자"
+
+#: src/settings_translation_file.cpp
+msgid "Main menu script"
+msgstr "주 메뉴 스크립트"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
 msgstr ""
@@ -2640,8 +2918,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2651,8 +2927,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2663,8 +2937,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2674,8 +2946,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2683,7 +2953,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Map generation limit"
-msgstr ""
+msgstr "맵 생성 제한"
 
 #: src/settings_translation_file.cpp
 msgid "Map save interval"
@@ -2987,11 +3257,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave depth"
-msgstr ""
+msgstr "거대한 동굴 깊이"
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave noise"
-msgstr ""
+msgstr "거대한 동굴 잡음"
 
 #: src/settings_translation_file.cpp
 msgid "Massive caves form here."
@@ -3003,7 +3273,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Max block send distance"
-msgstr ""
+msgstr "최대 블록 전송 거리"
 
 #: src/settings_translation_file.cpp
 msgid "Max liquids processed per step."
@@ -3019,11 +3289,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Maximum FPS"
-msgstr ""
+msgstr "최대 FPS"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum FPS when game is paused."
-msgstr ""
+msgstr "최대 FPS는 게임이 일시정지될때 나타납니다."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum forceloaded blocks"
@@ -3031,6 +3301,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Maximum hotbar width"
+msgstr "최대 hotbar 폭"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3075,17 +3353,25 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "블록 당 최대 개체"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
+"현재 윈도우의 최대 부분은 hotbar를 사용할 것입니다.\n"
+"hotbar의 오른쪽이나 왼쪽에 무언가를 나타낼 때 유용합니다."
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr ""
+#, fuzzy
+msgid "Maximum simultaneous block sends per client"
+msgstr "클라이언트 당 최대 동시 블록 전송"
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3094,19 +3380,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Maximum users"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
+msgstr "최대 사용자"
 
 #: src/settings_translation_file.cpp
 msgid "Menus"
-msgstr ""
+msgstr "메뉴"
 
 #: src/settings_translation_file.cpp
 msgid "Mesh cache"
-msgstr ""
+msgstr "메쉬 캐시"
 
 #: src/settings_translation_file.cpp
 msgid "Message of the day"
@@ -3122,51 +3404,48 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Minimap"
-msgstr ""
+msgstr "미니맵"
 
 #: src/settings_translation_file.cpp
 msgid "Minimap key"
-msgstr ""
+msgstr "미니맵 키"
 
 #: src/settings_translation_file.cpp
 msgid "Minimap scan height"
-msgstr ""
+msgstr "미니맵 검색 높이"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Minimum texture size for filters"
-msgstr ""
+msgstr "필터 최소 텍스처 크기"
 
 #: src/settings_translation_file.cpp
 msgid "Mipmapping"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
+msgstr "밉매핑(Mipmapping)"
 
 #: src/settings_translation_file.cpp
 msgid "Modstore details URL"
-msgstr ""
+msgstr "Modstore 정보 URL"
 
 #: src/settings_translation_file.cpp
 msgid "Modstore download URL"
-msgstr ""
+msgstr "Modstore 다운로드 URL"
 
 #: src/settings_translation_file.cpp
 msgid "Modstore mods list URL"
-msgstr ""
+msgstr "Modstore 모드 리스트 URL"
 
 #: src/settings_translation_file.cpp
 msgid "Monospace font path"
-msgstr ""
+msgstr "고정 폭 글꼴 경로"
 
 #: src/settings_translation_file.cpp
 msgid "Monospace font size"
-msgstr ""
+msgstr "고정 폭 글꼴 크기"
 
 #: src/settings_translation_file.cpp
 msgid "Mouse sensitivity"
-msgstr ""
+msgstr "마우스 감도"
 
 #: src/settings_translation_file.cpp
 msgid "Mouse sensitivity multiplier."
@@ -3185,10 +3464,13 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Name of map generator to be used when creating a new world.\n"
 "Creating a world in the main menu will override this."
 msgstr ""
+"맵 생성기의 이름은 새로운 월드를 만들때 사용됩니다.\n"
+"주 메뉴에서 새 월드를 만들면 이것은 무시될 것입니다."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3200,11 +3482,11 @@ msgstr ""
 #: src/settings_translation_file.cpp
 msgid ""
 "Name of the server, to be displayed when players join and in the serverlist."
-msgstr ""
+msgstr "서버이름은 플레이어가 서버 리스트에 들어갈 때 나타납니다."
 
 #: src/settings_translation_file.cpp
 msgid "Network"
-msgstr ""
+msgstr "네트워크"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3214,23 +3496,23 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "New users need to input this password."
-msgstr ""
+msgstr "신규 사용자는 비밀번호를 입력하세요."
 
 #: src/settings_translation_file.cpp
 msgid "Noclip"
-msgstr ""
+msgstr "자유시점"
 
 #: src/settings_translation_file.cpp
 msgid "Noclip key"
-msgstr ""
+msgstr "자유시점 키"
 
 #: src/settings_translation_file.cpp
 msgid "Node highlighting"
-msgstr ""
+msgstr "Node 강조"
 
 #: src/settings_translation_file.cpp
 msgid "NodeTimer interval"
-msgstr ""
+msgstr "NodeTimer 간격"
 
 #: src/settings_translation_file.cpp
 msgid "Noise parameters for biome API temperature, humidity and biome blend."
@@ -3238,15 +3520,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Noises"
-msgstr ""
+msgstr "소리"
 
 #: src/settings_translation_file.cpp
 msgid "Normalmaps sampling"
-msgstr ""
+msgstr "Normalmaps 샘플링"
 
 #: src/settings_translation_file.cpp
 msgid "Normalmaps strength"
-msgstr ""
+msgstr "Normalmaps 강도"
 
 #: src/settings_translation_file.cpp
 msgid "Number of emerge threads"
@@ -3277,16 +3559,18 @@ msgid "Overall bias of parallax occlusion effect, usually scale/2."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Overall scale of parallax occlusion effect."
-msgstr ""
+msgstr "시차 교합 효과의 전체 규모"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion"
-msgstr ""
+msgstr "시차 교합"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Parallax occlusion Scale"
-msgstr ""
+msgstr "시차 교합 규모"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion bias"
@@ -3297,38 +3581,42 @@ msgid "Parallax occlusion iterations"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Parallax occlusion mode"
-msgstr ""
+msgstr "시차 교합 모드"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Parallax occlusion strength"
-msgstr ""
+msgstr "시차 교합 강도"
 
 #: src/settings_translation_file.cpp
 msgid "Path to TrueTypeFont or bitmap."
-msgstr ""
+msgstr "TrueTypeFont 또는 비트맵의 경로입니다."
 
 #: src/settings_translation_file.cpp
 msgid "Path to save screenshots at."
-msgstr ""
+msgstr "스크린샷 저장 경로입니다."
 
 #: src/settings_translation_file.cpp
 msgid "Path to texture directory. All textures are first searched from here."
-msgstr ""
+msgstr "텍스처 디렉터리 경로입니다. 모든 텍스처는 여기에서 먼저 검색 됩니다."
 
 #: src/settings_translation_file.cpp
 msgid "Physics"
-msgstr ""
+msgstr "물리학"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Player is able to fly without being affected by gravity.\n"
 "This requires the \"fly\" privilege on the server."
 msgstr ""
+"플레이어는 중력에 의해 영향을 받지 않고 날 수 있습니다.\n"
+"서버에서 \"비행\" 권한이 필요로 합니다."
 
 #: src/settings_translation_file.cpp
 msgid "Player name"
-msgstr ""
+msgstr "플레이어 이름"
 
 #: src/settings_translation_file.cpp
 msgid "Player transfer distance"
@@ -3336,16 +3624,26 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Player versus Player"
-msgstr ""
+msgstr "PVP"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Port to connect to (UDP).\n"
 "Note that the port field in the main menu overrides this setting."
 msgstr ""
+"(UDP)에 연결 하는 포트.\n"
+"참고 주 메뉴의 포트 필트는 이 설정으로 재정의 됩니다."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Prevent mods from doing insecure things like running shell commands."
+msgstr "shell 명령어 실행 같은 안전 하지 않은 것으로부터 모드를 보호합니다."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3353,16 +3651,17 @@ msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr ""
+msgid "Profiler"
+msgstr "프로파일러"
 
 #: src/settings_translation_file.cpp
 msgid "Profiler toggle key"
-msgstr ""
+msgstr "프로파일러 토글 키"
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr ""
+#, fuzzy
+msgid "Profiling"
+msgstr "프로 파일링"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3372,68 +3671,78 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Raises terrain to make valleys around the rivers"
-msgstr ""
+msgstr "강 주변에 계곡을 만들기 위해 지형을 올립니다."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Random input"
-msgstr ""
+msgstr "임의 입력"
 
 #: src/settings_translation_file.cpp
 msgid "Range select key"
-msgstr ""
+msgstr "범위 선택 키"
 
 #: src/settings_translation_file.cpp
 msgid "Remote media"
-msgstr ""
+msgstr "원격 미디어"
 
 #: src/settings_translation_file.cpp
 msgid "Remote port"
-msgstr ""
+msgstr "원격 포트"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Replaces the default main menu with a custom one."
-msgstr ""
+msgstr "기본 주 메뉴를 커스텀 메뉴로 바꿉니다."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "보고서 경로"
 
 #: src/settings_translation_file.cpp
 msgid "Right key"
-msgstr ""
+msgstr "오른쪽 키"
 
 #: src/settings_translation_file.cpp
 msgid "Rightclick repetition interval"
-msgstr ""
+msgstr "오른쪽 클릭 반복 간격"
 
 #: src/settings_translation_file.cpp
 msgid "River Depth"
-msgstr ""
+msgstr "강 깊이"
 
 #: src/settings_translation_file.cpp
 msgid "River Noise"
-msgstr ""
+msgstr "강 소리"
 
 #: src/settings_translation_file.cpp
 msgid "River Size"
-msgstr ""
+msgstr "강 크기"
 
 #: src/settings_translation_file.cpp
 msgid "River noise -- rivers occur close to zero"
-msgstr ""
+msgstr "강 소리 -- 강이 0에 가까울 때 발생"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Rollback recording"
-msgstr ""
+msgstr "롤백 레코딩"
 
 #: src/settings_translation_file.cpp
 msgid "Round minimap"
-msgstr ""
+msgstr "원형 미니맵"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Save the map received by the client on disk."
-msgstr ""
+msgstr "디스크에 클라이언트에서 받은 맵을 저장 합니다."
 
 #: src/settings_translation_file.cpp
 msgid "Saving map received from server"
-msgstr ""
+msgstr "서버로부터 받은 맵을 저장"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3446,27 +3755,27 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Screen height"
-msgstr ""
+msgstr "화면 높이"
 
 #: src/settings_translation_file.cpp
 msgid "Screen width"
-msgstr ""
+msgstr "화면 너비"
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot"
-msgstr ""
+msgstr "스크린샷"
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot folder"
-msgstr ""
+msgstr "스크린샷 폴더"
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot format"
-msgstr ""
+msgstr "화면 캡처 형식"
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot quality"
-msgstr ""
+msgstr "스크린샷 품질"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3474,105 +3783,120 @@ msgid ""
 "1 means worst quality; 100 means best quality.\n"
 "Use 0 for default quality."
 msgstr ""
+"화면 캡처 품질입니다. JPEG 형식에만 사용.\n"
+"1은 최악의 품질; 100은 최고의 품질을 의미합니다.\n"
+"기본 품질은 0을 사용 합니다."
 
 #: src/settings_translation_file.cpp
 msgid "Security"
-msgstr ""
+msgstr "보안"
 
 #: src/settings_translation_file.cpp
 msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
-msgstr ""
+msgstr "Http://www.sqlite.org/pragma.html#pragma_synchronous 참조"
 
 #: src/settings_translation_file.cpp
 msgid "Selection box border color (R,G,B)."
-msgstr ""
+msgstr "선택 박스 테두리 색 (빨, 초, 파)."
 
 #: src/settings_translation_file.cpp
 msgid "Selection box color"
-msgstr ""
+msgstr "선택 박스 컬러"
 
 #: src/settings_translation_file.cpp
 msgid "Selection box width"
-msgstr ""
+msgstr "선택 박스 너비"
 
 #: src/settings_translation_file.cpp
 msgid "Server / Singleplayer"
-msgstr ""
+msgstr "서버 / 싱글 플레이어"
 
 #: src/settings_translation_file.cpp
 msgid "Server URL"
-msgstr ""
+msgstr "서버 URL"
 
 #: src/settings_translation_file.cpp
 msgid "Server address"
-msgstr ""
+msgstr "서버 주소"
 
 #: src/settings_translation_file.cpp
 msgid "Server description"
-msgstr ""
+msgstr "서버 설명"
 
 #: src/settings_translation_file.cpp
 msgid "Server name"
-msgstr ""
+msgstr "서버 이름"
 
 #: src/settings_translation_file.cpp
 msgid "Server port"
-msgstr ""
+msgstr "서버 포트"
 
 #: src/settings_translation_file.cpp
 msgid "Serverlist URL"
-msgstr ""
+msgstr "서버리스트 URL"
 
 #: src/settings_translation_file.cpp
 msgid "Serverlist file"
-msgstr ""
+msgstr "서버리스트 파일"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set the language. Leave empty to use the system language.\n"
 "A restart is required after changing this."
 msgstr ""
+"언어 설정. 시스템 언어를 사용하려면 비워두세요.\n"
+"설정 적용 후 재시작이 필요합니다."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set to true enables waving leaves.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"True로 설정하면 흔들리는 나뭇잎 효과가 적용됩니다.\n"
+"쉐이더를 활성화 해야 합니다."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set to true enables waving plants.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"True로 설정하면 흔들리는 식물 효과가 적용됩니다.\n"
+"쉐이더를 활성화 해야 합니다."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set to true enables waving water.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"True로 설정하면 물결효과가 적용됩니다.\n"
+"쉐이더를 활성화해야 합니다.."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
+"쉐이더는 확장된 시각 효과를 제공합니다 그래서 비디오 카드의 성능이 증가될 것입니다.\n"
+"Thy only work with the OpenGL video backend."
 
 #: src/settings_translation_file.cpp
 msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr ""
+msgstr "미니맵 모양. 활성화 = 원형, 비활성화 = 정사각형."
 
 #: src/settings_translation_file.cpp
 msgid "Show debug info"
-msgstr ""
+msgstr "디버그 정보 보기"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Show entity selection boxes"
-msgstr ""
+msgstr "개체 선택 상자 보기"
 
 #: src/settings_translation_file.cpp
 msgid "Shutdown message"
-msgstr ""
+msgstr "서버닫힘 메시지"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3581,34 +3905,38 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Slope and fill work together to modify the heights"
-msgstr ""
+msgstr "높이 수정을 위해 기울기와 채우기를 함께 작용합니다"
 
 #: src/settings_translation_file.cpp
 msgid "Smooth lighting"
-msgstr ""
+msgstr "부드러운 조명효과"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
+"주위를 돌아볼 때 카메라를 부드럽게 해줍니다. 보기 또는 부드러운 마우스라고도 합니다.\n"
+"비디오를 녹화하기에 유용합니다."
 
 #: src/settings_translation_file.cpp
 msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
-msgstr ""
+msgstr "시네마틱 모드에서 카메라의 회전을 매끄럽게 만듭니다. 사용 하지 않으려면 0입니다."
 
 #: src/settings_translation_file.cpp
 msgid "Smooths rotation of camera. 0 to disable."
-msgstr ""
+msgstr "카메라의 회전을 매끄럽게 만듭니다. 사용 하지 않으려면 0입니다."
 
 #: src/settings_translation_file.cpp
 msgid "Sneak key"
-msgstr ""
+msgstr "살금살금걷기 키"
 
 #: src/settings_translation_file.cpp
 msgid "Sound"
-msgstr ""
+msgstr "사운드"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3620,7 +3948,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Static spawnpoint"
-msgstr ""
+msgstr "고정된 스폰포인트"
 
 #: src/settings_translation_file.cpp
 msgid "Strength of generated normalmaps."
@@ -3632,7 +3960,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Strict protocol checking"
-msgstr ""
+msgstr "엄격한 프로토콜 검사"
 
 #: src/settings_translation_file.cpp
 msgid "Support older servers"
@@ -3644,7 +3972,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Terrain Height"
-msgstr ""
+msgstr "지형 높이"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3662,14 +3990,27 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Texture path"
-msgstr ""
+msgstr "텍스처 경로"
 
 #: src/settings_translation_file.cpp
 msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid "The depth of dirt or other filler"
+msgstr "흙이나 다른 것의 깊이"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3688,6 +4029,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3703,13 +4050,19 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "This font will be used for certain languages."
-msgstr ""
+msgstr "이 글꼴은 특정 언어에 사용 됩니다."
 
 #: src/settings_translation_file.cpp
 msgid "Time in between active block management cycles"
@@ -3722,36 +4075,43 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Time send interval"
-msgstr ""
+msgstr "시간 전송 간격"
 
 #: src/settings_translation_file.cpp
 msgid "Time speed"
-msgstr ""
+msgstr "시간 속도"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Timeout for client to remove unused map data from memory."
-msgstr ""
+msgstr "메모리에서 사용 하지 않는 맵 데이터를 제거하기 위해 클라이언트에 대한 시간 제한입니다."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "To reduce lag, block transfers are slowed down when a player is building "
 "something.\n"
 "This determines how long they are slowed down after placing or removing a "
 "node."
 msgstr ""
+"플레이어가 무엇을 건설할 때 딜레이를 줄이기 위해 블럭 전송이 느려집니다.\n"
+"이것은 node가 배치되거나 제거된 후 얼마나 오래 느려지는지를 결정합니다."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Toggle camera mode key"
-msgstr ""
+msgstr "카메라모드 스위치 키"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Tooltip delay"
-msgstr ""
+msgstr "도구 설명 지연"
 
 #: src/settings_translation_file.cpp
 msgid "Trilinear filtering"
-msgstr ""
+msgstr "삼중 선형 필터링"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3759,58 +4119,60 @@ msgid ""
 "False = 128\n"
 "Useable to make minimap smoother on slower machines."
 msgstr ""
+"True = 256 \n"
+"False = 128 \n"
+"느린 컴퓨터에서 미니맵을 부드럽게 만들어줍니다."
 
 #: src/settings_translation_file.cpp
 msgid "Trusted mods"
-msgstr ""
+msgstr "신뢰할 수 있는 모드"
 
 #: src/settings_translation_file.cpp
 msgid "URL to the server list displayed in the Multiplayer Tab."
-msgstr ""
+msgstr "멀티 탭에 표시 된 서버 목록 URL입니다."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Unlimited player transfer distance"
-msgstr ""
+msgstr "무제한 플레이어 전송 거리"
 
 #: src/settings_translation_file.cpp
 msgid "Unload unused server data"
-msgstr ""
+msgstr "사용하지 않은 서버 데이터 삭제"
 
 #: src/settings_translation_file.cpp
 msgid "Use 3D cloud look instead of flat."
-msgstr ""
+msgstr "평평하게 보는 대신에 3D 구름 효과를 사용합니다."
 
 #: src/settings_translation_file.cpp
 msgid "Use a cloud animation for the main menu background."
-msgstr ""
+msgstr "주 메뉴 배경에 구름 애니메이션을 사용 합니다."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Use anisotropic filtering when viewing at textures from an angle."
-msgstr ""
+msgstr "각도에 따라 텍스처를 볼 때 이방성 필터링을 사용 합니다."
 
 #: src/settings_translation_file.cpp
 msgid "Use bilinear filtering when scaling textures."
-msgstr ""
+msgstr "이중 선형 필터링은 질감 스케일링을 할 때 사용 합니다."
 
 #: src/settings_translation_file.cpp
 msgid "Use key"
-msgstr ""
+msgstr "키 사용"
 
 #: src/settings_translation_file.cpp
 msgid "Use mip mapping to scale textures. May slightly increase performance."
-msgstr ""
+msgstr "텍스쳐를 크게하기 위해 mip mapping을 사용 합니다. 성능이 약간 증가할겁니다."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Use trilinear filtering when scaling textures."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
+msgstr "삼중 선형 필터링은 질감 스케일링을 할 때 사용 합니다."
 
 #: src/settings_translation_file.cpp
 msgid "V-Sync"
-msgstr ""
+msgstr "수직동기화 V-Sync"
 
 #: src/settings_translation_file.cpp
 msgid "VBO"
@@ -3818,57 +4180,64 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Valley Depth"
-msgstr ""
+msgstr "계곡 깊이"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Valley Fill"
-msgstr ""
+msgstr "계곡 채우기"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Valley Profile"
-msgstr ""
+msgstr "계곡 측면"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Slope"
-msgstr ""
+msgstr "계곡 경사"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Valleys C Flags"
-msgstr ""
+msgstr "계곡 C 플래그"
 
 #: src/settings_translation_file.cpp
 msgid "Vertical screen synchronization."
-msgstr ""
+msgstr "세로 화면 동기화."
 
 #: src/settings_translation_file.cpp
 msgid "Video driver"
-msgstr ""
+msgstr "비디오 드라이버"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "View bobbing"
-msgstr ""
+msgstr "보기 만료"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "View distance in nodes.\n"
 "Min = 20"
 msgstr ""
+"node의 보여지는 거리\n"
+"최소 = 20"
 
 #: src/settings_translation_file.cpp
 msgid "View range decrease key"
-msgstr ""
+msgstr "보여지는 범위 감소 키"
 
 #: src/settings_translation_file.cpp
 msgid "View range increase key"
-msgstr ""
+msgstr "보여지는 범위 증가 키"
 
 #: src/settings_translation_file.cpp
 msgid "Viewing range"
-msgstr ""
+msgstr "보여지는 범위"
 
 #: src/settings_translation_file.cpp
 msgid "Volume"
-msgstr ""
+msgstr "볼륨"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3880,64 +4249,69 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Walking speed"
-msgstr ""
+msgstr "빠르게 걷기"
 
 #: src/settings_translation_file.cpp
 msgid "Water Features"
-msgstr ""
+msgstr "물 특징"
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
-msgstr ""
+msgstr "물의 높이"
 
 #: src/settings_translation_file.cpp
 msgid "Water surface level of the world."
-msgstr ""
+msgstr "월드의 물 표면 높이."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Waving Nodes"
-msgstr ""
+msgstr "움직이는 Node"
 
 #: src/settings_translation_file.cpp
 msgid "Waving leaves"
-msgstr ""
+msgstr "흔들리는 나뭇잎 효과"
 
 #: src/settings_translation_file.cpp
 msgid "Waving plants"
-msgstr ""
+msgstr "흔들리는 식물 효과"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water"
-msgstr ""
+msgstr "물결 효과"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water height"
-msgstr ""
+msgstr "물결 높이"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water length"
-msgstr ""
+msgstr "물결 길이"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water speed"
-msgstr ""
+msgstr "물결 속도"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "When gui_scaling_filter is true, all GUI images need to be\n"
 "filtered in software, but some images are generated directly\n"
 "to hardware (e.g. render-to-texture for nodes in inventory)."
 msgstr ""
+"Gui_scaling_filter이 true 이면 모든 GUI 이미지 소프트웨어에서 필터링 될 필요가 있습니다. 하지만 일부 이미지는 "
+"바로 하드웨어에 생성됩니다. (e.g. render-to-texture for nodes in inventory)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "When using bilinear/trilinear/anisotropic filters, low-resolution textures\n"
 "can be blurred, so automatically upscale them with nearest-neighbor\n"
@@ -3947,6 +4321,12 @@ msgid ""
 "have a visible effect unless bilinear/trilinear/anisotropic filtering is\n"
 "enabled."
 msgstr ""
+"이중선형/삼중선형/이방성 필터를 사용할 때 저해상도 택스쳐는 희미하게 보일 수 있습니다.so automatically upscale "
+"them with nearest-neighbor interpolation to preserve crisp pixels. This sets "
+"the minimum texture size for the upscaled textures; 값이 높을수록 선명하게 보입니다. 하지만 "
+"많은 메모리가 필요합니다. Powers of 2 are recommended. Setting this higher than 1 may "
+"not have a visible effect unless bilinear/trilinear/anisotropic filtering is "
+"enabled."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4001,18 +4381,23 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Width component of the initial window size."
-msgstr ""
+msgstr "폭은 초기 창 크기로 구성되어 있습니다."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Width of the selectionbox's lines around nodes."
 msgstr ""
+"node 주위 “selectionbox'” or (if UTF-8 supported) “selectionbox’” 라인의 너비입니다."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "World directory (everything in the world is stored here).\n"
 "Not needed if starting from the main menu."
 msgstr ""
+"월드 디렉토리 (월드의 모든 것은 여기에 저장됩니다).\n"
+"주 메뉴에서 시작 하는 경우 필요 하지 않습니다."
 
 #: src/settings_translation_file.cpp
 msgid "Y of flat ground."
diff --git a/po/ky/minetest.po b/po/ky/minetest.po
index 01a5910..72c729f 100644
--- a/po/ky/minetest.po
+++ b/po/ky/minetest.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
 "PO-Revision-Date: 2013-06-01 18:09+0200\n"
 "Last-Translator: Chynggyz Jumaliev <translatorky at lavabit.com>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -626,6 +626,11 @@ msgid "Particles"
 msgstr "Баарын күйгүзүү"
 
 #: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Бир кишилик"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Ырастоолор"
 
@@ -1005,6 +1010,10 @@ msgstr ""
 msgid "Use"
 msgstr "Колдонуу"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Масштаб"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "баскычты басыңыз"
@@ -1321,10 +1330,6 @@ msgstr ""
 msgid "X Button 2"
 msgstr ""
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Масштаб"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1392,6 +1397,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1467,6 +1476,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Backward key"
 msgstr "Артка"
@@ -1503,6 +1516,10 @@ msgid "Build inside player"
 msgstr "Көп кишилик"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Bumpmapping"
 msgstr "Mip-текстуралоо"
@@ -1546,6 +1563,11 @@ msgid "Chat toggle key"
 msgstr "Баскычтарды өзгөртүү"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Команда"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1622,14 +1644,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1785,6 +1807,10 @@ msgid "Default privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1801,6 +1827,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1831,14 +1861,6 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1851,6 +1873,18 @@ msgid "Disable anticheat"
 msgstr "Бөлүкчөлөрдү күйгүзүү"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr ""
 
@@ -1875,6 +1909,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Enable VBO"
 msgstr "Баарын күйгүзүү"
@@ -1960,6 +1998,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2020,11 +2066,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2160,12 +2216,14 @@ msgid "Generate normalmaps"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2196,6 +2254,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2224,15 +2291,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2327,6 +2385,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2362,6 +2454,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2522,6 +2622,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2557,7 +2664,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2709,6 +2816,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2743,8 +2865,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2754,8 +2874,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2766,8 +2884,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2777,8 +2893,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3137,6 +3251,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3178,17 +3300,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3200,10 +3326,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Menus"
 msgstr "Меню"
@@ -3246,10 +3368,6 @@ msgid "Mipmapping"
 msgstr "Mip-текстуралоо"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3454,11 +3572,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3466,7 +3590,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3502,6 +3626,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Report path"
+msgstr "Тандоо"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Right key"
 msgstr "Оң меню"
 
@@ -3665,7 +3794,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3703,7 +3832,7 @@ msgstr "Тегиз жарык"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3783,10 +3912,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3802,6 +3943,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3817,6 +3964,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3921,10 +4074,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4053,7 +4202,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4154,54 +4303,28 @@ msgid "cURL timeout"
 msgstr ""
 
 #, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Жүктөлүүдө..."
+#~ msgid "Public Serverlist"
+#~ msgstr "Жалпылык серверлердин тизмеси:"
 
 #, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Ылдый"
-
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Сол баскычы: Бардык буюмдарды ташуу, Оң баскычы: Бир буюмду ташуу"
-
-#~ msgid "is required by:"
-#~ msgstr "талап кылынганы:"
-
-#~ msgid "Configuration saved.  "
-#~ msgstr "Конфигурация сакталды.  "
-
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Эскертүү: Туура эмес конфигурация.  "
-
-#~ msgid "Show Public"
-#~ msgstr "Жалпылыкты көрсөтүү"
-
-#~ msgid "Show Favorites"
-#~ msgstr "Тандалмаларды көрсөтүү"
-
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Жергиликтүү серверди жүргүзүү үчүн даректи бош калтырыңыз."
-
-#~ msgid "Create world"
-#~ msgstr "Дүйнөнү жаратуу"
-
-#~ msgid "Address required."
-#~ msgstr "Дареги талап кылынат."
-
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Дүнөнү жаратуу мүмкүн эмес: Эч нерсе тандалган жок"
+#~ msgid "If disabled "
+#~ msgstr "Баарын өчүрүү"
 
-#~ msgid "Files to be deleted"
-#~ msgstr "Өчүрүлө турган файлдар"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "күйгүзүлгөн"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Дүйнөнү жаратуу мүмкүн эмес: Оюндар табылган жок"
+#, fuzzy
+#~ msgid "Game Name"
+#~ msgstr "Оюн"
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Дүйнөнү ырастоо мүмкүн эмес: Эч нерсе тандалган жок"
+#, fuzzy
+#~ msgid "Password"
+#~ msgstr "Эски сырсөз"
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Бардык дүйнө файлдарын өчүрүү оңунан чыккан жок"
+#, fuzzy
+#~ msgid "Finite Liquid"
+#~ msgstr "Чектүү суюктук"
 
 #~ msgid ""
 #~ "Default Controls:\n"
@@ -4228,26 +4351,52 @@ msgstr ""
 #~ "- ESC: бул меню\n"
 #~ "- T: маек\n"
 
-#, fuzzy
-#~ msgid "Finite Liquid"
-#~ msgstr "Чектүү суюктук"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Бардык дүйнө файлдарын өчүрүү оңунан чыккан жок"
 
-#, fuzzy
-#~ msgid "Password"
-#~ msgstr "Эски сырсөз"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Дүйнөнү ырастоо мүмкүн эмес: Эч нерсе тандалган жок"
 
-#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Оюн"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Дүйнөнү жаратуу мүмкүн эмес: Оюндар табылган жок"
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "күйгүзүлгөн"
+#~ msgid "Files to be deleted"
+#~ msgstr "Өчүрүлө турган файлдар"
+
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Дүнөнү жаратуу мүмкүн эмес: Эч нерсе тандалган жок"
+
+#~ msgid "Address required."
+#~ msgstr "Дареги талап кылынат."
+
+#~ msgid "Create world"
+#~ msgstr "Дүйнөнү жаратуу"
+
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Жергиликтүү серверди жүргүзүү үчүн даректи бош калтырыңыз."
+
+#~ msgid "Show Favorites"
+#~ msgstr "Тандалмаларды көрсөтүү"
+
+#~ msgid "Show Public"
+#~ msgstr "Жалпылыкты көрсөтүү"
+
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Эскертүү: Туура эмес конфигурация.  "
+
+#~ msgid "Configuration saved.  "
+#~ msgstr "Конфигурация сакталды.  "
+
+#~ msgid "is required by:"
+#~ msgstr "талап кылынганы:"
+
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Сол баскычы: Бардык буюмдарды ташуу, Оң баскычы: Бир буюмду ташуу"
 
 #, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Баарын өчүрүү"
+#~ msgid "Downloading"
+#~ msgstr "Ылдый"
 
 #, fuzzy
-#~ msgid "Public Serverlist"
-#~ msgstr "Жалпылык серверлердин тизмеси:"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Жүктөлүүдө..."
diff --git a/po/lt/minetest.po b/po/lt/minetest.po
index 9818d29..ed31a75 100644
--- a/po/lt/minetest.po
+++ b/po/lt/minetest.po
@@ -7,9 +7,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2015-11-19 05:14+0000\n"
-"Last-Translator: Liudas Ališauskas <liudas at akmc.lt>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-10 20:29+0000\n"
+"Last-Translator: Zygi Mantus <zygimantus at gmail.com>\n"
 "Language-Team: Lithuanian <https://hosted.weblate.org/projects/minetest/"
 "minetest/lt/>\n"
 "Language: lt\n"
@@ -18,7 +18,7 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
 "%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 2.5-dev\n"
+"X-Generator: Weblate 2.10-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
@@ -68,7 +68,7 @@ msgstr ""
 
 #: builtin/mainmenu/common.lua
 msgid "We only support protocol version $1."
-msgstr ""
+msgstr "Mes palaikome tik $1 protokolo versiją."
 
 #: builtin/mainmenu/common.lua
 msgid "We support protocol versions between version $1 and $2."
@@ -219,7 +219,7 @@ msgstr ""
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Browse"
-msgstr ""
+msgstr "Naršyti"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 #, fuzzy
@@ -610,6 +610,11 @@ msgid "Particles"
 msgstr "Įjungti visus"
 
 #: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Atstatyti vieno žaidėjo pasaulį"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Nustatymai"
 
@@ -987,6 +992,10 @@ msgstr "Įjungti noclip"
 msgid "Use"
 msgstr "Naudoti"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Pritraukti"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "paspauskite klavišą"
@@ -1303,10 +1312,6 @@ msgstr "X mygtukas 1"
 msgid "X Button 2"
 msgstr "X mygtukas 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Pritraukti"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1374,6 +1379,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1448,6 +1457,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Backward key"
 msgstr "Atgal"
@@ -1482,6 +1495,10 @@ msgid "Build inside player"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr ""
 
@@ -1524,6 +1541,11 @@ msgid "Chat toggle key"
 msgstr "Nustatyti klavišus"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Komanda"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1600,14 +1622,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1762,6 +1784,10 @@ msgid "Default privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1778,6 +1804,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1808,22 +1838,26 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1851,6 +1885,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Enable VBO"
 msgstr "Įjungti papildinį"
@@ -1937,6 +1975,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -1997,11 +2043,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2136,12 +2192,14 @@ msgid "Generate normalmaps"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2173,6 +2231,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2201,15 +2268,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2304,6 +2362,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2339,6 +2431,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2499,6 +2599,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2534,7 +2641,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2686,6 +2793,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2720,8 +2842,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2731,8 +2851,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2743,8 +2861,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2754,8 +2870,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3118,6 +3232,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3159,17 +3281,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3181,10 +3307,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Menus"
 msgstr "Meniu"
@@ -3226,10 +3348,6 @@ msgid "Mipmapping"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3434,11 +3552,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3446,7 +3570,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3481,6 +3605,10 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Right key"
 msgstr "Dešinėn"
@@ -3647,7 +3775,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3685,7 +3813,7 @@ msgstr "Apšvietimo efektai"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3765,10 +3893,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3784,6 +3924,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3799,6 +3945,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3902,11 +4054,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Pagrindiniai kūrėjai"
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4033,7 +4180,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4134,65 +4281,69 @@ msgid "cURL timeout"
 msgstr ""
 
 #, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Įkeliama..."
+#~ msgid "Useful for mod developers."
+#~ msgstr "Pagrindiniai kūrėjai"
 
-#~ msgid "Add mod:"
-#~ msgstr "Pridėti papildinį:"
+#~ msgid "No of course not!"
+#~ msgstr "Ne, tikrai ne!"
 
-#~ msgid "MODS"
-#~ msgstr "PAPILDINIAI"
+#~ msgid "Public Serverlist"
+#~ msgstr "Viešų serverių sąrašas"
 
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "VIENAS ŽAIDĖJAS"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Išjungti papildinį"
 
-#~ msgid "SETTINGS"
-#~ msgstr "NUSTATYMAI"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "įjungtas"
 
-#~ msgid "Password"
-#~ msgstr "Slaptažodis"
+#~ msgid "Game Name"
+#~ msgstr "Žaidimo pavadinimas"
 
-#~ msgid "Name"
-#~ msgstr "Vardas"
+#~ msgid "GAMES"
+#~ msgstr "ŽAIDIMAI"
 
-#~ msgid "START SERVER"
-#~ msgstr "PALEISTI SERVERĮ"
+#~ msgid "Mods:"
+#~ msgstr "Papildiniai:"
 
-#~ msgid "CLIENT"
-#~ msgstr "ŽAISTI TINKLE"
+#~ msgid "new game"
+#~ msgstr "naujas žaidimas"
 
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Pridėti papildinį"
+#, fuzzy
+#~ msgid "EDIT GAME"
+#~ msgstr "KEISTI ŽAIDIMĄ"
 
 #~ msgid "Remove selected mod"
 #~ msgstr "Pašalinti pasirinktą papildinį"
 
-#, fuzzy
-#~ msgid "EDIT GAME"
-#~ msgstr "KEISTI ŽAIDIMĄ"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Pridėti papildinį"
 
-#~ msgid "new game"
-#~ msgstr "naujas žaidimas"
+#~ msgid "CLIENT"
+#~ msgstr "ŽAISTI TINKLE"
 
-#~ msgid "Mods:"
-#~ msgstr "Papildiniai:"
+#~ msgid "START SERVER"
+#~ msgstr "PALEISTI SERVERĮ"
 
-#~ msgid "GAMES"
-#~ msgstr "ŽAIDIMAI"
+#~ msgid "Name"
+#~ msgstr "Vardas"
 
-#~ msgid "Game Name"
-#~ msgstr "Žaidimo pavadinimas"
+#~ msgid "Password"
+#~ msgstr "Slaptažodis"
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "įjungtas"
+#~ msgid "SETTINGS"
+#~ msgstr "NUSTATYMAI"
 
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Išjungti papildinį"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "VIENAS ŽAIDĖJAS"
 
-#~ msgid "Public Serverlist"
-#~ msgstr "Viešų serverių sąrašas"
+#~ msgid "MODS"
+#~ msgstr "PAPILDINIAI"
 
-#~ msgid "No of course not!"
-#~ msgstr "Ne, tikrai ne!"
+#~ msgid "Add mod:"
+#~ msgstr "Pridėti papildinį:"
+
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "Įkeliama..."
diff --git a/po/minetest.pot b/po/minetest.pot
index ed014c0..46a74b4 100644
--- a/po/minetest.pot
+++ b/po/minetest.pot
@@ -1,6 +1,6 @@
 # SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the minetest package.
 # FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
 #
 #, fuzzy
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -589,6 +589,10 @@ msgid "Shaders"
 msgstr ""
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Change keys"
 msgstr ""
 
@@ -937,6 +941,10 @@ msgstr ""
 msgid "Print stacks"
 msgstr ""
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr ""
+
 #: src/guiPasswordChange.cpp
 msgid "Old Password"
 msgstr ""
@@ -1249,10 +1257,6 @@ msgstr ""
 msgid "PA1"
 msgstr ""
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
 #: src/settings_translation_file.cpp
 msgid "Controls"
 msgstr ""
@@ -1305,7 +1309,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -1396,6 +1400,30 @@ msgid "Continuous forward movement (only used for testing)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Forward key"
 msgstr ""
 
@@ -1563,6 +1591,17 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Cinematic mode key"
 msgstr ""
 
@@ -1645,7 +1684,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -1948,7 +1987,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -2180,6 +2219,16 @@ msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Gamma"
 msgstr ""
 
@@ -2435,7 +2484,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -2634,6 +2683,18 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Server port"
 msgstr ""
 
@@ -2688,20 +2749,23 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
+msgid "Maximum number of blocks that are simultaneously sent per client."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3032,30 +3096,6 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Max. clearobjects extra blocks"
 msgstr ""
 
@@ -3077,7 +3117,7 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
+msgid "Maximum objects per block"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3214,8 +3254,6 @@ msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3345,8 +3383,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3422,8 +3458,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3489,8 +3523,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3736,8 +3768,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3911,11 +3941,117 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
 "allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Profiling"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Client and Server"
 msgstr ""
 
@@ -4030,3 +4166,13 @@ msgstr ""
 #: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
diff --git a/po/nb/minetest.po b/po/nb/minetest.po
index 7ae1156..9907837 100644
--- a/po/nb/minetest.po
+++ b/po/nb/minetest.po
@@ -7,9 +7,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2015-09-20 17:15+0200\n"
-"Last-Translator: Christian Haug <christian at metaboks.org>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-25 21:41+0000\n"
+"Last-Translator: Petter Reinholdtsen <pere-weblate at hungry.com>\n"
 "Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
 "minetest/minetest/nb/>\n"
 "Language: nb\n"
@@ -17,19 +17,19 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.4-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr ""
+msgstr "Det skjedde en feil i et Lua-skript, f.eks. en mod:"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
-msgstr ""
+msgstr "Det skjedde en feil:"
 
 #: builtin/fstk/ui.lua
 msgid "Main menu"
-msgstr ""
+msgstr "Hovedmeny"
 
 #: builtin/fstk/ui.lua builtin/mainmenu/store.lua
 msgid "Ok"
@@ -37,27 +37,27 @@ msgstr "Ok"
 
 #: builtin/fstk/ui.lua
 msgid "Reconnect"
-msgstr ""
+msgstr "Koble til på nytt"
 
 #: builtin/fstk/ui.lua
 msgid "The server has requested a reconnect:"
-msgstr ""
+msgstr "Tjeneren har bedt om ny tilkobling:"
 
 #: builtin/mainmenu/common.lua src/game.cpp
 msgid "Loading..."
-msgstr ""
+msgstr "Laster..."
 
 #: builtin/mainmenu/common.lua
 msgid "Protocol version mismatch. "
-msgstr ""
+msgstr "Avvikende protokollversjon. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr ""
+msgstr "Tjener krever protokollversjon $1. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
-msgstr ""
+msgstr "Tjener støtter protokollversjoner mellom $1 og $2. "
 
 #: builtin/mainmenu/common.lua
 msgid "Try reenabling public serverlist and check your internet connection."
@@ -65,11 +65,11 @@ msgstr ""
 
 #: builtin/mainmenu/common.lua
 msgid "We only support protocol version $1."
-msgstr ""
+msgstr "Vi støtter kun protokollversjon $1."
 
 #: builtin/mainmenu/common.lua
 msgid "We support protocol versions between version $1 and $2."
-msgstr ""
+msgstr "Vi støtter protokollversjoner mellom versjon $1 og $2."
 
 #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -80,43 +80,40 @@ msgid "Cancel"
 msgstr "Avbryt"
 
 #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua
-#, fuzzy
 msgid "Depends:"
-msgstr "Avhenger av:"
+msgstr "Avhengigheter:"
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "Disable MP"
-msgstr "Deaktiver Alle"
+msgstr "Koble ut MP"
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "Enable MP"
-msgstr "Aktiver Alle"
+msgstr "Aktiver MP"
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "Enable all"
-msgstr "Aktiver Alle"
+msgstr "Aktiver alle"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid ""
 "Failed to enable mod \"$1\" as it contains disallowed characters. Only "
 "chararacters [a-z0-9_] are allowed."
 msgstr ""
+"Kunne ikke aktivere mod \"$1\" fordi  den inneholder ulovlige tegn. Kun "
+"symbolene [a-z0-9_] er tillatt."
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "Hide Game"
-msgstr "Spill"
+msgstr "Skjul spill"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide mp content"
-msgstr ""
+msgstr "Skjul mp-innhold"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Mod:"
-msgstr ""
+msgstr "Mod:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
@@ -124,9 +121,8 @@ msgid "Save"
 msgstr "Lagre"
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "World:"
-msgstr "Navnet på verdenen"
+msgstr "Verden:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "enabled"
@@ -134,7 +130,7 @@ msgstr "aktivert"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "A world named \"$1\" already exists"
-msgstr ""
+msgstr "En verden med navn \"$1\" eksisterer allerede"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Create"
@@ -601,6 +597,10 @@ msgid "Particles"
 msgstr "Aktiver Alle"
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr ""
 
@@ -949,6 +949,10 @@ msgstr ""
 msgid "Use"
 msgstr ""
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr ""
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr ""
@@ -1265,10 +1269,6 @@ msgstr ""
 msgid "X Button 2"
 msgstr ""
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1335,6 +1335,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1409,6 +1413,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr ""
 
@@ -1441,6 +1449,10 @@ msgid "Build inside player"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr ""
 
@@ -1481,6 +1493,10 @@ msgid "Chat toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1555,14 +1571,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1710,6 +1726,10 @@ msgid "Default privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1726,6 +1746,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1756,22 +1780,26 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1799,6 +1827,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Enable VBO"
 msgstr "Aktiver Alle"
@@ -1884,6 +1916,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -1944,11 +1984,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2082,12 +2132,14 @@ msgid "Generate normalmaps"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2118,6 +2170,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2146,15 +2207,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2249,6 +2301,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2283,6 +2369,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2442,6 +2536,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2477,7 +2578,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2628,6 +2729,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2660,8 +2776,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2671,8 +2785,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2683,8 +2795,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2694,8 +2804,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3054,6 +3162,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3095,17 +3211,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3117,10 +3237,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr ""
 
@@ -3161,10 +3277,6 @@ msgid "Mipmapping"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3369,11 +3481,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3381,7 +3499,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3416,6 +3534,10 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr ""
 
@@ -3573,7 +3695,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3610,7 +3732,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3689,10 +3811,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3708,6 +3842,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3723,6 +3863,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3825,10 +3971,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -3954,7 +4096,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4054,18 +4196,17 @@ msgstr ""
 msgid "cURL timeout"
 msgstr ""
 
-#~ msgid "is required by:"
-#~ msgstr "trengs av:"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Deaktiver Alle"
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "Konfigurasjon lagret. "
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "aktivert"
 
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
-#~ msgstr ""
-#~ "Advarsel: Noen konfigurerte modifikasjoner mangler. \n"
-#~ "Instillingene deres vil bli fjernet når du lagrer konfigurasjonen."
+#, fuzzy
+#~ msgid "Game Name"
+#~ msgstr "Spill"
 
 #~ msgid ""
 #~ "Warning: Some mods are not configured yet.\n"
@@ -4074,14 +4215,15 @@ msgstr ""
 #~ "Advarsel: Noen modifikasjoner er ikke konfigurert enda. \n"
 #~ "De vil bli aktivert som standard når du lagrer konfigurasjonen."
 
-#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Spill"
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration.  "
+#~ msgstr ""
+#~ "Advarsel: Noen konfigurerte modifikasjoner mangler. \n"
+#~ "Instillingene deres vil bli fjernet når du lagrer konfigurasjonen."
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "aktivert"
+#~ msgid "Configuration saved.  "
+#~ msgstr "Konfigurasjon lagret. "
 
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Deaktiver Alle"
+#~ msgid "is required by:"
+#~ msgstr "trengs av:"
diff --git a/po/nl/minetest.po b/po/nl/minetest.po
index 5339171..68e3e7b 100644
--- a/po/nl/minetest.po
+++ b/po/nl/minetest.po
@@ -6,9 +6,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-07 00:58+0000\n"
-"Last-Translator: Auke Kok <sofar+github at foo-projects.org>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-16 10:49+0000\n"
+"Last-Translator: Rogier <rogier777 at gmail.com>\n"
 "Language-Team: Dutch "
 "<https://hosted.weblate.org/projects/minetest/minetest/nl/>\n"
 "Language: nl\n"
@@ -16,12 +16,11 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.10\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr ""
-"Er is een fout opgetreden in een Lua script (bijvoorbeeld van een mod):"
+msgstr "Er is een fout opgetreden in een Lua script (bijvoorbeeld van een mod):"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
@@ -245,7 +244,8 @@ msgid ""
 "<octaves>, <persistence>"
 msgstr ""
 "Formaat: <basiswaarde>, <schaal>, (<X-spreiding>, <Y-spreiding>, "
-"<Z-spreiding>), <kiemgetal>, <octaven>, <persistentie>"
+"<Z-spreiding>),\n"
+"<kiemgetal>, <octaven>, <persistentie>"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Games"
@@ -280,7 +280,7 @@ msgstr "Mogelijke waarden zijn: "
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Restore Default"
-msgstr "Standaardwaarde herstellen"
+msgstr "Standaardwaarde"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Select path"
@@ -571,11 +571,11 @@ msgstr "Geen Mipmap"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Node Highlighting"
-msgstr "Node Oplichten"
+msgstr "Node licht op"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Node Outlining"
-msgstr "Node omstrepen"
+msgstr "Node is omlijnd"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
@@ -602,6 +602,10 @@ msgid "Particles"
 msgstr "Effectdeeltjes"
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Reset Singleplayer wereld"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Instellingen"
 
@@ -627,7 +631,7 @@ msgstr "Om schaduwen mogelijk te maken moet OpenGL worden gebruikt."
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Tone Mapping"
-msgstr "Toon Mapping"
+msgstr "Tone-mapping"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Touchthreshold (px)"
@@ -739,7 +743,7 @@ msgstr "Het gespecificeerde wereld-pad bestaat niet: "
 
 #: src/fontengine.cpp
 msgid "needs_fallback_font"
-msgstr "needs_fallback_font"
+msgstr "no"
 
 #: src/game.cpp
 msgid ""
@@ -955,7 +959,7 @@ msgstr "Rechts"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Sneak"
-msgstr "sluipen"
+msgstr "Sluipen"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle Cinematic"
@@ -977,6 +981,10 @@ msgstr "Noclip aan/uit"
 msgid "Use"
 msgstr "Gebruiken"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoomen"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "druk op toets"
@@ -1227,7 +1235,7 @@ msgstr "Print"
 
 #: src/keycode.cpp
 msgid "Prior"
-msgstr "Eerste"
+msgstr "Vorige"
 
 #: src/keycode.cpp
 msgid "Return"
@@ -1293,10 +1301,6 @@ msgstr "X knop 1"
 msgid "X Button 2"
 msgstr "X knop 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoomen"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1305,6 +1309,16 @@ msgid ""
 "sets.\n"
 "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
 msgstr ""
+"(X,Y,Z)-afstand van de fractal, vanaf het centrum van de wereld, als "
+"veelvoud van de schaal.\n"
+"Te gebruiken om een geschikt geboortegebied met laaggelegen land in de buurt "
+"van (0,0)\n"
+"te krijgen.\n"
+"De standaardwaarde is geschikt voor Mandelbrot fractals. Aanpassing is nodig "
+"voor\n"
+"Julia fractals.\n"
+"Bereik: circa -2 tot +2. Vermenigvuldig dit met de 'schaal' voor de afstand "
+"in nodes."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1323,7 +1337,6 @@ msgid "3D mode"
 msgstr "3D modus"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "3D support.\n"
 "Currently supported:\n"
@@ -1340,16 +1353,17 @@ msgstr ""
 "-    anaglyph: 3D met de kleuren cyaan en magenta.\n"
 "-    interlaced: 3D voor polariserend scherm (even/oneven beeldlijnen).\n"
 "-    topbottom: 3D met horizontaal gedeeld scherm (boven/onder).\n"
-"-    sidebyside: 3D met vertikaal gedeeld scherm (links/rechts)."
+"-    sidebyside: 3D met vertikaal gedeeld scherm (links/rechts).\n"
+"-    pageflip: 3D met vier buffers ('quad buffer')."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "A chosen map seed for a new map, leave empty for random.\n"
 "Will be overridden when creating a new world in the main menu."
 msgstr ""
-"Vooringesteld kiemgetal voor de wereld. Indien leeg, wordt een willekeurige "
+"Vooringesteld kiemgetal voor de wereld. Indien leeg, wordt een willekeurige\n"
 "waarde gekozen.\n"
-"Wanneer vanuit het hoofdmenu een nieuwe wereld gecreëerd wordt, kan een "
+"Wanneer vanuit het hoofdmenu een nieuwe wereld gecreëerd wordt, kan een\n"
 "ander kiemgetal gekozen worden."
 
 #: src/settings_translation_file.cpp
@@ -1378,7 +1392,11 @@ msgstr "Bereik waarbinnen blokken actief zijn"
 
 #: src/settings_translation_file.cpp
 msgid "Active Block Modifier interval"
-msgstr "Bereik waarbinnen blok wijzigers actief zijn"
+msgstr "Actieve blokken wijzigers interval"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Actieve blokken wijzigers (ABMs)"
 
 #: src/settings_translation_file.cpp
 msgid "Active block range"
@@ -1403,8 +1421,8 @@ msgid ""
 "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
 "screens."
 msgstr ""
-"Aangepaste DPI (dots per inch) instelling voor het scherm, bijv. voor 4k "
-"schermen (niet voor X11 of Android)."
+"Aangepaste DPI (dots per inch) instelling voor het scherm.\n"
+"Bijv. voor 4k schermen (niet voor X11 of Android)."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1421,7 +1439,7 @@ msgstr "Geavanceerd"
 
 #: src/settings_translation_file.cpp
 msgid "Altitude Chill"
-msgstr "Hoogte Koudheid"
+msgstr "Temperatuurverschil vanwege hoogte"
 
 #: src/settings_translation_file.cpp
 msgid "Always fly and fast"
@@ -1459,13 +1477,17 @@ msgstr "Ingeschatte (X,Y,Z) schaal van fractal in nodes."
 
 #: src/settings_translation_file.cpp
 msgid "Ask to reconnect after crash"
-msgstr "Vraag om de verbinding te herstellen na een server-crash"
+msgstr "verbinding herstellen na een server-crash"
 
 #: src/settings_translation_file.cpp
 msgid "Automaticaly report to the serverlist."
 msgstr "Meldt de server automatisch aan bij de serverlijst."
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Toets voor automatisch lopen aan/uit"
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "Achteruit"
 
@@ -1479,7 +1501,7 @@ msgstr "Basis"
 
 #: src/settings_translation_file.cpp
 msgid "Basic Privileges"
-msgstr "Standaardvoorrechten"
+msgstr "Basisvoorrechten"
 
 #: src/settings_translation_file.cpp
 msgid "Bilinear filtering"
@@ -1498,16 +1520,20 @@ msgid "Build inside player"
 msgstr "Bouwen op de plaats van de speler"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Ingebouwd"
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Bumpmapping"
 
 #: src/settings_translation_file.cpp
 msgid "Camera smoothing"
-msgstr "Vloeiender maken van de camerabeweging"
+msgstr "Vloeiender camerabeweging"
 
 #: src/settings_translation_file.cpp
 msgid "Camera smoothing in cinematic mode"
-msgstr "Vloeiender maken van de camerabeweging (in cinematic modus)"
+msgstr "Vloeiender camerabeweging (in cinematic modus)"
 
 #: src/settings_translation_file.cpp
 msgid "Camera update toggle key"
@@ -1515,11 +1541,11 @@ msgstr "Toets voor cameraverversing aan/uit"
 
 #: src/settings_translation_file.cpp
 msgid "Cave noise #1"
-msgstr "Grot noise patroon #1"
+msgstr "Grot ruispatroon #1"
 
 #: src/settings_translation_file.cpp
 msgid "Cave noise #2"
-msgstr "Grot noise patroon #2"
+msgstr "Grot ruispatroon #2"
 
 #: src/settings_translation_file.cpp
 msgid "Cave width"
@@ -1527,7 +1553,7 @@ msgstr "Grot breedte"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
-msgstr "Grotten en tunnels vormen bij het kruispunt van twee noise patronen"
+msgstr "Grotten en tunnels vormen bij het kruispunt van twee ruis patronen"
 
 #: src/settings_translation_file.cpp
 msgid "Chat key"
@@ -1538,6 +1564,10 @@ msgid "Chat toggle key"
 msgstr "Toets voor tonen/verbergen chat"
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Chat-commando's"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1559,6 +1589,25 @@ msgid ""
 "17 = 4D \"Mandelbulb\" mandelbrot set.\n"
 "18 = 4D \"Mandelbulb\" julia set."
 msgstr ""
+"Keuze uit 18 fractals op basis van 9 formules.\n"
+"1 = 4D \"Roundy\" mandelbrot verzameling.\n"
+"2 = 4D \"Roundy\" julia verzameling.\n"
+"3 = 4D \"Squarry\" mandelbrot verzameling.\n"
+"4 = 4D \"Squarry\" julia verzameling.\n"
+"5 = 4D \"Mandy Cousin\" mandelbrot verzameling.\n"
+"6 = 4D \"Mandy Cousin\" julia verzameling.\n"
+"7 = 4D \"Variatie\" mandelbrot verzameling.\n"
+"8 = 4D \"Variatie\" julia verzameling.\n"
+"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot verzameling.\n"
+"10 = 3D \"Mandelbrot/Mandelbar\" julia verzameling.\n"
+"11 = 3D \"Kerstboom\" mandelbrot verzameling.\n"
+"12 = 3D \"Kerstboom\" julia verzameling.\n"
+"13 = 3D \"Mandelbulb\" mandelbrot verzameling.\n"
+"14 = 3D \"Mandelbulb\" julia verzameling.\n"
+"15 = 3D \"Cosinus Mandelbulb\" mandelbrot verzameling.\n"
+"16 = 3D \"Cosinus Mandelbulb\" julia verzameling.\n"
+"17 = 4D \"Mandelbulb\" mandelbrot verzameling.\n"
+"18 = 4D \"Mandelbulb\" julia verzameling."
 
 #: src/settings_translation_file.cpp
 msgid "Chunk size"
@@ -1610,18 +1659,22 @@ msgstr "Gekleurde mist"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
-"Lijst, door komma's gescheiden, van vertrouwde mods die onveilige functies "
-"mogen gebruiken,\n"
-"zelfs wanneer mod-beveiliging aan staat (via request_insecure_environment())."
+"Lijst van mods die HTTP mogen gebruiken. Deze mods kunnen gegevens uploaden\n"
+"naar en downloaden van het internet.\n"
+"Gescheiden door komma's."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
+"Lijst van vertrouwde mods die onveilige functies mogen gebruiken,\n"
+"zelfs wanneer mod-beveiliging aan staat (via request_insecure_environment())."
+"\n"
+"Gescheiden door komma's."
 
 #: src/settings_translation_file.cpp
 msgid "Command key"
@@ -1670,30 +1723,32 @@ msgid ""
 "unchanged."
 msgstr ""
 "Bepaalt de lengte van de dag/nacht cyclus\n"
-"Voorbeeld: 72 = 20min, 360 = 4min, 1 = 24 uur, 0 = de kloktijd (dag, nacht, "
-"schemering) verandert niet."
+"Voorbeelden:\n"
+"72 = 20min\n"
+"360 = 4min\n"
+"1 = 24 uur\n"
+"0 = de kloktijd (dag, nacht, schemering) verandert niet."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Controls size of deserts and beaches in Mapgen v6.\n"
 "When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
 msgstr ""
-"Bepaalt de grootte van woestijnen en stranden in de wereld-generator "
-"(mapgen) v6.\n"
+"Bepaalt de grootte van woestijnen en stranden in de wereld-generator (mapgen)"
+" v6.\n"
 "Als 'snowbiomes' aan staat, wordt deze instelling genegeerd."
 
 #: src/settings_translation_file.cpp
 msgid "Controls steepness/depth of lake depressions."
-msgstr "Controleert steilheid/diepte van meer depressies."
+msgstr "Bepaalt steilheid/diepte van meer depressies."
 
 #: src/settings_translation_file.cpp
 msgid "Controls steepness/height of hills."
-msgstr "Controleert steilheid/hoogte van heuvels."
+msgstr "Bepaalt steilheid/hoogte van heuvels."
 
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
-"Controleert breedte van tunnels, een kleinere waarde maakt bredere tunnels."
+msgstr "Bepaalt breedte van tunnels, een kleinere waarde maakt bredere tunnels."
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
@@ -1704,12 +1759,16 @@ msgid ""
 "Creates unpredictable lava features in caves.\n"
 "These can make mining difficult. Zero disables them. (0-10)"
 msgstr ""
+"Maakt onvoorspelbare lavabronnen in grotten.\n"
+"Dit kan het graven bemoeilijken. Waardes: 0-10; 0 = uit"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Creates unpredictable water features in caves.\n"
 "These can make mining difficult. Zero disables them. (0-10)"
 msgstr ""
+"Maakt onvoorspelbare waterbronnen in grotten.\n"
+"Dit kan het graven bemoeilijken. Waardes: 0-10; 0 = uit"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair alpha"
@@ -1776,6 +1835,10 @@ msgid "Default privileges"
 msgstr "Standaardvoorrechten"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Standaardformaat voor rapport-bestanden"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1788,12 +1851,19 @@ msgid ""
 "Defines sampling step of texture.\n"
 "A higher value results in smoother normal maps."
 msgstr ""
+"Bemonsterings-interval voor texturen.\n"
+"Een hogere waarde geeft vloeiender normal maps."
 
 #: src/settings_translation_file.cpp
 msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 "Maximale afstand (in blokken van 16 nodes) waarbinnen andere spelers "
-"zichtbaar zijn (0 = oneindig ver)."
+"zichtbaar zijn\n"
+"(0 = oneindig ver)."
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Vertraging bij het versturen van blokken na het bouwen"
 
 #: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
@@ -1828,26 +1898,36 @@ msgid "Desynchronize block animation"
 msgstr "Textuur-animaties niet synchroniseren"
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-"Gedetailleerde profiling-data voor mods. Nuttig voor mod-ontwikkelaars."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Gedetailleerde profiling van mods"
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
 "terrain, the 3 numbers should be identical."
 msgstr ""
+"Bepaalt de vorm van het terrein.\n"
+"De 3 getallen tussen vierkante haken bepalen de schaal\n"
+"van het terrein. Ze dienen alle drie hetzelfde te zijn."
 
 #: src/settings_translation_file.cpp
 msgid "Disable anticheat"
 msgstr "Valsspeelbescherming uitschakelen"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Schakel ANSI-codes in text uit"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Schakel ANSI-codes in text uit. ANSI codes worden bijvoorbeeld\n"
+" gebruikt voor kleuren in de chat.\n"
+"Gebruik dit voor een server met clienten met een versie vóór 0.4.14,\n"
+"indien ANSI-codes van mods uitgeschakeld moeten worden."
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "Lege wachtwoorden niet toestaan"
 
@@ -1872,6 +1952,10 @@ msgid "Dump the mapgen debug infos."
 msgstr "Print wereldgenerator debug informatie."
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Joysticks aanzetten"
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "VBO aanzetten"
 
@@ -1892,6 +1976,8 @@ msgid ""
 "Enable smooth lighting with simple ambient occlusion.\n"
 "Disable for speed or for different looks."
 msgstr ""
+"Vloeiende verlichting met eenvoudige ambient occlusion aanschakelen.\n"
+"Schakel dit uit voor minder vertraging, of voor een ander visueel effect."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1904,7 +1990,8 @@ msgstr ""
 "Zet dit aan om verbindingen van oudere cliënten te weigeren.\n"
 "Oudere cliënten zijn compatibel, in de zin dat ze niet crashen als ze "
 "verbinding \n"
-"maken met nieuwere servers, maar ze ondersteunen wellicht niet alle nieuwere "
+"maken met nieuwere servers, maar ze ondersteunen wellicht niet alle "
+"nieuwere\n"
 "mogelijkheden."
 
 #: src/settings_translation_file.cpp
@@ -1916,9 +2003,8 @@ msgid ""
 msgstr ""
 "Sta het gebruik van een externe media-server toe (indien opgegeven door de "
 "server).\n"
-"Het gebruik van externe media-servers versnelt het downloaden van media "
-"(bijv. texturen) aanzienlijk\n"
-"bij het maken van een verbinding met een server."
+"Het gebruik van externe media-servers versnelt het downloaden van media\n"
+"(bijv. texturen) aanzienlijk bij het maken van een verbinding met een server."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1941,7 +2027,7 @@ msgid ""
 "or need to be auto-generated.\n"
 "Requires shaders to be enabled."
 msgstr ""
-"bumpmapping aanzetten voor texturen. Normalmaps moeten al in de texture pack "
+"Bumpmapping aanzetten voor texturen. Normalmaps moeten al in de texture pack "
 "zitten\n"
 "of ze moeten automatisch gegenereerd worden.\n"
 "Schaduwen moeten aanstaan."
@@ -1952,7 +2038,7 @@ msgstr "Schakelt caching van facedir geroteerde meshes."
 
 #: src/settings_translation_file.cpp
 msgid "Enables filmic tone mapping"
-msgstr "Schakelt Filmisch Toon Mapping in"
+msgstr "Schakelt filmisch tone-mapping in"
 
 #: src/settings_translation_file.cpp
 msgid "Enables minimap."
@@ -1963,12 +2049,24 @@ msgid ""
 "Enables on the fly normalmap generation (Emboss effect).\n"
 "Requires bumpmapping to be enabled."
 msgstr ""
+"Schakelt het genereren van normal maps in (emboss effect).\n"
+"Dit vereist dat bumpmapping ook aan staat."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Enables parallax occlusion mapping.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Schakelt parallax occlusie mappen in.\n"
+"Dit vereist dat shaders ook aanstaan."
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Profilergegevens print interval"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Entiteit-functies"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2035,15 +2133,27 @@ msgid "Field of view"
 msgstr "Zichthoek"
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Zichthoek bij inzoomen"
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr "Zichthoek in graden."
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Zichthoek bij inzoomen, in graden.\n"
+"Het \"zoom\" voorrecht is vereist op de server."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
-"Bestand in de map 'client/serverlist/' met favoriete servers die getoond "
+"Bestand in de map 'client/serverlist/' met favoriete servers die getoond\n"
 "worden in de multiplayer tab."
 
 #: src/settings_translation_file.cpp
@@ -2052,7 +2162,7 @@ msgstr "Filler Diepte"
 
 #: src/settings_translation_file.cpp
 msgid "Filmic tone mapping"
-msgstr ""
+msgstr "Filmisch tone-mapping"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2061,6 +2171,11 @@ msgid ""
 "light edge to transparent textures.  Apply this filter to clean that up\n"
 "at texture load time."
 msgstr ""
+"Gefilterde texturen kunnen RGB-waarden vermengen met transparante buren,\n"
+"die door PNG-optimalisators vaak verwijderd worden. Dit kan donkere of "
+"lichte\n"
+"randen bij transparante texturen tot gevolg hebben.\n"
+"Gebruik dit filter om dat tijdens het laden van texturen te herstellen."
 
 #: src/settings_translation_file.cpp
 msgid "Filtering"
@@ -2127,8 +2242,8 @@ msgid ""
 "From how far blocks are generated for clients, stated in mapblocks (16 "
 "nodes)."
 msgstr ""
-"Tot welke afstand blokken gegenereerd worden voor cliënten. In mapblokken "
-"(16 nodes)."
+"Tot welke afstand blokken gegenereerd worden voor cliënten. In mapblokken ("
+"16 nodes)."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2141,6 +2256,8 @@ msgstr ""
 msgid ""
 "From how far clients know about objects, stated in mapblocks (16 nodes)."
 msgstr ""
+"De afstand waarop clienten geïnformeerd worden over objecten. In blokken (16 "
+"nodes)."
 
 #: src/settings_translation_file.cpp
 msgid "Full screen"
@@ -2179,20 +2296,23 @@ msgid "Generate normalmaps"
 msgstr "Genereer normaalmappen"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Global callbacks"
+msgstr "Algemene callbacks"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Wereldgenerator instellingen specified voor generator v6.\n"
-"Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt "
-"de \"jungles\" vlag genegeerd.\n"
+"Algemene wereldgenerator instellingen.\n"
+"De vlag 'decorations' bepaalt de aanwezigheid van alle decoraties, behalve\n"
+"bij generator v6,\n"
+"waar de aanwezigheid van bomen en oerwoud-gras er niet\n"
+"door beïnvloed wordt.\n"
 "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
 "waarde.\n"
 "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
@@ -2221,16 +2341,31 @@ msgid ""
 "-    error: abort on usage of deprecated call (suggested for mod developers)."
 msgstr ""
 "Behandeling van verouderde lua api aanroepen:\n"
-"-    legacy: (probeer) het oude gedrag na te bootsen (standaard voor een "
-"'release' versie).\n"
-"-    log: boots het oude gedrag na, en log een backtrace van de aanroep "
-"(standaard voor een 'debug' versie).\n"
-"-    error: stop de server bij gebruik van een verouderde aanroep "
-"(aanbevolen voor mod ontwikkelaars)."
+"-    legacy: (probeer) het oude gedrag na te bootsen\n"
+"     (standaard voor een 'release' versie).\n"
+"-    log: boots het oude gedrag na, en log een backtrace van de aanroep\n"
+"     (standaard voor een 'debug' versie).\n"
+"-    error: stop de server bij gebruik van een verouderde aanroep\n"
+"     (aanbevolen voor mod ontwikkelaars)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+"Laat de profiler zichzelf profileren:\n"
+"* Profileer een lege functie.\n"
+"   Dit geeft een schatting van de CPU-tijd die door de profiler zelf "
+"gebruikt wordt,\n"
+"   ten koste van één extra functie-aanroep.\n"
+"* Profileer de code die de statistieken ververst."
 
 #: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
-msgstr "Vertikale aanvangsgroote van het openingsvenster."
+msgstr "Aanvangshoogte van het venster."
 
 #: src/settings_translation_file.cpp
 msgid "Height on which clouds are appearing."
@@ -2246,7 +2381,7 @@ msgstr "Home-pagina van de server. Wordt getoond in de serverlijst."
 
 #: src/settings_translation_file.cpp
 msgid "How deep to make rivers"
-msgstr "Hoe diep rivieren te maken"
+msgstr "Diepte van de rivieren"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2254,21 +2389,11 @@ msgid ""
 "mapblocks (16 nodes).\n"
 "In active blocks objects are loaded and ABMs run."
 msgstr ""
-"Tot op welke afstand van actieve spelers blokken 'actief' zijn. In blokken "
-"(van 16 nodes).\n"
+"Tot op welke afstand van actieve spelers blokken 'actief' zijn. In blokken ("
+"van 16 nodes).\n"
 "In actieve blokken worden objecten geladen (bijv. dieren die rondlopen) en "
-"ABMs uitgevoerd (bijv. groeien van planten)."
-
-#: src/settings_translation_file.cpp
-msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-"Het aantal blokken dat totaal tegelijk onderweg kan zijn, voor de hele "
-"server."
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr "Het aantal blokken dat per cliënt tegelijk onderweg kan zijn."
+"ABMs uitgevoerd\n"
+"(bijv. groeien van planten)."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2281,7 +2406,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "How wide to make rivers"
-msgstr "Hoe breed rivieren te maken"
+msgstr "Breedte van rivieren"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6"
@@ -2309,7 +2434,8 @@ msgid ""
 "enabled."
 msgstr ""
 "Indien uitgeschakeld, dan wordt met de \"gebruiken\" toets snel gevlogen "
-"wanneer de \"vliegen\" en de \"snel\" modus aanstaan."
+"wanneer\n"
+"de \"vliegen\" en de \"snel\" modus aanstaan."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2317,7 +2443,7 @@ msgid ""
 "nodes.\n"
 "This requires the \"noclip\" privilege on the server."
 msgstr ""
-"Indien deze optie aanstaat, in combinatie met \"vliegen\" modus, dan kan de "
+"Indien deze optie aanstaat, in combinatie met \"vliegen\" modus, dan kan de\n"
 "speler door vaste objecten heenvliegen.\n"
 "Dit vereist het \"noclip\" voorrecht op de server."
 
@@ -2326,8 +2452,8 @@ msgid ""
 "If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
 "and descending."
 msgstr ""
-"Indien aangeschakeld, dan wordt de \"gebruiken\" toets gebruikt voor "
-"omlaagklimmen en dalen i.p.v. de \"kruipen\" toets."
+"Indien aangeschakeld, dan wordt de \"gebruiken\" toets gebruikt voor\n"
+"omlaagklimmen en dalen i.p.v. de \"sluipen\" toets."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2348,7 +2474,8 @@ msgid ""
 "Only enable this if you know what you are doing."
 msgstr ""
 "Zorg dat de server niet stopt in geval van ongeldige wereld-data.\n"
-"Alleen aan te schakelen indien bekend is wat de consequenties zijn."
+"Alleen aan te schakelen door spelers / server-beheerders die weten wat de "
+"consequenties zijn."
 
 #: src/settings_translation_file.cpp
 msgid "If enabled, new players cannot join with an empty password."
@@ -2361,7 +2488,7 @@ msgid ""
 "you stand.\n"
 "This is helpful when working with nodeboxes in small areas."
 msgstr ""
-"Indien aangeschakeld, kan een speler blokken plaatsen op de eigen positie "
+"Indien aangeschakeld, kan een speler blokken plaatsen op de eigen positie\n"
 "(het niveau van de voeten en van de ogen).\n"
 "Dit vergemakkelijkt het werken in nauwe ruimtes."
 
@@ -2388,6 +2515,45 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr "Chat console achtergrondkleur (R,G,B)."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"Profileer 'builtin'.\n"
+"Dit is normaal enkel nuttig voor gebruik door ontwikkelaars van\n"
+"het 'builtin'-gedeelte van de server"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Profileer chat-commando's bij het registreren."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Profileer algemene callback-functies bij het registreren.\n"
+"(alles dat mbv een van de minetest.register_*() functies geregistreerd wordt"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr "Profileer de acties van ABMs bij het registreren."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr "Profileer de acties van LBMs bij het registreren."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Profileer de acties van objecten bij het registreren."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Per soort"
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 "Interval voor het opslaan van belangrijke veranderingen in de wereld. In "
@@ -2399,7 +2565,7 @@ msgstr "Interval voor het sturen van de kloktijd naar cliënten."
 
 #: src/settings_translation_file.cpp
 msgid "Inventory items animations"
-msgstr "inventaris items animaties"
+msgstr "Inventaris items animaties"
 
 #: src/settings_translation_file.cpp
 msgid "Inventory key"
@@ -2407,7 +2573,7 @@ msgstr "Rugzak toets"
 
 #: src/settings_translation_file.cpp
 msgid "Invert mouse"
-msgstr "Muibeweging omkeren"
+msgstr "Muisbeweging omkeren"
 
 #: src/settings_translation_file.cpp
 msgid "Invert vertical mouse movement."
@@ -2418,50 +2584,57 @@ msgid "Item entity TTL"
 msgstr "Bestaansduur van objecten"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Iterations of the recursive function.\n"
 "Controls the amount of fine detail."
 msgstr ""
-"Juliaverzameling: Aantal iteraties van de recursieve functie.\n"
+"Aantal iteraties van de recursieve functie.\n"
 "Bepaalt de schaal van de kleinste details."
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Joystick-knop herhalingsinterval"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "Joystick frustrum gevoeligheid"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
 "Has no effect on 3D fractals.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Juliaverzameling: W-waarde van de 4D vorm. Heeft geen effect voor 3D-"
+"fractals.\n"
+"Bereik is ongeveer -2 tot 2."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Julia set only: X component of hypercomplex constant determining julia "
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
-"Juliaverzameling: X-waarde van de 4D vorm.\n"
+"Juliaverzameling: X-waarde van de vorm.\n"
 "Bereik is ongeveer -2 tot 2."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Julia set only: Y component of hypercomplex constant determining julia "
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
-"Juliaverzameling: Y-waarde van de 4D vorm.\n"
+"Juliaverzameling: Y-waarde van de vorm.\n"
 "Bereik is ongeveer -2 tot 2."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Julia set only: Z component of hypercomplex constant determining julia "
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
-"Juliaverzameling: Z-waarde van de 4D-vorm.\n"
+"Juliaverzameling: Z-waarde van de vorm.\n"
 "Bereik is ongeveer -2 tot 2."
 
 #: src/settings_translation_file.cpp
@@ -2473,15 +2646,14 @@ msgid "Jumping speed"
 msgstr "Sprinsnelheid"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Key for decreasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Toets om oneindige zichtastand aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Toets om de zichtastand te verminderen.\n"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2490,19 +2662,18 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets voor het weggooien van het geselecteerde object.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Key for increasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Toets om oneindige zichtastand aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Toets om de zichtastand te vergroten.\n"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2511,8 +2682,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets voor springen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2521,8 +2692,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om snel te bewegen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2531,8 +2702,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om de speler achteruit te bewegen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2541,8 +2712,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om de speler vooruit te bewegen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2551,8 +2722,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om de speler naar links te bewegen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2561,8 +2732,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om de speler naar rechts te bewegen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2571,8 +2742,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om de chat-console te openen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2581,8 +2752,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om het chat-window te openen om commando's te typen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2591,8 +2762,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om het chat-window te openen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2601,8 +2772,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om het rugzak-window te openen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2610,9 +2781,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Toets om debug-stapels te printen. Gebruikt voor ontwikkeling.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Toets om debug-stacks te printen. Gebruikt voor ontwikkeling.\n"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2622,11 +2793,11 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Toets om te kruipen.\n"
+"Toets om te sluipen.\n"
 "Wordt ook gebruikt om naar beneden te klimmen en te dalen indien "
 "aux1_descends uitstaat.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2635,8 +2806,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om tussen 1e-persoon camera en 3e-persoon camera te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2645,8 +2816,18 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om screenshot te maken.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Toets om automatisch lopen aan/uit te schakelen.\n"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2655,8 +2836,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om cinematic modus aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2665,8 +2846,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om de mini-kaart aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2675,8 +2856,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om snelle modus aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2685,8 +2866,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om vliegen aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2695,19 +2876,19 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om 'noclip' modus aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om camera-verversing aan/uit te schakelen. Enkel gebruikt voor "
 "ontwikkeling.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2716,8 +2897,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om debug informatie aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2726,8 +2907,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om de HUD aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2736,8 +2917,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om het tonen van chatberichten aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2746,8 +2927,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om mist aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2757,8 +2938,8 @@ msgid ""
 msgstr ""
 "Toets om het tonen van de code-profiler aan/uit te schakelen. Gebruikt voor "
 "ontwikkeling.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2767,8 +2948,8 @@ msgid ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Toets om oneindige zichtastand aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid "Key use for climbing/descending"
@@ -2780,7 +2961,7 @@ msgstr "Taal"
 
 #: src/settings_translation_file.cpp
 msgid "Large cave depth"
-msgstr "Grote grotten diepte"
+msgstr "Diepte van grote grotten"
 
 #: src/settings_translation_file.cpp
 msgid "Lava Features"
@@ -2799,7 +2980,7 @@ msgid ""
 msgstr ""
 "Type bladeren:\n"
 "-   Fancy:  alle zijden zichtbaar\n"
-"-   Simple: enkel buitenzijden zichtbaar; special_tiles worden gebruikt "
+"-   Simple: enkel buitenzijden zichtbaar; special_tiles wordt gebruikt "
 "indien gedefiniëerd\n"
 "-   Opaque: geen doorzichtige bladeren"
 
@@ -2817,11 +2998,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between ABM execution cycles"
-msgstr "Tijd tussen ABM executie cycli"
+msgstr ""
+"Tijdsinterval waarmee actieve blokken wijzigers (ABMs) geactiveerd worden"
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between NodeTimer execution cycles"
-msgstr "Tijd tussen NodeTimer executie cycli"
+msgstr "Tijdsinterval waarmee node timerd geactiveerd worden"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2837,9 +3019,11 @@ msgstr ""
 "Hoeveelheid logging die geschreven wordt naar debug.txt:\n"
 "-    <leeg> (geen logging)\n"
 "-    none (enkel berichten zonder gedefiniëerd niveau)\n"
-"-    error (alles van minstens fout-niveau)-    warning (alles van minstens "
-"waarschuwings-niveau)-    action (alles van minstens actie-niveau)-    info "
-"(alles van minstens informatie-niveau)-    verbose (alles)"
+"-    error (alles van minstens fout-niveau)\n"
+"-    warning (alles van minstens waarschuwings-niveau)\n"
+"-    action (alles van minstens actie-niveau)\n"
+"-    info (alles van minstens informatie-niveau)\n"
+"-    verbose (alles)"
 
 #: src/settings_translation_file.cpp
 msgid "Limit of emerge queues on disk"
@@ -2857,7 +3041,7 @@ msgid ""
 "-    Downloads performed by main menu (e.g. mod manager).\n"
 "Only has an effect if compiled with cURL."
 msgstr ""
-"Beperking van aantal parallele HTTP verzoeken. Van toepassing op:\n"
+"Beperking van het aantal parallele HTTP verzoeken. Van toepassing op:\n"
 "-    Laden van media indien een externe media-server gebruikt wordt.\n"
 "-    Laden van de serverlijst en server-aankondigingen.\n"
 "-    Downloads vanuit het hoofdmens (bijv. mods).\n"
@@ -2892,6 +3076,25 @@ msgid "Liquid update tick"
 msgstr "Vloeistof verspreidingssnelheid"
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Gebruik de spel-profiler"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+"Gebruik de spel-profiler om profileringsgegevens van het spel te verzamelen."
+"\n"
+"Hierbij komt ook het server-commando '/profiler' beschikbaar.\n"
+"Nuttig voor mod-ontwikkelaars en server-beheerders."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Geladen blokken aanpassers (LBMs)"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr "Hoofdmenu spelbeheer"
 
@@ -2920,7 +3123,6 @@ msgid "Map directory"
 msgstr "Wereld map"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen Valleys.\n"
 "'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2928,69 +3130,61 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Wereldgenerator instellingen specified voor generator v6.\n"
-"Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt "
-"de \"jungles\" vlag genegeerd.\n"
+"Wereldgenerator instellingen specifiek voor generator 'valleys' (valleien).\n"
+"'altitude_chill' maakt hogere gebieden kouder. Dit kan gevolgen hebben voor "
+"de biomen.\n"
+"'humid_rivers' verhoogt de vochtigheidsgraad bij rivieren en andere "
+"gebieden\n"
+"met water. Dit kan gevolgen hebben voor de zorgvuldig geconfigureerde biomen."
+"\n"
 "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
 "waarde.\n"
 "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Wereldgenerator instellingen specified voor generator v7.\n"
-"\"ridges\" zijn rivieren.\n"
+"Wereldgenerator instellingen specifiek voor generator 'flat' (vlak).\n"
+"Verspreide meren en heuvels kunnen toegevoegd worden.\n"
 "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
 "waarde.\n"
 "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Wereldgenerator instellingen specified voor generator v6.\n"
-"Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt "
+"Wereldgenerator instellingen specifiek voor generator v6.\n"
+"Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt\n"
 "de \"jungles\" vlag genegeerd.\n"
 "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
 "waarde.\n"
 "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Wereldgenerator instellingen specified voor generator v6.\n"
-"Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt "
-"de \"jungles\" vlag genegeerd.\n"
+"Wereldgenerator instellingen specifiek voor generator v7.\n"
+"\"ridges\" zijn rivieren.\n"
 "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
 "waarde.\n"
 "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
@@ -3017,15 +3211,15 @@ msgstr "Valleien Wereldgenerator"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen biome heat noise parameters"
-msgstr "Wereldgenerator landschapstemperatuur ruisparameters"
+msgstr "Wereldgenerator landschapstemperatuur"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen biome humidity blend noise parameters"
-msgstr "Wereldgenerator landschapsvochtigheidsovergangen ruisparameters"
+msgstr "Wereldgenerator landschapsvochtigheidsovergangen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen biome humidity noise parameters"
-msgstr "Wereldgenerator landschapsvochtigheid ruisparameters"
+msgstr "Wereldgenerator landschapsvochtigheid"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen debug"
@@ -3041,51 +3235,51 @@ msgstr "Vlakke Wereldgenerator"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave width"
-msgstr "Vlakke wereldgenerator grot breedte"
+msgstr "Grot breedte"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave1 noise parameters"
-msgstr "Vlakke wereldgenerator grotten (1) ruisparameters"
+msgstr "Grotten (1) ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave2 noise parameters"
-msgstr "Vlakke wereldgenerator grotten (2) ruisparameters"
+msgstr "Grotten (2) ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat filler depth noise parameters"
-msgstr "Fractal wereldgenerator vuldiepte ruisparameters"
+msgstr "Vuldiepte ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat flags"
-msgstr "Vlakke wereldgenerator vlaggen"
+msgstr "Vlaggen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat ground level"
-msgstr "Vlakke wereldgenerator grondniveau"
+msgstr "Grondniveau"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill steepness"
-msgstr "Vlakke wereldgenerator heuvel steilheid"
+msgstr "Steilheid van de heuvels"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill threshold"
-msgstr "Vlakke wereldgenerator heuvel grenswaarde"
+msgstr "Heuvel-grenswaarde"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat lake steepness"
-msgstr "Vlakke wereldgenerator meer steilheid"
+msgstr "Steilheid Van de meren"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat lake threshold"
-msgstr "Vlakke wereldgenerator meer grenswaarde"
+msgstr "Meren-grenswaarde"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat large cave depth"
-msgstr "Vlakke wereldgenerator grote grotten diepte"
+msgstr "Grote Grotten diepte"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat terrain noise parameters"
-msgstr "Vlakke Wereldgenerator basisterrein ruisparameters"
+msgstr "Terrein ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal"
@@ -3093,69 +3287,63 @@ msgstr "Fractal wereldgenerator"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave width"
-msgstr "Fractal wereldgenerator grot breedte"
+msgstr "Grot breedte"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave1 noise parameters"
-msgstr "Fractal wereldgenerator grotten (1) ruisparameters"
+msgstr "Grotten (1) ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave2 noise parameters"
-msgstr "Fractal wereldgenerator grotten (2) ruisparameters"
+msgstr "Grotten (2) ruisparameters"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal filler depth noise parameters"
-msgstr "Fractal wereldgenerator vuldiepte ruisparameters"
+msgstr "Vuldiepte ruisparameters"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal fractal"
-msgstr "Fractal wereldgenerator vlaggen"
+msgstr "Fractal"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal iterations"
-msgstr "Fractal wereldgenerator julia iteraties"
+msgstr "Aantal iteraties"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia w"
-msgstr "Fractal wereldgenerator julia w"
+msgstr "Fractal W"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia x"
-msgstr "Fractal wereldgenerator julia x"
+msgstr "Fractal X"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia y"
-msgstr "Fractal wereldgenerator julia y"
+msgstr "Fractal Y"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia z"
-msgstr "Fractal wereldgenerator julia z"
+msgstr "Fractal Z"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal offset"
-msgstr "Fractal wereldgenerator julia centrum-afstand"
+msgstr "Centrum-positie"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal scale"
-msgstr "Fractal wereldgenerator julia schaal"
+msgstr "Schaal"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal seabed noise parameters"
-msgstr "Fractal wereldgenerator zeebodem parameters"
+msgstr "Zeebodem ruisparameters"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal slice w"
-msgstr "Fractal wereldgenerator julia w-doorsnede"
+msgstr "W-doorsnede"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen heat blend noise parameters"
-msgstr "Wereldgenerator landschapstemperatuurovergangen ruisparameters"
+msgstr "Wereldgenerator landschapstemperatuurovergangen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen name"
@@ -3166,30 +3354,28 @@ msgid "Mapgen v5"
 msgstr "Wereldgenerator v5"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v5 cave width"
-msgstr "Fractal wereldgenerator julia schaal"
+msgstr "Grot-breedte"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave1 noise parameters"
-msgstr "Wereldgenerator v5 grot 1 ruisparameters"
+msgstr "Grot 1 ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave2 noise parameters"
-msgstr "Wereldgenerator v5 grot 2 ruisparameters"
+msgstr "Grot 2 ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 factor noise parameters"
-msgstr "Wereldgenerator v5 ruisparameters factor"
+msgstr "Ruisparameters factor"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v5 filler depth noise parameters"
-msgstr "Wereldgenerator v5 vuldiepte ruisparameters"
+msgstr "Vuldiepte ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 height noise parameters"
-msgstr "Wereldgenerator v5 hoogte ruisparameters"
+msgstr "Hoogte ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6"
@@ -3197,130 +3383,127 @@ msgstr "Wereldgenerator v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 apple trees noise parameters"
-msgstr "Wereldgenerator v6 appelbomen ruisparameters"
+msgstr "Appelbomen ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 beach frequency"
-msgstr "Wereldgenerator v6 strand frequentie"
+msgstr "Strand frequentie"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 beach noise parameters"
-msgstr "Wereldgenerator v6 strand ruisparameters"
+msgstr "Strand ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 biome noise parameters"
-msgstr "Wereldgenerator v6 landschap ruisparameters"
+msgstr "Landschap ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 cave noise parameters"
-msgstr "Wereldgenerator v6 grotten ruisparameters"
+msgstr "Grotten ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 desert frequency"
-msgstr "Wereldgenerator v6 woestijn ruisparameters"
+msgstr "Woestijn frequentie"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 flags"
-msgstr "Wereldgenerator v6 vlaggen"
+msgstr "Vlaggen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 height select noise parameters"
-msgstr "Wereldgenerator v6 hoogte-selectie ruisparameters"
+msgstr "Hoogte-selectie ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 humidity noise parameters"
-msgstr "Wereldgenerator v6 vochtigheid ruisparameters"
+msgstr "Vochtigheid ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 mud noise parameters"
-msgstr "Wereldgenerator v6 modder ruisparameters"
+msgstr "Modder ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 steepness noise parameters"
-msgstr "Wereldgenerator v6 steilheid ruisparameters"
+msgstr "Steilheid ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 terrain altitude noise parameters"
-msgstr "Wereldgenerator v6 terrein-hoogte ruisparameters"
+msgstr "Terrein-hoogte ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 terrain base noise parameters"
-msgstr "Wereldgenerator v6 basisterrein ruisparameters"
+msgstr "Basisterrein ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 trees noise parameters"
-msgstr "Wereldgenerator v6 bomen ruisparameters"
+msgstr "Bomen ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7"
 msgstr "Wereldgenerator v7"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v7 cave width"
-msgstr "Fractal wereldgenerator julia schaal"
+msgstr "Grot-breedte"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave1 noise parameters"
-msgstr "Wereldgenerator v7 grotten (1) ruisparameters"
+msgstr "Grotten (1) ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave2 noise parameters"
-msgstr "Wereldgenerator v7 grotten (2) ruisparameters"
+msgstr "Grotten (2) ruisparameters"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v7 filler depth noise parameters"
-msgstr "Wereldgenerator v7 vuldiepte ruisparameters"
+msgstr "Vuldiepte ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 flags"
-msgstr "Wereldgenerator v7 vlaggen"
+msgstr "Vlaggen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 height select noise parameters"
-msgstr "Wereldgenerator v7 hoogte-selectie ruisparameters"
+msgstr "Hoogte-selectie ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 mount height noise parameters"
-msgstr "Wereldgenerator v7 heuvel-hoogte ruisparameters"
+msgstr "Heuvel-hoogte ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 mountain noise parameters"
-msgstr "Wereldgenerator v7 bergen ruisparameters"
+msgstr "Bergen ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 ridge noise parameters"
-msgstr "Wereldgenerator v7 richel ruisparameters"
+msgstr "Richel ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 ridge water noise parameters"
-msgstr "Wereldgenerator richel-water ruisparameters"
+msgstr "Ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 terrain altitude noise parameters"
-msgstr "Wereldgenerator v7 terrein-hoogte ruisparameters"
+msgstr "Terrein-hoogte ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 terrain base noise parameters"
-msgstr "Wereldgenerator v7 terrein basis ruisparameters"
+msgstr "Terrein basis ruisparameters"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v7 terrain persistation noise parameters"
-msgstr "Wereldgenerator v7 terrein-'persist' ruisparameters"
+msgstr "Terrein-'persist' ruisparameters"
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave depth"
-msgstr ""
+msgstr "Zeer grote grotten: diepte"
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave noise"
-msgstr ""
+msgstr "Zeer grote grotten: ruis"
 
 #: src/settings_translation_file.cpp
 msgid "Massive caves form here."
-msgstr ""
+msgstr "Zeer grote grotten ruis parameters."
 
 #: src/settings_translation_file.cpp
 msgid "Max block generate distance"
@@ -3333,8 +3516,8 @@ msgstr "Maximale afstand voor te versturen blokken"
 #: src/settings_translation_file.cpp
 msgid "Max liquids processed per step."
 msgstr ""
-"Maximaal aantal vloeistof-nodes te verwerken (dwz verspreiden) per server-"
-"stap."
+"Maximaal aantal vloeistof-nodes te verwerken (dwz verspreiden)\n"
+"per server-stap."
 
 #: src/settings_translation_file.cpp
 msgid "Max. clearobjects extra blocks"
@@ -3357,11 +3540,18 @@ msgid "Maximum forceloaded blocks"
 msgstr "Maximaal aantal geforceerd geladen blokken"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Maximum hotbar width"
 msgstr "Maximale breedte van de 'hotbar'"
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "Maximaal aantal blokken dat in totaal tegelijk verzonden wordt."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Maximaal aantal blokken per client dat tegelijk verzonden wordt."
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr "Maximaal aantal blokken in de wachtrij voor laden/genereren."
 
@@ -3412,24 +3602,28 @@ msgstr "Maximaal aantal spelers dat tegelijk verbonden kan zijn."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum number of statically stored objects in a block."
-msgstr "Maximaal aantal objecten per block."
+msgstr "Maximaal aantal objecten per blok dat wordt opgeslagen."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Maximaal aantal objecten per blok"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
-"Maximaal gedeelte van het window dat gebruikt mag worden voor de hotbar.\n"
+"Maximale fractie van de breedte het window dat gebruikt mag worden voor de "
+"hotbar.\n"
 "Dit is nuttig als er iets links of rechts ervan getoond moet worden."
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr "Maximaal aantal tegelijk te verzenden blokken per cliënt"
+msgid "Maximum simultaneous block sends per client"
+msgstr "Maximaal simultaan verzonden blokken per cliënt"
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
-msgstr "Maximaal aantal tegelijk te verzenden blokken (totaal)"
+msgid "Maximum simultaneous block sends total"
+msgstr "Maximaal simultaan verzonden blokken (totaal)"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum time in ms a file download (e.g. a mod download) may take."
@@ -3442,17 +3636,12 @@ msgid "Maximum users"
 msgstr "Maximaal aantal gebruikers"
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Maximaal aantal objecten per blok"
-
-#: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Menus"
-msgstr "Menu"
+msgstr "Menus"
 
 #: src/settings_translation_file.cpp
 msgid "Mesh cache"
-msgstr ""
+msgstr "Cache voor meshes"
 
 #: src/settings_translation_file.cpp
 msgid "Message of the day"
@@ -3465,6 +3654,9 @@ msgstr "Toon bericht aan spelers die verbinding maken."
 #: src/settings_translation_file.cpp
 msgid "Method used to highlight selected object."
 msgstr ""
+"Manier waarop het geselecteerde object zichtbaar wordt gemaakt.\n"
+"* box: node wordt omlijnd.\n"
+"* halo: node licht op."
 
 #: src/settings_translation_file.cpp
 msgid "Minimap"
@@ -3483,15 +3675,10 @@ msgid "Minimum texture size for filters"
 msgstr "Minimale textuur-grootte voor filters"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mipmapping"
 msgstr "Mip-Mapping"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr "Mod-winkel details URL"
 
@@ -3525,8 +3712,10 @@ msgid ""
 "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
 msgstr ""
 "Vermenigvuldigingsfactor van loopbeweging bij vallen.\n"
-"Bijvoorbeeld: 0 voor geen loopbeweging; 1.0 voor normale loopbeweging; 2.0 "
-"voor twee keer grotere loopbeweging."
+"Bijvoorbeeld:\n"
+"0 voor geen loopbeweging.\n"
+"1.0 voor normale loopbeweging.\n"
+"2.0 voor twee keer grotere loopbeweging."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3534,8 +3723,10 @@ msgid ""
 "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
 msgstr ""
 "Vermenigvuldigingsfactor van loopbeweging.\n"
-"Bijvoorbeeld: 0 voor geen loopbeweging; 1.0 voor normale loopbeweging; 2.0 "
-"voor twee keer grotere loopbeweging."
+"Bijvoorbeeld:\n"
+"0 voor geen loopbeweging.\n"
+"1.0 voor normale loopbeweging.\n"
+"2.0 voor twee keer grotere loopbeweging."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3585,18 +3776,16 @@ msgid "Noclip"
 msgstr "Noclip"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Noclip key"
 msgstr "Noclip-toets"
 
 #: src/settings_translation_file.cpp
 msgid "Node highlighting"
-msgstr "Oplichtende node"
+msgstr "Geselecteerde node indicatie"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "NodeTimer interval"
-msgstr "Kloktijd verstuur-interval"
+msgstr "Interval voor node-timers"
 
 #: src/settings_translation_file.cpp
 msgid "Noise parameters for biome API temperature, humidity and biome blend."
@@ -3605,15 +3794,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Noises"
-msgstr ""
+msgstr "Ruis"
 
 #: src/settings_translation_file.cpp
 msgid "Normalmaps sampling"
-msgstr ""
+msgstr "Normal-maps bemonstering"
 
 #: src/settings_translation_file.cpp
 msgid "Normalmaps strength"
-msgstr ""
+msgstr "Sterkte van normal-maps"
 
 #: src/settings_translation_file.cpp
 msgid "Number of emerge threads"
@@ -3639,9 +3828,9 @@ msgid ""
 "This is a trade-off between sqlite transaction overhead and\n"
 "memory consumption (4096=100MB, as a rule of thumb)."
 msgstr ""
-"Aantal extra blokken (van 16x16x16 nodes) dat door het commando '/"
-"clearobjects' tegelijk\n"
-"geladen mag worden.\n"
+"Aantal extra blokken (van 16x16x16 nodes) dat door het commando "
+"'/clearobjects'\n"
+"tegelijk geladen mag worden.\n"
 "Dit aantal is een compromis tussen snelheid enerzijds (vanwege de overhead "
 "van een sqlite\n"
 "transactie), en geheugengebruik anderzijds (4096 = ca. 100MB)."
@@ -3652,11 +3841,11 @@ msgstr "Aantal parallax occlusie iteraties."
 
 #: src/settings_translation_file.cpp
 msgid "Overall bias of parallax occlusion effect, usually scale/2."
-msgstr ""
+msgstr "Algemene afwijking van het parallax occlusie effect. Normaal: schaal/2."
 
 #: src/settings_translation_file.cpp
 msgid "Overall scale of parallax occlusion effect."
-msgstr ""
+msgstr "Algemene schaal van het parallax occlusie effect."
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion"
@@ -3667,9 +3856,8 @@ msgid "Parallax occlusion Scale"
 msgstr "Parallax occlusie schaal"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Parallax occlusion bias"
-msgstr "Parallax occlusie"
+msgstr "Parallax occlusie afwijking"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion iterations"
@@ -3680,9 +3868,8 @@ msgid "Parallax occlusion mode"
 msgstr "Parallax occlusie modus"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Parallax occlusion strength"
-msgstr "Parallax occlusie"
+msgstr "Parallax occlusie sterkte"
 
 #: src/settings_translation_file.cpp
 msgid "Path to TrueTypeFont or bitmap."
@@ -3726,8 +3913,8 @@ msgid ""
 "Port to connect to (UDP).\n"
 "Note that the port field in the main menu overrides this setting."
 msgstr ""
-"Netwerk-poort (UDP) waarmee verbinding gemaakt moet worden.In het hoofdmenu "
-"kan een andere waarde opgegeven worden."
+"Netwerk-poort (UDP) waarmee verbinding gemaakt moet worden.\n"
+"In het hoofdmenu kan een andere waarde opgegeven worden."
 
 #: src/settings_translation_file.cpp
 msgid "Prevent mods from doing insecure things like running shell commands."
@@ -3735,22 +3922,28 @@ msgstr ""
 "Voorkom dat mods onveilige commando's uitvoeren, zoals shell commando's."
 
 #: src/settings_translation_file.cpp
-msgid "Privileges that players with basic_privs can grant"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
 msgstr ""
 "Interval waarmee profiler-gegevens geprint worden. 0 = uitzetten. Dit is "
 "nuttig voor ontwikkelaars."
 
 #: src/settings_translation_file.cpp
+msgid "Privileges that players with basic_privs can grant"
+msgstr "Voorrechten die spelers met 'basic_privs' mogen toekennen"
+
+#: src/settings_translation_file.cpp
+msgid "Profiler"
+msgstr "Profiler"
+
+#: src/settings_translation_file.cpp
 msgid "Profiler toggle key"
 msgstr "Profiler aan/uit toets"
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "Profilergegevens print interval"
+msgid "Profiling"
+msgstr "Profileren"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3763,7 +3956,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Raises terrain to make valleys around the rivers"
-msgstr ""
+msgstr "Verhoogt het terrein om rond de rivieren valleien te maken"
 
 #: src/settings_translation_file.cpp
 msgid "Random input"
@@ -3786,6 +3979,10 @@ msgid "Replaces the default main menu with a custom one."
 msgstr "Vervangt het standaard hoofdmenu door een ander."
 
 #: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Rapport pad"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "Toets voor rechts"
 
@@ -3795,19 +3992,21 @@ msgstr "Rechts-klik herhalingsinterval"
 
 #: src/settings_translation_file.cpp
 msgid "River Depth"
-msgstr ""
+msgstr "Diepte van rivieren"
 
 #: src/settings_translation_file.cpp
 msgid "River Noise"
-msgstr ""
+msgstr "Rivier ruis parameters"
 
 #: src/settings_translation_file.cpp
 msgid "River Size"
-msgstr ""
+msgstr "Grootte van rivieren"
 
 #: src/settings_translation_file.cpp
 msgid "River noise -- rivers occur close to zero"
 msgstr ""
+"Rivier ruis parameters.\n"
+"Rivieren komen voor in de buurt van niveau 0"
 
 #: src/settings_translation_file.cpp
 msgid "Rollback recording"
@@ -3856,14 +4055,12 @@ msgid "Screenshot folder"
 msgstr "Map voor screenshots"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot format"
-msgstr "Map voor screenshots"
+msgstr "Formaat voor screenshots"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot quality"
-msgstr "Screenshot"
+msgstr "Screenshot kwaliteit"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3871,6 +4068,9 @@ msgid ""
 "1 means worst quality; 100 means best quality.\n"
 "Use 0 for default quality."
 msgstr ""
+"Kwaliteit van screenshots. Enkel voot JPEG.\n"
+"Van 1 (slechtst) tot 100 (best).\n"
+"0 = een redelijke standaardwaarde."
 
 #: src/settings_translation_file.cpp
 msgid "Security"
@@ -3957,12 +4157,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
-"Shaders maken bijzondere visuele effecten mogelijk, en kunnen op sommige "
-"videokaarten ook de snelheid verhogen.\n"
+"Shaders maken bijzondere visuele effecten mogelijk, en kunnen op sommige\n"
+"videokaarten ook sneller zijn.\n"
 "Alleen mogelijk met OpenGL."
 
 #: src/settings_translation_file.cpp
@@ -3975,7 +4175,7 @@ msgstr "Toon debug informatie"
 
 #: src/settings_translation_file.cpp
 msgid "Show entity selection boxes"
-msgstr ""
+msgstr "Toon selectie-box voor objecten"
 
 #: src/settings_translation_file.cpp
 msgid "Shutdown message"
@@ -3991,7 +4191,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Slope and fill work together to modify the heights"
-msgstr ""
+msgstr "Helling en vulling bepalen in combinatie de hoogte"
 
 #: src/settings_translation_file.cpp
 msgid "Smooth lighting"
@@ -3999,10 +4199,11 @@ msgstr "Vloeiende verlichting"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 "Maakt camerabewegingen vloeiender bij het rondkijken.\n"
+"Wordt ook wel zicht- of muis-smoothing genoemd.\n"
 "Nuttig bij het opnemen van videos."
 
 #: src/settings_translation_file.cpp
@@ -4016,7 +4217,7 @@ msgstr "Maakt camera-rotatie vloeiender. O om uit te zetten."
 
 #: src/settings_translation_file.cpp
 msgid "Sneak key"
-msgstr "Kruipen toets"
+msgstr "Sluipen toets"
 
 #: src/settings_translation_file.cpp
 msgid "Sound"
@@ -4041,11 +4242,11 @@ msgstr "Vast geboortepunt"
 
 #: src/settings_translation_file.cpp
 msgid "Strength of generated normalmaps."
-msgstr ""
+msgstr "Sterkte van de normal-maps."
 
 #: src/settings_translation_file.cpp
 msgid "Strength of parallax."
-msgstr ""
+msgstr "Sterkte van de parallax."
 
 #: src/settings_translation_file.cpp
 msgid "Strict protocol checking"
@@ -4053,7 +4254,7 @@ msgstr "Stricte protocolcontrole"
 
 #: src/settings_translation_file.cpp
 msgid "Support older servers"
-msgstr ""
+msgstr "Ondersteuning voor oudere servers"
 
 #: src/settings_translation_file.cpp
 msgid "Synchronous SQLite"
@@ -4061,7 +4262,7 @@ msgstr "Sqlite synchrone modus"
 
 #: src/settings_translation_file.cpp
 msgid "Terrain Height"
-msgstr ""
+msgstr "Terrein hoogte"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4069,6 +4270,9 @@ msgid ""
 "Controls proportion of world area covered by hills.\n"
 "Adjust towards 0.0 for a larger proportion."
 msgstr ""
+"Terrein ruis-grens voor heuvels.\n"
+"Bepaalt hoeveel van de wereld bedekt is met heuvels.\n"
+"Een lagere waarde (richting 0.0) geeft meer heuvels."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4076,6 +4280,9 @@ msgid ""
 "Controls proportion of world area covered by lakes.\n"
 "Adjust towards 0.0 for a larger proportion."
 msgstr ""
+"Terrein ruis-grens voor meren.\n"
+"Bepaalt hoeveel van de wereld bedekt is met meren.\n"
+"Een lagere waarde (richting 0.0) geeft meer meren."
 
 #: src/settings_translation_file.cpp
 msgid "Texture path"
@@ -4083,11 +4290,27 @@ msgstr "Pad van texturen"
 
 #: src/settings_translation_file.cpp
 msgid "The altitude at which temperature drops by 20C"
+msgstr "Het hoogteverschil voor een termperatuurverschil van 20°C"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
 msgstr ""
+"Het standaardformaat waarin profileringsgegevens worden bewaard,\n"
+" als '/profiler save' wordt aangeroepen zonder expliciet formaat."
 
 #: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
+msgstr "De diepte van aarde of andersoortige toplaag"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
 msgstr ""
+"Het pad, ten opzichte van het wereld-pad, waar profilerings-gegevens worden "
+"opgeslagen.\n"
 
 #: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
@@ -4108,11 +4331,23 @@ msgstr "Het Irrlicht backend voor renderen."
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+"De gevoeligheid van de assen van de joystick voor het bewegen van de "
+"frustrum in het spel."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
 "set to the nearest valid value."
 msgstr ""
+"De sterke van node ambient-occlusie shading effect.\n"
+"Lagere waarden geven een donkerder effect. Hoger is lichter.\n"
+"Geldige waarden zijn van 0.25 tot 4.0. Een ongeldige waarde wordt\n"
+"aangepast naar de dichtstbijzijnde geldige waarde."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4127,10 +4362,18 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"De tijd in seconden tussen herhaalde klikken als de joystick-knop ingedrukt "
+"gehouden wordt."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
-"De tijd in seconden tussen herhaalde rechts-klikken als de rechter muisknop "
+"De tijd in seconden tussen herhaalde rechts-klikken als de rechter muisknop\n"
 "ingedrukt gehouden wordt."
 
 #: src/settings_translation_file.cpp
@@ -4139,7 +4382,7 @@ msgstr "Dit font wordt gebruikt voor bepaalde talen."
 
 #: src/settings_translation_file.cpp
 msgid "Time in between active block management cycles"
-msgstr ""
+msgstr "Tijd tussen ABM cycli"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4170,9 +4413,9 @@ msgid ""
 "This determines how long they are slowed down after placing or removing a "
 "node."
 msgstr ""
-"Om vertraging te verminderen worden blokken minder snel verstuurd als een "
+"Om vertraging te verminderen worden blokken minder snel verstuurd als een\n"
 "speler aan het bouwen is.\n"
-"Deze instelling bepaalt hoelang ze achtergehouden worden nadat een speler "
+"Deze instelling bepaalt hoelang ze achtergehouden worden nadat een speler\n"
 "een node geplaatst of verwijderd heeft."
 
 #: src/settings_translation_file.cpp
@@ -4244,36 +4487,32 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr "Gebruik tri-lineaire filtering om texturen te schalen."
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Nuttig voor mod-ontwikkelaars."
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr "V-Sync"
 
 #: src/settings_translation_file.cpp
 msgid "VBO"
-msgstr ""
+msgstr "VBO"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Depth"
-msgstr ""
+msgstr "Vallei-diepte"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Fill"
-msgstr ""
+msgstr "Vallei-vulling"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Profile"
-msgstr ""
+msgstr "Vallei-profiel"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Slope"
-msgstr ""
+msgstr "Vallei-helling"
 
 #: src/settings_translation_file.cpp
 msgid "Valleys C Flags"
-msgstr ""
+msgstr "Valleien vlaggen"
 
 #: src/settings_translation_file.cpp
 msgid "Vertical screen synchronization."
@@ -4292,6 +4531,8 @@ msgid ""
 "View distance in nodes.\n"
 "Min = 20"
 msgstr ""
+"Zichtafstand in nodes.\n"
+"Minimaal: 20"
 
 #: src/settings_translation_file.cpp
 msgid "View range decrease key"
@@ -4302,23 +4543,23 @@ msgid "View range increase key"
 msgstr "Toets voor vergroten zichtafstand"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Viewing range"
-msgstr "Maximale zichtafstand"
+msgstr "Zichtafstand"
 
 #: src/settings_translation_file.cpp
 msgid "Volume"
 msgstr "Geluidsniveau"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "W co-ordinate of the generated 3D slice of a 4D fractal.\n"
 "Determines which 3D slice of the 4D shape is generated.\n"
 "Has no effect on 3D fractals.\n"
 "Range roughly -2 to 2."
 msgstr ""
-"Juliaverzameling: W-coördinaat van de 3D doorsnede van de 4D vorm.\n"
+"W-coördinaat van de 3D doorsnede van de 4D vorm.\n"
+"Bepaalt welke 3D-doorsnelde van de 4D-vorm gegenereerd wordt.\n"
+"Heeft geen effect voor 3D-fractals.\n"
 "Bereik is ongeveer -2 tot 2."
 
 #: src/settings_translation_file.cpp
@@ -4326,9 +4567,8 @@ msgid "Walking speed"
 msgstr "Loopsnelheid"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Water Features"
-msgstr "Waterniveau"
+msgstr "Ondergronds water"
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
@@ -4382,8 +4622,13 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
+"Als gui_scaling_filter_txr2img aan staat, worden plaatjes\n"
+"van de GPU naar het werkgeheugen gekopiëerd voor schalen.\n"
+"Anders wordt de oude methode gebruikt, voor video-kaarten\n"
+"die geen ondersteuning hebben voor het kopiëren van texturen\n"
+"terug naar het werkgeheugen."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4404,7 +4649,8 @@ msgstr ""
 "aanbevolen\n"
 "machten van 2 te gebruiken. Een waarde groter dan 1 heeft wellicht geen "
 "zichtbaar\n"
-"effect indien bi-lineaire, tri-lineaire of anisotropische niet aan staan."
+"effect indien bi-lineaire, tri-lineaire of anisotropische filtering niet aan "
+"staan."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4417,10 +4663,14 @@ msgid ""
 msgstr ""
 "Grenzen van de wereldgenerator.\n"
 "-    Maximale waarde: 31000 (hogere waarden worden niet gehonoreerd).\n"
-"-    De wereld wordt gegenereerd per gebied van 80x80x80 nodes (5x5x5 "
-"mapblokken).\n"
-"-    Het centrum-gebied begint op coördinaten (-32, -32, -32).\n"
-"-    Enkel groepen die vallen binnen map_generation_limit worden gegenereerd"
+"-    De wereld wordt standaard gegenereerd per gebied van 80x80x80 nodes\n"
+"     (5x5x5 mapblokken).\n"
+"-    Coordinaat (0,0,0) bevindt zich zoveel mogelijk in het centrum van een "
+"gebied.\n"
+"     Dat betekent dat standaard, het meest centrale gebied begint op "
+"coördinaat (-32,-32,-32)\n"
+"-    Enkel gebieden (van standaard 5x5x5 blokken) die geheel vallen binnen\n"
+"     map_generation_limit worden gegenereerd"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4453,8 +4703,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Whether to fog out the end of the visible area."
-msgstr ""
-"Maak het einde van het zichtbereik mistig, zodat het einde niet opvalt."
+msgstr "Maak het einde van het zichtbereik mistig, zodat het einde niet opvalt."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4470,11 +4719,15 @@ msgid ""
 "Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n"
 "Disabling this option will protect your password better."
 msgstr ""
+"Ondersteuning voor oudere servers (vóór protocol versie 25).\n"
+"Schakel dit in voor verbinden met servers versie 0.4.12 en eerder.\n"
+"Voor servers vanaf 0.4.13 is dit niet nodig. Dit geldt ook voor\n"
+"sommige servers versie 0.4.12-dev.\n"
+"Indien dit uit staat, wordt het wachtwoord op een veiligere manier verzonden."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Width component of the initial window size."
-msgstr "Horizontale aanvangsgroote van het window."
+msgstr "Aanvangsbreedte van het venster."
 
 #: src/settings_translation_file.cpp
 msgid "Width of the selectionbox's lines around nodes."
@@ -4491,11 +4744,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Y of flat ground."
-msgstr ""
+msgstr "Niveau van de oppervlakte (Y-coördinaat)."
 
 #: src/settings_translation_file.cpp
 msgid "Y of upper limit of large pseudorandom caves."
-msgstr ""
+msgstr "Minimale diepte van grote semi-willekeurige grotten."
 
 #: src/settings_translation_file.cpp
 msgid "cURL file download timeout"
@@ -4509,209 +4762,141 @@ msgstr "Maximaal parallellisme in cURL"
 msgid "cURL timeout"
 msgstr "cURL timeout"
 
-#~ msgid "Item textures..."
-#~ msgstr "Voorwerp-texturen..."
-
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
 #~ msgstr ""
-#~ "Maak de wateroppervlakte iets lager, zodat het niet de hele node vult.\n"
-#~ "Dit is niet echt geoptimaliseerd, en vloeiende belichting van de\n"
-#~ "wateroppervlakte werkt niet als dit is aangeschakeld."
+#~ "Gedetailleerde profiling-data voor mods. Nuttig voor mod-ontwikkelaars."
 
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
-#~ msgstr "Laat geselecteerde nodes oplichten (schakelt selectie-randen uit)."
-
-#~ msgid ""
-#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
-#~ msgstr ""
-#~ "Juliaverzameling: (X,Y,X) afstanden van wereld-centrum.\n"
-#~ "Bereik is ongeveer -2 tot 2. Vermenigvuldig met j_scale voor de afstand "
-#~ "in nodes."
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Gedetailleerde profiling van mods"
 
 #~ msgid ""
-#~ "Julia set: W value determining the 4D shape.\n"
-#~ "Range roughly -2 to 2."
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
 #~ msgstr ""
-#~ "Juliaverzameling: W-waarde van de 4D vorm.\n"
-#~ "Bereik is ongeveer -2 tot 2."
+#~ "Het aantal blokken dat totaal tegelijk onderweg kan zijn, voor de hele "
+#~ "server."
 
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Toets voor het verkleinen van de zichtafstand. Dit verandert de minimale "
-#~ "zichtafstand.\n"
-#~ "Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
+#~ msgstr "Het aantal blokken dat per cliënt tegelijk onderweg kan zijn."
 
-#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Toets voor het vergroten van de zichtafstand. Dit verandert de minimale "
-#~ "zichtafstand.\n"
-#~ "Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Nuttig voor mod-ontwikkelaars."
 
-#~ msgid ""
-#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
-#~ msgstr ""
-#~ "Mandelbrot verzameling: (X,Y,Z) afstanden vanaf wereld-centrum.\n"
-#~ " Bereik is ongeveer -2 tot 2. Vermenigvuldig met m_scale voor de afstand "
-#~ "in nodes."
+#~ msgid "No of course not!"
+#~ msgstr "Nee, natuurlijk niet!"
 
-#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
-#~ msgstr "Mandelbrot verzameling: (X,Y,Z) schaal, in nodes (bij benadering)."
+#~ msgid "Public Serverlist"
+#~ msgstr "Publieke Serverlijst"
 
-#~ msgid ""
-#~ "Mandelbrot set: Iterations of the recursive function.\n"
-#~ "Controls scale of finest detail."
-#~ msgstr ""
-#~ "Mandelbrot verzameling: Aantal iteraties van de recursieve functie.\n"
-#~ "Bepaalt de schaal van de kleinste details."
+#~ msgid "No!!!"
+#~ msgstr "Nee!!!"
 
+#, fuzzy
 #~ msgid ""
-#~ "Map generation attributes specific to Mapgen fractal.\n"
-#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
 #~ msgstr ""
-#~ "Wereldgeneratie instellingen voor de fractal generator.\n"
-#~ "'julia' selecterd een julia-verzameling in plaats van een mandebrot-"
-#~ "verzameling.\n"
+#~ "Algemene wereldgenerator instellingen.\n"
 #~ "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
 #~ "waarde.\n"
-#~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
-
-#~ msgid "Mapgen fractal mandelbrot iterations"
-#~ msgstr "Fractal wereldgenerator mandelbrot iteraties"
-
-#~ msgid "Mapgen fractal mandelbrot offset"
-#~ msgstr "Fractal wereldgenerator mandelbrot centrum-afstand"
-
-#~ msgid "Mapgen fractal mandelbrot scale"
-#~ msgstr "Fractal wereldgenerator mandelbrot schaal"
-
-#~ msgid "Mapgen fractal mandelbrot slice w"
-#~ msgstr "Fractal wereldgenerator mandelbrot w-doorsnede"
-
-#~ msgid ""
-#~ "Maximum distance above water level for player spawn.\n"
-#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
-#~ "Smaller values may result in a suitable spawn point not being found,\n"
-#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
-#~ msgstr ""
-#~ "Maximum hoogte boven waterniveau waar een speler geboren wordt.\n"
-#~ "Bij hogere waarden zullen de plaatsen dichter bij (x = 0, z = 0) liggen.\n"
-#~ "Bij lagere waarden kan het zijn dat een geschikte plek niet gevonden "
-#~ "wordt,\n"
-#~ "in dat geval wordt de speler geboren op (0, 0, 0), mogelijk onder de "
-#~ "grond."
+#~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten.\n"
+#~ "'trees' en 'flat' zijn enkel van toepassing in mgv6."
 
-#~ msgid ""
-#~ "Minimum wanted FPS.\n"
-#~ "The amount of rendered stuff is dynamically set according to this. and "
-#~ "viewing range min and max."
-#~ msgstr ""
-#~ "Minimaal gewenste FPS.\n"
-#~ "De hoeveelheid gerenderd materiaal wordt aangepast afhankelijk van deze "
-#~ "waarde, en van de min en max zichtafstanden."
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "MP uitschakelen"
 
-#~ msgid "New style water"
-#~ msgstr "Nieuw water"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "ingeschakeld"
 
-#~ msgid ""
-#~ "Pre-generate all item visuals used in the inventory.\n"
-#~ "This increases startup time, but runs smoother in-game.\n"
-#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
-#~ "the inventory."
-#~ msgstr ""
-#~ "Genereer beelden van objecten in de rugzak vooraf.\n"
-#~ "De start-tijd wordt hierdoor langer, maar het spel wordt vloeiender.\n"
-#~ "Dit kost veel geheugen op de videokaart. Als die onvoldoende geheugen "
-#~ "heeft kan dit resulteren in vreemde effecten."
+#~ msgid "Rendering:"
+#~ msgstr "Rendering:"
 
-#~ msgid "Preload inventory textures"
-#~ msgstr "Laad rugzak-texturen vooraf"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Herstart minetest om de driver te activeren"
 
-#~ msgid "Vertical initial window size."
-#~ msgstr "Aanvangshoogte van het window."
+#~ msgid "Game Name"
+#~ msgstr "Spel"
 
-#~ msgid "Vertical spawn range"
-#~ msgstr "Vertikaal geboortegebied"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Kan mod \"$1\" niet naar spel \"$2\" kopiëren"
 
-#~ msgid "Viewing range minimum"
-#~ msgstr "Minimale zichtafstand"
+#~ msgid "GAMES"
+#~ msgstr "SPELLEN"
 
-#~ msgid "Wanted FPS"
-#~ msgstr "Gewenste FPS"
+#~ msgid "Mods:"
+#~ msgstr "Mods:"
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Reset Singleplayer wereld"
+#~ msgid "new game"
+#~ msgstr "nieuw spel"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Schaal-factor toegepast op menu elementen: "
+#~ msgid "EDIT GAME"
+#~ msgstr "SPEL AANPASSEN"
 
-#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Downloaden"
+#~ msgid "Remove selected mod"
+#~ msgstr "Geselecteerde mod verwijderen"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Linkermuisknop: Verplaats alle items. Rechtermuisknop: Verplaats één item"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Mod toevoegen"
 
-#~ msgid "is required by:"
-#~ msgstr "is benodigd voor:"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENT"
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "Instellingen bewaard. "
+#~ msgid "START SERVER"
+#~ msgstr "START SERVER"
 
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Waarschuwing: Instellingen niet consistent. "
+#~ msgid "Name"
+#~ msgstr "Naam"
 
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Kan geen nieuwe wereld aanmaken: de naam bevat onjuiste tekens"
+#~ msgid "Password"
+#~ msgstr "Wachtwoord"
 
-#~ msgid "Show Public"
-#~ msgstr "Publieke server"
+#~ msgid "SETTINGS"
+#~ msgstr "INSTELLINGEN"
 
-#~ msgid "Show Favorites"
-#~ msgstr "Favourieten"
+#~ msgid "Preload item visuals"
+#~ msgstr "Voorwerpen vooraf laden"
 
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Laat het adres leeg om een lokale server te starten."
+#~ msgid "Finite Liquid"
+#~ msgstr "Eindige vloeistoffen"
 
-#~ msgid "Create world"
-#~ msgstr "Maak wereld aan"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "SINGLEPLAYER"
 
-#~ msgid "Address required."
-#~ msgstr "IP-adres nodig."
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "TEXTUREN"
 
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Kan niets verwijderen: Geen wereld geselecteerd"
+#~ msgid "MODS"
+#~ msgstr "MODS"
 
-#~ msgid "Files to be deleted"
-#~ msgstr "Deze bestanden worden verwijderd"
+#~ msgid "Add mod:"
+#~ msgstr "Mod toevoegen:"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Kan geen wereld aanmaken: Geen games gevonden"
+#~ msgid "Local install"
+#~ msgstr "Plaatselijk installeren"
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Kan instellingen niet aanpassen: Niets geselecteerd"
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration.  "
+#~ msgstr ""
+#~ "Let op: Nog niet alle mods zijn geconfigueerd. \n"
+#~ "De mods zullen automatisch worden ingeschakeld als je de configuratie "
+#~ "bewaard. "
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Niet alle bestanden zijn verwijderd"
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration.  "
+#~ msgstr ""
+#~ "LEt op: Sommige ingestelde mods zijn vermist.\n"
+#~ "Hun instellingen worden verwijderd als je de configuratie opslaat. "
 
 #~ msgid ""
 #~ "Default Controls:\n"
@@ -4738,131 +4923,236 @@ msgstr "cURL timeout"
 #~ "- ESC: Menu\n"
 #~ "- T: Chat\n"
 
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
-#~ msgstr ""
-#~ "LEt op: Sommige ingestelde mods zijn vermist.\n"
-#~ "Hun instellingen worden verwijderd als je de configuratie opslaat. "
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Niet alle bestanden zijn verwijderd"
 
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration.  "
-#~ msgstr ""
-#~ "Let op: Nog niet alle mods zijn geconfigueerd. \n"
-#~ "De mods zullen automatisch worden ingeschakeld als je de configuratie "
-#~ "bewaard. "
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Kan instellingen niet aanpassen: Niets geselecteerd"
 
-#~ msgid "Local install"
-#~ msgstr "Plaatselijk installeren"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Kan geen wereld aanmaken: Geen games gevonden"
 
-#~ msgid "Add mod:"
-#~ msgstr "Mod toevoegen:"
+#~ msgid "Files to be deleted"
+#~ msgstr "Deze bestanden worden verwijderd"
 
-#~ msgid "MODS"
-#~ msgstr "MODS"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Kan niets verwijderen: Geen wereld geselecteerd"
 
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "TEXTUREN"
+#~ msgid "Address required."
+#~ msgstr "IP-adres nodig."
 
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "SINGLEPLAYER"
+#~ msgid "Create world"
+#~ msgstr "Maak wereld aan"
 
-#~ msgid "Finite Liquid"
-#~ msgstr "Eindige vloeistoffen"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Laat het adres leeg om een lokale server te starten."
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Voorwerpen vooraf laden"
+#~ msgid "Show Favorites"
+#~ msgstr "Favourieten"
 
-#~ msgid "SETTINGS"
-#~ msgstr "INSTELLINGEN"
+#~ msgid "Show Public"
+#~ msgstr "Publieke server"
 
-#~ msgid "Password"
-#~ msgstr "Wachtwoord"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Kan geen nieuwe wereld aanmaken: de naam bevat onjuiste tekens"
 
-#~ msgid "Name"
-#~ msgstr "Naam"
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Waarschuwing: Instellingen niet consistent. "
 
-#~ msgid "START SERVER"
-#~ msgstr "START SERVER"
+#~ msgid "Configuration saved.  "
+#~ msgstr "Instellingen bewaard. "
 
-#~ msgid "CLIENT"
-#~ msgstr "CLIENT"
+#~ msgid "is required by:"
+#~ msgstr "is benodigd voor:"
 
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Mod toevoegen"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Linkermuisknop: Verplaats alle items. Rechtermuisknop: Verplaats één item"
 
-#~ msgid "Remove selected mod"
-#~ msgstr "Geselecteerde mod verwijderen"
+#, fuzzy
+#~ msgid "Downloading"
+#~ msgstr "Downloaden"
 
-#~ msgid "EDIT GAME"
-#~ msgstr "SPEL AANPASSEN"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Schaal-factor toegepast op menu elementen: "
 
-#~ msgid "new game"
-#~ msgstr "nieuw spel"
+#~ msgid "Wanted FPS"
+#~ msgstr "Gewenste FPS"
 
-#~ msgid "Mods:"
-#~ msgstr "Mods:"
+#~ msgid "Viewing range minimum"
+#~ msgstr "Minimale zichtafstand"
 
-#~ msgid "GAMES"
-#~ msgstr "SPELLEN"
+#~ msgid "Vertical spawn range"
+#~ msgstr "Vertikaal geboortegebied"
 
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Kan mod \"$1\" niet naar spel \"$2\" kopiëren"
+#~ msgid "Vertical initial window size."
+#~ msgstr "Aanvangshoogte van het window."
 
-#~ msgid "Game Name"
-#~ msgstr "Spel"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Laad rugzak-texturen vooraf"
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Herstart minetest om de driver te activeren"
+#~ msgid ""
+#~ "Pre-generate all item visuals used in the inventory.\n"
+#~ "This increases startup time, but runs smoother in-game.\n"
+#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
+#~ "the inventory."
+#~ msgstr ""
+#~ "Genereer beelden van objecten in de rugzak vooraf.\n"
+#~ "De start-tijd wordt hierdoor langer, maar het spel wordt vloeiender.\n"
+#~ "Dit kost veel geheugen op de videokaart. Als die onvoldoende geheugen "
+#~ "heeft kan dit resulteren in vreemde effecten."
 
-#~ msgid "Rendering:"
-#~ msgstr "Rendering:"
+#~ msgid "New style water"
+#~ msgstr "Nieuw water"
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "ingeschakeld"
+#~ msgid ""
+#~ "Minimum wanted FPS.\n"
+#~ "The amount of rendered stuff is dynamically set according to this. and "
+#~ "viewing range min and max."
+#~ msgstr ""
+#~ "Minimaal gewenste FPS.\n"
+#~ "De hoeveelheid gerenderd materiaal wordt aangepast afhankelijk van deze "
+#~ "waarde, en van de min en max zichtafstanden."
 
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "MP uitschakelen"
+#~ msgid ""
+#~ "Maximum distance above water level for player spawn.\n"
+#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
+#~ "Smaller values may result in a suitable spawn point not being found,\n"
+#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
+#~ msgstr ""
+#~ "Maximum hoogte boven waterniveau waar een speler geboren wordt.\n"
+#~ "Bij hogere waarden zullen de plaatsen dichter bij (x = 0, z = 0) liggen.\n"
+#~ "Bij lagere waarden kan het zijn dat een geschikte plek niet gevonden "
+#~ "wordt,\n"
+#~ "in dat geval wordt de speler geboren op (0, 0, 0), mogelijk onder de "
+#~ "grond."
+
+#~ msgid "Mapgen fractal mandelbrot slice w"
+#~ msgstr "Fractal wereldgenerator mandelbrot w-doorsnede"
+
+#~ msgid "Mapgen fractal mandelbrot scale"
+#~ msgstr "Fractal wereldgenerator mandelbrot schaal"
+
+#~ msgid "Mapgen fractal mandelbrot offset"
+#~ msgstr "Fractal wereldgenerator mandelbrot centrum-afstand"
+
+#~ msgid "Mapgen fractal mandelbrot iterations"
+#~ msgstr "Fractal wereldgenerator mandelbrot iteraties"
 
 #~ msgid ""
-#~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
+#~ "Map generation attributes specific to Mapgen fractal.\n"
+#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
 #~ "Flags starting with \"no\" are used to explicitly disable them."
 #~ msgstr ""
-#~ "Wereldgenerator instellingen specified voor generator v7.\n"
-#~ "\"ridges\" zijn rivieren.\n"
+#~ "Wereldgeneratie instellingen voor de fractal generator.\n"
+#~ "'julia' selecterd een julia-verzameling in plaats van een mandebrot-"
+#~ "verzameling.\n"
 #~ "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
 #~ "waarde.\n"
 #~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
 
+#~ msgid ""
+#~ "Mandelbrot set: Iterations of the recursive function.\n"
+#~ "Controls scale of finest detail."
+#~ msgstr ""
+#~ "Mandelbrot verzameling: Aantal iteraties van de recursieve functie.\n"
+#~ "Bepaalt de schaal van de kleinste details."
+
+#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
+#~ msgstr "Mandelbrot verzameling: (X,Y,Z) schaal, in nodes (bij benadering)."
+
+#~ msgid ""
+#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Mandelbrot verzameling: (X,Y,Z) afstanden vanaf wereld-centrum.\n"
+#~ " Bereik is ongeveer -2 tot 2. Vermenigvuldig met m_scale voor de afstand "
+#~ "in nodes."
+
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Toets voor het vergroten van de zichtafstand. Dit verandert de minimale "
+#~ "zichtafstand.\n"
+#~ "Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Toets voor het verkleinen van de zichtafstand. Dit verandert de minimale "
+#~ "zichtafstand.\n"
+#~ "Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#~ msgid ""
+#~ "Julia set: W value determining the 4D shape.\n"
+#~ "Range roughly -2 to 2."
+#~ msgstr ""
+#~ "Juliaverzameling: W-waarde van de 4D vorm.\n"
+#~ "Bereik is ongeveer -2 tot 2."
+
+#~ msgid ""
+#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Juliaverzameling: (X,Y,X) afstanden van wereld-centrum.\n"
+#~ "Bereik is ongeveer -2 tot 2. Vermenigvuldig met j_scale voor de afstand "
+#~ "in nodes."
+
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr "Laat geselecteerde nodes oplichten (schakelt selectie-randen uit)."
+
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Maak de wateroppervlakte iets lager, zodat het niet de hele node vult.\n"
+#~ "Dit is niet echt geoptimaliseerd, en vloeiende belichting van de\n"
+#~ "wateroppervlakte werkt niet als dit is aangeschakeld."
+
+#~ msgid "Item textures..."
+#~ msgstr "Voorwerp-texturen..."
+
 #, fuzzy
 #~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Map generation attributes specific to Mapgen v7.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Flags starting with 'no' are used to explicitly disable them."
 #~ msgstr ""
-#~ "Algemene wereldgenerator instellingen.\n"
+#~ "Wereldgenerator instellingen specified voor generator v6.\n"
+#~ "Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt "
+#~ "de \"jungles\" vlag genegeerd.\n"
 #~ "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
 #~ "waarde.\n"
-#~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten.\n"
-#~ "'trees' en 'flat' zijn enkel van toepassing in mgv6."
-
-#~ msgid "No!!!"
-#~ msgstr "Nee!!!"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Publieke Serverlijst"
+#~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
 
-#~ msgid "No of course not!"
-#~ msgstr "Nee, natuurlijk niet!"
+#, fuzzy
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with 'no' are used to explicitly disable them."
+#~ msgstr ""
+#~ "Wereldgenerator instellingen specified voor generator v7.\n"
+#~ "\"ridges\" zijn rivieren.\n"
+#~ "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
+#~ "waarde.\n"
+#~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
diff --git a/po/pl/minetest.po b/po/pl/minetest.po
index ea404e3..b767a56 100644
--- a/po/pl/minetest.po
+++ b/po/pl/minetest.po
@@ -7,9 +7,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-03-24 19:38+0000\n"
-"Last-Translator: red-001 <red-001 at openmailbox.org>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-11-08 17:20+0000\n"
+"Last-Translator: Jakub Mendel <jimikuba at o2.pl>\n"
 "Language-Team: Polish <https://hosted.weblate.org/projects/minetest/minetest/"
 "pl/>\n"
 "Language: pl\n"
@@ -18,11 +18,11 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"X-Generator: Weblate 2.9\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr "Wystąpił błąd w skrypcie modyfikacji:"
+msgstr "Wystąpił błąd w skrypcie Lua modyfikacji:"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
@@ -54,24 +54,25 @@ msgstr "Niezgodne wersje protokołów. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr "Serwer narzuca wersję protokołu $1. "
+msgstr "Serwer żąda użycia protokołu w wersji $1. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
-msgstr "Serwer wspiera wersje protokołu od $1 do $2. "
+msgstr "Serwer wspiera protokoły w wersjach od $1 do $2. "
 
 #: builtin/mainmenu/common.lua
 msgid "Try reenabling public serverlist and check your internet connection."
 msgstr ""
-"Spróbuj włączyć ponownie publiczną listę serwerów i sprawdź połączenie."
+"Spróbuj ponownie włączyć publiczną listę serwerów i sprawdź swoje połączenie "
+"internetowe."
 
 #: builtin/mainmenu/common.lua
 msgid "We only support protocol version $1."
-msgstr "Wspieramy tylko protokół w wersji $1."
+msgstr "Wspieramy wyłącznie protokół w wersji $1."
 
 #: builtin/mainmenu/common.lua
 msgid "We support protocol versions between version $1 and $2."
-msgstr "Wspieramy protokół w wersji od $1 do $2."
+msgstr "Wspieramy protokoły w wersji od $1 do $2."
 
 #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -87,11 +88,11 @@ msgstr "Zależy od:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Disable MP"
-msgstr "Wyłącz MP"
+msgstr "Wyłącz paczkę modów"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Enable MP"
-msgstr "Włącz MP"
+msgstr "Włącz paczkę modów"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Enable all"
@@ -102,8 +103,8 @@ msgid ""
 "Failed to enable mod \"$1\" as it contains disallowed characters. Only "
 "chararacters [a-z0-9_] are allowed."
 msgstr ""
-"Nie można włączyć moda \"$1\" gdyż nazwa zawiera niedozwolone znaki. "
-"Dozwolone są znaki  [a-z0-9_]."
+"Nie udało się aktywować moda \"$1\", ponieważ zawiera niedozwolone znaki. "
+"Tylko znaki [a-z0-9_] są dozwolone."
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide Game"
@@ -111,7 +112,7 @@ msgstr "Ukryj Grę"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide mp content"
-msgstr "Ukryj zawartość MP"
+msgstr "Ukryj zawartość paczki modów"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Mod:"
@@ -140,11 +141,11 @@ msgstr "Utwórz"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Ściągnij podgrę, taką jak minetest_game, z minetest.net"
+msgstr "Pobierz tryb gry (np. minetest_game), z minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download one from minetest.net"
-msgstr "Ściągninj z minetest.net"
+msgstr "Ściągnij taką z minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
 msgid "Game"
@@ -160,11 +161,12 @@ msgstr "Nie podano nazwy świata lub nie wybrano gry"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Seed"
-msgstr "Ziarno"
+msgstr "Ziarno losowości"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Warning: The minimal development test is meant for developers."
-msgstr "Ostrzeżenie: Gra minimalna jest przeznaczona dla dewelperów."
+msgstr ""
+"Uwaga: Minimal development test jest przeznaczony tylko dla developerów."
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "World name"
@@ -172,7 +174,7 @@ msgstr "Nazwa świata"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "You have no subgames installed."
-msgstr "Nie masz zainstalowanych żadnych podgier."
+msgstr "Nie zainstalowano żadnych trybów gry."
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Are you sure you want to delete \"$1\"?"
@@ -210,7 +212,7 @@ msgstr "\"$1\" nie jest poprawną flagą."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "(No description of setting given)"
-msgstr "(Brak opisu ustawienia)"
+msgstr "(brak opisu)"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "< Back to Settings page"
@@ -241,8 +243,8 @@ msgid ""
 "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
 "<octaves>, <persistence>"
 msgstr ""
-"Składnia: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
-"<octaves>, <persistence>"
+"Format: <offset>, <skala>, (<rozpiętośćX>, <rozpiętośćY>, <rozpiętośćZ>), "
+"<ziarno>, <oktawy>, <trwanie>"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Games"
@@ -262,15 +264,15 @@ msgstr "Wprowadź listę flag oddzielonych przecinkami."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a valid integer."
-msgstr "Wprowadź poprawną liczbę całkowitą."
+msgstr "Proszę wpisać prawidłową liczbę."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a valid number."
-msgstr "Wprowadź poprawną liczbę."
+msgstr "Proszę wpisać prawidłowy numer."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Possible values are: "
-msgstr "Możliwe wartości: "
+msgstr "Możliwe wartości to: "
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Restore Default"
@@ -282,15 +284,15 @@ msgstr "Wybierz ścieżkę"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Show technical names"
-msgstr "Pokaż nazwy ustawień"
+msgstr "Pokaż nazwy techniczne"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "The value must be greater than $1."
-msgstr "Wartość musi być większa od $1."
+msgstr "Wartość musi być większa niż $1."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "The value must be lower than $1."
-msgstr "Wartość musi być mniejsza od $1."
+msgstr "Wartość musi być mniejsza niż $1."
 
 #: builtin/mainmenu/modmgr.lua
 msgid ""
@@ -298,7 +300,7 @@ msgid ""
 "Install Mod: unsupported filetype \"$1\" or broken archive"
 msgstr ""
 "\n"
-"Instalacja moda: nieznany typ pliku \"$1\" lub archiwum uszkodzone"
+"Instalacja moda: nieznany typ pliku \"$1\" lub uszkodzone archiwum"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Failed to install $1 to $2"
@@ -319,7 +321,7 @@ msgstr ""
 
 #: builtin/mainmenu/store.lua
 msgid "Close store"
-msgstr "Zamknij sklep"
+msgstr "Zamknij"
 
 #: builtin/mainmenu/store.lua
 msgid "Downloading $1, please wait..."
@@ -343,11 +345,11 @@ msgstr "Szukaj"
 
 #: builtin/mainmenu/store.lua
 msgid "Shortname:"
-msgstr "Nazwa świata:"
+msgstr "Nazwa skrócona:"
 
 #: builtin/mainmenu/store.lua
 msgid "Successfully installed:"
-msgstr "Udana instalacja:"
+msgstr "Zainstalowano pomyślnie:"
 
 #: builtin/mainmenu/store.lua
 msgid "Unsorted"
@@ -375,7 +377,7 @@ msgstr "Byli współautorzy"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Previous Core Developers"
-msgstr "Poprzedni Główni Twórcy"
+msgstr "Poprzedni Główni Deweloperzy"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Installed Mods:"
@@ -387,7 +389,7 @@ msgstr "Informacje o modzie:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "No mod description available"
-msgstr "Brak informacji o modzie"
+msgstr "Brak dostępnych informacji o modzie"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Rename"
@@ -403,12 +405,11 @@ msgstr "Usuń zaznaczony modyfikację"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Uninstall selected modpack"
-msgstr "Usuń zaznaczony modpack"
+msgstr "Odinstaluj wybraną paczkę modów"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "Adres / Port :"
+msgstr "Adres / Port"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
@@ -427,19 +428,16 @@ msgid "Damage enabled"
 msgstr "Obrażenia włączone"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Del. Favorite"
-msgstr "Ulubione:"
+msgstr "Usuń ulubiony"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Favorite"
-msgstr "Ulubione:"
+msgstr "Ulubione"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Nazwa gracza / Hasło :"
+msgstr "Nazwa gracza / Hasło"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -447,7 +445,7 @@ msgstr "PvP włączone"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Bind Address"
-msgstr "Przypisz Adres"
+msgstr "Adres"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "Configure"
@@ -473,7 +471,7 @@ msgstr "Nowy"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "No world created or selected!"
-msgstr "Nie stworzono lub nie wybrano świata!"
+msgstr "Nie wybrano bądź nie utworzono świata!"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Port"
@@ -524,16 +522,14 @@ msgid "Antialiasing:"
 msgstr "Antyaliasing:"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Are you sure to reset your singleplayer world?"
-msgstr "Pojedynczy gracz"
+msgstr "Jesteś pewny że chcesz zresetować świat singleplayer?"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Bilinear Filter"
 msgstr "Filtrowanie dwuliniowe"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
 msgstr "Mapowanie wypukłości"
 
@@ -570,23 +566,20 @@ msgid "No Mipmap"
 msgstr "Mip-Mappowanie wyłączone"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Highlighting"
-msgstr "Płynne oświetlenie"
+msgstr "Podświetlanie bloku"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Outlining"
-msgstr "Płynne oświetlenie"
+msgstr "Obramowanie bloków"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
 msgstr "Brak"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Normal Mapping"
-msgstr "Mip-Mappowanie"
+msgstr "Mapowanie normalnych"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
@@ -601,11 +594,14 @@ msgid "Parallax Occlusion"
 msgstr "Mapowanie paralaksy"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
 msgstr "Włącz Efekty Cząsteczkowe"
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Resetuj świat pojedynczego gracza"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Ustawienia"
 
@@ -627,35 +623,31 @@ msgstr "Teksturowanie:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr ""
+msgstr "Sterownik OpenGL jest wymagany aby włączyć shadery."
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
-#, fuzzy
 msgid "Tone Mapping"
-msgstr "Mip-Mappowanie"
+msgstr "Tone Mapping"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Touchthreshold (px)"
-msgstr ""
+msgstr "Próg dotyku (px)"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Trilinear Filter"
 msgstr "Filtrowanie trójliniowe"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Leaves"
-msgstr "Ozdobne drzewa"
+msgstr "Falujące liście"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Plants"
-msgstr "Ozdobne drzewa"
+msgstr "Falujące rośliny"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Water"
-msgstr "Ozdobne drzewa"
+msgstr "Falująca woda"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Yes"
@@ -663,7 +655,7 @@ msgstr "Tak"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Config mods"
-msgstr "Skonfiguruj mody"
+msgstr "Ustawienia modów"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Main"
@@ -695,19 +687,19 @@ msgstr "Paczki tekstur"
 
 #: src/client.cpp
 msgid "Connection timed out."
-msgstr "Przekroczono limit czasu połączenia."
+msgstr "Upłynął czas połączenia."
 
 #: src/client.cpp
 msgid "Done!"
-msgstr "Zrobione!"
+msgstr "Gotowe!"
 
 #: src/client.cpp
 msgid "Initializing nodes"
-msgstr "Initializownie nod"
+msgstr "Inicjalizacja elementów"
 
 #: src/client.cpp
 msgid "Initializing nodes..."
-msgstr "Initializowanie nod..."
+msgstr "Inicjalizacja elementów..."
 
 #: src/client.cpp
 msgid "Loading textures..."
@@ -715,7 +707,7 @@ msgstr "Ładowanie tekstur..."
 
 #: src/client.cpp
 msgid "Rebuilding shaders..."
-msgstr "Kompilowanie shaderów..."
+msgstr "Przebudowywanie shaderów..."
 
 #: src/client/clientlauncher.cpp
 msgid "Connection error (timed out?)"
@@ -739,11 +731,11 @@ msgstr "Nie wybrano świata ani adresu."
 
 #: src/client/clientlauncher.cpp
 msgid "Player name too long."
-msgstr "Nazwa gracza zbyt długa."
+msgstr "Nazwa gracza jest za długa."
 
 #: src/client/clientlauncher.cpp
 msgid "Provided world path doesn't exist: "
-msgstr "Podana ścieżka do świata nie istnieje: "
+msgstr "Podana ścieżka świata nie istnieje: "
 
 #: src/fontengine.cpp
 msgid "needs_fallback_font"
@@ -967,7 +959,7 @@ msgstr "Skradanie"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle Cinematic"
-msgstr "Włącz/Wyłącz tryb Cinematic"
+msgstr "Przełącz na tryb Cinematic"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle fast"
@@ -985,6 +977,10 @@ msgstr "Przełącz tryb noclip"
 msgid "Use"
 msgstr "Użyj"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "naciśnij klawisz"
@@ -1047,7 +1043,7 @@ msgstr "Control"
 
 #: src/keycode.cpp
 msgid "Convert"
-msgstr "Convert"
+msgstr "Konwertuj"
 
 #: src/keycode.cpp
 msgid "CrSel"
@@ -1058,7 +1054,6 @@ msgid "Down"
 msgstr "Dół"
 
 #: src/keycode.cpp
-#, fuzzy
 msgid "End"
 msgstr "End"
 
@@ -1076,7 +1071,7 @@ msgstr "ExSel"
 
 #: src/keycode.cpp
 msgid "Execute"
-msgstr "Execute"
+msgstr "Wykonaj"
 
 #: src/keycode.cpp
 msgid "Final"
@@ -1140,11 +1135,11 @@ msgstr "Minus"
 
 #: src/keycode.cpp
 msgid "Mode Change"
-msgstr "Mode Change"
+msgstr "Zmiana Trybu"
 
 #: src/keycode.cpp
 msgid "Next"
-msgstr "Next"
+msgstr "Następny"
 
 #: src/keycode.cpp
 msgid "Nonconvert"
@@ -1156,59 +1151,59 @@ msgstr "Num Lock"
 
 #: src/keycode.cpp
 msgid "Numpad *"
-msgstr "Numpad *"
+msgstr "Numeryczna *"
 
 #: src/keycode.cpp
 msgid "Numpad +"
-msgstr "Numpad +"
+msgstr "Numeryczna +"
 
 #: src/keycode.cpp
 msgid "Numpad -"
-msgstr "Numpad -"
+msgstr "Numeryczna -"
 
 #: src/keycode.cpp
 msgid "Numpad /"
-msgstr "Numpad /"
+msgstr "Numeryczna /"
 
 #: src/keycode.cpp
 msgid "Numpad 0"
-msgstr "Numpad 0"
+msgstr "Numeryczna 0"
 
 #: src/keycode.cpp
 msgid "Numpad 1"
-msgstr "Numpad 1"
+msgstr "Numeryczna 1"
 
 #: src/keycode.cpp
 msgid "Numpad 2"
-msgstr "Numpad 2"
+msgstr "Numeryczna 2"
 
 #: src/keycode.cpp
 msgid "Numpad 3"
-msgstr "Numpad 3"
+msgstr "Numeryczna 3"
 
 #: src/keycode.cpp
 msgid "Numpad 4"
-msgstr "Numpad 4"
+msgstr "Numeryczna 4"
 
 #: src/keycode.cpp
 msgid "Numpad 5"
-msgstr "Numpad 5"
+msgstr "Numeryczna 5"
 
 #: src/keycode.cpp
 msgid "Numpad 6"
-msgstr "Numpad 6"
+msgstr "Numeryczna 6"
 
 #: src/keycode.cpp
 msgid "Numpad 7"
-msgstr "Numpad 7"
+msgstr "Numeryczna 7"
 
 #: src/keycode.cpp
 msgid "Numpad 8"
-msgstr "Numpad 8"
+msgstr "Numeryczna 8"
 
 #: src/keycode.cpp
 msgid "Numpad 9"
-msgstr "Numpad 9"
+msgstr "Numeryczna 9"
 
 #: src/keycode.cpp
 msgid "OEM Clear"
@@ -1302,10 +1297,6 @@ msgstr "X Button 1"
 msgid "X Button 2"
 msgstr "X Button 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1314,12 +1305,21 @@ msgid ""
 "sets.\n"
 "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
 msgstr ""
+"(X, Y, Z) offset fraktalu od centrum świata w jednostkach \"skali\".\n"
+"Używany by przesunąć  odpowiednie miejsce do spawnu niskiego podłoża blisko "
+"punktu (0, 0).\n"
+"Domyślny jest odpowiedni dla zbiorów Mandelbrota, wymaga edycji dla zbiorów "
+"Julii.\n"
+"Zakres w przybliżeniu -2 do 2. Pomnożony przez \"skalę\" dla offsetu na "
+"węzłech."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "0 = parallax occlusion with slope information (faster).\n"
 "1 = relief mapping (slower, more accurate)."
 msgstr ""
+"0 = parallax occlusion z informacją nachylenia (szybsze).\n"
+"1 = relief mapping (wolniejsze, bardziej dokładne)."
 
 #: src/settings_translation_file.cpp
 msgid "3D clouds"
@@ -1340,63 +1340,89 @@ msgid ""
 "-    sidebyside: split screen side by side.\n"
 "-    pageflip: quadbuffer based 3d."
 msgstr ""
+"Wsparcie 3D\n"
+"Aktualnie wspierane:\n"
+"-    none: bez wyjścia 3d.\n"
+"-    anaglyph: cyan/magenta kolor 3d.\n"
+"-    interlaced: bazujący na polaryzacji parzystej/nieparzystej linii.\n"
+"-    topbottom: podzielony ekran góra/dół.\n"
+"-    sidebyside: podzielony obok siebie.\n"
+"-    pageflip: bazujący na quadbuffer."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "A chosen map seed for a new map, leave empty for random.\n"
 "Will be overridden when creating a new world in the main menu."
 msgstr ""
+"Wybrane ziarno dla nowej mapy, pozostaw puste dla losowego ziarna.\n"
+"Będzie nadpisane kiedy tworzy się nowy świat w głównym menu."
 
 #: src/settings_translation_file.cpp
 msgid "A message to be displayed to all clients when the server crashes."
 msgstr ""
+"Wiadomość wyświetlana wszystkim klientom kiedy serwer zerwie połączenie."
 
 #: src/settings_translation_file.cpp
 msgid "A message to be displayed to all clients when the server shuts down."
 msgstr ""
+"Wiadomość, która będzie wyświetlona wszystkim klientom kiedy serwer zostanie "
+"wyłączony."
 
 #: src/settings_translation_file.cpp
 msgid "Absolute limit of emerge queues"
-msgstr ""
+msgstr "Bezwzględny limit kolejki"
 
 #: src/settings_translation_file.cpp
 msgid "Acceleration in air"
-msgstr ""
+msgstr "Przyspieszenie w powietrzu"
 
 #: src/settings_translation_file.cpp
 msgid "Active Block Management interval"
-msgstr ""
+msgstr "Interwał zarządzania aktywnym blokiem"
 
 #: src/settings_translation_file.cpp
 msgid "Active Block Modifier interval"
-msgstr ""
+msgstr "Interwał modyfikatora aktywnego bloku"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "Interwał modyfikatora aktywnego bloku"
 
 #: src/settings_translation_file.cpp
 msgid "Active block range"
-msgstr ""
+msgstr "Zasięg aktywnego bloku"
 
 #: src/settings_translation_file.cpp
 msgid "Active object send range"
-msgstr ""
+msgstr "Zasięg wysyłania aktywnego obiektu"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Address to connect to.\n"
 "Leave this blank to start a local server.\n"
 "Note that the address field in the main menu overrides this setting."
 msgstr ""
+"Adres połączenia.\n"
+"Pozostaw pusty aby utworzyć lokalny serwer.\n"
+"Zauważ że pole adresu w głównym menu nadpisuje te ustawienie."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
 "screens."
 msgstr ""
+"Ustaw konfiguracje DPI dla twojego ekranu (nie X11/Tylko Android) np. dla "
+"ekranów 4k."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n"
 "This setting is for the client only and is ignored by the server."
 msgstr ""
+"Ustaw enkodowanie gamma dla tablic świateł. Niższe wartości są jaśniejsze.\n"
+"Te ustawienie jest tylko dla klientów i jest ignorowane przez serwer."
 
 #: src/settings_translation_file.cpp
 msgid "Advanced"
@@ -1404,11 +1430,11 @@ msgstr "Zaawansowane"
 
 #: src/settings_translation_file.cpp
 msgid "Altitude Chill"
-msgstr ""
+msgstr "Wysokość mrozu"
 
 #: src/settings_translation_file.cpp
 msgid "Always fly and fast"
-msgstr ""
+msgstr "Zawsze lataj oraz poruszaj się szybko"
 
 #: src/settings_translation_file.cpp
 msgid "Ambient occlusion gamma"
@@ -1416,16 +1442,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Amplifies the valleys"
-msgstr ""
+msgstr "Wzmacnia doliny"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Anisotropic filtering"
 msgstr "Filtrowanie anizotropowe"
 
 #: src/settings_translation_file.cpp
 msgid "Announce server"
-msgstr ""
+msgstr "Rozgłoś serwer"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1433,49 +1458,54 @@ msgid ""
 "If you want to announce your ipv6 address, use  serverlist_url = v6.servers."
 "minetest.net."
 msgstr ""
+"Zgłoś do tej listy serwerów.\n"
+"Jeśli chcesz zgłosić twój adres ipv6, użyj serverlist_url = v6.servers."
+"minetest.net."
 
 #: src/settings_translation_file.cpp
 msgid "Approximate (X,Y,Z) scale of fractal in nodes."
-msgstr ""
+msgstr "Przybliżona (X,Y,Z) skala fraktali w węzłach."
 
 #: src/settings_translation_file.cpp
 msgid "Ask to reconnect after crash"
-msgstr ""
+msgstr "Poproś o ponowne połączenie po awarii"
 
 #: src/settings_translation_file.cpp
 msgid "Automaticaly report to the serverlist."
+msgstr "Automatycznie zgłoś do listy serwerów."
+
+#: src/settings_translation_file.cpp
+msgid "Autorun key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Backward key"
-msgstr "Tył"
+msgstr "Wstecz"
 
 #: src/settings_translation_file.cpp
 msgid "Base terrain height"
-msgstr ""
+msgstr "Bazowa wysokość terenu"
 
 #: src/settings_translation_file.cpp
 msgid "Basic"
-msgstr ""
+msgstr "Podstawowy"
 
 #: src/settings_translation_file.cpp
 msgid "Basic Privileges"
-msgstr ""
+msgstr "Podstawowe uprawnienia"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Bilinear filtering"
 msgstr "Filtrowanie dwuliniowe"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Bind address"
-msgstr "Sprawdzanie adresu..."
+msgstr "Sprawdzanie adresu"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Bits per pixel (aka color depth) in fullscreen mode."
-msgstr ""
+msgstr "Bity na pixel (głębia koloru) w trybie pełnoekranowym."
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -1483,46 +1513,52 @@ msgid "Build inside player"
 msgstr "Gra wieloosobowa"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Wbudowany"
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Mapowanie wypukłości"
 
 #: src/settings_translation_file.cpp
 msgid "Camera smoothing"
-msgstr ""
+msgstr "Wygładzanie kamery"
 
 #: src/settings_translation_file.cpp
 msgid "Camera smoothing in cinematic mode"
-msgstr ""
+msgstr "Wygładzanie kamery w trybie cinematic"
 
 #: src/settings_translation_file.cpp
 msgid "Camera update toggle key"
-msgstr ""
+msgstr "Klawisz przełączania kamery"
 
 #: src/settings_translation_file.cpp
 msgid "Cave noise #1"
-msgstr ""
+msgstr "Szum jaskini #1"
 
 #: src/settings_translation_file.cpp
 msgid "Cave noise #2"
-msgstr ""
+msgstr "Szum jaskini #2"
 
 #: src/settings_translation_file.cpp
 msgid "Cave width"
-msgstr ""
+msgstr "Szerokość jaskini"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
-msgstr ""
+msgstr "Jaskinie i tunele tworzą się na przecięciu dwóch szumów"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Chat key"
-msgstr "Zmień klawisze"
+msgstr "Klawisz czatu"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Chat toggle key"
-msgstr "Zmień klawisze"
+msgstr "Klawisz przełączania czatu"
+
+#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Komenda"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1546,112 +1582,125 @@ msgid ""
 "17 = 4D \"Mandelbulb\" mandelbrot set.\n"
 "18 = 4D \"Mandelbulb\" julia set."
 msgstr ""
+"Wybór 18 fraktali z 9 formuł.\n"
+"1 = 4D \"Roundy\" zbiór Mandelbrota .\n"
+"2 = 4D \"Roundy\" zbiór Julii.\n"
+"3 = 4D \"Squarry\" zbiór Mandelbrota.\n"
+"4 = 4D \"Squarry\" zbiór Julii.\n"
+"5 = 4D \"Mandy Cousin\" zbiór Mandelbrota.\n"
+"6 = 4D \"Mandy Cousin\" zbiór Julii.\n"
+"7 = 4D \"Variation\" zbiór Mandelbrota.\n"
+"8 = 4D \"Variation\" zbiór Julii.\n"
+"9 = 3D \"Mandelbrot/Mandelbar\" zbiór Mandelbrota.\n"
+"10 = 3D \"Mandelbrot/Mandelbar\" zbiór Julii.\n"
+"11 = 3D \"Christmas Tree\" zbiór Mandelbrota.\n"
+"12 = 3D \"Christmas Tree\" zbiór Julii.\n"
+"13 = 3D \"Mandelbulb\" zbiór Mandelbrota.\n"
+"14 = 3D \"Mandelbulb\" zbiór Julii.\n"
+"15 = 3D \"Cosine Mandelbulb\" zbiór Mandelbrota.\n"
+"16 = 3D \"Cosine Mandelbulb\" zbiór Julii.\n"
+"17 = 4D \"Mandelbulb\" zbiór Mandelbrota.\n"
+"18 = 4D \"Mandelbulb\" zbiór Julii."
 
 #: src/settings_translation_file.cpp
 msgid "Chunk size"
-msgstr ""
+msgstr "Szerokość fragmentu"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Cinematic mode"
-msgstr "Tryb kreatywny"
+msgstr "Tryb Cinematic"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Cinematic mode key"
-msgstr "Tryb kreatywny"
+msgstr "Klawisz trybu Cinematic"
 
 #: src/settings_translation_file.cpp
 msgid "Clean transparent textures"
-msgstr ""
+msgstr "Czyste przeźroczyste tekstury"
 
 #: src/settings_translation_file.cpp
 msgid "Client and Server"
-msgstr ""
+msgstr "Klient i Serwer"
 
 #: src/settings_translation_file.cpp
 msgid "Climbing speed"
-msgstr ""
+msgstr "Szybkość wspinania"
 
 #: src/settings_translation_file.cpp
 msgid "Cloud height"
-msgstr ""
+msgstr "Wysokość chmur"
 
 #: src/settings_translation_file.cpp
 msgid "Cloud radius"
-msgstr ""
+msgstr "Zasięg chmur"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Clouds"
 msgstr "Chmury 3D"
 
 #: src/settings_translation_file.cpp
 msgid "Clouds are a client side effect."
-msgstr ""
+msgstr "Chmury są efektem po stronie klienta."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Clouds in menu"
-msgstr "Menu główne"
+msgstr "Chmury w menu"
 
 #: src/settings_translation_file.cpp
 msgid "Colored fog"
-msgstr ""
+msgstr "Kolorowa mgła"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
+"Lista oddzielonych przecinkiem modów które mają pozwolenie na dostęp do\n"
+"API HTTP, które pozwala im wysyłać i pobierać dane do/z internetu."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
+"Lista oddzielona przecinkiem zaufanych modów które mają dostęp\n"
+"do niebezpiecznych funkcji nawet gdy zabezpieczenie modów jest włączone."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Command key"
-msgstr "Komenda"
+msgstr "Klawisz komend"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Connect glass"
-msgstr "Połącz"
+msgstr "Połączone szkło"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Connect to external media server"
-msgstr "Łączenie z serwerem..."
+msgstr "Łączenie z zewnętrznym serwerem mediów"
 
 #: src/settings_translation_file.cpp
 msgid "Connects glass if supported by node."
-msgstr ""
+msgstr "Połącz szkło jeśli wspierane przez blok."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Console alpha"
-msgstr "Konsola"
+msgstr "Przeźroczystość konsoli"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Console color"
-msgstr "Konsola"
+msgstr "Kolor konsoli"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Console key"
-msgstr "Konsola"
+msgstr "Klawisz konsoli"
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward"
-msgstr ""
+msgstr "Ciągle na przód"
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward movement (only used for testing)."
-msgstr ""
+msgstr "Ciągłe poruszanie się na przód (tylko do testowania)."
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -1664,159 +1713,175 @@ msgid ""
 "Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays "
 "unchanged."
 msgstr ""
+"Kontrola długości cyklu dnia i nocy.\n"
+"Przykłady: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = dzień/noc/cokolwiek "
+"zostaje niezmienione."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Controls size of deserts and beaches in Mapgen v6.\n"
 "When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
 msgstr ""
+"Kontrola szerokości pustyni i plaż w generatorze map v6.\n"
+"Kiedy śnieżne biomy są włączone to 'mgv6_freq_desert'  zostanie zignorowane."
 
 #: src/settings_translation_file.cpp
 msgid "Controls steepness/depth of lake depressions."
-msgstr ""
+msgstr "Kontroluje stromość/głębokość depresji jeziora."
 
 #: src/settings_translation_file.cpp
 msgid "Controls steepness/height of hills."
-msgstr ""
+msgstr "Kontroluje stromość/wysokość gór."
 
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Kontroluje szerokość tuneli, mniejsze wartości tworzą szersze tunele."
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
-msgstr ""
+msgstr "Wiadomość awarii"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Creates unpredictable lava features in caves.\n"
 "These can make mining difficult. Zero disables them. (0-10)"
 msgstr ""
+"Tworzy nieobliczalne pojawianie się lawy w jaskiniach.\n"
+"Może zwiększyć trudność kopania. Zero wyłącza tę opcję. (0-10)"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Creates unpredictable water features in caves.\n"
 "These can make mining difficult. Zero disables them. (0-10)"
 msgstr ""
+"Tworzy nieobliczalne pojawianie się wody w jaskiniach.\n"
+"Może zwiększyć trudność kopania. Zero wyłącza tę opcję. (0-10)"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair alpha"
-msgstr ""
+msgstr "Kanał alfa celownika"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Kanał alfa celownika (pomiędzy 0 a 255)."
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair color"
-msgstr ""
+msgstr "Kolor celownika"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair color (R,G,B)."
-msgstr ""
+msgstr "Kolor celownika (R,G,B)."
 
 #: src/settings_translation_file.cpp
 msgid "Crouch speed"
-msgstr ""
+msgstr "Szybkość podczas kucania"
 
 #: src/settings_translation_file.cpp
 msgid "DPI"
-msgstr ""
+msgstr "DPI"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Damage"
 msgstr "Włącz obrażenia"
 
 #: src/settings_translation_file.cpp
 msgid "Debug info toggle key"
-msgstr ""
+msgstr "Klawisz przełączania informacji debugowania"
 
 #: src/settings_translation_file.cpp
 msgid "Debug log level"
-msgstr ""
+msgstr "Poziom logowania debugowania"
 
 #: src/settings_translation_file.cpp
 msgid "Dedicated server step"
-msgstr ""
+msgstr "Krok serwera dedykowanego"
 
 #: src/settings_translation_file.cpp
 msgid "Default acceleration"
-msgstr ""
+msgstr "Domyślne przyspieszenie"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Default game"
-msgstr "edytuj grę"
+msgstr "Domyślna gra"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Default game when creating a new world.\n"
 "This will be overridden when creating a world from the main menu."
 msgstr ""
+"Domyślna gra podczas tworzenia nowego świata.\n"
+"To zostanie nadpisane jeżeli tworzysz świat z menu głównego."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Default password"
-msgstr "Nowe hasło"
+msgstr "Domyślne hasło"
 
 #: src/settings_translation_file.cpp
 msgid "Default privileges"
-msgstr ""
+msgstr "Domyślne uprawnienia"
+
+#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Domyślny format raportu"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
 msgstr ""
+"Domyślny limit czasu dla cURL, w milisekundach.\n"
+"Ma znaczenie tylko gdy skompilowane z cURL."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Defines sampling step of texture.\n"
 "A higher value results in smoother normal maps."
 msgstr ""
+"Definiuje krok próbkowania tekstury.\n"
+"Wyższa wartość reprezentuje łagodniejszą mapę normalnych."
 
 #: src/settings_translation_file.cpp
 msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
+"Definiuje maksymalną odległość przesyłania graczy w blokach (0 = "
+"nieskończoność)."
 
 #: src/settings_translation_file.cpp
-msgid "Delay showing tooltips, stated in milliseconds."
+msgid "Delay in sending blocks after building"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay showing tooltips, stated in milliseconds."
+msgstr "Opóźnienie wyświetlania dymkmów, w milisekundach."
+
+#: src/settings_translation_file.cpp
 msgid "Deprecated Lua API handling"
-msgstr ""
+msgstr "Wsparcie przestarzałego API Lua"
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "Głębokość poniżej której znajdziesz duże jaskinie."
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find massive caves."
-msgstr ""
+msgstr "Głębokość poniżej której znajdziesz masywne jaskinie."
 
 #: src/settings_translation_file.cpp
 msgid "Descending speed"
-msgstr ""
+msgstr "Szybkość opadania"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Description of server, to be displayed when players join and in the "
 "serverlist."
 msgstr ""
+"Opis serwera, który będzie wyświetlony gdy gracze dołączają oraz na liście "
+"serwerów."
 
 #: src/settings_translation_file.cpp
 msgid "Desynchronize block animation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
+msgstr "Odsynchronizuj animację bloków"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1824,60 +1889,81 @@ msgid ""
 "The 3 numbers in brackets control the scale of the\n"
 "terrain, the 3 numbers should be identical."
 msgstr ""
+"Determinuje kształt terenu.\n"
+"Trzy liczby w nawiasach kontrolują skalę terenu\n"
+"oraz powinny być identyczne."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Disable anticheat"
-msgstr "Włącz cząstki"
+msgstr "Wyłącz anticheat"
 
 #: src/settings_translation_file.cpp
-msgid "Disallow empty passwords"
+msgid "Disable escape sequences"
+msgstr "Wyłącza sekwencję ucieczki"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
 msgstr ""
+"Wyłącza sekwencję ucieczki np. kolorowanie czatu.\n"
+"Użyj tego jeśli chcesz uruchomić serwer dla klientów przed 0.4.14 i chcesz "
+"wyłączyć\n"
+"sekwencję ucieczki generowaną przez modyfikacje."
+
+#: src/settings_translation_file.cpp
+msgid "Disallow empty passwords"
+msgstr "Nie zezwalaj na puste hasła"
 
 #: src/settings_translation_file.cpp
 msgid "Domain name of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Serwer DNS, wyświetlany na liście serwerów."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Double tap jump for fly"
 msgstr "Wciśnij dwukrotnie \"Skok\" by włączyć tryb latania"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Double-tapping the jump key toggles fly mode."
-msgstr "Wciśnij dwukrotnie \"Skok\" by włączyć tryb latania"
+msgstr "Wciśnij dwukrotnie \"Skok\" by włączyć tryb latania."
 
 #: src/settings_translation_file.cpp
 msgid "Drop item key"
-msgstr ""
+msgstr "Klawisz wyrzucenia przedmiotu"
 
 #: src/settings_translation_file.cpp
 msgid "Dump the mapgen debug infos."
-msgstr ""
+msgstr "Zrzuć informacje debugowania generatora mapy."
+
+#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Włącz joystick"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Enable VBO"
-msgstr "Włącz MP"
+msgstr "Włącz VBO"
 
 #: src/settings_translation_file.cpp
 msgid "Enable mod security"
-msgstr ""
+msgstr "Włącz tryb mod security"
 
 #: src/settings_translation_file.cpp
 msgid "Enable players getting damage and dying."
-msgstr ""
+msgstr "Włącz obrażenia i umieranie graczy."
 
 #: src/settings_translation_file.cpp
 msgid "Enable random user input (only used for testing)."
-msgstr ""
+msgstr "Włącz losowe wejście użytkownika (tylko dla testowania)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Enable smooth lighting with simple ambient occlusion.\n"
 "Disable for speed or for different looks."
 msgstr ""
+"Włącz gładkie oświetlenie z prostym efektem ambient occlusion.\n"
+"Wyłącz dla szybkości lub wyglądu."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1887,6 +1973,11 @@ msgid ""
 "to new servers, but they may not support all new features that you are "
 "expecting."
 msgstr ""
+"Włącz blokadę dla połączenia starych klientów.\n"
+"Starsze klienty mogą być kompatybilne w tym sensie że nie będą się "
+"zawieszać\n"
+"kiedy łączą sę z nowym serwerem, ale mogą nie wspierać wszystkich nowych "
+"spodziewanych funkcjonalności."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1895,6 +1986,10 @@ msgid ""
 "textures)\n"
 "when connecting to the server."
 msgstr ""
+"Włącza używanie zdalnego serwera mediów (jeżeli dostarczany przez serwer).\n"
+"Zdalny serwer oferuje znacząco szybszy sposób pobierania mediów (np. "
+"tekstur)\n"
+"jeżeli następuje połączenie z serwerem."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1902,10 +1997,13 @@ msgid ""
 "to IPv6 clients, depending on system configuration.\n"
 "Ignored if bind_address is set."
 msgstr ""
+"Przełącza pracę serwera w trybie IPv6. Serwer IPv6 może być ograniczony\n"
+"tylko dla klientów IPv6, w zależności od konfiguracji systemu.\n"
+"Ignorowane jeżeli bind_address jest ustawiony."
 
 #: src/settings_translation_file.cpp
 msgid "Enables animation of inventory items."
-msgstr ""
+msgstr "Włącz animację inwentarza przedmiotów."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1914,42 +2012,58 @@ msgid ""
 "or need to be auto-generated.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Włącza mapowanie wypukłości dla tekstur. Mapy normalnych muszą być dodane w "
+"paczce tekstur\n"
+"lub muszą być automatycznie wygenerowane.\n"
+"Wymaga włączonych shaderów."
 
 #: src/settings_translation_file.cpp
 msgid "Enables caching of facedir rotated meshes."
-msgstr ""
+msgstr "Włącza cachowanie facedir obracanych meshów."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Enables filmic tone mapping"
-msgstr "Włącz obrażenia"
+msgstr "Włącz filmic tone mapping"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Enables minimap."
-msgstr "Włącz obrażenia"
+msgstr "Włącz minimapę."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Enables on the fly normalmap generation (Emboss effect).\n"
 "Requires bumpmapping to be enabled."
 msgstr ""
+"Włącza generację map normalnych w locie  (efekt płaskorzeźby).\n"
+"Wymaga włączenia mapowania wypukłości."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Enables parallax occlusion mapping.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Włącza mapowanie paralaksy.\n"
+"Wymaga włączenia shaderów."
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
 msgstr ""
+"Eksperymentalna opcja, może powodować widoczne przestrzenie\n"
+"pomiędzy blokami kiedy ustawiona powyżej 0."
 
 #: src/settings_translation_file.cpp
 msgid "FPS in pause menu"
-msgstr ""
+msgstr "FPS podczas pauzy w menu"
 
 #: src/settings_translation_file.cpp
 msgid "FSAA"
@@ -1961,55 +2075,71 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font"
-msgstr ""
+msgstr "Zastępcza czcionka"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font shadow"
-msgstr ""
+msgstr "Zastępczy cień czcionki"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font shadow alpha"
-msgstr ""
+msgstr "Zastępcza przeźroczystość cienia czcionki"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font size"
-msgstr ""
+msgstr "Zastępczy rozmiar czcionki"
 
 #: src/settings_translation_file.cpp
 msgid "Fast key"
-msgstr ""
+msgstr "Klawisz szybkiego poruszania"
 
 #: src/settings_translation_file.cpp
 msgid "Fast mode acceleration"
-msgstr ""
+msgstr "Przyspieszenie trybu szybkiego"
 
 #: src/settings_translation_file.cpp
 msgid "Fast mode speed"
-msgstr ""
+msgstr "Prędkość trybu szybkiego"
 
 #: src/settings_translation_file.cpp
 msgid "Fast movement"
-msgstr ""
+msgstr "Szybkie poruszanie"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Fast movement (via use key).\n"
 "This requires the \"fast\" privilege on the server."
 msgstr ""
+"Szybkie poruszanie się (przez klawisz użycia).\n"
+"Wymaga przywileju \"fast\" na serwerze."
 
 #: src/settings_translation_file.cpp
 msgid "Field of view"
-msgstr ""
+msgstr "Pole widzenia"
+
+#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Pole widzenia dla zoomu"
 
 #: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
+msgstr "Pole widzenia w stopniach."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
 msgstr ""
+"Pole widzenia podczas zoomowania w stopniach.\n"
+"wymaga przywileju \"zoom\" na serwerze."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
+"Plik w kliencie (lista serwerów) który zawiera ulubione ulubione serwery "
+"wyświetlane w zakładce Multiplayer."
 
 #: src/settings_translation_file.cpp
 msgid "Filler Depth"
@@ -2026,79 +2156,86 @@ msgid ""
 "light edge to transparent textures.  Apply this filter to clean that up\n"
 "at texture load time."
 msgstr ""
+"Filtrowanie tekstur może wymieszać wartości RGB piksela z w pełni "
+"przeźroczystymi sąsiadami,\n"
+"które optymalizatory PNG najczęściej odrzucają, co czasem powoduje "
+"ciemniejsze lub jaśniejsze\n"
+"krawędzie w przeźroczystych teksturach. Zastosuj ten filtr aby wyczyścić to "
+"w czasie ładowania tekstur."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Filtering"
 msgstr "Filtrowanie anizotropowe"
 
 #: src/settings_translation_file.cpp
 msgid "Fixed map seed"
-msgstr ""
+msgstr "Stałe ziarno mapy"
 
 #: src/settings_translation_file.cpp
 msgid "Fly key"
-msgstr ""
+msgstr "Klawisz latania"
 
 #: src/settings_translation_file.cpp
 msgid "Flying"
-msgstr ""
+msgstr "Latanie"
 
 #: src/settings_translation_file.cpp
 msgid "Fog"
-msgstr ""
+msgstr "Mgła"
 
 #: src/settings_translation_file.cpp
 msgid "Fog toggle key"
-msgstr ""
+msgstr "Klawisz przełączania mgły"
 
 #: src/settings_translation_file.cpp
 msgid "Font path"
-msgstr ""
+msgstr "Ścieżka czcionki"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow"
-msgstr ""
+msgstr "Cień czcionki"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow alpha"
-msgstr ""
+msgstr "Przeźroczystość cienia czcionki"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Kanał alfa cienia czcionki (nieprzeźroczystość, od 0 do 255)."
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow offset, if 0 then shadow will not be drawn."
-msgstr ""
+msgstr "Offset cienia czcionki, jeżeli 0 to cień nie będzie rysowany."
 
 #: src/settings_translation_file.cpp
 msgid "Font size"
-msgstr ""
+msgstr "Rozmiar czcionki"
 
 #: src/settings_translation_file.cpp
 msgid "Format of screenshots."
-msgstr ""
+msgstr "Format zrzutu ekranu."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Forward key"
-msgstr "Przód"
+msgstr "Do przodu"
 
 #: src/settings_translation_file.cpp
 msgid "Freetype fonts"
-msgstr ""
+msgstr "Czcionki Freetype"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "From how far blocks are generated for clients, stated in mapblocks (16 "
 "nodes)."
 msgstr ""
+"Od jak daleka bloki są generowane dla klienta, w blokach mapy (16 węzłów)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
 msgstr ""
+"Z jakiej odległości bloki są przesyłane do klientów, zapisane w blokach map "
+"(16 węzłów)."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2107,38 +2244,42 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Full screen"
-msgstr ""
+msgstr "Pełny ekran"
 
 #: src/settings_translation_file.cpp
 msgid "Full screen BPP"
-msgstr ""
+msgstr "Głębia koloru w trybie pełnoekranowym"
 
 #: src/settings_translation_file.cpp
 msgid "Fullscreen mode."
-msgstr ""
+msgstr "Tryb pełnoekranowy."
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling"
-msgstr ""
+msgstr "Skalowanie GUI"
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling filter"
-msgstr ""
+msgstr "Filtr skalowania GUI"
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling filter txr2img"
-msgstr ""
+msgstr "Filtr skalowania GUI txr2img"
 
 #: src/settings_translation_file.cpp
 msgid "Gamma"
-msgstr ""
+msgstr "Gamma"
 
 #: src/settings_translation_file.cpp
 msgid "General"
-msgstr ""
+msgstr "Ogólne"
 
 #: src/settings_translation_file.cpp
 msgid "Generate normalmaps"
+msgstr "Generuj mapy normalnych"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -2146,29 +2287,33 @@ msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Globalne właściwości generowania map.\n"
+"W generatorze map v6 flaga \"decorations\" kontroluje wszystkie dekoracje\n"
+"z wyjątkiem drzew i trawy dżungli. we wszystkich innych generatorach flaga\n"
+"ta kontroluje wszystkie dekoracje.\n"
+"Flagi, które nie są wymienione w ciągu flagi nie są modyfikowane z "
+"domyślnych.\n"
+"Flagi rozpoczynające się od \"no\" są stosowane aby jawnie ją wyłączyć."
 
 #: src/settings_translation_file.cpp
 msgid "Graphics"
-msgstr ""
+msgstr "Grafika"
 
 #: src/settings_translation_file.cpp
 msgid "Gravity"
-msgstr ""
+msgstr "Grawitacja"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "HTTP Mods"
 msgstr "Mody"
 
 #: src/settings_translation_file.cpp
 msgid "HUD toggle key"
-msgstr ""
+msgstr "Klawisz przełączania HUD"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2177,26 +2322,41 @@ msgid ""
 "-    log: mimic and log backtrace of deprecated call (default for debug).\n"
 "-    error: abort on usage of deprecated call (suggested for mod developers)."
 msgstr ""
+"Obsługa przestarzałych wywołań lua api:\n"
+"- legacy: (próbuje) naśladuje stare zachowanie (domyślne dla wydań).\n"
+"- log: naśladuje i loguje przestarzałe wywołania (domyślne dla wersji "
+"debug).\n"
+"- error: przerywa kiedy zostanie użyte przestarzałe api (sugerowane dla "
+"twórców modów)."
 
 #: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Height component of the initial window size."
+msgstr "Wysokość początkowego rozmiaru okna."
+
+#: src/settings_translation_file.cpp
 msgid "Height on which clouds are appearing."
-msgstr ""
+msgstr "Wysokość na której pojawiają się chmury."
 
 #: src/settings_translation_file.cpp
 msgid "High-precision FPU"
-msgstr ""
+msgstr "FPU Wysokiej precyzji"
 
 #: src/settings_translation_file.cpp
 msgid "Homepage of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Główna strona serwera, wyświetlana na liście serwerów."
 
 #: src/settings_translation_file.cpp
 msgid "How deep to make rivers"
-msgstr ""
+msgstr "Jak głębokie robić rzeki"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2204,25 +2364,21 @@ msgid ""
 "mapblocks (16 nodes).\n"
 "In active blocks objects are loaded and ABMs run."
 msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
+"Jak duży obszar bloków jest przedmiotem aktywnego bloku, zapisane w blokach "
+"map(16 jednostek).\n"
+"Na aktywnych blokach obiekty są wczytywane i ABM działa."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
+"Jak długo serwer będzie czekać do zwolnienia nieużywanych bloków mapy.\n"
+"Wyższa wartość jest łagodniejsza ale używa więcej pamięci RAM."
 
 #: src/settings_translation_file.cpp
 msgid "How wide to make rivers"
-msgstr ""
+msgstr "Jak szerokie są rzeki"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6"
@@ -2230,23 +2386,27 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 server"
-msgstr ""
+msgstr "Serwer IPv6"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 support."
-msgstr ""
+msgstr "Wsparcie IPv6."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If FPS would go higher than this, limit it by sleeping\n"
 "to not waste CPU power for no benefit."
 msgstr ""
+"Jeżeli FPS będzie wyższy niż to, ogranicz go przez usypianie\n"
+"nie marnuj mocy CPU bez znaczących korzyści."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If disabled \"use\" key is used to fly fast if both fly and fast mode are "
 "enabled."
 msgstr ""
+"Jeśli wyłączone to klawisz \"używania\" jest wykorzystany aby latać szybko "
+"oraz przy włączonym trybie szybkiego poruszania."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2254,32 +2414,42 @@ msgid ""
 "nodes.\n"
 "This requires the \"noclip\" privilege on the server."
 msgstr ""
+"Jeżeli włączone razem z trybem latania, gracz może latać przez solidne "
+"bloki.\n"
+"Wymaga przywileju \"noclip\" na serwerze."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
 "and descending."
 msgstr ""
+"Jeżeli włączone, klawisz \"użycia\" zamiast klawiszu \"skradania\" będzie "
+"użyty do schodzenia w dół i opadania."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If enabled, actions are recorded for rollback.\n"
 "This option is only read when server starts."
 msgstr ""
+"Jeżeli włączone, akcje są nagrywane dla odtwarzania.\n"
+"Ta opcja jest czytana tylko podczas startu serwera."
 
 #: src/settings_translation_file.cpp
 msgid "If enabled, disable cheat prevention in multiplayer."
-msgstr ""
+msgstr "Jeśli włączone, wyłącza ograniczenie oszustw w trybie multiplayer."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If enabled, invalid world data won't cause the server to shut down.\n"
 "Only enable this if you know what you are doing."
 msgstr ""
+"Jeżeli włączone, nieprawidłowe dane świata nie będą powodować wyłączenia "
+"serwera.\n"
+"Włącz tylko jeżeli wiesz co robisz."
 
 #: src/settings_translation_file.cpp
 msgid "If enabled, new players cannot join with an empty password."
-msgstr ""
+msgstr "Jeśli włączone, nowi gracze nie mogą dołączyć do gry z pustym hasłem."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2287,200 +2457,326 @@ msgid ""
 "you stand.\n"
 "This is helpful when working with nodeboxes in small areas."
 msgstr ""
+"Jeżeli włączone, możesz położyć bloki w pozycji gdzie stoisz.\n"
+"Pomocne gdy pracujesz na małych powierzchniach."
 
 #: src/settings_translation_file.cpp
 msgid "If this is set, players will always (re)spawn at the given position."
-msgstr ""
+msgstr "Jeśli ustawione, gracze zawsze będą się pojawiać w zadanej pozycji."
 
 #: src/settings_translation_file.cpp
 msgid "Ignore world errors"
-msgstr ""
+msgstr "Ignoruj błędy świata"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "In-Game"
 msgstr "Gra"
 
 #: src/settings_translation_file.cpp
 msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Kanał alfa konsoli w grze (od 0 do 255)."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "In-game chat console background color (R,G,B)."
-msgstr ""
+msgstr "Kolor konsoli czatu w grze (R,G,B)."
 
 #: src/settings_translation_file.cpp
-msgid "Interval of saving important changes in the world, stated in seconds."
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Instrument chatcommands on registration."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Inventory items animations"
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Interval of saving important changes in the world, stated in seconds."
+msgstr "Interwał zapisywania ważnych zmian w świecie, w sekundach."
+
+#: src/settings_translation_file.cpp
+msgid "Interval of sending time of day to clients."
+msgstr "Interwał wysyłania czasu gry do klientów."
+
+#: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Inventory items animations"
+msgstr "Animacje przedmiotów w ekwipunku"
+
+#: src/settings_translation_file.cpp
 msgid "Inventory key"
 msgstr "Ekwipunek"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Invert mouse"
-msgstr ""
+msgstr "Odwróć mysz"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Invert vertical mouse movement."
-msgstr ""
+msgstr "Odwróć ruch pionowy ruchu myszy."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Item entity TTL"
-msgstr ""
+msgstr "TTL przedmiotu"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Iterations of the recursive function.\n"
 "Controls the amount of fine detail."
 msgstr ""
+"Iteracje funkcji rekursywnych.\n"
+"Kontroluje ilość drobnych szczegółów."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "Interwał powtarzania przycisku joysticka"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
 "Has no effect on 3D fractals.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Zbiór Julii tylko: W komponent stałej liczby hiperzespolonej determinującej "
+"kształt Julii.\n"
+"Nie ma efektu dla fraktali 3D.\n"
+"Zakres w przybliżeniu -2 do 2."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Julia set only: X component of hypercomplex constant determining julia "
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Zbiór Julii tylko: X komponent stałej hiperzespolonej liczby determinującej "
+"kształt Julii.\n"
+"Zakres w przybliżeniu -2 do 2."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Julia set only: Y component of hypercomplex constant determining julia "
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Zbiór Julii tylko: Y komponent stałej hiperzespolonej liczby determinującej "
+"kształt Julii.\n"
+"Zakres w przybliżeniu -2 do 2."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Julia set only: Z component of hypercomplex constant determining julia "
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Zbiór Julii tylko: Z komponent stałej hiperzespolonej liczby determinującej "
+"kształt Julii.\n"
+"Zakres w przybliżeniu -2 do 2."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Jump key"
 msgstr "Skok"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Jumping speed"
-msgstr ""
+msgstr "Szybkość skoku"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for decreasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz zmniejszania zasięgu widzenia.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for dropping the currently selected item.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz wyrzucenia aktualnie wybranego przedmiotu.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for increasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz zwiększania zasięgu widzenia.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for jumping.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz skakania.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for moving fast in fast mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz szybkiego poruszania się w trybie \"fast\"\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for moving the player backward.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz poruszania się wstecz.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for moving the player forward.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz poruszania się na przód,\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for moving the player left.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz poruszania się w lewo.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for moving the player right.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz poruszania się w prawo.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for opening the chat console.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz otwierania konsoli czatu.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for opening the chat window to type commands.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz otwierania okna czatu aby wpisać komendę.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for opening the chat window.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz otwierania okna czatu.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for opening the inventory.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz otwierania inwentarza.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for printing debug stacks. Used for development.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz wyświetlania danych debugowania. Przydatne dla deweloperów.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for sneaking.\n"
 "Also used for climbing down and descending in water if aux1_descends is "
@@ -2488,151 +2784,237 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz skradania.\n"
+"Także używany do schodzenia w dół i opadania w wodzie jeżeli aux1_descends "
+"jest wyłączone.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for switching between first- and third-person camera.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania pomiedzy kamerą z pierwszej i trzeciej osoby.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for taking screenshots.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz do zrobienia zrzutu ekranu.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Klawisz przełączania trybu szybkiego.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania trybu cinematic.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for toggling display of minimap.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania wyświetlania minimapy.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for toggling fast mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania trybu szybkiego.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for toggling flying.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania latania.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for toggling noclip mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania trybu noclip.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania aktualizacji kamery. Przydatne tylko dla deweloperów.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for toggling the display of debug info.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania informacji debugowania.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for toggling the display of the HUD.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania wyświetlania HUD.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for toggling the display of the chat.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania wyświetlania czatu.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for toggling the display of the fog.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania wyświetlania mgły\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for toggling the display of the profiler. Used for development.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania wyświetlania profilera. Przydatne dla deweloperów.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Key for toggling unlimited view range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Klawisz przełączania nieograniczonego pola widzenia.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Key use for climbing/descending"
-msgstr ""
+msgstr "Klawisz używany do wspinania"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Language"
-msgstr ""
+msgstr "Język"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Large cave depth"
-msgstr ""
+msgstr "Głębia dużej jaskini"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Lava Features"
-msgstr ""
+msgstr "Funkcjonalności lawy"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Leaves style"
-msgstr ""
+msgstr "Styl liści"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Leaves style:\n"
 "-   Fancy:  all faces visible\n"
 "-   Simple: only outer faces, if defined special_tiles are used\n"
 "-   Opaque: disable transparency"
 msgstr ""
+"Style liści:\n"
+"-   Fancy:  wszystkie ściany widoczne\n"
+"-   Simple: tylko zewnętrzene ściany, jeżeli special_tiles jest użyty\n"
+"-   Opaque: wyłącza przeźroczystość"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Left key"
-msgstr "Lewy Menu"
+msgstr "W lewo"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Length of a server tick and the interval at which objects are generally "
 "updated over network."
 msgstr ""
+"Długość interwału czasowego serwera w trakcie którego obiekty są ogólnie "
+"aktualizowane przez sieć."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Length of time between ABM execution cycles"
-msgstr ""
+msgstr "Długość czasu pomiędzy wykonywanymi cyklami ABM"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "Długość czasu pomiędzy wykonywanymi cyklami NodeTimer."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2647,12 +3029,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Limit of emerge queues on disk"
-msgstr ""
+msgstr "Limit oczekiwań na dysku"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Limit of emerge queues to generate"
-msgstr ""
+msgstr "Limit kolejek oczekujących do wytworzenia"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2664,59 +3048,85 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Liquid fluidity"
-msgstr ""
+msgstr "Płynność cieczy"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Liquid fluidity smoothing"
-msgstr ""
+msgstr "Wygładzanie płynności cieczy"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid loop max"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Liquid queue purge time"
-msgstr ""
+msgstr "Czas kolejki czyszczenia cieczy"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Liquid sink"
-msgstr ""
+msgstr "Zanurzanie cieczy"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Liquid update interval in seconds."
-msgstr ""
+msgstr "Interwał aktualizacji cieczy podany w sekundach"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Liquid update tick"
+msgstr "Interwał czasowy aktualizacji cieczy"
+
+#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Main menu game manager"
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 #, fuzzy
-msgid "Main menu mod manager"
-msgstr "Menu główne"
+msgid "Loading Block Modifiers"
+msgstr "Interwał modyfikatora aktywnego bloku"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Main menu game manager"
+msgstr "Menedżer menu głównego"
+
+#: src/settings_translation_file.cpp
+msgid "Main menu mod manager"
+msgstr "Manager modów w głównym menu"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu script"
-msgstr "Menu główne"
+msgstr "Skrypt głównego menu"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
 msgstr ""
+"Ustwa mgłę i kolor nieba zależny od pory dnia(świt/zachód słońca) i pokaż "
+"kierunek"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
-msgstr ""
+msgstr "Sprawia, że DirectX działa z LuaJIT. Wyłącz jeśli występują kłopoty"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Map directory"
-msgstr ""
+msgstr "Katalog map"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2726,8 +3136,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2737,8 +3145,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2749,8 +3155,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2760,33 +3164,34 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Map generation limit"
-msgstr ""
+msgstr "Limit generacji mapy"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Map save interval"
-msgstr ""
+msgstr "Interwał zapisu mapy"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Mapblock limit"
-msgstr ""
+msgstr "Limit bloków mapy"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Mapblock unload timeout"
-msgstr ""
+msgstr "Przekroczenie czasu wyładowania bloków mapy"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen Valleys"
-msgstr "Generator mapy"
+msgstr "Generator mapy Valleys"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen biome heat noise parameters"
@@ -2797,28 +3202,25 @@ msgid "Mapgen biome humidity blend noise parameters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Mapgen biome humidity noise parameters"
-msgstr ""
+msgstr "Wilgotność oraz parametry hałasu biomu Mapgen"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen debug"
-msgstr "Generator mapy"
+msgstr "Generator mapy debugowanie"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flags"
-msgstr "Generator mapy"
+msgstr "Flagi generatora mapy"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat"
-msgstr "Generator mapy"
+msgstr "Generator mapy flat"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat cave width"
-msgstr "Generator mapy"
+msgstr "Generator mapy flat szerokość jaskini"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave1 noise parameters"
@@ -2833,14 +3235,12 @@ msgid "Mapgen flat filler depth noise parameters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat flags"
-msgstr "Generator mapy"
+msgstr "Generator mapy flat flagi"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat ground level"
-msgstr "Generator mapy"
+msgstr "Generator mapy flat poziom ziemi"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill steepness"
@@ -2869,14 +3269,12 @@ msgid "Mapgen flat terrain noise parameters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal"
-msgstr "Generator mapy"
+msgstr "Generator mapy fractal"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal cave width"
-msgstr "Generator mapy"
+msgstr "Generator mapy fractal szerokość jaskini"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave1 noise parameters"
@@ -2896,9 +3294,8 @@ msgid "Mapgen fractal fractal"
 msgstr "Generator mapy"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal iterations"
-msgstr "Generator mapy"
+msgstr "Generator mapy fractal iteracje"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia w"
@@ -2922,9 +3319,8 @@ msgid "Mapgen fractal offset"
 msgstr "Generator mapy"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal scale"
-msgstr "Generator mapy"
+msgstr "Generator mapy fractal skala"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal seabed noise parameters"
@@ -2940,19 +3336,16 @@ msgid "Mapgen heat blend noise parameters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen name"
-msgstr "Generator mapy"
+msgstr "Nazwa generatora mapy"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v5"
-msgstr "Generator mapy"
+msgstr "Generator mapy v5"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v5 cave width"
-msgstr "Generator mapy"
+msgstr "Generator mapy v5 szerokość jaskini"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave1 noise parameters"
@@ -2975,9 +3368,8 @@ msgid "Mapgen v5 height noise parameters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v6"
-msgstr "Generator mapy"
+msgstr "Generator mapy v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 apple trees noise parameters"
@@ -3036,14 +3428,12 @@ msgid "Mapgen v6 trees noise parameters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v7"
-msgstr "Generator mapy"
+msgstr "Generator mapy v7"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v7 cave width"
-msgstr "Generator mapy"
+msgstr "Generator mapy v7 szerokość jaskini"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave1 noise parameters"
@@ -3142,6 +3532,15 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Jak dużo bloków może być przesyłanych jednocześnie na jednego klienta."
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3183,17 +3582,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3205,11 +3608,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Menus"
 msgstr "Menu"
 
@@ -3230,31 +3628,28 @@ msgid "Method used to highlight selected object."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Minimap"
-msgstr ""
+msgstr "Minimapa"
 
 #: src/settings_translation_file.cpp
 msgid "Minimap key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Minimap scan height"
-msgstr ""
+msgstr "Wysokość skonowania minimapy"
 
 #: src/settings_translation_file.cpp
 msgid "Minimum texture size for filters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mipmapping"
 msgstr "Mip-Mappowanie"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3267,20 +3662,24 @@ msgid "Modstore mods list URL"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Monospace font path"
-msgstr ""
+msgstr "Ścieżka czcionki typu Monospace"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Monospace font size"
-msgstr ""
+msgstr "Rozmiar czcionki Monospace"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Mouse sensitivity"
-msgstr ""
+msgstr "Czułość myszy"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Mouse sensitivity multiplier."
-msgstr ""
+msgstr "Mnożnik czułości myszy."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3313,8 +3712,9 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Network"
-msgstr ""
+msgstr "Sieć"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3335,8 +3735,9 @@ msgid "Noclip key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Node highlighting"
-msgstr ""
+msgstr "Podświetlanie bloków"
 
 #: src/settings_translation_file.cpp
 msgid "NodeTimer interval"
@@ -3347,16 +3748,18 @@ msgid "Noise parameters for biome API temperature, humidity and biome blend."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Noises"
-msgstr ""
+msgstr "Szumy"
 
 #: src/settings_translation_file.cpp
 msgid "Normalmaps sampling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Normalmaps strength"
-msgstr ""
+msgstr "Siła map normlanych"
 
 #: src/settings_translation_file.cpp
 msgid "Number of emerge threads"
@@ -3379,8 +3782,9 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Number of parallax occlusion iterations."
-msgstr ""
+msgstr "Liczba iteracji dla parallax occlusion."
 
 #: src/settings_translation_file.cpp
 msgid "Overall bias of parallax occlusion effect, usually scale/2."
@@ -3395,8 +3799,9 @@ msgid "Parallax occlusion"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Parallax occlusion Scale"
-msgstr ""
+msgstr "Skala parallax occlusion"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion bias"
@@ -3427,8 +3832,9 @@ msgid "Path to texture directory. All textures are first searched from here."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Physics"
-msgstr ""
+msgstr "Fizyka"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3437,16 +3843,18 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Player name"
-msgstr ""
+msgstr "Nazwa gracza"
 
 #: src/settings_translation_file.cpp
 msgid "Player transfer distance"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Player versus Player"
-msgstr ""
+msgstr "PvP"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3459,11 +3867,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3471,8 +3885,9 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr ""
+#, fuzzy
+msgid "Profiling"
+msgstr "Profilowanie modyfikacji"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3486,11 +3901,11 @@ msgid "Raises terrain to make valleys around the rivers"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Random input"
-msgstr ""
+msgstr "Losowe wejście"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Range select key"
 msgstr "Zasięg widzenia"
 
@@ -3499,8 +3914,9 @@ msgid "Remote media"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Remote port"
-msgstr ""
+msgstr "Port zdalny"
 
 #: src/settings_translation_file.cpp
 msgid "Replaces the default main menu with a custom one."
@@ -3508,24 +3924,31 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Report path"
+msgstr "Ścieżka czcionki"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
-msgstr "Prawy Menu"
+msgstr "W prawo"
 
 #: src/settings_translation_file.cpp
 msgid "Rightclick repetition interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "River Depth"
-msgstr ""
+msgstr "Głębokość rzeki"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "River Noise"
-msgstr ""
+msgstr "Szum rzeki"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "River Size"
-msgstr ""
+msgstr "Rozmiar rzeki"
 
 #: src/settings_translation_file.cpp
 msgid "River noise -- rivers occur close to zero"
@@ -3536,16 +3959,18 @@ msgid "Rollback recording"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Round minimap"
-msgstr ""
+msgstr "Okrągła minimapa"
 
 #: src/settings_translation_file.cpp
 msgid "Save the map received by the client on disk."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Saving map received from server"
-msgstr ""
+msgstr "Zapisz mapę otrzymaną z serwera"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3557,31 +3982,31 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Screen height"
-msgstr ""
+msgstr "Wysokość ekranu"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Screen width"
-msgstr ""
+msgstr "Szerokość ekranu"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot"
-msgstr "Snapshot"
+msgstr "Zrzut ekranu"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Screenshot folder"
-msgstr ""
+msgstr "Folder zrzutu ekranu"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot format"
-msgstr "Snapshot"
+msgstr "Format zrzutu ekranu"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot quality"
-msgstr "Snapshot"
+msgstr "Jakość zrzutu ekranu"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3591,8 +4016,9 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Security"
-msgstr ""
+msgstr "Bezpieczeństwo"
 
 #: src/settings_translation_file.cpp
 msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -3611,44 +4037,36 @@ msgid "Selection box width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Server / Singleplayer"
 msgstr "Pojedynczy gracz"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Server URL"
-msgstr "Serwer"
+msgstr "Adres URL serwera"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Server address"
-msgstr "Port Serwera"
+msgstr "Adres serwera"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Server description"
-msgstr "Port Serwera"
+msgstr "Opis serwera"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Server name"
-msgstr "Serwer"
+msgstr "Nazwa serwera"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Server port"
 msgstr "Port Serwera"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Serverlist URL"
 msgstr "Lista publicznych serwerów"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Serverlist file"
-msgstr "Lista publicznych serwerów"
+msgstr "Plik listy publicznych serwerów"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3676,7 +4094,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3687,7 +4105,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Show debug info"
-msgstr ""
+msgstr "Pokaż informacje debugowania"
 
 #: src/settings_translation_file.cpp
 msgid "Show entity selection boxes"
@@ -3708,13 +4126,12 @@ msgid "Slope and fill work together to modify the heights"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Smooth lighting"
 msgstr "Płynne oświetlenie"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3727,13 +4144,13 @@ msgid "Smooths rotation of camera. 0 to disable."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Sneak key"
 msgstr "Skradanie"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Sound"
-msgstr ""
+msgstr "Dźwięk"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3744,8 +4161,9 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Static spawnpoint"
-msgstr ""
+msgstr "Statyczny punkt spawnu"
 
 #: src/settings_translation_file.cpp
 msgid "Strength of generated normalmaps."
@@ -3786,7 +4204,6 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Texture path"
 msgstr "Paczki tekstur"
 
@@ -3795,10 +4212,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3814,6 +4243,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3829,6 +4264,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3876,7 +4317,6 @@ msgid "Tooltip delay"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Trilinear filtering"
 msgstr "Filtrowanie trójliniowe"
 
@@ -3920,9 +4360,8 @@ msgid "Use bilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Use key"
-msgstr "naciśnij klawisz"
+msgstr "Klawisz użycia"
 
 #: src/settings_translation_file.cpp
 msgid "Use mip mapping to scale textures. May slightly increase performance."
@@ -3933,11 +4372,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Twórcy"
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -3996,7 +4430,6 @@ msgid "Viewing range"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Volume"
 msgstr "Głośność"
 
@@ -4013,9 +4446,8 @@ msgid "Walking speed"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Water Features"
-msgstr "Tekstury przedmiotów..."
+msgstr "Funkcje wody"
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
@@ -4030,9 +4462,8 @@ msgid "Waving Nodes"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving leaves"
-msgstr "Ozdobne drzewa"
+msgstr "Falujące liście"
 
 #: src/settings_translation_file.cpp
 msgid "Waving plants"
@@ -4066,7 +4497,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4141,86 +4572,151 @@ msgid "Width of the selectionbox's lines around nodes."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "World directory (everything in the world is stored here).\n"
 "Not needed if starting from the main menu."
 msgstr ""
+"Katalog świata (wszystko w świecie jest przechowywane tutaj).\n"
+"Nie wymagane jeżeli rozpoczyna się z głównego menu."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Y of flat ground."
-msgstr ""
+msgstr "Y płaskiego podłoża."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Y of upper limit of large pseudorandom caves."
-msgstr ""
+msgstr "Y górnego limitu preudolosowych jaskiń."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "cURL file download timeout"
-msgstr ""
+msgstr "cURL przekroczono limit pobierania pliku"
 
 #: src/settings_translation_file.cpp
 msgid "cURL parallel limit"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "cURL timeout"
 msgstr "Limit czasu cURL"
 
 #, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Ładowanie..."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "Szczegółowe dane profilowania. Przydatne dla twórców modyfikacji."
 
 #, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Ściągnij"
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Szczegółowe profilowanie modyfikacji"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
+#, fuzzy
+#~ msgid ""
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
 #~ msgstr ""
-#~ "Lewy przycisk myszy: przenieś wszystkie przedmioty, Prawy przycisk myszy: "
-#~ "przenieś pojedynczy przedmiot"
+#~ "Jak dużo bloków może jednocześnie być przesyłana przez sieć dla całego "
+#~ "serwera."
 
-#~ msgid "is required by:"
-#~ msgstr "wymagane przez:"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Przydatne dla twórców modyfikacji."
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "Konfiguracja zapisana.  "
+#~ msgid "No of course not!"
+#~ msgstr "Oczywiście, że nie!"
 
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Ostrzeżenie: Plik konfiguracyjny niespójny.  "
+#~ msgid "Public Serverlist"
+#~ msgstr "Lista publicznych serwerów"
 
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Nie można stworzyć świata: Nazwa zawiera niedozwolone znaki"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generuj mapy normalnych"
 
-#~ msgid "Show Public"
-#~ msgstr "Pokaż publiczne"
+#~ msgid "No!!!"
+#~ msgstr "Nie!!"
 
-#~ msgid "Show Favorites"
-#~ msgstr "Pokaż ulubione"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Wyłącz wszystkie"
 
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Pozostaw pole adresu puste, by uruchomić serwer lokalny."
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "włączone"
 
-#~ msgid "Create world"
-#~ msgstr "Stwórz świat"
+#~ msgid "Game Name"
+#~ msgstr "Nazwa Gry"
 
-#~ msgid "Address required."
-#~ msgstr "Wymagany adres."
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Kopiowanie moda \"$1\" do gry \"$2\" nie powiodło się"
 
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Nie można skasować świata: nic nie zaznaczono"
+#~ msgid "GAMES"
+#~ msgstr "GRY"
 
-#~ msgid "Files to be deleted"
-#~ msgstr "Pliki do skasowania"
+#~ msgid "Mods:"
+#~ msgstr "Mody:"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Nie można utworzyć świata: Nie znaleziono żadnego trybu gry"
+#~ msgid "new game"
+#~ msgstr "nowa gra"
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Nie można skonfigurować świata: Nic nie zaznaczono"
+#~ msgid "EDIT GAME"
+#~ msgstr "EDYTUJ GRĘ"
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Nie udało się skasować wszystkich plików świata"
+#~ msgid "Remove selected mod"
+#~ msgstr "Usuń zaznaczony mod"
+
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<--Dodaj mod"
+
+#~ msgid "CLIENT"
+#~ msgstr "KLIENT"
+
+#~ msgid "START SERVER"
+#~ msgstr "URUCHOM SERWER"
+
+#~ msgid "Name"
+#~ msgstr "Nazwa"
+
+#~ msgid "Password"
+#~ msgstr "Hasło"
+
+#~ msgid "SETTINGS"
+#~ msgstr "USTAWIENIA"
+
+#~ msgid "Preload item visuals"
+#~ msgstr "Ładuj obrazy przedmiotów"
+
+#~ msgid "Finite Liquid"
+#~ msgstr "Realistyczne ciecze"
+
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "TRYB JEDNOOSOBOWY"
+
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "PACZKI TEKSTUR"
+
+#~ msgid "MODS"
+#~ msgstr "MODY"
+
+#, fuzzy
+#~ msgid "Add mod:"
+#~ msgstr "<<--Dodaj mod"
+
+#, fuzzy
+#~ msgid "Local install"
+#~ msgstr "Instaluj"
+
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration.  "
+#~ msgstr ""
+#~ "Uwaga: Niektóre z modyfikacji nie zostały jeszcze skonfigurowane.\n"
+#~ "Zostaną domyślnie włączone gdy zapiszesz konfigurację.  "
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration.  "
+#~ msgstr ""
+#~ "Ostrzeżenie: Niektóre z modyfikacji nie zostały znalezione.\n"
+#~ "Ich ustawienia zostaną usunięte gdy zapiszesz konfigurację.  "
 
 #~ msgid ""
 #~ "Default Controls:\n"
@@ -4247,98 +4743,57 @@ msgstr "Limit czasu cURL"
 #~ "- ESC: to menu\n"
 #~ "- T: czat\n"
 
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
-#~ msgstr ""
-#~ "Ostrzeżenie: Niektóre z modyfikacji nie zostały znalezione.\n"
-#~ "Ich ustawienia zostaną usunięte gdy zapiszesz konfigurację.  "
-
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration.  "
-#~ msgstr ""
-#~ "Uwaga: Niektóre z modyfikacji nie zostały jeszcze skonfigurowane.\n"
-#~ "Zostaną domyślnie włączone gdy zapiszesz konfigurację.  "
-
-#, fuzzy
-#~ msgid "Local install"
-#~ msgstr "Instaluj"
-
-#, fuzzy
-#~ msgid "Add mod:"
-#~ msgstr "<<--Dodaj mod"
-
-#~ msgid "MODS"
-#~ msgstr "MODY"
-
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "PACZKI TEKSTUR"
-
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "TRYB JEDNOOSOBOWY"
-
-#~ msgid "Finite Liquid"
-#~ msgstr "Realistyczne ciecze"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Nie udało się skasować wszystkich plików świata"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Ładuj obrazy przedmiotów"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Nie można skonfigurować świata: Nic nie zaznaczono"
 
-#~ msgid "SETTINGS"
-#~ msgstr "USTAWIENIA"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Nie można utworzyć świata: Nie znaleziono żadnego trybu gry"
 
-#~ msgid "Password"
-#~ msgstr "Hasło"
+#~ msgid "Files to be deleted"
+#~ msgstr "Pliki do skasowania"
 
-#~ msgid "Name"
-#~ msgstr "Nazwa"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Nie można skasować świata: nic nie zaznaczono"
 
-#~ msgid "START SERVER"
-#~ msgstr "URUCHOM SERWER"
+#~ msgid "Address required."
+#~ msgstr "Wymagany adres."
 
-#~ msgid "CLIENT"
-#~ msgstr "KLIENT"
+#~ msgid "Create world"
+#~ msgstr "Stwórz świat"
 
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<--Dodaj mod"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Pozostaw pole adresu puste, by uruchomić serwer lokalny."
 
-#~ msgid "Remove selected mod"
-#~ msgstr "Usuń zaznaczony mod"
+#~ msgid "Show Favorites"
+#~ msgstr "Pokaż ulubione"
 
-#~ msgid "EDIT GAME"
-#~ msgstr "EDYTUJ GRĘ"
+#~ msgid "Show Public"
+#~ msgstr "Pokaż publiczne"
 
-#~ msgid "new game"
-#~ msgstr "nowa gra"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Nie można stworzyć świata: Nazwa zawiera niedozwolone znaki"
 
-#~ msgid "Mods:"
-#~ msgstr "Mody:"
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Ostrzeżenie: Plik konfiguracyjny niespójny.  "
 
-#~ msgid "GAMES"
-#~ msgstr "GRY"
+#~ msgid "Configuration saved.  "
+#~ msgstr "Konfiguracja zapisana.  "
 
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Kopiowanie moda \"$1\" do gry \"$2\" nie powiodło się"
+#~ msgid "is required by:"
+#~ msgstr "wymagane przez:"
 
-#~ msgid "Game Name"
-#~ msgstr "Nazwa Gry"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Lewy przycisk myszy: przenieś wszystkie przedmioty, Prawy przycisk myszy: "
+#~ "przenieś pojedynczy przedmiot"
 
 #, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "włączone"
+#~ msgid "Downloading"
+#~ msgstr "Ściągnij"
 
 #, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Wyłącz wszystkie"
-
-#~ msgid "No!!!"
-#~ msgstr "Nie!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generuj mapy normalnych"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Lista publicznych serwerów"
-
-#~ msgid "No of course not!"
-#~ msgstr "Oczywiście, że nie!"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Ładowanie..."
diff --git a/po/pt/minetest.po b/po/pt/minetest.po
index 4bdd22e..cef1448 100644
--- a/po/pt/minetest.po
+++ b/po/pt/minetest.po
@@ -7,9 +7,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-04-01 00:21+0000\n"
-"Last-Translator: Fernando Reis <fernando.reis at pt.lu>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-11-08 00:48+0000\n"
+"Last-Translator: João Rodrigues <joaoadriano3 at gmail.com>\n"
 "Language-Team: Portuguese <https://hosted.weblate.org/projects/minetest/"
 "minetest/pt/>\n"
 "Language: pt\n"
@@ -17,11 +17,11 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"X-Generator: Weblate 2.9\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr "Ocorreu um erro num script Lua, como por exemplo num extra:"
+msgstr "Ocorreu um erro num script Lua, como por exemplo num mod:"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
@@ -41,7 +41,7 @@ msgstr "Reconectar"
 
 #: builtin/fstk/ui.lua
 msgid "The server has requested a reconnect:"
-msgstr "O servidor solicitou uma reconexão:"
+msgstr "O servidor requisitou uma reconexão:"
 
 #: builtin/mainmenu/common.lua src/game.cpp
 msgid "Loading..."
@@ -49,20 +49,20 @@ msgstr "A carregar..."
 
 #: builtin/mainmenu/common.lua
 msgid "Protocol version mismatch. "
-msgstr "Versão do protocolo não coincide. "
+msgstr "A versão do protocolo não coincide. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr "O servidor requere o protocolo versão $1. "
+msgstr "O servidor requer o protocolo versão $1. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
-msgstr "Servidor suporta versões de protocolo entre $1 e $2. "
+msgstr "O servidor suporta versões de protocolo entre $1 e $2. "
 
 #: builtin/mainmenu/common.lua
 msgid "Try reenabling public serverlist and check your internet connection."
 msgstr ""
-"Tente recarregar a lista de servidores públicos e verificar a sua ligação à "
+"Tente recarregar a lista de servidores públicos e verifique a sua ligação à "
 "internet."
 
 #: builtin/mainmenu/common.lua
@@ -103,7 +103,7 @@ msgid ""
 "chararacters [a-z0-9_] are allowed."
 msgstr ""
 "Falha ao ativar mod \"$1\" porque contém caracteres inválidos. Apenas "
-"caracteres de \"a\" até \"z\" e algarismos de 0 até 9 são permitidos."
+"caracteres [a-z0-9_] são permitidos."
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide Game"
@@ -115,7 +115,7 @@ msgstr "Ocultar conteúdo do pacote"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Mod:"
-msgstr "Extra:"
+msgstr "Mod:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
@@ -128,7 +128,7 @@ msgstr "Mundo:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "enabled"
-msgstr "ativo"
+msgstr "ativado"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "A world named \"$1\" already exists"
@@ -140,11 +140,11 @@ msgstr "Criar"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Descarregue um jogo, como o minetest_game, do sítio minetest.net"
+msgstr "Descarregue um subjogo, como o minetest_game, do site minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download one from minetest.net"
-msgstr "Descarregue um do sítio minetest.net"
+msgstr "Descarregue um do site minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
 msgid "Game"
@@ -160,25 +160,23 @@ msgstr "Mundo sem nome ou nenhum jogo selecionado"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Seed"
-msgstr "Semente aleatória"
+msgstr "Seed"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Warning: The minimal development test is meant for developers."
-msgstr ""
-"Aviso: O jogo \"minimal development test\" destina-se apenas a "
-"desenvolvedores."
+msgstr "Aviso: O minimal development test destina-se apenas a desenvolvedores."
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "World name"
-msgstr "Nome do Mundo"
+msgstr "Nome do mundo"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "You have no subgames installed."
-msgstr "Você não tem nenhum jogo instalado."
+msgstr "Não possui nenhum subjogo instalado."
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Are you sure you want to delete \"$1\"?"
-msgstr "Tem a certeza que pertende eliminar \"$1\"?"
+msgstr "Tem a certeza que pretende eliminar \"$1\"?"
 
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
@@ -188,15 +186,15 @@ msgstr "Eliminar"
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Modmgr: failed to delete \"$1\""
-msgstr "Mensagem de Extra: falhou a eliminação de \"$1\""
+msgstr "Modmgr: falha ao apagar \"$1\""
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Modmgr: invalid modpath \"$1\""
-msgstr "Mensagem de extra: caminho inválido \"$1\""
+msgstr "Modmgr: caminho para o mod inválido \"$1\""
 
 #: builtin/mainmenu/dlg_delete_world.lua
 msgid "Delete World \"$1\"?"
-msgstr "Eliminar Mundo \"$1\"?"
+msgstr "Eliminar mundo \"$1\"?"
 
 #: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp
 msgid "Accept"
@@ -204,7 +202,7 @@ msgstr "Aceitar"
 
 #: builtin/mainmenu/dlg_rename_modpack.lua
 msgid "Rename Modpack:"
-msgstr "Renomear Pacote de Extras:"
+msgstr "Renomear ModPack:"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "\"$1\" is not a valid flag."
@@ -212,11 +210,11 @@ msgstr "\"$1\" não é uma flag válida."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "(No description of setting given)"
-msgstr "(Descrição de configuração não fornecida)"
+msgstr "(Não há descrição para esta configuração)"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "< Back to Settings page"
-msgstr "< Voltar para as configurações"
+msgstr "< Voltar para as definições"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Browse"
@@ -236,15 +234,15 @@ msgstr "Ativado"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Format is 3 numbers separated by commas and inside brackets."
-msgstr "O formato é de 3 números separados por vírgulas dentro de paréntesis."
+msgstr "O formato é de 3 números separados por vírgulas dentro de parêntesis."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid ""
 "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
 "<octaves>, <persistence>"
 msgstr ""
-"Formato: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
-"<octaves>, <persistence>"
+"Formato: <offset>, <escala>, (<distânciaX>, <distânciaY>, <distânciaZ>), "
+"<seed>, <oitavos>, <persistência>"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Games"
@@ -252,7 +250,7 @@ msgstr "Jogos"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
 msgid "Mods"
-msgstr "Extras"
+msgstr "Mods"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Optionally the lacunarity can be appended with a leading comma."
@@ -265,7 +263,7 @@ msgstr "Por favor, introduza uma lista de flags separadas por vírgulas."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a valid integer."
-msgstr "Por favor insira um inteiro válido."
+msgstr "Por favor, insira um número inteiro válido."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a valid number."
@@ -281,7 +279,7 @@ msgstr "Restaurar valores por defeito"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Select path"
-msgstr "Selecionar diretório"
+msgstr "Seleccionar diretório"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Show technical names"
@@ -301,7 +299,7 @@ msgid ""
 "Install Mod: unsupported filetype \"$1\" or broken archive"
 msgstr ""
 "\n"
-"Instalação de extra: o tipo de arquivo \"$1\" não é suportado ou o arquivo "
+"Instalação de mod: o tipo de ficheiro \"$1\" não é suportado ou o ficheiro "
 "está corrompido"
 
 #: builtin/mainmenu/modmgr.lua
@@ -310,25 +308,25 @@ msgstr "Falha ao instalar de $1 ao $2"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: file: \"$1\""
-msgstr "Instalar Extra: ficheiro: \"$1\""
+msgstr "Instalação de Mod: ficheiro: \"$1\""
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: unable to find real modname for: $1"
-msgstr "Instalação de extra: nome real de extra não encontrado para: $1"
+msgstr "Instalação de Mod: nome real de extra não encontrado para: $1"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: unable to find suitable foldername for modpack $1"
 msgstr ""
-"Instalação de extra: não foi possível encontrar o nome adequado da pasta "
-"para o pacote de extras $1"
+"Instalação de Mod: não foi possível encontrar o nome adequado da pasta para "
+"o pacote de mods $1"
 
 #: builtin/mainmenu/store.lua
 msgid "Close store"
-msgstr "Fechar repositório de extras"
+msgstr "Fechar repositório"
 
 #: builtin/mainmenu/store.lua
 msgid "Downloading $1, please wait..."
-msgstr "Descarregando $1, por favor aguarde..."
+msgstr "A descarregar $1, por favor aguarde..."
 
 #: builtin/mainmenu/store.lua
 msgid "Install"
@@ -360,7 +358,7 @@ msgstr "Não ordenado"
 
 #: builtin/mainmenu/store.lua
 msgid "re-Install"
-msgstr "re-Instalar"
+msgstr "reinstalar"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Active Contributors"
@@ -380,19 +378,19 @@ msgstr "Antigos Contribuidores"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Previous Core Developers"
-msgstr "Desenvolvedores Chave Antigos"
+msgstr "Desenvolvedores principais anteriores"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Installed Mods:"
-msgstr "Extras Instalados:"
+msgstr "Mods Instalados:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Mod information:"
-msgstr "Informação do extra:"
+msgstr "Informação do Mod:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "No mod description available"
-msgstr "Nenhuma descrição disponível do extra"
+msgstr "Nenhuma descrição do Mod disponível"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Rename"
@@ -400,20 +398,19 @@ msgstr "Renomear"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Select Mod File:"
-msgstr "Seleccionar ficheiro de Extra:"
+msgstr "Seleccionar ficheiro de Mod:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Uninstall selected mod"
-msgstr "Desinstalar extra selecionado"
+msgstr "Desinstalar mod selecionado"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Uninstall selected modpack"
-msgstr "Desinstalar pacote de extras selecionado"
+msgstr "Desinstalar pacote de mods selecionado"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "Endereço / Porta :"
+msgstr "Endereço / Porta"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
@@ -432,27 +429,24 @@ msgid "Damage enabled"
 msgstr "Dano ativado"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Del. Favorite"
-msgstr "Favoritos:"
+msgstr "Rem. Favorito"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Favorite"
-msgstr "Favoritos:"
+msgstr "Favorito"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Nome / Senha :"
+msgstr "Nome / Senha"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
-msgstr "PvP activado"
+msgstr "PvP ativado"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Bind Address"
-msgstr "Endereço Bind"
+msgstr "Endereço de ligação"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "Configure"
@@ -478,7 +472,7 @@ msgstr "Novo"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "No world created or selected!"
-msgstr "Nenhum mundo criado ou selecionado!"
+msgstr "Nenhum mundo criado ou seleccionado!"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Port"
@@ -498,11 +492,11 @@ msgstr "Servidor"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Server Port"
-msgstr "Porta"
+msgstr "Porta do servidor"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Start Game"
-msgstr "Jogar"
+msgstr "Iniciar Jogo"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "2x"
@@ -526,7 +520,7 @@ msgstr "Configurações Avançadas"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Antialiasing:"
-msgstr "Antisserrilhamento:"
+msgstr "Antialiasing:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Are you sure to reset your singleplayer world?"
@@ -534,10 +528,9 @@ msgstr "Tem a certeza que deseja reiniciar o seu mundo?"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Bilinear Filter"
-msgstr "Filtro bi-linear"
+msgstr "Filtro bilinear"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
 msgstr "Bump mapping"
 
@@ -555,11 +548,11 @@ msgstr "Folhas detalhadas"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Mipmap"
-msgstr "Mapa MIP"
+msgstr "Mipmap"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Mipmap + Aniso. Filter"
-msgstr "Mapa MIP + Filtro Anisotrópico"
+msgstr "Mipmap + Filtro Anisotrópico"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No"
@@ -571,14 +564,13 @@ msgstr "Sem Filtro"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No Mipmap"
-msgstr "Sem mapa MIP"
+msgstr "Sem Mipmap"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Node Highlighting"
 msgstr "Destaque dos Cubos"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Outlining"
 msgstr "Destaque dos Cubos"
 
@@ -587,9 +579,8 @@ msgid "None"
 msgstr "Nenhum"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Normal Mapping"
-msgstr "Mapeamento de tons"
+msgstr "Mapeamento Normal"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
@@ -604,9 +595,12 @@ msgid "Parallax Occlusion"
 msgstr "Oclusão de paralaxe"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "Ativar Partículas"
+msgstr "Ativar Particulas"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Reiniciar mundo singleplayer"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
@@ -630,7 +624,7 @@ msgstr "Texturização:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "Para ativar os sombreadores é necessário usar o driver OpenGL."
+msgstr "Para ativar as sombras é necessário usar o controlador OpenGL."
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Tone Mapping"
@@ -642,7 +636,7 @@ msgstr "Nível de sensibilidade ao toque (px)"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Trilinear Filter"
-msgstr "Filtro tri-linear"
+msgstr "Filtro trilinear"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Waving Leaves"
@@ -662,7 +656,7 @@ msgstr "Sim"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Config mods"
-msgstr "Configurar extras"
+msgstr "Configurar mods"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Main"
@@ -670,7 +664,7 @@ msgstr "Principal"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Start Singleplayer"
-msgstr "Iniciar jogo solo"
+msgstr "Iniciar Um Jogador"
 
 #: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
 msgid "Play"
@@ -682,7 +676,7 @@ msgstr "Um Jogador"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "No information available"
-msgstr "Sem informação"
+msgstr "Sem informações disponíveis"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "Select texture pack:"
@@ -690,7 +684,7 @@ msgstr "Selecione um pacote de texturas:"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "Texturepacks"
-msgstr "Pacotes texturas"
+msgstr "Pacotes de texturas"
 
 #: src/client.cpp
 msgid "Connection timed out."
@@ -698,7 +692,7 @@ msgstr "Erro de ligação (tempo excedido)."
 
 #: src/client.cpp
 msgid "Done!"
-msgstr "Terminado!"
+msgstr "Feito!"
 
 #: src/client.cpp
 msgid "Initializing nodes"
@@ -714,11 +708,11 @@ msgstr "A carregar texturas..."
 
 #: src/client.cpp
 msgid "Rebuilding shaders..."
-msgstr "Reconstruindo sombreadores..."
+msgstr "A reconstruir sombras..."
 
 #: src/client/clientlauncher.cpp
 msgid "Connection error (timed out?)"
-msgstr "Erro de conexão (excedeu tempo?)"
+msgstr "Erro de ligação (excedeu tempo?)"
 
 #: src/client/clientlauncher.cpp
 msgid "Could not find or load game \""
@@ -726,7 +720,7 @@ msgstr "Não foi possível encontrar ou carregar jogo \""
 
 #: src/client/clientlauncher.cpp
 msgid "Invalid gamespec."
-msgstr "gamespec inválido."
+msgstr "Especificação de jogo inválida."
 
 #: src/client/clientlauncher.cpp
 msgid "Main Menu"
@@ -734,8 +728,7 @@ msgstr "Menu Principal"
 
 #: src/client/clientlauncher.cpp
 msgid "No world selected and no address provided. Nothing to do."
-msgstr ""
-"Nenhum mundo seleccionado e nenhum endereço providenciado. Nada para fazer."
+msgstr "Nenhum mundo seleccionado e nenhum endereço fornecido. Nada a fazer."
 
 #: src/client/clientlauncher.cpp
 msgid "Player name too long."
@@ -743,11 +736,11 @@ msgstr "Nome de jogador demasiado longo."
 
 #: src/client/clientlauncher.cpp
 msgid "Provided world path doesn't exist: "
-msgstr "O caminho fornecido não existe: "
+msgstr "O caminho fornecido do mundo não existe: "
 
 #: src/fontengine.cpp
 msgid "needs_fallback_font"
-msgstr "yes"
+msgstr "necessita_fonte_alternativa"
 
 #: src/game.cpp
 msgid ""
@@ -796,7 +789,7 @@ msgid ""
 "- T: chat\n"
 msgstr ""
 "Teclas por defeito:\n"
-"- WASD: mover\n"
+"- WASD: andar\n"
 "- Barra de espaço: saltar/subir\n"
 "- Shift: andar cuidadosamente/descer\n"
 "- Q: Largar item\n"
@@ -805,7 +798,7 @@ msgstr ""
 "- Clique esquerdo: cavar/bater\n"
 "- Clique direito: colocar/utilizar\n"
 "- Roda do rato: seleccionar item\n"
-"- T: conversação\n"
+"- T: chat\n"
 
 #: src/game.cpp
 msgid ""
@@ -837,11 +830,11 @@ msgstr ""
 
 #: src/game.cpp
 msgid "Exit to Menu"
-msgstr "Sair para Menu"
+msgstr "Sair para o Menu"
 
 #: src/game.cpp
 msgid "Exit to OS"
-msgstr "Sair para o sistema"
+msgstr "Sair para o S.O"
 
 #: src/game.cpp
 msgid "Item definitions..."
@@ -849,11 +842,11 @@ msgstr "Definições dos Itens..."
 
 #: src/game.cpp
 msgid "KiB/s"
-msgstr "KB/s"
+msgstr "KiB/s"
 
 #: src/game.cpp
 msgid "Media..."
-msgstr "Dados..."
+msgstr "Media..."
 
 #: src/game.cpp
 msgid "MiB/s"
@@ -861,7 +854,7 @@ msgstr "MiB/s"
 
 #: src/game.cpp
 msgid "Node definitions..."
-msgstr "Definindo cubos..."
+msgstr "A definir cubos..."
 
 #: src/game.cpp
 msgid "Resolving address..."
@@ -869,7 +862,7 @@ msgstr "A resolver endereço..."
 
 #: src/game.cpp
 msgid "Respawn"
-msgstr "Reaparecer"
+msgstr "Renascer"
 
 #: src/game.cpp
 msgid "Shutting down..."
@@ -905,7 +898,7 @@ msgstr "Recuar"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Chat"
-msgstr "Conversa"
+msgstr "Chat"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Command"
@@ -917,7 +910,7 @@ msgstr "Consola"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Double tap \"jump\" to toggle fly"
-msgstr "Carregue duas vezes em \"saltar\" para ativar o vôo"
+msgstr "Carregue duas vezes em \"saltar\" para voar"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Drop"
@@ -983,6 +976,10 @@ msgstr "Ativar/Desativar noclip"
 msgid "Use"
 msgstr "Usar"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "pressione a tecla"
@@ -1005,7 +1002,7 @@ msgstr "Senha antiga"
 
 #: src/guiPasswordChange.cpp
 msgid "Passwords do not match!"
-msgstr "Senhas não correspondem!"
+msgstr "As senhas não correspondem!"
 
 #: src/guiVolumeChange.cpp
 msgid "Exit"
@@ -1017,11 +1014,11 @@ msgstr "Volume do som: "
 
 #: src/keycode.cpp
 msgid "Apps"
-msgstr "App"
+msgstr "Aplicações"
 
 #: src/keycode.cpp
 msgid "Attn"
-msgstr "Attm"
+msgstr "Attn"
 
 #: src/keycode.cpp
 msgid "Back"
@@ -1045,7 +1042,7 @@ msgstr "Control"
 
 #: src/keycode.cpp
 msgid "Convert"
-msgstr "Converter"
+msgstr "Convert"
 
 #: src/keycode.cpp
 msgid "CrSel"
@@ -1129,7 +1126,7 @@ msgstr "Menu"
 
 #: src/keycode.cpp
 msgid "Middle Button"
-msgstr "Botão Central do Rato"
+msgstr "Roda do Rato"
 
 #: src/keycode.cpp
 msgid "Minus"
@@ -1221,7 +1218,7 @@ msgstr "Pausa"
 
 #: src/keycode.cpp
 msgid "Period"
-msgstr "Período"
+msgstr "Ponto"
 
 #: src/keycode.cpp
 msgid "Plus"
@@ -1299,10 +1296,6 @@ msgstr "Botão X 1"
 msgid "X Button 2"
 msgstr "Botão X 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1313,7 +1306,7 @@ msgid ""
 msgstr ""
 "Deslocamento (X,Y,Z) do fractal a partir do centro do mundo em unidades "
 "'escala'.\n"
-"Usado para obter uma área de nascimento apropriada, próxima de (0, 0).\n"
+"Usado para obter um spawnpoint apropriado, próximo de (0, 0).\n"
 "Valores por defeito apropriados para conjunto de Mandelbrot, necessitam ser "
 "adaptados para conjunto de Julia.\n"
 "Intervalos aproximadamente entre -2 e 2. Multiplicar por 'escala' para "
@@ -1359,14 +1352,14 @@ msgid ""
 "A chosen map seed for a new map, leave empty for random.\n"
 "Will be overridden when creating a new world in the main menu."
 msgstr ""
-"Semente aleatória para gerar um novo mundo (em branco para deixar o "
-"computador escolher).\n"
+"Seed aleatória para um novo mundo (em branco para ser aleatória).\n"
 "Será anulada quando for criado um outro novo mundo no menu principal."
 
 #: src/settings_translation_file.cpp
 msgid "A message to be displayed to all clients when the server crashes."
 msgstr ""
-"Mensagem a ser mostrada a todos os clientes do servidor quando ele bloqueia."
+"Mensagem a ser mostrada a todos os clientes do servidor quando o servidor "
+"crasha."
 
 #: src/settings_translation_file.cpp
 msgid "A message to be displayed to all clients when the server shuts down."
@@ -1383,22 +1376,24 @@ msgid "Acceleration in air"
 msgstr "Aceleração no ar"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Management interval"
-msgstr "Distância de ativação de blocos"
+msgstr "Intervalo de gestão de blocos ativos"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Modifier interval"
-msgstr "Distância de ativação de blocos"
+msgstr "Intervalo de Modificador de Blocos ativos"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Modificadores de Blocos Ativos"
 
 #: src/settings_translation_file.cpp
 msgid "Active block range"
-msgstr "Distância de ativação de blocos"
+msgstr "Alcance de blocos ativos"
 
 #: src/settings_translation_file.cpp
 msgid "Active object send range"
-msgstr "Distância de ativação de objectos"
+msgstr "Distância de envio de objetos ativos"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1406,7 +1401,7 @@ msgid ""
 "Leave this blank to start a local server.\n"
 "Note that the address field in the main menu overrides this setting."
 msgstr ""
-"Endereço para conexão.\n"
+"Endereço para ligação.\n"
 "Deixe em branco para iniciar um servidor local.\n"
 "Note que o campo de endereço no menu principal sobrescreve esta configuração."
 
@@ -1415,7 +1410,7 @@ msgid ""
 "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
 "screens."
 msgstr ""
-"Ajustar configuração de dpi ao seu ecrã (não aplicável a X11/Android) e.g. "
+"Ajustar configuração de dpi ao seu ecrã (não aplicável a X11/Android) ex: "
 "para ecrãs 4K."
 
 #: src/settings_translation_file.cpp
@@ -1423,9 +1418,9 @@ msgid ""
 "Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n"
 "This setting is for the client only and is ignored by the server."
 msgstr ""
-"Ajusta a correção gama nas tabelas de luminosidade. Valores mais baixos "
+"Ajusta a codificação gama nas tabelas de luminosidade. Valores mais baixos "
 "resultam \n"
-"em imagem mais clara. Configuração somente para o cliente e ignorada pelo "
+"numa imagem mais clara. Configuração somente para o cliente e ignorada pelo "
 "servidor."
 
 #: src/settings_translation_file.cpp
@@ -1479,6 +1474,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr "Informar automáticamente a lista de servidores."
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Tecla de autoexecução"
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "Tecla para andar para trás"
 
@@ -1491,9 +1490,8 @@ msgid "Basic"
 msgstr "Básico"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Basic Privileges"
-msgstr "Privilégios por defeito"
+msgstr "Privilégios básicos"
 
 #: src/settings_translation_file.cpp
 msgid "Bilinear filtering"
@@ -1512,6 +1510,10 @@ msgid "Build inside player"
 msgstr "Construir com o jogador dentro do cubo"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Builtin"
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Bump mapping"
 
@@ -1537,7 +1539,7 @@ msgstr "Ruído para cavernas #2"
 
 #: src/settings_translation_file.cpp
 msgid "Cave width"
-msgstr ""
+msgstr "Largura da caverna"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1552,6 +1554,10 @@ msgid "Chat toggle key"
 msgstr "Tecla mostra/esconde conversação"
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Comandos do Chat"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1643,6 +1649,15 @@ msgstr "Névoa colorida"
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Lista separada por vírgulas de extras que podem usar APIs de requisição "
+"HTTP, \n"
+"que lhes permitem enviar e descarregar dados para/da internet."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Comma-separated list of trusted mods that are allowed to access insecure\n"
 "functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
@@ -1652,15 +1667,6 @@ msgstr ""
 "request_insecure_environment())."
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Lista separada por vírgulas de extras que podem usar APIs de requisição "
-"HTTP, \n"
-"que lhes permitem enviar e descarregar dados para/da internet."
-
-#: src/settings_translation_file.cpp
 msgid "Command key"
 msgstr "Tecla de comando"
 
@@ -1728,7 +1734,7 @@ msgstr "Controla a inclinação/altura das colinas."
 
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Controla a largura dos túneis, um valor menor cria túneis maiores."
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
@@ -1815,6 +1821,10 @@ msgid "Default privileges"
 msgstr "Privilégios por defeito"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Formato de report predefinido"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1837,6 +1847,10 @@ msgstr ""
 "ilimitado)."
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Atraso no envio de blocos após construção"
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr "Latência de apresentação de dicas de ferramentas, em milissegundos."
 
@@ -1869,15 +1883,6 @@ msgid "Desynchronize block animation"
 msgstr "Dessincroniza animação de blocos"
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-"Dados de perfil detalhados do extra. Útil para desenvolvedores de extras."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Dados de perfil detalhados do extra"
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1892,6 +1897,21 @@ msgid "Disable anticheat"
 msgstr "Desativar anti-batota"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Desabilitar as sequências de escape"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Desabilitar as sequências de escape, por exemplo, colorimento de bate-papo.\n"
+"Use isto se você quiser executar um servidor com clientes pre-0.4.14 e para "
+"desabilitar as sequências de escape geradas por modificadores."
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "Não permitir senhas vazias"
 
@@ -1916,6 +1936,10 @@ msgid "Dump the mapgen debug infos."
 msgstr "Mostrar informações de depuração do gerador de mapa."
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Ativar Joysticks"
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "Ativar VBO"
 
@@ -1936,6 +1960,8 @@ msgid ""
 "Enable smooth lighting with simple ambient occlusion.\n"
 "Disable for speed or for different looks."
 msgstr ""
+"Ativar a iluminação suave com oclusão de ambiente simples.\n"
+"Desativar para velocidade ou vistas diferentes."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1958,6 +1984,10 @@ msgid ""
 "textures)\n"
 "when connecting to the server."
 msgstr ""
+"Ativar a utilização de um servidor media remoto (se fornecido pelo "
+"servidor).\n"
+"Servidores remotos oferecem uma maneira mais rápida de descarregar media\n"
+"(ex. texturas) quando se estiver a conectar ao servidor."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1981,10 +2011,14 @@ msgid ""
 "or need to be auto-generated.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Ativa o bumpmapping para texturas. Mapas normais devem ser fornecidos pelo "
+"pack de\n"
+"texturas ou gerado automaticamente.\n"
+"Requer que as sombras sejam ativadas."
 
 #: src/settings_translation_file.cpp
 msgid "Enables caching of facedir rotated meshes."
-msgstr ""
+msgstr "Ativar armazenamento em cache para os meshes das faces."
 
 #: src/settings_translation_file.cpp
 msgid "Enables filmic tone mapping"
@@ -2009,6 +2043,14 @@ msgstr ""
 "Requer sombreadores ativados."
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2071,11 +2113,23 @@ msgid "Field of view"
 msgstr "Campo de visão"
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Campo de visão"
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr "Campo de visão em graus."
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Campo de visão durante o zoom em graus.\n"
+"Isto requer o privilégio \"zoom\" no servidor."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2216,12 +2270,14 @@ msgid "Generate normalmaps"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2257,6 +2313,15 @@ msgstr ""
 "-    error: aborta (sugerido para desenvolvedores de extras)."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr "Altura da janela inicial."
 
@@ -2287,15 +2352,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2395,6 +2451,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr "Côr de fundo da consola de conversação (R,G,B)."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2429,6 +2519,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2610,6 +2708,16 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tecla para ativar auto-corrida.\n"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2648,10 +2756,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Tecla para ativar a atualização da câmara. Usado para desenvolvimento.\n"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2814,6 +2925,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "A carregar modificadores de blocos"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2846,8 +2972,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2857,8 +2981,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2869,8 +2991,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2880,8 +3000,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2932,9 +3050,8 @@ msgid "Mapgen flat"
 msgstr "Gerador de mapa plano"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat cave width"
-msgstr "Limite de lagos no gerador de mapa plano"
+msgstr "Tamanho de cavernas lisas no Mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave1 noise parameters"
@@ -2985,9 +3102,8 @@ msgid "Mapgen fractal"
 msgstr "Gerador de mapa fractal"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal cave width"
-msgstr "W do corte do gerador de mapa fractal"
+msgstr "Tamanho da caverna mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave1 noise parameters"
@@ -3055,9 +3171,8 @@ msgid "Mapgen v5"
 msgstr "Gerador de mapa V5"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v5 cave width"
-msgstr "Gerador de mapa V5"
+msgstr "Tamanho da Caverna no Mapgen v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave1 noise parameters"
@@ -3144,9 +3259,8 @@ msgid "Mapgen v7"
 msgstr "Gerador de mapa V7"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v7 cave width"
-msgstr "Gerador de mapa V7"
+msgstr "Tamanho da caverna no mapgen v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave1 noise parameters"
@@ -3245,6 +3359,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3286,17 +3408,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3308,10 +3434,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "Opções para menus"
 
@@ -3352,10 +3474,6 @@ msgid "Mipmapping"
 msgstr "Mapeamento MIP"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3560,11 +3678,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3572,7 +3696,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3609,6 +3733,10 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Diretório para logs"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "Tecla para a direita"
 
@@ -3679,14 +3807,12 @@ msgid "Screenshot folder"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot format"
-msgstr "Captura de ecrã"
+msgstr "Formato da captura de ecrã"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot quality"
-msgstr "Captura de ecrã"
+msgstr "Qualidade da Captura de ecrã"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3775,7 +3901,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3813,7 +3939,7 @@ msgstr "Iluminação suave"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3892,10 +4018,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3911,6 +4049,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3926,6 +4070,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -4036,10 +4186,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Útil para desenvolvedores de extras."
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4170,7 +4316,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4286,58 +4432,113 @@ msgstr ""
 msgid "cURL timeout"
 msgstr ""
 
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr ""
+#~ "Dados de perfil detalhados do extra. Útil para desenvolvedores de extras."
+
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Dados de perfil detalhados do extra"
+
+#~ msgid "Useful for mod developers."
+#~ msgstr "Útil para desenvolvedores de extras."
+
+#~ msgid "No of course not!"
+#~ msgstr "Não, é claro que não!"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "Lista de Servidores Públicos"
+
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Gerar Normalmaps"
+
+#~ msgid "No!!!"
+#~ msgstr "Não!!!"
+
 #, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "A carregar..."
+#~ msgid "If disabled "
+#~ msgstr "Desativar Tudo"
 
 #, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Descarregar"
+#~ msgid "If enabled, "
+#~ msgstr "ativo"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Botão esq: Mover todos os itens  Botão dir: Mover um item"
+#~ msgid "Game Name"
+#~ msgstr "Nome do Jogo"
 
-#~ msgid "is required by:"
-#~ msgstr "é necessário pelo:"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr ""
+#~ "Mensagem de Jogo: Impossível fazer cópia do extra \"$1\" para o jogo "
+#~ "\"$2\""
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "Configuração gravada.  "
+#~ msgid "GAMES"
+#~ msgstr "JOGOS"
 
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Atenção: Configuração não compatível.  "
+#~ msgid "Mods:"
+#~ msgstr "Extras:"
 
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Não foi possível criar mundo: Nome com caracteres inválidos"
+#~ msgid "new game"
+#~ msgstr "novo jogo"
 
-#~ msgid "Show Public"
-#~ msgstr "Mostrar Públicos"
+#~ msgid "EDIT GAME"
+#~ msgstr "EDITAR JOGO"
 
-#~ msgid "Show Favorites"
-#~ msgstr "Mostrar Favoritos"
+#~ msgid "Remove selected mod"
+#~ msgstr "Remover extra selecionado"
 
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Deixe endereço em branco para iniciar servidor local."
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Adicionar extra"
 
-#~ msgid "Create world"
-#~ msgstr "Criar mundo"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENTE"
 
-#~ msgid "Address required."
-#~ msgstr "Endereço necessário."
+#~ msgid "START SERVER"
+#~ msgstr "INICIAR SERVIDOR"
 
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Não foi possível eliminar mundo: Nada seleccionado"
+#~ msgid "Name"
+#~ msgstr "Nome"
 
-#~ msgid "Files to be deleted"
-#~ msgstr "Ficheiros para eliminar"
+#~ msgid "Password"
+#~ msgstr "Senha"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Não foi possível criar mundo: Não foram detectados jogos"
+#~ msgid "SETTINGS"
+#~ msgstr "DEFINIÇÕES"
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Não foi possível configurar mundo: Nada seleccionado"
+#~ msgid "Preload item visuals"
+#~ msgstr "Pré-carregamento dos itens"
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Falhou a remoção de todos os ficheiros dos mundos"
+#~ msgid "Finite Liquid"
+#~ msgstr "Líquido Finito"
+
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "Um Jogador"
+
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "PACOTES DE TEXTURAS"
+
+#~ msgid "MODS"
+#~ msgstr "EXTRAS"
+
+#, fuzzy
+#~ msgid "Add mod:"
+#~ msgstr "<<-- Adicionar extra"
+
+#, fuzzy
+#~ msgid "Local install"
+#~ msgstr "Instalar"
+
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration.  "
+#~ msgstr ""
+#~ "Atenção: Alguns mods ainda não estão configurados.\n"
+#~ "Eles vão ser ativados por predefinição quando guardar a configuração.  "
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration.  "
+#~ msgstr ""
+#~ "Atenção: Alguns mods configurados estão em falta.\n"
+#~ "As suas definições vão ser removidas quando gravar a configuração.  "
 
 #~ msgid ""
 #~ "Default Controls:\n"
@@ -4364,100 +4565,55 @@ msgstr ""
 #~ "- ESC: Este menu\n"
 #~ "- T: Chat\n"
 
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
-#~ msgstr ""
-#~ "Atenção: Alguns mods configurados estão em falta.\n"
-#~ "As suas definições vão ser removidas quando gravar a configuração.  "
-
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration.  "
-#~ msgstr ""
-#~ "Atenção: Alguns mods ainda não estão configurados.\n"
-#~ "Eles vão ser ativados por predefinição quando guardar a configuração.  "
-
-#, fuzzy
-#~ msgid "Local install"
-#~ msgstr "Instalar"
-
-#, fuzzy
-#~ msgid "Add mod:"
-#~ msgstr "<<-- Adicionar extra"
-
-#~ msgid "MODS"
-#~ msgstr "EXTRAS"
-
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "PACOTES DE TEXTURAS"
-
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "Um Jogador"
-
-#~ msgid "Finite Liquid"
-#~ msgstr "Líquido Finito"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Falhou a remoção de todos os ficheiros dos mundos"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Pré-carregamento dos itens"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Não foi possível configurar mundo: Nada seleccionado"
 
-#~ msgid "SETTINGS"
-#~ msgstr "DEFINIÇÕES"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Não foi possível criar mundo: Não foram detectados jogos"
 
-#~ msgid "Password"
-#~ msgstr "Senha"
+#~ msgid "Files to be deleted"
+#~ msgstr "Ficheiros para eliminar"
 
-#~ msgid "Name"
-#~ msgstr "Nome"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Não foi possível eliminar mundo: Nada seleccionado"
 
-#~ msgid "START SERVER"
-#~ msgstr "INICIAR SERVIDOR"
+#~ msgid "Address required."
+#~ msgstr "Endereço necessário."
 
-#~ msgid "CLIENT"
-#~ msgstr "CLIENTE"
+#~ msgid "Create world"
+#~ msgstr "Criar mundo"
 
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Adicionar extra"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Deixe endereço em branco para iniciar servidor local."
 
-#~ msgid "Remove selected mod"
-#~ msgstr "Remover extra selecionado"
+#~ msgid "Show Favorites"
+#~ msgstr "Mostrar Favoritos"
 
-#~ msgid "EDIT GAME"
-#~ msgstr "EDITAR JOGO"
+#~ msgid "Show Public"
+#~ msgstr "Mostrar Públicos"
 
-#~ msgid "new game"
-#~ msgstr "novo jogo"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Não foi possível criar mundo: Nome com caracteres inválidos"
 
-#~ msgid "Mods:"
-#~ msgstr "Extras:"
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Atenção: Configuração não compatível.  "
 
-#~ msgid "GAMES"
-#~ msgstr "JOGOS"
+#~ msgid "Configuration saved.  "
+#~ msgstr "Configuração gravada.  "
 
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr ""
-#~ "Mensagem de Jogo: Impossível fazer cópia do extra \"$1\" para o jogo "
-#~ "\"$2\""
+#~ msgid "is required by:"
+#~ msgstr "é necessário pelo:"
 
-#~ msgid "Game Name"
-#~ msgstr "Nome do Jogo"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Botão esq: Mover todos os itens  Botão dir: Mover um item"
 
 #, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "ativo"
+#~ msgid "Downloading"
+#~ msgstr "Descarregar"
 
 #, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Desativar Tudo"
-
-#~ msgid "No!!!"
-#~ msgstr "Não!!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Gerar Normalmaps"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Lista de Servidores Públicos"
-
-#~ msgid "No of course not!"
-#~ msgstr "Não, é claro que não!"
+#~ msgid "Preload inventory textures"
+#~ msgstr "A carregar..."
diff --git a/po/pt_BR/minetest.po b/po/pt_BR/minetest.po
index 3b34522..d759c87 100644
--- a/po/pt_BR/minetest.po
+++ b/po/pt_BR/minetest.po
@@ -7,21 +7,21 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-03-31 13:45+0000\n"
-"Last-Translator: Ian giestas pauli <iangiestaspauli at gmail.com>\n"
-"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
-"minetest/minetest/pt_BR/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-20 06:07+0000\n"
+"Last-Translator: Cold Meson 06 <fernando.devmines at gmail.com>\n"
+"Language-Team: Portuguese (Brazil) "
+"<https://hosted.weblate.org/projects/minetest/minetest/pt_BR/>\n"
 "Language: pt_BR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"X-Generator: Weblate 2.10\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr "Ocorreu um erro no script Lua, assim como em um mod:"
+msgstr "Ocorreu um erro em um script Lua, como um mod:"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
@@ -41,7 +41,7 @@ msgstr "Reconectar"
 
 #: builtin/fstk/ui.lua
 msgid "The server has requested a reconnect:"
-msgstr "O servidor requisitou uma reconexão:"
+msgstr "O servidor solicitou uma reconexão:"
 
 #: builtin/mainmenu/common.lua src/game.cpp
 msgid "Loading..."
@@ -53,25 +53,25 @@ msgstr "Versão do protocolo incompatível. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr "O servidor suporta o protocolo versão $1. "
+msgstr "O servidor obriga a versão de protocolo $1. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
-msgstr "O servidor suporta entre as versões $1 e $2 do protocolo. "
+msgstr "O servidor suporta versões de protocolo entre $1 e $2. "
 
 #: builtin/mainmenu/common.lua
 msgid "Try reenabling public serverlist and check your internet connection."
 msgstr ""
-"Tente reabilitar a lista de servidores públicos e checar sua conexão de "
-"internet."
+"Tente reabilitar a lista de servidores públicos e verifique sua conexão com "
+"a internet."
 
 #: builtin/mainmenu/common.lua
 msgid "We only support protocol version $1."
-msgstr "Nós apenas suportamos a versão $1 do protocolo."
+msgstr "Nós apenas suportamos a versão de protocolo $1."
 
 #: builtin/mainmenu/common.lua
 msgid "We support protocol versions between version $1 and $2."
-msgstr "Nós suportamos entre as versões $1 e $2 do protocolo."
+msgstr "Nós suportamos as versões de protocolo entre $1 e $2 ."
 
 #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -141,11 +141,11 @@ msgstr "Criar"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Baixe um subgame, como o minetest_game, do site minetest.net"
+msgstr "Baixe um subgame, como minetest_game, do site minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download one from minetest.net"
-msgstr "Baixe um do site minetest.net"
+msgstr "Baixe um apartir do site minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
 msgid "Game"
@@ -175,7 +175,7 @@ msgstr "Nome do mundo"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "You have no subgames installed."
-msgstr "Você não possui nenhum subgame instalado."
+msgstr "Você não possui subgames instalados."
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Are you sure you want to delete \"$1\"?"
@@ -213,7 +213,7 @@ msgstr "\"$1\" não é uma flag válida."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "(No description of setting given)"
-msgstr "(Descrição de configuração não fornecida)"
+msgstr "(Não há uma descrição para esta configuração)"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "< Back to Settings page"
@@ -221,7 +221,7 @@ msgstr "< Voltar para as configurações"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Browse"
-msgstr "Navegar"
+msgstr "Procurar"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Disabled"
@@ -253,7 +253,7 @@ msgstr "Jogos"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
 msgid "Mods"
-msgstr "Módulos"
+msgstr "Modulos (Mods)"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Optionally the lacunarity can be appended with a leading comma."
@@ -274,7 +274,7 @@ msgstr "Por favor, insira um número válido."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Possible values are: "
-msgstr "Os possíveis valores são: "
+msgstr "Valores possíveis são: "
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Restore Default"
@@ -302,12 +302,11 @@ msgid ""
 "Install Mod: unsupported filetype \"$1\" or broken archive"
 msgstr ""
 "\n"
-"Instalação de módulo: o tipo de arquivo \"$1\" não é suportado ou o arquivo "
-"está corrompido"
+"Instalar Mod: tipo de arquivo \"$1\" não suportado ou corrompido"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Failed to install $1 to $2"
-msgstr "Não foi possível instalar $1 em $2"
+msgstr "Não foi possível instalar $1 para $2"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: file: \"$1\""
@@ -326,7 +325,7 @@ msgstr ""
 
 #: builtin/mainmenu/store.lua
 msgid "Close store"
-msgstr "Fechar Mod Store"
+msgstr "Fechar loja"
 
 #: builtin/mainmenu/store.lua
 msgid "Downloading $1, please wait..."
@@ -346,7 +345,7 @@ msgstr "Classificação"
 
 #: builtin/mainmenu/store.lua
 msgid "Search"
-msgstr "Procurar"
+msgstr "Buscar"
 
 #: builtin/mainmenu/store.lua
 msgid "Shortname:"
@@ -358,7 +357,7 @@ msgstr "Instalado com sucesso:"
 
 #: builtin/mainmenu/store.lua
 msgid "Unsorted"
-msgstr "Desorganizado"
+msgstr "Sem categoria"
 
 #: builtin/mainmenu/store.lua
 msgid "re-Install"
@@ -394,7 +393,7 @@ msgstr "Informação do módulo:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "No mod description available"
-msgstr "Nenhuma descrição disponível do módulo"
+msgstr "Nenhuma descrição do módulo disponível"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Rename"
@@ -413,9 +412,8 @@ msgid "Uninstall selected modpack"
 msgstr "Desinstalar o pacote de módulos selecionado"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "Endereço / Porta :"
+msgstr "Endereço / Porta"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
@@ -431,22 +429,19 @@ msgstr "Modo criativo"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Damage enabled"
-msgstr "Habilitar dano"
+msgstr "Dano habilitado"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Del. Favorite"
-msgstr "Favoritos:"
+msgstr "Deletar Favorito"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Favorite"
-msgstr "Favoritos:"
+msgstr "Favoritos"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Nome / Senha :"
+msgstr "Nome / Senha"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -532,14 +527,13 @@ msgstr "Antialiasing:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Are you sure to reset your singleplayer world?"
-msgstr "Você tem certeza que deseja resetar seu mundo?"
+msgstr "Você tem certeza que deseja resetar seu mundo um-jogador?"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Bilinear Filter"
 msgstr "Filtragem bi-linear"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
 msgstr "Bump mapping"
 
@@ -580,18 +574,16 @@ msgid "Node Highlighting"
 msgstr "Destaque nos Blocos"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Outlining"
-msgstr "Destaque nos Blocos"
+msgstr "Bloco Delineado"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
 msgstr "Nenhum"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Normal Mapping"
-msgstr "Tone mapping"
+msgstr "Mapeamento de Normais"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
@@ -606,9 +598,12 @@ msgid "Parallax Occlusion"
 msgstr "Oclusão de paralaxe"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "Habilitar partículas"
+msgstr "Partículas"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Resetar mundo um-jogador"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
@@ -623,7 +618,6 @@ msgid "Simple Leaves"
 msgstr "Folhas Simples"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Smooth Lighting"
 msgstr "Iluminação suave"
 
@@ -717,7 +711,7 @@ msgstr "Carregando texturas..."
 
 #: src/client.cpp
 msgid "Rebuilding shaders..."
-msgstr "Recompilando shaders..."
+msgstr "Reconstruindo sombreadores..."
 
 #: src/client/clientlauncher.cpp
 msgid "Connection error (timed out?)"
@@ -742,15 +736,15 @@ msgstr ""
 
 #: src/client/clientlauncher.cpp
 msgid "Player name too long."
-msgstr "Seu nome de jogador é muito longo."
+msgstr "Nome de jogador muito longo."
 
 #: src/client/clientlauncher.cpp
 msgid "Provided world path doesn't exist: "
-msgstr "O caminho fornecido não existe: "
+msgstr "O caminho do mundo providenciado  não existe. "
 
 #: src/fontengine.cpp
 msgid "needs_fallback_font"
-msgstr "necessita_fonte_alternativa"
+msgstr "needs_fallback_font"
 
 #: src/game.cpp
 msgid ""
@@ -920,7 +914,7 @@ msgstr "Console"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Double tap \"jump\" to toggle fly"
-msgstr "\"Pular\" duas vezes ativa o voo"
+msgstr "\"Pular\" duas vezes para ativar o voo"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Drop"
@@ -988,9 +982,13 @@ msgstr "Alternar noclip"
 msgid "Use"
 msgstr "Usar"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
-msgstr "press. uma tecla"
+msgstr "pressione uma tecla"
 
 #: src/guiPasswordChange.cpp
 msgid "Change"
@@ -1098,15 +1096,15 @@ msgstr "Insert"
 
 #: src/keycode.cpp
 msgid "Junja"
-msgstr "Tecla Junja"
+msgstr "Junja (tecla)"
 
 #: src/keycode.cpp
 msgid "Kana"
-msgstr "Tecla Kana"
+msgstr "Kana (tecla)"
 
 #: src/keycode.cpp
 msgid "Kanji"
-msgstr "Tecla Kanji"
+msgstr "Kanji (tecla)"
 
 #: src/keycode.cpp
 msgid "Left Button"
@@ -1304,10 +1302,6 @@ msgstr "Botão X 1"
 msgid "X Button 2"
 msgstr "Botão X 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1316,6 +1310,12 @@ msgid ""
 "sets.\n"
 "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
 msgstr ""
+"(X,Y,Z) Espaço do fractal apartir centro do mundo em unidades de 'escala'.\n"
+"Usado para mover uma área adequada de spawn de baixo da terra perto de (0, "
+"0).\n"
+"O padrão é adequado para configurações de mandelbrot,Precisa ser editado "
+"para configurações de julia.\n"
+"Variam cerca de -2 a 2. Multiplica por \"escala\" para compensação de nós."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1374,21 +1374,23 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Absolute limit of emerge queues"
-msgstr "Limite absoluto de emergir filas"
+msgstr "Limite absoluto de filas emergentes"
 
 #: src/settings_translation_file.cpp
 msgid "Acceleration in air"
 msgstr "Aceleração no ar"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Management interval"
-msgstr "Limite para blocos ativos"
+msgstr "Intervalo de Gestão de Blocos Ativos"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Modifier interval"
-msgstr "Limite para blocos ativos"
+msgstr "Intervalo do \"Active Block Modifier\" (ABMs)"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Modificadores de Bloco Ativo (ABM)"
 
 #: src/settings_translation_file.cpp
 msgid "Active block range"
@@ -1476,22 +1478,24 @@ msgid "Automaticaly report to the serverlist."
 msgstr "Informar lista de servidores automaticamente."
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Chave de execução automática"
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "Tecla para andar para trás"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Base terrain height"
-msgstr "Altura da base do terreno"
+msgstr "Altura base do terreno"
 
 #: src/settings_translation_file.cpp
 msgid "Basic"
 msgstr "Básico"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Basic Privileges"
-msgstr "Privilégios por padrão"
+msgstr "Privilégios básicos"
 
 #: src/settings_translation_file.cpp
 msgid "Bilinear filtering"
@@ -1512,6 +1516,11 @@ msgid "Build inside player"
 msgstr "Construir com o jogador dentro do bloco"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Builtin"
+msgstr "Embutido"
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Bump mapping"
 
@@ -1537,7 +1546,7 @@ msgstr "Ruído nas cavernas #2"
 
 #: src/settings_translation_file.cpp
 msgid "Cave width"
-msgstr ""
+msgstr "Largura da caverna"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1553,6 +1562,10 @@ msgid "Chat toggle key"
 msgstr "Tecla comutadora de chat"
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Comandos de Chat"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1624,7 +1637,7 @@ msgstr "Altura das nuvens"
 
 #: src/settings_translation_file.cpp
 msgid "Cloud radius"
-msgstr "Espessura das nuvens"
+msgstr "Raio das nuvens"
 
 #: src/settings_translation_file.cpp
 msgid "Clouds"
@@ -1644,21 +1657,21 @@ msgstr "Névoa colorida"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
-"Lista separada por vírgulas dos mods confiáveis que podem utilizar funções "
-"inseguras mesmo quando o a opção de Mod Seguro está ativada (via "
-"request_insecure_environment())."
+"Lista de mods, separados por vírgulas, que tem acesso a APIs HTTP, que\n"
+"os permitem enviar e baixar informações para/da internet."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
-"Lista de mods, separados por vírgulas, que podem usar APIs de requisição "
-"HTTP, que\n"
-"os permitem enviar e baixar informações para/da internet."
+"Lista separada por vírgulas dos mods confiáveis que podem utilizar funções "
+"inseguras \n"
+"mesmo quando o a opção de Mod Seguro está ativada (via "
+"request_insecure_environment())."
 
 #: src/settings_translation_file.cpp
 msgid "Command key"
@@ -1729,7 +1742,7 @@ msgstr "Controla o esparsamento/altura das colinas."
 
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Controla a largura dos túneis, um valor menor cria túneis mais largos."
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
@@ -1769,7 +1782,7 @@ msgstr "Cor do cursor (R,G,B)."
 
 #: src/settings_translation_file.cpp
 msgid "Crouch speed"
-msgstr "Velocidade para descer"
+msgstr "Velocidade de agachamento"
 
 #: src/settings_translation_file.cpp
 msgid "DPI"
@@ -1781,7 +1794,7 @@ msgstr "Dano"
 
 #: src/settings_translation_file.cpp
 msgid "Debug info toggle key"
-msgstr "Tecla para alternar modo de Debug"
+msgstr "Tecla para alternar modo de Depuração"
 
 #: src/settings_translation_file.cpp
 msgid "Debug log level"
@@ -1816,6 +1829,10 @@ msgid "Default privileges"
 msgstr "Privilégios por padrão"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Formato de reporte padrão"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1829,7 +1846,7 @@ msgid ""
 "A higher value results in smoother normal maps."
 msgstr ""
 "Define processo amostral de textura.\n"
-"Um valor mais alto resulta em mais suaves mapas normais."
+"Um valor mais alto resulta em mapas de normais mais suaves."
 
 #: src/settings_translation_file.cpp
 msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
@@ -1838,12 +1855,16 @@ msgstr ""
 "ilimitado)."
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Atraso em enviar blocos depois da construção"
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr "Dicas de ferramenta mostrando atraso. indicado em milissegundos."
 
 #: src/settings_translation_file.cpp
 msgid "Deprecated Lua API handling"
-msgstr "Tratamento da API Lua rejeitado"
+msgstr "Tratamento de API Lua rejeitada"
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find large caves."
@@ -1870,14 +1891,6 @@ msgid "Desynchronize block animation"
 msgstr "Dessincronizar animação do bloco"
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "Dados detalhados do perfil do mod . Útil para desenvolvedores de mods."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Perfilamento detalhado do mod"
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1892,6 +1905,21 @@ msgid "Disable anticheat"
 msgstr "Habilitar Anti-Hack"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Desabilitar as seqüências de escape"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Desabilitar as sequências de escape, por exemplo, colorimento de bate-papo.\n"
+"Use isto se você quiser executar um servidor com clientes pre-0.4.14 e para "
+"desabilitar as sequências de escape geradas por modificadores."
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "Não permitir logar sem senha"
 
@@ -1913,7 +1941,11 @@ msgstr "Tecla para largar item"
 
 #: src/settings_translation_file.cpp
 msgid "Dump the mapgen debug infos."
-msgstr "Mostrar informações de depuração do Mapgen."
+msgstr "Mostrar informações de depuração do Gerador de mapa."
+
+#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Habilitar Joysticks"
 
 #: src/settings_translation_file.cpp
 msgid "Enable VBO"
@@ -2022,6 +2054,14 @@ msgstr ""
 "Requer shaders a serem ativados."
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Intervalo de exibição dos dados das analizes do motor"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Metodos de entidade"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2031,7 +2071,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "FPS in pause menu"
-msgstr "FPS em menu de pausa"
+msgstr "FPS no menu de pausa"
 
 #: src/settings_translation_file.cpp
 msgid "FSAA"
@@ -2086,11 +2126,23 @@ msgid "Field of view"
 msgstr "Campo de visão"
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Campo de visão para o zoom"
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr "Campo de visão em graus."
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Campo de visão em durante o zoom em graus\n"
+"Isso requer o privilegio \"zoom\" no servidor."
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2099,7 +2151,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Filler Depth"
-msgstr ""
+msgstr "Profundidade de enchimento"
 
 #: src/settings_translation_file.cpp
 msgid "Filmic tone mapping"
@@ -2143,7 +2195,7 @@ msgstr "Tecla de comutação de névoa"
 
 #: src/settings_translation_file.cpp
 msgid "Font path"
-msgstr "Caminho fonte"
+msgstr "Caminho da fonte"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow"
@@ -2167,7 +2219,7 @@ msgstr "Tamanho da fonte"
 
 #: src/settings_translation_file.cpp
 msgid "Format of screenshots."
-msgstr ""
+msgstr "Formato das screenshots."
 
 #: src/settings_translation_file.cpp
 msgid "Forward key"
@@ -2182,22 +2234,22 @@ msgid ""
 "From how far blocks are generated for clients, stated in mapblocks (16 "
 "nodes)."
 msgstr ""
-"De quão longe blocos são gerados para os clientes, indicado em mapa de "
-"blocos (16 nós)."
+"De quão longe blocos são gerados para os clientes, indicado em chunks (16 "
+"blocos)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
 msgstr ""
-"De quão longe blocos são enviados aos clientes, indicado em mapas de blocos "
-"(16 nós)."
+"De quão longe blocos são enviados aos clientes, indicado em chunks (16 "
+"blocos)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "From how far clients know about objects, stated in mapblocks (16 nodes)."
 msgstr ""
-"De quão longe os clientes sabem sobre objetos, indicado em mapas blocos (16 "
-"nós)."
+"De quão longe os clientes sabem sobre objetos, indicado em chunks (16 "
+"blocos)."
 
 #: src/settings_translation_file.cpp
 msgid "Full screen"
@@ -2233,16 +2285,17 @@ msgstr "Geral"
 
 #: src/settings_translation_file.cpp
 msgid "Generate normalmaps"
-msgstr "Gerar normalmaps"
+msgstr "Gerar mapa de normais"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr "Chamadas de retorno Globais"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2252,7 +2305,7 @@ msgstr ""
 "árvores\n"
 "e grama do pântano, em todos os outros mapgens essa flag controla todas as "
 "decorações.\n"
-"Flags que não  são especificadas na string da flag não são alteradas por "
+"Flags que não são especificadas na string da flag não são alteradas por "
 "padrão.\n"
 "Flags começando com \"no\" (não) são usada para explicitamente desabilitá-"
 "las."
@@ -2267,7 +2320,7 @@ msgstr "Gravidade"
 
 #: src/settings_translation_file.cpp
 msgid "HTTP Mods"
-msgstr "HTTP mods"
+msgstr "Modúlos HTTP"
 
 #: src/settings_translation_file.cpp
 msgid "HUD toggle key"
@@ -2289,6 +2342,20 @@ msgstr ""
 "desenvolvedores de mods)."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+"Tem o instrumento de registro em si:\n"
+"* Monitorar uma função vazia.\n"
+"Isto estima a sobrecarga, que o istrumento está adicionando  (+1 Chamada de "
+"função).\n"
+"* Monitorar o amostrador que está sendo usado para atualizar as estatísticas."
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr "Altura da janela inicial."
 
@@ -2315,24 +2382,15 @@ msgid ""
 "In active blocks objects are loaded and ABMs run."
 msgstr ""
 "Quão grande área de blocos estão sujeitos ao material do bloco ativo, "
-"indicado em mapas blocos (16 nós).\n"
+"indicado em mapblocks (16 nós).\n"
 "Em blocos ativos objetos são carregados e ABMs são executadas."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
-"Quanto o servidor aguardará antes de descarregar mapblocks não utilizados. "
+"Quanto o servidor aguardará antes de descarregar chunks não utilizados. \n"
 "Um valor mais elevado é mais suave, mas vai usar mais memória RAM."
 
 #: src/settings_translation_file.cpp
@@ -2444,6 +2502,46 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr "Cor de fundo do Bate-papo no jogo (R,G,B)."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"Monitoração imbutida.\n"
+"Isto é usualmente apenas nessesário por contribuidores core/builtin"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Monitoração de comandos de chat quando registrados."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Monitorar de chamadas de retorno globais durante a registração.\n"
+"(qualquer coisa que você passar ao minetest.register_*() function)"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+"Monitorar a ação de ação do Active Block Modifiers durante a registração."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+"Monitorar a ação de ação do Loading Block Modifiers durante a registração."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Monitorar os métodos das entidades durante a registração."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Monitorização"
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 "Intervalo para cada salvamento de alterações importantes no mundo, indicado "
@@ -2482,20 +2580,27 @@ msgstr ""
 "Controles da escala de detalhes."
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Intervalo de repetição do botão do Joystick"
+
+#: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "Sensibilidade do frustum do Joystick"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
 "Has no effect on 3D fractals.\n"
 "Range roughly -2 to 2."
 msgstr ""
-"Apenas para conjunto de Julia: Largura da constante hipercomplexa "
-"determinando o formato do conjunto.\n"
+"Apenas para a configuração de Julia: Componente W da constante hipercomplexa "
+"determinando o formato julia.\n"
 "Não tem nenhum efeito em fractais 3D.\n"
-"Intervalo rugoso entre -2 e 2."
+"Intervalo aproximadamente entre -2 e 2."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Julia set only: X component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2503,10 +2608,9 @@ msgid ""
 msgstr ""
 "Apenas para conjunto de Julia: Componente X da constante hipercomplexa "
 "determinando o formato do conjunto.\n"
-"Intervalo rugoso entre -2 e 2."
+"Intervalo aproximadamente entre -2 e 2."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Julia set only: Y component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2514,7 +2618,7 @@ msgid ""
 msgstr ""
 "Apenas para conjunto de Julia: Componente Y da constante hipercomplexa "
 "determinando o formato do conjunto.\n"
-"Intervalo rugoso entre -2 e 2."
+"Intervalo aproximadamente entre -2 e 2."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2528,7 +2632,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Jump key"
-msgstr "Pular"
+msgstr "Tecla para Pular"
 
 #: src/settings_translation_file.cpp
 msgid "Jumping speed"
@@ -2570,9 +2674,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Tecla para pular.\n"
-"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Tecla para pular. \n"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319"
+"01735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2580,9 +2684,9 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Tecla para mover-se rápido no modo rápido.\n"
-"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Tecla para mover-se rápido no modo rápido. \n"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319"
+"01735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2710,6 +2814,16 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tecla para ativar/desativar o modo auto acionamento.\n"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319"
+"01735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2760,14 +2874,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
 "Tecla para ativar/desativar a atualização da câmera. Usado somente para "
 "desenvolvimento\n"
-"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319"
+"01735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2876,11 +2990,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between ABM execution cycles"
-msgstr ""
+msgstr "Período de tempo entre os ciclos de execução de ABMs"
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "Período de tempo entre ciclos de execução de NodeTimer"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2954,6 +3068,24 @@ msgid "Liquid update tick"
 msgstr "Período de atualização dos Líquidos"
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Carregar o analizador do jogo"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+"Carregar o analizador do jogo para coletar dados de analize do jogo\n"
+"Providencia o comando /profiler para acessar a analize compiliada.\n"
+"Muito util para desenvolvedores de mods e operadores de servidores."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Carregado Block Modifiers"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr "Menu principal gestor de games"
 
@@ -2981,7 +3113,6 @@ msgid "Map directory"
 msgstr "Diretório do mapa"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen Valleys.\n"
 "'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2989,75 +3120,65 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Atributos para o gerador de mapas específico para o Mapgen v6.\n"
-"Quando biomas de neve estão habilitados, pântanos ficam habilitados e a flag "
-"de pântanos é ignorada.\n"
-"Flags que não são especificadas na string da flag não são modificadas por "
+"Atributos para o gerador de mapas específico para o gerador de mundo Valleys."
+"\n"
+"'altitude_chill' faz elevações mais altas mais geladas, o que pode causar "
+"problemas em biomas.\n"
+"'humid_rivers' modifica a humidade ao redor de rios e em ares que a água "
+"tende a virar poças,\n"
+"Isto pode interferir como os biomas são delicadamente ajustados\n"
+"Flags que não são especificadas na linha da flag não são modificadas por "
 "padrão.\n"
-"Flags começando com \"no\" (não) são usadas para explicitamente desabilitá-"
-"las."
+"Flags começando com \"no\" (não) são usadas para desabilitá-las "
+"explicitamente."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Atributos de mapgen específicos para Mapgen plano.\n"
-"Alguns lagos e colinas são ocasionalmente adicionados num mundo plano.\n"
-"Flags que não estão especificadas na string de flags não são modificados a "
-"partir do padrão.\n"
-"Flags começando com \"no\" (não) são usadas para desativá-los explicitamente."
+"Atributos de geração de mapas específicos para o gerador de mundo plano.\n"
+"Lagos ocasionais e colinas podem ser adicionados ao mundo plano.\n"
+"Flags que não estão especificadas na string da flag não são modificadas por "
+"padrão.\n"
+"Flags começando com \"no\" são usadas para desabilitá-las explicitamente."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Atributos para o gerador de mapas específico para o Mapgen v6.\n"
-"Quando biomas de neve estão habilitados, pântanos ficam habilitados e a flag "
-"de pântanos é ignorada.\n"
+"Atributos para o gerador de mapas específico para o gerador de mundo v6.\n"
+"Quando biomas de neve estão habilitadas, selvas são automaticamente  "
+"habilitadas, a flag 'jungles' é ignorada.\n"
 "Flags que não são especificadas na string da flag não são modificadas por "
 "padrão.\n"
-"Flags começando com \"no\" (não) são usadas para explicitamente desabilitá-"
-"las."
+"Flags começando com \"no\" são usadas para desabilitá-las explicitamente."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"Atributos para o gerador de mapas específico para o Mapgen v6.\n"
-"Quando biomas de neve estão habilitados, pântanos ficam habilitados e a flag "
-"de pântanos é ignorada.\n"
-"Flags que não são especificadas na string da flag não são modificadas por "
+"Atributos de geração de mapas específicos para o gerador de mundo v7.\n"
+"A flag'ridges' controla os rios.\n"
+"Flags que não estão especificadas na string da flag não são modificadas por "
 "padrão.\n"
-"Flags começando com \"no\" (não) são usadas para explicitamente desabilitá-"
-"las."
+"Flags começando com \"no\" são usadas para desabilitá-las explicitamente."
 
 #: src/settings_translation_file.cpp
 msgid "Map generation limit"
@@ -3073,7 +3194,7 @@ msgstr "Limite de mapblock"
 
 #: src/settings_translation_file.cpp
 msgid "Mapblock unload timeout"
-msgstr "Timeout de descarregamento do mapblock"
+msgstr "Tempo limite de descarregamento do mapblock"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen Valleys"
@@ -3097,349 +3218,371 @@ msgstr "Debug do mapgen"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flags"
-msgstr "Flags do Mapgen"
+msgstr "Flags do gerador de mundo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat"
-msgstr "Mapgen plano"
+msgstr "Gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat cave width"
-msgstr "Threshold dos lagos no Mapgen plano"
+msgstr "Largura das cavernas no gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave1 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido \"cave 1\" do gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave2 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido \"cave2\" do gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat filler depth noise parameters"
 msgstr ""
+"Parâmetros de ruído da profundidade de preenchimento plano do gerador de "
+"mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat flags"
-msgstr "Flags do Mapgen plano"
+msgstr "Flags do gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat ground level"
-msgstr "Nível do terreno para o Mapgen plano"
+msgstr "Nível do terreno para o gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill steepness"
-msgstr "Esparsamento das colinas no Mapgen plano"
+msgstr "Esparsamento das colinas no gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill threshold"
-msgstr "Threshold das colinas no Mapgen plano"
+msgstr "Threshold das colinas no gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat lake steepness"
-msgstr "Esparsamento de lagos no Mapgen plano"
+msgstr "Esparsamento de lagos no gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat lake threshold"
-msgstr "Threshold dos lagos no Mapgen plano"
+msgstr "Threshold dos lagos no gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat large cave depth"
-msgstr ""
+msgstr "Largura das cavernas grandes no gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat terrain noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de terreno do gerador de mundo plano"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal"
-msgstr "Fractal do Mapgen"
+msgstr "Gerador de mundo fractal"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal cave width"
-msgstr "Componente W da fatia do fractal do Mapgen"
+msgstr "Largura das cavernas do gerador de mundo fractal"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave1 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido \"cave1\" do gerador de mundo fractal"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave2 noise parameters"
-msgstr ""
+msgstr "Parâmetro de ruido do fractal do cave2 do gerador de mundo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal filler depth noise parameters"
 msgstr ""
+"Parâmetros de ruido da profundidade de preenchimento do gerador de mundo "
+"fractal"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal fractal"
-msgstr "Fractal do Mapgen fractal"
+msgstr "Fractal do gerador de mundo fractal"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal iterations"
-msgstr "Iterações no fractal do Mapgen"
+msgstr "Iterações gerador de mundo fractal"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia w"
-msgstr "Componente W do fractal Julia no Mapgen"
+msgstr "Componente W do gerador de mundo fractal julia"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia x"
-msgstr "Componente X do fractal julia no Mapgen"
+msgstr "Componente X  do gerador de mundo fractal julia"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia y"
-msgstr "Componente Y do fractal julia no Mapgen"
+msgstr "Componente Y  do gerador de mundo fractal julia"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia z"
-msgstr "Componente Z do fractal julia no Mapgen"
+msgstr "Componente Z do gerador de mundo fractal julia"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal offset"
-msgstr "Offset do fractal do Mapgen"
+msgstr "Espacamento do gerador de mundo fractal"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal scale"
-msgstr "Escala no fractal do Mapgen"
+msgstr "Escala do gerador de mundo fractal"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal seabed noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido do leito oceânico do gerador de mundo fractal"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal slice w"
-msgstr "Componente W da fatia do fractal do Mapgen"
+msgstr "Componente W da fatia do gerador de mundo fractal"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen heat blend noise parameters"
-msgstr ""
+msgstr "Parâmetros de mistura de ruido do gerador de mundo \"heat\""
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen name"
-msgstr "Nome do mapgen"
+msgstr "Nome do gerador de mundo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5"
-msgstr "Mapgen versão 5"
+msgstr "Gerador de mundo v5"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v5 cave width"
-msgstr "Profundidade de cavernas grandes"
+msgstr "Largura das cavernas no gerador de mundo v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave1 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido cave1 do gerador de mundo v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave2 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido cave2 do gerador de mundo v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 factor noise parameters"
-msgstr ""
+msgstr "Parâmetros do fator de ruido do gerador de mundo v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 filler depth noise parameters"
 msgstr ""
+"Parâmetros de ruido da profundidade de preenchimento do gerador de mundo v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 height noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de altura do gerador de mundo v5"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6"
-msgstr "Mapgen versão 6"
+msgstr "Gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 apple trees noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido das macieiras no gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 beach frequency"
-msgstr ""
+msgstr "Frequência de praia do Mapgen v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 beach noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido das praias no gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 biome noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de bioma do gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 cave noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de caverna do gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 desert frequency"
-msgstr ""
+msgstr "Frequência de deserto do gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 flags"
-msgstr ""
+msgstr "Flags do gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 height select noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de seleção de altura do gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 humidity noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de umidade do gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 mud noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de lama do gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 steepness noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de inclinação do gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 terrain altitude noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de altitude do terreno do gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 terrain base noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido base do terreno do gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 trees noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido das árvores no gerador de mundo v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7"
-msgstr "Mapgen versão 7"
+msgstr "Gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v7 cave width"
-msgstr "Profundidade de cavernas grandes"
+msgstr "Largura das cavernas no gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave1 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido cave1 do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave2 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido cave2 do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 filler depth noise parameters"
 msgstr ""
+"Parâmetros de ruido da profundidade de preenchimento do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 flags"
-msgstr ""
+msgstr "Flags do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 height select noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido da seleção de altura do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 mount height noise parameters"
-msgstr ""
+msgstr "Parâmetros ruido da altura de montagem do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 mountain noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido das montanha do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 ridge noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de cume do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 ridge water noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de cume de água do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 terrain altitude noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de altitude do terreno do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 terrain base noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido base do terreno do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 terrain persistation noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de persistencia do terreno do gerador de mundo v7"
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave depth"
-msgstr ""
+msgstr "Profundidade de caverna enorme"
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave noise"
-msgstr ""
+msgstr "Ruido de caverna enorme"
 
 #: src/settings_translation_file.cpp
 msgid "Massive caves form here."
-msgstr ""
+msgstr "Forma de cavernas enormes aqui."
 
 #: src/settings_translation_file.cpp
 msgid "Max block generate distance"
-msgstr ""
+msgstr "Distância máxima de geração de bloco"
 
 #: src/settings_translation_file.cpp
 msgid "Max block send distance"
-msgstr ""
+msgstr "Distância máxima de envio de bloco"
 
 #: src/settings_translation_file.cpp
 msgid "Max liquids processed per step."
-msgstr ""
+msgstr "Máximo de líquidos processados por etapa."
 
 #: src/settings_translation_file.cpp
 msgid "Max. clearobjects extra blocks"
-msgstr ""
+msgstr "Max. clearobjects blocos extras"
 
 #: src/settings_translation_file.cpp
 msgid "Max. packets per iteration"
-msgstr ""
+msgstr "Max. pacotes por iteração"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum FPS"
-msgstr ""
+msgstr "FPS máximo"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum FPS when game is paused."
-msgstr ""
+msgstr "Máximo FPS quando o jogo é pausado."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum forceloaded blocks"
-msgstr ""
+msgstr "Máximo de blocos carregados forçadamente"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum hotbar width"
+msgstr "Largura máxima da hotbar"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
 msgstr ""
+"Número máximo de jogadores que podem se conectar simultaneamente no total."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+"Número máximo de blocos que podem ser simultaneamente enviados por cliente."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
+"Número máximo de blocos que podem ser enfileirados para o carregamento."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Maximum number of blocks to be queued that are to be generated.\n"
 "Set to blank for an appropriate amount to be chosen automatically."
 msgstr ""
+"Número máximo de blocos para serem enfileirados que estão a ser gerados.\n"
+"Definido em branco para uma quantidade apropriada ser escolhida "
+"automaticamente."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Maximum number of blocks to be queued that are to be loaded from file.\n"
 "Set to blank for an appropriate amount to be chosen automatically."
 msgstr ""
+"Número máximo de blocos para ser enfileirado que serão carregados do "
+"arquivo.\n"
+"Definido em branco para uma quantidade apropriada ser escolhida "
+"automaticamente."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum number of forceloaded mapblocks."
-msgstr ""
+msgstr "Número máximo de chunks carregados forçadamente."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Maximum number of mapblocks for client to be kept in memory.\n"
 "Set to -1 for unlimited amount."
 msgstr ""
+"Número máximo de mapblocks para o cliente para ser mantido na memória.\n"
+"Definido como -1 para quantidade ilimitada."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3447,40 +3590,48 @@ msgid ""
 "try reducing it, but don't reduce it to a number below double of targeted\n"
 "client number."
 msgstr ""
+"Número máximo de pacotes enviados por etapa de envio, se você tem uma "
+"conexão lenta \n"
+"tente reduzir isso, mas não reduza a um número abaixo do dobro do número de "
+"cliente alvo."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum number of players that can connect simultaneously."
-msgstr ""
+msgstr "Número máximo de jogadores que podem se conectar simultaneamente."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum number of statically stored objects in a block."
-msgstr ""
+msgstr "Número máximo de objetos estaticamente armazenados em um bloco."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Limite maximo de objetos por bloco"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
+"Proporção máxima da janela atual a ser usada para hotbar.\n"
+"Útil se houver algo para ser exibido a direito ou esquerda do hotbar."
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr ""
+msgid "Maximum simultaneous block sends per client"
+msgstr "Máximo de blocos enviados simultaneamente por cliente"
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
-msgstr ""
+msgid "Maximum simultaneous block sends total"
+msgstr "Máximo de blocos totais enviados simultaneamente"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum time in ms a file download (e.g. a mod download) may take."
 msgstr ""
+"Tempo máximo em ms para download de arquivo (por exemplo, um arquivo ZIP de "
+"um modificador) pode tomar."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum users"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
+msgstr "Limite de usuários"
 
 #: src/settings_translation_file.cpp
 msgid "Menus"
@@ -3488,89 +3639,91 @@ msgstr "Opções para menus"
 
 #: src/settings_translation_file.cpp
 msgid "Mesh cache"
-msgstr ""
+msgstr "Cache de malha"
 
 #: src/settings_translation_file.cpp
 msgid "Message of the day"
-msgstr ""
+msgstr "Mensagem do dia"
 
 #: src/settings_translation_file.cpp
 msgid "Message of the day displayed to players connecting."
-msgstr ""
+msgstr "Mensagem do dia exibida aos jogadores ao conectar."
 
 #: src/settings_translation_file.cpp
 msgid "Method used to highlight selected object."
-msgstr ""
+msgstr "Método usado para destacar o objeto selecionado."
 
 #: src/settings_translation_file.cpp
 msgid "Minimap"
-msgstr ""
+msgstr "Minimapa"
 
 #: src/settings_translation_file.cpp
 msgid "Minimap key"
-msgstr ""
+msgstr "Tecla do Minimapa"
 
 #: src/settings_translation_file.cpp
 msgid "Minimap scan height"
-msgstr ""
+msgstr "Altura de escaneamento do minimapa"
 
 #: src/settings_translation_file.cpp
 msgid "Minimum texture size for filters"
-msgstr ""
+msgstr "Tamanho mínimo da textura para filtros"
 
 #: src/settings_translation_file.cpp
 msgid "Mipmapping"
 msgstr "Mipmapping (filtro)"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
-msgstr ""
+msgstr "URL de detalhes da Modstore"
 
 #: src/settings_translation_file.cpp
 msgid "Modstore download URL"
-msgstr ""
+msgstr "URL de download da Modstore"
 
 #: src/settings_translation_file.cpp
 msgid "Modstore mods list URL"
-msgstr ""
+msgstr "URL da lista de modificadores da Modstore"
 
 #: src/settings_translation_file.cpp
 msgid "Monospace font path"
-msgstr ""
+msgstr "Caminho de fonte monoespaçada"
 
 #: src/settings_translation_file.cpp
 msgid "Monospace font size"
-msgstr ""
+msgstr "Tamanho da fonte monoespaçada"
 
 #: src/settings_translation_file.cpp
 msgid "Mouse sensitivity"
-msgstr ""
+msgstr "Sensibilidade do mouse"
 
 #: src/settings_translation_file.cpp
 msgid "Mouse sensitivity multiplier."
-msgstr ""
+msgstr "Multiplicador de sensibilidade do mouse."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Multiplier for fall bobbing.\n"
 "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
 msgstr ""
+"Multiplicador para cair balançando.\n"
+"Por exemplo: 0 para não ver balançando; 1.0 para normal; 2.0 para duplo."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Multiplier for view bobbing.\n"
 "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
 msgstr ""
+"Multiplicador para sacudir a exibição.\n"
+"Por exemplo: 0 para não ver balançando; 1.0 para normal; 2.0 para duplo."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Name of map generator to be used when creating a new world.\n"
 "Creating a world in the main menu will override this."
 msgstr ""
+"Nome do gerador de mapa a ser usado ao criar um novo mundo.\n"
+"Criação de um mundo no menu principal irá substituir isso."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3578,61 +3731,70 @@ msgid ""
 "When running a server, clients connecting with this name are admins.\n"
 "When starting from the main menu, this is overridden."
 msgstr ""
+"Nome do jogador.\n"
+"Quando executando um servidor, os clientes com este nome são administradores."
+"\n"
+"Quando iniciado pelo menu principal, este é substituido."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Name of the server, to be displayed when players join and in the serverlist."
 msgstr ""
+"Nome do servidor, a ser exibido quando os jogadores abrem a lista de "
+"servidores."
 
 #: src/settings_translation_file.cpp
 msgid "Network"
-msgstr ""
+msgstr "Rede"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Network port to listen (UDP).\n"
 "This value will be overridden when starting from the main menu."
 msgstr ""
+"Porta de rede para receber dados (UDP).\n"
+"Esse valor será substituído se for definido a partir do menu principal."
 
 #: src/settings_translation_file.cpp
 msgid "New users need to input this password."
-msgstr ""
+msgstr "Novos usuários precisam inserir esta senha."
 
 #: src/settings_translation_file.cpp
 msgid "Noclip"
-msgstr ""
+msgstr "Atravessar blocos"
 
 #: src/settings_translation_file.cpp
 msgid "Noclip key"
-msgstr ""
+msgstr "Tecla Noclip"
 
 #: src/settings_translation_file.cpp
 msgid "Node highlighting"
-msgstr ""
+msgstr "Destacamento do bloco"
 
 #: src/settings_translation_file.cpp
 msgid "NodeTimer interval"
-msgstr ""
+msgstr "Intervalo de NodeTimer"
 
 #: src/settings_translation_file.cpp
 msgid "Noise parameters for biome API temperature, humidity and biome blend."
 msgstr ""
+"Parâmetros de ruido para a API de temperatura, umidade e mistura de bioma."
 
 #: src/settings_translation_file.cpp
 msgid "Noises"
-msgstr ""
+msgstr "Ruidos"
 
 #: src/settings_translation_file.cpp
 msgid "Normalmaps sampling"
-msgstr ""
+msgstr "Amostragem de normalmaps"
 
 #: src/settings_translation_file.cpp
 msgid "Normalmaps strength"
-msgstr ""
+msgstr "Intensidade de normalmaps"
 
 #: src/settings_translation_file.cpp
 msgid "Number of emerge threads"
-msgstr ""
+msgstr "Número de seguimentos de emersão"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3642,6 +3804,11 @@ msgid ""
 "speed greatly\n"
 "at the cost of slightly buggy caves."
 msgstr ""
+"Número de seguimentos de emersão para usar. Deixe esse campo em branco, ou "
+"aumente esse número\n"
+"para usar vários segmentos. Em sistemas multiprocessadores, isto irá "
+"melhorar muito a velocidade do mapgen\n"
+"à custa de uns poucos bugs nas cavernas."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3649,102 +3816,121 @@ msgid ""
 "This is a trade-off between sqlite transaction overhead and\n"
 "memory consumption (4096=100MB, as a rule of thumb)."
 msgstr ""
+"Número de blocos extras que pode ser carregados por /clearobjects ao mesmo "
+"tempo.\n"
+"Esta é uma troca entre sobrecarga de transação do sqlite e consumo de "
+"memória (4096 = 100 MB, como uma regra de ouro)."
 
 #: src/settings_translation_file.cpp
 msgid "Number of parallax occlusion iterations."
-msgstr ""
+msgstr "Número de iterações de oclusão de paralaxe."
 
 #: src/settings_translation_file.cpp
 msgid "Overall bias of parallax occlusion effect, usually scale/2."
-msgstr ""
+msgstr "Viés geral do efeito de oclusão de paralaxe, geralmente de escala/2."
 
 #: src/settings_translation_file.cpp
 msgid "Overall scale of parallax occlusion effect."
-msgstr ""
+msgstr "Escala global do efeito de oclusão de paralaxe."
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion"
-msgstr ""
+msgstr "Oclusão de paralaxe"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion Scale"
-msgstr ""
+msgstr "Escala de Oclusão de paralaxe"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion bias"
-msgstr ""
+msgstr "Viés de oclusão de paralaxe"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion iterations"
-msgstr ""
+msgstr "Iterações de oclusão de paralaxe"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion mode"
-msgstr ""
+msgstr "Modo de oclusão de paralaxe"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion strength"
-msgstr ""
+msgstr "Insinsidade de oclusão de paralaxe"
 
 #: src/settings_translation_file.cpp
 msgid "Path to TrueTypeFont or bitmap."
-msgstr ""
+msgstr "Caminho para TrueTypeFont ou bitmap."
 
 #: src/settings_translation_file.cpp
 msgid "Path to save screenshots at."
-msgstr ""
+msgstr "Caminho para onde salvar screenshots."
 
 #: src/settings_translation_file.cpp
 msgid "Path to texture directory. All textures are first searched from here."
 msgstr ""
+"Caminho para o diretório de texturas. Todas as texturas são pesquisadas "
+"primeiro daqui."
 
 #: src/settings_translation_file.cpp
 msgid "Physics"
-msgstr ""
+msgstr "Física"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Player is able to fly without being affected by gravity.\n"
 "This requires the \"fly\" privilege on the server."
 msgstr ""
+"O jogador é capaz de voar sem ser afetado pela gravidade.\n"
+"Isso requer o privilégio \"fly\" no servidor."
 
 #: src/settings_translation_file.cpp
 msgid "Player name"
-msgstr ""
+msgstr "Nome do Jogador"
 
 #: src/settings_translation_file.cpp
 msgid "Player transfer distance"
-msgstr ""
+msgstr "Distância de transferência do jogador"
 
 #: src/settings_translation_file.cpp
 msgid "Player versus Player"
-msgstr ""
+msgstr "Jogador contra Jogador"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Port to connect to (UDP).\n"
 "Note that the port field in the main menu overrides this setting."
 msgstr ""
+"Porta para conectar (UDP).\n"
+"Note que o campo Porta no menu principal substitui essa configuração."
 
 #: src/settings_translation_file.cpp
 msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
+"Impede que mods façam coisas inseguras como executar comandos do shell."
 
 #: src/settings_translation_file.cpp
-msgid "Privileges that players with basic_privs can grant"
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
 msgstr ""
+"Intervalo de impressão de dados do analizador (em segundos). 0 = "
+"desabilitado. Útil para desenvolvedores."
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr ""
+msgid "Privileges that players with basic_privs can grant"
+msgstr "Privilégios que jogadores com basic_privs podem conceder"
+
+#: src/settings_translation_file.cpp
+msgid "Profiler"
+msgstr "Analizador"
 
 #: src/settings_translation_file.cpp
 msgid "Profiler toggle key"
-msgstr ""
+msgstr "Tecla de alternância do Analizador"
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr ""
+msgid "Profiling"
+msgstr "Analizando"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3752,14 +3938,17 @@ msgid ""
 "Values larger than 26 will start to produce sharp cutoffs at cloud area "
 "corners."
 msgstr ""
+"Raio da área de nuvem afirmada em número de 64 nós de quadrados de nuvem.\n"
+"Valores maiores que 26 vão começar a produzir cortes afiados nos cantos de "
+"área de nuvem."
 
 #: src/settings_translation_file.cpp
 msgid "Raises terrain to make valleys around the rivers"
-msgstr ""
+msgstr "Eleva o terreno para fazer vales em torno dos rios"
 
 #: src/settings_translation_file.cpp
 msgid "Random input"
-msgstr ""
+msgstr "Entrada aleatória"
 
 #: src/settings_translation_file.cpp
 msgid "Range select key"
@@ -3767,15 +3956,19 @@ msgstr "Tecla para modo de visão ilimitado"
 
 #: src/settings_translation_file.cpp
 msgid "Remote media"
-msgstr ""
+msgstr "Mídia remota"
 
 #: src/settings_translation_file.cpp
 msgid "Remote port"
-msgstr ""
+msgstr "Porta remota"
 
 #: src/settings_translation_file.cpp
 msgid "Replaces the default main menu with a custom one."
-msgstr ""
+msgstr "Substitui o menu principal padrão por um personalizado."
+
+#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Diretorio de reporte"
 
 #: src/settings_translation_file.cpp
 msgid "Right key"
@@ -3783,41 +3976,42 @@ msgstr "Tecla direita"
 
 #: src/settings_translation_file.cpp
 msgid "Rightclick repetition interval"
-msgstr ""
+msgstr "Intervalo de repetição do clique direito"
 
 #: src/settings_translation_file.cpp
 msgid "River Depth"
-msgstr ""
+msgstr "Profundidade do Rio"
 
 #: src/settings_translation_file.cpp
 msgid "River Noise"
-msgstr ""
+msgstr "Ruido do Rio"
 
 #: src/settings_translation_file.cpp
 msgid "River Size"
-msgstr ""
+msgstr "Tamanho do Rio"
 
 #: src/settings_translation_file.cpp
 msgid "River noise -- rivers occur close to zero"
-msgstr ""
+msgstr "Ruido do rio -- rios ocorrem perto de zero"
 
 #: src/settings_translation_file.cpp
 msgid "Rollback recording"
-msgstr ""
+msgstr "Gravação de reversão"
 
 #: src/settings_translation_file.cpp
 msgid "Round minimap"
-msgstr ""
+msgstr "Minimapa redondo"
 
 #: src/settings_translation_file.cpp
 msgid "Save the map received by the client on disk."
-msgstr ""
+msgstr "Salvar o mapa recebido pelo cliente no disco."
 
 #: src/settings_translation_file.cpp
 msgid "Saving map received from server"
-msgstr ""
+msgstr "Salvado mapa recebido do servidor"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Scale gui by a user specified value.\n"
 "Use a nearest-neighbor-anti-alias filter to scale the GUI.\n"
@@ -3825,14 +4019,19 @@ msgid ""
 "pixels when scaling down, at the cost of blurring some\n"
 "edge pixels when images are scaled by non-integer sizes."
 msgstr ""
+"Escala de GUI por um valor especificado pelo usuário.\n"
+"Use um filtro nearest-neighbor-anti-alias para escala do GUI.\n"
+"Isso irá suavizar algumas das arestas e misturar pixels \n"
+"quando a escalado baixo, ao custo de borrar alguns pixels de borda \n"
+"quando as imagens são dimensionadas em tamanhos não-inteiros."
 
 #: src/settings_translation_file.cpp
 msgid "Screen height"
-msgstr ""
+msgstr "Altura da tela"
 
 #: src/settings_translation_file.cpp
 msgid "Screen width"
-msgstr ""
+msgstr "Largura da tela"
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot"
@@ -3840,17 +4039,15 @@ msgstr "Captura de tela"
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot folder"
-msgstr ""
+msgstr "Pasta de screenshot"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot format"
-msgstr "Captura de tela"
+msgstr "Formato da Captura de tela"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot quality"
-msgstr "Captura de tela"
+msgstr "Qualidade da Captura de tela;"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3858,26 +4055,29 @@ msgid ""
 "1 means worst quality; 100 means best quality.\n"
 "Use 0 for default quality."
 msgstr ""
+"Qualidade de imagem. Usado somente para o formato JPEG.\n"
+"1 significa pior qualidade; 100 significa melhor qualidade.\n"
+"Use 0 para qualidade padrão."
 
 #: src/settings_translation_file.cpp
 msgid "Security"
-msgstr ""
+msgstr "Segurança"
 
 #: src/settings_translation_file.cpp
 msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
-msgstr ""
+msgstr "Consulte http://www.sqlite.org/pragma.html#pragma_synchronous"
 
 #: src/settings_translation_file.cpp
 msgid "Selection box border color (R,G,B)."
-msgstr ""
+msgstr "Cor da borda da caixa de seleção (R, G, B)."
 
 #: src/settings_translation_file.cpp
 msgid "Selection box color"
-msgstr ""
+msgstr "Cor da caixa de seleção"
 
 #: src/settings_translation_file.cpp
 msgid "Selection box width"
-msgstr ""
+msgstr "Largura da caixa de seleção"
 
 #: src/settings_translation_file.cpp
 msgid "Server / Singleplayer"
@@ -3909,64 +4109,77 @@ msgstr "URL da lista de servidores"
 
 #: src/settings_translation_file.cpp
 msgid "Serverlist file"
-msgstr "arquivo da lista de servidores"
+msgstr "Arquivo da lista de servidores"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set the language. Leave empty to use the system language.\n"
 "A restart is required after changing this."
 msgstr ""
+"Defina o idioma. Deixe vazio para usar a linguagem do sistema.\n"
+"Apos mudar isso uma reinicialização é necessária."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set to true enables waving leaves.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Definido como true habilita balanço folhas.\n"
+"Requer sombreadores serem ativados."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set to true enables waving plants.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Definido como true permite balanço de plantas.\n"
+"Requer sombreadores serem ativados."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Set to true enables waving water.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Definido como true permite ondulação da água.\n"
+"Requer sombreadores seres ativados."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
+"Sombreadores permitem efeitos visuais avançados e podem aumentar a "
+"performance em algumas placas de vídeo.\n"
+"Só funcionam com o backend de vídeo OpenGL."
 
 #: src/settings_translation_file.cpp
 msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr ""
+msgstr "Forma do minimapa. Ativado = redondo, Desativado = quadrado."
 
 #: src/settings_translation_file.cpp
 msgid "Show debug info"
-msgstr ""
+msgstr "Mostrar informações de depuração"
 
 #: src/settings_translation_file.cpp
 msgid "Show entity selection boxes"
-msgstr ""
+msgstr "Mostrar as caixas de seleção entidades"
 
 #: src/settings_translation_file.cpp
 msgid "Shutdown message"
-msgstr ""
+msgstr "Mensagem de desligamento"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Size of chunks to be generated at once by mapgen, stated in mapblocks (16 "
 "nodes)."
 msgstr ""
+"Tamanho das parcelas a ser gerada de uma vez pelo mapgen, definido em "
+"mapblocks (16 nodes)."
 
 #: src/settings_translation_file.cpp
 msgid "Slope and fill work together to modify the heights"
-msgstr ""
+msgstr "Inclinação e preenchimento trabalham juntos para modificar as alturas"
 
 #: src/settings_translation_file.cpp
 msgid "Smooth lighting"
@@ -3974,17 +4187,20 @@ msgstr "Iluminação suave"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
+"Suaviza o movimento da câmera quando olhando ao redor. Também chamado de "
+"olhar ou suavização do mouse.\n"
+"Útil para gravar vídeos."
 
 #: src/settings_translation_file.cpp
 msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
-msgstr ""
+msgstr "Suaviza a rotação da câmera no modo cinemático. 0 para desativar."
 
 #: src/settings_translation_file.cpp
 msgid "Smooths rotation of camera. 0 to disable."
-msgstr ""
+msgstr "Suaviza a rotação da câmera. 0 para desativar."
 
 #: src/settings_translation_file.cpp
 msgid "Sneak key"
@@ -3992,7 +4208,7 @@ msgstr "Esgueirar"
 
 #: src/settings_translation_file.cpp
 msgid "Sound"
-msgstr ""
+msgstr "Som"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4001,34 +4217,39 @@ msgid ""
 "(obviously, remote_media should end with a slash).\n"
 "Files that are not present will be fetched the usual way."
 msgstr ""
+"Especifica a URL no qual os clientes buscam a mídia ao em vez de usar o UDP."
+"\n"
+"$filename deve ser acessível a partir de $remote_media$filename via cURL \n"
+"(obviamente, remote_media deve terminar com uma barra \"/\").\n"
+"Arquivos que não estão presentes serão obtidos da maneira usual por UDP."
 
 #: src/settings_translation_file.cpp
 msgid "Static spawnpoint"
-msgstr ""
+msgstr "Ponto de spawn estático"
 
 #: src/settings_translation_file.cpp
 msgid "Strength of generated normalmaps."
-msgstr ""
+msgstr "Intensidade de normalmaps gerados."
 
 #: src/settings_translation_file.cpp
 msgid "Strength of parallax."
-msgstr ""
+msgstr "Intensidade de paralaxe."
 
 #: src/settings_translation_file.cpp
 msgid "Strict protocol checking"
-msgstr ""
+msgstr "Verificação rígida de protocolo"
 
 #: src/settings_translation_file.cpp
 msgid "Support older servers"
-msgstr ""
+msgstr "Suporte a servidores mais antigos"
 
 #: src/settings_translation_file.cpp
 msgid "Synchronous SQLite"
-msgstr ""
+msgstr "SQLite síncrono"
 
 #: src/settings_translation_file.cpp
 msgid "Terrain Height"
-msgstr ""
+msgstr "Altura do terreno"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4036,6 +4257,9 @@ msgid ""
 "Controls proportion of world area covered by hills.\n"
 "Adjust towards 0.0 for a larger proportion."
 msgstr ""
+"Limite de ruido de terreno para colinas.\n"
+"Proporção de controles da área de mundo coberta pelas colinas.\n"
+"Ajuste no sentido 0,0 para uma proporção maior."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4043,32 +4267,63 @@ msgid ""
 "Controls proportion of world area covered by lakes.\n"
 "Adjust towards 0.0 for a larger proportion."
 msgstr ""
+"Limite de ruido de terreno para Lagos.\n"
+"Proporção de controles da área de mundo coberta por lagos.\n"
+"Ajuste no sentido 0,0 para uma proporção maior."
 
 #: src/settings_translation_file.cpp
 msgid "Texture path"
-msgstr "Pacotes de texturas"
+msgstr "Diretorio da textura"
 
 #: src/settings_translation_file.cpp
 msgid "The altitude at which temperature drops by 20C"
+msgstr "A altitude na qual temperatura cai para 20C"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
 msgstr ""
+"O formato padrão no qual as analises estão sendo salvas,\n"
+"Quando chamado `/profiler save [formato]` sem formato."
 
 #: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
+msgstr "A profundidade de terra ou outro enchimento"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
 msgstr ""
+"O caminho de arquivo relativo ao sua pasta do mundo no qual as analises "
+"serão salvas.\n"
 
 #: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
-msgstr ""
+msgstr "A interface de rede no qual o servidor escuta (aguarda conexão)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "The privileges that new users automatically get.\n"
 "See /privs in game for a full list on your server and mod configuration."
 msgstr ""
+"Os privilégios que novos usuários obtém automaticamente.\n"
+"Consulte /privs no jogo para obter uma lista completa na configuração do seu "
+"servidor e dos modificadores."
 
 #: src/settings_translation_file.cpp
 msgid "The rendering back-end for Irrlicht."
+msgstr "A rederização back-end para Irrlicht."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
 msgstr ""
+"A sensibilidade dos eixos do joystick para movimentar o \n"
+"frustum de exibição no jogo."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4077,6 +4332,11 @@ msgid ""
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
 "set to the nearest valid value."
 msgstr ""
+"A intensidade (escuridão) de sombreamento da oclusão de ambiente no bloco.\n"
+"Inferior é mais escura, superior é mais clara. O intervalo válido de valores "
+"para esta\n"
+"configuração é 0.25 a 4.0. Se o valor está fora do intervalo ele será \n"
+"definido o valor válido mais próximo."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4084,38 +4344,57 @@ msgid ""
 "capacity until an attempt is made to decrease its size by dumping old queue\n"
 "items.  A value of 0 disables the functionality."
 msgstr ""
+"O tempo (em segundos) que a fila de líquidos pode crescer além da capacidade "
+"\n"
+"de processamento até que é feita uma tentativa para diminuir o seu tamanho "
+"pelo despejo \n"
+"de antigas filas de itens.  Um valor 0 desativa a funcionalidade."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"O tempo em segundos que leva entre eventos repetidos \n"
+"quando pressionando uma combinação de botão no joystick."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
+"O tempo em segundos entre repetidos cliques direitos ao segurar o botão "
+"direito do mouse."
 
 #: src/settings_translation_file.cpp
 msgid "This font will be used for certain languages."
-msgstr ""
+msgstr "Esta fonte será usada para determinados idiomas."
 
 #: src/settings_translation_file.cpp
 msgid "Time in between active block management cycles"
-msgstr ""
+msgstr "Tempo entre ciclos de gestão do bloco ativo"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Time in seconds for item entity (dropped items) to live.\n"
 "Setting it to -1 disables the feature."
 msgstr ""
+"Tempo em segundos para manter entidade de item (itens caídos/dropados).\n"
+"Definindo-o como -1 desabilita o recurso."
 
 #: src/settings_translation_file.cpp
 msgid "Time send interval"
-msgstr ""
+msgstr "Intervalo de tempo de envio"
 
 #: src/settings_translation_file.cpp
 msgid "Time speed"
-msgstr ""
+msgstr "Velocidade de tempo"
 
 #: src/settings_translation_file.cpp
 msgid "Timeout for client to remove unused map data from memory."
 msgstr ""
+"Tempo de espera para o cliente remover dados de mapa não utilizados da "
+"memória."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4124,14 +4403,18 @@ msgid ""
 "This determines how long they are slowed down after placing or removing a "
 "node."
 msgstr ""
+"Para reduzir o lag, transferências de blocos são desaceleradas quando um "
+"jogador está construindo algo.\n"
+"Isto determina por quanto tempo eles são desacelerados após a colocação ou "
+"remoção de um node."
 
 #: src/settings_translation_file.cpp
 msgid "Toggle camera mode key"
-msgstr ""
+msgstr "Tecla de alternância do modo de câmera"
 
 #: src/settings_translation_file.cpp
 msgid "Tooltip delay"
-msgstr ""
+msgstr "Atraso de dica de ferramenta"
 
 #: src/settings_translation_file.cpp
 msgid "Trilinear filtering"
@@ -4143,38 +4426,41 @@ msgid ""
 "False = 128\n"
 "Useable to make minimap smoother on slower machines."
 msgstr ""
+"True = 256\n"
+"False = 128\n"
+"Útil para suavizar o minimapa em máquinas mais lentas."
 
 #: src/settings_translation_file.cpp
 msgid "Trusted mods"
-msgstr ""
+msgstr "Modulos confiáveis"
 
 #: src/settings_translation_file.cpp
 msgid "URL to the server list displayed in the Multiplayer Tab."
-msgstr ""
+msgstr "URL para a lista de servidores exibida na guia Multiplayer."
 
 #: src/settings_translation_file.cpp
 msgid "Unlimited player transfer distance"
-msgstr ""
+msgstr "Distância de transferência do jogador ilimitada"
 
 #: src/settings_translation_file.cpp
 msgid "Unload unused server data"
-msgstr ""
+msgstr "Descarregar os dados do servidor não utilizados"
 
 #: src/settings_translation_file.cpp
 msgid "Use 3D cloud look instead of flat."
-msgstr ""
+msgstr "Usar nuvens 3D em vez de planas."
 
 #: src/settings_translation_file.cpp
 msgid "Use a cloud animation for the main menu background."
-msgstr ""
+msgstr "Usar uma animação de nuvem para o fundo do menu principal."
 
 #: src/settings_translation_file.cpp
 msgid "Use anisotropic filtering when viewing at textures from an angle."
-msgstr ""
+msgstr "Usar filtragem anisotrópica quando visualizar texturas de um ângulo."
 
 #: src/settings_translation_file.cpp
 msgid "Use bilinear filtering when scaling textures."
-msgstr ""
+msgstr "Usar filtragem bilinear ao dimensionamento de texturas."
 
 #: src/settings_translation_file.cpp
 msgid "Use key"
@@ -4183,72 +4469,72 @@ msgstr "press. uma tecla"
 #: src/settings_translation_file.cpp
 msgid "Use mip mapping to scale textures. May slightly increase performance."
 msgstr ""
+"Use mapeamento MIP para texturas de escala. Pode aumentar ligeiramente o "
+"desempenho."
 
 #: src/settings_translation_file.cpp
 msgid "Use trilinear filtering when scaling textures."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Útil para desenvolvedores de mods."
+msgstr "Use a filtragem trilinear ao dimensionamento de texturas."
 
 #: src/settings_translation_file.cpp
 msgid "V-Sync"
-msgstr ""
+msgstr "Sincronização Vertical"
 
 #: src/settings_translation_file.cpp
 msgid "VBO"
-msgstr ""
+msgstr "VBO"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Depth"
-msgstr ""
+msgstr "Profundidade do vale"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Fill"
-msgstr ""
+msgstr "Preenchimento do vale"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Profile"
-msgstr ""
+msgstr "Perfil do vale"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Slope"
-msgstr ""
+msgstr "Encosta do vale"
 
 #: src/settings_translation_file.cpp
 msgid "Valleys C Flags"
-msgstr ""
+msgstr "Flags C de vales"
 
 #: src/settings_translation_file.cpp
 msgid "Vertical screen synchronization."
-msgstr ""
+msgstr "Sincronização vertical da tela."
 
 #: src/settings_translation_file.cpp
 msgid "Video driver"
-msgstr ""
+msgstr "Driver de vídeo"
 
 #: src/settings_translation_file.cpp
 msgid "View bobbing"
-msgstr ""
+msgstr "Visualização de balanço"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "View distance in nodes.\n"
 "Min = 20"
 msgstr ""
+"Distância de visão (em nós).\n"
+"Minimo = 20"
 
 #: src/settings_translation_file.cpp
 msgid "View range decrease key"
-msgstr ""
+msgstr "Tecla de diminuição do raio de exibição"
 
 #: src/settings_translation_file.cpp
 msgid "View range increase key"
-msgstr ""
+msgstr "Tecla de aumento do intervalo de exibição"
 
 #: src/settings_translation_file.cpp
 msgid "Viewing range"
-msgstr ""
+msgstr "Intervalo de visualização"
 
 #: src/settings_translation_file.cpp
 msgid "Volume"
@@ -4261,10 +4547,14 @@ msgid ""
 "Has no effect on 3D fractals.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Coordenada W da fatia 3D gerada de um fractal 4D.\n"
+"Determina qual fatia 3D da forma 4D é gerada.\n"
+"Não tem efeito sobre fractais 3D.\n"
+"Intervalo de aproximadamente -2 a 2."
 
 #: src/settings_translation_file.cpp
 msgid "Walking speed"
-msgstr ""
+msgstr "Velocidade de caminhada"
 
 #: src/settings_translation_file.cpp
 msgid "Water Features"
@@ -4272,15 +4562,15 @@ msgstr "Coisas relacionadas a Água"
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
-msgstr ""
+msgstr "Nível de água"
 
 #: src/settings_translation_file.cpp
 msgid "Water surface level of the world."
-msgstr ""
+msgstr "Nível de superfície de água do mundo."
 
 #: src/settings_translation_file.cpp
 msgid "Waving Nodes"
-msgstr ""
+msgstr "Nós que balancam"
 
 #: src/settings_translation_file.cpp
 msgid "Waving leaves"
@@ -4288,23 +4578,23 @@ msgstr "Balanço das árvores"
 
 #: src/settings_translation_file.cpp
 msgid "Waving plants"
-msgstr ""
+msgstr "Balanço das plantas"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water"
-msgstr ""
+msgstr "Balanço da água"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water height"
-msgstr ""
+msgstr "Altura de balanço da água"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water length"
-msgstr ""
+msgstr "Comprimento de balanço da água"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water speed"
-msgstr ""
+msgstr "Velocidade de balanço da água"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4312,14 +4602,21 @@ msgid ""
 "filtered in software, but some images are generated directly\n"
 "to hardware (e.g. render-to-texture for nodes in inventory)."
 msgstr ""
+"Quando gui_scaling_filter é true, todas as imagens de GUI precisam ser\n"
+"filtrado no software, porém algumas imagens são geradas diretamente ao\n"
+"hardware (por exemplo render-to-texture para nodes no inventário)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
+"Quando gui_scaling_filter_txr2img é true, copie essas imagens\n"
+"de hardware para software para dimensionamento. Quando false,\n"
+"voltará para o velho método de dimensionamento, para drivers de\n"
+"vídeo que não suportem propriedades baixas de texturas voltam do hardware."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4331,6 +4628,16 @@ msgid ""
 "have a visible effect unless bilinear/trilinear/anisotropic filtering is\n"
 "enabled."
 msgstr ""
+"Ao usar filtros bilineares/trilinear/anisotrópica, texturas de baixa "
+"resolução\n"
+"podem ficar borradas, então automaticamente aumenta a escala deles com a "
+"interpolação\n"
+"de nearest-neighbor para preservar os pixels nítidos. Isto define o tamanho\n"
+"mínimo da textura para as texturas melhoradas; valores mais altos parecem\n"
+"mais nítidas, mas requerem mais memória. Poências de 2 são recomendadas.\n"
+"Essa configuração superior a 1 não pode ter um efeito visível, a menos que a "
+"\n"
+"filtragem bilineares/trilinear/anisotrópica estejam habilitadas."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4341,40 +4648,59 @@ msgid ""
 "-    Those groups have an offset of -32, -32 nodes from the origin.\n"
 "-    Only groups which are within the map_generation_limit are generated"
 msgstr ""
+"Limite de geração de mapa.\n"
+"Note:\n"
+"-    Limitado a 31000 (valores superiores não têm efeito)\n"
+"-    O gerador funciona em grupos de 80x80x80 cubos (5x5x5 MapBlocks)\n"
+"-    Esses grupos têm um deslocamento de -32, -32 nodes em relação à "
+"origem.\n"
+"-    Apenas grupos dentro do limite definido map_gerenation_limit são gerados"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Whether freetype fonts are used, requires freetype support to be compiled in."
 msgstr ""
+"Se forem utilizadas fontes freetype, requer suporte a freetype para ser "
+"compilado."
 
 #: src/settings_translation_file.cpp
 msgid "Whether node texture animations should be desynchronized per mapblock."
 msgstr ""
+"Se as animações de textura do nodes devem ser dessincronizadas por mapblock."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Whether players are shown to clients without any range limit.\n"
 "Deprecated, use the setting player_transfer_distance instead."
 msgstr ""
+"Se os jogadores são mostrados para os clientes sem qualquer limite de "
+"distância.\n"
+"Caso não desejar, use a configuração player_transfer_distance."
 
 #: src/settings_translation_file.cpp
 msgid "Whether to allow players to damage and kill each other."
-msgstr ""
+msgstr "Se deseja permitir aos jogadores causar dano e matar uns aos outros."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Whether to ask clients to reconnect after a (Lua) crash.\n"
 "Set this to true if your server is set up to restart automatically."
 msgstr ""
+"Se deseja perguntar aos clientes para reconectarem depois de uma queda "
+"(Lua).\n"
+"Defina como true se o servidor está configurado para reiniciar "
+"automaticamente."
 
 #: src/settings_translation_file.cpp
 msgid "Whether to fog out the end of the visible area."
-msgstr ""
+msgstr "Se for usar névoa no fim da área visível."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Whether to show the client debug info (has the same effect as hitting F5)."
 msgstr ""
+"Se deseja mostrar informação de depuração ao cliente (tem o mesmo efeito "
+"como teclar F5)."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4383,6 +4709,11 @@ msgid ""
 "Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n"
 "Disabling this option will protect your password better."
 msgstr ""
+"Se vai suportar os servidores mais antigos antes da versão de protocolo 25.\n"
+"Habilite se você deseja se conectar a servidores anteriores a 0.4.12.\n"
+"Servidores começando com 0.4.13 vão funcionar, servidores 0.4.12-dev podem "
+"ou não funcionar.\n"
+"Desabilitar esta opção irá proteger sua senha melhor."
 
 #: src/settings_translation_file.cpp
 msgid "Width component of the initial window size."
@@ -4390,131 +4721,170 @@ msgstr "Largura da janela inicial."
 
 #: src/settings_translation_file.cpp
 msgid "Width of the selectionbox's lines around nodes."
-msgstr ""
+msgstr "Largura das linhas do bloco de seleção em torno de nodes."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "World directory (everything in the world is stored here).\n"
 "Not needed if starting from the main menu."
 msgstr ""
+"Diretório de mundo (tudo no mundo está armazenado aqui).\n"
+"Não é necessário se for iniciado a partir do menu principal."
 
 #: src/settings_translation_file.cpp
 msgid "Y of flat ground."
-msgstr ""
+msgstr "Componente Y de terreno plano."
 
 #: src/settings_translation_file.cpp
 msgid "Y of upper limit of large pseudorandom caves."
-msgstr ""
+msgstr "Y de limite superior de grandes números pseudoaleatórios de cavernas."
 
 #: src/settings_translation_file.cpp
 msgid "cURL file download timeout"
-msgstr ""
+msgstr "Tempo limite de download de arquivo via cURL"
 
 #: src/settings_translation_file.cpp
 msgid "cURL parallel limit"
-msgstr ""
+msgstr "limite paralelo de cURL"
 
 #: src/settings_translation_file.cpp
 msgid "cURL timeout"
-msgstr ""
+msgstr "Tempo limite de cURL"
 
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
 #~ msgstr ""
-#~ "Habilita recurso permitindo que o nível da água seja um pouco menor, "
-#~ "portando não preenche todo o espaço disponível para bloco.\n"
-#~ "Note que isso não está bem otimizado e que suavização da iluminação na "
-#~ "superfície da água não funciona bem com esse recurso."
+#~ "Dados detalhados do perfil do mod . Útil para desenvolvedores de mods."
 
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
-#~ msgstr ""
-#~ "Habilitar destaque de bloco selecionado (desabilita o modo de destaque "
-#~ "selectionbox [Padrão])."
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Perfilamento detalhado do mod"
 
 #~ msgid ""
-#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
 #~ msgstr ""
-#~ "Julia definido: (X, Y, Z) deslocamentos do centro mundo.\n"
-#~ "Variam aproximadamente -2 a 2, multiplique por j_scale para deslocamentos "
-#~ "em nós."
+#~ "Quantos blocos podem ser enviados simultaneamente para todo o servidor."
 
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Tecla para diminuir o intervalo de visualização. Modifica o intervalo "
-#~ "mínimo de visualização.\n"
-#~ "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
+#~ msgstr "Quantos blocos podem ser enviados simultaneamente por cliente."
+
+#~ msgid "Useful for mod developers."
+#~ msgstr "Útil para desenvolvedores de mods."
+
+#~ msgid "No of course not!"
+#~ msgstr "Claro que não!"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "Lista de servidores públicos"
+
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Gerar Normalmaps"
+
+#~ msgid "No!!!"
+#~ msgstr "Não!!!"
 
 #~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
 #~ msgstr ""
-#~ "Tecla para aumentar o intervalo de visualização. Modifica o mínimo "
-#~ "intervalo de visualização.\n"
-#~ "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ "Atributos de mapgen específicos para vales (Mapgen Valleys).\n"
+#~ "Flags que não estão especificadas na string de flags não são modificados "
+#~ "a partir do padrão.\n"
+#~ "Flags começando com \"no\" (não) são usadas para desativá-los "
+#~ "explicitamente.\n"
+#~ "\"altitude_chill\" torna terrenos de elevada altitude mais frios, o que "
+#~ "pode causar algumas falhas nos biomas.\n"
+#~ "\"humid_rivers\" modifica a umidade ao redor dos rios e em áreas onde a "
+#~ "água tende a ser represada em poças. Pode interferir em biomas que são "
+#~ "sensíveis a mudanças."
 
-#~ msgid "Preload inventory textures"
-#~ msgstr "pré-carregando texturas de inventário"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Desabilitar PMs"
 
 #, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Baixar"
+#~ msgid "If enabled, "
+#~ msgstr "habilitado"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Botão esquerdo: Move todos os itens. Botão direito: Move um item"
+#~ msgid "Game Name"
+#~ msgstr "Nome do jogo"
 
-#~ msgid "is required by:"
-#~ msgstr "é necessário para:"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Não foi possível copiar o mod \"$1\" para o jogo \"$2\""
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "A configuração foi salva. "
+#~ msgid "GAMES"
+#~ msgstr "JOGOS"
 
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Atenção: A configuração não está consistente."
+#~ msgid "Mods:"
+#~ msgstr "Módulos:"
 
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Não foi possível criar o mundo: O nome contém caracteres inválidos"
+#~ msgid "new game"
+#~ msgstr "novo jogo"
 
-#~ msgid "Show Public"
-#~ msgstr "Exibir públicos"
+#~ msgid "EDIT GAME"
+#~ msgstr "EDITAR JOGO"
 
-#~ msgid "Show Favorites"
-#~ msgstr "Exibir favoritos"
+#~ msgid "Remove selected mod"
+#~ msgstr "Remover o módulo selecionado"
 
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Deixe o endereço em branco para iniciar um servidor local."
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Adicionar módulo"
 
-#~ msgid "Create world"
-#~ msgstr "Criar o mundo"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENTE"
 
-#~ msgid "Address required."
-#~ msgstr "É necessário um endereço."
+#~ msgid "START SERVER"
+#~ msgstr "SERVIDOR"
 
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Não foi possível excluir o mundo: Nenhum foi selecionado"
+#~ msgid "Name"
+#~ msgstr "Nome"
 
-#~ msgid "Files to be deleted"
-#~ msgstr "Arquivos a serem excluídos"
+#~ msgid "Password"
+#~ msgstr "Senha"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Não foi possivel criar o mundo: Não foi encontrado nenhum jogo"
+#~ msgid "SETTINGS"
+#~ msgstr "CONFIGURAÇÕES"
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Não foi possível configurar o mundo: Nada foi selecionado"
+#~ msgid "Preload item visuals"
+#~ msgstr "Precarga de elementos visuais"
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Não foi possível excluir todos os arquivos do mundo"
+#~ msgid "Finite Liquid"
+#~ msgstr "Líquido finito"
+
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "UM JOGADOR"
+
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "TEXTURAS"
+
+#~ msgid "MODS"
+#~ msgstr "MÓDULOS"
+
+#~ msgid "Add mod:"
+#~ msgstr "Adicionar módulo:"
+
+#~ msgid "Local install"
+#~ msgstr "Instalação local"
+
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration.  "
+#~ msgstr ""
+#~ "Atenção: Alguns mods ainda não foram configurados.\n"
+#~ "E eles serão ativados por padrão, quando você salvar a configuração."
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration.  "
+#~ msgstr ""
+#~ "Atenção: Alguns mods configurados não foram encontrados.\n"
+#~ "Suas definições serão removidas quando você salvar a configuração."
 
 #~ msgid ""
 #~ "Default Controls:\n"
@@ -4541,131 +4911,135 @@ msgstr ""
 #~ "- ESC: este menu\n"
 #~ "- T: bate-papo\n"
 
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
-#~ msgstr ""
-#~ "Atenção: Alguns mods configurados não foram encontrados.\n"
-#~ "Suas definições serão removidas quando você salvar a configuração."
-
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration.  "
-#~ msgstr ""
-#~ "Atenção: Alguns mods ainda não foram configurados.\n"
-#~ "E eles serão ativados por padrão, quando você salvar a configuração."
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Não foi possível excluir todos os arquivos do mundo"
 
-#~ msgid "Local install"
-#~ msgstr "Instalação local"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Não foi possível configurar o mundo: Nada foi selecionado"
 
-#~ msgid "Add mod:"
-#~ msgstr "Adicionar módulo:"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Não foi possivel criar o mundo: Não foi encontrado nenhum jogo"
 
-#~ msgid "MODS"
-#~ msgstr "MÓDULOS"
+#~ msgid "Files to be deleted"
+#~ msgstr "Arquivos a serem excluídos"
 
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "TEXTURAS"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Não foi possível excluir o mundo: Nenhum foi selecionado"
 
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "UM JOGADOR"
+#~ msgid "Address required."
+#~ msgstr "É necessário um endereço."
 
-#~ msgid "Finite Liquid"
-#~ msgstr "Líquido finito"
+#~ msgid "Create world"
+#~ msgstr "Criar o mundo"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Precarga de elementos visuais"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Deixe o endereço em branco para iniciar um servidor local."
 
-#~ msgid "SETTINGS"
-#~ msgstr "CONFIGURAÇÕES"
+#~ msgid "Show Favorites"
+#~ msgstr "Exibir favoritos"
 
-#~ msgid "Password"
-#~ msgstr "Senha"
+#~ msgid "Show Public"
+#~ msgstr "Exibir públicos"
 
-#~ msgid "Name"
-#~ msgstr "Nome"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Não foi possível criar o mundo: O nome contém caracteres inválidos"
 
-#~ msgid "START SERVER"
-#~ msgstr "SERVIDOR"
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Atenção: A configuração não está consistente."
 
-#~ msgid "CLIENT"
-#~ msgstr "CLIENTE"
+#~ msgid "Configuration saved.  "
+#~ msgstr "A configuração foi salva. "
 
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Adicionar módulo"
+#~ msgid "is required by:"
+#~ msgstr "é necessário para:"
 
-#~ msgid "Remove selected mod"
-#~ msgstr "Remover o módulo selecionado"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Botão esquerdo: Move todos os itens. Botão direito: Move um item"
 
-#~ msgid "EDIT GAME"
-#~ msgstr "EDITAR JOGO"
+#, fuzzy
+#~ msgid "Downloading"
+#~ msgstr "Baixar"
 
-#~ msgid "new game"
-#~ msgstr "novo jogo"
+#~ msgid "Preload inventory textures"
+#~ msgstr "pré-carregando texturas de inventário"
 
-#~ msgid "Mods:"
-#~ msgstr "Módulos:"
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Tecla para aumentar o intervalo de visualização. Modifica o mínimo "
+#~ "intervalo de visualização.\n"
+#~ "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
 
-#~ msgid "GAMES"
-#~ msgstr "JOGOS"
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Tecla para diminuir o intervalo de visualização. Modifica o intervalo "
+#~ "mínimo de visualização.\n"
+#~ "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
 
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Não foi possível copiar o mod \"$1\" para o jogo \"$2\""
+#~ msgid ""
+#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Julia definido: (X, Y, Z) deslocamentos do centro mundo.\n"
+#~ "Variam aproximadamente -2 a 2, multiplique por j_scale para deslocamentos "
+#~ "em nós."
 
-#~ msgid "Game Name"
-#~ msgstr "Nome do jogo"
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr ""
+#~ "Habilitar destaque de bloco selecionado (desabilita o modo de destaque "
+#~ "selectionbox [Padrão])."
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "habilitado"
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Habilita recurso permitindo que o nível da água seja um pouco menor, "
+#~ "portando não preenche todo o espaço disponível para bloco.\n"
+#~ "Note que isso não está bem otimizado e que suavização da iluminação na "
+#~ "superfície da água não funciona bem com esse recurso."
 
 #, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Desabilitar PMs"
-
 #~ msgid ""
 #~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with 'no' are used to explicitly disable them."
 #~ msgstr ""
-#~ "Atributos de geração de mapas específicos para o Mapgen v7.\n"
-#~ "'ridges' são os rios.\n"
-#~ "Flags que não estão especificadas na string da flag não são modificadas "
-#~ "por padrão.\n"
-#~ "Flags começando com \"no\" são usadas para explicitamente desabilitá-las."
+#~ "Atributos para o gerador de mapas específico para o Mapgen v6.\n"
+#~ "Quando biomas de neve estão habilitados, pântanos ficam habilitados e a "
+#~ "flag de pântanos é ignorada.\n"
+#~ "Flags que não são especificadas na string da flag não são modificadas por "
+#~ "padrão.\n"
+#~ "Flags começando com \"no\" (não) são usadas para explicitamente "
+#~ "desabilitá-las."
 
+#, fuzzy
 #~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
 #~ "Flags that are not specified in the flag string are not modified from the "
 #~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Flags starting with 'no' are used to explicitly disable them."
 #~ msgstr ""
-#~ "Atributos de mapgen específicos para vales (Mapgen Valleys).\n"
+#~ "Atributos de mapgen específicos para Mapgen plano.\n"
+#~ "Alguns lagos e colinas são ocasionalmente adicionados num mundo plano.\n"
 #~ "Flags que não estão especificadas na string de flags não são modificados "
 #~ "a partir do padrão.\n"
 #~ "Flags começando com \"no\" (não) são usadas para desativá-los "
-#~ "explicitamente.\n"
-#~ "\"altitude_chill\" torna terrenos de elevada altitude mais frios, o que "
-#~ "pode causar algumas falhas nos biomas.\n"
-#~ "\"humid_rivers\" modifica a umidade ao redor dos rios e em áreas onde a "
-#~ "água tende a ser represada em poças. Pode interferir em biomas que são "
-#~ "sensíveis a mudanças."
-
-#~ msgid "No!!!"
-#~ msgstr "Não!!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Gerar Normalmaps"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Lista de servidores públicos"
-
-#~ msgid "No of course not!"
-#~ msgstr "Claro que não!"
+#~ "explicitamente."
diff --git a/po/ro/minetest.po b/po/ro/minetest.po
index ac4bf79..a9efb03 100644
--- a/po/ro/minetest.po
+++ b/po/ro/minetest.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
 "PO-Revision-Date: 2016-03-17 15:28+0000\n"
 "Last-Translator: Lordmusic Player <lordmusicplro1 at gmail.com>\n"
 "Language-Team: Romanian <https://hosted.weblate.org/projects/minetest/"
@@ -624,6 +624,11 @@ msgid "Particles"
 msgstr "Activează tot"
 
 #: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Singleplayer"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Setări"
 
@@ -1004,6 +1009,10 @@ msgstr "Intră pe noclip"
 msgid "Use"
 msgstr "Aleargă"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Mărire"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "apasă o tastă"
@@ -1320,10 +1329,6 @@ msgstr "X Butonul 1"
 msgid "X Button 2"
 msgstr "X Butonul 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Mărire"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1391,6 +1396,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1466,6 +1475,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Backward key"
 msgstr "Înapoi"
@@ -1501,6 +1514,10 @@ msgid "Build inside player"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Bumpmapping"
 msgstr "Mip Mapping"
@@ -1544,6 +1561,11 @@ msgid "Chat toggle key"
 msgstr "Modifică tastele"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Comandă"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1620,14 +1642,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1784,6 +1806,10 @@ msgid "Default privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1800,6 +1826,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1830,14 +1860,6 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1850,6 +1872,18 @@ msgid "Disable anticheat"
 msgstr "Activează particulele"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr ""
 
@@ -1876,6 +1910,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Enable VBO"
 msgstr "Activează MP"
@@ -1962,6 +2000,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2023,11 +2069,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2163,12 +2219,14 @@ msgid "Generate normalmaps"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2200,6 +2258,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2228,15 +2295,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2331,6 +2389,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2366,6 +2458,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2526,6 +2626,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2561,7 +2668,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2713,6 +2820,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2747,8 +2869,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2758,8 +2878,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2770,8 +2888,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2781,8 +2897,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3163,6 +3277,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3204,17 +3326,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3226,10 +3352,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Menus"
 msgstr "Meniu"
@@ -3272,10 +3394,6 @@ msgid "Mipmapping"
 msgstr "Mip Mapping"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3480,11 +3598,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3492,7 +3616,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3529,6 +3653,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Report path"
+msgstr "Selectează"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Right key"
 msgstr "Meniu Drepata"
 
@@ -3697,7 +3826,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3735,7 +3864,7 @@ msgstr "Lumină mai bună"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3816,10 +3945,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3835,6 +3976,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3850,6 +3997,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3954,11 +4107,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Dezvoltatori de bază"
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4087,7 +4235,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4188,87 +4336,91 @@ msgid "cURL timeout"
 msgstr ""
 
 #, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Se încarcă..."
+#~ msgid "Useful for mod developers."
+#~ msgstr "Dezvoltatori de bază"
+
+#~ msgid "No of course not!"
+#~ msgstr "Nu, sigur că nu!"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "Listă de servere publică"
 
 #, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Descarcă"
+#~ msgid "If disabled "
+#~ msgstr "Dezactivează MP"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Click stânga: Mută toate obiectele, Click dreapta: Mută un singur obiect"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "activat"
 
-#~ msgid "Local install"
-#~ msgstr "Instalare locală"
+#~ msgid "Game Name"
+#~ msgstr "Numele jocului"
 
-#~ msgid "Add mod:"
-#~ msgstr "Adăugaţi mod:"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Nu se poate copia modul \"$1\" în jocul \"$2\""
 
-#~ msgid "MODS"
-#~ msgstr "MODURI"
+#~ msgid "GAMES"
+#~ msgstr "JOCURI"
 
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "PACHETE DE TEXTURĂ"
+#~ msgid "Mods:"
+#~ msgstr "Moduri:"
 
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "SINGLE PLAYER"
+#~ msgid "new game"
+#~ msgstr "joc nou"
 
-#~ msgid "Finite Liquid"
-#~ msgstr "Lichid finit"
+#~ msgid "EDIT GAME"
+#~ msgstr "MODIFICĂ JOCUL"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Pre-încarcă imaginile obiectelor"
+#~ msgid "Remove selected mod"
+#~ msgstr "Șterge modul selectat"
 
-#~ msgid "SETTINGS"
-#~ msgstr "SETĂRI"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Adaugă modul"
 
-#~ msgid "Password"
-#~ msgstr "Parolă"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENT"
+
+#~ msgid "START SERVER"
+#~ msgstr "DESCHIDE SERVERUL"
 
 #~ msgid "Name"
 #~ msgstr "Nume"
 
-#~ msgid "START SERVER"
-#~ msgstr "DESCHIDE SERVERUL"
+#~ msgid "Password"
+#~ msgstr "Parolă"
 
-#~ msgid "CLIENT"
-#~ msgstr "CLIENT"
+#~ msgid "SETTINGS"
+#~ msgstr "SETĂRI"
 
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Adaugă modul"
+#~ msgid "Preload item visuals"
+#~ msgstr "Pre-încarcă imaginile obiectelor"
 
-#~ msgid "Remove selected mod"
-#~ msgstr "Șterge modul selectat"
+#~ msgid "Finite Liquid"
+#~ msgstr "Lichid finit"
 
-#~ msgid "EDIT GAME"
-#~ msgstr "MODIFICĂ JOCUL"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "SINGLE PLAYER"
 
-#~ msgid "new game"
-#~ msgstr "joc nou"
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "PACHETE DE TEXTURĂ"
 
-#~ msgid "Mods:"
-#~ msgstr "Moduri:"
+#~ msgid "MODS"
+#~ msgstr "MODURI"
 
-#~ msgid "GAMES"
-#~ msgstr "JOCURI"
+#~ msgid "Add mod:"
+#~ msgstr "Adăugaţi mod:"
 
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Nu se poate copia modul \"$1\" în jocul \"$2\""
+#~ msgid "Local install"
+#~ msgstr "Instalare locală"
 
-#~ msgid "Game Name"
-#~ msgstr "Numele jocului"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Click stânga: Mută toate obiectele, Click dreapta: Mută un singur obiect"
 
 #, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "activat"
+#~ msgid "Downloading"
+#~ msgstr "Descarcă"
 
 #, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Dezactivează MP"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Listă de servere publică"
-
-#~ msgid "No of course not!"
-#~ msgstr "Nu, sigur că nu!"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Se încarcă..."
diff --git a/po/ru/minetest.po b/po/ru/minetest.po
index d281939..e5b8064 100644
--- a/po/ru/minetest.po
+++ b/po/ru/minetest.po
@@ -7,18 +7,18 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-04-18 23:08+0000\n"
-"Last-Translator: Stas Kies <stask85 at gmail.com>\n"
-"Language-Team: Russian <https://hosted.weblate.org/projects/minetest/"
-"minetest/ru/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-19 10:06+0000\n"
+"Last-Translator: Nikolay <nikolay0054 at factmodule.ru>\n"
+"Language-Team: Russian "
+"<https://hosted.weblate.org/projects/minetest/minetest/ru/>\n"
 "Language: ru\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<="
+"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.10\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
@@ -54,7 +54,7 @@ msgstr "Несоответствие версии протокола. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr "Сервер обеспечивает соблюдение версии протокола $ 1. "
+msgstr "Сервер обеспечивает соблюдение версии протокола $1. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
@@ -102,8 +102,9 @@ msgid ""
 "Failed to enable mod \"$1\" as it contains disallowed characters. Only "
 "chararacters [a-z0-9_] are allowed."
 msgstr ""
-"Ошибка при попытке включения мода \"$1\" поскольку он содержит недопустимые "
-"символы. Допускается использование символов от Aa-Zz и от 0-9."
+"Ошибка при включении мода \"$1\", поскольку он содержит недопустимые "
+"символы. Допускается использование строчных букв латинского алфавита, цифр, "
+"и знака подчёркивания."
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide Game"
@@ -140,7 +141,7 @@ msgstr "Создать"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Скачайте мини-игры, такие как minetest_game, на minetest.net"
+msgstr "Скачивайте мини-игры, такие как minetest_game, на minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download one from minetest.net"
@@ -192,7 +193,7 @@ msgstr "Modmgr: невозможно удалить \"$1\""
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Modmgr: invalid modpath \"$1\""
-msgstr "Modmgr: неправильный путь \"$1\""
+msgstr "Modmgr: неправильный путь к \"$1\""
 
 #: builtin/mainmenu/dlg_delete_world.lua
 msgid "Delete World \"$1\"?"
@@ -216,7 +217,7 @@ msgstr "(Отсутствует описание настройки)"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "< Back to Settings page"
-msgstr "< Назад к странице Настройки"
+msgstr "< Назад к странице Настроек"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Browse"
@@ -408,9 +409,8 @@ msgid "Uninstall selected modpack"
 msgstr "Удалить выбранный мод-пак"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "Адрес / Порт:"
+msgstr "Адрес / Порт"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
@@ -426,22 +426,19 @@ msgstr "Режим творчества"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Damage enabled"
-msgstr "Разрешить увечья"
+msgstr "Ущерб включен"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Del. Favorite"
-msgstr "Избранное:"
+msgstr "Удалить  фаворит"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Favorite"
-msgstr "Избранное:"
+msgstr "фаворит"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Имя / Пароль:"
+msgstr "Имя / Пароль"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -463,7 +460,7 @@ msgstr "Режим творчества"
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
 #: builtin/mainmenu/tab_singleplayer.lua
 msgid "Enable Damage"
-msgstr "Разрешить увечья"
+msgstr "Включить Урон"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Name/Password"
@@ -483,7 +480,7 @@ msgstr "Порт"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Public"
-msgstr "Публичные"
+msgstr "Публичный"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "Select World:"
@@ -534,7 +531,6 @@ msgid "Bilinear Filter"
 msgstr "Билинейная фильтрация"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
 msgstr "Бампмаппинг"
 
@@ -585,9 +581,8 @@ msgid "None"
 msgstr "Ничего"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Normal Mapping"
-msgstr "Mip-текстурирование (Мип-маппинг)"
+msgstr "Mip-текстурирование"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
@@ -602,9 +597,12 @@ msgid "Parallax Occlusion"
 msgstr "Parallax Occlusion"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "Включить частицы"
+msgstr "Частицы"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Сброс одиночной игры"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
@@ -985,6 +983,10 @@ msgstr "Включить noclip"
 msgid "Use"
 msgstr "Использовать"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Масштаб"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "нажмите клавишу"
@@ -1301,10 +1303,6 @@ msgstr "Доп. кнопка 1"
 msgid "X Button 2"
 msgstr "Доп. кнопка 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Масштаб"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1387,6 +1385,11 @@ msgid "Active Block Modifier interval"
 msgstr "Дальность взаимодействия с блоками"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "Дальность взаимодействия с блоками"
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr "Дальность взаимодействия с блоками"
 
@@ -1473,6 +1476,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr "Автоматически добавлять в список серверов."
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Кнопка автобега"
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Backward key"
 msgstr "клавиша обратно"
@@ -1507,6 +1514,10 @@ msgid "Build inside player"
 msgstr "Разрешить ставить блоки на месте игрока"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Встроен"
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Бампмаппинг"
 
@@ -1549,6 +1560,11 @@ msgid "Chat toggle key"
 msgstr "Кнопка переключения чата"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Команда"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1620,16 +1636,23 @@ msgid "Colored fog"
 msgstr "Цветной туман"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
+"Список доверенных модов, через запятую, которым разрешён доступ к HTTP API,  "
+"что позволяет им отправлять и принимать данные в/из сети Интернет."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
+"Список доверенных модов, через запятую, которым разрешён доступ к "
+"небезопасным функциям, даже в безопасном режиме (с помощью "
+"request_insecure_environment())."
 
 #: src/settings_translation_file.cpp
 msgid "Command key"
@@ -1661,7 +1684,7 @@ msgstr "Кнопка вызова консоли"
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward"
-msgstr ""
+msgstr "Непрерывная ходьба"
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward movement (only used for testing)."
@@ -1781,6 +1804,10 @@ msgid "Default privileges"
 msgstr "Стандартные права"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1799,10 +1826,14 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Delay showing tooltips, stated in milliseconds."
+msgid "Delay in sending blocks after building"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay showing tooltips, stated in milliseconds."
+msgstr "Задержка показа подсказок, указанная в миллисекундах."
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Deprecated Lua API handling"
 msgstr "Устаревшее Lua API управление"
@@ -1833,14 +1864,6 @@ msgid "Desynchronize block animation"
 msgstr "Рассинхронизировать анимацию блоков"
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1852,6 +1875,18 @@ msgid "Disable anticheat"
 msgstr "Отключить анти-чит"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "Запретить пустой пароль"
 
@@ -1876,6 +1911,10 @@ msgid "Dump the mapgen debug infos."
 msgstr "Дамп отладочной информации генератора мира."
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Enable VBO"
 msgstr "Включить мультиплеер"
@@ -1923,8 +1962,9 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Enables animation of inventory items."
-msgstr ""
+msgstr "Включить анимацию предметов в инвентаре."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1960,6 +2000,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -1979,18 +2027,22 @@ msgid "Fall bobbing"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Fallback font"
 msgstr "Fallback шрифт"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Fallback font shadow"
-msgstr ""
+msgstr "Fallback тень шрифта"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Fallback font shadow alpha"
-msgstr ""
+msgstr "Fallback прозрачность тени шрифта"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Fallback font size"
 msgstr "Fallback размер шрифта"
 
@@ -2016,7 +2068,7 @@ msgid ""
 "Fast movement (via use key).\n"
 "This requires the \"fast\" privilege on the server."
 msgstr ""
-"Быстрое перемещение (с использование клавиши).\n"
+"Быстрое перемещение (с использованием клавиши).\n"
 "Это требует привилегию \"fast\" на сервере."
 
 #: src/settings_translation_file.cpp
@@ -2024,12 +2076,26 @@ msgid "Field of view"
 msgstr "Поле зрения"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Field of view for zoom"
+msgstr "Поле зрения"
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr "Поле зрения в градусах."
 
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Быстрое перемещение (с использованием клавиши).\n"
+"Это требует привилегию \"fast\" на сервере."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2056,8 +2122,9 @@ msgid "Filtering"
 msgstr "Фильтрация"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Fixed map seed"
-msgstr "Конкретное семя мира"
+msgstr "Фиксированное зерно мира"
 
 #: src/settings_translation_file.cpp
 msgid "Fly key"
@@ -2101,13 +2168,12 @@ msgid "Font size"
 msgstr "Размер шрифта"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Format of screenshots."
-msgstr "Путь для сохранения скриншотов."
+msgstr "Формат скриншотов."
 
 #: src/settings_translation_file.cpp
 msgid "Forward key"
-msgstr "Вперед"
+msgstr "Клавиша  вперёд"
 
 #: src/settings_translation_file.cpp
 msgid "Freetype fonts"
@@ -2166,16 +2232,29 @@ msgid "Generate normalmaps"
 msgstr "Генерировать карты нормалей"
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Параметры глобального генератора карты.\n"
+"В генераторе карт v6 флаг 'decorations' управляет всем оформлением за "
+"исключением деревьев\n"
+" и junglegras(травы джунглей?), в остальных генераторах этот флаг управляет "
+"всем оформлением.\n"
+"Стандартные флаги, установленные в engine(инструменте?) следующие: caves, "
+"light, decorations\n"
+"Строка флагов изменяет стандартные настройки engine(инструмента?).\n"
+"Флаги, не указанные в строке флагов, по умолчанию не изменяются.\n"
+"Флаги, начинающиеся с 'no' используются для их явного отключения."
 
 #: src/settings_translation_file.cpp
 msgid "Graphics"
@@ -2201,18 +2280,35 @@ msgid ""
 "-    log: mimic and log backtrace of deprecated call (default for debug).\n"
 "-    error: abort on usage of deprecated call (suggested for mod developers)."
 msgstr ""
+"Обработка для устаревших вызовов lua api:\n"
+"-    legacy: (иногда успешно) имитирует прежнее поведение  (по умолчанию для "
+"релиза).\n"
+"-    log: имитирует и журналирует backtrace(трассировку?след?) устаревших "
+"вызовов (по умолчанию для отладки).\n"
+"-    error: прерывание при использовании устаревших вызовов (рекомендовано "
+"для разработчиков модов)."
 
 #: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Height component of the initial window size."
+msgstr "Высота содержимого (относительно?) исходного размера окна"
+
+#: src/settings_translation_file.cpp
 msgid "Height on which clouds are appearing."
-msgstr ""
+msgstr "Высота, на которой появляются облака."
 
 #: src/settings_translation_file.cpp
 msgid "High-precision FPU"
-msgstr ""
+msgstr "Высокоточный FPU"
 
 #: src/settings_translation_file.cpp
 msgid "Homepage of server, to be displayed in the serverlist."
@@ -2220,33 +2316,32 @@ msgstr "Домашняя страница сервера, отображаема
 
 #: src/settings_translation_file.cpp
 msgid "How deep to make rivers"
-msgstr ""
+msgstr "Глубина рек"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "How large area of blocks are subject to the active block stuff, stated in "
 "mapblocks (16 nodes).\n"
 "In active blocks objects are loaded and ABMs run."
 msgstr ""
+"Размер площади из блоков, составляющей активный блок, расположенный в "
+"mapblocks (16 nodes).↵\n"
+"В активных блоках объекты загружаются и ABMs запускается."
 
 #: src/settings_translation_file.cpp
-msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
+"Время ожидания сервера до выгрузки неиспользуемых mapblocks.\n"
+"Высокие значения более плавные, но используют больше RAM."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "How wide to make rivers"
-msgstr ""
+msgstr "Установка ширины рек"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -2262,39 +2357,57 @@ msgid "IPv6 support."
 msgstr "IPv6 поддержка."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "If FPS would go higher than this, limit it by sleeping\n"
 "to not waste CPU power for no benefit."
 msgstr ""
+"Если FPS превысит это значение, ограничить его простоем,\n"
+"чтобы не тратить мощность процессора впустую."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "If disabled \"use\" key is used to fly fast if both fly and fast mode are "
 "enabled."
 msgstr ""
+"Если выключено, кнопка \"use\"(\"использовать\"?) используется для быстрого "
+"полёта, если одновременно включены быстрый режим и режим полёта."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "If enabled together with fly mode, player is able to fly through solid "
 "nodes.\n"
 "This requires the \"noclip\" privilege on the server."
 msgstr ""
+"Если включено одновременно с режимом полёта, игрок может летать через "
+"твердые nodes(узлы?вершины?). Это требует привилегий \"noclip\" на сервере."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
 "and descending."
 msgstr ""
+"Если включено, клавиша \"use\"(\"использовать\"?) вместо \"sneak"
+"\"(\"подкрасться\"?) будет использоваться для climbing down and descending."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "If enabled, actions are recorded for rollback.\n"
 "This option is only read when server starts."
 msgstr ""
+"Если включено, действия записываются для отката.\n"
+"Этот параметр считывается только при запуске сервера."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid "If enabled, disable cheat prevention in multiplayer."
 msgstr ""
+"Если включено, отключается prevention(предупреждение?предотвращение?) "
+"читерства в мультиплеере."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2338,6 +2451,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr "Цвет фона внутриигровой консоли (R, G, B)."
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr "Интервал сохранения важных изменений в мире, установленный в секундах."
 
@@ -2372,6 +2519,16 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "Интервал повторного клика правой кнопкой."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "Чувствительность мыши"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2583,6 +2740,17 @@ msgstr ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Клавиша переключения режима быстрого перемещения.\n"
+"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
@@ -2633,11 +2801,15 @@ msgstr ""
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Клавиша движения влево.\n"
+"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2805,6 +2977,22 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "Дальность взаимодействия с блоками"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2831,6 +3019,7 @@ msgid "Map directory"
 msgstr "Каталог сохранения карт"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen Valleys.\n"
 "'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2838,46 +3027,81 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Параметры глобального генератора карты.\n"
+"В генераторе карт v6 флаг 'decorations' управляет всем оформлением за "
+"исключением деревьев\n"
+" и junglegras(травы джунглей?), в остальных генераторах этот флаг управляет "
+"всем оформлением.\n"
+"Стандартные флаги, установленные в engine(инструменте?) следующие: caves, "
+"light, decorations\n"
+"Строка флагов изменяет стандартные настройки engine(инструмента?).\n"
+"Флаги, не указанные в строке флагов, по умолчанию не изменяются.\n"
+"Флаги, начинающиеся с 'no' используются для их явного отключения."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Параметры глобального генератора карты.\n"
+"В генераторе карт v6 флаг 'decorations' управляет всем оформлением за "
+"исключением деревьев\n"
+" и junglegras(травы джунглей?), в остальных генераторах этот флаг управляет "
+"всем оформлением.\n"
+"Стандартные флаги, установленные в engine(инструменте?) следующие: caves, "
+"light, decorations\n"
+"Строка флагов изменяет стандартные настройки engine(инструмента?).\n"
+"Флаги, не указанные в строке флагов, по умолчанию не изменяются.\n"
+"Флаги, начинающиеся с 'no' используются для их явного отключения."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Параметры глобального генератора карты.\n"
+"В генераторе карт v6 флаг 'decorations' управляет всем оформлением за "
+"исключением деревьев\n"
+" и junglegras(травы джунглей?), в остальных генераторах этот флаг управляет "
+"всем оформлением.\n"
+"Стандартные флаги, установленные в engine(инструменте?) следующие: caves, "
+"light, decorations\n"
+"Строка флагов изменяет стандартные настройки engine(инструмента?).\n"
+"Флаги, не указанные в строке флагов, по умолчанию не изменяются.\n"
+"Флаги, начинающиеся с 'no' используются для их явного отключения."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Параметры глобального генератора карты.\n"
+"В генераторе карт v6 флаг 'decorations' управляет всем оформлением за "
+"исключением деревьев\n"
+" и junglegras(травы джунглей?), в остальных генераторах этот флаг управляет "
+"всем оформлением.\n"
+"Стандартные флаги, установленные в engine(инструменте?) следующие: caves, "
+"light, decorations\n"
+"Строка флагов изменяет стандартные настройки engine(инструмента?).\n"
+"Флаги, не указанные в строке флагов, по умолчанию не изменяются.\n"
+"Флаги, начинающиеся с 'no' используются для их явного отключения."
 
 #: src/settings_translation_file.cpp
 msgid "Map generation limit"
@@ -3248,6 +3472,15 @@ msgid "Maximum hotbar width"
 msgstr "Максимальная ширина хотбара"
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Количество блоков, передаваемых одновременно для каждого клиента."
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3289,17 +3522,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3311,10 +3548,6 @@ msgid "Maximum users"
 msgstr "Максимальное количество пользователей"
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "Меню"
 
@@ -3358,10 +3591,6 @@ msgid "Mipmapping"
 msgstr "Mip-текстурирование (Мип-маппинг)"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3413,7 +3642,6 @@ msgstr ""
 "Создание мира из главного меню переопределит это."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Name of the player.\n"
 "When running a server, clients connecting with this name are admins.\n"
@@ -3437,6 +3665,8 @@ msgid ""
 "Network port to listen (UDP).\n"
 "This value will be overridden when starting from the main menu."
 msgstr ""
+"Сетевой порт для прослушивания (UDP).\n"
+"Этот параметр будет переопределён, если запускать сервер с главного меню."
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -3468,7 +3698,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Noises"
-msgstr ""
+msgstr "Шумы"
 
 #: src/settings_translation_file.cpp
 msgid "Normalmaps sampling"
@@ -3552,13 +3782,12 @@ msgid "Physics"
 msgstr "Физика"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Player is able to fly without being affected by gravity.\n"
 "This requires the \"fly\" privilege on the server."
 msgstr ""
 "Игрок может летать без влияния гравитации.\n"
-"Это требует привилегии fly на сервере."
+"Это требует привилегии \"fly\" на сервере."
 
 #: src/settings_translation_file.cpp
 msgid "Player name"
@@ -3570,24 +3799,35 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Player versus Player"
-msgstr "PvP"
+msgstr "Игрок против Игрока"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Port to connect to (UDP).\n"
 "Note that the port field in the main menu overrides this setting."
 msgstr ""
+"Порт, к которому подключиться (UDP).\n"
+"Имейте ввиду, что поле ввода порта в главном меню переопределяет эту "
+"настройку."
 
 #: src/settings_translation_file.cpp
 msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
+"Не допускать модам выполнение небезопасных вещей, например выполнение "
+"консольных команд."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3595,7 +3835,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3632,6 +3872,11 @@ msgid "Replaces the default main menu with a custom one."
 msgstr "Заменять главное меню на пользовательское."
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Путь к шрифту"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "Правая клавиша меню"
 
@@ -3662,15 +3907,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Round minimap"
-msgstr ""
+msgstr "Круглая миникарта"
 
 #: src/settings_translation_file.cpp
 msgid "Save the map received by the client on disk."
-msgstr ""
+msgstr "Сохранение карты, полученной от клиента на диск."
 
 #: src/settings_translation_file.cpp
 msgid "Saving map received from server"
-msgstr ""
+msgstr "Сохранение карты, полученной с сервера"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3700,19 +3945,23 @@ msgstr "Каталог со скриншотами"
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Screenshot format"
-msgstr "Каталог со скриншотами"
+msgstr "Формат скриншота"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Screenshot quality"
-msgstr "Cкриншот"
+msgstr "Качество скриншота"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Screenshot quality. Only used for JPEG format.\n"
 "1 means worst quality; 100 means best quality.\n"
 "Use 0 for default quality."
 msgstr ""
+"Качество скриншота. Используется только для изображений в формате JPEG.\n"
+"1 означает плохое качество; 100 означает хорошее качество.\n"
+"Используйте 0 для настроек по умолчанию."
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -3764,12 +4013,11 @@ msgstr "Порт сервера"
 
 #: src/settings_translation_file.cpp
 msgid "Serverlist URL"
-msgstr "Список публичных серверов"
+msgstr "Адрес списка серверов"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Serverlist file"
-msgstr "Список публичных серверов"
+msgstr "Файл списка серверов"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -3810,7 +4058,7 @@ msgstr ""
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3820,16 +4068,15 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr ""
+msgstr "Форма миникарты. Включено = круг, выключено = квадрат."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Show debug info"
-msgstr "Показывать отладочную информацию."
+msgstr "Показывать отладочную информацию"
 
 #: src/settings_translation_file.cpp
 msgid "Show entity selection boxes"
-msgstr ""
+msgstr "Показывать выделение энтити"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -3857,7 +4104,7 @@ msgstr "Мягкое освещение"
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 "Сглаживать движения камеры при ходьбе и поворотах.\n"
@@ -3891,6 +4138,11 @@ msgid ""
 "(obviously, remote_media should end with a slash).\n"
 "Files that are not present will be fetched the usual way."
 msgstr ""
+"Указывает URL с которого клиент будет качать медиа-файлы вместо "
+"использования UDP.\n"
+"$filename должен быть доступен по адресу $remote_demia$filename через cURL\n"
+"(remote_media должен заканчиваться слешем).\n"
+"Файлы, которых не будет, будут скачены обычным путём."
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -3912,7 +4164,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Support older servers"
-msgstr ""
+msgstr "Поддержка старых серверов"
 
 #: src/settings_translation_file.cpp
 msgid "Synchronous SQLite"
@@ -3920,7 +4172,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Terrain Height"
-msgstr ""
+msgstr "Высота местности"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3946,15 +4198,28 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+"Стандартный формат, в котором профили будут сохранены,\n"
+"когда вызывают '/profiler save [формат]' без формата."
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "The network interface that the server listens on."
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "The network interface that the server listens on."
+msgstr "Сетевой интерфейс, который слушает сервер."
+
+#: src/settings_translation_file.cpp
 msgid ""
 "The privileges that new users automatically get.\n"
 "See /privs in game for a full list on your server and mod configuration."
@@ -3968,6 +4233,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3984,13 +4255,20 @@ msgstr ""
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr "Задержка в секундах между кликами при зажатой правой кнопке мыши."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr "Задержка в секундах между кликами при зажатой правой кнопке мыши."
 
 #: src/settings_translation_file.cpp
 msgid "This font will be used for certain languages."
-msgstr ""
+msgstr "Этот шрифт будет использован для некоторых языков."
 
 #: src/settings_translation_file.cpp
 msgid "Time in between active block management cycles"
@@ -4063,7 +4341,7 @@ msgstr "Доверенные моды"
 
 #: src/settings_translation_file.cpp
 msgid "URL to the server list displayed in the Multiplayer Tab."
-msgstr ""
+msgstr "URL списка серверов, отображающийся во вкладке Мультиплеер."
 
 #: src/settings_translation_file.cpp
 msgid "Unlimited player transfer distance"
@@ -4113,11 +4391,6 @@ msgstr "Использовать трилинейную фильтрацию д
 
 #: src/settings_translation_file.cpp
 #, fuzzy
-msgid "Useful for mod developers."
-msgstr "Разработчики в отставке"
-
-#: src/settings_translation_file.cpp
-#, fuzzy
 msgid "V-Sync"
 msgstr "V-Sync"
 
@@ -4164,6 +4437,8 @@ msgid ""
 "View distance in nodes.\n"
 "Min = 20"
 msgstr ""
+"Дальность отрисовки в нодах.\n"
+"Минимум = 20"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -4204,11 +4479,11 @@ msgstr "Текстуры предметов..."
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
-msgstr ""
+msgstr "Уровень воды"
 
 #: src/settings_translation_file.cpp
 msgid "Water surface level of the world."
-msgstr ""
+msgstr "Уровень поверхности воды мира."
 
 #: src/settings_translation_file.cpp
 #, fuzzy
@@ -4253,7 +4528,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4361,110 +4636,117 @@ msgstr ""
 msgid "cURL timeout"
 msgstr "cURL тайм-аут"
 
+#, fuzzy
 #~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
-#~ msgstr ""
-#~ "Включите немного более низкую поверхность воды, чтобы она\n"
-#~ "не заполняла блок полностью. Учтите, что это не совсем оптимизировано,\n"
-#~ "и мягкое освещение на поверхности воды не работает с этим."
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
+#~ msgstr "Количество блоков, передаваемых одновременно для всего сервера."
 
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Клавиша уменьшения видимого диапазона. Изменяет минимальную дальность "
-#~ "отображения.\n"
-#~ "Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#, fuzzy
+#~ msgid "Useful for mod developers."
+#~ msgstr "Разработчики в отставке"
 
-#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Клавиша Увеличения видимого диапазона. Изменяет минимальную дальность "
-#~ "отображения.\n"
-#~ "Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "No of course not!"
+#~ msgstr "Нет, конечно нет!"
 
-#, fuzzy
-#~ msgid "New style water"
-#~ msgstr "Новый стиль воды"
+#~ msgid "Public Serverlist"
+#~ msgstr "Список публичных серверов"
 
-#~ msgid "Preload inventory textures"
-#~ msgstr "Предзагрузка текстур..."
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Генерировать карты нормалей"
 
-#, fuzzy
-#~ msgid "Viewing range minimum"
-#~ msgstr "Минимальная граница дальности отрисовки."
+#~ msgid "No!!!"
+#~ msgstr "Нет!"
 
-#, fuzzy
-#~ msgid "Wanted FPS"
-#~ msgstr "Ожидаемый FPS"
+#~ msgid "\""
+#~ msgstr "\""
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Сброс одиночной игры"
+#~ msgid "If disabled "
+#~ msgstr "Если выключено "
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Коэффициент масштаба интерфейса: "
+#~ msgid "If enabled, "
+#~ msgstr "Если включено "
 
-#~ msgid "Touch free target"
-#~ msgstr "Свободный выбор цели"
+#~ msgid "Rendering:"
+#~ msgstr "Рендеринг:"
 
-#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Загрузить"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Перезапустите Minetest для принятия изменений"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "ЛКМ: Переместить все предметы, ПКМ: Переместить один предмет"
+#~ msgid "Game Name"
+#~ msgstr "Название"
 
-#~ msgid "is required by:"
-#~ msgstr "требуется для:"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Не могу скопировать мод \"$1\" в игру \"$2\""
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "Настройки сохранены.  "
+#~ msgid "GAMES"
+#~ msgstr "ИГРЫ"
 
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Предупреждение: Неверная конфигурация.  "
+#~ msgid "Mods:"
+#~ msgstr "Моды:"
 
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Невозможно создать мир: Имя содержит недопустимые символы"
+#~ msgid "new game"
+#~ msgstr "Создать игру"
 
-#~ msgid "Show Public"
-#~ msgstr "Публичные"
+#~ msgid "EDIT GAME"
+#~ msgstr "РЕДАКТИРОВАНИЕ"
 
-#~ msgid "Show Favorites"
-#~ msgstr "Избранные"
+#~ msgid "Remove selected mod"
+#~ msgstr "Удалить мод"
 
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Оставьте адрес пустым для запуска локального сервера."
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Добавить мод"
 
-#~ msgid "Create world"
-#~ msgstr "Создать мир"
+#~ msgid "CLIENT"
+#~ msgstr "КЛИЕНТ"
 
-#~ msgid "Address required."
-#~ msgstr "Нужно ввести адрес."
+#~ msgid "START SERVER"
+#~ msgstr "СЕРВЕР"
 
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Невозможно удалить мир: Ничего не выбрано"
+#~ msgid "Name"
+#~ msgstr "Имя"
 
-#~ msgid "Files to be deleted"
-#~ msgstr "Следующие файлы будут удалены"
+#~ msgid "Password"
+#~ msgstr "Пароль"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Невозможно создать мир: Ни одной игры не найдено"
+#~ msgid "SETTINGS"
+#~ msgstr "НАСТРОЙКИ"
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Невозможно настроить мир: ничего не выбрано"
+#~ msgid "Preload item visuals"
+#~ msgstr "Предзагрузка изображений"
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Ошибка при удалении файлов мира"
+#~ msgid "Finite Liquid"
+#~ msgstr "Конечные жидкости"
+
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "ОДИНОЧНАЯ ИГРА"
+
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "ПАКЕТЫ ТЕКСТУР"
+
+#~ msgid "MODS"
+#~ msgstr "МОДЫ"
+
+#~ msgid "Add mod:"
+#~ msgstr "Добавить мод:"
+
+#~ msgid "Local install"
+#~ msgstr "Локальная установка"
+
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration.  "
+#~ msgstr ""
+#~ "Предупреждение: Некоторые моды еще не настроены.\n"
+#~ "Их стандартные настройки будут установлены, когда вы сохраните "
+#~ "конфигурацию.  "
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration.  "
+#~ msgstr ""
+#~ "Предупреждение: Некоторые моды не найдены.\n"
+#~ "Их настройки будут удалены, когда вы сохраните конфигурацию.  "
 
 #~ msgid ""
 #~ "Default Controls:\n"
@@ -4491,104 +4773,104 @@ msgstr "cURL тайм-аут"
 #~ "- ESC: это меню\n"
 #~ "- T: чат\n"
 
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
-#~ msgstr ""
-#~ "Предупреждение: Некоторые моды не найдены.\n"
-#~ "Их настройки будут удалены, когда вы сохраните конфигурацию.  "
-
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration.  "
-#~ msgstr ""
-#~ "Предупреждение: Некоторые моды еще не настроены.\n"
-#~ "Их стандартные настройки будут установлены, когда вы сохраните "
-#~ "конфигурацию.  "
-
-#~ msgid "Local install"
-#~ msgstr "Локальная установка"
-
-#~ msgid "Add mod:"
-#~ msgstr "Добавить мод:"
-
-#~ msgid "MODS"
-#~ msgstr "МОДЫ"
-
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "ПАКЕТЫ ТЕКСТУР"
-
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "ОДИНОЧНАЯ ИГРА"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Ошибка при удалении файлов мира"
 
-#~ msgid "Finite Liquid"
-#~ msgstr "Конечные жидкости"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Невозможно настроить мир: ничего не выбрано"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Предзагрузка изображений"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Невозможно создать мир: Ни одной игры не найдено"
 
-#~ msgid "SETTINGS"
-#~ msgstr "НАСТРОЙКИ"
+#~ msgid "Files to be deleted"
+#~ msgstr "Следующие файлы будут удалены"
 
-#~ msgid "Password"
-#~ msgstr "Пароль"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Невозможно удалить мир: Ничего не выбрано"
 
-#~ msgid "Name"
-#~ msgstr "Имя"
+#~ msgid "Address required."
+#~ msgstr "Нужно ввести адрес."
 
-#~ msgid "START SERVER"
-#~ msgstr "СЕРВЕР"
+#~ msgid "Create world"
+#~ msgstr "Создать мир"
 
-#~ msgid "CLIENT"
-#~ msgstr "КЛИЕНТ"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Оставьте адрес пустым для запуска локального сервера."
 
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Добавить мод"
+#~ msgid "Show Favorites"
+#~ msgstr "Избранные"
 
-#~ msgid "Remove selected mod"
-#~ msgstr "Удалить мод"
+#~ msgid "Show Public"
+#~ msgstr "Публичные"
 
-#~ msgid "EDIT GAME"
-#~ msgstr "РЕДАКТИРОВАНИЕ"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Невозможно создать мир: Имя содержит недопустимые символы"
 
-#~ msgid "new game"
-#~ msgstr "Создать игру"
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Предупреждение: Неверная конфигурация.  "
 
-#~ msgid "Mods:"
-#~ msgstr "Моды:"
+#~ msgid "Configuration saved.  "
+#~ msgstr "Настройки сохранены.  "
 
-#~ msgid "GAMES"
-#~ msgstr "ИГРЫ"
+#~ msgid "is required by:"
+#~ msgstr "требуется для:"
 
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Не могу скопировать мод \"$1\" в игру \"$2\""
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "ЛКМ: Переместить все предметы, ПКМ: Переместить один предмет"
 
-#~ msgid "Game Name"
-#~ msgstr "Название"
+#, fuzzy
+#~ msgid "Downloading"
+#~ msgstr "Загрузить"
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Перезапустите Minetest для принятия изменений"
+#~ msgid "Touch free target"
+#~ msgstr "Свободный выбор цели"
 
-#~ msgid "Rendering:"
-#~ msgstr "Рендеринг:"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Коэффициент масштаба интерфейса: "
 
-#~ msgid "If enabled, "
-#~ msgstr "Если включено "
+#, fuzzy
+#~ msgid "Wanted FPS"
+#~ msgstr "Ожидаемый FPS"
 
-#~ msgid "If disabled "
-#~ msgstr "Если выключено "
+#, fuzzy
+#~ msgid "Viewing range minimum"
+#~ msgstr "Минимальная граница дальности отрисовки."
 
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid "Preload inventory textures"
+#~ msgstr "Предзагрузка текстур..."
 
-#~ msgid "No!!!"
-#~ msgstr "Нет!"
+#, fuzzy
+#~ msgid "New style water"
+#~ msgstr "Новый стиль воды"
 
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Генерировать карты нормалей"
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Клавиша Увеличения видимого диапазона. Изменяет минимальную дальность "
+#~ "отображения.\n"
+#~ "Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
 
-#~ msgid "Public Serverlist"
-#~ msgstr "Список публичных серверов"
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Клавиша уменьшения видимого диапазона. Изменяет минимальную дальность "
+#~ "отображения.\n"
+#~ "Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
 
-#~ msgid "No of course not!"
-#~ msgstr "Нет, конечно нет!"
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Включите немного более низкую поверхность воды, чтобы она\n"
+#~ "не заполняла блок полностью. Учтите, что это не совсем оптимизировано,\n"
+#~ "и мягкое освещение на поверхности воды не работает с этим."
diff --git a/po/ky/minetest.po b/po/sr_Cyrl/minetest.po
similarity index 81%
copy from po/ky/minetest.po
copy to po/sr_Cyrl/minetest.po
index 01a5910..eea83a6 100644
--- a/po/ky/minetest.po
+++ b/po/sr_Cyrl/minetest.po
@@ -7,70 +7,72 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2013-06-01 18:09+0200\n"
-"Last-Translator: Chynggyz Jumaliev <translatorky at lavabit.com>\n"
-"Language-Team: LANGUAGE <LL at li.org>\n"
-"Language: ky\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-07-13 09:50+0000\n"
+"Last-Translator: lisacvuk <lisacvukhome at gmail.com>\n"
+"Language-Team: Serbian (cyrillic) <https://hosted.weblate.org/projects/"
+"minetest/minetest/sr_Cyrl/>\n"
+"Language: sr_Cyrl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 1.4-dev\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.8-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr ""
+msgstr "Догодила се грешка у Lua скрипти, у моду:"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
-msgstr ""
+msgstr "Догодила се грешка:"
 
 #: builtin/fstk/ui.lua
-#, fuzzy
 msgid "Main menu"
-msgstr "Башкы меню"
+msgstr "Главни мени"
 
 #: builtin/fstk/ui.lua builtin/mainmenu/store.lua
 msgid "Ok"
-msgstr ""
+msgstr "Уреду"
 
 #: builtin/fstk/ui.lua
-#, fuzzy
 msgid "Reconnect"
-msgstr "Туташуу"
+msgstr "Поновно повезивање"
 
 #: builtin/fstk/ui.lua
 msgid "The server has requested a reconnect:"
-msgstr ""
+msgstr "Сервер тражи поновно повезивање:"
 
 #: builtin/mainmenu/common.lua src/game.cpp
 msgid "Loading..."
-msgstr "Жүктөлүүдө..."
+msgstr "Учитавање..."
 
 #: builtin/mainmenu/common.lua
 msgid "Protocol version mismatch. "
-msgstr ""
+msgstr "Неслагање верзија протокола. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr ""
+msgstr "Сервер примењује $1 верзију протокола. "
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
-msgstr ""
+msgstr "Сервер подржава верзије протокола између $1 и $2. "
 
 #: builtin/mainmenu/common.lua
 msgid "Try reenabling public serverlist and check your internet connection."
 msgstr ""
+"Покушајте да поновно укључите листу сервера и проверите вашу интернет "
+"конекцију."
 
 #: builtin/mainmenu/common.lua
 msgid "We only support protocol version $1."
-msgstr ""
+msgstr "Ми подржавамо само $1 верзију протокола."
 
 #: builtin/mainmenu/common.lua
 msgid "We support protocol versions between version $1 and $2."
-msgstr ""
+msgstr "Ми подржавамо верзије протокола између верзије $1 и $2."
 
 #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -78,184 +80,178 @@ msgstr ""
 #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
 #: src/keycode.cpp
 msgid "Cancel"
-msgstr "Жокко чыгаруу"
+msgstr "Прекини"
 
 #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua
-#, fuzzy
 msgid "Depends:"
-msgstr "көз карандылыктары:"
+msgstr "Зависи од:"
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "Disable MP"
-msgstr "Баарын өчүрүү"
+msgstr "Онемогући мод-паковање"
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "Enable MP"
-msgstr "Баарын күйгүзүү"
+msgstr "Омогући мод-паковање"
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "Enable all"
-msgstr "Баарын күйгүзүү"
+msgstr "Укључи све"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid ""
 "Failed to enable mod \"$1\" as it contains disallowed characters. Only "
 "chararacters [a-z0-9_] are allowed."
 msgstr ""
+"Неуспело укључивање мода \"$1\" зато што садржи неподржане симболе.Само "
+"симболи [a-z0-9_] су дозвољени."
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "Hide Game"
-msgstr "Оюн"
+msgstr "Сакриј игру"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide mp content"
-msgstr ""
+msgstr "Сакриј садржину мод-паковања"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Mod:"
-msgstr ""
+msgstr "Мод:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
 msgid "Save"
-msgstr "Сактоо"
+msgstr "Сачувај"
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "World:"
-msgstr "Дүйнөнү тандаңыз:"
+msgstr "Свет:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "enabled"
-msgstr "күйгүзүлгөн"
+msgstr "укључено"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "A world named \"$1\" already exists"
-msgstr ""
+msgstr "Свет \"$1\" већ постоји"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Create"
-msgstr "Жаратуу"
+msgstr "Направи"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr ""
+msgstr "Преузми подигру, као што је minetest_game, са minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download one from minetest.net"
-msgstr ""
+msgstr "Преузми један са minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
 msgid "Game"
-msgstr "Оюн"
+msgstr "Игра"
 
 #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
 msgid "Mapgen"
-msgstr ""
+msgstr "Генератор мапе"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "No worldname given or no game selected"
-msgstr ""
+msgstr "Име није дато или ниједна игра није изабрана"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Seed"
-msgstr ""
+msgstr "Семе"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Warning: The minimal development test is meant for developers."
-msgstr ""
+msgstr "Упозорење: Минимални развојни тест је намењен развијачима."
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "World name"
-msgstr "Дүйнө аты"
+msgstr "Име света"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "You have no subgames installed."
-msgstr ""
+msgstr "Нема инсталираних подигара."
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Are you sure you want to delete \"$1\"?"
-msgstr ""
+msgstr "Да ли сте сигурни да желите да обришете \"$1\"?"
 
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 #: src/keycode.cpp
 msgid "Delete"
-msgstr "Өчүрүү"
+msgstr "Обриши"
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Modmgr: failed to delete \"$1\""
-msgstr ""
+msgstr "Modmgr: неуспело брисање \"$1\""
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Modmgr: invalid modpath \"$1\""
-msgstr ""
+msgstr "Modmgr: локација мода \"$1\" није валидна"
 
 #: builtin/mainmenu/dlg_delete_world.lua
-#, fuzzy
 msgid "Delete World \"$1\"?"
-msgstr "Дүйнөнү өчүрүү"
+msgstr "Обриши свет \"$1\"?"
 
 #: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp
 msgid "Accept"
-msgstr "Кабыл алуу"
+msgstr "Прихвати"
 
 #: builtin/mainmenu/dlg_rename_modpack.lua
 msgid "Rename Modpack:"
-msgstr ""
+msgstr "Преименуј мод-паковање:"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "\"$1\" is not a valid flag."
-msgstr ""
+msgstr "\"$1\" није валидна ознака."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "(No description of setting given)"
-msgstr ""
+msgstr "(Није дат опис поставке)"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "< Back to Settings page"
-msgstr ""
+msgstr "< Назад на страну са поставкама"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Browse"
-msgstr ""
+msgstr "Прегледај"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
 msgid "Disabled"
-msgstr "Баарын өчүрүү"
+msgstr "Онемогућено"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Edit"
-msgstr ""
+msgstr "Промени"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
 msgid "Enabled"
-msgstr "күйгүзүлгөн"
+msgstr "Омогућено"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Format is 3 numbers separated by commas and inside brackets."
-msgstr ""
+msgstr "Формат су три броја унутар заграда раздвојени зарезима."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid ""
 "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
 "<octaves>, <persistence>"
 msgstr ""
+"Формат:  <офсет>, <скала>, (<распонX>, <распонY>, <распонZ>), <семе>, "
+"<октаве>, <упорност>"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
 msgid "Games"
-msgstr "Оюн"
+msgstr "Игре"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
 msgid "Mods"
-msgstr ""
+msgstr "Модови"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Optionally the lacunarity can be appended with a leading comma."
@@ -263,516 +259,484 @@ msgstr ""
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a comma seperated list of flags."
-msgstr ""
+msgstr "Молим вас унесите листу ознака раздвојену зарезима."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a valid integer."
-msgstr ""
+msgstr "Молим вас унесите валидан број."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a valid number."
-msgstr ""
+msgstr "Молим вас унесите валидан број."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Possible values are: "
-msgstr ""
+msgstr "Могуће вредности су: "
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Restore Default"
-msgstr ""
+msgstr "Поврати уобичајено"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
 msgid "Select path"
-msgstr "Тандоо"
+msgstr "Одабери локацију"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Show technical names"
-msgstr ""
+msgstr "Прикажи техничка имена"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "The value must be greater than $1."
-msgstr ""
+msgstr "Вредност мора бити већа од $1."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "The value must be lower than $1."
-msgstr ""
+msgstr "Вредност мора бити мања од $1."
 
 #: builtin/mainmenu/modmgr.lua
 msgid ""
 "\n"
 "Install Mod: unsupported filetype \"$1\" or broken archive"
 msgstr ""
+"\n"
+"Инсталирај мод: неподржан тип фајла \"$1\" или оштећена архива"
 
 #: builtin/mainmenu/modmgr.lua
-#, fuzzy
 msgid "Failed to install $1 to $2"
-msgstr "Дүйнөнү инициалдаштыруу катасы"
+msgstr "Неуспела инсталација $1 у $2"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: file: \"$1\""
-msgstr ""
+msgstr "Инсталирај мод: фајл: \"$1\""
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: unable to find real modname for: $1"
-msgstr ""
+msgstr "Инсталирај мод: не може се пронаћи право име за: $1"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: unable to find suitable foldername for modpack $1"
 msgstr ""
+"Инсталирај мод: не може се пронаћи одговарајуће име за фасциклу мод-паковања "
+"$1"
 
 #: builtin/mainmenu/store.lua
 msgid "Close store"
-msgstr ""
+msgstr "Затвори складиште"
 
 #: builtin/mainmenu/store.lua
 msgid "Downloading $1, please wait..."
-msgstr ""
+msgstr "Преузима се $1, молим вас сачекајте..."
 
 #: builtin/mainmenu/store.lua
 msgid "Install"
-msgstr ""
+msgstr "Инсталирај"
 
 #: builtin/mainmenu/store.lua
 msgid "Page $1 of $2"
-msgstr ""
+msgstr "Страна $1 од $2"
 
 #: builtin/mainmenu/store.lua
 msgid "Rating"
-msgstr ""
+msgstr "Оцена"
 
 #: builtin/mainmenu/store.lua
 msgid "Search"
-msgstr ""
+msgstr "Тражи"
 
 #: builtin/mainmenu/store.lua
-#, fuzzy
 msgid "Shortname:"
-msgstr "Дүйнө аты"
+msgstr "Краће име:"
 
 #: builtin/mainmenu/store.lua
 msgid "Successfully installed:"
-msgstr ""
+msgstr "Успешно инсталиран:"
 
 #: builtin/mainmenu/store.lua
 msgid "Unsorted"
-msgstr ""
+msgstr "Нераспоређено"
 
 #: builtin/mainmenu/store.lua
 msgid "re-Install"
-msgstr ""
+msgstr "поново инсталирај"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Active Contributors"
-msgstr ""
+msgstr "Активни сарадници"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Core Developers"
-msgstr ""
+msgstr "Главни развијачи"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Credits"
-msgstr "Алкыштар"
+msgstr "Заслуге"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Previous Contributors"
-msgstr ""
+msgstr "Предходни сарадници"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Previous Core Developers"
-msgstr ""
+msgstr "Предходни главни развијачи"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Installed Mods:"
-msgstr ""
+msgstr "Инсталирани модови:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Mod information:"
-msgstr ""
+msgstr "Информације о моду:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "No mod description available"
-msgstr ""
+msgstr "Није доступан опис мода"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Rename"
-msgstr ""
+msgstr "Преименуј"
 
 #: builtin/mainmenu/tab_mods.lua
-#, fuzzy
 msgid "Select Mod File:"
-msgstr "Дүйнөнү тандаңыз:"
+msgstr "Изаберите фајл мода:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Uninstall selected mod"
-msgstr ""
+msgstr "Уклони изабрани мод"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Uninstall selected modpack"
-msgstr ""
+msgstr "Уклони одабрано мод-паковање"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "Дареги/порту"
+msgstr "Адреса / Порт"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
-msgstr ""
+msgstr "Клијент"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Connect"
-msgstr "Туташуу"
+msgstr "Прикључи се"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Creative mode"
-msgstr "Жаратуу режими"
+msgstr "Слободни мод"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Damage enabled"
-msgstr "күйгүзүлгөн"
+msgstr "Оштећење омогућено"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Del. Favorite"
-msgstr "Тандалмалар:"
+msgstr "Обриши Омиљени"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Favorite"
-msgstr "Тандалмалар:"
+msgstr "Омиљени"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Аты/сырсөзү"
+msgstr "Име / Шифра"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "PvP enabled"
-msgstr "күйгүзүлгөн"
+msgstr "Туча омогућена"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Bind Address"
-msgstr ""
+msgstr "Вежи адресу"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "Configure"
-msgstr "Ырастоо"
+msgstr "Подеси"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
 #: builtin/mainmenu/tab_singleplayer.lua
 msgid "Creative Mode"
-msgstr "Жаратуу режими"
+msgstr "Слободни мод"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
 #: builtin/mainmenu/tab_singleplayer.lua
 msgid "Enable Damage"
-msgstr "Убалды күйгүзүү"
+msgstr "Омогући оштећење"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Name/Password"
-msgstr "Аты/сырсөзү"
+msgstr "Име/Шифра"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "New"
-msgstr "Жаңы"
+msgstr "Нови"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "No world created or selected!"
-msgstr ""
+msgstr "Ниједан свет није направљен или изабран!"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Port"
-msgstr ""
+msgstr "Порт"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Public"
-msgstr "Жалпылык"
+msgstr "Јавни"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "Select World:"
-msgstr "Дүйнөнү тандаңыз:"
+msgstr "Одабери свет:"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Server"
-msgstr ""
+msgstr "Сервер"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Server Port"
-msgstr ""
+msgstr "Серверски порт"
 
 #: builtin/mainmenu/tab_server.lua
-#, fuzzy
 msgid "Start Game"
-msgstr "Оюнду баштоо/туташуу"
+msgstr "Почни игру"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "2x"
-msgstr ""
+msgstr "2x"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "3D Clouds"
-msgstr "3D-булуттар"
+msgstr "3Д Облаци"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "4x"
-msgstr ""
+msgstr "4x"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "8x"
-msgstr ""
+msgstr "8x"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Advanced Settings"
-msgstr "Ырастоолор"
+msgstr "Напредне поставке"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Antialiasing:"
-msgstr ""
+msgstr "Гланчање текстура:"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Are you sure to reset your singleplayer world?"
-msgstr "Бир кишилик"
+msgstr "Да ли сте сигурни да желите да ресетујете ваш свет?"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bilinear Filter"
-msgstr "Экисызык чыпкалоосу"
+msgstr "Билинеарни филтер"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
-msgstr "Mip-текстуралоо"
+msgstr "Bump-Мапирање"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Change keys"
-msgstr "Баскычтарды өзгөртүү"
+msgstr "Промени дугмад"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Connected Glass"
-msgstr "Туташуу"
+msgstr "Спојено стакло"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Fancy Leaves"
-msgstr "Күңүрт суу"
+msgstr "Елегантно лишће"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Mipmap"
-msgstr "Mip-текстуралоо"
+msgstr "Мипмап"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Mipmap + Aniso. Filter"
-msgstr ""
+msgstr "Mipmap + Анизотропни филтер"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No"
-msgstr "Жок"
+msgstr "Не"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "No Filter"
-msgstr "Анизатропия чыпкалоосу"
+msgstr "Без филтера"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "No Mipmap"
-msgstr "Mip-текстуралоо"
+msgstr "Без Mipmap-а"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Highlighting"
-msgstr "Тегиз жарык"
+msgstr "Истицање блокова"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Outlining"
-msgstr "Тегиз жарык"
+msgstr "Обцртавање блокова"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
-msgstr ""
+msgstr "Ништа"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Normal Mapping"
-msgstr "Mip-текстуралоо"
+msgstr "Нормал-мапирање"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Opaque Leaves"
-msgstr "Күңүрт суу"
+msgstr "Непровидно лишће"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Opaque Water"
-msgstr "Күңүрт суу"
+msgstr "Непрозирна вода"
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Parallax Occlusion"
-msgstr ""
+msgstr "Parallax Occlusion Мапирање"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "Баарын күйгүзүү"
+msgstr "Честице"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Ресетуј свет"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
-msgstr "Ырастоолор"
+msgstr "Поставке"
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Shaders"
-msgstr "Көлөкөлөгүчтөр"
+msgstr "Шејдери"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Simple Leaves"
-msgstr "Күңүрт суу"
+msgstr "Једноставно лишће"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Smooth Lighting"
-msgstr "Тегиз жарык"
+msgstr "Глатко осветљење"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Texturing:"
-msgstr ""
+msgstr "Филтери за текстуре:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr ""
+msgstr "Да би се омогућили шејдери мора се користити OpenGL драјвер."
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
-#, fuzzy
 msgid "Tone Mapping"
-msgstr "Mip-текстуралоо"
+msgstr "Тонско Мапирање"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Touchthreshold (px)"
-msgstr ""
+msgstr "Праг додиривања (px)"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Trilinear Filter"
-msgstr "Үчсызык чыпкалоосу"
+msgstr "Трилинеарни филтер"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Leaves"
-msgstr "Кооз бактар"
+msgstr "Лепршајуће лишће"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Plants"
-msgstr "Кооз бактар"
+msgstr "Лепршајуће биљке"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Waving Water"
-msgstr "Кооз бактар"
+msgstr "Веслајућа вода"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Yes"
-msgstr "Ооба"
+msgstr "Да"
 
 #: builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Config mods"
-msgstr "Ырастоо"
+msgstr "Подеси модове"
 
 #: builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Main"
-msgstr "Башкы меню"
+msgstr "Главно"
 
 #: builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Start Singleplayer"
-msgstr "Бир кишилик"
+msgstr "Започни игру за једног играча"
 
 #: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
 msgid "Play"
-msgstr "Ойноо"
+msgstr "Играј"
 
 #: builtin/mainmenu/tab_singleplayer.lua
 msgid "Singleplayer"
-msgstr "Бир кишилик"
+msgstr "Један играч"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "No information available"
-msgstr ""
+msgstr "Нема доступних информација"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "Select texture pack:"
-msgstr ""
+msgstr "Одабери сет текстура:"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "Texturepacks"
-msgstr ""
+msgstr "Сетови текстура"
 
 #: src/client.cpp
-#, fuzzy
 msgid "Connection timed out."
-msgstr "Туташтыруу катасы (убактыңыз өтүп кеттиби?)"
+msgstr "Конекцији је истекло време."
 
 #: src/client.cpp
 msgid "Done!"
-msgstr ""
+msgstr "Готово!"
 
 #: src/client.cpp
 msgid "Initializing nodes"
-msgstr ""
+msgstr "Припремам блокове"
 
 #: src/client.cpp
 msgid "Initializing nodes..."
-msgstr ""
+msgstr "Припремам блокове..."
 
 #: src/client.cpp
-#, fuzzy
 msgid "Loading textures..."
-msgstr "Жүктөлүүдө..."
+msgstr "Учитавам текстуре..."
 
 #: src/client.cpp
-#, fuzzy
 msgid "Rebuilding shaders..."
-msgstr "Дареги чечилүүдө..."
+msgstr "Обнављам шејдере..."
 
 #: src/client/clientlauncher.cpp
 msgid "Connection error (timed out?)"
-msgstr "Туташтыруу катасы (убактыңыз өтүп кеттиби?)"
+msgstr "Грешка у конекцији (истекло време?)"
 
 #: src/client/clientlauncher.cpp
 msgid "Could not find or load game \""
-msgstr "Оюнду табуу же жүктөө мүмкүн эмес \""
+msgstr "Немогу пронаћи или учитати игру \""
 
 #: src/client/clientlauncher.cpp
 msgid "Invalid gamespec."
-msgstr ""
+msgstr "Неважећи gamespec."
 
 #: src/client/clientlauncher.cpp
 msgid "Main Menu"
-msgstr "Башкы меню"
+msgstr "Главни мени"
 
 #: src/client/clientlauncher.cpp
 msgid "No world selected and no address provided. Nothing to do."
-msgstr "Дүйнө тандалган жок жана дареги киргизилген жок. Кылууга эч нерсе жок."
+msgstr ""
+"Ниједан свет није изабран и ниједна адреса није дата. Немогу ништа да урадим."
 
 #: src/client/clientlauncher.cpp
 msgid "Player name too long."
-msgstr ""
+msgstr "Име играча је предуачко."
 
 #: src/client/clientlauncher.cpp
 msgid "Provided world path doesn't exist: "
-msgstr ""
+msgstr "Дата локација света не постоји: "
 
 #: src/fontengine.cpp
 msgid "needs_fallback_font"
@@ -784,33 +748,31 @@ msgid ""
 "Check debug.txt for details."
 msgstr ""
 "\n"
-"Толугураак маалымат үчүн, debug.txt'ти текшериңиз."
+"Проверите debug.txt за више детаља."
 
 #: src/game.cpp
-#, fuzzy
 msgid "Change Keys"
-msgstr "Баскычтарды өзгөртүү"
+msgstr "Подеси контроле"
 
 #: src/game.cpp
 msgid "Change Password"
-msgstr "Сырсөздү өзгөртүү"
+msgstr "Промени шифру"
 
 #: src/game.cpp
 msgid "Connecting to server..."
-msgstr "Серверге туташтырылууда..."
+msgstr "Повезујем се на сервер..."
 
 #: src/game.cpp
 msgid "Continue"
-msgstr "Улантуу"
+msgstr "Настави"
 
 #: src/game.cpp
 msgid "Creating client..."
-msgstr "Клиент жаратылууда..."
+msgstr "Правим клијента..."
 
 #: src/game.cpp
-#, fuzzy
 msgid "Creating server..."
-msgstr "Сервер жаратылууда...."
+msgstr "Правим сервер..."
 
 #: src/game.cpp
 msgid ""
@@ -826,17 +788,17 @@ msgid ""
 "- Mouse wheel: select item\n"
 "- T: chat\n"
 msgstr ""
-"Жарыяланбас башкаруу:\n"
-"- WASD: басуу\n"
-"- Боштугу: секирүү/өйдө чыгуу\n"
-"- Shift: уурданып басуу/ылдый түшүү\n"
-"- Q: буюмду таштоо\n"
-"- I: мүлк-шайман\n"
-"- Чычканы: бурулуу/кароо\n"
-"- Сол чычкан баскычы: казуу/согуу\n"
-"- Оң чычкан баскычы: коюу/колдонуу\n"
-"- Чычкан дөңгөлөгү: буюмду тандоо\n"
-"- T: маек\n"
+"Уобичајене контроле:\n"
+"- WASD: кретање\n"
+"- Space: скакање/пењање\n"
+"- Shift: шуњање/силажење\n"
+"- Q: баци ставку\n"
+"- I: инвентар\n"
+"- Миш: окретање/гледање\n"
+"- Леви клик миша: копање/ударање\n"
+"- Десни клик миша: постављање/коришћење\n"
+"- Точкић миша: одабирање ставке\n"
+"- T: причање\n"
 
 #: src/game.cpp
 msgid ""
@@ -853,80 +815,90 @@ msgid ""
 "- touch&drag, tap 2nd finger\n"
 " --> place single item to slot\n"
 msgstr ""
+"Подразумеване контроле:\n"
+"Ни један приказан мени:\n"
+"- један тап: копај\n"
+"- дупли тап: постави блок/користи\n"
+"- превуци прстом: гледај около\n"
+"Мени/Инвертар приказан:\n"
+"- дупли тап (изван):\n"
+" -->Искључи\n"
+"- додирни ствари, додирни празно место:\n"
+" --> помери ствари\n"
+"- држи и превлачи, тапни другим прстом:\n"
+" --> пребаци само једну ствар из групе\n"
 
 #: src/game.cpp
 msgid "Exit to Menu"
-msgstr "Менюга чыгуу"
+msgstr "Изађи у мени"
 
 #: src/game.cpp
 msgid "Exit to OS"
-msgstr "Оюндан чыгуу"
+msgstr "Изађи из програма"
 
 #: src/game.cpp
-#, fuzzy
 msgid "Item definitions..."
-msgstr "Буюм текстуралары..."
+msgstr "Дефиниције предмета..."
 
 #: src/game.cpp
 msgid "KiB/s"
-msgstr ""
+msgstr "КиБ/с"
 
 #: src/game.cpp
 msgid "Media..."
-msgstr ""
+msgstr "Медија..."
 
 #: src/game.cpp
 msgid "MiB/s"
-msgstr ""
+msgstr "МиБ/с"
 
 #: src/game.cpp
 msgid "Node definitions..."
-msgstr ""
+msgstr "Дефиниције блокова..."
 
 #: src/game.cpp
 msgid "Resolving address..."
-msgstr "Дареги чечилүүдө..."
+msgstr "Разлучујем адресу..."
 
 #: src/game.cpp
 msgid "Respawn"
-msgstr "Кайтадан жаралуу"
+msgstr "Врати се у живот"
 
 #: src/game.cpp
-#, fuzzy
 msgid "Shutting down..."
-msgstr "Оюн өчүрүлүүдө..."
+msgstr "Искључивање..."
 
 #: src/game.cpp
 msgid "Sound Volume"
-msgstr "Үн көлөмү"
+msgstr "Јачина звука"
 
 #: src/game.cpp
 msgid "You died."
-msgstr "Сиз өлдүңүз."
+msgstr "Умро/ла си."
 
 #: src/game.cpp src/guiFormSpecMenu.cpp
 msgid "ok"
-msgstr ""
+msgstr "уреду"
 
 #: src/guiFormSpecMenu.cpp
 msgid "Enter "
-msgstr ""
+msgstr "Уреду "
 
 #: src/guiFormSpecMenu.cpp
 msgid "Proceed"
-msgstr "Улантуу"
+msgstr "Настави"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "\"Use\" = climb down"
-msgstr ""
+msgstr "\"Користи\" = Силажење"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Backward"
-msgstr "Артка"
+msgstr "Назад"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Chat"
-msgstr "Маек"
+msgstr "Чет"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Command"
@@ -934,152 +906,157 @@ msgstr "Команда"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Console"
-msgstr "Консоль"
+msgstr "Конзола"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Double tap \"jump\" to toggle fly"
-msgstr ""
+msgstr "Дупли скок за летење"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Drop"
-msgstr "Ыргытуу"
+msgstr "Бацање"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Forward"
-msgstr "Алга"
+msgstr "Напред"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Inventory"
-msgstr "Мүлк-шайман"
+msgstr "Инвентар"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Jump"
-msgstr "Секирүү"
+msgstr "Скакање"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Key already in use"
-msgstr ""
+msgstr "Дугме се већ користи"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
 msgstr ""
+"Подешавање контрола.(Ако овај мени нешто поквари, обришите ствари из "
+"minetest.conf)"
 
 #: src/guiKeyChangeMenu.cpp src/keycode.cpp
 msgid "Left"
-msgstr "Солго"
+msgstr "Лево"
 
 #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
 msgid "Print stacks"
-msgstr ""
+msgstr "Прикажи stack-ове"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Range select"
-msgstr ""
+msgstr "Одабир домета"
 
 #: src/guiKeyChangeMenu.cpp src/keycode.cpp
 msgid "Right"
-msgstr "Оңго"
+msgstr "Десно"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Sneak"
-msgstr "Уурданып басуу"
+msgstr "Шуњање"
 
 #: src/guiKeyChangeMenu.cpp
-#, fuzzy
 msgid "Toggle Cinematic"
-msgstr "Тез басууга которуу"
+msgstr "Укључи/Искључи Cinematic мод"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle fast"
-msgstr "Тез басууга которуу"
+msgstr "Укључи/Искључи трчање"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle fly"
-msgstr "Учууга которуу"
+msgstr "Укључи/Искључи летење"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle noclip"
-msgstr ""
+msgstr "Укључи/искључи пролажење кроз препреке"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Use"
-msgstr "Колдонуу"
+msgstr "Коришћење"
+
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Зумирај"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
-msgstr "баскычты басыңыз"
+msgstr "притисните дугме"
 
 #: src/guiPasswordChange.cpp
 msgid "Change"
-msgstr "Өзгөртүү"
+msgstr "Промени"
 
 #: src/guiPasswordChange.cpp
 msgid "Confirm Password"
-msgstr "Сырсөздү аныктоо"
+msgstr "Потврди шифру"
 
 #: src/guiPasswordChange.cpp
 msgid "New Password"
-msgstr "Жаңы сырсөз"
+msgstr "Нова шифра"
 
 #: src/guiPasswordChange.cpp
 msgid "Old Password"
-msgstr "Эски сырсөз"
+msgstr "Стара шифра"
 
 #: src/guiPasswordChange.cpp
 msgid "Passwords do not match!"
-msgstr "Сырсөздөр дал келген жок!"
+msgstr "Шифре се не поклапају!"
 
 #: src/guiVolumeChange.cpp
 msgid "Exit"
-msgstr "Чыгуу"
+msgstr "Изађи"
 
 #: src/guiVolumeChange.cpp
 msgid "Sound Volume: "
-msgstr "Үн көлөмү: "
+msgstr "Јачина звука: "
 
 #: src/keycode.cpp
 msgid "Apps"
-msgstr "Тиркемелер"
+msgstr "Апликације"
 
 #: src/keycode.cpp
 msgid "Attn"
-msgstr ""
+msgstr "Аттн"
 
 #: src/keycode.cpp
 msgid "Back"
-msgstr "Артка"
+msgstr "Назад"
 
 #: src/keycode.cpp
 msgid "Capital"
-msgstr "Caps Lock"
+msgstr "Главно"
 
 #: src/keycode.cpp
 msgid "Clear"
-msgstr "Тазалоо"
+msgstr "Очисти"
 
 #: src/keycode.cpp
 msgid "Comma"
-msgstr "Үтүр"
+msgstr "Зарез"
 
 #: src/keycode.cpp
 msgid "Control"
-msgstr "Ctrl"
+msgstr "Контрола"
 
 #: src/keycode.cpp
 msgid "Convert"
-msgstr ""
+msgstr "Конвертуј"
 
 #: src/keycode.cpp
 msgid "CrSel"
-msgstr ""
+msgstr "ЦрСел"
 
 #: src/keycode.cpp
 msgid "Down"
-msgstr "Ылдый"
+msgstr "Доле"
 
 #: src/keycode.cpp
 msgid "End"
-msgstr "End"
+msgstr "Крај"
 
 #: src/keycode.cpp
 msgid "Erase OEF"
@@ -1087,7 +1064,7 @@ msgstr ""
 
 #: src/keycode.cpp
 msgid "Escape"
-msgstr "Esc"
+msgstr "Побегни"
 
 #: src/keycode.cpp
 msgid "ExSel"
@@ -1095,143 +1072,143 @@ msgstr ""
 
 #: src/keycode.cpp
 msgid "Execute"
-msgstr "Аткаруу"
+msgstr "Изврши"
 
 #: src/keycode.cpp
 msgid "Final"
-msgstr ""
+msgstr "Крајњи"
 
 #: src/keycode.cpp
 msgid "Help"
-msgstr "Жардам"
+msgstr "Помоћ"
 
 #: src/keycode.cpp
 msgid "Home"
-msgstr "Home"
+msgstr "Кућа"
 
 #: src/keycode.cpp
 msgid "Insert"
-msgstr "Insert"
+msgstr "Убаци"
 
 #: src/keycode.cpp
 msgid "Junja"
-msgstr "Junja"
+msgstr ""
 
 #: src/keycode.cpp
 msgid "Kana"
-msgstr "Кана"
+msgstr ""
 
 #: src/keycode.cpp
 msgid "Kanji"
-msgstr "Кандзи"
+msgstr ""
 
 #: src/keycode.cpp
 msgid "Left Button"
-msgstr "Сол баскыч"
+msgstr "Лево дугме"
 
 #: src/keycode.cpp
 msgid "Left Control"
-msgstr "Сол Ctrl"
+msgstr "Леви Control"
 
 #: src/keycode.cpp
 msgid "Left Menu"
-msgstr "Сол меню"
+msgstr "Леви мени"
 
 #: src/keycode.cpp
 msgid "Left Shift"
-msgstr "Сол Shift"
+msgstr "Леви Shift"
 
 #: src/keycode.cpp
 msgid "Left Windows"
-msgstr "Сол Windows"
+msgstr "Леви Windows"
 
 #: src/keycode.cpp
 msgid "Menu"
-msgstr "Меню"
+msgstr "Мени"
 
 #: src/keycode.cpp
 msgid "Middle Button"
-msgstr "Ортоңку баскыч"
+msgstr "Средње дугме"
 
 #: src/keycode.cpp
 msgid "Minus"
-msgstr "Кемитүү белгиси"
+msgstr "Минус"
 
 #: src/keycode.cpp
 msgid "Mode Change"
-msgstr "Режимди өзгөртүү"
+msgstr "Промена мода"
 
 #: src/keycode.cpp
 msgid "Next"
-msgstr "Кийинки"
+msgstr "Следеће"
 
 #: src/keycode.cpp
 msgid "Nonconvert"
-msgstr ""
+msgstr "Не конвертуј"
 
 #: src/keycode.cpp
 msgid "Num Lock"
-msgstr "Num Lock"
+msgstr "Закључавање нумеричке тастатуре"
 
 #: src/keycode.cpp
 msgid "Numpad *"
-msgstr "Кош. клав. *"
+msgstr "Нумеричка тастатура *"
 
 #: src/keycode.cpp
 msgid "Numpad +"
-msgstr "Кош. клав. +"
+msgstr "Нумеричка тастатура +"
 
 #: src/keycode.cpp
 msgid "Numpad -"
-msgstr "Кош. клав. -"
+msgstr "Нумеричка тастатура -"
 
 #: src/keycode.cpp
 msgid "Numpad /"
-msgstr "Кош. клав. /"
+msgstr "Нумеричка тастатура /"
 
 #: src/keycode.cpp
 msgid "Numpad 0"
-msgstr "Кош. клав. 0"
+msgstr "Нумеричка тастатура 0"
 
 #: src/keycode.cpp
 msgid "Numpad 1"
-msgstr "Кош. клав. 1"
+msgstr "Нумеричка тастатура 1"
 
 #: src/keycode.cpp
 msgid "Numpad 2"
-msgstr "Кош. клав. 2"
+msgstr "Нумеричка тастатура 2"
 
 #: src/keycode.cpp
 msgid "Numpad 3"
-msgstr "Кош. клав. 3"
+msgstr "Нумеричка тастатура 3"
 
 #: src/keycode.cpp
 msgid "Numpad 4"
-msgstr "Кош. клав. 4"
+msgstr "Нумеричка тастатура 4"
 
 #: src/keycode.cpp
 msgid "Numpad 5"
-msgstr "Кош. клав. 5"
+msgstr "Нумеричка тастатура 5"
 
 #: src/keycode.cpp
 msgid "Numpad 6"
-msgstr "Кош. клав. 6"
+msgstr "Нумеричка тастатура 6"
 
 #: src/keycode.cpp
 msgid "Numpad 7"
-msgstr "Кош. клав. 7"
+msgstr "Нумеричка тастатура 7"
 
 #: src/keycode.cpp
 msgid "Numpad 8"
-msgstr "Кош. клав. 8"
+msgstr "Нумеричка тастатура 8"
 
 #: src/keycode.cpp
 msgid "Numpad 9"
-msgstr "Кош. клав. 9"
+msgstr "Нумеричка тастатура 9"
 
 #: src/keycode.cpp
 msgid "OEM Clear"
-msgstr ""
+msgstr "ОЕМ очисти"
 
 #: src/keycode.cpp
 msgid "PA1"
@@ -1239,91 +1216,87 @@ msgstr ""
 
 #: src/keycode.cpp
 msgid "Pause"
-msgstr "Пауза"
+msgstr "Заустави"
 
 #: src/keycode.cpp
 msgid "Period"
-msgstr "Айланма сан"
+msgstr "Тачка"
 
 #: src/keycode.cpp
 msgid "Plus"
-msgstr "Кошуу белгиси"
+msgstr "Плус"
 
 #: src/keycode.cpp
 msgid "Print"
-msgstr "Басма"
+msgstr "Прикажи"
 
 #: src/keycode.cpp
 msgid "Prior"
-msgstr ""
+msgstr "Пре"
 
 #: src/keycode.cpp
 msgid "Return"
-msgstr ""
+msgstr "Повратак"
 
 #: src/keycode.cpp
 msgid "Right Button"
-msgstr "Оң баскыч"
+msgstr "Десно дугме"
 
 #: src/keycode.cpp
 msgid "Right Control"
-msgstr "Оң Ctrl"
+msgstr "Десни Control"
 
 #: src/keycode.cpp
 msgid "Right Menu"
-msgstr "Оң меню"
+msgstr "Десни мени"
 
 #: src/keycode.cpp
 msgid "Right Shift"
-msgstr "Оң Shift"
+msgstr "Десни Shift"
 
 #: src/keycode.cpp
 msgid "Right Windows"
-msgstr "Оң Windows"
+msgstr "Десни Windows"
 
 #: src/keycode.cpp
 msgid "Scroll Lock"
-msgstr "Scroll Lock"
+msgstr "Закључавање скроловања"
 
 #: src/keycode.cpp
 msgid "Select"
-msgstr "Тандоо"
+msgstr "Одабери"
 
 #: src/keycode.cpp
 msgid "Shift"
-msgstr "Shift"
+msgstr "Шифт"
 
 #: src/keycode.cpp
 msgid "Sleep"
-msgstr "Уйку"
+msgstr "Спавај"
 
 #: src/keycode.cpp
 msgid "Snapshot"
-msgstr "Тез сүрөт"
+msgstr ""
 
 #: src/keycode.cpp
 msgid "Space"
-msgstr "Боштук"
+msgstr "Простор"
 
 #: src/keycode.cpp
 msgid "Tab"
-msgstr "Tab"
+msgstr "Таб"
 
 #: src/keycode.cpp
 msgid "Up"
-msgstr "Өйдө"
+msgstr "Горе"
 
 #: src/keycode.cpp
 msgid "X Button 1"
-msgstr ""
+msgstr "X Дугме 1"
 
 #: src/keycode.cpp
 msgid "X Button 2"
-msgstr ""
-
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Масштаб"
+msgstr "X Дугме 2"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1333,6 +1306,12 @@ msgid ""
 "sets.\n"
 "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
 msgstr ""
+"(X,Y,Z) офсет фрактала од центра света у мерној јединици 'скала'.\n"
+"Користи се за пребацивање стартне позиције што ближе (0, 0).\n"
+"Подразумевани је добар за манделброт сетове, али мора се наместити за јулија "
+"сетове.\n"
+"Даљина је око -2 до 2. Помножити са 'скалом' да би се добио офсет у "
+"блоковима."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1341,9 +1320,8 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "3D clouds"
-msgstr "3D-булуттар"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "3D mode"
@@ -1392,6 +1370,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1420,7 +1402,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Advanced"
-msgstr "Кошумча"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Altitude Chill"
@@ -1439,9 +1421,8 @@ msgid "Amplifies the valleys"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Anisotropic filtering"
-msgstr "Анизатропия чыпкалоосу"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Announce server"
@@ -1467,9 +1448,12 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
-msgstr "Артка"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Base terrain height"
@@ -1484,28 +1468,28 @@ msgid "Basic Privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Bilinear filtering"
-msgstr "Экисызык чыпкалоосу"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Bind address"
-msgstr "Дареги чечилүүдө..."
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Bits per pixel (aka color depth) in fullscreen mode."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Build inside player"
-msgstr "Көп кишилик"
+msgstr "Градња унутар играча"
+
+#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Bumpmapping"
-msgstr "Mip-текстуралоо"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Camera smoothing"
@@ -1536,14 +1520,17 @@ msgid "Caves and tunnels form at the intersection of the two noises"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Chat key"
-msgstr "Баскычтарды өзгөртүү"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Chat toggle key"
-msgstr "Баскычтарды өзгөртүү"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Команда"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1573,14 +1560,12 @@ msgid "Chunk size"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Cinematic mode"
-msgstr "Жаратуу режими"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Cinematic mode key"
-msgstr "Жаратуу режими"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Clean transparent textures"
@@ -1603,18 +1588,16 @@ msgid "Cloud radius"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Clouds"
-msgstr "3D-булуттар"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Clouds are a client side effect."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Clouds in menu"
-msgstr "Башкы меню"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Colored fog"
@@ -1622,49 +1605,43 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Command key"
-msgstr "Команда"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Connect glass"
-msgstr "Туташуу"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Connect to external media server"
-msgstr "Серверге туташтырылууда..."
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Connects glass if supported by node."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Console alpha"
-msgstr "Консоль"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Console color"
-msgstr "Консоль"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Console key"
-msgstr "Консоль"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward"
@@ -1675,9 +1652,8 @@ msgid "Continuous forward movement (only used for testing)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Controls"
-msgstr "Ctrl"
+msgstr "Контроле"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1745,9 +1721,8 @@ msgid "DPI"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Damage"
-msgstr "Убалды күйгүзүү"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Debug info toggle key"
@@ -1776,15 +1751,18 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Default password"
-msgstr "Жаңы сырсөз"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Default privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1801,6 +1779,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1831,24 +1813,27 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Disable anticheat"
-msgstr "Бөлүкчөлөрдү күйгүзүү"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
@@ -1875,9 +1860,12 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
-msgstr "Баарын күйгүзүү"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Enable mod security"
@@ -1938,14 +1926,12 @@ msgid "Enables caching of facedir rotated meshes."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Enables filmic tone mapping"
-msgstr "Убалды күйгүзүү"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Enables minimap."
-msgstr "Убалды күйгүзүү"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1960,6 +1946,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2007,7 +2001,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Fast movement"
-msgstr ""
+msgstr "Брзо кретање"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2020,10 +2014,23 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Играч је у могућности д лети без утицаја гравитације.\n"
+"Ово захтева \"fly\" привилегију на серверима."
+
+#: src/settings_translation_file.cpp
 msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
@@ -2046,9 +2053,8 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Filtering"
-msgstr "Анизатропия чыпкалоосу"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Fixed map seed"
@@ -2060,7 +2066,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Flying"
-msgstr ""
+msgstr "Летење"
 
 #: src/settings_translation_file.cpp
 msgid "Fog"
@@ -2099,9 +2105,8 @@ msgid "Format of screenshots."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Forward key"
-msgstr "Алга"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Freetype fonts"
@@ -2160,12 +2165,14 @@ msgid "Generate normalmaps"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2196,6 +2203,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2224,15 +2240,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2304,6 +2311,8 @@ msgid ""
 "you stand.\n"
 "This is helpful when working with nodeboxes in small areas."
 msgstr ""
+"Ако је укључено, можете стављати блокове унутар позиције где стојите.\n"
+"Ово је корисно при раду са nodebox-евима у малим местима."
 
 #: src/settings_translation_file.cpp
 msgid "If this is set, players will always (re)spawn at the given position."
@@ -2314,9 +2323,8 @@ msgid "Ignore world errors"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "In-Game"
-msgstr "Оюн"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
@@ -2327,6 +2335,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2339,9 +2381,8 @@ msgid "Inventory items animations"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Inventory key"
-msgstr "Мүлк-шайман"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Invert mouse"
@@ -2362,6 +2403,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2391,9 +2440,8 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Jump key"
-msgstr "Секирүү"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Jumping speed"
@@ -2522,6 +2570,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2557,7 +2612,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2633,9 +2688,8 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Left key"
-msgstr "Сол меню"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2709,18 +2763,31 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Main menu mod manager"
-msgstr "Башкы меню"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Main menu script"
-msgstr "Башкы меню"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2743,8 +2810,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2754,8 +2819,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2766,8 +2829,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2777,8 +2838,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3137,6 +3196,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3178,17 +3245,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3200,13 +3271,8 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Menus"
-msgstr "Меню"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Mesh cache"
@@ -3241,12 +3307,7 @@ msgid "Minimum texture size for filters"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mipmapping"
-msgstr "Mip-текстуралоо"
-
-#: src/settings_translation_file.cpp
-msgid "Mod profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3430,6 +3491,8 @@ msgid ""
 "Player is able to fly without being affected by gravity.\n"
 "This requires the \"fly\" privilege on the server."
 msgstr ""
+"Играч је у могућности д лети без утицаја гравитације.\n"
+"Ово захтева \"fly\" привилегију на серверима."
 
 #: src/settings_translation_file.cpp
 msgid "Player name"
@@ -3454,11 +3517,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3466,7 +3535,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3502,8 +3571,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Report path"
+msgstr "Одабери локацију"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
-msgstr "Оң меню"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Rightclick repetition interval"
@@ -3559,23 +3632,20 @@ msgid "Screen width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot"
-msgstr "Тез сүрөт"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot folder"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot format"
-msgstr "Тез сүрөт"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot quality"
-msgstr "Тез сүрөт"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3605,9 +3675,8 @@ msgid "Selection box width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Server / Singleplayer"
-msgstr "Бир кишилик"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Server URL"
@@ -3630,14 +3699,12 @@ msgid "Server port"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Serverlist URL"
-msgstr "Жалпылык серверлердин тизмеси:"
+msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Serverlist file"
-msgstr "Жалпылык серверлердин тизмеси:"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3665,7 +3732,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3697,13 +3764,12 @@ msgid "Slope and fill work together to modify the heights"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Smooth lighting"
-msgstr "Тегиз жарык"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3716,9 +3782,8 @@ msgid "Smooths rotation of camera. 0 to disable."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Sneak key"
-msgstr "Уурданып басуу"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Sound"
@@ -3783,10 +3848,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3802,6 +3879,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3817,6 +3900,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3864,9 +3953,8 @@ msgid "Tooltip delay"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Trilinear filtering"
-msgstr "Үчсызык чыпкалоосу"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3908,9 +3996,8 @@ msgid "Use bilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Use key"
-msgstr "баскычты басыңыз"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Use mip mapping to scale textures. May slightly increase performance."
@@ -3921,10 +4008,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -3983,9 +4066,8 @@ msgid "Viewing range"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Volume"
-msgstr "Үн көлөмү"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4000,9 +4082,8 @@ msgid "Walking speed"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Water Features"
-msgstr "Буюм текстуралары..."
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
@@ -4017,9 +4098,8 @@ msgid "Waving Nodes"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving leaves"
-msgstr "Кооз бактар"
+msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Waving plants"
@@ -4053,7 +4133,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4152,102 +4232,3 @@ msgstr ""
 #: src/settings_translation_file.cpp
 msgid "cURL timeout"
 msgstr ""
-
-#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Жүктөлүүдө..."
-
-#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Ылдый"
-
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Сол баскычы: Бардык буюмдарды ташуу, Оң баскычы: Бир буюмду ташуу"
-
-#~ msgid "is required by:"
-#~ msgstr "талап кылынганы:"
-
-#~ msgid "Configuration saved.  "
-#~ msgstr "Конфигурация сакталды.  "
-
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Эскертүү: Туура эмес конфигурация.  "
-
-#~ msgid "Show Public"
-#~ msgstr "Жалпылыкты көрсөтүү"
-
-#~ msgid "Show Favorites"
-#~ msgstr "Тандалмаларды көрсөтүү"
-
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Жергиликтүү серверди жүргүзүү үчүн даректи бош калтырыңыз."
-
-#~ msgid "Create world"
-#~ msgstr "Дүйнөнү жаратуу"
-
-#~ msgid "Address required."
-#~ msgstr "Дареги талап кылынат."
-
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Дүнөнү жаратуу мүмкүн эмес: Эч нерсе тандалган жок"
-
-#~ msgid "Files to be deleted"
-#~ msgstr "Өчүрүлө турган файлдар"
-
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Дүйнөнү жаратуу мүмкүн эмес: Оюндар табылган жок"
-
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Дүйнөнү ырастоо мүмкүн эмес: Эч нерсе тандалган жок"
-
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Бардык дүйнө файлдарын өчүрүү оңунан чыккан жок"
-
-#~ msgid ""
-#~ "Default Controls:\n"
-#~ "- WASD: Walk\n"
-#~ "- Mouse left: dig/hit\n"
-#~ "- Mouse right: place/use\n"
-#~ "- Mouse wheel: select item\n"
-#~ "- 0...9: select item\n"
-#~ "- Shift: sneak\n"
-#~ "- R: Toggle viewing all loaded chunks\n"
-#~ "- I: Inventory menu\n"
-#~ "- ESC: This menu\n"
-#~ "- T: Chat\n"
-#~ msgstr ""
-#~ "Жарыяланбас башкаруу:\n"
-#~ "- WASD: Басуу\n"
-#~ "- Сол кнопкасы: казуу/согуу\n"
-#~ "- Оң кнопкасы: коюу/колдонуу\n"
-#~ "- Чычкан дөңгөлөгү: буюмду тандоо\n"
-#~ "- 0...9: буюмду тандоо\n"
-#~ "- Shift: уурданып басуу\n"
-#~ "- R: алыс кароо\n"
-#~ "- I: мүлк-шайман\n"
-#~ "- ESC: бул меню\n"
-#~ "- T: маек\n"
-
-#, fuzzy
-#~ msgid "Finite Liquid"
-#~ msgstr "Чектүү суюктук"
-
-#, fuzzy
-#~ msgid "Password"
-#~ msgstr "Эски сырсөз"
-
-#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Оюн"
-
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "күйгүзүлгөн"
-
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Баарын өчүрүү"
-
-#, fuzzy
-#~ msgid "Public Serverlist"
-#~ msgstr "Жалпылык серверлердин тизмеси:"
diff --git a/po/ru/minetest.po b/po/sw/minetest.po
similarity index 60%
copy from po/ru/minetest.po
copy to po/sw/minetest.po
index d281939..abf0da2 100644
--- a/po/ru/minetest.po
+++ b/po/sw/minetest.po
@@ -1,77 +1,70 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
-#
 msgid ""
 msgstr ""
-"Project-Id-Version: minetest\n"
+"Project-Id-Version: Minetest Translate\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-04-18 23:08+0000\n"
-"Last-Translator: Stas Kies <stask85 at gmail.com>\n"
-"Language-Team: Russian <https://hosted.weblate.org/projects/minetest/"
-"minetest/ru/>\n"
-"Language: ru\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-03 05:13+0000\n"
+"Last-Translator: Eidy <JulianBiddle at practicalcybernetics.com>\n"
+"Language-Team: Swahili <https://hosted.weblate.org/projects/minetest/"
+"minetest/sw/>\n"
+"Language: sw\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.9-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
-msgstr "Ошибка в скрипте Lua, как например в моде:"
+msgstr "Kosa limetokea katika hati Lua, kama vile Moduli na:"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured:"
-msgstr "Произошла ошибка:"
+msgstr "Kosa limetokea:"
 
 #: builtin/fstk/ui.lua
 msgid "Main menu"
-msgstr "Главное меню"
+msgstr "Menyu kuu"
 
 #: builtin/fstk/ui.lua builtin/mainmenu/store.lua
 msgid "Ok"
-msgstr "OK"
+msgstr "Sawa kabisa"
 
 #: builtin/fstk/ui.lua
 msgid "Reconnect"
-msgstr "Переподключиться"
+msgstr "Unganisha upya"
 
 #: builtin/fstk/ui.lua
 msgid "The server has requested a reconnect:"
-msgstr "Сервер запросил переподключение:"
+msgstr "Seva imeomba na Unganisha upya:"
 
 #: builtin/mainmenu/common.lua src/game.cpp
 msgid "Loading..."
-msgstr "Загрузка..."
+msgstr "Inapakia..."
 
 #: builtin/mainmenu/common.lua
 msgid "Protocol version mismatch. "
-msgstr "Несоответствие версии протокола. "
+msgstr "Itifaki ya toleo haifanani."
 
 #: builtin/mainmenu/common.lua
 msgid "Server enforces protocol version $1. "
-msgstr "Сервер обеспечивает соблюдение версии протокола $ 1. "
+msgstr "Seva anahimiza itifaki toleo $1."
 
 #: builtin/mainmenu/common.lua
 msgid "Server supports protocol versions between $1 and $2. "
-msgstr "Сервер поддерживает версии протокола между $1 и $2. "
+msgstr "Seva inasaidia matoleo ya itifaki kati ya $1 na $2."
 
 #: builtin/mainmenu/common.lua
 msgid "Try reenabling public serverlist and check your internet connection."
-msgstr ""
-"Попробуйте обновить список публичных серверов и проверьте связь с Интернетом."
+msgstr "Jaribu reenabling serverlist umma na Kagua muunganisho wako wa tovuti."
 
 #: builtin/mainmenu/common.lua
 msgid "We only support protocol version $1."
-msgstr "Поддерживается только протокол версии $1."
+msgstr "Sisi tu mkono itifaki toleo la $1."
 
 #: builtin/mainmenu/common.lua
 msgid "We support protocol versions between version $1 and $2."
-msgstr "Мы поддерживаем версии протоколов между $1 и $2."
+msgstr "Tunaunga mkono matoleo ya itifaki kati ya toleo la $1 na $2."
 
 #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -79,220 +72,216 @@ msgstr "Мы поддерживаем версии протоколов межд
 #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
 #: src/keycode.cpp
 msgid "Cancel"
-msgstr "Отменить"
+msgstr "Katisha"
 
 #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua
 msgid "Depends:"
-msgstr "Зависит от:"
+msgstr "Inategemea:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Disable MP"
-msgstr "Отключить мультиплеер"
+msgstr "Lemaza MP"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Enable MP"
-msgstr "Включить мультиплеер"
+msgstr "Wezesha MP"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Enable all"
-msgstr "Включить всё"
+msgstr "Wezesha yote"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid ""
 "Failed to enable mod \"$1\" as it contains disallowed characters. Only "
 "chararacters [a-z0-9_] are allowed."
 msgstr ""
-"Ошибка при попытке включения мода \"$1\" поскольку он содержит недопустимые "
-"символы. Допускается использование символов от Aa-Zz и от 0-9."
+"Ilishindwa kuwezesha Moduli \"$1\" kama lina vibambo ilipopiga. Tu "
+"chararacters [a-z0-9_] wanaruhusiwa."
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide Game"
-msgstr "Скрыть игру"
+msgstr "Ficha mchezo"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Hide mp content"
-msgstr "Скрыть содержимое модпака"
+msgstr "Ficha maudhui ya mbunge"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Mod:"
-msgstr "Мод:"
+msgstr "Moduli:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
 msgid "Save"
-msgstr "Сохранить"
+msgstr "Hifadhi"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "World:"
-msgstr "Мир:"
+msgstr "Ulimwengu:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "enabled"
-msgstr "включено"
+msgstr "kuwezeshwa"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "A world named \"$1\" already exists"
-msgstr "Мир под названием \"$1\" уже существует"
+msgstr "Ulimwengu inayoitwa \"$1\" tayari ipo"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Create"
-msgstr "Создать"
+msgstr "Kuunda"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Скачайте мини-игры, такие как minetest_game, на minetest.net"
+msgstr "Pakua subgame, kama vile minetest_game, kutoka minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Download one from minetest.net"
-msgstr "Загрузите их с minetest.net"
+msgstr "Pakua moja kutoka minetest.net"
 
 #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
 msgid "Game"
-msgstr "Игра"
+msgstr "Mchezo"
 
 #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
 msgid "Mapgen"
-msgstr "Генератор карты"
+msgstr "Mwandishi ramani"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "No worldname given or no game selected"
-msgstr "Не задано имя мира или не выбрана игра"
+msgstr "Hakuna worldname kupewa au mchezo hakuna iliyoteuliwa"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Seed"
-msgstr "Сид"
+msgstr "Mbegu"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "Warning: The minimal development test is meant for developers."
-msgstr ""
-"Внимание: \"Minimal development test\" в основном предназначен для "
-"разработчиков."
+msgstr "Tahadhari: Mtihani wa maendeleo ndogo ni maana kwa watengenezaji."
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "World name"
-msgstr "Название мира"
+msgstr "Jina la ulimwengu"
 
 #: builtin/mainmenu/dlg_create_world.lua
 msgid "You have no subgames installed."
-msgstr "У вас не установлены мини-игры."
+msgstr "Una subgames hakuna imewekwa."
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Are you sure you want to delete \"$1\"?"
-msgstr "Уверены, что хотите удалить \"$1\"?"
+msgstr "Una uhakika unataka kufuta \"$1\"?"
 
 #: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 #: src/keycode.cpp
 msgid "Delete"
-msgstr "Удалить"
+msgstr "Futa"
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Modmgr: failed to delete \"$1\""
-msgstr "Modmgr: невозможно удалить \"$1\""
+msgstr "Modmgr: imeshindwa kufuta \"$1\""
 
 #: builtin/mainmenu/dlg_delete_mod.lua
 msgid "Modmgr: invalid modpath \"$1\""
-msgstr "Modmgr: неправильный путь \"$1\""
+msgstr "Modmgr: batili modpath \"$1\""
 
 #: builtin/mainmenu/dlg_delete_world.lua
 msgid "Delete World \"$1\"?"
-msgstr "Удалить мир \"$1\"?"
+msgstr "Futa ulimwengu \"$1\"?"
 
 #: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp
 msgid "Accept"
-msgstr "Принять"
+msgstr "Kukubali"
 
 #: builtin/mainmenu/dlg_rename_modpack.lua
 msgid "Rename Modpack:"
-msgstr "Переименовать модпак:"
+msgstr "Ita jina jipya Modpack:"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "\"$1\" is not a valid flag."
-msgstr "\"$1\" не является валидным флагом."
+msgstr "\"$1\" si bendera halali."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "(No description of setting given)"
-msgstr "(Отсутствует описание настройки)"
+msgstr "(Hakuna maelezo ya kuweka kupewa)"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "< Back to Settings page"
-msgstr "< Назад к странице Настройки"
+msgstr ""
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Browse"
-msgstr "Выбрать"
+msgstr "Vinjari"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Disabled"
-msgstr "Отключено"
+msgstr "Walemavu"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Edit"
-msgstr "Редактировать"
+msgstr "Hariri"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Enabled"
-msgstr "Включено"
+msgstr "Kuwezeshwa"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Format is 3 numbers separated by commas and inside brackets."
-msgstr "Формат 3 цифры через запятую в скобках."
+msgstr "Umbizo ni namba 3 limegawanywa na mikato na ndani ya mabano."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid ""
 "Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
 "<octaves>, <persistence>"
 msgstr ""
-"Формат: <Смещение>,<Масштаб>, (<По оси X>,<По оси Y>,<По оси Z>), <Зерно>, "
-"<Октавы>,<Постоянство>"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Games"
-msgstr "Игры"
+msgstr "Michezo"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
 msgid "Mods"
-msgstr "Моды"
+msgstr "Mods"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Optionally the lacunarity can be appended with a leading comma."
-msgstr "Опционально лакунарностью могут быть добавлены с ведущей запятой."
+msgstr "Hiari ya lacunarity unaweza umeongezewa na mkato kuongoza."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a comma seperated list of flags."
-msgstr "Пожалуйста, вводите запятые для разделения списка флагов."
+msgstr "Tafadhali ingiza mkato seperated orodha ya bendera."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a valid integer."
-msgstr "Введите допустимое целое число."
+msgstr "Tafadhali ingiza namba kamili halali."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Please enter a valid number."
-msgstr "Пожалуйста, введите правильное число."
+msgstr "Tafadhali ingiza namba halali."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Possible values are: "
-msgstr "Возможные значения: "
+msgstr "Thamani inayofaa ni:"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Restore Default"
-msgstr "Восстановить по умолчанию"
+msgstr "Rejesha chaguo-msingi"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Select path"
-msgstr "Выбрать путь"
+msgstr "Teua njia"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "Show technical names"
-msgstr "Отобразить технические названия"
+msgstr "Onyesha majina ya kiufundi"
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "The value must be greater than $1."
-msgstr "Значение должно быть больше, чем $1."
+msgstr "Thamani lazima iwe kubwa kuliko $1."
 
 #: builtin/mainmenu/dlg_settings_advanced.lua
 msgid "The value must be lower than $1."
-msgstr "Значение должно быть меньше, чем $1."
+msgstr "Thamani lazima iwe chini kuliko $1."
 
 #: builtin/mainmenu/modmgr.lua
 msgid ""
@@ -300,451 +289,445 @@ msgid ""
 "Install Mod: unsupported filetype \"$1\" or broken archive"
 msgstr ""
 "\n"
-"Установка мода: неподдерживаемый тип файла \"$1\" или повреждённый архив"
+"Sakinisha Moduli: filetype visivyotegemezwa \"$1\" au nyaraka kuvunjwa"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Failed to install $1 to $2"
-msgstr "Невозможно установить $1 в $2"
+msgstr "Imeshindwa kusakinisha $1 hadi $2"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: file: \"$1\""
-msgstr "Установка мода: файл \"$1\""
+msgstr "Sakinisha Moduli: faili: \"$1\""
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: unable to find real modname for: $1"
-msgstr "Установка мода: невозможно определить название мода для $1"
+msgstr "Sakinisha Moduli: haiwezi kupata modname halisi kwa: $1"
 
 #: builtin/mainmenu/modmgr.lua
 msgid "Install Mod: unable to find suitable foldername for modpack $1"
 msgstr ""
-"Установка мода: невозможно найти подходящее имя директории для модпака $1"
+"Sakinisha Moduli: haiwezi kupata foldername ya kufaa kwa ajili ya modpack $1"
 
 #: builtin/mainmenu/store.lua
 msgid "Close store"
-msgstr "Закрыть хранилище"
+msgstr "Duka la karibu"
 
 #: builtin/mainmenu/store.lua
 msgid "Downloading $1, please wait..."
-msgstr "Загрузка $1, ждите..."
+msgstr "Inapakua $1, Tafadhali subiri..."
 
 #: builtin/mainmenu/store.lua
 msgid "Install"
-msgstr "Установить"
+msgstr "Sakinisha"
 
 #: builtin/mainmenu/store.lua
 msgid "Page $1 of $2"
-msgstr "Страница $1 из $2"
+msgstr "Ukurasa $1 ya $2"
 
 #: builtin/mainmenu/store.lua
 msgid "Rating"
-msgstr "Рейтинг"
+msgstr "Makadirio"
 
 #: builtin/mainmenu/store.lua
 msgid "Search"
-msgstr "Поиск"
+msgstr "Utafutaji"
 
 #: builtin/mainmenu/store.lua
 msgid "Shortname:"
-msgstr "Краткое имя:"
+msgstr "Shortname:"
 
 #: builtin/mainmenu/store.lua
 msgid "Successfully installed:"
-msgstr "Успешно установлено:"
+msgstr "Imefanikiwa kusakinisha:"
 
 #: builtin/mainmenu/store.lua
 msgid "Unsorted"
-msgstr "Не сортировано"
+msgstr "Zisizochambuliwa"
 
 #: builtin/mainmenu/store.lua
 msgid "re-Install"
-msgstr "Переустановить"
+msgstr "Sakinisha upya"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Active Contributors"
-msgstr "Активные контрибьюторы"
+msgstr "Wachangiaji amilifu"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Core Developers"
-msgstr "Основные разработчики"
+msgstr "Watengenezaji wa msingi"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Credits"
-msgstr "Благодарности"
+msgstr "Mikopo"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Previous Contributors"
-msgstr "Контрибьюторы в отставке"
+msgstr "Wachangiaji wa awali"
 
 #: builtin/mainmenu/tab_credits.lua
 msgid "Previous Core Developers"
-msgstr "Разработчики в отставке"
+msgstr "Awali msingi watengenezaji"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Installed Mods:"
-msgstr "Установленные моды:"
+msgstr "Mods zilizosakinishwa:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Mod information:"
-msgstr "Описание мода:"
+msgstr "Taarifa Moduli:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "No mod description available"
-msgstr "Описание мода недоступно"
+msgstr "Hakuna maelezo Moduli inapatikana"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Rename"
-msgstr "Переименовать"
+msgstr "Ita jina jipya"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Select Mod File:"
-msgstr "Выберите файл мода:"
+msgstr "Teua faili ya Moduli:"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Uninstall selected mod"
-msgstr "Удалить выбранный мод"
+msgstr "Sakinusha Moduli teuliwa"
 
 #: builtin/mainmenu/tab_mods.lua
 msgid "Uninstall selected modpack"
-msgstr "Удалить выбранный мод-пак"
+msgstr "Sakinusha modpack teuliwa"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "Адрес / Порт:"
+msgstr "Kushughulikia / bandari"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
-msgstr "Клиент"
+msgstr "Mteja"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Connect"
-msgstr "Подключиться"
+msgstr "Kuunganisha"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Creative mode"
-msgstr "Режим творчества"
+msgstr "Hali ya ubunifu"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Damage enabled"
-msgstr "Разрешить увечья"
+msgstr "Uharibifu kuwezeshwa"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Del. Favorite"
-msgstr "Избранное:"
+msgstr "Del. kipendwa"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Favorite"
-msgstr "Избранное:"
+msgstr "Kipendwa"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "Имя / Пароль:"
+msgstr "Jina / nenosiri"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
-msgstr "PvP разрешён"
+msgstr "PvP kuwezeshwa"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Bind Address"
-msgstr "Адрес"
+msgstr "Kumfunga anwani"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "Configure"
-msgstr "Настроить"
+msgstr "Sanidi"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
 #: builtin/mainmenu/tab_singleplayer.lua
 msgid "Creative Mode"
-msgstr "Режим творчества"
+msgstr "Hali ya ubunifu"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
 #: builtin/mainmenu/tab_singleplayer.lua
 msgid "Enable Damage"
-msgstr "Разрешить увечья"
+msgstr "Wezesha uharibifu"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Name/Password"
-msgstr "Имя / Пароль"
+msgstr "Jina/nenosiri"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "New"
-msgstr "Новый"
+msgstr "Mpya"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "No world created or selected!"
-msgstr "Не выбран мир!"
+msgstr "Duniani hakuna kuundwa au kuteuliwa!"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Port"
-msgstr "Порт"
+msgstr "Bandari"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Public"
-msgstr "Публичные"
+msgstr "Umma"
 
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
 msgid "Select World:"
-msgstr "Выберите мир:"
+msgstr "Teua ulimwengu:"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Server"
-msgstr "Сервер"
+msgstr "Seva"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Server Port"
-msgstr "Порт сервера"
+msgstr "Kituo tarishi cha seva"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Start Game"
-msgstr "Начать игру"
+msgstr "Anzisha mchezo"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "2x"
-msgstr "2x"
+msgstr "2 x"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "3D Clouds"
-msgstr "3D облака"
+msgstr "Mawingu ya 3D"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "4x"
-msgstr "4x"
+msgstr "4 x"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "8x"
-msgstr "8x"
+msgstr "8 x"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Advanced Settings"
-msgstr "расширенные настройки"
+msgstr "Vipimo pevu"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Antialiasing:"
-msgstr "Сглаживание:"
+msgstr "Antialiasing:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Are you sure to reset your singleplayer world?"
-msgstr "Уверены, что хотите сбросить мир одиночной игры?"
+msgstr "Je, una hakika upya ulimwengu wako singleplayer?"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Bilinear Filter"
-msgstr "Билинейная фильтрация"
+msgstr "Kichujio bilinear"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
-msgstr "Бампмаппинг"
+msgstr "Mapema ramani"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Change keys"
-msgstr "Смена управления"
+msgstr "Badilisha funguo"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Connected Glass"
-msgstr "Стёкла без швов"
+msgstr "Kioo kushikamana"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Fancy Leaves"
-msgstr "Красивая листва"
+msgstr "Majani ya dhana"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Mipmap"
-msgstr "Мипмаппинг"
+msgstr "Mipmap"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Mipmap + Aniso. Filter"
-msgstr "Мипмаппинг с анизотр. фильтром"
+msgstr "Mipmap + Aniso. Kichujio"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No"
-msgstr "Нет"
+msgstr "La"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No Filter"
-msgstr "Без Фильтров"
+msgstr "Kichujio hakuna"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No Mipmap"
-msgstr "Без Мипмаппинга"
+msgstr "Hakuna Mipmap"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Highlighting"
-msgstr "Подсветка нод"
+msgstr "Fundo udhulisho"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Outlining"
-msgstr "Подсветка нод"
+msgstr "Fundo Ufupisho"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
-msgstr "Ничего"
+msgstr "Hakuna"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Normal Mapping"
-msgstr "Mip-текстурирование (Мип-маппинг)"
+msgstr "Ramani ya kawaida"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
-msgstr "Непрозрачная листва"
+msgstr "Majani opaque"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Water"
-msgstr "Непрозрачная вода"
+msgstr "Maji opaque"
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Parallax Occlusion"
 msgstr "Parallax Occlusion"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "Включить частицы"
+msgstr "Chembe"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Weka upya singleplayer ulimwengu"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
-msgstr "Настройки"
+msgstr "Vipimo vya"
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
 msgid "Shaders"
-msgstr "Шейдеры"
+msgstr "Shaders"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Simple Leaves"
-msgstr "Упрощённая листва"
+msgstr "Rahisi majani"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Smooth Lighting"
-msgstr "Мягкое освещение"
+msgstr "Taa laini"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Texturing:"
-msgstr "Текстурирование:"
+msgstr "Texturing:"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "Для включения шейдеров необходим драйвер OpenGL."
+msgstr "Ili kuwezesha shaders OpenGL ya kiendeshaji inahitaji kutumiwa."
 
 #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
-#, fuzzy
 msgid "Tone Mapping"
-msgstr "Mip-текстурирование (Мип-маппинг)"
+msgstr "Ramani ya toni"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Touchthreshold (px)"
-msgstr "Чувствительность (пк)"
+msgstr "Touchthreshold (px)"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Trilinear Filter"
-msgstr "Трилинейная фильтрация"
+msgstr "Kichujio trilinear"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Waving Leaves"
-msgstr "Покачивание листвы"
+msgstr "Waving majani"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Waving Plants"
-msgstr "Покачивание растений"
+msgstr "Waving mimea"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Waving Water"
-msgstr "Волны на воде"
+msgstr "Waving maji"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Yes"
-msgstr "Да"
+msgstr "Ndio"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Config mods"
-msgstr "Настройка модов"
+msgstr "Mods Now"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Main"
-msgstr "Главное меню"
+msgstr "Kuu"
 
 #: builtin/mainmenu/tab_simple_main.lua
 msgid "Start Singleplayer"
-msgstr "Начать одиночную игру"
+msgstr "Kuanza Singleplayer"
 
 #: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
 msgid "Play"
-msgstr "Играть"
+msgstr "Kucheza"
 
 #: builtin/mainmenu/tab_singleplayer.lua
 msgid "Singleplayer"
-msgstr "Одиночная игра"
+msgstr "Singleplayer"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "No information available"
-msgstr "Описание отсутствует"
+msgstr "Hakuna taarifa zilizopo"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "Select texture pack:"
-msgstr "Выберите пакет текстур:"
+msgstr "Chagua Kipeto cha unamu:"
 
 #: builtin/mainmenu/tab_texturepacks.lua
 msgid "Texturepacks"
-msgstr "Пакеты текстур"
+msgstr "Texturepacks"
 
 #: src/client.cpp
 msgid "Connection timed out."
-msgstr "Тайм-аут соединения."
+msgstr "Muunganisho limekatika."
 
 #: src/client.cpp
 msgid "Done!"
-msgstr "Готово!"
+msgstr "Kufanyika!"
 
 #: src/client.cpp
 msgid "Initializing nodes"
-msgstr "Инициирование нод"
+msgstr "Inaanzilisha fundo"
 
 #: src/client.cpp
 msgid "Initializing nodes..."
-msgstr "Инициирование нод..."
+msgstr "Inaanzilisha fundo..."
 
 #: src/client.cpp
 msgid "Loading textures..."
-msgstr "Загрузка текстур..."
+msgstr "Kupakia unamu..."
 
 #: src/client.cpp
 msgid "Rebuilding shaders..."
-msgstr "Сборка шейдеров..."
+msgstr "Kuijenga upya shaders..."
 
 #: src/client/clientlauncher.cpp
 msgid "Connection error (timed out?)"
-msgstr "Ошибка соединения (таймаут?)"
+msgstr "Kosa la muunganisho (wakati muafaka?)"
 
 #: src/client/clientlauncher.cpp
 msgid "Could not find or load game \""
-msgstr "Невозможно найти или загрузить игру \""
+msgstr "Haikuweza kupata wala kupakia mchezo\""
 
 #: src/client/clientlauncher.cpp
 msgid "Invalid gamespec."
-msgstr "Неправильная конфигурация игры."
+msgstr "Gamespec batili."
 
 #: src/client/clientlauncher.cpp
 msgid "Main Menu"
-msgstr "Главное меню"
+msgstr "Menyu kuu"
 
 #: src/client/clientlauncher.cpp
 msgid "No world selected and no address provided. Nothing to do."
-msgstr "Не выбран мир и не введен адрес. Нечего делать."
+msgstr ""
+"Duniani hakuna iliyoteuliwa na hakuna anwani iliyotolewa. Kitu cha kufanya."
 
 #: src/client/clientlauncher.cpp
 msgid "Player name too long."
-msgstr "Имя игрока слишком длинное."
+msgstr "Mchezaji jina refu."
 
 #: src/client/clientlauncher.cpp
 msgid "Provided world path doesn't exist: "
-msgstr "По этому пути мира нет: "
+msgstr "Njia ya dunia iliyotolewa haipo:"
 
 #: src/fontengine.cpp
-#, fuzzy
 msgid "needs_fallback_font"
 msgstr "no"
 
@@ -754,31 +737,31 @@ msgid ""
 "Check debug.txt for details."
 msgstr ""
 "\n"
-"Подробная информация в debug.txt."
+"Angalia debug.txt kwa maelezo."
 
 #: src/game.cpp
 msgid "Change Keys"
-msgstr "Смена управления"
+msgstr "Badilisha funguo"
 
 #: src/game.cpp
 msgid "Change Password"
-msgstr "Изменить пароль"
+msgstr "Badilisha nywila"
 
 #: src/game.cpp
 msgid "Connecting to server..."
-msgstr "Подключение к серверу..."
+msgstr "Inaunganisha seva..."
 
 #: src/game.cpp
 msgid "Continue"
-msgstr "Продолжить"
+msgstr "Kuendelea"
 
 #: src/game.cpp
 msgid "Creating client..."
-msgstr "Создание клиента..."
+msgstr "Inaunda mteja..."
 
 #: src/game.cpp
 msgid "Creating server..."
-msgstr "Создание сервера..."
+msgstr "Inaunda seva..."
 
 #: src/game.cpp
 msgid ""
@@ -794,17 +777,17 @@ msgid ""
 "- Mouse wheel: select item\n"
 "- T: chat\n"
 msgstr ""
-"Управление по умолчанию:\n"
-"- WASD: движение\n"
-"- Пробел: прыжок/вверх\n"
-"- Shift: красться/вниз\n"
-"- Q: бросить предмет\n"
-"- I: инвентарь\n"
-"- Мышка: поворот\n"
-"- ЛКМ: копать/удар\n"
-"- ПКМ: поставить/использовать\n"
-"- Колесико мыши: выбор предмета\n"
-"- T: чат\n"
+"Vidhibiti vya chaguo-msingi:\n"
+"-WASD: hoja\n"
+"- nafasi: kuruka/kupanda\n"
+"- Hamisha:taarifa/kwenda chini\n"
+"- q: tone kipengee\n"
+"- nikasema hesabu\n"
+"- kipanya: kugeuka/kuangalia\n"
+"- kipanya kushoto: kuchimba/punch\n"
+"- kipanya kulia: mahali/matumizi\n"
+"- kipanya gurudumu: Teua kipengee\n"
+"- T: mazungumzo\n"
 
 #: src/game.cpp
 msgid ""
@@ -821,233 +804,232 @@ msgid ""
 "- touch&drag, tap 2nd finger\n"
 " --> place single item to slot\n"
 msgstr ""
-"Управление по умолчанию:\n"
-"Не в меню:\n"
-"- одно нажатие: кнопка активаций\n"
-"- двойное нажатие: положить/использовать\n"
-"- скольжение пальцем: осмотреться\n"
-"В меню/инвертаре:\n"
-"- двойное нажатие (вне меню)\n"
-"--> закрыть меню\n"
-"- Нажать на стопку, затем на ячейку:\n"
-"--> Двигать стопку\n"
-"- Потащить одним пальцем стопку в нужную ячейку, нажать вторым пальцем на "
-"экран:\n"
-"--> Положить один предмет в ячейку\n"
+"Vidhibiti vya chaguo-msingi:\n"
+"Hakuna Menyu kuonekana:\n"
+"- bomba moja: kitufe kuamilisha\n"
+"- mara mbili bomba: mahali/matumizi\n"
+"- slaidi kidole: kuangalia kote\n"
+"Menyu/hesabu dhahiri:\n"
+"- mara mbili bomba (nje):--> Funga - kugusa \n"
+"mpororo, kugusa mpenyo:--> hoja mpororo\n"
+"- kugusa & buruta, bomba kidole 2--> \n"
+"kipengee kimoja mahali kwa yanayopangwa\n"
 
 #: src/game.cpp
 msgid "Exit to Menu"
-msgstr "Выход в меню"
+msgstr "Toka kwenye menyu"
 
 #: src/game.cpp
 msgid "Exit to OS"
-msgstr "Выход в ОС"
+msgstr "Toka kwa OS"
 
 #: src/game.cpp
 msgid "Item definitions..."
-msgstr "Описания предметов..."
+msgstr "Fasili ya kipengele..."
 
 #: src/game.cpp
 msgid "KiB/s"
-msgstr "КиБ/с"
+msgstr "Kibu/s"
 
 #: src/game.cpp
 msgid "Media..."
-msgstr "Медиафайлы..."
+msgstr "Vyombo vya habari..."
 
 #: src/game.cpp
 msgid "MiB/s"
-msgstr "МиБ/с"
+msgstr "MiB/s"
 
 #: src/game.cpp
 msgid "Node definitions..."
-msgstr "Описания нод..."
+msgstr "Fundo Fasili..."
 
 #: src/game.cpp
 msgid "Resolving address..."
-msgstr "Получение адреса..."
+msgstr "Kusuluhisha anwani..."
 
 #: src/game.cpp
 msgid "Respawn"
-msgstr "Возродиться"
+msgstr "Respawn"
 
 #: src/game.cpp
 msgid "Shutting down..."
-msgstr "Завершение..."
+msgstr "Inazima..."
 
 #: src/game.cpp
 msgid "Sound Volume"
-msgstr "Громкость звука"
+msgstr "Kiwango cha sauti"
 
 #: src/game.cpp
 msgid "You died."
-msgstr "Вы умерли."
+msgstr "Alikufa."
 
 #: src/game.cpp src/guiFormSpecMenu.cpp
 msgid "ok"
-msgstr "OK"
+msgstr "Sawa kabisa"
 
 #: src/guiFormSpecMenu.cpp
 msgid "Enter "
-msgstr "Введите "
+msgstr "Ingiza"
 
 #: src/guiFormSpecMenu.cpp
 msgid "Proceed"
-msgstr "Продолжить"
+msgstr "Kuendelea"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "\"Use\" = climb down"
-msgstr "\"Использовать\" = вниз"
+msgstr "\"Matumizi\" = kupanda chini"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Backward"
-msgstr "Назад"
+msgstr "Nyuma"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Chat"
-msgstr "Чат"
+msgstr "Kuzungumza"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Command"
-msgstr "Команда"
+msgstr "Amri"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Console"
-msgstr "Консоль"
+msgstr "Kiweko"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Double tap \"jump\" to toggle fly"
-msgstr "Двойной прыжок = летать"
+msgstr "Mara mbili bomba \"Ruka\" hadi Togo kuruka"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Drop"
-msgstr "Бросить"
+msgstr "Achia"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Forward"
-msgstr "Вперед"
+msgstr "Mbele"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Inventory"
-msgstr "Инвентарь"
+msgstr "Hesabu"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Jump"
-msgstr "Прыжок"
+msgstr "Kuruka"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Key already in use"
-msgstr "Клавиша уже используется"
+msgstr "Muhimu tayari katika matumizi"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
-msgstr ""
-"Сочетания клавиш. (Если это меню сломалось, удалите настройки из minetest."
-"conf)"
+msgstr "Keybindings. (Kama Menyu hii screws, Ondoa vitu kutoka minetest.conf)"
 
 #: src/guiKeyChangeMenu.cpp src/keycode.cpp
 msgid "Left"
-msgstr "Влево"
+msgstr "Kushoto"
 
 #: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
 msgid "Print stacks"
-msgstr "Печать стеков"
+msgstr "Chapisha mipororo"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Range select"
-msgstr "Зона видимости"
+msgstr "Teua masafa"
 
 #: src/guiKeyChangeMenu.cpp src/keycode.cpp
 msgid "Right"
-msgstr "Вправо"
+msgstr "Kulia"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Sneak"
-msgstr "Красться"
+msgstr "Taarifa"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle Cinematic"
-msgstr "Киношность"
+msgstr "Togoa Cinematic"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle fast"
-msgstr "Ускорение"
+msgstr "Togoa haraka"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle fly"
-msgstr "Полёт"
+msgstr "Togoa kuruka"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Toggle noclip"
-msgstr "Включить noclip"
+msgstr "Togoa noclip"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Use"
-msgstr "Использовать"
+msgstr "Matumizi"
+
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Kuza"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
-msgstr "нажмите клавишу"
+msgstr "Bonyeza Kibonye"
 
 #: src/guiPasswordChange.cpp
 msgid "Change"
-msgstr "Изменить"
+msgstr "Mabadiliko"
 
 #: src/guiPasswordChange.cpp
 msgid "Confirm Password"
-msgstr "Подтверждение пароля"
+msgstr "Thibitisha nywila"
 
 #: src/guiPasswordChange.cpp
 msgid "New Password"
-msgstr "Новый пароль"
+msgstr "Nywila mpya"
 
 #: src/guiPasswordChange.cpp
 msgid "Old Password"
-msgstr "Старый пароль"
+msgstr "Nywila ya zamani"
 
 #: src/guiPasswordChange.cpp
 msgid "Passwords do not match!"
-msgstr "Пароли не совпадают!"
+msgstr "MaNenotambulishi hayaoani!"
 
 #: src/guiVolumeChange.cpp
 msgid "Exit"
-msgstr "Выход"
+msgstr "Toka"
 
 #: src/guiVolumeChange.cpp
 msgid "Sound Volume: "
-msgstr "Громкость звука: "
+msgstr "Kiwango sauti:"
 
 #: src/keycode.cpp
 msgid "Apps"
-msgstr "Приложения"
+msgstr "Programu"
 
 #: src/keycode.cpp
 msgid "Attn"
-msgstr "Внимание"
+msgstr "Attn"
 
 #: src/keycode.cpp
 msgid "Back"
-msgstr "Назад"
+msgstr "Nyuma"
 
 #: src/keycode.cpp
 msgid "Capital"
-msgstr "Caps Lock"
+msgstr "Mji mkuu"
 
 #: src/keycode.cpp
 msgid "Clear"
-msgstr "Очистить"
+msgstr "Wazi"
 
 #: src/keycode.cpp
 msgid "Comma"
-msgstr "Запятая"
+msgstr "Mkato"
 
 #: src/keycode.cpp
 msgid "Control"
-msgstr "Ctrl"
+msgstr "Udhibiti"
 
 #: src/keycode.cpp
 msgid "Convert"
-msgstr "Преобразовать"
+msgstr "Geuza"
 
 #: src/keycode.cpp
 msgid "CrSel"
@@ -1055,19 +1037,19 @@ msgstr "CrSel"
 
 #: src/keycode.cpp
 msgid "Down"
-msgstr "Вниз"
+msgstr "Chini"
 
 #: src/keycode.cpp
 msgid "End"
-msgstr "End"
+msgstr "Mwisho"
 
 #: src/keycode.cpp
 msgid "Erase OEF"
-msgstr "Стереть ОНС"
+msgstr "Futa OEF"
 
 #: src/keycode.cpp
 msgid "Escape"
-msgstr "Escape"
+msgstr "Kutoroka"
 
 #: src/keycode.cpp
 msgid "ExSel"
@@ -1075,23 +1057,23 @@ msgstr "ExSel"
 
 #: src/keycode.cpp
 msgid "Execute"
-msgstr "Выполнить"
+msgstr "Kutekeleza"
 
 #: src/keycode.cpp
 msgid "Final"
-msgstr "Конец"
+msgstr "Mwisho"
 
 #: src/keycode.cpp
 msgid "Help"
-msgstr "Справка"
+msgstr "Msaada"
 
 #: src/keycode.cpp
 msgid "Home"
-msgstr "Home"
+msgstr "Nyumbani"
 
 #: src/keycode.cpp
 msgid "Insert"
-msgstr "Insert"
+msgstr "Chomeka"
 
 #: src/keycode.cpp
 msgid "Junja"
@@ -1099,55 +1081,55 @@ msgstr "Junja"
 
 #: src/keycode.cpp
 msgid "Kana"
-msgstr "Кана"
+msgstr "Kana"
 
 #: src/keycode.cpp
 msgid "Kanji"
-msgstr "Кандзи"
+msgstr "KanJi"
 
 #: src/keycode.cpp
 msgid "Left Button"
-msgstr "Левая кнопка"
+msgstr "Kitufe kushoto"
 
 #: src/keycode.cpp
 msgid "Left Control"
-msgstr "Левый Ctrl"
+msgstr "Udhibiti wa kushoto"
 
 #: src/keycode.cpp
 msgid "Left Menu"
-msgstr "Левая клавиша меню"
+msgstr "Menyu ya kushoto"
 
 #: src/keycode.cpp
 msgid "Left Shift"
-msgstr "Левый Shift"
+msgstr "Kisogezi kushoto"
 
 #: src/keycode.cpp
 msgid "Left Windows"
-msgstr "Левая кл. Win"
+msgstr "Windows kushoto"
 
 #: src/keycode.cpp
 msgid "Menu"
-msgstr "Меню"
+msgstr "Menyu"
 
 #: src/keycode.cpp
 msgid "Middle Button"
-msgstr "Средняя кнопка"
+msgstr "Kitufe kati"
 
 #: src/keycode.cpp
 msgid "Minus"
-msgstr "Минус"
+msgstr "Alama ya kutoa"
 
 #: src/keycode.cpp
 msgid "Mode Change"
-msgstr "Mode Change"
+msgstr "Mabadiliko ya hali ya"
 
 #: src/keycode.cpp
 msgid "Next"
-msgstr "Next"
+msgstr "Ijayo"
 
 #: src/keycode.cpp
 msgid "Nonconvert"
-msgstr "Не преобразовано"
+msgstr "Nonconvert"
 
 #: src/keycode.cpp
 msgid "Num Lock"
@@ -1155,63 +1137,63 @@ msgstr "Num Lock"
 
 #: src/keycode.cpp
 msgid "Numpad *"
-msgstr "Доп. клав. *"
+msgstr "Kinanda *"
 
 #: src/keycode.cpp
 msgid "Numpad +"
-msgstr "Доп. клав. +"
+msgstr "Kinanda +"
 
 #: src/keycode.cpp
 msgid "Numpad -"
-msgstr "Доп. клав. -"
+msgstr "Numpad-"
 
 #: src/keycode.cpp
 msgid "Numpad /"
-msgstr "Доп. клав. /"
+msgstr "Kinanda /"
 
 #: src/keycode.cpp
 msgid "Numpad 0"
-msgstr "Доп. клав. 0"
+msgstr "Kinanda 0"
 
 #: src/keycode.cpp
 msgid "Numpad 1"
-msgstr "Доп. клав. 1"
+msgstr "Kinanda 1"
 
 #: src/keycode.cpp
 msgid "Numpad 2"
-msgstr "Доп. клав. 2"
+msgstr "Kinanda 2"
 
 #: src/keycode.cpp
 msgid "Numpad 3"
-msgstr "Доп. клав. 3"
+msgstr "Kinanda 3"
 
 #: src/keycode.cpp
 msgid "Numpad 4"
-msgstr "Доп. клав. 4"
+msgstr "Kinanda 4"
 
 #: src/keycode.cpp
 msgid "Numpad 5"
-msgstr "Доп. клав. 5"
+msgstr "Kinanda 5"
 
 #: src/keycode.cpp
 msgid "Numpad 6"
-msgstr "Доп. клав. 6"
+msgstr "Kinanda 6"
 
 #: src/keycode.cpp
 msgid "Numpad 7"
-msgstr "Доп. клав. 7"
+msgstr "Kinanda 7"
 
 #: src/keycode.cpp
 msgid "Numpad 8"
-msgstr "Доп. клав. 8"
+msgstr "Kinanda 8"
 
 #: src/keycode.cpp
 msgid "Numpad 9"
-msgstr "Доп. клав. 9"
+msgstr "Kinanda 9"
 
 #: src/keycode.cpp
 msgid "OEM Clear"
-msgstr "Очистить OEM"
+msgstr "Wazi ya OEM"
 
 #: src/keycode.cpp
 msgid "PA1"
@@ -1219,47 +1201,47 @@ msgstr "PA1"
 
 #: src/keycode.cpp
 msgid "Pause"
-msgstr "Пауза"
+msgstr "Sitisha"
 
 #: src/keycode.cpp
 msgid "Period"
-msgstr "Период"
+msgstr "Kipindi cha"
 
 #: src/keycode.cpp
 msgid "Plus"
-msgstr "Плюс"
+msgstr "Plus"
 
 #: src/keycode.cpp
 msgid "Print"
-msgstr "Print"
+msgstr "Chapa"
 
 #: src/keycode.cpp
 msgid "Prior"
-msgstr "Prior"
+msgstr "Awali"
 
 #: src/keycode.cpp
 msgid "Return"
-msgstr "Вернуться"
+msgstr "Kurudi"
 
 #: src/keycode.cpp
 msgid "Right Button"
-msgstr "Правая кнопка"
+msgstr "Kitufe kulia"
 
 #: src/keycode.cpp
 msgid "Right Control"
-msgstr "Правый Ctrl"
+msgstr "Udhibiti sahihi"
 
 #: src/keycode.cpp
 msgid "Right Menu"
-msgstr "Правая клавиша меню"
+msgstr "Menyu kulia"
 
 #: src/keycode.cpp
 msgid "Right Shift"
-msgstr "Правый Shift"
+msgstr "Kisogezi kulia"
 
 #: src/keycode.cpp
 msgid "Right Windows"
-msgstr "Прав. кл. Win"
+msgstr "Windows kulia"
 
 #: src/keycode.cpp
 msgid "Scroll Lock"
@@ -1267,7 +1249,7 @@ msgstr "Scroll Lock"
 
 #: src/keycode.cpp
 msgid "Select"
-msgstr "Выбор"
+msgstr "Teua"
 
 #: src/keycode.cpp
 msgid "Shift"
@@ -1275,35 +1257,31 @@ msgstr "Shift"
 
 #: src/keycode.cpp
 msgid "Sleep"
-msgstr "Sleep"
+msgstr "Usingizi"
 
 #: src/keycode.cpp
 msgid "Snapshot"
-msgstr "Cнимок"
+msgstr "Taswira tuli"
 
 #: src/keycode.cpp
 msgid "Space"
-msgstr "Пробел"
+msgstr "Nafasi"
 
 #: src/keycode.cpp
 msgid "Tab"
-msgstr "Tab"
+msgstr "Kichupo"
 
 #: src/keycode.cpp
 msgid "Up"
-msgstr "Вверх"
+msgstr "Juu"
 
 #: src/keycode.cpp
 msgid "X Button 1"
-msgstr "Доп. кнопка 1"
+msgstr "X kitufe 1"
 
 #: src/keycode.cpp
 msgid "X Button 2"
-msgstr "Доп. кнопка 2"
-
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Масштаб"
+msgstr "X kitufe 2"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1313,25 +1291,31 @@ msgid ""
 "sets.\n"
 "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
 msgstr ""
+"(X, Y, Z) fidia ya fractal kutoka kituo cha dunia katika vitengo vya "
+"'kipimo'.\n"
+"Kutumika ili kuhamisha eneo la spawn ya kufaa ya ardhi chini karibu (0, 0).\n"
+"Chaguo-msingi ni mzuri kwa ajili ya seti ya mandelbrot, inahitaji kuhaririwa "
+"kwa ajili ya julia seti.\n"
+"Masafa ya takribani-2 hadi 2. Kuzidisha kwa 'Skeli' kwa Sawazisha katika "
+"fundo."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "0 = parallax occlusion with slope information (faster).\n"
 "1 = relief mapping (slower, more accurate)."
 msgstr ""
-"0 = Параллакс с информацией о наклоне (Быстрее).\n"
-"1 = Рельефный маппинг (Медленнее, качественнее)."
+"0 = parallax occlusion na taarifa ya mteremko (haraka).\n"
+"1 = ramani ya misaada (polepole, sahihi zaidi)."
 
 #: src/settings_translation_file.cpp
 msgid "3D clouds"
-msgstr "3D облака"
+msgstr "Mawingu ya 3D"
 
 #: src/settings_translation_file.cpp
 msgid "3D mode"
-msgstr "3D режим"
+msgstr "Hali ya 3D"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "3D support.\n"
 "Currently supported:\n"
@@ -1342,57 +1326,58 @@ msgid ""
 "-    sidebyside: split screen side by side.\n"
 "-    pageflip: quadbuffer based 3d."
 msgstr ""
-"Поддержка 3D.\n"
-"Сейчас поддерживаются:\n"
-"-    none: 3D отключен.\n"
-"-    anaglyph: голубой/пурпурный цвет в 3D.\n"
-"-    interlaced: четные/нечетные линии отображают два разных кадра для "
-"экранов поддерживающих поляризацию.\n"
-"-    topbottom: Разделение экрана низ/верх.\n"
-"-    sidebyside: Разделение экрана право/лево."
+"Msaada ya 3D.\n"
+"Tegemeza kwa sasa:-Hakuna: Hakuna towe 3d.\n"
+"-anaglyph: Bluu-kijani/rangi nzee rangi 3d.\n"
+"-sokotana: witiri/shufwa mstari msingi polarisation kiwamba msaada.\n"
+"-topbottom: Baidisha skrini juu/chini.\n"
+"-sidebyside: Baidisha skrini upande kwa upande.\n"
+"-pageflip: quadbuffer msingi 3d."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "A chosen map seed for a new map, leave empty for random.\n"
 "Will be overridden when creating a new world in the main menu."
 msgstr ""
-"Выбранный сид для новой карты, оставьте значение пустым для случайной "
-"генерации.\n"
-"Будет отменено при создании нового мира, в главном меню."
+"Mbegu ramani waliochaguliwa kwa ajili ya ramani mpya, kuondoka tupu kwa "
+"nasibu.\n"
+"Itakuwa kuuharibu wakati wa kuunda dunia mpya katika Menyu kuu."
 
 #: src/settings_translation_file.cpp
 msgid "A message to be displayed to all clients when the server crashes."
-msgstr "Сообщение, которое будет отображаться для всех при падении сервера."
+msgstr "Ujumbe kuonyeshwa kwa wateja wote wakati seva yaanguka."
 
 #: src/settings_translation_file.cpp
 msgid "A message to be displayed to all clients when the server shuts down."
-msgstr "Сообщение, которое будет показано всем при отключении сервера."
+msgstr "Ujumbe kuonyeshwa kwa wateja wote wakati seva huzima."
 
 #: src/settings_translation_file.cpp
 msgid "Absolute limit of emerge queues"
-msgstr "Абсолютный лимит появляющихся запросов"
+msgstr "Kikomo halisi ya foleni ya emerge"
 
 #: src/settings_translation_file.cpp
 msgid "Acceleration in air"
-msgstr "Ускорение в воздухе"
+msgstr "Kuongeza kasi katika hewa"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Management interval"
-msgstr "Дальность взаимодействия с блоками"
+msgstr "Nafasi kazi ya usimamizi wa umbo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Modifier interval"
-msgstr "Дальность взаимодействия с блоками"
+msgstr "Amilifu fungu Kigeuza nafasi"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Modifiers fungu amilifu"
 
 #: src/settings_translation_file.cpp
 msgid "Active block range"
-msgstr "Дальность взаимодействия с блоками"
+msgstr "Masafa ya fungu amilifu"
 
 #: src/settings_translation_file.cpp
 msgid "Active object send range"
-msgstr "Дальность отправляемого активного объекта"
+msgstr "Kiolwa amilifu Tuma masafa"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1400,54 +1385,53 @@ msgid ""
 "Leave this blank to start a local server.\n"
 "Note that the address field in the main menu overrides this setting."
 msgstr ""
-"Адрес, к которому присоединиться.\n"
-"Оставьте это поле, чтобы запустить локальный сервер.\n"
-"ПРИМЕЧАНИЕ: это поле адреса перезапишет эту настройку в главном меню."
+"Anwani ya kuunganishwa.\n"
+"Acha hii wazi kuanzisha seva ya ndani.\n"
+"Kumbuka kwamba uga wa anwani katika Menyu kuu Puuza kipimo hiki."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
 "screens."
 msgstr ""
-"Настройка dpi (плотности точек на дюйм) для вашего экрана (не для X11, "
-"только для Android). Например для мониторов с разрешением в 4k."
+"Rekebisha usakinishaji wa dpi kwenye kiwamba chako (yasiyo X11/Android tu) "
+"mfano kwa 4 k skrini."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n"
 "This setting is for the client only and is ignored by the server."
 msgstr ""
-"Отрегулируйте гамма кодировку для таблиц освещения. Более низкие значения "
-"ярче.\n"
-"Этот параметр предназначен только для клиента и игнорируется сервером."
+"Rekebisha simbiko gamma kwa majedwali mwanga. Idadi ya chini ni mkali.\n"
+"Kipimo hiki ni kwa ajili ya mteja tu na ni kupuuzwa na seva."
 
 #: src/settings_translation_file.cpp
 msgid "Advanced"
-msgstr "Дополнительно"
+msgstr "Pevu"
 
 #: src/settings_translation_file.cpp
 msgid "Altitude Chill"
-msgstr ""
+msgstr "Chill ya mwinuko"
 
 #: src/settings_translation_file.cpp
 msgid "Always fly and fast"
-msgstr "Всегда включен полёт и ускорение"
+msgstr "Daima kuruka na kufunga"
 
 #: src/settings_translation_file.cpp
 msgid "Ambient occlusion gamma"
-msgstr "Гамма Ambient occlusion"
+msgstr "Occlusion iliyoko gamma"
 
 #: src/settings_translation_file.cpp
 msgid "Amplifies the valleys"
-msgstr ""
+msgstr "Inaangazia mabonde"
 
 #: src/settings_translation_file.cpp
 msgid "Anisotropic filtering"
-msgstr "Анизантропная фильтрация"
+msgstr "Uchujaji wa anisotropic"
 
 #: src/settings_translation_file.cpp
 msgid "Announce server"
-msgstr "О сервере"
+msgstr "Kutangaza seva"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1455,98 +1439,106 @@ msgid ""
 "If you want to announce your ipv6 address, use  serverlist_url = v6.servers."
 "minetest.net."
 msgstr ""
-"Объявите списку сервера.\n"
-"Если Вы хотите объявить о своем адресе IPv6, используйте serverlist_url = v6."
+"Kutangaza kwa serverlist hii.\n"
+"Kama unataka kutangaza anwani yako ya ipv6, kutumia serverlist_url = v6."
 "servers.minetest.net."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Approximate (X,Y,Z) scale of fractal in nodes."
-msgstr "Приблизительный (X, Y, Z) масштаб рекурсивных в узлах."
+msgstr "Kukadiria (X, Y, Z) kipimo cha fractal katika fundo."
 
 #: src/settings_translation_file.cpp
 msgid "Ask to reconnect after crash"
-msgstr "Запрос переподключения после дисконнекта"
+msgstr "Uliza kuunganisha baada ya ajali"
 
 #: src/settings_translation_file.cpp
 msgid "Automaticaly report to the serverlist."
-msgstr "Автоматически добавлять в список серверов."
+msgstr "Automaticaly ripoti ya serverlist."
+
+#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Autorun ufunguo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Backward key"
-msgstr "клавиша обратно"
+msgstr "Ufunguo wa nyuma"
 
 #: src/settings_translation_file.cpp
 msgid "Base terrain height"
-msgstr "Высота основной местности"
+msgstr "Mandhari ya msingi urefu"
 
 #: src/settings_translation_file.cpp
 msgid "Basic"
-msgstr "Базовый"
+msgstr "Msingi"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Basic Privileges"
-msgstr "Стандартные права"
+msgstr "Haki za msingi"
 
 #: src/settings_translation_file.cpp
 msgid "Bilinear filtering"
-msgstr "Билинейная фильтрация"
+msgstr "Uchujaji wa bilinear"
 
 #: src/settings_translation_file.cpp
 msgid "Bind address"
-msgstr "Адрес бинда"
+msgstr "Kumfunga anwani"
 
 #: src/settings_translation_file.cpp
 msgid "Bits per pixel (aka color depth) in fullscreen mode."
-msgstr "Биты на пиксель (глубина цвета) в полноэкранном режиме."
+msgstr ""
+"Biti kwa pikseli (a.k.a rangi kina) katika hali-tumizi ya skrini nzima."
 
 #: src/settings_translation_file.cpp
 msgid "Build inside player"
-msgstr "Разрешить ставить блоки на месте игрока"
+msgstr "Kujenga ndani ya mchezaji"
+
+#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Pamoja"
 
 #: src/settings_translation_file.cpp
 msgid "Bumpmapping"
-msgstr "Бампмаппинг"
+msgstr "Bumpmapping"
 
 #: src/settings_translation_file.cpp
 msgid "Camera smoothing"
-msgstr "Сглаживание камеры"
+msgstr "Kamera unyooshaji"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Camera smoothing in cinematic mode"
-msgstr "Сглаживание камеры в кинематографическом режиме"
+msgstr "Kamera unyooshaji hali cinematic"
 
 #: src/settings_translation_file.cpp
 msgid "Camera update toggle key"
-msgstr "Клавиша переключения обновления камеры"
+msgstr "Kibonye guro Usasishaji wa kamera"
 
 #: src/settings_translation_file.cpp
 msgid "Cave noise #1"
-msgstr "Шум пещеры #1"
+msgstr "Pango kelele #1"
 
 #: src/settings_translation_file.cpp
 msgid "Cave noise #2"
-msgstr "Шум пещеры #2"
+msgstr "Pango kelele #2"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Cave width"
-msgstr "Ширина экрана"
+msgstr "Pango upana"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
-msgstr "Пещеры и тоннели формируются на перекрестке этих двух шумов"
+msgstr "Fomu ya mapango na vichuguu katika makutano ya kila mbili"
 
 #: src/settings_translation_file.cpp
 msgid "Chat key"
-msgstr "Кнопка чата"
+msgstr "Ufunguo wa mazungumzo"
 
 #: src/settings_translation_file.cpp
 msgid "Chat toggle key"
-msgstr "Кнопка переключения чата"
+msgstr "Kibonye guro wa mazungumzo"
+
+#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Amri majadiliano"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1570,106 +1562,130 @@ msgid ""
 "17 = 4D \"Mandelbulb\" mandelbrot set.\n"
 "18 = 4D \"Mandelbulb\" julia set."
 msgstr ""
+"Uchaguzi wa fractals 18 kutoka fomula 9.\n"
+"1 = 4 D \"Roundy\" mandelbrot seti.\n"
+"2 = 4 D seti ya julia \"Roundy\".\n"
+"3 = 4 D \"Squarry\" mandelbrot seti.\n"
+"4 = 4 D seti ya julia \"Squarry\".\n"
+"5 = 4 D \"Binamu Mandy\" mandelbrot seti.\n"
+"6 = 4 D \"Binamu Mandy\" julia seti.\n"
+"7 = 4 D \"Tofauti\" mandelbrot seti.\n"
+"8 = 4 D seti ya julia \"Tofauti\".\n"
+"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot seti.\n"
+"10 = 3D julia \"Mandelbrot/Mandelbar\" seti.\n"
+"11 = 3D \"Mti wa Krismasi\" mandelbrot seti.\n"
+"12 = 3D \"Mti wa Krismasi\" julia seti.\n"
+"13 = 3D \"Mandelbulb\" mandelbrot seti.\n"
+"14 = 3D julia \"Mandelbulb\" seti.\n"
+"15 = 3D \"Kosaini Mandelbulb\" mandelbrot seti.\n"
+"16 = 3D julia \"Kosaini Mandelbulb\" seti.\n"
+"17 = 4 D \"Mandelbulb\" mandelbrot seti.\n"
+"18 = 4 D seti ya julia \"Mandelbulb\"."
 
 #: src/settings_translation_file.cpp
 msgid "Chunk size"
-msgstr "Размер чанка"
+msgstr "Ukubwa wa fungu"
 
 #: src/settings_translation_file.cpp
 msgid "Cinematic mode"
-msgstr "Кинематографический режим"
+msgstr "Hali ya cinematic"
 
 #: src/settings_translation_file.cpp
 msgid "Cinematic mode key"
-msgstr "Кнопка переключения в кинематографический режим"
+msgstr "Hali ya cinematic ufunguo"
 
 #: src/settings_translation_file.cpp
 msgid "Clean transparent textures"
-msgstr "очистить прозрачные структуры"
+msgstr "Unamu angavu safi"
 
 #: src/settings_translation_file.cpp
 msgid "Client and Server"
-msgstr "Клиент и Сервер"
+msgstr "Mteja na seva"
 
 #: src/settings_translation_file.cpp
 msgid "Climbing speed"
-msgstr "Скорость подъема"
+msgstr "Kasi ya upandaji"
 
 #: src/settings_translation_file.cpp
 msgid "Cloud height"
-msgstr "Высота облаков"
+msgstr "Urefu wa wingu"
 
 #: src/settings_translation_file.cpp
 msgid "Cloud radius"
-msgstr "Радиус облаков"
+msgstr "Wingu eneo"
 
 #: src/settings_translation_file.cpp
 msgid "Clouds"
-msgstr "Облака"
+msgstr "Mawingu"
 
 #: src/settings_translation_file.cpp
 msgid "Clouds are a client side effect."
-msgstr "Облака являются эффектом на стороне клиента."
+msgstr "Mawingu ni mteja upande athari."
 
 #: src/settings_translation_file.cpp
 msgid "Clouds in menu"
-msgstr "Облака в меню"
+msgstr "Mawingu katika Menyu"
 
 #: src/settings_translation_file.cpp
 msgid "Colored fog"
-msgstr "Цветной туман"
+msgstr "Ukungu wa rangi"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
+"Iliyotenganishwa orodha ya mods kwamba wanaruhusiwa kufikia HTTP APIs, "
+"ambayo kuwaruhusu kupakia na kupakua data/toka kwenye tovuti."
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
+"Iliyotenganishwa orodha ya mods kuaminika kwamba wanaruhusiwa kufikia kazi "
+"zisizo hata wakati usalama Moduli ni juu (kupitia "
+"request_insecure_environment())."
 
 #: src/settings_translation_file.cpp
 msgid "Command key"
-msgstr "Команда"
+msgstr "Ufunguo wa amri"
 
 #: src/settings_translation_file.cpp
 msgid "Connect glass"
-msgstr "Стёкла без швов"
+msgstr "Kuunganisha kioo"
 
 #: src/settings_translation_file.cpp
 msgid "Connect to external media server"
-msgstr "Подключение к внешнему медиасерверу"
+msgstr "Unganisha kwenye seva ya midia za nje"
 
 #: src/settings_translation_file.cpp
 msgid "Connects glass if supported by node."
-msgstr "Соединяет стекло, если поддерживается нодой."
+msgstr "Huunganisha kioo kama mkono na fundo."
 
 #: src/settings_translation_file.cpp
 msgid "Console alpha"
-msgstr "Консоль"
+msgstr "Alfa ya Kiweko"
 
 #: src/settings_translation_file.cpp
 msgid "Console color"
-msgstr "Цвет в консоли"
+msgstr "Rangi ya Kiweko"
 
 #: src/settings_translation_file.cpp
 msgid "Console key"
-msgstr "Кнопка вызова консоли"
+msgstr "Muhimu ya Kiweko"
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward"
-msgstr ""
+msgstr "Kuendelea mbele"
 
 #: src/settings_translation_file.cpp
 msgid "Continuous forward movement (only used for testing)."
-msgstr ""
+msgstr "Harakati endelevu mbele (kutumika tu kwa ajili ya kupima)."
 
 #: src/settings_translation_file.cpp
 msgid "Controls"
-msgstr "Управление"
+msgstr "Vidhibiti"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1677,66 +1693,69 @@ msgid ""
 "Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays "
 "unchanged."
 msgstr ""
-"Задает длину цикла дня/ночи.\n"
-"Примеры: 72 = 20 минут, 360 = 4 минуты, 1 = 24 часа, 0 = время суток не "
-"меняется."
+"Vidhibiti vya urefu wa mzunguko wa siku/usiku.\n"
+"Mifano: 72 = 20 min, 360 = 4 min, 1 = 24 saa, 0 = anakaa siku/usiku/whatever "
+"unchanged."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Controls size of deserts and beaches in Mapgen v6.\n"
 "When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
 msgstr ""
-"Задает размеры пустыней и пляжей.\n"
-"Когда включены снежные биомы, 'mgv6_freq_desert' игнорируется."
+"Vidhibiti ukubwa wa majangwa na fukwe katika Mwandishi ramani v6.\n"
+"Wakati snowbiomes vimewezeshwa 'mgv6_freq_desert' ni kupuuzwa."
 
 #: src/settings_translation_file.cpp
 msgid "Controls steepness/depth of lake depressions."
-msgstr ""
+msgstr "Udhibiti mwinuko/kina cha ziwa depressions."
 
 #: src/settings_translation_file.cpp
 msgid "Controls steepness/height of hills."
-msgstr ""
+msgstr "Udhibiti mwinuko/urefu wa milima."
 
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Vidhibiti vya upana wa vichuguu, thamani ndogo huunda vichuguu pana."
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
-msgstr "Сообщение при падении"
+msgstr "Ajali ujumbe"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Creates unpredictable lava features in caves.\n"
 "These can make mining difficult. Zero disables them. (0-10)"
 msgstr ""
+"Huunda lava haitabiriki sifa katika mapango.\n"
+"Haya kufanya madini vigumu. Sifuri Hulemaza yao. (0-10)"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Creates unpredictable water features in caves.\n"
 "These can make mining difficult. Zero disables them. (0-10)"
 msgstr ""
+"Huunda maji haitabiriki sifa katika mapango.\n"
+"Haya kufanya madini vigumu. Sifuri Hulemaza yao. (0-10)"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair alpha"
-msgstr "Прозрачность перекрестия"
+msgstr "Crosshair Alfa"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Crosshair alpha (opaqueness, between 0 and 255)."
-msgstr "Прозрачность перекрестия (от 0 (прозрачно) до 255 (непрозрачно))."
+msgstr "Crosshair Alfa (opaqueness kati ya 0 na 255)."
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair color"
-msgstr "Цвет перекрестия"
+msgstr "Rangi ya crosshair"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair color (R,G,B)."
-msgstr "Цвет перекрестия (R,G,B)."
+msgstr "Rangi ya crosshair (R, G, B)."
 
 #: src/settings_translation_file.cpp
 msgid "Crouch speed"
-msgstr "Скорость спуска"
+msgstr "Ingia kasi"
 
 #: src/settings_translation_file.cpp
 msgid "DPI"
@@ -1744,101 +1763,105 @@ msgstr "DPI"
 
 #: src/settings_translation_file.cpp
 msgid "Damage"
-msgstr "Урон"
+msgstr "Uharibifu"
 
 #: src/settings_translation_file.cpp
 msgid "Debug info toggle key"
-msgstr "Клавиша переключения показа отладочной информации"
+msgstr "Rekebisha taarifa kibonye"
 
 #: src/settings_translation_file.cpp
 msgid "Debug log level"
-msgstr "Отладочный уровень"
+msgstr "Rekebisha kiwango cha logi"
 
 #: src/settings_translation_file.cpp
 msgid "Dedicated server step"
-msgstr "Шаг выделенного сервера"
+msgstr "Hatua ya seva ya kujitolea"
 
 #: src/settings_translation_file.cpp
 msgid "Default acceleration"
-msgstr "Ускорение по умолчанию"
+msgstr "Kichapuzi Chaguo-msingi"
 
 #: src/settings_translation_file.cpp
 msgid "Default game"
-msgstr "Стандартная игра"
+msgstr "Chaguo-msingi mchezo"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Default game when creating a new world.\n"
 "This will be overridden when creating a world from the main menu."
 msgstr ""
+"Chaguo-msingi mchezo wakati wa kuunda dunia mpya.\n"
+"Hii itakuwa kuwa kuuharibu wakati kutengeneza ulimwengu kutoka kwenye menyu "
+"kuu."
 
 #: src/settings_translation_file.cpp
 msgid "Default password"
-msgstr "Стандартный пароль"
+msgstr "Nywila ya chaguo-msingi"
 
 #: src/settings_translation_file.cpp
 msgid "Default privileges"
-msgstr "Стандартные права"
+msgstr "Upendeleo wa chaguo-msingi"
+
+#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Umbizo wa ripoti wa chaguo-msingi"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
 msgstr ""
-"Стандартный тайм-аут для cURL, установленный в милисекундах.\n"
-"Работает только на сборках с cURL."
+"Chaguo-msingi muda wa kuisha kwa cURL, alisema katika milisekunde.\n"
+"Tu ina athari kama alikusanya na Mkunjo."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Defines sampling step of texture.\n"
 "A higher value results in smoother normal maps."
 msgstr ""
+"Inafasili hatua ya sampuli ya unamu.\n"
+"Thamani ya juu zaidi matokeo katika ramani ya laini ya kawaida."
 
 #: src/settings_translation_file.cpp
 msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
+"Inafasili umbali wa uhamisho wa mchezaji maximal katika vitalu (0 = ukomo)."
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Kuchelewa katika kutuma vitalu baada ya jengo"
 
 #: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
-msgstr ""
+msgstr "Kuchelewa kuonyesha vidokezozana, alisema katika milisekunde."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Deprecated Lua API handling"
-msgstr "Устаревшее Lua API управление"
+msgstr "Deprecated Lua API utunzaji"
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "Kina chini ambayo utapata mapango kubwa."
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find massive caves."
-msgstr ""
+msgstr "Kina chini ambayo utapata mapango mkubwa."
 
 #: src/settings_translation_file.cpp
 msgid "Descending speed"
-msgstr "Скорость снижения"
+msgstr "Kushuka kasi"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Description of server, to be displayed when players join and in the "
 "serverlist."
 msgstr ""
-"Описание сервера, которое будет показано при входе игрока и в списке "
-"серверов."
+"Maelezo ya seva, kuonyeshwa wakati wachezaji kujiunga na katika serverlist "
+"ya."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Desynchronize block animation"
-msgstr "Рассинхронизировать анимацию блоков"
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
+msgstr "Desynchronize umbo la uhuishaji"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1846,57 +1869,79 @@ msgid ""
 "The 3 numbers in brackets control the scale of the\n"
 "terrain, the 3 numbers should be identical."
 msgstr ""
+"Huamua umbo wa ardhi.\n"
+"Namba 3 katika mabano kudhibiti ukubwa wa ardhi, namba 3 lazima kufanana."
 
 #: src/settings_translation_file.cpp
 msgid "Disable anticheat"
-msgstr "Отключить анти-чит"
+msgstr "Lemaza anticheat"
+
+#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Lemaza kutoroka mwandamano"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Lemaza mwandamano wa kutoroka, k.m kuzungumza kuchorea.\n"
+"Tumia hii kama unataka kuendesha seva na wateja wa awali-0.4.14 na unataka "
+"kulemaza mwandamano kutoroka yanayotokana na mods."
 
 #: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
-msgstr "Запретить пустой пароль"
+msgstr "Usiruhusu nywila tupu"
 
 #: src/settings_translation_file.cpp
 msgid "Domain name of server, to be displayed in the serverlist."
-msgstr "Доменное имя сервера, отображаемое в списке серверов."
+msgstr "Kikoa jina la seva, kuonyeshwa katika serverlist ya."
 
 #: src/settings_translation_file.cpp
 msgid "Double tap jump for fly"
-msgstr "Полет по двойному прыжку"
+msgstr "Mara mbili ya bomba kuruka kwa kuruka"
 
 #: src/settings_translation_file.cpp
 msgid "Double-tapping the jump key toggles fly mode."
-msgstr "Двойное нажатие на прыжок включает режим полёта."
+msgstr "Mbili-tapping ufunguo wa kuruka Inatogoa hali ya kuruka."
 
 #: src/settings_translation_file.cpp
 msgid "Drop item key"
-msgstr "Кнопка выброса блока"
+msgstr "Tone kipengee muhimu"
 
 #: src/settings_translation_file.cpp
 msgid "Dump the mapgen debug infos."
-msgstr "Дамп отладочной информации генератора мира."
+msgstr "Bwaga mwandishi ramani rekebishi infos."
+
+#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Wezesha vifimbocheza"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Enable VBO"
-msgstr "Включить мультиплеер"
+msgstr "Wezesha VBO"
 
 #: src/settings_translation_file.cpp
 msgid "Enable mod security"
-msgstr "Включить защиту модов"
+msgstr "Kuwezesha usalama Moduli"
 
 #: src/settings_translation_file.cpp
 msgid "Enable players getting damage and dying."
-msgstr "Включает получение игроками урона и их смерть."
+msgstr "Wezesha wachezaji kupata uharibifu na kufa."
 
 #: src/settings_translation_file.cpp
 msgid "Enable random user input (only used for testing)."
-msgstr ""
+msgstr "Wezesha ingizo la mtumiaji nasibu (kutumika tu kwa ajili ya kupima)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Enable smooth lighting with simple ambient occlusion.\n"
 "Disable for speed or for different looks."
 msgstr ""
+"Wezesha taa laini na rahisi iliyoko occlusion.\n"
+"Lemaza kwa kasi au kwa ajili ya inaonekana tofauti."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1906,6 +1951,10 @@ msgid ""
 "to new servers, but they may not support all new features that you are "
 "expecting."
 msgstr ""
+"Wezesha Usiruhusu wateja wa zamani kutoka kuunganisha.\n"
+"Wateja wakubwa ni patanifu katika maana ya kwamba wao si mapenzi ajali "
+"wakati wa kuunganisha kwenye seva mpya, lakini inaweza kusaidia nduni zote "
+"mpya ambayo ni kutarajia."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1914,6 +1963,9 @@ msgid ""
 "textures)\n"
 "when connecting to the server."
 msgstr ""
+"Kuwezesha matumizi ya seva ya midia ya mbali (kama zinazotolewa na seva).\n"
+"Seva ya mbali kutoa njia kwa kiasi kikubwa kasi ya kupakua midia (k.m unamu) "
+"wakati wa kuunganisha kwenye seva."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1921,10 +1973,13 @@ msgid ""
 "to IPv6 clients, depending on system configuration.\n"
 "Ignored if bind_address is set."
 msgstr ""
+"Wezesha/Lemaza kuendesha seva ya IPv6.  Seva ya IPv6 unaweza kuzuiliwa kwa "
+"wateja IPv6, kutegemea usanidi mfumo.\n"
+"Kupuuzwa kama bind_address kuweka."
 
 #: src/settings_translation_file.cpp
 msgid "Enables animation of inventory items."
-msgstr ""
+msgstr "Huwezesha uhuishaji wa vitu inventering."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -1933,115 +1988,141 @@ msgid ""
 "or need to be auto-generated.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Inawezesha bumpmapping kwa ajili ya unamu. Normalmaps haja iwekwe kwa pakiti "
+"ya unamu au haja ya kuwa yaliyozalishwa na otomatiki.\n"
+"Inahitaji shaders kwa kuwezeshwa."
 
 #: src/settings_translation_file.cpp
 msgid "Enables caching of facedir rotated meshes."
-msgstr ""
+msgstr "Huwezesha uwekaji kache kwa facedir Iliyozungushwa meshes."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Enables filmic tone mapping"
-msgstr "Включить мини-карту."
+msgstr "Huwezesha toni filmic ramani"
 
 #: src/settings_translation_file.cpp
 msgid "Enables minimap."
-msgstr "Включить мини-карту."
+msgstr "Inawezesha minimap."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Enables on the fly normalmap generation (Emboss effect).\n"
 "Requires bumpmapping to be enabled."
 msgstr ""
+"Huwezesha kwenye kizazi cha normalmap kuruka (Emboss athari).\n"
+"Inahitaji bumpmapping kwa kuwezeshwa."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Enables parallax occlusion mapping.\n"
 "Requires shaders to be enabled."
 msgstr ""
+"Huwezesha parallax occlusion uramanishi.\n"
+"Inahitaji shaders kwa kuwezeshwa."
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Injini ubainishaji wa data ya uchapaji nafasi"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Mbinu ya chombo"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
 msgstr ""
+"Chaguo majaribio, inaweza kusababisha nafasi inayoonekana kati ya vitalu "
+"wakati kuweka namba ya juu zaidi kuliko 0."
 
 #: src/settings_translation_file.cpp
 msgid "FPS in pause menu"
-msgstr "FPS во время паузы"
+msgstr "Ramprogrammen katika Menyu ya mapumziko"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "FSAA"
 msgstr "FSAA"
 
 #: src/settings_translation_file.cpp
 msgid "Fall bobbing"
-msgstr ""
+msgstr "Kuanguka bobbing"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font"
-msgstr "Fallback шрифт"
+msgstr "Fonti amebadilisha"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font shadow"
-msgstr ""
+msgstr "Fonti amebadilisha kivuli"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font shadow alpha"
-msgstr ""
+msgstr "Fonti amebadilisha kivuli Alfa"
 
 #: src/settings_translation_file.cpp
 msgid "Fallback font size"
-msgstr "Fallback размер шрифта"
+msgstr "Ukubwa fonti amebadilisha"
 
 #: src/settings_translation_file.cpp
 msgid "Fast key"
-msgstr "Клавиша ускорения"
+msgstr "Ufunguo kasi"
 
 #: src/settings_translation_file.cpp
 msgid "Fast mode acceleration"
-msgstr "Ускорение быстрого перемещения"
+msgstr "Kuongeza kasi hali ya haraka"
 
 #: src/settings_translation_file.cpp
 msgid "Fast mode speed"
-msgstr "Скорость быстрого перемещения"
+msgstr "Kasi ya hali ya haraka"
 
 #: src/settings_translation_file.cpp
 msgid "Fast movement"
-msgstr "Быстрое перемещение"
+msgstr "Kutembea haraka"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Fast movement (via use key).\n"
 "This requires the \"fast\" privilege on the server."
 msgstr ""
-"Быстрое перемещение (с использование клавиши).\n"
-"Это требует привилегию \"fast\" на сервере."
+"Harakati haraka (kupitia matumizi muhimu).\n"
+"Hii inahitaji upendeleo \"haraka\" kwenye seva."
 
 #: src/settings_translation_file.cpp
 msgid "Field of view"
-msgstr "Поле зрения"
+msgstr "Uga wa Mwoneko"
+
+#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Uga wa Mwoneko kwa ajili ya Kuza"
 
 #: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
-msgstr "Поле зрения в градусах."
+msgstr "Uga wa Mwoneko katika nyuzi."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Uga wa Mwoneko ukikuza katika nyuzi.\n"
+"Hii inahitaji nafasi \"Kuza\" kwenye seva."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
-"Файл, содержащий ваши любимые серверы, отображаемые на вкладке Multiplayer."
+"Faili katika mteja/serverlist/yenye seva zako Pendwa kuonyeshwa katika "
+"kichupo cha Multiplayer."
 
 #: src/settings_translation_file.cpp
 msgid "Filler Depth"
-msgstr ""
+msgstr "Kina ya Filler"
 
 #: src/settings_translation_file.cpp
 msgid "Filmic tone mapping"
-msgstr ""
+msgstr "Ramani ya toni filmic"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2050,149 +2131,165 @@ msgid ""
 "light edge to transparent textures.  Apply this filter to clean that up\n"
 "at texture load time."
 msgstr ""
+"Unamu kuchujwa wanaweza kujichanganya RGB thamani na majirani kikamilifu-"
+"uwazi, ambayo PNG optimizers kawaida Tupa, wakati mwingine kusababisha "
+"katika ukingo wa giza au mwanga angavu ya unamu.  Tekeleza Kichujio hii "
+"kusafisha kwamba wakati mzigo, unamu."
 
 #: src/settings_translation_file.cpp
 msgid "Filtering"
-msgstr "Фильтрация"
+msgstr "Uchujaji"
 
 #: src/settings_translation_file.cpp
 msgid "Fixed map seed"
-msgstr "Конкретное семя мира"
+msgstr "Mbegu ya ramani fasta"
 
 #: src/settings_translation_file.cpp
 msgid "Fly key"
-msgstr "Кнопка полёта"
+msgstr "Kuruka ufunguo"
 
 #: src/settings_translation_file.cpp
 msgid "Flying"
-msgstr "Полёт"
+msgstr "Kuruka"
 
 #: src/settings_translation_file.cpp
 msgid "Fog"
-msgstr "Туман"
+msgstr "Ukungu"
 
 #: src/settings_translation_file.cpp
 msgid "Fog toggle key"
-msgstr "Клавиша переключения тумана"
+msgstr "Kibonye guro wa ukungu"
 
 #: src/settings_translation_file.cpp
 msgid "Font path"
-msgstr "Путь к шрифту"
+msgstr "Njia ya fonti"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow"
-msgstr "Тень шрифта"
+msgstr "Kivuli cha fonti"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow alpha"
-msgstr "Прозрачность тени шрифта"
+msgstr "Fonti kivuli Alfa"
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow alpha (opaqueness, between 0 and 255)."
-msgstr "Прозрачность тени шрифта (непрозрачность от 0 до 255)."
+msgstr "Fonti kivuli Alfa (opaqueness kati ya 0 na 255)."
 
 #: src/settings_translation_file.cpp
 msgid "Font shadow offset, if 0 then shadow will not be drawn."
-msgstr ""
-"Смещение тени шрифта. Если установленно в 0, то тень не будет отрисовываться."
+msgstr "Fonti kivuli Sawazisha, kama 0 basi kivuli itakuwa kuchukuliwa."
 
 #: src/settings_translation_file.cpp
 msgid "Font size"
-msgstr "Размер шрифта"
+msgstr "Ukubwa wa fonti"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Format of screenshots."
-msgstr "Путь для сохранения скриншотов."
+msgstr "Umbizo la viwambo."
 
 #: src/settings_translation_file.cpp
 msgid "Forward key"
-msgstr "Вперед"
+msgstr "Ufunguo wa mbele"
 
 #: src/settings_translation_file.cpp
 msgid "Freetype fonts"
-msgstr "FreeType шрифты"
+msgstr "Fonti Freetype"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "From how far blocks are generated for clients, stated in mapblocks (16 "
 "nodes)."
 msgstr ""
+"Kutoka vitalu mbali kiasi gani hutolewa kwa wateja, alisema katika mapblocks "
+"(fundo 16)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
 msgstr ""
+"Kutoka vitalu mbali jinsi hutumwa kwa wateja, alisema katika mapblocks "
+"(fundo 16)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "From how far clients know about objects, stated in mapblocks (16 nodes)."
 msgstr ""
+"Kutoka wateja mbali kiasi gani kujua kuhusu vitu, alisema katika mapblocks "
+"(fundo 16)."
 
 #: src/settings_translation_file.cpp
 msgid "Full screen"
-msgstr "Полный экран"
+msgstr "Kiwamba kizima"
 
 #: src/settings_translation_file.cpp
 msgid "Full screen BPP"
-msgstr ""
+msgstr "Skrini BPP"
 
 #: src/settings_translation_file.cpp
 msgid "Fullscreen mode."
-msgstr "Полноэкранный режим."
+msgstr "Hali-tumizi ya skrini nzima."
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling"
-msgstr "Масштабирование интерфейса"
+msgstr "GUI kurekebisha"
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling filter"
-msgstr "Фильтр масштабирования интерфейса"
+msgstr "GUI kipimo Kichujio"
 
 #: src/settings_translation_file.cpp
 msgid "GUI scaling filter txr2img"
-msgstr "txr2img фильтр масштабирования интерфейса"
+msgstr "GUI kipimo Kichujio txr2img"
 
 #: src/settings_translation_file.cpp
 msgid "Gamma"
-msgstr "Гамма"
+msgstr "Gamma"
 
 #: src/settings_translation_file.cpp
 msgid "General"
-msgstr ""
+msgstr "Mkuu"
 
 #: src/settings_translation_file.cpp
 msgid "Generate normalmaps"
-msgstr "Генерировать карты нормалей"
+msgstr "Kuzalisha normalmaps"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr "Callbacks ya kimataifa"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Ramani ya kimataifa kizazi sifa.\n"
+"Katika Mwandishi ramani v6 bendera ya 'kienyeji' udhibiti mapambo yote "
+"isipokuwa miti na junglegrass, katika mapgens mengine yote bendera hii "
+"udhibiti mapambo yote.\n"
+"Bendera ambayo haijabainishwa katika Tungo ya bendera ni hayakubadilishwa "
+"kutoka chaguo-msingi.\n"
+"Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao."
 
 #: src/settings_translation_file.cpp
 msgid "Graphics"
-msgstr "Графика"
+msgstr "Michoro"
 
 #: src/settings_translation_file.cpp
 msgid "Gravity"
-msgstr "Гравитация"
+msgstr "Mvutano"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "HTTP Mods"
-msgstr "Моды"
+msgstr "HTTP Mods"
 
 #: src/settings_translation_file.cpp
 msgid "HUD toggle key"
-msgstr "Клавиша переключения HUD"
+msgstr "HUD kibonye"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2201,26 +2298,45 @@ msgid ""
 "-    log: mimic and log backtrace of deprecated call (default for debug).\n"
 "-    error: abort on usage of deprecated call (suggested for mod developers)."
 msgstr ""
+"Utunzaji kwa deprecated lua ya API: - Rithi: (jaribu kwa) mimic zamani tabia "
+"(chaguo-msingi kwa ajili ya kutolewa).\n"
+"-logi: kuiga na kuingia backtrace wa deprecated wito (chaguo-msingi kwa "
+"ajili ya rekebishi).\n"
+"-Kosa: tusiseme juu ya matumizi ya simu deprecated (alipendekeza kwa "
+"watengenezaji Moduli)."
 
 #: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
 msgstr ""
+"Kuwa profiler instrument yenyewe: * Instrument kazi tupu.\n"
+"Hii makadirio vimezingirwa, kwamba instrumentation ni kuongeza (+ 1 kazi "
+"simu).\n"
+"* Chombo sampler kutumika ili kusasisha takwimu."
+
+#: src/settings_translation_file.cpp
+msgid "Height component of the initial window size."
+msgstr "Kijenzi cha urefu wa ukubwa cha kidirisha awali."
 
 #: src/settings_translation_file.cpp
 msgid "Height on which clouds are appearing."
-msgstr ""
+msgstr "Urefu ambayo mawingu ni kuonekana."
 
 #: src/settings_translation_file.cpp
 msgid "High-precision FPU"
-msgstr ""
+msgstr "FPU kuu-usahihi"
 
 #: src/settings_translation_file.cpp
 msgid "Homepage of server, to be displayed in the serverlist."
-msgstr "Домашняя страница сервера, отображаемая в списке серверов."
+msgstr "Homepage ya seva, kuonyeshwa katika serverlist ya."
 
 #: src/settings_translation_file.cpp
 msgid "How deep to make rivers"
-msgstr ""
+msgstr "Kina jinsi kufanya mito"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2228,50 +2344,49 @@ msgid ""
 "mapblocks (16 nodes).\n"
 "In active blocks objects are loaded and ABMs run."
 msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
+"Jinsi ya eneo kubwa la vitalu ni chini ya fungu amilifu mambo, alisema "
+"katika mapblocks (fundo 16).\n"
+"Katika vitalu amilifu vitu ni kupakiwa na ABMs kukimbia."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
+"Seva kiasi kusubiri kabla ya kupakua mapblocks zisizotumika.\n"
+"Thamani ya juu zaidi ni laini, lakini kutumia RAM zaidi."
 
 #: src/settings_translation_file.cpp
 msgid "How wide to make rivers"
-msgstr ""
+msgstr "Upana gani kufanya mito"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "IPv6"
 msgstr "IPv6"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 server"
-msgstr "IPv6 сервер"
+msgstr "IPv6 Seva"
 
 #: src/settings_translation_file.cpp
 msgid "IPv6 support."
-msgstr "IPv6 поддержка."
+msgstr "IPv6 msaada."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If FPS would go higher than this, limit it by sleeping\n"
 "to not waste CPU power for no benefit."
 msgstr ""
+"Kama Ramprogrammen angekwenda juu kuliko hii, kikomo kwa kulala si kupoteza "
+"nguvu ya CPU kwa faida yoyote."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If disabled \"use\" key is used to fly fast if both fly and fast mode are "
 "enabled."
 msgstr ""
+"Ikiwa kimelemazwa \"kutumia\" ufunguo ni kutumika kwa kuruka haraka kama "
+"hali-tumizi ya kuruka na ya haraka ni kuwezeshwa."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2279,33 +2394,41 @@ msgid ""
 "nodes.\n"
 "This requires the \"noclip\" privilege on the server."
 msgstr ""
+"Kama kuwezeshwa pamoja na hali ya kuruka, mchezaji ni uwezo wa kuruka kwa "
+"fundo imara.\n"
+"Hii inahitaji upendeleo wa \"noclip\" kwenye seva."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
 "and descending."
 msgstr ""
+"Ikiwa imewezeshwa, ufunguo wa \"kutumia\" badala ya \"sneak\" ufunguo ni "
+"kutumika kwa ajili ya kupanda na kushuka."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If enabled, actions are recorded for rollback.\n"
 "This option is only read when server starts."
 msgstr ""
+"Ikiwa imewezeshwa, matendo ni kumbukumbu kwa ajili ya mserereko.\n"
+"Chaguo hili ni soma tu wakati wa kuanza kwa seva."
 
 #: src/settings_translation_file.cpp
 msgid "If enabled, disable cheat prevention in multiplayer."
-msgstr ""
+msgstr "Ikiwa imewezeshwa, kulemaza uzuiaji wa soka katika multiplayer."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "If enabled, invalid world data won't cause the server to shut down.\n"
 "Only enable this if you know what you are doing."
 msgstr ""
+"Ikiwa imewezeshwa, data ya dunia batili si kusababisha seva kuzima.\n"
+"Tu kuwezesha hii kama unajua nini unafanya."
 
 #: src/settings_translation_file.cpp
 msgid "If enabled, new players cannot join with an empty password."
-msgstr ""
-"Если включено, то новые игроки не смогут подключаться с пустым паролем."
+msgstr "Ikiwa imewezeshwa, wachezaji wapya haiwezi kujiunga na nywila wazi."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2313,63 +2436,114 @@ msgid ""
 "you stand.\n"
 "This is helpful when working with nodeboxes in small areas."
 msgstr ""
-"Если включено, то вы можете размещать новые блоки на месте игрока.\n"
-"Это может быть полезно при строительстве в узких местах."
+"Ikiwa imewezeshwa, unaweza mahali vitalu katika nafasi (miguu + jicho "
+"kiwango) ambako kusimama.\n"
+"Hii ni kusaidia unapofanya kazi na nodeboxes katika maeneo madogo."
 
 #: src/settings_translation_file.cpp
 msgid "If this is set, players will always (re)spawn at the given position."
-msgstr "Если установлено, то игроки будут (ре)спавниться в указанной позиции."
+msgstr "Kama hii ni kuweka, wachezaji mapenzi daima (re) spawn mahali fulani."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Ignore world errors"
-msgstr "Игнорировать ошибки мира"
+msgstr "Kupuuza makosa ya ulimwengu"
 
 #: src/settings_translation_file.cpp
 msgid "In-Game"
-msgstr "В игре"
+msgstr "Katika mchezo"
 
 #: src/settings_translation_file.cpp
 msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
-msgstr "Прозрачность фона внутриигровой консоли (непрозрачность от 0 до 255)."
+msgstr ""
+"Mazungumzo katika mchezo console mandharinyuma Alfa (opaqueness kati ya 0 na "
+"255)."
 
 #: src/settings_translation_file.cpp
 msgid "In-game chat console background color (R,G,B)."
-msgstr "Цвет фона внутриигровой консоли (R, G, B)."
+msgstr "Mazungumzo katika mchezo console mandharinyuma rangi (R, G, B)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"Chombo builtin.\n"
+"Hii ni kawaida tu zinazohitajika kwa wachangiaji wa msingi/builtin"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Chombo chatcommands kwenye usajili."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Chombo mwito-rejeshi kimataifa kazi kwenye usajili.\n"
+"(kitu chochote unaweza kupita kwa kazi minetest.register_*())"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr "Ala ya kazi hatua ya Modifiers Amilifu wa fungu kwenye usajili."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr "Ala ya kazi hatua ya kupakia fungu Modifiers kwenye usajili."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Instrument mbinu za vyombo kwenye usajili."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Instrumentation"
 
 #: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
-msgstr "Интервал сохранения важных изменений в мире, установленный в секундах."
+msgstr ""
+"Muda wa kuhifadhi mabadiliko muhimu katika ulimwengu, alisema katika sekunde."
 
 #: src/settings_translation_file.cpp
 msgid "Interval of sending time of day to clients."
-msgstr "Интервал отправки клиентам сведений о времени дня."
+msgstr "Muda wa kutuma wakati wa siku kwa wateja."
 
 #: src/settings_translation_file.cpp
 msgid "Inventory items animations"
-msgstr ""
+msgstr "Hesabu vitu uhuishaji"
 
 #: src/settings_translation_file.cpp
 msgid "Inventory key"
-msgstr "Кнопка открытия инвентаря"
+msgstr "Ufunguo wa hesabu"
 
 #: src/settings_translation_file.cpp
 msgid "Invert mouse"
-msgstr "Инвертировать мышь"
+msgstr "Pindua kipanya"
 
 #: src/settings_translation_file.cpp
 msgid "Invert vertical mouse movement."
-msgstr "Инвертировать мышь по вертикали."
+msgstr "Pindua harakati ya kipanya wima."
 
 #: src/settings_translation_file.cpp
 msgid "Item entity TTL"
-msgstr "Время жизни выброшенной вещи"
+msgstr "Kipengee chombo TTL"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Iterations of the recursive function.\n"
 "Controls the amount of fine detail."
 msgstr ""
+"Marudiorudio ya kazi recursive.\n"
+"Udhibiti kiasi cha undani faini."
+
+#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Kifimbocheza kitufe marudio nafasi"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "Kifimbocheza frustum unyeti"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2378,6 +2552,9 @@ msgid ""
 "Has no effect on 3D fractals.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Julia kuweka tu: W sehemu ya hypercomplex mara kwa mara umbo julia kukazia.\n"
+"Ina athari 3D fractals.\n"
+"Masafa ya takribani-2 hadi 2."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2385,6 +2562,8 @@ msgid ""
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Julia kuweka tu: X sehemu ya hypercomplex mara kwa mara umbo julia kukazia.\n"
+"Masafa ya takribani-2 hadi 2."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2392,6 +2571,8 @@ msgid ""
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Julia kuweka tu: sehemu Y ya hypercomplex mara kwa mara umbo julia kukazia.\n"
+"Masafa ya takribani-2 hadi 2."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2399,24 +2580,25 @@ msgid ""
 "shape.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"Julia kuweka tu: Z sehemu ya hypercomplex mara kwa mara umbo julia kukazia.\n"
+"Masafa ya takribani-2 hadi 2."
 
 #: src/settings_translation_file.cpp
 msgid "Jump key"
-msgstr "Кнопка прыжка"
+msgstr "Ufunguo wa kuruka"
 
 #: src/settings_translation_file.cpp
 msgid "Jumping speed"
-msgstr "Скорость прыжков"
+msgstr "Kuruka kasi"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Key for decreasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша отключения ограничения зоны видимости.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kupunguza kiwango cha kuonyesha.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2425,19 +2607,18 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша выкинуть выбранный предмет.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kuacha kipengee kilichoteuliwa kwa sasa.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Key for increasing the viewing range.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша отключения ограничения зоны видимости.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kuongeza kiwango cha kuonyesha.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2446,19 +2627,18 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша прыжка.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kuruka.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Key for moving fast in fast mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша для быстрого перемещения.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kusonga haraka katika hali ya haraka.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2467,8 +2647,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша движения назад.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kuhamia mchezaji nyuma.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2477,8 +2657,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша движения вперед.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kuhamia mchezaji mbele.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2487,8 +2667,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша движения влево.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kuhamia mchezaji kushoto.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2497,8 +2677,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша движения вправо.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kusonga mchezaji haki.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2507,8 +2687,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша открытия чат-консоли.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kufungua muano wa mazungumzo.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2517,8 +2697,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша открытия окна чата для ввода комманды.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kufungua dirisha la soga kuchapa amri.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2527,8 +2707,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша открытия окна чата.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kufungua dirisha la soga.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2537,8 +2717,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша открытия инвентаря.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kufungua hesabu.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2547,6 +2727,10 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Muhimu kwa ajili ya uchapishaji mipororo rekebishi. Kutumika kwa ajili ya "
+"maendeleo.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2556,10 +2740,10 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша красться.\n"
-"Также используется для спуска и погружения под воду, если aux1_descends "
-"отключена.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya sneaking.\n"
+"Pia kutumika kwa ajili ya kupanda na kushuka katika maji kama aux1_descends "
+"imelemazwa.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2568,8 +2752,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша переключения вида от первого и от третьего лица.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kubadili kati ya kamera ya kwanza - na -mtu wa tatu.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2578,8 +2762,18 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша снятия скриншота.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya kuchukua viwambo.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling autorun.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2588,8 +2782,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша переключения кинематографического режима.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya toggling hali ya cinematic.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2598,8 +2792,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша переключения отображения миникарты.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya toggling onyesho la minimap.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2608,8 +2802,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша переключения режима быстрого перемещения.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya toggling hali ya haraka.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2618,8 +2812,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша переключения режима полета.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya toggling kuruka.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2628,16 +2822,19 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша переключения режима проверки столкновений.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya toggling hali ya noclip.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Muhimu kwa ajili ya toggling sasaishi ya kamera. Tu kutumika kwa ajili ya "
+"maendeleo ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2645,8 +2842,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша переключения показа отладочной информации.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya toggling onyesho la maelezo kuhusu marekebisho.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2655,8 +2852,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша переключения отображения HUD.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya toggling onyesho la ya HUD.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2665,8 +2862,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша переключения отображения чата.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya toggling onyesho la kuzungumza.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2675,8 +2872,8 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша переключения отображения тумана.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya toggling onyesho la ukungu.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
@@ -2685,6 +2882,10 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
+"Muhimu kwa ajili ya toggling onyesho la profiler ya. Kutumika kwa ajili ya "
+"maendeleo.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2692,29 +2893,29 @@ msgid ""
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
-"Клавиша отключения ограничения зоны видимости.\n"
-"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Muhimu kwa ajili ya toggling masafa ya Mwoneko ukomo.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 
 #: src/settings_translation_file.cpp
 msgid "Key use for climbing/descending"
-msgstr ""
+msgstr "Matumizi muhimu kwa ajili ya kupanda/kushuka"
 
 #: src/settings_translation_file.cpp
 msgid "Language"
-msgstr "Язык"
+msgstr "Lugha"
 
 #: src/settings_translation_file.cpp
 msgid "Large cave depth"
-msgstr ""
+msgstr "Kina ya pango kubwa"
 
 #: src/settings_translation_file.cpp
 msgid "Lava Features"
-msgstr ""
+msgstr "Lava vipengele"
 
 #: src/settings_translation_file.cpp
 msgid "Leaves style"
-msgstr "Стиль листвы"
+msgstr "Mtindo wa majani"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2723,29 +2924,28 @@ msgid ""
 "-   Simple: only outer faces, if defined special_tiles are used\n"
 "-   Opaque: disable transparency"
 msgstr ""
-"Стили листвы:\n"
-"-   Fancy:  включена прозрачность, все стороны видны\n"
-"-   Simple: прозрачность включена, видны только внешние стороны, если "
-"используются special_tiles\n"
-"-   Opaque: прозрачность отключена"
+"Majani mtindo: - dhana: nyuso zote kuonekana - rahisi: tu nyuso nje, kama "
+"inavyoelezwa special_tiles ni kutumika - Opaque: Lemaza uwazi"
 
 #: src/settings_translation_file.cpp
 msgid "Left key"
-msgstr "Кнопка выхода"
+msgstr "Ufunguo wa kushoto"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Length of a server tick and the interval at which objects are generally "
 "updated over network."
 msgstr ""
+"Urefu wa alama ya tiki seva na nafasi ambayo vitu ni kwa ujumla kusasaishwa "
+"kwenye mtandao."
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between ABM execution cycles"
-msgstr ""
+msgstr "Urefu wa muda kati ya ABM utekelezaji mizunguko"
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "Urefu wa muda kati ya mzunguko wa utekelezaji wa NodeTimer"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2758,14 +2958,17 @@ msgid ""
 "-    info\n"
 "-    verbose"
 msgstr ""
+"Kiwango cha ufunguaji kuandikwa kwa debug.txt:- <nothing>(Hakuna ufunguaji) "
+"- Hakuna (ujumbe na hakuna kiwango) - kosa - tahadhari - hatua - taarifa - "
+"verbose</nothing>"
 
 #: src/settings_translation_file.cpp
 msgid "Limit of emerge queues on disk"
-msgstr ""
+msgstr "Kikomo ya foleni emerge kwenye diski"
 
 #: src/settings_translation_file.cpp
 msgid "Limit of emerge queues to generate"
-msgstr ""
+msgstr "Kikomo ya foleni emerge kuzalisha"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2775,60 +2978,84 @@ msgid ""
 "-    Downloads performed by main menu (e.g. mod manager).\n"
 "Only has an effect if compiled with cURL."
 msgstr ""
+"Mipaka idadi ya maombi HTTP sambamba. Huathiri: - vyombo vya habari kuchota "
+"kama seva hutumia kipimo cha remote_media.\n"
+"-Serverlist kupakua na seva tangazo.\n"
+"-Downloads zifanywe Menyu kuu (k.m Meneja Moduli).\n"
+"Tu ina athari kama alikusanya na Mkunjo."
 
 #: src/settings_translation_file.cpp
 msgid "Liquid fluidity"
-msgstr ""
+msgstr "Fluidity kioevu"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid fluidity smoothing"
-msgstr ""
+msgstr "Fluidity kioevu unyooshaji"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid loop max"
-msgstr ""
+msgstr "Kitanzi kioevu upeo"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid queue purge time"
-msgstr ""
+msgstr "Wakati wa usafishaji wa foleni ya kioevu"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid sink"
-msgstr ""
+msgstr "Kuzama kioevu"
 
 #: src/settings_translation_file.cpp
 msgid "Liquid update interval in seconds."
-msgstr "Интервал обновления жидкостей в секундах."
+msgstr "Sasisha kioevu nafasi katika sekunde."
 
 #: src/settings_translation_file.cpp
 msgid "Liquid update tick"
+msgstr "Pata sasishi kioevu"
+
+#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Kupakia profiler mchezo"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
 msgstr ""
+"Kupakia profiler mchezo kukusanya data ya ubainishaji wa mchezo.\n"
+"Hutoa amri /profiler kufikia umbo Kusanyo.\n"
+"Muhimu kwa watengenezaji Moduli na waendeshaji wa seva."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Inapakiza umbo Modifiers"
 
 #: src/settings_translation_file.cpp
 msgid "Main menu game manager"
-msgstr ""
+msgstr "Meneja wa mchezo wa Menyu kuu"
 
 #: src/settings_translation_file.cpp
 msgid "Main menu mod manager"
-msgstr "Мод менеджер главного меню"
+msgstr "Menyu kuu Moduli Meneja"
 
 #: src/settings_translation_file.cpp
 msgid "Main menu script"
-msgstr "Скрипт главного меню"
+msgstr "Hati ya Menyu kuu"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
 msgstr ""
-"Включить зависимость цвета тумана и облаков от времени суток (рассвет/закат)."
+"Kufanya rangi wa ukungu na anga hutegemea mchana (alfajiri/machweo) na "
+"kuonyesha mwelekeo."
 
 #: src/settings_translation_file.cpp
 msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
-msgstr ""
+msgstr "Hufanya DirectX kazi na LuaJIT. Lemaza ikiwa husababisha matatizo."
 
 #: src/settings_translation_file.cpp
 msgid "Map directory"
-msgstr "Каталог сохранения карт"
+msgstr "Orodha ya ramani"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2838,440 +3065,457 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Ramani kizazi sifa maalum kwa mabonde ya Mwandishi ramani.\n"
+"'altitude_chill' hufanya mwinuko wa juu baridi, ambayo inaweza kusababisha "
+"masuala ya biome.\n"
+"'humid_rivers' Inarekebisha unyevu kuzunguka mito na maeneo ambapo maji Je "
+"huwa na bwawa, inaweza kuingilia kati na biomes Imerekebisha maisha ya "
+"anasa.\n"
+"Bendera ambayo haijabainishwa katika Tungo ya bendera ni hayakubadilishwa "
+"kutoka chaguo-msingi.\n"
+"Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Ramani kizazi sifa maalum kwa Mwandishi ramani gorofa.\n"
+"Maziwa mara kwa mara na vilima vinaweza kuongezwa kwa ulimwengu gorofa.\n"
+"Bendera ambayo haijabainishwa katika Tungo ya bendera ni hayakubadilishwa "
+"kutoka chaguo-msingi.\n"
+"Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Ramani kizazi sifa maalum ya Mwandishi ramani v6.\n"
+"Wakati snowbiomes vimewezeshwa misitu otomatiki imewezeshwa, bendera ya "
+"'misitu' ni kupuuzwa.\n"
+"Bendera ambayo haijabainishwa katika Tungo ya bendera ni hayakubadilishwa "
+"kutoka chaguo-msingi.\n"
+"Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
+"Ramani kizazi sifa maalum kwa Mwandishi ramani v7.\n"
+"Bendera ya 'matuta' udhibiti mito.\n"
+"Bendera ambayo haijabainishwa katika Tungo ya bendera ni hayakubadilishwa "
+"kutoka chaguo-msingi.\n"
+"Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao."
 
 #: src/settings_translation_file.cpp
 msgid "Map generation limit"
-msgstr ""
+msgstr "Kikomo cha kizazi cha ramani"
 
 #: src/settings_translation_file.cpp
 msgid "Map save interval"
-msgstr "Интервал сохранения карты"
+msgstr "Ramani hifadhi muda"
 
 #: src/settings_translation_file.cpp
 msgid "Mapblock limit"
-msgstr ""
+msgstr "Kikomo cha Mapblock"
 
 #: src/settings_translation_file.cpp
 msgid "Mapblock unload timeout"
-msgstr ""
+msgstr "Mkatiko Muda Mapblock wakipakua"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen Valleys"
-msgstr "Название генератора карты"
+msgstr "Mwandishi ramani mabonde"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen biome heat noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani biome joto kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen biome humidity blend noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani biome unyevu mchanganyiko kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen biome humidity noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani biome unyevu kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen debug"
-msgstr "Дебаггинг генератора карты"
+msgstr "Utatuaji wa Mwandishi ramani"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flags"
-msgstr "Флаги генератора карты"
+msgstr "Bendera ya Mwandishi ramani"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat"
-msgstr "Флаги генератора карты"
+msgstr "Mwandishi ramani gorofa"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat cave width"
-msgstr "Флаги генератора карты"
+msgstr "Mwandishi ramani pango gorofa upana"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave1 noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani cave1 za gorofa kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave2 noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani cave2 za gorofa kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat filler depth noise parameters"
-msgstr ""
+msgstr "Filler wa gorofa ya Mwandishi ramani kina kelele vigezo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat flags"
-msgstr "Флаги генератора карты"
+msgstr "Mwandishi ramani gorofa bendera"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat ground level"
-msgstr "Флаги генератора карты"
+msgstr "Mwandishi ramani gorofa ngazi ya chini"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill steepness"
-msgstr ""
+msgstr "Mwandishi ramani gorofa kilima mwinuko"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat hill threshold"
-msgstr ""
+msgstr "Kilele cha mlima gorofa Mwandishi ramani"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat lake steepness"
-msgstr "Повторение параллакса"
+msgstr "Mwandishi ramani ziwa gorofa mwinuko"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat lake threshold"
-msgstr "Флаги генератора карты"
+msgstr "Mwandishi ramani ziwa gorofa kizingiti"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat large cave depth"
-msgstr ""
+msgstr "Mwandishi ramani pango kubwa gorofa kina"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat terrain noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani ardhi tambarare kelele vigezo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal"
-msgstr "Флаги генератора карты"
+msgstr "Fractal ya Mwandishi ramani"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal cave width"
-msgstr "Флаги генератора карты"
+msgstr "Mwandishi ramani fractal pango upana"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave1 noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani fractal cave1 kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave2 noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani fractal cave2 kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal filler depth noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani fractal filler kina kelele vigezo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal fractal"
-msgstr "Флаги генератора карты"
+msgstr "Mwandishi ramani fractal fractal"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal iterations"
-msgstr "Повторение параллакса"
+msgstr "Mwandishi ramani fractal Marudiorudio"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia w"
-msgstr ""
+msgstr "Mwandishi ramani fractal julia w"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia x"
-msgstr ""
+msgstr "Mwandishi ramani fractal julia x"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia y"
-msgstr ""
+msgstr "Mwandishi ramani fractal julia y"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal julia z"
-msgstr ""
+msgstr "Mwandishi ramani fractal julia z"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal offset"
-msgstr "Флаги генератора карты"
+msgstr "Mwandishi ramani fractal Sawazisha"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal scale"
-msgstr "Флаги генератора карты"
+msgstr "Mwandishi ramani fractal kipimo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal seabed noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani fractal seabed kelele vigezo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal slice w"
-msgstr "Флаги генератора карты"
+msgstr "Mwandishi ramani fractal kisu w"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen heat blend noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani joto mchanganyiko kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen name"
-msgstr "Название генератора карты"
+msgstr "Mwandishi ramani jina"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5"
-msgstr "Генератор карты версии 5"
+msgstr "Mwandishi ramani v5"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v5 cave width"
-msgstr "Генератор карты версии 5"
+msgstr "Mwandishi ramani v5 pango upana"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave1 noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v5 cave1 kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave2 noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v5 cave2 kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 factor noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v5 sababu kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 filler depth noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v5 filler kina kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 height noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v5 urefu kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6"
-msgstr "Генератор карты версии 6"
+msgstr "Mwandishi ramani v6"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 apple trees noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v6 apple miti kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 beach frequency"
-msgstr ""
+msgstr "Mwandishi ramani v6 pwani marudio"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 beach noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v6 pwani kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 biome noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v6 biome kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 cave noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v6 pango kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 desert frequency"
-msgstr ""
+msgstr "Mwandishi ramani v6 jangwa marudio"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 flags"
-msgstr ""
+msgstr "Mwandishi ramani v6 bendera"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 height select noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v6 urefu Teua vigezo kelele"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 humidity noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v6 unyevu kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 mud noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v6 matope kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 steepness noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v6 mwinuko kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 terrain altitude noise parameters"
-msgstr ""
+msgstr "Mwinuko wa ardhi ya Mwandishi ramani v6 kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 terrain base noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v6 ardhi kelele msingi vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v6 trees noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v6 miti kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7"
-msgstr "Генератор карты версии 7"
+msgstr "Mwandishi ramani v7"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v7 cave width"
-msgstr "Генератор карты версии 7"
+msgstr "Mwandishi ramani v7 pango upana"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave1 noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v7 cave1 kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave2 noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v7 cave2 kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 filler depth noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v7 filler kina kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 flags"
-msgstr ""
+msgstr "Mwandishi ramani v7 bendera"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 height select noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v7 urefu Teua vigezo kelele"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 mount height noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v7 mlima urefu kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 mountain noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v7 mlima kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 ridge noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v7 tuta kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 ridge water noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v7 tuta maji kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 terrain altitude noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v7 ardhi mwinuko kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 terrain base noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v7 ardhi kelele msingi vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 terrain persistation noise parameters"
-msgstr ""
+msgstr "Mwandishi ramani v7 ardhi persistation kelele vigezo"
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave depth"
-msgstr ""
+msgstr "Kina ya pango mkubwa"
 
 #: src/settings_translation_file.cpp
 msgid "Massive cave noise"
-msgstr ""
+msgstr "Kelele ya pango mkubwa"
 
 #: src/settings_translation_file.cpp
 msgid "Massive caves form here."
-msgstr ""
+msgstr "Fomu ya mapango mkubwa hapa."
 
 #: src/settings_translation_file.cpp
 msgid "Max block generate distance"
-msgstr ""
+msgstr "Umbo la Max kuzalisha umbali"
 
 #: src/settings_translation_file.cpp
 msgid "Max block send distance"
-msgstr ""
+msgstr "Umbo la Max Tuma umbali"
 
 #: src/settings_translation_file.cpp
 msgid "Max liquids processed per step."
-msgstr ""
+msgstr "Max viowevu kusindika kwa kila hatua."
 
 #: src/settings_translation_file.cpp
 msgid "Max. clearobjects extra blocks"
-msgstr ""
+msgstr "Max. clearobjects vitalu vya ziada"
 
 #: src/settings_translation_file.cpp
 msgid "Max. packets per iteration"
-msgstr ""
+msgstr "Max. pakiti kila Marudiorudio"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum FPS"
-msgstr "Максимальный FPS"
+msgstr "Ramprogrammen juu"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum FPS when game is paused."
-msgstr "Максимальный FPS в режиме паузы."
+msgstr "Ramprogrammen juu wakati mchezo umesitishwa."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum forceloaded blocks"
-msgstr ""
+msgstr "Forceloaded upeo vitalu"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum hotbar width"
-msgstr "Максимальная ширина хотбара"
+msgstr "Hotbar kiwango cha juu cha upana"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "Namba ya juu ya vitalu kwamba wakati huo huo hutumwa kwa jumla."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Namba ya juu ya vitalu kwamba ni wakati huo huo uliotumwa kwa mteja."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
+"Namba ya juu ya vitalu kwamba unaweza kwenye foleni kwa ajili ya kupakia."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Maximum number of blocks to be queued that are to be generated.\n"
 "Set to blank for an appropriate amount to be chosen automatically."
 msgstr ""
+"Namba ya juu ya vitalu kwa kuwa kwenye foleni kwamba ni kutengenezwa.\n"
+"Seti kwa wazi kwa kiasi sahihi ili uweze kuchaguliwa moja kwa moja."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Maximum number of blocks to be queued that are to be loaded from file.\n"
 "Set to blank for an appropriate amount to be chosen automatically."
 msgstr ""
+"Namba ya juu ya vitalu kwa kuwa kwenye foleni kwamba ni kupakiwa kutoka "
+"faili.\n"
+"Seti kwa wazi kwa kiasi sahihi ili uweze kuchaguliwa moja kwa moja."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum number of forceloaded mapblocks."
-msgstr ""
+msgstr "Namba ya juu ya forceloaded mapblocks."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Maximum number of mapblocks for client to be kept in memory.\n"
 "Set to -1 for unlimited amount."
 msgstr ""
+"Namba ya juu ya mapblocks kwa mteja kwa kuwekwa katika kumbukumbu.\n"
+"Seti -1 kwa kiasi ukomo."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3279,208 +3523,209 @@ msgid ""
 "try reducing it, but don't reduce it to a number below double of targeted\n"
 "client number."
 msgstr ""
+"Namba ya juu ya pakiti iliyotumwa kwa hatua ya kutuma, kama una muunganisho "
+"polepole jaribu kupunguza ni, lakini si ya kupunguza kadhaa chini ya mara "
+"mbili ya idadi ya mteja lengwa."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum number of players that can connect simultaneously."
-msgstr ""
+msgstr "Namba ya juu ya wachezaji ambao wanaweza kuunganisha wakati huo huo."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum number of statically stored objects in a block."
-msgstr ""
+msgstr "Namba ya juu ya vipengee statically kuhifadhiwa katika umbo la."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Vipengee juu kwa kila fungu"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
+"Uwiano juu ya dirisha la sasa kutumika kwa ajili ya hotbar.\n"
+"Muhimu kama kuna kitu cha kuonyeshwa kulia au kushoto wa hotbar."
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr ""
+msgid "Maximum simultaneous block sends per client"
+msgstr "Fungu juu ya samtidiga hutuma kwa mteja"
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
-msgstr ""
+msgid "Maximum simultaneous block sends total"
+msgstr "Fungu juu ya samtidiga hutuma jumla"
 
 #: src/settings_translation_file.cpp
 msgid "Maximum time in ms a file download (e.g. a mod download) may take."
 msgstr ""
+"Muda wa juu zaidi katika ms kupakua faili (kwa mfano upakuaji na Moduli) "
+"inaweza kuchukua."
 
 #: src/settings_translation_file.cpp
 msgid "Maximum users"
-msgstr "Максимальное количество пользователей"
-
-#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
+msgstr "Watumiaji wa kiwango cha juu"
 
 #: src/settings_translation_file.cpp
 msgid "Menus"
-msgstr "Меню"
+msgstr "Menyu"
 
 #: src/settings_translation_file.cpp
 msgid "Mesh cache"
-msgstr ""
+msgstr "Kirudufu cha matundu"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Message of the day"
-msgstr "Фраза дня"
+msgstr "Ujumbe wa siku ya"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Message of the day displayed to players connecting."
-msgstr "Фраза дня отображаемая подключившимся игрокам."
+msgstr "Ujumbe wa siku ya kuonyeshwa kwa wachezaji kuunganisha."
 
 #: src/settings_translation_file.cpp
 msgid "Method used to highlight selected object."
-msgstr ""
+msgstr "Mbinu inayotumiwa kuonyesha kipengee kilichoteuliwa."
 
 #: src/settings_translation_file.cpp
 msgid "Minimap"
-msgstr "Миникарта"
+msgstr "Ramani"
 
 #: src/settings_translation_file.cpp
 msgid "Minimap key"
-msgstr "Клавиша переключения миникарты"
+msgstr "Ufunguo wa minimap"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Minimap scan height"
-msgstr "Высота сканирования миникарты"
+msgstr "Ramani tambazo urefu"
 
 #: src/settings_translation_file.cpp
 msgid "Minimum texture size for filters"
-msgstr ""
+msgstr "Unamu wa kima cha chini cha ukubwa wa Vichujio"
 
 #: src/settings_translation_file.cpp
 msgid "Mipmapping"
-msgstr "Mip-текстурирование (Мип-маппинг)"
-
-#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
+msgstr "Mipmapping"
 
 #: src/settings_translation_file.cpp
 msgid "Modstore details URL"
-msgstr ""
+msgstr "Modstore maelezo URL"
 
 #: src/settings_translation_file.cpp
 msgid "Modstore download URL"
-msgstr ""
+msgstr "Modstore kupakua URL"
 
 #: src/settings_translation_file.cpp
 msgid "Modstore mods list URL"
-msgstr ""
+msgstr "Modstore mods orodha ya URL"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Monospace font path"
-msgstr "Путь моноширинного шрифта"
+msgstr "Monospace njia ya fonti"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Monospace font size"
-msgstr "Размер моноширинного шрифта"
+msgstr "Ukubwa wa fonti wa Monospace"
 
 #: src/settings_translation_file.cpp
 msgid "Mouse sensitivity"
-msgstr "Чувствительность мыши"
+msgstr "Unyeti wa kipanya"
 
 #: src/settings_translation_file.cpp
 msgid "Mouse sensitivity multiplier."
-msgstr "Множитель чувствительности мыши."
+msgstr "Mengi ya unyeti wa kipanya."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Multiplier for fall bobbing.\n"
 "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
 msgstr ""
+"Mengi kwa ajili ya kuanguka kando.\n"
+"Kwa mfano: 0 kwa ajili ya Mwoneko hakuna kando; 1.0 kwa ajili ya kawaida; "
+"2.0 kwa mara mbili."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Multiplier for view bobbing.\n"
 "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
 msgstr ""
+"Mengi kwa ajili ya Mwoneko kando.\n"
+"Kwa mfano: 0 kwa ajili ya Mwoneko hakuna kando; 1.0 kwa ajili ya kawaida; "
+"2.0 kwa mara mbili."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Name of map generator to be used when creating a new world.\n"
 "Creating a world in the main menu will override this."
 msgstr ""
-"Название генератора карты, используемого при создании мира.\n"
-"Создание мира из главного меню переопределит это."
+"Jina la ramani jenereta kutumika wakati wa kuunda dunia mpya.\n"
+"Kujenga ulimwengu katika Menyu kuu itakuwa vinabatilisha hii."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Name of the player.\n"
 "When running a server, clients connecting with this name are admins.\n"
 "When starting from the main menu, this is overridden."
 msgstr ""
-"Имя игрока.\n"
-"На сервере клиент с этим именем будет админом.\n"
-"Будет переопределено при запуске из главного меню."
+"Jina la mchezaji.\n"
+"Wakati kuendesha seva, wateja kuunganisha kwa jina hili ni admins.\n"
+"Wakati kuanzia Menyu kuu, hii ni kuuharibu."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Name of the server, to be displayed when players join and in the serverlist."
-msgstr "Имя сервера, отображаемое при входе и в списке серверов."
+msgstr ""
+"Jina la seva, kuonyeshwa wakati wachezaji kujiunga na katika serverlist ya."
 
 #: src/settings_translation_file.cpp
 msgid "Network"
-msgstr "Сеть"
+msgstr "Mtandao"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Network port to listen (UDP).\n"
 "This value will be overridden when starting from the main menu."
 msgstr ""
+"Mtandao bandari kusikiliza (UDP).\n"
+"Thamani hii itakuwa kuuharibu wakati kuanzia Menyu kuu."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "New users need to input this password."
-msgstr "Новым пользователям нужно вводить этот пароль."
+msgstr "Watumiaji wapya haja Ingiza nywila hii."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Noclip"
-msgstr "Отключить столкновения"
+msgstr "Noclip"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Noclip key"
-msgstr "Клавиша отключения столкновений"
+msgstr "Ufunguo wa Noclip"
 
 #: src/settings_translation_file.cpp
 msgid "Node highlighting"
-msgstr "Подсветка нод"
+msgstr "Fundo udhulisho"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "NodeTimer interval"
-msgstr "Интервал отправки"
+msgstr "Nafasi ya NodeTimer"
 
 #: src/settings_translation_file.cpp
 msgid "Noise parameters for biome API temperature, humidity and biome blend."
-msgstr ""
+msgstr "Kelele vigezo vya biome API joto, unyevu na biome mchanganyiko."
 
 #: src/settings_translation_file.cpp
 msgid "Noises"
-msgstr ""
+msgstr "Kila"
 
 #: src/settings_translation_file.cpp
 msgid "Normalmaps sampling"
-msgstr ""
+msgstr "Sampuli ya Normalmaps"
 
 #: src/settings_translation_file.cpp
 msgid "Normalmaps strength"
-msgstr ""
+msgstr "Nguvu ya Normalmaps"
 
 #: src/settings_translation_file.cpp
 msgid "Number of emerge threads"
-msgstr ""
+msgstr "Idadi ya nyuzi emerge"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3490,6 +3735,9 @@ msgid ""
 "speed greatly\n"
 "at the cost of slightly buggy caves."
 msgstr ""
+"Idadi ya nyuzi emerge kutumia. Kufanya hii shamba tupu, au kuongeza idadi "
+"hii kutumia nyuzi nyingi. Kwenye mifumo ya multiprocessor, hii itasaidia "
+"kuongeza kasi ya mwandishi ramani sana wanatengeneza mapango buggy kidogo."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3497,106 +3745,117 @@ msgid ""
 "This is a trade-off between sqlite transaction overhead and\n"
 "memory consumption (4096=100MB, as a rule of thumb)."
 msgstr ""
+"Idadi ya vitalu ziada ambayo inaweza kupakiwa na /clearobjects mara moja.\n"
+"Hii ni mikinzano kati sqlite shughuli uendeshaji na matumizi ya kumbukumbu "
+"(4096 = 100 MB, kama kanuni ya thumb)."
 
 #: src/settings_translation_file.cpp
 msgid "Number of parallax occlusion iterations."
-msgstr ""
+msgstr "Idadi ya parallax occlusion Marudiorudio."
 
 #: src/settings_translation_file.cpp
 msgid "Overall bias of parallax occlusion effect, usually scale/2."
-msgstr ""
+msgstr "Upendeleo wa jumla wa parallax occlusion athari, kawaida kipimo/2."
 
 #: src/settings_translation_file.cpp
 msgid "Overall scale of parallax occlusion effect."
-msgstr ""
+msgstr "Kipimo cha jumla ya parallax occlusion athari."
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion"
-msgstr "Включить параллакс"
+msgstr "Parallax occlusion"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion Scale"
-msgstr "Масштаб параллакса"
+msgstr "Parallax occlusion wadogo"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion bias"
-msgstr "Смещение параллакса"
+msgstr "Parallax occlusion upendeleo"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion iterations"
-msgstr "Повторение параллакса"
+msgstr "Parallax occlusion Marudiorudio"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion mode"
-msgstr "Режим параллакса"
+msgstr "Parallax occlusion hali"
 
 #: src/settings_translation_file.cpp
 msgid "Parallax occlusion strength"
-msgstr "Сила параллакса"
+msgstr "Parallax occlusion nguvu"
 
 #: src/settings_translation_file.cpp
 msgid "Path to TrueTypeFont or bitmap."
-msgstr ""
+msgstr "Njia ya TrueTypeFont au vitone michoro."
 
 #: src/settings_translation_file.cpp
 msgid "Path to save screenshots at."
-msgstr "Путь для сохранения скриншотов."
+msgstr "Njia ya kuokoa viwambo katika."
 
 #: src/settings_translation_file.cpp
 msgid "Path to texture directory. All textures are first searched from here."
-msgstr ""
-"Путь до каталога с текстурами. Все текстуры в первую очередь берутся от сюда."
+msgstr "Njia ya orodha ya unamu. Unamu wote vinatafutizwa kwanza kutoka hapa."
 
 #: src/settings_translation_file.cpp
 msgid "Physics"
-msgstr "Физика"
+msgstr "Fizikia"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Player is able to fly without being affected by gravity.\n"
 "This requires the \"fly\" privilege on the server."
 msgstr ""
-"Игрок может летать без влияния гравитации.\n"
-"Это требует привилегии fly на сервере."
+"Mchezaji ni uwezo wa kuruka bila kuwa walioathirika na mvuto.\n"
+"Hii inahitaji upendeleo \"kuruka\" kwenye seva."
 
 #: src/settings_translation_file.cpp
 msgid "Player name"
-msgstr "Имя игрока"
+msgstr "Jina la mchezaji"
 
 #: src/settings_translation_file.cpp
 msgid "Player transfer distance"
-msgstr ""
+msgstr "Umbali wa uhamisho wa mchezaji"
 
 #: src/settings_translation_file.cpp
 msgid "Player versus Player"
-msgstr "PvP"
+msgstr "Mchezaji dhidi ya mchezaji"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Port to connect to (UDP).\n"
 "Note that the port field in the main menu overrides this setting."
 msgstr ""
+"Bandari ya kuunganishwa (UDP).\n"
+"Kumbuka kwamba uwanja wa bandari katika Menyu kuu Puuza kipimo hiki."
 
 #: src/settings_translation_file.cpp
 msgid "Prevent mods from doing insecure things like running shell commands."
+msgstr "Kuzuia mods kufanya mambo zisizo kama kuendesha amri ya Sheli."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
 msgstr ""
+"Chapisha injini ya ubainishaji data katika vipindi vya kawaida (katika "
+"sekunde). 0 = Lemaza. Muhimu kwa watengenezaji."
 
 #: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
-msgstr ""
+msgstr "Marupurupu ya wachezaji na basic_privs unaweza ruzuku"
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr ""
+msgid "Profiler"
+msgstr "Profiler"
 
 #: src/settings_translation_file.cpp
 msgid "Profiler toggle key"
-msgstr ""
+msgstr "Profiler kibonye"
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr ""
+msgid "Profiling"
+msgstr "Ubainishaji wa"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3604,73 +3863,77 @@ msgid ""
 "Values larger than 26 will start to produce sharp cutoffs at cloud area "
 "corners."
 msgstr ""
+"Eneo la eneo la wingu alisema katika idadi ya 64 fundo wingu miraba.\n"
+"Thamani kubwa kuliko 26 itaanza kuzalisha cutoffs mkali katika wingu eneo la "
+"pembe."
 
 #: src/settings_translation_file.cpp
 msgid "Raises terrain to make valleys around the rivers"
-msgstr ""
+msgstr "Huwafufua ardhi kufanya mabonde kuzunguka mito"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Random input"
-msgstr "Случайный ввод"
+msgstr "Ingizo la nasibu"
 
 #: src/settings_translation_file.cpp
 msgid "Range select key"
-msgstr "Кнопка настройки дальности видимости"
+msgstr "Kibonye Teua masafa"
 
 #: src/settings_translation_file.cpp
 msgid "Remote media"
-msgstr ""
+msgstr "Midia ya mbali"
 
 #: src/settings_translation_file.cpp
 msgid "Remote port"
-msgstr "Удаленный порт"
+msgstr "Bandari ya mbali"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Replaces the default main menu with a custom one."
-msgstr "Заменять главное меню на пользовательское."
+msgstr "Kinabadilisha chaguo-msingi Menyu kuu kwa moja maalum."
+
+#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Njia ya ripoti"
 
 #: src/settings_translation_file.cpp
 msgid "Right key"
-msgstr "Правая клавиша меню"
+msgstr "Ufunguo sahihi"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Rightclick repetition interval"
-msgstr "Интервал повторного клика правой кнопкой."
+msgstr "Bofya kulia marudio nafasi"
 
 #: src/settings_translation_file.cpp
 msgid "River Depth"
-msgstr ""
+msgstr "Kina wa mto"
 
 #: src/settings_translation_file.cpp
 msgid "River Noise"
-msgstr ""
+msgstr "Kelele za mto"
 
 #: src/settings_translation_file.cpp
 msgid "River Size"
-msgstr ""
+msgstr "Ukubwa wa mto"
 
 #: src/settings_translation_file.cpp
 msgid "River noise -- rivers occur close to zero"
-msgstr ""
+msgstr "Kelele za mto - mito kutokea karibu na sifuri"
 
 #: src/settings_translation_file.cpp
 msgid "Rollback recording"
-msgstr ""
+msgstr "Mserereko kurekodi"
 
 #: src/settings_translation_file.cpp
 msgid "Round minimap"
-msgstr ""
+msgstr "Ramani pande zote"
 
 #: src/settings_translation_file.cpp
 msgid "Save the map received by the client on disk."
-msgstr ""
+msgstr "Hifadhi ramani kupokelewa na mteja kwenye diski."
 
 #: src/settings_translation_file.cpp
 msgid "Saving map received from server"
-msgstr ""
+msgstr "Ramani kuokoa kupokea kutoka seva"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3680,32 +3943,35 @@ msgid ""
 "pixels when scaling down, at the cost of blurring some\n"
 "edge pixels when images are scaled by non-integer sizes."
 msgstr ""
+"Rekebisha gui kwa mtumiaji maalum thamani.\n"
+"Tumia kichujio karibu-jirani-Waanti-Lakabu Rekebisha GUI ya.\n"
+"Hii laini baadhi ya kingo mbaya, na mchanganyiko pikseli wakati upimaji "
+"chini, wanatengeneza ukungu wa jinsia pikseli baadhi makali wakati picha ni "
+"yamesimamisha na ukubwa wa yasiyo ya takwimu."
 
 #: src/settings_translation_file.cpp
 msgid "Screen height"
-msgstr "Высота экрана"
+msgstr "Urefu wa kiwamba"
 
 #: src/settings_translation_file.cpp
 msgid "Screen width"
-msgstr "Ширина экрана"
+msgstr "Upana wa kiwamba"
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot"
-msgstr "Cкриншот"
+msgstr "Screenshot"
 
 #: src/settings_translation_file.cpp
 msgid "Screenshot folder"
-msgstr "Каталог со скриншотами"
+msgstr "Screenshot kabrasha"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot format"
-msgstr "Каталог со скриншотами"
+msgstr "Screenshot umbizo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot quality"
-msgstr "Cкриншот"
+msgstr "Screenshot ubora"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3713,176 +3979,160 @@ msgid ""
 "1 means worst quality; 100 means best quality.\n"
 "Use 0 for default quality."
 msgstr ""
+"Screenshot ubora. Tu kutumika kwa ajili ya Umbiza JPEG.\n"
+"1 maana ubora mbaya; 100 humaanisha ubora.\n"
+"Tumia 0 kwa ubora wa chaguo-msingi."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Security"
-msgstr "Безопасность"
+msgstr "Usalama"
 
 #: src/settings_translation_file.cpp
 msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
-msgstr "Смотрите http://www.sqlite.org/pragma.html#pragma_synchronous"
+msgstr "Ona http://www.sqlite.org/pragma.html#pragma_synchronous"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Selection box border color (R,G,B)."
-msgstr "Цвет рамки выделения (R, G, B)."
+msgstr "Uteuzi kikasha mpaka rangi (R, G, B)."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Selection box color"
-msgstr "Цвет выделения"
+msgstr "Uteuzi kikasha rangi"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Selection box width"
-msgstr "Ширина рамки выделения"
+msgstr "Uteuzi kikasha upana"
 
 #: src/settings_translation_file.cpp
 msgid "Server / Singleplayer"
-msgstr "Сервер / одиночная игра"
+msgstr "Seva / Singleplayer"
 
 #: src/settings_translation_file.cpp
 msgid "Server URL"
-msgstr "URL сервера"
+msgstr "URL ya seva"
 
 #: src/settings_translation_file.cpp
 msgid "Server address"
-msgstr "Адрес сервера"
+msgstr "Anwani ya seva"
 
 #: src/settings_translation_file.cpp
 msgid "Server description"
-msgstr "Описание сервера"
+msgstr "Maelezo ya seva"
 
 #: src/settings_translation_file.cpp
 msgid "Server name"
-msgstr "Имя сервера"
+msgstr "Jina la seva"
 
 #: src/settings_translation_file.cpp
 msgid "Server port"
-msgstr "Порт сервера"
+msgstr "Kituo tarishi cha seva"
 
 #: src/settings_translation_file.cpp
 msgid "Serverlist URL"
-msgstr "Список публичных серверов"
+msgstr "URL ya Serverlist"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Serverlist file"
-msgstr "Список публичных серверов"
+msgstr "Faili ya Serverlist"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Set the language. Leave empty to use the system language.\n"
 "A restart is required after changing this."
 msgstr ""
-"Установка языка. Оставьте пустым для использования системного языка.\n"
-"Требует перезапуска после установки."
+"Seti lugha. Acha tupu kwa kutumia lugha ya mfumo.\n"
+"Kuanza upya inahitajika baada ya kubadilisha hii."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Set to true enables waving leaves.\n"
 "Requires shaders to be enabled."
 msgstr ""
-"Установка в true включает покачивание листвы.\n"
-"Это требует включение шейдеров."
+"Kuweka huwezesha kweli waving majani.\n"
+"Inahitaji shaders kwa kuwezeshwa."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Set to true enables waving plants.\n"
 "Requires shaders to be enabled."
 msgstr ""
-"Установка в true включает покачивание растений.\n"
-"Это требует включение шейдеров."
+"Kuweka huwezesha kweli waving mimea.\n"
+"Inahitaji shaders kwa kuwezeshwa."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Set to true enables waving water.\n"
 "Requires shaders to be enabled."
 msgstr ""
-"Установка в true включает волны на воде.\n"
-"Это требует включение шейдеров."
+"Kuweka huwezesha kweli waving maji.\n"
+"Inahitaji shaders kwa kuwezeshwa."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
-"Шейдеры позволяют использовать дополнительные визуальные эффекты и могут "
-"увеличить производительность на некоторых видеокартах.\n"
-"Они работают только с видео серверной OpenGL."
+"Shaders kuruhusu athari pevu onekana na inaweza kuongeza utendaji wa baadhi "
+"ya kadi ya video.\n"
+"Kazi yako tu na OpenGL video backend."
 
 #: src/settings_translation_file.cpp
 msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr ""
+msgstr "Sura ya minimap ya. Kuwezeshwa = pande zote, walemavu = mraba."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Show debug info"
-msgstr "Показывать отладочную информацию."
+msgstr "Onyesha maelezo kuhusu marekebisho"
 
 #: src/settings_translation_file.cpp
 msgid "Show entity selection boxes"
-msgstr ""
+msgstr "Onyesha chombo masanduku ya uteuzi"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Shutdown message"
-msgstr "Сообщение о выключении"
+msgstr "Uzimaji ujumbe"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Size of chunks to be generated at once by mapgen, stated in mapblocks (16 "
 "nodes)."
 msgstr ""
-"Размер чанка, генерируемого за один раз, установленный в мапблоках (16 "
-"кубиков)."
+"Ukubwa wa kikidondoka kutengenezwa mara kwa mwandishi ramani, katika "
+"mapblocks (fundo 16)."
 
 #: src/settings_translation_file.cpp
 msgid "Slope and fill work together to modify the heights"
-msgstr ""
+msgstr "Mteremko na Jaza kazi pamoja kurekebisha urefu"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Smooth lighting"
-msgstr "Мягкое освещение"
+msgstr "Taa laini"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
-"Сглаживать движения камеры при ходьбе и поворотах.\n"
-"Это может быть полезно при записи видео."
+"Smooths kamera wakati wa kutafuta karibu. Pia huitwa kuangalia au kipanya "
+"unyooshaji.\n"
+"Muhimu kwa ajili ya kurekodi video."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
-msgstr ""
-"Плавное вращение камеры в кинематографическом режиме. 0 для отключения."
+msgstr "Smooths mzunguko wa kamera katika hali-tumizi cinematic. 0 kulemaza."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Smooths rotation of camera. 0 to disable."
-msgstr "Плавное вращение камеры. 0 для отключения."
+msgstr "Smooths mzunguko wa kamera. 0 kulemaza."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Sneak key"
-msgstr "Красться"
+msgstr "Zawadi muhimu"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Sound"
-msgstr "Звук"
+msgstr "Sauti"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3891,36 +4141,39 @@ msgid ""
 "(obviously, remote_media should end with a slash).\n"
 "Files that are not present will be fetched the usual way."
 msgstr ""
+"Inabainisha URL kutoka ambayo mteja fetches vyombo vya habari badala ya "
+"kutumia UDP.\n"
+"$filename lazima kupatikana kutoka $remote_media$ JinaFaili kupitia cURL (ni "
+"wazi, remote_media lazima kumaliza na kufyeka na).\n"
+"Faili ambayo sasa itakuwa kuwa fetched njia ya kawaida."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Static spawnpoint"
-msgstr "Постоянное место спавна"
+msgstr "Spawnpoint tuli"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Strength of generated normalmaps."
-msgstr "Генерировать карты нормалей"
+msgstr "Nguvu ya normalmaps inayozalishwa."
 
 #: src/settings_translation_file.cpp
 msgid "Strength of parallax."
-msgstr ""
+msgstr "Nguvu ya parallax."
 
 #: src/settings_translation_file.cpp
 msgid "Strict protocol checking"
-msgstr ""
+msgstr "Itifaki ya kali kukagua"
 
 #: src/settings_translation_file.cpp
 msgid "Support older servers"
-msgstr ""
+msgstr "Msaada mkubwa seva"
 
 #: src/settings_translation_file.cpp
 msgid "Synchronous SQLite"
-msgstr ""
+msgstr "SQLite Uvingirizi"
 
 #: src/settings_translation_file.cpp
 msgid "Terrain Height"
-msgstr ""
+msgstr "Urefu wa ardhi"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3928,6 +4181,9 @@ msgid ""
 "Controls proportion of world area covered by hills.\n"
 "Adjust towards 0.0 for a larger proportion."
 msgstr ""
+"Ardhi kelele kizingiti kwa milima.\n"
+"Vidhibiti vya uwiano wa dunia eneo lililofunikwa na milima.\n"
+"Rekebisha kuelekea 0.0 kwa sehemu kubwa."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3935,36 +4191,59 @@ msgid ""
 "Controls proportion of world area covered by lakes.\n"
 "Adjust towards 0.0 for a larger proportion."
 msgstr ""
+"Ardhi kelele kizingiti kwa ajili ya maziwa.\n"
+"Vidhibiti vya uwiano wa dunia eneo lililofunikwa na maziwa.\n"
+"Rekebisha kuelekea 0.0 kwa sehemu kubwa."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Texture path"
-msgstr "Пакеты текстур"
+msgstr "Njia ya unamu"
 
 #: src/settings_translation_file.cpp
 msgid "The altitude at which temperature drops by 20C"
+msgstr "Mwinuko katika matone ambayo joto na 20C"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
 msgstr ""
+"Umbizo wa chaguo-msingi ambayo maumbo ni kuokoka, wakati wito '/ profiler\n"
+"Hifadhi [umbizo]' bila umbizo."
 
 #: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
+msgstr "Kina cha uchafu au filler nyingine"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
 msgstr ""
+"Kijia cha faili jamaa yako worldpath ambayo maumbo utaakibishwa kwenye.\n"
 
 #: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
-msgstr ""
+msgstr "Interface mtandao kwamba seva husikiliza juu."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "The privileges that new users automatically get.\n"
 "See /privs in game for a full list on your server and mod configuration."
 msgstr ""
-"Привилегии, автоматически получаемые новым пользователем.\n"
-"Смотрите /privs для получения полного списка привилегий."
+"Upendeleo kwamba watumiaji wapya otomatiki kupata.\n"
+"Ona /privs katika mchezo kwa ajili ya orodha kamili kwenye msabidi wa seva "
+"na Moduli."
 
 #: src/settings_translation_file.cpp
 msgid "The rendering back-end for Irrlicht."
-msgstr ""
+msgstr "Utungulizaji nyuma-mwisho wa Irrlicht."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr "Unyeti wa Jira kifimbocheza kwa kuzunguka Mwoneko ingame frustum."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3973,6 +4252,10 @@ msgid ""
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
 "set to the nearest valid value."
 msgstr ""
+"Nguvu (giza) ya fundo iliyoko occlusion kivuli.\n"
+"Chini ni nyeusi, juu ni hafifu. Masafa halali ya thamani kwa ajili ya kipimo "
+"hiki ni 0.25 kwa 4.0 jumuishi. Kama thamani iko nje ya masafa ni itasetiwa "
+"kwenye ya karibu Thamani halali."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3980,47 +4263,55 @@ msgid ""
 "capacity until an attempt is made to decrease its size by dumping old queue\n"
 "items.  A value of 0 disables the functionality."
 msgstr ""
+"Muda (katika sekunde) kuwa foleni ya viowevu inaweza kukua zaidi usindikaji "
+"uwezo hadi jaribio ni alifanya kupungua ukubwa wake na utupaji vipengee "
+"kongwe ya foleni.  Thamani ya 0 Hulemaza utendaji."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"Wakati katika sekunde inachukua kati ya matukio ya mara kwa mara wakati "
+"kushikilia chini kifimbocheza kitufe mchanganyiko."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
-msgstr "Задержка в секундах между кликами при зажатой правой кнопке мыши."
+msgstr ""
+"Wakati katika sekunde inachukua kati ya vibonyezo mara kwa mara sahihi "
+"wakati wa kufanya kitufe cha kulia."
 
 #: src/settings_translation_file.cpp
 msgid "This font will be used for certain languages."
-msgstr ""
+msgstr "Fonti hii itatumika kwa lugha fulani."
 
 #: src/settings_translation_file.cpp
 msgid "Time in between active block management cycles"
-msgstr ""
+msgstr "Muda kati ya mizunguko ya usimamizi ya fungu amilifu"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Time in seconds for item entity (dropped items) to live.\n"
 "Setting it to -1 disables the feature."
 msgstr ""
-"Время жизни выброшенных предметов.\n"
-"Установите в -1 для отключения этой функции."
+"Wakati katika sekunde kwa kipengee chombo (vitu chopo) kuishi.\n"
+"Kuweka kwa -1 Hulemaza kipengele."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Time send interval"
-msgstr "Интервал отправки"
+msgstr "Wakati kutuma nafasi"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Time speed"
-msgstr "Скорость хода времени"
+msgstr "Kasi ya muda"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Timeout for client to remove unused map data from memory."
 msgstr ""
-"Время, после которого клиент удаляет из памяти неиспользуемую информацию о "
-"карте."
+"Muda wa kuisha kwa mteja kuondoa data ya ramani zisizotumika kutoka kwa "
+"kumbukumbu."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4029,161 +4320,141 @@ msgid ""
 "This determines how long they are slowed down after placing or removing a "
 "node."
 msgstr ""
+"Kupunguza bakia, uhamisho wa fungu ni sjunkit wakati mchezaji ni kujenga "
+"kitu.\n"
+"Hii huamua lini wao ni sjunkit baada ya kuweka au kuondoa fundo."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Toggle camera mode key"
-msgstr "Клавиша переключения режима камеры."
+msgstr "Togoa kamera hali muhimu"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Tooltip delay"
-msgstr "Задержка подсказки."
+msgstr "Kidokezozana kuchelewa"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Trilinear filtering"
-msgstr "Трилинейная фильтрация"
+msgstr "Uchujaji wa trilinear"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "True = 256\n"
 "False = 128\n"
 "Useable to make minimap smoother on slower machines."
 msgstr ""
-"True = 256\n"
-"False = 128\n"
-"Полезно для плавной миникарты на медленных машинах."
+"Kweli = 256 bandia = Useable 128 kufanya minimap laini juu ya mashine "
+"polepole."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Trusted mods"
-msgstr "Доверенные моды"
+msgstr "Mods aminifu"
 
 #: src/settings_translation_file.cpp
 msgid "URL to the server list displayed in the Multiplayer Tab."
 msgstr ""
+"URL kwenye orodha ya seva iliyoonyeshwa katika kichupo cha Multiplayer."
 
 #: src/settings_translation_file.cpp
 msgid "Unlimited player transfer distance"
-msgstr ""
+msgstr "Umbali wa uhamisho wa mchezaji ukomo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Unload unused server data"
-msgstr "Выгружать неиспользуемые сервером данные"
+msgstr "Wakipakua zisizotumika seva ya data"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Use 3D cloud look instead of flat."
-msgstr "Объемные облака вместо плоских."
+msgstr "Matumizi wingu 3D kuangalia badala ya gorofa."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Use a cloud animation for the main menu background."
-msgstr "Анимированные облака в главном меню."
+msgstr "Tumia uhuishaji wa wingu ya mandharinyuma ya Menyu kuu."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Use anisotropic filtering when viewing at textures from an angle."
-msgstr "Использовать анизатропную фильтрацию про взгляде под углом."
+msgstr "Tumia uchujaji anisotropic wakati unatazama katika unamu kutoka pembe."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Use bilinear filtering when scaling textures."
-msgstr "Использовать билинейную фильтрацию для масштабирования текстур."
+msgstr "Tumia uchujaji bilinear wakati upimaji unamu."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Use key"
-msgstr "нажмите клавишу"
+msgstr "Ufunguo wa matumizi"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Use mip mapping to scale textures. May slightly increase performance."
 msgstr ""
-"Использовать мип-маппинг для масштабирования текстур. Может немного "
-"увеличить производительность."
+"Tumia ramani ya malaria kwa kipimo cha unamu. Huenda kidogo kuongeza "
+"utendaji."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Use trilinear filtering when scaling textures."
-msgstr "Использовать трилинейную фильтрацию для масштабировании текстур."
+msgstr "Tumia uchujaji trilinear wakati upimaji unamu."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Разработчики в отставке"
-
-#: src/settings_translation_file.cpp
-#, fuzzy
 msgid "V-Sync"
-msgstr "V-Sync"
+msgstr "V-ulandanishi"
 
 #: src/settings_translation_file.cpp
 msgid "VBO"
-msgstr ""
+msgstr "VBO"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Depth"
-msgstr ""
+msgstr "Kina wa Bonde"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Fill"
-msgstr ""
+msgstr "Jaza ya Bonde"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Profile"
-msgstr ""
+msgstr "Maelezo mafupi ya Bonde"
 
 #: src/settings_translation_file.cpp
 msgid "Valley Slope"
-msgstr ""
+msgstr "Mteremko wa Bonde"
 
 #: src/settings_translation_file.cpp
 msgid "Valleys C Flags"
-msgstr ""
+msgstr "Bendera ya mabonde C"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Vertical screen synchronization."
-msgstr "Вертикальная синхронизация."
+msgstr "Ulandanishi wa kiwamba wima."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Video driver"
-msgstr "Видео драйвер."
+msgstr "Kiendeshaji video"
 
 #: src/settings_translation_file.cpp
 msgid "View bobbing"
-msgstr ""
+msgstr "Mwoneko kando"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "View distance in nodes.\n"
 "Min = 20"
 msgstr ""
+"Onyesha umbali katika fundo.\n"
+"Min = 20"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "View range decrease key"
-msgstr "Клавиша уменьшения видимого диапазона."
+msgstr "Mwoneko masafa Punguza ufunguo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "View range increase key"
-msgstr "Клавиша увеличения видимого диапазона."
+msgstr "Mwoneko masafa ongezeko muhimu"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Viewing range"
-msgstr "Максимальная граница дальности отрисовки."
+msgstr "Kuonyesha masafa"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Volume"
-msgstr "Громкость звука"
+msgstr "Kiasi"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4192,54 +4463,54 @@ msgid ""
 "Has no effect on 3D fractals.\n"
 "Range roughly -2 to 2."
 msgstr ""
+"W kuratibu ya yanayotokana 3D kisu wa fractal wa 4 D.\n"
+"Huamua kisu ambayo 3D wa umbo 4D huundwa.\n"
+"Ina athari 3D fractals.\n"
+"Masafa ya takribani-2 hadi 2."
 
 #: src/settings_translation_file.cpp
 msgid "Walking speed"
-msgstr "Скорость ходьбы"
+msgstr "Kutembea kasi"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Water Features"
-msgstr "Текстуры предметов..."
+msgstr "Vipengele vya maji"
 
 #: src/settings_translation_file.cpp
 msgid "Water level"
-msgstr ""
+msgstr "Kiwango cha maji"
 
 #: src/settings_translation_file.cpp
 msgid "Water surface level of the world."
-msgstr ""
+msgstr "Maji ngazi ya uso wa dunia."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving Nodes"
-msgstr "Покачивание листвы"
+msgstr "Waving fundo"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving leaves"
-msgstr "Покачивание листвы"
+msgstr "Waving majani"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Waving plants"
-msgstr "Покачивание растений"
+msgstr "Waving mimea"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water"
-msgstr "Волны на воде"
+msgstr "Waving maji"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water height"
-msgstr "Высота волн на воде"
+msgstr "Waving maji urefu"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water length"
-msgstr "Длина волн на воде"
+msgstr "Waving maji urefu"
 
 #: src/settings_translation_file.cpp
 msgid "Waving water speed"
-msgstr "Скорость волн на воде"
+msgstr "Waving kasi ya maji"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4247,14 +4518,21 @@ msgid ""
 "filtered in software, but some images are generated directly\n"
 "to hardware (e.g. render-to-texture for nodes in inventory)."
 msgstr ""
+"Wakati gui_scaling_filter ni kweli, yote GUI picha haja ya kuchujwa katika "
+"programu, lakini taswira zingine hutolewa moja kwa moja kwa maunzi (k.m "
+"kutoa-kwa-unamu kwa fundo katika hesabu)."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
+"Wakati gui_scaling_filter_txr2img ni kweli, kunakili picha hizo kutoka "
+"maunzi na programu kwa ajili ya kurekebisha.  Wakati uongo, kuanguka nyuma "
+"kwa mbinu ya zamani ya kipimo, kwa madereva video vizuri siungi mkono unamu "
+"Inapakua nyuma kutoka maunzi."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4266,6 +4544,13 @@ msgid ""
 "have a visible effect unless bilinear/trilinear/anisotropic filtering is\n"
 "enabled."
 msgstr ""
+"Wakati wa kutumia Vichujio bilinear/trilinear/anisotropic, unamu low-"
+"resolution unaweza kizunguzungu, hivyo otomatiki upscale yao na karibu "
+"jirani interpolation kuhifadhi pikseli hubainisha.  Hii Seti Ukubwa wa unamu "
+"chini kwa ajili ya unamu upscaled; thamani ya juu kuangalia kali, lakini "
+"zinahitaji kumbukumbu zaidi.  Nguvu ya 2 ni ilipendekeza.  Kuweka hii zaidi "
+"1 usiwe na athari inayoonekana isipokuwa uchujaji wa bilinear/trilinear/"
+"anisotropic ni kuwezeshwa."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4276,46 +4561,52 @@ msgid ""
 "-    Those groups have an offset of -32, -32 nodes from the origin.\n"
 "-    Only groups which are within the map_generation_limit are generated"
 msgstr ""
+"Ambapo jenereta ramani hukomesha.\n"
+"Tafadhali kumbuka: - mdogo kwa 31000 (kipimo hapo juu ina athari) - jenereta "
+"ramani kazi katika makundi ya 80 x 80 x 80 fundo (5 x 5 x 5 MapBlocks).\n"
+"-Vikundi hivyo kuwa nje ya uwekaji wa-32,-32 fundo kutoka asili.\n"
+"-Tu vikundi vilivyo ndani ya map_generation_limit ni yanayotokana"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Whether freetype fonts are used, requires freetype support to be compiled in."
 msgstr ""
+"Kama freetype fonti hutumiwa, inahitaji msaada wa freetype kuwa alikusanya "
+"katika."
 
 #: src/settings_translation_file.cpp
 msgid "Whether node texture animations should be desynchronized per mapblock."
-msgstr ""
+msgstr "Kama fundo unamu uhuishaji lazima desynchronized kwa mapblock."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Whether players are shown to clients without any range limit.\n"
 "Deprecated, use the setting player_transfer_distance instead."
 msgstr ""
+"Kama wachezaji huonyeshwa kwa wateja bila kikomo yoyote mbalimbali.\n"
+"Deprecated, Tumia kipimo player_transfer_distance badala yake."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Whether to allow players to damage and kill each other."
-msgstr "Разрешить игрокам сражаться друг с другом."
+msgstr "Kama kuruhusu wachezaji kuharibu na kuua kila mmoja."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Whether to ask clients to reconnect after a (Lua) crash.\n"
 "Set this to true if your server is set up to restart automatically."
 msgstr ""
-"Опрашивать клиентов для переподключения после падения.\n"
-"Установите это если ваш сервер настроен на автоматический перезапуск."
+"Kama kuuliza wateja kuunganisha baada (Lua) ajali.\n"
+"Seti hii kweli kama seva yako ni kuanzisha kuwasha upya otomatiki."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Whether to fog out the end of the visible area."
-msgstr "Туман на границе видимого пространства."
+msgstr "Kama ukungu nje mwisho wa eneo hili dhahiri."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Whether to show the client debug info (has the same effect as hitting F5)."
-msgstr "Показывать данные отладки (аналогично нажатию F5)."
+msgstr ""
+"Kama kuonyesha mteja Rekebisha taarifa (ina athari sawa kama kupiga F5)."
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -4324,271 +4615,43 @@ msgid ""
 "Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n"
 "Disabling this option will protect your password better."
 msgstr ""
+"Kama kusaidia seva za zamani kabla ya Itifaki ya toleo la 25.\n"
+"Wezesha kama unataka kuunganishwa 0.4.12 seva na kabla.\n"
+"Seva kuanzia na 0.4.13 kazi, 0.4.12-dev seva huenda kazi.\n"
+"Mlemavu chaguo hili kulinda nywila yako bora."
 
 #: src/settings_translation_file.cpp
 msgid "Width component of the initial window size."
-msgstr ""
+msgstr "Upana sehemu ya ukubwa cha kidirisha awali."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Width of the selectionbox's lines around nodes."
-msgstr "Ширина обводки выбранных блоков."
+msgstr "Upana wa mistari ya selectionbox karibu fundo."
 
 #: src/settings_translation_file.cpp
 msgid ""
 "World directory (everything in the world is stored here).\n"
 "Not needed if starting from the main menu."
 msgstr ""
+"Mpangilio orodha ulimwengu (kila kitu ulimwenguni kuhifadhiwa hapa).\n"
+"Si zinahitajika kama kuanzia Menyu kuu."
 
 #: src/settings_translation_file.cpp
 msgid "Y of flat ground."
-msgstr ""
+msgstr "Y ya ardhi tambarare."
 
 #: src/settings_translation_file.cpp
 msgid "Y of upper limit of large pseudorandom caves."
-msgstr ""
+msgstr "Y ya upper kikomo ya kubwa pseudorandom cellars."
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "cURL file download timeout"
-msgstr "cURL тайм-аут загрузки файла"
+msgstr "cURL muda wa upakuzi wa faili"
 
 #: src/settings_translation_file.cpp
 msgid "cURL parallel limit"
-msgstr ""
+msgstr "cURL kikomo sambamba"
 
 #: src/settings_translation_file.cpp
 msgid "cURL timeout"
-msgstr "cURL тайм-аут"
-
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
-#~ msgstr ""
-#~ "Включите немного более низкую поверхность воды, чтобы она\n"
-#~ "не заполняла блок полностью. Учтите, что это не совсем оптимизировано,\n"
-#~ "и мягкое освещение на поверхности воды не работает с этим."
-
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Клавиша уменьшения видимого диапазона. Изменяет минимальную дальность "
-#~ "отображения.\n"
-#~ "Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-
-#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Клавиша Увеличения видимого диапазона. Изменяет минимальную дальность "
-#~ "отображения.\n"
-#~ "Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-
-#, fuzzy
-#~ msgid "New style water"
-#~ msgstr "Новый стиль воды"
-
-#~ msgid "Preload inventory textures"
-#~ msgstr "Предзагрузка текстур..."
-
-#, fuzzy
-#~ msgid "Viewing range minimum"
-#~ msgstr "Минимальная граница дальности отрисовки."
-
-#, fuzzy
-#~ msgid "Wanted FPS"
-#~ msgstr "Ожидаемый FPS"
-
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Сброс одиночной игры"
-
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Коэффициент масштаба интерфейса: "
-
-#~ msgid "Touch free target"
-#~ msgstr "Свободный выбор цели"
-
-#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Загрузить"
-
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "ЛКМ: Переместить все предметы, ПКМ: Переместить один предмет"
-
-#~ msgid "is required by:"
-#~ msgstr "требуется для:"
-
-#~ msgid "Configuration saved.  "
-#~ msgstr "Настройки сохранены.  "
-
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Предупреждение: Неверная конфигурация.  "
-
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Невозможно создать мир: Имя содержит недопустимые символы"
-
-#~ msgid "Show Public"
-#~ msgstr "Публичные"
-
-#~ msgid "Show Favorites"
-#~ msgstr "Избранные"
-
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Оставьте адрес пустым для запуска локального сервера."
-
-#~ msgid "Create world"
-#~ msgstr "Создать мир"
-
-#~ msgid "Address required."
-#~ msgstr "Нужно ввести адрес."
-
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Невозможно удалить мир: Ничего не выбрано"
-
-#~ msgid "Files to be deleted"
-#~ msgstr "Следующие файлы будут удалены"
-
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Невозможно создать мир: Ни одной игры не найдено"
-
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Невозможно настроить мир: ничего не выбрано"
-
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Ошибка при удалении файлов мира"
-
-#~ msgid ""
-#~ "Default Controls:\n"
-#~ "- WASD: Walk\n"
-#~ "- Mouse left: dig/hit\n"
-#~ "- Mouse right: place/use\n"
-#~ "- Mouse wheel: select item\n"
-#~ "- 0...9: select item\n"
-#~ "- Shift: sneak\n"
-#~ "- R: Toggle viewing all loaded chunks\n"
-#~ "- I: Inventory menu\n"
-#~ "- ESC: This menu\n"
-#~ "- T: Chat\n"
-#~ msgstr ""
-#~ "Управление по умолчанию:\n"
-#~ "- WASD: перемещение\n"
-#~ "- ЛКМ: копать/ударить\n"
-#~ "- ПКМ: поставить/использовать\n"
-#~ "- Колесо мыши: выбор предмета\n"
-#~ "- 0...9: выбор предмета\n"
-#~ "- Shift: красться\n"
-#~ "- R: смотреть далеко\n"
-#~ "- I: инвентарь\n"
-#~ "- ESC: это меню\n"
-#~ "- T: чат\n"
-
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
-#~ msgstr ""
-#~ "Предупреждение: Некоторые моды не найдены.\n"
-#~ "Их настройки будут удалены, когда вы сохраните конфигурацию.  "
-
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration.  "
-#~ msgstr ""
-#~ "Предупреждение: Некоторые моды еще не настроены.\n"
-#~ "Их стандартные настройки будут установлены, когда вы сохраните "
-#~ "конфигурацию.  "
-
-#~ msgid "Local install"
-#~ msgstr "Локальная установка"
-
-#~ msgid "Add mod:"
-#~ msgstr "Добавить мод:"
-
-#~ msgid "MODS"
-#~ msgstr "МОДЫ"
-
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "ПАКЕТЫ ТЕКСТУР"
-
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "ОДИНОЧНАЯ ИГРА"
-
-#~ msgid "Finite Liquid"
-#~ msgstr "Конечные жидкости"
-
-#~ msgid "Preload item visuals"
-#~ msgstr "Предзагрузка изображений"
-
-#~ msgid "SETTINGS"
-#~ msgstr "НАСТРОЙКИ"
-
-#~ msgid "Password"
-#~ msgstr "Пароль"
-
-#~ msgid "Name"
-#~ msgstr "Имя"
-
-#~ msgid "START SERVER"
-#~ msgstr "СЕРВЕР"
-
-#~ msgid "CLIENT"
-#~ msgstr "КЛИЕНТ"
-
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Добавить мод"
-
-#~ msgid "Remove selected mod"
-#~ msgstr "Удалить мод"
-
-#~ msgid "EDIT GAME"
-#~ msgstr "РЕДАКТИРОВАНИЕ"
-
-#~ msgid "new game"
-#~ msgstr "Создать игру"
-
-#~ msgid "Mods:"
-#~ msgstr "Моды:"
-
-#~ msgid "GAMES"
-#~ msgstr "ИГРЫ"
-
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Не могу скопировать мод \"$1\" в игру \"$2\""
-
-#~ msgid "Game Name"
-#~ msgstr "Название"
-
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Перезапустите Minetest для принятия изменений"
-
-#~ msgid "Rendering:"
-#~ msgstr "Рендеринг:"
-
-#~ msgid "If enabled, "
-#~ msgstr "Если включено "
-
-#~ msgid "If disabled "
-#~ msgstr "Если выключено "
-
-#~ msgid "\""
-#~ msgstr "\""
-
-#~ msgid "No!!!"
-#~ msgstr "Нет!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Генерировать карты нормалей"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Список публичных серверов"
-
-#~ msgid "No of course not!"
-#~ msgstr "Нет, конечно нет!"
+msgstr "muda wa kuisha wa cURL"
diff --git a/po/tr/minetest.po b/po/tr/minetest.po
index b3c063d..5348a05 100644
--- a/po/tr/minetest.po
+++ b/po/tr/minetest.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1.2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
 "PO-Revision-Date: 2015-10-27 16:46+0200\n"
 "Last-Translator: PilzAdam <PilzAdam at minetest.net>\n"
 "Language-Team: Turkish <https://hosted.weblate.org/projects/minetest/"
@@ -611,6 +611,10 @@ msgid "Particles"
 msgstr "Hepsini etkinleştir"
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Tek kişilik oyunu sıfırlayın"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Ayarlar"
 
@@ -993,6 +997,10 @@ msgstr "Noclip aç/kapa"
 msgid "Use"
 msgstr "Kullan"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Yakınlaştır"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "tuşa bas"
@@ -1309,10 +1317,6 @@ msgstr "X Button 1"
 msgid "X Button 2"
 msgstr "X Button 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Yakınlaştır"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1381,6 +1385,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1456,6 +1464,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Backward key"
 msgstr "Geri"
@@ -1492,6 +1504,10 @@ msgid "Build inside player"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Engebeler"
 
@@ -1534,6 +1550,11 @@ msgid "Chat toggle key"
 msgstr "Tuşları değiştir"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Komut"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1610,14 +1631,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1773,6 +1794,10 @@ msgid "Default privileges"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1789,6 +1814,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1819,14 +1848,6 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1839,6 +1860,18 @@ msgid "Disable anticheat"
 msgstr "Parçacıkları etkinleştir"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr ""
 
@@ -1865,6 +1898,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Enable VBO"
 msgstr "Paketi Aç"
@@ -1951,6 +1988,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2012,11 +2057,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2155,12 +2210,14 @@ msgid "Generate normalmaps"
 msgstr "Normal haritalar oluştur"
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2192,6 +2249,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2220,15 +2286,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2323,6 +2380,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2358,6 +2449,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2518,6 +2617,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2553,7 +2659,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2705,6 +2811,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2739,8 +2860,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2750,8 +2869,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2762,8 +2879,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2773,8 +2888,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3155,6 +3268,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3196,17 +3317,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3218,10 +3343,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Menus"
 msgstr "Menü"
@@ -3264,10 +3385,6 @@ msgid "Mipmapping"
 msgstr "Mip-Mapping"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3480,11 +3597,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3492,7 +3615,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3529,6 +3652,11 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 #, fuzzy
+msgid "Report path"
+msgstr "Seç"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
 msgid "Right key"
 msgstr "Sağ Menu"
 
@@ -3697,7 +3825,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3735,7 +3863,7 @@ msgstr "Pürüzsüz ışıklandırma"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3817,10 +3945,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3836,6 +3976,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3851,6 +3997,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3955,11 +4107,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Ana geliştiriciler"
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -4095,7 +4242,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4196,59 +4343,60 @@ msgid "cURL timeout"
 msgstr ""
 
 #, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Dokular yükleniyor..."
+#~ msgid "Useful for mod developers."
+#~ msgstr "Ana geliştiriciler"
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Tek kişilik oyunu sıfırlayın"
+#~ msgid "No of course not!"
+#~ msgstr "Elbette hayır!"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Ölçeklendirme menülere işlendi:"
+#~ msgid "Public Serverlist"
+#~ msgstr "Çevirimiçi Oyun Listesi"
 
-#~ msgid "Touch free target"
-#~ msgstr "Touch free target"
+#, fuzzy
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Normal haritalar oluştur"
 
-#~ msgid "Downloading"
-#~ msgstr "İndiriliyor"
+#~ msgid "No!!!"
+#~ msgstr "Hayır!!!"
 
-#~ msgid "please wait..."
-#~ msgstr "lütfen bekleyin..."
+#~ msgid "\""
+#~ msgstr "\""
 
-#~ msgid " KB/s"
-#~ msgstr " KB/s"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Paketi Kapat"
 
-#~ msgid " MB/s"
-#~ msgstr " MB/s"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "Etkinleştirildi"
 
-#~ msgid "Numpad "
-#~ msgstr "Numpad "
+#~ msgid "Rendering:"
+#~ msgstr "Kaplama:"
 
 #~ msgid "Restart minetest for driver change to take effect"
 #~ msgstr "Değişikliklerin etkin olabilmesi için minetesti yeniden başlatın"
 
-#~ msgid "Rendering:"
-#~ msgstr "Kaplama:"
+#~ msgid "Numpad "
+#~ msgstr "Numpad "
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "Etkinleştirildi"
+#~ msgid " MB/s"
+#~ msgstr " MB/s"
 
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Paketi Kapat"
+#~ msgid " KB/s"
+#~ msgstr " KB/s"
 
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid "please wait..."
+#~ msgstr "lütfen bekleyin..."
 
-#~ msgid "No!!!"
-#~ msgstr "Hayır!!!"
+#~ msgid "Downloading"
+#~ msgstr "İndiriliyor"
 
-#, fuzzy
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Normal haritalar oluştur"
+#~ msgid "Touch free target"
+#~ msgstr "Touch free target"
 
-#~ msgid "Public Serverlist"
-#~ msgstr "Çevirimiçi Oyun Listesi"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Ölçeklendirme menülere işlendi:"
 
-#~ msgid "No of course not!"
-#~ msgstr "Elbette hayır!"
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "Dokular yükleniyor..."
diff --git a/po/uk/minetest.po b/po/uk/minetest.po
index 4a2101d..0035c79 100644
--- a/po/uk/minetest.po
+++ b/po/uk/minetest.po
@@ -7,18 +7,18 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-10 00:06+0000\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-13 22:32+0000\n"
 "Last-Translator: Fixer <artem.brz at gmail.com>\n"
-"Language-Team: Ukrainian "
-"<https://hosted.weblate.org/projects/minetest/minetest/uk/>\n"
+"Language-Team: Ukrainian <https://hosted.weblate.org/projects/minetest/"
+"minetest/uk/>\n"
 "Language: uk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<="
-"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.10-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
@@ -87,14 +87,12 @@ msgid "Depends:"
 msgstr "Залежить від:"
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "Disable MP"
-msgstr "Вимкнути МП"
+msgstr "Вимкнути модпак"
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "Enable MP"
-msgstr "Увімкнути МП"
+msgstr "Увімкнути модпак"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Enable all"
@@ -113,13 +111,12 @@ msgid "Hide Game"
 msgstr "Приховати гру"
 
 #: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
 msgid "Hide mp content"
-msgstr "Приховати мп контент"
+msgstr "Сховати вміст модпаку"
 
 #: builtin/mainmenu/dlg_config_world.lua
 msgid "Mod:"
-msgstr "Модифікація:"
+msgstr "Мод:"
 
 #: builtin/mainmenu/dlg_config_world.lua
 #: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
@@ -466,7 +463,7 @@ msgstr "Творчість"
 #: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
 #: builtin/mainmenu/tab_singleplayer.lua
 msgid "Enable Damage"
-msgstr "Увімкнути поранення"
+msgstr "Поранення"
 
 #: builtin/mainmenu/tab_server.lua
 msgid "Name/Password"
@@ -538,9 +535,8 @@ msgid "Bilinear Filter"
 msgstr "Білінійна фільтрація"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
-msgstr "Бамп-маппінг"
+msgstr "Бамп маппінг"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Change keys"
@@ -548,11 +544,11 @@ msgstr "Змінити клавіші"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Connected Glass"
-msgstr "З'єднане скло"
+msgstr "З'єднувати скло"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Fancy Leaves"
-msgstr "Гарні листя"
+msgstr "Гарне листя"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Mipmap"
@@ -568,7 +564,7 @@ msgstr "Ні"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No Filter"
-msgstr "Без фільтрування"
+msgstr "Без фільтрації"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "No Mipmap"
@@ -607,6 +603,10 @@ msgid "Particles"
 msgstr "Часточки"
 
 #: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Скинути світ однокористувацької гри"
+
+#: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
 msgstr "Налаштування"
 
@@ -896,7 +896,7 @@ msgstr "Далі"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "\"Use\" = climb down"
-msgstr "\"Використовувати\" = підніматися в гору"
+msgstr "\"Використовувати\" = підніматися вгору"
 
 #: src/guiKeyChangeMenu.cpp
 msgid "Backward"
@@ -984,6 +984,11 @@ msgstr "Переключити режим проходження крізь ст
 msgid "Use"
 msgstr "Використовувати"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+#, fuzzy
+msgid "Zoom"
+msgstr "Збільшити"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "Натисніть клавішу"
@@ -1302,11 +1307,6 @@ msgstr "Додаткова кнопка 1"
 msgid "X Button 2"
 msgstr "Додаткова кнопка 2"
 
-#: src/keycode.cpp
-#, fuzzy
-msgid "Zoom"
-msgstr "Збільшити"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1376,6 +1376,10 @@ msgid "Active Block Modifier interval"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Active block range"
 msgstr ""
 
@@ -1450,6 +1454,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Backward key"
 msgstr "Назад"
@@ -1483,6 +1491,10 @@ msgid "Build inside player"
 msgstr "Будувати в межах гравця"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "Бамп-маппінг"
 
@@ -1524,6 +1536,11 @@ msgid "Chat toggle key"
 msgstr "Чат"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Команди чату"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1564,7 +1581,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Client and Server"
-msgstr ""
+msgstr "Клієнт і сервер"
 
 #: src/settings_translation_file.cpp
 msgid "Climbing speed"
@@ -1596,14 +1613,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -1750,6 +1767,10 @@ msgid "Default privileges"
 msgstr "Стандартні права"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1766,6 +1787,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr ""
 
@@ -1796,14 +1821,6 @@ msgid "Desynchronize block animation"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1815,6 +1832,18 @@ msgid "Disable anticheat"
 msgstr "Вимкнути античіт"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr ""
 
@@ -1839,6 +1868,10 @@ msgid "Dump the mapgen debug infos."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "Увімкнути VBO"
 
@@ -1921,6 +1954,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -1981,11 +2022,21 @@ msgid "Field of view"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2120,12 +2171,14 @@ msgid "Generate normalmaps"
 msgstr "Генерувати карти нормалів"
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2156,6 +2209,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2184,15 +2246,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2286,6 +2339,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2320,6 +2407,14 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2479,6 +2574,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2514,7 +2616,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2665,6 +2767,21 @@ msgid "Liquid update tick"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr ""
 
@@ -2697,8 +2814,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2708,8 +2823,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2720,8 +2833,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2731,8 +2842,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3091,6 +3200,14 @@ msgid "Maximum hotbar width"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3132,17 +3249,21 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3154,10 +3275,6 @@ msgid "Maximum users"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "Меню"
 
@@ -3198,10 +3315,6 @@ msgid "Mipmapping"
 msgstr "Mіп-текстурування"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr ""
 
@@ -3261,7 +3374,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Network"
-msgstr ""
+msgstr "Мережа"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3406,11 +3519,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3418,7 +3537,7 @@ msgid "Profiler toggle key"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3453,6 +3572,11 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Вибрати шлях"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "Права клавіша"
 
@@ -3534,7 +3658,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid "Security"
-msgstr ""
+msgstr "Безпека"
 
 #: src/settings_translation_file.cpp
 msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -3610,7 +3734,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3647,7 +3771,7 @@ msgstr "Згладжене освітлення"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3665,7 +3789,7 @@ msgstr "Крастися"
 
 #: src/settings_translation_file.cpp
 msgid "Sound"
-msgstr ""
+msgstr "Звук"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3726,10 +3850,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr ""
 
@@ -3745,6 +3881,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3760,6 +3902,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3862,10 +4010,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr ""
 
@@ -3992,7 +4136,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4092,99 +4236,96 @@ msgstr ""
 msgid "cURL timeout"
 msgstr ""
 
+#~ msgid "No of course not!"
+#~ msgstr "Ні, звісно ні!"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "Список публічних серверів"
+
 #, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Завантаження текстур..."
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Генерувати карти нормалей"
 
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Скинути світ однокористувацької гри"
+#~ msgid "No!!!"
+#~ msgstr "Ні!!!"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Масштабування елементів меню: "
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Вимкнути багатокористувацьку гру"
 
 #, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Вниз"
+#~ msgid "If enabled, "
+#~ msgstr "Увімкнено"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Ліва кнопка миші: Перемістити усі предмети, Права кнопка миші: "
-#~ "Перемістити один предмет"
+#, fuzzy
+#~ msgid "Game Name"
+#~ msgstr "Гра"
 
-#~ msgid "is required by:"
-#~ msgstr "необхідний для:"
+#, fuzzy
+#~ msgid "Password"
+#~ msgstr "Старий Пароль"
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "Налаштування Збережено.  "
+#~ msgid "Preload item visuals"
+#~ msgstr "Попереднє завантаження зображень"
 
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "Попередження: Помилкова конфігурація.  "
+#, fuzzy
+#~ msgid "Finite Liquid"
+#~ msgstr "Кінцеві рідини"
 
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Неможливо створити світ: Ім'я містить недопустимі символи"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Помилка при видаленні файлів світу"
 
-#~ msgid "Show Public"
-#~ msgstr "Показати Публічні"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Неможливо налаштувати світ: Нічого не вибрано"
 
-#~ msgid "Show Favorites"
-#~ msgstr "Показати Улюблені"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Неможливо створити світ: Не знайдено жодної гри"
 
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Залишіть адресу незаповненою для створення локального серверу."
+#~ msgid "Files to be deleted"
+#~ msgstr "Файлів, що підлягають видаленню"
 
-#~ msgid "Create world"
-#~ msgstr "Створити світ"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Неможливо видалити світ: Нічого не вибрано"
 
 #~ msgid "Address required."
 #~ msgstr "Адреса необхідна."
 
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Неможливо видалити світ: Нічого не вибрано"
-
-#~ msgid "Files to be deleted"
-#~ msgstr "Файлів, що підлягають видаленню"
+#~ msgid "Create world"
+#~ msgstr "Створити світ"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Неможливо створити світ: Не знайдено жодної гри"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Залишіть адресу незаповненою для створення локального серверу."
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Неможливо налаштувати світ: Нічого не вибрано"
+#~ msgid "Show Favorites"
+#~ msgstr "Показати Улюблені"
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Помилка при видаленні файлів світу"
+#~ msgid "Show Public"
+#~ msgstr "Показати Публічні"
 
-#, fuzzy
-#~ msgid "Finite Liquid"
-#~ msgstr "Кінцеві рідини"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Неможливо створити світ: Ім'я містить недопустимі символи"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "Попереднє завантаження зображень"
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "Попередження: Помилкова конфігурація.  "
 
-#, fuzzy
-#~ msgid "Password"
-#~ msgstr "Старий Пароль"
+#~ msgid "Configuration saved.  "
+#~ msgstr "Налаштування Збережено.  "
 
-#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Гра"
+#~ msgid "is required by:"
+#~ msgstr "необхідний для:"
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "Увімкнено"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Ліва кнопка миші: Перемістити усі предмети, Права кнопка миші: "
+#~ "Перемістити один предмет"
 
 #, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Вимкнути багатокористувацьку гру"
+#~ msgid "Downloading"
+#~ msgstr "Вниз"
 
-#~ msgid "No!!!"
-#~ msgstr "Ні!!!"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Масштабування елементів меню: "
 
 #, fuzzy
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Генерувати карти нормалей"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Список публічних серверів"
-
-#~ msgid "No of course not!"
-#~ msgstr "Ні, звісно ні!"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Завантаження текстур..."
diff --git a/po/zh_CN/minetest.po b/po/zh_CN/minetest.po
index 62ebcd2..cd70e57 100644
--- a/po/zh_CN/minetest.po
+++ b/po/zh_CN/minetest.po
@@ -6,11 +6,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-05 19:09+0000\n"
-"Last-Translator: Claybiokiller <clay0305 at hotmail.com>\n"
-"Language-Team: Chinese (China) "
-"<https://hosted.weblate.org/projects/minetest/minetest/zh_CN/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-06-11 10:56+0000\n"
+"Last-Translator: arsdragonfly <arsdragonfly at gmail.com>\n"
+"Language-Team: Chinese (China) <https://hosted.weblate.org/projects/minetest/"
+"minetest/zh_CN/>\n"
 "Language: zh_CN\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -400,9 +400,8 @@ msgid "Uninstall selected modpack"
 msgstr "删除选中的MOD包"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "地址/端口:"
+msgstr "地址/端口"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
@@ -423,17 +422,16 @@ msgstr "启用伤害"
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 #, fuzzy
 msgid "Del. Favorite"
-msgstr "最爱的服务器:"
+msgstr "删除收藏的服务器"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 #, fuzzy
 msgid "Favorite"
-msgstr "最爱的服务器:"
+msgstr "收藏的服务器"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "用户名/密码:"
+msgstr "用户名/密码"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -569,16 +567,15 @@ msgstr "节点高亮"
 #: builtin/mainmenu/tab_settings.lua
 #, fuzzy
 msgid "Node Outlining"
-msgstr "节点高亮"
+msgstr "方块高亮"
 
 #: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
 msgid "None"
 msgstr "无"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Normal Mapping"
-msgstr "一般地图采样"
+msgstr "法线贴图"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
@@ -593,9 +590,13 @@ msgid "Parallax Occlusion"
 msgstr "视差贴图"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "启用粒子"
+msgstr "粒子效果"
+
+#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "重置单人游戏"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
@@ -971,6 +972,10 @@ msgstr "切换穿墙模式"
 msgid "Use"
 msgstr "使用"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "缩放"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "按键"
@@ -1287,10 +1292,6 @@ msgstr "X键1"
 msgid "X Button 2"
 msgstr "X键2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "缩放"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1367,12 +1368,17 @@ msgstr "空中加速"
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Active Block Management interval"
-msgstr "活动块范围"
+msgstr "活动区块管理间隔"
 
 #: src/settings_translation_file.cpp
 #, fuzzy
 msgid "Active Block Modifier interval"
-msgstr "活动块范围"
+msgstr "活动区块修改间隔"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "活动区块修改间隔"
 
 #: src/settings_translation_file.cpp
 msgid "Active block range"
@@ -1456,6 +1462,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr "自动报告到服务器列表。"
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "后退键"
 
@@ -1468,9 +1478,8 @@ msgid "Basic"
 msgstr "基础"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Basic Privileges"
-msgstr "默认权限"
+msgstr "基本权限"
 
 #: src/settings_translation_file.cpp
 msgid "Bilinear filtering"
@@ -1489,6 +1498,10 @@ msgid "Build inside player"
 msgstr "建立内部玩家"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "凹凸贴图"
 
@@ -1530,6 +1543,11 @@ msgid "Chat toggle key"
 msgstr "聊天切换键"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "命令"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1620,20 +1638,21 @@ msgid "Colored fog"
 msgstr "彩色雾"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
-"受信任的 Mod 列表,以逗号分隔,其可存取不安全的\n"
-"功能,即便 mod 安全性已启用(经由 request_insecure_environment())。"
+"以逗号分隔的 mod 清单,让您可以存取 HTTP API,\n"
+"其可从互联网上传及下载资料。"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
-"以逗号分隔的 mod 清单,让您可以存取 HTTP API,\n"
-"其可从互联网上传及下载资料。"
+"受信任的 Mod 列表,以逗号分隔,其可存取不安全的\n"
+"功能,即便 mod 安全性已启用(经由 request_insecure_environment())。"
 
 #: src/settings_translation_file.cpp
 msgid "Command key"
@@ -1702,7 +1721,7 @@ msgstr "控制山丘的坡度/高度。"
 
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "控制隧道宽度,较小的值创建更宽的隧道。"
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
@@ -1717,10 +1736,13 @@ msgstr ""
 "这可以使挖掘更加困难。0 表示禁用。 (0-10)"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
 msgid ""
 "Creates unpredictable water features in caves.\n"
 "These can make mining difficult. Zero disables them. (0-10)"
 msgstr ""
+"在洞穴中创建随机的水域。\n"
+"会使挖矿变得困难。值为0则禁用。(0-10)"
 
 #: src/settings_translation_file.cpp
 msgid "Crosshair alpha"
@@ -1787,6 +1809,10 @@ msgid "Default privileges"
 msgstr "默认权限"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1807,20 +1833,24 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Delay showing tooltips, stated in milliseconds."
+msgid "Delay in sending blocks after building"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid "Delay showing tooltips, stated in milliseconds."
+msgstr "工具提示显示延迟,按毫秒计算。"
+
+#: src/settings_translation_file.cpp
 msgid "Deprecated Lua API handling"
 msgstr "已弃用 Lua API 处理"
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "大型洞穴的最浅深度。"
 
 #: src/settings_translation_file.cpp
 msgid "Depth below which you'll find massive caves."
-msgstr ""
+msgstr "巨型洞穴的最浅深度。"
 
 #: src/settings_translation_file.cpp
 msgid "Descending speed"
@@ -1837,14 +1867,6 @@ msgid "Desynchronize block animation"
 msgstr "去同步块动画"
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "详细 mod 剖析"
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1856,6 +1878,18 @@ msgid "Disable anticheat"
 msgstr "禁用反作弊"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "禁止使用空密码"
 
@@ -1880,6 +1914,10 @@ msgid "Dump the mapgen debug infos."
 msgstr "转储地图生成器调试信息。"
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "启用 VBO"
 
@@ -1966,6 +2004,15 @@ msgstr ""
 "需要着色器已启用。"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiling data print interval"
+msgstr "剖析印出间隔"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2028,10 +2075,24 @@ msgid "Field of view"
 msgstr "视界"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Field of view for zoom"
+msgstr "视界"
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr "视界程度。"
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"快速移动(通过“使用”键)。\n"
+"这需要服务器允许“快速移动”权限。"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
@@ -2168,12 +2229,14 @@ msgid "Generate normalmaps"
 msgstr "生成常规地图"
 
 #: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2204,6 +2267,15 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr ""
 
@@ -2232,15 +2304,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2334,6 +2397,40 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr ""
 
@@ -2368,6 +2465,16 @@ msgid ""
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "右击重复间隔"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "鼠标灵敏度"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2527,6 +2634,13 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2562,7 +2676,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2713,6 +2827,22 @@ msgid "Liquid update tick"
 msgstr "液体更新单次"
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "活动区块修改间隔"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr "主菜单游戏管理器"
 
@@ -2745,8 +2875,6 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2756,8 +2884,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2768,8 +2894,6 @@ msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2779,8 +2903,6 @@ msgstr ""
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -3143,6 +3265,14 @@ msgid "Maximum hotbar width"
 msgstr "最大快捷栏宽度"
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr ""
 
@@ -3184,17 +3314,22 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum objects per block"
+msgstr "最大强制载入块"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -3206,10 +3341,6 @@ msgid "Maximum users"
 msgstr "最大用户"
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "菜单"
 
@@ -3250,10 +3381,6 @@ msgid "Mipmapping"
 msgstr "Mip 贴图处理"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr "Mod 剖析"
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr "Mod 存储详情 URL"
 
@@ -3464,20 +3591,28 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Privileges that players with basic_privs can grant"
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Privileges that players with basic_privs can grant"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Profiler"
+msgstr "山谷轮廓"
+
+#: src/settings_translation_file.cpp
 msgid "Profiler toggle key"
 msgstr "剖析器切换键"
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "剖析印出间隔"
+#, fuzzy
+msgid "Profiling"
+msgstr "Mod 剖析"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3511,6 +3646,11 @@ msgid "Replaces the default main menu with a custom one."
 msgstr ""
 
 #: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "字体路径"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "右方向键"
 
@@ -3670,7 +3810,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3707,7 +3847,7 @@ msgstr "平滑光照"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
 
@@ -3786,10 +3926,22 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr ""
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr "泥土深度或其他过滤器"
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr "服务器监听的网络接口。"
 
@@ -3805,6 +3957,12 @@ msgstr "Irrlicht 的渲染后端。"
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3820,6 +3978,12 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr ""
@@ -3922,10 +4086,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr ""
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "适用 MOD 开发者。"
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr "垂直同步"
 
@@ -4053,7 +4213,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 
 #: src/settings_translation_file.cpp
@@ -4134,6 +4294,8 @@ msgid ""
 "World directory (everything in the world is stored here).\n"
 "Not needed if starting from the main menu."
 msgstr ""
+"世界目录(世界里的所有东西都存在这里)。\n"
+"如果从主菜单开始游戏就不需要。"
 
 #: src/settings_translation_file.cpp
 msgid "Y of flat ground."
@@ -4141,7 +4303,7 @@ msgstr "平地的 Y。"
 
 #: src/settings_translation_file.cpp
 msgid "Y of upper limit of large pseudorandom caves."
-msgstr ""
+msgstr "大型随机洞穴的Y轴最大值。"
 
 #: src/settings_translation_file.cpp
 msgid "cURL file download timeout"
@@ -4155,74 +4317,108 @@ msgstr "cURL 并发限制"
 msgid "cURL timeout"
 msgstr "cURL 超时"
 
+#~ msgid "Detailed mod profiling"
+#~ msgstr "详细 mod 剖析"
+
+#~ msgid "Useful for mod developers."
+#~ msgstr "适用 MOD 开发者。"
+
+#~ msgid "No of course not!"
+#~ msgstr "当然不!"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "公共服务器列表"
+
+#~ msgid "Generate Normalmaps"
+#~ msgstr "生成一般地图"
+
+#~ msgid "No!!!"
+#~ msgstr "不!!!"
+
 #, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "载入中..."
+#~ msgid "If disabled "
+#~ msgstr "禁用MOD包"
 
 #, fuzzy
-#~ msgid "Reset singleplayer world"
-#~ msgstr "重置单人游戏"
+#~ msgid "If enabled, "
+#~ msgstr "启用"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "菜单元素应用缩放因子"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "重启minetest让驱动变化生效"
 
-#~ msgid "Touch free target"
-#~ msgstr "自由触摸目标"
+#~ msgid "Game Name"
+#~ msgstr "游戏名"
 
-#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "下载中"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "游戏管理: 无法复制MOD“$1”到游戏“$2”"
 
-#~ msgid " KB/s"
-#~ msgstr "千字节/秒"
+#~ msgid "GAMES"
+#~ msgstr "游戏"
 
-#~ msgid " MB/s"
-#~ msgstr "兆字节/秒"
+#~ msgid "Mods:"
+#~ msgstr "MODS:"
 
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "左键:移动所有物品,右键:移动单个物品"
+#~ msgid "new game"
+#~ msgstr "新建游戏"
 
-#~ msgid "is required by:"
-#~ msgstr "被需要:"
+#~ msgid "EDIT GAME"
+#~ msgstr "编辑游戏"
 
-#~ msgid "Configuration saved.  "
-#~ msgstr "配置已保存。  "
+#~ msgid "Remove selected mod"
+#~ msgstr "删除选中MOD"
 
-#~ msgid "Warning: Configuration not consistent.  "
-#~ msgstr "警告:配置不一致。  "
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- 添加MOD"
 
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "无法创建世界:名字包含非法字符"
+#~ msgid "CLIENT"
+#~ msgstr "客户端"
 
-#~ msgid "Show Public"
-#~ msgstr "显示公共"
+#~ msgid "START SERVER"
+#~ msgstr "启动服务器"
 
-#~ msgid "Show Favorites"
-#~ msgstr "显示最爱"
+#~ msgid "Name"
+#~ msgstr "名字"
 
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "地址栏留空可启动本地服务器。"
+#~ msgid "Password"
+#~ msgstr "密码"
 
-#~ msgid "Create world"
-#~ msgstr "创造世界"
+#~ msgid "SETTINGS"
+#~ msgstr "设置"
 
-#~ msgid "Address required."
-#~ msgstr "需要地址。"
+#~ msgid "Preload item visuals"
+#~ msgstr "预先加载物品图像"
 
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "无法删除世界:没有选择世界"
+#~ msgid "Finite Liquid"
+#~ msgstr "液体有限延伸"
 
-#~ msgid "Files to be deleted"
-#~ msgstr "将被删除的文件"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "单人游戏"
 
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "无法创造世界:未找到游戏模式"
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "材质包"
 
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "无法配置世界:没有选择世界"
+#~ msgid "MODS"
+#~ msgstr "MODS"
 
-#~ msgid "Failed to delete all world files"
-#~ msgstr "无法删除所有该世界的文件"
+#~ msgid "Add mod:"
+#~ msgstr "添加MOD:"
+
+#~ msgid "Local install"
+#~ msgstr "本地安装"
+
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration.  "
+#~ msgstr ""
+#~ "警告:一些MOD仍未设定。\n"
+#~ "它们会在你保存配置的时候自动启用。  "
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration.  "
+#~ msgstr ""
+#~ "警告:缺少一些设定了的MOD。\n"
+#~ "它们的设置会在你保存配置的时候被移除。  "
 
 #~ msgid ""
 #~ "Default Controls:\n"
@@ -4250,99 +4446,67 @@ msgstr "cURL 超时"
 #~ "ESC:菜单\n"
 #~ "T:聊天\n"
 
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration.  "
-#~ msgstr ""
-#~ "警告:缺少一些设定了的MOD。\n"
-#~ "它们的设置会在你保存配置的时候被移除。  "
-
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration.  "
-#~ msgstr ""
-#~ "警告:一些MOD仍未设定。\n"
-#~ "它们会在你保存配置的时候自动启用。  "
-
-#~ msgid "Local install"
-#~ msgstr "本地安装"
-
-#~ msgid "Add mod:"
-#~ msgstr "添加MOD:"
-
-#~ msgid "MODS"
-#~ msgstr "MODS"
-
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "材质包"
-
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "单人游戏"
-
-#~ msgid "Finite Liquid"
-#~ msgstr "液体有限延伸"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "无法删除所有该世界的文件"
 
-#~ msgid "Preload item visuals"
-#~ msgstr "预先加载物品图像"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "无法配置世界:没有选择世界"
 
-#~ msgid "SETTINGS"
-#~ msgstr "设置"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "无法创造世界:未找到游戏模式"
 
-#~ msgid "Password"
-#~ msgstr "密码"
+#~ msgid "Files to be deleted"
+#~ msgstr "将被删除的文件"
 
-#~ msgid "Name"
-#~ msgstr "名字"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "无法删除世界:没有选择世界"
 
-#~ msgid "START SERVER"
-#~ msgstr "启动服务器"
+#~ msgid "Address required."
+#~ msgstr "需要地址。"
 
-#~ msgid "CLIENT"
-#~ msgstr "客户端"
+#~ msgid "Create world"
+#~ msgstr "创造世界"
 
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- 添加MOD"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "地址栏留空可启动本地服务器。"
 
-#~ msgid "Remove selected mod"
-#~ msgstr "删除选中MOD"
+#~ msgid "Show Favorites"
+#~ msgstr "显示最爱"
 
-#~ msgid "EDIT GAME"
-#~ msgstr "编辑游戏"
+#~ msgid "Show Public"
+#~ msgstr "显示公共"
 
-#~ msgid "new game"
-#~ msgstr "新建游戏"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "无法创建世界:名字包含非法字符"
 
-#~ msgid "Mods:"
-#~ msgstr "MODS:"
+#~ msgid "Warning: Configuration not consistent.  "
+#~ msgstr "警告:配置不一致。  "
 
-#~ msgid "GAMES"
-#~ msgstr "游戏"
+#~ msgid "Configuration saved.  "
+#~ msgstr "配置已保存。  "
 
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "游戏管理: 无法复制MOD“$1”到游戏“$2”"
+#~ msgid "is required by:"
+#~ msgstr "被需要:"
 
-#~ msgid "Game Name"
-#~ msgstr "游戏名"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "左键:移动所有物品,右键:移动单个物品"
 
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "重启minetest让驱动变化生效"
+#~ msgid " MB/s"
+#~ msgstr "兆字节/秒"
 
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "启用"
+#~ msgid " KB/s"
+#~ msgstr "千字节/秒"
 
 #, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "禁用MOD包"
-
-#~ msgid "No!!!"
-#~ msgstr "不!!!"
+#~ msgid "Downloading"
+#~ msgstr "下载中"
 
-#~ msgid "Generate Normalmaps"
-#~ msgstr "生成一般地图"
+#~ msgid "Touch free target"
+#~ msgstr "自由触摸目标"
 
-#~ msgid "Public Serverlist"
-#~ msgstr "公共服务器列表"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "菜单元素应用缩放因子"
 
-#~ msgid "No of course not!"
-#~ msgstr "当然不!"
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "载入中..."
diff --git a/po/zh_TW/minetest.po b/po/zh_TW/minetest.po
index abe574c..7718ae4 100644
--- a/po/zh_TW/minetest.po
+++ b/po/zh_TW/minetest.po
@@ -7,9 +7,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: minetest\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-03-05 14:43+0000\n"
-"Last-Translator: Jeff Huang <s8321414 at chakraos.org>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-15 08:04+0000\n"
+"Last-Translator: Jeff Huang <s8321414 at gmail.com>\n"
 "Language-Team: Chinese (Taiwan) <https://hosted.weblate.org/projects/"
 "minetest/minetest/zh_TW/>\n"
 "Language: zh_TW\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 2.5-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
 
 #: builtin/fstk/ui.lua
 msgid "An error occured in a Lua script, such as a mod:"
@@ -403,9 +403,8 @@ msgid "Uninstall selected modpack"
 msgstr "解除安裝已選取的 mod 包"
 
 #: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
 msgid "Address / Port"
-msgstr "地址/埠:"
+msgstr "地址/埠"
 
 #: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
 msgid "Client"
@@ -425,16 +424,15 @@ msgstr "已啟用傷害"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Del. Favorite"
-msgstr ""
+msgstr "刪除收藏"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "Favorite"
-msgstr ""
+msgstr "最愛"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
 msgid "Name / Password"
-msgstr "名稱/密碼:"
+msgstr "名稱/密碼"
 
 #: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
 msgid "PvP enabled"
@@ -527,7 +525,6 @@ msgid "Bilinear Filter"
 msgstr "雙線性過濾器"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Bump Mapping"
 msgstr "映射貼圖"
 
@@ -568,7 +565,6 @@ msgid "Node Highlighting"
 msgstr "突顯節點"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Node Outlining"
 msgstr "突顯節點"
 
@@ -577,9 +573,8 @@ msgid "None"
 msgstr "無"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Normal Mapping"
-msgstr "法線貼圖採樣"
+msgstr "法線貼圖"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Opaque Leaves"
@@ -594,9 +589,12 @@ msgid "Parallax Occlusion"
 msgstr "視差遮蔽"
 
 #: builtin/mainmenu/tab_settings.lua
-#, fuzzy
 msgid "Particles"
-msgstr "啟用粒子"
+msgstr "粒子"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "重置單人遊戲世界"
 
 #: builtin/mainmenu/tab_settings.lua
 msgid "Settings"
@@ -972,6 +970,10 @@ msgstr "切換無省略"
 msgid "Use"
 msgstr "使用"
 
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "縮放"
+
 #: src/guiKeyChangeMenu.cpp
 msgid "press key"
 msgstr "按下按鍵"
@@ -1288,10 +1290,6 @@ msgstr "X 按鈕 1"
 msgid "X Button 2"
 msgstr "X 按鈕 2"
 
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "縮放"
-
 #: src/settings_translation_file.cpp
 msgid ""
 "(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1366,14 +1364,16 @@ msgid "Acceleration in air"
 msgstr "在空氣中的加速"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Management interval"
-msgstr "活動區塊範圍"
+msgstr "活動區塊管理間隔"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Active Block Modifier interval"
-msgstr "活動區塊範圍"
+msgstr "活動方塊調整間隔"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "活動區塊調整器"
 
 #: src/settings_translation_file.cpp
 msgid "Active block range"
@@ -1457,6 +1457,10 @@ msgid "Automaticaly report to the serverlist."
 msgstr "自動回報到伺服器列表。"
 
 #: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "自動奔跑按鍵"
+
+#: src/settings_translation_file.cpp
 msgid "Backward key"
 msgstr "後退鍵"
 
@@ -1469,9 +1473,8 @@ msgid "Basic"
 msgstr "基礎"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Basic Privileges"
-msgstr "預設特權"
+msgstr "基礎特權"
 
 #: src/settings_translation_file.cpp
 msgid "Bilinear filtering"
@@ -1490,6 +1493,10 @@ msgid "Build inside player"
 msgstr "在玩家內構建"
 
 #: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "內建"
+
+#: src/settings_translation_file.cpp
 msgid "Bumpmapping"
 msgstr "映射貼圖"
 
@@ -1514,9 +1521,8 @@ msgid "Cave noise #2"
 msgstr "洞穴噪音 #2"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Cave width"
-msgstr "螢幕寬度"
+msgstr "洞穴寬度"
 
 #: src/settings_translation_file.cpp
 msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1531,6 +1537,10 @@ msgid "Chat toggle key"
 msgstr "聊天切換按鍵"
 
 #: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "聊天指令"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Choice of 18 fractals from 9 formulas.\n"
 "1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1622,19 +1632,19 @@ msgstr "彩色迷霧"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
 msgstr ""
-"受信任的 Mod 列表,以逗號分隔,其可存取不安全的\n"
-"功能,即便 mod 安全性是(經由 request_insecure_environment())。"
+"以逗號分隔的 mod 清單,允許其存取 HTTP API,\n"
+"從而網際網路上傳及下載資料。"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
 msgstr ""
-"以逗號分隔的 mod 清單,讓您可以存取 HTTP API,\n"
-"其可從網際網路上傳及下載資料。"
+"受信任的 Mod 列表,以逗號分隔,其可存取不安全的\n"
+"功能,即便 mod 安全性是(經由 request_insecure_environment())。"
 
 #: src/settings_translation_file.cpp
 msgid "Command key"
@@ -1703,7 +1713,7 @@ msgstr "控制山丘的陡度/深度。"
 
 #: src/settings_translation_file.cpp
 msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "控制隧道的寬度,較小的值會創造出較寬的隧道。"
 
 #: src/settings_translation_file.cpp
 msgid "Crash message"
@@ -1790,6 +1800,10 @@ msgid "Default privileges"
 msgstr "預設特權"
 
 #: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "缺省報告格式"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Default timeout for cURL, stated in milliseconds.\n"
 "Only has an effect if compiled with cURL."
@@ -1810,6 +1824,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
 msgstr "定義玩家最大可傳送的距離,以方塊計(0 = 不限制)。"
 
 #: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "建造后發送區塊前延遲的時間"
+
+#: src/settings_translation_file.cpp
 msgid "Delay showing tooltips, stated in milliseconds."
 msgstr "顯示工具提示前的延遲,以毫秒計算。"
 
@@ -1840,14 +1858,6 @@ msgid "Desynchronize block animation"
 msgstr "異步化方塊動畫"
 
 #: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "詳細的 mod 檔案資料。對 mod 開發者很有用。"
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "詳細的 mod 檔案"
-
-#: src/settings_translation_file.cpp
 msgid ""
 "Determines terrain shape.\n"
 "The 3 numbers in brackets control the scale of the\n"
@@ -1862,6 +1872,21 @@ msgid "Disable anticheat"
 msgstr "停用反作弊"
 
 #: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "停用逃脫字元"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"停用逃脫字元。例如聊天訊息的顏色。\n"
+"如果您想要與早於 0.4.14 的客戶端一同執行伺服器並且您也想要停用\n"
+"由 mod 所生成的逃脫字元的話就用這個。"
+
+#: src/settings_translation_file.cpp
 msgid "Disallow empty passwords"
 msgstr "不允許空密碼"
 
@@ -1886,6 +1911,10 @@ msgid "Dump the mapgen debug infos."
 msgstr "轉儲 mapgen 的除錯資訊。"
 
 #: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "啟用搖桿"
+
+#: src/settings_translation_file.cpp
 msgid "Enable VBO"
 msgstr "啟用 VBO"
 
@@ -1986,6 +2015,14 @@ msgstr ""
 "必須啟用著色器。"
 
 #: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "引擎性能資料印出間隔"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "主體方法"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Experimental option, might cause visible spaces between blocks\n"
 "when set to higher number than 0."
@@ -2050,11 +2087,23 @@ msgid "Field of view"
 msgstr "視野"
 
 #: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "放大后的視野"
+
+#: src/settings_translation_file.cpp
 msgid "Field of view in degrees."
 msgstr "以度計算的視野。"
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"縮放視野。\n"
+"這需要伺服器上的「縮放」特權。"
+
+#: src/settings_translation_file.cpp
+msgid ""
 "File in client/serverlist/ that contains your favorite servers displayed in "
 "the Multiplayer Tab."
 msgstr ""
@@ -2129,9 +2178,8 @@ msgid "Font size"
 msgstr "字型大小"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Format of screenshots."
-msgstr "儲存螢幕截圖的路徑。"
+msgstr "螢幕截圖的格式。"
 
 #: src/settings_translation_file.cpp
 msgid "Forward key"
@@ -2194,13 +2242,14 @@ msgid "Generate normalmaps"
 msgstr "生成一般地圖"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Global callbacks"
+msgstr "全域回呼"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Global map generation attributes.\n"
 "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
 "and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2240,6 +2289,19 @@ msgstr ""
 "-    錯誤:在使用到棄用的呼叫時中止(建議 mod 開發者使用)。"
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+"使用分析器工具本身:\n"
+"* 分析空函數。\n"
+"這會讓消耗增加,儀表增加(+1 函式呼叫)。\n"
+"* 採樣工具會被用於更新統計。"
+
+#: src/settings_translation_file.cpp
 msgid "Height component of the initial window size."
 msgstr "初始視窗大小的高度組件。"
 
@@ -2270,15 +2332,6 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr "整個伺服器有多少個區塊同時以線性方式飛行。"
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr "每個客戶端有多少個區塊同時以線性方式飛行。"
-
-#: src/settings_translation_file.cpp
-msgid ""
 "How much the server will wait before unloading unused mapblocks.\n"
 "Higher value is smoother, but will use more RAM."
 msgstr ""
@@ -2384,6 +2437,44 @@ msgid "In-game chat console background color (R,G,B)."
 msgstr "遊戲內聊天視窗背景顏色 (R,G,B)。"
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"內建工具。\n"
+"這通常僅被核心/內建貢獻者需要"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "分析登錄的聊天指令。"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"在登錄上分析全域回呼。\n"
+"(任何您想要傳遞給 minetest.register_*() 函數的東西)"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr "分析登錄的活躍區塊修飾器的動作函數。"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr "分析登錄的載入中區塊修飾器的動作函數。"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "分析登錄的實體方法。"
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "儀表"
+
+#: src/settings_translation_file.cpp
 msgid "Interval of saving important changes in the world, stated in seconds."
 msgstr "儲存世界中的重要變更的間隔,以秒計。"
 
@@ -2420,6 +2511,14 @@ msgstr ""
 "控制細節的品質。"
 
 #: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "搖桿按鈕重覆間隔"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "搖桿靈敏度"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Julia set only: W component of hypercomplex constant determining julia "
 "shape.\n"
@@ -2643,6 +2742,16 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"切換自動奔跑的按鍵。\n"
+"請見 http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
 "Key for toggling cinematic mode.\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2693,7 +2802,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
 "See http://irrlicht.sourceforge.net/docu/namespaceirr."
 "html#a54da2a0e231901735e3da1b0edf72eb3"
 msgstr ""
@@ -2805,11 +2914,11 @@ msgstr "伺服器 tick 的長度與相關物件的間隔通常透過網路更新
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between ABM execution cycles"
-msgstr ""
+msgstr "在 ABM 執行循環間的時間長度"
 
 #: src/settings_translation_file.cpp
 msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "在 Node 計時器執行循環間的時間長度"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -2882,6 +2991,24 @@ msgid "Liquid update tick"
 msgstr "液體更新 tick"
 
 #: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "載入遊戲分析器"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+"載入遊戲分析器以收集遊戲分析資料。\n"
+"提供一個 /profiler 指令以存取已編譯的設定檔。\n"
+"對 mod 開發者與伺服器提供者有用。"
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "正在載入方塊調整器"
+
+#: src/settings_translation_file.cpp
 msgid "Main menu game manager"
 msgstr "主選單遊戲管理員"
 
@@ -2907,7 +3034,6 @@ msgid "Map directory"
 msgstr "地圖目錄"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen Valleys.\n"
 "'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2915,41 +3041,35 @@ msgid ""
 "'humid_rivers' modifies the humidity around rivers and in areas where water "
 "would tend to pool,\n"
 "it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"專用於 Mapgen v6 的地圖生成屬性。\n"
-"當 snowbiomes 與叢林都啟用時,叢林旗標會被忽略。\n"
-"未在旗標字串中指定的旗標將不會自預設值修改。\n"
-"以「no」開頭的旗標字串將會用於明確的停用它們。"
+"專用於 Mapgen Valleys 的地圖生成屬性。\n"
+"'altitude_chill' 讓高海拔處更冷,這可能會導致一些與生物群落相關的問題。\n"
+"'humid_rivers' 修改了河流周圍的濕度,該處的水會傾向形成池子。\n"
+"這可能會干擾經過微秒調整的生物群落。\n"
+"未在旗標字串中指定的旗標不會自預設值修改。\n"
+"以 'no' 開頭的旗標會用於明確地停用它們。"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen flat.\n"
 "Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
 "專用於 Mapgen flat 的地圖生成屬性。\n"
-"偶而會在平坦的世界中加入湖泊與山丘。\n"
+"可能會有少數的湖泊或是丘陵會在扁平的世界中生成。\n"
 "未在旗標字串中指定的旗標將不會自預設值修改。\n"
 "以「no」開頭的旗標字串將會用於明確的停用它們。"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v6.\n"
 "When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
 "flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
@@ -2960,18 +3080,15 @@ msgstr ""
 "以「no」開頭的旗標字串將會用於明確的停用它們。"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid ""
 "Map generation attributes specific to Mapgen v7.\n"
 "The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
 "Flags that are not specified in the flag string are not modified from the "
 "default.\n"
 "Flags starting with 'no' are used to explicitly disable them."
 msgstr ""
-"專用於 Mapgen v6 的地圖生成屬性。\n"
-"當 snowbiomes 與叢林都啟用時,叢林旗標會被忽略。\n"
+"專用於 Mapgen v7 的地圖生成屬性。\n"
+"「ridges」為河流。\n"
 "未在旗標字串中指定的旗標將不會自預設值修改。\n"
 "以「no」開頭的旗標字串將會用於明確的停用它們。"
 
@@ -3020,9 +3137,8 @@ msgid "Mapgen flat"
 msgstr "Mapgen flat"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen flat cave width"
-msgstr "Mapgen flat 大型洞穴深度"
+msgstr "Mapgen flat 洞穴寬度"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen flat cave1 noise parameters"
@@ -3073,9 +3189,8 @@ msgid "Mapgen fractal"
 msgstr "地圖產生器分形"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen fractal cave width"
-msgstr "Mapgen fractal slice w"
+msgstr "Mapgen 分形洞穴寬度"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen fractal cave1 noise parameters"
@@ -3142,9 +3257,8 @@ msgid "Mapgen v5"
 msgstr "Mapgen v5"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v5 cave width"
-msgstr "Mapgen flat 大型洞穴深度"
+msgstr "Mapgen v5 洞穴寬度"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v5 cave1 noise parameters"
@@ -3231,9 +3345,8 @@ msgid "Mapgen v7"
 msgstr "地圖產生器 v7"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Mapgen v7 cave width"
-msgstr "Mapgen flat 大型洞穴深度"
+msgstr "Mapgen v7 洞穴寬度"
 
 #: src/settings_translation_file.cpp
 msgid "Mapgen v7 cave1 noise parameters"
@@ -3332,6 +3445,14 @@ msgid "Maximum hotbar width"
 msgstr "快捷列最大寬度"
 
 #: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "最大同時總傳送的區塊數量。"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "每個客戶端可同時傳送的最大區塊數量。"
+
+#: src/settings_translation_file.cpp
 msgid "Maximum number of blocks that can be queued for loading."
 msgstr "可被放進佇列內等待載入的最大區塊數。"
 
@@ -3382,6 +3503,10 @@ msgid "Maximum number of statically stored objects in a block."
 msgstr "最大靜態儲存於一個區塊中的物件數量。"
 
 #: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "每個區塊最大物件數"
+
+#: src/settings_translation_file.cpp
 msgid ""
 "Maximum proportion of current window to be used for hotbar.\n"
 "Useful if there's something to be displayed right or left of hotbar."
@@ -3390,11 +3515,11 @@ msgstr ""
 "如果有東西要顯示在快捷列左邊或右邊時很有用。"
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
 msgstr "每個客戶端最大同時傳送區塊數"
 
 #: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
 msgstr "總和最大同時傳送區塊數"
 
 #: src/settings_translation_file.cpp
@@ -3406,10 +3531,6 @@ msgid "Maximum users"
 msgstr "最多使用者"
 
 #: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "每個區塊最大物件數"
-
-#: src/settings_translation_file.cpp
 msgid "Menus"
 msgstr "選單"
 
@@ -3450,10 +3571,6 @@ msgid "Mipmapping"
 msgstr "映射貼圖"
 
 #: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr "Mod 分析器"
-
-#: src/settings_translation_file.cpp
 msgid "Modstore details URL"
 msgstr "Modstore 詳細資訊 URL"
 
@@ -3549,9 +3666,8 @@ msgid "Node highlighting"
 msgstr "突顯節點"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "NodeTimer interval"
-msgstr "時間傳送間隔"
+msgstr "NodeTimer 間隔"
 
 #: src/settings_translation_file.cpp
 msgid "Noise parameters for biome API temperature, humidity and biome blend."
@@ -3680,20 +3796,26 @@ msgid "Prevent mods from doing insecure things like running shell commands."
 msgstr "避免 mod 做出不安全的舉動,像是執行 shell 指令等。"
 
 #: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr "引擎性能資料印出間隔的秒數。0 = 停用。對開發者有用。"
+
+#: src/settings_translation_file.cpp
 msgid "Privileges that players with basic_privs can grant"
-msgstr ""
+msgstr "有 basic_privs 的玩家可以提升特權"
 
 #: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr "分析器資料印出間隔。0 = 停用。對開發者有用。"
+msgid "Profiler"
+msgstr "分析器"
 
 #: src/settings_translation_file.cpp
 msgid "Profiler toggle key"
 msgstr "分析器切換鍵"
 
 #: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "分析列印間隔"
+msgid "Profiling"
+msgstr "分析"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3729,6 +3851,10 @@ msgid "Replaces the default main menu with a custom one."
 msgstr "以自訂選單取代預設主選單。"
 
 #: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "報告路徑"
+
+#: src/settings_translation_file.cpp
 msgid "Right key"
 msgstr "右鍵"
 
@@ -3799,14 +3925,12 @@ msgid "Screenshot folder"
 msgstr "螢幕截圖資料夾"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot format"
-msgstr "螢幕截圖資料夾"
+msgstr "螢幕截圖格式"
 
 #: src/settings_translation_file.cpp
-#, fuzzy
 msgid "Screenshot quality"
-msgstr "螢幕截圖"
+msgstr "螢幕截圖品質"
 
 #: src/settings_translation_file.cpp
 msgid ""
@@ -3814,6 +3938,9 @@ msgid ""
 "1 means worst quality; 100 means best quality.\n"
 "Use 0 for default quality."
 msgstr ""
+"螢幕截圖的品質。僅用於 JPEG 格式。\n"
+"1 代表最差的品質,100 代表最佳品質。\n"
+"使用 0 來使用預設品質。"
 
 #: src/settings_translation_file.cpp
 msgid "Security"
@@ -3901,7 +4028,7 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
 "video cards.\n"
 "Thy only work with the OpenGL video backend."
 msgstr ""
@@ -3918,7 +4045,7 @@ msgstr "顯示除錯資訊"
 
 #: src/settings_translation_file.cpp
 msgid "Show entity selection boxes"
-msgstr ""
+msgstr "顯示物體選取方塊"
 
 #: src/settings_translation_file.cpp
 msgid "Shutdown message"
@@ -3940,10 +4067,10 @@ msgstr "平滑光"
 
 #: src/settings_translation_file.cpp
 msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
 "Useful for recording videos."
 msgstr ""
-"當移動與東張西望時讓攝影機變流暢。\n"
+"當移動與東張西望時讓攝影機變流暢。也稱為觀看或滑鼠流暢。\n"
 "對錄影很有用。"
 
 #: src/settings_translation_file.cpp
@@ -3992,7 +4119,7 @@ msgstr "嚴格協議檢查"
 
 #: src/settings_translation_file.cpp
 msgid "Support older servers"
-msgstr ""
+msgstr "支援較舊版本的伺服器"
 
 #: src/settings_translation_file.cpp
 msgid "Synchronous SQLite"
@@ -4031,10 +4158,24 @@ msgid "The altitude at which temperature drops by 20C"
 msgstr "會降低攝氏 20 度的高度"
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+"設定被儲存為預設格式。\n"
+"當呼叫「/profiler save [格式]」但不包含格式時。"
+
+#: src/settings_translation_file.cpp
 msgid "The depth of dirt or other filler"
 msgstr "塵土或其他填充物的深度"
 
 #: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr "設定檔將會被儲存到的,相對於您的全域路徑的檔案路徑。\n"
+
+#: src/settings_translation_file.cpp
 msgid "The network interface that the server listens on."
 msgstr "伺服器要監聽的網路介面。"
 
@@ -4052,6 +4193,14 @@ msgstr "Irrlicht 的成像後端。"
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+"在遊戲中,視野四處移動時的\n"
+"搖桿靈敏度。"
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The strength (darkness) of node ambient-occlusion shading.\n"
 "Lower is darker, Higher is lighter. The valid range of values for this\n"
 "setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -4074,6 +4223,14 @@ msgstr ""
 
 #: src/settings_translation_file.cpp
 msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"在重複的事件間以秒計的時間\n"
+"當按住搖桿的組合。"
+
+#: src/settings_translation_file.cpp
+msgid ""
 "The time in seconds it takes between repeated right clicks when holding the "
 "right mouse button."
 msgstr "當按住滑鼠右鍵時,重覆右鍵點選的間隔以秒計。"
@@ -4084,14 +4241,14 @@ msgstr "這個字型將會被用於特定的語言。"
 
 #: src/settings_translation_file.cpp
 msgid "Time in between active block management cycles"
-msgstr ""
+msgstr "在活躍方塊管理循環的時間中間"
 
 #: src/settings_translation_file.cpp
 msgid ""
 "Time in seconds for item entity (dropped items) to live.\n"
 "Setting it to -1 disables the feature."
 msgstr ""
-"物品(丟棄的物品)可以存活多久,以秒計。\n"
+"物品物體(丟棄的物品)可以存活多久,以秒計。\n"
 "設定其為 -1 以停用這個功能。"
 
 #: src/settings_translation_file.cpp
@@ -4183,10 +4340,6 @@ msgid "Use trilinear filtering when scaling textures."
 msgstr "當縮放材質時使用三線性過濾。"
 
 #: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "對 mod 開發者很有用。"
-
-#: src/settings_translation_file.cpp
 msgid "V-Sync"
 msgstr "垂直同步"
 
@@ -4321,7 +4474,7 @@ msgid ""
 "When gui_scaling_filter_txr2img is true, copy those images\n"
 "from hardware to software for scaling.  When false, fall back\n"
 "to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
 msgstr ""
 "當 gui_scaling_filter_txr2img 被設定為真,複製這些圖片\n"
 "從硬體到軟體以供縮放。當為假時,退回\n"
@@ -4407,6 +4560,10 @@ msgid ""
 "Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n"
 "Disabling this option will protect your password better."
 msgstr ""
+"是否支援在協議版本 25 前的舊伺服器。\n"
+"若您想要連線到 0.4.12 版或更舊的伺服器就啟用。\n"
+"自 0.4.13 起的伺服器將可以正常運作,0.4.12-dev 版的伺服器可能可以正常運作。\n"
+"停用這個選項可以將您的密碼保護的比較好一點。"
 
 #: src/settings_translation_file.cpp
 msgid "Width component of the initial window size."
@@ -4444,54 +4601,34 @@ msgstr "cURL 並行限制"
 msgid "cURL timeout"
 msgstr "cURL 逾時"
 
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
-#~ msgstr ""
-#~ "啟用略低的的水面,所以它就不會完全「填滿」節點。\n"
-#~ "注意,這個功能並未最佳化完成,水面的\n"
-#~ "柔和光功能無法與此功能一同運作。"
-
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
-#~ msgstr "啟用節點選擇突顯(停用選取框)。"
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "詳細的 mod 檔案資料。對 mod 開發者很有用。"
 
-#~ msgid "Preload inventory textures"
-#~ msgstr "預先載入物品欄材質"
-
-#~ msgid "Reset singleplayer world"
-#~ msgstr "重置單人遊戲世界"
+#~ msgid "Detailed mod profiling"
+#~ msgstr "詳細的 mod 檔案"
 
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "套用在選單元素的縮放係數: "
+#~ msgid ""
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
+#~ msgstr "整個伺服器有多少個區塊同時以線性方式飛行。"
 
-#~ msgid "Touch free target"
-#~ msgstr "碰觸自由目標"
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
+#~ msgstr "每個客戶端有多少個區塊同時以線性方式飛行。"
 
-#~ msgid "If enabled, "
-#~ msgstr "若啟用, "
+#~ msgid "Useful for mod developers."
+#~ msgstr "對 mod 開發者很有用。"
 
-#~ msgid "If disabled "
-#~ msgstr "若停用 "
+#~ msgid "No of course not!"
+#~ msgstr "不,絕對不是!"
 
-#~ msgid "Enable a bit lower water surface, so it doesn't "
-#~ msgstr "啟用較低的水面,所以它不會 "
+#~ msgid "Public Serverlist"
+#~ msgstr "公共伺服器清單"
 
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid "Generate Normalmaps"
+#~ msgstr "生成一般地圖"
 
-#~ msgid ""
-#~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
-#~ "Flags that are not specified in the flag string are not modified from the "
-#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
-#~ msgstr ""
-#~ "專用於 Mapgen v7 的地圖生成屬性。\n"
-#~ "「ridges」為河流。\n"
-#~ "未在旗標字串中指定的旗標將不會自預設值修改。\n"
-#~ "以「no」開頭的旗標字串將會用於明確的停用它們。"
+#~ msgid "No!!!"
+#~ msgstr "否!!!"
 
 #~ msgid ""
 #~ "Map generation attributes specific to Mapgen Valleys.\n"
@@ -4511,14 +4648,66 @@ msgstr "cURL 逾時"
 #~ "「humid_rivers」會修改在河流附近的濕度,在那些區域附近水將會傾向變為一池。"
 #~ "這可能會對微妙調整過的生物群落造成干擾。"
 
-#~ msgid "No!!!"
-#~ msgstr "否!!!"
+#~ msgid "\""
+#~ msgstr "\""
 
-#~ msgid "Generate Normalmaps"
-#~ msgstr "生成一般地圖"
+#~ msgid "Enable a bit lower water surface, so it doesn't "
+#~ msgstr "啟用較低的水面,所以它不會 "
 
-#~ msgid "Public Serverlist"
-#~ msgstr "公共伺服器清單"
+#~ msgid "If disabled "
+#~ msgstr "若停用 "
 
-#~ msgid "No of course not!"
-#~ msgstr "不,絕對不是!"
+#~ msgid "If enabled, "
+#~ msgstr "若啟用, "
+
+#~ msgid "Touch free target"
+#~ msgstr "碰觸自由目標"
+
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "套用在選單元素的縮放係數: "
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "預先載入物品欄材質"
+
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr "啟用節點選擇突顯(停用選取框)。"
+
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "啟用略低的的水面,所以它就不會完全「填滿」節點。\n"
+#~ "注意,這個功能並未最佳化完成,水面的\n"
+#~ "柔和光功能無法與此功能一同運作。"
+
+#, fuzzy
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen v7.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with 'no' are used to explicitly disable them."
+#~ msgstr ""
+#~ "專用於 Mapgen v6 的地圖生成屬性。\n"
+#~ "當 snowbiomes 與叢林都啟用時,叢林旗標會被忽略。\n"
+#~ "未在旗標字串中指定的旗標將不會自預設值修改。\n"
+#~ "以「no」開頭的旗標字串將會用於明確的停用它們。"
+
+#, fuzzy
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with 'no' are used to explicitly disable them."
+#~ msgstr ""
+#~ "專用於 Mapgen flat 的地圖生成屬性。\n"
+#~ "偶而會在平坦的世界中加入湖泊與山丘。\n"
+#~ "未在旗標字串中指定的旗標將不會自預設值修改。\n"
+#~ "以「no」開頭的旗標字串將會用於明確的停用它們。"
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index feca199..3aa645d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 2.6)
 project(minetest)
 
 INCLUDE(CheckIncludeFiles)
+INCLUDE(CheckLibraryExists)
 
 # Add custom SemiDebug build mode
 set(CMAKE_CXX_FLAGS_SEMIDEBUG "-O1 -g -Wall -Wabi" CACHE STRING
@@ -189,6 +190,36 @@ if(ENABLE_CURSES)
 	endif()
 endif(ENABLE_CURSES)
 
+option(ENABLE_POSTGRESQL "Enable PostgreSQL backend" TRUE)
+set(USE_POSTGRESQL FALSE)
+
+if(ENABLE_POSTGRESQL)
+	find_program(POSTGRESQL_CONFIG_EXECUTABLE pg_config DOC "pg_config")
+	find_library(POSTGRESQL_LIBRARY pq)
+	if(POSTGRESQL_CONFIG_EXECUTABLE)
+		execute_process(COMMAND ${POSTGRESQL_CONFIG_EXECUTABLE} --includedir-server
+			OUTPUT_VARIABLE POSTGRESQL_SERVER_INCLUDE_DIRS
+			OUTPUT_STRIP_TRAILING_WHITESPACE)
+		execute_process(COMMAND ${POSTGRESQL_CONFIG_EXECUTABLE}
+			OUTPUT_VARIABLE POSTGRESQL_CLIENT_INCLUDE_DIRS
+			OUTPUT_STRIP_TRAILING_WHITESPACE)
+		# This variable is case sensitive for the cmake PostgreSQL module
+		set(PostgreSQL_ADDITIONAL_SEARCH_PATHS ${POSTGRESQL_SERVER_INCLUDE_DIRS} ${POSTGRESQL_CLIENT_INCLUDE_DIRS})
+	endif()
+
+	find_package("PostgreSQL")
+
+	if(POSTGRESQL_FOUND)
+		set(USE_POSTGRESQL TRUE)
+		message(STATUS "PostgreSQL backend enabled")
+		# This variable is case sensitive, don't try to change it to POSTGRESQL_INCLUDE_DIR
+		message(STATUS "PostgreSQL includes: ${PostgreSQL_INCLUDE_DIR}")
+		include_directories(${PostgreSQL_INCLUDE_DIR})
+	else()
+		message(STATUS "PostgreSQL not found!")
+	endif()
+endif(ENABLE_POSTGRESQL)
+
 option(ENABLE_LEVELDB "Enable LevelDB backend" TRUE)
 set(USE_LEVELDB FALSE)
 
@@ -262,9 +293,10 @@ if(WIN32)
 	set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
 			CACHE PATH "Zlib include directory")
 	set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
-			CACHE FILEPATH "Path to zlibwapi.lib")
+			CACHE FILEPATH "Path to zlib library (usually zlibwapi.lib)")
 	set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
-			CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
+			CACHE FILEPATH "Path to zlib DLL (for installation)")
+	set(ZLIBWAPI_DLL "" CACHE FILEPATH "Path to zlibwapi DLL")
 	set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
 			CACHE PATH "irrlicht dir")
 	if(USE_FREETYPE)
@@ -306,7 +338,10 @@ else()
 	if(APPLE)
 		set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
 	else()
-		set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
+		check_library_exists(rt clock_gettime "" HAVE_LIBRT)
+		if (HAVE_LIBRT)
+			set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
+		endif(HAVE_LIBRT)
 	endif(APPLE)
 
 	# This way Xxf86vm is found on OpenBSD too
@@ -346,6 +381,7 @@ add_subdirectory(network)
 add_subdirectory(script)
 add_subdirectory(unittest)
 add_subdirectory(util)
+add_subdirectory(irrlicht_changes)
 
 set(common_SRCS
 	ban.cpp
@@ -361,6 +397,7 @@ set(common_SRCS
 	craftdef.cpp
 	database-dummy.cpp
 	database-leveldb.cpp
+	database-postgresql.cpp
 	database-redis.cpp
 	database-sqlite3.cpp
 	database.cpp
@@ -379,6 +416,7 @@ set(common_SRCS
 	light.cpp
 	log.cpp
 	map.cpp
+	map_settings_manager.cpp
 	mapblock.cpp
 	mapgen.cpp
 	mapgen_flat.cpp
@@ -407,6 +445,8 @@ set(common_SRCS
 	porting.cpp
 	profiler.cpp
 	quicktune.cpp
+	reflowscan.cpp
+	remoteplayer.cpp
 	rollback.cpp
 	rollback_interface.cpp
 	serialization.cpp
@@ -435,6 +475,7 @@ set(common_SRCS
 # This gives us the icon and file version information
 if(WIN32)
 	set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
+	set(MINETEST_EXE_MANIFEST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/minetest.exe.manifest")
 	if(MINGW)
 		if(NOT CMAKE_RC_COMPILER)
 			set(CMAKE_RC_COMPILER "windres.exe")
@@ -447,7 +488,7 @@ if(WIN32)
 			DEPENDS ${WINRESOURCE_FILE})
 		SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
 	else(MINGW) # Probably MSVC
-		set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
+		set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE})
 	endif(MINGW)
 endif()
 
@@ -462,6 +503,7 @@ set(client_SRCS
 	${common_SRCS}
 	${sound_SRCS}
 	${client_network_SRCS}
+	${client_irrlicht_changes_SRCS}
 	camera.cpp
 	client.cpp
 	clientmap.cpp
@@ -499,6 +541,7 @@ set(client_SRCS
 	sky.cpp
 	wieldmesh.cpp
 	${client_SCRIPT_SRCS}
+	${UNITTEST_CLIENT_SRCS}
 )
 list(SORT client_SRCS)
 
@@ -522,6 +565,7 @@ include_directories(
 	${LUA_INCLUDE_DIR}
 	${GMP_INCLUDE_DIR}
 	${JSON_INCLUDE_DIR}
+	${X11_INCLUDE_DIR}
 	${PROJECT_SOURCE_DIR}/script
 )
 
@@ -592,6 +636,9 @@ if(BUILD_CLIENT)
 	if (USE_CURSES)
 		target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
 	endif()
+	if (USE_POSTGRESQL)
+		target_link_libraries(${PROJECT_NAME} ${POSTGRESQL_LIBRARY})
+	endif()
 	if (USE_LEVELDB)
 		target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
 	endif()
@@ -622,6 +669,9 @@ if(BUILD_SERVER)
 	if (USE_CURSES)
 		target_link_libraries(${PROJECT_NAME}server ${CURSES_LIBRARIES})
 	endif()
+	if (USE_POSTGRESQL)
+		target_link_libraries(${PROJECT_NAME}server ${POSTGRESQL_LIBRARY})
+	endif()
 	if (USE_LEVELDB)
 		target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
 	endif()
@@ -639,6 +689,28 @@ if(BUILD_SERVER)
 	endif()
 endif(BUILD_SERVER)
 
+# Blacklisted locales that don't work.
+# see issue #4638
+set(GETTEXT_BLACKLISTED_LOCALES
+	be
+	he
+	ko
+	ky
+	zh_CN
+	zh_TW
+)
+
+option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid broken locales" TRUE)
+
+if (GETTEXT_FOUND AND APPLY_LOCALE_BLACKLIST)
+	set(GETTEXT_USED_LOCALES "")
+	foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
+		if (NOT ";${GETTEXT_BLACKLISTED_LOCALES};" MATCHES ";${LOCALE};")
+			list(APPEND GETTEXT_USED_LOCALES ${LOCALE})
+		endif()
+	endforeach()
+	message(STATUS "Locale blacklist applied; Locales used: ${GETTEXT_USED_LOCALES}")
+endif()
 
 # Set some optimizations and tweaks
 
@@ -648,9 +720,9 @@ if(MSVC)
 	# Visual Studio
 
 	# EHa enables SEH exceptions (used for catching segfaults)
-	set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /Ob2 /Oi /Ot /Oy /GL /FD /MT /GS- /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
+	set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MT /GS- /Zi /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
 	#set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
-	set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
+	set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /DEBUG /OPT:REF /OPT:ICF")
 
 	set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
 
@@ -678,8 +750,14 @@ else()
 		set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
 	endif()
 
+	if(WIN32 AND NOT ZLIBWAPI_DLL AND CMAKE_SIZEOF_VOID_P EQUAL 4)
+		set(OTHER_FLAGS "${OTHER_FLAGS} -DWIN32_NO_ZLIB_WINAPI")
+		message(WARNING "Defaulting to cdecl for zlib on win32 because ZLIBWAPI_DLL"
+			" isn't set, ensure that ZLIBWAPI_DLL is set if you want stdcall.")
+	endif()
+
 	if(MINGW)
-		set(OTHER_FLAGS "-mthreads -fexceptions")
+		set(OTHER_FLAGS "${OTHER_FLAGS} -mthreads -fexceptions")
 	endif()
 
 	set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
@@ -751,7 +829,7 @@ if(BUILD_CLIENT)
 	endif()
 
 	if(USE_GETTEXT)
-		foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
+		foreach(LOCALE ${GETTEXT_USED_LOCALES})
 			set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
 			set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
 			install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
@@ -780,7 +858,7 @@ endif()
 if (USE_GETTEXT)
 	set(MO_FILES)
 
-	foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
+	foreach(LOCALE ${GETTEXT_USED_LOCALES})
 		set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
 		set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
 		set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
diff --git a/src/camera.cpp b/src/camera.cpp
index 6893b8c..43980db 100644
--- a/src/camera.cpp
+++ b/src/camera.cpp
@@ -103,6 +103,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
 	m_cache_fall_bobbing_amount = g_settings->getFloat("fall_bobbing_amount");
 	m_cache_view_bobbing_amount = g_settings->getFloat("view_bobbing_amount");
 	m_cache_fov                 = g_settings->getFloat("fov");
+	m_cache_zoom_fov            = g_settings->getFloat("zoom_fov");
 	m_cache_view_bobbing        = g_settings->getBool("view_bobbing");
 	m_nametags.clear();
 }
@@ -387,8 +388,13 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
 	if (m_camera_mode == CAMERA_MODE_THIRD_FRONT)
 		m_camera_position = my_cp;
 
-	// Get FOV setting
-	f32 fov_degrees = m_cache_fov;
+	// Get FOV
+	f32 fov_degrees;
+	if (player->getPlayerControl().zoom && m_gamedef->checkLocalPrivilege("zoom")) {
+		fov_degrees = m_cache_zoom_fov;
+	} else {
+		fov_degrees = m_cache_fov;
+	}
 	fov_degrees = MYMAX(fov_degrees, 10.0);
 	fov_degrees = MYMIN(fov_degrees, 170.0);
 
@@ -466,7 +472,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
 	{
 		// Start animation
 		m_view_bobbing_state = 1;
-		m_view_bobbing_speed = MYMIN(speed.getLength(), 40);
+		m_view_bobbing_speed = MYMIN(speed.getLength(), 70);
 	}
 	else if (m_view_bobbing_state == 1)
 	{
@@ -478,13 +484,12 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
 
 void Camera::updateViewingRange()
 {
+	f32 viewing_range = g_settings->getFloat("viewing_range");
+	m_draw_control.wanted_range = viewing_range;
 	if (m_draw_control.range_all) {
 		m_cameranode->setFarValue(100000.0);
 		return;
 	}
-
-	f32 viewing_range = g_settings->getFloat("viewing_range");
-	m_draw_control.wanted_range = viewing_range;
 	m_cameranode->setFarValue((viewing_range < 2000) ? 2000 * BS : viewing_range * BS);
 }
 
@@ -546,7 +551,7 @@ void Camera::drawNametags()
 			// shadow can remain.
 			continue;
 		}
-		v3f pos = nametag->parent_node->getPosition() + v3f(0.0, 1.1 * BS, 0.0);
+		v3f pos = nametag->parent_node->getAbsolutePosition() + v3f(0.0, 1.1 * BS, 0.0);
 		f32 transformed_pos[4] = { pos.X, pos.Y, pos.Z, 1.0f };
 		trans.multiplyWith1x4Matrix(transformed_pos);
 		if (transformed_pos[3] > 0) {
diff --git a/src/camera.h b/src/camera.h
index ce46c31..cb0e968 100644
--- a/src/camera.h
+++ b/src/camera.h
@@ -231,6 +231,7 @@ private:
 	f32 m_cache_fall_bobbing_amount;
 	f32 m_cache_view_bobbing_amount;
 	f32 m_cache_fov;
+	f32 m_cache_zoom_fov;
 	bool m_cache_view_bobbing;
 
 	std::list<Nametag *> m_nametags;
diff --git a/src/cavegen.cpp b/src/cavegen.cpp
index b8abfbc..bb6aa25 100644
--- a/src/cavegen.cpp
+++ b/src/cavegen.cpp
@@ -23,46 +23,183 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapgen_v5.h"
 #include "mapgen_v6.h"
 #include "mapgen_v7.h"
+#include "mg_biome.h"
 #include "cavegen.h"
 
-NoiseParams nparams_caveliquids(0, 1, v3f(150.0, 150.0, 150.0), 776, 3, 0.6, 2.0);
+static NoiseParams nparams_caveliquids(0, 1, v3f(150.0, 150.0, 150.0), 776, 3, 0.6, 2.0);
 
 
-///////////////////////////////////////// Caves V5
+////
+//// CavesNoiseIntersection
+////
 
+CavesNoiseIntersection::CavesNoiseIntersection(
+	INodeDefManager *nodedef, BiomeManager *biomemgr, v3s16 chunksize,
+	NoiseParams *np_cave1, NoiseParams *np_cave2, s32 seed, float cave_width)
+{
+	assert(nodedef);
+	assert(biomemgr);
+
+	m_ndef = nodedef;
+	m_bmgr = biomemgr;
+
+	m_csize = chunksize;
+	m_cave_width = cave_width;
 
-CaveV5::CaveV5(Mapgen *mg, PseudoRandom *ps)
+	m_ystride    = m_csize.X;
+	m_zstride_1d = m_csize.X * (m_csize.Y + 1);
+
+	// Noises are created using 1-down overgeneration
+	// A Nx-by-1-by-Nz-sized plane is at the bottom of the desired for
+	// re-carving the solid overtop placed for blocking sunlight
+	noise_cave1 = new Noise(np_cave1, seed, m_csize.X, m_csize.Y + 1, m_csize.Z);
+	noise_cave2 = new Noise(np_cave2, seed, m_csize.X, m_csize.Y + 1, m_csize.Z);
+}
+
+
+CavesNoiseIntersection::~CavesNoiseIntersection()
 {
-	this->mg             = mg;
-	this->vm             = mg->vm;
-	this->ndef           = mg->ndef;
-	this->water_level    = mg->water_level;
-	this->ps             = ps;
-	c_water_source       = ndef->getId("mapgen_water_source");
-	c_lava_source        = ndef->getId("mapgen_lava_source");
-	c_ice                = ndef->getId("mapgen_ice");
-	this->np_caveliquids = &nparams_caveliquids;
-	this->ystride        = mg->csize.X;
- 
-	if (c_ice == CONTENT_IGNORE)
-		c_ice = CONTENT_AIR;
+	delete noise_cave1;
+	delete noise_cave2;
+}
 
-	dswitchint = ps->range(1, 14);
-	flooded    = ps->range(1, 2) == 2;
 
-	part_max_length_rs  = ps->range(2, 4);
-	tunnel_routepoints  = ps->range(5, ps->range(15, 30));
-	min_tunnel_diameter = 5;
-	max_tunnel_diameter = ps->range(7, ps->range(8, 24));
+void CavesNoiseIntersection::generateCaves(MMVManip *vm,
+	v3s16 nmin, v3s16 nmax, u8 *biomemap)
+{
+	assert(vm);
+	assert(biomemap);
+
+	noise_cave1->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z);
+	noise_cave2->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z);
+
+	v3s16 em = vm->m_area.getExtent();
+	u32 index2d = 0;
+
+	for (s16 z = nmin.Z; z <= nmax.Z; z++)
+	for (s16 x = nmin.X; x <= nmax.X; x++, index2d++) {
+		bool column_is_open = false;  // Is column open to overground
+		bool is_under_river = false;  // Is column under river water
+		bool is_tunnel = false;  // Is tunnel or tunnel floor
+		u32 vi = vm->m_area.index(x, nmax.Y, z);
+		u32 index3d = (z - nmin.Z) * m_zstride_1d + m_csize.Y * m_ystride +
+			(x - nmin.X);
+		// Biome of column
+		Biome *biome = (Biome *)m_bmgr->getRaw(biomemap[index2d]);
+
+		// Don't excavate the overgenerated stone at nmax.Y + 1,
+		// this creates a 'roof' over the tunnel, preventing light in
+		// tunnels at mapchunk borders when generating mapchunks upwards.
+		// This 'roof' is removed when the mapchunk above is generated.
+		for (s16 y = nmax.Y; y >= nmin.Y - 1; y--,
+				index3d -= m_ystride,
+				vm->m_area.add_y(em, vi, -1)) {
+
+			content_t c = vm->m_data[vi].getContent();
+			if (c == CONTENT_AIR || c == biome->c_water_top ||
+					c == biome->c_water) {
+				column_is_open = true;
+				continue;
+			} else if (c == biome->c_river_water) {
+				column_is_open = true;
+				is_under_river = true;
+				continue;
+			}
+			// Ground
+			float d1 = contour(noise_cave1->result[index3d]);
+			float d2 = contour(noise_cave2->result[index3d]);
+
+			if (d1 * d2 > m_cave_width && m_ndef->get(c).is_ground_content) {
+				// In tunnel and ground content, excavate
+				vm->m_data[vi] = MapNode(CONTENT_AIR);
+				is_tunnel = true;
+			} else {
+				// Not in tunnel or not ground content
+				if (is_tunnel && column_is_open &&
+						(c == biome->c_filler || c == biome->c_stone)) {
+					// Tunnel entrance floor
+					if (is_under_river)
+						vm->m_data[vi] = MapNode(biome->c_riverbed);
+					else
+						vm->m_data[vi] = MapNode(biome->c_top);
+				}
 
-	large_cave_is_flat = (ps->range(0, 1) == 0);
+				column_is_open = false;
+				is_tunnel = false;
+			}
+		}
+	}
 }
 
 
-void CaveV5::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
+////
+//// CavesRandomWalk
+////
+
+CavesRandomWalk::CavesRandomWalk(
+	INodeDefManager *ndef,
+	GenerateNotifier *gennotify,
+	s32 seed,
+	int water_level,
+	content_t water_source,
+	content_t lava_source)
 {
-	node_min = nmin;
-	node_max = nmax;
+	assert(ndef);
+
+	this->ndef           = ndef;
+	this->gennotify      = gennotify;
+	this->seed           = seed;
+	this->water_level    = water_level;
+	this->np_caveliquids = &nparams_caveliquids;
+	this->lava_depth     = DEFAULT_LAVA_DEPTH;
+
+	c_water_source = water_source;
+	if (c_water_source == CONTENT_IGNORE)
+		c_water_source = ndef->getId("mapgen_water_source");
+	if (c_water_source == CONTENT_IGNORE)
+		c_water_source = CONTENT_AIR;
+
+	c_lava_source = lava_source;
+	if (c_lava_source == CONTENT_IGNORE)
+		c_lava_source = ndef->getId("mapgen_lava_source");
+	if (c_lava_source == CONTENT_IGNORE)
+		c_lava_source = CONTENT_AIR;
+}
+
+
+void CavesRandomWalk::makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax,
+	PseudoRandom *ps, bool is_large_cave, int max_stone_height, s16 *heightmap)
+{
+	assert(vm);
+	assert(ps);
+
+	this->vm         = vm;
+	this->ps         = ps;
+	this->node_min   = nmin;
+	this->node_max   = nmax;
+	this->heightmap  = heightmap;
+	this->large_cave = is_large_cave;
+
+	this->ystride = nmax.X - nmin.X + 1;
+
+	// Set initial parameters from randomness
+	int dswitchint = ps->range(1, 14);
+	flooded = ps->range(1, 2) == 2;
+
+	if (large_cave) {
+		part_max_length_rs = ps->range(2, 4);
+		tunnel_routepoints = ps->range(5, ps->range(15, 30));
+		min_tunnel_diameter = 5;
+		max_tunnel_diameter = ps->range(7, ps->range(8, 24));
+	} else {
+		part_max_length_rs = ps->range(2, 9);
+		tunnel_routepoints = ps->range(10, ps->range(15, 30));
+		min_tunnel_diameter = 2;
+		max_tunnel_diameter = ps->range(2, 6);
+	}
+
+	large_cave_is_flat = (ps->range(0, 1) == 0);
+
 	main_direction = v3f(0, 0, 0);
 
 	// Allowed route area size in nodes
@@ -72,10 +209,10 @@ void CaveV5::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
 
 	// Allow a bit more
 	//(this should be more than the maximum radius of the tunnel)
-	s16 insure = 10;
+	const s16 insure = 10;
 	s16 more = MYMAX(MAP_BLOCKSIZE - max_tunnel_diameter / 2 - insure, 1);
-	ar += v3s16(1,0,1) * more * 2;
-	of -= v3s16(1,0,1) * more;
+	ar += v3s16(1, 0, 1) * more * 2;
+	of -= v3s16(1, 0, 1) * more;
 
 	route_y_min = 0;
 	// Allow half a diameter + 7 over stone surface
@@ -84,13 +221,15 @@ void CaveV5::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
 	// Limit maximum to area
 	route_y_max = rangelim(route_y_max, 0, ar.Y - 1);
 
-	s16 min = 0;
+	if (large_cave) {
+		s16 minpos = 0;
 		if (node_min.Y < water_level && node_max.Y > water_level) {
-			min = water_level - max_tunnel_diameter/3 - of.Y;
-			route_y_max = water_level + max_tunnel_diameter/3 - of.Y;
+			minpos = water_level - max_tunnel_diameter / 3 - of.Y;
+			route_y_max = water_level + max_tunnel_diameter / 3 - of.Y;
 		}
-	route_y_min = ps->range(min, min + max_tunnel_diameter);
-	route_y_min = rangelim(route_y_min, 0, route_y_max);
+		route_y_min = ps->range(minpos, minpos + max_tunnel_diameter);
+		route_y_min = rangelim(route_y_min, 0, route_y_max);
+	}
 
 	s16 route_start_y_min = route_y_min;
 	s16 route_start_y_max = route_y_max;
@@ -99,30 +238,42 @@ void CaveV5::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
 	route_start_y_max = rangelim(route_start_y_max, route_start_y_min, ar.Y - 1);
 
 	// Randomize starting position
-	orp = v3f(
-		(float)(ps->next() % ar.X) + 0.5,
-		(float)(ps->range(route_start_y_min, route_start_y_max)) + 0.5,
-		(float)(ps->next() % ar.Z) + 0.5
-	);
+	orp.Z = (float)(ps->next() % ar.Z) + 0.5f;
+	orp.Y = (float)(ps->range(route_start_y_min, route_start_y_max)) + 0.5f;
+	orp.X = (float)(ps->next() % ar.X) + 0.5f;
 
 	// Add generation notify begin event
-	v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
-	GenNotifyType notifytype = GENNOTIFY_LARGECAVE_BEGIN;
-	mg->gennotify.addEvent(notifytype, abs_pos);
+	if (gennotify) {
+		v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
+		GenNotifyType notifytype = large_cave ?
+			GENNOTIFY_LARGECAVE_BEGIN : GENNOTIFY_CAVE_BEGIN;
+		gennotify->addEvent(notifytype, abs_pos);
+	}
 
 	// Generate some tunnel starting from orp
 	for (u16 j = 0; j < tunnel_routepoints; j++)
 		makeTunnel(j % dswitchint == 0);
 
 	// Add generation notify end event
-	abs_pos = v3s16(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
-	notifytype = GENNOTIFY_LARGECAVE_END;
-	mg->gennotify.addEvent(notifytype, abs_pos);
+	if (gennotify) {
+		v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
+		GenNotifyType notifytype = large_cave ?
+			GENNOTIFY_LARGECAVE_END : GENNOTIFY_CAVE_END;
+		gennotify->addEvent(notifytype, abs_pos);
+	}
 }
 
 
-void CaveV5::makeTunnel(bool dirswitch)
+void CavesRandomWalk::makeTunnel(bool dirswitch)
 {
+	if (dirswitch && !large_cave) {
+		main_direction.Z = ((float)(ps->next() % 20) - (float)10) / 10;
+		main_direction.Y = ((float)(ps->next() % 20) - (float)10) / 30;
+		main_direction.X = ((float)(ps->next() % 20) - (float)10) / 10;
+
+		main_direction *= (float)ps->range(0, 10) / 10;
+	}
+
 	// Randomize size
 	s16 min_d = min_tunnel_diameter;
 	s16 max_d = max_tunnel_diameter;
@@ -130,47 +281,38 @@ void CaveV5::makeTunnel(bool dirswitch)
 	s16 rs_part_max_length_rs = rs * part_max_length_rs;
 
 	v3s16 maxlen;
-	maxlen = v3s16(
-		rs_part_max_length_rs,
-		rs_part_max_length_rs / 2,
-		rs_part_max_length_rs
-	);
+	if (large_cave) {
+		maxlen = v3s16(
+			rs_part_max_length_rs,
+			rs_part_max_length_rs / 2,
+			rs_part_max_length_rs
+		);
+	} else {
+		maxlen = v3s16(
+			rs_part_max_length_rs,
+			ps->range(1, rs_part_max_length_rs),
+			rs_part_max_length_rs
+		);
+	}
 
 	v3f vec;
 	// Jump downward sometimes
-	vec = v3f(
-		(float)(ps->next() % maxlen.X) - (float)maxlen.X / 2,
-		(float)(ps->next() % maxlen.Y) - (float)maxlen.Y / 2,
-		(float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2
-	);
+	if (!large_cave && ps->range(0, 12) == 0) {
+		vec.Z = (float)(ps->next() % (maxlen.Z * 1)) - (float)maxlen.Z / 2;
+		vec.Y = (float)(ps->next() % (maxlen.Y * 2)) - (float)maxlen.Y;
+		vec.X = (float)(ps->next() % (maxlen.X * 1)) - (float)maxlen.X / 2;
+	} else {
+		vec.Z = (float)(ps->next() % (maxlen.Z * 1)) - (float)maxlen.Z / 2;
+		vec.Y = (float)(ps->next() % (maxlen.Y * 1)) - (float)maxlen.Y / 2;
+		vec.X = (float)(ps->next() % (maxlen.X * 1)) - (float)maxlen.X / 2;
+	}
 
 	// Do not make caves that are above ground.
 	// It is only necessary to check the startpoint and endpoint.
-	v3s16 orpi(orp.X, orp.Y, orp.Z);
-	v3s16 veci(vec.X, vec.Y, vec.Z);
-	v3s16 p;
-
-	p = orpi + veci + of + rs / 2;
-	if (p.Z >= node_min.Z && p.Z <= node_max.Z &&
-			p.X >= node_min.X && p.X <= node_max.X) {
-		u32 index = (p.Z - node_min.Z) * ystride + (p.X - node_min.X);
-		s16 h = mg->heightmap[index];
-		if (h < p.Y)
-			return;
-	} else if (p.Y > water_level) {
-		return; // If it's not in our heightmap, use a simple heuristic
-	}
-
-	p = orpi + of + rs / 2;
-	if (p.Z >= node_min.Z && p.Z <= node_max.Z &&
-			p.X >= node_min.X && p.X <= node_max.X) {
-		u32 index = (p.Z - node_min.Z) * ystride + (p.X - node_min.X);
-		s16 h = mg->heightmap[index];
-		if (h < p.Y)
-			return;
-	} else if (p.Y > water_level) {
+	v3s16 p1 = v3s16(orp.X, orp.Y, orp.Z) + of + rs / 2;
+	v3s16 p2 = v3s16(vec.X, vec.Y, vec.Z) + p1;
+	if (isPosAboveSurface(p1) || isPosAboveSurface(p2))
 		return;
-	}
 
 	vec += main_direction;
 
@@ -193,21 +335,21 @@ void CaveV5::makeTunnel(bool dirswitch)
 	vec = rp - orp;
 
 	float veclen = vec.getLength();
-	if (veclen < 0.05)
-		veclen = 1.0;
+	if (veclen < 0.05f)
+		veclen = 1.0f;
 
 	// Every second section is rough
 	bool randomize_xz = (ps->range(1, 2) == 1);
 
 	// Carve routes
-	for (float f = 0; f < 1.0; f += 1.0 / veclen)
+	for (float f = 0.f; f < 1.0f; f += 1.0f / veclen)
 		carveRoute(vec, f, randomize_xz);
 
 	orp = rp;
 }
 
 
-void CaveV5::carveRoute(v3f vec, float f, bool randomize_xz) 
+void CavesRandomWalk::carveRoute(v3f vec, float f, bool randomize_xz)
 {
 	MapNode airnode(CONTENT_AIR);
 	MapNode waternode(c_water_source);
@@ -217,22 +359,24 @@ void CaveV5::carveRoute(v3f vec, float f, bool randomize_xz)
 	startp += of;
 
 	float nval = NoisePerlin3D(np_caveliquids, startp.X,
-		startp.Y, startp.Z, mg->seed);
-	MapNode liquidnode = (nval < 0.40 && node_max.Y < MGV5_LAVA_DEPTH) ?
+		startp.Y, startp.Z, seed);
+	MapNode liquidnode = (nval < 0.40f && node_max.Y < lava_depth) ?
 		lavanode : waternode;
 
 	v3f fp = orp + vec * f;
-	fp.X += 0.1 * ps->range(-10, 10);
-	fp.Z += 0.1 * ps->range(-10, 10);
+	fp.X += 0.1f * ps->range(-10, 10);
+	fp.Z += 0.1f * ps->range(-10, 10);
 	v3s16 cp(fp.X, fp.Y, fp.Z);
 
-	s16 d0 = -rs/2;
+	s16 d0 = -rs / 2;
 	s16 d1 = d0 + rs;
 	if (randomize_xz) {
 		d0 += ps->range(-1, 1);
 		d1 += ps->range(-1, 1);
 	}
 
+	bool flat_cave_floor = !large_cave && ps->range(0, 2) == 2;
+
 	for (s16 z0 = d0; z0 <= d1; z0++) {
 		s16 si = rs / 2 - MYMAX(0, abs(z0) - rs / 7 - 1);
 		for (s16 x0 = -si - ps->range(0,1); x0 <= si - 1 + ps->range(0,1); x0++) {
@@ -241,6 +385,10 @@ void CaveV5::carveRoute(v3f vec, float f, bool randomize_xz)
 			s16 si2 = rs / 2 - MYMAX(0, maxabsxz - rs / 7 - 1);
 
 			for (s16 y0 = -si2; y0 <= si2; y0++) {
+				// Make better floors in small caves
+				if (flat_cave_floor && y0 <= -rs / 2 && rs <= 7)
+					continue;
+
 				if (large_cave_is_flat) {
 					// Make large caves not so tall
 					if (rs > 7 && abs(y0) >= rs / 3)
@@ -258,63 +406,105 @@ void CaveV5::carveRoute(v3f vec, float f, bool randomize_xz)
 				if (!ndef->get(c).is_ground_content)
 					continue;
 
-				int full_ymin = node_min.Y - MAP_BLOCKSIZE;
-				int full_ymax = node_max.Y + MAP_BLOCKSIZE;
-
-				if (flooded && full_ymin < water_level &&
-						full_ymax > water_level)
-					vm->m_data[i] = (p.Y <= water_level) ?
-						waternode : airnode;
-				else if (flooded && full_ymax < water_level)
-					vm->m_data[i] = (p.Y < startp.Y - 4) ?
-						liquidnode : airnode;
-				else
+				if (large_cave) {
+					int full_ymin = node_min.Y - MAP_BLOCKSIZE;
+					int full_ymax = node_max.Y + MAP_BLOCKSIZE;
+
+					if (flooded && full_ymin < water_level && full_ymax > water_level)
+						vm->m_data[i] = (p.Y <= water_level) ? waternode : airnode;
+					else if (flooded && full_ymax < water_level)
+						vm->m_data[i] = (p.Y < startp.Y - 4) ? liquidnode : airnode;
+					else
+						vm->m_data[i] = airnode;
+				} else {
+					if (c == CONTENT_IGNORE)
+						continue;
+
 					vm->m_data[i] = airnode;
+					vm->m_flags[i] |= VMANIP_FLAG_CAVE;
+				}
 			}
 		}
 	}
 }
 
 
-///////////////////////////////////////// Caves V6
+inline bool CavesRandomWalk::isPosAboveSurface(v3s16 p)
+{
+	if (heightmap != NULL &&
+			p.Z >= node_min.Z && p.Z <= node_max.Z &&
+			p.X >= node_min.X && p.X <= node_max.X) {
+		u32 index = (p.Z - node_min.Z) * ystride + (p.X - node_min.X);
+		if (heightmap[index] < p.Y)
+			return true;
+	} else if (p.Y > water_level) {
+		return true;
+	}
+
+	return false;
+}
+
+
+////
+//// CavesV6
+////
+
+CavesV6::CavesV6(INodeDefManager *ndef, GenerateNotifier *gennotify,
+	int water_level, content_t water_source, content_t lava_source)
+{
+	assert(ndef);
+
+	this->ndef        = ndef;
+	this->gennotify   = gennotify;
+	this->water_level = water_level;
+
+	c_water_source = water_source;
+	if (c_water_source == CONTENT_IGNORE)
+		c_water_source = ndef->getId("mapgen_water_source");
+	if (c_water_source == CONTENT_IGNORE)
+		c_water_source = CONTENT_AIR;
+
+	c_lava_source = lava_source;
+	if (c_lava_source == CONTENT_IGNORE)
+		c_lava_source = ndef->getId("mapgen_lava_source");
+	if (c_lava_source == CONTENT_IGNORE)
+		c_lava_source = CONTENT_AIR;
+}
 
 
-CaveV6::CaveV6(MapgenV6 *mg, PseudoRandom *ps, PseudoRandom *ps2, bool is_large_cave)
+void CavesV6::makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax,
+	PseudoRandom *ps, PseudoRandom *ps2,
+	bool is_large_cave, int max_stone_height, s16 *heightmap)
 {
-	this->mg             = mg;
-	this->vm             = mg->vm;
-	this->ndef           = mg->ndef;
-	this->water_level    = mg->water_level;
-	this->large_cave     = is_large_cave;
-	this->ps             = ps;
-	this->ps2            = ps2;
-	this->c_water_source = mg->c_water_source;
-	this->c_lava_source  = mg->c_lava_source;
+	assert(vm);
+	assert(ps);
+	assert(ps2);
+
+	this->vm         = vm;
+	this->ps         = ps;
+	this->ps2        = ps2;
+	this->node_min   = nmin;
+	this->node_max   = nmax;
+	this->heightmap  = heightmap;
+	this->large_cave = is_large_cave;
+
+	this->ystride = nmax.X - nmin.X + 1;
 
+	// Set initial parameters from randomness
 	min_tunnel_diameter = 2;
 	max_tunnel_diameter = ps->range(2, 6);
-	dswitchint          = ps->range(1, 14);
-	flooded             = true;
-
+	int dswitchint      = ps->range(1, 14);
 	if (large_cave) {
-		part_max_length_rs  = ps->range(2,4);
-		tunnel_routepoints  = ps->range(5, ps->range(15,30));
+		part_max_length_rs  = ps->range(2, 4);
+		tunnel_routepoints  = ps->range(5, ps->range(15, 30));
 		min_tunnel_diameter = 5;
-		max_tunnel_diameter = ps->range(7, ps->range(8,24));
+		max_tunnel_diameter = ps->range(7, ps->range(8, 24));
 	} else {
-		part_max_length_rs = ps->range(2,9);
-		tunnel_routepoints = ps->range(10, ps->range(15,30));
+		part_max_length_rs = ps->range(2, 9);
+		tunnel_routepoints = ps->range(10, ps->range(15, 30));
 	}
+	large_cave_is_flat = (ps->range(0, 1) == 0);
 
-	large_cave_is_flat = (ps->range(0,1) == 0);
-}
-
-
-void CaveV6::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
-{
-	node_min = nmin;
-	node_max = nmax;
-	max_stone_y = max_stone_height;
 	main_direction = v3f(0, 0, 0);
 
 	// Allowed route area size in nodes
@@ -325,67 +515,68 @@ void CaveV6::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
 	// Allow a bit more
 	//(this should be more than the maximum radius of the tunnel)
 	const s16 max_spread_amount = MAP_BLOCKSIZE;
-	s16 insure = 10;
+	const s16 insure = 10;
 	s16 more = MYMAX(max_spread_amount - max_tunnel_diameter / 2 - insure, 1);
-	ar += v3s16(1,0,1) * more * 2;
-	of -= v3s16(1,0,1) * more;
+	ar += v3s16(1, 0, 1) * more * 2;
+	of -= v3s16(1, 0, 1) * more;
 
 	route_y_min = 0;
 	// Allow half a diameter + 7 over stone surface
-	route_y_max = -of.Y + max_stone_y + max_tunnel_diameter / 2 + 7;
+	route_y_max = -of.Y + max_stone_height + max_tunnel_diameter / 2 + 7;
 
 	// Limit maximum to area
 	route_y_max = rangelim(route_y_max, 0, ar.Y - 1);
 
 	if (large_cave) {
-		s16 min = 0;
+		s16 minpos = 0;
 		if (node_min.Y < water_level && node_max.Y > water_level) {
-			min = water_level - max_tunnel_diameter/3 - of.Y;
-			route_y_max = water_level + max_tunnel_diameter/3 - of.Y;
+			minpos = water_level - max_tunnel_diameter / 3 - of.Y;
+			route_y_max = water_level + max_tunnel_diameter / 3 - of.Y;
 		}
-		route_y_min = ps->range(min, min + max_tunnel_diameter);
+		route_y_min = ps->range(minpos, minpos + max_tunnel_diameter);
 		route_y_min = rangelim(route_y_min, 0, route_y_max);
 	}
 
 	s16 route_start_y_min = route_y_min;
 	s16 route_start_y_max = route_y_max;
 
-	route_start_y_min = rangelim(route_start_y_min, 0, ar.Y-1);
-	route_start_y_max = rangelim(route_start_y_max, route_start_y_min, ar.Y-1);
+	route_start_y_min = rangelim(route_start_y_min, 0, ar.Y - 1);
+	route_start_y_max = rangelim(route_start_y_max, route_start_y_min, ar.Y - 1);
 
 	// Randomize starting position
-	orp = v3f(
-		(float)(ps->next() % ar.X) + 0.5,
-		(float)(ps->range(route_start_y_min, route_start_y_max)) + 0.5,
-		(float)(ps->next() % ar.Z) + 0.5
-	);
+	orp.Z = (float)(ps->next() % ar.Z) + 0.5f;
+	orp.Y = (float)(ps->range(route_start_y_min, route_start_y_max)) + 0.5f;
+	orp.X = (float)(ps->next() % ar.X) + 0.5f;
 
 	// Add generation notify begin event
-	v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
-	GenNotifyType notifytype = large_cave ?
-		GENNOTIFY_LARGECAVE_BEGIN : GENNOTIFY_CAVE_BEGIN;
-	mg->gennotify.addEvent(notifytype, abs_pos);
+	if (gennotify != NULL) {
+		v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
+		GenNotifyType notifytype = large_cave ?
+			GENNOTIFY_LARGECAVE_BEGIN : GENNOTIFY_CAVE_BEGIN;
+		gennotify->addEvent(notifytype, abs_pos);
+	}
 
 	// Generate some tunnel starting from orp
 	for (u16 j = 0; j < tunnel_routepoints; j++)
 		makeTunnel(j % dswitchint == 0);
 
 	// Add generation notify end event
-	abs_pos = v3s16(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
-	notifytype = large_cave ?
-		GENNOTIFY_LARGECAVE_END : GENNOTIFY_CAVE_END;
-	mg->gennotify.addEvent(notifytype, abs_pos);
+	if (gennotify != NULL) {
+		v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
+		GenNotifyType notifytype = large_cave ?
+			GENNOTIFY_LARGECAVE_END : GENNOTIFY_CAVE_END;
+		gennotify->addEvent(notifytype, abs_pos);
+	}
 }
 
 
-void CaveV6::makeTunnel(bool dirswitch)
+void CavesV6::makeTunnel(bool dirswitch)
 {
 	if (dirswitch && !large_cave) {
-		main_direction = v3f(
-			((float)(ps->next() % 20) - (float)10) / 10,
-			((float)(ps->next() % 20) - (float)10) / 30,
-			((float)(ps->next() % 20) - (float)10) / 10
-		);
+		main_direction.Z = ((float)(ps->next() % 20) - (float)10) / 10;
+		main_direction.Y = ((float)(ps->next() % 20) - (float)10) / 30;
+		main_direction.X = ((float)(ps->next() % 20) - (float)10) / 10;
+
 		main_direction *= (float)ps->range(0, 10) / 10;
 	}
 
@@ -410,54 +601,30 @@ void CaveV6::makeTunnel(bool dirswitch)
 		);
 	}
 
-	v3f vec(
-		(float)(ps->next() % maxlen.X) - (float)maxlen.X / 2,
-		(float)(ps->next() % maxlen.Y) - (float)maxlen.Y / 2,
-		(float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2
-	);
+	v3f vec;
+	vec.Z = (float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2;
+	vec.Y = (float)(ps->next() % maxlen.Y) - (float)maxlen.Y / 2;
+	vec.X = (float)(ps->next() % maxlen.X) - (float)maxlen.X / 2;
 
 	// Jump downward sometimes
 	if (!large_cave && ps->range(0, 12) == 0) {
-		vec = v3f(
-			(float)(ps->next() % maxlen.X) - (float)maxlen.X / 2,
-			(float)(ps->next() % (maxlen.Y * 2)) - (float)maxlen.Y,
-			(float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2
-		);
+		vec.Z = (float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2;
+		vec.Y = (float)(ps->next() % (maxlen.Y * 2)) - (float)maxlen.Y;
+		vec.X = (float)(ps->next() % maxlen.X) - (float)maxlen.X / 2;
 	}
 
-	// Do not make caves that are entirely above ground, to fix
-	// shadow bugs caused by overgenerated large caves.
+	// Do not make caves that are entirely above ground, to fix shadow bugs
+	// caused by overgenerated large caves.
 	// It is only necessary to check the startpoint and endpoint.
-	v3s16 orpi(orp.X, orp.Y, orp.Z);
-	v3s16 veci(vec.X, vec.Y, vec.Z);
-	s16 h1;
-	s16 h2;
-
-	v3s16 p1 = orpi + veci + of + rs / 2;
-	if (p1.Z >= node_min.Z && p1.Z <= node_max.Z &&
-			p1.X >= node_min.X && p1.X <= node_max.X) {
-		u32 index1 = (p1.Z - node_min.Z) * mg->ystride +
-			(p1.X - node_min.X);
-		h1 = mg->heightmap[index1];
-	} else {
-		h1 = water_level; // If not in heightmap
-	}
+	v3s16 p1 = v3s16(orp.X, orp.Y, orp.Z) + of + rs / 2;
+	v3s16 p2 = v3s16(vec.X, vec.Y, vec.Z) + p1;
 
-	v3s16 p2 = orpi + of + rs / 2;
-	if (p2.Z >= node_min.Z && p2.Z <= node_max.Z &&
-			p2.X >= node_min.X && p2.X <= node_max.X) {
-		u32 index2 = (p2.Z - node_min.Z) * mg->ystride +
-			(p2.X - node_min.X);
-		h2 = mg->heightmap[index2];
-	} else {
-		h2 = water_level;
-	}
-
-	// If startpoint and endpoint are above ground,
-	// disable placing of nodes in carveRoute while
-	// still running all pseudorandom calls to ensure
-	// caves consistent with existing worlds.
-	bool tunnel_above_ground = p1.Y > h1 && p2.Y > h2;
+	// If startpoint and endpoint are above ground, disable placement of nodes
+	// in carveRoute while still running all PseudoRandom calls to ensure caves
+	// are consistent with existing worlds.
+	bool tunnel_above_ground =
+		p1.Y > getSurfaceFromHeightmap(p1) &&
+		p2.Y > getSurfaceFromHeightmap(p2);
 
 	vec += main_direction;
 
@@ -481,21 +648,22 @@ void CaveV6::makeTunnel(bool dirswitch)
 
 	float veclen = vec.getLength();
 	// As odd as it sounds, veclen is *exactly* 0.0 sometimes, causing a FPE
-	if (veclen < 0.05)
-		veclen = 1.0;
+	if (veclen < 0.05f)
+		veclen = 1.0f;
 
 	// Every second section is rough
 	bool randomize_xz = (ps2->range(1, 2) == 1);
 
 	// Carve routes
-	for (float f = 0; f < 1.0; f += 1.0 / veclen)
+	for (float f = 0.f; f < 1.0f; f += 1.0f / veclen)
 		carveRoute(vec, f, randomize_xz, tunnel_above_ground);
 
 	orp = rp;
 }
 
 
-void CaveV6::carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_ground)
+void CavesV6::carveRoute(v3f vec, float f, bool randomize_xz,
+	bool tunnel_above_ground)
 {
 	MapNode airnode(CONTENT_AIR);
 	MapNode waternode(c_water_source);
@@ -505,11 +673,11 @@ void CaveV6::carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_g
 	startp += of;
 
 	v3f fp = orp + vec * f;
-	fp.X += 0.1 * ps->range(-10, 10);
-	fp.Z += 0.1 * ps->range(-10, 10);
+	fp.X += 0.1f * ps->range(-10, 10);
+	fp.Z += 0.1f * ps->range(-10, 10);
 	v3s16 cp(fp.X, fp.Y, fp.Z);
 
-	s16 d0 = -rs/2;
+	s16 d0 = -rs / 2;
 	s16 d1 = d0 + rs;
 	if (randomize_xz) {
 		d0 += ps->range(-1, 1);
@@ -546,13 +714,10 @@ void CaveV6::carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_g
 					int full_ymin = node_min.Y - MAP_BLOCKSIZE;
 					int full_ymax = node_max.Y + MAP_BLOCKSIZE;
 
-					if (flooded && full_ymin < water_level &&
-							full_ymax > water_level) {
-						vm->m_data[i] = (p.Y <= water_level) ?
-							waternode : airnode;
-					} else if (flooded && full_ymax < water_level) {
-						vm->m_data[i] = (p.Y < startp.Y - 2) ?
-							lavanode : airnode;
+					if (full_ymin < water_level && full_ymax > water_level) {
+						vm->m_data[i] = (p.Y <= water_level) ? waternode : airnode;
+					} else if (full_ymax < water_level) {
+						vm->m_data[i] = (p.Y < startp.Y - 2) ? lavanode : airnode;
 					} else {
 						vm->m_data[i] = airnode;
 					}
@@ -569,246 +734,14 @@ void CaveV6::carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_g
 }
 
 
-///////////////////////////////////////// Caves V7
-
-
-CaveV7::CaveV7(MapgenV7 *mg, PseudoRandom *ps)
-{
-	this->mg             = mg;
-	this->vm             = mg->vm;
-	this->ndef           = mg->ndef;
-	this->water_level    = mg->water_level;
-	this->ps             = ps;
-	this->c_water_source = mg->c_water_source;
-	this->c_lava_source  = mg->c_lava_source;
-	this->c_ice          = mg->c_ice;
-	this->np_caveliquids = &nparams_caveliquids;
-
-	dswitchint = ps->range(1, 14);
-	flooded    = ps->range(1, 2) == 2;
-
-	part_max_length_rs  = ps->range(2, 4);
-	tunnel_routepoints  = ps->range(5, ps->range(15, 30));
-	min_tunnel_diameter = 5;
-	max_tunnel_diameter = ps->range(7, ps->range(8, 24));
-
-	large_cave_is_flat = (ps->range(0, 1) == 0);
-}
-
-
-void CaveV7::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
+inline s16 CavesV6::getSurfaceFromHeightmap(v3s16 p)
 {
-	node_min = nmin;
-	node_max = nmax;
-	max_stone_y = max_stone_height;
-	main_direction = v3f(0, 0, 0);
-
-	// Allowed route area size in nodes
-	ar = node_max - node_min + v3s16(1, 1, 1);
-	// Area starting point in nodes
-	of = node_min;
-
-	// Allow a bit more
-	//(this should be more than the maximum radius of the tunnel)
-	s16 insure = 10;
-	s16 more = MYMAX(MAP_BLOCKSIZE - max_tunnel_diameter / 2 - insure, 1);
-	ar += v3s16(1,0,1) * more * 2;
-	of -= v3s16(1,0,1) * more;
-
-	route_y_min = 0;
-	// Allow half a diameter + 7 over stone surface
-	route_y_max = -of.Y + max_stone_y + max_tunnel_diameter / 2 + 7;
-
-	// Limit maximum to area
-	route_y_max = rangelim(route_y_max, 0, ar.Y - 1);
-
-	s16 min = 0;
-	if (node_min.Y < water_level && node_max.Y > water_level) {
-		min = water_level - max_tunnel_diameter/3 - of.Y;
-		route_y_max = water_level + max_tunnel_diameter/3 - of.Y;
-	}
-	route_y_min = ps->range(min, min + max_tunnel_diameter);
-	route_y_min = rangelim(route_y_min, 0, route_y_max);
-
-	s16 route_start_y_min = route_y_min;
-	s16 route_start_y_max = route_y_max;
-
-	route_start_y_min = rangelim(route_start_y_min, 0, ar.Y - 1);
-	route_start_y_max = rangelim(route_start_y_max, route_start_y_min, ar.Y - 1);
-
-	// Randomize starting position
-	orp = v3f(
-		(float)(ps->next() % ar.X) + 0.5,
-		(float)(ps->range(route_start_y_min, route_start_y_max)) + 0.5,
-		(float)(ps->next() % ar.Z) + 0.5
-	);
-
-	// Add generation notify begin event
-	v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
-	GenNotifyType notifytype = GENNOTIFY_LARGECAVE_BEGIN;
-	mg->gennotify.addEvent(notifytype, abs_pos);
-
-	// Generate some tunnel starting from orp
-	for (u16 j = 0; j < tunnel_routepoints; j++)
-		makeTunnel(j % dswitchint == 0);
-
-	// Add generation notify end event
-	abs_pos = v3s16(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
-	notifytype = GENNOTIFY_LARGECAVE_END;
-	mg->gennotify.addEvent(notifytype, abs_pos);
-}
-
-
-void CaveV7::makeTunnel(bool dirswitch)
-{
-	// Randomize size
-	s16 min_d = min_tunnel_diameter;
-	s16 max_d = max_tunnel_diameter;
-	rs = ps->range(min_d, max_d);
-	s16 rs_part_max_length_rs = rs * part_max_length_rs;
-
-	v3s16 maxlen;
-	maxlen = v3s16(
-		rs_part_max_length_rs,
-		rs_part_max_length_rs / 2,
-		rs_part_max_length_rs
-	);
-
-	v3f vec;
-	// Jump downward sometimes
-	vec = v3f(
-		(float)(ps->next() % maxlen.X) - (float)maxlen.X / 2,
-		(float)(ps->next() % maxlen.Y) - (float)maxlen.Y / 2,
-		(float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2
-	);
-
-	// Do not make caves that are above ground.
-	// It is only necessary to check the startpoint and endpoint.
-	v3s16 orpi(orp.X, orp.Y, orp.Z);
-	v3s16 veci(vec.X, vec.Y, vec.Z);
-	v3s16 p;
-
-	p = orpi + veci + of + rs / 2;
-	if (p.Z >= node_min.Z && p.Z <= node_max.Z &&
-			p.X >= node_min.X && p.X <= node_max.X) {
-		u32 index = (p.Z - node_min.Z) * mg->ystride + (p.X - node_min.X);
-		s16 h = mg->ridge_heightmap[index];
-		if (h < p.Y)
-			return;
-	} else if (p.Y > water_level) {
-		return; // If it's not in our heightmap, use a simple heuristic
-	}
-
-	p = orpi + of + rs / 2;
-	if (p.Z >= node_min.Z && p.Z <= node_max.Z &&
+	if (heightmap != NULL &&
+			p.Z >= node_min.Z && p.Z <= node_max.Z &&
 			p.X >= node_min.X && p.X <= node_max.X) {
-		u32 index = (p.Z - node_min.Z) * mg->ystride + (p.X - node_min.X);
-		s16 h = mg->ridge_heightmap[index];
-		if (h < p.Y)
-			return;
-	} else if (p.Y > water_level) {
-		return;
-	}
-
-	vec += main_direction;
-
-	v3f rp = orp + vec;
-	if (rp.X < 0)
-		rp.X = 0;
-	else if (rp.X >= ar.X)
-		rp.X = ar.X - 1;
-
-	if (rp.Y < route_y_min)
-		rp.Y = route_y_min;
-	else if (rp.Y >= route_y_max)
-		rp.Y = route_y_max - 1;
-
-	if (rp.Z < 0)
-		rp.Z = 0;
-	else if (rp.Z >= ar.Z)
-		rp.Z = ar.Z - 1;
-
-	vec = rp - orp;
-
-	float veclen = vec.getLength();
-	if (veclen < 0.05)
-		veclen = 1.0;
-
-	// Every second section is rough
-	bool randomize_xz = (ps->range(1, 2) == 1);
-
-	// Carve routes
-	for (float f = 0; f < 1.0; f += 1.0 / veclen)
-		carveRoute(vec, f, randomize_xz);
-
-	orp = rp;
-}
-
-
-void CaveV7::carveRoute(v3f vec, float f, bool randomize_xz)
-{
-	MapNode airnode(CONTENT_AIR);
-	MapNode waternode(c_water_source);
-	MapNode lavanode(c_lava_source);
-
-	v3s16 startp(orp.X, orp.Y, orp.Z);
-	startp += of;
-
-	float nval = NoisePerlin3D(np_caveliquids, startp.X,
-		startp.Y, startp.Z, mg->seed);
-	MapNode liquidnode = (nval < 0.40 && node_max.Y < MGV7_LAVA_DEPTH) ?
-		lavanode : waternode;
-
-	v3f fp = orp + vec * f;
-	fp.X += 0.1 * ps->range(-10, 10);
-	fp.Z += 0.1 * ps->range(-10, 10);
-	v3s16 cp(fp.X, fp.Y, fp.Z);
-
-	s16 d0 = -rs/2;
-	s16 d1 = d0 + rs;
-	if (randomize_xz) {
-		d0 += ps->range(-1, 1);
-		d1 += ps->range(-1, 1);
-	}
-
-	for (s16 z0 = d0; z0 <= d1; z0++) {
-		s16 si = rs / 2 - MYMAX(0, abs(z0) - rs / 7 - 1);
-		for (s16 x0 = -si - ps->range(0,1); x0 <= si - 1 + ps->range(0,1); x0++) {
-			s16 maxabsxz = MYMAX(abs(x0), abs(z0));
-
-			s16 si2 = rs / 2 - MYMAX(0, maxabsxz - rs / 7 - 1);
-
-			for (s16 y0 = -si2; y0 <= si2; y0++) {
-				if (large_cave_is_flat) {
-					// Make large caves not so tall
-					if (rs > 7 && abs(y0) >= rs / 3)
-						continue;
-				}
-
-				v3s16 p(cp.X + x0, cp.Y + y0, cp.Z + z0);
-				p += of;
-
-				if (vm->m_area.contains(p) == false)
-					continue;
-
-				u32 i = vm->m_area.index(p);
-				content_t c = vm->m_data[i].getContent();
-				if (!ndef->get(c).is_ground_content)
-					continue;
-
-				int full_ymin = node_min.Y - MAP_BLOCKSIZE;
-				int full_ymax = node_max.Y + MAP_BLOCKSIZE;
-
-				if (flooded && full_ymin < water_level &&
-						full_ymax > water_level)
-					vm->m_data[i] = (p.Y <= water_level) ?
-						waternode : airnode;
-				else if (flooded && full_ymax < water_level)
-					vm->m_data[i] = (p.Y < startp.Y - 4) ?
-						liquidnode : airnode;
-				else
-					vm->m_data[i] = airnode;
-			}
-		}
+		u32 index = (p.Z - node_min.Z) * ystride + (p.X - node_min.X);
+		return heightmap[index];
+	} else {
+		return water_level;
 	}
 }
diff --git a/src/cavegen.h b/src/cavegen.h
index a112471..2bf503d 100644
--- a/src/cavegen.h
+++ b/src/cavegen.h
@@ -21,69 +21,79 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define CAVEGEN_HEADER
 
 #define VMANIP_FLAG_CAVE VOXELFLAG_CHECKED1
-#define MGV5_LAVA_DEPTH -256
-#define MGV7_LAVA_DEPTH -256
+#define DEFAULT_LAVA_DEPTH (-256)
 
-class MapgenV5;
-class MapgenV6;
-class MapgenV7;
+class GenerateNotifier;
 
-class CaveV5 {
-public:
-	Mapgen *mg;
-	MMVManip *vm;
-	INodeDefManager *ndef;
+/*
+	CavesNoiseIntersection is a cave digging algorithm that carves smooth,
+	web-like, continuous tunnels at points where the density of the intersection
+	between two separate 3d noises is above a certain value.  This value,
+	cave_width, can be modified to set the effective width of these tunnels.
 
-	NoiseParams *np_caveliquids;
+	This algorithm is relatively heavyweight, taking ~80ms to generate an
+	80x80x80 chunk of map on a modern processor.  Use sparingly!
 
-	s16 min_tunnel_diameter;
-	s16 max_tunnel_diameter;
-	u16 tunnel_routepoints;
-	int dswitchint;
-	int part_max_length_rs;
-
-	bool large_cave_is_flat;
-	bool flooded;
+	TODO(hmmmm): Remove dependency on biomes
+	TODO(hmmmm): Find alternative to overgeneration as solution for sunlight issue
+*/
+class CavesNoiseIntersection {
+public:
+	CavesNoiseIntersection(INodeDefManager *nodedef, BiomeManager *biomemgr,
+		v3s16 chunksize, NoiseParams *np_cave1, NoiseParams *np_cave2,
+		s32 seed, float cave_width);
+	~CavesNoiseIntersection();
 
-	s16 max_stone_y;
-	v3s16 node_min;
-	v3s16 node_max;
+	void generateCaves(MMVManip *vm, v3s16 nmin, v3s16 nmax, u8 *biomemap);
 
-	v3f orp;  // starting point, relative to caved space
-	v3s16 of; // absolute coordinates of caved space
-	v3s16 ar; // allowed route area
-	s16 rs;   // tunnel radius size
-	v3f main_direction;
+private:
+	INodeDefManager *m_ndef;
+	BiomeManager *m_bmgr;
 
-	s16 route_y_min;
-	s16 route_y_max;
+	// configurable parameters
+	v3s16 m_csize;
+	float m_cave_width;
 
-	PseudoRandom *ps;
+	// intermediate state variables
+	u16 m_ystride;
+	u16 m_zstride_1d;
 
-	content_t c_water_source;
-	content_t c_lava_source;
-	content_t c_ice;
+	Noise *noise_cave1;
+	Noise *noise_cave2;
+};
 
-	int water_level;
-	int ystride;
+/*
+	CavesRandomWalk is an implementation of a cave-digging algorithm that
+	operates on the principle of a "random walk" to approximate the stochiastic
+	activity of cavern development.
 
-	CaveV5() {}
-	CaveV5(Mapgen *mg, PseudoRandom *ps);
-	void makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height);
-	void makeTunnel(bool dirswitch);
-	void carveRoute(v3f vec, float f, bool randomize_xz);
-};
+	In summary, this algorithm works by carving a randomly sized tunnel in a
+	random direction a random amount of times, randomly varying in width.
+	All randomness here is uniformly distributed; alternative distributions have
+	not yet been implemented.
 
-class CaveV6 {
+	This algorithm is very fast, executing in less than 1ms on average for an
+	80x80x80 chunk of map on a modern processor.
+*/
+class CavesRandomWalk {
 public:
-	MapgenV6 *mg;
 	MMVManip *vm;
 	INodeDefManager *ndef;
+	GenerateNotifier *gennotify;
+	s16 *heightmap;
+
+	// configurable parameters
+	s32 seed;
+	int water_level;
+	int lava_depth;
+	NoiseParams *np_caveliquids;
+
+	// intermediate state variables
+	u16 ystride;
 
 	s16 min_tunnel_diameter;
 	s16 max_tunnel_diameter;
 	u16 tunnel_routepoints;
-	int dswitchint;
 	int part_max_length_rs;
 
 	bool large_cave;
@@ -104,38 +114,70 @@ public:
 	s16 route_y_max;
 
 	PseudoRandom *ps;
-	PseudoRandom *ps2;
 
 	content_t c_water_source;
 	content_t c_lava_source;
 
-	int water_level;
-
-	CaveV6() {}
-	CaveV6(MapgenV6 *mg, PseudoRandom *ps, PseudoRandom *ps2, bool large_cave);
-	void makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height);
+	// ndef is a mandatory parameter.
+	// If gennotify is NULL, generation events are not logged.
+	CavesRandomWalk(INodeDefManager *ndef,
+		GenerateNotifier *gennotify = NULL,
+		s32 seed = 0,
+		int water_level = 1,
+		content_t water_source = CONTENT_IGNORE,
+		content_t lava_source = CONTENT_IGNORE);
+
+	// vm and ps are mandatory parameters.
+	// If heightmap is NULL, the surface level at all points is assumed to
+	// be water_level.
+	void makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax, PseudoRandom *ps,
+		bool is_large_cave, int max_stone_height, s16 *heightmap);
+
+private:
 	void makeTunnel(bool dirswitch);
-	void carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_ground);
+	void carveRoute(v3f vec, float f, bool randomize_xz);
+
+	inline bool isPosAboveSurface(v3s16 p);
 };
 
-class CaveV7 {
+/*
+	CavesV6 is the original version of caves used with Mapgen V6.
+
+	Though it uses the same fundamental algorithm as CavesRandomWalk, it is made
+	separate to preserve the exact sequence of PseudoRandom calls - any change
+	to this ordering results in the output being radically different.
+	Because caves in Mapgen V6 are responsible for a large portion of the basic
+	terrain shape, modifying this will break our contract of reverse
+	compatibility for a 'stable' mapgen such as V6.
+
+	tl;dr,
+	*** DO NOT TOUCH THIS CLASS UNLESS YOU KNOW WHAT YOU ARE DOING ***
+*/
+class CavesV6 {
 public:
-	MapgenV7 *mg;
 	MMVManip *vm;
 	INodeDefManager *ndef;
+	GenerateNotifier *gennotify;
+	PseudoRandom *ps;
+	PseudoRandom *ps2;
 
-	NoiseParams *np_caveliquids;
+	// configurable parameters
+	s16 *heightmap;
+	content_t c_water_source;
+	content_t c_lava_source;
+	int water_level;
+
+	// intermediate state variables
+	u16 ystride;
 
 	s16 min_tunnel_diameter;
 	s16 max_tunnel_diameter;
 	u16 tunnel_routepoints;
-	int dswitchint;
 	int part_max_length_rs;
 
+	bool large_cave;
 	bool large_cave_is_flat;
-	bool flooded;
 
-	s16 max_stone_y;
 	v3s16 node_min;
 	v3s16 node_max;
 
@@ -148,19 +190,26 @@ public:
 	s16 route_y_min;
 	s16 route_y_max;
 
-	PseudoRandom *ps;
-
-	content_t c_water_source;
-	content_t c_lava_source;
-	content_t c_ice;
-
-	int water_level;
-
-	CaveV7() {}
-	CaveV7(MapgenV7 *mg, PseudoRandom *ps);
-	void makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height);
+	// ndef is a mandatory parameter.
+	// If gennotify is NULL, generation events are not logged.
+	CavesV6(INodeDefManager *ndef,
+		GenerateNotifier *gennotify = NULL,
+		int water_level = 1,
+		content_t water_source = CONTENT_IGNORE,
+		content_t lava_source = CONTENT_IGNORE);
+
+	// vm, ps, and ps2 are mandatory parameters.
+	// If heightmap is NULL, the surface level at all points is assumed to
+	// be water_level.
+	void makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax,
+		PseudoRandom *ps, PseudoRandom *ps2,
+		bool is_large_cave, int max_stone_height, s16 *heightmap = NULL);
+
+private:
 	void makeTunnel(bool dirswitch);
-	void carveRoute(v3f vec, float f, bool randomize_xz);
+	void carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_ground);
+
+	inline s16 getSurfaceFromHeightmap(v3s16 p);
 };
 
 #endif
diff --git a/src/cguittfont/CGUITTFont.cpp b/src/cguittfont/CGUITTFont.cpp
index 2342eb7..c2d37c6 100644
--- a/src/cguittfont/CGUITTFont.cpp
+++ b/src/cguittfont/CGUITTFont.cpp
@@ -1,6 +1,7 @@
 /*
    CGUITTFont FreeType class for Irrlicht
    Copyright (c) 2009-2010 John Norman
+   Copyright (c) 2016 Nathanaël Courant
 
    This software is provided 'as-is', without any express or implied
    warranty. In no event will the authors be held liable for any
@@ -545,6 +546,13 @@ void CGUITTFont::setFontHinting(const bool enable, const bool enable_auto_hintin
 
 void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position, video::SColor color, bool hcenter, bool vcenter, const core::rect<s32>* clip)
 {
+	draw(EnrichedString(std::wstring(text.c_str()), color), position, color, hcenter, vcenter, clip);
+}
+
+void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& position, video::SColor color, bool hcenter, bool vcenter, const core::rect<s32>* clip)
+{
+	std::vector<video::SColor> colors = text.getColors();
+
 	if (!Driver)
 		return;
 
@@ -572,7 +580,7 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
 	}
 
 	// Convert to a unicode string.
-	core::ustring utext(text);
+	core::ustring utext = text.getString();
 
 	// Set up our render map.
 	core::map<u32, CGUITTGlyphPage*> Render_Map;
@@ -581,6 +589,7 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
 	u32 n;
 	uchar32_t previousChar = 0;
 	core::ustring::const_iterator iter(utext);
+	std::vector<video::SColor> applied_colors;
 	while (!iter.atEnd())
 	{
 		uchar32_t currentChar = *iter;
@@ -590,7 +599,7 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
 		if (currentChar == L'\r') // Mac or Windows breaks
 		{
 			lineBreak = true;
-			if (*(iter + 1) == (uchar32_t)'\n')	// Windows line breaks.
+			if (*(iter + 1) == (uchar32_t)'\n') 	// Windows line breaks.
 				currentChar = *(++iter);
 		}
 		else if (currentChar == (uchar32_t)'\n') // Unix breaks
@@ -627,6 +636,9 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
 			page->render_positions.push_back(core::position2di(offset.X + offx, offset.Y + offy));
 			page->render_source_rects.push_back(glyph.source_rect);
 			Render_Map.set(glyph.glyph_page, page);
+			u32 current_color = iter.getPos();
+			if (current_color < colors.size())
+				applied_colors.push_back(colors[current_color]);
 		}
 		offset.X += getWidthFromCharacter(currentChar);
 
@@ -645,8 +657,6 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
 
 		CGUITTGlyphPage* page = n->getValue();
 
-		if (!use_transparency) color.color |= 0xff000000;
-
 		if (shadow_offset) {
 			for (size_t i = 0; i < page->render_positions.size(); ++i)
 				page->render_positions[i] += core::vector2di(shadow_offset, shadow_offset);
@@ -654,7 +664,17 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
 			for (size_t i = 0; i < page->render_positions.size(); ++i)
 				page->render_positions[i] -= core::vector2di(shadow_offset, shadow_offset);
 		}
-		Driver->draw2DImageBatch(page->texture, page->render_positions, page->render_source_rects, clip, color, true);
+		for (size_t i = 0; i < page->render_positions.size(); ++i) {
+			irr::video::SColor col;
+			if (!applied_colors.empty()) {
+				col = applied_colors[i < applied_colors.size() ? i : 0];
+			} else {
+				col = irr::video::SColor(255, 255, 255, 255);
+			}
+			if (!use_transparency)
+				col.color |= 0xff000000;
+			Driver->draw2DImage(page->texture, page->render_positions[i], page->render_source_rects[i], clip, col, true);
+		}
 	}
 }
 
diff --git a/src/cguittfont/CGUITTFont.h b/src/cguittfont/CGUITTFont.h
index e24d8f1..0aa540c 100644
--- a/src/cguittfont/CGUITTFont.h
+++ b/src/cguittfont/CGUITTFont.h
@@ -1,6 +1,7 @@
 /*
    CGUITTFont FreeType class for Irrlicht
    Copyright (c) 2009-2010 John Norman
+   Copyright (c) 2016 Nathanaël Courant
 
    This software is provided 'as-is', without any express or implied
    warranty. In no event will the authors be held liable for any
@@ -33,6 +34,8 @@
 
 #include <irrlicht.h>
 #include <ft2build.h>
+#include <vector>
+#include "util/enriched_string.h"
 #include FT_FREETYPE_H
 
 namespace irr
@@ -258,6 +261,10 @@ namespace gui
 			virtual void draw(const core::stringw& text, const core::rect<s32>& position,
 				video::SColor color, bool hcenter=false, bool vcenter=false,
 				const core::rect<s32>* clip=0);
+			
+			virtual void draw(const EnrichedString& text, const core::rect<s32>& position,
+				video::SColor color, bool hcenter=false, bool vcenter=false,
+				const core::rect<s32>* clip=0);
 
 			//! Returns the dimension of a character produced by this font.
 			virtual core::dimension2d<u32> getCharDimension(const wchar_t ch) const;
diff --git a/src/chat.cpp b/src/chat.cpp
index cebe312..46555b3 100644
--- a/src/chat.cpp
+++ b/src/chat.cpp
@@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "chat.h"
 #include "debug.h"
+#include "config.h"
 #include "util/strfnd.h"
 #include <cctype>
 #include <sstream>
@@ -251,8 +252,7 @@ u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols,
 	u32 hanging_indentation = 0;
 
 	// Format the sender name and produce fragments
-	if (!line.name.empty())
-	{
+	if (!line.name.empty()) {
 		temp_frag.text = L"<";
 		temp_frag.column = 0;
 		//temp_frag.bold = 0;
@@ -267,22 +267,20 @@ u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols,
 		next_frags.push_back(temp_frag);
 	}
 
+	std::wstring name_sanitized = line.name.c_str();
+
 	// Choose an indentation level
-	if (line.name.empty())
-	{
+	if (line.name.empty()) {
 		// Server messages
 		hanging_indentation = 0;
-	}
-	else if (line.name.size() + 3 <= cols/2)
-	{
+	} else if (name_sanitized.size() + 3 <= cols/2) {
 		// Names shorter than about half the console width
 		hanging_indentation = line.name.size() + 3;
-	}
-	else
-	{
+	} else {
 		// Very long names
 		hanging_indentation = 2;
 	}
+	//EnrichedString line_text(line.text);
 
 	next_line.first = true;
 	bool text_processing = false;
@@ -338,7 +336,7 @@ u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols,
 			while (frag_length < remaining_in_input &&
 					frag_length < remaining_in_output)
 			{
-				if (isspace(line.text[in_pos + frag_length]))
+				if (isspace(line.text.getString()[in_pos + frag_length]))
 					space_pos = frag_length;
 				++frag_length;
 			}
@@ -686,9 +684,6 @@ ChatBackend::~ChatBackend()
 
 void ChatBackend::addMessage(std::wstring name, std::wstring text)
 {
-	name = unescape_enriched(name);
-	text = unescape_enriched(text);
-
 	// Note: A message may consist of multiple lines, for example the MOTD.
 	WStrfnd fnd(text);
 	while (!fnd.at_end())
@@ -732,19 +727,22 @@ ChatBuffer& ChatBackend::getRecentBuffer()
 	return m_recent_buffer;
 }
 
-std::wstring ChatBackend::getRecentChat()
+EnrichedString ChatBackend::getRecentChat()
 {
-	std::wostringstream stream;
+	EnrichedString result;
 	for (u32 i = 0; i < m_recent_buffer.getLineCount(); ++i)
 	{
 		const ChatLine& line = m_recent_buffer.getLine(i);
 		if (i != 0)
-			stream << L"\n";
-		if (!line.name.empty())
-			stream << L"<" << line.name << L"> ";
-		stream << line.text;
+			result += L"\n";
+		if (!line.name.empty()) {
+			result += L"<";
+			result += line.name;
+			result += L"> ";
+		}
+		result += line.text;
 	}
-	return stream.str();
+	return result;
 }
 
 ChatPrompt& ChatBackend::getPrompt()
diff --git a/src/chat.h b/src/chat.h
index db4146d..11061fd 100644
--- a/src/chat.h
+++ b/src/chat.h
@@ -20,11 +20,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #ifndef CHAT_HEADER
 #define CHAT_HEADER
 
-#include "irrlichttypes.h"
 #include <string>
 #include <vector>
 #include <list>
 
+#include "irrlichttypes.h"
+#include "util/enriched_string.h"
+
 // Chat console related classes
 
 struct ChatLine
@@ -32,9 +34,9 @@ struct ChatLine
 	// age in seconds
 	f32 age;
 	// name of sending player, or empty if sent by server
-	std::wstring name;
+	EnrichedString name;
 	// message text
-	std::wstring text;
+	EnrichedString text;
 
 	ChatLine(std::wstring a_name, std::wstring a_text):
 		age(0.0),
@@ -42,12 +44,19 @@ struct ChatLine
 		text(a_text)
 	{
 	}
+
+	ChatLine(EnrichedString a_name, EnrichedString a_text):
+		age(0.0),
+		name(a_name),
+		text(a_text)
+	{
+	}
 };
 
 struct ChatFormattedFragment
 {
 	// text string
-	std::wstring text;
+	EnrichedString text;
 	// starting column
 	u32 column;
 	// formatting
@@ -260,7 +269,7 @@ public:
 	// Get the recent messages buffer
 	ChatBuffer& getRecentBuffer();
 	// Concatenate all recent messages
-	std::wstring getRecentChat();
+	EnrichedString getRecentChat();
 	// Get the console prompt
 	ChatPrompt& getPrompt();
 
diff --git a/src/client.cpp b/src/client.cpp
index 4ffcec6..5476aad 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <iostream>
 #include <algorithm>
 #include <sstream>
+#include <cmath>
 #include <IFileSystem.h>
 #include "threading/mutex_auto_lock.h"
 #include "util/auth.h"
@@ -257,7 +258,7 @@ Client::Client(
 	m_localdb(NULL)
 {
 	// Add local player
-	m_env.addPlayer(new LocalPlayer(this, playername));
+	m_env.setLocalPlayer(new LocalPlayer(this, playername));
 
 	m_mapper = new Mapper(device, this);
 	m_cache_save_interval = g_settings->getU16("server_map_save_interval");
@@ -303,7 +304,7 @@ Client::~Client()
 	delete m_inventory_from_server;
 
 	// Delete detached inventories
-	for (std::map<std::string, Inventory*>::iterator
+	for (UNORDERED_MAP<std::string, Inventory*>::iterator
 			i = m_detached_inventories.begin();
 			i != m_detached_inventories.end(); ++i) {
 		delete i->second;
@@ -383,7 +384,7 @@ void Client::step(float dtime)
 		if(counter <= 0.0) {
 			counter = 2.0;
 
-			Player *myplayer = m_env.getLocalPlayer();
+			LocalPlayer *myplayer = m_env.getLocalPlayer();
 			FATAL_ERROR_IF(myplayer == NULL, "Local player not found in environment.");
 
 			u16 proto_version_min = g_settings->getFlag("send_pre_v25_init") ?
@@ -613,7 +614,7 @@ void Client::step(float dtime)
 		{
 			// Do this every <interval> seconds after TOCLIENT_INVENTORY
 			// Reset the locally changed inventory to the authoritative inventory
-			Player *player = m_env.getLocalPlayer();
+			LocalPlayer *player = m_env.getLocalPlayer();
 			player->inventory = *m_inventory_from_server;
 			m_inventory_updated = true;
 		}
@@ -623,10 +624,8 @@ void Client::step(float dtime)
 		Update positions of sounds attached to objects
 	*/
 	{
-		for(std::map<int, u16>::iterator
-				i = m_sounds_to_objects.begin();
-				i != m_sounds_to_objects.end(); ++i)
-		{
+		for(UNORDERED_MAP<int, u16>::iterator i = m_sounds_to_objects.begin();
+				i != m_sounds_to_objects.end(); ++i) {
 			int client_id = i->first;
 			u16 object_id = i->second;
 			ClientActiveObject *cao = m_env.getActiveObject(object_id);
@@ -645,8 +644,7 @@ void Client::step(float dtime)
 		m_removed_sounds_check_timer = 0;
 		// Find removed sounds and clear references to them
 		std::vector<s32> removed_server_ids;
-		for(std::map<s32, int>::iterator
-				i = m_sounds_server_to_client.begin();
+		for(UNORDERED_MAP<s32, int>::iterator i = m_sounds_server_to_client.begin();
 				i != m_sounds_server_to_client.end();) {
 			s32 server_id = i->first;
 			int client_id = i->second;
@@ -820,7 +818,7 @@ void Client::initLocalMapSaving(const Address &address,
 	const std::string world_path = porting::path_user
 		+ DIR_DELIM + "worlds"
 		+ DIR_DELIM + "server_"
-		+ hostname + "_" + to_string(address.getPort());
+		+ hostname + "_" + std::to_string(address.getPort());
 
 	fs::CreateAllDirs(world_path);
 
@@ -932,6 +930,36 @@ void Client::Send(NetworkPacket* pkt)
 		serverCommandFactoryTable[pkt->getCommand()].reliable);
 }
 
+// Will fill up 12 + 12 + 4 + 4 + 4 bytes
+void writePlayerPos(LocalPlayer *myplayer, ClientMap *clientMap, NetworkPacket *pkt)
+{
+	v3f pf           = myplayer->getPosition() * 100;
+	v3f sf           = myplayer->getSpeed() * 100;
+	s32 pitch        = myplayer->getPitch() * 100;
+	s32 yaw          = myplayer->getYaw() * 100;
+	u32 keyPressed   = myplayer->keyPressed;
+	// scaled by 80, so that pi can fit into a u8
+	u8 fov           = clientMap->getCameraFov() * 80;
+	u8 wanted_range  = MYMIN(255,
+			std::ceil(clientMap->getControl().wanted_range / MAP_BLOCKSIZE));
+
+	v3s32 position(pf.X, pf.Y, pf.Z);
+	v3s32 speed(sf.X, sf.Y, sf.Z);
+
+	/*
+		Format:
+		[0] v3s32 position*100
+		[12] v3s32 speed*100
+		[12+12] s32 pitch*100
+		[12+12+4] s32 yaw*100
+		[12+12+4+4] u32 keyPressed
+		[12+12+4+4+4] u8 fov*80
+		[12+12+4+4+4+1] u8 ceil(wanted_range / MAP_BLOCKSIZE)
+	*/
+	*pkt << position << speed << pitch << yaw << keyPressed;
+	*pkt << fov << wanted_range;
+}
+
 void Client::interact(u8 action, const PointedThing& pointed)
 {
 	if(m_state != LC_Ready) {
@@ -941,12 +969,17 @@ void Client::interact(u8 action, const PointedThing& pointed)
 		return;
 	}
 
+	LocalPlayer *myplayer = m_env.getLocalPlayer();
+	if (myplayer == NULL)
+		return;
+
 	/*
 		[0] u16 command
 		[2] u8 action
 		[3] u16 item
-		[5] u32 length of the next item
+		[5] u32 length of the next item (plen)
 		[9] serialized PointedThing
+		[9 + plen] player position information
 		actions:
 		0: start digging (from undersurface) or use
 		1: stop digging (all parameters ignored)
@@ -966,6 +999,8 @@ void Client::interact(u8 action, const PointedThing& pointed)
 
 	pkt.putLongString(tmp_os.str());
 
+	writePlayerPos(myplayer, &m_env.getClientMap(), &pkt);
+
 	Send(&pkt);
 }
 
@@ -1194,7 +1229,7 @@ void Client::sendChatMessage(const std::wstring &message)
 void Client::sendChangePassword(const std::string &oldpassword,
         const std::string &newpassword)
 {
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	if (player == NULL)
 		return;
 
@@ -1268,19 +1303,30 @@ void Client::sendPlayerPos()
 	if(myplayer == NULL)
 		return;
 
+	ClientMap &map = m_env.getClientMap();
+
+	u8 camera_fov    = map.getCameraFov();
+	u8 wanted_range  = map.getControl().wanted_range;
+
 	// Save bandwidth by only updating position when something changed
 	if(myplayer->last_position        == myplayer->getPosition() &&
-			myplayer->last_speed      == myplayer->getSpeed()    &&
-			myplayer->last_pitch      == myplayer->getPitch()    &&
-			myplayer->last_yaw        == myplayer->getYaw()      &&
-			myplayer->last_keyPressed == myplayer->keyPressed)
+			myplayer->last_speed        == myplayer->getSpeed()    &&
+			myplayer->last_pitch        == myplayer->getPitch()    &&
+			myplayer->last_yaw          == myplayer->getYaw()      &&
+			myplayer->last_keyPressed   == myplayer->keyPressed    &&
+			myplayer->last_camera_fov   == camera_fov              &&
+			myplayer->last_wanted_range == wanted_range)
 		return;
 
-	myplayer->last_position   = myplayer->getPosition();
-	myplayer->last_speed      = myplayer->getSpeed();
-	myplayer->last_pitch      = myplayer->getPitch();
-	myplayer->last_yaw        = myplayer->getYaw();
-	myplayer->last_keyPressed = myplayer->keyPressed;
+	myplayer->last_position     = myplayer->getPosition();
+	myplayer->last_speed        = myplayer->getSpeed();
+	myplayer->last_pitch        = myplayer->getPitch();
+	myplayer->last_yaw          = myplayer->getYaw();
+	myplayer->last_keyPressed   = myplayer->keyPressed;
+	myplayer->last_camera_fov   = camera_fov;
+	myplayer->last_wanted_range = wanted_range;
+
+	//infostream << "Sending Player Position information" << std::endl;
 
 	u16 our_peer_id;
 	{
@@ -1294,33 +1340,16 @@ void Client::sendPlayerPos()
 
 	assert(myplayer->peer_id == our_peer_id);
 
-	v3f pf         = myplayer->getPosition();
-	v3f sf         = myplayer->getSpeed();
-	s32 pitch      = myplayer->getPitch() * 100;
-	s32 yaw        = myplayer->getYaw() * 100;
-	u32 keyPressed = myplayer->keyPressed;
+	NetworkPacket pkt(TOSERVER_PLAYERPOS, 12 + 12 + 4 + 4 + 4 + 1 + 1);
 
-	v3s32 position(pf.X*100, pf.Y*100, pf.Z*100);
-	v3s32 speed(sf.X*100, sf.Y*100, sf.Z*100);
-	/*
-		Format:
-		[0] v3s32 position*100
-		[12] v3s32 speed*100
-		[12+12] s32 pitch*100
-		[12+12+4] s32 yaw*100
-		[12+12+4+4] u32 keyPressed
-	*/
-
-	NetworkPacket pkt(TOSERVER_PLAYERPOS, 12 + 12 + 4 + 4 + 4);
-
-	pkt << position << speed << pitch << yaw << keyPressed;
+	writePlayerPos(myplayer, &map, &pkt);
 
 	Send(&pkt);
 }
 
 void Client::sendPlayerItem(u16 item)
 {
-	Player *myplayer = m_env.getLocalPlayer();
+	LocalPlayer *myplayer = m_env.getLocalPlayer();
 	if(myplayer == NULL)
 		return;
 
@@ -1401,7 +1430,7 @@ bool Client::getLocalInventoryUpdated()
 // Copies the inventory of the local player to parameter
 void Client::getLocalInventory(Inventory &dst)
 {
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 	dst = player->inventory;
 }
@@ -1414,15 +1443,16 @@ Inventory* Client::getInventory(const InventoryLocation &loc)
 	break;
 	case InventoryLocation::CURRENT_PLAYER:
 	{
-		Player *player = m_env.getLocalPlayer();
+		LocalPlayer *player = m_env.getLocalPlayer();
 		assert(player != NULL);
 		return &player->inventory;
 	}
 	break;
 	case InventoryLocation::PLAYER:
 	{
-		Player *player = m_env.getPlayer(loc.name.c_str());
-		if(!player)
+		// Check if we are working with local player inventory
+		LocalPlayer *player = m_env.getLocalPlayer();
+		if (!player || strcmp(player->getName(), loc.name.c_str()) != 0)
 			return NULL;
 		return &player->inventory;
 	}
@@ -1437,7 +1467,7 @@ Inventory* Client::getInventory(const InventoryLocation &loc)
 	break;
 	case InventoryLocation::DETACHED:
 	{
-		if(m_detached_inventories.count(loc.name) == 0)
+		if (m_detached_inventories.count(loc.name) == 0)
 			return NULL;
 		return m_detached_inventories[loc.name];
 	}
@@ -1503,11 +1533,6 @@ ClientActiveObject * Client::getSelectedActiveObject(
 	return NULL;
 }
 
-std::list<std::string> Client::getConnectedPlayerNames()
-{
-	return m_env.getPlayerNames();
-}
-
 float Client::getAnimationTime()
 {
 	return m_animation_time;
@@ -1540,18 +1565,11 @@ void Client::setCrack(int level, v3s16 pos)
 
 u16 Client::getHP()
 {
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 	return player->hp;
 }
 
-u16 Client::getBreath()
-{
-	Player *player = m_env.getLocalPlayer();
-	assert(player != NULL);
-	return player->getBreath();
-}
-
 bool Client::getChatMessage(std::wstring &message)
 {
 	if(m_chat_queue.size() == 0)
@@ -1674,7 +1692,7 @@ void Client::addUpdateMeshTaskForNode(v3s16 nodepos, bool ack_to_server, bool ur
 ClientEvent Client::getClientEvent()
 {
 	ClientEvent event;
-	if(m_client_event_queue.size() == 0) {
+	if (m_client_event_queue.empty()) {
 		event.type = CE_NONE;
 	}
 	else {
diff --git a/src/client.h b/src/client.h
index cdadb9d..9f5bda0 100644
--- a/src/client.h
+++ b/src/client.h
@@ -182,6 +182,7 @@ struct ClientEvent
 			f32 expirationtime;
 			f32 size;
 			bool collisiondetection;
+			bool collision_removal;
 			bool vertical;
 			std::string *texture;
 		} spawn_particle;
@@ -199,6 +200,8 @@ struct ClientEvent
 			f32 minsize;
 			f32 maxsize;
 			bool collisiondetection;
+			bool collision_removal;
+			u16 attached_id;
 			bool vertical;
 			std::string *texture;
 			u32 id;
@@ -450,7 +453,10 @@ public:
 			core::line3d<f32> shootline_on_map
 	);
 
-	std::list<std::string> getConnectedPlayerNames();
+	const std::list<std::string> &getConnectedPlayerNames()
+	{
+		return m_env.getPlayerNames();
+	}
 
 	float getAnimationTime();
 
@@ -458,9 +464,8 @@ public:
 	void setCrack(int level, v3s16 pos);
 
 	u16 getHP();
-	u16 getBreath();
 
-	bool checkPrivilege(const std::string &priv)
+	bool checkPrivilege(const std::string &priv) const
 	{ return (m_privileges.count(priv) != 0); }
 
 	bool getChatMessage(std::wstring &message);
@@ -497,6 +502,9 @@ public:
 	u8 getProtoVersion()
 	{ return m_proto_ver; }
 
+	bool connectedToServer()
+	{ return m_con.Connected(); }
+
 	float mediaReceiveProgress();
 
 	void afterContentReceived(IrrlichtDevice *device);
@@ -658,18 +666,18 @@ private:
 	// Sounds
 	float m_removed_sounds_check_timer;
 	// Mapping from server sound ids to our sound ids
-	std::map<s32, int> m_sounds_server_to_client;
+	UNORDERED_MAP<s32, int> m_sounds_server_to_client;
 	// And the other way!
-	std::map<int, s32> m_sounds_client_to_server;
+	UNORDERED_MAP<int, s32> m_sounds_client_to_server;
 	// And relations to objects
-	std::map<int, u16> m_sounds_to_objects;
+	UNORDERED_MAP<int, u16> m_sounds_to_objects;
 
 	// Privileges
-	std::set<std::string> m_privileges;
+	UNORDERED_SET<std::string> m_privileges;
 
 	// Detached inventories
 	// key = name
-	std::map<std::string, Inventory*> m_detached_inventories;
+	UNORDERED_MAP<std::string, Inventory*> m_detached_inventories;
 
 	// Storage for mesh data for creating multiple instances of the same mesh
 	StringMap m_mesh_data;
diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt
index a1ec37f..5faa186 100644
--- a/src/client/CMakeLists.txt
+++ b/src/client/CMakeLists.txt
@@ -1,6 +1,7 @@
 set(client_SRCS
 	${CMAKE_CURRENT_SOURCE_DIR}/clientlauncher.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/tile.cpp
+	${CMAKE_CURRENT_SOURCE_DIR}/joystick_controller.cpp
 	PARENT_SCOPE
 )
 
diff --git a/src/client/clientlauncher.cpp b/src/client/clientlauncher.cpp
index 404a163..6145e3d 100644
--- a/src/client/clientlauncher.cpp
+++ b/src/client/clientlauncher.cpp
@@ -32,7 +32,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "guiEngine.h"
 #include "player.h"
 #include "fontengine.h"
+#include "joystick_controller.h"
 #include "clientlauncher.h"
+#include "version.h"
 
 /* mainmenumanager.h
  */
@@ -112,6 +114,8 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args)
 
 	porting::setXorgClassHint(video_driver->getExposedVideoData(), PROJECT_NAME_C);
 
+	porting::setXorgWindowIcon(device);
+
 	/*
 		This changes the minimum allowed number of vertices in a VBO.
 		Default is 500.
@@ -184,7 +188,9 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args)
 	{
 		// Set the window caption
 		const wchar_t *text = wgettext("Main Menu");
-		device->setWindowCaption((utf8_to_wide(PROJECT_NAME_C) + L" [" + text + L"]").c_str());
+		device->setWindowCaption((utf8_to_wide(PROJECT_NAME_C) +
+			L" " + utf8_to_wide(g_version_hash) +
+			L" [" + text + L"]").c_str());
 		delete[] text;
 
 		try {	// This is used for catching disconnects
@@ -499,7 +505,8 @@ void ClientLauncher::main_menu(MainMenuData *menudata)
 #endif
 
 	/* show main menu */
-	GUIEngine mymenu(device, guiroot, &g_menumgr, smgr, menudata, *kill);
+	GUIEngine mymenu(device, &input->joystick, guiroot,
+		&g_menumgr, smgr, menudata, *kill);
 
 	smgr->clear();	/* leave scene manager in a clean state */
 }
@@ -558,6 +565,22 @@ bool ClientLauncher::create_engine_device()
 	device = createDeviceEx(params);
 
 	if (device) {
+		if (g_settings->getBool("enable_joysticks")) {
+			irr::core::array<irr::SJoystickInfo> infos;
+			std::vector<irr::SJoystickInfo> joystick_infos;
+			// Make sure this is called maximum once per
+			// irrlicht device, otherwise it will give you
+			// multiple events for the same joystick.
+			if (device->activateJoysticks(infos)) {
+				infostream << "Joystick support enabled" << std::endl;
+				joystick_infos.reserve(infos.size());
+				for (u32 i = 0; i < infos.size(); i++) {
+					joystick_infos.push_back(infos[i]);
+				}
+			} else {
+				errorstream << "Could not activate joystick support." << std::endl;
+			}
+		}
 		porting::initIrrlicht(device);
 	}
 
diff --git a/src/client/inputhandler.h b/src/client/inputhandler.h
index 69e4b25..824b0da 100644
--- a/src/client/inputhandler.h
+++ b/src/client/inputhandler.h
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define INPUT_HANDLER_H
 
 #include "irrlichttypes_extrabloated.h"
+#include "joystick_controller.h"
 
 class MyEventReceiver : public IEventReceiver
 {
@@ -42,11 +43,15 @@ public:
 
 		// Remember whether each key is down or up
 		if (event.EventType == irr::EET_KEY_INPUT_EVENT) {
-			if (event.KeyInput.PressedDown) {
-				keyIsDown.set(event.KeyInput);
-				keyWasDown.set(event.KeyInput);
-			} else {
-				keyIsDown.unset(event.KeyInput);
+			const KeyPress &keyCode = event.KeyInput;
+			if (keysListenedFor[keyCode]) {
+				if (event.KeyInput.PressedDown) {
+					keyIsDown.set(keyCode);
+					keyWasDown.set(keyCode);
+				} else {
+					keyIsDown.unset(keyCode);
+				}
+				return true;
 			}
 		}
 
@@ -58,6 +63,14 @@ public:
 			return true;
 		}
 #endif
+
+		if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT) {
+			/* TODO add a check like:
+			if (event.JoystickEvent != joystick_we_listen_for)
+				return false;
+			*/
+			return joystick->handleEvent(event.JoystickEvent);
+		}
 		// handle mouse events
 		if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) {
 			if (noMenuActive() == false) {
@@ -116,6 +129,15 @@ public:
 		return b;
 	}
 
+	void listenForKey(const KeyPress &keyCode)
+	{
+		keysListenedFor.set(keyCode);
+	}
+	void dontListenForKeys()
+	{
+		keysListenedFor.clear();
+	}
+
 	s32 getMouseWheel()
 	{
 		s32 a = mouse_wheel;
@@ -159,6 +181,8 @@ public:
 
 	s32 mouse_wheel;
 
+	JoystickController *joystick;
+
 #ifdef HAVE_TOUCHSCREENGUI
 	TouchScreenGUI* m_touchscreengui;
 #endif
@@ -168,6 +192,12 @@ private:
 	KeyList keyIsDown;
 	// Whether a key has been pressed or not
 	KeyList keyWasDown;
+	// List of keys we listen for
+	// TODO perhaps the type of this is not really
+	// performant as KeyList is designed for few but
+	// often changing keys, and keysListenedFor is expected
+	// to change seldomly but contain lots of keys.
+	KeyList keysListenedFor;
 };
 
 
@@ -183,6 +213,7 @@ public:
 		m_receiver(receiver),
 		m_mousepos(0,0)
 	{
+		m_receiver->joystick = &joystick;
 	}
 	virtual bool isKeyDown(const KeyPress &keyCode)
 	{
@@ -192,6 +223,14 @@ public:
 	{
 		return m_receiver->WasKeyDown(keyCode);
 	}
+	virtual void listenForKey(const KeyPress &keyCode)
+	{
+		m_receiver->listenForKey(keyCode);
+	}
+	virtual void dontListenForKeys()
+	{
+		m_receiver->dontListenForKeys();
+	}
 	virtual v2s32 getMousePos()
 	{
 		if (m_device->getCursorControl()) {
@@ -261,6 +300,7 @@ public:
 
 	void clear()
 	{
+		joystick.clear();
 		m_receiver->clearInput();
 	}
 private:
diff --git a/src/client/joystick_controller.cpp b/src/client/joystick_controller.cpp
new file mode 100644
index 0000000..ef8d18a
--- /dev/null
+++ b/src/client/joystick_controller.cpp
@@ -0,0 +1,179 @@
+/*
+Minetest
+Copyright (C) 2016 est31, <MTest31 at outlook.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "joystick_controller.h"
+#include "irrlichttypes_extrabloated.h"
+#include "keys.h"
+#include "settings.h"
+#include "gettime.h"
+
+bool JoystickButtonCmb::isTriggered(const irr::SEvent::SJoystickEvent &ev) const
+{
+	u32 buttons = ev.ButtonStates;
+
+	buttons &= filter_mask;
+	return buttons == compare_mask;
+}
+
+bool JoystickAxisCmb::isTriggered(const irr::SEvent::SJoystickEvent &ev) const
+{
+	s16 ax_val = ev.Axis[axis_to_compare];
+
+	return (ax_val * direction < 0) && (thresh * direction > ax_val * direction);
+}
+
+// spares many characters
+#define JLO_B_PB(A, B, C)    jlo.button_keys.push_back(JoystickButtonCmb(A, B, C))
+#define JLO_A_PB(A, B, C, D) jlo.axis_keys.push_back(JoystickAxisCmb(A, B, C, D))
+
+static JoystickLayout create_default_layout()
+{
+	JoystickLayout jlo;
+
+	jlo.axes_dead_border = 1024;
+
+	const JoystickAxisLayout axes[JA_COUNT] = {
+		{0, 1}, // JA_SIDEWARD_MOVE
+		{1, 1}, // JA_FORWARD_MOVE
+		{3, 1}, // JA_FRUSTUM_HORIZONTAL
+		{4, 1}, // JA_FRUSTUM_VERTICAL
+	};
+	memcpy(jlo.axes, axes, sizeof(jlo.axes));
+
+	u32 sb = 1 << 7; // START button mask
+	u32 fb = 1 << 3; // FOUR button mask
+	u32 bm = sb | fb; // Mask for Both Modifiers
+
+	// The back button means "ESC".
+	JLO_B_PB(KeyType::ESC,        1 << 6,      1 << 6);
+
+	// The start button counts as modifier as well as use key.
+	// JLO_B_PB(KeyType::USE,        sb,          sb));
+
+	// Accessible without start modifier button pressed
+	// regardless whether four is pressed or not
+	JLO_B_PB(KeyType::SNEAK,      sb | 1 << 2, 1 << 2);
+
+	// Accessible without four modifier button pressed
+	// regardless whether start is pressed or not
+	JLO_B_PB(KeyType::MOUSE_L,    fb | 1 << 4, 1 << 4);
+	JLO_B_PB(KeyType::MOUSE_R,    fb | 1 << 5, 1 << 5);
+
+	// Accessible without any modifier pressed
+	JLO_B_PB(KeyType::JUMP,       bm | 1 << 0, 1 << 0);
+	JLO_B_PB(KeyType::SPECIAL1,   bm | 1 << 1, 1 << 1);
+
+	// Accessible with start button not pressed, but four pressed
+	// TODO find usage for button 0
+	JLO_B_PB(KeyType::DROP,       bm | 1 << 1, fb | 1 << 1);
+	JLO_B_PB(KeyType::SCROLL_UP,  bm | 1 << 4, fb | 1 << 4);
+	JLO_B_PB(KeyType::SCROLL_DOWN,bm | 1 << 5, fb | 1 << 5);
+
+	// Accessible with start button and four pressed
+	// TODO find usage for buttons 0, 1 and 4, 5
+
+	// Now about the buttons simulated by the axes
+
+	// Movement buttons, important for vessels
+	JLO_A_PB(KeyType::FORWARD,  1,  1, 1024);
+	JLO_A_PB(KeyType::BACKWARD, 1, -1, 1024);
+	JLO_A_PB(KeyType::LEFT,     0,  1, 1024);
+	JLO_A_PB(KeyType::RIGHT,    0, -1, 1024);
+
+	// Scroll buttons
+	JLO_A_PB(KeyType::SCROLL_UP,   2, -1, 1024);
+	JLO_A_PB(KeyType::SCROLL_DOWN, 5, -1, 1024);
+
+	return jlo;
+}
+
+static const JoystickLayout default_layout = create_default_layout();
+
+JoystickController::JoystickController()
+{
+	m_layout = &default_layout;
+	doubling_dtime = g_settings->getFloat("repeat_joystick_button_time");
+
+	for (size_t i = 0; i < KeyType::INTERNAL_ENUM_COUNT; i++) {
+		m_past_pressed_time[i] = 0;
+	}
+	clear();
+}
+
+bool JoystickController::handleEvent(const irr::SEvent::SJoystickEvent &ev)
+{
+	m_internal_time = getTimeMs() / 1000.f;
+
+	std::bitset<KeyType::INTERNAL_ENUM_COUNT> keys_pressed;
+
+	// First generate a list of keys pressed
+
+	for (size_t i = 0; i < m_layout->button_keys.size(); i++) {
+		if (m_layout->button_keys[i].isTriggered(ev)) {
+			keys_pressed.set(m_layout->button_keys[i].key);
+		}
+	}
+
+	for (size_t i = 0; i < m_layout->axis_keys.size(); i++) {
+		if (m_layout->axis_keys[i].isTriggered(ev)) {
+			keys_pressed.set(m_layout->axis_keys[i].key);
+		}
+	}
+
+	// Then update the values
+
+	for (size_t i = 0; i < KeyType::INTERNAL_ENUM_COUNT; i++) {
+		if (keys_pressed[i]) {
+			if (!m_past_pressed_keys[i] &&
+					m_past_pressed_time[i] < m_internal_time - doubling_dtime) {
+				m_past_pressed_keys[i] = true;
+				m_past_pressed_time[i] = m_internal_time;
+			}
+		} else if (m_pressed_keys[i]) {
+			m_past_released_keys[i] = true;
+		}
+
+		m_pressed_keys[i] = keys_pressed[i];
+	}
+
+	for (size_t i = 0; i < JA_COUNT; i++) {
+		const JoystickAxisLayout &ax_la = m_layout->axes[i];
+		m_axes_vals[i] = ax_la.invert * ev.Axis[ax_la.axis_id];
+	}
+
+
+	return true;
+}
+
+void JoystickController::clear()
+{
+	m_pressed_keys.reset();
+	m_past_pressed_keys.reset();
+	m_past_released_keys.reset();
+	memset(m_axes_vals, 0, sizeof(m_axes_vals));
+}
+
+s16 JoystickController::getAxisWithoutDead(JoystickAxis axis)
+{
+	s16 v = m_axes_vals[axis];
+	if (((v > 0) && (v < m_layout->axes_dead_border)) ||
+			((v < 0) && (v > -m_layout->axes_dead_border)))
+		return 0;
+	return v;
+}
diff --git a/src/client/joystick_controller.h b/src/client/joystick_controller.h
new file mode 100644
index 0000000..ed0ee40
--- /dev/null
+++ b/src/client/joystick_controller.h
@@ -0,0 +1,163 @@
+/*
+Minetest
+Copyright (C) 2016 est31, <MTest31 at outlook.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef JOYSTICK_HEADER
+#define JOYSTICK_HEADER
+
+#include "irrlichttypes_extrabloated.h"
+#include "keys.h"
+#include <bitset>
+#include <vector>
+
+enum JoystickAxis {
+	JA_SIDEWARD_MOVE,
+	JA_FORWARD_MOVE,
+
+	JA_FRUSTUM_HORIZONTAL,
+	JA_FRUSTUM_VERTICAL,
+
+	// To know the count of enum values
+	JA_COUNT,
+};
+
+struct JoystickAxisLayout {
+	u16 axis_id;
+	// -1 if to invert, 1 if to keep it.
+	int invert;
+};
+
+
+struct JoystickCombination {
+
+	virtual bool isTriggered(const irr::SEvent::SJoystickEvent &ev) const=0;
+
+	GameKeyType key;
+};
+
+struct JoystickButtonCmb : public JoystickCombination {
+
+	JoystickButtonCmb() {}
+	JoystickButtonCmb(GameKeyType key, u32 filter_mask, u32 compare_mask) :
+		filter_mask(filter_mask),
+		compare_mask(compare_mask)
+	{
+		this->key = key;
+	}
+
+	virtual bool isTriggered(const irr::SEvent::SJoystickEvent &ev) const;
+
+	u32 filter_mask;
+	u32 compare_mask;
+};
+
+struct JoystickAxisCmb : public JoystickCombination {
+
+	JoystickAxisCmb() {}
+	JoystickAxisCmb(GameKeyType key, u16 axis_to_compare, int direction, s16 thresh) :
+		axis_to_compare(axis_to_compare),
+		direction(direction),
+		thresh(thresh)
+	{
+		this->key = key;
+	}
+
+	virtual bool isTriggered(const irr::SEvent::SJoystickEvent &ev) const;
+
+	u16 axis_to_compare;
+
+	// if -1, thresh must be smaller than the axis value in order to trigger
+	// if  1, thresh must be bigger  than the axis value in order to trigger
+	int direction;
+	s16 thresh;
+};
+
+struct JoystickLayout {
+	std::vector<JoystickButtonCmb> button_keys;
+	std::vector<JoystickAxisCmb> axis_keys;
+	JoystickAxisLayout axes[JA_COUNT];
+	s16 axes_dead_border;
+};
+
+class JoystickController {
+
+public:
+	JoystickController();
+	bool handleEvent(const irr::SEvent::SJoystickEvent &ev);
+	void clear();
+
+	bool wasKeyDown(GameKeyType b)
+	{
+		bool r = m_past_pressed_keys[b];
+		m_past_pressed_keys[b] = false;
+		return r;
+	}
+	bool getWasKeyDown(GameKeyType b)
+	{
+		return m_past_pressed_keys[b];
+	}
+	void clearWasKeyDown(GameKeyType b)
+	{
+		m_past_pressed_keys[b] = false;
+	}
+
+	bool wasKeyReleased(GameKeyType b)
+	{
+		bool r = m_past_released_keys[b];
+		m_past_released_keys[b] = false;
+		return r;
+	}
+	bool getWasKeyReleased(GameKeyType b)
+	{
+		return m_past_pressed_keys[b];
+	}
+	void clearWasKeyReleased(GameKeyType b)
+	{
+		m_past_pressed_keys[b] = false;
+	}
+
+	bool isKeyDown(GameKeyType b)
+	{
+		return m_pressed_keys[b];
+	}
+
+	s16 getAxis(JoystickAxis axis)
+	{
+		return m_axes_vals[axis];
+	}
+
+	s16 getAxisWithoutDead(JoystickAxis axis);
+
+	f32 doubling_dtime;
+
+private:
+	const JoystickLayout *m_layout;
+
+	s16 m_axes_vals[JA_COUNT];
+
+	std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_pressed_keys;
+
+	f32 m_internal_time;
+
+	f32 m_past_pressed_time[KeyType::INTERNAL_ENUM_COUNT];
+
+	std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_pressed_keys;
+	std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_released_keys;
+};
+
+#endif
diff --git a/src/client/keys.h b/src/client/keys.h
new file mode 100644
index 0000000..6467c44
--- /dev/null
+++ b/src/client/keys.h
@@ -0,0 +1,86 @@
+/*
+Minetest
+Copyright (C) 2016 est31, <MTest31 at outlook.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef KEYS_HEADER
+#define KEYS_HEADER
+
+#include<list>
+
+class KeyType {
+public:
+	enum T {
+		// Player movement
+		FORWARD,
+		BACKWARD,
+		LEFT,
+		RIGHT,
+		JUMP,
+		SPECIAL1,
+		SNEAK,
+		AUTORUN,
+
+		ESC,
+
+		// Other
+		DROP,
+		INVENTORY,
+		CHAT,
+		CMD,
+		CONSOLE,
+		MINIMAP,
+		FREEMOVE,
+		FASTMOVE,
+		NOCLIP,
+		CINEMATIC,
+		SCREENSHOT,
+		TOGGLE_HUD,
+		TOGGLE_CHAT,
+		TOGGLE_FORCE_FOG_OFF,
+		TOGGLE_UPDATE_CAMERA,
+		TOGGLE_DEBUG,
+		TOGGLE_PROFILER,
+		CAMERA_MODE,
+		INCREASE_VIEWING_RANGE,
+		DECREASE_VIEWING_RANGE,
+		RANGESELECT,
+		ZOOM,
+
+		QUICKTUNE_NEXT,
+		QUICKTUNE_PREV,
+		QUICKTUNE_INC,
+		QUICKTUNE_DEC,
+
+		DEBUG_STACKS,
+
+		// joystick specific keys
+		MOUSE_L,
+		MOUSE_R,
+		SCROLL_UP,
+		SCROLL_DOWN,
+
+		// Fake keycode for array size and internal checks
+		INTERNAL_ENUM_COUNT
+
+	};
+};
+
+typedef KeyType::T GameKeyType;
+
+
+#endif
diff --git a/src/client/tile.cpp b/src/client/tile.cpp
index ec8c95f..8f0c394 100644
--- a/src/client/tile.cpp
+++ b/src/client/tile.cpp
@@ -948,11 +948,10 @@ video::ITexture* TextureSource::generateTextureFromMesh(
 
 video::IImage* TextureSource::generateImage(const std::string &name)
 {
-	/*
-		Get the base image
-	*/
+	// Get the base image
 
 	const char separator = '^';
+	const char escape = '\\';
 	const char paren_open = '(';
 	const char paren_close = ')';
 
@@ -960,7 +959,9 @@ video::IImage* TextureSource::generateImage(const std::string &name)
 	s32 last_separator_pos = -1;
 	u8 paren_bal = 0;
 	for (s32 i = name.size() - 1; i >= 0; i--) {
-		switch(name[i]) {
+		if (i > 0 && name[i-1] == escape)
+			continue;
+		switch (name[i]) {
 		case separator:
 			if (paren_bal == 0) {
 				last_separator_pos = i;
@@ -1028,10 +1029,12 @@ video::IImage* TextureSource::generateImage(const std::string &name)
 			return NULL;
 		}
 		core::dimension2d<u32> dim = tmp->getDimension();
-		if (!baseimg)
-			baseimg = driver->createImage(video::ECF_A8R8G8B8, dim);
-		blit_with_alpha(tmp, baseimg, v2s32(0, 0), v2s32(0, 0), dim);
-		tmp->drop();
+		if (baseimg) {
+			blit_with_alpha(tmp, baseimg, v2s32(0, 0), v2s32(0, 0), dim);
+			tmp->drop();
+		} else {
+			baseimg = tmp;
+		}
 	} else if (!generateImagePart(last_part_of_name, baseimg)) {
 		// Generate image according to part of name
 		errorstream << "generateImage(): "
@@ -1099,9 +1102,27 @@ video::IImage * Align2Npot2(video::IImage * image,
 
 #endif
 
+static std::string unescape_string(const std::string &str, const char esc = '\\')
+{
+	std::string out;
+	size_t pos = 0, cpos;
+	out.reserve(str.size());
+	while (1) {
+		cpos = str.find_first_of(esc, pos);
+		if (cpos == std::string::npos) {
+			out += str.substr(pos);
+			break;
+		}
+		out += str.substr(pos, cpos - pos) + str[cpos + 1];
+		pos = cpos + 2;
+	}
+	return out;
+}
+
 bool TextureSource::generateImagePart(std::string part_of_name,
 		video::IImage *& baseimg)
 {
+	const char escape = '\\'; // same as in generateImage()
 	video::IVideoDriver* driver = m_device->getVideoDriver();
 	sanity_check(driver);
 
@@ -1251,7 +1272,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
 		}
 		/*
 			[combine:WxH:X,Y=filename:X,Y=filename2
-			Creates a bigger texture from an amount of smaller ones
+			Creates a bigger texture from any amount of smaller ones
 		*/
 		else if (str_starts_with(part_of_name, "[combine"))
 		{
@@ -1259,7 +1280,6 @@ bool TextureSource::generateImagePart(std::string part_of_name,
 			sf.next(":");
 			u32 w0 = stoi(sf.next("x"));
 			u32 h0 = stoi(sf.next(":"));
-			//infostream<<"combined w="<<w0<<" h="<<h0<<std::endl;
 			core::dimension2d<u32> dim(w0,h0);
 			if (baseimg == NULL) {
 				baseimg = driver->createImage(video::ECF_A8R8G8B8, dim);
@@ -1268,11 +1288,11 @@ bool TextureSource::generateImagePart(std::string part_of_name,
 			while (sf.at_end() == false) {
 				u32 x = stoi(sf.next(","));
 				u32 y = stoi(sf.next("="));
-				std::string filename = sf.next(":");
+				std::string filename = unescape_string(sf.next_esc(":", escape), escape);
 				infostream<<"Adding \""<<filename
 						<<"\" to combined ("<<x<<","<<y<<")"
 						<<std::endl;
-				video::IImage *img = m_sourcecache.getOrLoad(filename, m_device);
+				video::IImage *img = generateImage(filename);
 				if (img) {
 					core::dimension2d<u32> dim = img->getDimension();
 					infostream<<"Size "<<dim.Width
@@ -1295,7 +1315,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
 			}
 		}
 		/*
-			"[brighten"
+			[brighten
 		*/
 		else if (str_starts_with(part_of_name, "[brighten"))
 		{
@@ -1309,7 +1329,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
 			brighten(baseimg);
 		}
 		/*
-			"[noalpha"
+			[noalpha
 			Make image completely opaque.
 			Used for the leaves texture when in old leaves mode, so
 			that the transparent parts don't look completely black
@@ -1336,7 +1356,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
 			}
 		}
 		/*
-			"[makealpha:R,G,B"
+			[makealpha:R,G,B
 			Convert one color to transparent.
 		*/
 		else if (str_starts_with(part_of_name, "[makealpha:"))
@@ -1375,7 +1395,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
 			}
 		}
 		/*
-			"[transformN"
+			[transformN
 			Rotates and/or flips the image.
 
 			N can be a number (between 0 and 7) or a transform name.
@@ -1543,12 +1563,11 @@ bool TextureSource::generateImagePart(std::string part_of_name,
 			Strfnd sf(part_of_name);
 			sf.next(":");
 			u32 percent = stoi(sf.next(":"));
-			std::string filename = sf.next(":");
-			//infostream<<"power part "<<percent<<"%% of "<<filename<<std::endl;
+			std::string filename = unescape_string(sf.next_esc(":", escape), escape);
 
 			if (baseimg == NULL)
 				baseimg = driver->createImage(video::ECF_A8R8G8B8, v2u32(16,16));
-			video::IImage *img = m_sourcecache.getOrLoad(filename, m_device);
+			video::IImage *img = generateImage(filename);
 			if (img)
 			{
 				core::dimension2d<u32> dim = img->getDimension();
@@ -1628,9 +1647,9 @@ bool TextureSource::generateImagePart(std::string part_of_name,
 			}
 			Strfnd sf(part_of_name);
 			sf.next(":");
-			std::string filename = sf.next(":");
+			std::string filename = unescape_string(sf.next_esc(":", escape), escape);
 
-			video::IImage *img = m_sourcecache.getOrLoad(filename, m_device);
+			video::IImage *img = generateImage(filename);
 			if (img) {
 				apply_mask(img, baseimg, v2s32(0, 0), v2s32(0, 0),
 						img->getDimension());
@@ -1673,6 +1692,10 @@ bool TextureSource::generateImagePart(std::string part_of_name,
 
 			apply_colorize(baseimg, v2u32(0, 0), baseimg->getDimension(), color, ratio, keep_alpha);
 		}
+		/*
+			[applyfiltersformesh
+			Internal modifier
+		*/
 		else if (str_starts_with(part_of_name, "[applyfiltersformesh"))
 		{
 			// Apply the "clean transparent" filter, if configured.
@@ -1735,6 +1758,75 @@ bool TextureSource::generateImagePart(std::string part_of_name,
 			baseimg->drop();
 			baseimg = image;
 		}
+		/*
+			[opacity:R
+			Makes the base image transparent according to the given ratio.
+			R must be between 0 and 255.
+			0 means totally transparent.
+			255 means totally opaque.
+		*/
+		else if (str_starts_with(part_of_name, "[opacity:")) {
+			if (baseimg == NULL) {
+				errorstream << "generateImagePart(): baseimg == NULL "
+						<< "for part_of_name=\"" << part_of_name
+						<< "\", cancelling." << std::endl;
+				return false;
+			}
+
+			Strfnd sf(part_of_name);
+			sf.next(":");
+
+			u32 ratio = mystoi(sf.next(""), 0, 255);
+
+			core::dimension2d<u32> dim = baseimg->getDimension();
+
+			for (u32 y = 0; y < dim.Height; y++)
+			for (u32 x = 0; x < dim.Width; x++)
+			{
+				video::SColor c = baseimg->getPixel(x, y);
+				c.setAlpha(floor((c.getAlpha() * ratio) / 255 + 0.5));
+				baseimg->setPixel(x, y, c);
+			}
+		}
+		/*
+			[invert:mode
+			Inverts the given channels of the base image.
+			Mode may contain the characters "r", "g", "b", "a".
+			Only the channels that are mentioned in the mode string
+			will be inverted.
+		*/
+		else if (str_starts_with(part_of_name, "[invert:")) {
+			if (baseimg == NULL) {
+				errorstream << "generateImagePart(): baseimg == NULL "
+						<< "for part_of_name=\"" << part_of_name
+						<< "\", cancelling." << std::endl;
+				return false;
+			}
+
+			Strfnd sf(part_of_name);
+			sf.next(":");
+
+			std::string mode = sf.next("");
+			u32 mask = 0;
+			if (mode.find("a") != std::string::npos)
+				mask |= 0xff000000UL;
+			if (mode.find("r") != std::string::npos)
+				mask |= 0x00ff0000UL;
+			if (mode.find("g") != std::string::npos)
+				mask |= 0x0000ff00UL;
+			if (mode.find("b") != std::string::npos)
+				mask |= 0x000000ffUL;
+
+			core::dimension2d<u32> dim = baseimg->getDimension();
+
+			for (u32 y = 0; y < dim.Height; y++)
+			for (u32 x = 0; x < dim.Width; x++)
+			{
+				video::SColor c = baseimg->getPixel(x, y);
+				c.color ^= mask;	
+				baseimg->setPixel(x, y, c);
+			}
+		}
 		else
 		{
 			errorstream << "generateImagePart(): Invalid "
diff --git a/src/clientiface.cpp b/src/clientiface.cpp
index a3a17d4..0390cf0 100644
--- a/src/clientiface.cpp
+++ b/src/clientiface.cpp
@@ -22,14 +22,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "clientiface.h"
 #include "util/numeric.h"
 #include "util/mathconstants.h"
-#include "player.h"
+#include "remoteplayer.h"
 #include "settings.h"
 #include "mapblock.h"
 #include "network/connection.h"
 #include "environment.h"
 #include "map.h"
 #include "emerge.h"
-#include "serverobject.h"              // TODO this is used for cleanup of only
+#include "content_sao.h"              // TODO this is used for cleanup of only
 #include "log.h"
 #include "util/srp.h"
 
@@ -77,9 +77,13 @@ void RemoteClient::GetNextBlocks (
 	if(m_nothing_to_send_pause_timer >= 0)
 		return;
 
-	Player *player = env->getPlayer(peer_id);
+	RemotePlayer *player = env->getPlayer(peer_id);
 	// This can happen sometimes; clients and players are not in perfect sync.
-	if(player == NULL)
+	if (player == NULL)
+		return;
+
+	PlayerSAO *sao = player->getPlayerSAO();
+	if (sao == NULL)
 		return;
 
 	// Won't send anything if already sending
@@ -90,7 +94,7 @@ void RemoteClient::GetNextBlocks (
 		return;
 	}
 
-	v3f playerpos = player->getPosition();
+	v3f playerpos = sao->getBasePosition();
 	v3f playerspeed = player->getSpeed();
 	v3f playerspeeddir(0,0,0);
 	if(playerspeed.getLength() > 1.0*BS)
@@ -103,10 +107,10 @@ void RemoteClient::GetNextBlocks (
 	v3s16 center = getNodeBlockPos(center_nodepos);
 
 	// Camera position and direction
-	v3f camera_pos = player->getEyePosition();
+	v3f camera_pos = sao->getEyePosition();
 	v3f camera_dir = v3f(0,0,1);
-	camera_dir.rotateYZBy(player->getPitch());
-	camera_dir.rotateXZBy(player->getYaw());
+	camera_dir.rotateYZBy(sao->getPitch());
+	camera_dir.rotateXZBy(sao->getYaw());
 
 	/*infostream<<"camera_dir=("<<camera_dir.X<<","<<camera_dir.Y<<","
 			<<camera_dir.Z<<")"<<std::endl;*/
@@ -169,9 +173,20 @@ void RemoteClient::GetNextBlocks (
 	*/
 	s32 new_nearest_unsent_d = -1;
 
-	const s16 full_d_max = g_settings->getS16("max_block_send_distance");
+	// get view range and camera fov from the client
+	s16 wanted_range = sao->getWantedRange();
+	float camera_fov = sao->getFov();
+	// if FOV, wanted_range are not available (old client), fall back to old default
+	if (wanted_range <= 0) wanted_range = 1000;
+	if (camera_fov <= 0) camera_fov = (72.0*M_PI/180) * 4./3.;
+
+	const s16 full_d_max = MYMIN(g_settings->getS16("max_block_send_distance"), wanted_range);
+	const s16 d_opt = MYMIN(g_settings->getS16("block_send_optimize_distance"), wanted_range);
+	const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE;
+	//infostream << "Fov from client " << camera_fov << " full_d_max " << full_d_max << std::endl;
+
 	s16 d_max = full_d_max;
-	s16 d_max_gen = g_settings->getS16("max_block_generate_distance");
+	s16 d_max_gen = MYMIN(g_settings->getS16("max_block_generate_distance"), wanted_range);
 
 	// Don't loop very much at a time
 	s16 max_d_increment_at_time = 2;
@@ -229,24 +244,13 @@ void RemoteClient::GetNextBlocks (
 			// If this is true, inexistent block will be made from scratch
 			bool generate = d <= d_max_gen;
 
-			{
-				/*// Limit the generating area vertically to 2/3
-				if(abs(p.Y - center.Y) > d_max_gen - d_max_gen / 3)
-					generate = false;*/
-
-				// Limit the send area vertically to 1/2
-				if (abs(p.Y - center.Y) > full_d_max / 2)
-					continue;
-			}
-
 			/*
 				Don't generate or send if not in sight
 				FIXME This only works if the client uses a small enough
 				FOV setting. The default of 72 degrees is fine.
 			*/
 
-			float camera_fov = (72.0*M_PI/180) * 4./3.;
-			if(isBlockInSight(p, camera_pos, camera_dir, camera_fov, 10000*BS) == false)
+			if(isBlockInSight(p, camera_pos, camera_dir, camera_fov, d_blocks_in_sight) == false)
 			{
 				continue;
 			}
@@ -296,7 +300,7 @@ void RemoteClient::GetNextBlocks (
 					Block is near ground level if night-time mesh
 					differs from day-time mesh.
 				*/
-				if(d >= 4)
+				if(d >= d_opt)
 				{
 					if(block->getDayNightDiff() == false)
 						continue;
@@ -353,7 +357,7 @@ queue_full_break:
 	} else if(nearest_emergefull_d != -1){
 		new_nearest_unsent_d = nearest_emergefull_d;
 	} else {
-		if(d > g_settings->getS16("max_block_send_distance")){
+		if(d > full_d_max){
 			new_nearest_unsent_d = 0;
 			m_nothing_to_send_pause_timer = 2.0;
 		} else {
@@ -605,11 +609,8 @@ ClientInterface::~ClientInterface()
 	{
 		MutexAutoLock clientslock(m_clients_mutex);
 
-		for(std::map<u16, RemoteClient*>::iterator
-			i = m_clients.begin();
-			i != m_clients.end(); ++i)
-		{
-
+		for (UNORDERED_MAP<u16, RemoteClient*>::iterator i = m_clients.begin();
+			i != m_clients.end(); ++i) {
 			// Delete client
 			delete i->second;
 		}
@@ -621,10 +622,8 @@ std::vector<u16> ClientInterface::getClientIDs(ClientState min_state)
 	std::vector<u16> reply;
 	MutexAutoLock clientslock(m_clients_mutex);
 
-	for(std::map<u16, RemoteClient*>::iterator
-		i = m_clients.begin();
-		i != m_clients.end(); ++i)
-	{
+	for(UNORDERED_MAP<u16, RemoteClient*>::iterator i = m_clients.begin();
+		i != m_clients.end(); ++i) {
 		if (i->second->getState() >= min_state)
 			reply.push_back(i->second->peer_id);
 	}
@@ -632,12 +631,6 @@ std::vector<u16> ClientInterface::getClientIDs(ClientState min_state)
 	return reply;
 }
 
-std::vector<std::string> ClientInterface::getPlayerNames()
-{
-	return m_clients_names;
-}
-
-
 void ClientInterface::step(float dtime)
 {
 	m_print_info_timer += dtime;
@@ -650,8 +643,7 @@ void ClientInterface::step(float dtime)
 
 void ClientInterface::UpdatePlayerList()
 {
-	if (m_env != NULL)
-		{
+	if (m_env != NULL) {
 		std::vector<u16> clients = getClientIDs();
 		m_clients_names.clear();
 
@@ -659,10 +651,8 @@ void ClientInterface::UpdatePlayerList()
 		if(!clients.empty())
 			infostream<<"Players:"<<std::endl;
 
-		for(std::vector<u16>::iterator
-			i = clients.begin();
-			i != clients.end(); ++i) {
-			Player *player = m_env->getPlayer(*i);
+		for (std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) {
+			RemotePlayer *player = m_env->getPlayer(*i);
 
 			if (player == NULL)
 				continue;
@@ -691,8 +681,7 @@ void ClientInterface::sendToAll(u16 channelnum,
 		NetworkPacket* pkt, bool reliable)
 {
 	MutexAutoLock clientslock(m_clients_mutex);
-	for(std::map<u16, RemoteClient*>::iterator
-		i = m_clients.begin();
+	for(UNORDERED_MAP<u16, RemoteClient*>::iterator i = m_clients.begin();
 		i != m_clients.end(); ++i) {
 		RemoteClient *client = i->second;
 
@@ -705,11 +694,10 @@ void ClientInterface::sendToAll(u16 channelnum,
 RemoteClient* ClientInterface::getClientNoEx(u16 peer_id, ClientState state_min)
 {
 	MutexAutoLock clientslock(m_clients_mutex);
-	std::map<u16, RemoteClient*>::iterator n;
-	n = m_clients.find(peer_id);
+	UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
 	// The client may not exist; clients are immediately removed if their
 	// access is denied, and this event occurs later then.
-	if(n == m_clients.end())
+	if (n == m_clients.end())
 		return NULL;
 
 	if (n->second->getState() >= state_min)
@@ -720,11 +708,10 @@ RemoteClient* ClientInterface::getClientNoEx(u16 peer_id, ClientState state_min)
 
 RemoteClient* ClientInterface::lockedGetClientNoEx(u16 peer_id, ClientState state_min)
 {
-	std::map<u16, RemoteClient*>::iterator n;
-	n = m_clients.find(peer_id);
+	UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
 	// The client may not exist; clients are immediately removed if their
 	// access is denied, and this event occurs later then.
-	if(n == m_clients.end())
+	if (n == m_clients.end())
 		return NULL;
 
 	if (n->second->getState() >= state_min)
@@ -736,11 +723,10 @@ RemoteClient* ClientInterface::lockedGetClientNoEx(u16 peer_id, ClientState stat
 ClientState ClientInterface::getClientState(u16 peer_id)
 {
 	MutexAutoLock clientslock(m_clients_mutex);
-	std::map<u16, RemoteClient*>::iterator n;
-	n = m_clients.find(peer_id);
+	UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
 	// The client may not exist; clients are immediately removed if their
 	// access is denied, and this event occurs later then.
-	if(n == m_clients.end())
+	if (n == m_clients.end())
 		return CS_Invalid;
 
 	return n->second->getState();
@@ -749,11 +735,10 @@ ClientState ClientInterface::getClientState(u16 peer_id)
 void ClientInterface::setPlayerName(u16 peer_id,std::string name)
 {
 	MutexAutoLock clientslock(m_clients_mutex);
-	std::map<u16, RemoteClient*>::iterator n;
-	n = m_clients.find(peer_id);
+	UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
 	// The client may not exist; clients are immediately removed if their
 	// access is denied, and this event occurs later then.
-	if(n != m_clients.end())
+	if (n != m_clients.end())
 		n->second->setName(name);
 }
 
@@ -762,11 +747,10 @@ void ClientInterface::DeleteClient(u16 peer_id)
 	MutexAutoLock conlock(m_clients_mutex);
 
 	// Error check
-	std::map<u16, RemoteClient*>::iterator n;
-	n = m_clients.find(peer_id);
+	UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
 	// The client may not exist; clients are immediately removed if their
 	// access is denied, and this event occurs later then.
-	if(n == m_clients.end())
+	if (n == m_clients.end())
 		return;
 
 	/*
@@ -797,10 +781,9 @@ void ClientInterface::CreateClient(u16 peer_id)
 	MutexAutoLock conlock(m_clients_mutex);
 
 	// Error check
-	std::map<u16, RemoteClient*>::iterator n;
-	n = m_clients.find(peer_id);
+	UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
 	// The client shouldn't already exist
-	if(n != m_clients.end()) return;
+	if (n != m_clients.end()) return;
 
 	// Create client
 	RemoteClient *client = new RemoteClient();
@@ -814,8 +797,7 @@ void ClientInterface::event(u16 peer_id, ClientStateEvent event)
 		MutexAutoLock clientlock(m_clients_mutex);
 
 		// Error check
-		std::map<u16, RemoteClient*>::iterator n;
-		n = m_clients.find(peer_id);
+		UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
 
 		// No client to deliver event
 		if (n == m_clients.end())
@@ -836,8 +818,7 @@ u16 ClientInterface::getProtocolVersion(u16 peer_id)
 	MutexAutoLock conlock(m_clients_mutex);
 
 	// Error check
-	std::map<u16, RemoteClient*>::iterator n;
-	n = m_clients.find(peer_id);
+	UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
 
 	// No client to get version
 	if (n == m_clients.end())
@@ -851,8 +832,7 @@ void ClientInterface::setClientVersion(u16 peer_id, u8 major, u8 minor, u8 patch
 	MutexAutoLock conlock(m_clients_mutex);
 
 	// Error check
-	std::map<u16, RemoteClient*>::iterator n;
-	n = m_clients.find(peer_id);
+	UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
 
 	// No client to set versions
 	if (n == m_clients.end())
diff --git a/src/clientiface.h b/src/clientiface.h
index c099429..551d71b 100644
--- a/src/clientiface.h
+++ b/src/clientiface.h
@@ -25,10 +25,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "serialization.h"             // for SER_FMT_VER_INVALID
 #include "threading/mutex.h"
 #include "network/networkpacket.h"
+#include "util/cpp11_container.h"
 
 #include <list>
 #include <vector>
-#include <map>
 #include <set>
 
 class MapBlock;
@@ -453,7 +453,7 @@ public:
 	std::vector<u16> getClientIDs(ClientState min_state=CS_Active);
 
 	/* get list of client player names */
-	std::vector<std::string> getPlayerNames();
+	const std::vector<std::string> &getPlayerNames() const { return m_clients_names; }
 
 	/* send message to client */
 	void send(u16 peer_id, u8 channelnum, NetworkPacket* pkt, bool reliable);
@@ -502,8 +502,7 @@ protected:
 	void lock() { m_clients_mutex.lock(); }
 	void unlock() { m_clients_mutex.unlock(); }
 
-	std::map<u16, RemoteClient*>& getClientList()
-		{ return m_clients; }
+	UNORDERED_MAP<u16, RemoteClient*>& getClientList() { return m_clients; }
 
 private:
 	/* update internal player list */
@@ -513,7 +512,7 @@ private:
 	con::Connection* m_con;
 	Mutex m_clients_mutex;
 	// Connected clients (behind the con mutex)
-	std::map<u16, RemoteClient*> m_clients;
+	UNORDERED_MAP<u16, RemoteClient*> m_clients;
 	std::vector<std::string> m_clients_names; //for announcing masterserver
 
 	// Environment
diff --git a/src/clientmap.cpp b/src/clientmap.cpp
index a0a7802..faa1461 100644
--- a/src/clientmap.cpp
+++ b/src/clientmap.cpp
@@ -132,9 +132,9 @@ static bool isOccluded(Map *map, v3s16 p0, v3s16 p1, float step, float stepfac,
 		else
 			is_transparent = (f.solidness != 2);
 		if(!is_transparent){
-			if(count == needed_count)
-				return true;
 			count++;
+			if(count >= needed_count)
+				return true;
 		}
 		step *= stepfac;
 	}
@@ -293,13 +293,22 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
 			float step = BS * 1;
 			float stepfac = 1.1;
 			float startoff = BS * 1;
-			float endoff = -BS*MAP_BLOCKSIZE * 1.42 * 1.42;
-			v3s16 spn = cam_pos_nodes + v3s16(0, 0, 0);
+			// The occlusion search of 'isOccluded()' must stop short of the target
+			// point by distance 'endoff' (end offset) to not enter the target mapblock.
+			// For the 8 mapblock corners 'endoff' must therefore be the maximum diagonal
+			// of a mapblock, because we must consider all view angles.
+			// sqrt(1^2 + 1^2 + 1^2) = 1.732
+			float endoff = -BS * MAP_BLOCKSIZE * 1.732050807569;
+			v3s16 spn = cam_pos_nodes;
 			s16 bs2 = MAP_BLOCKSIZE / 2 + 1;
-			u32 needed_count = 1;
+			// to reduce the likelihood of falsely occluded blocks
+			// require at least two solid blocks
+			// this is a HACK, we should think of a more precise algorithm
+			u32 needed_count = 2;
 			if (occlusion_culling_enabled &&
-					isOccluded(this, spn, cpn + v3s16(0, 0, 0),
-						step, stepfac, startoff, endoff, needed_count, nodemgr) &&
+					// For the central point of the mapblock 'endoff' can be halved
+					isOccluded(this, spn, cpn,
+						step, stepfac, startoff, endoff / 2.0f, needed_count, nodemgr) &&
 					isOccluded(this, spn, cpn + v3s16(bs2,bs2,bs2),
 						step, stepfac, startoff, endoff, needed_count, nodemgr) &&
 					isOccluded(this, spn, cpn + v3s16(bs2,bs2,-bs2),
@@ -521,6 +530,7 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
 				buf->getMaterial().setFlag(video::EMF_TRILINEAR_FILTER, m_cache_trilinear_filter);
 				buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, m_cache_bilinear_filter);
 				buf->getMaterial().setFlag(video::EMF_ANISOTROPIC_FILTER, m_cache_anistropic_filter);
+				buf->getMaterial().setFlag(video::EMF_WIREFRAME, m_control.show_wireframe);
 
 				const video::SMaterial& material = buf->getMaterial();
 				video::IMaterialRenderer* rnd =
diff --git a/src/clientmap.h b/src/clientmap.h
index 396e68f..cb686ff 100644
--- a/src/clientmap.h
+++ b/src/clientmap.h
@@ -32,6 +32,7 @@ struct MapDrawControl
 		range_all(false),
 		wanted_range(0),
 		wanted_max_blocks(0),
+		show_wireframe(false),
 		blocks_drawn(0),
 		blocks_would_have_drawn(0),
 		farthest_drawn(0)
@@ -43,6 +44,8 @@ struct MapDrawControl
 	float wanted_range;
 	// Maximum number of blocks to draw
 	u32 wanted_max_blocks;
+	// show a wire frame for debugging
+	bool show_wireframe;
 	// Number of blocks rendered is written here by the renderer
 	u32 blocks_drawn;
 	// Number of blocks that would have been drawn in wanted_range
@@ -135,7 +138,9 @@ public:
 	{
 		return (m_last_drawn_sectors.find(p) != m_last_drawn_sectors.end());
 	}
-	
+
+	const MapDrawControl & getControl() const { return m_control; }
+	f32 getCameraFov() const { return m_camera_fov; }
 private:
 	Client *m_client;
 	
diff --git a/src/clientobject.cpp b/src/clientobject.cpp
index a11757e..ff3f471 100644
--- a/src/clientobject.cpp
+++ b/src/clientobject.cpp
@@ -43,12 +43,11 @@ ClientActiveObject* ClientActiveObject::create(ActiveObjectType type,
 		IGameDef *gamedef, ClientEnvironment *env)
 {
 	// Find factory function
-	std::map<u16, Factory>::iterator n;
-	n = m_types.find(type);
+	UNORDERED_MAP<u16, Factory>::iterator n = m_types.find(type);
 	if(n == m_types.end()) {
 		// If factory is not found, just return.
-		warningstream<<"ClientActiveObject: No factory for type="
-				<<(int)type<<std::endl;
+		warningstream << "ClientActiveObject: No factory for type="
+				<< (int)type << std::endl;
 		return NULL;
 	}
 
@@ -59,8 +58,7 @@ ClientActiveObject* ClientActiveObject::create(ActiveObjectType type,
 
 void ClientActiveObject::registerType(u16 type, Factory f)
 {
-	std::map<u16, Factory>::iterator n;
-	n = m_types.find(type);
+	UNORDERED_MAP<u16, Factory>::iterator n = m_types.find(type);
 	if(n != m_types.end())
 		return;
 	m_types[type] = f;
diff --git a/src/clientobject.h b/src/clientobject.h
index 3cc7c23..83931e4 100644
--- a/src/clientobject.h
+++ b/src/clientobject.h
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "irrlichttypes_extrabloated.h"
 #include "activeobject.h"
 #include <map>
+#include "util/cpp11_container.h"
 
 /*
 
@@ -60,6 +61,7 @@ public:
 	virtual bool getCollisionBox(aabb3f *toset){return false;}
 	virtual bool collideWithObjects(){return false;}
 	virtual v3f getPosition(){return v3f(0,0,0);}
+	virtual float getYaw() const {return 0;}
 	virtual scene::ISceneNode *getSceneNode(){return NULL;}
 	virtual scene::IMeshSceneNode *getMeshSceneNode(){return NULL;}
 	virtual scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode(){return NULL;}
@@ -103,7 +105,7 @@ protected:
 	ClientEnvironment *m_env;
 private:
 	// Used for creating objects based on type
-	static std::map<u16, Factory> m_types;
+	static UNORDERED_MAP<u16, Factory> m_types;
 };
 
 struct DistanceSortedActiveObject
diff --git a/src/cmake_config.h.in b/src/cmake_config.h.in
index 018532d..4b73102 100644
--- a/src/cmake_config.h.in
+++ b/src/cmake_config.h.in
@@ -14,6 +14,7 @@
 #define STATIC_SHAREDIR "@SHAREDIR@"
 #define STATIC_LOCALEDIR "@LOCALEDIR@"
 #define BUILD_TYPE "@CMAKE_BUILD_TYPE@"
+#define ICON_DIR "@ICONDIR@"
 #cmakedefine01 RUN_IN_PLACE
 #cmakedefine01 USE_GETTEXT
 #cmakedefine01 USE_CURL
@@ -22,6 +23,7 @@
 #cmakedefine01 USE_CURSES
 #cmakedefine01 USE_LEVELDB
 #cmakedefine01 USE_LUAJIT
+#cmakedefine01 USE_POSTGRESQL
 #cmakedefine01 USE_SPATIAL
 #cmakedefine01 USE_SYSTEM_GMP
 #cmakedefine01 USE_REDIS
diff --git a/src/collision.cpp b/src/collision.cpp
index 74c0c25..8e5dbcc 100644
--- a/src/collision.cpp
+++ b/src/collision.cpp
@@ -34,6 +34,27 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 //#define COLL_ZERO 0.032 // broken unit tests
 #define COLL_ZERO 0
 
+
+struct NearbyCollisionInfo {
+	NearbyCollisionInfo(bool is_ul, bool is_obj, int bouncy,
+			const v3s16 &pos, const aabb3f &box) :
+		is_unloaded(is_ul),
+		is_step_up(false),
+		is_object(is_obj),
+		bouncy(bouncy),
+		position(pos),
+		box(box)
+	{}
+
+	bool is_unloaded;
+	bool is_step_up;
+	bool is_object;
+	int bouncy;
+	v3s16 position;
+	aabb3f box;
+};
+
+
 // Helper function:
 // Checks for collision of a moving aabbox with a static aabbox
 // Returns -1 if no collision, 0 if X collision, 1 if Y collision, 2 if Z collision
@@ -160,7 +181,7 @@ int axisAlignedCollision(
 // Helper function:
 // Checks if moving the movingbox up by the given distance would hit a ceiling.
 bool wouldCollideWithCeiling(
-		const std::vector<aabb3f> &staticboxes,
+		const std::vector<NearbyCollisionInfo> &cinfo,
 		const aabb3f &movingbox,
 		f32 y_increase, f32 d)
 {
@@ -168,12 +189,10 @@ bool wouldCollideWithCeiling(
 
 	assert(y_increase >= 0);	// pre-condition
 
-	for(std::vector<aabb3f>::const_iterator
-			i = staticboxes.begin();
-			i != staticboxes.end(); ++i)
-	{
-		const aabb3f& staticbox = *i;
-		if((movingbox.MaxEdge.Y - d <= staticbox.MinEdge.Y) &&
+	for (std::vector<NearbyCollisionInfo>::const_iterator it = cinfo.begin();
+			it != cinfo.end(); ++it) {
+		const aabb3f &staticbox = it->box;
+		if ((movingbox.MaxEdge.Y - d <= staticbox.MinEdge.Y) &&
 				(movingbox.MaxEdge.Y + y_increase > staticbox.MinEdge.Y) &&
 				(movingbox.MinEdge.X < staticbox.MaxEdge.X) &&
 				(movingbox.MaxEdge.X > staticbox.MinEdge.X) &&
@@ -234,12 +253,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 	/*
 		Collect node boxes in movement range
 	*/
-	std::vector<aabb3f> cboxes;
-	std::vector<bool> is_unloaded;
-	std::vector<bool> is_step_up;
-	std::vector<bool> is_object;
-	std::vector<int> bouncy_values;
-	std::vector<v3s16> node_positions;
+	std::vector<NearbyCollisionInfo> cinfo;
 	{
 	//TimeTaker tt2("collisionMoveSimple collect boxes");
 	ScopeProfiler sp(g_profiler, "collisionMoveSimple collect boxes avg", SPT_AVG);
@@ -310,23 +324,13 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 				aabb3f box = *i;
 				box.MinEdge += v3f(x, y, z)*BS;
 				box.MaxEdge += v3f(x, y, z)*BS;
-				cboxes.push_back(box);
-				is_unloaded.push_back(false);
-				is_step_up.push_back(false);
-				bouncy_values.push_back(n_bouncy_value);
-				node_positions.push_back(p);
-				is_object.push_back(false);
+				cinfo.push_back(NearbyCollisionInfo(false,
+					false, n_bouncy_value, p, box));
 			}
-		}
-		else {
+		} else {
 			// Collide with unloaded nodes
 			aabb3f box = getNodeBox(p, BS);
-			cboxes.push_back(box);
-			is_unloaded.push_back(true);
-			is_step_up.push_back(false);
-			bouncy_values.push_back(0);
-			node_positions.push_back(p);
-			is_object.push_back(false);
+			cinfo.push_back(NearbyCollisionInfo(true, false, 0, p, box));
 		}
 	}
 
@@ -344,7 +348,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 		ScopeProfiler sp(g_profiler, "collisionMoveSimple objects avg", SPT_AVG);
 		//TimeTaker tt3("collisionMoveSimple collect object boxes");
 
-		/* add object boxes to cboxes */
+		/* add object boxes to cinfo */
 
 		std::vector<ActiveObject*> objects;
 #ifndef SERVER
@@ -363,7 +367,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 #endif
 		{
 			ServerEnvironment *s_env = dynamic_cast<ServerEnvironment*>(env);
-			if (s_env != 0) {
+			if (s_env != NULL) {
 				f32 distance = speed_f->getLength();
 				std::vector<u16> s_objects;
 				s_env->getObjectsInsideRadius(s_objects, *pos_f, distance * 1.5);
@@ -384,23 +388,12 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 				aabb3f object_collisionbox;
 				if (object->getCollisionBox(&object_collisionbox) &&
 						object->collideWithObjects()) {
-					cboxes.push_back(object_collisionbox);
-					is_unloaded.push_back(false);
-					is_step_up.push_back(false);
-					bouncy_values.push_back(0);
-					node_positions.push_back(v3s16(0,0,0));
-					is_object.push_back(true);
+					cinfo.push_back(NearbyCollisionInfo(false, true, 0, v3s16(), object_collisionbox));
 				}
 			}
 		}
 	} //tt3
 
-	assert(cboxes.size() == is_unloaded.size());    // post-condition
-	assert(cboxes.size() == is_step_up.size());     // post-condition
-	assert(cboxes.size() == bouncy_values.size());  // post-condition
-	assert(cboxes.size() == node_positions.size()); // post-condition
-	assert(cboxes.size() == is_object.size());      // post-condition
-
 	/*
 		Collision detection
 	*/
@@ -440,15 +433,16 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 		/*
 			Go through every nodebox, find nearest collision
 		*/
-		for (u32 boxindex = 0; boxindex < cboxes.size(); boxindex++) {
+		for (u32 boxindex = 0; boxindex < cinfo.size(); boxindex++) {
+			NearbyCollisionInfo box_info = cinfo[boxindex];
 			// Ignore if already stepped up this nodebox.
-			if(is_step_up[boxindex])
+			if (box_info.is_step_up)
 				continue;
 
 			// Find nearest collision of the two boxes (raytracing-like)
 			f32 dtime_tmp;
-			int collided = axisAlignedCollision(
-					cboxes[boxindex], movingbox, *speed_f, d, &dtime_tmp);
+			int collided = axisAlignedCollision(box_info.box,
+					movingbox, *speed_f, d, &dtime_tmp);
 
 			if (collided == -1 || dtime_tmp >= nearest_dtime)
 				continue;
@@ -464,19 +458,19 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 			dtime = 0;  // Set to 0 to avoid "infinite" loop due to small FP numbers
 		} else {
 			// Otherwise, a collision occurred.
-
-			const aabb3f& cbox = cboxes[nearest_boxindex];
+			NearbyCollisionInfo &nearest_info = cinfo[nearest_boxindex];
+			const aabb3f& cbox = nearest_info.box;
 			// Check for stairs.
 			bool step_up = (nearest_collided != 1) && // must not be Y direction
 					(movingbox.MinEdge.Y < cbox.MaxEdge.Y) &&
 					(movingbox.MinEdge.Y + stepheight > cbox.MaxEdge.Y) &&
-					(!wouldCollideWithCeiling(cboxes, movingbox,
+					(!wouldCollideWithCeiling(cinfo, movingbox,
 							cbox.MaxEdge.Y - movingbox.MinEdge.Y,
 							d));
 
 			// Get bounce multiplier
-			bool bouncy = (bouncy_values[nearest_boxindex] >= 1);
-			float bounce = -(float)bouncy_values[nearest_boxindex] / 100.0;
+			bool bouncy = (nearest_info.bouncy >= 1);
+			float bounce = -(float)nearest_info.bouncy / 100.0;
 
 			// Move to the point of collision and reduce dtime by nearest_dtime
 			if (nearest_dtime < 0) {
@@ -495,39 +489,38 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 			}
 
 			bool is_collision = true;
-			if (is_unloaded[nearest_boxindex])
+			if (nearest_info.is_unloaded)
 				is_collision = false;
 
 			CollisionInfo info;
-			if (is_object[nearest_boxindex])
+			if (nearest_info.is_object)
 				info.type = COLLISION_OBJECT;
 			else
 				info.type = COLLISION_NODE;
 
-			info.node_p = node_positions[nearest_boxindex];
+			info.node_p = nearest_info.position;
 			info.bouncy = bouncy;
 			info.old_speed = *speed_f;
 
 			// Set the speed component that caused the collision to zero
 			if (step_up) {
 				// Special case: Handle stairs
-				is_step_up[nearest_boxindex] = true;
+				nearest_info.is_step_up = true;
 				is_collision = false;
-			} else if(nearest_collided == 0) { // X
+			} else if (nearest_collided == 0) { // X
 				if (fabs(speed_f->X) > BS * 3)
 					speed_f->X *= bounce;
 				else
 					speed_f->X = 0;
 				result.collides = true;
 				result.collides_xz = true;
-			}
-			else if(nearest_collided == 1) { // Y
-				if (fabs(speed_f->Y) > BS * 3)
+			} else if (nearest_collided == 1) { // Y
+				if(fabs(speed_f->Y) > BS * 3)
 					speed_f->Y *= bounce;
 				else
 					speed_f->Y = 0;
 				result.collides = true;
-			} else if(nearest_collided == 2) { // Z
+			} else if (nearest_collided == 2) { // Z
 				if (fabs(speed_f->Z) > BS * 3)
 					speed_f->Z *= bounce;
 				else
@@ -552,8 +545,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 	aabb3f box = box_0;
 	box.MinEdge += *pos_f;
 	box.MaxEdge += *pos_f;
-	for (u32 boxindex = 0; boxindex < cboxes.size(); boxindex++) {
-		const aabb3f& cbox = cboxes[boxindex];
+	for (u32 boxindex = 0; boxindex < cinfo.size(); boxindex++) {
+		NearbyCollisionInfo &box_info = cinfo[boxindex];
+		const aabb3f &cbox = box_info.box;
 
 		/*
 			See if the object is touching ground.
@@ -567,8 +561,8 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 		if (cbox.MaxEdge.X - d > box.MinEdge.X && cbox.MinEdge.X + d < box.MaxEdge.X &&
 				cbox.MaxEdge.Z - d > box.MinEdge.Z &&
 				cbox.MinEdge.Z + d < box.MaxEdge.Z) {
-			if (is_step_up[boxindex]) {
-				pos_f->Y += (cbox.MaxEdge.Y - box.MinEdge.Y);
+			if (box_info.is_step_up) {
+				pos_f->Y += cbox.MaxEdge.Y - box.MinEdge.Y;
 				box = box_0;
 				box.MinEdge += *pos_f;
 				box.MaxEdge += *pos_f;
@@ -576,9 +570,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 			if (fabs(cbox.MaxEdge.Y - box.MinEdge.Y) < 0.15 * BS) {
 				result.touching_ground = true;
 
-				if (is_object[boxindex])
+				if (box_info.is_object)
 					result.standing_on_object = true;
-				if (is_unloaded[boxindex])
+				if (box_info.is_unloaded)
 					result.standing_on_unloaded = true;
 			}
 		}
diff --git a/src/constants.h b/src/constants.h
index b606fc4..55ae9da 100644
--- a/src/constants.h
+++ b/src/constants.h
@@ -112,7 +112,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #if defined(_WIN32)
 	#define TTF_DEFAULT_FONT_SIZE   (18)
 #else
-	#define TTF_DEFAULT_FONT_SIZE	(15)
+	#define TTF_DEFAULT_FONT_SIZE	(16)
 #endif
 #define DEFAULT_FONT_SIZE       (10)
 
diff --git a/src/content_cao.cpp b/src/content_cao.cpp
index d701e4f..6b35d58 100644
--- a/src/content_cao.cpp
+++ b/src/content_cao.cpp
@@ -51,7 +51,7 @@ struct ToolCapabilities;
 
 #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
 
-std::map<u16, ClientActiveObject::Factory> ClientActiveObject::m_types;
+UNORDERED_MAP<u16, ClientActiveObject::Factory> ClientActiveObject::m_types;
 
 SmoothTranslator::SmoothTranslator():
 	vect_old(0,0,0),
@@ -313,7 +313,8 @@ public:
 		{return &m_selection_box;}
 	v3f getPosition()
 		{return m_position;}
-
+	inline float getYaw() const
+		{return 0;}
 	std::string infoText()
 		{return m_infotext;}
 
@@ -546,7 +547,6 @@ GenericCAO::GenericCAO(IGameDef *gamedef, ClientEnvironment *env):
 		//
 		m_smgr(NULL),
 		m_irr(NULL),
-		m_camera(NULL),
 		m_gamedef(NULL),
 		m_selection_box(-BS/3.,-BS/3.,-BS/3., BS/3.,BS/3.,BS/3.),
 		m_meshnode(NULL),
@@ -567,7 +567,7 @@ GenericCAO::GenericCAO(IGameDef *gamedef, ClientEnvironment *env):
 		m_animation_speed(15),
 		m_animation_blend(0),
 		m_animation_loop(true),
-		m_bone_position(std::map<std::string, core::vector2d<v3f> >()),
+		m_bone_position(UNORDERED_MAP<std::string, core::vector2d<v3f> >()),
 		m_attachment_bone(""),
 		m_attachment_position(v3f(0,0,0)),
 		m_attachment_rotation(v3f(0,0,0)),
@@ -614,13 +614,28 @@ bool GenericCAO::collideWithObjects()
 void GenericCAO::initialize(const std::string &data)
 {
 	infostream<<"GenericCAO: Got init data"<<std::endl;
+	processInitData(data);
+
+	if (m_is_player) {
+		// Check if it's the current player
+		LocalPlayer *player = m_env->getLocalPlayer();
+		if (player && strcmp(player->getName(), m_name.c_str()) == 0) {
+			m_is_local_player = true;
+			m_is_visible = false;
+			player->setCAO(this);
+		}
+		m_env->addPlayerName(m_name.c_str());
+	}
+}
+
+void GenericCAO::processInitData(const std::string &data)
+{
 	std::istringstream is(data, std::ios::binary);
 	int num_messages = 0;
 	// version
 	u8 version = readU8(is);
 	// check version
-	if(version == 1) // In PROTOCOL_VERSION 14
-	{
+	if (version == 1) { // In PROTOCOL_VERSION 14
 		m_name = deSerializeString(is);
 		m_is_player = readU8(is);
 		m_id = readS16(is);
@@ -628,46 +643,26 @@ void GenericCAO::initialize(const std::string &data)
 		m_yaw = readF1000(is);
 		m_hp = readS16(is);
 		num_messages = readU8(is);
-	}
-	else if(version == 0) // In PROTOCOL_VERSION 13
-	{
+	} else if (version == 0) { // In PROTOCOL_VERSION 13
 		m_name = deSerializeString(is);
 		m_is_player = readU8(is);
 		m_position = readV3F1000(is);
 		m_yaw = readF1000(is);
 		m_hp = readS16(is);
 		num_messages = readU8(is);
-	}
-	else
-	{
+	} else {
 		errorstream<<"GenericCAO: Unsupported init data version"
 				<<std::endl;
 		return;
 	}
 
-	for(int i=0; i<num_messages; i++)
-	{
+	for (int i = 0; i < num_messages; i++) {
 		std::string message = deSerializeLongString(is);
 		processMessage(message);
 	}
 
 	pos_translator.init(m_position);
 	updateNodePos();
-
-	if(m_is_player)
-	{
-		Player *player = m_env->getPlayer(m_name.c_str());
-		if(player && player->isLocal())
-		{
-			m_is_local_player = true;
-			m_is_visible = false;
-			LocalPlayer* localplayer = dynamic_cast<LocalPlayer*>(player);
-
-			assert( localplayer != NULL );
-			localplayer->setCAO(this);
-		}
-		m_env->addPlayerName(m_name.c_str());
-	}
 }
 
 GenericCAO::~GenericCAO()
@@ -804,7 +799,7 @@ void GenericCAO::removeFromScene(bool permanent)
 	}
 }
 
-void GenericCAO::addToScene(scene::ISceneManager *smgr, 
+void GenericCAO::addToScene(scene::ISceneManager *smgr,
 		ITextureSource *tsrc, IrrlichtDevice *irr)
 {
 	m_smgr = smgr;
@@ -840,54 +835,50 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr,
 			setBillboardTextureMatrix(m_spritenode,
 					txs, tys, 0, 0);
 		}
-	}
-	else if(m_prop.visual == "upright_sprite") {
+	} else if (m_prop.visual == "upright_sprite") {
 		scene::SMesh *mesh = new scene::SMesh();
-		double dx = BS*m_prop.visual_size.X/2;
-		double dy = BS*m_prop.visual_size.Y/2;
-		{ // Front
-		scene::IMeshBuffer *buf = new scene::SMeshBuffer();
+		double dx = BS * m_prop.visual_size.X / 2;
+		double dy = BS * m_prop.visual_size.Y / 2;
 		u8 li = m_last_light;
-		video::SColor c(255,li,li,li);
-		video::S3DVertex vertices[4] =
-		{
-			video::S3DVertex(-dx,-dy,0, 0,0,0, c, 0,1),
-			video::S3DVertex(dx,-dy,0, 0,0,0, c, 1,1),
-			video::S3DVertex(dx,dy,0, 0,0,0, c, 1,0),
-			video::S3DVertex(-dx,dy,0, 0,0,0, c, 0,0),
-		};
-		u16 indices[] = {0,1,2,2,3,0};
-		buf->append(vertices, 4, indices, 6);
-		// Set material
-		buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
-		buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
-		buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
-		buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
-		// Add to mesh
-		mesh->addMeshBuffer(buf);
-		buf->drop();
+		video::SColor c(255, li, li, li);
+
+		{ // Front
+			scene::IMeshBuffer *buf = new scene::SMeshBuffer();
+			video::S3DVertex vertices[4] = {
+				video::S3DVertex(-dx, -dy, 0, 0,0,0, c, 1,1),
+				video::S3DVertex( dx, -dy, 0, 0,0,0, c, 0,1),
+				video::S3DVertex( dx,  dy, 0, 0,0,0, c, 0,0),
+				video::S3DVertex(-dx,  dy, 0, 0,0,0, c, 1,0),
+			};
+			u16 indices[] = {0,1,2,2,3,0};
+			buf->append(vertices, 4, indices, 6);
+			// Set material
+			buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
+			buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
+			buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
+			buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
+			// Add to mesh
+			mesh->addMeshBuffer(buf);
+			buf->drop();
 		}
 		{ // Back
-		scene::IMeshBuffer *buf = new scene::SMeshBuffer();
-		u8 li = m_last_light;
-		video::SColor c(255,li,li,li);
-		video::S3DVertex vertices[4] =
-		{
-			video::S3DVertex(dx,-dy,0, 0,0,0, c, 1,1),
-			video::S3DVertex(-dx,-dy,0, 0,0,0, c, 0,1),
-			video::S3DVertex(-dx,dy,0, 0,0,0, c, 0,0),
-			video::S3DVertex(dx,dy,0, 0,0,0, c, 1,0),
-		};
-		u16 indices[] = {0,1,2,2,3,0};
-		buf->append(vertices, 4, indices, 6);
-		// Set material
-		buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
-		buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
-		buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
-		buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
-		// Add to mesh
-		mesh->addMeshBuffer(buf);
-		buf->drop();
+			scene::IMeshBuffer *buf = new scene::SMeshBuffer();
+			video::S3DVertex vertices[4] = {
+				video::S3DVertex( dx,-dy, 0, 0,0,0, c, 1,1),
+				video::S3DVertex(-dx,-dy, 0, 0,0,0, c, 0,1),
+				video::S3DVertex(-dx, dy, 0, 0,0,0, c, 0,0),
+				video::S3DVertex( dx, dy, 0, 0,0,0, c, 1,0),
+			};
+			u16 indices[] = {0,1,2,2,3,0};
+			buf->append(vertices, 4, indices, 6);
+			// Set material
+			buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
+			buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
+			buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
+			buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
+			// Add to mesh
+			mesh->addMeshBuffer(buf);
+			buf->drop();
 		}
 		m_meshnode = smgr->addMeshSceneNode(mesh, NULL);
 		m_meshnode->grab();
@@ -1057,7 +1048,9 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
 			PlayerControl controls = player->getPlayerControl();
 
 			bool walking = false;
-			if(controls.up || controls.down || controls.left || controls.right)
+			if (controls.up || controls.down || controls.left || controls.right ||
+					controls.forw_move_joystick_axis != 0.f ||
+					controls.sidew_move_joystick_axis != 0.f)
 				walking = true;
 
 			f32 new_speed = player->local_animation_speed;
@@ -1508,10 +1501,8 @@ void GenericCAO::updateBonePosition()
 		return;
 
 	m_animated_meshnode->setJointMode(irr::scene::EJUOR_CONTROL); // To write positions to the mesh on render
-	for(std::map<std::string,
-			core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin();
-			ii != m_bone_position.end(); ++ii)
-	{
+	for(UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+			ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
 		std::string bone_name = (*ii).first;
 		v3f bone_pos = (*ii).second.X;
 		v3f bone_rot = (*ii).second.Y;
@@ -1572,8 +1563,7 @@ void GenericCAO::processMessage(const std::string &data)
 	std::istringstream is(data, std::ios::binary);
 	// command
 	u8 cmd = readU8(is);
-	if(cmd == GENERIC_CMD_SET_PROPERTIES)
-	{
+	if (cmd == GENERIC_CMD_SET_PROPERTIES) {
 		m_prop = gob_read_set_properties(is);
 
 		m_selection_box = m_prop.collisionbox;
@@ -1592,9 +1582,7 @@ void GenericCAO::processMessage(const std::string &data)
 			m_prop.nametag = m_name;
 
 		expireVisuals();
-	}
-	else if(cmd == GENERIC_CMD_UPDATE_POSITION)
-	{
+	} else if (cmd == GENERIC_CMD_UPDATE_POSITION) {
 		// Not sent by the server if this object is an attachment.
 		// We might however get here if the server notices the object being detached before the client.
 		m_position = readV3F1000(is);
@@ -1624,12 +1612,10 @@ void GenericCAO::processMessage(const std::string &data)
 			pos_translator.init(m_position);
 		}
 		updateNodePos();
-	}
-	else if(cmd == GENERIC_CMD_SET_TEXTURE_MOD) {
+	} else if (cmd == GENERIC_CMD_SET_TEXTURE_MOD) {
 		std::string mod = deSerializeString(is);
 		updateTextures(mod);
-	}
-	else if(cmd == GENERIC_CMD_SET_SPRITE) {
+	} else if (cmd == GENERIC_CMD_SET_SPRITE) {
 		v2s16 p = readV2S16(is);
 		int num_frames = readU16(is);
 		float framelength = readF1000(is);
@@ -1641,8 +1627,7 @@ void GenericCAO::processMessage(const std::string &data)
 		m_tx_select_horiz_by_yawpitch = select_horiz_by_yawpitch;
 
 		updateTexturePos();
-	}
-	else if(cmd == GENERIC_CMD_SET_PHYSICS_OVERRIDE) {
+	} else if (cmd == GENERIC_CMD_SET_PHYSICS_OVERRIDE) {
 		float override_speed = readF1000(is);
 		float override_jump = readF1000(is);
 		float override_gravity = readF1000(is);
@@ -1660,8 +1645,7 @@ void GenericCAO::processMessage(const std::string &data)
 			player->physics_override_sneak = sneak;
 			player->physics_override_sneak_glitch = sneak_glitch;
 		}
-	}
-	else if(cmd == GENERIC_CMD_SET_ANIMATION) {
+	} else if (cmd == GENERIC_CMD_SET_ANIMATION) {
 		// TODO: change frames send as v2s32 value
 		v2f range = readV2F1000(is);
 		if (!m_is_local_player) {
@@ -1695,8 +1679,7 @@ void GenericCAO::processMessage(const std::string &data)
 					updateAnimation();
 			}
 		}
-	}
-	else if(cmd == GENERIC_CMD_SET_BONE_POSITION) {
+	} else if (cmd == GENERIC_CMD_SET_BONE_POSITION) {
 		std::string bone = deSerializeString(is);
 		v3f position = readV3F1000(is);
 		v3f rotation = readV3F1000(is);
@@ -1729,8 +1712,7 @@ void GenericCAO::processMessage(const std::string &data)
 		}
 
 		updateAttachments();
-	}
-	else if(cmd == GENERIC_CMD_PUNCHED) {
+	} else if (cmd == GENERIC_CMD_PUNCHED) {
 		/*s16 damage =*/ readS16(is);
 		s16 result_hp = readS16(is);
 
@@ -1758,8 +1740,7 @@ void GenericCAO::processMessage(const std::string &data)
 				updateTextures("^[brighten");
 			}
 		}
-	}
-	else if(cmd == GENERIC_CMD_UPDATE_ARMOR_GROUPS) {
+	} else if (cmd == GENERIC_CMD_UPDATE_ARMOR_GROUPS) {
 		m_armor_groups.clear();
 		int armor_groups_size = readU16(is);
 		for(int i=0; i<armor_groups_size; i++)
@@ -1775,6 +1756,19 @@ void GenericCAO::processMessage(const std::string &data)
 		if (m_nametag != NULL) {
 			m_nametag->nametag_color = m_prop.nametag_color;
 		}
+	} else if (cmd == GENERIC_CMD_SPAWN_INFANT) {
+		u16 child_id = readU16(is);
+		u8 type = readU8(is);
+
+		if (GenericCAO *childobj = m_env->getGenericCAO(child_id)) {
+			childobj->processInitData(deSerializeLongString(is));
+		} else {
+			m_env->addActiveObject(child_id, type, deSerializeLongString(is));
+		}
+	} else {
+		warningstream << FUNCTION_NAME
+			<< ": unknown command or outdated client \""
+			<< cmd << std::endl;
 	}
 }
 
diff --git a/src/content_cao.h b/src/content_cao.h
index a166ff4..a158e82 100644
--- a/src/content_cao.h
+++ b/src/content_cao.h
@@ -68,7 +68,6 @@ private:
 	//
 	scene::ISceneManager *m_smgr;
 	IrrlichtDevice *m_irr;
-	Camera* m_camera;
 	IGameDef *m_gamedef;
 	aabb3f m_selection_box;
 	scene::IMeshSceneNode *m_meshnode;
@@ -91,7 +90,7 @@ private:
 	int m_animation_speed;
 	int m_animation_blend;
 	bool m_animation_loop;
-	std::map<std::string, core::vector2d<v3f> > m_bone_position; // stores position and rotation for each bone name
+	UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position; // stores position and rotation for each bone name
 	std::string m_attachment_bone;
 	v3f m_attachment_position;
 	v3f m_attachment_rotation;
@@ -126,6 +125,8 @@ public:
 
 	void initialize(const std::string &data);
 
+	void processInitData(const std::string &data);
+
 	ClientActiveObject *getParent();
 
 	bool getCollisionBox(aabb3f *toset);
@@ -135,6 +136,10 @@ public:
 	aabb3f *getSelectionBox();
 
 	v3f getPosition();
+	inline float getYaw() const
+	{
+		return m_yaw;
+	}
 
 	scene::ISceneNode *getSceneNode();
 
@@ -206,7 +211,7 @@ public:
 			float time_from_last_punch=1000000);
 
 	std::string debugInfoText();
-	
+
 	std::string infoText()
 	{
 		return m_prop.infotext;
diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp
index 6a83bd8..8ce0f1e 100644
--- a/src/content_mapblock.cpp
+++ b/src/content_mapblock.cpp
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <IMeshManipulator.h>
 #include "gamedef.h"
 #include "log.h"
+#include "noise.h"
 
 
 // Create a cuboid.
@@ -171,6 +172,15 @@ static inline void getNeighborConnectingFace(v3s16 p, INodeDefManager *nodedef,
 		*neighbors |= v;
 }
 
+// For use in mapblock_mesh_generate_special
+// X,Y,Z of position must be -1,0,1
+// This expression is a simplification of
+// 3 * 3 * (pos.X + 1) + 3 * (pos.Y + 1) + (pos.Z + 1)
+static inline int NeighborToIndex(const v3s16 &pos)
+{
+	return 9 * pos.X + 3 * pos.Y + pos.Z + 13;
+}
+
 /*
 	TODO: Fix alpha blending for special nodes
 	Currently only the last element rendered is blended correct
@@ -400,9 +410,14 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 
 			// Neighbor liquid levels (key = relative position)
 			// Includes current node
-			std::map<v3s16, f32> neighbor_levels;
-			std::map<v3s16, content_t> neighbor_contents;
-			std::map<v3s16, u8> neighbor_flags;
+
+			struct NeighborData {
+				f32 level;
+				content_t content;
+				u8 flags;
+			};
+			NeighborData neighbor_data_matrix[27];
+
 			const u8 neighborflag_top_is_same_liquid = 0x01;
 			v3s16 neighbor_dirs[9] = {
 				v3s16(0,0,0),
@@ -448,9 +463,12 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 						flags |= neighborflag_top_is_same_liquid;
 				}
 
-				neighbor_levels[neighbor_dirs[i]] = level;
-				neighbor_contents[neighbor_dirs[i]] = content;
-				neighbor_flags[neighbor_dirs[i]] = flags;
+				NeighborData &neighbor_data =
+					neighbor_data_matrix[NeighborToIndex(neighbor_dirs[i])];
+
+				neighbor_data.level = level;
+				neighbor_data.content = content;
+				neighbor_data.flags = flags;
 			}
 
 			// Corner heights (average between four liquids)
@@ -471,10 +489,12 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 				for(u32 j=0; j<4; j++)
 				{
 					v3s16 neighbordir = cornerdir - halfdirs[j];
-					content_t content = neighbor_contents[neighbordir];
+
+					NeighborData &neighbor_data =
+						neighbor_data_matrix[NeighborToIndex(neighbordir)];
+					content_t content = neighbor_data.content;
 					// If top is liquid, draw starting from top of node
-					if(neighbor_flags[neighbordir] &
-							neighborflag_top_is_same_liquid)
+					if (neighbor_data.flags & neighborflag_top_is_same_liquid)
 					{
 						cornerlevel = 0.5*BS;
 						valid_count = 1;
@@ -490,7 +510,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 					// Flowing liquid has level information
 					else if(content == c_flowing)
 					{
-						cornerlevel += neighbor_levels[neighbordir];
+						cornerlevel += neighbor_data.level;
 						valid_count++;
 					}
 					else if(content == CONTENT_AIR)
@@ -525,15 +545,17 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 			{
 				v3s16 dir = side_dirs[i];
 
+				NeighborData& neighbor_data =
+					neighbor_data_matrix[NeighborToIndex(dir)];
 				/*
 					If our topside is liquid and neighbor's topside
 					is liquid, don't draw side face
 				*/
-				if(top_is_same_liquid &&
-						neighbor_flags[dir] & neighborflag_top_is_same_liquid)
+				if (top_is_same_liquid &&
+						neighbor_data.flags & neighborflag_top_is_same_liquid)
 					continue;
 
-				content_t neighbor_content = neighbor_contents[dir];
+				content_t neighbor_content = neighbor_data.content;
 				const ContentFeatures &n_feat = nodedef->get(neighbor_content);
 
 				// Don't draw face if neighbor is blocking the view
@@ -1104,6 +1126,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 		break;}
 		case NDT_PLANTLIKE:
 		{
+			PseudoRandom rng(x<<8 | z | y<<16);
+
 			TileSpec tile = getNodeTileN(n, p, 0, data);
 			tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY;
 
@@ -1111,9 +1135,18 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 			video::SColor c = MapBlock_LightColor(255, l, f.light_source);
 
 			float s = BS / 2 * f.visual_scale;
+			// add sqrt(2) visual scale
+			if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x10) != 0))
+				s *= 1.41421;
+
+			float random_offset_X = .0;
+			float random_offset_Z = .0;
+			if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x8) != 0)) {
+				random_offset_X = BS * ((rng.next() % 16 / 16.0) * 0.29 - 0.145);
+				random_offset_Z = BS * ((rng.next() % 16 / 16.0) * 0.29 - 0.145);
+			}
 
-			for (int j = 0; j < 2; j++)
-			{
+			for (int j = 0; j < 4; j++) {
 				video::S3DVertex vertices[4] =
 				{
 					video::S3DVertex(-s,-BS/2, 0, 0,0,0, c, 0,1),
@@ -1121,28 +1154,146 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 					video::S3DVertex( s,-BS/2 + s*2,0, 0,0,0, c, 1,0),
 					video::S3DVertex(-s,-BS/2 + s*2,0, 0,0,0, c, 0,0),
 				};
+
 				float rotate_degree = 0;
+				u8 p2mesh = 0;
 				if (f.param_type_2 == CPT2_DEGROTATE)
 					rotate_degree = n.param2 * 2;
-
-				if (j == 0) {
-					for(u16 i = 0; i < 4; i++)
-						vertices[i].Pos.rotateXZBy(46 + rotate_degree);
-				} else if (j == 1) {
-					for(u16 i = 0; i < 4; i++)
-						vertices[i].Pos.rotateXZBy(-44 + rotate_degree);
+				if (f.param_type_2 != CPT2_MESHOPTIONS) {
+					if (j == 0) {
+						for (u16 i = 0; i < 4; i++)
+							vertices[i].Pos.rotateXZBy(46 + rotate_degree);
+					} else if (j == 1) {
+						for (u16 i = 0; i < 4; i++)
+							vertices[i].Pos.rotateXZBy(-44 + rotate_degree);
+					}
+				} else {
+					p2mesh = n.param2 & 0x7;
+					switch (p2mesh) {
+					case 0:
+						// x
+						if (j == 0) {
+							for (u16 i = 0; i < 4; i++)
+								vertices[i].Pos.rotateXZBy(46);
+						} else if (j == 1) {
+							for (u16 i = 0; i < 4; i++)
+								vertices[i].Pos.rotateXZBy(-44);
+						}
+						break;
+					case 1:
+						// +
+						if (j == 0) {
+							for (u16 i = 0; i < 4; i++)
+								vertices[i].Pos.rotateXZBy(91);
+						} else if (j == 1) {
+							for (u16 i = 0; i < 4; i++)
+								vertices[i].Pos.rotateXZBy(1);
+						}
+						break;
+					case 2:
+						// *
+						if (j == 0) {
+							for (u16 i = 0; i < 4; i++)
+								vertices[i].Pos.rotateXZBy(121);
+						} else if (j == 1) {
+							for (u16 i = 0; i < 4; i++)
+								vertices[i].Pos.rotateXZBy(241);
+						} else { // (j == 2)
+							for (u16 i = 0; i < 4; i++)
+								vertices[i].Pos.rotateXZBy(1);
+						}
+						break;
+					case 3:
+						// #
+						switch (j) {
+						case 0:
+							for (u16 i = 0; i < 4; i++) {
+								vertices[i].Pos.rotateXZBy(1);
+								vertices[i].Pos.Z += BS / 4;
+							}
+							break;
+						case 1:
+							for (u16 i = 0; i < 4; i++) {
+								vertices[i].Pos.rotateXZBy(91);
+								vertices[i].Pos.X += BS / 4;
+							}
+							break;
+						case 2:
+							for (u16 i = 0; i < 4; i++) {
+								vertices[i].Pos.rotateXZBy(181);
+								vertices[i].Pos.Z -= BS / 4;
+							}
+							break;
+						case 3:
+							for (u16 i = 0; i < 4; i++) {
+								vertices[i].Pos.rotateXZBy(271);
+								vertices[i].Pos.X -= BS / 4;
+							}
+							break;
+						}
+						break;
+					case 4:
+						// outward leaning #-like
+						switch (j) {
+						case 0:
+							for (u16 i = 2; i < 4; i++)
+								vertices[i].Pos.Z -= BS / 2;
+							for (u16 i = 0; i < 4; i++)
+								vertices[i].Pos.rotateXZBy(1);
+							break;
+						case 1:
+							for (u16 i = 2; i < 4; i++)
+								vertices[i].Pos.Z -= BS / 2;
+							for (u16 i = 0; i < 4; i++)
+								vertices[i].Pos.rotateXZBy(91);
+							break;
+						case 2:
+							for (u16 i = 2; i < 4; i++)
+								vertices[i].Pos.Z -= BS / 2;
+							for (u16 i = 0; i < 4; i++)
+								vertices[i].Pos.rotateXZBy(181);
+							break;
+						case 3:
+							for (u16 i = 2; i < 4; i++)
+								vertices[i].Pos.Z -= BS / 2;
+							for (u16 i = 0; i < 4; i++)
+								vertices[i].Pos.rotateXZBy(271);
+							break;
+						}
+						break;
+					}
 				}
 
-				for (int i = 0; i < 4; i++)
-				{
+				for (int i = 0; i < 4; i++) {
 					vertices[i].Pos *= f.visual_scale;
 					vertices[i].Pos.Y += BS/2 * (f.visual_scale - 1);
 					vertices[i].Pos += intToFloat(p, BS);
+					// move to a random spot to avoid moire
+					if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x8) != 0)) {
+						vertices[i].Pos.X += random_offset_X;
+						vertices[i].Pos.Z += random_offset_Z;
+					}
+					// randomly move each face up/down
+					if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x20) != 0)) {
+						PseudoRandom yrng(j | x<<16 | z<<8 | y<<24 );
+						vertices[i].Pos.Y -= BS * ((yrng.next() % 16 / 16.0) * 0.125);
+					}
 				}
 
 				u16 indices[] = {0, 1, 2, 2, 3, 0};
 				// Add to mesh collector
 				collector.append(tile, vertices, 4, indices, 6);
+
+				// stop adding faces for meshes with less than 4 faces
+				if (f.param_type_2 == CPT2_MESHOPTIONS) {
+					if (((p2mesh == 0) || (p2mesh == 1)) && (j == 1))
+						break;
+					else if ((p2mesh == 2) && (j == 2))
+						break;
+				} else if (j == 1) {
+					break;
+				}
+
 			}
 		break;}
 		case NDT_FIRELIKE:
@@ -1376,8 +1527,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 						continue;
 					MapNode n_xy = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x + xz, y + y0, z));
 					MapNode n_zy = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x, y + y0, z + xz));
-					ContentFeatures def_xy = nodedef->get(n_xy);
-					ContentFeatures def_zy = nodedef->get(n_zy);
+					const ContentFeatures &def_xy = nodedef->get(n_xy);
+					const ContentFeatures &def_zy = nodedef->get(n_zy);
 
 					// Check if current node would connect with the rail
 					is_rail_x[index] = ((def_xy.drawtype == NDT_RAILLIKE
diff --git a/src/content_nodemeta.cpp b/src/content_nodemeta.cpp
index 7f4264d..79a32b6 100644
--- a/src/content_nodemeta.cpp
+++ b/src/content_nodemeta.cpp
@@ -186,7 +186,7 @@ void content_nodemeta_deserialize_legacy(std::istream &is,
 		meta->set(p, data);
 
 		if(need_timer)
-			timers->set(p, NodeTimer(1., 0.));
+			timers->set(NodeTimer(1., 0., p));
 	}
 }
 
diff --git a/src/content_sao.cpp b/src/content_sao.cpp
index 53bf315..77ab51a 100644
--- a/src/content_sao.cpp
+++ b/src/content_sao.cpp
@@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "serialization.h" // For compressZlib
 #include "tool.h" // For ToolCapabilities
 #include "gamedef.h"
-#include "player.h"
+#include "remoteplayer.h"
 #include "server.h"
 #include "scripting_game.h"
 #include "genericobject.h"
@@ -118,14 +118,12 @@ LuaEntitySAO proto_LuaEntitySAO(NULL, v3f(0,0,0), "_prototype", "");
 
 LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos,
 		const std::string &name, const std::string &state):
-	ServerActiveObject(env, pos),
+	UnitSAO(env, pos),
 	m_init_name(name),
 	m_init_state(state),
 	m_registered(false),
-	m_hp(-1),
 	m_velocity(0,0,0),
 	m_acceleration(0,0,0),
-	m_yaw(0),
 	m_properties_sent(true),
 	m_last_sent_yaw(0),
 	m_last_sent_position(0,0,0),
@@ -156,6 +154,11 @@ LuaEntitySAO::~LuaEntitySAO()
 	if(m_registered){
 		m_env->getScriptIface()->luaentity_Remove(m_id);
 	}
+
+	for (UNORDERED_SET<u32>::iterator it = m_attached_particle_spawners.begin();
+		it != m_attached_particle_spawners.end(); ++it) {
+		m_env->deleteParticleSpawner(*it, false);
+	}
 }
 
 void LuaEntitySAO::addedToEnvironment(u32 dtime_s)
@@ -175,6 +178,8 @@ void LuaEntitySAO::addedToEnvironment(u32 dtime_s)
 		// Activate entity, supplying serialized state
 		m_env->getScriptIface()->
 			luaentity_Activate(m_id, m_init_state.c_str(), dtime_s);
+	} else {
+		m_prop.infotext = m_init_name;
 	}
 }
 
@@ -345,8 +350,10 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
 
 	if(m_bone_position_sent == false){
 		m_bone_position_sent = true;
-		for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
-			std::string str = gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y);
+		for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+				ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
+			std::string str = gob_cmd_update_bone_position((*ii).first,
+					(*ii).second.X, (*ii).second.Y);
 			// create message and add to list
 			ActiveObjectMessage aom(getId(), true, str);
 			m_messages_out.push(aom);
@@ -376,15 +383,30 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version)
 		writeF1000(os, m_yaw);
 		writeS16(os, m_hp);
 
-		writeU8(os, 4 + m_bone_position.size()); // number of messages stuffed in here
-		os<<serializeLongString(getPropertyPacket()); // message 1
-		os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
-		os<<serializeLongString(gob_cmd_update_animation(
+		std::ostringstream msg_os(std::ios::binary);
+		msg_os << serializeLongString(getPropertyPacket()); // message 1
+		msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
+		msg_os << serializeLongString(gob_cmd_update_animation(
 			m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
-		for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
-			os<<serializeLongString(gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
+		for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+				ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
+			msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first,
+					(*ii).second.X, (*ii).second.Y)); // m_bone_position.size
+		}
+		msg_os << serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id,
+			m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
+		int message_count = 4 + m_bone_position.size();
+		for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin();
+				(ii != m_attachment_child_ids.end()); ++ii) {
+			if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) {
+				message_count++;
+				msg_os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(),
+					obj->getClientInitializationData(protocol_version)));
+			}
 		}
-		os<<serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
+
+		writeU8(os, message_count);
+		os.write(msg_os.str().c_str(), msg_os.str().size());
 	}
 	else
 	{
@@ -492,7 +514,7 @@ void LuaEntitySAO::rightClick(ServerActiveObject *clicker)
 	m_env->getScriptIface()->luaentity_Rightclick(m_id, clicker);
 }
 
-void LuaEntitySAO::setPos(v3f pos)
+void LuaEntitySAO::setPos(const v3f &pos)
 {
 	if(isAttached())
 		return;
@@ -612,7 +634,7 @@ void LuaEntitySAO::removeAttachmentChild(int child_id)
 	m_attachment_child_ids.erase(child_id);
 }
 
-std::set<int> LuaEntitySAO::getAttachmentChildIds()
+UNORDERED_SET<int> LuaEntitySAO::getAttachmentChildIds()
 {
 	return m_attachment_child_ids;
 }
@@ -647,16 +669,6 @@ v3f LuaEntitySAO::getAcceleration()
 	return m_acceleration;
 }
 
-void LuaEntitySAO::setYaw(float yaw)
-{
-	m_yaw = yaw;
-}
-
-float LuaEntitySAO::getYaw()
-{
-	return m_yaw;
-}
-
 void LuaEntitySAO::setTextureMod(const std::string &mod)
 {
 	std::string str = gob_cmd_set_texture_mod(mod);
@@ -745,10 +757,9 @@ bool LuaEntitySAO::collideWithObjects(){
 
 // No prototype, PlayerSAO does not need to be deserialized
 
-PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
-		const std::set<std::string> &privs, bool is_singleplayer):
-	ServerActiveObject(env_, v3f(0,0,0)),
-	m_player(player_),
+PlayerSAO::PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer):
+	UnitSAO(env_, v3f(0,0,0)),
+	m_player(NULL),
 	m_peer_id(peer_id_),
 	m_inventory(NULL),
 	m_damage(0),
@@ -760,7 +771,6 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
 	m_position_not_sent(false),
 	m_armor_groups_sent(false),
 	m_properties_sent(true),
-	m_privs(privs),
 	m_is_singleplayer(is_singleplayer),
 	m_animation_speed(0),
 	m_animation_blend(0),
@@ -769,6 +779,10 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
 	m_bone_position_sent(false),
 	m_attachment_parent_id(0),
 	m_attachment_sent(false),
+	m_breath(PLAYER_MAX_BREATH),
+	m_pitch(0),
+	m_fov(0),
+	m_wanted_range(0),
 	// public
 	m_physics_override_speed(1),
 	m_physics_override_jump(1),
@@ -777,10 +791,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
 	m_physics_override_sneak_glitch(true),
 	m_physics_override_sent(false)
 {
-	assert(m_player);	// pre-condition
 	assert(m_peer_id != 0);	// pre-condition
-	setBasePosition(m_player->getPosition());
-	m_inventory = &m_player->inventory;
 	m_armor_groups["fleshy"] = 100;
 
 	m_prop.hp_max = PLAYER_MAX_HP;
@@ -799,13 +810,21 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
 	// end of default appearance
 	m_prop.is_visible = true;
 	m_prop.makes_footstep_sound = true;
+	m_hp = PLAYER_MAX_HP;
 }
 
 PlayerSAO::~PlayerSAO()
 {
 	if(m_inventory != &m_player->inventory)
 		delete m_inventory;
+}
 
+void PlayerSAO::initialize(RemotePlayer *player, const std::set<std::string> &privs)
+{
+	assert(player);
+	m_player = player;
+	m_privs = privs;
+	m_inventory = &m_player->inventory;
 }
 
 std::string PlayerSAO::getDescription()
@@ -817,22 +836,22 @@ std::string PlayerSAO::getDescription()
 void PlayerSAO::addedToEnvironment(u32 dtime_s)
 {
 	ServerActiveObject::addedToEnvironment(dtime_s);
-	ServerActiveObject::setBasePosition(m_player->getPosition());
+	ServerActiveObject::setBasePosition(m_base_position);
 	m_player->setPlayerSAO(this);
 	m_player->peer_id = m_peer_id;
-	m_last_good_position = m_player->getPosition();
+	m_last_good_position = m_base_position;
 }
 
 // Called before removing from environment
 void PlayerSAO::removingFromEnvironment()
 {
 	ServerActiveObject::removingFromEnvironment();
-	if(m_player->getPlayerSAO() == this)
-	{
-		m_player->setPlayerSAO(NULL);
-		m_player->peer_id = 0;
-		m_env->savePlayer((RemotePlayer*)m_player);
-		m_env->removePlayer(m_player);
+	if (m_player->getPlayerSAO() == this) {
+		unlinkPlayerSessionAndSave();
+		for (UNORDERED_SET<u32>::iterator it = m_attached_particle_spawners.begin();
+			it != m_attached_particle_spawners.end(); ++it) {
+			m_env->deleteParticleSpawner(*it, false);
+		}
 	}
 }
 
@@ -851,31 +870,47 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
 		os<<serializeString(m_player->getName()); // name
 		writeU8(os, 1); // is_player
 		writeS16(os, getId()); //id
-		writeV3F1000(os, m_player->getPosition() + v3f(0,BS*1,0));
-		writeF1000(os, m_player->getYaw());
+		writeV3F1000(os, m_base_position + v3f(0,BS*1,0));
+		writeF1000(os, m_yaw);
 		writeS16(os, getHP());
 
-		writeU8(os, 6 + m_bone_position.size()); // number of messages stuffed in here
-		os<<serializeLongString(getPropertyPacket()); // message 1
-		os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
-		os<<serializeLongString(gob_cmd_update_animation(
+		std::ostringstream msg_os(std::ios::binary);
+		msg_os << serializeLongString(getPropertyPacket()); // message 1
+		msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
+		msg_os << serializeLongString(gob_cmd_update_animation(
 			m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
-		for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
-			os<<serializeLongString(gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
+		for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+				ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
+			msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first,
+				(*ii).second.X, (*ii).second.Y)); // m_bone_position.size
 		}
-		os<<serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
-		os<<serializeLongString(gob_cmd_update_physics_override(m_physics_override_speed,
+		msg_os << serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id,
+			m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
+		msg_os << serializeLongString(gob_cmd_update_physics_override(m_physics_override_speed,
 				m_physics_override_jump, m_physics_override_gravity, m_physics_override_sneak,
 				m_physics_override_sneak_glitch)); // 5
-		os << serializeLongString(gob_cmd_update_nametag_attributes(m_prop.nametag_color)); // 6 (GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES) : Deprecated, for backwards compatibility only.
+		// (GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES) : Deprecated, for backwards compatibility only.
+		msg_os << serializeLongString(gob_cmd_update_nametag_attributes(m_prop.nametag_color)); // 6
+		int message_count = 6 + m_bone_position.size();
+		for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin();
+				ii != m_attachment_child_ids.end(); ++ii) {
+			if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) {
+				message_count++;
+				msg_os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(),
+					obj->getClientInitializationData(protocol_version)));
+			}
+		}
+
+		writeU8(os, message_count);
+		os.write(msg_os.str().c_str(), msg_os.str().size());
 	}
 	else
 	{
 		writeU8(os, 0); // version
 		os<<serializeString(m_player->getName()); // name
 		writeU8(os, 1); // is_player
-		writeV3F1000(os, m_player->getPosition() + v3f(0,BS*1,0));
-		writeF1000(os, m_player->getYaw());
+		writeV3F1000(os, m_base_position + v3f(0,BS*1,0));
+		writeF1000(os, m_yaw);
 		writeS16(os, getHP());
 		writeU8(os, 2); // number of messages stuffed in here
 		os<<serializeLongString(getPropertyPacket()); // message 1
@@ -921,7 +956,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
 		m_attachment_bone = "";
 		m_attachment_position = v3f(0,0,0);
 		m_attachment_rotation = v3f(0,0,0);
-		m_player->setPosition(m_last_good_position);
+		setBasePosition(m_last_good_position);
 		((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
 	}
 
@@ -943,14 +978,13 @@ void PlayerSAO::step(float dtime, bool send_recommended)
 
 	// Each frame, parent position is copied if the object is attached, otherwise it's calculated normally
 	// If the object gets detached this comes into effect automatically from the last known origin
-	if(isAttached())
-	{
+	if (isAttached()) {
 		v3f pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition();
 		m_last_good_position = pos;
-		m_player->setPosition(pos);
+		setBasePosition(pos);
 	}
 
-	if(send_recommended == false)
+	if (!send_recommended)
 		return;
 
 	// If the object is attached client-side, don't waste bandwidth sending its position to clients
@@ -962,12 +996,12 @@ void PlayerSAO::step(float dtime, bool send_recommended)
 		if(isAttached()) // Just in case we ever do send attachment position too
 			pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition();
 		else
-			pos = m_player->getPosition() + v3f(0,BS*1,0);
+			pos = m_base_position + v3f(0,BS*1,0);
 		std::string str = gob_cmd_update_position(
 			pos,
 			v3f(0,0,0),
 			v3f(0,0,0),
-			m_player->getYaw(),
+			m_yaw,
 			true,
 			false,
 			update_interval
@@ -977,7 +1011,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
 		m_messages_out.push(aom);
 	}
 
-	if(m_armor_groups_sent == false) {
+	if (!m_armor_groups_sent) {
 		m_armor_groups_sent = true;
 		std::string str = gob_cmd_update_armor_groups(
 				m_armor_groups);
@@ -986,7 +1020,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
 		m_messages_out.push(aom);
 	}
 
-	if(m_physics_override_sent == false){
+	if (!m_physics_override_sent) {
 		m_physics_override_sent = true;
 		std::string str = gob_cmd_update_physics_override(m_physics_override_speed,
 				m_physics_override_jump, m_physics_override_gravity,
@@ -996,7 +1030,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
 		m_messages_out.push(aom);
 	}
 
-	if(m_animation_sent == false){
+	if (!m_animation_sent) {
 		m_animation_sent = true;
 		std::string str = gob_cmd_update_animation(
 			m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop);
@@ -1005,19 +1039,22 @@ void PlayerSAO::step(float dtime, bool send_recommended)
 		m_messages_out.push(aom);
 	}
 
-	if(m_bone_position_sent == false){
+	if (!m_bone_position_sent) {
 		m_bone_position_sent = true;
-		for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
-			std::string str = gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y);
+		for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+				ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
+			std::string str = gob_cmd_update_bone_position((*ii).first,
+					(*ii).second.X, (*ii).second.Y);
 			// create message and add to list
 			ActiveObjectMessage aom(getId(), true, str);
 			m_messages_out.push(aom);
 		}
 	}
 
-	if(m_attachment_sent == false){
+	if (!m_attachment_sent){
 		m_attachment_sent = true;
-		std::string str = gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation);
+		std::string str = gob_cmd_update_attachment(m_attachment_parent_id,
+				m_attachment_bone, m_attachment_position, m_attachment_rotation);
 		// create message and add to list
 		ActiveObjectMessage aom(getId(), true, str);
 		m_messages_out.push(aom);
@@ -1026,16 +1063,20 @@ void PlayerSAO::step(float dtime, bool send_recommended)
 
 void PlayerSAO::setBasePosition(const v3f &position)
 {
+	if (m_player && position != m_base_position)
+		m_player->setDirty(true);
+
 	// This needs to be ran for attachments too
 	ServerActiveObject::setBasePosition(position);
 	m_position_not_sent = true;
 }
 
-void PlayerSAO::setPos(v3f pos)
+void PlayerSAO::setPos(const v3f &pos)
 {
 	if(isAttached())
 		return;
-	m_player->setPosition(pos);
+
+	setBasePosition(pos);
 	// Movement caused by this command is always valid
 	m_last_good_position = pos;
 	((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
@@ -1045,21 +1086,54 @@ void PlayerSAO::moveTo(v3f pos, bool continuous)
 {
 	if(isAttached())
 		return;
-	m_player->setPosition(pos);
+
+	setBasePosition(pos);
 	// Movement caused by this command is always valid
 	m_last_good_position = pos;
 	((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
 }
 
-void PlayerSAO::setYaw(float yaw)
+void PlayerSAO::setYaw(const float yaw)
+{
+	if (m_player && yaw != m_yaw)
+		m_player->setDirty(true);
+
+	UnitSAO::setYaw(yaw);
+}
+
+void PlayerSAO::setFov(const float fov)
+{
+	if (m_player && fov != m_fov)
+		m_player->setDirty(true);
+
+	m_fov = fov;
+}
+
+void PlayerSAO::setWantedRange(const s16 range)
+{
+	if (m_player && range != m_wanted_range)
+		m_player->setDirty(true);
+
+	m_wanted_range = range;
+}
+
+void PlayerSAO::setYawAndSend(const float yaw)
 {
-	m_player->setYaw(yaw);
+	setYaw(yaw);
 	((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
 }
 
-void PlayerSAO::setPitch(float pitch)
+void PlayerSAO::setPitch(const float pitch)
+{
+	if (m_player && pitch != m_pitch)
+		m_player->setDirty(true);
+
+	m_pitch = pitch;
+}
+
+void PlayerSAO::setPitchAndSend(const float pitch)
 {
-	m_player->setPitch(pitch);
+	setPitch(pitch);
 	((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
 }
 
@@ -1124,15 +1198,10 @@ int PlayerSAO::punch(v3f dir,
 	return hitparams.wear;
 }
 
-void PlayerSAO::rightClick(ServerActiveObject *clicker)
+void PlayerSAO::rightClick(ServerActiveObject *)
 {
 }
 
-s16 PlayerSAO::getHP() const
-{
-	return m_player->hp;
-}
-
 s16 PlayerSAO::readDamage()
 {
 	s16 damage = m_damage;
@@ -1142,10 +1211,9 @@ s16 PlayerSAO::readDamage()
 
 void PlayerSAO::setHP(s16 hp)
 {
-	s16 oldhp = m_player->hp;
+	s16 oldhp = m_hp;
 
-	s16 hp_change = m_env->getScriptIface()->on_player_hpchange(this,
-		hp - oldhp);
+	s16 hp_change = m_env->getScriptIface()->on_player_hpchange(this, hp - oldhp);
 	if (hp_change == 0)
 		return;
 	hp = oldhp + hp_change;
@@ -1155,11 +1223,11 @@ void PlayerSAO::setHP(s16 hp)
 	else if (hp > PLAYER_MAX_HP)
 		hp = PLAYER_MAX_HP;
 
-	if(hp < oldhp && g_settings->getBool("enable_damage") == false) {
+	if (hp < oldhp && !g_settings->getBool("enable_damage")) {
 		return;
 	}
 
-	m_player->hp = hp;
+	m_hp = hp;
 
 	if (oldhp > hp)
 		m_damage += (oldhp - hp);
@@ -1169,14 +1237,12 @@ void PlayerSAO::setHP(s16 hp)
 		m_properties_sent = false;
 }
 
-u16 PlayerSAO::getBreath() const
+void PlayerSAO::setBreath(const u16 breath)
 {
-	return m_player->getBreath();
-}
+	if (m_player && breath != m_breath)
+		m_player->setDirty(true);
 
-void PlayerSAO::setBreath(u16 breath)
-{
-	m_player->setBreath(breath);
+	m_breath = breath;
 }
 
 void PlayerSAO::setArmorGroups(const ItemGroupList &armor_groups)
@@ -1257,7 +1323,7 @@ void PlayerSAO::removeAttachmentChild(int child_id)
 	m_attachment_child_ids.erase(child_id);
 }
 
-std::set<int> PlayerSAO::getAttachmentChildIds()
+UNORDERED_SET<int> PlayerSAO::getAttachmentChildIds()
 {
 	return m_attachment_child_ids;
 }
@@ -1293,6 +1359,42 @@ std::string PlayerSAO::getWieldList() const
 	return "main";
 }
 
+ItemStack PlayerSAO::getWieldedItem() const
+{
+	const Inventory *inv = getInventory();
+	ItemStack ret;
+	const InventoryList *mlist = inv->getList(getWieldList());
+	if (mlist && getWieldIndex() < (s32)mlist->getSize())
+		ret = mlist->getItem(getWieldIndex());
+	if (ret.name.empty()) {
+		const InventoryList *hlist = inv->getList("hand");
+		if (hlist)
+			ret = hlist->getItem(0);
+	}
+	return ret;
+}
+
+bool PlayerSAO::setWieldedItem(const ItemStack &item)
+{
+	Inventory *inv = getInventory();
+	if (inv) {
+		InventoryList *mlist = inv->getList(getWieldList());
+		if (mlist) {
+			ItemStack olditem = mlist->getItem(getWieldIndex());
+			if (olditem.name.empty()) {
+				InventoryList *hlist = inv->getList("hand");
+				if (hlist) {
+					hlist->changeItem(0, item);
+					return true;
+				}
+			}
+			mlist->changeItem(getWieldIndex(), item);
+			return true;
+		}
+	}
+	return false;
+}
+
 int PlayerSAO::getWieldIndex() const
 {
 	return m_wield_index;
@@ -1305,15 +1407,20 @@ void PlayerSAO::setWieldIndex(int i)
 	}
 }
 
+// Erase the peer id and make the object for removal
 void PlayerSAO::disconnected()
 {
 	m_peer_id = 0;
 	m_removed = true;
-	if(m_player->getPlayerSAO() == this)
-	{
-		m_player->setPlayerSAO(NULL);
-		m_player->peer_id = 0;
-	}
+}
+
+void PlayerSAO::unlinkPlayerSessionAndSave()
+{
+	assert(m_player->getPlayerSAO() == this);
+	m_player->peer_id = 0;
+	m_env->savePlayer(m_player);
+	m_player->setPlayerSAO(NULL);
+	m_env->removePlayer(m_player);
 }
 
 std::string PlayerSAO::getPropertyPacket()
@@ -1324,66 +1431,65 @@ std::string PlayerSAO::getPropertyPacket()
 
 bool PlayerSAO::checkMovementCheat()
 {
+	if (isAttached() || m_is_singleplayer ||
+			g_settings->getBool("disable_anticheat")) {
+		m_last_good_position = m_base_position;
+		return false;
+	}
+
 	bool cheated = false;
-	if(isAttached() || m_is_singleplayer ||
-			g_settings->getBool("disable_anticheat"))
-	{
-		m_last_good_position = m_player->getPosition();
+	/*
+		Check player movements
+
+		NOTE: Actually the server should handle player physics like the
+		client does and compare player's position to what is calculated
+		on our side. This is required when eg. players fly due to an
+		explosion. Altough a node-based alternative might be possible
+		too, and much more lightweight.
+	*/
+
+	float player_max_speed = 0;
+
+	if (m_privs.count("fast") != 0) {
+		// Fast speed
+		player_max_speed = m_player->movement_speed_fast * m_physics_override_speed;
+	} else {
+		// Normal speed
+		player_max_speed = m_player->movement_speed_walk * m_physics_override_speed;
 	}
-	else
-	{
-		/*
-			Check player movements
-
-			NOTE: Actually the server should handle player physics like the
-			client does and compare player's position to what is calculated
-			on our side. This is required when eg. players fly due to an
-			explosion. Altough a node-based alternative might be possible
-			too, and much more lightweight.
-		*/
-
-		float player_max_speed = 0;
-		if(m_privs.count("fast") != 0){
-			// Fast speed
-			player_max_speed = m_player->movement_speed_fast;
-		} else {
-			// Normal speed
-			player_max_speed = m_player->movement_speed_walk;
-		}
-		// Tolerance. With the lag pool we shouldn't need it.
-		//player_max_speed *= 2.5;
-		//player_max_speed_up *= 2.5;
-
-		v3f diff = (m_player->getPosition() - m_last_good_position);
-		float d_vert = diff.Y;
-		diff.Y = 0;
-		float d_horiz = diff.getLength();
-		float required_time = d_horiz/player_max_speed;
-		if(d_vert > 0 && d_vert/player_max_speed > required_time)
-			required_time = d_vert/player_max_speed;
-		if(m_move_pool.grab(required_time)){
-			m_last_good_position = m_player->getPosition();
-		} else {
-			actionstream<<"Player "<<m_player->getName()
-					<<" moved too fast; resetting position"
-					<<std::endl;
-			m_player->setPosition(m_last_good_position);
-			cheated = true;
-		}
+	// Tolerance. The lag pool does this a bit.
+	//player_max_speed *= 2.5;
+
+	v3f diff = (m_base_position - m_last_good_position);
+	float d_vert = diff.Y;
+	diff.Y = 0;
+	float d_horiz = diff.getLength();
+	float required_time = d_horiz / player_max_speed;
+
+	if (d_vert > 0 && d_vert / player_max_speed > required_time)
+		required_time = d_vert / player_max_speed; // Moving upwards
+
+	if (m_move_pool.grab(required_time)) {
+		m_last_good_position = m_base_position;
+	} else {
+		actionstream << "Player " << m_player->getName()
+				<< " moved too fast; resetting position"
+				<< std::endl;
+		setBasePosition(m_last_good_position);
+		cheated = true;
 	}
 	return cheated;
 }
 
-bool PlayerSAO::getCollisionBox(aabb3f *toset) {
-	//update collision box
-	*toset = m_player->getCollisionbox();
-
+bool PlayerSAO::getCollisionBox(aabb3f *toset)
+{
+	*toset = aabb3f(-BS * 0.30, 0.0, -BS * 0.30, BS * 0.30, BS * 1.75, BS * 0.30);
 	toset->MinEdge += m_base_position;
 	toset->MaxEdge += m_base_position;
-
 	return true;
 }
 
-bool PlayerSAO::collideWithObjects(){
+bool PlayerSAO::collideWithObjects()
+{
 	return true;
 }
diff --git a/src/content_sao.h b/src/content_sao.h
index 44d40d3..8625518 100644
--- a/src/content_sao.h
+++ b/src/content_sao.h
@@ -22,14 +22,36 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "serverobject.h"
 #include "itemgroup.h"
-#include "player.h"
 #include "object_properties.h"
+#include "constants.h"
+
+class UnitSAO: public ServerActiveObject
+{
+public:
+	UnitSAO(ServerEnvironment *env, v3f pos):
+			ServerActiveObject(env, pos),
+			m_hp(-1), m_yaw(0) {}
+	virtual ~UnitSAO() {}
+
+	virtual void setYaw(const float yaw) { m_yaw = yaw; }
+	float getYaw() const { return m_yaw; };
+	f32 getRadYaw() const { return m_yaw * core::DEGTORAD; }
+	// Deprecated
+	f32 getRadYawDep() const { return (m_yaw + 90.) * core::DEGTORAD; }
+
+	s16 getHP() const { return m_hp; }
+	// Use a function, if isDead can be defined by other conditions
+	bool isDead() const { return m_hp == 0; }
+protected:
+	s16 m_hp;
+	float m_yaw;
+};
 
 /*
 	LuaEntitySAO needs some internals exposed.
 */
 
-class LuaEntitySAO : public ServerActiveObject
+class LuaEntitySAO : public UnitSAO
 {
 public:
 	LuaEntitySAO(ServerEnvironment *env, v3f pos,
@@ -51,7 +73,7 @@ public:
 			ServerActiveObject *puncher=NULL,
 			float time_from_last_punch=1000000);
 	void rightClick(ServerActiveObject *clicker);
-	void setPos(v3f pos);
+	void setPos(const v3f &pos);
 	void moveTo(v3f pos, bool continuous);
 	float getMinimumSavedMovement();
 	std::string getDescription();
@@ -67,7 +89,7 @@ public:
 	void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation);
 	void addAttachmentChild(int child_id);
 	void removeAttachmentChild(int child_id);
-	std::set<int> getAttachmentChildIds();
+	UNORDERED_SET<int> getAttachmentChildIds();
 	ObjectProperties* accessObjectProperties();
 	void notifyObjectPropertiesModified();
 	/* LuaEntitySAO-specific */
@@ -75,8 +97,7 @@ public:
 	v3f getVelocity();
 	void setAcceleration(v3f acceleration);
 	v3f getAcceleration();
-	void setYaw(float yaw);
-	float getYaw();
+
 	void setTextureMod(const std::string &mod);
 	void setSprite(v2s16 p, int num_frames, float framelength,
 			bool select_horiz_by_yawpitch);
@@ -92,10 +113,9 @@ private:
 	bool m_registered;
 	struct ObjectProperties m_prop;
 
-	s16 m_hp;
 	v3f m_velocity;
 	v3f m_acceleration;
-	float m_yaw;
+
 	ItemGroupList m_armor_groups;
 
 	bool m_properties_sent;
@@ -112,11 +132,11 @@ private:
 	bool m_animation_loop;
 	bool m_animation_sent;
 
-	std::map<std::string, core::vector2d<v3f> > m_bone_position;
+	UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position;
 	bool m_bone_position_sent;
 
 	int m_attachment_parent_id;
-	std::set<int> m_attachment_child_ids;
+	UNORDERED_SET<int> m_attachment_child_ids;
 	std::string m_attachment_bone;
 	v3f m_attachment_position;
 	v3f m_attachment_rotation;
@@ -157,11 +177,12 @@ public:
 	}
 };
 
-class PlayerSAO : public ServerActiveObject
+class RemotePlayer;
+
+class PlayerSAO : public UnitSAO
 {
 public:
-	PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
-			const std::set<std::string> &privs, bool is_singleplayer);
+	PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer);
 	~PlayerSAO();
 	ActiveObjectType getType() const
 	{ return ACTIVEOBJECT_TYPE_PLAYER; }
@@ -181,10 +202,22 @@ public:
 	bool isAttached();
 	void step(float dtime, bool send_recommended);
 	void setBasePosition(const v3f &position);
-	void setPos(v3f pos);
+	void setPos(const v3f &pos);
 	void moveTo(v3f pos, bool continuous);
-	void setYaw(float);
-	void setPitch(float);
+	void setYaw(const float yaw);
+	// Data should not be sent at player initialization
+	void setYawAndSend(const float yaw);
+	void setPitch(const float pitch);
+	// Data should not be sent at player initialization
+	void setPitchAndSend(const float pitch);
+	f32 getPitch() const { return m_pitch; }
+	f32 getRadPitch() const { return m_pitch * core::DEGTORAD; }
+	// Deprecated
+	f32 getRadPitchDep() const { return -1.0 * m_pitch * core::DEGTORAD; }
+	void setFov(const float pitch);
+	f32 getFov() const { return m_fov; }
+	void setWantedRange(const s16 range);
+	s16 getWantedRange() const { return m_wanted_range; }
 
 	/*
 		Interaction interface
@@ -195,11 +228,11 @@ public:
 		ServerActiveObject *puncher,
 		float time_from_last_punch);
 	void rightClick(ServerActiveObject *clicker);
-	s16 getHP() const;
 	void setHP(s16 hp);
+	void setHPRaw(s16 hp) { m_hp = hp; }
 	s16 readDamage();
-	u16 getBreath() const;
-	void setBreath(u16 breath);
+	u16 getBreath() const { return m_breath; }
+	void setBreath(const u16 breath);
 	void setArmorGroups(const ItemGroupList &armor_groups);
 	ItemGroupList getArmorGroups();
 	void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop);
@@ -210,7 +243,7 @@ public:
 	void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation);
 	void addAttachmentChild(int child_id);
 	void removeAttachmentChild(int child_id);
-	std::set<int> getAttachmentChildIds();
+	UNORDERED_SET<int> getAttachmentChildIds();
 	ObjectProperties* accessObjectProperties();
 	void notifyObjectPropertiesModified();
 
@@ -222,6 +255,8 @@ public:
 	const Inventory* getInventory() const;
 	InventoryLocation getInventoryLocation() const;
 	std::string getWieldList() const;
+	ItemStack getWieldedItem() const;
+	bool setWieldedItem(const ItemStack &item);
 	int getWieldIndex() const;
 	void setWieldIndex(int i);
 
@@ -231,14 +266,8 @@ public:
 
 	void disconnected();
 
-	Player* getPlayer()
-	{
-		return m_player;
-	}
-	u16 getPeerID() const
-	{
-		return m_peer_id;
-	}
+	RemotePlayer *getPlayer() { return m_player; }
+	u16 getPeerID() const { return m_peer_id; }
 
 	// Cheat prevention
 
@@ -288,10 +317,16 @@ public:
 	bool getCollisionBox(aabb3f *toset);
 	bool collideWithObjects();
 
+	void initialize(RemotePlayer *player, const std::set<std::string> &privs);
+
+	v3f getEyePosition() const { return m_base_position + getEyeOffset(); }
+	v3f getEyeOffset() const { return v3f(0, BS * 1.625f, 0); }
+
 private:
 	std::string getPropertyPacket();
+	void unlinkPlayerSessionAndSave();
 
-	Player *m_player;
+	RemotePlayer *m_player;
 	u16 m_peer_id;
 	Inventory *m_inventory;
 	s16 m_damage;
@@ -321,17 +356,20 @@ private:
 	bool m_animation_loop;
 	bool m_animation_sent;
 
-	std::map<std::string, core::vector2d<v3f> > m_bone_position; // Stores position and rotation for each bone name
+	// Stores position and rotation for each bone name
+	UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position;
 	bool m_bone_position_sent;
 
 	int m_attachment_parent_id;
-	std::set<int> m_attachment_child_ids;
+	UNORDERED_SET<int> m_attachment_child_ids;
 	std::string m_attachment_bone;
 	v3f m_attachment_position;
 	v3f m_attachment_rotation;
 	bool m_attachment_sent;
-
-
+	u16 m_breath;
+	f32 m_pitch;
+	f32 m_fov;
+	s16 m_wanted_range;
 public:
 	float m_physics_override_speed;
 	float m_physics_override_jump;
diff --git a/src/convert_json.h b/src/convert_json.h
index 6732fcf..55321af 100644
--- a/src/convert_json.h
+++ b/src/convert_json.h
@@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #ifndef __CONVERT_JSON_H__
 #define __CONVERT_JSON_H__
 
-#include "json/json.h"
+#include <json/json.h>
 
 struct ModStoreMod;
 struct ModStoreModDetails;
diff --git a/src/craftdef.cpp b/src/craftdef.cpp
index d3f1eda..45d3018 100644
--- a/src/craftdef.cpp
+++ b/src/craftdef.cpp
@@ -960,6 +960,96 @@ public:
 
 		return recipes;
 	}
+
+	virtual bool clearCraftRecipesByOutput(const CraftOutput &output, IGameDef *gamedef)
+	{
+		std::map<std::string, std::vector<CraftDefinition*> >::iterator vec_iter =
+			m_output_craft_definitions.find(output.item);
+
+		if (vec_iter == m_output_craft_definitions.end())
+			return false;
+
+		std::vector<CraftDefinition*> &vec = vec_iter->second;
+		for (std::vector<CraftDefinition*>::iterator i = vec.begin();
+				i != vec.end(); ++i) {
+			CraftDefinition *def = *i;
+			// Recipes are not yet hashed at this point
+			std::vector<CraftDefinition*> &unhashed_inputs_vec = m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0];
+			std::vector<CraftDefinition*> new_vec_by_input;
+			/* We will preallocate necessary memory addresses, so we don't need to reallocate them later.
+				This would save us some performance. */
+			new_vec_by_input.reserve(unhashed_inputs_vec.size());
+			for (std::vector<CraftDefinition*>::iterator i2 = unhashed_inputs_vec.begin();
+					i2 != unhashed_inputs_vec.end(); ++i2) {
+				if (def != *i2) {
+					new_vec_by_input.push_back(*i2);
+				}
+			}
+			m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0].swap(new_vec_by_input);
+		}
+		m_output_craft_definitions.erase(output.item);
+		return true;
+	}
+
+	virtual bool clearCraftRecipesByInput(CraftMethod craft_method, unsigned int craft_grid_width,
+		const std::vector<std::string> &recipe, IGameDef *gamedef)
+	{
+		bool all_empty = true;
+		for (std::vector<std::string>::size_type i = 0;
+				i < recipe.size(); i++) {
+			if (!recipe[i].empty()) {
+				all_empty = false;
+				break;
+			}
+		}
+		if (all_empty)
+			return false;
+
+		CraftInput input(craft_method, craft_grid_width, craftGetItems(recipe, gamedef));
+		// Recipes are not yet hashed at this point
+		std::vector<CraftDefinition*> &unhashed_inputs_vec = m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0];
+		std::vector<CraftDefinition*> new_vec_by_input;
+		bool got_hit = false;
+		for (std::vector<CraftDefinition*>::size_type
+				i = unhashed_inputs_vec.size(); i > 0; i--) {
+			CraftDefinition *def = unhashed_inputs_vec[i - 1];
+			/* If the input doesn't match the recipe definition, this recipe definition later
+				will be added back in source map. */
+			if (!def->check(input, gamedef)) {
+				new_vec_by_input.push_back(def);
+				continue;
+			}
+			CraftOutput output = def->getOutput(input, gamedef);
+			got_hit = true;
+			std::map<std::string, std::vector<CraftDefinition*> >::iterator
+				vec_iter = m_output_craft_definitions.find(output.item);
+			if (vec_iter == m_output_craft_definitions.end())
+				continue;
+			std::vector<CraftDefinition*> &vec = vec_iter->second;
+			std::vector<CraftDefinition*> new_vec_by_output;
+			/* We will preallocate necessary memory addresses, so we don't need
+				to reallocate them later. This would save us some performance. */
+			new_vec_by_output.reserve(vec.size());
+			for (std::vector<CraftDefinition*>::iterator i = vec.begin();
+					i != vec.end(); ++i) {
+				/* If pointers from map by input and output are not same,
+					we will add 'CraftDefinition*' to a new vector. */
+				if (def != *i) {
+					/* Adding dereferenced iterator value (which are
+						'CraftDefinition' reference) to a new vector. */
+					new_vec_by_output.push_back(*i);
+				}
+			}
+			// Swaps assigned to current key value with new vector for output map.
+			m_output_craft_definitions[output.item].swap(new_vec_by_output);
+		}
+		if (got_hit)
+			// Swaps value with new vector for input map.
+			m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0].swap(new_vec_by_input);
+
+		return got_hit;
+	}
+
 	virtual std::string dump() const
 	{
 		std::ostringstream os(std::ios::binary);
diff --git a/src/craftdef.h b/src/craftdef.h
index cebb2d7..695ee0c 100644
--- a/src/craftdef.h
+++ b/src/craftdef.h
@@ -426,6 +426,10 @@ public:
 	virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
 			IGameDef *gamedef, unsigned limit=0) const=0;
 
+	virtual bool clearCraftRecipesByOutput(const CraftOutput &output, IGameDef *gamedef) = 0;
+	virtual bool clearCraftRecipesByInput(CraftMethod craft_method,
+			unsigned int craft_grid_width, const std::vector<std::string> &recipe, IGameDef *gamedef) = 0;
+
 	// Print crafting recipes for debugging
 	virtual std::string dump() const=0;
 
diff --git a/src/database-dummy.cpp b/src/database-dummy.cpp
index b38db1f..ef2148f 100644
--- a/src/database-dummy.cpp
+++ b/src/database-dummy.cpp
@@ -30,13 +30,16 @@ bool Database_Dummy::saveBlock(const v3s16 &pos, const std::string &data)
 	return true;
 }
 
-std::string Database_Dummy::loadBlock(const v3s16 &pos)
+void Database_Dummy::loadBlock(const v3s16 &pos, std::string *block)
 {
 	s64 i = getBlockAsInteger(pos);
 	std::map<s64, std::string>::iterator it = m_database.find(i);
-	if (it == m_database.end())
-		return "";
-	return it->second;
+	if (it == m_database.end()) {
+		*block = "";
+		return;
+	}
+
+	*block = it->second;
 }
 
 bool Database_Dummy::deleteBlock(const v3s16 &pos)
diff --git a/src/database-dummy.h b/src/database-dummy.h
index 0cf5692..72100ed 100644
--- a/src/database-dummy.h
+++ b/src/database-dummy.h
@@ -28,10 +28,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 class Database_Dummy : public Database
 {
 public:
-	virtual bool saveBlock(const v3s16 &pos, const std::string &data);
-	virtual std::string loadBlock(const v3s16 &pos);
-	virtual bool deleteBlock(const v3s16 &pos);
-	virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);
+	bool saveBlock(const v3s16 &pos, const std::string &data);
+	void loadBlock(const v3s16 &pos, std::string *block);
+	bool deleteBlock(const v3s16 &pos);
+	void listAllLoadableBlocks(std::vector<v3s16> &dst);
 
 private:
 	std::map<s64, std::string> m_database;
diff --git a/src/database-leveldb.cpp b/src/database-leveldb.cpp
index acd0fd1..4a4904c 100644
--- a/src/database-leveldb.cpp
+++ b/src/database-leveldb.cpp
@@ -33,7 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #define ENSURE_STATUS_OK(s) \
 	if (!(s).ok()) { \
-		throw FileNotGoodException(std::string("LevelDB error: ") + \
+		throw DatabaseException(std::string("LevelDB error: ") + \
 				(s).ToString()); \
 	}
 
@@ -65,16 +65,13 @@ bool Database_LevelDB::saveBlock(const v3s16 &pos, const std::string &data)
 	return true;
 }
 
-std::string Database_LevelDB::loadBlock(const v3s16 &pos)
+void Database_LevelDB::loadBlock(const v3s16 &pos, std::string *block)
 {
 	std::string datastr;
 	leveldb::Status status = m_database->Get(leveldb::ReadOptions(),
 		i64tos(getBlockAsInteger(pos)), &datastr);
 
-	if(status.ok())
-		return datastr;
-	else
-		return "";
+	*block = (status.ok()) ? datastr : "";
 }
 
 bool Database_LevelDB::deleteBlock(const v3s16 &pos)
diff --git a/src/database-leveldb.h b/src/database-leveldb.h
index 4afe2fd..3993db0 100644
--- a/src/database-leveldb.h
+++ b/src/database-leveldb.h
@@ -34,10 +34,10 @@ public:
 	Database_LevelDB(const std::string &savedir);
 	~Database_LevelDB();
 
-	virtual bool saveBlock(const v3s16 &pos, const std::string &data);
-	virtual std::string loadBlock(const v3s16 &pos);
-	virtual bool deleteBlock(const v3s16 &pos);
-	virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);
+	bool saveBlock(const v3s16 &pos, const std::string &data);
+	void loadBlock(const v3s16 &pos, std::string *block);
+	bool deleteBlock(const v3s16 &pos);
+	void listAllLoadableBlocks(std::vector<v3s16> &dst);
 
 private:
 	leveldb::DB *m_database;
diff --git a/src/database-postgresql.cpp b/src/database-postgresql.cpp
new file mode 100644
index 0000000..3b6b42a
--- /dev/null
+++ b/src/database-postgresql.cpp
@@ -0,0 +1,286 @@
+/*
+Copyright (C) 2016 Loic Blot <loic.blot at unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "config.h"
+
+#if USE_POSTGRESQL
+
+#include "database-postgresql.h"
+
+#ifdef _WIN32
+        #ifndef WIN32_LEAN_AND_MEAN
+                #define WIN32_LEAN_AND_MEAN
+        #endif
+        // Without this some of the network functions are not found on mingw
+        #ifndef _WIN32_WINNT
+                #define _WIN32_WINNT 0x0501
+        #endif
+        #include <windows.h>
+        #include <winsock2.h>
+#else
+#include <netinet/in.h>
+#endif
+
+#include "log.h"
+#include "exceptions.h"
+#include "settings.h"
+
+Database_PostgreSQL::Database_PostgreSQL(const Settings &conf) :
+	m_connect_string(""),
+	m_conn(NULL),
+	m_pgversion(0)
+{
+	if (!conf.getNoEx("pgsql_connection", m_connect_string)) {
+		throw SettingNotFoundException(
+			"Set pgsql_connection string in world.mt to "
+			"use the postgresql backend\n"
+			"Notes:\n"
+			"pgsql_connection has the following form: \n"
+			"\tpgsql_connection = host=127.0.0.1 port=5432 user=mt_user "
+			"password=mt_password dbname=minetest_world\n"
+			"mt_user should have CREATE TABLE, INSERT, SELECT, UPDATE and "
+			"DELETE rights on the database.\n"
+			"Don't create mt_user as a SUPERUSER!");
+	}
+
+	connectToDatabase();
+}
+
+Database_PostgreSQL::~Database_PostgreSQL()
+{
+	PQfinish(m_conn);
+}
+
+void Database_PostgreSQL::connectToDatabase()
+{
+	m_conn = PQconnectdb(m_connect_string.c_str());
+
+	if (PQstatus(m_conn) != CONNECTION_OK) {
+		throw DatabaseException(std::string(
+			"PostgreSQL database error: ") +
+			PQerrorMessage(m_conn));
+	}
+
+	m_pgversion = PQserverVersion(m_conn);
+
+	/*
+	* We are using UPSERT feature from PostgreSQL 9.5
+	* to have the better performance,
+	* set the minimum version to 90500
+	*/
+	if (m_pgversion < 90500) {
+		throw DatabaseException("PostgreSQL database error: "
+			"Server version 9.5 or greater required.");
+	}
+
+	infostream << "PostgreSQL Database: Version " << m_pgversion
+			<< " Connection made." << std::endl;
+
+	createDatabase();
+	initStatements();
+}
+
+void Database_PostgreSQL::verifyDatabase()
+{
+	if (PQstatus(m_conn) == CONNECTION_OK)
+		return;
+
+	PQreset(m_conn);
+	ping();
+}
+
+void Database_PostgreSQL::ping()
+{
+	if (PQping(m_connect_string.c_str()) != PQPING_OK) {
+		throw DatabaseException(std::string(
+			"PostgreSQL database error: ") +
+			PQerrorMessage(m_conn));
+	}
+}
+
+bool Database_PostgreSQL::initialized() const
+{
+	return (PQstatus(m_conn) == CONNECTION_OK);
+}
+
+void Database_PostgreSQL::initStatements()
+{
+	prepareStatement("read_block",
+			"SELECT data FROM blocks "
+			"WHERE posX = $1::int4 AND posY = $2::int4 AND "
+			"posZ = $3::int4");
+
+	prepareStatement("write_block",
+			"INSERT INTO blocks (posX, posY, posZ, data) VALUES "
+			"($1::int4, $2::int4, $3::int4, $4::bytea) "
+			"ON CONFLICT ON CONSTRAINT blocks_pkey DO "
+			"UPDATE SET data = $4::bytea");
+
+	prepareStatement("delete_block", "DELETE FROM blocks WHERE "
+			"posX = $1::int4 AND posY = $2::int4 AND posZ = $3::int4");
+
+	prepareStatement("list_all_loadable_blocks",
+			"SELECT posX, posY, posZ FROM blocks");
+}
+
+PGresult *Database_PostgreSQL::checkResults(PGresult *result, bool clear)
+{
+	ExecStatusType statusType = PQresultStatus(result);
+
+	switch (statusType) {
+	case PGRES_COMMAND_OK:
+	case PGRES_TUPLES_OK:
+		break;
+	case PGRES_FATAL_ERROR:
+	default:
+		throw DatabaseException(
+			std::string("PostgreSQL database error: ") +
+			PQresultErrorMessage(result));
+	}
+
+	if (clear)
+		PQclear(result);
+
+	return result;
+}
+
+void Database_PostgreSQL::createDatabase()
+{
+	PGresult *result = checkResults(PQexec(m_conn,
+		"SELECT relname FROM pg_class WHERE relname='blocks';"),
+		false);
+
+	// If table doesn't exist, create it
+	if (!PQntuples(result)) {
+		static const char* dbcreate_sql = "CREATE TABLE blocks ("
+			"posX INT NOT NULL,"
+			"posY INT NOT NULL,"
+			"posZ INT NOT NULL,"
+			"data BYTEA,"
+			"PRIMARY KEY (posX,posY,posZ)"
+		");";
+		checkResults(PQexec(m_conn, dbcreate_sql));
+	}
+
+	PQclear(result);
+
+	infostream << "PostgreSQL: Game Database was inited." << std::endl;
+}
+
+
+void Database_PostgreSQL::beginSave()
+{
+	verifyDatabase();
+	checkResults(PQexec(m_conn, "BEGIN;"));
+}
+
+void Database_PostgreSQL::endSave()
+{
+	checkResults(PQexec(m_conn, "COMMIT;"));
+}
+
+bool Database_PostgreSQL::saveBlock(const v3s16 &pos,
+		const std::string &data)
+{
+	// Verify if we don't overflow the platform integer with the mapblock size
+	if (data.size() > INT_MAX) {
+		errorstream << "Database_PostgreSQL::saveBlock: Data truncation! "
+				<< "data.size() over 0xFFFF (== " << data.size()
+				<< ")" << std::endl;
+		return false;
+	}
+
+	verifyDatabase();
+
+	s32 x, y, z;
+	x = htonl(pos.X);
+	y = htonl(pos.Y);
+	z = htonl(pos.Z);
+
+	const void *args[] = { &x, &y, &z, data.c_str() };
+	const int argLen[] = {
+		sizeof(x), sizeof(y), sizeof(z), (int)data.size()
+	};
+	const int argFmt[] = { 1, 1, 1, 1 };
+
+	execPrepared("write_block", ARRLEN(args), args, argLen, argFmt);
+	return true;
+}
+
+void Database_PostgreSQL::loadBlock(const v3s16 &pos,
+		std::string *block)
+{
+	verifyDatabase();
+
+	s32 x, y, z;
+	x = htonl(pos.X);
+	y = htonl(pos.Y);
+	z = htonl(pos.Z);
+
+	const void *args[] = { &x, &y, &z };
+	const int argLen[] = { sizeof(x), sizeof(y), sizeof(z) };
+	const int argFmt[] = { 1, 1, 1 };
+
+	PGresult *results = execPrepared("read_block", ARRLEN(args), args,
+			argLen, argFmt, false);
+
+	*block = "";
+
+	if (PQntuples(results)) {
+		*block = std::string(PQgetvalue(results, 0, 0),
+				PQgetlength(results, 0, 0));
+	}
+
+	PQclear(results);
+}
+
+bool Database_PostgreSQL::deleteBlock(const v3s16 &pos)
+{
+	verifyDatabase();
+
+	s32 x, y, z;
+	x = htonl(pos.X);
+	y = htonl(pos.Y);
+	z = htonl(pos.Z);
+
+	const void *args[] = { &x, &y, &z };
+	const int argLen[] = { sizeof(x), sizeof(y), sizeof(z) };
+	const int argFmt[] = { 1, 1, 1 };
+
+	execPrepared("read_block", ARRLEN(args), args, argLen, argFmt);
+
+	return true;
+}
+
+void Database_PostgreSQL::listAllLoadableBlocks(std::vector<v3s16> &dst)
+{
+	verifyDatabase();
+
+	PGresult *results = execPrepared("list_all_loadable_blocks", 0,
+			NULL, NULL, NULL, false, false);
+
+	int numrows = PQntuples(results);
+
+	for (int row = 0; row < numrows; ++row) {
+		dst.push_back(pg_to_v3s16(results, 0, 0));
+	}
+
+	PQclear(results);
+}
+
+#endif // USE_POSTGRESQL
diff --git a/src/database-postgresql.h b/src/database-postgresql.h
new file mode 100644
index 0000000..1cfa544
--- /dev/null
+++ b/src/database-postgresql.h
@@ -0,0 +1,95 @@
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55 at gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef DATABASE_POSTGRESQL_HEADER
+#define DATABASE_POSTGRESQL_HEADER
+
+#include <string>
+#include <libpq-fe.h>
+#include "database.h"
+#include "util/basic_macros.h"
+
+class Settings;
+
+class Database_PostgreSQL : public Database
+{
+public:
+	Database_PostgreSQL(const Settings &conf);
+	~Database_PostgreSQL();
+
+	void beginSave();
+	void endSave();
+
+	bool saveBlock(const v3s16 &pos, const std::string &data);
+	void loadBlock(const v3s16 &pos, std::string *block);
+	bool deleteBlock(const v3s16 &pos);
+	void listAllLoadableBlocks(std::vector<v3s16> &dst);
+	bool initialized() const;
+
+private:
+	// Database initialization
+	void connectToDatabase();
+	void initStatements();
+	void createDatabase();
+
+	inline void prepareStatement(const std::string &name, const std::string &sql)
+	{
+		checkResults(PQprepare(m_conn, name.c_str(), sql.c_str(), 0, NULL));
+	}
+
+	// Database connectivity checks
+	void ping();
+	void verifyDatabase();
+
+	// Database usage
+	PGresult *checkResults(PGresult *res, bool clear = true);
+
+	inline PGresult *execPrepared(const char *stmtName, const int paramsNumber,
+			const void **params,
+			const int *paramsLengths = NULL, const int *paramsFormats = NULL,
+			bool clear = true, bool nobinary = true)
+	{
+		return checkResults(PQexecPrepared(m_conn, stmtName, paramsNumber,
+			(const char* const*) params, paramsLengths, paramsFormats,
+			nobinary ? 1 : 0), clear);
+	}
+
+	// Conversion helpers
+	inline int pg_to_int(PGresult *res, int row, int col)
+	{
+		return atoi(PQgetvalue(res, row, col));
+	}
+
+	inline v3s16 pg_to_v3s16(PGresult *res, int row, int col)
+	{
+		return v3s16(
+			pg_to_int(res, row, col),
+			pg_to_int(res, row, col + 1),
+			pg_to_int(res, row, col + 2)
+		);
+	}
+
+	// Attributes
+	std::string m_connect_string;
+	PGconn *m_conn;
+	int m_pgversion;
+};
+
+#endif
+
diff --git a/src/database-redis.cpp b/src/database-redis.cpp
index 498e9d3..3bcedad 100644
--- a/src/database-redis.cpp
+++ b/src/database-redis.cpp
@@ -46,11 +46,11 @@ Database_Redis::Database_Redis(Settings &conf)
 	int port = conf.exists("redis_port") ? conf.getU16("redis_port") : 6379;
 	ctx = redisConnect(addr, port);
 	if (!ctx) {
-		throw FileNotGoodException("Cannot allocate redis context");
+		throw DatabaseException("Cannot allocate redis context");
 	} else if (ctx->err) {
 		std::string err = std::string("Connection error: ") + ctx->errstr;
 		redisFree(ctx);
-		throw FileNotGoodException(err);
+		throw DatabaseException(err);
 	}
 }
 
@@ -62,7 +62,7 @@ Database_Redis::~Database_Redis()
 void Database_Redis::beginSave() {
 	redisReply *reply = static_cast<redisReply *>(redisCommand(ctx, "MULTI"));
 	if (!reply) {
-		throw FileNotGoodException(std::string(
+		throw DatabaseException(std::string(
 			"Redis command 'MULTI' failed: ") + ctx->errstr);
 	}
 	freeReplyObject(reply);
@@ -71,7 +71,7 @@ void Database_Redis::beginSave() {
 void Database_Redis::endSave() {
 	redisReply *reply = static_cast<redisReply *>(redisCommand(ctx, "EXEC"));
 	if (!reply) {
-		throw FileNotGoodException(std::string(
+		throw DatabaseException(std::string(
 			"Redis command 'EXEC' failed: ") + ctx->errstr);
 	}
 	freeReplyObject(reply);
@@ -101,42 +101,45 @@ bool Database_Redis::saveBlock(const v3s16 &pos, const std::string &data)
 	return true;
 }
 
-std::string Database_Redis::loadBlock(const v3s16 &pos)
+void Database_Redis::loadBlock(const v3s16 &pos, std::string *block)
 {
 	std::string tmp = i64tos(getBlockAsInteger(pos));
 	redisReply *reply = static_cast<redisReply *>(redisCommand(ctx,
 			"HGET %s %s", hash.c_str(), tmp.c_str()));
 
 	if (!reply) {
-		throw FileNotGoodException(std::string(
+		throw DatabaseException(std::string(
 			"Redis command 'HGET %s %s' failed: ") + ctx->errstr);
 	}
+
 	switch (reply->type) {
 	case REDIS_REPLY_STRING: {
-		std::string str(reply->str, reply->len);
+		*block = std::string(reply->str, reply->len);
 		// std::string copies the memory so this won't cause any problems
 		freeReplyObject(reply);
-		return str;
+		return;
 	}
 	case REDIS_REPLY_ERROR: {
 		std::string errstr(reply->str, reply->len);
 		freeReplyObject(reply);
 		errorstream << "loadBlock: loading block " << PP(pos)
 			<< " failed: " << errstr << std::endl;
-		throw FileNotGoodException(std::string(
+		throw DatabaseException(std::string(
 			"Redis command 'HGET %s %s' errored: ") + errstr);
 	}
 	case REDIS_REPLY_NIL: {
+		*block = "";
 		// block not found in database
 		freeReplyObject(reply);
-		return "";
+		return;
 	}
 	}
+
 	errorstream << "loadBlock: loading block " << PP(pos)
 		<< " returned invalid reply type " << reply->type
 		<< ": " << std::string(reply->str, reply->len) << std::endl;
 	freeReplyObject(reply);
-	throw FileNotGoodException(std::string(
+	throw DatabaseException(std::string(
 		"Redis command 'HGET %s %s' gave invalid reply."));
 }
 
@@ -147,7 +150,7 @@ bool Database_Redis::deleteBlock(const v3s16 &pos)
 	redisReply *reply = static_cast<redisReply *>(redisCommand(ctx,
 		"HDEL %s %s", hash.c_str(), tmp.c_str()));
 	if (!reply) {
-		throw FileNotGoodException(std::string(
+		throw DatabaseException(std::string(
 			"Redis command 'HDEL %s %s' failed: ") + ctx->errstr);
 	} else if (reply->type == REDIS_REPLY_ERROR) {
 		warningstream << "deleteBlock: deleting block " << PP(pos)
@@ -164,7 +167,7 @@ void Database_Redis::listAllLoadableBlocks(std::vector<v3s16> &dst)
 {
 	redisReply *reply = static_cast<redisReply *>(redisCommand(ctx, "HKEYS %s", hash.c_str()));
 	if (!reply) {
-		throw FileNotGoodException(std::string(
+		throw DatabaseException(std::string(
 			"Redis command 'HKEYS %s' failed: ") + ctx->errstr);
 	}
 	switch (reply->type) {
@@ -176,7 +179,7 @@ void Database_Redis::listAllLoadableBlocks(std::vector<v3s16> &dst)
 		}
 		break;
 	case REDIS_REPLY_ERROR:
-		throw FileNotGoodException(std::string(
+		throw DatabaseException(std::string(
 			"Failed to get keys from database: ") +
 			std::string(reply->str, reply->len));
 	}
diff --git a/src/database-redis.h b/src/database-redis.h
index 45e702c..3addaa2 100644
--- a/src/database-redis.h
+++ b/src/database-redis.h
@@ -36,13 +36,13 @@ public:
 	Database_Redis(Settings &conf);
 	~Database_Redis();
 
-	virtual void beginSave();
-	virtual void endSave();
+	void beginSave();
+	void endSave();
 
-	virtual bool saveBlock(const v3s16 &pos, const std::string &data);
-	virtual std::string loadBlock(const v3s16 &pos);
-	virtual bool deleteBlock(const v3s16 &pos);
-	virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);
+	bool saveBlock(const v3s16 &pos, const std::string &data);
+	void loadBlock(const v3s16 &pos, std::string *block);
+	bool deleteBlock(const v3s16 &pos);
+	void listAllLoadableBlocks(std::vector<v3s16> &dst);
 
 private:
 	redisContext *ctx;
diff --git a/src/database-sqlite3.cpp b/src/database-sqlite3.cpp
index 56f937b..095d485 100644
--- a/src/database-sqlite3.cpp
+++ b/src/database-sqlite3.cpp
@@ -47,7 +47,7 @@ SQLite format specification:
 
 #define SQLRES(s, r, m) \
 	if ((s) != (r)) { \
-		throw FileNotGoodException(std::string(m) + ": " +\
+		throw DatabaseException(std::string(m) + ": " +\
 				sqlite3_errmsg(m_database)); \
 	}
 #define SQLOK(s, m) SQLRES(s, SQLITE_OK, m)
@@ -56,8 +56,14 @@ SQLite format specification:
 	SQLOK(sqlite3_prepare_v2(m_database, query, -1, &m_stmt_##name, NULL),\
 		"Failed to prepare query '" query "'")
 
-#define FINALIZE_STATEMENT(statement) \
-	SQLOK(sqlite3_finalize(statement), "Failed to finalize " #statement)
+#define SQLOK_ERRSTREAM(s, m)                           \
+	if ((s) != SQLITE_OK) {                             \
+		errorstream << (m) << ": "                      \
+			<< sqlite3_errmsg(m_database) << std::endl; \
+	}
+
+#define FINALIZE_STATEMENT(statement) SQLOK_ERRSTREAM(sqlite3_finalize(statement), \
+	"Failed to finalize " #statement)
 
 int Database_SQLite3::busyHandler(void *data, int count)
 {
@@ -237,7 +243,7 @@ bool Database_SQLite3::saveBlock(const v3s16 &pos, const std::string &data)
 	return true;
 }
 
-std::string Database_SQLite3::loadBlock(const v3s16 &pos)
+void Database_SQLite3::loadBlock(const v3s16 &pos, std::string *block)
 {
 	verifyDatabase();
 
@@ -245,20 +251,17 @@ std::string Database_SQLite3::loadBlock(const v3s16 &pos)
 
 	if (sqlite3_step(m_stmt_read) != SQLITE_ROW) {
 		sqlite3_reset(m_stmt_read);
-		return "";
+		return;
 	}
+
 	const char *data = (const char *) sqlite3_column_blob(m_stmt_read, 0);
 	size_t len = sqlite3_column_bytes(m_stmt_read, 0);
 
-	std::string s;
-	if (data)
-		s = std::string(data, len);
+	*block = (data) ? std::string(data, len) : "";
 
 	sqlite3_step(m_stmt_read);
 	// We should never get more than 1 row, so ok to reset
 	sqlite3_reset(m_stmt_read);
-
-	return s;
 }
 
 void Database_SQLite3::createDatabase()
@@ -292,6 +295,6 @@ Database_SQLite3::~Database_SQLite3()
 	FINALIZE_STATEMENT(m_stmt_end)
 	FINALIZE_STATEMENT(m_stmt_delete)
 
-	SQLOK(sqlite3_close(m_database), "Failed to close database");
+	SQLOK_ERRSTREAM(sqlite3_close(m_database), "Failed to close database");
 }
 
diff --git a/src/database-sqlite3.h b/src/database-sqlite3.h
index 04a1825..debbc9d 100644
--- a/src/database-sqlite3.h
+++ b/src/database-sqlite3.h
@@ -31,16 +31,16 @@ class Database_SQLite3 : public Database
 {
 public:
 	Database_SQLite3(const std::string &savedir);
+	~Database_SQLite3();
 
-	virtual void beginSave();
-	virtual void endSave();
+	void beginSave();
+	void endSave();
 
-	virtual bool saveBlock(const v3s16 &pos, const std::string &data);
-	virtual std::string loadBlock(const v3s16 &pos);
-	virtual bool deleteBlock(const v3s16 &pos);
-	virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);
-	virtual bool initialized() const { return m_initialized; }
-	~Database_SQLite3();
+	bool saveBlock(const v3s16 &pos, const std::string &data);
+	void loadBlock(const v3s16 &pos, std::string *block);
+	bool deleteBlock(const v3s16 &pos);
+	void listAllLoadableBlocks(std::vector<v3s16> &dst);
+	bool initialized() const { return m_initialized; }
 
 private:
 	// Open the database
diff --git a/src/database.h b/src/database.h
index cee7b6f..0cf7523 100644
--- a/src/database.h
+++ b/src/database.h
@@ -38,7 +38,7 @@ public:
 	virtual void endSave() {}
 
 	virtual bool saveBlock(const v3s16 &pos, const std::string &data) = 0;
-	virtual std::string loadBlock(const v3s16 &pos) = 0;
+	virtual void loadBlock(const v3s16 &pos, std::string *block) = 0;
 	virtual bool deleteBlock(const v3s16 &pos) = 0;
 
 	static s64 getBlockAsInteger(const v3s16 &pos);
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index e8b652c..0b4be63 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -40,6 +40,7 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("keymap_jump", "KEY_SPACE");
 	settings->setDefault("keymap_sneak", "KEY_LSHIFT");
 	settings->setDefault("keymap_drop", "KEY_KEY_Q");
+	settings->setDefault("keymap_zoom", "KEY_KEY_Z");
 	settings->setDefault("keymap_inventory", "KEY_KEY_I");
 	settings->setDefault("keymap_special1", "KEY_KEY_E");
 	settings->setDefault("keymap_chat", "KEY_KEY_T");
@@ -50,7 +51,7 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("keymap_freemove", "KEY_KEY_K");
 	settings->setDefault("keymap_fastmove", "KEY_KEY_J");
 	settings->setDefault("keymap_noclip", "KEY_KEY_H");
-	settings->setDefault("keymap_cinematic", "KEY_F8");
+	settings->setDefault("keymap_cinematic", "");
 	settings->setDefault("keymap_screenshot", "KEY_F12");
 	settings->setDefault("keymap_toggle_hud", "KEY_F1");
 	settings->setDefault("keymap_toggle_chat", "KEY_F2");
@@ -74,6 +75,7 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("always_fly_fast", "true");
 	settings->setDefault("directional_colored_fog", "true");
 	settings->setDefault("tooltip_show_delay", "400");
+	settings->setDefault("zoom_fov", "15");
 
 	// Some (temporary) keys for debugging
 	settings->setDefault("keymap_print_debug_stacks", "KEY_KEY_P");
@@ -104,6 +106,7 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("client_unload_unused_data_timeout", "600");
 	settings->setDefault("client_mapblock_limit", "5000");
 	settings->setDefault("enable_fog", "true");
+	settings->setDefault("fog_start", "0.4");
 	settings->setDefault("fov", "72");
 	settings->setDefault("view_bobbing", "true");
 	settings->setDefault("leaves_style", "fancy");
@@ -116,6 +119,9 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("free_move", "false");
 	settings->setDefault("noclip", "false");
 	settings->setDefault("continuous_forward", "false");
+	settings->setDefault("enable_joysticks", "false");
+	settings->setDefault("repeat_joystick_button_time", "0.17");
+	settings->setDefault("joystick_frustum_sensitivity", "170");
 	settings->setDefault("cinematic", "false");
 	settings->setDefault("camera_smoothing", "0");
 	settings->setDefault("cinematic_camera_smoothing", "0.7");
@@ -185,7 +191,7 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("minimap_shape_round", "true");
 	settings->setDefault("minimap_double_scan_height", "true");
 
-	settings->setDefault("send_pre_v25_init", "true");
+	settings->setDefault("send_pre_v25_init", "false");
 
 	settings->setDefault("curl_timeout", "5000");
 	settings->setDefault("curl_parallel_limit", "8");
@@ -202,11 +208,13 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("server_name", "");
 	settings->setDefault("server_description", "");
 
+	settings->setDefault("disable_escape_sequences", "false");
+
 #if USE_FREETYPE
 	settings->setDefault("freetype", "true");
 	settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "liberationsans.ttf"));
 	settings->setDefault("font_shadow", "1");
-	settings->setDefault("font_shadow_alpha", "128");
+	settings->setDefault("font_shadow_alpha", "127");
 	settings->setDefault("mono_font_path", porting::getDataPath("fonts" DIR_DELIM "liberationmono.ttf"));
 	settings->setDefault("fallback_font_path", porting::getDataPath("fonts" DIR_DELIM "DroidSansFallbackFull.ttf"));
 
@@ -272,12 +280,16 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("max_simultaneous_block_sends_server_total", "40");
 	settings->setDefault("max_block_send_distance", "9");
 	settings->setDefault("max_block_generate_distance", "7");
+	settings->setDefault("block_send_optimize_distance", "4");
 	settings->setDefault("max_clearobjects_extra_loaded_blocks", "4096");
 	settings->setDefault("time_send_interval", "5");
 	settings->setDefault("time_speed", "72");
 	settings->setDefault("server_unload_unused_data_timeout", "29");
-	settings->setDefault("max_objects_per_block", "49");
+	settings->setDefault("max_objects_per_block", "64");
 	settings->setDefault("server_map_save_interval", "5.3");
+	settings->setDefault("chat_message_max_size", "500");
+	settings->setDefault("chat_message_limit_per_10sec", "8.0");
+	settings->setDefault("chat_message_limit_trigger_kick", "50");
 	settings->setDefault("sqlite_synchronous", "2");
 	settings->setDefault("full_block_send_enable_min_time_from_building", "2.0");
 	settings->setDefault("dedicated_server_step", "0.1");
@@ -315,7 +327,7 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("liquid_update", "1.0");
 
 	//mapgen stuff
-	settings->setDefault("mg_name", "v6");
+	settings->setDefault("mg_name", "v7");
 	settings->setDefault("water_level", "1");
 	settings->setDefault("chunksize", "5");
 	settings->setDefault("mg_flags", "dungeons");
diff --git a/src/dungeongen.cpp b/src/dungeongen.cpp
index 5bfc320..78573da 100644
--- a/src/dungeongen.cpp
+++ b/src/dungeongen.cpp
@@ -30,55 +30,67 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 //#define DGEN_USE_TORCHES
 
-NoiseParams nparams_dungeon_rarity(0.0, 1.0, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0);
-NoiseParams nparams_dungeon_wetness(0.0, 1.0, v3f(40.0, 40.0, 40.0), 32474, 4, 1.1, 2.0);
-NoiseParams nparams_dungeon_density(0.0, 1.0, v3f(2.5, 2.5, 2.5), 0, 2, 1.4, 2.0);
+NoiseParams nparams_dungeon_density(0.9, 0.5, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0);
+NoiseParams nparams_dungeon_alt_wall(-0.4, 1.0, v3f(40.0, 40.0, 40.0), 32474, 6, 1.1, 2.0);
 
 
 ///////////////////////////////////////////////////////////////////////////////
 
 
-DungeonGen::DungeonGen(Mapgen *mapgen, DungeonParams *dparams)
+DungeonGen::DungeonGen(INodeDefManager *ndef,
+	GenerateNotifier *gennotify, DungeonParams *dparams)
 {
-	this->mg = mapgen;
-	this->vm = mapgen->vm;
+	assert(ndef);
+
+	this->ndef      = ndef;
+	this->gennotify = gennotify;
 
 #ifdef DGEN_USE_TORCHES
-	c_torch  = mg->ndef->getId("default:torch");
+	c_torch  = ndef->getId("default:torch");
 #endif
 
 	if (dparams) {
 		memcpy(&dp, dparams, sizeof(dp));
 	} else {
-		dp.c_water  = mg->ndef->getId("mapgen_water_source");
-		dp.c_cobble = mg->ndef->getId("mapgen_cobble");
-		dp.c_moss   = mg->ndef->getId("mapgen_mossycobble");
-		dp.c_stair  = mg->ndef->getId("mapgen_stair_cobble");
+		dp.seed = 0;
+
+		dp.c_water       = ndef->getId("mapgen_water_source");
+		dp.c_river_water = ndef->getId("mapgen_river_water_source");
+		dp.c_wall        = ndef->getId("mapgen_cobble");
+		dp.c_alt_wall    = ndef->getId("mapgen_mossycobble");
+		dp.c_stair       = ndef->getId("mapgen_stair_cobble");
+
+		if (dp.c_river_water == CONTENT_IGNORE)
+			dp.c_river_water = ndef->getId("mapgen_water_source");
 
 		dp.diagonal_dirs = false;
-		dp.mossratio     = 3.0;
 		dp.holesize      = v3s16(1, 2, 1);
 		dp.roomsize      = v3s16(0, 0, 0);
+		dp.rooms_min     = 2;
+		dp.rooms_max     = 16;
+		dp.y_min         = -MAX_MAP_GENERATION_LIMIT;
+		dp.y_max         = MAX_MAP_GENERATION_LIMIT;
 		dp.notifytype    = GENNOTIFY_DUNGEON;
 
-		dp.np_rarity  = nparams_dungeon_rarity;
-		dp.np_wetness = nparams_dungeon_wetness;
-		dp.np_density = nparams_dungeon_density;
+		dp.np_density  = nparams_dungeon_density;
+		dp.np_alt_wall = nparams_dungeon_alt_wall;
 	}
-
-	// For mapgens using river water
-	dp.c_river_water = mg->ndef->getId("mapgen_river_water_source");
-	if (dp.c_river_water == CONTENT_IGNORE)
-		dp.c_river_water = mg->ndef->getId("mapgen_water_source");
 }
 
 
-void DungeonGen::generate(u32 bseed, v3s16 nmin, v3s16 nmax)
+void DungeonGen::generate(MMVManip *vm, u32 bseed, v3s16 nmin, v3s16 nmax)
 {
+	assert(vm);
+
 	//TimeTaker t("gen dungeons");
-	if (NoisePerlin3D(&dp.np_rarity, nmin.X, nmin.Y, nmin.Z, mg->seed) < 0.2)
+	if (nmin.Y < dp.y_min || nmax.Y > dp.y_max)
 		return;
 
+	float nval_density = NoisePerlin3D(&dp.np_density, nmin.X, nmin.Y, nmin.Z, dp.seed);
+	if (nval_density < 1.0f)
+		return;
+
+	this->vm = vm;
 	this->blockseed = bseed;
 	random.seed(bseed + 2);
 
@@ -99,23 +111,23 @@ void DungeonGen::generate(u32 bseed, v3s16 nmin, v3s16 nmax)
 		}
 	}
 
-	// Add it
-	makeDungeon(v3s16(1, 1, 1) * MAP_BLOCKSIZE);
+	// Add them
+	for (u32 i = 0; i < floor(nval_density); i++)
+		makeDungeon(v3s16(1, 1, 1) * MAP_BLOCKSIZE);
 
-	// Convert some cobble to mossy cobble
-	if (dp.mossratio != 0.0) {
-		for (s16 z = nmin.Z; z <= nmax.Z; z++)
-		for (s16 y = nmin.Y; y <= nmax.Y; y++) {
-			u32 i = vm->m_area.index(nmin.X, y, z);
-			for (s16 x = nmin.X; x <= nmax.X; x++) {
-				if (vm->m_data[i].getContent() == dp.c_cobble) {
-					float wetness = NoisePerlin3D(&dp.np_wetness, x, y, z, mg->seed);
-					float density = NoisePerlin3D(&dp.np_density, x, y, z, blockseed);
-					if (density < wetness / dp.mossratio)
-						vm->m_data[i].setContent(dp.c_moss);
-				}
-				i++;
+	// Optionally convert some structure to alternative structure
+	if (dp.c_alt_wall == CONTENT_IGNORE)
+		return;
+
+	for (s16 z = nmin.Z; z <= nmax.Z; z++)
+	for (s16 y = nmin.Y; y <= nmax.Y; y++) {
+		u32 i = vm->m_area.index(nmin.X, y, z);
+		for (s16 x = nmin.X; x <= nmax.X; x++) {
+			if (vm->m_data[i].getContent() == dp.c_wall) {
+				if (NoisePerlin3D(&dp.np_alt_wall, x, y, z, blockseed) > 0.0f)
+					vm->m_data[i].setContent(dp.c_alt_wall);
 			}
+			i++;
 		}
 	}
 
@@ -135,17 +147,23 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
 	bool fits = false;
 	for (u32 i = 0; i < 100 && !fits; i++) {
 		bool is_large_room = ((random.next() & 3) == 1);
-		roomsize = is_large_room ?
-			v3s16(random.range(8, 16), random.range(8, 16), random.range(8, 16)) :
-			v3s16(random.range(4, 8), random.range(4, 6), random.range(4, 8));
+		if (is_large_room) {
+			roomsize.Z = random.range(8, 16);
+			roomsize.Y = random.range(8, 16);
+			roomsize.X = random.range(8, 16);
+		} else {
+			roomsize.Z = random.range(4, 8);
+			roomsize.Y = random.range(4, 6);
+			roomsize.X = random.range(4, 8);
+		}
 		roomsize += dp.roomsize;
 
 		// start_padding is used to disallow starting the generation of
 		// a dungeon in a neighboring generation chunk
-		roomplace = vm->m_area.MinEdge + start_padding + v3s16(
-			random.range(0, areasize.X - roomsize.X - start_padding.X),
-			random.range(0, areasize.Y - roomsize.Y - start_padding.Y),
-			random.range(0, areasize.Z - roomsize.Z - start_padding.Z));
+		roomplace = vm->m_area.MinEdge + start_padding;
+		roomplace.Z += random.range(0, areasize.Z - roomsize.Z - start_padding.Z);
+		roomplace.Y += random.range(0, areasize.Y - roomsize.Y - start_padding.Y);
+		roomplace.X += random.range(0, areasize.X - roomsize.X - start_padding.X);
 
 		/*
 			Check that we're not putting the room to an unknown place,
@@ -175,13 +193,14 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
 	*/
 	v3s16 last_room_center = roomplace + v3s16(roomsize.X / 2, 1, roomsize.Z / 2);
 
-	u32 room_count = random.range(2, 16);
+	u32 room_count = random.range(dp.rooms_min, dp.rooms_max);
 	for (u32 i = 0; i < room_count; i++) {
 		// Make a room to the determined place
 		makeRoom(roomsize, roomplace);
 
 		v3s16 room_center = roomplace + v3s16(roomsize.X / 2, 1, roomsize.Z / 2);
-		mg->gennotify.addEvent(dp.notifytype, room_center);
+		if (gennotify)
+			gennotify->addEvent(dp.notifytype, room_center);
 
 #ifdef DGEN_USE_TORCHES
 		// Place torch at room center (for testing)
@@ -227,7 +246,9 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
 		makeCorridor(doorplace, doordir, corridor_end, corridor_end_dir);
 
 		// Find a place for a random sized room
-		roomsize = v3s16(random.range(4, 8), random.range(4, 6), random.range(4, 8));
+		roomsize.Z = random.range(4, 8);
+		roomsize.Y = random.range(4, 6);
+		roomsize.X = random.range(4, 8);
 		roomsize += dp.roomsize;
 
 		m_pos = corridor_end;
@@ -248,7 +269,7 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
 
 void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
 {
-	MapNode n_cobble(dp.c_cobble);
+	MapNode n_wall(dp.c_wall);
 	MapNode n_air(CONTENT_AIR);
 
 	// Make +-X walls
@@ -261,7 +282,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
 			u32 vi = vm->m_area.index(p);
 			if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
 				continue;
-			vm->m_data[vi] = n_cobble;
+			vm->m_data[vi] = n_wall;
 		}
 		{
 			v3s16 p = roomplace + v3s16(roomsize.X - 1, y, z);
@@ -270,7 +291,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
 			u32 vi = vm->m_area.index(p);
 			if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
 				continue;
-			vm->m_data[vi] = n_cobble;
+			vm->m_data[vi] = n_wall;
 		}
 	}
 
@@ -284,7 +305,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
 			u32 vi = vm->m_area.index(p);
 			if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
 				continue;
-			vm->m_data[vi] = n_cobble;
+			vm->m_data[vi] = n_wall;
 		}
 		{
 			v3s16 p = roomplace + v3s16(x, y, roomsize.Z - 1);
@@ -293,7 +314,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
 			u32 vi = vm->m_area.index(p);
 			if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
 				continue;
-			vm->m_data[vi] = n_cobble;
+			vm->m_data[vi] = n_wall;
 		}
 	}
 
@@ -307,7 +328,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
 			u32 vi = vm->m_area.index(p);
 			if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
 				continue;
-			vm->m_data[vi] = n_cobble;
+			vm->m_data[vi] = n_wall;
 		}
 		{
 			v3s16 p = roomplace + v3s16(x,roomsize. Y - 1, z);
@@ -316,7 +337,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
 			u32 vi = vm->m_area.index(p);
 			if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
 				continue;
-			vm->m_data[vi] = n_cobble;
+			vm->m_data[vi] = n_wall;
 		}
 	}
 
@@ -400,7 +421,7 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir,
 				makeFill(p + v3s16(-1, -1, -1),
 					dp.holesize + v3s16(2, 3, 2),
 					VMANIP_FLAG_DUNGEON_UNTOUCHABLE,
-					MapNode(dp.c_cobble),
+					MapNode(dp.c_wall),
 					0);
 				makeHole(p);
 				makeHole(p - dir);
@@ -418,18 +439,18 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir,
 					int facedir = dir_to_facedir(dir * make_stairs);
 
 					u32 vi = vm->m_area.index(p.X - dir.X, p.Y - 1, p.Z - dir.Z);
-					if (vm->m_data[vi].getContent() == dp.c_cobble)
+					if (vm->m_data[vi].getContent() == dp.c_wall)
 						vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
 
 					vi = vm->m_area.index(p.X, p.Y, p.Z);
-					if (vm->m_data[vi].getContent() == dp.c_cobble)
+					if (vm->m_data[vi].getContent() == dp.c_wall)
 						vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
 				}
 			} else {
 				makeFill(p + v3s16(-1, -1, -1),
 					dp.holesize + v3s16(2, 2, 2),
 					VMANIP_FLAG_DUNGEON_UNTOUCHABLE,
-					MapNode(dp.c_cobble),
+					MapNode(dp.c_wall),
 					0);
 				makeHole(p);
 			}
@@ -471,8 +492,8 @@ bool DungeonGen::findPlaceForDoor(v3s16 &result_place, v3s16 &result_dir)
 			randomizeDir();
 			continue;
 		}
-		if (vm->getNodeNoExNoEmerge(p).getContent() == dp.c_cobble &&
-				vm->getNodeNoExNoEmerge(p1).getContent() == dp.c_cobble) {
+		if (vm->getNodeNoExNoEmerge(p).getContent() == dp.c_wall &&
+				vm->getNodeNoExNoEmerge(p1).getContent() == dp.c_wall) {
 			// Found wall, this is a good place!
 			result_place = p;
 			result_dir = m_dir;
@@ -485,7 +506,7 @@ bool DungeonGen::findPlaceForDoor(v3s16 &result_place, v3s16 &result_dir)
 		*/
 		// Jump one up if the actual space is there
 		if (vm->getNodeNoExNoEmerge(p +
-				v3s16(0, 0, 0)).getContent() == dp.c_cobble &&
+				v3s16(0, 0, 0)).getContent() == dp.c_wall &&
 				vm->getNodeNoExNoEmerge(p +
 				v3s16(0, 1, 0)).getContent() == CONTENT_AIR &&
 				vm->getNodeNoExNoEmerge(p +
@@ -493,7 +514,7 @@ bool DungeonGen::findPlaceForDoor(v3s16 &result_place, v3s16 &result_dir)
 			p += v3s16(0,1,0);
 		// Jump one down if the actual space is there
 		if (vm->getNodeNoExNoEmerge(p +
-				v3s16(0, 1, 0)).getContent() == dp.c_cobble &&
+				v3s16(0, 1, 0)).getContent() == dp.c_wall &&
 				vm->getNodeNoExNoEmerge(p +
 				v3s16(0, 0, 0)).getContent() == CONTENT_AIR &&
 				vm->getNodeNoExNoEmerge(p +
@@ -587,7 +608,10 @@ v3s16 rand_ortho_dir(PseudoRandom &random, bool diagonal_dirs)
 
 		do {
 			trycount++;
-			dir = v3s16(random.next() % 3 - 1, 0, random.next() % 3 - 1);
+
+			dir.Z = random.next() % 3 - 1;
+			dir.Y = 0;
+			dir.X = random.next() % 3 - 1;
 		} while ((dir.X == 0 && dir.Z == 0) && trycount < 10);
 
 		return dir;
diff --git a/src/dungeongen.h b/src/dungeongen.h
index d209dd4..30786b9 100644
--- a/src/dungeongen.h
+++ b/src/dungeongen.h
@@ -39,27 +39,33 @@ int dir_to_facedir(v3s16 d);
 
 
 struct DungeonParams {
+	s32 seed;
+
 	content_t c_water;
 	content_t c_river_water;
-	content_t c_cobble;
-	content_t c_moss;
+	content_t c_wall;
+	content_t c_alt_wall;
 	content_t c_stair;
 
-	GenNotifyType notifytype;
 	bool diagonal_dirs;
-	float mossratio;
 	v3s16 holesize;
 	v3s16 roomsize;
+	u16 rooms_min;
+	u16 rooms_max;
+	s16 y_min;
+	s16 y_max;
+	GenNotifyType notifytype;
 
-	NoiseParams np_rarity;
-	NoiseParams np_wetness;
 	NoiseParams np_density;
+	NoiseParams np_alt_wall;
 };
 
 class DungeonGen {
 public:
 	MMVManip *vm;
-	Mapgen *mg;
+	INodeDefManager *ndef;
+	GenerateNotifier *gennotify;
+
 	u32 blockseed;
 	PseudoRandom random;
 	v3s16 csize;
@@ -67,17 +73,20 @@ public:
 	content_t c_torch;
 	DungeonParams dp;
 
-	//RoomWalker
+	// RoomWalker
 	v3s16 m_pos;
 	v3s16 m_dir;
 
-	DungeonGen(Mapgen *mg, DungeonParams *dparams);
-	void generate(u32 bseed, v3s16 full_node_min, v3s16 full_node_max);
+	DungeonGen(INodeDefManager *ndef,
+		GenerateNotifier *gennotify, DungeonParams *dparams);
+
+	void generate(MMVManip *vm, u32 bseed,
+		v3s16 full_node_min, v3s16 full_node_max);
 
 	void makeDungeon(v3s16 start_padding);
 	void makeRoom(v3s16 roomsize, v3s16 roomplace);
 	void makeCorridor(v3s16 doorplace, v3s16 doordir,
-					  v3s16 &result_place, v3s16 &result_dir);
+		v3s16 &result_place, v3s16 &result_dir);
 	void makeDoor(v3s16 doorplace, v3s16 doordir);
 	void makeFill(v3s16 place, v3s16 size, u8 avoid_flags, MapNode n, u8 or_flags);
 	void makeHole(v3s16 place);
@@ -86,14 +95,13 @@ public:
 	bool findPlaceForRoomDoor(v3s16 roomsize, v3s16 &result_doorplace,
 			v3s16 &result_doordir, v3s16 &result_roomplace);
 
-	void randomizeDir()
+	inline void randomizeDir()
 	{
 		m_dir = rand_ortho_dir(random, dp.diagonal_dirs);
 	}
 };
 
-extern NoiseParams nparams_dungeon_rarity;
-extern NoiseParams nparams_dungeon_wetness;
 extern NoiseParams nparams_dungeon_density;
+extern NoiseParams nparams_dungeon_alt_wall;
 
 #endif
diff --git a/src/emerge.cpp b/src/emerge.cpp
index 93e8f2b..25b2e92 100644
--- a/src/emerge.cpp
+++ b/src/emerge.cpp
@@ -34,13 +34,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "log.h"
 #include "map.h"
 #include "mapblock.h"
-#include "mapgen_flat.h"
-#include "mapgen_fractal.h"
-#include "mapgen_v5.h"
-#include "mapgen_v6.h"
-#include "mapgen_v7.h"
-#include "mapgen_valleys.h"
-#include "mapgen_singlenode.h"
 #include "mg_biome.h"
 #include "mg_ore.h"
 #include "mg_decoration.h"
@@ -53,13 +46,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "settings.h"
 #include "voxel.h"
 
-
-struct MapgenDesc {
-	const char *name;
-	MapgenFactory *factory;
-	bool is_user_visible;
-};
-
 class EmergeThread : public Thread {
 public:
 	bool enable_mapgen_debug_info;
@@ -100,20 +86,6 @@ private:
 };
 
 ////
-//// Built-in mapgens
-////
-
-MapgenDesc g_reg_mapgens[] = {
-	{"v5",         new MapgenFactoryV5,         true},
-	{"v6",         new MapgenFactoryV6,         true},
-	{"v7",         new MapgenFactoryV7,         true},
-	{"flat",       new MapgenFactoryFlat,       true},
-	{"fractal",    new MapgenFactoryFractal,    true},
-	{"valleys",    new MapgenFactoryValleys,    true},
-	{"singlenode", new MapgenFactorySinglenode, false},
-};
-
-////
 //// EmergeManager
 ////
 
@@ -181,42 +153,22 @@ EmergeManager::~EmergeManager()
 	delete oremgr;
 	delete decomgr;
 	delete schemmgr;
-
-	delete params.sparams;
 }
 
 
-void EmergeManager::loadMapgenParams()
-{
-	params.load(*g_settings);
-}
-
-
-void EmergeManager::initMapgens()
+bool EmergeManager::initMapgens(MapgenParams *params)
 {
 	if (m_mapgens.size())
-		return;
-
-	MapgenFactory *mgfactory = getMapgenFactory(params.mg_name);
-	if (!mgfactory) {
-		errorstream << "EmergeManager: mapgen " << params.mg_name <<
-			" not registered; falling back to " << DEFAULT_MAPGEN << std::endl;
-
-		params.mg_name = DEFAULT_MAPGEN;
+		return false;
 
-		mgfactory = getMapgenFactory(params.mg_name);
-		FATAL_ERROR_IF(mgfactory == NULL, "Couldn't use any mapgen!");
-	}
-
-	if (!params.sparams) {
-		params.sparams = mgfactory->createMapgenParams();
-		params.sparams->readParams(g_settings);
-	}
+	this->mgparams = params;
 
 	for (u32 i = 0; i != m_threads.size(); i++) {
-		Mapgen *mg = mgfactory->createMapgen(i, &params, this);
+		Mapgen *mg = Mapgen::createMapgen(params->mgtype, i, params, this);
 		m_mapgens.push_back(mg);
 	}
+
+	return true;
 }
 
 
@@ -318,12 +270,14 @@ bool EmergeManager::enqueueBlockEmergeEx(
 // Mapgen-related helper functions
 //
 
+
+// TODO(hmmmm): Move this to ServerMap
 v3s16 EmergeManager::getContainingChunk(v3s16 blockpos)
 {
-	return getContainingChunk(blockpos, params.chunksize);
+	return getContainingChunk(blockpos, mgparams->chunksize);
 }
 
-
+// TODO(hmmmm): Move this to ServerMap
 v3s16 EmergeManager::getContainingChunk(v3s16 blockpos, s16 chunksize)
 {
 	s16 coff = -chunksize / 2;
@@ -357,7 +311,7 @@ int EmergeManager::getGroundLevelAtPoint(v2s16 p)
 	return m_mapgens[0]->getGroundLevelAtPoint(p);
 }
 
-
+// TODO(hmmmm): Move this to ServerMap
 bool EmergeManager::isBlockUnderground(v3s16 blockpos)
 {
 #if 0
@@ -368,31 +322,9 @@ bool EmergeManager::isBlockUnderground(v3s16 blockpos)
 #endif
 
 	// Use a simple heuristic; the above method is wildly inaccurate anyway.
-	return blockpos.Y * (MAP_BLOCKSIZE + 1) <= params.water_level;
+	return blockpos.Y * (MAP_BLOCKSIZE + 1) <= mgparams->water_level;
 }
 
-
-void EmergeManager::getMapgenNames(
-	std::vector<const char *> *mgnames, bool include_hidden)
-{
-	for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
-		if (include_hidden || g_reg_mapgens[i].is_user_visible)
-			mgnames->push_back(g_reg_mapgens[i].name);
-	}
-}
-
-
-MapgenFactory *EmergeManager::getMapgenFactory(const std::string &mgname)
-{
-	for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
-		if (mgname == g_reg_mapgens[i].name)
-			return g_reg_mapgens[i].factory;
-	}
-
-	return NULL;
-}
-
-
 bool EmergeManager::pushBlockEmergeData(
 	v3s16 pos,
 	u16 peer_requested,
@@ -437,12 +369,10 @@ bool EmergeManager::pushBlockEmergeData(
 }
 
 
-bool EmergeManager::popBlockEmergeData(
-	v3s16 pos,
-	BlockEmergeData *bedata)
+bool EmergeManager::popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata)
 {
 	std::map<v3s16, BlockEmergeData>::iterator it;
-	std::map<u16, u16>::iterator it2;
+	UNORDERED_MAP<u16, u16>::iterator it2;
 
 	it = m_blocks_enqueued.find(pos);
 	if (it == m_blocks_enqueued.end())
@@ -578,13 +508,15 @@ EmergeAction EmergeThread::getBlockOrStartGen(
 
 	// 1). Attempt to fetch block from memory
 	*block = m_map->getBlockNoCreateNoEx(pos);
-	if (*block && !(*block)->isDummy() && (*block)->isGenerated())
-		return EMERGE_FROM_MEMORY;
-
-	// 2). Attempt to load block from disk
-	*block = m_map->loadBlock(pos);
-	if (*block && (*block)->isGenerated())
-		return EMERGE_FROM_DISK;
+	if (*block && !(*block)->isDummy()) {
+		if ((*block)->isGenerated())
+			return EMERGE_FROM_MEMORY;
+	} else {
+		// 2). Attempt to load block from disk if it was not in the memory
+		*block = m_map->loadBlock(pos);
+		if (*block && (*block)->isGenerated())
+			return EMERGE_FROM_DISK;
+	}
 
 	// 3). Attempt to start generation
 	if (allow_gen && m_map->initBlockMake(pos, bmdata))
diff --git a/src/emerge.h b/src/emerge.h
index 825ac1c..71ad97d 100644
--- a/src/emerge.h
+++ b/src/emerge.h
@@ -97,8 +97,16 @@ public:
 	u32 gen_notify_on;
 	std::set<u32> gen_notify_on_deco_ids;
 
-	// Map generation parameters
-	MapgenParams params;
+	// Parameters passed to mapgens owned by ServerMap
+	// TODO(hmmmm): Remove this after mapgen helper methods using them
+	// are moved to ServerMap
+	MapgenParams *mgparams;
+
+	// Hackish workaround:
+	// For now, EmergeManager must hold onto a ptr to the Map's setting manager
+	// since the Map can only be accessed through the Environment, and the
+	// Environment is not created until after script initialization.
+	MapSettingsManager *map_settings_mgr;
 
 	// Managers of various map generation-related components
 	BiomeManager *biomemgr;
@@ -110,8 +118,7 @@ public:
 	EmergeManager(IGameDef *gamedef);
 	~EmergeManager();
 
-	void loadMapgenParams();
-	void initMapgens();
+	bool initMapgens(MapgenParams *mgparams);
 
 	void startThreads();
 	void stopThreads();
@@ -140,9 +147,6 @@ public:
 	int getGroundLevelAtPoint(v2s16 p);
 	bool isBlockUnderground(v3s16 blockpos);
 
-	static MapgenFactory *getMapgenFactory(const std::string &mgname);
-	static void getMapgenNames(
-		std::vector<const char *> *mgnames, bool include_hidden);
 	static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize);
 
 private:
@@ -152,7 +156,7 @@ private:
 
 	Mutex m_queue_mutex;
 	std::map<v3s16, BlockEmergeData> m_blocks_enqueued;
-	std::map<u16, u16> m_peer_queue_count;
+	UNORDERED_MAP<u16, u16> m_peer_queue_count;
 
 	u16 m_qlimit_total;
 	u16 m_qlimit_diskonly;
diff --git a/src/environment.cpp b/src/environment.cpp
index 413bc7f..13c64b3 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -69,121 +69,6 @@ Environment::Environment():
 
 Environment::~Environment()
 {
-	// Deallocate players
-	for(std::vector<Player*>::iterator i = m_players.begin();
-			i != m_players.end(); ++i) {
-		delete (*i);
-	}
-}
-
-void Environment::addPlayer(Player *player)
-{
-	DSTACK(FUNCTION_NAME);
-	/*
-		Check that peer_ids are unique.
-		Also check that names are unique.
-		Exception: there can be multiple players with peer_id=0
-	*/
-	// If peer id is non-zero, it has to be unique.
-	if(player->peer_id != 0)
-		FATAL_ERROR_IF(getPlayer(player->peer_id) != NULL, "Peer id not unique");
-	// Name has to be unique.
-	FATAL_ERROR_IF(getPlayer(player->getName()) != NULL, "Player name not unique");
-	// Add.
-	m_players.push_back(player);
-}
-
-void Environment::removePlayer(Player* player)
-{
-	for (std::vector<Player*>::iterator it = m_players.begin();
-			it != m_players.end(); ++it) {
-		if ((*it) == player) {
-			delete *it;
-			m_players.erase(it);
-			return;
-		}
-	}
-}
-
-Player * Environment::getPlayer(u16 peer_id)
-{
-	for(std::vector<Player*>::iterator i = m_players.begin();
-			i != m_players.end(); ++i) {
-		Player *player = *i;
-		if(player->peer_id == peer_id)
-			return player;
-	}
-	return NULL;
-}
-
-Player * Environment::getPlayer(const char *name)
-{
-	for(std::vector<Player*>::iterator i = m_players.begin();
-			i != m_players.end(); ++i) {
-		Player *player = *i;
-		if(strcmp(player->getName(), name) == 0)
-			return player;
-	}
-	return NULL;
-}
-
-Player * Environment::getRandomConnectedPlayer()
-{
-	std::vector<Player*> connected_players = getPlayers(true);
-	u32 chosen_one = myrand() % connected_players.size();
-	u32 j = 0;
-	for(std::vector<Player*>::iterator
-			i = connected_players.begin();
-			i != connected_players.end(); ++i) {
-		if(j == chosen_one) {
-			Player *player = *i;
-			return player;
-		}
-		j++;
-	}
-	return NULL;
-}
-
-Player * Environment::getNearestConnectedPlayer(v3f pos)
-{
-	std::vector<Player*> connected_players = getPlayers(true);
-	f32 nearest_d = 0;
-	Player *nearest_player = NULL;
-	for(std::vector<Player*>::iterator
-			i = connected_players.begin();
-			i != connected_players.end(); ++i) {
-		Player *player = *i;
-		f32 d = player->getPosition().getDistanceFrom(pos);
-		if(d < nearest_d || nearest_player == NULL) {
-			nearest_d = d;
-			nearest_player = player;
-		}
-	}
-	return nearest_player;
-}
-
-std::vector<Player*> Environment::getPlayers()
-{
-	return m_players;
-}
-
-std::vector<Player*> Environment::getPlayers(bool ignore_disconnected)
-{
-	std::vector<Player*> newlist;
-	for(std::vector<Player*>::iterator
-			i = m_players.begin();
-			i != m_players.end(); ++i) {
-		Player *player = *i;
-
-		if(ignore_disconnected) {
-			// Ignore disconnected players
-			if(player->peer_id == 0)
-				continue;
-		}
-
-		newlist.push_back(player);
-	}
-	return newlist;
 }
 
 u32 Environment::getDayNightRatio()
@@ -199,11 +84,6 @@ void Environment::setTimeOfDaySpeed(float speed)
 	m_time_of_day_speed = speed;
 }
 
-float Environment::getTimeOfDaySpeed()
-{
-	return m_time_of_day_speed;
-}
-
 void Environment::setDayNightRatioOverride(bool enable, u32 value)
 {
 	MutexAutoLock lock(this->m_time_lock);
@@ -609,10 +489,16 @@ ServerEnvironment::~ServerEnvironment()
 	m_map->drop();
 
 	// Delete ActiveBlockModifiers
-	for(std::vector<ABMWithState>::iterator
+	for (std::vector<ABMWithState>::iterator
 			i = m_abms.begin(); i != m_abms.end(); ++i){
 		delete i->abm;
 	}
+
+	// Deallocate players
+	for (std::vector<RemotePlayer *>::iterator i = m_players.begin();
+			i != m_players.end(); ++i) {
+		delete (*i);
+	}
 }
 
 Map & ServerEnvironment::getMap()
@@ -625,6 +511,57 @@ ServerMap & ServerEnvironment::getServerMap()
 	return *m_map;
 }
 
+RemotePlayer *ServerEnvironment::getPlayer(const u16 peer_id)
+{
+	for (std::vector<RemotePlayer *>::iterator i = m_players.begin();
+			i != m_players.end(); ++i) {
+		RemotePlayer *player = *i;
+		if (player->peer_id == peer_id)
+			return player;
+	}
+	return NULL;
+}
+
+RemotePlayer *ServerEnvironment::getPlayer(const char* name)
+{
+	for (std::vector<RemotePlayer *>::iterator i = m_players.begin();
+			i != m_players.end(); ++i) {
+		RemotePlayer *player = *i;
+		if (strcmp(player->getName(), name) == 0)
+			return player;
+	}
+	return NULL;
+}
+
+void ServerEnvironment::addPlayer(RemotePlayer *player)
+{
+	DSTACK(FUNCTION_NAME);
+	/*
+		Check that peer_ids are unique.
+		Also check that names are unique.
+		Exception: there can be multiple players with peer_id=0
+	*/
+	// If peer id is non-zero, it has to be unique.
+	if (player->peer_id != 0)
+		FATAL_ERROR_IF(getPlayer(player->peer_id) != NULL, "Peer id not unique");
+	// Name has to be unique.
+	FATAL_ERROR_IF(getPlayer(player->getName()) != NULL, "Player name not unique");
+	// Add.
+	m_players.push_back(player);
+}
+
+void ServerEnvironment::removePlayer(RemotePlayer *player)
+{
+	for (std::vector<RemotePlayer *>::iterator it = m_players.begin();
+			it != m_players.end(); ++it) {
+		if ((*it) == player) {
+			delete *it;
+			m_players.erase(it);
+			return;
+		}
+	}
+}
+
 bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16 *p)
 {
 	float distance = pos1.getDistanceFrom(pos2);
@@ -655,12 +592,11 @@ bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16
 void ServerEnvironment::kickAllPlayers(AccessDeniedCode reason,
 		const std::string &str_reason, bool reconnect)
 {
-	for (std::vector<Player*>::iterator it = m_players.begin();
-			it != m_players.end();
-			++it) {
-		((Server*)m_gamedef)->DenyAccessVerCompliant((*it)->peer_id,
-			(*it)->protocol_version, (AccessDeniedCode)reason,
-			str_reason, reconnect);
+	for (std::vector<RemotePlayer *>::iterator it = m_players.begin();
+			it != m_players.end(); ++it) {
+		RemotePlayer *player = dynamic_cast<RemotePlayer *>(*it);
+		((Server*)m_gamedef)->DenyAccessVerCompliant(player->peer_id,
+				player->protocol_version, reason, str_reason, reconnect);
 	}
 }
 
@@ -669,12 +605,11 @@ void ServerEnvironment::saveLoadedPlayers()
 	std::string players_path = m_path_world + DIR_DELIM "players";
 	fs::CreateDir(players_path);
 
-	for (std::vector<Player*>::iterator it = m_players.begin();
+	for (std::vector<RemotePlayer *>::iterator it = m_players.begin();
 			it != m_players.end();
 			++it) {
-		RemotePlayer *player = static_cast<RemotePlayer*>(*it);
-		if (player->checkModified()) {
-			player->save(players_path);
+		if ((*it)->checkModified()) {
+			(*it)->save(players_path, m_gamedef);
 		}
 	}
 }
@@ -684,19 +619,19 @@ void ServerEnvironment::savePlayer(RemotePlayer *player)
 	std::string players_path = m_path_world + DIR_DELIM "players";
 	fs::CreateDir(players_path);
 
-	player->save(players_path);
+	player->save(players_path, m_gamedef);
 }
 
-Player *ServerEnvironment::loadPlayer(const std::string &playername)
+RemotePlayer *ServerEnvironment::loadPlayer(const std::string &playername, PlayerSAO *sao)
 {
 	bool newplayer = false;
 	bool found = false;
 	std::string players_path = m_path_world + DIR_DELIM "players" DIR_DELIM;
 	std::string path = players_path + playername;
 
-	RemotePlayer *player = static_cast<RemotePlayer *>(getPlayer(playername.c_str()));
+	RemotePlayer *player = getPlayer(playername.c_str());
 	if (!player) {
-		player = new RemotePlayer(m_gamedef, "");
+		player = new RemotePlayer("", m_gamedef->idef());
 		newplayer = true;
 	}
 
@@ -705,7 +640,8 @@ Player *ServerEnvironment::loadPlayer(const std::string &playername)
 		std::ifstream is(path.c_str(), std::ios_base::binary);
 		if (!is.good())
 			continue;
-		player->deSerialize(is, path);
+
+		player->deSerialize(is, path, sao);
 		is.close();
 
 		if (player->getName() == playername) {
@@ -721,11 +657,13 @@ Player *ServerEnvironment::loadPlayer(const std::string &playername)
 				<< " not found" << std::endl;
 		if (newplayer)
 			delete player;
+
 		return NULL;
 	}
 
-	if (newplayer)
+	if (newplayer) {
 		addPlayer(player);
+	}
 	player->setModified(false);
 	return player;
 }
@@ -1030,17 +968,17 @@ void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime)
 	m_lbm_mgr.applyLBMs(this, block, stamp);
 
 	// Run node timers
-	std::map<v3s16, NodeTimer> elapsed_timers =
+	std::vector<NodeTimer> elapsed_timers =
 		block->m_node_timers.step((float)dtime_s);
-	if(!elapsed_timers.empty()){
+	if (!elapsed_timers.empty()) {
 		MapNode n;
-		for(std::map<v3s16, NodeTimer>::iterator
+		for (std::vector<NodeTimer>::iterator
 				i = elapsed_timers.begin();
 				i != elapsed_timers.end(); ++i){
-			n = block->getNodeNoEx(i->first);
-			v3s16 p = i->first + block->getPosRelative();
-			if(m_script->node_on_timer(p,n,i->second.elapsed))
-				block->setNodeTimer(i->first,NodeTimer(i->second.timeout,0));
+			n = block->getNodeNoEx(i->position);
+			v3s16 p = i->position + block->getPosRelative();
+			if (m_script->node_on_timer(p, n, i->elapsed))
+				block->setNodeTimer(NodeTimer(i->timeout, 0, i->position));
 		}
 	}
 
@@ -1124,14 +1062,12 @@ bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n)
 
 void ServerEnvironment::getObjectsInsideRadius(std::vector<u16> &objects, v3f pos, float radius)
 {
-	for(std::map<u16, ServerActiveObject*>::iterator
-			i = m_active_objects.begin();
-			i != m_active_objects.end(); ++i)
-	{
+	for (ActiveObjectMap::iterator i = m_active_objects.begin();
+			i != m_active_objects.end(); ++i) {
 		ServerActiveObject* obj = i->second;
 		u16 id = i->first;
 		v3f objectpos = obj->getBasePosition();
-		if(objectpos.getDistanceFrom(pos) > radius)
+		if (objectpos.getDistanceFrom(pos) > radius)
 			continue;
 		objects.push_back(id);
 	}
@@ -1142,8 +1078,7 @@ void ServerEnvironment::clearObjects(ClearObjectsMode mode)
 	infostream << "ServerEnvironment::clearObjects(): "
 		<< "Removing all active objects" << std::endl;
 	std::vector<u16> objects_to_remove;
-	for (std::map<u16, ServerActiveObject*>::iterator
-			i = m_active_objects.begin();
+	for (ActiveObjectMap::iterator i = m_active_objects.begin();
 			i != m_active_objects.end(); ++i) {
 		ServerActiveObject* obj = i->second;
 		if (obj->getType() == ACTIVEOBJECT_TYPE_PLAYER)
@@ -1311,10 +1246,10 @@ void ServerEnvironment::step(float dtime)
 	*/
 	{
 		ScopeProfiler sp(g_profiler, "SEnv: handle players avg", SPT_AVG);
-		for(std::vector<Player*>::iterator i = m_players.begin();
-				i != m_players.end(); ++i)
-		{
-			Player *player = *i;
+		for (std::vector<RemotePlayer *>::iterator i = m_players.begin();
+				i != m_players.end(); ++i) {
+			RemotePlayer *player = dynamic_cast<RemotePlayer *>(*i);
+			assert(player);
 
 			// Ignore disconnected players
 			if(player->peer_id == 0)
@@ -1334,16 +1269,20 @@ void ServerEnvironment::step(float dtime)
 			Get player block positions
 		*/
 		std::vector<v3s16> players_blockpos;
-		for(std::vector<Player*>::iterator
-				i = m_players.begin();
+		for (std::vector<RemotePlayer *>::iterator i = m_players.begin();
 				i != m_players.end(); ++i) {
-			Player *player = *i;
+			RemotePlayer *player = dynamic_cast<RemotePlayer *>(*i);
+			assert(player);
+
 			// Ignore disconnected players
-			if(player->peer_id == 0)
+			if (player->peer_id == 0)
 				continue;
 
+			PlayerSAO *playersao = player->getPlayerSAO();
+			assert(playersao);
+
 			v3s16 blockpos = getNodeBlockPos(
-					floatToInt(player->getPosition(), BS));
+					floatToInt(playersao->getBasePosition(), BS));
 			players_blockpos.push_back(blockpos);
 		}
 
@@ -1434,17 +1373,18 @@ void ServerEnvironment::step(float dtime)
 					MOD_REASON_BLOCK_EXPIRED);
 
 			// Run node timers
-			std::map<v3s16, NodeTimer> elapsed_timers =
+			std::vector<NodeTimer> elapsed_timers =
 				block->m_node_timers.step((float)dtime);
-			if(!elapsed_timers.empty()){
+			if (!elapsed_timers.empty()) {
 				MapNode n;
-				for(std::map<v3s16, NodeTimer>::iterator
-						i = elapsed_timers.begin();
-						i != elapsed_timers.end(); ++i){
-					n = block->getNodeNoEx(i->first);
-					p = i->first + block->getPosRelative();
-					if(m_script->node_on_timer(p,n,i->second.elapsed))
-						block->setNodeTimer(i->first,NodeTimer(i->second.timeout,0));
+				for (std::vector<NodeTimer>::iterator i = elapsed_timers.begin();
+						i != elapsed_timers.end(); ++i) {
+					n = block->getNodeNoEx(i->position);
+					p = i->position + block->getPosRelative();
+					if (m_script->node_on_timer(p, n, i->elapsed)) {
+						block->setNodeTimer(NodeTimer(
+							i->timeout, 0, i->position));
+					}
 				}
 			}
 		}
@@ -1516,10 +1456,8 @@ void ServerEnvironment::step(float dtime)
 			send_recommended = true;
 		}
 
-		for(std::map<u16, ServerActiveObject*>::iterator
-				i = m_active_objects.begin();
-				i != m_active_objects.end(); ++i)
-		{
+		for(ActiveObjectMap::iterator i = m_active_objects.begin();
+				i != m_active_objects.end(); ++i) {
 			ServerActiveObject* obj = i->second;
 			// Don't step if is to be removed or stored statically
 			if(obj->m_removed || obj->m_pending_deactivation)
@@ -1552,7 +1490,7 @@ void ServerEnvironment::step(float dtime)
 		Manage particle spawner expiration
 	*/
 	if (m_particle_management_interval.step(dtime, 1.0)) {
-		for (std::map<u32, float>::iterator i = m_particle_spawners.begin();
+		for (UNORDERED_MAP<u32, float>::iterator i = m_particle_spawners.begin();
 				i != m_particle_spawners.end(); ) {
 			//non expiring spawners
 			if (i->second == PARTICLE_SPAWNER_NO_EXPIRY) {
@@ -1577,8 +1515,7 @@ u32 ServerEnvironment::addParticleSpawner(float exptime)
 	u32 id = 0;
 	for (;;) { // look for unused particlespawner id
 		id++;
-		std::map<u32, float>::iterator f;
-		f = m_particle_spawners.find(id);
+		UNORDERED_MAP<u32, float>::iterator f = m_particle_spawners.find(id);
 		if (f == m_particle_spawners.end()) {
 			m_particle_spawners[id] = time;
 			break;
@@ -1587,31 +1524,45 @@ u32 ServerEnvironment::addParticleSpawner(float exptime)
 	return id;
 }
 
-void ServerEnvironment::deleteParticleSpawner(u32 id)
+u32 ServerEnvironment::addParticleSpawner(float exptime, u16 attached_id)
+{
+	u32 id = addParticleSpawner(exptime);
+	m_particle_spawner_attachments[id] = attached_id;
+	if (ServerActiveObject *obj = getActiveObject(attached_id)) {
+		obj->attachParticleSpawner(id);
+	}
+	return id;
+}
+
+void ServerEnvironment::deleteParticleSpawner(u32 id, bool remove_from_object)
 {
 	m_particle_spawners.erase(id);
+	UNORDERED_MAP<u32, u16>::iterator it = m_particle_spawner_attachments.find(id);
+	if (it != m_particle_spawner_attachments.end()) {
+		u16 obj_id = (*it).second;
+		ServerActiveObject *sao = getActiveObject(obj_id);
+		if (sao != NULL && remove_from_object) {
+			sao->detachParticleSpawner(id);
+		}
+		m_particle_spawner_attachments.erase(id);
+	}
 }
 
 ServerActiveObject* ServerEnvironment::getActiveObject(u16 id)
 {
-	std::map<u16, ServerActiveObject*>::iterator n;
-	n = m_active_objects.find(id);
-	if(n == m_active_objects.end())
-		return NULL;
-	return n->second;
+	ActiveObjectMap::iterator n = m_active_objects.find(id);
+	return (n != m_active_objects.end() ? n->second : NULL);
 }
 
-bool isFreeServerActiveObjectId(u16 id,
-		std::map<u16, ServerActiveObject*> &objects)
+bool isFreeServerActiveObjectId(u16 id, ActiveObjectMap &objects)
 {
-	if(id == 0)
+	if (id == 0)
 		return false;
 
 	return objects.find(id) == objects.end();
 }
 
-u16 getFreeServerActiveObjectId(
-		std::map<u16, ServerActiveObject*> &objects)
+u16 getFreeServerActiveObjectId(ActiveObjectMap &objects)
 {
 	//try to reuse id's as late as possible
 	static u16 last_used_id = 0;
@@ -1639,7 +1590,7 @@ u16 ServerEnvironment::addActiveObject(ServerActiveObject *object)
 	Finds out what new objects have been added to
 	inside a radius around a position
 */
-void ServerEnvironment::getAddedActiveObjects(Player *player, s16 radius,
+void ServerEnvironment::getAddedActiveObjects(PlayerSAO *playersao, s16 radius,
 		s16 player_radius,
 		std::set<u16> &current_objects,
 		std::queue<u16> &added_objects)
@@ -1649,7 +1600,6 @@ void ServerEnvironment::getAddedActiveObjects(Player *player, s16 radius,
 
 	if (player_radius_f < 0)
 		player_radius_f = 0;
-
 	/*
 		Go through the object list,
 		- discard m_removed objects,
@@ -1657,21 +1607,21 @@ void ServerEnvironment::getAddedActiveObjects(Player *player, s16 radius,
 		- discard objects that are found in current_objects.
 		- add remaining objects to added_objects
 	*/
-	for(std::map<u16, ServerActiveObject*>::iterator
-			i = m_active_objects.begin();
+	for (ActiveObjectMap::iterator i = m_active_objects.begin();
 			i != m_active_objects.end(); ++i) {
 		u16 id = i->first;
 
 		// Get object
 		ServerActiveObject *object = i->second;
-		if(object == NULL)
+		if (object == NULL)
 			continue;
 
 		// Discard if removed or deactivating
 		if(object->m_removed || object->m_pending_deactivation)
 			continue;
 
-		f32 distance_f = object->getBasePosition().getDistanceFrom(player->getPosition());
+		f32 distance_f = object->getBasePosition().
+				getDistanceFrom(playersao->getBasePosition());
 		if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
 			// Discard if too far
 			if (distance_f > player_radius_f && player_radius_f != 0)
@@ -1693,7 +1643,7 @@ void ServerEnvironment::getAddedActiveObjects(Player *player, s16 radius,
 	Finds out what objects have been removed from
 	inside a radius around a position
 */
-void ServerEnvironment::getRemovedActiveObjects(Player *player, s16 radius,
+void ServerEnvironment::getRemovedActiveObjects(PlayerSAO *playersao, s16 radius,
 		s16 player_radius,
 		std::set<u16> &current_objects,
 		std::queue<u16> &removed_objects)
@@ -1703,7 +1653,6 @@ void ServerEnvironment::getRemovedActiveObjects(Player *player, s16 radius,
 
 	if (player_radius_f < 0)
 		player_radius_f = 0;
-
 	/*
 		Go through current_objects; object is removed if:
 		- object is not found in m_active_objects (this is actually an
@@ -1731,7 +1680,7 @@ void ServerEnvironment::getRemovedActiveObjects(Player *player, s16 radius,
 			continue;
 		}
 
-		f32 distance_f = object->getBasePosition().getDistanceFrom(player->getPosition());
+		f32 distance_f = object->getBasePosition().getDistanceFrom(playersao->getBasePosition());
 		if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
 			if (distance_f <= player_radius_f || player_radius_f == 0)
 				continue;
@@ -1754,8 +1703,7 @@ void ServerEnvironment::setStaticForActiveObjectsInBlock(
 			so_it = block->m_static_objects.m_active.begin();
 			so_it != block->m_static_objects.m_active.end(); ++so_it) {
 		// Get the ServerActiveObject counterpart to this StaticObject
-		std::map<u16, ServerActiveObject *>::iterator ao_it;
-		ao_it = m_active_objects.find(so_it->first);
+		ActiveObjectMap::iterator ao_it = m_active_objects.find(so_it->first);
 		if (ao_it == m_active_objects.end()) {
 			// If this ever happens, there must be some kind of nasty bug.
 			errorstream << "ServerEnvironment::setStaticForObjectsInBlock(): "
@@ -1804,8 +1752,8 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
 		verbosestream<<"ServerEnvironment::addActiveObjectRaw(): "
 				<<"supplied with id "<<object->getId()<<std::endl;
 	}
-	if(isFreeServerActiveObjectId(object->getId(), m_active_objects) == false)
-	{
+
+	if(!isFreeServerActiveObjectId(object->getId(), m_active_objects)) {
 		errorstream<<"ServerEnvironment::addActiveObjectRaw(): "
 				<<"id is not free ("<<object->getId()<<")"<<std::endl;
 		if(object->environmentDeletes())
@@ -1873,8 +1821,7 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
 void ServerEnvironment::removeRemovedObjects()
 {
 	std::vector<u16> objects_to_remove;
-	for(std::map<u16, ServerActiveObject*>::iterator
-			i = m_active_objects.begin();
+	for(ActiveObjectMap::iterator i = m_active_objects.begin();
 			i != m_active_objects.end(); ++i) {
 		u16 id = i->first;
 		ServerActiveObject* obj = i->second;
@@ -1892,7 +1839,7 @@ void ServerEnvironment::removeRemovedObjects()
 			We will delete objects that are marked as removed or thatare
 			waiting for deletion after deactivation
 		*/
-		if(obj->m_removed == false && obj->m_pending_deactivation == false)
+		if (!obj->m_removed && !obj->m_pending_deactivation)
 			continue;
 
 		/*
@@ -2092,8 +2039,7 @@ void ServerEnvironment::activateObjects(MapBlock *block, u32 dtime_s)
 void ServerEnvironment::deactivateFarObjects(bool force_delete)
 {
 	std::vector<u16> objects_to_remove;
-	for(std::map<u16, ServerActiveObject*>::iterator
-			i = m_active_objects.begin();
+	for(ActiveObjectMap::iterator i = m_active_objects.begin();
 			i != m_active_objects.end(); ++i) {
 		ServerActiveObject* obj = i->second;
 		assert(obj);
@@ -2234,13 +2180,13 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete)
 
 			if(block)
 			{
-				if(block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")){
-					errorstream<<"ServerEnv: Trying to store id="<<obj->getId()
-							<<" statically but block "<<PP(blockpos)
-							<<" already contains "
-							<<block->m_static_objects.m_stored.size()
-							<<" objects."
-							<<" Forcing delete."<<std::endl;
+				if (block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")) {
+					warningstream << "ServerEnv: Trying to store id = " << obj->getId()
+							<< " statically but block " << PP(blockpos)
+							<< " already contains "
+							<< block->m_static_objects.m_stored.size()
+							<< " objects."
+							<< " Forcing delete." << std::endl;
 					force_delete = true;
 				} else {
 					// If static counterpart already exists in target block,
@@ -2329,6 +2275,7 @@ ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr,
 		ITextureSource *texturesource, IGameDef *gamedef,
 		IrrlichtDevice *irr):
 	m_map(map),
+	m_local_player(NULL),
 	m_smgr(smgr),
 	m_texturesource(texturesource),
 	m_gamedef(gamedef),
@@ -2341,10 +2288,8 @@ ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr,
 ClientEnvironment::~ClientEnvironment()
 {
 	// delete active objects
-	for(std::map<u16, ClientActiveObject*>::iterator
-			i = m_active_objects.begin();
-			i != m_active_objects.end(); ++i)
-	{
+	for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin();
+			i != m_active_objects.end(); ++i) {
 		delete i->second;
 	}
 
@@ -2367,28 +2312,16 @@ ClientMap & ClientEnvironment::getClientMap()
 	return *m_map;
 }
 
-void ClientEnvironment::addPlayer(Player *player)
+void ClientEnvironment::setLocalPlayer(LocalPlayer *player)
 {
 	DSTACK(FUNCTION_NAME);
 	/*
-		It is a failure if player is local and there already is a local
-		player
+		It is a failure if already is a local player
 	*/
-	FATAL_ERROR_IF(player->isLocal() == true && getLocalPlayer() != NULL,
-		"Player is local but there is already a local player");
+	FATAL_ERROR_IF(m_local_player != NULL,
+			"Local player already allocated");
 
-	Environment::addPlayer(player);
-}
-
-LocalPlayer * ClientEnvironment::getLocalPlayer()
-{
-	for(std::vector<Player*>::iterator i = m_players.begin();
-			i != m_players.end(); ++i) {
-		Player *player = *i;
-		if(player->isLocal())
-			return (LocalPlayer*)player;
-	}
-	return NULL;
+	m_local_player = player;
 }
 
 void ClientEnvironment::step(float dtime)
@@ -2469,11 +2402,11 @@ void ClientEnvironment::step(float dtime)
 
 		{
 			// Apply physics
-			if(free_move == false && is_climbing == false)
+			if(!free_move && !is_climbing)
 			{
 				// Gravity
 				v3f speed = lplayer->getSpeed();
-				if(lplayer->in_liquid == false)
+				if(!lplayer->in_liquid)
 					speed.Y -= lplayer->movement_gravity * lplayer->physics_override_gravity * dtime_part * 2;
 
 				// Liquid floating / sinking
@@ -2625,23 +2558,6 @@ void ClientEnvironment::step(float dtime)
 		}
 	}
 
-	/*
-		Stuff that can be done in an arbitarily large dtime
-	*/
-	for(std::vector<Player*>::iterator i = m_players.begin();
-			i != m_players.end(); ++i) {
-		Player *player = *i;
-
-		/*
-			Handle non-local players
-		*/
-		if(player->isLocal() == false) {
-			// Move
-			player->move(dtime, this, 100*BS);
-
-		}
-	}
-
 	// Update lighting on local player (used for wield item)
 	u32 day_night_ratio = getDayNightRatio();
 	{
@@ -2666,10 +2582,8 @@ void ClientEnvironment::step(float dtime)
 
 	g_profiler->avg("CEnv: num of objects", m_active_objects.size());
 	bool update_lighting = m_active_object_light_update_interval.step(dtime, 0.21);
-	for(std::map<u16, ClientActiveObject*>::iterator
-			i = m_active_objects.begin();
-			i != m_active_objects.end(); ++i)
-	{
+	for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin();
+			i != m_active_objects.end(); ++i) {
 		ClientActiveObject* obj = i->second;
 		// Step object
 		obj->step(dtime, this);
@@ -2728,15 +2642,14 @@ GenericCAO* ClientEnvironment::getGenericCAO(u16 id)
 
 ClientActiveObject* ClientEnvironment::getActiveObject(u16 id)
 {
-	std::map<u16, ClientActiveObject*>::iterator n;
-	n = m_active_objects.find(id);
-	if(n == m_active_objects.end())
+	UNORDERED_MAP<u16, ClientActiveObject*>::iterator n = m_active_objects.find(id);
+	if (n == m_active_objects.end())
 		return NULL;
 	return n->second;
 }
 
-bool isFreeClientActiveObjectId(u16 id,
-		std::map<u16, ClientActiveObject*> &objects)
+bool isFreeClientActiveObjectId(const u16 id,
+	UNORDERED_MAP<u16, ClientActiveObject*> &objects)
 {
 	if(id == 0)
 		return false;
@@ -2744,19 +2657,17 @@ bool isFreeClientActiveObjectId(u16 id,
 	return objects.find(id) == objects.end();
 }
 
-u16 getFreeClientActiveObjectId(
-		std::map<u16, ClientActiveObject*> &objects)
+u16 getFreeClientActiveObjectId(UNORDERED_MAP<u16, ClientActiveObject*> &objects)
 {
 	//try to reuse id's as late as possible
 	static u16 last_used_id = 0;
 	u16 startid = last_used_id;
-	for(;;)
-	{
+	for(;;) {
 		last_used_id ++;
-		if(isFreeClientActiveObjectId(last_used_id, objects))
+		if (isFreeClientActiveObjectId(last_used_id, objects))
 			return last_used_id;
 
-		if(last_used_id == startid)
+		if (last_used_id == startid)
 			return 0;
 	}
 }
@@ -2776,8 +2687,7 @@ u16 ClientEnvironment::addActiveObject(ClientActiveObject *object)
 		}
 		object->setId(new_id);
 	}
-	if(isFreeClientActiveObjectId(object->getId(), m_active_objects) == false)
-	{
+	if (!isFreeClientActiveObjectId(object->getId(), m_active_objects)) {
 		infostream<<"ClientEnvironment::addActiveObject(): "
 				<<"id is not free ("<<object->getId()<<")"<<std::endl;
 		delete object;
@@ -2841,8 +2751,7 @@ void ClientEnvironment::removeActiveObject(u16 id)
 	verbosestream<<"ClientEnvironment::removeActiveObject(): "
 			<<"id="<<id<<std::endl;
 	ClientActiveObject* obj = getActiveObject(id);
-	if(obj == NULL)
-	{
+	if (obj == NULL) {
 		infostream<<"ClientEnvironment::removeActiveObject(): "
 				<<"id="<<id<<" not found"<<std::endl;
 		return;
@@ -2910,10 +2819,8 @@ void ClientEnvironment::updateLocalPlayerBreath(u16 breath)
 void ClientEnvironment::getActiveObjects(v3f origin, f32 max_d,
 		std::vector<DistanceSortedActiveObject> &dest)
 {
-	for(std::map<u16, ClientActiveObject*>::iterator
-			i = m_active_objects.begin();
-			i != m_active_objects.end(); ++i)
-	{
+	for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin();
+			i != m_active_objects.end(); ++i) {
 		ClientActiveObject* obj = i->second;
 
 		f32 d = (obj->getPosition() - origin).getLength();
diff --git a/src/environment.h b/src/environment.h
index c6786fa..4bee40e 100644
--- a/src/environment.h
+++ b/src/environment.h
@@ -54,6 +54,7 @@ class ClientMap;
 class GameScripting;
 class Player;
 class RemotePlayer;
+class PlayerSAO;
 
 class Environment
 {
@@ -72,15 +73,6 @@ public:
 
 	virtual Map & getMap() = 0;
 
-	virtual void addPlayer(Player *player);
-	void removePlayer(Player *player);
-	Player * getPlayer(u16 peer_id);
-	Player * getPlayer(const char *name);
-	Player * getRandomConnectedPlayer();
-	Player * getNearestConnectedPlayer(v3f pos);
-	std::vector<Player*> getPlayers();
-	std::vector<Player*> getPlayers(bool ignore_disconnected);
-
 	u32 getDayNightRatio();
 
 	// 0-23999
@@ -91,7 +83,6 @@ public:
 	void stepTimeOfDay(float dtime);
 
 	void setTimeOfDaySpeed(float speed);
-	float getTimeOfDaySpeed();
 
 	void setDayNightRatioOverride(bool enable, u32 value);
 
@@ -101,9 +92,6 @@ public:
 	u32 m_added_objects;
 
 protected:
-	// peer_ids in here should be unique, except that there may be many 0s
-	std::vector<Player*> m_players;
-
 	GenericAtomic<float> m_time_of_day_speed;
 
 	/*
@@ -300,6 +288,8 @@ enum ClearObjectsMode {
 	This is not thread-safe. Server uses an environment mutex.
 */
 
+typedef UNORDERED_MAP<u16, ServerActiveObject *> ActiveObjectMap;
+
 class ServerEnvironment : public Environment
 {
 public:
@@ -326,7 +316,9 @@ public:
 	// Save players
 	void saveLoadedPlayers();
 	void savePlayer(RemotePlayer *player);
-	Player *loadPlayer(const std::string &playername);
+	RemotePlayer *loadPlayer(const std::string &playername, PlayerSAO *sao);
+	void addPlayer(RemotePlayer *player);
+	void removePlayer(RemotePlayer *player);
 
 	/*
 		Save and load time of day and game timer
@@ -338,7 +330,8 @@ public:
 	void loadDefaultMeta();
 
 	u32 addParticleSpawner(float exptime);
-	void deleteParticleSpawner(u32 id);
+	u32 addParticleSpawner(float exptime, u16 attached_id);
+	void deleteParticleSpawner(u32 id, bool remove_from_object = true);
 
 	/*
 		External ActiveObject interface
@@ -370,7 +363,7 @@ public:
 		Find out what new objects have been added to
 		inside a radius around a position
 	*/
-	void getAddedActiveObjects(Player *player, s16 radius,
+	void getAddedActiveObjects(PlayerSAO *playersao, s16 radius,
 			s16 player_radius,
 			std::set<u16> &current_objects,
 			std::queue<u16> &added_objects);
@@ -379,7 +372,7 @@ public:
 		Find out what new objects have been removed from
 		inside a radius around a position
 	*/
-	void getRemovedActiveObjects(Player* player, s16 radius,
+	void getRemovedActiveObjects(PlayerSAO *playersao, s16 radius,
 			s16 player_radius,
 			std::set<u16> &current_objects,
 			std::queue<u16> &removed_objects);
@@ -438,6 +431,8 @@ public:
 	void setStaticForActiveObjectsInBlock(v3s16 blockpos,
 		bool static_exists, v3s16 static_block=v3s16(0,0,0));
 
+	RemotePlayer *getPlayer(const u16 peer_id);
+	RemotePlayer *getPlayer(const char* name);
 private:
 
 	/*
@@ -491,7 +486,7 @@ private:
 	// World path
 	const std::string m_path_world;
 	// Active object list
-	std::map<u16, ServerActiveObject*> m_active_objects;
+	ActiveObjectMap m_active_objects;
 	// Outgoing network message buffer for active objects
 	std::queue<ActiveObjectMessage> m_active_object_messages;
 	// Some timers
@@ -520,9 +515,13 @@ private:
 	// Can raise to high values like 15s with eg. map generation mods.
 	float m_max_lag_estimate;
 
+	// peer_ids in here should be unique, except that there may be many 0s
+	std::vector<RemotePlayer*> m_players;
+
 	// Particles
 	IntervalLimiter m_particle_management_interval;
-	std::map<u32, float> m_particle_spawners;
+	UNORDERED_MAP<u32, float> m_particle_spawners;
+	UNORDERED_MAP<u32, u16> m_particle_spawner_attachments;
 };
 
 #ifndef SERVER
@@ -579,8 +578,8 @@ public:
 
 	void step(f32 dtime);
 
-	virtual void addPlayer(Player *player);
-	LocalPlayer * getLocalPlayer();
+	virtual void setLocalPlayer(LocalPlayer *player);
+	LocalPlayer *getLocalPlayer() { return m_local_player; }
 
 	/*
 		ClientSimpleObjects
@@ -630,24 +629,20 @@ public:
 
 	u16 attachement_parent_ids[USHRT_MAX + 1];
 
-	std::list<std::string> getPlayerNames()
-	{ return m_player_names; }
-	void addPlayerName(std::string name)
-	{ m_player_names.push_back(name); }
-	void removePlayerName(std::string name)
-	{ m_player_names.remove(name); }
+	const std::list<std::string> &getPlayerNames() { return m_player_names; }
+	void addPlayerName(const std::string &name) { m_player_names.push_back(name); }
+	void removePlayerName(const std::string &name) { m_player_names.remove(name); }
 	void updateCameraOffset(v3s16 camera_offset)
 	{ m_camera_offset = camera_offset; }
-	v3s16 getCameraOffset()
-	{ return m_camera_offset; }
-
+	v3s16 getCameraOffset() const { return m_camera_offset; }
 private:
 	ClientMap *m_map;
+	LocalPlayer *m_local_player;
 	scene::ISceneManager *m_smgr;
 	ITextureSource *m_texturesource;
 	IGameDef *m_gamedef;
 	IrrlichtDevice *m_irr;
-	std::map<u16, ClientActiveObject*> m_active_objects;
+	UNORDERED_MAP<u16, ClientActiveObject*> m_active_objects;
 	std::vector<ClientSimpleObject*> m_simple_objects;
 	std::queue<ClientEnvEvent> m_client_event_queue;
 	IntervalLimiter m_active_object_light_update_interval;
diff --git a/src/exceptions.h b/src/exceptions.h
index 4f18f70..67a2d0d 100644
--- a/src/exceptions.h
+++ b/src/exceptions.h
@@ -65,6 +65,11 @@ public:
 	FileNotGoodException(const std::string &s): BaseException(s) {}
 };
 
+class DatabaseException : public BaseException {
+public:
+	DatabaseException(const std::string &s): BaseException(s) {}
+};
+
 class SerializationError : public BaseException {
 public:
 	SerializationError(const std::string &s): BaseException(s) {}
diff --git a/src/filesys.cpp b/src/filesys.cpp
index b4c52ab..bd8b94a 100644
--- a/src/filesys.cpp
+++ b/src/filesys.cpp
@@ -617,48 +617,51 @@ std::string RemoveRelativePathComponents(std::string path)
 {
 	size_t pos = path.size();
 	size_t dotdot_count = 0;
-	while(pos != 0){
+	while (pos != 0) {
 		size_t component_with_delim_end = pos;
 		// skip a dir delimiter
-		while(pos != 0 && IsDirDelimiter(path[pos-1]))
+		while (pos != 0 && IsDirDelimiter(path[pos-1]))
 			pos--;
 		// strip a path component
 		size_t component_end = pos;
-		while(pos != 0 && !IsDirDelimiter(path[pos-1]))
+		while (pos != 0 && !IsDirDelimiter(path[pos-1]))
 			pos--;
 		size_t component_start = pos;
 
 		std::string component = path.substr(component_start,
 				component_end - component_start);
 		bool remove_this_component = false;
-		if(component == "."){
+		if (component == ".") {
 			remove_this_component = true;
-		}
-		else if(component == ".."){
+		} else if (component == "..") {
 			remove_this_component = true;
 			dotdot_count += 1;
-		}
-		else if(dotdot_count != 0){
+		} else if (dotdot_count != 0) {
 			remove_this_component = true;
 			dotdot_count -= 1;
 		}
 
-		if(remove_this_component){
-			while(pos != 0 && IsDirDelimiter(path[pos-1]))
+		if (remove_this_component) {
+			while (pos != 0 && IsDirDelimiter(path[pos-1]))
 				pos--;
-			path = path.substr(0, pos) + DIR_DELIM +
-				path.substr(component_with_delim_end,
-						std::string::npos);
-			pos++;
+			if (component_start == 0) {
+				// We need to remove the delemiter too
+				path = path.substr(component_with_delim_end, std::string::npos);
+			} else {
+				path = path.substr(0, pos) + DIR_DELIM +
+					path.substr(component_with_delim_end, std::string::npos);
+			}
+			if (pos > 0)
+				pos++;
 		}
 	}
 
-	if(dotdot_count > 0)
+	if (dotdot_count > 0)
 		return "";
 
 	// remove trailing dir delimiters
 	pos = path.size();
-	while(pos != 0 && IsDirDelimiter(path[pos-1]))
+	while (pos != 0 && IsDirDelimiter(path[pos-1]))
 		pos--;
 	return path.substr(0, pos);
 }
diff --git a/src/game.cpp b/src/game.cpp
index 23f261c..966c230 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -23,6 +23,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "camera.h"
 #include "client.h"
 #include "client/tile.h"     // For TextureSource
+#include "client/keys.h"
+#include "client/joystick_controller.h"
 #include "clientmap.h"
 #include "clouds.h"
 #include "config.h"
@@ -55,6 +57,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "tool.h"
 #include "util/directiontables.h"
 #include "util/pointedthing.h"
+#include "irrlicht_changes/static_text.h"
 #include "version.h"
 #include "minimap.h"
 #include "mapblock_mesh.h"
@@ -359,6 +362,7 @@ PointedThing getPointedThing(Client *client, Hud *hud, const v3f &player_positio
 
 			min_distance = (selected_object->getPosition() - camera_position).getLength();
 
+			hud->setSelectedFaceNormal(v3f(0.0, 0.0, 0.0));
 			result.type = POINTEDTHING_OBJECT;
 			result.object_id = selected_object->getId();
 		}
@@ -470,6 +474,7 @@ PointedThing getPointedThing(Client *client, Hud *hud, const v3f &player_positio
 				if (!facebox.intersectsWithLine(shootline))
 					continue;
 				result.node_abovesurface = pointed_pos + facedir;
+				hud->setSelectedFaceNormal(v3f(facedir.X, facedir.Y, facedir.Z));
 				face_min_distance = distance;
 			}
 		}
@@ -537,7 +542,7 @@ void update_profiler_gui(gui::IGUIStaticText *guitext_profiler, FontEngine *fe,
 		std::ostringstream os(std::ios_base::binary);
 		g_profiler->printPage(os, show_profiler, show_profiler_max);
 		std::wstring text = utf8_to_wide(os.str());
-		guitext_profiler->setText(text.c_str());
+		setStaticText(guitext_profiler, text.c_str());
 		guitext_profiler->setVisible(true);
 
 		s32 w = fe->getTextWidth(text.c_str());
@@ -602,6 +607,8 @@ public:
 	void draw(s32 x_left, s32 y_bottom, video::IVideoDriver *driver,
 		  gui::IGUIFont *font) const
 	{
+		// Do *not* use UNORDERED_MAP here as the order needs
+		// to be the same for each call to prevent flickering
 		std::map<std::string, Meta> m_meta;
 
 		for (std::deque<Piece>::const_iterator k = m_log.begin();
@@ -612,8 +619,7 @@ public:
 					i != piece.values.end(); ++i) {
 				const std::string &id = i->first;
 				const float &value = i->second;
-				std::map<std::string, Meta>::iterator j =
-					m_meta.find(id);
+				std::map<std::string, Meta>::iterator j = m_meta.find(id);
 
 				if (j == m_meta.end()) {
 					m_meta[id] = Meta(value);
@@ -867,7 +873,7 @@ public:
 			return;
 
 		m_fetched.insert(name);
-		std::string base = porting::path_share + DIR_DELIM + "testsounds";
+		std::string base = porting::path_share + DIR_DELIM + "sounds";
 		dst_paths.insert(base + DIR_DELIM + name + ".ogg");
 		dst_paths.insert(base + DIR_DELIM + name + ".0.ogg");
 		dst_paths.insert(base + DIR_DELIM + name + ".1.ogg");
@@ -882,40 +888,73 @@ public:
 	}
 };
 
+
+// before 1.8 there isn't a "integer interface", only float
+#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
+typedef f32 SamplerLayer_t;
+#else
+typedef s32 SamplerLayer_t;
+#endif
+
+
 class GameGlobalShaderConstantSetter : public IShaderConstantSetter
 {
 	Sky *m_sky;
 	bool *m_force_fog_off;
 	f32 *m_fog_range;
+	bool m_fog_enabled;
+	CachedPixelShaderSetting<float, 4> m_sky_bg_color;
+	CachedPixelShaderSetting<float> m_fog_distance;
+	CachedVertexShaderSetting<float> m_animation_timer_vertex;
+	CachedPixelShaderSetting<float> m_animation_timer_pixel;
+	CachedPixelShaderSetting<float> m_day_night_ratio;
+	CachedPixelShaderSetting<float, 3> m_eye_position_pixel;
+	CachedVertexShaderSetting<float, 3> m_eye_position_vertex;
+	CachedPixelShaderSetting<float, 3> m_minimap_yaw;
+	CachedPixelShaderSetting<SamplerLayer_t> m_base_texture;
+	CachedPixelShaderSetting<SamplerLayer_t> m_normal_texture;
+	CachedPixelShaderSetting<SamplerLayer_t> m_texture_flags;
 	Client *m_client;
-	bool m_fogEnabled;
 
 public:
 	void onSettingsChange(const std::string &name)
 	{
 		if (name == "enable_fog")
-			m_fogEnabled = g_settings->getBool("enable_fog");
+			m_fog_enabled = g_settings->getBool("enable_fog");
 	}
 
-	static void SettingsCallback(const std::string &name, void *userdata)
+	static void settingsCallback(const std::string &name, void *userdata)
 	{
 		reinterpret_cast<GameGlobalShaderConstantSetter*>(userdata)->onSettingsChange(name);
 	}
 
+	void setSky(Sky *sky) { m_sky = sky; }
+
 	GameGlobalShaderConstantSetter(Sky *sky, bool *force_fog_off,
 			f32 *fog_range, Client *client) :
 		m_sky(sky),
 		m_force_fog_off(force_fog_off),
 		m_fog_range(fog_range),
+		m_sky_bg_color("skyBgColor"),
+		m_fog_distance("fogDistance"),
+		m_animation_timer_vertex("animationTimer"),
+		m_animation_timer_pixel("animationTimer"),
+		m_day_night_ratio("dayNightRatio"),
+		m_eye_position_pixel("eyePosition"),
+		m_eye_position_vertex("eyePosition"),
+		m_minimap_yaw("yawVec"),
+		m_base_texture("baseTexture"),
+		m_normal_texture("normalTexture"),
+		m_texture_flags("textureFlags"),
 		m_client(client)
 	{
-		g_settings->registerChangedCallback("enable_fog", SettingsCallback, this);
-		m_fogEnabled = g_settings->getBool("enable_fog");
+		g_settings->registerChangedCallback("enable_fog", settingsCallback, this);
+		m_fog_enabled = g_settings->getBool("enable_fog");
 	}
 
 	~GameGlobalShaderConstantSetter()
 	{
-		g_settings->deregisterChangedCallback("enable_fog", SettingsCallback, this);
+		g_settings->deregisterChangedCallback("enable_fog", settingsCallback, this);
 	}
 
 	virtual void onSetConstants(video::IMaterialRendererServices *services,
@@ -933,54 +972,92 @@ public:
 			bgcolorf.b,
 			bgcolorf.a,
 		};
-		services->setPixelShaderConstant("skyBgColor", bgcolorfa, 4);
+		m_sky_bg_color.set(bgcolorfa, services);
 
 		// Fog distance
 		float fog_distance = 10000 * BS;
 
-		if (m_fogEnabled && !*m_force_fog_off)
+		if (m_fog_enabled && !*m_force_fog_off)
 			fog_distance = *m_fog_range;
 
-		services->setPixelShaderConstant("fogDistance", &fog_distance, 1);
+		m_fog_distance.set(&fog_distance, services);
 
-		// Day-night ratio
-		u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
-		float daynight_ratio_f = (float)daynight_ratio / 1000.0;
-		services->setPixelShaderConstant("dayNightRatio", &daynight_ratio_f, 1);
+		float daynight_ratio = (float)m_client->getEnv().getDayNightRatio() / 1000.f;
+		m_day_night_ratio.set(&daynight_ratio, services);
 
 		u32 animation_timer = porting::getTimeMs() % 100000;
-		float animation_timer_f = (float)animation_timer / 100000.0;
-		services->setPixelShaderConstant("animationTimer", &animation_timer_f, 1);
-		services->setVertexShaderConstant("animationTimer", &animation_timer_f, 1);
+		float animation_timer_f = (float)animation_timer / 100000.f;
+		m_animation_timer_vertex.set(&animation_timer_f, services);
+		m_animation_timer_pixel.set(&animation_timer_f, services);
 
-		LocalPlayer *player = m_client->getEnv().getLocalPlayer();
-		v3f eye_position = player->getEyePosition();
-		services->setPixelShaderConstant("eyePosition", (irr::f32 *)&eye_position, 3);
-		services->setVertexShaderConstant("eyePosition", (irr::f32 *)&eye_position, 3);
-
-		v3f minimap_yaw_vec = m_client->getMapper()->getYawVec();
-		services->setPixelShaderConstant("yawVec", (irr::f32 *)&minimap_yaw_vec, 3);
+		float eye_position_array[3];
+		v3f epos = m_client->getEnv().getLocalPlayer()->getEyePosition();
+#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
+		eye_position_array[0] = epos.X;
+		eye_position_array[1] = epos.Y;
+		eye_position_array[2] = epos.Z;
+#else
+		epos.getAs3Values(eye_position_array);
+#endif
+		m_eye_position_pixel.set(eye_position_array, services);
+		m_eye_position_vertex.set(eye_position_array, services);
 
-		// Uniform sampler layers
-		// before 1.8 there isn't a "integer interface", only float
+		float minimap_yaw_array[3];
+		v3f minimap_yaw = m_client->getMapper()->getYawVec();
 #if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
-		f32 layer0 = 0;
-		f32 layer1 = 1;
-		f32 layer2 = 2;
-		services->setPixelShaderConstant("baseTexture" , (irr::f32 *)&layer0, 1);
-		services->setPixelShaderConstant("normalTexture" , (irr::f32 *)&layer1, 1);
-		services->setPixelShaderConstant("textureFlags" , (irr::f32 *)&layer2, 1);
+		minimap_yaw_array[0] = minimap_yaw.X;
+		minimap_yaw_array[1] = minimap_yaw.Y;
+		minimap_yaw_array[2] = minimap_yaw.Z;
 #else
-		s32 layer0 = 0;
-		s32 layer1 = 1;
-		s32 layer2 = 2;
-		services->setPixelShaderConstant("baseTexture" , (irr::s32 *)&layer0, 1);
-		services->setPixelShaderConstant("normalTexture" , (irr::s32 *)&layer1, 1);
-		services->setPixelShaderConstant("textureFlags" , (irr::s32 *)&layer2, 1);
+		minimap_yaw.getAs3Values(minimap_yaw_array);
 #endif
+		m_minimap_yaw.set(minimap_yaw_array, services);
+
+		SamplerLayer_t base_tex = 0,
+				normal_tex = 1,
+				flags_tex = 2;
+		m_base_texture.set(&base_tex, services);
+		m_normal_texture.set(&normal_tex, services);
+		m_texture_flags.set(&flags_tex, services);
+	}
+};
+
+
+class GameGlobalShaderConstantSetterFactory : public IShaderConstantSetterFactory
+{
+	Sky *m_sky;
+	bool *m_force_fog_off;
+	f32 *m_fog_range;
+	Client *m_client;
+	std::vector<GameGlobalShaderConstantSetter *> created_nosky;
+public:
+	GameGlobalShaderConstantSetterFactory(bool *force_fog_off,
+			f32 *fog_range, Client *client) :
+		m_sky(NULL),
+		m_force_fog_off(force_fog_off),
+		m_fog_range(fog_range),
+		m_client(client)
+	{}
+
+	void setSky(Sky *sky) {
+		m_sky = sky;
+		for (size_t i = 0; i < created_nosky.size(); ++i) {
+			created_nosky[i]->setSky(m_sky);
+		}
+		created_nosky.clear();
+	}
+
+	virtual IShaderConstantSetter* create()
+	{
+		GameGlobalShaderConstantSetter *scs = new GameGlobalShaderConstantSetter(
+				m_sky, m_force_fog_off, m_fog_range, m_client);
+		if (!m_sky)
+			created_nosky.push_back(scs);
+		return scs;
 	}
 };
 
+
 bool nodePlacementPrediction(Client &client,
 		const ItemDefinition &playeritem_def, v3s16 nodepos, v3s16 neighbourpos)
 {
@@ -1106,12 +1183,14 @@ bool nodePlacementPrediction(Client &client,
 static inline void create_formspec_menu(GUIFormSpecMenu **cur_formspec,
 		InventoryManager *invmgr, IGameDef *gamedef,
 		IWritableTextureSource *tsrc, IrrlichtDevice *device,
+		JoystickController *joystick,
 		IFormSource *fs_src, TextDest *txt_dest, Client *client)
 {
 
 	if (*cur_formspec == 0) {
-		*cur_formspec = new GUIFormSpecMenu(device, guiroot, -1, &g_menumgr,
-						    invmgr, gamedef, tsrc, fs_src, txt_dest, client);
+		*cur_formspec = new GUIFormSpecMenu(device, joystick,
+			guiroot, -1, &g_menumgr, invmgr, gamedef, tsrc,
+			fs_src, txt_dest, client);
 		(*cur_formspec)->doPause = false;
 
 		/*
@@ -1126,6 +1205,7 @@ static inline void create_formspec_menu(GUIFormSpecMenu **cur_formspec,
 		(*cur_formspec)->setFormSource(fs_src);
 		(*cur_formspec)->setTextDest(txt_dest);
 	}
+
 }
 
 #ifdef __ANDROID__
@@ -1136,7 +1216,8 @@ static inline void create_formspec_menu(GUIFormSpecMenu **cur_formspec,
 
 static void show_deathscreen(GUIFormSpecMenu **cur_formspec,
 		InventoryManager *invmgr, IGameDef *gamedef,
-		IWritableTextureSource *tsrc, IrrlichtDevice *device, Client *client)
+		IWritableTextureSource *tsrc, IrrlichtDevice *device,
+		JoystickController *joystick, Client *client)
 {
 	std::string formspec =
 		std::string(FORMSPEC_VERSION_STRING) +
@@ -1152,14 +1233,15 @@ static void show_deathscreen(GUIFormSpecMenu **cur_formspec,
 	FormspecFormSource *fs_src = new FormspecFormSource(formspec);
 	LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_DEATH_SCREEN", client);
 
-	create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device,  fs_src, txt_dst, NULL);
+	create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device,
+		joystick, fs_src, txt_dst, NULL);
 }
 
 /******************************************************************************/
 static void show_pause_menu(GUIFormSpecMenu **cur_formspec,
 		InventoryManager *invmgr, IGameDef *gamedef,
 		IWritableTextureSource *tsrc, IrrlichtDevice *device,
-		bool singleplayermode)
+		JoystickController *joystick, bool singleplayermode)
 {
 #ifdef __ANDROID__
 	std::string control_text = strgettext("Default Controls:\n"
@@ -1224,7 +1306,8 @@ static void show_pause_menu(GUIFormSpecMenu **cur_formspec,
 	FormspecFormSource *fs_src = new FormspecFormSource(os.str());
 	LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_PAUSE_MENU");
 
-	create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device,  fs_src, txt_dst, NULL);
+	create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device,
+		joystick, fs_src, txt_dst, NULL);
 	std::string con("btn_continue");
 	(*cur_formspec)->setFocus(con);
 	(*cur_formspec)->doPause = true;
@@ -1240,7 +1323,11 @@ static void updateChat(Client &client, f32 dtime, bool show_debug,
 
 	// Get new messages from error log buffer
 	while (!chat_log_error_buf.empty()) {
-		chat_backend.addMessage(L"", utf8_to_wide(chat_log_error_buf.get()));
+		std::wstring error_message = utf8_to_wide(chat_log_error_buf.get());
+		if (!g_settings->getBool("disable_escape_sequences")) {
+			error_message = L"\x1b(c at red)" + error_message + L"\x1b(c at white)";
+		}
+		chat_backend.addMessage(L"", error_message);
 	}
 
 	// Get new messages from client
@@ -1255,19 +1342,19 @@ static void updateChat(Client &client, f32 dtime, bool show_debug,
 
 	// Display all messages in a static text element
 	unsigned int recent_chat_count = chat_backend.getRecentBuffer().getLineCount();
-	std::wstring recent_chat       = chat_backend.getRecentChat();
+	EnrichedString recent_chat     = chat_backend.getRecentChat();
 	unsigned int line_height       = g_fontengine->getLineHeight();
 
-	guitext_chat->setText(recent_chat.c_str());
+	setStaticText(guitext_chat, recent_chat);
 
 	// Update gui element size and position
-	s32 chat_y = 5 + line_height;
+	s32 chat_y = 5;
 
 	if (show_debug)
-		chat_y += line_height;
+		chat_y += 2 * line_height;
 
 	// first pass to calculate height of text to be set
-	s32 width = std::min(g_fontengine->getTextWidth(recent_chat) + 10,
+	s32 width = std::min(g_fontengine->getTextWidth(recent_chat.c_str()) + 10,
 			     porting::getWindowSize().X - 20);
 	core::rect<s32> rect(10, chat_y, width, chat_y + porting::getWindowSize().Y);
 	guitext_chat->setRelativePosition(rect);
@@ -1297,108 +1384,89 @@ static void updateChat(Client &client, f32 dtime, bool show_debug,
  */
 struct KeyCache {
 
-	KeyCache() { populate(); }
-
-	enum {
-		// Player movement
-		KEYMAP_ID_FORWARD,
-		KEYMAP_ID_BACKWARD,
-		KEYMAP_ID_LEFT,
-		KEYMAP_ID_RIGHT,
-		KEYMAP_ID_JUMP,
-		KEYMAP_ID_SPECIAL1,
-		KEYMAP_ID_SNEAK,
-		KEYMAP_ID_AUTORUN,
-
-		// Other
-		KEYMAP_ID_DROP,
-		KEYMAP_ID_INVENTORY,
-		KEYMAP_ID_CHAT,
-		KEYMAP_ID_CMD,
-		KEYMAP_ID_CONSOLE,
-		KEYMAP_ID_MINIMAP,
-		KEYMAP_ID_FREEMOVE,
-		KEYMAP_ID_FASTMOVE,
-		KEYMAP_ID_NOCLIP,
-		KEYMAP_ID_CINEMATIC,
-		KEYMAP_ID_SCREENSHOT,
-		KEYMAP_ID_TOGGLE_HUD,
-		KEYMAP_ID_TOGGLE_CHAT,
-		KEYMAP_ID_TOGGLE_FORCE_FOG_OFF,
-		KEYMAP_ID_TOGGLE_UPDATE_CAMERA,
-		KEYMAP_ID_TOGGLE_DEBUG,
-		KEYMAP_ID_TOGGLE_PROFILER,
-		KEYMAP_ID_CAMERA_MODE,
-		KEYMAP_ID_INCREASE_VIEWING_RANGE,
-		KEYMAP_ID_DECREASE_VIEWING_RANGE,
-		KEYMAP_ID_RANGESELECT,
-
-		KEYMAP_ID_QUICKTUNE_NEXT,
-		KEYMAP_ID_QUICKTUNE_PREV,
-		KEYMAP_ID_QUICKTUNE_INC,
-		KEYMAP_ID_QUICKTUNE_DEC,
-
-		KEYMAP_ID_DEBUG_STACKS,
-
-		// Fake keycode for array size and internal checks
-		KEYMAP_INTERNAL_ENUM_COUNT
-
-
-	};
+	KeyCache()
+	{
+		handler = NULL;
+		populate();
+		populate_nonchanging();
+	}
 
 	void populate();
 
-	KeyPress key[KEYMAP_INTERNAL_ENUM_COUNT];
+	// Keys that are not settings dependent
+	void populate_nonchanging();
+
+	KeyPress key[KeyType::INTERNAL_ENUM_COUNT];
+	InputHandler *handler;
 };
 
+void KeyCache::populate_nonchanging()
+{
+	key[KeyType::ESC] = EscapeKey;
+}
+
 void KeyCache::populate()
 {
-	key[KEYMAP_ID_FORWARD]      = getKeySetting("keymap_forward");
-	key[KEYMAP_ID_BACKWARD]     = getKeySetting("keymap_backward");
-	key[KEYMAP_ID_LEFT]         = getKeySetting("keymap_left");
-	key[KEYMAP_ID_RIGHT]        = getKeySetting("keymap_right");
-	key[KEYMAP_ID_JUMP]         = getKeySetting("keymap_jump");
-	key[KEYMAP_ID_SPECIAL1]     = getKeySetting("keymap_special1");
-	key[KEYMAP_ID_SNEAK]        = getKeySetting("keymap_sneak");
-
-	key[KEYMAP_ID_AUTORUN]      = getKeySetting("keymap_autorun");
-
-	key[KEYMAP_ID_DROP]         = getKeySetting("keymap_drop");
-	key[KEYMAP_ID_INVENTORY]    = getKeySetting("keymap_inventory");
-	key[KEYMAP_ID_CHAT]         = getKeySetting("keymap_chat");
-	key[KEYMAP_ID_CMD]          = getKeySetting("keymap_cmd");
-	key[KEYMAP_ID_CONSOLE]      = getKeySetting("keymap_console");
-	key[KEYMAP_ID_MINIMAP]      = getKeySetting("keymap_minimap");
-	key[KEYMAP_ID_FREEMOVE]     = getKeySetting("keymap_freemove");
-	key[KEYMAP_ID_FASTMOVE]     = getKeySetting("keymap_fastmove");
-	key[KEYMAP_ID_NOCLIP]       = getKeySetting("keymap_noclip");
-	key[KEYMAP_ID_CINEMATIC]    = getKeySetting("keymap_cinematic");
-	key[KEYMAP_ID_SCREENSHOT]   = getKeySetting("keymap_screenshot");
-	key[KEYMAP_ID_TOGGLE_HUD]   = getKeySetting("keymap_toggle_hud");
-	key[KEYMAP_ID_TOGGLE_CHAT]  = getKeySetting("keymap_toggle_chat");
-	key[KEYMAP_ID_TOGGLE_FORCE_FOG_OFF]
+	key[KeyType::FORWARD]      = getKeySetting("keymap_forward");
+	key[KeyType::BACKWARD]     = getKeySetting("keymap_backward");
+	key[KeyType::LEFT]         = getKeySetting("keymap_left");
+	key[KeyType::RIGHT]        = getKeySetting("keymap_right");
+	key[KeyType::JUMP]         = getKeySetting("keymap_jump");
+	key[KeyType::SPECIAL1]     = getKeySetting("keymap_special1");
+	key[KeyType::SNEAK]        = getKeySetting("keymap_sneak");
+
+	key[KeyType::AUTORUN]      = getKeySetting("keymap_autorun");
+
+	key[KeyType::DROP]         = getKeySetting("keymap_drop");
+	key[KeyType::INVENTORY]    = getKeySetting("keymap_inventory");
+	key[KeyType::CHAT]         = getKeySetting("keymap_chat");
+	key[KeyType::CMD]          = getKeySetting("keymap_cmd");
+	key[KeyType::CONSOLE]      = getKeySetting("keymap_console");
+	key[KeyType::MINIMAP]      = getKeySetting("keymap_minimap");
+	key[KeyType::FREEMOVE]     = getKeySetting("keymap_freemove");
+	key[KeyType::FASTMOVE]     = getKeySetting("keymap_fastmove");
+	key[KeyType::NOCLIP]       = getKeySetting("keymap_noclip");
+	key[KeyType::CINEMATIC]    = getKeySetting("keymap_cinematic");
+	key[KeyType::SCREENSHOT]   = getKeySetting("keymap_screenshot");
+	key[KeyType::TOGGLE_HUD]   = getKeySetting("keymap_toggle_hud");
+	key[KeyType::TOGGLE_CHAT]  = getKeySetting("keymap_toggle_chat");
+	key[KeyType::TOGGLE_FORCE_FOG_OFF]
 			= getKeySetting("keymap_toggle_force_fog_off");
-	key[KEYMAP_ID_TOGGLE_UPDATE_CAMERA]
+	key[KeyType::TOGGLE_UPDATE_CAMERA]
 			= getKeySetting("keymap_toggle_update_camera");
-	key[KEYMAP_ID_TOGGLE_DEBUG]
+	key[KeyType::TOGGLE_DEBUG]
 			= getKeySetting("keymap_toggle_debug");
-	key[KEYMAP_ID_TOGGLE_PROFILER]
+	key[KeyType::TOGGLE_PROFILER]
 			= getKeySetting("keymap_toggle_profiler");
-	key[KEYMAP_ID_CAMERA_MODE]
+	key[KeyType::CAMERA_MODE]
 			= getKeySetting("keymap_camera_mode");
-	key[KEYMAP_ID_INCREASE_VIEWING_RANGE]
+	key[KeyType::INCREASE_VIEWING_RANGE]
 			= getKeySetting("keymap_increase_viewing_range_min");
-	key[KEYMAP_ID_DECREASE_VIEWING_RANGE]
+	key[KeyType::DECREASE_VIEWING_RANGE]
 			= getKeySetting("keymap_decrease_viewing_range_min");
-	key[KEYMAP_ID_RANGESELECT]
+	key[KeyType::RANGESELECT]
 			= getKeySetting("keymap_rangeselect");
+	key[KeyType::ZOOM] = getKeySetting("keymap_zoom");
 
-	key[KEYMAP_ID_QUICKTUNE_NEXT] = getKeySetting("keymap_quicktune_next");
-	key[KEYMAP_ID_QUICKTUNE_PREV] = getKeySetting("keymap_quicktune_prev");
-	key[KEYMAP_ID_QUICKTUNE_INC]  = getKeySetting("keymap_quicktune_inc");
-	key[KEYMAP_ID_QUICKTUNE_DEC]  = getKeySetting("keymap_quicktune_dec");
+	key[KeyType::QUICKTUNE_NEXT] = getKeySetting("keymap_quicktune_next");
+	key[KeyType::QUICKTUNE_PREV] = getKeySetting("keymap_quicktune_prev");
+	key[KeyType::QUICKTUNE_INC]  = getKeySetting("keymap_quicktune_inc");
+	key[KeyType::QUICKTUNE_DEC]  = getKeySetting("keymap_quicktune_dec");
 
-	key[KEYMAP_ID_DEBUG_STACKS]   = getKeySetting("keymap_print_debug_stacks");
+	key[KeyType::DEBUG_STACKS]   = getKeySetting("keymap_print_debug_stacks");
+
+	if (handler) {
+		// First clear all keys, then re-add the ones we listen for
+		handler->dontListenForKeys();
+		for (size_t i = 0; i < KeyType::INTERNAL_ENUM_COUNT; i++) {
+			handler->listenForKey(key[i]);
+		}
+		handler->listenForKey(EscapeKey);
+		handler->listenForKey(CancelKey);
+		for (size_t i = 0; i < 10; i++) {
+			handler->listenForKey(NumberKey[i]);
+		}
+	}
 }
 
 
@@ -1552,9 +1620,10 @@ protected:
 			f32 dtime);
 	void updateStats(RunStats *stats, const FpsControl &draw_times, f32 dtime);
 
+	// Input related
 	void processUserInput(VolatileRunFlags *flags, GameRunData *runData,
 			f32 dtime);
-	void processKeyboardInput(VolatileRunFlags *flags,
+	void processKeyInput(VolatileRunFlags *flags,
 			float *statustext_time,
 			float *jump_timer,
 			bool *reset_jump_timer,
@@ -1578,7 +1647,7 @@ protected:
 			bool shift_pressed);
 	void toggleFog(float *statustext_time, bool *flag);
 	void toggleDebug(float *statustext_time, bool *show_debug,
-			bool *show_profiler_graph);
+			bool *show_profiler_graph, bool *show_wireframe);
 	void toggleUpdateCamera(float *statustext_time, bool *flag);
 	void toggleProfiler(float *statustext_time, u32 *profiler_current_page,
 			u32 profiler_max_page);
@@ -1587,9 +1656,10 @@ protected:
 	void decreaseViewRange(float *statustext_time);
 	void toggleFullViewRange(float *statustext_time);
 
-	void updateCameraDirection(CameraOrientation *cam, VolatileRunFlags *flags);
+	void updateCameraDirection(CameraOrientation *cam, VolatileRunFlags *flags,
+		float dtime);
 	void updateCameraOrientation(CameraOrientation *cam,
-			const VolatileRunFlags &flags);
+		const VolatileRunFlags &flags, float dtime);
 	void updatePlayerControl(const CameraOrientation &cam);
 	void step(f32 *dtime);
 	void processClientEvents(CameraOrientation *cam, float *damage_flash);
@@ -1624,6 +1694,41 @@ protected:
 	static void settingChangedCallback(const std::string &setting_name, void *data);
 	void readSettings();
 
+	inline bool getLeftClicked()
+	{
+		return input->getLeftClicked() ||
+			input->joystick.getWasKeyDown(KeyType::MOUSE_L);
+	}
+	inline bool getRightClicked()
+	{
+		return input->getRightClicked() ||
+			input->joystick.getWasKeyDown(KeyType::MOUSE_R);
+	}
+	inline bool isLeftPressed()
+	{
+		return input->getLeftState() ||
+			input->joystick.isKeyDown(KeyType::MOUSE_L);
+	}
+	inline bool isRightPressed()
+	{
+		return input->getRightState() ||
+			input->joystick.isKeyDown(KeyType::MOUSE_R);
+	}
+	inline bool getLeftReleased()
+	{
+		return input->getLeftReleased() ||
+			input->joystick.wasKeyReleased(KeyType::MOUSE_L);
+	}
+
+	inline bool isKeyDown(GameKeyType k)
+	{
+		return input->isKeyDown(keycache.key[k]) || input->joystick.isKeyDown(k);
+	}
+	inline bool wasKeyDown(GameKeyType k)
+	{
+		return input->wasKeyDown(keycache.key[k]) || input->joystick.wasKeyDown(k);
+	}
+
 #ifdef __ANDROID__
 	void handleAndroidChatInput();
 #endif
@@ -1649,6 +1754,8 @@ private:
 	ChatBackend *chat_backend;
 
 	GUIFormSpecMenu *current_formspec;
+	//default: "". If other than "", empty show_formspec packets will only close the formspec when the formname matches
+	std::string cur_formname;
 
 	EventManager *eventmgr;
 	QuicktuneShortcutter *quicktune;
@@ -1662,6 +1769,9 @@ private:
 	Hud *hud;
 	Mapper *mapper;
 
+	GameRunData runData;
+	VolatileRunFlags flags;
+
 	/* 'cache'
 	   This class does take ownership/responsibily for cleaning up etc of any of
 	   these items (e.g. device)
@@ -1707,10 +1817,16 @@ private:
 	 */
 	bool m_cache_doubletap_jump;
 	bool m_cache_enable_clouds;
+	bool m_cache_enable_joysticks;
 	bool m_cache_enable_particles;
 	bool m_cache_enable_fog;
+	bool m_cache_enable_noclip;
+	bool m_cache_enable_free_move;
 	f32  m_cache_mouse_sensitivity;
+	f32  m_cache_joystick_frustum_sensitivity;
 	f32  m_repeat_right_click_time;
+	f32  m_cache_cam_smoothing;
+	f32  m_cache_fog_start;
 
 #ifdef __ANDROID__
 	bool m_cache_hold_aux1;
@@ -1730,6 +1846,7 @@ Game::Game() :
 	soundmaker(NULL),
 	chat_backend(NULL),
 	current_formspec(NULL),
+	cur_formname(""),
 	eventmgr(NULL),
 	quicktune(NULL),
 	gui_chat_console(NULL),
@@ -1745,14 +1862,28 @@ Game::Game() :
 		&settingChangedCallback, this);
 	g_settings->registerChangedCallback("enable_clouds",
 		&settingChangedCallback, this);
+	g_settings->registerChangedCallback("doubletap_joysticks",
+		&settingChangedCallback, this);
 	g_settings->registerChangedCallback("enable_particles",
 		&settingChangedCallback, this);
 	g_settings->registerChangedCallback("enable_fog",
 		&settingChangedCallback, this);
 	g_settings->registerChangedCallback("mouse_sensitivity",
 		&settingChangedCallback, this);
+	g_settings->registerChangedCallback("joystick_frustum_sensitivity",
+		&settingChangedCallback, this);
 	g_settings->registerChangedCallback("repeat_rightclick_time",
 		&settingChangedCallback, this);
+	g_settings->registerChangedCallback("noclip",
+		&settingChangedCallback, this);
+	g_settings->registerChangedCallback("free_move",
+		&settingChangedCallback, this);
+	g_settings->registerChangedCallback("cinematic",
+		&settingChangedCallback, this);
+	g_settings->registerChangedCallback("cinematic_camera_smoothing",
+		&settingChangedCallback, this);
+	g_settings->registerChangedCallback("camera_smoothing",
+		&settingChangedCallback, this);
 
 	readSettings();
 
@@ -1802,6 +1933,16 @@ Game::~Game()
 		&settingChangedCallback, this);
 	g_settings->deregisterChangedCallback("repeat_rightclick_time",
 		&settingChangedCallback, this);
+	g_settings->deregisterChangedCallback("noclip",
+		&settingChangedCallback, this);
+	g_settings->deregisterChangedCallback("free_move",
+		&settingChangedCallback, this);
+	g_settings->deregisterChangedCallback("cinematic",
+		&settingChangedCallback, this);
+	g_settings->deregisterChangedCallback("cinematic_camera_smoothing",
+		&settingChangedCallback, this);
+	g_settings->deregisterChangedCallback("camera_smoothing",
+		&settingChangedCallback, this);
 }
 
 bool Game::startup(bool *kill,
@@ -1829,11 +1970,26 @@ bool Game::startup(bool *kill,
 	this->chat_backend        = chat_backend;
 	this->simple_singleplayer_mode = simple_singleplayer_mode;
 
+	keycache.handler = input;
+	keycache.populate();
+
 	driver              = device->getVideoDriver();
 	smgr                = device->getSceneManager();
 
 	smgr->getParameters()->setAttribute(scene::OBJ_LOADER_IGNORE_MATERIAL_FILES, true);
 
+	memset(&runData, 0, sizeof(runData));
+	runData.time_from_last_punch = 10.0;
+	runData.profiler_max_page = 3;
+	runData.update_wielded_item_trigger = true;
+
+	memset(&flags, 0, sizeof(flags));
+	flags.show_chat = true;
+	flags.show_hud = true;
+	flags.show_debug = g_settings->getBool("show_debug");
+	flags.invert_mouse = g_settings->getBool("invert_mouse");
+	flags.first_loop_after_window_activation = true;
+
 	if (!init(map_dir, address, port, gamespec))
 		return false;
 
@@ -1850,34 +2006,15 @@ void Game::run()
 	RunStats stats              = { 0 };
 	CameraOrientation cam_view_target  = { 0 };
 	CameraOrientation cam_view  = { 0 };
-	GameRunData runData         = { 0 };
 	FpsControl draw_times       = { 0 };
-	VolatileRunFlags flags      = { 0 };
 	f32 dtime; // in seconds
 
-	runData.time_from_last_punch  = 10.0;
-	runData.profiler_max_page = 3;
-	runData.update_wielded_item_trigger = true;
-
-	flags.show_chat = true;
-	flags.show_hud = true;
-	flags.show_minimap = g_settings->getBool("enable_minimap");
-	flags.show_debug = g_settings->getBool("show_debug");
-	flags.invert_mouse = g_settings->getBool("invert_mouse");
-	flags.first_loop_after_window_activation = true;
-
 	/* Clear the profiler */
 	Profiler::GraphValues dummyvalues;
 	g_profiler->graphGet(dummyvalues);
 
 	draw_times.last_time = device->getTimer()->getTime();
 
-	shader_src->addGlobalConstantSetter(new GameGlobalShaderConstantSetter(
-			sky,
-			&flags.force_fog_off,
-			&runData.fog_range,
-			client));
-
 	set_light_table(g_settings->getFloat("display_gamma"));
 
 #ifdef __ANDROID__
@@ -1910,17 +2047,11 @@ void Game::run()
 		updateProfilers(runData, stats, draw_times, dtime);
 		processUserInput(&flags, &runData, dtime);
 		// Update camera before player movement to avoid camera lag of one frame
-		updateCameraDirection(&cam_view_target, &flags);
-		float cam_smoothing = 0;
-		if (g_settings->getBool("cinematic"))
-			cam_smoothing = 1 - g_settings->getFloat("cinematic_camera_smoothing");
-		else
-			cam_smoothing = 1 - g_settings->getFloat("camera_smoothing");
-		cam_smoothing = rangelim(cam_smoothing, 0.01f, 1.0f);
+		updateCameraDirection(&cam_view_target, &flags, dtime);
 		cam_view.camera_yaw += (cam_view_target.camera_yaw -
-				cam_view.camera_yaw) * cam_smoothing;
+				cam_view.camera_yaw) * m_cache_cam_smoothing;
 		cam_view.camera_pitch += (cam_view_target.camera_pitch -
-				cam_view.camera_pitch) * cam_smoothing;
+				cam_view.camera_pitch) * m_cache_cam_smoothing;
 		updatePlayerControl(cam_view);
 		step(&dtime);
 		processClientEvents(&cam_view_target, &runData.damage_flash);
@@ -2117,6 +2248,10 @@ bool Game::createClient(const std::string &playername,
 		return false;
 	}
 
+	GameGlobalShaderConstantSetterFactory *scsf = new GameGlobalShaderConstantSetterFactory(
+			&flags.force_fog_off, &runData.fog_range, client);
+	shader_src->addShaderConstantSetterFactory(scsf);
+
 	// Update cached textures, meshes and materials
 	client->afterContentReceived(device);
 
@@ -2141,6 +2276,7 @@ bool Game::createClient(const std::string &playername,
 	/* Skybox
 	 */
 	sky = new Sky(smgr->getRootSceneNode(), smgr, -1, texture_src);
+	scsf->setSky(sky);
 	skybox = NULL;	// This is used/set later on in the main run loop
 
 	local_inventory = new Inventory(itemdef_manager);
@@ -2167,6 +2303,8 @@ bool Game::createClient(const std::string &playername,
 	/* Set window caption
 	 */
 	std::wstring str = utf8_to_wide(PROJECT_NAME_C);
+	str += L" ";
+	str += utf8_to_wide(g_version_hash);
 	str += L" [";
 	str += driver->getName();
 	str += L"]";
@@ -2193,37 +2331,39 @@ bool Game::createClient(const std::string &playername,
 bool Game::initGui()
 {
 	// First line of debug text
-	guitext = guienv->addStaticText(
+	guitext = addStaticText(guienv,
 			utf8_to_wide(PROJECT_NAME_C).c_str(),
 			core::rect<s32>(0, 0, 0, 0),
 			false, false, guiroot);
 
 	// Second line of debug text
-	guitext2 = guienv->addStaticText(
+	guitext2 = addStaticText(guienv,
 			L"",
 			core::rect<s32>(0, 0, 0, 0),
 			false, false, guiroot);
 
 	// At the middle of the screen
 	// Object infos are shown in this
-	guitext_info = guienv->addStaticText(
+	guitext_info = addStaticText(guienv,
 			L"",
 			core::rect<s32>(0, 0, 400, g_fontengine->getTextHeight() * 5 + 5) + v2s32(100, 200),
 			false, true, guiroot);
 
 	// Status text (displays info when showing and hiding GUI stuff, etc.)
-	guitext_status = guienv->addStaticText(
+	guitext_status = addStaticText(guienv,
 			L"<Status>",
 			core::rect<s32>(0, 0, 0, 0),
 			false, false, guiroot);
 	guitext_status->setVisible(false);
 
 	// Chat text
-	guitext_chat = guienv->addStaticText(
+	guitext_chat = addStaticText(
+			guienv,
 			L"",
 			core::rect<s32>(0, 0, 0, 0),
 			//false, false); // Disable word wrap as of now
 			false, true, guiroot);
+
 	// Remove stale "recent" chat messages from previous connections
 	chat_backend->clearRecentChat();
 
@@ -2237,7 +2377,7 @@ bool Game::initGui()
 	}
 
 	// Profiler text (size is updated when text is updated)
-	guitext_profiler = guienv->addStaticText(
+	guitext_profiler = addStaticText(guienv,
 			L"<Profiler>",
 			core::rect<s32>(0, 0, 0, 0),
 			false, false, guiroot);
@@ -2351,7 +2491,7 @@ bool Game::connectToServer(const std::string &playername,
 				break;
 			}
 
-			if (input->wasKeyDown(EscapeKey) || input->wasKeyDown(CancelKey)) {
+			if (wasKeyDown(KeyType::ESC) || input->wasKeyDown(CancelKey)) {
 				*aborted = true;
 				infostream << "Connect aborted [Escape]" << std::endl;
 				break;
@@ -2360,7 +2500,26 @@ bool Game::connectToServer(const std::string &playername,
 			wait_time += dtime;
 			// Only time out if we aren't waiting for the server we started
 			if ((*address != "") && (wait_time > 10)) {
-				*error_message = "Connection timed out.";
+				bool sent_old_init = g_settings->getFlag("send_pre_v25_init");
+				// If no pre v25 init was sent, and no answer was received,
+				// but the low level connection could be established
+				// (meaning that we have a peer id), then we probably wanted
+				// to connect to a legacy server. In this case, tell the user
+				// to enable the option to be able to connect.
+				if (!sent_old_init &&
+						(client->getProtoVersion() == 0) &&
+						client->connectedToServer()) {
+					*error_message = "Connection failure: init packet not "
+					"recognized by server.\n"
+					"Most likely the server uses an old protocol version (<v25).\n"
+					"Please ask the server owner to update to 0.4.13 or later.\n"
+					"To still connect to the server in the meantime,\n"
+					"you can enable the 'send_pre_v25_init' setting by editing minetest.conf,\n"
+					"or by enabling the 'Client -> Network -> Support older Servers'\n"
+					"entry in the advanced settings menu.";
+				} else {
+					*error_message = "Connection timed out.";
+				}
 				errorstream << *error_message << std::endl;
 				break;
 			}
@@ -2412,7 +2571,7 @@ bool Game::getServerContent(bool *aborted)
 			return false;
 		}
 
-		if (input->wasKeyDown(EscapeKey) || input->wasKeyDown(CancelKey)) {
+		if (wasKeyDown(KeyType::ESC) || input->wasKeyDown(CancelKey)) {
 			*aborted = true;
 			infostream << "Connect aborted [Escape]" << std::endl;
 			return false;
@@ -2510,7 +2669,7 @@ inline bool Game::handleCallbacks()
 
 	if (g_gamecallback->changevolume_requested) {
 		(new GUIVolumeChange(guienv, guiroot, -1,
-				     &g_menumgr, client))->drop();
+				     &g_menumgr))->drop();
 		g_gamecallback->changevolume_requested = false;
 	}
 
@@ -2674,7 +2833,7 @@ void Game::processUserInput(VolatileRunFlags *flags,
 	if (m_cache_doubletap_jump && runData->jump_timer <= 0.2)
 		runData->jump_timer += dtime;
 
-	processKeyboardInput(
+	processKeyInput(
 			flags,
 			&runData->statustext_time,
 			&runData->jump_timer,
@@ -2686,7 +2845,7 @@ void Game::processUserInput(VolatileRunFlags *flags,
 }
 
 
-void Game::processKeyboardInput(VolatileRunFlags *flags,
+void Game::processKeyInput(VolatileRunFlags *flags,
 		float *statustext_time,
 		float *jump_timer,
 		bool *reset_jump_timer,
@@ -2696,66 +2855,68 @@ void Game::processKeyboardInput(VolatileRunFlags *flags,
 
 	//TimeTaker tt("process kybd input", NULL, PRECISION_NANO);
 
-	if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_DROP])) {
+	if (wasKeyDown(KeyType::DROP)) {
 		dropSelectedItem();
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_AUTORUN])) {
+	} else if (wasKeyDown(KeyType::AUTORUN)) {
 		toggleAutorun(statustext_time);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_INVENTORY])) {
+	} else if (wasKeyDown(KeyType::INVENTORY)) {
 		openInventory();
-	} else if (input->wasKeyDown(EscapeKey) || input->wasKeyDown(CancelKey)) {
+	} else if (wasKeyDown(KeyType::ESC) || input->wasKeyDown(CancelKey)) {
 		if (!gui_chat_console->isOpenInhibited()) {
 			show_pause_menu(&current_formspec, client, gamedef,
-					texture_src, device, simple_singleplayer_mode);
+				texture_src, device, &input->joystick,
+				simple_singleplayer_mode);
 		}
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_CHAT])) {
+	} else if (wasKeyDown(KeyType::CHAT)) {
 		openConsole(0.2, L"");
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_CMD])) {
+	} else if (wasKeyDown(KeyType::CMD)) {
 		openConsole(0.2, L"/");
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_CONSOLE])) {
+	} else if (wasKeyDown(KeyType::CONSOLE)) {
 		openConsole(1);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_FREEMOVE])) {
+	} else if (wasKeyDown(KeyType::FREEMOVE)) {
 		toggleFreeMove(statustext_time);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_JUMP])) {
+	} else if (wasKeyDown(KeyType::JUMP)) {
 		toggleFreeMoveAlt(statustext_time, jump_timer);
 		*reset_jump_timer = true;
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_FASTMOVE])) {
+	} else if (wasKeyDown(KeyType::FASTMOVE)) {
 		toggleFast(statustext_time);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_NOCLIP])) {
+	} else if (wasKeyDown(KeyType::NOCLIP)) {
 		toggleNoClip(statustext_time);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_CINEMATIC])) {
+	} else if (wasKeyDown(KeyType::CINEMATIC)) {
 		toggleCinematic(statustext_time);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_SCREENSHOT])) {
+	} else if (wasKeyDown(KeyType::SCREENSHOT)) {
 		client->makeScreenshot(device);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_HUD])) {
+	} else if (wasKeyDown(KeyType::TOGGLE_HUD)) {
 		toggleHud(statustext_time, &flags->show_hud);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_MINIMAP])) {
+	} else if (wasKeyDown(KeyType::MINIMAP)) {
 		toggleMinimap(statustext_time, &flags->show_minimap, flags->show_hud,
-			input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SNEAK]));
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_CHAT])) {
+			isKeyDown(KeyType::SNEAK));
+	} else if (wasKeyDown(KeyType::TOGGLE_CHAT)) {
 		toggleChat(statustext_time, &flags->show_chat);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_FORCE_FOG_OFF])) {
+	} else if (wasKeyDown(KeyType::TOGGLE_FORCE_FOG_OFF)) {
 		toggleFog(statustext_time, &flags->force_fog_off);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_UPDATE_CAMERA])) {
+	} else if (wasKeyDown(KeyType::TOGGLE_UPDATE_CAMERA)) {
 		toggleUpdateCamera(statustext_time, &flags->disable_camera_update);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_DEBUG])) {
-		toggleDebug(statustext_time, &flags->show_debug, &flags->show_profiler_graph);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_PROFILER])) {
+	} else if (wasKeyDown(KeyType::TOGGLE_DEBUG)) {
+		toggleDebug(statustext_time, &flags->show_debug, &flags->show_profiler_graph,
+			&draw_control->show_wireframe);
+	} else if (wasKeyDown(KeyType::TOGGLE_PROFILER)) {
 		toggleProfiler(statustext_time, profiler_current_page, profiler_max_page);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_INCREASE_VIEWING_RANGE])) {
+	} else if (wasKeyDown(KeyType::INCREASE_VIEWING_RANGE)) {
 		increaseViewRange(statustext_time);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_DECREASE_VIEWING_RANGE])) {
+	} else if (wasKeyDown(KeyType::DECREASE_VIEWING_RANGE)) {
 		decreaseViewRange(statustext_time);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_RANGESELECT])) {
+	} else if (wasKeyDown(KeyType::RANGESELECT)) {
 		toggleFullViewRange(statustext_time);
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_QUICKTUNE_NEXT])) {
+	} else if (wasKeyDown(KeyType::QUICKTUNE_NEXT)) {
 		quicktune->next();
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_QUICKTUNE_PREV])) {
+	} else if (wasKeyDown(KeyType::QUICKTUNE_PREV)) {
 		quicktune->prev();
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_QUICKTUNE_INC])) {
+	} else if (wasKeyDown(KeyType::QUICKTUNE_INC)) {
 		quicktune->inc();
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_QUICKTUNE_DEC])) {
+	} else if (wasKeyDown(KeyType::QUICKTUNE_DEC)) {
 		quicktune->dec();
-	} else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_DEBUG_STACKS])) {
+	} else if (wasKeyDown(KeyType::DEBUG_STACKS)) {
 		// Print debug stacks
 		dstream << "-----------------------------------------"
 		        << std::endl;
@@ -2765,7 +2926,7 @@ void Game::processKeyboardInput(VolatileRunFlags *flags,
 		debug_stacks_print();
 	}
 
-	if (!input->isKeyDown(getKeySetting("keymap_jump")) && *reset_jump_timer) {
+	if (!isKeyDown(KeyType::JUMP) && *reset_jump_timer) {
 		*reset_jump_timer = false;
 		*jump_timer = 0.0;
 	}
@@ -2779,7 +2940,6 @@ void Game::processKeyboardInput(VolatileRunFlags *flags,
 	}
 }
 
-
 void Game::processItemSelection(u16 *new_playeritem)
 {
 	LocalPlayer *player = client->getEnv().getLocalPlayer();
@@ -2790,14 +2950,23 @@ void Game::processItemSelection(u16 *new_playeritem)
 
 	s32 wheel = input->getMouseWheel();
 	u16 max_item = MYMIN(PLAYER_INVENTORY_SIZE - 1,
-		                 player->hud_hotbar_itemcount - 1);
+		    player->hud_hotbar_itemcount - 1);
 
-	if (wheel < 0)
+	s32 dir = wheel;
+
+	if (input->joystick.wasKeyDown(KeyType::SCROLL_DOWN)) {
+		dir = -1;
+	}
+
+	if (input->joystick.wasKeyDown(KeyType::SCROLL_UP)) {
+		dir = 1;
+	}
+
+	if (dir < 0)
 		*new_playeritem = *new_playeritem < max_item ? *new_playeritem + 1 : 0;
-	else if (wheel > 0)
+	else if (dir > 0)
 		*new_playeritem = *new_playeritem > 0 ? *new_playeritem - 1 : max_item;
-	// else wheel == 0
-
+	// else dir == 0
 
 	/* Item selection using keyboard
 	 */
@@ -2847,7 +3016,8 @@ void Game::openInventory()
 	TextDest *txt_dst = new TextDestPlayerInventory(client);
 
 	create_formspec_menu(&current_formspec, client, gamedef, texture_src,
-			device, fs_src, txt_dst, client);
+			device, &input->joystick, fs_src, txt_dst, client);
+	cur_formname = "";
 
 	InventoryLocation inventoryloc;
 	inventoryloc.setCurrentPlayer();
@@ -3037,22 +3207,33 @@ void Game::toggleFog(float *statustext_time, bool *flag)
 
 
 void Game::toggleDebug(float *statustext_time, bool *show_debug,
-		bool *show_profiler_graph)
+		bool *show_profiler_graph, bool *show_wireframe)
 {
-	// Initial / 3x toggle: Chat only
+	// Initial / 4x toggle: Chat only
 	// 1x toggle: Debug text with chat
 	// 2x toggle: Debug text with profiler graph
+	// 3x toggle: Debug text and wireframe
 	if (!*show_debug) {
 		*show_debug = true;
 		*show_profiler_graph = false;
+		*show_wireframe = false;
 		statustext = L"Debug info shown";
-	} else if (*show_profiler_graph) {
-		*show_debug = false;
-		*show_profiler_graph = false;
-		statustext = L"Debug info and profiler graph hidden";
-	} else {
+	} else if (!*show_profiler_graph && !*show_wireframe) {
 		*show_profiler_graph = true;
 		statustext = L"Profiler graph shown";
+	} else if (!*show_wireframe && client->checkPrivilege("debug")) {
+		*show_profiler_graph = false;
+		*show_wireframe = true;
+		statustext = L"Wireframe shown";
+	} else {
+		*show_debug = false;
+		*show_profiler_graph = false;
+		*show_wireframe = false;
+		if (client->checkPrivilege("debug")) {
+			statustext = L"Debug info, profiler graph, and wireframe hidden";
+		} else {
+			statustext = L"Debug info and profiler graph hidden";
+		}
 	}
 	*statustext_time = 0;
 }
@@ -3096,9 +3277,16 @@ void Game::increaseViewRange(float *statustext_time)
 {
 	s16 range = g_settings->getS16("viewing_range");
 	s16 range_new = range + 10;
+
+	if (range_new > 4000) {
+		range_new = 4000;
+		statustext = utf8_to_wide("Viewing range is at maximum: "
+				+ itos(range_new));
+	} else {
+		statustext = utf8_to_wide("Viewing range changed to "
+				+ itos(range_new));
+	}
 	g_settings->set("viewing_range", itos(range_new));
-	statustext = utf8_to_wide("Viewing range changed to "
-			+ itos(range_new));
 	*statustext_time = 0;
 }
 
@@ -3108,12 +3296,15 @@ void Game::decreaseViewRange(float *statustext_time)
 	s16 range = g_settings->getS16("viewing_range");
 	s16 range_new = range - 10;
 
-	if (range_new < 20)
+	if (range_new < 20) {
 		range_new = 20;
-
+		statustext = utf8_to_wide("Viewing range is at minimum: "
+				+ itos(range_new));
+	} else {
+		statustext = utf8_to_wide("Viewing range changed to "
+				+ itos(range_new));
+	}
 	g_settings->set("viewing_range", itos(range_new));
-	statustext = utf8_to_wide("Viewing range changed to "
-			+ itos(range_new));
 	*statustext_time = 0;
 }
 
@@ -3133,7 +3324,7 @@ void Game::toggleFullViewRange(float *statustext_time)
 
 
 void Game::updateCameraDirection(CameraOrientation *cam,
-		VolatileRunFlags *flags)
+		VolatileRunFlags *flags, float dtime)
 {
 	if ((device->isWindowActive() && noMenuActive()) || random_input) {
 
@@ -3148,7 +3339,7 @@ void Game::updateCameraDirection(CameraOrientation *cam,
 		if (flags->first_loop_after_window_activation)
 			flags->first_loop_after_window_activation = false;
 		else
-			updateCameraOrientation(cam, *flags);
+			updateCameraOrientation(cam, *flags, dtime);
 
 		input->setMousePos((driver->getScreenSize().Width / 2),
 				(driver->getScreenSize().Height / 2));
@@ -3166,16 +3357,16 @@ void Game::updateCameraDirection(CameraOrientation *cam,
 	}
 }
 
-
 void Game::updateCameraOrientation(CameraOrientation *cam,
-		const VolatileRunFlags &flags)
+		const VolatileRunFlags &flags, float dtime)
 {
 #ifdef HAVE_TOUCHSCREENGUI
 	if (g_touchscreengui) {
-		cam->camera_yaw   = g_touchscreengui->getYaw();
-		cam->camera_pitch = g_touchscreengui->getPitch();
+		cam->camera_yaw   += g_touchscreengui->getYawChange();
+		cam->camera_pitch  = g_touchscreengui->getPitch();
 	} else {
 #endif
+
 		s32 dx = input->getMousePos().X - (driver->getScreenSize().Width / 2);
 		s32 dy = input->getMousePos().Y - (driver->getScreenSize().Height / 2);
 
@@ -3191,6 +3382,14 @@ void Game::updateCameraOrientation(CameraOrientation *cam,
 	}
 #endif
 
+	if (m_cache_enable_joysticks) {
+		f32 c = m_cache_joystick_frustum_sensitivity * (1.f / 32767.f) * dtime;
+		cam->camera_yaw -= input->joystick.getAxisWithoutDead(JA_FRUSTUM_HORIZONTAL) *
+			c;
+		cam->camera_pitch += input->joystick.getAxisWithoutDead(JA_FRUSTUM_VERTICAL) *
+			c;
+	}
+
 	cam->camera_pitch = rangelim(cam->camera_pitch, -89.5, 89.5);
 }
 
@@ -3199,30 +3398,37 @@ void Game::updatePlayerControl(const CameraOrientation &cam)
 {
 	//TimeTaker tt("update player control", NULL, PRECISION_NANO);
 
+	// DO NOT use the isKeyDown method for the forward, backward, left, right
+	// buttons, as the code that uses the controls needs to be able to
+	// distinguish between the two in order to know when to use joysticks.
+
 	PlayerControl control(
-		input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_FORWARD]),
-		input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_BACKWARD]),
-		input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_LEFT]),
-		input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_RIGHT]),
-		input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_JUMP]),
-		input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SPECIAL1]),
-		input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SNEAK]),
-		input->getLeftState(),
-		input->getRightState(),
+		input->isKeyDown(keycache.key[KeyType::FORWARD]),
+		input->isKeyDown(keycache.key[KeyType::BACKWARD]),
+		input->isKeyDown(keycache.key[KeyType::LEFT]),
+		input->isKeyDown(keycache.key[KeyType::RIGHT]),
+		isKeyDown(KeyType::JUMP),
+		isKeyDown(KeyType::SPECIAL1),
+		isKeyDown(KeyType::SNEAK),
+		isKeyDown(KeyType::ZOOM),
+		isLeftPressed(),
+		isRightPressed(),
 		cam.camera_pitch,
-		cam.camera_yaw
+		cam.camera_yaw,
+		input->joystick.getAxisWithoutDead(JA_SIDEWARD_MOVE),
+		input->joystick.getAxisWithoutDead(JA_FORWARD_MOVE)
 	);
 
 	u32 keypress_bits =
-			( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_FORWARD])  & 0x1) << 0) |
-			( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_BACKWARD]) & 0x1) << 1) |
-			( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_LEFT])     & 0x1) << 2) |
-			( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_RIGHT])    & 0x1) << 3) |
-			( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_JUMP])     & 0x1) << 4) |
-			( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SPECIAL1]) & 0x1) << 5) |
-			( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SNEAK])    & 0x1) << 6) |
-			( (u32)(input->getLeftState()                                        & 0x1) << 7) |
-			( (u32)(input->getRightState()                                       & 0x1) << 8
+			( (u32)(isKeyDown(KeyType::FORWARD)                       & 0x1) << 0) |
+			( (u32)(isKeyDown(KeyType::BACKWARD)                      & 0x1) << 1) |
+			( (u32)(isKeyDown(KeyType::LEFT)                          & 0x1) << 2) |
+			( (u32)(isKeyDown(KeyType::RIGHT)                         & 0x1) << 3) |
+			( (u32)(isKeyDown(KeyType::JUMP)                          & 0x1) << 4) |
+			( (u32)(isKeyDown(KeyType::SPECIAL1)                      & 0x1) << 5) |
+			( (u32)(isKeyDown(KeyType::SNEAK)                         & 0x1) << 6) |
+			( (u32)(isLeftPressed()                                   & 0x1) << 7) |
+			( (u32)(isRightPressed()                                  & 0x1) << 8
 		);
 
 #ifdef ANDROID
@@ -3277,12 +3483,12 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash)
 			//u16 damage = event.player_damage.amount;
 			//infostream<<"Player damage: "<<damage<<std::endl;
 
-			*damage_flash += 100.0;
-			*damage_flash += 8.0 * event.player_damage.amount;
+			*damage_flash += 95.0 + 3.2 * event.player_damage.amount;
+			*damage_flash = MYMIN(*damage_flash, 127.0);
 
 			player->hurt_tilt_timer = 1.5;
-			player->hurt_tilt_strength = event.player_damage.amount / 4;
-			player->hurt_tilt_strength = rangelim(player->hurt_tilt_strength, 1.0, 4.0);
+			player->hurt_tilt_strength =
+				rangelim(event.player_damage.amount / 4, 1.0, 4.0);
 
 			MtEvent *e = new SimpleTriggerEvent("PlayerDamage");
 			gamedef->event()->put(e);
@@ -3291,7 +3497,7 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash)
 			cam->camera_pitch = event.player_force_move.pitch;
 		} else if (event.type == CE_DEATHSCREEN) {
 			show_deathscreen(&current_formspec, client, gamedef, texture_src,
-					 device, client);
+				device, &input->joystick, client);
 
 			chat_backend->addMessage(L"", L"You died.");
 
@@ -3301,13 +3507,21 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash)
 			player->hurt_tilt_strength = 0;
 
 		} else if (event.type == CE_SHOW_FORMSPEC) {
-			FormspecFormSource *fs_src =
-				new FormspecFormSource(*(event.show_formspec.formspec));
-			TextDestPlayerInventory *txt_dst =
-				new TextDestPlayerInventory(client, *(event.show_formspec.formname));
-
-			create_formspec_menu(&current_formspec, client, gamedef,
-					     texture_src, device, fs_src, txt_dst, client);
+			if (*(event.show_formspec.formspec) == "") {
+				if (current_formspec && ( *(event.show_formspec.formname) == "" || *(event.show_formspec.formname) == cur_formname) ){
+					current_formspec->quitMenu();
+				}
+			} else {
+				FormspecFormSource *fs_src =
+					new FormspecFormSource(*(event.show_formspec.formspec));
+				TextDestPlayerInventory *txt_dst =
+					new TextDestPlayerInventory(client, *(event.show_formspec.formname));
+
+				create_formspec_menu(&current_formspec, client, gamedef,
+					texture_src, device, &input->joystick,
+					fs_src, txt_dst, client);
+				cur_formname = *(event.show_formspec.formname);
+			}
 
 			delete(event.show_formspec.formspec);
 			delete(event.show_formspec.formname);
@@ -3488,13 +3702,19 @@ void Game::updateCamera(VolatileRunFlags *flags, u32 busy_time,
 		if (mlist && client->getPlayerItem() < mlist->getSize())
 			playeritem = mlist->getItem(client->getPlayerItem());
 	}
+	if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand
+		InventoryList *hlist = local_inventory->getList("hand");
+		if (hlist)
+			playeritem = hlist->getItem(0);
+	}
+
 
 	ToolCapabilities playeritem_toolcap =
 		playeritem.getToolCapabilities(itemdef_manager);
 
 	v3s16 old_camera_offset = camera->getOffset();
 
-	if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_CAMERA_MODE])) {
+	if (wasKeyDown(KeyType::CAMERA_MODE)) {
 		GenericCAO *playercao = player->getCAO();
 
 		// If playercao not loaded, don't change camera
@@ -3572,6 +3792,11 @@ void Game::processPlayerInteraction(GameRunData *runData,
 			playeritem = mlist->getItem(client->getPlayerItem());
 	}
 
+	if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand
+		InventoryList *hlist = local_inventory->getList("hand");
+		if (hlist)
+			playeritem = hlist->getItem(0);
+	}
 	const ItemDefinition &playeritem_def =
 			playeritem.getDefinition(itemdef_manager);
 
@@ -3637,7 +3862,7 @@ void Game::processPlayerInteraction(GameRunData *runData,
 		- pointing away from node
 	*/
 	if (runData->digging) {
-		if (input->getLeftReleased()) {
+		if (getLeftReleased()) {
 			infostream << "Left button released"
 			           << " (stopped digging)" << std::endl;
 			runData->digging = false;
@@ -3663,7 +3888,7 @@ void Game::processPlayerInteraction(GameRunData *runData,
 		}
 	}
 
-	if (!runData->digging && runData->ldown_for_dig && !input->getLeftState()) {
+	if (!runData->digging && runData->ldown_for_dig && !isLeftPressed()) {
 		runData->ldown_for_dig = false;
 	}
 
@@ -3671,13 +3896,13 @@ void Game::processPlayerInteraction(GameRunData *runData,
 
 	soundmaker->m_player_leftpunch_sound.name = "";
 
-	if (input->getRightState())
+	if (isRightPressed())
 		runData->repeat_rightclick_timer += dtime;
 	else
 		runData->repeat_rightclick_timer = 0;
 
-	if (playeritem_def.usable && input->getLeftState()) {
-		if (input->getLeftClicked())
+	if (playeritem_def.usable && isLeftPressed()) {
+		if (getLeftClicked())
 			client->interact(4, pointed);
 	} else if (pointed.type == POINTEDTHING_NODE) {
 		ToolCapabilities playeritem_toolcap =
@@ -3687,23 +3912,29 @@ void Game::processPlayerInteraction(GameRunData *runData,
 	} else if (pointed.type == POINTEDTHING_OBJECT) {
 		handlePointingAtObject(runData, pointed, playeritem,
 				player_position, show_debug);
-	} else if (input->getLeftState()) {
+	} else if (isLeftPressed()) {
 		// When button is held down in air, show continuous animation
 		runData->left_punch = true;
-	} else if (input->getRightClicked()) {
+	} else if (getRightClicked()) {
 		handlePointingAtNothing(runData, playeritem);
 	}
 
 	runData->pointed_old = pointed;
 
-	if (runData->left_punch || input->getLeftClicked())
+	if (runData->left_punch || getLeftClicked())
 		camera->setDigging(0); // left click animation
 
 	input->resetLeftClicked();
 	input->resetRightClicked();
 
+	input->joystick.clearWasKeyDown(KeyType::MOUSE_L);
+	input->joystick.clearWasKeyDown(KeyType::MOUSE_R);
+
 	input->resetLeftReleased();
 	input->resetRightReleased();
+
+	input->joystick.clearWasKeyReleased(KeyType::MOUSE_L);
+	input->joystick.clearWasKeyReleased(KeyType::MOUSE_R);
 }
 
 
@@ -3741,19 +3972,19 @@ void Game::handlePointingAtNode(GameRunData *runData,
 		}
 	}
 
-	if (runData->nodig_delay_timer <= 0.0 && input->getLeftState()
+	if (runData->nodig_delay_timer <= 0.0 && isLeftPressed()
 			&& client->checkPrivilege("interact")) {
 		handleDigging(runData, pointed, nodepos, playeritem_toolcap, dtime);
 	}
 
-	if ((input->getRightClicked() ||
+	if ((getRightClicked() ||
 			runData->repeat_rightclick_timer >= m_repeat_right_click_time) &&
 			client->checkPrivilege("interact")) {
 		runData->repeat_rightclick_timer = 0;
 		infostream << "Ground right-clicked" << std::endl;
 
 		if (meta && meta->getString("formspec") != "" && !random_input
-				&& !input->isKeyDown(getKeySetting("keymap_sneak"))) {
+				&& !isKeyDown(KeyType::SNEAK)) {
 			infostream << "Launching custom inventory view" << std::endl;
 
 			InventoryLocation inventoryloc;
@@ -3764,7 +3995,8 @@ void Game::handlePointingAtNode(GameRunData *runData,
 			TextDest *txt_dst = new TextDestNodeMetadata(nodepos, client);
 
 			create_formspec_menu(&current_formspec, client, gamedef,
-					     texture_src, device, fs_src, txt_dst, client);
+				texture_src, device, &input->joystick, fs_src, txt_dst, client);
+			cur_formname = "";
 
 			current_formspec->setFormSpec(meta->getString("formspec"), inventoryloc);
 		} else {
@@ -3818,7 +4050,7 @@ void Game::handlePointingAtObject(GameRunData *runData,
 			runData->selected_object->debugInfoText()));
 	}
 
-	if (input->getLeftState()) {
+	if (isLeftPressed()) {
 		bool do_punch = false;
 		bool do_punch_damage = false;
 
@@ -3828,7 +4060,7 @@ void Game::handlePointingAtObject(GameRunData *runData,
 			runData->object_hit_delay_timer = object_hit_delay;
 		}
 
-		if (input->getLeftClicked())
+		if (getLeftClicked())
 			do_punch = true;
 
 		if (do_punch) {
@@ -3848,7 +4080,7 @@ void Game::handlePointingAtObject(GameRunData *runData,
 			if (!disable_send)
 				client->interact(0, pointed);
 		}
-	} else if (input->getRightClicked()) {
+	} else if (getRightClicked()) {
 		infostream << "Right-clicked object" << std::endl;
 		client->interact(3, pointed);  // place
 	}
@@ -3992,7 +4224,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
 	if (draw_control->range_all) {
 		runData->fog_range = 100000 * BS;
 	} else {
-		runData->fog_range = 0.9 * draw_control->wanted_range * BS;
+		runData->fog_range = draw_control->wanted_range * BS;
 	}
 
 	/*
@@ -4003,7 +4235,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
 	float direct_brightness;
 	bool sunlight_seen;
 
-	if (g_settings->getBool("free_move")) {
+	if (m_cache_enable_noclip && m_cache_enable_free_move) {
 		direct_brightness = time_brightness;
 		sunlight_seen = true;
 	} else {
@@ -4070,11 +4302,11 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
 		driver->setFog(
 				sky->getBgColor(),
 				video::EFT_FOG_LINEAR,
-				runData->fog_range * 0.4,
+				runData->fog_range * m_cache_fog_start,
 				runData->fog_range * 1.0,
 				0.01,
 				false, // pixel fog
-				false // range fog
+				true // range fog
 		);
 	} else {
 		driver->setFog(
@@ -4118,8 +4350,14 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
 
 		if (mlist && (client->getPlayerItem() < mlist->getSize())) {
 			ItemStack item = mlist->getItem(client->getPlayerItem());
+			if (item.getDefinition(itemdef_manager).name.empty()) { // override the hand
+				InventoryList *hlist = local_inventory->getList("hand");
+				if (hlist)
+					item = hlist->getItem(0);
+			}
 			camera->wield(item);
 		}
+
 		runData->update_wielded_item_trigger = false;
 	}
 
@@ -4181,10 +4419,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
 		Damage flash
 	*/
 	if (runData->damage_flash > 0.0) {
-		video::SColor color(std::min(runData->damage_flash, 180.0f),
-				180,
-				0,
-				0);
+		video::SColor color(runData->damage_flash, 180, 0, 0);
 		driver->draw2DRectangle(color,
 					core::rect<s32>(0, 0, screensize.X, screensize.Y),
 					NULL);
@@ -4226,23 +4461,12 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
 
 inline static const char *yawToDirectionString(int yaw)
 {
-	// NOTE: TODO: This can be done mathematically without the else/else-if
-	// cascade.
-
-	const char *player_direction;
+	static const char *direction[4] = {"North [+Z]", "West [-X]", "South [-Z]", "East [+X]"};
 
 	yaw = wrapDegrees_0_360(yaw);
+	yaw = (yaw + 45) % 360 / 90;
 
-	if (yaw >= 45 && yaw < 135)
-		player_direction = "West [-X]";
-	else if (yaw >= 135 && yaw < 225)
-		player_direction = "South [-Z]";
-	else if (yaw >= 225 && yaw < 315)
-		player_direction = "East [+X]";
-	else
-		player_direction = "North [+Z]";
-
-	return player_direction;
+	return direction[yaw];
 }
 
 
@@ -4275,12 +4499,7 @@ void Game::updateGui(float *statustext_time, const RunStats &stats,
 		   << ", v_range = " << draw_control->wanted_range
 		   << std::setprecision(3)
 		   << ", RTT = " << client->getRTT();
-		guitext->setText(utf8_to_wide(os.str()).c_str());
-		guitext->setVisible(true);
-	} else if (flags.show_hud || flags.show_chat) {
-		std::ostringstream os(std::ios_base::binary);
-		os << PROJECT_NAME_C " " << g_version_hash;
-		guitext->setText(utf8_to_wide(os.str()).c_str());
+		setStaticText(guitext, utf8_to_wide(os.str()).c_str());
 		guitext->setVisible(true);
 	} else {
 		guitext->setVisible(false);
@@ -4317,7 +4536,7 @@ void Game::updateGui(float *statustext_time, const RunStats &stats,
 			}
 		}
 
-		guitext2->setText(utf8_to_wide(os.str()).c_str());
+		setStaticText(guitext2, utf8_to_wide(os.str()).c_str());
 		guitext2->setVisible(true);
 
 		core::rect<s32> rect(
@@ -4329,7 +4548,7 @@ void Game::updateGui(float *statustext_time, const RunStats &stats,
 		guitext2->setVisible(false);
 	}
 
-	guitext_info->setText(infotext.c_str());
+	setStaticText(guitext_info, infotext.c_str());
 	guitext_info->setVisible(flags.show_hud && g_menumgr.menuCount() == 0);
 
 	float statustext_time_max = 1.5;
@@ -4343,7 +4562,7 @@ void Game::updateGui(float *statustext_time, const RunStats &stats,
 		}
 	}
 
-	guitext_status->setText(statustext.c_str());
+	setStaticText(guitext_status, statustext.c_str());
 	guitext_status->setVisible(!statustext.empty());
 
 	if (!statustext.empty()) {
@@ -4447,14 +4666,30 @@ void Game::settingChangedCallback(const std::string &setting_name, void *data)
 
 void Game::readSettings()
 {
-	m_cache_doubletap_jump            = g_settings->getBool("doubletap_jump");
-	m_cache_enable_clouds             = g_settings->getBool("enable_clouds");
-	m_cache_enable_particles          = g_settings->getBool("enable_particles");
-	m_cache_enable_fog                = g_settings->getBool("enable_fog");
-	m_cache_mouse_sensitivity         = g_settings->getFloat("mouse_sensitivity");
-	m_repeat_right_click_time         = g_settings->getFloat("repeat_rightclick_time");
+	m_cache_doubletap_jump               = g_settings->getBool("doubletap_jump");
+	m_cache_enable_clouds                = g_settings->getBool("enable_clouds");
+	m_cache_enable_joysticks             = g_settings->getBool("enable_joysticks");
+	m_cache_enable_particles             = g_settings->getBool("enable_particles");
+	m_cache_enable_fog                   = g_settings->getBool("enable_fog");
+	m_cache_mouse_sensitivity            = g_settings->getFloat("mouse_sensitivity");
+	m_cache_joystick_frustum_sensitivity = g_settings->getFloat("joystick_frustum_sensitivity");
+	m_repeat_right_click_time            = g_settings->getFloat("repeat_rightclick_time");
+
+	m_cache_enable_noclip                = g_settings->getBool("noclip");
+	m_cache_enable_free_move             = g_settings->getBool("free_move");
+
+	m_cache_fog_start                    = g_settings->getFloat("fog_start");
+
+	m_cache_cam_smoothing = 0;
+	if (g_settings->getBool("cinematic"))
+		m_cache_cam_smoothing = 1 - g_settings->getFloat("cinematic_camera_smoothing");
+	else
+		m_cache_cam_smoothing = 1 - g_settings->getFloat("camera_smoothing");
 
+	m_cache_fog_start = rangelim(m_cache_fog_start, 0.0f, 0.99f);
+	m_cache_cam_smoothing = rangelim(m_cache_cam_smoothing, 0.01f, 1.0f);
 	m_cache_mouse_sensitivity = rangelim(m_cache_mouse_sensitivity, 0.001, 100.0);
+
 }
 
 /****************************************************************************/
diff --git a/src/game.h b/src/game.h
index e1f4e93..df32e33 100644
--- a/src/game.h
+++ b/src/game.h
@@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "irrlichttypes_extrabloated.h"
 #include <string>
+#include "client/keys.h"
+#include "client/joystick_controller.h"
 #include "keycode.h"
 #include <list>
 
@@ -110,6 +112,9 @@ public:
 	virtual bool isKeyDown(const KeyPress &keyCode) = 0;
 	virtual bool wasKeyDown(const KeyPress &keyCode) = 0;
 
+	virtual void listenForKey(const KeyPress &keyCode) {}
+	virtual void dontListenForKeys() {}
+
 	virtual v2s32 getMousePos() = 0;
 	virtual void setMousePos(s32 x, s32 y) = 0;
 
@@ -131,6 +136,8 @@ public:
 	virtual void step(float dtime) {}
 
 	virtual void clear() {}
+
+	JoystickController joystick;
 };
 
 class ChatBackend;  /* to avoid having to include chat.h */
diff --git a/src/genericobject.cpp b/src/genericobject.cpp
index 368cae1..c4660cf 100644
--- a/src/genericobject.cpp
+++ b/src/genericobject.cpp
@@ -182,3 +182,15 @@ std::string gob_cmd_update_nametag_attributes(video::SColor color)
 	writeARGB8(os, color);
 	return os.str();
 }
+
+std::string gob_cmd_update_infant(u16 id, u8 type, std::string client_initialization_data)
+{
+	std::ostringstream os(std::ios::binary);
+	// command 
+	writeU8(os, GENERIC_CMD_SPAWN_INFANT);
+	// parameters
+	writeU16(os, id);
+	writeU8(os, type);
+	os<<serializeLongString(client_initialization_data);
+	return os.str();
+}
diff --git a/src/genericobject.h b/src/genericobject.h
index b925708..48e71db 100644
--- a/src/genericobject.h
+++ b/src/genericobject.h
@@ -35,7 +35,8 @@ enum GenericCMD {
 	GENERIC_CMD_SET_BONE_POSITION,
 	GENERIC_CMD_ATTACH_TO,
 	GENERIC_CMD_SET_PHYSICS_OVERRIDE,
-	GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES
+	GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES,
+	GENERIC_CMD_SPAWN_INFANT
 };
 
 #include "object_properties.h"
@@ -77,5 +78,7 @@ std::string gob_cmd_update_attachment(int parent_id, std::string bone, v3f posit
 
 std::string gob_cmd_update_nametag_attributes(video::SColor color);
 
+std::string gob_cmd_update_infant(u16 id, u8 type, std::string client_initialization_data);
+
 #endif
 
diff --git a/src/gettext.h b/src/gettext.h
index b8d27f7..885d7ca 100644
--- a/src/gettext.h
+++ b/src/gettext.h
@@ -25,6 +25,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #if USE_GETTEXT
 	#include <libintl.h>
 #else
+	// In certain environments, some standard headers like <iomanip>
+	// and <locale> include libintl.h. If libintl.h is included after
+	// we define our gettext macro below, this causes a syntax error
+	// at the declaration of the gettext function in libintl.h.
+	// Fix this by including such a header before defining the macro.
+	// See issue #4446.
+	// Note that we can't include libintl.h directly since we're in
+	// the USE_GETTEXT=0 case and can't assume that gettext is installed.
+	#include <locale>
+
 	#define gettext(String) String
 #endif
 
diff --git a/src/guiChatConsole.cpp b/src/guiChatConsole.cpp
index 17a1689..8dd5ab0 100644
--- a/src/guiChatConsole.cpp
+++ b/src/guiChatConsole.cpp
@@ -32,7 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <string>
 
 #if USE_FREETYPE
-#include "xCGUITTFont.h"
+	#include "xCGUITTFont.h"
 #endif
 
 inline u32 clamp_u8(s32 value)
@@ -340,13 +340,28 @@ void GUIChatConsole::drawText()
 			s32 x = (fragment.column + 1) * m_fontsize.X;
 			core::rect<s32> destrect(
 				x, y, x + m_fontsize.X * fragment.text.size(), y + m_fontsize.Y);
-			m_font->draw(
-				fragment.text.c_str(),
-				destrect,
-				video::SColor(255, 255, 255, 255),
-				false,
-				false,
-				&AbsoluteClippingRect);
+
+
+			#if USE_FREETYPE
+			// Draw colored text if FreeType is enabled
+				irr::gui::CGUITTFont *tmp = static_cast<irr::gui::CGUITTFont*>(m_font);
+				tmp->draw(
+					fragment.text,
+					destrect,
+					video::SColor(255, 255, 255, 255),
+					false,
+					false,
+					&AbsoluteClippingRect);
+			#else
+			// Otherwise use standard text
+				m_font->draw(
+					fragment.text.c_str(),
+					destrect,
+					video::SColor(255, 255, 255, 255),
+					false,
+					false,
+					&AbsoluteClippingRect);
+			#endif
 		}
 	}
 }
@@ -615,7 +630,7 @@ bool GUIChatConsole::OnEvent(const SEvent& event)
 		}
 		else if(event.KeyInput.Char != 0 && !event.KeyInput.Control)
 		{
-			#if (defined(linux) || defined(__linux))
+			#if (defined(__linux__))
 				wchar_t wc = L'_';
 				mbtowc( &wc, (char *) &event.KeyInput.Char, sizeof(event.KeyInput.Char) );
 				prompt.input(wc);
diff --git a/src/guiEngine.cpp b/src/guiEngine.cpp
index ba286a9..a3c35f6 100644
--- a/src/guiEngine.cpp
+++ b/src/guiEngine.cpp
@@ -37,6 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "log.h"
 #include "fontengine.h"
 #include "guiscalingfilter.h"
+#include "irrlicht_changes/static_text.h"
 
 #ifdef __ANDROID__
 #include "client/tile.h"
@@ -130,6 +131,7 @@ void MenuMusicFetcher::fetchSounds(const std::string &name,
 /** GUIEngine                                                                 */
 /******************************************************************************/
 GUIEngine::GUIEngine(	irr::IrrlichtDevice* dev,
+						JoystickController *joystick,
 						gui::IGUIElement* parent,
 						IMenuManager *menumgr,
 						scene::ISceneManager* smgr,
@@ -172,21 +174,22 @@ GUIEngine::GUIEngine(	irr::IrrlichtDevice* dev,
 		m_sound_manager = &dummySoundManager;
 
 	//create topleft header
-	std::wstring t = utf8_to_wide(std::string(PROJECT_NAME_C " ") +
-			g_version_hash);
+	m_toplefttext = L"";
 
-	core::rect<s32> rect(0, 0, g_fontengine->getTextWidth(t), g_fontengine->getTextHeight());
+	core::rect<s32> rect(0, 0, g_fontengine->getTextWidth(m_toplefttext.c_str()),
+		g_fontengine->getTextHeight());
 	rect += v2s32(4, 0);
 
 	m_irr_toplefttext =
-		m_device->getGUIEnvironment()->addStaticText(t.c_str(),
-		rect,false,true,0,-1);
+		addStaticText(m_device->getGUIEnvironment(), m_toplefttext,
+			rect, false, true, 0, -1);
 
 	//create formspecsource
 	m_formspecgui = new FormspecFormSource("");
 
 	/* Create menu */
 	m_menu = new GUIFormSpecMenu(m_device,
+			joystick,
 			m_parent,
 			-1,
 			m_menumanager,
@@ -430,7 +433,7 @@ void GUIEngine::drawOverlay(video::IVideoDriver* driver)
 
 	video::ITexture* texture = m_textures[TEX_LAYER_OVERLAY].texture;
 
-	/* If no texture, draw background of solid color */
+	/* If no texture, draw nothing */
 	if(!texture)
 		return;
 
@@ -459,7 +462,7 @@ void GUIEngine::drawHeader(video::IVideoDriver* driver)
 	v2s32 splashsize(((f32)texture->getOriginalSize().Width) * mult,
 			((f32)texture->getOriginalSize().Height) * mult);
 
-	// Don't draw the header is there isn't enough room
+	// Don't draw the header if there isn't enough room
 	s32 free_space = (((s32)screensize.Height)-320)/2;
 
 	if (free_space > splashsize.Y) {
@@ -567,18 +570,9 @@ bool GUIEngine::downloadFile(std::string url, std::string target)
 }
 
 /******************************************************************************/
-void GUIEngine::setTopleftText(std::string append)
+void GUIEngine::setTopleftText(const std::string &text)
 {
-	std::wstring toset = utf8_to_wide(std::string(PROJECT_NAME_C " ") +
-		g_version_hash);
-
-	if (append != "")
-	{
-		toset += L" / ";
-		toset += utf8_to_wide(append);
-	}
-
-	m_irr_toplefttext->setText(toset.c_str());
+	m_toplefttext = utf8_to_wide(text);
 
 	updateTopLeftTextSize();
 }
@@ -586,15 +580,14 @@ void GUIEngine::setTopleftText(std::string append)
 /******************************************************************************/
 void GUIEngine::updateTopLeftTextSize()
 {
-	std::wstring text = m_irr_toplefttext->getText();
-
-	core::rect<s32> rect(0, 0, g_fontengine->getTextWidth(text), g_fontengine->getTextHeight());
-		rect += v2s32(4, 0);
+	core::rect<s32> rect(0, 0, g_fontengine->getTextWidth(m_toplefttext.c_str()),
+		g_fontengine->getTextHeight());
+	rect += v2s32(4, 0);
 
 	m_irr_toplefttext->remove();
 	m_irr_toplefttext =
-		m_device->getGUIEnvironment()->addStaticText(text.c_str(),
-		rect,false,true,0,-1);
+		addStaticText(m_device->getGUIEnvironment(), m_toplefttext,
+			rect, false, true, 0, -1);
 }
 
 /******************************************************************************/
diff --git a/src/guiEngine.h b/src/guiEngine.h
index d527f72..8972448 100644
--- a/src/guiEngine.h
+++ b/src/guiEngine.h
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "guiFormSpecMenu.h"
 #include "sound.h"
 #include "client/tile.h"
+#include "util/enriched_string.h"
 
 /******************************************************************************/
 /* Typedefs and macros                                                        */
@@ -148,7 +149,8 @@ public:
 	 * @param smgr scene manager to add scene elements to
 	 * @param data struct to transfer data to main game handling
 	 */
-	GUIEngine(	irr::IrrlichtDevice* dev,
+	GUIEngine(irr::IrrlichtDevice* dev,
+			JoystickController *joystick,
 			gui::IGUIElement* parent,
 			IMenuManager *menumgr,
 			scene::ISceneManager* smgr,
@@ -268,13 +270,15 @@ private:
 	void drawVersion();
 
 	/**
-	 * specify text to be appended to version string
+	 * specify text to appear as top left string
 	 * @param text to set
 	 */
-	void setTopleftText(std::string append);
+	void setTopleftText(const std::string &text);
 
 	/** pointer to gui element shown at topleft corner */
 	irr::gui::IGUIStaticText*	m_irr_toplefttext;
+	/** and text that is in it */
+	EnrichedString m_toplefttext;
 
 	/** initialize cloud subsystem */
 	void cloudInit();
diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp
index 2bf06c1..bfc7a9b 100644
--- a/src/guiFormSpecMenu.cpp
+++ b/src/guiFormSpecMenu.cpp
@@ -50,6 +50,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/hex.h"
 #include "util/numeric.h"
 #include "util/string.h" // for parseColorString()
+#include "irrlicht_changes/static_text.h"
 #include "guiscalingfilter.h"
 
 #if USE_FREETYPE && IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9
@@ -78,6 +79,7 @@ static unsigned int font_line_height(gui::IGUIFont *font)
 }
 
 GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
+		JoystickController *joystick,
 		gui::IGUIElement* parent, s32 id, IMenuManager *menumgr,
 		InventoryManager *invmgr, IGameDef *gamedef,
 		ISimpleTextureSource *tsrc, IFormSource* fsrc, TextDest* tdst,
@@ -101,6 +103,8 @@ GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
 	m_text_dst(tdst),
 	m_formspec_version(0),
 	m_focused_element(""),
+	m_joystick(joystick),
+	current_field_enter_pending(""),
 	m_font(NULL),
 	m_remap_dbl_click(remap_dbl_click)
 #ifdef __ANDROID__
@@ -249,37 +253,6 @@ std::vector<std::string>* GUIFormSpecMenu::getDropDownValues(const std::string &
 	return NULL;
 }
 
-static std::vector<std::string> split(const std::string &s, char delim)
-{
-	std::vector<std::string> tokens;
-
-	std::string current = "";
-	bool last_was_escape = false;
-	for (unsigned int i = 0; i < s.size(); i++) {
-		char si = s.c_str()[i];
-		if (last_was_escape) {
-			current += '\\';
-			current += si;
-			last_was_escape = false;
-		} else {
-			if (si == delim) {
-				tokens.push_back(current);
-				current = "";
-				last_was_escape = false;
-			} else if (si == '\\') {
-				last_was_escape = true;
-			} else {
-				current += si;
-				last_was_escape = false;
-			}
-		}
-	}
-	//push last element
-	tokens.push_back(current);
-
-	return tokens;
-}
-
 void GUIFormSpecMenu::parseSize(parserData* data,std::string element)
 {
 	std::vector<std::string> parts = split(element,',');
@@ -306,6 +279,32 @@ void GUIFormSpecMenu::parseSize(parserData* data,std::string element)
 	errorstream<< "Invalid size element (" << parts.size() << "): '" << element << "'"  << std::endl;
 }
 
+void GUIFormSpecMenu::parseContainer(parserData* data, std::string element)
+{
+	std::vector<std::string> parts = split(element, ',');
+
+	if (parts.size() >= 2) {
+		if (parts[1].find(';') != std::string::npos)
+			parts[1] = parts[1].substr(0, parts[1].find(';'));
+
+		container_stack.push(pos_offset);
+		pos_offset.X += MYMAX(0, stof(parts[0]));
+		pos_offset.Y += MYMAX(0, stof(parts[1]));
+		return;
+	}
+	errorstream<< "Invalid container start element (" << parts.size() << "): '" << element << "'"  << std::endl;
+}
+
+void GUIFormSpecMenu::parseContainerEnd(parserData* data)
+{
+	if (container_stack.empty()) {
+		errorstream<< "Invalid container end element, no matching container start element"  << std::endl;
+	} else {
+		pos_offset = container_stack.top();
+		container_stack.pop();
+	}
+}
+
 void GUIFormSpecMenu::parseList(parserData* data,std::string element)
 {
 	if (m_gamedef == 0) {
@@ -336,7 +335,7 @@ void GUIFormSpecMenu::parseList(parserData* data,std::string element)
 		else
 			loc.deSerialize(location);
 
-		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float)spacing.X;
 		pos.Y += stof(v_pos[1]) * (float)spacing.Y;
 
@@ -413,7 +412,7 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data,std::string element)
 
 		MY_CHECKPOS("checkbox",0);
 
-		v2s32 pos = padding;
+		v2s32 pos = padding + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float) spacing.X;
 		pos.Y += stof(v_pos[1]) * (float) spacing.Y;
 
@@ -464,7 +463,7 @@ void GUIFormSpecMenu::parseScrollBar(parserData* data, std::string element)
 
 		MY_CHECKPOS("scrollbar",0);
 
-		v2s32 pos = padding;
+		v2s32 pos = padding + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float) spacing.X;
 		pos.Y += stof(v_pos[1]) * (float) spacing.Y;
 
@@ -522,10 +521,10 @@ void GUIFormSpecMenu::parseImage(parserData* data,std::string element)
 		std::vector<std::string> v_geom = split(parts[1],',');
 		std::string name = unescape_string(parts[2]);
 
-		MY_CHECKPOS("image",0);
-		MY_CHECKGEOM("image",1);
+		MY_CHECKPOS("image", 0);
+		MY_CHECKGEOM("image", 1);
 
-		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float) spacing.X;
 		pos.Y += stof(v_pos[1]) * (float) spacing.Y;
 
@@ -533,23 +532,21 @@ void GUIFormSpecMenu::parseImage(parserData* data,std::string element)
 		geom.X = stof(v_geom[0]) * (float)imgsize.X;
 		geom.Y = stof(v_geom[1]) * (float)imgsize.Y;
 
-		if(!data->explicit_size)
+		if (!data->explicit_size)
 			warningstream<<"invalid use of image without a size[] element"<<std::endl;
 		m_images.push_back(ImageDrawSpec(name, pos, geom));
 		return;
-	}
-
-	if (parts.size() == 2) {
+	} else if (parts.size() == 2) {
 		std::vector<std::string> v_pos = split(parts[0],',');
 		std::string name = unescape_string(parts[1]);
 
-		MY_CHECKPOS("image",0);
+		MY_CHECKPOS("image", 0);
 
-		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float) spacing.X;
 		pos.Y += stof(v_pos[1]) * (float) spacing.Y;
 
-		if(!data->explicit_size)
+		if (!data->explicit_size)
 			warningstream<<"invalid use of image without a size[] element"<<std::endl;
 		m_images.push_back(ImageDrawSpec(name, pos));
 		return;
@@ -571,7 +568,7 @@ void GUIFormSpecMenu::parseItemImage(parserData* data,std::string element)
 		MY_CHECKPOS("itemimage",0);
 		MY_CHECKGEOM("itemimage",1);
 
-		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float) spacing.X;
 		pos.Y += stof(v_pos[1]) * (float) spacing.Y;
 
@@ -603,7 +600,7 @@ void GUIFormSpecMenu::parseButton(parserData* data,std::string element,
 		MY_CHECKPOS("button",0);
 		MY_CHECKGEOM("button",1);
 
-		v2s32 pos = padding;
+		v2s32 pos = padding + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float)spacing.X;
 		pos.Y += stof(v_pos[1]) * (float)spacing.Y;
 
@@ -656,25 +653,25 @@ void GUIFormSpecMenu::parseBackground(parserData* data,std::string element)
 		MY_CHECKPOS("background",0);
 		MY_CHECKGEOM("background",1);
 
-		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
-		pos.X += stof(v_pos[0]) * (float)spacing.X - ((float)spacing.X-(float)imgsize.X)/2;
-		pos.Y += stof(v_pos[1]) * (float)spacing.Y - ((float)spacing.Y-(float)imgsize.Y)/2;
+		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
+		pos.X += stof(v_pos[0]) * (float)spacing.X - ((float)spacing.X - (float)imgsize.X)/2;
+		pos.Y += stof(v_pos[1]) * (float)spacing.Y - ((float)spacing.Y - (float)imgsize.Y)/2;
 
 		v2s32 geom;
 		geom.X = stof(v_geom[0]) * (float)spacing.X;
 		geom.Y = stof(v_geom[1]) * (float)spacing.Y;
 
-		if (parts.size() == 4) {
-			m_clipbackground = is_yes(parts[3]);
-			if (m_clipbackground) {
-				pos.X = stoi(v_pos[0]); //acts as offset
-				pos.Y = stoi(v_pos[1]); //acts as offset
-			}
+		if (!data->explicit_size)
+			warningstream<<"invalid use of background without a size[] element"<<std::endl;
+
+		bool clip = false;
+		if (parts.size() == 4 && is_yes(parts[3])) {
+			pos.X = stoi(v_pos[0]); //acts as offset
+			pos.Y = stoi(v_pos[1]); //acts as offset
+			clip = true;
 		}
+		m_backgrounds.push_back(ImageDrawSpec(name, pos, geom, clip));
 
-		if(!data->explicit_size)
-			warningstream<<"invalid use of background without a size[] element"<<std::endl;
-		m_backgrounds.push_back(ImageDrawSpec(name, pos, geom));
 		return;
 	}
 	errorstream<< "Invalid background element(" << parts.size() << "): '" << element << "'"  << std::endl;
@@ -732,7 +729,7 @@ void GUIFormSpecMenu::parseTable(parserData* data,std::string element)
 		MY_CHECKPOS("table",0);
 		MY_CHECKGEOM("table",1);
 
-		v2s32 pos = padding;
+		v2s32 pos = padding + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float)spacing.X;
 		pos.Y += stof(v_pos[1]) * (float)spacing.Y;
 
@@ -803,7 +800,7 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element)
 		MY_CHECKPOS("textlist",0);
 		MY_CHECKGEOM("textlist",1);
 
-		v2s32 pos = padding;
+		v2s32 pos = padding + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float)spacing.X;
 		pos.Y += stof(v_pos[1]) * (float)spacing.Y;
 
@@ -868,7 +865,7 @@ void GUIFormSpecMenu::parseDropDown(parserData* data,std::string element)
 
 		MY_CHECKPOS("dropdown",0);
 
-		v2s32 pos = padding;
+		v2s32 pos = padding + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float)spacing.X;
 		pos.Y += stof(v_pos[1]) * (float)spacing.Y;
 
@@ -917,12 +914,22 @@ void GUIFormSpecMenu::parseDropDown(parserData* data,std::string element)
 				<< element << "'"  << std::endl;
 }
 
+void GUIFormSpecMenu::parseFieldCloseOnEnter(parserData *data,
+		const std::string &element)
+{
+	std::vector<std::string> parts = split(element,';');
+	if (parts.size() == 2 ||
+			(parts.size() > 2 && m_formspec_version > FORMSPEC_API_VERSION)) {
+		field_close_on_enter[parts[0]] = is_yes(parts[1]);
+	}
+}
+
 void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element)
 {
 	std::vector<std::string> parts = split(element,';');
 
-	if ((parts.size() == 4) ||
-		((parts.size() > 4) && (m_formspec_version > FORMSPEC_API_VERSION)))
+	if ((parts.size() == 4) || (parts.size() == 5) ||
+		((parts.size() > 5) && (m_formspec_version > FORMSPEC_API_VERSION)))
 	{
 		std::vector<std::string> v_pos = split(parts[0],',');
 		std::vector<std::string> v_geom = split(parts[1],',');
@@ -932,7 +939,7 @@ void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element)
 		MY_CHECKPOS("pwdfield",0);
 		MY_CHECKGEOM("pwdfield",1);
 
-		v2s32 pos;
+		v2s32 pos = pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float)spacing.X;
 		pos.Y += stof(v_pos[1]) * (float)spacing.Y;
 
@@ -966,7 +973,7 @@ void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element)
 			int font_height = g_fontengine->getTextHeight();
 			rect.UpperLeftCorner.Y -= font_height;
 			rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + font_height;
-			Environment->addStaticText(spec.flabel.c_str(), rect, false, true, this, 0);
+			addStaticText(Environment, spec.flabel.c_str(), rect, false, true, this, 0);
 		}
 
 		e->setPasswordBox(true,L'*');
@@ -979,6 +986,14 @@ void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element)
 		evt.KeyInput.Shift       = 0;
 		evt.KeyInput.PressedDown = true;
 		e->OnEvent(evt);
+
+		if (parts.size() >= 5) {
+			// TODO: remove after 2016-11-03
+			warningstream << "pwdfield: use field_close_on_enter[name, enabled]" <<
+					" instead of the 5th param" << std::endl;
+			field_close_on_enter[name] = is_yes(parts[4]);
+		}
+
 		m_fields.push_back(spec);
 		return;
 	}
@@ -997,7 +1012,7 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data,
 	if(data->explicit_size)
 		warningstream<<"invalid use of unpositioned \"field\" in inventory"<<std::endl;
 
-	v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+	v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
 	pos.Y = ((m_fields.size()+2)*60);
 	v2s32 size = DesiredRect.getSize();
 
@@ -1021,7 +1036,7 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data,
 	if (name == "")
 	{
 		// spec field id to 0, this stops submit searching for a value that isn't there
-		Environment->addStaticText(spec.flabel.c_str(), rect, false, true, this, spec.fid);
+		addStaticText(Environment, spec.flabel.c_str(), rect, false, true, this, spec.fid);
 	}
 	else
 	{
@@ -1056,10 +1071,17 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data,
 			int font_height = g_fontengine->getTextHeight();
 			rect.UpperLeftCorner.Y -= font_height;
 			rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + font_height;
-			Environment->addStaticText(spec.flabel.c_str(), rect, false, true, this, 0);
+			addStaticText(Environment, spec.flabel.c_str(), rect, false, true, this, 0);
 		}
 	}
 
+	if (parts.size() >= 4) {
+		// TODO: remove after 2016-11-03
+		warningstream << "field/simple: use field_close_on_enter[name, enabled]" <<
+				" instead of the 4th param" << std::endl;
+		field_close_on_enter[name] = is_yes(parts[3]);
+	}
+
 	m_fields.push_back(spec);
 }
 
@@ -1076,9 +1098,9 @@ void GUIFormSpecMenu::parseTextArea(parserData* data,
 	MY_CHECKPOS(type,0);
 	MY_CHECKGEOM(type,1);
 
-	v2s32 pos;
-	pos.X = stof(v_pos[0]) * (float) spacing.X;
-	pos.Y = stof(v_pos[1]) * (float) spacing.Y;
+	v2s32 pos = pos_offset * spacing;
+	pos.X += stof(v_pos[0]) * (float) spacing.X;
+	pos.Y += stof(v_pos[1]) * (float) spacing.Y;
 
 	v2s32 geom;
 
@@ -1117,7 +1139,7 @@ void GUIFormSpecMenu::parseTextArea(parserData* data,
 	if (name == "")
 	{
 		// spec field id to 0, this stops submit searching for a value that isn't there
-		Environment->addStaticText(spec.flabel.c_str(), rect, false, true, this, spec.fid);
+		addStaticText(Environment, spec.flabel.c_str(), rect, false, true, this, spec.fid);
 	}
 	else
 	{
@@ -1161,9 +1183,17 @@ void GUIFormSpecMenu::parseTextArea(parserData* data,
 			int font_height = g_fontengine->getTextHeight();
 			rect.UpperLeftCorner.Y -= font_height;
 			rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + font_height;
-			Environment->addStaticText(spec.flabel.c_str(), rect, false, true, this, 0);
+			addStaticText(Environment, spec.flabel.c_str(), rect, false, true, this, 0);
 		}
 	}
+
+	if (parts.size() >= 6) {
+		// TODO: remove after 2016-11-03
+		warningstream << "field/textarea: use field_close_on_enter[name, enabled]" <<
+				" instead of the 6th param" << std::endl;
+		field_close_on_enter[name] = is_yes(parts[5]);
+	}
+
 	m_fields.push_back(spec);
 }
 
@@ -1177,8 +1207,8 @@ void GUIFormSpecMenu::parseField(parserData* data,std::string element,
 		return;
 	}
 
-	if ((parts.size() == 5) ||
-		((parts.size() > 5) && (m_formspec_version > FORMSPEC_API_VERSION)))
+	if ((parts.size() == 5) || (parts.size() == 6) ||
+		((parts.size() > 6) && (m_formspec_version > FORMSPEC_API_VERSION)))
 	{
 		parseTextArea(data,parts,type);
 		return;
@@ -1198,7 +1228,7 @@ void GUIFormSpecMenu::parseLabel(parserData* data,std::string element)
 
 		MY_CHECKPOS("label",0);
 
-		v2s32 pos = padding;
+		v2s32 pos = padding + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float)spacing.X;
 		pos.Y += (stof(v_pos[1]) + 7.0/30.0) * (float)spacing.Y;
 
@@ -1230,7 +1260,7 @@ void GUIFormSpecMenu::parseLabel(parserData* data,std::string element)
 				258+m_fields.size()
 			);
 			gui::IGUIStaticText *e =
-				Environment->addStaticText(spec.flabel.c_str(),
+				addStaticText(Environment, spec.flabel.c_str(),
 					rect, false, false, this, spec.fid);
 			e->setTextAlignment(gui::EGUIA_UPPERLEFT,
 						gui::EGUIA_CENTER);
@@ -1255,7 +1285,7 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data,std::string element)
 
 		MY_CHECKPOS("vertlabel",1);
 
-		v2s32 pos = padding;
+		v2s32 pos = padding + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float)spacing.X;
 		pos.Y += stof(v_pos[1]) * (float)spacing.Y;
 
@@ -1284,7 +1314,7 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data,std::string element)
 			258+m_fields.size()
 		);
 		gui::IGUIStaticText *t =
-				Environment->addStaticText(spec.flabel.c_str(), rect, false, false, this, spec.fid);
+				addStaticText(Environment, spec.flabel.c_str(), rect, false, false, this, spec.fid);
 		t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_CENTER);
 		m_fields.push_back(spec);
 		return;
@@ -1309,7 +1339,7 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,
 		MY_CHECKPOS("imagebutton",0);
 		MY_CHECKGEOM("imagebutton",1);
 
-		v2s32 pos = padding;
+		v2s32 pos = padding + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float)spacing.X;
 		pos.Y += stof(v_pos[1]) * (float)spacing.Y;
 		v2s32 geom;
@@ -1414,7 +1444,7 @@ void GUIFormSpecMenu::parseTabHeader(parserData* data,std::string element)
 
 		spec.ftype = f_TabHeader;
 
-		v2s32 pos(0,0);
+		v2s32 pos = pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float)spacing.X;
 		pos.Y += stof(v_pos[1]) * (float)spacing.Y - m_btn_height * 2;
 		v2s32 geom;
@@ -1479,7 +1509,7 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element)
 		MY_CHECKPOS("itemimagebutton",0);
 		MY_CHECKGEOM("itemimagebutton",1);
 
-		v2s32 pos = padding;
+		v2s32 pos = padding + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float)spacing.X;
 		pos.Y += stof(v_pos[1]) * (float)spacing.Y;
 		v2s32 geom;
@@ -1517,7 +1547,7 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element)
 		rect+=data->basepos-padding;
 		spec.rect=rect;
 		m_fields.push_back(spec);
-		pos = padding + AbsoluteRect.UpperLeftCorner;
+		pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float) spacing.X;
 		pos.Y += stof(v_pos[1]) * (float) spacing.Y;
 		m_itemimages.push_back(ImageDrawSpec("", item_name, e, pos, geom));
@@ -1540,7 +1570,7 @@ void GUIFormSpecMenu::parseBox(parserData* data,std::string element)
 		MY_CHECKPOS("box",0);
 		MY_CHECKGEOM("box",1);
 
-		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+		v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
 		pos.X += stof(v_pos[0]) * (float) spacing.X;
 		pos.Y += stof(v_pos[1]) * (float) spacing.Y;
 
@@ -1702,8 +1732,18 @@ void GUIFormSpecMenu::parseElement(parserData* data, std::string element)
 	std::string type = trim(parts[0]);
 	std::string description = trim(parts[1]);
 
+	if (type == "container") {
+		parseContainer(data, description);
+		return;
+	}
+
+	if (type == "container_end") {
+		parseContainerEnd(data);
+		return;
+	}
+
 	if (type == "list") {
-		parseList(data,description);
+		parseList(data, description);
 		return;
 	}
 
@@ -1713,22 +1753,22 @@ void GUIFormSpecMenu::parseElement(parserData* data, std::string element)
 	}
 
 	if (type == "checkbox") {
-		parseCheckbox(data,description);
+		parseCheckbox(data, description);
 		return;
 	}
 
 	if (type == "image") {
-		parseImage(data,description);
+		parseImage(data, description);
 		return;
 	}
 
 	if (type == "item_image") {
-		parseItemImage(data,description);
+		parseItemImage(data, description);
 		return;
 	}
 
-	if ((type == "button") || (type == "button_exit")) {
-		parseButton(data,description,type);
+	if (type == "button" || type == "button_exit") {
+		parseButton(data, description, type);
 		return;
 	}
 
@@ -1762,6 +1802,11 @@ void GUIFormSpecMenu::parseElement(parserData* data, std::string element)
 		return;
 	}
 
+	if (type == "field_close_on_enter") {
+		parseFieldCloseOnEnter(data, description);
+		return;
+	}
+
 	if (type == "pwdfield") {
 		parsePwdField(data,description);
 		return;
@@ -1905,12 +1950,11 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
 	m_slotbordercolor = video::SColor(200,0,0,0);
 	m_slotborder = false;
 
-	m_clipbackground = false;
 	// Add tooltip
 	{
 		assert(m_tooltip_element == NULL);
 		// Note: parent != this so that the tooltip isn't clipped by the menu rectangle
-		m_tooltip_element = Environment->addStaticText(L"",core::rect<s32>(0,0,110,18));
+		m_tooltip_element = addStaticText(Environment, L"",core::rect<s32>(0,0,110,18));
 		m_tooltip_element->enableOverrideColor(true);
 		m_tooltip_element->setBackgroundColor(m_default_tooltip_bgcolor);
 		m_tooltip_element->setDrawBackground(true);
@@ -2050,10 +2094,16 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
 	gui::IGUIFont *old_font = skin->getFont();
 	skin->setFont(m_font);
 
+	pos_offset = v2s32();
 	for (; i< elements.size(); i++) {
 		parseElement(&mydata, elements[i]);
 	}
 
+	if (!container_stack.empty()) {
+		errorstream << "Invalid formspec string: container was never closed!"
+			<< std::endl;
+	}
+
 	// If there are fields without explicit size[], add a "Proceed"
 	// button and adjust size to fit all the fields.
 	if (m_fields.size() && !mydata.explicit_size) {
@@ -2255,7 +2305,6 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase,
 			std::wstring tooltip_text = L"";
 			if (hovering && !m_selected_item) {
 				tooltip_text = utf8_to_wide(item.getDefinition(m_gamedef->idef()).description);
-				tooltip_text = unescape_enriched(tooltip_text);
 			}
 			if (tooltip_text != L"") {
 				std::vector<std::wstring> tt_rows = str_split(tooltip_text, L'\n');
@@ -2263,9 +2312,13 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase,
 				m_tooltip_element->setOverrideColor(m_default_tooltip_color);
 				m_tooltip_element->setVisible(true);
 				this->bringToFront(m_tooltip_element);
-				m_tooltip_element->setText(tooltip_text.c_str());
+				setStaticText(m_tooltip_element, tooltip_text.c_str());
 				s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height;
+#if (IRRLICHT_VERSION_MAJOR <= 1 && IRRLICHT_VERSION_MINOR <= 8 && IRRLICHT_VERSION_REVISION < 2) || USE_FREETYPE == 1
+				s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5;
+#else
 				s32 tooltip_height = m_tooltip_element->getTextHeight() + 5;
+#endif
 				v2u32 screenSize = driver->getScreenSize();
 				int tooltip_offset_x = m_btn_height;
 				int tooltip_offset_y = m_btn_height;
@@ -2309,6 +2362,7 @@ void GUIFormSpecMenu::drawSelectedItem()
 
 	core::rect<s32> imgrect(0,0,imgsize.X,imgsize.Y);
 	core::rect<s32> rect = imgrect + (m_pointer - imgrect.getCenter());
+	rect.constrainTo(driver->getViewPort());
 	drawItemStack(driver, m_font, stack, rect, NULL, m_gamedef, IT_ROT_DRAGGED);
 }
 
@@ -2354,7 +2408,7 @@ void GUIFormSpecMenu::drawMenu()
 			// Image rectangle on screen
 			core::rect<s32> rect = imgrect + spec.pos;
 
-			if (m_clipbackground) {
+			if (spec.clip) {
 				core::dimension2d<s32> absrec_size = AbsoluteRect.getSize();
 				rect = core::rect<s32>(AbsoluteRect.UpperLeftCorner.X - spec.pos.X,
 									AbsoluteRect.UpperLeftCorner.Y - spec.pos.Y,
@@ -2368,8 +2422,7 @@ void GUIFormSpecMenu::drawMenu()
 				core::rect<s32>(core::position2d<s32>(0,0),
 						core::dimension2di(texture->getOriginalSize())),
 				NULL/*&AbsoluteClippingRect*/, colors, true);
-		}
-		else {
+		} else {
 			errorstream << "GUIFormSpecMenu::drawMenu() Draw backgrounds unable to load texture:" << std::endl;
 			errorstream << "\t" << spec.name << std::endl;
 		}
@@ -2486,7 +2539,7 @@ void GUIFormSpecMenu::drawMenu()
 		Draw static text elements
 	*/
 	for (u32 i = 0; i < m_static_texts.size(); i++) {
-		const StaticTextSpec &spec = m_static_texts[i];	
+		const StaticTextSpec &spec = m_static_texts[i];
 		core::rect<s32> rect = spec.rect;
 		if (spec.parent_button && spec.parent_button->isPressed()) {
 #if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
@@ -2531,8 +2584,10 @@ void GUIFormSpecMenu::drawMenu()
 					iter != m_fields.end(); ++iter) {
 				if (iter->fid == id && m_tooltips[iter->fname].tooltip != L"") {
 					if (m_old_tooltip != m_tooltips[iter->fname].tooltip) {
+						m_tooltip_element->setBackgroundColor(m_tooltips[iter->fname].bgcolor);
+						m_tooltip_element->setOverrideColor(m_tooltips[iter->fname].color);
 						m_old_tooltip = m_tooltips[iter->fname].tooltip;
-						m_tooltip_element->setText(m_tooltips[iter->fname].tooltip.c_str());
+						setStaticText(m_tooltip_element, m_tooltips[iter->fname].tooltip.c_str());
 						std::vector<std::wstring> tt_rows = str_split(m_tooltips[iter->fname].tooltip, L'\n');
 						s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height;
 						s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5;
@@ -2554,8 +2609,6 @@ void GUIFormSpecMenu::drawMenu()
 						core::position2d<s32>(tooltip_x, tooltip_y),
 						core::dimension2d<s32>(tooltip_width, tooltip_height)));
 					}
-					m_tooltip_element->setBackgroundColor(m_tooltips[iter->fname].bgcolor);
-					m_tooltip_element->setOverrideColor(m_tooltips[iter->fname].color);
 					m_tooltip_element->setVisible(true);
 					this->bringToFront(m_tooltip_element);
 					break;
@@ -2564,6 +2617,8 @@ void GUIFormSpecMenu::drawMenu()
 		}
 	}
 
+	m_tooltip_element->draw();
+
 	/*
 		Draw dragged item stack
 	*/
@@ -2718,6 +2773,11 @@ void GUIFormSpecMenu::acceptInput(FormspecQuitMode quitmode=quit_mode_no)
 			current_keys_pending.key_enter = false;
 		}
 
+		if (!current_field_enter_pending.empty()) {
+			fields["key_enter_field"] = current_field_enter_pending;
+			current_field_enter_pending = "";
+		}
+
 		if (current_keys_pending.key_escape) {
 			fields["key_escape"] = "true";
 			current_keys_pending.key_escape = false;
@@ -3049,6 +3109,25 @@ bool GUIFormSpecMenu::preprocessEvent(const SEvent& event)
 	}
 	#endif
 
+	if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT) {
+		/* TODO add a check like:
+		if (event.JoystickEvent != joystick_we_listen_for)
+			return false;
+		*/
+		bool handled = m_joystick->handleEvent(event.JoystickEvent);
+		if (handled) {
+			if (m_joystick->wasKeyDown(KeyType::ESC)) {
+				tryClose();
+			} else if (m_joystick->wasKeyDown(KeyType::JUMP)) {
+				if (m_allowclose) {
+					acceptInput(quit_mode_accept);
+					quitMenu();
+				}
+			}
+		}
+		return handled;
+	}
+
 	return false;
 }
 
@@ -3110,19 +3189,24 @@ bool GUIFormSpecMenu::DoubleClickDetection(const SEvent event)
 	return false;
 }
 
+void GUIFormSpecMenu::tryClose()
+{
+	if (m_allowclose) {
+		doPause = false;
+		acceptInput(quit_mode_cancel);
+		quitMenu();
+	} else {
+		m_text_dst->gotText(L"MenuQuit");
+	}
+}
+
 bool GUIFormSpecMenu::OnEvent(const SEvent& event)
 {
 	if (event.EventType==EET_KEY_INPUT_EVENT) {
 		KeyPress kp(event.KeyInput);
 		if (event.KeyInput.PressedDown && ( (kp == EscapeKey) ||
 				(kp == getKeySetting("keymap_inventory")) || (kp == CancelKey))) {
-			if (m_allowclose) {
-				doPause = false;
-				acceptInput(quit_mode_cancel);
-				quitMenu();
-			} else {
-				m_text_dst->gotText(L"MenuQuit");
-			}
+			tryClose();
 			return true;
 		} else if (m_client != NULL && event.KeyInput.PressedDown &&
 				(kp == getKeySetting("keymap_screenshot"))) {
@@ -3624,8 +3708,23 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
 
 		if (event.GUIEvent.EventType == gui::EGET_EDITBOX_ENTER) {
 			if (event.GUIEvent.Caller->getID() > 257) {
+				bool close_on_enter = true;
+				for (u32 i = 0; i < m_fields.size(); i++) {
+					FieldSpec &s = m_fields[i];
+					if (s.ftype == f_Unknown &&
+							s.fid == event.GUIEvent.Caller->getID()) {
+						current_field_enter_pending = s.fname;
+						UNORDERED_MAP<std::string, bool>::const_iterator it =
+							field_close_on_enter.find(s.fname);
+						if (it != field_close_on_enter.end())
+							close_on_enter = (*it).second;
+
+						break;
+					}
+				}
 
-				if (m_allowclose) {
+				if (m_allowclose && close_on_enter) {
+					current_keys_pending.key_enter = true;
 					acceptInput(quit_mode_accept);
 					quitMenu();
 				} else {
diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h
index ef230c8..95df11e 100644
--- a/src/guiFormSpecMenu.h
+++ b/src/guiFormSpecMenu.h
@@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define GUIINVENTORYMENU_HEADER
 
 #include <utility>
+#include <stack>
 
 #include "irrlichttypes_extrabloated.h"
 #include "inventory.h"
@@ -29,7 +30,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "modalMenu.h"
 #include "guiTable.h"
 #include "network/networkprotocol.h"
+#include "client/joystick_controller.h"
 #include "util/string.h"
+#include "util/enriched_string.h"
 
 class IGameDef;
 class InventoryManager;
@@ -141,9 +144,10 @@ class GUIFormSpecMenu : public GUIModalMenu
 	struct ImageDrawSpec
 	{
 		ImageDrawSpec():
-			parent_button(NULL)
-		{
-		}
+			parent_button(NULL),
+			clip(false)
+		{}
+
 		ImageDrawSpec(const std::string &a_name,
 				const std::string &a_item_name,
 				gui::IGUIButton *a_parent_button,
@@ -153,9 +157,10 @@ class GUIFormSpecMenu : public GUIModalMenu
 			parent_button(a_parent_button),
 			pos(a_pos),
 			geom(a_geom),
-			scale(true)
-		{
-		}
+			scale(true),
+			clip(false)
+		{}
+
 		ImageDrawSpec(const std::string &a_name,
 				const std::string &a_item_name,
 				const v2s32 &a_pos, const v2s32 &a_geom):
@@ -164,32 +169,36 @@ class GUIFormSpecMenu : public GUIModalMenu
 			parent_button(NULL),
 			pos(a_pos),
 			geom(a_geom),
-			scale(true)
-		{
-		}
+			scale(true),
+			clip(false)
+		{}
+
 		ImageDrawSpec(const std::string &a_name,
-				const v2s32 &a_pos, const v2s32 &a_geom):
+				const v2s32 &a_pos, const v2s32 &a_geom, bool clip=false):
 			name(a_name),
 			parent_button(NULL),
 			pos(a_pos),
 			geom(a_geom),
-			scale(true)
-		{
-		}
+			scale(true),
+			clip(clip)
+		{}
+
 		ImageDrawSpec(const std::string &a_name,
 				const v2s32 &a_pos):
 			name(a_name),
 			parent_button(NULL),
 			pos(a_pos),
-			scale(false)
-		{
-		}
+			scale(false),
+			clip(false)
+		{}
+
 		std::string name;
 		std::string item_name;
 		gui::IGUIButton *parent_button;
 		v2s32 pos;
 		v2s32 geom;
 		bool scale;
+		bool clip;
 	};
 
 	struct FieldSpec
@@ -200,13 +209,14 @@ class GUIFormSpecMenu : public GUIModalMenu
 		FieldSpec(const std::string &name, const std::wstring &label,
 				const std::wstring &default_text, int id) :
 			fname(name),
-			fid(id)
+			flabel(label),
+			fid(id),
+			send(false),
+			ftype(f_Unknown),
+			is_exit(false)
 		{
-			flabel = unescape_enriched(label);
+			//flabel = unescape_enriched(label);
 			fdefault = unescape_enriched(default_text);
-			send = false;
-			ftype = f_Unknown;
-			is_exit = false;
 		}
 		std::string fname;
 		std::wstring flabel;
@@ -239,7 +249,8 @@ class GUIFormSpecMenu : public GUIModalMenu
 			bgcolor(a_bgcolor),
 			color(a_color)
 		{
-			tooltip = unescape_enriched(utf8_to_wide(a_tooltip));
+			//tooltip = unescape_enriched(utf8_to_wide(a_tooltip));
+			tooltip = utf8_to_wide(a_tooltip);
 		}
 		std::wstring tooltip;
 		irr::video::SColor bgcolor;
@@ -256,7 +267,8 @@ class GUIFormSpecMenu : public GUIModalMenu
 			rect(a_rect),
 			parent_button(NULL)
 		{
-			text = unescape_enriched(a_text);
+			//text = unescape_enriched(a_text);
+			text = a_text;
 		}
 		StaticTextSpec(const std::wstring &a_text,
 				const core::rect<s32> &a_rect,
@@ -264,7 +276,8 @@ class GUIFormSpecMenu : public GUIModalMenu
 			rect(a_rect),
 			parent_button(a_parent_button)
 		{
-			text = unescape_enriched(a_text);
+			//text = unescape_enriched(a_text);
+			text = a_text;
 		}
 		std::wstring text;
 		core::rect<s32> rect;
@@ -273,6 +286,7 @@ class GUIFormSpecMenu : public GUIModalMenu
 
 public:
 	GUIFormSpecMenu(irr::IrrlichtDevice* dev,
+			JoystickController *joystick,
 			gui::IGUIElement* parent, s32 id,
 			IMenuManager *menumgr,
 			InventoryManager *invmgr,
@@ -365,6 +379,8 @@ protected:
 	v2s32 spacing;
 	v2s32 imgsize;
 	v2s32 offset;
+	v2s32 pos_offset;
+	std::stack<v2s32> container_stack;
 
 	irr::IrrlichtDevice* m_device;
 	InventoryManager *m_invmgr;
@@ -382,6 +398,7 @@ protected:
 	std::vector<ImageDrawSpec> m_images;
 	std::vector<ImageDrawSpec> m_itemimages;
 	std::vector<BoxDrawSpec> m_boxes;
+	UNORDERED_MAP<std::string, bool> field_close_on_enter;
 	std::vector<FieldSpec> m_fields;
 	std::vector<StaticTextSpec> m_static_texts;
 	std::vector<std::pair<FieldSpec,GUITable*> > m_tables;
@@ -391,8 +408,6 @@ protected:
 	std::vector<std::pair<FieldSpec, std::vector<std::string> > > m_dropdowns;
 
 	ItemSpec *m_selected_item;
-	f32 m_timer1;
-	f32 m_timer2;
 	u32 m_selected_amount;
 	bool m_selected_dragging;
 
@@ -419,7 +434,6 @@ protected:
 
 	bool m_bgfullscreen;
 	bool m_slotborder;
-	bool m_clipbackground;
 	video::SColor m_bgcolor;
 	video::SColor m_slotbg_n;
 	video::SColor m_slotbg_h;
@@ -428,10 +442,11 @@ protected:
 	video::SColor m_default_tooltip_color;
 
 private:
-	IFormSource      *m_form_src;
-	TextDest         *m_text_dst;
-	unsigned int      m_formspec_version;
-	std::string       m_focused_element;
+	IFormSource        *m_form_src;
+	TextDest           *m_text_dst;
+	unsigned int        m_formspec_version;
+	std::string         m_focused_element;
+	JoystickController *m_joystick;
 
 	typedef struct {
 		bool explicit_size;
@@ -444,7 +459,7 @@ private:
 		GUITable::TableOptions table_options;
 		GUITable::TableColumns table_columns;
 		// used to restore table selection/scroll/treeview state
-		std::map<std::string, GUITable::DynamicData> table_dyndata;
+		UNORDERED_MAP<std::string, GUITable::DynamicData> table_dyndata;
 	} parserData;
 
 	typedef struct {
@@ -455,14 +470,17 @@ private:
 	} fs_key_pendig;
 
 	fs_key_pendig current_keys_pending;
+	std::string current_field_enter_pending;
 
-	void parseElement(parserData* data,std::string element);
+	void parseElement(parserData* data, std::string element);
 
-	void parseSize(parserData* data,std::string element);
-	void parseList(parserData* data,std::string element);
-	void parseListRing(parserData* data,std::string element);
-	void parseCheckbox(parserData* data,std::string element);
-	void parseImage(parserData* data,std::string element);
+	void parseSize(parserData* data, std::string element);
+	void parseContainer(parserData* data, std::string element);
+	void parseContainerEnd(parserData* data);
+	void parseList(parserData* data, std::string element);
+	void parseListRing(parserData* data, std::string element);
+	void parseCheckbox(parserData* data, std::string element);
+	void parseImage(parserData* data, std::string element);
 	void parseItemImage(parserData* data,std::string element);
 	void parseButton(parserData* data,std::string element,std::string typ);
 	void parseBackground(parserData* data,std::string element);
@@ -471,6 +489,7 @@ private:
 	void parseTable(parserData* data,std::string element);
 	void parseTextList(parserData* data,std::string element);
 	void parseDropDown(parserData* data,std::string element);
+	void parseFieldCloseOnEnter(parserData *data, const std::string &element);
 	void parsePwdField(parserData* data,std::string element);
 	void parseField(parserData* data,std::string element,std::string type);
 	void parseSimpleField(parserData* data,std::vector<std::string> &parts);
@@ -489,6 +508,8 @@ private:
 	bool parseSizeDirect(parserData* data, std::string element);
 	void parseScrollBar(parserData* data, std::string element);
 
+	void tryClose();
+
 	/**
 	 * check if event is part of a double click
 	 * @param event event to evaluate
@@ -547,4 +568,3 @@ public:
 };
 
 #endif
-
diff --git a/src/guiKeyChangeMenu.cpp b/src/guiKeyChangeMenu.cpp
index b058182..07137d1 100644
--- a/src/guiKeyChangeMenu.cpp
+++ b/src/guiKeyChangeMenu.cpp
@@ -59,6 +59,7 @@ enum
 	GUI_ID_KEY_INVENTORY_BUTTON,
 	GUI_ID_KEY_DUMP_BUTTON,
 	GUI_ID_KEY_RANGE_BUTTON,
+	GUI_ID_KEY_ZOOM_BUTTON,
 	// other
 	GUI_ID_CB_AUX1_DESCENDS,
 	GUI_ID_CB_DOUBLETAP_JUMP,
@@ -137,7 +138,7 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize)
 	{
 		key_setting *k = key_settings.at(i);
 		{
-			core::rect < s32 > rect(0, 0, 110, 20);
+			core::rect < s32 > rect(0, 0, 150, 20);
 			rect += topleft + v2s32(offset.X, offset.Y);
 			Environment->addStaticText(k->button_name, rect, false, true, this, -1);
 		}
@@ -414,5 +415,6 @@ void GUIKeyChangeMenu::init_keys()
 	this->add_key(GUI_ID_KEY_NOCLIP_BUTTON,    wgettext("Toggle noclip"),    "keymap_noclip");
 	this->add_key(GUI_ID_KEY_RANGE_BUTTON,     wgettext("Range select"),     "keymap_rangeselect");
 	this->add_key(GUI_ID_KEY_DUMP_BUTTON,      wgettext("Print stacks"),     "keymap_print_debug_stacks");
+	this->add_key(GUI_ID_KEY_ZOOM_BUTTON,      wgettext("Zoom"),             "keymap_zoom");
 }
 
diff --git a/src/guiTable.cpp b/src/guiTable.cpp
index 3cc95ce..6b33b82 100644
--- a/src/guiTable.cpp
+++ b/src/guiTable.cpp
@@ -565,10 +565,8 @@ void GUITable::setSelected(s32 index)
 	--index; // Switch from 1-based indexing to 0-based indexing
 
 	s32 rowcount = m_rows.size();
-	if (rowcount == 0) {
+	if (rowcount == 0 || index < 0) {
 		return;
-	} else if (index < 0) {
-		index = 0;
 	} else if (index >= rowcount) {
 		index = rowcount - 1;
 	}
diff --git a/src/guiVolumeChange.cpp b/src/guiVolumeChange.cpp
index c8e257f..8425bc0 100644
--- a/src/guiVolumeChange.cpp
+++ b/src/guiVolumeChange.cpp
@@ -37,8 +37,7 @@ const int ID_soundSlider = 266;
 
 GUIVolumeChange::GUIVolumeChange(gui::IGUIEnvironment* env,
 		gui::IGUIElement* parent, s32 id,
-		IMenuManager *menumgr,
-		Client* client
+		IMenuManager *menumgr
 ):
 	GUIModalMenu(env, parent, id, menumgr)
 {
@@ -51,26 +50,17 @@ GUIVolumeChange::~GUIVolumeChange()
 
 void GUIVolumeChange::removeChildren()
 {
-	{
-		gui::IGUIElement *e = getElementFromId(ID_soundText1);
-		if(e != NULL)
-			e->remove();
-	}
-	{
-		gui::IGUIElement *e = getElementFromId(ID_soundText2);
-		if(e != NULL)
-			e->remove();
-	}
-	{
-		gui::IGUIElement *e = getElementFromId(ID_soundExitButton);
-		if(e != NULL)
-			e->remove();
-	}
-	{
-		gui::IGUIElement *e = getElementFromId(ID_soundSlider);
-		if(e != NULL)
-			e->remove();
-	}
+	if (gui::IGUIElement *e = getElementFromId(ID_soundText1))
+		e->remove();
+
+	if (gui::IGUIElement *e = getElementFromId(ID_soundText2))
+		e->remove();
+
+	if (gui::IGUIElement *e = getElementFromId(ID_soundExitButton))
+		e->remove();
+
+	if (gui::IGUIElement *e = getElementFromId(ID_soundSlider))
+		e->remove();
 }
 
 void GUIVolumeChange::regenerateGui(v2u32 screensize)
@@ -95,7 +85,7 @@ void GUIVolumeChange::regenerateGui(v2u32 screensize)
 
 	v2s32 size = rect.getSize();
 	v2s32 topleft_client(40, 0);
-	int volume=(int)(g_settings->getFloat("sound_volume")*100);
+	int volume = (int)(g_settings->getFloat("sound_volume")*100);
 	/*
 		Add stuff
 	*/
@@ -137,45 +127,43 @@ void GUIVolumeChange::drawMenu()
 	if (!skin)
 		return;
 	video::IVideoDriver* driver = Environment->getVideoDriver();
-	video::SColor bgcolor(140,0,0,0);
+	video::SColor bgcolor(140, 0, 0, 0);
 	driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
 	gui::IGUIElement::draw();
 }
 
 bool GUIVolumeChange::OnEvent(const SEvent& event)
 {
-	if(event.EventType==EET_KEY_INPUT_EVENT)
-	{
-		if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
-		{
+	if (event.EventType == EET_KEY_INPUT_EVENT) {
+		if (event.KeyInput.Key == KEY_ESCAPE && event.KeyInput.PressedDown) {
 			quitMenu();
 			return true;
 		}
-		if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
-		{
+
+		if (event.KeyInput.Key == KEY_RETURN && event.KeyInput.PressedDown) {
 			quitMenu();
 			return true;
 		}
 	}
-	if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
-		{
-			if (event.GUIEvent.Caller->getID() == ID_soundExitButton)
-				{
-					quitMenu();
-					return true;
-				}
+
+	if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) {
+		if (event.GUIEvent.Caller->getID() == ID_soundExitButton) {
+			quitMenu();
+			return true;
 		}
-	if(event.GUIEvent.EventType==gui::EGET_SCROLL_BAR_CHANGED)
-		{
-		if (event.GUIEvent.Caller->getID() == ID_soundSlider)
-			{
-				s32 pos = ((gui::IGUIScrollBar*)event.GUIEvent.Caller)->getPos();
-				g_settings->setFloat("sound_volume",(float)pos/100);
-				gui::IGUIElement *e = getElementFromId(ID_soundText2);
-				e->setText( core::stringw(pos).c_str() );
-				return true;
-			}
+	}
+
+	if (event.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED) {
+		if (event.GUIEvent.Caller->getID() == ID_soundSlider) {
+			s32 pos = ((gui::IGUIScrollBar*)event.GUIEvent.Caller)->getPos();
+			g_settings->setFloat("sound_volume", (float)pos/100);
+
+			gui::IGUIElement *e = getElementFromId(ID_soundText2);
+			e->setText(core::stringw(pos).c_str());
+			return true;
 		}
+	}
+
 	return Parent ? Parent->OnEvent(event) : false;
 }
 
diff --git a/src/guiVolumeChange.h b/src/guiVolumeChange.h
index 9f8199f..98731c6 100644
--- a/src/guiVolumeChange.h
+++ b/src/guiVolumeChange.h
@@ -30,8 +30,7 @@ class GUIVolumeChange : public GUIModalMenu
 public:
 	GUIVolumeChange(gui::IGUIEnvironment* env,
 			gui::IGUIElement* parent, s32 id,
-			IMenuManager *menumgr,
-			Client* client);
+			IMenuManager *menumgr);
 	~GUIVolumeChange();
 	
 	void removeChildren();
diff --git a/src/hud.cpp b/src/hud.cpp
index 19feaef..43d9573 100644
--- a/src/hud.cpp
+++ b/src/hud.cpp
@@ -544,6 +544,12 @@ void Hud::drawSelectionMesh()
 		video::SMaterial oldmaterial = driver->getMaterial2D();
 		driver->setMaterial(m_selection_material);
 		setMeshColor(m_selection_mesh, m_selection_mesh_color);
+		video::SColor face_color(0,
+			MYMIN(255, m_selection_mesh_color.getRed() * 1.5),
+			MYMIN(255, m_selection_mesh_color.getGreen() * 1.5),
+			MYMIN(255, m_selection_mesh_color.getBlue() * 1.5));
+		setMeshColorByNormal(m_selection_mesh, m_selected_face_normal,
+			face_color);
 		scene::IMesh* mesh = cloneMesh(m_selection_mesh);
 		translateMesh(mesh, m_selection_pos_with_offset);
 		u32 mc = m_selection_mesh->getMeshBufferCount();
diff --git a/src/hud.h b/src/hud.h
index 7f0fbe7..a4d7990 100644
--- a/src/hud.h
+++ b/src/hud.h
@@ -139,8 +139,11 @@ public:
 	v3f getSelectionPos() const
 	{ return m_selection_pos; }
 
-	void setSelectionMeshColor(const video::SColor &c)
-	{ m_selection_mesh_color = c; }
+	void setSelectionMeshColor(const video::SColor &color)
+	{ m_selection_mesh_color = color; }
+
+	void setSelectedFaceNormal(const v3f &face_normal)
+	{ m_selected_face_normal = face_normal; }
 
 	void drawLuaElements(const v3s16 &camera_offset);
 
@@ -169,6 +172,8 @@ private:
 
 	scene::IMesh* m_selection_mesh;
 	video::SColor m_selection_mesh_color;
+	v3f m_selected_face_normal;
+
 	video::SMaterial m_selection_material;
 	bool m_use_selection_mesh;
 };
diff --git a/src/intlGUIEditBox.cpp b/src/intlGUIEditBox.cpp
index 33bf8a1..29f8280 100644
--- a/src/intlGUIEditBox.cpp
+++ b/src/intlGUIEditBox.cpp
@@ -271,7 +271,7 @@ bool intlGUIEditBox::OnEvent(const SEvent& event)
 			break;
 		case EET_KEY_INPUT_EVENT:
         {
-#if (defined(linux) || defined(__linux) || defined(__FreeBSD__))
+#if (defined(__linux__) || defined(__FreeBSD__))
             // ################################################################
 			// ValkaTR:
             // This part is the difference from the original intlGUIEditBox
diff --git a/src/inventory.h b/src/inventory.h
index a690eb5..7d7e58d 100644
--- a/src/inventory.h
+++ b/src/inventory.h
@@ -80,15 +80,14 @@ struct ItemStack
 	// Maximum size of a stack
 	u16 getStackMax(IItemDefManager *itemdef) const
 	{
-		s16 max = itemdef->get(name).stack_max;
-		return (max >= 0) ? max : 0;
+		return itemdef->get(name).stack_max;
 	}
 
 	// Number of items that can be added to this stack
 	u16 freeSpace(IItemDefManager *itemdef) const
 	{
 		u16 max = getStackMax(itemdef);
-		if(count > max)
+		if (count >= max)
 			return 0;
 		return max - count;
 	}
diff --git a/src/irrlicht_changes/CMakeLists.txt b/src/irrlicht_changes/CMakeLists.txt
new file mode 100644
index 0000000..3a265c9
--- /dev/null
+++ b/src/irrlicht_changes/CMakeLists.txt
@@ -0,0 +1,7 @@
+if (BUILD_CLIENT)
+	set(client_irrlicht_changes_SRCS
+		${CMAKE_CURRENT_SOURCE_DIR}/static_text.cpp
+		PARENT_SCOPE
+	)
+endif()
+
diff --git a/src/irrlicht_changes/static_text.cpp b/src/irrlicht_changes/static_text.cpp
new file mode 100644
index 0000000..703287e
--- /dev/null
+++ b/src/irrlicht_changes/static_text.cpp
@@ -0,0 +1,679 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// Copyright (C) 2016 Nathanaël Courant:
+//   Modified the functions to use EnrichedText instead of string.
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#include "static_text.h"
+#ifdef _IRR_COMPILE_WITH_GUI_
+
+#include <vector>
+#include <string>
+#include <iostream>
+#include <IGUISkin.h>
+#include <IGUIEnvironment.h>
+#include <IGUIFont.h>
+#include <IVideoDriver.h>
+#include <rect.h>
+#include <SColor.h>
+
+#if USE_FREETYPE
+	#include "cguittfont/xCGUITTFont.h"
+#endif
+
+#include "util/string.h"
+
+namespace irr
+{
+
+#if USE_FREETYPE
+
+namespace gui
+{
+//! constructor
+StaticText::StaticText(const EnrichedString &text, bool border,
+			IGUIEnvironment* environment, IGUIElement* parent,
+			s32 id, const core::rect<s32>& rectangle,
+			bool background)
+: IGUIStaticText(environment, parent, id, rectangle),
+	HAlign(EGUIA_UPPERLEFT), VAlign(EGUIA_UPPERLEFT),
+	Border(border), OverrideColorEnabled(false), OverrideBGColorEnabled(false), WordWrap(false), Background(background),
+	RestrainTextInside(true), RightToLeft(false),
+	OverrideColor(video::SColor(101,255,255,255)), BGColor(video::SColor(101,210,210,210)),
+	OverrideFont(0), LastBreakFont(0)
+{
+	#ifdef _DEBUG
+	setDebugName("StaticText");
+	#endif
+
+	Text = text.c_str();
+	cText = text;
+	if (environment && environment->getSkin())
+	{
+		BGColor = environment->getSkin()->getColor(gui::EGDC_3D_FACE);
+	}
+}
+
+
+//! destructor
+StaticText::~StaticText()
+{
+	if (OverrideFont)
+		OverrideFont->drop();
+}
+
+//! draws the element and its children
+void StaticText::draw()
+{
+	if (!IsVisible)
+		return;
+
+	IGUISkin* skin = Environment->getSkin();
+	if (!skin)
+		return;
+	video::IVideoDriver* driver = Environment->getVideoDriver();
+
+	core::rect<s32> frameRect(AbsoluteRect);
+
+	// draw background
+
+	if (Background)
+	{
+		if ( !OverrideBGColorEnabled )	// skin-colors can change
+			BGColor = skin->getColor(gui::EGDC_3D_FACE);
+
+		driver->draw2DRectangle(BGColor, frameRect, &AbsoluteClippingRect);
+	}
+
+	// draw the border
+
+	if (Border)
+	{
+		skin->draw3DSunkenPane(this, 0, true, false, frameRect, &AbsoluteClippingRect);
+		frameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X);
+	}
+
+	// draw the text
+	if (cText.size())
+	{
+		IGUIFont* font = getActiveFont();
+
+		if (font)
+		{
+			if (!WordWrap)
+			{
+				// TODO: add colors here
+				if (VAlign == EGUIA_LOWERRIGHT)
+				{
+					frameRect.UpperLeftCorner.Y = frameRect.LowerRightCorner.Y -
+						font->getDimension(L"A").Height - font->getKerningHeight();
+				}
+				if (HAlign == EGUIA_LOWERRIGHT)
+				{
+					frameRect.UpperLeftCorner.X = frameRect.LowerRightCorner.X -
+						font->getDimension(cText.c_str()).Width;
+				}
+
+				irr::gui::CGUITTFont *tmp = static_cast<irr::gui::CGUITTFont*>(font);
+				tmp->draw(cText, frameRect,
+					OverrideColorEnabled ? OverrideColor : skin->getColor(isEnabled() ? EGDC_BUTTON_TEXT : EGDC_GRAY_TEXT),
+					HAlign == EGUIA_CENTER, VAlign == EGUIA_CENTER, (RestrainTextInside ? &AbsoluteClippingRect : NULL));
+			}
+			else
+			{
+				if (font != LastBreakFont)
+					breakText();
+
+				core::rect<s32> r = frameRect;
+				s32 height = font->getDimension(L"A").Height + font->getKerningHeight();
+				s32 totalHeight = height * BrokenText.size();
+				if (VAlign == EGUIA_CENTER)
+				{
+					r.UpperLeftCorner.Y = r.getCenter().Y - (totalHeight / 2);
+				}
+				else if (VAlign == EGUIA_LOWERRIGHT)
+				{
+					r.UpperLeftCorner.Y = r.LowerRightCorner.Y - totalHeight;
+				}
+
+				irr::video::SColor previous_color(255, 255, 255, 255);
+				for (u32 i=0; i<BrokenText.size(); ++i)
+				{
+					if (HAlign == EGUIA_LOWERRIGHT)
+					{
+						r.UpperLeftCorner.X = frameRect.LowerRightCorner.X -
+							font->getDimension(BrokenText[i].c_str()).Width;
+					}
+
+					//std::vector<irr::video::SColor> colors;
+					//std::wstring str;
+					EnrichedString str = BrokenText[i];
+
+					//str = colorizeText(BrokenText[i].c_str(), colors, previous_color);
+					//if (!colors.empty())
+					//	previous_color = colors[colors.size() - 1];
+
+					irr::gui::CGUITTFont *tmp = static_cast<irr::gui::CGUITTFont*>(font);
+					tmp->draw(str, r,
+						previous_color, // FIXME
+						HAlign == EGUIA_CENTER, false, (RestrainTextInside ? &AbsoluteClippingRect : NULL));
+
+					r.LowerRightCorner.Y += height;
+					r.UpperLeftCorner.Y += height;
+				}
+			}
+		}
+	}
+
+	IGUIElement::draw();
+}
+
+
+//! Sets another skin independent font.
+void StaticText::setOverrideFont(IGUIFont* font)
+{
+	if (OverrideFont == font)
+		return;
+
+	if (OverrideFont)
+		OverrideFont->drop();
+
+	OverrideFont = font;
+
+	if (OverrideFont)
+		OverrideFont->grab();
+
+	breakText();
+}
+
+//! Gets the override font (if any)
+IGUIFont * StaticText::getOverrideFont() const
+{
+	return OverrideFont;
+}
+
+//! Get the font which is used right now for drawing
+IGUIFont* StaticText::getActiveFont() const
+{
+	if ( OverrideFont )
+		return OverrideFont;
+	IGUISkin* skin = Environment->getSkin();
+	if (skin)
+		return skin->getFont();
+	return 0;
+}
+
+//! Sets another color for the text.
+void StaticText::setOverrideColor(video::SColor color)
+{
+	OverrideColor = color;
+	OverrideColorEnabled = true;
+}
+
+
+//! Sets another color for the text.
+void StaticText::setBackgroundColor(video::SColor color)
+{
+	BGColor = color;
+	OverrideBGColorEnabled = true;
+	Background = true;
+}
+
+
+//! Sets whether to draw the background
+void StaticText::setDrawBackground(bool draw)
+{
+	Background = draw;
+}
+
+
+//! Gets the background color
+video::SColor StaticText::getBackgroundColor() const
+{
+	return BGColor;
+}
+
+
+//! Checks if background drawing is enabled
+bool StaticText::isDrawBackgroundEnabled() const
+{
+	_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
+	return Background;
+}
+
+
+//! Sets whether to draw the border
+void StaticText::setDrawBorder(bool draw)
+{
+	Border = draw;
+}
+
+
+//! Checks if border drawing is enabled
+bool StaticText::isDrawBorderEnabled() const
+{
+	_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
+	return Border;
+}
+
+
+void StaticText::setTextRestrainedInside(bool restrainTextInside)
+{
+	RestrainTextInside = restrainTextInside;
+}
+
+
+bool StaticText::isTextRestrainedInside() const
+{
+	return RestrainTextInside;
+}
+
+
+void StaticText::setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical)
+{
+	HAlign = horizontal;
+	VAlign = vertical;
+}
+
+
+#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 7
+const video::SColor& StaticText::getOverrideColor() const
+#else
+video::SColor StaticText::getOverrideColor() const
+#endif
+{
+	return OverrideColor;
+}
+
+
+//! Sets if the static text should use the overide color or the
+//! color in the gui skin.
+void StaticText::enableOverrideColor(bool enable)
+{
+	OverrideColorEnabled = enable;
+}
+
+
+bool StaticText::isOverrideColorEnabled() const
+{
+	_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
+	return OverrideColorEnabled;
+}
+
+
+//! Enables or disables word wrap for using the static text as
+//! multiline text control.
+void StaticText::setWordWrap(bool enable)
+{
+	WordWrap = enable;
+	breakText();
+}
+
+
+bool StaticText::isWordWrapEnabled() const
+{
+	_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
+	return WordWrap;
+}
+
+
+void StaticText::setRightToLeft(bool rtl)
+{
+	if (RightToLeft != rtl)
+	{
+		RightToLeft = rtl;
+		breakText();
+	}
+}
+
+
+bool StaticText::isRightToLeft() const
+{
+	return RightToLeft;
+}
+
+
+//! Breaks the single text line.
+void StaticText::breakText()
+{
+	if (!WordWrap)
+		return;
+
+	BrokenText.clear();
+
+	IGUISkin* skin = Environment->getSkin();
+	IGUIFont* font = getActiveFont();
+	if (!font)
+		return;
+
+	LastBreakFont = font;
+
+	EnrichedString line;
+	EnrichedString word;
+	EnrichedString whitespace;
+	s32 size = cText.size();
+	s32 length = 0;
+	s32 elWidth = RelativeRect.getWidth();
+	if (Border)
+		elWidth -= 2*skin->getSize(EGDS_TEXT_DISTANCE_X);
+	wchar_t c;
+
+	//std::vector<irr::video::SColor> colors;
+
+	// We have to deal with right-to-left and left-to-right differently
+	// However, most parts of the following code is the same, it's just
+	// some order and boundaries which change.
+	if (!RightToLeft)
+	{
+		// regular (left-to-right)
+		for (s32 i=0; i<size; ++i)
+		{
+			c = cText.getString()[i];
+			bool lineBreak = false;
+
+			if (c == L'\r') // Mac or Windows breaks
+			{
+				lineBreak = true;
+				//if (Text[i+1] == L'\n') // Windows breaks
+				//{
+				//	Text.erase(i+1);
+				//	--size;
+				//}
+				c = '\0';
+			}
+			else if (c == L'\n') // Unix breaks
+			{
+				lineBreak = true;
+				c = '\0';
+			}
+
+			bool isWhitespace = (c == L' ' || c == 0);
+			if ( !isWhitespace )
+			{
+				// part of a word
+				//word += c;
+				word.addChar(cText, i);
+			}
+
+			if ( isWhitespace || i == (size-1))
+			{
+				if (word.size())
+				{
+					// here comes the next whitespace, look if
+					// we must break the last word to the next line.
+					const s32 whitelgth = font->getDimension(whitespace.c_str()).Width;
+					//const std::wstring sanitized = removeEscapes(word.c_str());
+					const s32 wordlgth = font->getDimension(word.c_str()).Width;
+
+					if (wordlgth > elWidth)
+					{
+						// This word is too long to fit in the available space, look for
+						// the Unicode Soft HYphen (SHY / 00AD) character for a place to
+						// break the word at
+						int where = core::stringw(word.c_str()).findFirst( wchar_t(0x00AD) );
+						if (where != -1)
+						{
+							EnrichedString first = word.substr(0, where);
+							EnrichedString second = word.substr(where, word.size() - where);
+							first.addCharNoColor(L'-');
+							BrokenText.push_back(line + first);
+							const s32 secondLength = font->getDimension(second.c_str()).Width;
+
+							length = secondLength;
+							line = second;
+						}
+						else
+						{
+							// No soft hyphen found, so there's nothing more we can do
+							// break to next line
+							if (length)
+								BrokenText.push_back(line);
+							length = wordlgth;
+							line = word;
+						}
+					}
+					else if (length && (length + wordlgth + whitelgth > elWidth))
+					{
+						// break to next line
+						BrokenText.push_back(line);
+						length = wordlgth;
+						line = word;
+					}
+					else
+					{
+						// add word to line
+						line += whitespace;
+						line += word;
+						length += whitelgth + wordlgth;
+					}
+
+					word.clear();
+					whitespace.clear();
+				}
+
+				if ( isWhitespace && c != 0)
+				{
+					whitespace.addChar(cText, i);
+				}
+
+				// compute line break
+				if (lineBreak)
+				{
+					line += whitespace;
+					line += word;
+					BrokenText.push_back(line);
+					line.clear();
+					word.clear();
+					whitespace.clear();
+					length = 0;
+				}
+			}
+		}
+
+		line += whitespace;
+		line += word;
+		BrokenText.push_back(line);
+	}
+	else
+	{
+		// right-to-left
+		for (s32 i=size; i>=0; --i)
+		{
+			c = cText.getString()[i];
+			bool lineBreak = false;
+
+			if (c == L'\r') // Mac or Windows breaks
+			{
+				lineBreak = true;
+				//if ((i>0) && Text[i-1] == L'\n') // Windows breaks
+				//{
+				//	Text.erase(i-1);
+				//	--size;
+				//}
+				c = '\0';
+			}
+			else if (c == L'\n') // Unix breaks
+			{
+				lineBreak = true;
+				c = '\0';
+			}
+
+			if (c==L' ' || c==0 || i==0)
+			{
+				if (word.size())
+				{
+					// here comes the next whitespace, look if
+					// we must break the last word to the next line.
+					const s32 whitelgth = font->getDimension(whitespace.c_str()).Width;
+					const s32 wordlgth = font->getDimension(word.c_str()).Width;
+
+					if (length && (length + wordlgth + whitelgth > elWidth))
+					{
+						// break to next line
+						BrokenText.push_back(line);
+						length = wordlgth;
+						line = word;
+					}
+					else
+					{
+						// add word to line
+						line = whitespace + line;
+						line = word + line;
+						length += whitelgth + wordlgth;
+					}
+
+					word.clear();
+					whitespace.clear();
+				}
+
+				if (c != 0)
+				//	whitespace = core::stringw(&c, 1) + whitespace;
+				whitespace = cText.substr(i, 1) + whitespace;
+
+				// compute line break
+				if (lineBreak)
+				{
+					line = whitespace + line;
+					line = word + line;
+					BrokenText.push_back(line);
+					line.clear();
+					word.clear();
+					whitespace.clear();
+					length = 0;
+				}
+			}
+			else
+			{
+				// yippee this is a word..
+				//word = core::stringw(&c, 1) + word;
+				word = cText.substr(i, 1) + word;
+			}
+		}
+
+		line = whitespace + line;
+		line = word + line;
+		BrokenText.push_back(line);
+	}
+}
+
+
+//! Sets the new caption of this element.
+void StaticText::setText(const wchar_t* text)
+{
+	setText(EnrichedString(text));
+}
+
+//! Sets the new caption of this element.
+void StaticText::setText(const EnrichedString &text)
+{
+	IGUIElement::setText(text.c_str());
+	cText = text;
+	if (text.hasBackground()) {
+		setBackgroundColor(text.getBackground());
+	}
+	breakText();
+}
+
+
+void StaticText::updateAbsolutePosition()
+{
+	IGUIElement::updateAbsolutePosition();
+	breakText();
+}
+
+
+//! Returns the height of the text in pixels when it is drawn.
+s32 StaticText::getTextHeight() const
+{
+	IGUIFont* font = getActiveFont();
+	if (!font)
+		return 0;
+
+	s32 height = font->getDimension(L"A").Height + font->getKerningHeight();
+
+	if (WordWrap)
+		height *= BrokenText.size();
+
+	return height;
+}
+
+
+s32 StaticText::getTextWidth() const
+{
+	IGUIFont * font = getActiveFont();
+	if(!font)
+		return 0;
+
+	if(WordWrap)
+	{
+		s32 widest = 0;
+
+		for(u32 line = 0; line < BrokenText.size(); ++line)
+		{
+			s32 width = font->getDimension(BrokenText[line].c_str()).Width;
+
+			if(width > widest)
+				widest = width;
+		}
+
+		return widest;
+	}
+	else
+	{
+		return font->getDimension(cText.c_str()).Width;
+	}
+}
+
+
+//! Writes attributes of the element.
+//! Implement this to expose the attributes of your element for
+//! scripting languages, editors, debuggers or xml serialization purposes.
+void StaticText::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const
+{
+	IGUIStaticText::serializeAttributes(out,options);
+
+	out->addBool	("Border",              Border);
+	out->addBool	("OverrideColorEnabled",OverrideColorEnabled);
+	out->addBool	("OverrideBGColorEnabled",OverrideBGColorEnabled);
+	out->addBool	("WordWrap",		WordWrap);
+	out->addBool	("Background",          Background);
+	out->addBool	("RightToLeft",         RightToLeft);
+	out->addBool	("RestrainTextInside",  RestrainTextInside);
+	out->addColor	("OverrideColor",       OverrideColor);
+	out->addColor	("BGColor",       	BGColor);
+	out->addEnum	("HTextAlign",          HAlign, GUIAlignmentNames);
+	out->addEnum	("VTextAlign",          VAlign, GUIAlignmentNames);
+
+	// out->addFont ("OverrideFont",	OverrideFont);
+}
+
+
+//! Reads attributes of the element
+void StaticText::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0)
+{
+	IGUIStaticText::deserializeAttributes(in,options);
+
+	Border = in->getAttributeAsBool("Border");
+	enableOverrideColor(in->getAttributeAsBool("OverrideColorEnabled"));
+	OverrideBGColorEnabled = in->getAttributeAsBool("OverrideBGColorEnabled");
+	setWordWrap(in->getAttributeAsBool("WordWrap"));
+	Background = in->getAttributeAsBool("Background");
+	RightToLeft = in->getAttributeAsBool("RightToLeft");
+	RestrainTextInside = in->getAttributeAsBool("RestrainTextInside");
+	OverrideColor = in->getAttributeAsColor("OverrideColor");
+	BGColor = in->getAttributeAsColor("BGColor");
+
+	setTextAlignment( (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("HTextAlign", GUIAlignmentNames),
+                      (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("VTextAlign", GUIAlignmentNames));
+
+	// OverrideFont = in->getAttributeAsFont("OverrideFont");
+}
+
+} // end namespace gui
+
+#endif // USE_FREETYPE
+
+} // end namespace irr
+
+
+#endif // _IRR_COMPILE_WITH_GUI_
diff --git a/src/irrlicht_changes/static_text.h b/src/irrlicht_changes/static_text.h
new file mode 100644
index 0000000..408a127
--- /dev/null
+++ b/src/irrlicht_changes/static_text.h
@@ -0,0 +1,268 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// Copyright (C) 2016 Nathanaël Courant
+//   Modified this class to work with EnrichedStrings too
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#ifndef __C_GUI_STATIC_TEXT_H_INCLUDED__
+#define __C_GUI_STATIC_TEXT_H_INCLUDED__
+
+#include "IrrCompileConfig.h"
+#ifdef _IRR_COMPILE_WITH_GUI_
+
+#include "IGUIStaticText.h"
+#include "irrArray.h"
+
+#include "log.h"
+
+#include <vector>
+
+#include "util/enriched_string.h"
+#include "config.h"
+#include <IGUIEnvironment.h>
+
+#if USE_FREETYPE
+
+namespace irr
+{
+
+namespace gui
+{
+
+	const EGUI_ELEMENT_TYPE EGUIET_ENRICHED_STATIC_TEXT = (EGUI_ELEMENT_TYPE)(0x1000);
+
+	class StaticText : public IGUIStaticText
+	{
+	public:
+
+		//! constructor
+		StaticText(const EnrichedString &text, bool border, IGUIEnvironment* environment,
+			IGUIElement* parent, s32 id, const core::rect<s32>& rectangle,
+			bool background = false);
+
+		//! destructor
+		virtual ~StaticText();
+
+		//! draws the element and its children
+		virtual void draw();
+
+		//! Sets another skin independent font.
+		virtual void setOverrideFont(IGUIFont* font=0);
+
+		//! Gets the override font (if any)
+		virtual IGUIFont* getOverrideFont() const;
+
+		//! Get the font which is used right now for drawing
+		virtual IGUIFont* getActiveFont() const;
+
+		//! Sets another color for the text.
+		virtual void setOverrideColor(video::SColor color);
+
+		//! Sets another color for the background.
+		virtual void setBackgroundColor(video::SColor color);
+
+		//! Sets whether to draw the background
+		virtual void setDrawBackground(bool draw);
+
+		//! Gets the background color
+		virtual video::SColor getBackgroundColor() const;
+
+		//! Checks if background drawing is enabled
+		virtual bool isDrawBackgroundEnabled() const;
+
+		//! Sets whether to draw the border
+		virtual void setDrawBorder(bool draw);
+
+		//! Checks if border drawing is enabled
+		virtual bool isDrawBorderEnabled() const;
+
+		//! Sets alignment mode for text
+		virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical);
+
+		//! Gets the override color
+		#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 7
+		virtual const video::SColor& getOverrideColor() const;
+		#else
+		virtual video::SColor getOverrideColor() const;
+		#endif
+
+		//! Sets if the static text should use the overide color or the
+		//! color in the gui skin.
+		virtual void enableOverrideColor(bool enable);
+
+		//! Checks if an override color is enabled
+		virtual bool isOverrideColorEnabled() const;
+
+		//! Set whether the text in this label should be clipped if it goes outside bounds
+		virtual void setTextRestrainedInside(bool restrainedInside);
+
+		//! Checks if the text in this label should be clipped if it goes outside bounds
+		virtual bool isTextRestrainedInside() const;
+
+		//! Enables or disables word wrap for using the static text as
+		//! multiline text control.
+		virtual void setWordWrap(bool enable);
+
+		//! Checks if word wrap is enabled
+		virtual bool isWordWrapEnabled() const;
+
+		//! Sets the new caption of this element.
+		virtual void setText(const wchar_t* text);
+
+		//! Returns the height of the text in pixels when it is drawn.
+		virtual s32 getTextHeight() const;
+
+		//! Returns the width of the current text, in the current font
+		virtual s32 getTextWidth() const;
+
+		//! Updates the absolute position, splits text if word wrap is enabled
+		virtual void updateAbsolutePosition();
+
+		//! Set whether the string should be interpreted as right-to-left (RTL) text
+		/** \note This component does not implement the Unicode bidi standard, the
+		text of the component should be already RTL if you call this. The
+		main difference when RTL is enabled is that the linebreaks for multiline
+		elements are performed starting from the end.
+		*/
+		virtual void setRightToLeft(bool rtl);
+
+		//! Checks if the text should be interpreted as right-to-left text
+		virtual bool isRightToLeft() const;
+
+		//! Writes attributes of the element.
+		virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const;
+
+		//! Reads attributes of the element
+		virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options);
+
+		virtual bool hasType(EGUI_ELEMENT_TYPE t) const {
+			return (t == EGUIET_ENRICHED_STATIC_TEXT) || (t == EGUIET_STATIC_TEXT);
+		};
+
+		virtual bool hasType(EGUI_ELEMENT_TYPE t) {
+			return (t == EGUIET_ENRICHED_STATIC_TEXT) || (t == EGUIET_STATIC_TEXT);
+		};
+
+		void setText(const EnrichedString &text);
+
+	private:
+
+		//! Breaks the single text line.
+		void breakText();
+
+		EGUI_ALIGNMENT HAlign, VAlign;
+		bool Border;
+		bool OverrideColorEnabled;
+		bool OverrideBGColorEnabled;
+		bool WordWrap;
+		bool Background;
+		bool RestrainTextInside;
+		bool RightToLeft;
+
+		video::SColor OverrideColor, BGColor;
+		gui::IGUIFont* OverrideFont;
+		gui::IGUIFont* LastBreakFont; // stored because: if skin changes, line break must be recalculated.
+
+		EnrichedString cText;
+		core::array< EnrichedString > BrokenText;
+	};
+
+
+} // end namespace gui
+
+} // end namespace irr
+
+inline irr::gui::IGUIStaticText *addStaticText(
+		irr::gui::IGUIEnvironment *guienv,
+		const EnrichedString &text,
+		const core::rect< s32 > &rectangle,
+		bool border = false,
+		bool wordWrap = true,
+		irr::gui::IGUIElement *parent = NULL,
+		s32 id = -1,
+		bool fillBackground = false)
+{
+	if (parent == NULL) {
+		// parent is NULL, so we must find one, or we need not to drop
+		// result, but then there will be a memory leak.
+		//
+		// What Irrlicht does is to use guienv as a parent, but the problem
+		// is that guienv is here only an IGUIEnvironment, while it is a
+		// CGUIEnvironment in Irrlicht, which inherits from both IGUIElement
+		// and IGUIEnvironment.
+		//
+		// A solution would be to dynamic_cast guienv to a
+		// IGUIElement*, but Irrlicht is shipped without rtti support
+		// in some distributions, causing the dymanic_cast to segfault.
+		//
+		// Thus, to find the parent, we create a dummy StaticText and ask
+		// for its parent, and then remove it.
+		irr::gui::IGUIStaticText *dummy_text =
+			guienv->addStaticText(L"", rectangle, border, wordWrap,
+			parent, id, fillBackground);
+		parent = dummy_text->getParent();
+		dummy_text->remove();
+	}
+	irr::gui::IGUIStaticText *result = new irr::gui::StaticText(
+		text, border, guienv, parent,
+		id, rectangle, fillBackground);
+
+	result->setWordWrap(wordWrap);
+	result->drop();
+	return result;
+}
+
+inline void setStaticText(irr::gui::IGUIStaticText *static_text, const EnrichedString &text)
+{
+	// dynamic_cast not possible due to some distributions shipped
+	// without rtti support in irrlicht
+	if (static_text->hasType(irr::gui::EGUIET_ENRICHED_STATIC_TEXT)) {
+		irr::gui::StaticText* stext = static_cast<irr::gui::StaticText*>(static_text);
+		stext->setText(text);
+	} else {
+		static_text->setText(text.c_str());
+	}
+}
+
+#else // USE_FREETYPE
+
+inline irr::gui::IGUIStaticText *addStaticText(
+		irr::gui::IGUIEnvironment *guienv,
+		const EnrichedString &text,
+		const core::rect< s32 > &rectangle,
+		bool border = false,
+		bool wordWrap = true,
+		irr::gui::IGUIElement *parent = NULL,
+		s32 id = -1,
+		bool fillBackground = false)
+{
+	return guienv->addStaticText(text.c_str(), rectangle, border, wordWrap, parent, id, fillBackground);
+}
+
+inline void setStaticText(irr::gui::IGUIStaticText *static_text, const EnrichedString &text)
+{
+	static_text->setText(text.c_str());
+}
+
+#endif
+
+inline irr::gui::IGUIStaticText *addStaticText(
+		irr::gui::IGUIEnvironment *guienv,
+		const wchar_t *text,
+		const core::rect< s32 > &rectangle,
+		bool border = false,
+		bool wordWrap = true,
+		irr::gui::IGUIElement *parent = NULL,
+		s32 id = -1,
+		bool fillBackground = false) {
+	return addStaticText(guienv, EnrichedString(text), rectangle, border, wordWrap, parent, id, fillBackground);
+}
+
+inline void setStaticText(irr::gui::IGUIStaticText *static_text, const wchar_t *text)
+{
+	setStaticText(static_text, EnrichedString(text));
+}
+
+#endif // _IRR_COMPILE_WITH_GUI_
+
+#endif // C_GUI_STATIC_TEXT_H_INCLUDED
diff --git a/src/itemdef.cpp b/src/itemdef.cpp
index a618ad6..1aa6331 100644
--- a/src/itemdef.cpp
+++ b/src/itemdef.cpp
@@ -146,9 +146,9 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const
 	}
 	os<<serializeString(tool_capabilities_s);
 	writeU16(os, groups.size());
-	for(std::map<std::string, int>::const_iterator
+	for (ItemGroupList::const_iterator
 			i = groups.begin(); i != groups.end(); ++i){
-		os<<serializeString(i->first);
+		os << serializeString(i->first);
 		writeS16(os, i->second);
 	}
 	os<<serializeString(node_placement_prediction);
@@ -466,11 +466,17 @@ public:
 			infostream<<"ItemDefManager: erased alias "<<def.name
 					<<" because item was defined"<<std::endl;
 	}
+	virtual void unregisterItem(const std::string &name)
+	{
+		verbosestream<<"ItemDefManager: unregistering \""<<name<<"\""<<std::endl;
+
+		delete m_item_definitions[name];
+		m_item_definitions.erase(name);
+	}
 	virtual void registerAlias(const std::string &name,
 			const std::string &convert_to)
 	{
-		if(m_item_definitions.find(name) == m_item_definitions.end())
-		{
+		if (m_item_definitions.find(name) == m_item_definitions.end()) {
 			verbosestream<<"ItemDefManager: setting alias "<<name
 				<<" -> "<<convert_to<<std::endl;
 			m_aliases[name] = convert_to;
diff --git a/src/itemdef.h b/src/itemdef.h
index 805b4aa..dcb98e8 100644
--- a/src/itemdef.h
+++ b/src/itemdef.h
@@ -61,7 +61,7 @@ struct ItemDefinition
 	/*
 		Item stack and interaction properties
 	*/
-	s16 stack_max;
+	u16 stack_max;
 	bool usable;
 	bool liquids_pointable;
 	// May be NULL. If non-NULL, deleted by destructor
@@ -144,6 +144,7 @@ public:
 	virtual void clear()=0;
 	// Register item definition
 	virtual void registerItem(const ItemDefinition &def)=0;
+	virtual void unregisterItem(const std::string &name)=0;
 	// Set an alias so that items named <name> will load as <convert_to>.
 	// Alias is not set if <name> has already been defined.
 	// Alias will be removed if <name> is defined at a later point of time.
diff --git a/src/itemgroup.h b/src/itemgroup.h
index f6ae867..f91ccc2 100644
--- a/src/itemgroup.h
+++ b/src/itemgroup.h
@@ -21,14 +21,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define ITEMGROUP_HEADER
 
 #include <string>
-#include <map>
+#include "util/cpp11_container.h"
 
-typedef std::map<std::string, int> ItemGroupList;
+typedef UNORDERED_MAP<std::string, int> ItemGroupList;
 
 static inline int itemgroup_get(const ItemGroupList &groups,
 		const std::string &name)
 {
-	std::map<std::string, int>::const_iterator i = groups.find(name);
+	ItemGroupList::const_iterator i = groups.find(name);
 	if(i == groups.end())
 		return 0;
 	return i->second;
diff --git a/src/keycode.cpp b/src/keycode.cpp
index 990dee3..2e211ad 100644
--- a/src/keycode.cpp
+++ b/src/keycode.cpp
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "log.h"
 #include "debug.h"
 #include "util/hex.h"
+#include "util/string.h"
 
 class UnknownKeycode : public BaseException
 {
@@ -31,321 +32,335 @@ public:
 		BaseException(s) {};
 };
 
-#define CHECKKEY(x){if(strcmp(name, #x)==0) return irr::x;}
+struct table_key {
+	const char *Name;
+	irr::EKEY_CODE Key;
+	wchar_t Char; // L'\0' means no character assigned
+	const char *LangName; // NULL means it doesn't have a human description
+};
 
-irr::EKEY_CODE keyname_to_keycode(const char *name)
+#define DEFINEKEY1(x, lang) /* Irrlicht key without character */ \
+	{ #x, irr::x, L'\0', lang },
+#define DEFINEKEY2(x, ch, lang) /* Irrlicht key with character */ \
+	{ #x, irr::x, ch, lang },
+#define DEFINEKEY3(ch) /* single Irrlicht key (e.g. KEY_KEY_X) */ \
+	{ "KEY_KEY_" TOSTRING(ch), irr::KEY_KEY_ ## ch, (wchar_t) *TOSTRING(ch), TOSTRING(ch) },
+#define DEFINEKEY4(ch) /* single Irrlicht function key (e.g. KEY_F3) */ \
+	{ "KEY_F" TOSTRING(ch), irr::KEY_F ## ch, L'\0', "F" TOSTRING(ch) },
+#define DEFINEKEY5(ch) /* key without Irrlicht keycode */ \
+	{ ch, irr::KEY_KEY_CODES_COUNT, (wchar_t) *ch, ch },
+
+#define N_(text) text
+
+static const struct table_key table[] = {
+	// Keys that can be reliably mapped between Char and Key
+	DEFINEKEY3(0)
+	DEFINEKEY3(1)
+	DEFINEKEY3(2)
+	DEFINEKEY3(3)
+	DEFINEKEY3(4)
+	DEFINEKEY3(5)
+	DEFINEKEY3(6)
+	DEFINEKEY3(7)
+	DEFINEKEY3(8)
+	DEFINEKEY3(9)
+	DEFINEKEY3(A)
+	DEFINEKEY3(B)
+	DEFINEKEY3(C)
+	DEFINEKEY3(D)
+	DEFINEKEY3(E)
+	DEFINEKEY3(F)
+	DEFINEKEY3(G)
+	DEFINEKEY3(H)
+	DEFINEKEY3(I)
+	DEFINEKEY3(J)
+	DEFINEKEY3(K)
+	DEFINEKEY3(L)
+	DEFINEKEY3(M)
+	DEFINEKEY3(N)
+	DEFINEKEY3(O)
+	DEFINEKEY3(P)
+	DEFINEKEY3(Q)
+	DEFINEKEY3(R)
+	DEFINEKEY3(S)
+	DEFINEKEY3(T)
+	DEFINEKEY3(U)
+	DEFINEKEY3(V)
+	DEFINEKEY3(W)
+	DEFINEKEY3(X)
+	DEFINEKEY3(Y)
+	DEFINEKEY3(Z)
+	DEFINEKEY2(KEY_PLUS, L'+', "+")
+	DEFINEKEY2(KEY_COMMA, L',', ",")
+	DEFINEKEY2(KEY_MINUS, L'-', "-")
+	DEFINEKEY2(KEY_PERIOD, L'.', ".")
+
+	// Keys without a Char
+	DEFINEKEY1(KEY_LBUTTON, N_("Left Button"))
+	DEFINEKEY1(KEY_RBUTTON, N_("Right Button"))
+	DEFINEKEY1(KEY_CANCEL, N_("Cancel"))
+	DEFINEKEY1(KEY_MBUTTON, N_("Middle Button"))
+	DEFINEKEY1(KEY_XBUTTON1, N_("X Button 1"))
+	DEFINEKEY1(KEY_XBUTTON2, N_("X Button 2"))
+	DEFINEKEY1(KEY_BACK, N_("Back"))
+	DEFINEKEY1(KEY_TAB, N_("Tab"))
+	DEFINEKEY1(KEY_CLEAR, N_("Clear"))
+	DEFINEKEY1(KEY_RETURN, N_("Return"))
+	DEFINEKEY1(KEY_SHIFT, N_("Shift"))
+	DEFINEKEY1(KEY_CONTROL, N_("Control"))
+	DEFINEKEY1(KEY_MENU, N_("Menu"))
+	DEFINEKEY1(KEY_PAUSE, N_("Pause"))
+	DEFINEKEY1(KEY_CAPITAL, N_("Caps Lock"))
+	DEFINEKEY1(KEY_SPACE, N_("Space"))
+	DEFINEKEY1(KEY_PRIOR, N_("Prior"))
+	DEFINEKEY1(KEY_NEXT, N_("Next"))
+	DEFINEKEY1(KEY_END, N_("End"))
+	DEFINEKEY1(KEY_HOME, N_("Home"))
+	DEFINEKEY1(KEY_LEFT, N_("Left"))
+	DEFINEKEY1(KEY_UP, N_("Up"))
+	DEFINEKEY1(KEY_RIGHT, N_("Right"))
+	DEFINEKEY1(KEY_DOWN, N_("Down"))
+	DEFINEKEY1(KEY_SELECT, N_("Select"))
+	DEFINEKEY1(KEY_PRINT, N_("Print"))
+	DEFINEKEY1(KEY_EXECUT, N_("Execute"))
+	DEFINEKEY1(KEY_SNAPSHOT, N_("Snapshot"))
+	DEFINEKEY1(KEY_INSERT, N_("Insert"))
+	DEFINEKEY1(KEY_DELETE, N_("Delete"))
+	DEFINEKEY1(KEY_HELP, N_("Help"))
+	DEFINEKEY1(KEY_LWIN, N_("Left Windows"))
+	DEFINEKEY1(KEY_RWIN, N_("Right Windows"))
+	DEFINEKEY1(KEY_NUMPAD0, N_("Numpad 0")) // These are not assigned to a char
+	DEFINEKEY1(KEY_NUMPAD1, N_("Numpad 1")) // to prevent interference with KEY_KEY_[0-9].
+	DEFINEKEY1(KEY_NUMPAD2, N_("Numpad 2"))
+	DEFINEKEY1(KEY_NUMPAD3, N_("Numpad 3"))
+	DEFINEKEY1(KEY_NUMPAD4, N_("Numpad 4"))
+	DEFINEKEY1(KEY_NUMPAD5, N_("Numpad 5"))
+	DEFINEKEY1(KEY_NUMPAD6, N_("Numpad 6"))
+	DEFINEKEY1(KEY_NUMPAD7, N_("Numpad 7"))
+	DEFINEKEY1(KEY_NUMPAD8, N_("Numpad 8"))
+	DEFINEKEY1(KEY_NUMPAD9, N_("Numpad 9"))
+	DEFINEKEY1(KEY_MULTIPLY, N_("Numpad *"))
+	DEFINEKEY1(KEY_ADD, N_("Numpad +"))
+	DEFINEKEY1(KEY_SEPARATOR, N_("Numpad ."))
+	DEFINEKEY1(KEY_SUBTRACT, N_("Numpad -"))
+	DEFINEKEY1(KEY_DECIMAL, NULL)
+	DEFINEKEY1(KEY_DIVIDE, N_("Numpad /"))
+	DEFINEKEY4(1)
+	DEFINEKEY4(2)
+	DEFINEKEY4(3)
+	DEFINEKEY4(4)
+	DEFINEKEY4(5)
+	DEFINEKEY4(6)
+	DEFINEKEY4(7)
+	DEFINEKEY4(8)
+	DEFINEKEY4(9)
+	DEFINEKEY4(10)
+	DEFINEKEY4(11)
+	DEFINEKEY4(12)
+	DEFINEKEY4(13)
+	DEFINEKEY4(14)
+	DEFINEKEY4(15)
+	DEFINEKEY4(16)
+	DEFINEKEY4(17)
+	DEFINEKEY4(18)
+	DEFINEKEY4(19)
+	DEFINEKEY4(20)
+	DEFINEKEY4(21)
+	DEFINEKEY4(22)
+	DEFINEKEY4(23)
+	DEFINEKEY4(24)
+	DEFINEKEY1(KEY_NUMLOCK, N_("Num Lock"))
+	DEFINEKEY1(KEY_SCROLL, N_("Scroll Lock"))
+	DEFINEKEY1(KEY_LSHIFT, N_("Left Shift"))
+	DEFINEKEY1(KEY_RSHIFT, N_("Right Shift"))
+	DEFINEKEY1(KEY_LCONTROL, N_("Left Control"))
+	DEFINEKEY1(KEY_RCONTROL, N_("Right Control"))
+	DEFINEKEY1(KEY_LMENU, N_("Left Menu"))
+	DEFINEKEY1(KEY_RMENU, N_("Right Menu"))
+
+	// Rare/weird keys
+	DEFINEKEY1(KEY_KANA, "Kana")
+	DEFINEKEY1(KEY_HANGUEL, "Hangul")
+	DEFINEKEY1(KEY_HANGUL, "Hangul")
+	DEFINEKEY1(KEY_JUNJA, "Junja")
+	DEFINEKEY1(KEY_FINAL, "Final")
+	DEFINEKEY1(KEY_KANJI, "Kanji")
+	DEFINEKEY1(KEY_HANJA, "Hanja")
+	DEFINEKEY1(KEY_ESCAPE, N_("IME Escape"))
+	DEFINEKEY1(KEY_CONVERT, N_("IME Convert"))
+	DEFINEKEY1(KEY_NONCONVERT, N_("IME Nonconvert"))
+	DEFINEKEY1(KEY_ACCEPT, N_("IME Accept"))
+	DEFINEKEY1(KEY_MODECHANGE, N_("IME Mode Change"))
+	DEFINEKEY1(KEY_APPS, N_("Apps"))
+	DEFINEKEY1(KEY_SLEEP, N_("Sleep"))
+#if !(IRRLICHT_VERSION_MAJOR <= 1 && IRRLICHT_VERSION_MINOR <= 7 && IRRLICHT_VERSION_REVISION < 3)
+	DEFINEKEY1(KEY_OEM_1, "OEM 1") // KEY_OEM_[0-9] and KEY_OEM_102 are assigned to multiple
+	DEFINEKEY1(KEY_OEM_2, "OEM 2") // different chars (on different platforms too) and thus w/o char
+	DEFINEKEY1(KEY_OEM_3, "OEM 3")
+	DEFINEKEY1(KEY_OEM_4, "OEM 4")
+	DEFINEKEY1(KEY_OEM_5, "OEM 5")
+	DEFINEKEY1(KEY_OEM_6, "OEM 6")
+	DEFINEKEY1(KEY_OEM_7, "OEM 7")
+	DEFINEKEY1(KEY_OEM_8, "OEM 8")
+	DEFINEKEY1(KEY_OEM_AX, "OEM AX")
+	DEFINEKEY1(KEY_OEM_102, "OEM 102")
+#endif
+	DEFINEKEY1(KEY_ATTN, "Attn")
+	DEFINEKEY1(KEY_CRSEL, "CrSel")
+	DEFINEKEY1(KEY_EXSEL, "ExSel")
+	DEFINEKEY1(KEY_EREOF, N_("Erase EOF"))
+	DEFINEKEY1(KEY_PLAY, N_("Play"))
+	DEFINEKEY1(KEY_ZOOM, N_("Zoom"))
+	DEFINEKEY1(KEY_PA1, "PA1")
+	DEFINEKEY1(KEY_OEM_CLEAR, N_("OEM Clear"))
+
+	// Keys without Irrlicht keycode
+	DEFINEKEY5("!")
+	DEFINEKEY5("\"")
+	DEFINEKEY5("#")
+	DEFINEKEY5("$")
+	DEFINEKEY5("%")
+	DEFINEKEY5("&")
+	DEFINEKEY5("'")
+	DEFINEKEY5("(")
+	DEFINEKEY5(")")
+	DEFINEKEY5("*")
+	DEFINEKEY5("/")
+	DEFINEKEY5(":")
+	DEFINEKEY5(";")
+	DEFINEKEY5("<")
+	DEFINEKEY5("=")
+	DEFINEKEY5(">")
+	DEFINEKEY5("?")
+	DEFINEKEY5("@")
+	DEFINEKEY5("[")
+	DEFINEKEY5("\\")
+	DEFINEKEY5("]")
+	DEFINEKEY5("^")
+	DEFINEKEY5("_")
+};
+
+#undef N_
+
+#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+struct table_key lookup_keyname(const char *name)
 {
-	CHECKKEY(KEY_LBUTTON)
-	CHECKKEY(KEY_RBUTTON)
-	CHECKKEY(KEY_CANCEL)
-	CHECKKEY(KEY_MBUTTON)
-	CHECKKEY(KEY_XBUTTON1)
-	CHECKKEY(KEY_XBUTTON2)
-	CHECKKEY(KEY_BACK)
-	CHECKKEY(KEY_TAB)
-	CHECKKEY(KEY_CLEAR)
-	CHECKKEY(KEY_RETURN)
-	CHECKKEY(KEY_SHIFT)
-	CHECKKEY(KEY_CONTROL)
-	CHECKKEY(KEY_MENU)
-	CHECKKEY(KEY_PAUSE)
-	CHECKKEY(KEY_CAPITAL)
-	CHECKKEY(KEY_KANA)
-	CHECKKEY(KEY_HANGUEL)
-	CHECKKEY(KEY_HANGUL)
-	CHECKKEY(KEY_JUNJA)
-	CHECKKEY(KEY_FINAL)
-	CHECKKEY(KEY_HANJA)
-	CHECKKEY(KEY_KANJI)
-	CHECKKEY(KEY_ESCAPE)
-	CHECKKEY(KEY_CONVERT)
-	CHECKKEY(KEY_NONCONVERT)
-	CHECKKEY(KEY_ACCEPT)
-	CHECKKEY(KEY_MODECHANGE)
-	CHECKKEY(KEY_SPACE)
-	CHECKKEY(KEY_PRIOR)
-	CHECKKEY(KEY_NEXT)
-	CHECKKEY(KEY_END)
-	CHECKKEY(KEY_HOME)
-	CHECKKEY(KEY_LEFT)
-	CHECKKEY(KEY_UP)
-	CHECKKEY(KEY_RIGHT)
-	CHECKKEY(KEY_DOWN)
-	CHECKKEY(KEY_SELECT)
-	CHECKKEY(KEY_PRINT)
-	CHECKKEY(KEY_EXECUT)
-	CHECKKEY(KEY_SNAPSHOT)
-	CHECKKEY(KEY_INSERT)
-	CHECKKEY(KEY_DELETE)
-	CHECKKEY(KEY_HELP)
-	CHECKKEY(KEY_KEY_0)
-	CHECKKEY(KEY_KEY_1)
-	CHECKKEY(KEY_KEY_2)
-	CHECKKEY(KEY_KEY_3)
-	CHECKKEY(KEY_KEY_4)
-	CHECKKEY(KEY_KEY_5)
-	CHECKKEY(KEY_KEY_6)
-	CHECKKEY(KEY_KEY_7)
-	CHECKKEY(KEY_KEY_8)
-	CHECKKEY(KEY_KEY_9)
-	CHECKKEY(KEY_KEY_A)
-	CHECKKEY(KEY_KEY_B)
-	CHECKKEY(KEY_KEY_C)
-	CHECKKEY(KEY_KEY_D)
-	CHECKKEY(KEY_KEY_E)
-	CHECKKEY(KEY_KEY_F)
-	CHECKKEY(KEY_KEY_G)
-	CHECKKEY(KEY_KEY_H)
-	CHECKKEY(KEY_KEY_I)
-	CHECKKEY(KEY_KEY_J)
-	CHECKKEY(KEY_KEY_K)
-	CHECKKEY(KEY_KEY_L)
-	CHECKKEY(KEY_KEY_M)
-	CHECKKEY(KEY_KEY_N)
-	CHECKKEY(KEY_KEY_O)
-	CHECKKEY(KEY_KEY_P)
-	CHECKKEY(KEY_KEY_Q)
-	CHECKKEY(KEY_KEY_R)
-	CHECKKEY(KEY_KEY_S)
-	CHECKKEY(KEY_KEY_T)
-	CHECKKEY(KEY_KEY_U)
-	CHECKKEY(KEY_KEY_V)
-	CHECKKEY(KEY_KEY_W)
-	CHECKKEY(KEY_KEY_X)
-	CHECKKEY(KEY_KEY_Y)
-	CHECKKEY(KEY_KEY_Z)
-	CHECKKEY(KEY_LWIN)
-	CHECKKEY(KEY_RWIN)
-	CHECKKEY(KEY_APPS)
-	CHECKKEY(KEY_SLEEP)
-	CHECKKEY(KEY_NUMPAD0)
-	CHECKKEY(KEY_NUMPAD1)
-	CHECKKEY(KEY_NUMPAD2)
-	CHECKKEY(KEY_NUMPAD3)
-	CHECKKEY(KEY_NUMPAD4)
-	CHECKKEY(KEY_NUMPAD5)
-	CHECKKEY(KEY_NUMPAD6)
-	CHECKKEY(KEY_NUMPAD7)
-	CHECKKEY(KEY_NUMPAD8)
-	CHECKKEY(KEY_NUMPAD9)
-	CHECKKEY(KEY_MULTIPLY)
-	CHECKKEY(KEY_ADD)
-	CHECKKEY(KEY_SEPARATOR)
-	CHECKKEY(KEY_SUBTRACT)
-	CHECKKEY(KEY_DECIMAL)
-	CHECKKEY(KEY_DIVIDE)
-	CHECKKEY(KEY_F1)
-	CHECKKEY(KEY_F2)
-	CHECKKEY(KEY_F3)
-	CHECKKEY(KEY_F4)
-	CHECKKEY(KEY_F5)
-	CHECKKEY(KEY_F6)
-	CHECKKEY(KEY_F7)
-	CHECKKEY(KEY_F8)
-	CHECKKEY(KEY_F9)
-	CHECKKEY(KEY_F10)
-	CHECKKEY(KEY_F11)
-	CHECKKEY(KEY_F12)
-	CHECKKEY(KEY_F13)
-	CHECKKEY(KEY_F14)
-	CHECKKEY(KEY_F15)
-	CHECKKEY(KEY_F16)
-	CHECKKEY(KEY_F17)
-	CHECKKEY(KEY_F18)
-	CHECKKEY(KEY_F19)
-	CHECKKEY(KEY_F20)
-	CHECKKEY(KEY_F21)
-	CHECKKEY(KEY_F22)
-	CHECKKEY(KEY_F23)
-	CHECKKEY(KEY_F24)
-	CHECKKEY(KEY_NUMLOCK)
-	CHECKKEY(KEY_SCROLL)
-	CHECKKEY(KEY_LSHIFT)
-	CHECKKEY(KEY_RSHIFT)
-	CHECKKEY(KEY_LCONTROL)
-	CHECKKEY(KEY_RCONTROL)
-	CHECKKEY(KEY_LMENU)
-	CHECKKEY(KEY_RMENU)
-	CHECKKEY(KEY_PLUS)
-	CHECKKEY(KEY_COMMA)
-	CHECKKEY(KEY_MINUS)
-	CHECKKEY(KEY_PERIOD)
-	CHECKKEY(KEY_ATTN)
-	CHECKKEY(KEY_CRSEL)
-	CHECKKEY(KEY_EXSEL)
-	CHECKKEY(KEY_EREOF)
-	CHECKKEY(KEY_PLAY)
-	CHECKKEY(KEY_ZOOM)
-	CHECKKEY(KEY_PA1)
-	CHECKKEY(KEY_OEM_CLEAR)
+	for (u16 i = 0; i < ARRAYSIZE(table); i++) {
+		if (strcmp(table[i].Name, name) == 0)
+			return table[i];
+	}
 
 	throw UnknownKeycode(name);
 }
 
-static const char *KeyNames[] =
-{ "-", "KEY_LBUTTON", "KEY_RBUTTON", "KEY_CANCEL", "KEY_MBUTTON", "KEY_XBUTTON1",
-		"KEY_XBUTTON2", "-", "KEY_BACK", "KEY_TAB", "-", "-", "KEY_CLEAR", "KEY_RETURN", "-",
-		"-", "KEY_SHIFT", "KEY_CONTROL", "KEY_MENU", "KEY_PAUSE", "KEY_CAPITAL", "KEY_KANA", "-",
-		"KEY_JUNJA", "KEY_FINAL", "KEY_KANJI", "-", "KEY_ESCAPE", "KEY_CONVERT", "KEY_NONCONVERT",
-		"KEY_ACCEPT", "KEY_MODECHANGE", "KEY_SPACE", "KEY_PRIOR", "KEY_NEXT", "KEY_END",
-		"KEY_HOME", "KEY_LEFT", "KEY_UP", "KEY_RIGHT", "KEY_DOWN", "KEY_SELECT", "KEY_PRINT",
-		"KEY_EXECUTE", "KEY_SNAPSHOT", "KEY_INSERT", "KEY_DELETE", "KEY_HELP", "KEY_KEY_0",
-		"KEY_KEY_1", "KEY_KEY_2", "KEY_KEY_3", "KEY_KEY_4", "KEY_KEY_5",
-		"KEY_KEY_6", "KEY_KEY_7", "KEY_KEY_8", "KEY_KEY_9", "-", "-", "-", "-",
-		"-", "-", "-", "KEY_KEY_A", "KEY_KEY_B", "KEY_KEY_C", "KEY_KEY_D",
-		"KEY_KEY_E", "KEY_KEY_F", "KEY_KEY_G", "KEY_KEY_H", "KEY_KEY_I",
-		"KEY_KEY_J", "KEY_KEY_K", "KEY_KEY_L", "KEY_KEY_M", "KEY_KEY_N",
-		"KEY_KEY_O", "KEY_KEY_P", "KEY_KEY_Q", "KEY_KEY_R", "KEY_KEY_S",
-		"KEY_KEY_T", "KEY_KEY_U", "KEY_KEY_V", "KEY_KEY_W", "KEY_KEY_X",
-		"KEY_KEY_Y", "KEY_KEY_Z", "KEY_LWIN", "KEY_RWIN", "KEY_APPS", "-",
-		"KEY_SLEEP", "KEY_NUMPAD0", "KEY_NUMPAD1", "KEY_NUMPAD2", "KEY_NUMPAD3",
-		"KEY_NUMPAD4", "KEY_NUMPAD5", "KEY_NUMPAD6", "KEY_NUMPAD7",
-		"KEY_NUMPAD8", "KEY_NUMPAD9", "KEY_MULTIPLY", "KEY_ADD", "KEY_SEPERATOR",
-		"KEY_SUBTRACT", "KEY_DECIMAL", "KEY_DIVIDE", "KEY_F1", "KEY_F2", "KEY_F3",
-		"KEY_F4", "KEY_F5", "KEY_F6", "KEY_F7", "KEY_F8", "KEY_F9", "KEY_F10",
-		"KEY_F11", "KEY_F12", "KEY_F13", "KEY_F14", "KEY_F15", "KEY_F16",
-		"KEY_F17", "KEY_F18", "KEY_F19", "KEY_F20", "KEY_F21", "KEY_F22",
-		"KEY_F23", "KEY_F24", "-", "-", "-", "-", "-", "-", "-", "-",
-		"KEY_NUMLOCK", "KEY_SCROLL", "-", "-", "-", "-", "-", "-", "-", "-", "-",
-		"-", "-", "-", "-", "-", "KEY_LSHIFT", "KEY_RSHIFT", "KEY_LCONTROL",
-		"KEY_RCONTROL", "KEY_LMENU", "KEY_RMENU", "-", "-", "-", "-", "-",
-		"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
-		"-", "-", "KEY_PLUS", "KEY_COMMA", "KEY_MINUS", "KEY_PERIOD", "-", "-", "-", "-", "-",
-		"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
-		"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
-		"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
-		"-", "-", "-", "-", "-", "-", "-", "-", "KEY_ATTN", "KEY_CRSEL", "KEY_EXSEL",
-		"KEY_EREOF", "KEY_PLAY", "KEY_ZOOM", "KEY_PA1", "KEY_OEM_CLEAR", "-" };
+struct table_key lookup_keykey(irr::EKEY_CODE key)
+{
+	for (u16 i = 0; i < ARRAYSIZE(table); i++) {
+		if (table[i].Key == key)
+			return table[i];
+	}
 
-#define N_(text) text
+	std::ostringstream os;
+	os << "<Keycode " << (int) key << ">";
+	throw UnknownKeycode(os.str().c_str());
+}
 
-static const char *KeyNamesLang[] =
-	{ "-", N_("Left Button"), N_("Right Button"), N_("Cancel"), N_("Middle Button"), N_("X Button 1"),
-			N_("X Button 2"), "-", N_("Back"), N_("Tab"), "-", "-", N_("Clear"), N_("Return"), "-",
-			"-", N_("Shift"), N_("Control"), N_("Menu"), N_("Pause"), N_("Capital"), N_("Kana"), "-",
-			N_("Junja"), N_("Final"), N_("Kanji"), "-", N_("Escape"), N_("Convert"), N_("Nonconvert"),
-			N_("Accept"), N_("Mode Change"), N_("Space"), N_("Prior"), N_("Next"), N_("End"), N_("Home"),
-			N_("Left"), N_("Up"), N_("Right"), N_("Down"), N_("Select"), N_("Print"), N_("Execute"),
-			N_("Snapshot"), N_("Insert"), N_("Delete"), N_("Help"), "0", "1", "2", "3", "4", "5",
-			"6", "7", "8", "9", "-", "-", "-", "-", "-", "-", "-", "A", "B", "C",
-			"D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q",
-			"R", "S", "T", "U", "V", "W", "X", "Y", "Z", N_("Left Windows"),
-			N_("Right Windows"), N_("Apps"), "-", N_("Sleep"), N_("Numpad 0"), N_("Numpad 1"),
-			N_("Numpad 2"), N_("Numpad 3"), N_("Numpad 4"), N_("Numpad 5"), N_("Numpad 6"), N_("Numpad 7"),
-			N_("Numpad 8"), N_("Numpad 9"), N_("Numpad *"), N_("Numpad +"), N_("Numpad /"), N_("Numpad -"),
-			"Numpad .", "Numpad /", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8",
-			"F9", "F10", "F11", "F12", "F13", "F14", "F15", "F16", "F17", "F18",
-			"F19", "F20", "F21", "F22", "F23", "F24", "-", "-", "-", "-", "-", "-",
-			"-", "-", N_("Num Lock"), N_("Scroll Lock"), "-", "-", "-", "-", "-", "-", "-",
-			"-", "-", "-", "-", "-", "-", "-", N_("Left Shift"), N_("Right Shift"),
-			N_("Left Control"), N_("Right Control"), N_("Left Menu"), N_("Right Menu"), "-", "-",
-			"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
-			"-", "-", "-", "-", "-", N_("Plus"), N_("Comma"), N_("Minus"), N_("Period"), "-", "-",
-			"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
-			"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
-			"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
-			"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", N_("Attn"), N_("CrSel"),
-			N_("ExSel"), N_("Erase OEF"), N_("Play"), N_("Zoom"), N_("PA1"), N_("OEM Clear"), "-" };
+struct table_key lookup_keychar(wchar_t Char)
+{
+	for (u16 i = 0; i < ARRAYSIZE(table); i++) {
+		if (table[i].Char == Char)
+			return table[i];
+	}
 
-#undef N_
+	std::ostringstream os;
+	os << "<Char " << hex_encode((char*) &Char, sizeof(wchar_t)) << ">";
+	throw UnknownKeycode(os.str().c_str());
+}
 
 KeyPress::KeyPress() :
 	Key(irr::KEY_KEY_CODES_COUNT),
-	Char(L'\0')
+	Char(L'\0'),
+	m_name("")
 {}
 
 KeyPress::KeyPress(const char *name)
 {
-	if (name[0] == 0) {
+	if (strlen(name) == 0) {
 		Key = irr::KEY_KEY_CODES_COUNT;
 		Char = L'\0';
+		m_name = "";
 		return;
-	} else if (strlen(name) > 4) {
+	} else if (strlen(name) <= 4) {
+		// Lookup by resulting character
+		int chars_read = mbtowc(&Char, name, 1);
+		FATAL_ERROR_IF(chars_read != 1, "Unexpected multibyte character");
 		try {
-			Key = keyname_to_keycode(name);
-			m_name = name;
-			if (strlen(name) > 8 && strncmp(name, "KEY_KEY_", 8) == 0) {
-				int chars_read = mbtowc(&Char, name + 8, 1);
-
-				FATAL_ERROR_IF(chars_read != 1, "Unexpected multibyte character");
-			} else
-				Char = L'\0';
+			struct table_key k = lookup_keychar(Char);
+			m_name = k.Name;
+			Key = k.Key;
 			return;
 		} catch (UnknownKeycode &e) {};
 	} else {
-		// see if we can set it up as a KEY_KEY_something
-		m_name = "KEY_KEY_";
-		m_name += name;
+		// Lookup by name
+		m_name = name;
 		try {
-			Key = keyname_to_keycode(m_name.c_str());
-			int chars_read = mbtowc(&Char, name, 1);
-
-			FATAL_ERROR_IF(chars_read != 1, "Unexpected multibyte character");
+			struct table_key k = lookup_keyname(name);
+			Key = k.Key;
+			Char = k.Char;
 			return;
 		} catch (UnknownKeycode &e) {};
 	}
 
-	// it's not a (known) key, just take the first char and use that
-
+	// It's not a known key, complain and try to do something
 	Key = irr::KEY_KEY_CODES_COUNT;
-
-	int mbtowc_ret = mbtowc(&Char, name, 1);
-	FATAL_ERROR_IF(mbtowc_ret != 1, "Unexpected multibyte character");
-	m_name = name[0];
+	int chars_read = mbtowc(&Char, name, 1);
+	FATAL_ERROR_IF(chars_read != 1, "Unexpected multibyte character");
+	m_name = "";
+	warningstream << "KeyPress: Unknown key '" << name << "', falling back to first char.";
 }
 
 KeyPress::KeyPress(const irr::SEvent::SKeyInput &in, bool prefer_character)
 {
-	Key = in.Key;
+	if (prefer_character)
+		Key = irr::KEY_KEY_CODES_COUNT;
+	else
+		Key = in.Key;
 	Char = in.Char;
 
-	if(prefer_character){
-		m_name.resize(MB_CUR_MAX+1, '\0');
-		int written = wctomb(&m_name[0], Char);
-		if(written > 0){
-			infostream<<"KeyPress: Preferring character for "<<m_name<<std::endl;
-			Key = irr::KEY_KEY_CODES_COUNT;
-			return;
-		}
-	}
-
-	if (valid_kcode(Key)) {
-		m_name = KeyNames[Key];
-	} else {
-		m_name.resize(MB_CUR_MAX+1, '\0');
-		int written = wctomb(&m_name[0], Char);
-		if(written < 0){
-			std::string hexstr = hex_encode((const char*)&Char, sizeof(Char));
-			errorstream<<"KeyPress: Unexpected multibyte character "<<hexstr<<std::endl;
-		}
-	}
+	try {
+		if (valid_kcode(Key))
+			m_name = lookup_keykey(Key).Name;
+		else
+			m_name = lookup_keychar(Char).Name;
+	} catch (UnknownKeycode &e) {
+		m_name = "";
+	};
 }
 
 const char *KeyPress::sym() const
 {
-	if (Key && Key < irr::KEY_KEY_CODES_COUNT)
-		return KeyNames[Key];
-	else {
-		return m_name.c_str();
-	}
+	return m_name.c_str();
 }
 
 const char *KeyPress::name() const
 {
-	if (Key && Key < irr::KEY_KEY_CODES_COUNT)
-		return KeyNamesLang[Key];
-	else {
-		return m_name.c_str();
-	}
+	if (m_name == "")
+		return "";
+	const char *ret;
+	if (valid_kcode(Key))
+		ret = lookup_keykey(Key).LangName;
+	else
+		ret = lookup_keychar(Char).LangName;
+	return ret ? ret : "<Unnamed key>";
 }
 
 const KeyPress EscapeKey("KEY_ESCAPE");
 const KeyPress CancelKey("KEY_CANCEL");
 const KeyPress NumberKey[] = {
-	KeyPress("KEY_KEY_0"), KeyPress("KEY_KEY_1"), KeyPress("KEY_KEY_2"),
-	KeyPress("KEY_KEY_3"), KeyPress("KEY_KEY_4"), KeyPress("KEY_KEY_5"),
-	KeyPress("KEY_KEY_6"), KeyPress("KEY_KEY_7"), KeyPress("KEY_KEY_8"),
-	KeyPress("KEY_KEY_9")};
+	KeyPress("0"), KeyPress("1"), KeyPress("2"), KeyPress("3"), KeyPress("4"),
+	KeyPress("5"), KeyPress("6"), KeyPress("7"), KeyPress("8"), KeyPress("9")
+};
 
 /*
 	Key config
@@ -360,11 +375,18 @@ KeyPress getKeySetting(const char *settingname)
 	n = g_key_setting_cache.find(settingname);
 	if(n != g_key_setting_cache.end())
 		return n->second;
-	g_key_setting_cache[settingname] = g_settings->get(settingname).c_str();
-	return g_key_setting_cache.find(settingname)->second;
+
+	KeyPress k(g_settings->get(settingname).c_str());
+	g_key_setting_cache[settingname] = k;
+	return k;
 }
 
 void clearKeyCache()
 {
 	g_key_setting_cache.clear();
 }
+
+irr::EKEY_CODE keyname_to_keycode(const char *name)
+{
+	return lookup_keyname(name).Key;
+}
diff --git a/src/keycode.h b/src/keycode.h
index 459a85a..4d66cf7 100644
--- a/src/keycode.h
+++ b/src/keycode.h
@@ -44,8 +44,6 @@ public:
 
 	const char *sym() const;
 	const char *name() const;
-
-	std::string debug() const;
 protected:
 	static bool valid_kcode(irr::EKEY_CODE k)
 	{
diff --git a/src/light.h b/src/light.h
index f49be45..984e6d7 100644
--- a/src/light.h
+++ b/src/light.h
@@ -27,8 +27,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 // This directly sets the range of light.
-// Actually this is not the real maximum, and this is not the
-// brightest. The brightest is LIGHT_SUN.
+// Actually this is not the real maximum, and this is not the brightest, the
+// brightest is LIGHT_SUN.
+// If changed, this constant as defined in builtin/game/constants.lua must
+// also be changed.
 #define LIGHT_MAX 14
 // Light is stored as 4 bits, thus 15 is the maximum.
 // This brightness is reserved for sunlight
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index 507f319..4d0ca06 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -26,27 +26,46 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "settings.h"
 #include "environment.h"
 #include "map.h"
-#include "util/numeric.h"
+#include "client.h"
 
 /*
 	LocalPlayer
 */
 
-LocalPlayer::LocalPlayer(IGameDef *gamedef, const char *name):
-	Player(gamedef, name),
+LocalPlayer::LocalPlayer(Client *gamedef, const char *name):
+	Player(name, gamedef->idef()),
 	parent(0),
+	hp(PLAYER_MAX_HP),
+	got_teleported(false),
 	isAttached(false),
+	touching_ground(false),
+	in_liquid(false),
+	in_liquid_stable(false),
+	liquid_viscosity(0),
+	is_climbing(false),
+	swimming_vertical(false),
+	// Movement overrides are multipliers and must be 1 by default
+	physics_override_speed(1.0f),
+	physics_override_jump(1.0f),
+	physics_override_gravity(1.0f),
+	physics_override_sneak(true),
+	physics_override_sneak_glitch(true),
 	overridePosition(v3f(0,0,0)),
 	last_position(v3f(0,0,0)),
 	last_speed(v3f(0,0,0)),
 	last_pitch(0),
 	last_yaw(0),
 	last_keyPressed(0),
+	last_camera_fov(0),
+	last_wanted_range(0),
 	camera_impact(0.f),
 	last_animation(NO_ANIM),
 	hotbar_image(""),
 	hotbar_selected_image(""),
 	light_color(255,255,255,255),
+	hurt_tilt_timer(0.0f),
+	hurt_tilt_strength(0.0f),
+	m_position(0,0,0),
 	m_sneak_node(32767,32767,32767),
 	m_sneak_node_exists(false),
 	m_need_to_get_new_sneak_node(true),
@@ -54,7 +73,13 @@ LocalPlayer::LocalPlayer(IGameDef *gamedef, const char *name):
 	m_old_node_below(32767,32767,32767),
 	m_old_node_below_type("air"),
 	m_can_jump(false),
-	m_cao(NULL)
+	m_breath(PLAYER_MAX_BREATH),
+	m_yaw(0),
+	m_pitch(0),
+	camera_barely_in_ceiling(false),
+	m_collisionbox(-BS * 0.30, 0.0, -BS * 0.30, BS * 0.30, BS * 1.75, BS * 0.30),
+	m_cao(NULL),
+	m_gamedef(gamedef)
 {
 	// Initialize hp to 0, so that no hearts will be shown if server
 	// doesn't support health points
@@ -528,18 +553,23 @@ void LocalPlayer::applyControl(float dtime)
 			speedH += move_direction;
 		}
 	}
-	if(control.down)
-	{
+	if (control.down) {
 		speedH -= move_direction;
 	}
-	if(control.left)
-	{
+	if (!control.up && !control.down) {
+		speedH -= move_direction *
+			(control.forw_move_joystick_axis / 32767.f);
+	}
+	if (control.left) {
 		speedH += move_direction.crossProduct(v3f(0,1,0));
 	}
-	if(control.right)
-	{
+	if (control.right) {
 		speedH += move_direction.crossProduct(v3f(0,-1,0));
 	}
+	if (!control.left && !control.right) {
+		speedH -= move_direction.crossProduct(v3f(0,1,0)) *
+			(control.sidew_move_joystick_axis / 32767.f);
+	}
 	if(control.jump)
 	{
 		if (free_move) {
diff --git a/src/localplayer.h b/src/localplayer.h
index 3ae0c4e..7a1cb74 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -21,28 +21,43 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define LOCALPLAYER_HEADER
 
 #include "player.h"
+#include "environment.h"
 #include <list>
 
+class Client;
 class Environment;
 class GenericCAO;
 class ClientActiveObject;
+class IGameDef;
 
 enum LocalPlayerAnimations {NO_ANIM, WALK_ANIM, DIG_ANIM, WD_ANIM};  // no local animation, walking, digging, both
 
 class LocalPlayer : public Player
 {
 public:
-	LocalPlayer(IGameDef *gamedef, const char *name);
+	LocalPlayer(Client *gamedef, const char *name);
 	virtual ~LocalPlayer();
 
-	bool isLocal() const
-	{
-		return true;
-	}
-
 	ClientActiveObject *parent;
 
+	u16 hp;
+	bool got_teleported;
 	bool isAttached;
+	bool touching_ground;
+	// This oscillates so that the player jumps a bit above the surface
+	bool in_liquid;
+	// This is more stable and defines the maximum speed of the player
+	bool in_liquid_stable;
+	// Gets the viscosity of water to calculate friction
+	u8 liquid_viscosity;
+	bool is_climbing;
+	bool swimming_vertical;
+
+	float physics_override_speed;
+	float physics_override_jump;
+	float physics_override_gravity;
+	bool physics_override_sneak;
+	bool physics_override_sneak_glitch;
 
 	v3f overridePosition;
 
@@ -60,6 +75,8 @@ public:
 	float last_pitch;
 	float last_yaw;
 	unsigned int last_keyPressed;
+	u8 last_camera_fov;
+	u8 last_wanted_range;
 
 	float camera_impact;
 
@@ -71,6 +88,9 @@ public:
 
 	video::SColor light_color;
 
+	float hurt_tilt_timer;
+	float hurt_tilt_strength;
+
 	GenericCAO* getCAO() const {
 		return m_cao;
 	}
@@ -80,10 +100,47 @@ public:
 		m_cao = toset;
 	}
 
+	u32 maxHudId() const { return hud.size(); }
+
+	u16 getBreath() const { return m_breath; }
+	void setBreath(u16 breath) { m_breath = breath; }
+
+	v3s16 getLightPosition() const
+	{
+		return floatToInt(m_position + v3f(0,BS+BS/2,0), BS);
+	}
+
+	void setYaw(f32 yaw)
+	{
+		m_yaw = yaw;
+	}
+
+	f32 getYaw() const { return m_yaw; }
+
+	void setPitch(f32 pitch)
+	{
+		m_pitch = pitch;
+	}
+
+	f32 getPitch() const { return m_pitch; }
+
+	void setPosition(const v3f &position)
+	{
+		m_position = position;
+	}
+
+	v3f getPosition() const { return m_position; }
+	v3f getEyePosition() const { return m_position + getEyeOffset(); }
+	v3f getEyeOffset() const
+	{
+		float eye_height = camera_barely_in_ceiling ? 1.5f : 1.625f;
+		return v3f(0, BS * eye_height, 0);
+	}
 private:
 	void accelerateHorizontal(const v3f &target_speed, const f32 max_increase);
 	void accelerateVertical(const v3f &target_speed, const f32 max_increase);
 
+	v3f m_position;
 	// This is used for determining the sneaking range
 	v3s16 m_sneak_node;
 	// Whether the player is allowed to sneak
@@ -98,8 +155,14 @@ private:
 	v3s16 m_old_node_below;
 	std::string m_old_node_below_type;
 	bool m_can_jump;
+	u16 m_breath;
+	f32 m_yaw;
+	f32 m_pitch;
+	bool camera_barely_in_ceiling;
+	aabb3f m_collisionbox;
 
 	GenericCAO* m_cao;
+	Client *m_gamedef;
 };
 
 #endif
diff --git a/src/main.cpp b/src/main.cpp
index 1b95a9f..a544546 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -17,15 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifdef _MSC_VER
-	#ifndef SERVER // Dedicated server isn't linked with Irrlicht
-		#pragma comment(lib, "Irrlicht.lib")
-		// This would get rid of the console window
-		//#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
-	#endif
-	#pragma comment(lib, "zlibwapi.lib")
-	#pragma comment(lib, "Shell32.lib")
-#endif
+// This would get rid of the console window
+//#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
 
 #include "irrlicht.h" // createDevice
 
@@ -948,7 +941,8 @@ static bool migrate_database(const GameParams &game_params, const Settings &cmd_
 	for (std::vector<v3s16>::const_iterator it = blocks.begin(); it != blocks.end(); ++it) {
 		if (kill) return false;
 
-		const std::string &data = old_db->loadBlock(*it);
+		std::string data;
+		old_db->loadBlock(*it, &data);
 		if (!data.empty()) {
 			new_db->saveBlock(*it, data);
 		} else {
diff --git a/src/map.cpp b/src/map.cpp
index 66fabaf..7bb8c4a 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapblock.h"
 #include "filesys.h"
 #include "voxel.h"
+#include "voxelalgorithms.h"
 #include "porting.h"
 #include "serialization.h"
 #include "nodemetadata.h"
@@ -34,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/mathconstants.h"
 #include "rollback_interface.h"
 #include "environment.h"
+#include "reflowscan.h"
 #include "emerge.h"
 #include "mapgen_v6.h"
 #include "mg_biome.h"
@@ -50,6 +52,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #if USE_REDIS
 #include "database-redis.h"
 #endif
+#if USE_POSTGRESQL
+#include "database-postgresql.h"
+#endif
 
 #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
 
@@ -170,7 +175,7 @@ bool Map::isNodeUnderground(v3s16 p)
 bool Map::isValidPosition(v3s16 p)
 {
 	v3s16 blockpos = getNodeBlockPos(p);
-	MapBlock *block = getBlockNoCreate(blockpos);
+	MapBlock *block = getBlockNoCreateNoEx(blockpos);
 	return (block != NULL);
 }
 
@@ -231,7 +236,6 @@ void Map::setNode(v3s16 p, MapNode & n)
 	block->setNodeNoCheck(relpos, n);
 }
 
-
 /*
 	Goes recursively through the neighbours of the node.
 
@@ -411,20 +415,6 @@ void Map::unspreadLight(enum LightBank bank,
 }
 
 /*
-	A single-node wrapper of the above
-*/
-void Map::unLightNeighbors(enum LightBank bank,
-		v3s16 pos, u8 lightwas,
-		std::set<v3s16> & light_sources,
-		std::map<v3s16, MapBlock*>  & modified_blocks)
-{
-	std::map<v3s16, u8> from_nodes;
-	from_nodes[pos] = lightwas;
-
-	unspreadLight(bank, from_nodes, light_sources, modified_blocks);
-}
-
-/*
 	Lights neighbors of from_nodes, collects all them and then
 	goes on recursively.
 */
@@ -565,108 +555,6 @@ void Map::spreadLight(enum LightBank bank,
 		spreadLight(bank, lighted_nodes, modified_blocks);
 }
 
-/*
-	A single-node source variation of the above.
-*/
-void Map::lightNeighbors(enum LightBank bank,
-		v3s16 pos,
-		std::map<v3s16, MapBlock*> & modified_blocks)
-{
-	std::set<v3s16> from_nodes;
-	from_nodes.insert(pos);
-	spreadLight(bank, from_nodes, modified_blocks);
-}
-
-v3s16 Map::getBrightestNeighbour(enum LightBank bank, v3s16 p)
-{
-	INodeDefManager *nodemgr = m_gamedef->ndef();
-
-	v3s16 dirs[6] = {
-		v3s16(0,0,1), // back
-		v3s16(0,1,0), // top
-		v3s16(1,0,0), // right
-		v3s16(0,0,-1), // front
-		v3s16(0,-1,0), // bottom
-		v3s16(-1,0,0), // left
-	};
-
-	u8 brightest_light = 0;
-	v3s16 brightest_pos(0,0,0);
-	bool found_something = false;
-
-	// Loop through 6 neighbors
-	for(u16 i=0; i<6; i++){
-		// Get the position of the neighbor node
-		v3s16 n2pos = p + dirs[i];
-		MapNode n2;
-		bool is_valid_position;
-		n2 = getNodeNoEx(n2pos, &is_valid_position);
-		if (!is_valid_position)
-			continue;
-
-		if(n2.getLight(bank, nodemgr) > brightest_light || found_something == false){
-			brightest_light = n2.getLight(bank, nodemgr);
-			brightest_pos = n2pos;
-			found_something = true;
-		}
-	}
-
-	if(found_something == false)
-		throw InvalidPositionException();
-
-	return brightest_pos;
-}
-
-/*
-	Propagates sunlight down from a node.
-	Starting point gets sunlight.
-
-	Returns the lowest y value of where the sunlight went.
-
-	Mud is turned into grass in where the sunlight stops.
-*/
-s16 Map::propagateSunlight(v3s16 start,
-		std::map<v3s16, MapBlock*> & modified_blocks)
-{
-	INodeDefManager *nodemgr = m_gamedef->ndef();
-
-	s16 y = start.Y;
-	for(; ; y--)
-	{
-		v3s16 pos(start.X, y, start.Z);
-
-		v3s16 blockpos = getNodeBlockPos(pos);
-		MapBlock *block;
-		try{
-			block = getBlockNoCreate(blockpos);
-		}
-		catch(InvalidPositionException &e)
-		{
-			break;
-		}
-
-		v3s16 relpos = pos - blockpos*MAP_BLOCKSIZE;
-		bool is_valid_position;
-		MapNode n = block->getNode(relpos, &is_valid_position);
-		if (!is_valid_position)
-			break;
-
-		if(nodemgr->get(n).sunlight_propagates)
-		{
-			n.setLight(LIGHTBANK_DAY, LIGHT_SUN, nodemgr);
-			block->setNode(relpos, n);
-
-			modified_blocks[blockpos] = block;
-		}
-		else
-		{
-			// Sunlight goes no further
-			break;
-		}
-	}
-	return y + 1;
-}
-
 void Map::updateLighting(enum LightBank bank,
 		std::map<v3s16, MapBlock*> & a_blocks,
 		std::map<v3s16, MapBlock*> & modified_blocks)
@@ -919,150 +807,34 @@ void Map::updateLighting(std::map<v3s16, MapBlock*> & a_blocks,
 	}
 }
 
-/*
-*/
 void Map::addNodeAndUpdate(v3s16 p, MapNode n,
 		std::map<v3s16, MapBlock*> &modified_blocks,
 		bool remove_metadata)
 {
 	INodeDefManager *ndef = m_gamedef->ndef();
 
-	/*PrintInfo(m_dout);
-	m_dout<<"Map::addNodeAndUpdate(): p=("
-			<<p.X<<","<<p.Y<<","<<p.Z<<")"<<std::endl;*/
-
-	/*
-		From this node to nodes underneath:
-		If lighting is sunlight (1.0), unlight neighbours and
-		set lighting to 0.
-		Else discontinue.
-	*/
-
-	v3s16 toppos = p + v3s16(0,1,0);
-	//v3s16 bottompos = p + v3s16(0,-1,0);
-
-	bool node_under_sunlight = true;
-	std::set<v3s16> light_sources;
-
-	/*
-		Collect old node for rollback
-	*/
+	// Collect old node for rollback
 	RollbackNode rollback_oldnode(this, p, m_gamedef);
 
-	/*
-		If there is a node at top and it doesn't have sunlight,
-		there has not been any sunlight going down.
-
-		Otherwise there probably is.
-	*/
-
-	bool is_valid_position;
-	MapNode topnode = getNodeNoEx(toppos, &is_valid_position);
-
-	if(is_valid_position && topnode.getLight(LIGHTBANK_DAY, ndef) != LIGHT_SUN)
-		node_under_sunlight = false;
-
-	/*
-		Remove all light that has come out of this node
-	*/
+	// This is needed for updating the lighting
+	MapNode oldnode = getNodeNoEx(p);
 
-	enum LightBank banks[] =
-	{
-		LIGHTBANK_DAY,
-		LIGHTBANK_NIGHT
-	};
-	for(s32 i=0; i<2; i++)
-	{
-		enum LightBank bank = banks[i];
-
-		u8 lightwas = getNodeNoEx(p).getLight(bank, ndef);
-
-		// Add the block of the added node to modified_blocks
-		v3s16 blockpos = getNodeBlockPos(p);
-		MapBlock * block = getBlockNoCreate(blockpos);
-		assert(block != NULL);
-		modified_blocks[blockpos] = block;
-
-		assert(isValidPosition(p));
-
-		// Unlight neighbours of node.
-		// This means setting light of all consequent dimmer nodes
-		// to 0.
-		// This also collects the nodes at the border which will spread
-		// light again into this.
-		unLightNeighbors(bank, p, lightwas, light_sources, modified_blocks);
-
-		n.setLight(bank, 0, ndef);
-	}
-
-	/*
-		If node lets sunlight through and is under sunlight, it has
-		sunlight too.
-	*/
-	if(node_under_sunlight && ndef->get(n).sunlight_propagates)
-	{
-		n.setLight(LIGHTBANK_DAY, LIGHT_SUN, ndef);
-	}
-
-	/*
-		Remove node metadata
-	*/
+	// Remove node metadata
 	if (remove_metadata) {
 		removeNodeMetadata(p);
 	}
 
-	/*
-		Set the node on the map
-	*/
-
+	// Set the node on the map
+	// Ignore light (because calling voxalgo::update_lighting_nodes)
+	n.setLight(LIGHTBANK_DAY, 0, ndef);
+	n.setLight(LIGHTBANK_NIGHT, 0, ndef);
 	setNode(p, n);
 
-	/*
-		If node is under sunlight and doesn't let sunlight through,
-		take all sunlighted nodes under it and clear light from them
-		and from where the light has been spread.
-		TODO: This could be optimized by mass-unlighting instead
-			  of looping
-	*/
-	if(node_under_sunlight && !ndef->get(n).sunlight_propagates)
-	{
-		s16 y = p.Y - 1;
-		for(;; y--){
-			//m_dout<<"y="<<y<<std::endl;
-			v3s16 n2pos(p.X, y, p.Z);
-
-			MapNode n2;
-
-			n2 = getNodeNoEx(n2pos, &is_valid_position);
-			if (!is_valid_position)
-				break;
-
-			if(n2.getLight(LIGHTBANK_DAY, ndef) == LIGHT_SUN)
-			{
-				unLightNeighbors(LIGHTBANK_DAY,
-						n2pos, n2.getLight(LIGHTBANK_DAY, ndef),
-						light_sources, modified_blocks);
-				n2.setLight(LIGHTBANK_DAY, 0, ndef);
-				setNode(n2pos, n2);
-			}
-			else
-				break;
-		}
-	}
-
-	for(s32 i=0; i<2; i++)
-	{
-		enum LightBank bank = banks[i];
+	// Update lighting
+	std::vector<std::pair<v3s16, MapNode> > oldnodes;
+	oldnodes.push_back(std::pair<v3s16, MapNode>(p, oldnode));
+	voxalgo::update_lighting_nodes(this, ndef, oldnodes, modified_blocks);
 
-		/*
-			Spread light from all nodes that might be capable of doing so
-		*/
-		spreadLight(bank, light_sources, modified_blocks);
-	}
-
-	/*
-		Update information about whether day and night light differ
-	*/
 	for(std::map<v3s16, MapBlock*>::iterator
 			i = modified_blocks.begin();
 			i != modified_blocks.end(); ++i)
@@ -1070,9 +842,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n,
 		i->second->expireDayNightDiff();
 	}
 
-	/*
-		Report for rollback
-	*/
+	// Report for rollback
 	if(m_gamedef->rollback())
 	{
 		RollbackNode rollback_newnode(this, p, m_gamedef);
@@ -1082,22 +852,23 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n,
 	}
 
 	/*
-		Add neighboring liquid nodes and the node itself if it is
-		liquid (=water node was added) to transform queue.
-	*/
+		Add neighboring liquid nodes and this node to transform queue.
+		(it's vital for the node itself to get updated last, if it was removed.)
+	 */
 	v3s16 dirs[7] = {
-		v3s16(0,0,0), // self
 		v3s16(0,0,1), // back
 		v3s16(0,1,0), // top
 		v3s16(1,0,0), // right
 		v3s16(0,0,-1), // front
 		v3s16(0,-1,0), // bottom
 		v3s16(-1,0,0), // left
+		v3s16(0,0,0), // self
 	};
 	for(u16 i=0; i<7; i++)
 	{
 		v3s16 p2 = p + dirs[i];
 
+		bool is_valid_position;
 		MapNode n2 = getNodeNoEx(p2, &is_valid_position);
 		if(is_valid_position
 				&& (ndef->get(n2).isLiquid() || n2.getContent() == CONTENT_AIR))
@@ -1107,183 +878,10 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n,
 	}
 }
 
-/*
-*/
 void Map::removeNodeAndUpdate(v3s16 p,
 		std::map<v3s16, MapBlock*> &modified_blocks)
 {
-	INodeDefManager *ndef = m_gamedef->ndef();
-
-	/*PrintInfo(m_dout);
-	m_dout<<"Map::removeNodeAndUpdate(): p=("
-			<<p.X<<","<<p.Y<<","<<p.Z<<")"<<std::endl;*/
-
-	bool node_under_sunlight = true;
-
-	v3s16 toppos = p + v3s16(0,1,0);
-
-	// Node will be replaced with this
-	content_t replace_material = CONTENT_AIR;
-
-	/*
-		Collect old node for rollback
-	*/
-	RollbackNode rollback_oldnode(this, p, m_gamedef);
-
-	/*
-		If there is a node at top and it doesn't have sunlight,
-		there will be no sunlight going down.
-	*/
-	bool is_valid_position;
-	MapNode topnode = getNodeNoEx(toppos, &is_valid_position);
-
-	if(is_valid_position && topnode.getLight(LIGHTBANK_DAY, ndef) != LIGHT_SUN)
-		node_under_sunlight = false;
-
-	std::set<v3s16> light_sources;
-
-	enum LightBank banks[] =
-	{
-		LIGHTBANK_DAY,
-		LIGHTBANK_NIGHT
-	};
-	for(s32 i=0; i<2; i++)
-	{
-		enum LightBank bank = banks[i];
-
-		/*
-			Unlight neighbors (in case the node is a light source)
-		*/
-		unLightNeighbors(bank, p,
-				getNodeNoEx(p).getLight(bank, ndef),
-				light_sources, modified_blocks);
-	}
-
-	/*
-		Remove node metadata
-	*/
-
-	removeNodeMetadata(p);
-
-	/*
-		Remove the node.
-		This also clears the lighting.
-	*/
-
-	MapNode n(replace_material);
-	setNode(p, n);
-
-	for(s32 i=0; i<2; i++)
-	{
-		enum LightBank bank = banks[i];
-
-		/*
-			Recalculate lighting
-		*/
-		spreadLight(bank, light_sources, modified_blocks);
-	}
-
-	// Add the block of the removed node to modified_blocks
-	v3s16 blockpos = getNodeBlockPos(p);
-	MapBlock * block = getBlockNoCreate(blockpos);
-	assert(block != NULL);
-	modified_blocks[blockpos] = block;
-
-	/*
-		If the removed node was under sunlight, propagate the
-		sunlight down from it and then light all neighbors
-		of the propagated blocks.
-	*/
-	if(node_under_sunlight)
-	{
-		s16 ybottom = propagateSunlight(p, modified_blocks);
-		/*m_dout<<"Node was under sunlight. "
-				"Propagating sunlight";
-		m_dout<<" -> ybottom="<<ybottom<<std::endl;*/
-		s16 y = p.Y;
-		for(; y >= ybottom; y--)
-		{
-			v3s16 p2(p.X, y, p.Z);
-			/*m_dout<<"lighting neighbors of node ("
-					<<p2.X<<","<<p2.Y<<","<<p2.Z<<")"
-					<<std::endl;*/
-			lightNeighbors(LIGHTBANK_DAY, p2, modified_blocks);
-		}
-	}
-	else
-	{
-		// Set the lighting of this node to 0
-		// TODO: Is this needed? Lighting is cleared up there already.
-		MapNode n = getNodeNoEx(p, &is_valid_position);
-		if (is_valid_position) {
-			n.setLight(LIGHTBANK_DAY, 0, ndef);
-			setNode(p, n);
-		} else {
-			FATAL_ERROR("Invalid position");
-		}
-	}
-
-	for(s32 i=0; i<2; i++)
-	{
-		enum LightBank bank = banks[i];
-
-		// Get the brightest neighbour node and propagate light from it
-		v3s16 n2p = getBrightestNeighbour(bank, p);
-		try{
-			//MapNode n2 = getNode(n2p);
-			lightNeighbors(bank, n2p, modified_blocks);
-		}
-		catch(InvalidPositionException &e)
-		{
-		}
-	}
-
-	/*
-		Update information about whether day and night light differ
-	*/
-	for(std::map<v3s16, MapBlock*>::iterator
-			i = modified_blocks.begin();
-			i != modified_blocks.end(); ++i)
-	{
-		i->second->expireDayNightDiff();
-	}
-
-	/*
-		Report for rollback
-	*/
-	if(m_gamedef->rollback())
-	{
-		RollbackNode rollback_newnode(this, p, m_gamedef);
-		RollbackAction action;
-		action.setSetNode(p, rollback_oldnode, rollback_newnode);
-		m_gamedef->rollback()->reportAction(action);
-	}
-
-	/*
-		Add neighboring liquid nodes and this node to transform queue.
-		(it's vital for the node itself to get updated last.)
-	*/
-	v3s16 dirs[7] = {
-		v3s16(0,0,1), // back
-		v3s16(0,1,0), // top
-		v3s16(1,0,0), // right
-		v3s16(0,0,-1), // front
-		v3s16(0,-1,0), // bottom
-		v3s16(-1,0,0), // left
-		v3s16(0,0,0), // self
-	};
-	for(u16 i=0; i<7; i++)
-	{
-		v3s16 p2 = p + dirs[i];
-
-		bool is_position_valid;
-		MapNode n2 = getNodeNoEx(p2, &is_position_valid);
-		if (is_position_valid
-				&& (ndef->get(n2).isLiquid() || n2.getContent() == CONTENT_AIR))
-		{
-			m_transforming_liquid.push_back(p2);
-		}
-	}
+	addNodeAndUpdate(p, MapNode(CONTENT_AIR), modified_blocks, true);
 }
 
 bool Map::addNodeWithEvent(v3s16 p, MapNode n, bool remove_metadata)
@@ -1631,8 +1229,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
 	// list of nodes that due to viscosity have not reached their max level height
 	std::deque<v3s16> must_reflow;
 
-	// List of MapBlocks that will require a lighting update (due to lava)
-	std::map<v3s16, MapBlock *> lighting_modified_blocks;
+	std::vector<std::pair<v3s16, MapNode> > changed_nodes;
 
 	u32 liquid_loop_max = g_settings->getS32("liquid_loop_max");
 	u32 loop_max = liquid_loop_max;
@@ -1673,7 +1270,11 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
 			Collect information about current node
 		 */
 		s8 liquid_level = -1;
+		// The liquid node which will be placed there if
+		// the liquid flows into this node.
 		content_t liquid_kind = CONTENT_IGNORE;
+		// The node which will be placed there if liquid
+		// can't flow into this node.
 		content_t floodable_node = CONTENT_AIR;
 		const ContentFeatures &cf = nodemgr->get(n0);
 		LiquidType liquid_type = cf.liquid_type;
@@ -1709,6 +1310,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
 		NodeNeighbor neutrals[6]; // nodes that are solid or another kind of liquid
 		int num_neutrals = 0;
 		bool flowing_down = false;
+		bool ignored_sources = false;
 		for (u16 i = 0; i < 6; i++) {
 			NeighborType nt = NEIGHBOR_SAME_LEVEL;
 			switch (i) {
@@ -1736,10 +1338,15 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
 							flowing_down = true;
 					} else {
 						neutrals[num_neutrals++] = nb;
-						// If neutral below is ignore prevent water spreading outwards
-						if (nb.t == NEIGHBOR_LOWER &&
-								nb.n.getContent() == CONTENT_IGNORE)
-							flowing_down = true;
+						if (nb.n.getContent() == CONTENT_IGNORE) {
+							// If node below is ignore prevent water from
+							// spreading outwards and otherwise prevent from
+							// flowing away as ignore node might be the source
+							if (nb.t == NEIGHBOR_LOWER)
+								flowing_down = true;
+							else
+								ignored_sources = true;
+						}
 					}
 					break;
 				case LIQUID_SOURCE:
@@ -1792,6 +1399,11 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
 				new_node_content = liquid_kind;
 			else
 				new_node_content = floodable_node;
+		} else if (ignored_sources && liquid_level >= 0) {
+			// Maybe there are neighbouring sources that aren't loaded yet
+			// so prevent flowing away.
+			new_node_level = liquid_level;
+			new_node_content = liquid_kind;
 		} else {
 			// no surrounding sources, so get the maximum level that can flow into this node
 			for (u16 i = 0; i < num_flows; i++) {
@@ -1865,6 +1477,10 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
 		}
 		n0.setContent(new_node_content);
 
+		// Ignore light (because calling voxalgo::update_lighting_nodes)
+		n0.setLight(LIGHTBANK_DAY, 0, nodemgr);
+		n0.setLight(LIGHTBANK_NIGHT, 0, nodemgr);
+
 		// Find out whether there is a suspect for this action
 		std::string suspect;
 		if (m_gamedef->rollback())
@@ -1891,10 +1507,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
 		MapBlock *block = getBlockNoCreateNoEx(blockpos);
 		if (block != NULL) {
 			modified_blocks[blockpos] =  block;
-			// If new or old node emits light, MapBlock requires lighting update
-			if (nodemgr->get(n0).light_source != 0 ||
-					nodemgr->get(n00).light_source != 0)
-				lighting_modified_blocks[block->getPos()] = block;
+			changed_nodes.push_back(std::pair<v3s16, MapNode>(p0, n00));
 		}
 
 		/*
@@ -1923,7 +1536,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
 	for (std::deque<v3s16>::iterator iter = must_reflow.begin(); iter != must_reflow.end(); ++iter)
 		m_transforming_liquid.push_back(*iter);
 
-	updateLighting(lighting_modified_blocks, modified_blocks);
+	voxalgo::update_lighting_nodes(this, nodemgr, changed_nodes, modified_blocks);
 
 
 	/* ----------------------------------------------------------------------
@@ -2084,11 +1697,13 @@ NodeTimer Map::getNodeTimer(v3s16 p)
 		return NodeTimer();
 	}
 	NodeTimer t = block->m_node_timers.get(p_rel);
-	return t;
+	NodeTimer nt(t.timeout, t.elapsed, p);
+	return nt;
 }
 
-void Map::setNodeTimer(v3s16 p, NodeTimer t)
+void Map::setNodeTimer(const NodeTimer &t)
 {
+	v3s16 p = t.position;
 	v3s16 blockpos = getNodeBlockPos(p);
 	v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE;
 	MapBlock *block = getBlockNoCreateNoEx(blockpos);
@@ -2102,7 +1717,8 @@ void Map::setNodeTimer(v3s16 p, NodeTimer t)
 				<<std::endl;
 		return;
 	}
-	block->m_node_timers.set(p_rel, t);
+	NodeTimer nt(t.timeout, t.elapsed, p_rel);
+	block->m_node_timers.set(nt);
 }
 
 void Map::removeNodeTimer(v3s16 p)
@@ -2124,11 +1740,15 @@ void Map::removeNodeTimer(v3s16 p)
 */
 ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emerge):
 	Map(dout_server, gamedef),
+	settings_mgr(g_settings, savedir + DIR_DELIM + "map_meta.txt"),
 	m_emerge(emerge),
 	m_map_metadata_changed(true)
 {
 	verbosestream<<FUNCTION_NAME<<std::endl;
 
+	// Tell the EmergeManager about our MapSettingsManager
+	emerge->map_settings_mgr = &settings_mgr;
+
 	/*
 		Try to load map; if not found, create a new one.
 	*/
@@ -2164,26 +1784,15 @@ ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emer
 			}
 			else
 			{
-				try{
-					// Load map metadata (seed, chunksize)
-					loadMapMeta();
-				}
-				catch(SettingNotFoundException &e){
-					infostream<<"ServerMap:  Some metadata not found."
-							  <<" Using default settings."<<std::endl;
-				}
-				catch(FileNotGoodException &e){
-					warningstream<<"Could not load map metadata"
-							//<<" Disabling chunk-based generator."
-							<<std::endl;
-					//m_chunksize = 0;
-				}
 
-				infostream<<"ServerMap: Successfully loaded map "
-						<<"metadata from "<<savedir
-						<<", assuming valid save directory."
-						<<" seed="<< m_emerge->params.seed <<"."
-						<<std::endl;
+				if (settings_mgr.loadMapMeta()) {
+					infostream << "ServerMap: Metadata loaded from "
+						<< savedir << std::endl;
+				} else {
+					infostream << "ServerMap: Metadata could not be loaded "
+						"from " << savedir << ", assuming valid save "
+						"directory." << std::endl;
+				}
 
 				m_map_saving_enabled = true;
 				// Map loaded, not creating new one
@@ -2253,19 +1862,26 @@ ServerMap::~ServerMap()
 #endif
 }
 
+MapgenParams *ServerMap::getMapgenParams()
+{
+	// getMapgenParams() should only ever be called after Server is initialized
+	assert(settings_mgr.mapgen_params != NULL);
+	return settings_mgr.mapgen_params;
+}
+
 u64 ServerMap::getSeed()
 {
-	return m_emerge->params.seed;
+	return getMapgenParams()->seed;
 }
 
 s16 ServerMap::getWaterLevel()
 {
-	return m_emerge->params.water_level;
+	return getMapgenParams()->water_level;
 }
 
 bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data)
 {
-	s16 csize = m_emerge->params.chunksize;
+	s16 csize = getMapgenParams()->chunksize;
 	v3s16 bpmin = EmergeManager::getContainingChunk(blockpos, csize);
 	v3s16 bpmax = bpmin + v3s16(1, 1, 1) * (csize - 1);
 
@@ -2281,7 +1897,7 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data)
 		blockpos_over_limit(full_bpmax))
 		return false;
 
-	data->seed = m_emerge->params.seed;
+	data->seed = getSeed();
 	data->blockpos_min = bpmin;
 	data->blockpos_max = bpmax;
 	data->blockpos_requested = blockpos;
@@ -2899,8 +2515,9 @@ void ServerMap::save(ModifiedState save_level)
 		infostream<<"ServerMap: Saving whole map, this can take time."
 				<<std::endl;
 
-	if(m_map_metadata_changed || save_level == MOD_STATE_CLEAN) {
-		saveMapMeta();
+	if (m_map_metadata_changed || save_level == MOD_STATE_CLEAN) {
+		if (settings_mgr.saveMapMeta())
+			m_map_metadata_changed = false;
 	}
 
 	// Profile modified reasons
@@ -2999,55 +2616,6 @@ void ServerMap::listAllLoadedBlocks(std::vector<v3s16> &dst)
 	}
 }
 
-void ServerMap::saveMapMeta()
-{
-	DSTACK(FUNCTION_NAME);
-
-	createDirs(m_savedir);
-
-	std::string fullpath = m_savedir + DIR_DELIM + "map_meta.txt";
-	std::ostringstream oss(std::ios_base::binary);
-	Settings conf;
-
-	m_emerge->params.save(conf);
-	conf.writeLines(oss);
-
-	oss << "[end_of_params]\n";
-
-	if(!fs::safeWriteToFile(fullpath, oss.str())) {
-		errorstream << "ServerMap::saveMapMeta(): "
-				<< "could not write " << fullpath << std::endl;
-		throw FileNotGoodException("Cannot save chunk metadata");
-	}
-
-	m_map_metadata_changed = false;
-}
-
-void ServerMap::loadMapMeta()
-{
-	DSTACK(FUNCTION_NAME);
-
-	Settings conf;
-	std::string fullpath = m_savedir + DIR_DELIM + "map_meta.txt";
-
-	std::ifstream is(fullpath.c_str(), std::ios_base::binary);
-	if (!is.good()) {
-		errorstream << "ServerMap::loadMapMeta(): "
-			"could not open " << fullpath << std::endl;
-		throw FileNotGoodException("Cannot open map metadata");
-	}
-
-	if (!conf.parseConfigLines(is, "[end_of_params]")) {
-		throw SerializationError("ServerMap::loadMapMeta(): "
-				"[end_of_params] not found!");
-	}
-
-	m_emerge->params.load(conf);
-
-	verbosestream << "ServerMap::loadMapMeta(): seed="
-		<< m_emerge->params.seed << std::endl;
-}
-
 void ServerMap::saveSectorMeta(ServerMapSector *sector)
 {
 	DSTACK(FUNCTION_NAME);
@@ -3240,6 +2808,10 @@ Database *ServerMap::createDatabase(
 	else if (name == "redis")
 		return new Database_Redis(conf);
 	#endif
+	#if USE_POSTGRESQL
+	else if (name == "postgresql")
+		return new Database_PostgreSQL(conf);
+	#endif
 	else
 		throw BaseException(std::string("Database backend ") + name + " not supported.");
 }
@@ -3334,8 +2906,11 @@ void ServerMap::loadBlock(std::string sectordir, std::string blockfile,
 		block->deSerialize(is, version, true);
 
 		// If it's a new block, insert it to the map
-		if(created_new)
+		if (created_new) {
 			sector->insertBlock(block);
+			ReflowScan scanner(this, m_emerge->ndef);
+			scanner.scan(block, &m_transforming_liquid);
+		}
 
 		/*
 			Save blocks loaded in old format in new format
@@ -3401,8 +2976,11 @@ void ServerMap::loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool
 		block->deSerialize(is, version, true);
 
 		// If it's a new block, insert it to the map
-		if(created_new)
+		if (created_new) {
 			sector->insertBlock(block);
+			ReflowScan scanner(this, m_emerge->ndef);
+			scanner.scan(block, &m_transforming_liquid);
+		}
 
 		/*
 			Save blocks loaded in old format in new format
@@ -3442,8 +3020,7 @@ MapBlock* ServerMap::loadBlock(v3s16 blockpos)
 	v2s16 p2d(blockpos.X, blockpos.Z);
 
 	std::string ret;
-
-	ret = dbase->loadBlock(blockpos);
+	dbase->loadBlock(blockpos, &ret);
 	if (ret != "") {
 		loadBlock(&ret, blockpos, createSector(p2d), false);
 		return getBlockNoCreateNoEx(blockpos);
diff --git a/src/map.h b/src/map.h
index 78614d2..e8d40e9 100644
--- a/src/map.h
+++ b/src/map.h
@@ -32,7 +32,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "voxel.h"
 #include "modifiedstate.h"
 #include "util/container.h"
+#include "util/cpp11_container.h"
 #include "nodetimer.h"
+#include "map_settings_manager.h"
 
 class Settings;
 class Database;
@@ -46,8 +48,6 @@ class IRollbackManager;
 class EmergeManager;
 class ServerEnvironment;
 struct BlockMakeData;
-struct MapgenParams;
-
 
 /*
 	MapEditEvent
@@ -211,24 +211,10 @@ public:
 			std::set<v3s16> & light_sources,
 			std::map<v3s16, MapBlock*> & modified_blocks);
 
-	void unLightNeighbors(enum LightBank bank,
-			v3s16 pos, u8 lightwas,
-			std::set<v3s16> & light_sources,
-			std::map<v3s16, MapBlock*> & modified_blocks);
-
 	void spreadLight(enum LightBank bank,
 			std::set<v3s16> & from_nodes,
 			std::map<v3s16, MapBlock*> & modified_blocks);
-
-	void lightNeighbors(enum LightBank bank,
-			v3s16 pos,
-			std::map<v3s16, MapBlock*> & modified_blocks);
-
-	v3s16 getBrightestNeighbour(enum LightBank bank, v3s16 p);
-
-	s16 propagateSunlight(v3s16 start,
-			std::map<v3s16, MapBlock*> & modified_blocks);
-
+	
 	void updateLighting(enum LightBank bank,
 			std::map<v3s16, MapBlock*>  & a_blocks,
 			std::map<v3s16, MapBlock*> & modified_blocks);
@@ -327,7 +313,7 @@ public:
 	*/
 
 	NodeTimer getNodeTimer(v3s16 p);
-	void setNodeTimer(v3s16 p, NodeTimer t);
+	void setNodeTimer(const NodeTimer &t);
 	void removeNodeTimer(v3s16 p);
 
 	/*
@@ -463,9 +449,8 @@ public:
 	void save(ModifiedState save_level);
 	void listAllLoadableBlocks(std::vector<v3s16> &dst);
 	void listAllLoadedBlocks(std::vector<v3s16> &dst);
-	// Saves map seed and possibly other stuff
-	void saveMapMeta();
-	void loadMapMeta();
+
+	MapgenParams *getMapgenParams();
 
 	/*void saveChunkMeta();
 	void loadChunkMeta();*/
@@ -506,6 +491,8 @@ public:
 	u64 getSeed();
 	s16 getWaterLevel();
 
+	MapSettingsManager settings_mgr;
+
 private:
 	// Emerge manager
 	EmergeManager *m_emerge;
diff --git a/src/map_settings_manager.cpp b/src/map_settings_manager.cpp
new file mode 100644
index 0000000..53d1712
--- /dev/null
+++ b/src/map_settings_manager.cpp
@@ -0,0 +1,194 @@
+/*
+Minetest
+Copyright (C) 2010-2013 kwolekr, Ryan Kwolek <kwolekr at minetest.net>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "debug.h"
+#include "filesys.h"
+#include "log.h"
+#include "mapgen.h"
+#include "settings.h"
+
+#include "map_settings_manager.h"
+
+MapSettingsManager::MapSettingsManager(
+	Settings *user_settings, const std::string &map_meta_path)
+{
+	m_map_meta_path = map_meta_path;
+	m_user_settings = user_settings;
+	m_map_settings  = new Settings;
+	mapgen_params   = NULL;
+
+	assert(m_user_settings != NULL);
+}
+
+
+MapSettingsManager::~MapSettingsManager()
+{
+	delete m_map_settings;
+	delete mapgen_params;
+}
+
+
+bool MapSettingsManager::getMapSetting(
+	const std::string &name, std::string *value_out)
+{
+	if (m_map_settings->getNoEx(name, *value_out))
+		return true;
+
+	// Compatibility kludge
+	if (m_user_settings == g_settings && name == "seed")
+		return m_user_settings->getNoEx("fixed_map_seed", *value_out);
+
+	return m_user_settings->getNoEx(name, *value_out);
+}
+
+
+bool MapSettingsManager::getMapSettingNoiseParams(
+	const std::string &name, NoiseParams *value_out)
+{
+	return m_map_settings->getNoiseParams(name, *value_out) ||
+		m_user_settings->getNoiseParams(name, *value_out);
+}
+
+
+bool MapSettingsManager::setMapSetting(
+	const std::string &name, const std::string &value, bool override_meta)
+{
+	if (mapgen_params)
+		return false;
+
+	if (override_meta)
+		m_map_settings->set(name, value);
+	else
+		m_map_settings->setDefault(name, value);
+
+	return true;
+}
+
+
+bool MapSettingsManager::setMapSettingNoiseParams(
+	const std::string &name, const NoiseParams *value, bool override_meta)
+{
+	if (mapgen_params)
+		return false;
+
+	m_map_settings->setNoiseParams(name, *value, !override_meta);
+	return true;
+}
+
+
+bool MapSettingsManager::loadMapMeta()
+{
+	std::ifstream is(m_map_meta_path.c_str(), std::ios_base::binary);
+
+	if (!is.good()) {
+		errorstream << "loadMapMeta: could not open "
+			<< m_map_meta_path << std::endl;
+		return false;
+	}
+
+	if (!m_map_settings->parseConfigLines(is, "[end_of_params]")) {
+		errorstream << "loadMapMeta: [end_of_params] not found!" << std::endl;
+		return false;
+	}
+
+	return true;
+}
+
+
+bool MapSettingsManager::saveMapMeta()
+{
+	// If mapgen params haven't been created yet; abort
+	if (!mapgen_params)
+		return false;
+
+	if (!fs::CreateAllDirs(fs::RemoveLastPathComponent(m_map_meta_path))) {
+		errorstream << "saveMapMeta: could not create dirs to "
+			<< m_map_meta_path;
+		return false;
+	}
+
+	std::ostringstream oss(std::ios_base::binary);
+	Settings conf;
+
+	mapgen_params->MapgenParams::writeParams(&conf);
+	mapgen_params->writeParams(&conf);
+	conf.writeLines(oss);
+
+	// NOTE: If there are ever types of map settings other than
+	// those relating to map generation, save them here
+
+	oss << "[end_of_params]\n";
+
+	if (!fs::safeWriteToFile(m_map_meta_path, oss.str())) {
+		errorstream << "saveMapMeta: could not write "
+			<< m_map_meta_path << std::endl;
+		return false;
+	}
+
+	return true;
+}
+
+
+MapgenParams *MapSettingsManager::makeMapgenParams()
+{
+	if (mapgen_params)
+		return mapgen_params;
+
+	assert(m_user_settings != NULL);
+	assert(m_map_settings != NULL);
+
+	// At this point, we have (in order of precedence):
+	// 1). m_mapgen_settings->m_settings containing map_meta.txt settings or
+	//     explicit overrides from scripts
+	// 2). m_mapgen_settings->m_defaults containing script-set mgparams without
+	//     overrides
+	// 3). g_settings->m_settings containing all user-specified config file
+	//     settings
+	// 4). g_settings->m_defaults containing any low-priority settings from
+	//     scripts, e.g. mods using Lua as an enhanced config file)
+
+	// Now, get the mapgen type so we can create the appropriate MapgenParams
+	std::string mg_name;
+	MapgenType mgtype = getMapSetting("mg_name", &mg_name) ?
+		Mapgen::getMapgenType(mg_name) : MAPGEN_DEFAULT;
+	if (mgtype == MAPGEN_INVALID) {
+		errorstream << "EmergeManager: mapgen '" << mg_name <<
+			"' not valid; falling back to " <<
+			Mapgen::getMapgenName(MAPGEN_DEFAULT) << std::endl;
+		mgtype = MAPGEN_DEFAULT;
+	}
+
+	// Create our MapgenParams
+	MapgenParams *params = Mapgen::createMapgenParams(mgtype);
+	if (params == NULL)
+		return NULL;
+
+	params->mgtype = mgtype;
+
+	// Load the rest of the mapgen params from our active settings
+	params->MapgenParams::readParams(m_user_settings);
+	params->MapgenParams::readParams(m_map_settings);
+	params->readParams(m_user_settings);
+	params->readParams(m_map_settings);
+
+	// Hold onto our params
+	mapgen_params = params;
+
+	return params;
+}
diff --git a/src/map_settings_manager.h b/src/map_settings_manager.h
new file mode 100644
index 0000000..9f766f1
--- /dev/null
+++ b/src/map_settings_manager.h
@@ -0,0 +1,79 @@
+/*
+Minetest
+Copyright (C) 2010-2013 kwolekr, Ryan Kwolek <kwolekr at minetest.net>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef MAP_SETTINGS_MANAGER_HEADER
+#define MAP_SETTINGS_MANAGER_HEADER
+
+#include <string>
+
+class Settings;
+struct NoiseParams;
+struct MapgenParams;
+
+/*
+	MapSettingsManager is a centralized object for management (creating,
+	loading, storing, saving, etc.) of config settings related to the Map.
+
+	It has two phases: the initial r/w "gather and modify settings" state, and
+	the final r/o "read and save settings" state.
+
+	The typical use case is, in order, as follows:
+	- Create a MapSettingsManager object
+	- Try to load map metadata into it from the metadata file
+	- Manually view and modify the current configuration as desired through a
+	  Settings-like interface
+	- When all modifications are finished, create a 'Parameters' object
+	  containing the finalized, active parameters.  This could be passed along
+	  to whichever Map-related objects that may require it.
+	- Save these active settings to the metadata file when requested
+*/
+class MapSettingsManager {
+public:
+	// Finalized map generation parameters
+	MapgenParams *mapgen_params;
+
+	MapSettingsManager(Settings *user_settings,
+		const std::string &map_meta_path);
+	~MapSettingsManager();
+
+	bool getMapSetting(const std::string &name, std::string *value_out);
+
+	bool getMapSettingNoiseParams(
+		const std::string &name, NoiseParams *value_out);
+
+	// Note: Map config becomes read-only after makeMapgenParams() gets called
+	// (i.e. mapgen_params is non-NULL).  Attempts to set map config after
+	// params have been finalized will result in failure.
+	bool setMapSetting(const std::string &name,
+		const std::string &value, bool override_meta = false);
+
+	bool setMapSettingNoiseParams(const std::string &name,
+		const NoiseParams *value, bool override_meta = false);
+
+	bool loadMapMeta();
+	bool saveMapMeta();
+	MapgenParams *makeMapgenParams();
+
+private:
+	std::string m_map_meta_path;
+	Settings *m_map_settings;
+	Settings *m_user_settings;
+};
+
+#endif
diff --git a/src/mapblock.h b/src/mapblock.h
index 73c17ee..5adfcf3 100644
--- a/src/mapblock.h
+++ b/src/mapblock.h
@@ -488,9 +488,9 @@ public:
 		m_node_timers.remove(p);
 	}
 
-	inline void setNodeTimer(v3s16 p, NodeTimer t)
+	inline void setNodeTimer(const NodeTimer &t)
 	{
-		m_node_timers.set(p,t);
+		m_node_timers.set(t);
 	}
 
 	inline void clearNodeTimers()
diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp
index e1b0442..00f83e7 100644
--- a/src/mapblock_mesh.cpp
+++ b/src/mapblock_mesh.cpp
@@ -839,7 +839,7 @@ static void updateFastFaceRow(
 {
 	v3s16 p = startpos;
 
-	u16 continuous_tiles_count = 0;
+	u16 continuous_tiles_count = 1;
 
 	bool makes_face = false;
 	v3s16 p_corrected;
@@ -889,8 +889,8 @@ static void updateFastFaceRow(
 					&& (tile.material_flags & MATERIAL_FLAG_TILEABLE_HORIZONTAL)
 					&& (tile.material_flags & MATERIAL_FLAG_TILEABLE_VERTICAL)) {
 				next_is_different = false;
-			}
-			else{
+				continuous_tiles_count++;
+			} else {
 				/*if(makes_face){
 					g_profiler->add("Meshgen: diff: next_makes_face != makes_face",
 							next_makes_face != makes_face ? 1 : 0);
@@ -915,8 +915,6 @@ static void updateFastFaceRow(
 				g_profiler->add("Meshgen: diff: last position", 1);*/
 		}
 
-		continuous_tiles_count++;
-
 		if(next_is_different)
 		{
 			/*
@@ -928,8 +926,6 @@ static void updateFastFaceRow(
 				v3f pf(p_corrected.X, p_corrected.Y, p_corrected.Z);
 				// Center point of face (kind of)
 				v3f sp = pf - ((f32)continuous_tiles_count / 2.0 - 0.5) * translate_dir_f;
-				if(continuous_tiles_count != 1)
-					sp += translate_dir_f;
 				v3f scale(1,1,1);
 
 				if(translate_dir.X != 0) {
@@ -952,19 +948,18 @@ static void updateFastFaceRow(
 				}
 			}
 
-			continuous_tiles_count = 0;
-
-			makes_face = next_makes_face;
-			p_corrected = next_p_corrected;
-			face_dir_corrected = next_face_dir_corrected;
-			lights[0] = next_lights[0];
-			lights[1] = next_lights[1];
-			lights[2] = next_lights[2];
-			lights[3] = next_lights[3];
-			tile = next_tile;
-			light_source = next_light_source;
+			continuous_tiles_count = 1;
 		}
 
+		makes_face = next_makes_face;
+		p_corrected = next_p_corrected;
+		face_dir_corrected = next_face_dir_corrected;
+		lights[0] = next_lights[0];
+		lights[1] = next_lights[1];
+		lights[2] = next_lights[2];
+		lights[3] = next_lights[3];
+		tile = next_tile;
+		light_source = next_light_source;
 		p = p_next;
 	}
 }
@@ -1038,7 +1033,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
 	m_enable_shaders = data->m_use_shaders;
 	m_use_tangent_vertices = data->m_use_tangent_vertices;
 	m_enable_vbo = g_settings->getBool("enable_vbo");
-	
+
 	if (g_settings->getBool("enable_minimap")) {
 		m_minimap_mapblock = new MinimapMapblock;
 		m_minimap_mapblock->getMinimapNodes(
@@ -1303,10 +1298,8 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
 	// Cracks
 	if(crack != m_last_crack)
 	{
-		for(std::map<u32, std::string>::iterator
-				i = m_crack_materials.begin();
-				i != m_crack_materials.end(); ++i)
-		{
+		for (UNORDERED_MAP<u32, std::string>::iterator i = m_crack_materials.begin();
+				i != m_crack_materials.end(); ++i) {
 			scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i->first);
 			std::string basename = i->second;
 
@@ -1320,9 +1313,9 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
 
 			// If the current material is also animated,
 			// update animation info
-			std::map<u32, TileSpec>::iterator anim_iter =
-				m_animation_tiles.find(i->first);
-			if(anim_iter != m_animation_tiles.end()){
+			UNORDERED_MAP<u32, TileSpec>::iterator anim_iter =
+					m_animation_tiles.find(i->first);
+			if (anim_iter != m_animation_tiles.end()){
 				TileSpec &tile = anim_iter->second;
 				tile.texture = new_texture;
 				tile.texture_id = new_texture_id;
@@ -1335,10 +1328,8 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
 	}
 
 	// Texture animation
-	for(std::map<u32, TileSpec>::iterator
-			i = m_animation_tiles.begin();
-			i != m_animation_tiles.end(); ++i)
-	{
+	for (UNORDERED_MAP<u32, TileSpec>::iterator i = m_animation_tiles.begin();
+			i != m_animation_tiles.end(); ++i) {
 		const TileSpec &tile = i->second;
 		// Figure out current frame
 		int frameoffset = m_animation_frame_offsets[i->first];
@@ -1448,7 +1439,7 @@ void MeshCollector::append(const TileSpec &tile,
 				vertices[i].Color, vertices[i].TCoords);
 			p->vertices.push_back(vert);
 		}
-	} 
+	}
 
 	for (u32 i = 0; i < numIndices; i++) {
 		u32 j = indices[i] + vertex_count;
@@ -1504,7 +1495,7 @@ void MeshCollector::append(const TileSpec &tile,
 				vertices[i].Normal, c, vertices[i].TCoords);
 			p->vertices.push_back(vert);
 		}
-	} 
+	}
 
 	for (u32 i = 0; i < numIndices; i++) {
 		u32 j = indices[i] + vertex_count;
diff --git a/src/mapblock_mesh.h b/src/mapblock_mesh.h
index f89fbe6..8376468 100644
--- a/src/mapblock_mesh.h
+++ b/src/mapblock_mesh.h
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "irrlichttypes_extrabloated.h"
 #include "client/tile.h"
 #include "voxel.h"
+#include "util/cpp11_container.h"
 #include <map>
 
 class IGameDef;
@@ -121,7 +122,7 @@ public:
 		if(m_animation_force_timer > 0)
 			m_animation_force_timer--;
 	}
-	
+
 	void updateCameraOffset(v3s16 camera_offset);
 
 private:
@@ -144,20 +145,20 @@ private:
 	// Last crack value passed to animate()
 	int m_last_crack;
 	// Maps mesh buffer (i.e. material) indices to base texture names
-	std::map<u32, std::string> m_crack_materials;
+	UNORDERED_MAP<u32, std::string> m_crack_materials;
 
 	// Animation info: texture animationi
 	// Maps meshbuffers to TileSpecs
-	std::map<u32, TileSpec> m_animation_tiles;
-	std::map<u32, int> m_animation_frames; // last animation frame
-	std::map<u32, int> m_animation_frame_offsets;
-	
+	UNORDERED_MAP<u32, TileSpec> m_animation_tiles;
+	UNORDERED_MAP<u32, int> m_animation_frames; // last animation frame
+	UNORDERED_MAP<u32, int> m_animation_frame_offsets;
+
 	// Animation info: day/night transitions
 	// Last daynight_ratio value passed to animate()
 	u32 m_last_daynight_ratio;
 	// For each meshbuffer, maps vertex indices to (day,night) pairs
 	std::map<u32, std::map<u32, std::pair<u8, u8> > > m_daynight_diffs;
-	
+
 	// Camera offset info -> do we have to translate the mesh?
 	v3s16 m_camera_offset;
 };
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index b3c9380..fd4f585 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -39,12 +39,19 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/numeric.h"
 #include "filesys.h"
 #include "log.h"
+#include "mapgen_flat.h"
+#include "mapgen_fractal.h"
+#include "mapgen_v5.h"
+#include "mapgen_v6.h"
+#include "mapgen_v7.h"
+#include "mapgen_valleys.h"
+#include "mapgen_singlenode.h"
+#include "cavegen.h"
+#include "dungeongen.h"
 
 FlagDesc flagdesc_mapgen[] = {
-	{"trees",       MG_TREES},
 	{"caves",       MG_CAVES},
 	{"dungeons",    MG_DUNGEONS},
-	{"flat",        MG_FLAT},
 	{"light",       MG_LIGHT},
 	{"decorations", MG_DECORATIONS},
 	{NULL,       0}
@@ -61,6 +68,28 @@ FlagDesc flagdesc_gennotify[] = {
 	{NULL,               0}
 };
 
+struct MapgenDesc {
+	const char *name;
+	bool is_user_visible;
+};
+
+////
+//// Built-in mapgens
+////
+
+static MapgenDesc g_reg_mapgens[] = {
+	{"v5",         true},
+	{"v6",         true},
+	{"v7",         true},
+	{"flat",       true},
+	{"fractal",    true},
+	{"valleys",    true},
+	{"singlenode", false},
+};
+
+STATIC_ASSERT(
+	ARRLEN(g_reg_mapgens) == MAPGEN_INVALID,
+	registered_mapgens_is_wrong_size);
 
 ////
 //// Mapgen
@@ -76,10 +105,9 @@ Mapgen::Mapgen()
 
 	vm        = NULL;
 	ndef      = NULL;
-	heightmap = NULL;
+	biomegen  = NULL;
 	biomemap  = NULL;
-	heatmap   = NULL;
-	humidmap  = NULL;
+	heightmap = NULL;
 }
 
 
@@ -88,17 +116,30 @@ Mapgen::Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge) :
 {
 	generating  = false;
 	id          = mapgenid;
-	seed        = (int)params->seed;
 	water_level = params->water_level;
 	flags       = params->flags;
 	csize       = v3s16(1, 1, 1) * (params->chunksize * MAP_BLOCKSIZE);
 
+	/*
+		We are losing half our entropy by doing this, but it is necessary to
+		preserve reverse compatibility.  If the top half of our current 64 bit
+		seeds ever starts getting used, existing worlds will break due to a
+		different hash outcome and no way to differentiate between versions.
+
+		A solution could be to add a new bit to designate that the top half of
+		the seed value should be used, essentially a 1-bit version code, but
+		this would require increasing the total size of a seed to 9 bytes (yuck)
+
+		It's probably okay if this never gets fixed.  4.2 billion possibilities
+		ought to be enough for anyone.
+	*/
+	seed = (s32)params->seed;
+
 	vm        = NULL;
-	ndef      = NULL;
-	heightmap = NULL;
+	ndef      = emerge->ndef;
+	biomegen  = NULL;
 	biomemap  = NULL;
-	heatmap   = NULL;
-	humidmap  = NULL;
+	heightmap = NULL;
 }
 
 
@@ -107,7 +148,84 @@ Mapgen::~Mapgen()
 }
 
 
-u32 Mapgen::getBlockSeed(v3s16 p, int seed)
+MapgenType Mapgen::getMapgenType(const std::string &mgname)
+{
+	for (size_t i = 0; i != ARRLEN(g_reg_mapgens); i++) {
+		if (mgname == g_reg_mapgens[i].name)
+			return (MapgenType)i;
+	}
+
+	return MAPGEN_INVALID;
+}
+
+
+const char *Mapgen::getMapgenName(MapgenType mgtype)
+{
+	size_t index = (size_t)mgtype;
+	if (index == MAPGEN_INVALID || index >= ARRLEN(g_reg_mapgens))
+		return "invalid";
+
+	return g_reg_mapgens[index].name;
+}
+
+
+Mapgen *Mapgen::createMapgen(MapgenType mgtype, int mgid,
+	MapgenParams *params, EmergeManager *emerge)
+{
+	switch (mgtype) {
+	case MAPGEN_FLAT:
+		return new MapgenFlat(mgid, (MapgenFlatParams *)params, emerge);
+	case MAPGEN_FRACTAL:
+		return new MapgenFractal(mgid, (MapgenFractalParams *)params, emerge);
+	case MAPGEN_SINGLENODE:
+		return new MapgenSinglenode(mgid, (MapgenSinglenodeParams *)params, emerge);
+	case MAPGEN_V5:
+		return new MapgenV5(mgid, (MapgenV5Params *)params, emerge);
+	case MAPGEN_V6:
+		return new MapgenV6(mgid, (MapgenV6Params *)params, emerge);
+	case MAPGEN_V7:
+		return new MapgenV7(mgid, (MapgenV7Params *)params, emerge);
+	case MAPGEN_VALLEYS:
+		return new MapgenValleys(mgid, (MapgenValleysParams *)params, emerge);
+	default:
+		return NULL;
+	}
+}
+
+
+MapgenParams *Mapgen::createMapgenParams(MapgenType mgtype)
+{
+	switch (mgtype) {
+	case MAPGEN_FLAT:
+		return new MapgenFlatParams;
+	case MAPGEN_FRACTAL:
+		return new MapgenFractalParams;
+	case MAPGEN_SINGLENODE:
+		return new MapgenSinglenodeParams;
+	case MAPGEN_V5:
+		return new MapgenV5Params;
+	case MAPGEN_V6:
+		return new MapgenV6Params;
+	case MAPGEN_V7:
+		return new MapgenV7Params;
+	case MAPGEN_VALLEYS:
+		return new MapgenValleysParams;
+	default:
+		return NULL;
+	}
+}
+
+
+void Mapgen::getMapgenNames(std::vector<const char *> *mgnames, bool include_hidden)
+{
+	for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
+		if (include_hidden || g_reg_mapgens[i].is_user_visible)
+			mgnames->push_back(g_reg_mapgens[i].name);
+	}
+}
+
+
+u32 Mapgen::getBlockSeed(v3s16 p, s32 seed)
 {
 	return (u32)seed   +
 		p.Z * 38134234 +
@@ -116,7 +234,7 @@ u32 Mapgen::getBlockSeed(v3s16 p, int seed)
 }
 
 
-u32 Mapgen::getBlockSeed2(v3s16 p, int seed)
+u32 Mapgen::getBlockSeed2(v3s16 p, s32 seed)
 {
 	u32 n = 1619 * p.X + 31337 * p.Y + 52591 * p.Z + 1013 * seed;
 	n = (n >> 13) ^ n;
@@ -199,27 +317,86 @@ void Mapgen::updateHeightmap(v3s16 nmin, v3s16 nmax)
 	//printf("updateHeightmap: %dus\n", t.stop());
 }
 
+inline bool Mapgen::isLiquidHorizontallyFlowable(u32 vi, v3s16 em)
+{
+	u32 vi_neg_x = vi;
+	vm->m_area.add_x(em, vi_neg_x, -1);
+	if (vm->m_data[vi_neg_x].getContent() != CONTENT_IGNORE) {
+		const ContentFeatures &c_nx = ndef->get(vm->m_data[vi_neg_x]);
+		if (c_nx.floodable && !c_nx.isLiquid())
+			return true;
+	}
+	u32 vi_pos_x = vi;
+	vm->m_area.add_x(em, vi_pos_x, +1);
+	if (vm->m_data[vi_pos_x].getContent() != CONTENT_IGNORE) {
+		const ContentFeatures &c_px = ndef->get(vm->m_data[vi_pos_x]);
+		if (c_px.floodable && !c_px.isLiquid())
+			return true;
+	}
+	u32 vi_neg_z = vi;
+	vm->m_area.add_z(em, vi_neg_z, -1);
+	if (vm->m_data[vi_neg_z].getContent() != CONTENT_IGNORE) {
+		const ContentFeatures &c_nz = ndef->get(vm->m_data[vi_neg_z]);
+		if (c_nz.floodable && !c_nz.isLiquid())
+			return true;
+	}
+	u32 vi_pos_z = vi;
+	vm->m_area.add_z(em, vi_pos_z, +1);
+	if (vm->m_data[vi_pos_z].getContent() != CONTENT_IGNORE) {
+		const ContentFeatures &c_pz = ndef->get(vm->m_data[vi_pos_z]);
+		if (c_pz.floodable && !c_pz.isLiquid())
+			return true;
+	}
+	return false;
+}
 
 void Mapgen::updateLiquid(UniqueQueue<v3s16> *trans_liquid, v3s16 nmin, v3s16 nmax)
 {
-	bool isliquid, wasliquid;
+	bool isignored, isliquid, wasignored, wasliquid, waschecked, waspushed;
 	v3s16 em  = vm->m_area.getExtent();
 
-	for (s16 z = nmin.Z; z <= nmax.Z; z++) {
-		for (s16 x = nmin.X; x <= nmax.X; x++) {
-			wasliquid = true;
-
-			u32 i = vm->m_area.index(x, nmax.Y, z);
-			for (s16 y = nmax.Y; y >= nmin.Y; y--) {
-				isliquid = ndef->get(vm->m_data[i]).isLiquid();
-
-				// there was a change between liquid and nonliquid, add to queue.
-				if (isliquid != wasliquid)
+	for (s16 z = nmin.Z + 1; z <= nmax.Z - 1; z++)
+	for (s16 x = nmin.X + 1; x <= nmax.X - 1; x++) {
+		wasignored = true;
+		wasliquid = false;
+		waschecked = false;
+		waspushed = false;
+
+		u32 vi = vm->m_area.index(x, nmax.Y, z);
+		for (s16 y = nmax.Y; y >= nmin.Y; y--) {
+			isignored = vm->m_data[vi].getContent() == CONTENT_IGNORE;
+			isliquid = ndef->get(vm->m_data[vi]).isLiquid();
+
+			if (isignored || wasignored || isliquid == wasliquid) {
+				// Neither topmost node of liquid column nor topmost node below column
+				waschecked = false;
+				waspushed = false;
+			} else if (isliquid) {
+				// This is the topmost node in the column
+				bool ispushed = false;
+				if (isLiquidHorizontallyFlowable(vi, em)) {
 					trans_liquid->push_back(v3s16(x, y, z));
-
-				wasliquid = isliquid;
-				vm->m_area.add_y(em, i, -1);
+					ispushed = true;
+				}
+				// Remember waschecked and waspushed to avoid repeated
+				// checks/pushes in case the column consists of only this node
+				waschecked = true;
+				waspushed = ispushed;
+			} else {
+				// This is the topmost node below a liquid column
+				u32 vi_above = vi;
+				vm->m_area.add_y(em, vi_above, 1);
+				if (!waspushed && (ndef->get(vm->m_data[vi]).floodable ||
+						(!waschecked && isLiquidHorizontallyFlowable(vi_above, em)))) {
+					// Push back the lowest node in the column which is one
+					// node above this one
+					trans_liquid->push_back(v3s16(x, y + 1, z));
+				}
 			}
+
+			wasliquid = isliquid;
+			wasignored = isignored;
+			vm->m_area.add_y(em, vi, -1);
 		}
 	}
 }
@@ -372,6 +549,349 @@ void Mapgen::spreadLight(v3s16 nmin, v3s16 nmax)
 
 
 ////
+//// MapgenBasic
+////
+
+MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge)
+	: Mapgen(mapgenid, params, emerge)
+{
+	this->m_emerge = emerge;
+	this->m_bmgr   = emerge->biomemgr;
+
+	//// Here, 'stride' refers to the number of elements needed to skip to index
+	//// an adjacent element for that coordinate in noise/height/biome maps
+	//// (*not* vmanip content map!)
+
+	// Note there is no X stride explicitly defined.  Items adjacent in the X
+	// coordinate are assumed to be adjacent in memory as well (i.e. stride of 1).
+
+	// Number of elements to skip to get to the next Y coordinate
+	this->ystride = csize.X;
+
+	// Number of elements to skip to get to the next Z coordinate
+	this->zstride = csize.X * csize.Y;
+
+	// Z-stride value for maps oversized for 1-down overgeneration
+	this->zstride_1d = csize.X * (csize.Y + 1);
+
+	// Z-stride value for maps oversized for 1-up 1-down overgeneration
+	this->zstride_1u1d = csize.X * (csize.Y + 2);
+
+	//// Allocate heightmap
+	this->heightmap = new s16[csize.X * csize.Z];
+
+	//// Initialize biome generator
+	// TODO(hmmmm): should we have a way to disable biomemanager biomes?
+	biomegen = m_bmgr->createBiomeGen(BIOMEGEN_ORIGINAL, params->bparams, csize);
+	biomemap = biomegen->biomemap;
+
+	//// Look up some commonly used content
+	c_stone              = ndef->getId("mapgen_stone");
+	c_water_source       = ndef->getId("mapgen_water_source");
+	c_desert_stone       = ndef->getId("mapgen_desert_stone");
+	c_sandstone          = ndef->getId("mapgen_sandstone");
+	c_river_water_source = ndef->getId("mapgen_river_water_source");
+
+	// Fall back to more basic content if not defined
+	if (c_desert_stone == CONTENT_IGNORE)
+		c_desert_stone = c_stone;
+	if (c_sandstone == CONTENT_IGNORE)
+		c_sandstone = c_stone;
+	if (c_river_water_source == CONTENT_IGNORE)
+		c_river_water_source = c_water_source;
+
+	//// Content used for dungeon generation
+	c_cobble               = ndef->getId("mapgen_cobble");
+	c_stair_cobble         = ndef->getId("mapgen_stair_cobble");
+	c_mossycobble          = ndef->getId("mapgen_mossycobble");
+	c_sandstonebrick       = ndef->getId("mapgen_sandstonebrick");
+	c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
+
+	// Fall back to more basic content if not defined
+	if (c_mossycobble == CONTENT_IGNORE)
+		c_mossycobble = c_cobble;
+	if (c_stair_cobble == CONTENT_IGNORE)
+		c_stair_cobble = c_cobble;
+	if (c_sandstonebrick == CONTENT_IGNORE)
+		c_sandstonebrick = c_sandstone;
+	if (c_stair_sandstonebrick == CONTENT_IGNORE)
+		c_stair_sandstonebrick = c_sandstone;
+}
+
+
+MapgenBasic::~MapgenBasic()
+{
+	delete biomegen;
+	delete []heightmap;
+}
+
+
+MgStoneType MapgenBasic::generateBiomes()
+{
+	// can't generate biomes without a biome generator!
+	assert(biomegen);
+	assert(biomemap);
+
+	v3s16 em = vm->m_area.getExtent();
+	u32 index = 0;
+	MgStoneType stone_type = MGSTONE_STONE;
+
+	noise_filler_depth->perlinMap2D(node_min.X, node_min.Z);
+
+	for (s16 z = node_min.Z; z <= node_max.Z; z++)
+	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
+		Biome *biome = NULL;
+		u16 depth_top = 0;
+		u16 base_filler = 0;
+		u16 depth_water_top = 0;
+		u16 depth_riverbed = 0;
+		u32 vi = vm->m_area.index(x, node_max.Y, z);
+
+		// Check node at base of mapchunk above, either a node of a previously
+		// generated mapchunk or if not, a node of overgenerated base terrain.
+		content_t c_above = vm->m_data[vi + em.X].getContent();
+		bool air_above = c_above == CONTENT_AIR;
+		bool river_water_above = c_above == c_river_water_source;
+		bool water_above = c_above == c_water_source || river_water_above;
+
+		biomemap[index] = BIOME_NONE;
+
+		// If there is air or water above enable top/filler placement, otherwise force
+		// nplaced to stone level by setting a number exceeding any possible filler depth.
+		u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
+
+		for (s16 y = node_max.Y; y >= node_min.Y; y--) {
+			content_t c = vm->m_data[vi].getContent();
+
+			// Biome is recalculated each time an upper surface is detected while
+			// working down a column. The selected biome then remains in effect for
+			// all nodes below until the next surface and biome recalculation.
+			// Biome is recalculated:
+			// 1. At the surface of stone below air or water.
+			// 2. At the surface of water below air.
+			// 3. When stone or water is detected but biome has not yet been calculated.
+			bool is_stone_surface = (c == c_stone) &&
+				(air_above || water_above || !biome);
+
+			bool is_water_surface =
+				(c == c_water_source || c == c_river_water_source) &&
+				(air_above || !biome);
+
+			if (is_stone_surface || is_water_surface) {
+				biome = biomegen->getBiomeAtIndex(index, y);
+
+				if (biomemap[index] == BIOME_NONE && is_stone_surface)
+					biomemap[index] = biome->index;
+
+				depth_top = biome->depth_top;
+				base_filler = MYMAX(depth_top +
+					biome->depth_filler +
+					noise_filler_depth->result[index], 0.f);
+				depth_water_top = biome->depth_water_top;
+				depth_riverbed = biome->depth_riverbed;
+
+				// Detect stone type for dungeons during every biome calculation.
+				// This is more efficient than detecting per-node and will not
+				// miss any desert stone or sandstone biomes.
+				if (biome->c_stone == c_desert_stone)
+					stone_type = MGSTONE_DESERT_STONE;
+				else if (biome->c_stone == c_sandstone)
+					stone_type = MGSTONE_SANDSTONE;
+			}
+
+			if (c == c_stone) {
+				content_t c_below = vm->m_data[vi - em.X].getContent();
+
+				// If the node below isn't solid, make this node stone, so that
+				// any top/filler nodes above are structurally supported.
+				// This is done by aborting the cycle of top/filler placement
+				// immediately by forcing nplaced to stone level.
+				if (c_below == CONTENT_AIR
+						|| c_below == c_water_source
+						|| c_below == c_river_water_source)
+					nplaced = U16_MAX;
+
+				if (river_water_above) {
+					if (nplaced < depth_riverbed) {
+						vm->m_data[vi] = MapNode(biome->c_riverbed);
+						nplaced++;
+					} else {
+						nplaced = U16_MAX;  // Disable top/filler placement
+						river_water_above = false;
+					}
+				} else if (nplaced < depth_top) {
+					vm->m_data[vi] = MapNode(biome->c_top);
+					nplaced++;
+				} else if (nplaced < base_filler) {
+					vm->m_data[vi] = MapNode(biome->c_filler);
+					nplaced++;
+				} else {
+					vm->m_data[vi] = MapNode(biome->c_stone);
+				}
+
+				air_above = false;
+				water_above = false;
+			} else if (c == c_water_source) {
+				vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top))
+						? biome->c_water_top : biome->c_water);
+				nplaced = 0;  // Enable top/filler placement for next surface
+				air_above = false;
+				water_above = true;
+			} else if (c == c_river_water_source) {
+				vm->m_data[vi] = MapNode(biome->c_river_water);
+				nplaced = 0;  // Enable riverbed placement for next surface
+				air_above = false;
+				water_above = true;
+				river_water_above = true;
+			} else if (c == CONTENT_AIR) {
+				nplaced = 0;  // Enable top/filler placement for next surface
+				air_above = true;
+				water_above = false;
+			} else {  // Possible various nodes overgenerated from neighbouring mapchunks
+				nplaced = U16_MAX;  // Disable top/filler placement
+				air_above = false;
+				water_above = false;
+			}
+
+			vm->m_area.add_y(em, vi, -1);
+		}
+	}
+
+	return stone_type;
+}
+
+
+void MapgenBasic::dustTopNodes()
+{
+	if (node_max.Y < water_level)
+		return;
+
+	v3s16 em = vm->m_area.getExtent();
+	u32 index = 0;
+
+	for (s16 z = node_min.Z; z <= node_max.Z; z++)
+	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
+		Biome *biome = (Biome *)m_bmgr->getRaw(biomemap[index]);
+
+		if (biome->c_dust == CONTENT_IGNORE)
+			continue;
+
+		u32 vi = vm->m_area.index(x, full_node_max.Y, z);
+		content_t c_full_max = vm->m_data[vi].getContent();
+		s16 y_start;
+
+		if (c_full_max == CONTENT_AIR) {
+			y_start = full_node_max.Y - 1;
+		} else if (c_full_max == CONTENT_IGNORE) {
+			vi = vm->m_area.index(x, node_max.Y + 1, z);
+			content_t c_max = vm->m_data[vi].getContent();
+
+			if (c_max == CONTENT_AIR)
+				y_start = node_max.Y;
+			else
+				continue;
+		} else {
+			continue;
+		}
+
+		vi = vm->m_area.index(x, y_start, z);
+		for (s16 y = y_start; y >= node_min.Y - 1; y--) {
+			if (vm->m_data[vi].getContent() != CONTENT_AIR)
+				break;
+
+			vm->m_area.add_y(em, vi, -1);
+		}
+
+		content_t c = vm->m_data[vi].getContent();
+		if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
+			vm->m_area.add_y(em, vi, 1);
+			vm->m_data[vi] = MapNode(biome->c_dust);
+		}
+	}
+}
+
+
+void MapgenBasic::generateCaves(s16 max_stone_y, s16 large_cave_depth)
+{
+	if (max_stone_y < node_min.Y)
+		return;
+
+	CavesNoiseIntersection caves_noise(ndef, m_bmgr, csize,
+		&np_cave1, &np_cave2, seed, cave_width);
+
+	caves_noise.generateCaves(vm, node_min, node_max, biomemap);
+
+	if (node_max.Y > large_cave_depth)
+		return;
+
+	PseudoRandom ps(blockseed + 21343);
+	u32 bruises_count = ps.range(0, 2);
+	for (u32 i = 0; i < bruises_count; i++) {
+		CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
+			c_water_source, CONTENT_IGNORE);
+
+		cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y, heightmap);
+	}
+}
+
+
+void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type)
+{
+	if (max_stone_y < node_min.Y)
+		return;
+
+	DungeonParams dp;
+
+	dp.seed          = seed;
+	dp.c_water       = c_water_source;
+	dp.c_river_water = c_river_water_source;
+	dp.rooms_min     = 2;
+	dp.rooms_max     = 16;
+	dp.y_min         = -MAX_MAP_GENERATION_LIMIT;
+	dp.y_max         = MAX_MAP_GENERATION_LIMIT;
+	dp.np_density    = nparams_dungeon_density;
+	dp.np_alt_wall   = nparams_dungeon_alt_wall;
+
+	switch (stone_type) {
+	default:
+	case MGSTONE_STONE:
+		dp.c_wall     = c_cobble;
+		dp.c_alt_wall = c_mossycobble;
+		dp.c_stair    = c_stair_cobble;
+
+		dp.diagonal_dirs = false;
+		dp.holesize      = v3s16(1, 2, 1);
+		dp.roomsize      = v3s16(0, 0, 0);
+		dp.notifytype    = GENNOTIFY_DUNGEON;
+		break;
+	case MGSTONE_DESERT_STONE:
+		dp.c_wall     = c_desert_stone;
+		dp.c_alt_wall = CONTENT_IGNORE;
+		dp.c_stair    = c_desert_stone;
+
+		dp.diagonal_dirs = true;
+		dp.holesize      = v3s16(2, 3, 2);
+		dp.roomsize      = v3s16(2, 5, 2);
+		dp.notifytype    = GENNOTIFY_TEMPLE;
+		break;
+	case MGSTONE_SANDSTONE:
+		dp.c_wall     = c_sandstonebrick;
+		dp.c_alt_wall = CONTENT_IGNORE;
+		dp.c_stair    = c_sandstonebrick;
+
+		dp.diagonal_dirs = false;
+		dp.holesize      = v3s16(2, 2, 2);
+		dp.roomsize      = v3s16(2, 0, 2);
+		dp.notifytype    = GENNOTIFY_DUNGEON;
+		break;
+	}
+
+	DungeonGen dgen(ndef, &gennotify, &dp);
+	dgen.generate(vm, blockseed, full_node_min, full_node_max);
+}
+
+
+////
 //// GenerateNotifier
 ////
 
@@ -444,46 +964,50 @@ void GenerateNotifier::getEvents(
 //// MapgenParams
 ////
 
-void MapgenParams::load(const Settings &settings)
+
+MapgenParams::~MapgenParams()
+{
+	delete bparams;
+}
+
+
+void MapgenParams::readParams(const Settings *settings)
 {
 	std::string seed_str;
-	const char *seed_name = (&settings == g_settings) ? "fixed_map_seed" : "seed";
-
-	if (settings.getNoEx(seed_name, seed_str) && !seed_str.empty())
-		seed = read_seed(seed_str.c_str());
-	else
-		myrand_bytes(&seed, sizeof(seed));
-
-	settings.getNoEx("mg_name", mg_name);
-	settings.getS16NoEx("water_level", water_level);
-	settings.getS16NoEx("chunksize", chunksize);
-	settings.getFlagStrNoEx("mg_flags", flags, flagdesc_mapgen);
-	settings.getNoiseParams("mg_biome_np_heat", np_biome_heat);
-	settings.getNoiseParams("mg_biome_np_heat_blend", np_biome_heat_blend);
-	settings.getNoiseParams("mg_biome_np_humidity", np_biome_humidity);
-	settings.getNoiseParams("mg_biome_np_humidity_blend", np_biome_humidity_blend);
-
-	delete sparams;
-	MapgenFactory *mgfactory = EmergeManager::getMapgenFactory(mg_name);
-	if (mgfactory) {
-		sparams = mgfactory->createMapgenParams();
-		sparams->readParams(&settings);
+	const char *seed_name = (settings == g_settings) ? "fixed_map_seed" : "seed";
+
+	if (settings->getNoEx(seed_name, seed_str)) {
+		if (!seed_str.empty())
+			seed = read_seed(seed_str.c_str());
+		else
+			myrand_bytes(&seed, sizeof(seed));
+	}
+
+	std::string mg_name;
+	if (settings->getNoEx("mg_name", mg_name))
+		this->mgtype = Mapgen::getMapgenType(mg_name);
+
+	settings->getS16NoEx("water_level", water_level);
+	settings->getS16NoEx("chunksize", chunksize);
+	settings->getFlagStrNoEx("mg_flags", flags, flagdesc_mapgen);
+
+	delete bparams;
+	bparams = BiomeManager::createBiomeParams(BIOMEGEN_ORIGINAL);
+	if (bparams) {
+		bparams->readParams(settings);
+		bparams->seed = seed;
 	}
 }
 
 
-void MapgenParams::save(Settings &settings) const
+void MapgenParams::writeParams(Settings *settings) const
 {
-	settings.set("mg_name", mg_name);
-	settings.setU64("seed", seed);
-	settings.setS16("water_level", water_level);
-	settings.setS16("chunksize", chunksize);
-	settings.setFlagStr("mg_flags", flags, flagdesc_mapgen, U32_MAX);
-	settings.setNoiseParams("mg_biome_np_heat", np_biome_heat);
-	settings.setNoiseParams("mg_biome_np_heat_blend", np_biome_heat_blend);
-	settings.setNoiseParams("mg_biome_np_humidity", np_biome_humidity);
-	settings.setNoiseParams("mg_biome_np_humidity_blend", np_biome_humidity_blend);
-
-	if (sparams)
-		sparams->writeParams(&settings);
+	settings->set("mg_name", Mapgen::getMapgenName(mgtype));
+	settings->setU64("seed", seed);
+	settings->setS16("water_level", water_level);
+	settings->setS16("chunksize", chunksize);
+	settings->setFlagStr("mg_flags", flags, flagdesc_mapgen, U32_MAX);
+
+	if (bparams)
+		bparams->writeParams(settings);
 }
diff --git a/src/mapgen.h b/src/mapgen.h
index abc3d2e..b18bfb9 100644
--- a/src/mapgen.h
+++ b/src/mapgen.h
@@ -26,16 +26,19 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/string.h"
 #include "util/container.h"
 
-#define DEFAULT_MAPGEN "v6"
+#define MAPGEN_DEFAULT MAPGEN_V7
+#define MAPGEN_DEFAULT_NAME "v7"
 
 /////////////////// Mapgen flags
-#define MG_TREES       0x01
+#define MG_TREES       0x01  // Deprecated. Moved into mgv6 flags
 #define MG_CAVES       0x02
 #define MG_DUNGEONS    0x04
-#define MG_FLAT        0x08
+#define MG_FLAT        0x08  // Deprecated. Moved into mgv6 flags
 #define MG_LIGHT       0x10
 #define MG_DECORATIONS 0x20
 
+typedef u8 biome_t;  // copy from mg_biome.h to avoid an unnecessary include
+
 class Settings;
 class MMVManip;
 class INodeDefManager;
@@ -44,6 +47,9 @@ extern FlagDesc flagdesc_mapgen[];
 extern FlagDesc flagdesc_gennotify[];
 
 class Biome;
+class BiomeGen;
+struct BiomeParams;
+class BiomeManager;
 class EmergeManager;
 class MapBlock;
 class VoxelManipulator;
@@ -73,9 +79,9 @@ enum GenNotifyType {
 
 // TODO(hmmmm/paramat): make stone type selection dynamic
 enum MgStoneType {
-	STONE,
-	DESERT_STONE,
-	SANDSTONE,
+	MGSTONE_STONE,
+	MGSTONE_DESERT_STONE,
+	MGSTONE_SANDSTONE,
 };
 
 struct GenNotifyEvent {
@@ -102,46 +108,55 @@ private:
 	std::list<GenNotifyEvent> m_notify_events;
 };
 
-struct MapgenSpecificParams {
-	virtual void readParams(const Settings *settings) = 0;
-	virtual void writeParams(Settings *settings) const = 0;
-	virtual ~MapgenSpecificParams() {}
+enum MapgenType {
+	MAPGEN_V5,
+	MAPGEN_V6,
+	MAPGEN_V7,
+	MAPGEN_FLAT,
+	MAPGEN_FRACTAL,
+	MAPGEN_VALLEYS,
+	MAPGEN_SINGLENODE,
+	MAPGEN_INVALID,
 };
 
 struct MapgenParams {
-	std::string mg_name;
+	MapgenType mgtype;
 	s16 chunksize;
 	u64 seed;
 	s16 water_level;
 	u32 flags;
 
-	NoiseParams np_biome_heat;
-	NoiseParams np_biome_heat_blend;
-	NoiseParams np_biome_humidity;
-	NoiseParams np_biome_humidity_blend;
-
-	MapgenSpecificParams *sparams;
+	BiomeParams *bparams;
 
 	MapgenParams() :
-		mg_name(DEFAULT_MAPGEN),
+		mgtype(MAPGEN_DEFAULT),
 		chunksize(5),
 		seed(0),
 		water_level(1),
 		flags(MG_CAVES | MG_LIGHT | MG_DECORATIONS),
-		np_biome_heat(NoiseParams(50, 50, v3f(750.0, 750.0, 750.0), 5349, 3, 0.5, 2.0)),
-		np_biome_heat_blend(NoiseParams(0, 1.5, v3f(8.0, 8.0, 8.0), 13, 2, 1.0, 2.0)),
-		np_biome_humidity(NoiseParams(50, 50, v3f(750.0, 750.0, 750.0), 842, 3, 0.5, 2.0)),
-		np_biome_humidity_blend(NoiseParams(0, 1.5, v3f(8.0, 8.0, 8.0), 90003, 2, 1.0, 2.0)),
-		sparams(NULL)
-	{}
-
-	void load(const Settings &settings);
-	void save(Settings &settings) const;
+		bparams(NULL)
+	{
+	}
+
+	virtual ~MapgenParams();
+
+	virtual void readParams(const Settings *settings);
+	virtual void writeParams(Settings *settings) const;
 };
 
+
+/*
+	Generic interface for map generators.  All mapgens must inherit this class.
+	If a feature exposed by a public member pointer is not supported by a
+	certain mapgen, it must be set to NULL.
+
+	Apart from makeChunk, getGroundLevelAtPoint, and getSpawnLevelAtPoint, all
+	methods can be used by constructing a Mapgen base class and setting the
+	appropriate public members (e.g. vm, ndef, and so on).
+*/
 class Mapgen {
 public:
-	int seed;
+	s32 seed;
 	int water_level;
 	u32 flags;
 	bool generating;
@@ -152,19 +167,20 @@ public:
 
 	u32 blockseed;
 	s16 *heightmap;
-	u8 *biomemap;
-	float *heatmap;
-	float *humidmap;
+	biome_t *biomemap;
 	v3s16 csize;
 
+	BiomeGen *biomegen;
 	GenerateNotifier gennotify;
 
 	Mapgen();
 	Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge);
 	virtual ~Mapgen();
 
-	static u32 getBlockSeed(v3s16 p, int seed);
-	static u32 getBlockSeed2(v3s16 p, int seed);
+	virtual MapgenType getType() const { return MAPGEN_INVALID; }
+
+	static u32 getBlockSeed(v3s16 p, s32 seed);
+	static u32 getBlockSeed2(v3s16 p, s32 seed);
 	s16 findGroundLevelFull(v2s16 p2d);
 	s16 findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax);
 	s16 findLiquidSurface(v2s16 p2d, s16 ymin, s16 ymax);
@@ -188,15 +204,81 @@ public:
 	// signify this and to cause Server::findSpawnPos() to try another (X, Z).
 	virtual int getSpawnLevelAtPoint(v2s16 p) { return 0; }
 
+	// Mapgen management functions
+	static MapgenType getMapgenType(const std::string &mgname);
+	static const char *getMapgenName(MapgenType mgtype);
+	static Mapgen *createMapgen(MapgenType mgtype, int mgid,
+		MapgenParams *params, EmergeManager *emerge);
+	static MapgenParams *createMapgenParams(MapgenType mgtype);
+	static void getMapgenNames(std::vector<const char *> *mgnames, bool include_hidden);
+
 private:
+	// isLiquidHorizontallyFlowable() is a helper function for updateLiquid()
+	// that checks whether there are floodable nodes without liquid beneath
+	// the node at index vi.
+	inline bool isLiquidHorizontallyFlowable(u32 vi, v3s16 em);
 	DISABLE_CLASS_COPY(Mapgen);
 };
 
-struct MapgenFactory {
-	virtual Mapgen *createMapgen(int mgid, MapgenParams *params,
-		EmergeManager *emerge) = 0;
-	virtual MapgenSpecificParams *createMapgenParams() = 0;
-	virtual ~MapgenFactory() {}
+/*
+	MapgenBasic is a Mapgen implementation that handles basic functionality
+	the majority of conventional mapgens will probably want to use, but isn't
+	generic enough to be included as part of the base Mapgen class (such as
+	generating biome terrain over terrain node skeletons, generating caves,
+	dungeons, etc.)
+
+	Inherit MapgenBasic instead of Mapgen to add this basic functionality to
+	your mapgen without having to reimplement it.  Feel free to override any of
+	these methods if you desire different or more advanced behavior.
+
+	Note that you must still create your own generateTerrain implementation when
+	inheriting MapgenBasic.
+*/
+class MapgenBasic : public Mapgen {
+public:
+	MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge);
+	virtual ~MapgenBasic();
+
+	virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth);
+	virtual void generateDungeons(s16 max_stone_y, MgStoneType stone_type);
+	virtual MgStoneType generateBiomes();
+	virtual void dustTopNodes();
+
+protected:
+	EmergeManager *m_emerge;
+	BiomeManager *m_bmgr;
+
+	Noise *noise_filler_depth;
+
+	v3s16 node_min;
+	v3s16 node_max;
+	v3s16 full_node_min;
+	v3s16 full_node_max;
+
+	// Content required for generateBiomes
+	content_t c_stone;
+	content_t c_water_source;
+	content_t c_river_water_source;
+	content_t c_desert_stone;
+	content_t c_sandstone;
+
+	// Content required for generateDungeons
+	content_t c_cobble;
+	content_t c_stair_cobble;
+	content_t c_mossycobble;
+	content_t c_sandstonebrick;
+	content_t c_stair_sandstonebrick;
+
+	int ystride;
+	int zstride;
+	int zstride_1d;
+	int zstride_1u1d;
+
+	u32 spflags;
+
+	NoiseParams np_cave1;
+	NoiseParams np_cave2;
+	float cave_width;
 };
 
 #endif
diff --git a/src/mapgen_flat.cpp b/src/mapgen_flat.cpp
index 4669f17..cc120b5 100644
--- a/src/mapgen_flat.cpp
+++ b/src/mapgen_flat.cpp
@@ -49,75 +49,24 @@ FlagDesc flagdesc_mapgen_flat[] = {
 ///////////////////////////////////////////////////////////////////////////////////////
 
 
-MapgenFlat::MapgenFlat(int mapgenid, MapgenParams *params, EmergeManager *emerge)
-	: Mapgen(mapgenid, params, emerge)
+MapgenFlat::MapgenFlat(int mapgenid, MapgenFlatParams *params, EmergeManager *emerge)
+	: MapgenBasic(mapgenid, params, emerge)
 {
-	this->m_emerge = emerge;
-	this->bmgr     = emerge->biomemgr;
-
-	//// amount of elements to skip for the next index
-	//// for noise/height/biome maps (not vmanip)
-	this->ystride = csize.X;
-	// 1-down overgeneration
-	this->zstride_1d = csize.X * (csize.Y + 1);
-
-	this->biomemap        = new u8[csize.X * csize.Z];
-	this->heightmap       = new s16[csize.X * csize.Z];
-	this->heatmap         = NULL;
-	this->humidmap        = NULL;
-
-	MapgenFlatParams *sp = (MapgenFlatParams *)params->sparams;
-
-	this->spflags          = sp->spflags;
-	this->ground_level     = sp->ground_level;
-	this->large_cave_depth = sp->large_cave_depth;
-	this->cave_width       = sp->cave_width;
-	this->lake_threshold   = sp->lake_threshold;
-	this->lake_steepness   = sp->lake_steepness;
-	this->hill_threshold   = sp->hill_threshold;
-	this->hill_steepness   = sp->hill_steepness;
+	this->spflags          = params->spflags;
+	this->ground_level     = params->ground_level;
+	this->large_cave_depth = params->large_cave_depth;
+	this->cave_width       = params->cave_width;
+	this->lake_threshold   = params->lake_threshold;
+	this->lake_steepness   = params->lake_steepness;
+	this->hill_threshold   = params->hill_threshold;
+	this->hill_steepness   = params->hill_steepness;
 
 	//// 2D noise
-	noise_terrain      = new Noise(&sp->np_terrain,      seed, csize.X, csize.Z);
-	noise_filler_depth = new Noise(&sp->np_filler_depth, seed, csize.X, csize.Z);
-
-	//// 3D noise
-	// 1-down overgeneraion
-	noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y + 1, csize.Z);
-	noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y + 1, csize.Z);
-
-	//// Biome noise
-	noise_heat           = new Noise(&params->np_biome_heat,           seed, csize.X, csize.Z);
-	noise_humidity       = new Noise(&params->np_biome_humidity,       seed, csize.X, csize.Z);
-	noise_heat_blend     = new Noise(&params->np_biome_heat_blend,     seed, csize.X, csize.Z);
-	noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
-
-	//// Resolve nodes to be used
-	INodeDefManager *ndef = emerge->ndef;
-
-	c_stone                = ndef->getId("mapgen_stone");
-	c_water_source         = ndef->getId("mapgen_water_source");
-	c_lava_source          = ndef->getId("mapgen_lava_source");
-	c_desert_stone         = ndef->getId("mapgen_desert_stone");
-	c_ice                  = ndef->getId("mapgen_ice");
-	c_sandstone            = ndef->getId("mapgen_sandstone");
-
-	c_cobble               = ndef->getId("mapgen_cobble");
-	c_stair_cobble         = ndef->getId("mapgen_stair_cobble");
-	c_mossycobble          = ndef->getId("mapgen_mossycobble");
-	c_sandstonebrick       = ndef->getId("mapgen_sandstonebrick");
-	c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
-
-	if (c_ice == CONTENT_IGNORE)
-		c_ice = CONTENT_AIR;
-	if (c_mossycobble == CONTENT_IGNORE)
-		c_mossycobble = c_cobble;
-	if (c_stair_cobble == CONTENT_IGNORE)
-		c_stair_cobble = c_cobble;
-	if (c_sandstonebrick == CONTENT_IGNORE)
-		c_sandstonebrick = c_sandstone;
-	if (c_stair_sandstonebrick == CONTENT_IGNORE)
-		c_stair_sandstonebrick = c_sandstone;
+	noise_terrain      = new Noise(&params->np_terrain,      seed, csize.X, csize.Z);
+	noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
+
+	MapgenBasic::np_cave1 = params->np_cave1;
+	MapgenBasic::np_cave2 = params->np_cave2;
 }
 
 
@@ -125,16 +74,6 @@ MapgenFlat::~MapgenFlat()
 {
 	delete noise_terrain;
 	delete noise_filler_depth;
-	delete noise_cave1;
-	delete noise_cave2;
-
-	delete noise_heat;
-	delete noise_humidity;
-	delete noise_heat_blend;
-	delete noise_humidity_blend;
-
-	delete[] heightmap;
-	delete[] biomemap;
 }
 
 
@@ -143,7 +82,7 @@ MapgenFlatParams::MapgenFlatParams()
 	spflags          = 0;
 	ground_level     = 8;
 	large_cave_depth = -33;
-	cave_width       = 0.3;
+	cave_width       = 0.09;
 	lake_threshold   = -0.45;
 	lake_steepness   = 48.0;
 	hill_threshold   = 0.45;
@@ -151,8 +90,8 @@ MapgenFlatParams::MapgenFlatParams()
 
 	np_terrain      = NoiseParams(0, 1,   v3f(600, 600, 600), 7244,  5, 0.6, 2.0);
 	np_filler_depth = NoiseParams(0, 1.2, v3f(150, 150, 150), 261,   3, 0.7, 2.0);
-	np_cave1        = NoiseParams(0, 12,  v3f(96,  96,  96),  52534, 4, 0.5, 2.0);
-	np_cave2        = NoiseParams(0, 12,  v3f(96,  96,  96),  10325, 4, 0.5, 2.0);
+	np_cave1        = NoiseParams(0, 12,  v3f(61,  61,  61),  52534, 3, 0.5, 2.0);
+	np_cave2        = NoiseParams(0, 12,  v3f(67,  67,  67),  10325, 3, 0.5, 2.0);
 }
 
 
@@ -243,67 +182,21 @@ void MapgenFlat::makeChunk(BlockMakeData *data)
 
 	blockseed = getBlockSeed2(full_node_min, seed);
 
-	// Make some noise
-	calculateNoise();
-
 	// Generate base terrain, mountains, and ridges with initial heightmaps
 	s16 stone_surface_max_y = generateTerrain();
 
 	// Create heightmap
 	updateHeightmap(node_min, node_max);
 
-	// Create biomemap at heightmap surface
-	bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result,
-		noise_humidity->result, heightmap, biomemap);
-
-	// Actually place the biome-specific nodes
-	MgStoneType stone_type = generateBiomes(noise_heat->result, noise_humidity->result);
+	// Init biome generator, place biome-specific nodes, and build biomemap
+	biomegen->calcBiomeNoise(node_min);
+	MgStoneType stone_type = generateBiomes();
 
 	if (flags & MG_CAVES)
-		generateCaves(stone_surface_max_y);
-
-	if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
-		DungeonParams dp;
-
-		dp.np_rarity  = nparams_dungeon_rarity;
-		dp.np_density = nparams_dungeon_density;
-		dp.np_wetness = nparams_dungeon_wetness;
-		dp.c_water    = c_water_source;
-		if (stone_type == STONE) {
-			dp.c_cobble = c_cobble;
-			dp.c_moss   = c_mossycobble;
-			dp.c_stair  = c_stair_cobble;
-
-			dp.diagonal_dirs = false;
-			dp.mossratio     = 3.0;
-			dp.holesize      = v3s16(1, 2, 1);
-			dp.roomsize      = v3s16(0, 0, 0);
-			dp.notifytype    = GENNOTIFY_DUNGEON;
-		} else if (stone_type == DESERT_STONE) {
-			dp.c_cobble = c_desert_stone;
-			dp.c_moss   = c_desert_stone;
-			dp.c_stair  = c_desert_stone;
-
-			dp.diagonal_dirs = true;
-			dp.mossratio     = 0.0;
-			dp.holesize      = v3s16(2, 3, 2);
-			dp.roomsize      = v3s16(2, 5, 2);
-			dp.notifytype    = GENNOTIFY_TEMPLE;
-		} else if (stone_type == SANDSTONE) {
-			dp.c_cobble = c_sandstonebrick;
-			dp.c_moss   = c_sandstonebrick;
-			dp.c_stair  = c_sandstonebrick;
-
-			dp.diagonal_dirs = false;
-			dp.mossratio     = 0.0;
-			dp.holesize      = v3s16(2, 2, 2);
-			dp.roomsize      = v3s16(2, 0, 2);
-			dp.notifytype    = GENNOTIFY_DUNGEON;
-		}
+		generateCaves(stone_surface_max_y, large_cave_depth);
 
-		DungeonGen dgen(this, &dp);
-		dgen.generate(blockseed, full_node_min, full_node_max);
-	}
+	if (flags & MG_DUNGEONS)
+		generateDungeons(stone_surface_max_y, stone_type);
 
 	// Generate the registered decorations
 	if (flags & MG_DECORATIONS)
@@ -330,35 +223,6 @@ void MapgenFlat::makeChunk(BlockMakeData *data)
 }
 
 
-void MapgenFlat::calculateNoise()
-{
-	//TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
-	s16 x = node_min.X;
-	s16 z = node_min.Z;
-
-	if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS))
-		noise_terrain->perlinMap2D(x, z);
-
-	// Cave noises are calculated in generateCaves()
-	// only if solid terrain is present in mapchunk
-
-	noise_filler_depth->perlinMap2D(x, z);
-	noise_heat->perlinMap2D(x, z);
-	noise_humidity->perlinMap2D(x, z);
-	noise_heat_blend->perlinMap2D(x, z);
-	noise_humidity_blend->perlinMap2D(x, z);
-
-	for (s32 i = 0; i < csize.X * csize.Z; i++) {
-		noise_heat->result[i] += noise_heat_blend->result[i];
-		noise_humidity->result[i] += noise_humidity_blend->result[i];
-	}
-
-	heatmap = noise_heat->result;
-	humidmap = noise_humidity->result;
-	//printf("calculateNoise: %dus\n", t.stop());
-}
-
-
 s16 MapgenFlat::generateTerrain()
 {
 	MapNode n_air(CONTENT_AIR);
@@ -369,13 +233,14 @@ s16 MapgenFlat::generateTerrain()
 	s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
 	u32 ni2d = 0;
 
+	bool use_noise = (spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS);
+	if (use_noise)
+		noise_terrain->perlinMap2D(node_min.X, node_min.Z);
+
 	for (s16 z = node_min.Z; z <= node_max.Z; z++)
 	for (s16 x = node_min.X; x <= node_max.X; x++, ni2d++) {
 		s16 stone_level = ground_level;
-		float n_terrain = 0.0f;
-
-		if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS))
-			n_terrain = noise_terrain->result[ni2d];
+		float n_terrain = use_noise ? noise_terrain->result[ni2d] : 0.0f;
 
 		if ((spflags & MGFLAT_LAKES) && n_terrain < lake_threshold) {
 			s16 depress = (lake_threshold - n_terrain) * lake_steepness;
@@ -404,219 +269,3 @@ s16 MapgenFlat::generateTerrain()
 
 	return stone_surface_max_y;
 }
-
-
-MgStoneType MapgenFlat::generateBiomes(float *heat_map, float *humidity_map)
-{
-	v3s16 em = vm->m_area.getExtent();
-	u32 index = 0;
-	MgStoneType stone_type = STONE;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
-		Biome *biome = NULL;
-		u16 depth_top = 0;
-		u16 base_filler = 0;
-		u16 depth_water_top = 0;
-		u32 vi = vm->m_area.index(x, node_max.Y, z);
-
-		// Check node at base of mapchunk above, either a node of a previously
-		// generated mapchunk or if not, a node of overgenerated base terrain.
-		content_t c_above = vm->m_data[vi + em.X].getContent();
-		bool air_above = c_above == CONTENT_AIR;
-		bool water_above = c_above == c_water_source;
-
-		// If there is air or water above enable top/filler placement, otherwise force
-		// nplaced to stone level by setting a number exceeding any possible filler depth.
-		u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
-
-
-		for (s16 y = node_max.Y; y >= node_min.Y; y--) {
-			content_t c = vm->m_data[vi].getContent();
-
-			// Biome is recalculated each time an upper surface is detected while
-			// working down a column. The selected biome then remains in effect for
-			// all nodes below until the next surface and biome recalculation.
-			// Biome is recalculated:
-			// 1. At the surface of stone below air or water.
-			// 2. At the surface of water below air.
-			// 3. When stone or water is detected but biome has not yet been calculated.
-			if ((c == c_stone && (air_above || water_above || !biome)) ||
-					(c == c_water_source && (air_above || !biome))) {
-				biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
-				depth_top = biome->depth_top;
-				base_filler = MYMAX(depth_top + biome->depth_filler
-					+ noise_filler_depth->result[index], 0);
-				depth_water_top = biome->depth_water_top;
-
-				// Detect stone type for dungeons during every biome calculation.
-				// This is more efficient than detecting per-node and will not
-				// miss any desert stone or sandstone biomes.
-				if (biome->c_stone == c_desert_stone)
-					stone_type = DESERT_STONE;
-				else if (biome->c_stone == c_sandstone)
-					stone_type = SANDSTONE;
-			}
-
-			if (c == c_stone) {
-				content_t c_below = vm->m_data[vi - em.X].getContent();
-
-				// If the node below isn't solid, make this node stone, so that
-				// any top/filler nodes above are structurally supported.
-				// This is done by aborting the cycle of top/filler placement
-				// immediately by forcing nplaced to stone level.
-				if (c_below == CONTENT_AIR || c_below == c_water_source)
-					nplaced = U16_MAX;
-
-				if (nplaced < depth_top) {
-					vm->m_data[vi] = MapNode(biome->c_top);
-					nplaced++;
-				} else if (nplaced < base_filler) {
-					vm->m_data[vi] = MapNode(biome->c_filler);
-					nplaced++;
-				} else {
-					vm->m_data[vi] = MapNode(biome->c_stone);
-				}
-
-				air_above = false;
-				water_above = false;
-			} else if (c == c_water_source) {
-				vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top)) ?
-						biome->c_water_top : biome->c_water);
-				nplaced = 0;  // Enable top/filler placement for next surface
-				air_above = false;
-				water_above = true;
-			} else if (c == CONTENT_AIR) {
-				nplaced = 0;  // Enable top/filler placement for next surface
-				air_above = true;
-				water_above = false;
-			} else {  // Possible various nodes overgenerated from neighbouring mapchunks
-				nplaced = U16_MAX;  // Disable top/filler placement
-				air_above = false;
-				water_above = false;
-			}
-
-			vm->m_area.add_y(em, vi, -1);
-		}
-	}
-
-	return stone_type;
-}
-
-
-void MapgenFlat::dustTopNodes()
-{
-	if (node_max.Y < water_level)
-		return;
-
-	v3s16 em = vm->m_area.getExtent();
-	u32 index = 0;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
-		Biome *biome = (Biome *)bmgr->getRaw(biomemap[index]);
-
-		if (biome->c_dust == CONTENT_IGNORE)
-			continue;
-
-		u32 vi = vm->m_area.index(x, full_node_max.Y, z);
-		content_t c_full_max = vm->m_data[vi].getContent();
-		s16 y_start;
-
-		if (c_full_max == CONTENT_AIR) {
-			y_start = full_node_max.Y - 1;
-		} else if (c_full_max == CONTENT_IGNORE) {
-			vi = vm->m_area.index(x, node_max.Y + 1, z);
-			content_t c_max = vm->m_data[vi].getContent();
-
-			if (c_max == CONTENT_AIR)
-				y_start = node_max.Y;
-			else
-				continue;
-		} else {
-			continue;
-		}
-
-		vi = vm->m_area.index(x, y_start, z);
-		for (s16 y = y_start; y >= node_min.Y - 1; y--) {
-			if (vm->m_data[vi].getContent() != CONTENT_AIR)
-				break;
-
-			vm->m_area.add_y(em, vi, -1);
-		}
-
-		content_t c = vm->m_data[vi].getContent();
-		if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
-			vm->m_area.add_y(em, vi, 1);
-			vm->m_data[vi] = MapNode(biome->c_dust);
-		}
-	}
-}
-
-
-void MapgenFlat::generateCaves(s16 max_stone_y)
-{
-	if (max_stone_y < node_min.Y)
-		return;
-
-	noise_cave1->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-	noise_cave2->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-
-	v3s16 em = vm->m_area.getExtent();
-	u32 index2d = 0;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
-		bool column_is_open = false;  // Is column open to overground
-		bool is_tunnel = false;  // Is tunnel or tunnel floor
-		u32 vi = vm->m_area.index(x, node_max.Y, z);
-		u32 index3d = (z - node_min.Z) * zstride_1d + csize.Y * ystride +
-			(x - node_min.X);
-		// Biome of column
-		Biome *biome = (Biome *)bmgr->getRaw(biomemap[index2d]);
-
-		// Don't excavate the overgenerated stone at node_max.Y + 1,
-		// this creates a 'roof' over the tunnel, preventing light in
-		// tunnels at mapchunk borders when generating mapchunks upwards.
-		// This 'roof' is removed when the mapchunk above is generated.
-		for (s16 y = node_max.Y; y >= node_min.Y - 1; y--,
-				index3d -= ystride,
-				vm->m_area.add_y(em, vi, -1)) {
-
-			content_t c = vm->m_data[vi].getContent();
-			if (c == CONTENT_AIR || c == biome->c_water_top ||
-					c == biome->c_water) {
-				column_is_open = true;
-				continue;
-			}
-			// Ground
-			float d1 = contour(noise_cave1->result[index3d]);
-			float d2 = contour(noise_cave2->result[index3d]);
-
-			if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) {
-				// In tunnel and ground content, excavate
-				vm->m_data[vi] = MapNode(CONTENT_AIR);
-				is_tunnel = true;
-			} else {
-				// Not in tunnel or not ground content
-				if (is_tunnel && column_is_open &&
-						(c == biome->c_filler || c == biome->c_stone))
-					// Tunnel entrance floor
-					vm->m_data[vi] = MapNode(biome->c_top);
-
-				column_is_open = false;
-				is_tunnel = false;
-			}
-		}
-	}
-
-	if (node_max.Y > large_cave_depth)
-		return;
-
-	PseudoRandom ps(blockseed + 21343);
-	u32 bruises_count = ps.range(0, 2);
-	for (u32 i = 0; i < bruises_count; i++) {
-		CaveV5 cave(this, &ps);
-		cave.makeCave(node_min, node_max, max_stone_y);
-	}
-}
diff --git a/src/mapgen_flat.h b/src/mapgen_flat.h
index 8aed09b..8b3de2b 100644
--- a/src/mapgen_flat.h
+++ b/src/mapgen_flat.h
@@ -32,7 +32,7 @@ class BiomeManager;
 extern FlagDesc flagdesc_mapgen_flat[];
 
 
-struct MapgenFlatParams : public MapgenSpecificParams {
+struct MapgenFlatParams : public MapgenParams {
 	u32 spflags;
 	s16 ground_level;
 	s16 large_cave_depth;
@@ -53,72 +53,25 @@ struct MapgenFlatParams : public MapgenSpecificParams {
 	void writeParams(Settings *settings) const;
 };
 
-class MapgenFlat : public Mapgen {
+class MapgenFlat : public MapgenBasic {
 public:
-	EmergeManager *m_emerge;
-	BiomeManager *bmgr;
+	MapgenFlat(int mapgenid, MapgenFlatParams *params, EmergeManager *emerge);
+	~MapgenFlat();
 
-	int ystride;
-	int zstride_1d;
+	virtual MapgenType getType() const { return MAPGEN_FLAT; }
 
-	v3s16 node_min;
-	v3s16 node_max;
-	v3s16 full_node_min;
-	v3s16 full_node_max;
+	virtual void makeChunk(BlockMakeData *data);
+	int getSpawnLevelAtPoint(v2s16 p);
+	s16 generateTerrain();
 
-	u32 spflags;
+private:
 	s16 ground_level;
 	s16 large_cave_depth;
-	float cave_width;
 	float lake_threshold;
 	float lake_steepness;
 	float hill_threshold;
 	float hill_steepness;
 	Noise *noise_terrain;
-	Noise *noise_filler_depth;
-	Noise *noise_cave1;
-	Noise *noise_cave2;
-
-	Noise *noise_heat;
-	Noise *noise_humidity;
-	Noise *noise_heat_blend;
-	Noise *noise_humidity_blend;
-
-	content_t c_stone;
-	content_t c_water_source;
-	content_t c_lava_source;
-	content_t c_desert_stone;
-	content_t c_ice;
-	content_t c_sandstone;
-
-	content_t c_cobble;
-	content_t c_stair_cobble;
-	content_t c_mossycobble;
-	content_t c_sandstonebrick;
-	content_t c_stair_sandstonebrick;
-
-	MapgenFlat(int mapgenid, MapgenParams *params, EmergeManager *emerge);
-	~MapgenFlat();
-
-	virtual void makeChunk(BlockMakeData *data);
-	int getSpawnLevelAtPoint(v2s16 p);
-	void calculateNoise();
-	s16 generateTerrain();
-	MgStoneType generateBiomes(float *heat_map, float *humidity_map);
-	void dustTopNodes();
-	void generateCaves(s16 max_stone_y);
-};
-
-struct MapgenFactoryFlat : public MapgenFactory {
-	Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
-	{
-		return new MapgenFlat(mgid, params, emerge);
-	};
-
-	MapgenSpecificParams *createMapgenParams()
-	{
-		return new MapgenFlatParams();
-	};
 };
 
 #endif
diff --git a/src/mapgen_fractal.cpp b/src/mapgen_fractal.cpp
index e2e29f8..a6ed18a 100644
--- a/src/mapgen_fractal.cpp
+++ b/src/mapgen_fractal.cpp
@@ -47,81 +47,30 @@ FlagDesc flagdesc_mapgen_fractal[] = {
 ///////////////////////////////////////////////////////////////////////////////////////
 
 
-MapgenFractal::MapgenFractal(int mapgenid, MapgenParams *params, EmergeManager *emerge)
-	: Mapgen(mapgenid, params, emerge)
+MapgenFractal::MapgenFractal(int mapgenid, MapgenFractalParams *params, EmergeManager *emerge)
+	: MapgenBasic(mapgenid, params, emerge)
 {
-	this->m_emerge = emerge;
-	this->bmgr     = emerge->biomemgr;
-
-	//// amount of elements to skip for the next index
-	//// for noise/height/biome maps (not vmanip)
-	this->ystride = csize.X;
-	// 1-down overgeneration
-	this->zstride_1d = csize.X * (csize.Y + 1);
-
-	this->biomemap  = new u8[csize.X * csize.Z];
-	this->heightmap = new s16[csize.X * csize.Z];
-	this->heatmap   = NULL;
-	this->humidmap  = NULL;
-
-	MapgenFractalParams *sp = (MapgenFractalParams *)params->sparams;
-
-	this->spflags    = sp->spflags;
-	this->cave_width = sp->cave_width;
-	this->fractal    = sp->fractal;
-	this->iterations = sp->iterations;
-	this->scale      = sp->scale;
-	this->offset     = sp->offset;
-	this->slice_w    = sp->slice_w;
-	this->julia_x    = sp->julia_x;
-	this->julia_y    = sp->julia_y;
-	this->julia_z    = sp->julia_z;
-	this->julia_w    = sp->julia_w;
+	this->spflags    = params->spflags;
+	this->cave_width = params->cave_width;
+	this->fractal    = params->fractal;
+	this->iterations = params->iterations;
+	this->scale      = params->scale;
+	this->offset     = params->offset;
+	this->slice_w    = params->slice_w;
+	this->julia_x    = params->julia_x;
+	this->julia_y    = params->julia_y;
+	this->julia_z    = params->julia_z;
+	this->julia_w    = params->julia_w;
 
 	//// 2D terrain noise
-	noise_seabed       = new Noise(&sp->np_seabed, seed, csize.X, csize.Z);
-	noise_filler_depth = new Noise(&sp->np_filler_depth, seed, csize.X, csize.Z);
+	noise_seabed       = new Noise(&params->np_seabed, seed, csize.X, csize.Z);
+	noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
 
-	//// 3D terrain noise
-	// 1-down overgeneraion
-	noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y + 1, csize.Z);
-	noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y + 1, csize.Z);
-
-	//// Biome noise
-	noise_heat           = new Noise(&params->np_biome_heat,           seed, csize.X, csize.Z);
-	noise_humidity       = new Noise(&params->np_biome_humidity,       seed, csize.X, csize.Z);
-	noise_heat_blend     = new Noise(&params->np_biome_heat_blend,     seed, csize.X, csize.Z);
-	noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
+	MapgenBasic::np_cave1 = params->np_cave1;
+	MapgenBasic::np_cave2 = params->np_cave2;
 
 	this->formula = fractal / 2 + fractal % 2;
 	this->julia   = fractal % 2 == 0;
-
-	//// Resolve nodes to be used
-	INodeDefManager *ndef = emerge->ndef;
-
-	c_stone                = ndef->getId("mapgen_stone");
-	c_water_source         = ndef->getId("mapgen_water_source");
-	c_lava_source          = ndef->getId("mapgen_lava_source");
-	c_desert_stone         = ndef->getId("mapgen_desert_stone");
-	c_ice                  = ndef->getId("mapgen_ice");
-	c_sandstone            = ndef->getId("mapgen_sandstone");
-
-	c_cobble               = ndef->getId("mapgen_cobble");
-	c_stair_cobble         = ndef->getId("mapgen_stair_cobble");
-	c_mossycobble          = ndef->getId("mapgen_mossycobble");
-	c_sandstonebrick       = ndef->getId("mapgen_sandstonebrick");
-	c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
-
-	if (c_ice == CONTENT_IGNORE)
-		c_ice = CONTENT_AIR;
-	if (c_mossycobble == CONTENT_IGNORE)
-		c_mossycobble = c_cobble;
-	if (c_stair_cobble == CONTENT_IGNORE)
-		c_stair_cobble = c_cobble;
-	if (c_sandstonebrick == CONTENT_IGNORE)
-		c_sandstonebrick = c_sandstone;
-	if (c_stair_sandstonebrick == CONTENT_IGNORE)
-		c_stair_sandstonebrick = c_sandstone;
 }
 
 
@@ -129,23 +78,13 @@ MapgenFractal::~MapgenFractal()
 {
 	delete noise_seabed;
 	delete noise_filler_depth;
-	delete noise_cave1;
-	delete noise_cave2;
-
-	delete noise_heat;
-	delete noise_humidity;
-	delete noise_heat_blend;
-	delete noise_humidity_blend;
-
-	delete[] heightmap;
-	delete[] biomemap;
 }
 
 
 MapgenFractalParams::MapgenFractalParams()
 {
 	spflags    = 0;
-	cave_width = 0.3;
+	cave_width = 0.09;
 	fractal    = 1;
 	iterations = 11;
 	scale      = v3f(4096.0, 1024.0, 4096.0);
@@ -158,8 +97,8 @@ MapgenFractalParams::MapgenFractalParams()
 
 	np_seabed       = NoiseParams(-14, 9,   v3f(600, 600, 600), 41900, 5, 0.6, 2.0);
 	np_filler_depth = NoiseParams(0,   1.2, v3f(150, 150, 150), 261,   3, 0.7, 2.0);
-	np_cave1        = NoiseParams(0,   12,  v3f(96,  96,  96),  52534, 4, 0.5, 2.0);
-	np_cave2        = NoiseParams(0,   12,  v3f(96,  96,  96),  10325, 4, 0.5, 2.0);
+	np_cave1        = NoiseParams(0,   12,  v3f(61,  61,  61),  52534, 3, 0.5, 2.0);
+	np_cave2        = NoiseParams(0,   12,  v3f(67,  67,  67),  10325, 3, 0.5, 2.0);
 }
 
 
@@ -217,7 +156,7 @@ int MapgenFractal::getSpawnLevelAtPoint(v2s16 p)
 	s16 search_start = MYMAX(seabed_level, water_level + 1);
 	if (seabed_level > water_level)
 		solid_below = true;
-		
+
 	for (s16 y = search_start; y <= search_start + 128; y++) {
 		if (getFractalAtPoint(p.X, y, p.Y)) {  // Fractal node
 			solid_below = true;
@@ -259,67 +198,21 @@ void MapgenFractal::makeChunk(BlockMakeData *data)
 
 	blockseed = getBlockSeed2(full_node_min, seed);
 
-	// Make some noise
-	calculateNoise();
-
 	// Generate base terrain, mountains, and ridges with initial heightmaps
 	s16 stone_surface_max_y = generateTerrain();
 
 	// Create heightmap
 	updateHeightmap(node_min, node_max);
 
-	// Create biomemap at heightmap surface
-	bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result,
-		noise_humidity->result, heightmap, biomemap);
-
-	// Actually place the biome-specific nodes
-	MgStoneType stone_type = generateBiomes(noise_heat->result, noise_humidity->result);
+	// Init biome generator, place biome-specific nodes, and build biomemap
+	biomegen->calcBiomeNoise(node_min);
+	MgStoneType stone_type = generateBiomes();
 
 	if (flags & MG_CAVES)
-		generateCaves(stone_surface_max_y);
-
-	if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
-		DungeonParams dp;
-
-		dp.np_rarity  = nparams_dungeon_rarity;
-		dp.np_density = nparams_dungeon_density;
-		dp.np_wetness = nparams_dungeon_wetness;
-		dp.c_water    = c_water_source;
-		if (stone_type == STONE) {
-			dp.c_cobble = c_cobble;
-			dp.c_moss   = c_mossycobble;
-			dp.c_stair  = c_stair_cobble;
-
-			dp.diagonal_dirs = false;
-			dp.mossratio     = 3.0;
-			dp.holesize      = v3s16(1, 2, 1);
-			dp.roomsize      = v3s16(0, 0, 0);
-			dp.notifytype    = GENNOTIFY_DUNGEON;
-		} else if (stone_type == DESERT_STONE) {
-			dp.c_cobble = c_desert_stone;
-			dp.c_moss   = c_desert_stone;
-			dp.c_stair  = c_desert_stone;
-
-			dp.diagonal_dirs = true;
-			dp.mossratio     = 0.0;
-			dp.holesize      = v3s16(2, 3, 2);
-			dp.roomsize      = v3s16(2, 5, 2);
-			dp.notifytype    = GENNOTIFY_TEMPLE;
-		} else if (stone_type == SANDSTONE) {
-			dp.c_cobble = c_sandstonebrick;
-			dp.c_moss   = c_sandstonebrick;
-			dp.c_stair  = c_sandstonebrick;
-
-			dp.diagonal_dirs = false;
-			dp.mossratio     = 0.0;
-			dp.holesize      = v3s16(2, 2, 2);
-			dp.roomsize      = v3s16(2, 0, 2);
-			dp.notifytype    = GENNOTIFY_DUNGEON;
-		}
+		generateCaves(stone_surface_max_y, MGFRACTAL_LARGE_CAVE_DEPTH);
 
-		DungeonGen dgen(this, &dp);
-		dgen.generate(blockseed, full_node_min, full_node_max);
-	}
+	if (flags & MG_DUNGEONS)
+		generateDungeons(stone_surface_max_y, stone_type);
 
 	// Generate the registered decorations
 	if (flags & MG_DECORATIONS)
@@ -346,34 +239,6 @@ void MapgenFractal::makeChunk(BlockMakeData *data)
 }
 
 
-void MapgenFractal::calculateNoise()
-{
-	//TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
-	s16 x = node_min.X;
-	s16 z = node_min.Z;
-
-	noise_seabed->perlinMap2D(x, z);
-
-	// Cave noises are calculated in generateCaves()
-	// only if solid terrain is present in mapchunk
-
-	noise_filler_depth->perlinMap2D(x, z);
-	noise_heat->perlinMap2D(x, z);
-	noise_humidity->perlinMap2D(x, z);
-	noise_heat_blend->perlinMap2D(x, z);
-	noise_humidity_blend->perlinMap2D(x, z);
-
-	for (s32 i = 0; i < csize.X * csize.Z; i++) {
-		noise_heat->result[i] += noise_heat_blend->result[i];
-		noise_humidity->result[i] += noise_humidity_blend->result[i];
-	}
-
-	heatmap = noise_heat->result;
-	humidmap = noise_humidity->result;
-	//printf("calculateNoise: %dus\n", t.stop());
-}
-
-
 bool MapgenFractal::getFractalAtPoint(s16 x, s16 y, s16 z)
 {
 	float cx, cy, cz, cw, ox, oy, oz, ow;
@@ -503,6 +368,8 @@ s16 MapgenFractal::generateTerrain()
 	s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
 	u32 index2d = 0;
 
+	noise_seabed->perlinMap2D(node_min.X, node_min.Z);
+
 	for (s16 z = node_min.Z; z <= node_max.Z; z++) {
 		for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
 			u32 vi = vm->m_area.index(node_min.X, y, z);
@@ -528,219 +395,3 @@ s16 MapgenFractal::generateTerrain()
 
 	return stone_surface_max_y;
 }
-
-
-MgStoneType MapgenFractal::generateBiomes(float *heat_map, float *humidity_map)
-{
-	v3s16 em = vm->m_area.getExtent();
-	u32 index = 0;
-	MgStoneType stone_type = STONE;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
-		Biome *biome = NULL;
-		u16 depth_top = 0;
-		u16 base_filler = 0;
-		u16 depth_water_top = 0;
-		u32 vi = vm->m_area.index(x, node_max.Y, z);
-
-		// Check node at base of mapchunk above, either a node of a previously
-		// generated mapchunk or if not, a node of overgenerated base terrain.
-		content_t c_above = vm->m_data[vi + em.X].getContent();
-		bool air_above = c_above == CONTENT_AIR;
-		bool water_above = c_above == c_water_source;
-
-		// If there is air or water above enable top/filler placement, otherwise force
-		// nplaced to stone level by setting a number exceeding any possible filler depth.
-		u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
-
-
-		for (s16 y = node_max.Y; y >= node_min.Y; y--) {
-			content_t c = vm->m_data[vi].getContent();
-
-			// Biome is recalculated each time an upper surface is detected while
-			// working down a column. The selected biome then remains in effect for
-			// all nodes below until the next surface and biome recalculation.
-			// Biome is recalculated:
-			// 1. At the surface of stone below air or water.
-			// 2. At the surface of water below air.
-			// 3. When stone or water is detected but biome has not yet been calculated.
-			if ((c == c_stone && (air_above || water_above || !biome)) ||
-					(c == c_water_source && (air_above || !biome))) {
-				biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
-				depth_top = biome->depth_top;
-				base_filler = MYMAX(depth_top + biome->depth_filler
-					+ noise_filler_depth->result[index], 0);
-				depth_water_top = biome->depth_water_top;
-
-				// Detect stone type for dungeons during every biome calculation.
-				// This is more efficient than detecting per-node and will not
-				// miss any desert stone or sandstone biomes.
-				if (biome->c_stone == c_desert_stone)
-					stone_type = DESERT_STONE;
-				else if (biome->c_stone == c_sandstone)
-					stone_type = SANDSTONE;
-			}
-
-			if (c == c_stone) {
-				content_t c_below = vm->m_data[vi - em.X].getContent();
-
-				// If the node below isn't solid, make this node stone, so that
-				// any top/filler nodes above are structurally supported.
-				// This is done by aborting the cycle of top/filler placement
-				// immediately by forcing nplaced to stone level.
-				if (c_below == CONTENT_AIR || c_below == c_water_source)
-					nplaced = U16_MAX;
-
-				if (nplaced < depth_top) {
-					vm->m_data[vi] = MapNode(biome->c_top);
-					nplaced++;
-				} else if (nplaced < base_filler) {
-					vm->m_data[vi] = MapNode(biome->c_filler);
-					nplaced++;
-				} else {
-					vm->m_data[vi] = MapNode(biome->c_stone);
-				}
-
-				air_above = false;
-				water_above = false;
-			} else if (c == c_water_source) {
-				vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top)) ?
-						biome->c_water_top : biome->c_water);
-				nplaced = 0;  // Enable top/filler placement for next surface
-				air_above = false;
-				water_above = true;
-			} else if (c == CONTENT_AIR) {
-				nplaced = 0;  // Enable top/filler placement for next surface
-				air_above = true;
-				water_above = false;
-			} else {  // Possible various nodes overgenerated from neighbouring mapchunks
-				nplaced = U16_MAX;  // Disable top/filler placement
-				air_above = false;
-				water_above = false;
-			}
-
-			vm->m_area.add_y(em, vi, -1);
-		}
-	}
-
-	return stone_type;
-}
-
-
-void MapgenFractal::dustTopNodes()
-{
-	if (node_max.Y < water_level)
-		return;
-
-	v3s16 em = vm->m_area.getExtent();
-	u32 index = 0;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
-		Biome *biome = (Biome *)bmgr->getRaw(biomemap[index]);
-
-		if (biome->c_dust == CONTENT_IGNORE)
-			continue;
-
-		u32 vi = vm->m_area.index(x, full_node_max.Y, z);
-		content_t c_full_max = vm->m_data[vi].getContent();
-		s16 y_start;
-
-		if (c_full_max == CONTENT_AIR) {
-			y_start = full_node_max.Y - 1;
-		} else if (c_full_max == CONTENT_IGNORE) {
-			vi = vm->m_area.index(x, node_max.Y + 1, z);
-			content_t c_max = vm->m_data[vi].getContent();
-
-			if (c_max == CONTENT_AIR)
-				y_start = node_max.Y;
-			else
-				continue;
-		} else {
-			continue;
-		}
-
-		vi = vm->m_area.index(x, y_start, z);
-		for (s16 y = y_start; y >= node_min.Y - 1; y--) {
-			if (vm->m_data[vi].getContent() != CONTENT_AIR)
-				break;
-
-			vm->m_area.add_y(em, vi, -1);
-		}
-
-		content_t c = vm->m_data[vi].getContent();
-		if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
-			vm->m_area.add_y(em, vi, 1);
-			vm->m_data[vi] = MapNode(biome->c_dust);
-		}
-	}
-}
-
-
-void MapgenFractal::generateCaves(s16 max_stone_y)
-{
-	if (max_stone_y < node_min.Y)
-		return;
-
-	noise_cave1->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-	noise_cave2->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-
-	v3s16 em = vm->m_area.getExtent();
-	u32 index2d = 0;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
-		bool column_is_open = false;  // Is column open to overground
-		bool is_tunnel = false;  // Is tunnel or tunnel floor
-		u32 vi = vm->m_area.index(x, node_max.Y, z);
-		u32 index3d = (z - node_min.Z) * zstride_1d + csize.Y * ystride +
-			(x - node_min.X);
-		// Biome of column
-		Biome *biome = (Biome *)bmgr->getRaw(biomemap[index2d]);
-
-		// Don't excavate the overgenerated stone at node_max.Y + 1,
-		// this creates a 'roof' over the tunnel, preventing light in
-		// tunnels at mapchunk borders when generating mapchunks upwards.
-		// This 'roof' is removed when the mapchunk above is generated.
-		for (s16 y = node_max.Y; y >= node_min.Y - 1; y--,
-				index3d -= ystride,
-				vm->m_area.add_y(em, vi, -1)) {
-
-			content_t c = vm->m_data[vi].getContent();
-			if (c == CONTENT_AIR || c == biome->c_water_top ||
-					c == biome->c_water) {
-				column_is_open = true;
-				continue;
-			}
-			// Ground
-			float d1 = contour(noise_cave1->result[index3d]);
-			float d2 = contour(noise_cave2->result[index3d]);
-
-			if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) {
-				// In tunnel and ground content, excavate
-				vm->m_data[vi] = MapNode(CONTENT_AIR);
-				is_tunnel = true;
-			} else {
-				// Not in tunnel or not ground content
-				if (is_tunnel && column_is_open &&
-						(c == biome->c_filler || c == biome->c_stone))
-					// Tunnel entrance floor
-					vm->m_data[vi] = MapNode(biome->c_top);
-
-				column_is_open = false;
-				is_tunnel = false;
-			}
-		}
-	}
-
-	if (node_max.Y > MGFRACTAL_LARGE_CAVE_DEPTH)
-		return;
-
-	PseudoRandom ps(blockseed + 21343);
-	u32 bruises_count = ps.range(0, 2);
-	for (u32 i = 0; i < bruises_count; i++) {
-		CaveV5 cave(this, &ps);
-		cave.makeCave(node_min, node_max, max_stone_y);
-	}
-}
diff --git a/src/mapgen_fractal.h b/src/mapgen_fractal.h
index dd96045..3331848 100644
--- a/src/mapgen_fractal.h
+++ b/src/mapgen_fractal.h
@@ -33,7 +33,7 @@ class BiomeManager;
 extern FlagDesc flagdesc_mapgen_fractal[];
 
 
-struct MapgenFractalParams : public MapgenSpecificParams {
+struct MapgenFractalParams : public MapgenParams {
 	u32 spflags;
 	float cave_width;
 	u16 fractal;
@@ -57,23 +57,22 @@ struct MapgenFractalParams : public MapgenSpecificParams {
 	void writeParams(Settings *settings) const;
 };
 
-class MapgenFractal : public Mapgen {
+class MapgenFractal : public MapgenBasic {
 public:
-	EmergeManager *m_emerge;
-	BiomeManager *bmgr;
+	MapgenFractal(int mapgenid, MapgenFractalParams *params, EmergeManager *emerge);
+	~MapgenFractal();
+
+	virtual MapgenType getType() const { return MAPGEN_FRACTAL; }
+
+	virtual void makeChunk(BlockMakeData *data);
+	int getSpawnLevelAtPoint(v2s16 p);
+	bool getFractalAtPoint(s16 x, s16 y, s16 z);
+	s16 generateTerrain();
 
-	int ystride;
-	int zstride_1d;
+private:
 	u16 formula;
 	bool julia;
 
-	v3s16 node_min;
-	v3s16 node_max;
-	v3s16 full_node_min;
-	v3s16 full_node_max;
-
-	u32 spflags;
-	float cave_width;
 	u16 fractal;
 	u16 iterations;
 	v3f scale;
@@ -84,51 +83,6 @@ public:
 	float julia_z;
 	float julia_w;
 	Noise *noise_seabed;
-	Noise *noise_filler_depth;
-	Noise *noise_cave1;
-	Noise *noise_cave2;
-
-	Noise *noise_heat;
-	Noise *noise_humidity;
-	Noise *noise_heat_blend;
-	Noise *noise_humidity_blend;
-
-	content_t c_stone;
-	content_t c_water_source;
-	content_t c_lava_source;
-	content_t c_desert_stone;
-	content_t c_ice;
-	content_t c_sandstone;
-
-	content_t c_cobble;
-	content_t c_stair_cobble;
-	content_t c_mossycobble;
-	content_t c_sandstonebrick;
-	content_t c_stair_sandstonebrick;
-
-	MapgenFractal(int mapgenid, MapgenParams *params, EmergeManager *emerge);
-	~MapgenFractal();
-
-	virtual void makeChunk(BlockMakeData *data);
-	int getSpawnLevelAtPoint(v2s16 p);
-	void calculateNoise();
-	bool getFractalAtPoint(s16 x, s16 y, s16 z);
-	s16 generateTerrain();
-	MgStoneType generateBiomes(float *heat_map, float *humidity_map);
-	void dustTopNodes();
-	void generateCaves(s16 max_stone_y);
-};
-
-struct MapgenFactoryFractal : public MapgenFactory {
-	Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
-	{
-		return new MapgenFractal(mgid, params, emerge);
-	};
-
-	MapgenSpecificParams *createMapgenParams()
-	{
-		return new MapgenFractalParams();
-	};
 };
 
 #endif
diff --git a/src/mapgen_singlenode.h b/src/mapgen_singlenode.h
index 2c6496c..0752013 100644
--- a/src/mapgen_singlenode.h
+++ b/src/mapgen_singlenode.h
@@ -22,11 +22,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "mapgen.h"
 
-struct MapgenSinglenodeParams : public MapgenSpecificParams {
-	
+struct MapgenSinglenodeParams : public MapgenParams {
 	MapgenSinglenodeParams() {}
 	~MapgenSinglenodeParams() {}
-	
+
 	void readParams(const Settings *settings) {}
 	void writeParams(Settings *settings) const {}
 };
@@ -39,19 +38,11 @@ public:
 
 	MapgenSinglenode(int mapgenid, MapgenParams *params, EmergeManager *emerge);
 	~MapgenSinglenode();
-	
+
+	virtual MapgenType getType() const { return MAPGEN_SINGLENODE; }
+
 	void makeChunk(BlockMakeData *data);
 	int getSpawnLevelAtPoint(v2s16 p);
 };
 
-struct MapgenFactorySinglenode : public MapgenFactory {
-	Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge) {
-		return new MapgenSinglenode(mgid, params, emerge);
-	};
-	
-	MapgenSpecificParams *createMapgenParams() {
-		return new MapgenSinglenodeParams();
-	};
-};
-
 #endif
diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp
index b98acb9..9f189e2 100644
--- a/src/mapgen_v5.cpp
+++ b/src/mapgen_v5.cpp
@@ -45,72 +45,23 @@ FlagDesc flagdesc_mapgen_v5[] = {
 };
 
 
-MapgenV5::MapgenV5(int mapgenid, MapgenParams *params, EmergeManager *emerge)
-	: Mapgen(mapgenid, params, emerge)
+MapgenV5::MapgenV5(int mapgenid, MapgenV5Params *params, EmergeManager *emerge)
+	: MapgenBasic(mapgenid, params, emerge)
 {
-	this->m_emerge = emerge;
-	this->bmgr     = emerge->biomemgr;
-
-	// amount of elements to skip for the next index
-	// for noise/height/biome maps (not vmanip)
-	this->ystride = csize.X;
-	// 1-down overgeneration
-	this->zstride_1d = csize.X * (csize.Y + 1);
-
-	this->biomemap  = new u8[csize.X * csize.Z];
-	this->heightmap = new s16[csize.X * csize.Z];
-	this->heatmap   = NULL;
-	this->humidmap  = NULL;
-
-	MapgenV5Params *sp = (MapgenV5Params *)params->sparams;
-
-	this->spflags    = sp->spflags;
-	this->cave_width = sp->cave_width;
+	this->spflags    = params->spflags;
+	this->cave_width = params->cave_width;
 
 	// Terrain noise
-	noise_filler_depth = new Noise(&sp->np_filler_depth, seed, csize.X, csize.Z);
-	noise_factor       = new Noise(&sp->np_factor,       seed, csize.X, csize.Z);
-	noise_height       = new Noise(&sp->np_height,       seed, csize.X, csize.Z);
+	noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
+	noise_factor       = new Noise(&params->np_factor,       seed, csize.X, csize.Z);
+	noise_height       = new Noise(&params->np_height,       seed, csize.X, csize.Z);
 
 	// 3D terrain noise
 	// 1-up 1-down overgeneration
-	noise_ground = new Noise(&sp->np_ground, seed, csize.X, csize.Y + 2, csize.Z);
-	// 1-down overgeneraion
-	noise_cave1  = new Noise(&sp->np_cave1,  seed, csize.X, csize.Y + 1, csize.Z);
-	noise_cave2  = new Noise(&sp->np_cave2,  seed, csize.X, csize.Y + 1, csize.Z);
-
-	// Biome noise
-	noise_heat           = new Noise(&params->np_biome_heat,           seed, csize.X, csize.Z);
-	noise_humidity       = new Noise(&params->np_biome_humidity,       seed, csize.X, csize.Z);
-	noise_heat_blend     = new Noise(&params->np_biome_heat_blend,     seed, csize.X, csize.Z);
-	noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
-
-	//// Resolve nodes to be used
-	INodeDefManager *ndef = emerge->ndef;
-
-	c_stone                = ndef->getId("mapgen_stone");
-	c_water_source         = ndef->getId("mapgen_water_source");
-	c_lava_source          = ndef->getId("mapgen_lava_source");
-	c_desert_stone         = ndef->getId("mapgen_desert_stone");
-	c_ice                  = ndef->getId("mapgen_ice");
-	c_sandstone            = ndef->getId("mapgen_sandstone");
-
-	c_cobble               = ndef->getId("mapgen_cobble");
-	c_stair_cobble         = ndef->getId("mapgen_stair_cobble");
-	c_mossycobble          = ndef->getId("mapgen_mossycobble");
-	c_sandstonebrick       = ndef->getId("mapgen_sandstonebrick");
-	c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
-
-	if (c_ice == CONTENT_IGNORE)
-		c_ice = CONTENT_AIR;
-	if (c_mossycobble == CONTENT_IGNORE)
-		c_mossycobble = c_cobble;
-	if (c_stair_cobble == CONTENT_IGNORE)
-		c_stair_cobble = c_cobble;
-	if (c_sandstonebrick == CONTENT_IGNORE)
-		c_sandstonebrick = c_sandstone;
-	if (c_stair_sandstonebrick == CONTENT_IGNORE)
-		c_stair_sandstonebrick = c_sandstone;
+	noise_ground = new Noise(&params->np_ground, seed, csize.X, csize.Y + 2, csize.Z);
+
+	MapgenBasic::np_cave1 = params->np_cave1;
+	MapgenBasic::np_cave2 = params->np_cave2;
 }
 
 
@@ -119,17 +70,7 @@ MapgenV5::~MapgenV5()
 	delete noise_filler_depth;
 	delete noise_factor;
 	delete noise_height;
-	delete noise_cave1;
-	delete noise_cave2;
 	delete noise_ground;
-
-	delete noise_heat;
-	delete noise_humidity;
-	delete noise_heat_blend;
-	delete noise_humidity_blend;
-
-	delete[] heightmap;
-	delete[] biomemap;
 }
 
 
@@ -239,69 +180,23 @@ void MapgenV5::makeChunk(BlockMakeData *data)
 	// Create a block-specific seed
 	blockseed = getBlockSeed2(full_node_min, seed);
 
-	// Make some noise
-	calculateNoise();
-
 	// Generate base terrain
 	s16 stone_surface_max_y = generateBaseTerrain();
 
 	// Create heightmap
 	updateHeightmap(node_min, node_max);
 
-	// Create biomemap at heightmap surface
-	bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result,
-		noise_humidity->result, heightmap, biomemap);
-
-	// Actually place the biome-specific nodes
-	MgStoneType stone_type = generateBiomes(noise_heat->result, noise_humidity->result);
+	// Init biome generator, place biome-specific nodes, and build biomemap
+	biomegen->calcBiomeNoise(node_min);
+	MgStoneType stone_type = generateBiomes();
 
 	// Generate caves
 	if ((flags & MG_CAVES) && (stone_surface_max_y >= node_min.Y))
-		generateCaves(stone_surface_max_y);
+		generateCaves(stone_surface_max_y, MGV5_LARGE_CAVE_DEPTH);
 
 	// Generate dungeons and desert temples
-	if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
-		DungeonParams dp;
-
-		dp.np_rarity  = nparams_dungeon_rarity;
-		dp.np_density = nparams_dungeon_density;
-		dp.np_wetness = nparams_dungeon_wetness;
-		dp.c_water    = c_water_source;
-		if (stone_type == STONE) {
-			dp.c_cobble = c_cobble;
-			dp.c_moss   = c_mossycobble;
-			dp.c_stair  = c_stair_cobble;
-
-			dp.diagonal_dirs = false;
-			dp.mossratio     = 3.0;
-			dp.holesize      = v3s16(1, 2, 1);
-			dp.roomsize      = v3s16(0, 0, 0);
-			dp.notifytype    = GENNOTIFY_DUNGEON;
-		} else if (stone_type == DESERT_STONE) {
-			dp.c_cobble = c_desert_stone;
-			dp.c_moss   = c_desert_stone;
-			dp.c_stair  = c_desert_stone;
-
-			dp.diagonal_dirs = true;
-			dp.mossratio     = 0.0;
-			dp.holesize      = v3s16(2, 3, 2);
-			dp.roomsize      = v3s16(2, 5, 2);
-			dp.notifytype    = GENNOTIFY_TEMPLE;
-		} else if (stone_type == SANDSTONE) {
-			dp.c_cobble = c_sandstonebrick;
-			dp.c_moss   = c_sandstonebrick;
-			dp.c_stair  = c_sandstonebrick;
-
-			dp.diagonal_dirs = false;
-			dp.mossratio     = 0.0;
-			dp.holesize      = v3s16(2, 2, 2);
-			dp.roomsize      = v3s16(2, 0, 2);
-			dp.notifytype    = GENNOTIFY_DUNGEON;
-		}
-
-		DungeonGen dgen(this, &dp);
-		dgen.generate(blockseed, full_node_min, full_node_max);
-	}
+	if (flags & MG_DUNGEONS)
+		generateDungeons(stone_surface_max_y, stone_type);
 
 	// Generate the registered decorations
 	if (flags & MG_DECORATIONS)
@@ -328,37 +223,6 @@ void MapgenV5::makeChunk(BlockMakeData *data)
 }
 
 
-void MapgenV5::calculateNoise()
-{
-	//TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
-	s16 x = node_min.X;
-	s16 y = node_min.Y - 1;
-	s16 z = node_min.Z;
-
-	noise_factor->perlinMap2D(x, z);
-	noise_height->perlinMap2D(x, z);
-	noise_ground->perlinMap3D(x, y, z);
-
-	// Cave noises are calculated in generateCaves()
-	// only if solid terrain is present in mapchunk
-
-	noise_filler_depth->perlinMap2D(x, z);
-	noise_heat->perlinMap2D(x, z);
-	noise_humidity->perlinMap2D(x, z);
-	noise_heat_blend->perlinMap2D(x, z);
-	noise_humidity_blend->perlinMap2D(x, z);
-
-	for (s32 i = 0; i < csize.X * csize.Z; i++) {
-		noise_heat->result[i] += noise_heat_blend->result[i];
-		noise_humidity->result[i] += noise_humidity_blend->result[i];
-	}
-
-	heatmap = noise_heat->result;
-	humidmap = noise_humidity->result;
-	//printf("calculateNoise: %dus\n", t.stop());
-}
-
-
 //bool is_cave(u32 index) {
 //	double d1 = contour(noise_cave1->result[index]);
 //	double d2 = contour(noise_cave2->result[index]);
@@ -382,6 +246,10 @@ int MapgenV5::generateBaseTerrain()
 	u32 index2d = 0;
 	int stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
 
+	noise_factor->perlinMap2D(node_min.X, node_min.Z);
+	noise_height->perlinMap2D(node_min.X, node_min.Z);
+	noise_ground->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
+
 	for (s16 z=node_min.Z; z<=node_max.Z; z++) {
 		for (s16 y=node_min.Y - 1; y<=node_max.Y + 1; y++) {
 			u32 vi = vm->m_area.index(node_min.X, y, z);
@@ -414,219 +282,3 @@ int MapgenV5::generateBaseTerrain()
 
 	return stone_surface_max_y;
 }
-
-
-MgStoneType MapgenV5::generateBiomes(float *heat_map, float *humidity_map)
-{
-	v3s16 em = vm->m_area.getExtent();
-	u32 index = 0;
-	MgStoneType stone_type = STONE;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
-		Biome *biome = NULL;
-		u16 depth_top = 0;
-		u16 base_filler = 0;
-		u16 depth_water_top = 0;
-		u32 vi = vm->m_area.index(x, node_max.Y, z);
-
-		// Check node at base of mapchunk above, either a node of a previously
-		// generated mapchunk or if not, a node of overgenerated base terrain.
-		content_t c_above = vm->m_data[vi + em.X].getContent();
-		bool air_above = c_above == CONTENT_AIR;
-		bool water_above = c_above == c_water_source;
-
-		// If there is air or water above enable top/filler placement, otherwise force
-		// nplaced to stone level by setting a number exceeding any possible filler depth.
-		u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
-
-		for (s16 y = node_max.Y; y >= node_min.Y; y--) {
-			content_t c = vm->m_data[vi].getContent();
-
-			// Biome is recalculated each time an upper surface is detected while
-			// working down a column. The selected biome then remains in effect for
-			// all nodes below until the next surface and biome recalculation.
-			// Biome is recalculated:
-			// 1. At the surface of stone below air or water.
-			// 2. At the surface of water below air.
-			// 3. When stone or water is detected but biome has not yet been calculated.
-			if ((c == c_stone && (air_above || water_above || !biome)) ||
-					(c == c_water_source && (air_above || !biome))) {
-				biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
-				depth_top = biome->depth_top;
-				base_filler = MYMAX(depth_top + biome->depth_filler
-						+ noise_filler_depth->result[index], 0);
-				depth_water_top = biome->depth_water_top;
-
-				// Detect stone type for dungeons during every biome calculation.
-				// This is more efficient than detecting per-node and will not
-				// miss any desert stone or sandstone biomes.
-				if (biome->c_stone == c_desert_stone)
-					stone_type = DESERT_STONE;
-				else if (biome->c_stone == c_sandstone)
-					stone_type = SANDSTONE;
-			}
-
-			if (c == c_stone) {
-				content_t c_below = vm->m_data[vi - em.X].getContent();
-
-				// If the node below isn't solid, make this node stone, so that
-				// any top/filler nodes above are structurally supported.
-				// This is done by aborting the cycle of top/filler placement
-				// immediately by forcing nplaced to stone level.
-				if (c_below == CONTENT_AIR || c_below == c_water_source)
-					nplaced = U16_MAX;
-
-				if (nplaced < depth_top) {
-					vm->m_data[vi] = MapNode(biome->c_top);
-					nplaced++;
-				} else if (nplaced < base_filler) {
-					vm->m_data[vi] = MapNode(biome->c_filler);
-					nplaced++;
-				} else {
-					vm->m_data[vi] = MapNode(biome->c_stone);
-				}
-
-				air_above = false;
-				water_above = false;
-			} else if (c == c_water_source) {
-				vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top)) ?
-						biome->c_water_top : biome->c_water);
-				nplaced = 0;  // Enable top/filler placement for next surface
-				air_above = false;
-				water_above = true;
-			} else if (c == CONTENT_AIR) {
-				nplaced = 0;  // Enable top/filler placement for next surface
-				air_above = true;
-				water_above = false;
-			} else {  // Possible various nodes overgenerated from neighbouring mapchunks
-				nplaced = U16_MAX;  // Disable top/filler placement
-				air_above = false;
-				water_above = false;
-			}
-
-			vm->m_area.add_y(em, vi, -1);
-		}
-	}
-
-	return stone_type;
-}
-
-
-void MapgenV5::dustTopNodes()
-{
-	if (node_max.Y < water_level)
-		return;
-
-	v3s16 em = vm->m_area.getExtent();
-	u32 index = 0;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
-		Biome *biome = (Biome *)bmgr->getRaw(biomemap[index]);
-
-		if (biome->c_dust == CONTENT_IGNORE)
-			continue;
-
-		u32 vi = vm->m_area.index(x, full_node_max.Y, z);
-		content_t c_full_max = vm->m_data[vi].getContent();
-		s16 y_start;
-
-		if (c_full_max == CONTENT_AIR) {
-			y_start = full_node_max.Y - 1;
-		} else if (c_full_max == CONTENT_IGNORE) {
-			vi = vm->m_area.index(x, node_max.Y + 1, z);
-			content_t c_max = vm->m_data[vi].getContent();
-
-			if (c_max == CONTENT_AIR)
-				y_start = node_max.Y;
-			else
-				continue;
-		} else {
-			continue;
-		}
-
-		vi = vm->m_area.index(x, y_start, z);
-		for (s16 y = y_start; y >= node_min.Y - 1; y--) {
-			if (vm->m_data[vi].getContent() != CONTENT_AIR)
-				break;
-
-			vm->m_area.add_y(em, vi, -1);
-		}
-
-		content_t c = vm->m_data[vi].getContent();
-		if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
-			vm->m_area.add_y(em, vi, 1);
-			vm->m_data[vi] = MapNode(biome->c_dust);
-		}
-	}
-}
-
-
-void MapgenV5::generateCaves(int max_stone_y)
-{
-	if (max_stone_y < node_min.Y)
-		return;
-
-	noise_cave1->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-	noise_cave2->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-
-	v3s16 em = vm->m_area.getExtent();
-	u32 index2d = 0;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
-		bool column_is_open = false;  // Is column open to overground
-		bool is_tunnel = false;  // Is tunnel or tunnel floor
-		// Indexes at column top (node_max.Y)
-		u32 vi = vm->m_area.index(x, node_max.Y, z);
-		u32 index3d = (z - node_min.Z) * zstride_1d + csize.Y * ystride +
-			(x - node_min.X);
-		// Biome of column
-		Biome *biome = (Biome *)bmgr->getRaw(biomemap[index2d]);
-
-		// Don't excavate the overgenerated stone at node_max.Y + 1,
-		// this creates a 'roof' over the tunnel, preventing light in
-		// tunnels at mapchunk borders when generating mapchunks upwards.
-		// This 'roof' is removed when the mapchunk above is generated.
-		for (s16 y = node_max.Y; y >= node_min.Y - 1; y--,
-				index3d -= ystride,
-				vm->m_area.add_y(em, vi, -1)) {
-
-			content_t c = vm->m_data[vi].getContent();
-			if (c == CONTENT_AIR || c == biome->c_water_top ||
-					c == biome->c_water) {
-				column_is_open = true;
-				continue;
-			}
-			// Ground
-			float d1 = contour(noise_cave1->result[index3d]);
-			float d2 = contour(noise_cave2->result[index3d]);
-
-			if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) {
-				// In tunnel and ground content, excavate
-				vm->m_data[vi] = MapNode(CONTENT_AIR);
-				is_tunnel = true;
-			} else {
-				// Not in tunnel or not ground content
-				if (is_tunnel && column_is_open &&
-						(c == biome->c_filler || c == biome->c_stone))
-					// Tunnel entrance floor
-					vm->m_data[vi] = MapNode(biome->c_top);
-
-				column_is_open = false;
-				is_tunnel = false;
-			}
-		}
-	}
-
-	if (node_max.Y > MGV5_LARGE_CAVE_DEPTH)
-		return;
-
-	PseudoRandom ps(blockseed + 21343);
-	u32 bruises_count = ps.range(0, 2);
-	for (u32 i = 0; i < bruises_count; i++) {
-		CaveV5 cave(this, &ps);
-		cave.makeCave(node_min, node_max, max_stone_y);
-	}
-}
diff --git a/src/mapgen_v5.h b/src/mapgen_v5.h
index fd2f7f4..ddb090a 100644
--- a/src/mapgen_v5.h
+++ b/src/mapgen_v5.h
@@ -30,7 +30,7 @@ class BiomeManager;
 extern FlagDesc flagdesc_mapgen_v5[];
 
 
-struct MapgenV5Params : public MapgenSpecificParams {
+struct MapgenV5Params : public MapgenParams {
 	u32 spflags;
 	float cave_width;
 	NoiseParams np_filler_depth;
@@ -48,69 +48,21 @@ struct MapgenV5Params : public MapgenSpecificParams {
 };
 
 
-class MapgenV5 : public Mapgen {
+class MapgenV5 : public MapgenBasic {
 public:
-	EmergeManager *m_emerge;
-	BiomeManager *bmgr;
-
-	int ystride;
-	int zstride_1d;
-
-	v3s16 node_min;
-	v3s16 node_max;
-	v3s16 full_node_min;
-	v3s16 full_node_max;
-
-	u32 spflags;
-	float cave_width;
-	Noise *noise_filler_depth;
-	Noise *noise_factor;
-	Noise *noise_height;
-	Noise *noise_cave1;
-	Noise *noise_cave2;
-	Noise *noise_ground;
-
-	Noise *noise_heat;
-	Noise *noise_humidity;
-	Noise *noise_heat_blend;
-	Noise *noise_humidity_blend;
-
-	content_t c_stone;
-	content_t c_water_source;
-	content_t c_lava_source;
-	content_t c_desert_stone;
-	content_t c_ice;
-	content_t c_sandstone;
-
-	content_t c_cobble;
-	content_t c_stair_cobble;
-	content_t c_mossycobble;
-	content_t c_sandstonebrick;
-	content_t c_stair_sandstonebrick;
-
-	MapgenV5(int mapgenid, MapgenParams *params, EmergeManager *emerge);
+	MapgenV5(int mapgenid, MapgenV5Params *params, EmergeManager *emerge);
 	~MapgenV5();
 
+	virtual MapgenType getType() const { return MAPGEN_V5; }
+
 	virtual void makeChunk(BlockMakeData *data);
 	int getSpawnLevelAtPoint(v2s16 p);
-	void calculateNoise();
 	int generateBaseTerrain();
-	MgStoneType generateBiomes(float *heat_map, float *humidity_map);
-	void generateCaves(int max_stone_y);
-	void dustTopNodes();
-};
-
 
-struct MapgenFactoryV5 : public MapgenFactory {
-	Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
-	{
-		return new MapgenV5(mgid, params, emerge);
-	};
-
-	MapgenSpecificParams *createMapgenParams()
-	{
-		return new MapgenV5Params();
-	};
+private:
+	Noise *noise_factor;
+	Noise *noise_height;
+	Noise *noise_ground;
 };
 
 #endif
diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp
index c389b2e..79617a8 100644
--- a/src/mapgen_v6.cpp
+++ b/src/mapgen_v6.cpp
@@ -53,7 +53,7 @@ FlagDesc flagdesc_mapgen_v6[] = {
 /////////////////////////////////////////////////////////////////////////////
 
 
-MapgenV6::MapgenV6(int mapgenid, MapgenParams *params, EmergeManager *emerge)
+MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge)
 	: Mapgen(mapgenid, params, emerge)
 {
 	this->m_emerge = emerge;
@@ -61,26 +61,25 @@ MapgenV6::MapgenV6(int mapgenid, MapgenParams *params, EmergeManager *emerge)
 
 	this->heightmap = new s16[csize.X * csize.Z];
 
-	MapgenV6Params *sp = (MapgenV6Params *)params->sparams;
-	this->spflags     = sp->spflags;
-	this->freq_desert = sp->freq_desert;
-	this->freq_beach  = sp->freq_beach;
+	this->spflags     = params->spflags;
+	this->freq_desert = params->freq_desert;
+	this->freq_beach  = params->freq_beach;
 
-	np_cave        = &sp->np_cave;
-	np_humidity    = &sp->np_humidity;
-	np_trees       = &sp->np_trees;
-	np_apple_trees = &sp->np_apple_trees;
+	np_cave        = &params->np_cave;
+	np_humidity    = &params->np_humidity;
+	np_trees       = &params->np_trees;
+	np_apple_trees = &params->np_apple_trees;
 
 	//// Create noise objects
-	noise_terrain_base   = new Noise(&sp->np_terrain_base,   seed, csize.X, csize.Y);
-	noise_terrain_higher = new Noise(&sp->np_terrain_higher, seed, csize.X, csize.Y);
-	noise_steepness      = new Noise(&sp->np_steepness,      seed, csize.X, csize.Y);
-	noise_height_select  = new Noise(&sp->np_height_select,  seed, csize.X, csize.Y);
-	noise_mud            = new Noise(&sp->np_mud,            seed, csize.X, csize.Y);
-	noise_beach          = new Noise(&sp->np_beach,          seed, csize.X, csize.Y);
-	noise_biome          = new Noise(&sp->np_biome,          seed,
+	noise_terrain_base   = new Noise(&params->np_terrain_base,   seed, csize.X, csize.Y);
+	noise_terrain_higher = new Noise(&params->np_terrain_higher, seed, csize.X, csize.Y);
+	noise_steepness      = new Noise(&params->np_steepness,      seed, csize.X, csize.Y);
+	noise_height_select  = new Noise(&params->np_height_select,  seed, csize.X, csize.Y);
+	noise_mud            = new Noise(&params->np_mud,            seed, csize.X, csize.Y);
+	noise_beach          = new Noise(&params->np_beach,          seed, csize.X, csize.Y);
+	noise_biome          = new Noise(&params->np_biome,          seed,
 			csize.X + 2 * MAP_BLOCKSIZE, csize.Y + 2 * MAP_BLOCKSIZE);
-	noise_humidity       = new Noise(&sp->np_humidity,       seed,
+	noise_humidity       = new Noise(&params->np_humidity,       seed,
 			csize.X + 2 * MAP_BLOCKSIZE, csize.Y + 2 * MAP_BLOCKSIZE);
 
 	//// Resolve nodes to be used
@@ -269,7 +268,7 @@ float MapgenV6::baseTerrainLevel(float terrain_base, float terrain_higher,
 
 float MapgenV6::baseTerrainLevelFromNoise(v2s16 p)
 {
-	if ((spflags & MGV6_FLAT) || (flags & MG_FLAT))
+	if (spflags & MGV6_FLAT)
 		return water_level;
 
 	float terrain_base   = NoisePerlin2D_PO(&noise_terrain_base->np,
@@ -295,7 +294,7 @@ float MapgenV6::baseTerrainLevelFromMap(v2s16 p)
 
 float MapgenV6::baseTerrainLevelFromMap(int index)
 {
-	if ((spflags & MGV6_FLAT) || (flags & MG_FLAT))
+	if (spflags & MGV6_FLAT)
 		return water_level;
 
 	float terrain_base   = noise_terrain_base->result[index];
@@ -403,7 +402,7 @@ bool MapgenV6::getHaveAppleTree(v2s16 p)
 
 float MapgenV6::getMudAmount(int index)
 {
-	if ((spflags & MGV6_FLAT) || (flags & MG_FLAT))
+	if (spflags & MGV6_FLAT)
 		return MGV6_AVERAGE_MUD_AMOUNT;
 
 	/*return ((float)AVERAGE_MUD_AMOUNT + 2.0 * noise2d_perlin(
@@ -559,34 +558,38 @@ void MapgenV6::makeChunk(BlockMakeData *data)
 	if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
 		DungeonParams dp;
 
-		dp.np_rarity  = nparams_dungeon_rarity;
-		dp.np_density = nparams_dungeon_density;
-		dp.np_wetness = nparams_dungeon_wetness;
-		dp.c_water    = c_water_source;
+		dp.seed = seed;
+		dp.c_water       = c_water_source;
+		dp.c_river_water = c_water_source;
+		dp.rooms_min     = 2;
+		dp.rooms_max     = 16;
+		dp.y_min         = -MAX_MAP_GENERATION_LIMIT;
+		dp.y_max         = MAX_MAP_GENERATION_LIMIT;
+		dp.np_density    = NoiseParams(0.9, 0.5, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0);
+		dp.np_alt_wall   = NoiseParams(-0.4, 1.0, v3f(40.0, 40.0, 40.0), 32474, 6, 1.1, 2.0);
+
 		if (getBiome(0, v2s16(node_min.X, node_min.Z)) == BT_DESERT) {
-			dp.c_cobble = c_desert_stone;
-			dp.c_moss   = c_desert_stone;
-			dp.c_stair  = c_desert_stone;
+			dp.c_wall     = c_desert_stone;
+			dp.c_alt_wall = CONTENT_IGNORE;
+			dp.c_stair    = c_desert_stone;
 
 			dp.diagonal_dirs = true;
-			dp.mossratio     = 0.0;
 			dp.holesize      = v3s16(2, 3, 2);
 			dp.roomsize      = v3s16(2, 5, 2);
 			dp.notifytype    = GENNOTIFY_TEMPLE;
 		} else {
-			dp.c_cobble = c_cobble;
-			dp.c_moss   = c_mossycobble;
-			dp.c_stair  = c_stair_cobble;
+			dp.c_wall     = c_cobble;
+			dp.c_alt_wall = c_mossycobble;
+			dp.c_stair    = c_stair_cobble;
 
 			dp.diagonal_dirs = false;
-			dp.mossratio     = 3.0;
 			dp.holesize      = v3s16(1, 2, 1);
 			dp.roomsize      = v3s16(0, 0, 0);
 			dp.notifytype    = GENNOTIFY_DUNGEON;
 		}
 
-		DungeonGen dgen(this, &dp);
-		dgen.generate(blockseed, full_node_min, full_node_max);
+		DungeonGen dgen(ndef, &gennotify, &dp);
+		dgen.generate(vm, blockseed, full_node_min, full_node_max);
 	}
 
 	// Add top and bottom side of water to transforming_liquid queue
@@ -596,7 +599,7 @@ void MapgenV6::makeChunk(BlockMakeData *data)
 	growGrass();
 
 	// Generate some trees, and add grass, if a jungle
-	if ((spflags & MGV6_TREES) || (flags & MG_TREES))
+	if (spflags & MGV6_TREES)
 		placeTreesAndJungleGrass();
 
 	// Generate the registered decorations
@@ -623,7 +626,7 @@ void MapgenV6::calculateNoise()
 	int fx = full_node_min.X;
 	int fz = full_node_min.Z;
 
-	if (!((spflags & MGV6_FLAT) || (flags & MG_FLAT))) {
+	if (!(spflags & MGV6_FLAT)) {
 		noise_terrain_base->perlinMap2D_PO(x, 0.5, z, 0.5);
 		noise_terrain_higher->perlinMap2D_PO(x, 0.5, z, 0.5);
 		noise_steepness->perlinMap2D_PO(x, 0.5, z, 0.5);
@@ -1066,9 +1069,10 @@ void MapgenV6::generateCaves(int max_stone_y)
 	}
 
 	for (u32 i = 0; i < caves_count + bruises_count; i++) {
-		bool large_cave = (i >= caves_count);
-		CaveV6 cave(this, &ps, &ps2, large_cave);
+		CavesV6 cave(ndef, &gennotify, water_level, c_water_source, c_lava_source);
 
-		cave.makeCave(node_min, node_max, max_stone_y);
+		bool large_cave = (i >= caves_count);
+		cave.makeCave(vm, node_min, node_max, &ps, &ps2,
+			large_cave, max_stone_y, heightmap);
 	}
 }
diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h
index a55fc6d..f018ffa 100644
--- a/src/mapgen_v6.h
+++ b/src/mapgen_v6.h
@@ -53,7 +53,7 @@ enum BiomeV6Type
 };
 
 
-struct MapgenV6Params : public MapgenSpecificParams {
+struct MapgenV6Params : public MapgenParams {
 	u32 spflags;
 	float freq_desert;
 	float freq_beach;
@@ -124,9 +124,11 @@ public:
 	content_t c_mossycobble;
 	content_t c_stair_cobble;
 
-	MapgenV6(int mapgenid, MapgenParams *params, EmergeManager *emerge);
+	MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge);
 	~MapgenV6();
 
+	virtual MapgenType getType() const { return MAPGEN_V6; }
+
 	void makeChunk(BlockMakeData *data);
 	int getGroundLevelAtPoint(v2s16 p);
 	int getSpawnLevelAtPoint(v2s16 p);
@@ -162,18 +164,4 @@ public:
 	virtual void generateCaves(int max_stone_y);
 };
 
-
-struct MapgenFactoryV6 : public MapgenFactory {
-	Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
-	{
-		return new MapgenV6(mgid, params, emerge);
-	};
-
-	MapgenSpecificParams *createMapgenParams()
-	{
-		return new MapgenV6Params();
-	};
-};
-
-
 #endif
diff --git a/src/mapgen_v7.cpp b/src/mapgen_v7.cpp
index 9fb65f5..04a9e3c 100644
--- a/src/mapgen_v7.cpp
+++ b/src/mapgen_v7.cpp
@@ -41,89 +41,44 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 
 FlagDesc flagdesc_mapgen_v7[] = {
-	{"mountains", MGV7_MOUNTAINS},
-	{"ridges",    MGV7_RIDGES},
-	{NULL,        0}
+	{"mountains",    MGV7_MOUNTAINS},
+	{"ridges",       MGV7_RIDGES},
+	{"floatlands",   MGV7_FLOATLANDS},
+	{NULL,           0}
 };
 
 
 ///////////////////////////////////////////////////////////////////////////////
 
 
-MapgenV7::MapgenV7(int mapgenid, MapgenParams *params, EmergeManager *emerge)
-	: Mapgen(mapgenid, params, emerge)
+MapgenV7::MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge)
+	: MapgenBasic(mapgenid, params, emerge)
 {
-	this->m_emerge = emerge;
-	this->bmgr     = emerge->biomemgr;
-
-	//// amount of elements to skip for the next index
-	//// for noise/height/biome maps (not vmanip)
-	this->ystride = csize.X;
-	// 1-up 1-down overgeneration
-	this->zstride_1u1d = csize.X * (csize.Y + 2);
-	// 1-down overgeneration
-	this->zstride_1d = csize.X * (csize.Y + 1);
-
-	this->biomemap        = new u8[csize.X * csize.Z];
-	this->heightmap       = new s16[csize.X * csize.Z];
-	this->heatmap         = NULL;
-	this->humidmap        = NULL;
-	this->ridge_heightmap = new s16[csize.X * csize.Z];
-
-	MapgenV7Params *sp = (MapgenV7Params *)params->sparams;
-
-	this->spflags    = sp->spflags;
-	this->cave_width = sp->cave_width;
+	this->spflags             = params->spflags;
+	this->cave_width          = params->cave_width;
+	this->float_mount_density = params->float_mount_density;
+	this->float_mount_height  = params->float_mount_height;
+	this->floatland_level     = params->floatland_level;
+	this->shadow_limit        = params->shadow_limit;
 
 	//// Terrain noise
-	noise_terrain_base    = new Noise(&sp->np_terrain_base,    seed, csize.X, csize.Z);
-	noise_terrain_alt     = new Noise(&sp->np_terrain_alt,     seed, csize.X, csize.Z);
-	noise_terrain_persist = new Noise(&sp->np_terrain_persist, seed, csize.X, csize.Z);
-	noise_height_select   = new Noise(&sp->np_height_select,   seed, csize.X, csize.Z);
-	noise_filler_depth    = new Noise(&sp->np_filler_depth,    seed, csize.X, csize.Z);
-	noise_mount_height    = new Noise(&sp->np_mount_height,    seed, csize.X, csize.Z);
-	noise_ridge_uwater    = new Noise(&sp->np_ridge_uwater,    seed, csize.X, csize.Z);
+	noise_terrain_base      = new Noise(&params->np_terrain_base,      seed, csize.X, csize.Z);
+	noise_terrain_alt       = new Noise(&params->np_terrain_alt,       seed, csize.X, csize.Z);
+	noise_terrain_persist   = new Noise(&params->np_terrain_persist,   seed, csize.X, csize.Z);
+	noise_height_select     = new Noise(&params->np_height_select,     seed, csize.X, csize.Z);
+	noise_filler_depth      = new Noise(&params->np_filler_depth,      seed, csize.X, csize.Z);
+	noise_mount_height      = new Noise(&params->np_mount_height,      seed, csize.X, csize.Z);
+	noise_ridge_uwater      = new Noise(&params->np_ridge_uwater,      seed, csize.X, csize.Z);
+	noise_floatland_base    = new Noise(&params->np_floatland_base,    seed, csize.X, csize.Z);
+	noise_float_base_height = new Noise(&params->np_float_base_height, seed, csize.X, csize.Z);
 
 	//// 3d terrain noise
 	// 1-up 1-down overgeneration
-	noise_mountain = new Noise(&sp->np_mountain, seed, csize.X, csize.Y + 2, csize.Z);
-	noise_ridge    = new Noise(&sp->np_ridge,    seed, csize.X, csize.Y + 2, csize.Z);
-	// 1-down overgeneraion
-	noise_cave1    = new Noise(&sp->np_cave1,    seed, csize.X, csize.Y + 1, csize.Z);
-	noise_cave2    = new Noise(&sp->np_cave2,    seed, csize.X, csize.Y + 1, csize.Z);
-
-	//// Biome noise
-	noise_heat           = new Noise(&params->np_biome_heat,           seed, csize.X, csize.Z);
-	noise_humidity       = new Noise(&params->np_biome_humidity,       seed, csize.X, csize.Z);
-	noise_heat_blend     = new Noise(&params->np_biome_heat_blend,     seed, csize.X, csize.Z);
-	noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
-
-	//// Resolve nodes to be used
-	INodeDefManager *ndef = emerge->ndef;
-
-	c_stone                = ndef->getId("mapgen_stone");
-	c_water_source         = ndef->getId("mapgen_water_source");
-	c_lava_source          = ndef->getId("mapgen_lava_source");
-	c_desert_stone         = ndef->getId("mapgen_desert_stone");
-	c_ice                  = ndef->getId("mapgen_ice");
-	c_sandstone            = ndef->getId("mapgen_sandstone");
-
-	c_cobble               = ndef->getId("mapgen_cobble");
-	c_stair_cobble         = ndef->getId("mapgen_stair_cobble");
-	c_mossycobble          = ndef->getId("mapgen_mossycobble");
-	c_sandstonebrick       = ndef->getId("mapgen_sandstonebrick");
-	c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
-
-	if (c_ice == CONTENT_IGNORE)
-		c_ice = CONTENT_AIR;
-	if (c_mossycobble == CONTENT_IGNORE)
-		c_mossycobble = c_cobble;
-	if (c_stair_cobble == CONTENT_IGNORE)
-		c_stair_cobble = c_cobble;
-	if (c_sandstonebrick == CONTENT_IGNORE)
-		c_sandstonebrick = c_sandstone;
-	if (c_stair_sandstonebrick == CONTENT_IGNORE)
-		c_stair_sandstonebrick = c_sandstone;
+	noise_mountain = new Noise(&params->np_mountain, seed, csize.X, csize.Y + 2, csize.Z);
+	noise_ridge    = new Noise(&params->np_ridge,    seed, csize.X, csize.Y + 2, csize.Z);
+
+	MapgenBasic::np_cave1 = params->np_cave1;
+	MapgenBasic::np_cave2 = params->np_cave2;
 }
 
 
@@ -136,76 +91,85 @@ MapgenV7::~MapgenV7()
 	delete noise_filler_depth;
 	delete noise_mount_height;
 	delete noise_ridge_uwater;
+	delete noise_floatland_base;
+	delete noise_float_base_height;
 	delete noise_mountain;
 	delete noise_ridge;
-	delete noise_cave1;
-	delete noise_cave2;
-
-	delete noise_heat;
-	delete noise_humidity;
-	delete noise_heat_blend;
-	delete noise_humidity_blend;
-
-	delete[] ridge_heightmap;
-	delete[] heightmap;
-	delete[] biomemap;
 }
 
 
 MapgenV7Params::MapgenV7Params()
 {
-	spflags    = MGV7_MOUNTAINS | MGV7_RIDGES;
-	cave_width = 0.3;
-
-	np_terrain_base    = NoiseParams(4,    70,  v3f(600,  600,  600),  82341, 5, 0.6,  2.0);
-	np_terrain_alt     = NoiseParams(4,    25,  v3f(600,  600,  600),  5934,  5, 0.6,  2.0);
-	np_terrain_persist = NoiseParams(0.6,  0.1, v3f(2000, 2000, 2000), 539,   3, 0.6,  2.0);
-	np_height_select   = NoiseParams(-8,   16,  v3f(500,  500,  500),  4213,  6, 0.7,  2.0);
-	np_filler_depth    = NoiseParams(0,    1.2, v3f(150,  150,  150),  261,   3, 0.7,  2.0);
-	np_mount_height    = NoiseParams(256,  112, v3f(1000, 1000, 1000), 72449, 3, 0.6,  2.0);
-	np_ridge_uwater    = NoiseParams(0,    1,   v3f(1000, 1000, 1000), 85039, 5, 0.6,  2.0);
-	np_mountain        = NoiseParams(-0.6, 1,   v3f(250,  350,  250),  5333,  5, 0.63, 2.0);
-	np_ridge           = NoiseParams(0,    1,   v3f(100,  100,  100),  6467,  4, 0.75, 2.0);
-	np_cave1           = NoiseParams(0,    12,  v3f(96,   96,   96),   52534, 4, 0.5,  2.0);
-	np_cave2           = NoiseParams(0,    12,  v3f(96,   96,   96),   10325, 4, 0.5,  2.0);
+	spflags             = MGV7_MOUNTAINS | MGV7_RIDGES;
+	cave_width          = 0.09;
+	float_mount_density = 0.6;
+	float_mount_height  = 128.0;
+	floatland_level     = 1280;
+	shadow_limit        = 1024;
+
+	np_terrain_base      = NoiseParams(4,    70,   v3f(600,  600,  600),  82341, 5, 0.6,  2.0);
+	np_terrain_alt       = NoiseParams(4,    25,   v3f(600,  600,  600),  5934,  5, 0.6,  2.0);
+	np_terrain_persist   = NoiseParams(0.6,  0.1,  v3f(2000, 2000, 2000), 539,   3, 0.6,  2.0);
+	np_height_select     = NoiseParams(-8,   16,   v3f(500,  500,  500),  4213,  6, 0.7,  2.0);
+	np_filler_depth      = NoiseParams(0,    1.2,  v3f(150,  150,  150),  261,   3, 0.7,  2.0);
+	np_mount_height      = NoiseParams(256,  112,  v3f(1000, 1000, 1000), 72449, 3, 0.6,  2.0);
+	np_ridge_uwater      = NoiseParams(0,    1,    v3f(1000, 1000, 1000), 85039, 5, 0.6,  2.0);
+	np_floatland_base    = NoiseParams(-0.6, 1.5,  v3f(600,  600,  600),  114,   5, 0.6,  2.0);
+	np_float_base_height = NoiseParams(48,   24,   v3f(300,  300,  300),  907,   4, 0.7,  2.0);
+	np_mountain          = NoiseParams(-0.6, 1,    v3f(250,  350,  250),  5333,  5, 0.63, 2.0);
+	np_ridge             = NoiseParams(0,    1,    v3f(100,  100,  100),  6467,  4, 0.75, 2.0);
+	np_cave1             = NoiseParams(0,    12,   v3f(61,   61,   61),   52534, 3, 0.5,  2.0);
+	np_cave2             = NoiseParams(0,    12,   v3f(67,   67,   67),   10325, 3, 0.5,  2.0);
 }
 
 
 void MapgenV7Params::readParams(const Settings *settings)
 {
-	settings->getFlagStrNoEx("mgv7_spflags",  spflags, flagdesc_mapgen_v7);
-	settings->getFloatNoEx("mgv7_cave_width", cave_width);
-
-	settings->getNoiseParams("mgv7_np_terrain_base",    np_terrain_base);
-	settings->getNoiseParams("mgv7_np_terrain_alt",     np_terrain_alt);
-	settings->getNoiseParams("mgv7_np_terrain_persist", np_terrain_persist);
-	settings->getNoiseParams("mgv7_np_height_select",   np_height_select);
-	settings->getNoiseParams("mgv7_np_filler_depth",    np_filler_depth);
-	settings->getNoiseParams("mgv7_np_mount_height",    np_mount_height);
-	settings->getNoiseParams("mgv7_np_ridge_uwater",    np_ridge_uwater);
-	settings->getNoiseParams("mgv7_np_mountain",        np_mountain);
-	settings->getNoiseParams("mgv7_np_ridge",           np_ridge);
-	settings->getNoiseParams("mgv7_np_cave1",           np_cave1);
-	settings->getNoiseParams("mgv7_np_cave2",           np_cave2);
+	settings->getFlagStrNoEx("mgv7_spflags",           spflags, flagdesc_mapgen_v7);
+	settings->getFloatNoEx("mgv7_cave_width",          cave_width);
+	settings->getFloatNoEx("mgv7_float_mount_density", float_mount_density);
+	settings->getFloatNoEx("mgv7_float_mount_height",  float_mount_height);
+	settings->getS16NoEx("mgv7_floatland_level",       floatland_level);
+	settings->getS16NoEx("mgv7_shadow_limit",          shadow_limit);
+
+	settings->getNoiseParams("mgv7_np_terrain_base",      np_terrain_base);
+	settings->getNoiseParams("mgv7_np_terrain_alt",       np_terrain_alt);
+	settings->getNoiseParams("mgv7_np_terrain_persist",   np_terrain_persist);
+	settings->getNoiseParams("mgv7_np_height_select",     np_height_select);
+	settings->getNoiseParams("mgv7_np_filler_depth",      np_filler_depth);
+	settings->getNoiseParams("mgv7_np_mount_height",      np_mount_height);
+	settings->getNoiseParams("mgv7_np_ridge_uwater",      np_ridge_uwater);
+	settings->getNoiseParams("mgv7_np_floatland_base",    np_floatland_base);
+	settings->getNoiseParams("mgv7_np_float_base_height", np_float_base_height);
+	settings->getNoiseParams("mgv7_np_mountain",          np_mountain);
+	settings->getNoiseParams("mgv7_np_ridge",             np_ridge);
+	settings->getNoiseParams("mgv7_np_cave1",             np_cave1);
+	settings->getNoiseParams("mgv7_np_cave2",             np_cave2);
 }
 
 
 void MapgenV7Params::writeParams(Settings *settings) const
 {
-	settings->setFlagStr("mgv7_spflags",  spflags, flagdesc_mapgen_v7, U32_MAX);
-	settings->setFloat("mgv7_cave_width", cave_width);
-
-	settings->setNoiseParams("mgv7_np_terrain_base",    np_terrain_base);
-	settings->setNoiseParams("mgv7_np_terrain_alt",     np_terrain_alt);
-	settings->setNoiseParams("mgv7_np_terrain_persist", np_terrain_persist);
-	settings->setNoiseParams("mgv7_np_height_select",   np_height_select);
-	settings->setNoiseParams("mgv7_np_filler_depth",    np_filler_depth);
-	settings->setNoiseParams("mgv7_np_mount_height",    np_mount_height);
-	settings->setNoiseParams("mgv7_np_ridge_uwater",    np_ridge_uwater);
-	settings->setNoiseParams("mgv7_np_mountain",        np_mountain);
-	settings->setNoiseParams("mgv7_np_ridge",           np_ridge);
-	settings->setNoiseParams("mgv7_np_cave1",           np_cave1);
-	settings->setNoiseParams("mgv7_np_cave2",           np_cave2);
+	settings->setFlagStr("mgv7_spflags",           spflags, flagdesc_mapgen_v7, U32_MAX);
+	settings->setFloat("mgv7_cave_width",          cave_width);
+	settings->setFloat("mgv7_float_mount_density", float_mount_density);
+	settings->setFloat("mgv7_float_mount_height",  float_mount_height);
+	settings->setS16("mgv7_floatland_level",       floatland_level);
+	settings->setS16("mgv7_shadow_limit",          shadow_limit);
+
+	settings->setNoiseParams("mgv7_np_terrain_base",      np_terrain_base);
+	settings->setNoiseParams("mgv7_np_terrain_alt",       np_terrain_alt);
+	settings->setNoiseParams("mgv7_np_terrain_persist",   np_terrain_persist);
+	settings->setNoiseParams("mgv7_np_height_select",     np_height_select);
+	settings->setNoiseParams("mgv7_np_filler_depth",      np_filler_depth);
+	settings->setNoiseParams("mgv7_np_mount_height",      np_mount_height);
+	settings->setNoiseParams("mgv7_np_ridge_uwater",      np_ridge_uwater);
+	settings->setNoiseParams("mgv7_np_floatland_base",    np_floatland_base);
+	settings->setNoiseParams("mgv7_np_float_base_height", np_float_base_height);
+	settings->setNoiseParams("mgv7_np_mountain",          np_mountain);
+	settings->setNoiseParams("mgv7_np_ridge",             np_ridge);
+	settings->setNoiseParams("mgv7_np_cave1",             np_cave1);
+	settings->setNoiseParams("mgv7_np_cave2",             np_cave2);
 }
 
 
@@ -217,17 +181,27 @@ int MapgenV7::getSpawnLevelAtPoint(v2s16 p)
 	// Base terrain calculation
 	s16 y = baseTerrainLevelAtPoint(p.X, p.Y);
 
-	// Ridge/river terrain calculation
-	float width = 0.2;
-	float uwatern = NoisePerlin2D(&noise_ridge_uwater->np, p.X, p.Y, seed) * 2;
-	// if inside a river this is an unsuitable spawn point
-	if (fabs(uwatern) <= width)
-		return MAX_MAP_GENERATION_LIMIT;
+	// If enabled, check if inside a river
+	if (spflags & MGV7_RIDGES) {
+		float width = 0.2;
+		float uwatern = NoisePerlin2D(&noise_ridge_uwater->np, p.X, p.Y, seed) * 2;
+		if (fabs(uwatern) <= width)
+			return MAX_MAP_GENERATION_LIMIT;  // Unsuitable spawn point
+	}
+
+	// If mountains are disabled, terrain level is base terrain level
+	// Avoids spawn on non-existant mountain terrain
+	if (!(spflags & MGV7_MOUNTAINS)) {
+		if (y <= water_level || y > water_level + 16)
+			return MAX_MAP_GENERATION_LIMIT;  // Unsuitable spawn point
+		else
+			return y;
+	}
 
 	// Mountain terrain calculation
 	int iters = 128;
 	while (iters--) {
-		if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) {  // Air, y is ground level
+		if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) {  // If air above
 			if (y <= water_level || y > water_level + 16)
 				return MAX_MAP_GENERATION_LIMIT;  // Unsuitable spawn point
 			else
@@ -236,7 +210,7 @@ int MapgenV7::getSpawnLevelAtPoint(v2s16 p)
 		y++;
 	}
 
-	// Unsuitable spawn point, no ground surface found
+	// Unsuitable spawn point, no mountain surface found
 	return MAX_MAP_GENERATION_LIMIT;
 }
 
@@ -267,70 +241,26 @@ void MapgenV7::makeChunk(BlockMakeData *data)
 
 	blockseed = getBlockSeed2(full_node_min, seed);
 
-	// Make some noise
-	calculateNoise();
-
-	// Generate terrain and ridges with initial heightmaps
+	// Generate base and mountain terrain
+	// An initial heightmap is no longer created here for use in generateRidgeTerrain()
 	s16 stone_surface_max_y = generateTerrain();
 
+	// Generate rivers
 	if (spflags & MGV7_RIDGES)
 		generateRidgeTerrain();
 
-	// Update heightmap to include mountain terrain
+	// Create heightmap
 	updateHeightmap(node_min, node_max);
 
-	// Create biomemap at heightmap surface
-	bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result,
-		noise_humidity->result, heightmap, biomemap);
-
-	// Actually place the biome-specific nodes
-	MgStoneType stone_type = generateBiomes(noise_heat->result, noise_humidity->result);
+	// Init biome generator, place biome-specific nodes, and build biomemap
+	biomegen->calcBiomeNoise(node_min);
+	MgStoneType stone_type = generateBiomes();
 
 	if (flags & MG_CAVES)
-		generateCaves(stone_surface_max_y);
-
-	if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
-		DungeonParams dp;
-
-		dp.np_rarity  = nparams_dungeon_rarity;
-		dp.np_density = nparams_dungeon_density;
-		dp.np_wetness = nparams_dungeon_wetness;
-		dp.c_water    = c_water_source;
-		if (stone_type == STONE) {
-			dp.c_cobble = c_cobble;
-			dp.c_moss   = c_mossycobble;
-			dp.c_stair  = c_stair_cobble;
-
-			dp.diagonal_dirs = false;
-			dp.mossratio     = 3.0;
-			dp.holesize      = v3s16(1, 2, 1);
-			dp.roomsize      = v3s16(0, 0, 0);
-			dp.notifytype    = GENNOTIFY_DUNGEON;
-		} else if (stone_type == DESERT_STONE) {
-			dp.c_cobble = c_desert_stone;
-			dp.c_moss   = c_desert_stone;
-			dp.c_stair  = c_desert_stone;
-
-			dp.diagonal_dirs = true;
-			dp.mossratio     = 0.0;
-			dp.holesize      = v3s16(2, 3, 2);
-			dp.roomsize      = v3s16(2, 5, 2);
-			dp.notifytype    = GENNOTIFY_TEMPLE;
-		} else if (stone_type == SANDSTONE) {
-			dp.c_cobble = c_sandstonebrick;
-			dp.c_moss   = c_sandstonebrick;
-			dp.c_stair  = c_sandstonebrick;
-
-			dp.diagonal_dirs = false;
-			dp.mossratio     = 0.0;
-			dp.holesize      = v3s16(2, 2, 2);
-			dp.roomsize      = v3s16(2, 0, 2);
-			dp.notifytype    = GENNOTIFY_DUNGEON;
-		}
+		generateCaves(stone_surface_max_y, water_level);
 
-		DungeonGen dgen(this, &dp);
-		dgen.generate(blockseed, full_node_min, full_node_max);
-	}
+	if (flags & MG_DUNGEONS)
+		generateDungeons(stone_surface_max_y, stone_type);
 
 	// Generate the registered decorations
 	if (flags & MG_DECORATIONS)
@@ -346,9 +276,13 @@ void MapgenV7::makeChunk(BlockMakeData *data)
 
 	updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);
 
+	// Limit floatland shadow
+	bool propagate_shadow = !((spflags & MGV7_FLOATLANDS) &&
+		node_min.Y <= shadow_limit && node_max.Y >= shadow_limit);
+
 	if (flags & MG_LIGHT)
 		calcLighting(node_min - v3s16(0, 1, 0), node_max + v3s16(0, 1, 0),
-			full_node_min, full_node_max);
+			full_node_min, full_node_max, propagate_shadow);
 
 	//setLighting(node_min - v3s16(1, 0, 1) * MAP_BLOCKSIZE,
 	//			node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE, 0xFF);
@@ -357,62 +291,6 @@ void MapgenV7::makeChunk(BlockMakeData *data)
 }
 
 
-void MapgenV7::calculateNoise()
-{
-	//TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
-	s16 x = node_min.X;
-	s16 y = node_min.Y - 1;
-	s16 z = node_min.Z;
-
-	noise_terrain_persist->perlinMap2D(x, z);
-	float *persistmap = noise_terrain_persist->result;
-
-	noise_terrain_base->perlinMap2D(x, z, persistmap);
-	noise_terrain_alt->perlinMap2D(x, z, persistmap);
-	noise_height_select->perlinMap2D(x, z);
-
-	if (spflags & MGV7_MOUNTAINS) {
-		noise_mountain->perlinMap3D(x, y, z);
-		noise_mount_height->perlinMap2D(x, z);
-	}
-
-	if ((spflags & MGV7_RIDGES) && node_max.Y >= water_level) {
-		noise_ridge->perlinMap3D(x, y, z);
-		noise_ridge_uwater->perlinMap2D(x, z);
-	}
-
-	// Cave noises are calculated in generateCaves()
-	// only if solid terrain is present in mapchunk
-
-	noise_filler_depth->perlinMap2D(x, z);
-	noise_heat->perlinMap2D(x, z);
-	noise_humidity->perlinMap2D(x, z);
-	noise_heat_blend->perlinMap2D(x, z);
-	noise_humidity_blend->perlinMap2D(x, z);
-
-	for (s32 i = 0; i < csize.X * csize.Z; i++) {
-		noise_heat->result[i] += noise_heat_blend->result[i];
-		noise_humidity->result[i] += noise_humidity_blend->result[i];
-	}
-
-	heatmap = noise_heat->result;
-	humidmap = noise_humidity->result;
-	//printf("calculateNoise: %dus\n", t.stop());
-}
-
-
-Biome *MapgenV7::getBiomeAtPoint(v3s16 p)
-{
-	float heat = NoisePerlin2D(&noise_heat->np, p.X, p.Z, seed) +
-		NoisePerlin2D(&noise_heat_blend->np, p.X, p.Z, seed);
-	float humidity = NoisePerlin2D(&noise_humidity->np, p.X, p.Z, seed) +
-		NoisePerlin2D(&noise_humidity_blend->np, p.X, p.Z, seed);
-	s16 groundlevel = baseTerrainLevelAtPoint(p.X, p.Z);
-
-	return bmgr->getBiome(heat, humidity, groundlevel);
-}
-
-
 float MapgenV7::baseTerrainLevelAtPoint(s16 x, s16 z)
 {
 	float hselect = NoisePerlin2D(&noise_height_select->np, x, z, seed);
@@ -466,26 +344,94 @@ bool MapgenV7::getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y)
 }
 
 
+bool MapgenV7::getFloatlandMountainFromMap(int idx_xyz, int idx_xz, s16 y)
+{
+	// Make rim 2 nodes thick to match floatland base terrain
+	float density_gradient = (y >= floatland_level) ?
+		-pow((float)(y - floatland_level) / float_mount_height, 0.75f) :
+		-pow((float)(floatland_level - 1 - y) / float_mount_height, 0.75f);
+
+	float floatn = noise_mountain->result[idx_xyz] + float_mount_density;
+
+	return floatn + density_gradient >= 0.0f;
+}
+
+
+void MapgenV7::floatBaseExtentFromMap(s16 *float_base_min, s16 *float_base_max, int idx_xz)
+{
+	// '+1' to avoid a layer of stone at y = MAX_MAP_GENERATION_LIMIT
+	s16 base_min = MAX_MAP_GENERATION_LIMIT + 1;
+	s16 base_max = MAX_MAP_GENERATION_LIMIT;
+
+	float n_base = noise_floatland_base->result[idx_xz];
+	if (n_base > 0.0f) {
+		float n_base_height = noise_float_base_height->result[idx_xz];
+		float amp = n_base * n_base_height;
+		float ridge = n_base_height / 3.0f;
+		base_min = floatland_level - amp / 1.5f;
+
+		if (amp > ridge * 2.0f) {
+			// Lake bed
+			base_max = floatland_level - (amp - ridge * 2.0f) / 2.0f;
+		} else {
+			// Hills and ridges
+			float diff = fabs(amp - ridge) / ridge;
+			// Smooth ridges using the 'smoothstep function'
+			float smooth_diff = diff * diff * (3.0f - 2.0f * diff);
+			base_max = floatland_level + ridge - smooth_diff * ridge;
+		}
+	}
+
+	*float_base_min = base_min;
+	*float_base_max = base_max;
+}
+
+
 int MapgenV7::generateTerrain()
 {
 	MapNode n_air(CONTENT_AIR);
 	MapNode n_stone(c_stone);
 	MapNode n_water(c_water_source);
 
+	//// Calculate noise for terrain generation
+	noise_terrain_persist->perlinMap2D(node_min.X, node_min.Z);
+	float *persistmap = noise_terrain_persist->result;
+
+	noise_terrain_base->perlinMap2D(node_min.X, node_min.Z, persistmap);
+	noise_terrain_alt->perlinMap2D(node_min.X, node_min.Z, persistmap);
+	noise_height_select->perlinMap2D(node_min.X, node_min.Z);
+
+	if ((spflags & MGV7_MOUNTAINS) || (spflags & MGV7_FLOATLANDS)) {
+		noise_mountain->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
+	}
+
+	if (spflags & MGV7_MOUNTAINS) {
+		noise_mount_height->perlinMap2D(node_min.X, node_min.Z);
+	}
+
+	if (spflags & MGV7_FLOATLANDS) {
+		noise_floatland_base->perlinMap2D(node_min.X, node_min.Z);
+		noise_float_base_height->perlinMap2D(node_min.X, node_min.Z);
+	}
+
+	//// Place nodes
 	v3s16 em = vm->m_area.getExtent();
 	s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
 	u32 index2d = 0;
-	bool mountain_flag = spflags & MGV7_MOUNTAINS;
 
 	for (s16 z = node_min.Z; z <= node_max.Z; z++)
 	for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
 		s16 surface_y = baseTerrainLevelFromMap(index2d);
-		heightmap[index2d]       = surface_y;  // Create base terrain heightmap
-		ridge_heightmap[index2d] = surface_y;
-
 		if (surface_y > stone_surface_max_y)
 			stone_surface_max_y = surface_y;
 
+		// Get extent of floatland base terrain
+		// '+1' to avoid a layer of stone at y = MAX_MAP_GENERATION_LIMIT
+		s16 float_base_min = MAX_MAP_GENERATION_LIMIT + 1;
+		s16 float_base_max = MAX_MAP_GENERATION_LIMIT;
+		if (spflags & MGV7_FLOATLANDS)
+			floatBaseExtentFromMap(&float_base_min, &float_base_max, index2d);
+
 		u32 vi = vm->m_area.index(x, node_min.Y - 1, z);
 		u32 index3d = (z - node_min.Z) * zstride_1u1d + (x - node_min.X);
 
@@ -493,13 +439,21 @@ int MapgenV7::generateTerrain()
 			if (vm->m_data[vi].getContent() == CONTENT_IGNORE) {
 				if (y <= surface_y) {
 					vm->m_data[vi] = n_stone;  // Base terrain
-				} else if (mountain_flag &&
+				} else if ((spflags & MGV7_MOUNTAINS) &&
 						getMountainTerrainFromMap(index3d, index2d, y)) {
 					vm->m_data[vi] = n_stone;  // Mountain terrain
 					if (y > stone_surface_max_y)
 						stone_surface_max_y = y;
+				} else if ((spflags & MGV7_FLOATLANDS) &&
+						((y >= float_base_min && y <= float_base_max) ||
+						getFloatlandMountainFromMap(index3d, index2d, y))) {
+					vm->m_data[vi] = n_stone;  // Floatland terrain
+					stone_surface_max_y = node_max.Y;
 				} else if (y <= water_level) {
-					vm->m_data[vi] = n_water;
+					vm->m_data[vi] = n_water;  // Ground level water
+				} else if ((spflags & MGV7_FLOATLANDS) &&
+						(y >= float_base_max && y <= floatland_level)) {
+					vm->m_data[vi] = n_water;  // Floatland water
 				} else {
 					vm->m_data[vi] = n_air;
 				}
@@ -515,9 +469,12 @@ int MapgenV7::generateTerrain()
 
 void MapgenV7::generateRidgeTerrain()
 {
-	if (node_max.Y < water_level - 16)
+	if ((node_max.Y < water_level - 16) || (node_max.Y > shadow_limit))
 		return;
 
+	noise_ridge->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
+	noise_ridge_uwater->perlinMap2D(node_min.X, node_min.Z);
+
 	MapNode n_water(c_water_source);
 	MapNode n_air(CONTENT_AIR);
 	u32 index = 0;
@@ -529,9 +486,6 @@ void MapgenV7::generateRidgeTerrain()
 		for (s16 x = node_min.X; x <= node_max.X; x++, index++, vi++) {
 			int j = (z - node_min.Z) * csize.X + (x - node_min.X);
 
-			if (heightmap[j] < water_level - 16)  // Use base terrain heightmap
-				continue;
-
 			float uwatern = noise_ridge_uwater->result[j] * 2;
 			if (fabs(uwatern) > width)
 				continue;
@@ -544,233 +498,19 @@ void MapgenV7::generateRidgeTerrain()
 			if (nridge + width_mod * height_mod < 0.6)
 				continue;
 
-			if (y < ridge_heightmap[j])
-				ridge_heightmap[j] = y - 1;
-
 			vm->m_data[vi] = (y > water_level) ? n_air : n_water;
 		}
 	}
 }
 
 
-MgStoneType MapgenV7::generateBiomes(float *heat_map, float *humidity_map)
-{
-	v3s16 em = vm->m_area.getExtent();
-	u32 index = 0;
-	MgStoneType stone_type = STONE;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
-		Biome *biome = NULL;
-		u16 depth_top = 0;
-		u16 base_filler = 0;
-		u16 depth_water_top = 0;
-		u32 vi = vm->m_area.index(x, node_max.Y, z);
-
-		// Check node at base of mapchunk above, either a node of a previously
-		// generated mapchunk or if not, a node of overgenerated base terrain.
-		content_t c_above = vm->m_data[vi + em.X].getContent();
-		bool air_above = c_above == CONTENT_AIR;
-		bool water_above = c_above == c_water_source;
-
-		// If there is air or water above enable top/filler placement, otherwise force
-		// nplaced to stone level by setting a number exceeding any possible filler depth.
-		u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
-
-		for (s16 y = node_max.Y; y >= node_min.Y; y--) {
-			content_t c = vm->m_data[vi].getContent();
-
-			// Biome is recalculated each time an upper surface is detected while
-			// working down a column. The selected biome then remains in effect for
-			// all nodes below until the next surface and biome recalculation.
-			// Biome is recalculated:
-			// 1. At the surface of stone below air or water.
-			// 2. At the surface of water below air.
-			// 3. When stone or water is detected but biome has not yet been calculated.
-			if ((c == c_stone && (air_above || water_above || !biome)) ||
-					(c == c_water_source && (air_above || !biome))) {
-				biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
-				depth_top = biome->depth_top;
-				base_filler = MYMAX(depth_top + biome->depth_filler
-						+ noise_filler_depth->result[index], 0);
-				depth_water_top = biome->depth_water_top;
-
-				// Detect stone type for dungeons during every biome calculation.
-				// This is more efficient than detecting per-node and will not
-				// miss any desert stone or sandstone biomes.
-				if (biome->c_stone == c_desert_stone)
-					stone_type = DESERT_STONE;
-				else if (biome->c_stone == c_sandstone)
-					stone_type = SANDSTONE;
-			}
-
-			if (c == c_stone) {
-				content_t c_below = vm->m_data[vi - em.X].getContent();
-
-				// If the node below isn't solid, make this node stone, so that
-				// any top/filler nodes above are structurally supported.
-				// This is done by aborting the cycle of top/filler placement
-				// immediately by forcing nplaced to stone level.
-				if (c_below == CONTENT_AIR || c_below == c_water_source)
-					nplaced = U16_MAX;
-
-				if (nplaced < depth_top) {
-					vm->m_data[vi] = MapNode(biome->c_top);
-					nplaced++;
-				} else if (nplaced < base_filler) {
-					vm->m_data[vi] = MapNode(biome->c_filler);
-					nplaced++;
-				} else {
-					vm->m_data[vi] = MapNode(biome->c_stone);
-				}
-
-				air_above = false;
-				water_above = false;
-			} else if (c == c_water_source) {
-				vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top)) ?
-						biome->c_water_top : biome->c_water);
-				nplaced = 0;  // Enable top/filler placement for next surface
-				air_above = false;
-				water_above = true;
-			} else if (c == CONTENT_AIR) {
-				nplaced = 0;  // Enable top/filler placement for next surface
-				air_above = true;
-				water_above = false;
-			} else {  // Possible various nodes overgenerated from neighbouring mapchunks
-				nplaced = U16_MAX;  // Disable top/filler placement
-				air_above = false;
-				water_above = false;
-			}
-
-			vm->m_area.add_y(em, vi, -1);
-		}
-	}
-
-	return stone_type;
-}
-
-
-void MapgenV7::dustTopNodes()
-{
-	if (node_max.Y < water_level)
-		return;
-
-	v3s16 em = vm->m_area.getExtent();
-	u32 index = 0;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
-		Biome *biome = (Biome *)bmgr->getRaw(biomemap[index]);
-
-		if (biome->c_dust == CONTENT_IGNORE)
-			continue;
-
-		u32 vi = vm->m_area.index(x, full_node_max.Y, z);
-		content_t c_full_max = vm->m_data[vi].getContent();
-		s16 y_start;
-
-		if (c_full_max == CONTENT_AIR) {
-			y_start = full_node_max.Y - 1;
-		} else if (c_full_max == CONTENT_IGNORE) {
-			vi = vm->m_area.index(x, node_max.Y + 1, z);
-			content_t c_max = vm->m_data[vi].getContent();
-
-			if (c_max == CONTENT_AIR)
-				y_start = node_max.Y;
-			else
-				continue;
-		} else {
-			continue;
-		}
-
-		vi = vm->m_area.index(x, y_start, z);
-		for (s16 y = y_start; y >= node_min.Y - 1; y--) {
-			if (vm->m_data[vi].getContent() != CONTENT_AIR)
-				break;
-
-			vm->m_area.add_y(em, vi, -1);
-		}
-
-		content_t c = vm->m_data[vi].getContent();
-		if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
-			vm->m_area.add_y(em, vi, 1);
-			vm->m_data[vi] = MapNode(biome->c_dust);
-		}
-	}
-}
-
-
-void MapgenV7::generateCaves(s16 max_stone_y)
-{
-	if (max_stone_y < node_min.Y)
-		return;
-
-	noise_cave1->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-	noise_cave2->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-
-	v3s16 em = vm->m_area.getExtent();
-	u32 index2d = 0;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
-		bool column_is_open = false;  // Is column open to overground
-		bool is_tunnel = false;  // Is tunnel or tunnel floor
-		// Indexes at column top (node_max.Y)
-		u32 vi = vm->m_area.index(x, node_max.Y, z);
-		u32 index3d = (z - node_min.Z) * zstride_1d + csize.Y * ystride +
-			(x - node_min.X);
-		// Biome of column
-		Biome *biome = (Biome *)bmgr->getRaw(biomemap[index2d]);
-
-		// Don't excavate the overgenerated stone at node_max.Y + 1,
-		// this creates a 'roof' over the tunnel, preventing light in
-		// tunnels at mapchunk borders when generating mapchunks upwards.
-		// This 'roof' is removed when the mapchunk above is generated.
-		for (s16 y = node_max.Y; y >= node_min.Y - 1; y--,
-				index3d -= ystride,
-				vm->m_area.add_y(em, vi, -1)) {
-
-			content_t c = vm->m_data[vi].getContent();
-			if (c == CONTENT_AIR || c == biome->c_water_top ||
-					c == biome->c_water) {
-				column_is_open = true;
-				continue;
-			}
-			// Ground
-			float d1 = contour(noise_cave1->result[index3d]);
-			float d2 = contour(noise_cave2->result[index3d]);
-
-			if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) {
-				// In tunnel and ground content, excavate
-				vm->m_data[vi] = MapNode(CONTENT_AIR);
-				is_tunnel = true;
-			} else {
-				// Not in tunnel or not ground content
-				if (is_tunnel && column_is_open &&
-						(c == biome->c_filler || c == biome->c_stone))
-					// Tunnel entrance floor
-					vm->m_data[vi] = MapNode(biome->c_top);
-
-				column_is_open = false;
-				is_tunnel = false;
-			}
-		}
-	}
-
-	if (node_min.Y >= water_level)
-		return;
-
-	PseudoRandom ps(blockseed + 21343);
-	u32 bruises_count = ps.range(0, 2);
-	for (u32 i = 0; i < bruises_count; i++) {
-		CaveV7 cave(this, &ps);
-		cave.makeCave(node_min, node_max, max_stone_y);
-	}
-}
-
-
-///////////////////////////////////////////////////////////////
-
+////////////////////////////////////////////////////////////////////////////////
+//// Code Boneyard
+////
+//// Much of the stuff here has potential to become useful again at some point
+//// in the future, but we don't want it to get lost or forgotten in version
+//// control.
+////
 
 #if 0
 int MapgenV7::generateMountainTerrain(s16 ymax)
diff --git a/src/mapgen_v7.h b/src/mapgen_v7.h
index c252206..3972387 100644
--- a/src/mapgen_v7.h
+++ b/src/mapgen_v7.h
@@ -23,18 +23,24 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "mapgen.h"
 
-/////////////////// Mapgen V7 flags
-#define MGV7_MOUNTAINS   0x01
-#define MGV7_RIDGES      0x02
+////////////// Mapgen V7 flags
+#define MGV7_MOUNTAINS    0x01
+#define MGV7_RIDGES       0x02
+#define MGV7_FLOATLANDS   0x04
 
 class BiomeManager;
 
 extern FlagDesc flagdesc_mapgen_v7[];
 
 
-struct MapgenV7Params : public MapgenSpecificParams {
+struct MapgenV7Params : public MapgenParams {
 	u32 spflags;
 	float cave_width;
+	float float_mount_density;
+	float float_mount_height;
+	s16 floatland_level;
+	s16 shadow_limit;
+
 	NoiseParams np_terrain_base;
 	NoiseParams np_terrain_alt;
 	NoiseParams np_terrain_persist;
@@ -42,6 +48,8 @@ struct MapgenV7Params : public MapgenSpecificParams {
 	NoiseParams np_filler_depth;
 	NoiseParams np_mount_height;
 	NoiseParams np_ridge_uwater;
+	NoiseParams np_floatland_base;
+	NoiseParams np_float_base_height;
 	NoiseParams np_mountain;
 	NoiseParams np_ridge;
 	NoiseParams np_cave1;
@@ -54,87 +62,42 @@ struct MapgenV7Params : public MapgenSpecificParams {
 	void writeParams(Settings *settings) const;
 };
 
-class MapgenV7 : public Mapgen {
+class MapgenV7 : public MapgenBasic {
 public:
-	EmergeManager *m_emerge;
-	BiomeManager *bmgr;
-
-	int ystride;
-	int zstride_1u1d;
-	int zstride_1d;
-
-	v3s16 node_min;
-	v3s16 node_max;
-	v3s16 full_node_min;
-	v3s16 full_node_max;
-
-	s16 *ridge_heightmap;
-
-	u32 spflags;
-	float cave_width;
-	Noise *noise_terrain_base;
-	Noise *noise_terrain_alt;
-	Noise *noise_terrain_persist;
-	Noise *noise_height_select;
-	Noise *noise_filler_depth;
-	Noise *noise_mount_height;
-	Noise *noise_ridge_uwater;
-	Noise *noise_mountain;
-	Noise *noise_ridge;
-	Noise *noise_cave1;
-	Noise *noise_cave2;
-
-	Noise *noise_heat;
-	Noise *noise_humidity;
-	Noise *noise_heat_blend;
-	Noise *noise_humidity_blend;
-
-	content_t c_stone;
-	content_t c_water_source;
-	content_t c_lava_source;
-	content_t c_desert_stone;
-	content_t c_ice;
-	content_t c_sandstone;
-
-	content_t c_cobble;
-	content_t c_stair_cobble;
-	content_t c_mossycobble;
-	content_t c_sandstonebrick;
-	content_t c_stair_sandstonebrick;
-
-	MapgenV7(int mapgenid, MapgenParams *params, EmergeManager *emerge);
+	MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge);
 	~MapgenV7();
 
+	virtual MapgenType getType() const { return MAPGEN_V7; }
+
 	virtual void makeChunk(BlockMakeData *data);
 	int getSpawnLevelAtPoint(v2s16 p);
-	Biome *getBiomeAtPoint(v3s16 p);
 
 	float baseTerrainLevelAtPoint(s16 x, s16 z);
 	float baseTerrainLevelFromMap(int index);
 	bool getMountainTerrainAtPoint(s16 x, s16 y, s16 z);
 	bool getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y);
-
-	void calculateNoise();
+	bool getFloatlandMountainFromMap(int idx_xyz, int idx_xz, s16 y);
+	void floatBaseExtentFromMap(s16 *float_base_min, s16 *float_base_max, int idx_xz);
 
 	int generateTerrain();
 	void generateRidgeTerrain();
 
-	MgStoneType generateBiomes(float *heat_map, float *humidity_map);
-	void dustTopNodes();
+private:
+	float float_mount_density;
+	float float_mount_height;
+	s16 floatland_level;
+	s16 shadow_limit;
 
-	void generateCaves(s16 max_stone_y);
-};
-
-struct MapgenFactoryV7 : public MapgenFactory {
-	Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
-	{
-		return new MapgenV7(mgid, params, emerge);
-	};
-
-	MapgenSpecificParams *createMapgenParams()
-	{
-		return new MapgenV7Params();
-	};
+	Noise *noise_terrain_base;
+	Noise *noise_terrain_alt;
+	Noise *noise_terrain_persist;
+	Noise *noise_height_select;
+	Noise *noise_mount_height;
+	Noise *noise_ridge_uwater;
+	Noise *noise_floatland_base;
+	Noise *noise_float_base_height;
+	Noise *noise_mountain;
+	Noise *noise_ridge;
 };
 
 #endif
diff --git a/src/mapgen_valleys.cpp b/src/mapgen_valleys.cpp
index 0ec5409..ce7a953 100644
--- a/src/mapgen_valleys.cpp
+++ b/src/mapgen_valleys.cpp
@@ -64,64 +64,46 @@ static FlagDesc flagdesc_mapgen_valleys[] = {
 ///////////////////////////////////////////////////////////////////////////////
 
 
-MapgenValleys::MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager *emerge)
-	: Mapgen(mapgenid, params, emerge)
+MapgenValleys::MapgenValleys(int mapgenid, MapgenValleysParams *params, EmergeManager *emerge)
+	: MapgenBasic(mapgenid, params, emerge)
 {
-	this->m_emerge = emerge;
-	this->bmgr = emerge->biomemgr;
-
-	//// amount of elements to skip for the next index
-	//// for noise/height/biome maps (not vmanip)
-	this->ystride = csize.X;
-	this->zstride = csize.X * (csize.Y + 2);
-	// 1-down overgeneration
-	this->zstride_1d = csize.X * (csize.Y + 1);
-
-	this->biomemap  = new u8[csize.X * csize.Z];
-	this->heightmap = new s16[csize.X * csize.Z];
-	this->heatmap   = NULL;
-	this->humidmap  = NULL;
+	// NOTE: MapgenValleys has a hard dependency on BiomeGenOriginal
+	this->m_bgen = (BiomeGenOriginal *)biomegen;
 
 	this->map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT,
 			g_settings->getU16("map_generation_limit"));
 
-	MapgenValleysParams *sp = (MapgenValleysParams *)params->sparams;
+	BiomeParamsOriginal *bp = (BiomeParamsOriginal *)params->bparams;
 
-	this->spflags            = sp->spflags;
-	this->altitude_chill     = sp->altitude_chill;
-	this->large_cave_depth   = sp->large_cave_depth;
-	this->lava_features_lim  = rangelim(sp->lava_features, 0, 10);
-	this->massive_cave_depth = sp->massive_cave_depth;
-	this->river_depth_bed    = sp->river_depth + 1.f;
-	this->river_size_factor  = sp->river_size / 100.f;
-	this->water_features_lim = rangelim(sp->water_features, 0, 10);
-	this->cave_width         = sp->cave_width;
+	this->spflags            = params->spflags;
+	this->altitude_chill     = params->altitude_chill;
+	this->large_cave_depth   = params->large_cave_depth;
+	this->lava_features_lim  = rangelim(params->lava_features, 0, 10);
+	this->massive_cave_depth = params->massive_cave_depth;
+	this->river_depth_bed    = params->river_depth + 1.f;
+	this->river_size_factor  = params->river_size / 100.f;
+	this->water_features_lim = rangelim(params->water_features, 0, 10);
+	this->cave_width         = params->cave_width;
 
 	//// 2D Terrain noise
-	noise_filler_depth       = new Noise(&sp->np_filler_depth,       seed, csize.X, csize.Z);
-	noise_inter_valley_slope = new Noise(&sp->np_inter_valley_slope, seed, csize.X, csize.Z);
-	noise_rivers             = new Noise(&sp->np_rivers,             seed, csize.X, csize.Z);
-	noise_terrain_height     = new Noise(&sp->np_terrain_height,     seed, csize.X, csize.Z);
-	noise_valley_depth       = new Noise(&sp->np_valley_depth,       seed, csize.X, csize.Z);
-	noise_valley_profile     = new Noise(&sp->np_valley_profile,     seed, csize.X, csize.Z);
+	noise_filler_depth       = new Noise(&params->np_filler_depth,       seed, csize.X, csize.Z);
+	noise_inter_valley_slope = new Noise(&params->np_inter_valley_slope, seed, csize.X, csize.Z);
+	noise_rivers             = new Noise(&params->np_rivers,             seed, csize.X, csize.Z);
+	noise_terrain_height     = new Noise(&params->np_terrain_height,     seed, csize.X, csize.Z);
+	noise_valley_depth       = new Noise(&params->np_valley_depth,       seed, csize.X, csize.Z);
+	noise_valley_profile     = new Noise(&params->np_valley_profile,     seed, csize.X, csize.Z);
 
 	//// 3D Terrain noise
 	// 1-up 1-down overgeneration
-	noise_inter_valley_fill = new Noise(&sp->np_inter_valley_fill, seed, csize.X, csize.Y + 2, csize.Z);
+	noise_inter_valley_fill = new Noise(&params->np_inter_valley_fill, seed, csize.X, csize.Y + 2, csize.Z);
 	// 1-down overgeneraion
-	noise_cave1             = new Noise(&sp->np_cave1,             seed, csize.X, csize.Y + 1, csize.Z);
-	noise_cave2             = new Noise(&sp->np_cave2,             seed, csize.X, csize.Y + 1, csize.Z);
-	noise_massive_caves     = new Noise(&sp->np_massive_caves,     seed, csize.X, csize.Y + 1, csize.Z);
-
-	//// Biome noise
-	noise_heat_blend     = new Noise(&params->np_biome_heat_blend,     seed, csize.X, csize.Z);
-	noise_heat           = new Noise(&params->np_biome_heat,           seed, csize.X, csize.Z);
-	noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
-	noise_humidity       = new Noise(&params->np_biome_humidity,       seed, csize.X, csize.Z);
+	noise_cave1             = new Noise(&params->np_cave1,             seed, csize.X, csize.Y + 1, csize.Z);
+	noise_cave2             = new Noise(&params->np_cave2,             seed, csize.X, csize.Y + 1, csize.Z);
+	noise_massive_caves     = new Noise(&params->np_massive_caves,     seed, csize.X, csize.Y + 1, csize.Z);
 
 	this->humid_rivers       = (spflags & MGVALLEYS_HUMID_RIVERS);
 	this->use_altitude_chill = (spflags & MGVALLEYS_ALT_CHILL);
-	this->humidity_adjust    = params->np_biome_humidity.offset - 50.f;
+	this->humidity_adjust    = bp->np_humidity.offset - 50.f;
 
 	// a small chance of overflows if the settings are very high
 	this->cave_water_max_height = water_level + MYMAX(0, water_features_lim - 4) * 50;
@@ -129,35 +111,8 @@ MapgenValleys::MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager *
 
 	tcave_cache = new float[csize.Y + 2];
 
-	//// Resolve nodes to be used
-	INodeDefManager *ndef = emerge->ndef;
-
-	c_cobble               = ndef->getId("mapgen_cobble");
-	c_desert_stone         = ndef->getId("mapgen_desert_stone");
-	c_dirt                 = ndef->getId("mapgen_dirt");
-	c_lava_source          = ndef->getId("mapgen_lava_source");
-	c_mossycobble          = ndef->getId("mapgen_mossycobble");
-	c_river_water_source   = ndef->getId("mapgen_river_water_source");
-	c_sand                 = ndef->getId("mapgen_sand");
-	c_sandstonebrick       = ndef->getId("mapgen_sandstonebrick");
-	c_sandstone            = ndef->getId("mapgen_sandstone");
-	c_stair_cobble         = ndef->getId("mapgen_stair_cobble");
-	c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
-	c_stone                = ndef->getId("mapgen_stone");
-	c_water_source         = ndef->getId("mapgen_water_source");
-
-	if (c_mossycobble == CONTENT_IGNORE)
-		c_mossycobble = c_cobble;
-	if (c_river_water_source == CONTENT_IGNORE)
-		c_river_water_source = c_water_source;
-	if (c_sand == CONTENT_IGNORE)
-		c_sand = c_stone;
-	if (c_sandstonebrick == CONTENT_IGNORE)
-		c_sandstonebrick = c_sandstone;
-	if (c_stair_cobble == CONTENT_IGNORE)
-		c_stair_cobble = c_cobble;
-	if (c_stair_sandstonebrick == CONTENT_IGNORE)
-		c_stair_sandstonebrick = c_sandstone;
+	// Resolve content to be used
+	c_lava_source = ndef->getId("mapgen_lava_source");
 }
 
 
@@ -174,13 +129,6 @@ MapgenValleys::~MapgenValleys()
 	delete noise_valley_depth;
 	delete noise_valley_profile;
 
-	delete noise_heat;
-	delete noise_heat_blend;
-	delete noise_humidity;
-	delete noise_humidity_blend;
-
-	delete[] biomemap;
-	delete[] heightmap;
 	delete[] tcave_cache;
 }
 
@@ -195,10 +143,10 @@ MapgenValleysParams::MapgenValleysParams()
 	river_depth        = 4;  // How deep to carve river channels.
 	river_size         = 5;  // How wide to make rivers.
 	water_features     = 0;  // How often water will occur in caves.
-	cave_width         = 0.3;
+	cave_width         = 0.09;
 
-	np_cave1              = NoiseParams(0,     12,   v3f(96,   96,   96),   52534, 4, 0.5,   2.0);
-	np_cave2              = NoiseParams(0,     12,   v3f(96,   96,   96),   10325, 4, 0.5,   2.0);
+	np_cave1              = NoiseParams(0,     12,   v3f(61,   61,   61),   52534, 3, 0.5,   2.0);
+	np_cave2              = NoiseParams(0,     12,   v3f(67,   67,   67),   10325, 3, 0.5,   2.0);
 	np_filler_depth       = NoiseParams(0.f,   1.2f, v3f(256,  256,  256),  1605,  3, 0.5f,  2.f);
 	np_inter_valley_fill  = NoiseParams(0.f,   1.f,  v3f(256,  512,  256),  1993,  6, 0.8f,  2.f);
 	np_inter_valley_slope = NoiseParams(0.5f,  0.5f, v3f(128,  128,  128),  746,   1, 1.f,   2.f);
@@ -293,62 +241,24 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
 	// Generate noise maps and base terrain height.
 	calculateNoise();
 
+	// Generate biome noises.  Note this must be executed strictly before
+	// generateTerrain, because generateTerrain depends on intermediate
+	// biome-related noises.
+	m_bgen->calcBiomeNoise(node_min);
+
 	// Generate base terrain with initial heightmaps
 	s16 stone_surface_max_y = generateTerrain();
 
-	// Create biomemap at heightmap surface
-	bmgr->calcBiomes(csize.X, csize.Z, heatmap, humidmap, heightmap, biomemap);
-
-	// Actually place the biome-specific nodes
-	MgStoneType stone_type = generateBiomes(heatmap, humidmap);
+	// Place biome-specific nodes and build biomemap
+	MgStoneType stone_type = generateBiomes();
 
 	// Cave creation.
 	if (flags & MG_CAVES)
-		generateCaves(stone_surface_max_y);
+		generateCaves(stone_surface_max_y, large_cave_depth);
 
 	// Dungeon creation
-	if ((flags & MG_DUNGEONS) && node_max.Y < 50 && (stone_surface_max_y >= node_min.Y)) {
-		DungeonParams dp;
-
-		dp.np_rarity  = nparams_dungeon_rarity;
-		dp.np_density = nparams_dungeon_density;
-		dp.np_wetness = nparams_dungeon_wetness;
-		dp.c_water    = c_water_source;
-		if (stone_type == STONE) {
-			dp.c_cobble = c_cobble;
-			dp.c_moss   = c_mossycobble;
-			dp.c_stair  = c_stair_cobble;
-
-			dp.diagonal_dirs = false;
-			dp.mossratio     = 3.f;
-			dp.holesize      = v3s16(1, 2, 1);
-			dp.roomsize      = v3s16(0, 0, 0);
-			dp.notifytype    = GENNOTIFY_DUNGEON;
-		} else if (stone_type == DESERT_STONE) {
-			dp.c_cobble = c_desert_stone;
-			dp.c_moss   = c_desert_stone;
-			dp.c_stair  = c_desert_stone;
-
-			dp.diagonal_dirs = true;
-			dp.mossratio     = 0.f;
-			dp.holesize      = v3s16(2, 3, 2);
-			dp.roomsize      = v3s16(2, 5, 2);
-			dp.notifytype    = GENNOTIFY_TEMPLE;
-		} else if (stone_type == SANDSTONE) {
-			dp.c_cobble = c_sandstonebrick;
-			dp.c_moss   = c_sandstonebrick;
-			dp.c_stair  = c_sandstonebrick;
-
-			dp.diagonal_dirs = false;
-			dp.mossratio     = 0.f;
-			dp.holesize      = v3s16(2, 2, 2);
-			dp.roomsize      = v3s16(2, 0, 2);
-			dp.notifytype    = GENNOTIFY_DUNGEON;
-		}
-
-		DungeonGen dgen(this, &dp);
-		dgen.generate(blockseed, full_node_min, full_node_max);
-	}
+	if ((flags & MG_DUNGEONS) && node_max.Y < 50)
+		generateDungeons(stone_surface_max_y, stone_type);
 
 	// Generate the registered decorations
 	if (flags & MG_DECORATIONS)
@@ -390,11 +300,6 @@ void MapgenValleys::calculateNoise()
 
 	//TimeTaker tcn("actualNoise");
 
-	noise_filler_depth->perlinMap2D(x, z);
-	noise_heat_blend->perlinMap2D(x, z);
-	noise_heat->perlinMap2D(x, z);
-	noise_humidity_blend->perlinMap2D(x, z);
-	noise_humidity->perlinMap2D(x, z);
 	noise_inter_valley_slope->perlinMap2D(x, z);
 	noise_rivers->perlinMap2D(x, z);
 	noise_terrain_height->perlinMap2D(x, z);
@@ -418,9 +323,8 @@ void MapgenValleys::calculateNoise()
 	}
 
 	for (s32 index = 0; index < csize.X * csize.Z; index++) {
-		noise_heat->result[index] += noise_heat_blend->result[index] + heat_offset;
-		noise_humidity->result[index] *= humidity_scale;
-		noise_humidity->result[index] += noise_humidity_blend->result[index];
+		m_bgen->heatmap[index] += heat_offset;
+		m_bgen->humidmap[index] *= humidity_scale;
 	}
 
 	TerrainNoise tn;
@@ -450,9 +354,6 @@ void MapgenValleys::calculateNoise()
 		float mount = terrainLevelFromNoise(&tn);
 		noise_terrain_height->result[index] = mount;
 	}
-
-	heatmap  = noise_heat->result;
-	humidmap = noise_humidity->result;
 }
 
 
@@ -583,7 +484,6 @@ int MapgenValleys::generateTerrain()
 
 	MapNode n_air(CONTENT_AIR);
 	MapNode n_river_water(c_river_water_source);
-	MapNode n_sand(c_sand);
 	MapNode n_stone(c_stone);
 	MapNode n_water(c_water_source);
 
@@ -596,7 +496,7 @@ int MapgenValleys::generateTerrain()
 		float river_y = noise_rivers->result[index_2d];
 		float surface_y = noise_terrain_height->result[index_2d];
 		float slope = noise_inter_valley_slope->result[index_2d];
-		float t_heat = noise_heat->result[index_2d];
+		float t_heat = m_bgen->heatmap[index_2d];
 
 		heightmap[index_2d] = -MAX_MAP_GENERATION_LIMIT;
 
@@ -610,14 +510,14 @@ int MapgenValleys::generateTerrain()
 				t_heat -= alt_to_heat * MYMAX(surface_y, river_y) / altitude_chill;
 
 			// If humidity is low or heat is high, lower the water table.
-			float delta = noise_humidity->result[index_2d] - 50.f;
+			float delta = m_bgen->humidmap[index_2d] - 50.f;
 			if (delta < 0.f) {
 				float t_evap = (t_heat - 32.f) / evaporation;
 				river_y += delta * MYMAX(t_evap, 0.08f);
 			}
 		}
 
-		u32 index_3d = (z - node_min.Z) * zstride + (x - node_min.X);
+		u32 index_3d = (z - node_min.Z) * zstride_1u1d + (x - node_min.X);
 		u32 index_data = vm->m_area.index(x, node_min.Y - 1, z);
 
 		// Mapgens concern themselves with stone and water.
@@ -627,10 +527,7 @@ int MapgenValleys::generateTerrain()
 				float surface_delta = (float)y - surface_y;
 				bool river = y + 1 < river_y;
 
-				if (fabs(surface_delta) <= 0.5f && y > water_level && river) {
-					// river bottom
-					vm->m_data[index_data] = n_sand;
-				} else if (slope * fill > surface_delta) {
+				if (slope * fill > surface_delta) {
 					// ground
 					vm->m_data[index_data] = n_stone;
 					if (y > heightmap[index_2d])
@@ -643,7 +540,7 @@ int MapgenValleys::generateTerrain()
 				} else if (river) {
 					// river
 					vm->m_data[index_data] = n_river_water;
-				} else {
+				} else {  // air
 					vm->m_data[index_data] = n_air;
 				}
 			}
@@ -672,7 +569,7 @@ int MapgenValleys::generateTerrain()
 			// Use base ground (water table) in a riverbed, to
 			// avoid an unnatural rise in humidity.
 			float t_alt = MYMAX(noise_rivers->result[index_2d], (float)heightmap[index_2d]);
-			float humid = noise_humidity->result[index_2d];
+			float humid = m_bgen->humidmap[index_2d];
 			float water_depth = (t_alt - river_y) / humidity_dropoff;
 			humid *= 1.f + pow(0.5f, MYMAX(water_depth, 1.f));
 
@@ -683,7 +580,7 @@ int MapgenValleys::generateTerrain()
 			if (t_alt > 0.f)
 				humid -= alt_to_humid * t_alt / altitude_chill;
 
-			noise_humidity->result[index_2d] = humid;
+			m_bgen->humidmap[index_2d] = humid;
 		}
 
 		// Assign the heat adjusted by any changed altitudes.
@@ -693,175 +590,16 @@ int MapgenValleys::generateTerrain()
 			float t_alt = MYMAX(noise_rivers->result[index_2d], (float)heightmap[index_2d]);
 			if (humid_rivers && heightmap[index_2d] == (s16)myround(surface_y))
 				// The altitude hasn't changed. Use the first result.
-				noise_heat->result[index_2d] = t_heat;
+				m_bgen->heatmap[index_2d] = t_heat;
 			else if (t_alt > 0.f)
-				noise_heat->result[index_2d] -= alt_to_heat * t_alt / altitude_chill;
+				m_bgen->heatmap[index_2d] -= alt_to_heat * t_alt / altitude_chill;
 		}
 	}
 
 	return surface_max_y;
 }
 
-
-MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map)
-{
-	v3s16 em = vm->m_area.getExtent();
-	u32 index = 0;
-	MgStoneType stone_type = STONE;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
-		Biome *biome = NULL;
-		u16 depth_top = 0;
-		u16 base_filler = 0;
-		u16 depth_water_top = 0;
-		u32 vi = vm->m_area.index(x, node_max.Y, z);
-
-		// Check node at base of mapchunk above, either a node of a previously
-		// generated mapchunk or if not, a node of overgenerated base terrain.
-		content_t c_above = vm->m_data[vi + em.X].getContent();
-		bool air_above = c_above == CONTENT_AIR;
-		bool water_above = (c_above == c_water_source || c_above == c_river_water_source);
-
-		// If there is air or water above enable top/filler placement, otherwise force
-		// nplaced to stone level by setting a number exceeding any possible filler depth.
-		u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
-
-		for (s16 y = node_max.Y; y >= node_min.Y; y--) {
-			content_t c = vm->m_data[vi].getContent();
-
-			// Biome is recalculated each time an upper surface is detected while
-			// working down a column. The selected biome then remains in effect for
-			// all nodes below until the next surface and biome recalculation.
-			// Biome is recalculated:
-			// 1. At the surface of stone below air or water.
-			// 2. At the surface of water below air.
-			// 3. When stone or water is detected but biome has not yet been calculated.
-			if ((c == c_stone && (air_above || water_above || !biome))
-					|| ((c == c_water_source || c == c_river_water_source)
-							&& (air_above || !biome))) {
-				// Both heat and humidity have already been adjusted for altitude.
-				biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
-
-				depth_top = biome->depth_top;
-				base_filler = MYMAX(depth_top
-						+ biome->depth_filler
-						+ noise_filler_depth->result[index], 0.f);
-				depth_water_top = biome->depth_water_top;
-
-				// Detect stone type for dungeons during every biome calculation.
-				// This is more efficient than detecting per-node and will not
-				// miss any desert stone or sandstone biomes.
-				if (biome->c_stone == c_desert_stone)
-					stone_type = DESERT_STONE;
-				else if (biome->c_stone == c_sandstone)
-					stone_type = SANDSTONE;
-			}
-
-			if (c == c_stone) {
-				content_t c_below = vm->m_data[vi - em.X].getContent();
-
-				// If the node below isn't solid, make this node stone, so that
-				// any top/filler nodes above are structurally supported.
-				// This is done by aborting the cycle of top/filler placement
-				// immediately by forcing nplaced to stone level.
-				if (c_below == CONTENT_AIR
-						|| c_below == c_water_source
-						|| c_below == c_river_water_source)
-					nplaced = U16_MAX;
-
-				if (nplaced < depth_top) {
-					vm->m_data[vi] = MapNode(biome->c_top);
-					nplaced++;
-				} else if (nplaced < base_filler) {
-					vm->m_data[vi] = MapNode(biome->c_filler);
-					nplaced++;
-				} else {
-					vm->m_data[vi] = MapNode(biome->c_stone);
-				}
-
-				air_above = false;
-				water_above = false;
-			} else if (c == c_water_source) {
-				vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top))
-						? biome->c_water_top : biome->c_water);
-				nplaced = 0;  // Enable top/filler placement for next surface
-				air_above = false;
-				water_above = true;
-			} else if (c == c_river_water_source) {
-				vm->m_data[vi] = MapNode(biome->c_river_water);
-				nplaced = depth_top;  // Enable filler placement for next surface
-				air_above = false;
-				water_above = true;
-			} else if (c == CONTENT_AIR) {
-				nplaced = 0;  // Enable top/filler placement for next surface
-				air_above = true;
-				water_above = false;
-			} else {  // Possible various nodes overgenerated from neighbouring mapchunks
-				nplaced = U16_MAX;  // Disable top/filler placement
-				air_above = false;
-				water_above = false;
-			}
-
-			vm->m_area.add_y(em, vi, -1);
-		}
-	}
-
-	return stone_type;
-}
-
-
-void MapgenValleys::dustTopNodes()
-{
-	if (node_max.Y < water_level)
-		return;
-
-	v3s16 em = vm->m_area.getExtent();
-	u32 index = 0;
-
-	for (s16 z = node_min.Z; z <= node_max.Z; z++)
-	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
-		Biome *biome = (Biome *)bmgr->getRaw(biomemap[index]);
-
-		if (biome->c_dust == CONTENT_IGNORE)
-			continue;
-
-		u32 vi = vm->m_area.index(x, full_node_max.Y, z);
-		content_t c_full_max = vm->m_data[vi].getContent();
-		s16 y_start;
-
-		if (c_full_max == CONTENT_AIR) {
-			y_start = full_node_max.Y - 1;
-		} else if (c_full_max == CONTENT_IGNORE) {
-			vi = vm->m_area.index(x, node_max.Y + 1, z);
-			content_t c_max = vm->m_data[vi].getContent();
-
-			if (c_max == CONTENT_AIR)
-				y_start = node_max.Y;
-			else
-				continue;
-		} else {
-			continue;
-		}
-
-		vi = vm->m_area.index(x, y_start, z);
-		for (s16 y = y_start; y >= node_min.Y - 1; y--) {
-			if (vm->m_data[vi].getContent() != CONTENT_AIR)
-				break;
-
-			vm->m_area.add_y(em, vi, -1);
-		}
-
-		content_t c = vm->m_data[vi].getContent();
-		if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
-			vm->m_area.add_y(em, vi, 1);
-			vm->m_data[vi] = MapNode(biome->c_dust);
-		}
-	}
-}
-
-
-void MapgenValleys::generateCaves(s16 max_stone_y)
+void MapgenValleys::generateCaves(s16 max_stone_y, s16 large_cave_depth)
 {
 	if (max_stone_y < node_min.Y)
 		return;
@@ -925,8 +663,9 @@ void MapgenValleys::generateCaves(s16 max_stone_y)
 	u32 index_2d = 0;
 	for (s16 z = node_min.Z; z <= node_max.Z; z++)
 	for (s16 x = node_min.X; x <= node_max.X; x++, index_2d++) {
-		Biome *biome = (Biome *)bmgr->getRaw(biomemap[index_2d]);
+		Biome *biome = (Biome *)m_bmgr->getRaw(biomemap[index_2d]);
 		bool tunnel_air_above = false;
+		bool is_under_river = false;
 		bool underground = false;
 		u32 index_data = vm->m_area.index(x, node_max.Y, z);
 		u32 index_3d = (z - node_min.Z) * zstride_1d + csize.Y * ystride + (x - node_min.X);
@@ -958,14 +697,13 @@ void MapgenValleys::generateCaves(s16 max_stone_y)
 			}
 
 			content_t c = vm->m_data[index_data].getContent();
+			// Detect river water to place riverbed nodes in tunnels
+			if (c == biome->c_river_water)
+				is_under_river = true;
+
 			float d1 = contour(noise_cave1->result[index_3d]);
 			float d2 = contour(noise_cave2->result[index_3d]);
 
-			// River water is not set as ground content
-			// in the default game. This can produce strange results
-			// when a tunnel undercuts a river. However, that's not for
-			// the mapgen to correct. Fix it in lua.
-
 			if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) {
 				// in a tunnel
 				vm->m_data[index_data] = n_air;
@@ -978,8 +716,10 @@ void MapgenValleys::generateCaves(s16 max_stone_y)
 					vm->m_area.add_y(em, j, 1);
 
 					if (sr > terrain - y) {
-						// Put dirt in tunnels near the surface.
-						if (underground)
+						// Put biome nodes in tunnels near the surface
+						if (is_under_river)
+							vm->m_data[index_data] = MapNode(biome->c_riverbed);
+						else if (underground)
 							vm->m_data[index_data] = MapNode(biome->c_filler);
 						else
 							vm->m_data[index_data] = MapNode(biome->c_top);
@@ -1010,8 +750,10 @@ void MapgenValleys::generateCaves(s16 max_stone_y)
 	if (node_max.Y <= large_cave_depth && !made_a_big_one) {
 		u32 bruises_count = ps.range(0, 2);
 		for (u32 i = 0; i < bruises_count; i++) {
-			CaveV5 cave(this, &ps);
-			cave.makeCave(node_min, node_max, max_stone_y);
+			CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
+				c_water_source, c_lava_source);
+
+			cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y, heightmap);
 		}
 	}
 }
diff --git a/src/mapgen_valleys.h b/src/mapgen_valleys.h
index 5224ea5..6dd7ebc 100644
--- a/src/mapgen_valleys.h
+++ b/src/mapgen_valleys.h
@@ -39,13 +39,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define MYCUBE(x) (x) * (x) * (x)
 
 class BiomeManager;
+class BiomeGenOriginal;
 
 // Global profiler
 //class Profiler;
 //extern Profiler *mapgen_profiler;
 
 
-struct MapgenValleysParams : public MapgenSpecificParams {
+struct MapgenValleysParams : public MapgenParams {
 	u32 spflags;
 	s16 large_cave_depth;
 	s16 massive_cave_depth;
@@ -84,24 +85,21 @@ struct TerrainNoise {
 	float inter_valley_fill;
 };
 
-class MapgenValleys : public Mapgen {
+class MapgenValleys : public MapgenBasic {
 public:
 
-	MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager *emerge);
+	MapgenValleys(int mapgenid, MapgenValleysParams *params, EmergeManager *emerge);
 	~MapgenValleys();
 
+	virtual MapgenType getType() const { return MAPGEN_VALLEYS; }
+
 	virtual void makeChunk(BlockMakeData *data);
 	int getSpawnLevelAtPoint(v2s16 p);
 
 	s16 large_cave_depth;
 
 private:
-	EmergeManager *m_emerge;
-	BiomeManager *bmgr;
-
-	int ystride;
-	int zstride;
-	int zstride_1d;
+	BiomeGenOriginal *m_bgen;
 
 	float map_gen_limit;
 
@@ -111,12 +109,6 @@ private:
 	s16 cave_water_max_height;
 	s16 lava_max_height;
 
-	v3s16 node_min;
-	v3s16 node_max;
-	v3s16 full_node_min;
-	v3s16 full_node_max;
-
-	u32 spflags;
 	float altitude_chill;
 	s16 lava_features_lim;
 	s16 massive_cave_depth;
@@ -124,37 +116,17 @@ private:
 	float river_size_factor;
 	float *tcave_cache;
 	s16 water_features_lim;
-	float cave_width;
-	Noise *noise_filler_depth;
-	Noise *noise_cave1;
-	Noise *noise_cave2;
 	Noise *noise_inter_valley_fill;
 	Noise *noise_inter_valley_slope;
 	Noise *noise_rivers;
+	Noise *noise_cave1;
+	Noise *noise_cave2;
 	Noise *noise_massive_caves;
 	Noise *noise_terrain_height;
 	Noise *noise_valley_depth;
 	Noise *noise_valley_profile;
 
-	Noise *noise_heat;
-	Noise *noise_heat_blend;
-	Noise *noise_humidity;
-	Noise *noise_humidity_blend;
-
-	content_t c_cobble;
-	content_t c_desert_stone;
-	content_t c_dirt;
-	content_t c_ice;
 	content_t c_lava_source;
-	content_t c_mossycobble;
-	content_t c_river_water_source;
-	content_t c_sand;
-	content_t c_sandstone;
-	content_t c_sandstonebrick;
-	content_t c_stair_cobble;
-	content_t c_stair_sandstonebrick;
-	content_t c_stone;
-	content_t c_water_source;
 
 	float terrainLevelAtPoint(s16 x, s16 z);
 
@@ -164,24 +136,7 @@ private:
 	float terrainLevelFromNoise(TerrainNoise *tn);
 	float adjustedTerrainLevelFromNoise(TerrainNoise *tn);
 
-	float humidityByTerrain(float humidity_base, float mount, float rivers, float valley);
-
-	MgStoneType generateBiomes(float *heat_map, float *humidity_map);
-	void dustTopNodes();
-
-	void generateCaves(s16 max_stone_y);
-};
-
-struct MapgenFactoryValleys : public MapgenFactory {
-	Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
-	{
-		return new MapgenValleys(mgid, params, emerge);
-	};
-
-	MapgenSpecificParams *createMapgenParams()
-	{
-		return new MapgenValleysParams();
-	};
+	virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth);
 };
 
 #endif
diff --git a/src/mapnode.cpp b/src/mapnode.cpp
index eba4744..5efebf3 100644
--- a/src/mapnode.cpp
+++ b/src/mapnode.cpp
@@ -54,10 +54,10 @@ MapNode::MapNode(INodeDefManager *ndef, const std::string &name,
 	param2 = a_param2;
 }
 
-void MapNode::setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr)
+void MapNode::setLight(enum LightBank bank, u8 a_light, const ContentFeatures &f)
 {
 	// If node doesn't contain light data, ignore this
-	if(nodemgr->get(*this).param_type != CPT_LIGHT)
+	if(f.param_type != CPT_LIGHT)
 		return;
 	if(bank == LIGHTBANK_DAY)
 	{
@@ -73,6 +73,11 @@ void MapNode::setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr
 		assert("Invalid light bank" == NULL);
 }
 
+void MapNode::setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr)
+{
+	setLight(bank, a_light, nodemgr->get(*this));
+}
+
 bool MapNode::isLightDayNightEq(INodeDefManager *nodemgr) const
 {
 	const ContentFeatures &f = nodemgr->get(*this);
@@ -103,6 +108,13 @@ u8 MapNode::getLight(enum LightBank bank, INodeDefManager *nodemgr) const
 	return MYMAX(f.light_source, light);
 }
 
+u8 MapNode::getLightRaw(enum LightBank bank, const ContentFeatures &f) const
+{
+	if(f.param_type == CPT_LIGHT)
+		return bank == LIGHTBANK_DAY ? param1 & 0x0f : (param1 >> 4) & 0x0f;
+	return 0;
+}
+
 u8 MapNode::getLightNoChecks(enum LightBank bank, const ContentFeatures *f) const
 {
 	return MYMAX(f->light_source,
diff --git a/src/mapnode.h b/src/mapnode.h
index 2f6224f..0bd61c5 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -191,6 +191,8 @@ struct MapNode
 		param2 = p;
 	}
 
+	void setLight(enum LightBank bank, u8 a_light, const ContentFeatures &f);
+
 	void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr);
 
 	/**
@@ -202,6 +204,13 @@ struct MapNode
 
 	u8 getLight(enum LightBank bank, INodeDefManager *nodemgr) const;
 
+	/*!
+	 * Returns the node's light level from param1.
+	 * If the node emits light, it is ignored.
+	 * \param f the ContentFeatures of this node.
+	 */
+	u8 getLightRaw(enum LightBank bank, const ContentFeatures &f) const;
+
 	/**
 	 * This function differs from getLight(enum LightBank bank, INodeDefManager *nodemgr)
 	 * in that the ContentFeatures of the node in question are not retrieved by
diff --git a/src/mapsector.cpp b/src/mapsector.cpp
index 1588a59..410689f 100644
--- a/src/mapsector.cpp
+++ b/src/mapsector.cpp
@@ -42,9 +42,8 @@ void MapSector::deleteBlocks()
 	m_block_cache = NULL;
 
 	// Delete all
-	for(std::map<s16, MapBlock*>::iterator i = m_blocks.begin();
-		i != m_blocks.end(); ++i)
-	{
+	for (UNORDERED_MAP<s16, MapBlock*>::iterator i = m_blocks.begin();
+		 	i != m_blocks.end(); ++i) {
 		delete i->second;
 	}
 
@@ -56,20 +55,13 @@ MapBlock * MapSector::getBlockBuffered(s16 y)
 {
 	MapBlock *block;
 
-	if(m_block_cache != NULL && y == m_block_cache_y){
+	if (m_block_cache != NULL && y == m_block_cache_y) {
 		return m_block_cache;
 	}
 
 	// If block doesn't exist, return NULL
-	std::map<s16, MapBlock*>::iterator n = m_blocks.find(y);
-	if(n == m_blocks.end())
-	{
-		block = NULL;
-	}
-	// If block exists, return it
-	else{
-		block = n->second;
-	}
+	UNORDERED_MAP<s16, MapBlock*>::iterator n = m_blocks.find(y);
+	block = (n != m_blocks.end() ? n->second : NULL);
 
 	// Cache the last result
 	m_block_cache_y = y;
@@ -135,18 +127,12 @@ void MapSector::deleteBlock(MapBlock *block)
 
 void MapSector::getBlocks(MapBlockVect &dest)
 {
-	for(std::map<s16, MapBlock*>::iterator bi = m_blocks.begin();
-		bi != m_blocks.end(); ++bi)
-	{
+	for (UNORDERED_MAP<s16, MapBlock*>::iterator bi = m_blocks.begin();
+		bi != m_blocks.end(); ++bi) {
 		dest.push_back(bi->second);
 	}
 }
 
-bool MapSector::empty()
-{
-	return m_blocks.empty();
-}
-
 /*
 	ServerMapSector
 */
diff --git a/src/mapsector.h b/src/mapsector.h
index 4c1ce86..c3bff35 100644
--- a/src/mapsector.h
+++ b/src/mapsector.h
@@ -63,7 +63,7 @@ public:
 
 	void getBlocks(MapBlockVect &dest);
 
-	bool empty();
+	bool empty() const { return m_blocks.empty(); }
 
 	// Always false at the moment, because sector contains no metadata.
 	bool differs_from_disk;
@@ -71,7 +71,7 @@ public:
 protected:
 
 	// The pile of MapBlocks
-	std::map<s16, MapBlock*> m_blocks;
+	UNORDERED_MAP<s16, MapBlock*> m_blocks;
 
 	Map *m_parent;
 	// Position on parent (in MapBlock widths)
diff --git a/src/mesh.cpp b/src/mesh.cpp
index b5bf866..b68862d 100644
--- a/src/mesh.cpp
+++ b/src/mesh.cpp
@@ -226,7 +226,27 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
 				vertex->Color = colorY;
 			else
 				vertex->Color = colorZ;
+		}
+	}
+}
+
+void setMeshColorByNormal(scene::IMesh *mesh, const v3f &normal,
+		const video::SColor &color)
+{
+	if (!mesh)
+		return;
 
+	u16 mc = mesh->getMeshBufferCount();
+	for (u16 j = 0; j < mc; j++) {
+		scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
+		const u32 stride = getVertexPitchFromType(buf->getVertexType());
+		u32 vertex_count = buf->getVertexCount();
+		u8 *vertices = (u8 *)buf->getVertices();
+		for (u32 i = 0; i < vertex_count; i++) {
+			video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride);
+			if (normal == vertex->Normal) {
+				vertex->Color = color;
+			}
 		}
 	}
 }
diff --git a/src/mesh.h b/src/mesh.h
index 8e18937..10df970 100644
--- a/src/mesh.h
+++ b/src/mesh.h
@@ -64,6 +64,10 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
 		const video::SColor &colorX,
 		const video::SColor &colorY,
 		const video::SColor &colorZ);
+
+void setMeshColorByNormal(scene::IMesh *mesh, const v3f &normal,
+		const video::SColor &color);
+
 /*
 	Rotate the mesh by 6d facedir value.
 	Method only for meshnodes, not suitable for entities.
diff --git a/src/mg_biome.cpp b/src/mg_biome.cpp
index 9ab8d06..78034bf 100644
--- a/src/mg_biome.cpp
+++ b/src/mg_biome.cpp
@@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/numeric.h"
 #include "util/mathconstants.h"
 #include "porting.h"
+#include "settings.h"
 
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -45,6 +46,7 @@ BiomeManager::BiomeManager(IGameDef *gamedef) :
 	b->depth_top       = 0;
 	b->depth_filler    = -MAX_MAP_GENERATION_LIMIT;
 	b->depth_water_top = 0;
+	b->depth_riverbed  = 0;
 	b->y_min           = -MAX_MAP_GENERATION_LIMIT;
 	b->y_max           = MAX_MAP_GENERATION_LIMIT;
 	b->heat_point      = 0.0;
@@ -56,6 +58,7 @@ BiomeManager::BiomeManager(IGameDef *gamedef) :
 	b->m_nodenames.push_back("mapgen_water_source");
 	b->m_nodenames.push_back("mapgen_water_source");
 	b->m_nodenames.push_back("mapgen_river_water_source");
+	b->m_nodenames.push_back("mapgen_stone");
 	b->m_nodenames.push_back("ignore");
 	m_ndef->pendNodeResolve(b);
 
@@ -63,33 +66,152 @@ BiomeManager::BiomeManager(IGameDef *gamedef) :
 }
 
 
-
 BiomeManager::~BiomeManager()
 {
-	//if (biomecache)
-	//	delete[] biomecache;
 }
 
 
+void BiomeManager::clear()
+{
+	EmergeManager *emerge = m_gamedef->getEmergeManager();
+
+	// Remove all dangling references in Decorations
+	DecorationManager *decomgr = emerge->decomgr;
+	for (size_t i = 0; i != decomgr->getNumObjects(); i++) {
+		Decoration *deco = (Decoration *)decomgr->getRaw(i);
+		deco->biomes.clear();
+	}
+
+	// Don't delete the first biome
+	for (size_t i = 1; i < m_objects.size(); i++)
+		delete (Biome *)m_objects[i];
+
+	m_objects.resize(1);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+
+void BiomeParamsOriginal::readParams(const Settings *settings)
+{
+	settings->getNoiseParams("mg_biome_np_heat",           np_heat);
+	settings->getNoiseParams("mg_biome_np_heat_blend",     np_heat_blend);
+	settings->getNoiseParams("mg_biome_np_humidity",       np_humidity);
+	settings->getNoiseParams("mg_biome_np_humidity_blend", np_humidity_blend);
+}
+
+
+void BiomeParamsOriginal::writeParams(Settings *settings) const
+{
+	settings->setNoiseParams("mg_biome_np_heat",           np_heat);
+	settings->setNoiseParams("mg_biome_np_heat_blend",     np_heat_blend);
+	settings->setNoiseParams("mg_biome_np_humidity",       np_humidity);
+	settings->setNoiseParams("mg_biome_np_humidity_blend", np_humidity_blend);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+
+BiomeGenOriginal::BiomeGenOriginal(BiomeManager *biomemgr,
+	BiomeParamsOriginal *params, v3s16 chunksize)
+{
+	m_bmgr   = biomemgr;
+	m_params = params;
+	m_csize  = chunksize;
+
+	noise_heat           = new Noise(&params->np_heat,
+									params->seed, m_csize.X, m_csize.Z);
+	noise_humidity       = new Noise(&params->np_humidity,
+									params->seed, m_csize.X, m_csize.Z);
+	noise_heat_blend     = new Noise(&params->np_heat_blend,
+									params->seed, m_csize.X, m_csize.Z);
+	noise_humidity_blend = new Noise(&params->np_humidity_blend,
+									params->seed, m_csize.X, m_csize.Z);
+
+	heatmap  = noise_heat->result;
+	humidmap = noise_humidity->result;
+	biomemap = new biome_t[m_csize.X * m_csize.Z];
+}
+
+BiomeGenOriginal::~BiomeGenOriginal()
+{
+	delete []biomemap;
+
+	delete noise_heat;
+	delete noise_humidity;
+	delete noise_heat_blend;
+	delete noise_humidity_blend;
+}
+
+
+Biome *BiomeGenOriginal::calcBiomeAtPoint(v3s16 pos) const
+{
+	float heat =
+		NoisePerlin2D(&m_params->np_heat,       pos.X, pos.Z, m_params->seed) +
+		NoisePerlin2D(&m_params->np_heat_blend, pos.X, pos.Z, m_params->seed);
+	float humidity =
+		NoisePerlin2D(&m_params->np_humidity,       pos.X, pos.Z, m_params->seed) +
+		NoisePerlin2D(&m_params->np_humidity_blend, pos.X, pos.Z, m_params->seed);
+
+	return calcBiomeFromNoise(heat, humidity, pos.Y);
+}
+
+
+void BiomeGenOriginal::calcBiomeNoise(v3s16 pmin)
+{
+	m_pmin = pmin;
+
+	noise_heat->perlinMap2D(pmin.X, pmin.Z);
+	noise_humidity->perlinMap2D(pmin.X, pmin.Z);
+	noise_heat_blend->perlinMap2D(pmin.X, pmin.Z);
+	noise_humidity_blend->perlinMap2D(pmin.X, pmin.Z);
+
+	for (s32 i = 0; i < m_csize.X * m_csize.Z; i++) {
+		noise_heat->result[i]     += noise_heat_blend->result[i];
+		noise_humidity->result[i] += noise_humidity_blend->result[i];
+	}
+}
 
-// just a PoC, obviously needs optimization later on (precalculate this)
-void BiomeManager::calcBiomes(s16 sx, s16 sy, float *heat_map,
-	float *humidity_map, s16 *height_map, u8 *biomeid_map)
+
+biome_t *BiomeGenOriginal::getBiomes(s16 *heightmap)
 {
-	for (s32 i = 0; i != sx * sy; i++) {
-		Biome *biome = getBiome(heat_map[i], humidity_map[i], height_map[i]);
-		biomeid_map[i] = biome->index;
+	for (s32 i = 0; i != m_csize.X * m_csize.Z; i++) {
+		Biome *biome = calcBiomeFromNoise(
+			noise_heat->result[i],
+			noise_humidity->result[i],
+			heightmap[i]);
+
+		biomemap[i] = biome->index;
 	}
+
+	return biomemap;
+}
+
+
+Biome *BiomeGenOriginal::getBiomeAtPoint(v3s16 pos) const
+{
+	return getBiomeAtIndex(
+		(pos.Z - m_pmin.Z) * m_csize.X + (pos.X - m_pmin.X),
+		pos.Y);
+}
+
+
+Biome *BiomeGenOriginal::getBiomeAtIndex(size_t index, s16 y) const
+{
+	return calcBiomeFromNoise(
+		noise_heat->result[index],
+		noise_humidity->result[index],
+		y);
 }
 
 
-Biome *BiomeManager::getBiome(float heat, float humidity, s16 y)
+Biome *BiomeGenOriginal::calcBiomeFromNoise(float heat, float humidity, s16 y) const
 {
 	Biome *b, *biome_closest = NULL;
 	float dist_min = FLT_MAX;
 
-	for (size_t i = 1; i < m_objects.size(); i++) {
-		b = (Biome *)m_objects[i];
+	for (size_t i = 1; i < m_bmgr->getNumObjects(); i++) {
+		b = (Biome *)m_bmgr->getRaw(i);
 		if (!b || y > b->y_max || y < b->y_min)
 			continue;
 
@@ -103,32 +225,11 @@ Biome *BiomeManager::getBiome(float heat, float humidity, s16 y)
 		}
 	}
 
-	return biome_closest ? biome_closest : (Biome *)m_objects[0];
+	return biome_closest ? biome_closest : (Biome *)m_bmgr->getRaw(BIOME_NONE);
 }
 
-void BiomeManager::clear()
-{
-	EmergeManager *emerge = m_gamedef->getEmergeManager();
-
-	// Remove all dangling references in Decorations
-	DecorationManager *decomgr = emerge->decomgr;
-	for (size_t i = 0; i != decomgr->getNumObjects(); i++) {
-		Decoration *deco = (Decoration *)decomgr->getRaw(i);
-		deco->biomes.clear();
-	}
-
-	// Don't delete the first biome
-	for (size_t i = 1; i < m_objects.size(); i++) {
-		Biome *b = (Biome *)m_objects[i];
-		delete b;
-	}
-
-	m_objects.resize(1);
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
 
+////////////////////////////////////////////////////////////////////////////////
 
 void Biome::resolveNodeNames()
 {
@@ -138,5 +239,6 @@ void Biome::resolveNodeNames()
 	getIdFromNrBacklog(&c_water_top,   "mapgen_water_source",       CONTENT_AIR);
 	getIdFromNrBacklog(&c_water,       "mapgen_water_source",       CONTENT_AIR);
 	getIdFromNrBacklog(&c_river_water, "mapgen_river_water_source", CONTENT_AIR);
+	getIdFromNrBacklog(&c_riverbed,    "mapgen_stone",              CONTENT_AIR);
 	getIdFromNrBacklog(&c_dust,        "ignore",                    CONTENT_IGNORE);
 }
diff --git a/src/mg_biome.h b/src/mg_biome.h
index 8d519f8..a10193b 100644
--- a/src/mg_biome.h
+++ b/src/mg_biome.h
@@ -22,14 +22,26 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "objdef.h"
 #include "nodedef.h"
+#include "noise.h"
 
-enum BiomeType
-{
-	BIOME_NORMAL,
-	BIOME_LIQUID,
-	BIOME_NETHER,
-	BIOME_AETHER,
-	BIOME_FLAT
+class Settings;
+class BiomeManager;
+
+////
+//// Biome
+////
+
+typedef u8 biome_t;
+
+#define BIOME_NONE ((biome_t)0)
+
+// TODO(hmmmm): Decide whether this is obsolete or will be used in the future
+enum BiomeType {
+	BIOMETYPE_NORMAL,
+	BIOMETYPE_LIQUID,
+	BIOMETYPE_NETHER,
+	BIOMETYPE_AETHER,
+	BIOMETYPE_FLAT,
 };
 
 class Biome : public ObjDef, public NodeResolver {
@@ -42,11 +54,13 @@ public:
 	content_t c_water_top;
 	content_t c_water;
 	content_t c_river_water;
+	content_t c_riverbed;
 	content_t c_dust;
 
 	s16 depth_top;
 	s16 depth_filler;
 	s16 depth_water_top;
+	s16 depth_riverbed;
 
 	s16 y_min;
 	s16 y_max;
@@ -56,10 +70,122 @@ public:
 	virtual void resolveNodeNames();
 };
 
-class BiomeManager : public ObjDefManager {
+
+////
+//// BiomeGen
+////
+
+enum BiomeGenType {
+	BIOMEGEN_ORIGINAL,
+};
+
+struct BiomeParams {
+	virtual void readParams(const Settings *settings) = 0;
+	virtual void writeParams(Settings *settings) const = 0;
+	virtual ~BiomeParams() {}
+
+	s32 seed;
+};
+
+class BiomeGen {
+public:
+	virtual ~BiomeGen() {}
+	virtual BiomeGenType getType() const = 0;
+
+	// Calculates the biome at the exact position provided.  This function can
+	// be called at any time, but may be less efficient than the latter methods,
+	// depending on implementation.
+	virtual Biome *calcBiomeAtPoint(v3s16 pos) const = 0;
+
+	// Computes any intermediate results needed for biome generation.  Must be
+	// called before using any of: getBiomes, getBiomeAtPoint, or getBiomeAtIndex.
+	// Calling this invalidates the previous results stored in biomemap.
+	virtual void calcBiomeNoise(v3s16 pmin) = 0;
+
+	// Gets all biomes in current chunk using each corresponding element of
+	// heightmap as the y position, then stores the results by biome index in
+	// biomemap (also returned)
+	virtual biome_t *getBiomes(s16 *heightmap) = 0;
+
+	// Gets a single biome at the specified position, which must be contained
+	// in the region formed by m_pmin and (m_pmin + m_csize - 1).
+	virtual Biome *getBiomeAtPoint(v3s16 pos) const = 0;
+
+	// Same as above, but uses a raw numeric index correlating to the (x,z) position.
+	virtual Biome *getBiomeAtIndex(size_t index, s16 y) const = 0;
+
+	// Result of calcBiomes bulk computation.
+	biome_t *biomemap;
+
+protected:
+	BiomeManager *m_bmgr;
+	v3s16 m_pmin;
+	v3s16 m_csize;
+};
+
+
+////
+//// BiomeGen implementations
+////
+
+//
+// Original biome algorithm (Whittaker's classification + surface height)
+//
+
+struct BiomeParamsOriginal : public BiomeParams {
+	BiomeParamsOriginal() :
+		np_heat(50, 50, v3f(1000.0, 1000.0, 1000.0), 5349, 3, 0.5, 2.0),
+		np_humidity(50, 50, v3f(1000.0, 1000.0, 1000.0), 842, 3, 0.5, 2.0),
+		np_heat_blend(0, 1.5, v3f(8.0, 8.0, 8.0), 13, 2, 1.0, 2.0),
+		np_humidity_blend(0, 1.5, v3f(8.0, 8.0, 8.0), 90003, 2, 1.0, 2.0)
+	{
+	}
+
+	virtual void readParams(const Settings *settings);
+	virtual void writeParams(Settings *settings) const;
+
+	NoiseParams np_heat;
+	NoiseParams np_humidity;
+	NoiseParams np_heat_blend;
+	NoiseParams np_humidity_blend;
+};
+
+class BiomeGenOriginal : public BiomeGen {
 public:
-	static const char *OBJECT_TITLE;
+	BiomeGenOriginal(BiomeManager *biomemgr,
+		BiomeParamsOriginal *params, v3s16 chunksize);
+	virtual ~BiomeGenOriginal();
 
+	BiomeGenType getType() const { return BIOMEGEN_ORIGINAL; }
+
+	Biome *calcBiomeAtPoint(v3s16 pos) const;
+	void calcBiomeNoise(v3s16 pmin);
+
+	biome_t *getBiomes(s16 *heightmap);
+	Biome *getBiomeAtPoint(v3s16 pos) const;
+	Biome *getBiomeAtIndex(size_t index, s16 y) const;
+
+	Biome *calcBiomeFromNoise(float heat, float humidity, s16 y) const;
+
+	float *heatmap;
+	float *humidmap;
+
+private:
+	BiomeParamsOriginal *m_params;
+
+	Noise *noise_heat;
+	Noise *noise_humidity;
+	Noise *noise_heat_blend;
+	Noise *noise_humidity_blend;
+};
+
+
+////
+//// BiomeManager
+////
+
+class BiomeManager : public ObjDefManager {
+public:
 	BiomeManager(IGameDef *gamedef);
 	virtual ~BiomeManager();
 
@@ -73,15 +199,33 @@ public:
 		return new Biome;
 	}
 
-	virtual void clear();
+	BiomeGen *createBiomeGen(BiomeGenType type, BiomeParams *params, v3s16 chunksize)
+	{
+		switch (type) {
+		case BIOMEGEN_ORIGINAL:
+			return new BiomeGenOriginal(this,
+				(BiomeParamsOriginal *)params, chunksize);
+		default:
+			return NULL;
+		}
+	}
 
-	void calcBiomes(s16 sx, s16 sy, float *heat_map, float *humidity_map,
-		s16 *height_map, u8 *biomeid_map);
-	Biome *getBiome(float heat, float humidity, s16 y);
+	static BiomeParams *createBiomeParams(BiomeGenType type)
+	{
+		switch (type) {
+		case BIOMEGEN_ORIGINAL:
+			return new BiomeParamsOriginal;
+		default:
+			return NULL;
+		}
+	}
+
+	virtual void clear();
 
 private:
 	IGameDef *m_gamedef;
+
 };
 
-#endif
 
+#endif
diff --git a/src/mg_decoration.cpp b/src/mg_decoration.cpp
index 8b6abb5..51e4fbb 100644
--- a/src/mg_decoration.cpp
+++ b/src/mg_decoration.cpp
@@ -26,12 +26,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/numeric.h"
 
 FlagDesc flagdesc_deco[] = {
-	{"place_center_x", DECO_PLACE_CENTER_X},
-	{"place_center_y", DECO_PLACE_CENTER_Y},
-	{"place_center_z", DECO_PLACE_CENTER_Z},
+	{"place_center_x",  DECO_PLACE_CENTER_X},
+	{"place_center_y",  DECO_PLACE_CENTER_Y},
+	{"place_center_z",  DECO_PLACE_CENTER_Z},
 	{"force_placement", DECO_FORCE_PLACEMENT},
-	{"liquid_surface", DECO_LIQUID_SURFACE},
-	{NULL,             0}
+	{"liquid_surface",  DECO_LIQUID_SURFACE},
+	{NULL,              0}
 };
 
 
@@ -82,6 +82,56 @@ Decoration::~Decoration()
 void Decoration::resolveNodeNames()
 {
 	getIdsFromNrBacklog(&c_place_on);
+	getIdsFromNrBacklog(&c_spawnby);
+}
+
+
+bool Decoration::canPlaceDecoration(MMVManip *vm, v3s16 p)
+{
+	// Check if the decoration can be placed on this node
+	u32 vi = vm->m_area.index(p);
+	if (!CONTAINS(c_place_on, vm->m_data[vi].getContent()))
+		return false;
+
+	// Don't continue if there are no spawnby constraints
+	if (nspawnby == -1)
+		return true;
+
+	int nneighs = 0;
+	static const v3s16 dirs[16] = {
+		v3s16( 0, 0,  1),
+		v3s16( 0, 0, -1),
+		v3s16( 1, 0,  0),
+		v3s16(-1, 0,  0),
+		v3s16( 1, 0,  1),
+		v3s16(-1, 0,  1),
+		v3s16(-1, 0, -1),
+		v3s16( 1, 0, -1),
+
+		v3s16( 0, 1,  1),
+		v3s16( 0, 1, -1),
+		v3s16( 1, 1,  0),
+		v3s16(-1, 1,  0),
+		v3s16( 1, 1,  1),
+		v3s16(-1, 1,  1),
+		v3s16(-1, 1, -1),
+		v3s16( 1, 1, -1)
+	};
+
+	// Check these 16 neighbouring nodes for enough spawnby nodes
+	for (size_t i = 0; i != ARRLEN(dirs); i++) {
+		u32 index = vm->m_area.index(p + dirs[i]);
+		if (!vm->m_area.contains(index))
+			continue;
+
+		if (CONTAINS(c_spawnby, vm->m_data[index].getContent()))
+			nneighs++;
+	}
+
+	if (nneighs < nspawnby)
+		return false;
+
+	return true;
 }
 
 
@@ -145,7 +195,7 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
 				y < y_min  || y > y_max)
 				continue;
 
-			if (y + getHeight() >= mg->vm->m_area.MaxEdge.Y) {
+			if (y + getHeight() > mg->vm->m_area.MaxEdge.Y) {
 				continue;
 #if 0
 				printf("Decoration at (%d %d %d) cut off\n", x, y, z);
@@ -156,7 +206,7 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
 			}
 
 			if (mg->biomemap) {
-				std::set<u8>::iterator iter;
+				UNORDERED_SET<u8>::iterator iter;
 
 				if (!biomes.empty()) {
 					iter = biomes.find(mg->biomemap[mapindex]);
@@ -236,66 +286,15 @@ void DecoSimple::resolveNodeNames()
 {
 	Decoration::resolveNodeNames();
 	getIdsFromNrBacklog(&c_decos);
-	getIdsFromNrBacklog(&c_spawnby);
 }
 
 
-bool DecoSimple::canPlaceDecoration(MMVManip *vm, v3s16 p)
+size_t DecoSimple::generate(MMVManip *vm, PcgRandom *pr, v3s16 p)
 {
 	// Don't bother if there aren't any decorations to place
 	if (c_decos.size() == 0)
-		return false;
-
-	u32 vi = vm->m_area.index(p);
-
-	// Check if the decoration can be placed on this node
-	if (!CONTAINS(c_place_on, vm->m_data[vi].getContent()))
-		return false;
-
-	// Don't continue if there are no spawnby constraints
-	if (nspawnby == -1)
-		return true;
-
-	int nneighs = 0;
-	v3s16 dirs[16] = {
-		v3s16( 0, 0,  1),
-		v3s16( 0, 0, -1),
-		v3s16( 1, 0,  0),
-		v3s16(-1, 0,  0),
-		v3s16( 1, 0,  1),
-		v3s16(-1, 0,  1),
-		v3s16(-1, 0, -1),
-		v3s16( 1, 0, -1),
-
-		v3s16( 0, 1,  1),
-		v3s16( 0, 1, -1),
-		v3s16( 1, 1,  0),
-		v3s16(-1, 1,  0),
-		v3s16( 1, 1,  1),
-		v3s16(-1, 1,  1),
-		v3s16(-1, 1, -1),
-		v3s16( 1, 1, -1)
-	};
-
-	// Check a Moore neighborhood if there are enough spawnby nodes
-	for (size_t i = 0; i != ARRLEN(dirs); i++) {
-		u32 index = vm->m_area.index(p + dirs[i]);
-		if (!vm->m_area.contains(index))
-			continue;
-
-		if (CONTAINS(c_spawnby, vm->m_data[index].getContent()))
-			nneighs++;
-	}
-
-	if (nneighs < nspawnby)
-		return false;
-
-	return true;
-}
-
+		return 0;
 
-size_t DecoSimple::generate(MMVManip *vm, PcgRandom *pr, v3s16 p)
-{
 	if (!canPlaceDecoration(vm, p))
 		return 0;
 
@@ -316,7 +315,7 @@ size_t DecoSimple::generate(MMVManip *vm, PcgRandom *pr, v3s16 p)
 				!force_placement)
 			break;
 
-		vm->m_data[vi] = MapNode(c_place);
+		vm->m_data[vi] = MapNode(c_place, 0, deco_param2);
 	}
 
 	return 1;
@@ -345,9 +344,7 @@ size_t DecoSchematic::generate(MMVManip *vm, PcgRandom *pr, v3s16 p)
 	if (schematic == NULL)
 		return 0;
 
-	u32 vi = vm->m_area.index(p);
-	content_t c = vm->m_data[vi].getContent();
-	if (!CONTAINS(c_place_on, c))
+	if (!canPlaceDecoration(vm, p))
 		return 0;
 
 	if (flags & DECO_PLACE_CENTER_X)
@@ -370,5 +367,9 @@ size_t DecoSchematic::generate(MMVManip *vm, PcgRandom *pr, v3s16 p)
 
 int DecoSchematic::getHeight()
 {
-	return schematic->size.Y;
+	// Account for a schematic being sunk into the ground by flag.
+	// When placed normally account for how a schematic is placed
+	// sunk 1 node into the ground.
+	return (flags & DECO_PLACE_CENTER_Y) ?
+		(schematic->size.Y - 1) / 2 : schematic->size.Y - 1;
 }
diff --git a/src/mg_decoration.h b/src/mg_decoration.h
index ba3e9d3..986328e 100644
--- a/src/mg_decoration.h
+++ b/src/mg_decoration.h
@@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #ifndef MG_DECORATION_HEADER
 #define MG_DECORATION_HEADER
 
-#include <set>
+#include "util/cpp11_container.h"
 #include "objdef.h"
 #include "noise.h"
 #include "nodedef.h"
@@ -68,6 +68,7 @@ public:
 
 	virtual void resolveNodeNames();
 
+	bool canPlaceDecoration(MMVManip *vm, v3s16 p);
 	size_t placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
 	//size_t placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
 
@@ -82,25 +83,24 @@ public:
 	s16 y_max;
 	float fill_ratio;
 	NoiseParams np;
+	std::vector<content_t> c_spawnby;
+	s16 nspawnby;
 
-	std::set<u8> biomes;
+	UNORDERED_SET<u8> biomes;
 	//std::list<CutoffData> cutoffs;
 	//Mutex cutoff_mutex;
 };
 
 class DecoSimple : public Decoration {
 public:
+	virtual void resolveNodeNames();
 	virtual size_t generate(MMVManip *vm, PcgRandom *pr, v3s16 p);
-	bool canPlaceDecoration(MMVManip *vm, v3s16 p);
 	virtual int getHeight();
 
-	virtual void resolveNodeNames();
-
 	std::vector<content_t> c_decos;
-	std::vector<content_t> c_spawnby;
 	s16 deco_height;
 	s16 deco_height_max;
-	s16 nspawnby;
+	u8 deco_param2;
 };
 
 class DecoSchematic : public Decoration {
diff --git a/src/mg_ore.cpp b/src/mg_ore.cpp
index 2579016..d840d74 100644
--- a/src/mg_ore.cpp
+++ b/src/mg_ore.cpp
@@ -148,7 +148,7 @@ void OreScatter::generate(MMVManip *vm, int mapseed, u32 blockseed,
 
 		if (biomemap && !biomes.empty()) {
 			u32 index = sizex * (z0 - nmin.Z) + (x0 - nmin.X);
-			std::set<u8>::iterator it = biomes.find(biomemap[index]);
+			UNORDERED_SET<u8>::iterator it = biomes.find(biomemap[index]);
 			if (it == biomes.end())
 				continue;
 		}
@@ -202,7 +202,7 @@ void OreSheet::generate(MMVManip *vm, int mapseed, u32 blockseed,
 			continue;
 
 		if (biomemap && !biomes.empty()) {
-			std::set<u8>::iterator it = biomes.find(biomemap[index]);
+			UNORDERED_SET<u8>::iterator it = biomes.find(biomemap[index]);
 			if (it == biomes.end())
 				continue;
 		}
@@ -270,7 +270,7 @@ void OrePuff::generate(MMVManip *vm, int mapseed, u32 blockseed,
 			continue;
 
 		if (biomemap && !biomes.empty()) {
-			std::set<u8>::iterator it = biomes.find(biomemap[index]);
+			UNORDERED_SET<u8>::iterator it = biomes.find(biomemap[index]);
 			if (it == biomes.end())
 				continue;
 		}
@@ -338,7 +338,7 @@ void OreBlob::generate(MMVManip *vm, int mapseed, u32 blockseed,
 
 		if (biomemap && !biomes.empty()) {
 			u32 bmapidx = sizex * (z0 - nmin.Z) + (x0 - nmin.X);
-			std::set<u8>::iterator it = biomes.find(biomemap[bmapidx]);
+			UNORDERED_SET<u8>::iterator it = biomes.find(biomemap[bmapidx]);
 			if (it == biomes.end())
 				continue;
 		}
@@ -422,7 +422,7 @@ void OreVein::generate(MMVManip *vm, int mapseed, u32 blockseed,
 
 		if (biomemap && !biomes.empty()) {
 			u32 bmapidx = sizex * (z - nmin.Z) + (x - nmin.X);
-			std::set<u8>::iterator it = biomes.find(biomemap[bmapidx]);
+			UNORDERED_SET<u8>::iterator it = biomes.find(biomemap[bmapidx]);
 			if (it == biomes.end())
 				continue;
 		}
diff --git a/src/mg_ore.h b/src/mg_ore.h
index 2e065ce..e95fdd3 100644
--- a/src/mg_ore.h
+++ b/src/mg_ore.h
@@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #ifndef MG_ORE_HEADER
 #define MG_ORE_HEADER
 
+#include "util/cpp11_container.h"
 #include "objdef.h"
 #include "noise.h"
 #include "nodedef.h"
@@ -64,7 +65,7 @@ public:
 	float nthresh;      // threshold for noise at which an ore is placed
 	NoiseParams np;     // noise for distribution of clusters (NULL for uniform scattering)
 	Noise *noise;
-	std::set<u8> biomes;
+	UNORDERED_SET<u8> biomes;
 
 	Ore();
 	virtual ~Ore();
diff --git a/src/mg_schematic.cpp b/src/mg_schematic.cpp
index 0b95fa2..e028215 100644
--- a/src/mg_schematic.cpp
+++ b/src/mg_schematic.cpp
@@ -564,14 +564,14 @@ void Schematic::applyProbabilities(v3s16 p0,
 void generate_nodelist_and_update_ids(MapNode *nodes, size_t nodecount,
 	std::vector<std::string> *usednodes, INodeDefManager *ndef)
 {
-	std::map<content_t, content_t> nodeidmap;
+	UNORDERED_MAP<content_t, content_t> nodeidmap;
 	content_t numids = 0;
 
 	for (size_t i = 0; i != nodecount; i++) {
 		content_t id;
 		content_t c = nodes[i].getContent();
 
-		std::map<content_t, content_t>::const_iterator it = nodeidmap.find(c);
+		UNORDERED_MAP<content_t, content_t>::const_iterator it = nodeidmap.find(c);
 		if (it == nodeidmap.end()) {
 			id = numids;
 			numids++;
diff --git a/src/mods.h b/src/mods.h
index 1257651..af7777d 100644
--- a/src/mods.h
+++ b/src/mods.h
@@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <vector>
 #include <string>
 #include <map>
-#include "json/json.h"
+#include <json/json.h>
 #include "config.h"
 
 #define MODNAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_"
diff --git a/src/nameidmapping.cpp b/src/nameidmapping.cpp
index ed59ddd..2af8bef 100644
--- a/src/nameidmapping.cpp
+++ b/src/nameidmapping.cpp
@@ -25,7 +25,7 @@ void NameIdMapping::serialize(std::ostream &os) const
 {
 	writeU8(os, 0); // version
 	writeU16(os, m_id_to_name.size());
-	for(std::map<u16, std::string>::const_iterator
+	for(UNORDERED_MAP<u16, std::string>::const_iterator
 			i = m_id_to_name.begin();
 			i != m_id_to_name.end(); ++i){
 		writeU16(os, i->first);
diff --git a/src/nameidmapping.h b/src/nameidmapping.h
index 417c441..23838c8 100644
--- a/src/nameidmapping.h
+++ b/src/nameidmapping.h
@@ -23,15 +23,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <string>
 #include <iostream>
 #include <set>
-#include <map>
 #include "irrlichttypes_bloated.h"
+#include "util/cpp11_container.h"
 
 class NameIdMapping
 {
 public:
 	void serialize(std::ostream &os) const;
 	void deSerialize(std::istream &is);
-	
+
 	void clear(){
 		m_id_to_name.clear();
 		m_name_to_id.clear();
@@ -55,7 +55,7 @@ public:
 		m_name_to_id.erase(name);
 	}
 	bool getName(u16 id, std::string &result) const{
-		std::map<u16, std::string>::const_iterator i;
+		UNORDERED_MAP<u16, std::string>::const_iterator i;
 		i = m_id_to_name.find(id);
 		if(i == m_id_to_name.end())
 			return false;
@@ -63,7 +63,7 @@ public:
 		return true;
 	}
 	bool getId(const std::string &name, u16 &result) const{
-		std::map<std::string, u16>::const_iterator i;
+		UNORDERED_MAP<std::string, u16>::const_iterator i;
 		i = m_name_to_id.find(name);
 		if(i == m_name_to_id.end())
 			return false;
@@ -74,8 +74,8 @@ public:
 		return m_id_to_name.size();
 	}
 private:
-	std::map<u16, std::string> m_id_to_name;
-	std::map<std::string, u16> m_name_to_id;
+	UNORDERED_MAP<u16, std::string> m_id_to_name;
+	UNORDERED_MAP<std::string, u16> m_name_to_id;
 };
 
 #endif
diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp
index 0498f40..411982f 100644
--- a/src/network/clientpackethandler.cpp
+++ b/src/network/clientpackethandler.cpp
@@ -110,7 +110,7 @@ void Client::handleCommand_AuthAccept(NetworkPacket* pkt)
 	playerpos -= v3f(0, BS / 2, 0);
 
 	// Set player position
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 	player->setPosition(playerpos);
 
@@ -176,7 +176,7 @@ void Client::handleCommand_InitLegacy(NetworkPacket* pkt)
 
 
 	// Set player position
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 	player->setPosition(playerpos_f);
 
@@ -333,7 +333,7 @@ void Client::handleCommand_Inventory(NetworkPacket* pkt)
 	std::string datastring(pkt->getString(0), pkt->getSize());
 	std::istringstream is(datastring, std::ios_base::binary);
 
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 
 	player->inventory.deSerialize(is);
@@ -486,7 +486,7 @@ void Client::handleCommand_ActiveObjectMessages(NetworkPacket* pkt)
 
 void Client::handleCommand_Movement(NetworkPacket* pkt)
 {
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 
 	float mad, maa, maf, msw, mscr, msf, mscl, msj, lf, lfs, ls, g;
@@ -511,7 +511,7 @@ void Client::handleCommand_Movement(NetworkPacket* pkt)
 void Client::handleCommand_HP(NetworkPacket* pkt)
 {
 
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 
 	u8 oldhp   = player->hp;
@@ -532,7 +532,7 @@ void Client::handleCommand_HP(NetworkPacket* pkt)
 
 void Client::handleCommand_Breath(NetworkPacket* pkt)
 {
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 
 	u16 breath;
@@ -544,7 +544,7 @@ void Client::handleCommand_Breath(NetworkPacket* pkt)
 
 void Client::handleCommand_MovePlayer(NetworkPacket* pkt)
 {
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 
 	v3f pos;
@@ -634,7 +634,6 @@ void Client::handleCommand_AnnounceMedia(NetworkPacket* pkt)
 		m_media_downloader->addFile(name, sha1_raw);
 	}
 
-	std::vector<std::string> remote_media;
 	try {
 		std::string str;
 
@@ -812,9 +811,7 @@ void Client::handleCommand_StopSound(NetworkPacket* pkt)
 
 	*pkt >> server_id;
 
-	std::map<s32, int>::iterator i =
-		m_sounds_server_to_client.find(server_id);
-
+	UNORDERED_MAP<s32, int>::iterator i = m_sounds_server_to_client.find(server_id);
 	if (i != m_sounds_server_to_client.end()) {
 		int client_id = i->second;
 		m_sound->stopSound(client_id);
@@ -842,7 +839,7 @@ void Client::handleCommand_Privileges(NetworkPacket* pkt)
 
 void Client::handleCommand_InventoryFormSpec(NetworkPacket* pkt)
 {
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 
 	// Store formspec in LocalPlayer
@@ -898,8 +895,10 @@ void Client::handleCommand_SpawnParticle(NetworkPacket* pkt)
 	bool collisiondetection = readU8(is);
 	std::string texture     = deSerializeLongString(is);
 	bool vertical           = false;
+	bool collision_removal  = false;
 	try {
 		vertical = readU8(is);
+		collision_removal = readU8(is);
 	} catch (...) {}
 
 	ClientEvent event;
@@ -910,6 +909,7 @@ void Client::handleCommand_SpawnParticle(NetworkPacket* pkt)
 	event.spawn_particle.expirationtime     = expirationtime;
 	event.spawn_particle.size               = size;
 	event.spawn_particle.collisiondetection = collisiondetection;
+	event.spawn_particle.collision_removal  = collision_removal;
 	event.spawn_particle.vertical           = vertical;
 	event.spawn_particle.texture            = new std::string(texture);
 
@@ -942,8 +942,13 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt)
 	*pkt >> id;
 
 	bool vertical = false;
+	bool collision_removal = false;
+	u16 attached_id = 0;
 	try {
 		*pkt >> vertical;
+		*pkt >> collision_removal;
+		*pkt >> attached_id;
+
 	} catch (...) {}
 
 	ClientEvent event;
@@ -961,6 +966,8 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt)
 	event.add_particlespawner.minsize            = minsize;
 	event.add_particlespawner.maxsize            = maxsize;
 	event.add_particlespawner.collisiondetection = collisiondetection;
+	event.add_particlespawner.collision_removal  = collision_removal;
+	event.add_particlespawner.attached_id        = attached_id;
 	event.add_particlespawner.vertical           = vertical;
 	event.add_particlespawner.texture            = new std::string(texture);
 	event.add_particlespawner.id                 = id;
@@ -1093,7 +1100,7 @@ void Client::handleCommand_HudSetFlags(NetworkPacket* pkt)
 
 	*pkt >> flags >> mask;
 
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 
 	bool was_minimap_visible = player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE;
@@ -1117,7 +1124,7 @@ void Client::handleCommand_HudSetParam(NetworkPacket* pkt)
 
 	*pkt >> param >> value;
 
-	Player *player = m_env.getLocalPlayer();
+	LocalPlayer *player = m_env.getLocalPlayer();
 	assert(player != NULL);
 
 	if (param == HUD_PARAM_HOTBAR_ITEMCOUNT && value.size() == 4) {
@@ -1126,10 +1133,10 @@ void Client::handleCommand_HudSetParam(NetworkPacket* pkt)
 			player->hud_hotbar_itemcount = hotbar_itemcount;
 	}
 	else if (param == HUD_PARAM_HOTBAR_IMAGE) {
-		((LocalPlayer *) player)->hotbar_image = value;
+		player->hotbar_image = value;
 	}
 	else if (param == HUD_PARAM_HOTBAR_SELECTED_IMAGE) {
-		((LocalPlayer *) player)->hotbar_selected_image = value;
+		player->hotbar_selected_image = value;
 	}
 }
 
diff --git a/src/network/connection.cpp b/src/network/connection.cpp
index f7452d8..b711cae 100644
--- a/src/network/connection.cpp
+++ b/src/network/connection.cpp
@@ -71,6 +71,9 @@ static inline float CALC_DTIME(unsigned int lasttime, unsigned int curtime) {
 
 #define PING_TIMEOUT 5.0
 
+/* maximum number of retries for reliable packets */
+#define MAX_RELIABLE_RETRY 5
+
 static u16 readPeerId(u8 *packetdata)
 {
 	return readU16(&packetdata[4]);
@@ -1399,6 +1402,7 @@ void ConnectionSendThread::runTimeouts(float dtime)
 		}
 
 		float resend_timeout = dynamic_cast<UDPPeer*>(&peer)->getResendTimeout();
+		bool retry_count_exceeded = false;
 		for(u16 i=0; i<CHANNEL_COUNT; i++)
 		{
 			std::list<BufferedPacket> timed_outs;
@@ -1438,6 +1442,13 @@ void ConnectionSendThread::runTimeouts(float dtime)
 				channel->UpdateBytesLost(k->data.getSize());
 				k->resend_count++;
 
+				if (k-> resend_count > MAX_RELIABLE_RETRY) {
+					retry_count_exceeded = true;
+					timeouted_peers.push_back(peer->id);
+					/* no need to check additional packets if a single one did timeout*/
+					break;
+				}
+
 				LOG(derr_con<<m_connection->getDesc()
 						<<"RE-SENDING timed-out RELIABLE to "
 						<< k->address.serializeString()
@@ -1452,9 +1463,18 @@ void ConnectionSendThread::runTimeouts(float dtime)
 				// do not handle rtt here as we can't decide if this packet was
 				// lost or really takes more time to transmit
 			}
+
+			if (retry_count_exceeded) {
+				break; /* no need to check other channels if we already did timeout */
+			}
+
 			channel->UpdateTimers(dtime,dynamic_cast<UDPPeer*>(&peer)->getLegacyPeer());
 		}
 
+		/* skip to next peer if we did timeout */
+		if (retry_count_exceeded)
+			continue;
+
 		/* send ping if necessary */
 		if (dynamic_cast<UDPPeer*>(&peer)->Ping(dtime,data)) {
 			LOG(dout_con<<m_connection->getDesc()
@@ -2167,12 +2187,12 @@ void ConnectionReceiveThread::receive()
 				throw InvalidIncomingDataException("Channel doesn't exist");
 			}
 
-			/* preserve original peer_id for later usage */
-			u16 packet_peer_id   = peer_id;
-
 			/* Try to identify peer by sender address (may happen on join) */
 			if (peer_id == PEER_ID_INEXISTENT) {
 				peer_id = m_connection->lookupPeer(sender);
+				// We do not have to remind the peer of its
+				// peer id as the CONTROLTYPE_SET_PEER_ID
+				// command was sent reliably.
 			}
 
 			/* The peer was not found in our lists. Add it. */
@@ -2214,11 +2234,6 @@ void ConnectionReceiveThread::receive()
 				}
 			}
 
-
-			/* mark peer as seen with id */
-			if (!(packet_peer_id == PEER_ID_INEXISTENT))
-				peer->setSentWithID();
-
 			peer->ResetTimeout();
 
 			Channel *channel = 0;
@@ -2756,7 +2771,7 @@ u16 Connection::lookupPeer(Address& sender)
 	for(; j != m_peers.end(); ++j)
 	{
 		Peer *peer = j->second;
-		if (peer->isActive())
+		if (peer->isPendingDeletion())
 			continue;
 
 		Address tocheck;
diff --git a/src/network/connection.h b/src/network/connection.h
index fe2c981..5ee53b9 100644
--- a/src/network/connection.h
+++ b/src/network/connection.h
@@ -663,8 +663,7 @@ class Peer {
 			m_last_rtt(-1.0),
 			m_usage(0),
 			m_timeout_counter(0.0),
-			m_last_timeout_check(porting::getTimeMs()),
-			m_has_sent_with_id(false)
+			m_last_timeout_check(porting::getTimeMs())
 		{
 			m_rtt.avg_rtt = -1.0;
 			m_rtt.jitter_avg = -1.0;
@@ -687,21 +686,16 @@ class Peer {
 		virtual void PutReliableSendCommand(ConnectionCommand &c,
 						unsigned int max_packet_size) {};
 
-		virtual bool isActive() { return false; };
-
 		virtual bool getAddress(MTProtocols type, Address& toset) = 0;
 
+		bool isPendingDeletion()
+		{ MutexAutoLock lock(m_exclusive_access_mutex); return m_pending_deletion; };
+
 		void ResetTimeout()
 			{MutexAutoLock lock(m_exclusive_access_mutex); m_timeout_counter=0.0; };
 
 		bool isTimedOut(float timeout);
 
-		void setSentWithID()
-		{ MutexAutoLock lock(m_exclusive_access_mutex); m_has_sent_with_id = true; };
-
-		bool hasSentWithID()
-		{ MutexAutoLock lock(m_exclusive_access_mutex); return m_has_sent_with_id; };
-
 		unsigned int m_increment_packets_remaining;
 		unsigned int m_increment_bytes_remaining;
 
@@ -776,8 +770,6 @@ class Peer {
 		float m_timeout_counter;
 
 		u32 m_last_timeout_check;
-
-		bool m_has_sent_with_id;
 };
 
 class UDPPeer : public Peer
@@ -795,9 +787,6 @@ public:
 	void PutReliableSendCommand(ConnectionCommand &c,
 							unsigned int max_packet_size);
 
-	bool isActive()
-	{ return ((hasSentWithID()) && (!m_pending_deletion)); };
-
 	bool getAddress(MTProtocols type, Address& toset);
 
 	void setNonLegacyPeer();
diff --git a/src/network/networkpacket.h b/src/network/networkpacket.h
index 72f8cab..5244709 100644
--- a/src/network/networkpacket.h
+++ b/src/network/networkpacket.h
@@ -40,6 +40,7 @@ public:
 		u32 getSize() { return m_datasize; }
 		u16 getPeerId() { return m_peer_id; }
 		u16 getCommand() { return m_command; }
+		const u32 getRemainingBytes() const { return m_datasize - m_read_offset; }
 
 		// Returns a c-string without copying.
 		// A better name for this would be getRawString()
diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h
index 177b976..018b392 100644
--- a/src/network/networkprotocol.h
+++ b/src/network/networkprotocol.h
@@ -136,9 +136,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 		backface_culling: backwards compatibility for playing with
 		newer client on pre-27 servers.
 		Add nodedef v3 - connected nodeboxes
+	PROTOCOL_VERSION 28:
+		CPT2_MESHOPTIONS
 */
 
-#define LATEST_PROTOCOL_VERSION 27
+#define LATEST_PROTOCOL_VERSION 28
 
 // Server's supported network protocol range
 #define SERVER_PROTOCOL_VERSION_MIN 13
@@ -474,6 +476,7 @@ enum ToClientCommand
 		u8 bool vertical
 		u32 len
 		u8[len] texture
+		u8 collision_removal
 	*/
 
 	TOCLIENT_ADD_PARTICLESPAWNER = 0x47,
@@ -495,6 +498,7 @@ enum ToClientCommand
 		u32 len
 		u8[len] texture
 		u32 id
+		u8 collision_removal
 	*/
 
 	TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY = 0x48,
@@ -647,6 +651,8 @@ enum ToServerCommand
 		[2+12+12] s32 pitch*100
 		[2+12+12+4] s32 yaw*100
 		[2+12+12+4+4] u32 keyPressed
+		[2+12+12+4+4+1] u8 fov*80
+		[2+12+12+4+4+4+1] u8 ceil(wanted_range / MAP_BLOCKSIZE)
 	*/
 
 	TOSERVER_GOTBLOCKS = 0x24,
diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp
index 1bcb78a..dca9aab 100644
--- a/src/network/serverpackethandler.cpp
+++ b/src/network/serverpackethandler.cpp
@@ -774,13 +774,15 @@ void Server::handleCommand_GotBlocks(NetworkPacket* pkt)
 	}
 }
 
-void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
+void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
+	NetworkPacket *pkt)
 {
-	if (pkt->getSize() < 12 + 12 + 4 + 4)
+	if (pkt->getRemainingBytes() < 12 + 12 + 4 + 4)
 		return;
 
 	v3s32 ps, ss;
 	s32 f32pitch, f32yaw;
+	u8 f32fov;
 
 	*pkt >> ps;
 	*pkt >> ss;
@@ -791,8 +793,18 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
 	f32 yaw = (f32)f32yaw / 100.0;
 	u32 keyPressed = 0;
 
-	if (pkt->getSize() >= 12 + 12 + 4 + 4 + 4)
+	// default behavior (in case an old client doesn't send these)
+	f32 fov = 0;
+	u8 wanted_range = 0;
+
+	if (pkt->getRemainingBytes() >= 4)
 		*pkt >> keyPressed;
+	if (pkt->getRemainingBytes() >= 1) {
+		*pkt >> f32fov;
+		fov = (f32)f32fov / 80.0;
+	}
+	if (pkt->getRemainingBytes() >= 1)
+		*pkt >> wanted_range;
 
 	v3f position((f32)ps.X / 100.0, (f32)ps.Y / 100.0, (f32)ps.Z / 100.0);
 	v3f speed((f32)ss.X / 100.0, (f32)ss.Y / 100.0, (f32)ss.Z / 100.0);
@@ -800,7 +812,33 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
 	pitch = modulo360f(pitch);
 	yaw = modulo360f(yaw);
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	playersao->setBasePosition(position);
+	player->setSpeed(speed);
+	playersao->setPitch(pitch);
+	playersao->setYaw(yaw);
+	playersao->setFov(fov);
+	playersao->setWantedRange(wanted_range);
+	player->keyPressed = keyPressed;
+	player->control.up = (keyPressed & 1);
+	player->control.down = (keyPressed & 2);
+	player->control.left = (keyPressed & 4);
+	player->control.right = (keyPressed & 8);
+	player->control.jump = (keyPressed & 16);
+	player->control.aux1 = (keyPressed & 32);
+	player->control.sneak = (keyPressed & 64);
+	player->control.LMB = (keyPressed & 128);
+	player->control.RMB = (keyPressed & 256);
+
+	if (playersao->checkMovementCheat()) {
+		// Call callbacks
+		m_script->on_cheat(playersao, "moved_too_fast");
+		SendMovePlayer(pkt->getPeerId());
+	}
+}
+
+void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
+{
+	RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -809,13 +847,6 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
 		return;
 	}
 
-	// If player is dead we don't care of this packet
-	if (player->isDead()) {
-		verbosestream << "TOSERVER_PLAYERPOS: " << player->getName()
-			<< " is dead. Ignoring packet";
-		return;
-	}
-
 	PlayerSAO *playersao = player->getPlayerSAO();
 	if (playersao == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
@@ -825,26 +856,14 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
 		return;
 	}
 
-	player->setPosition(position);
-	player->setSpeed(speed);
-	player->setPitch(pitch);
-	player->setYaw(yaw);
-	player->keyPressed = keyPressed;
-	player->control.up = (keyPressed & 1);
-	player->control.down = (keyPressed & 2);
-	player->control.left = (keyPressed & 4);
-	player->control.right = (keyPressed & 8);
-	player->control.jump = (keyPressed & 16);
-	player->control.aux1 = (keyPressed & 32);
-	player->control.sneak = (keyPressed & 64);
-	player->control.LMB = (keyPressed & 128);
-	player->control.RMB = (keyPressed & 256);
-
-	if (playersao->checkMovementCheat()) {
-		// Call callbacks
-		m_script->on_cheat(playersao, "moved_too_fast");
-		SendMovePlayer(pkt->getPeerId());
+	// If player is dead we don't care of this packet
+	if (playersao->isDead()) {
+		verbosestream << "TOSERVER_PLAYERPOS: " << player->getName()
+				<< " is dead. Ignoring packet";
+		return;
 	}
+
+	process_PlayerPos(player, playersao, pkt);
 }
 
 void Server::handleCommand_DeletedBlocks(NetworkPacket* pkt)
@@ -879,7 +898,8 @@ void Server::handleCommand_DeletedBlocks(NetworkPacket* pkt)
 
 void Server::handleCommand_InventoryAction(NetworkPacket* pkt)
 {
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1051,7 +1071,7 @@ void Server::handleCommand_ChatMessage(NetworkPacket* pkt)
 		message += (wchar_t)tmp_wchar;
 	}
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1065,7 +1085,7 @@ void Server::handleCommand_ChatMessage(NetworkPacket* pkt)
 	std::wstring wname = narrow_to_wide(name);
 
 	std::wstring answer_to_sender = handleChat(name, wname, message,
-		true, pkt->getPeerId());
+		true, dynamic_cast<RemotePlayer *>(player));
 	if (!answer_to_sender.empty()) {
 		// Send the answer to sender
 		SendChatMessage(pkt->getPeerId(), answer_to_sender);
@@ -1078,7 +1098,8 @@ void Server::handleCommand_Damage(NetworkPacket* pkt)
 
 	*pkt >> damage;
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1098,7 +1119,7 @@ void Server::handleCommand_Damage(NetworkPacket* pkt)
 
 	if (g_settings->getBool("enable_damage")) {
 		actionstream << player->getName() << " damaged by "
-				<< (int)damage << " hp at " << PP(player->getPosition() / BS)
+				<< (int)damage << " hp at " << PP(playersao->getBasePosition() / BS)
 				<< std::endl;
 
 		playersao->setHP(playersao->getHP() - damage);
@@ -1112,7 +1133,8 @@ void Server::handleCommand_Breath(NetworkPacket* pkt)
 
 	*pkt >> breath;
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1121,16 +1143,6 @@ void Server::handleCommand_Breath(NetworkPacket* pkt)
 		return;
 	}
 
-	/*
-	 * If player is dead, we don't need to update the breath
-	 * He is dead !
-	 */
-	if (player->isDead()) {
-		verbosestream << "TOSERVER_BREATH: " << player->getName()
-			<< " is dead. Ignoring packet";
-		return;
-	}
-
 
 	PlayerSAO *playersao = player->getPlayerSAO();
 	if (playersao == NULL) {
@@ -1141,6 +1153,16 @@ void Server::handleCommand_Breath(NetworkPacket* pkt)
 		return;
 	}
 
+	/*
+	 * If player is dead, we don't need to update the breath
+	 * He is dead !
+	 */
+	if (playersao->isDead()) {
+		verbosestream << "TOSERVER_BREATH: " << player->getName()
+				<< " is dead. Ignoring packet";
+		return;
+	}
+
 	playersao->setBreath(breath);
 	SendPlayerBreath(pkt->getPeerId());
 }
@@ -1176,7 +1198,7 @@ void Server::handleCommand_Password(NetworkPacket* pkt)
 		newpwd += c;
 	}
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1224,7 +1246,8 @@ void Server::handleCommand_PlayerItem(NetworkPacket* pkt)
 	if (pkt->getSize() < 2)
 		return;
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1251,7 +1274,7 @@ void Server::handleCommand_PlayerItem(NetworkPacket* pkt)
 
 void Server::handleCommand_Respawn(NetworkPacket* pkt)
 {
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1260,13 +1283,16 @@ void Server::handleCommand_Respawn(NetworkPacket* pkt)
 		return;
 	}
 
-	if (!player->isDead())
+	PlayerSAO *playersao = player->getPlayerSAO();
+	assert(playersao);
+
+	if (!playersao->isDead())
 		return;
 
 	RespawnPlayer(pkt->getPeerId());
 
 	actionstream << player->getName() << " respawns at "
-			<< PP(player->getPosition()/BS) << std::endl;
+			<< PP(playersao->getBasePosition() / BS) << std::endl;
 
 	// ActiveObject is added to environment in AsyncRunStep after
 	// the previous addition has been successfully removed
@@ -1274,15 +1300,13 @@ void Server::handleCommand_Respawn(NetworkPacket* pkt)
 
 void Server::handleCommand_Interact(NetworkPacket* pkt)
 {
-	std::string datastring(pkt->getString(0), pkt->getSize());
-	std::istringstream is(datastring, std::ios_base::binary);
-
 	/*
 		[0] u16 command
 		[2] u8 action
 		[3] u16 item
-		[5] u32 length of the next item
+		[5] u32 length of the next item (plen)
 		[9] serialized PointedThing
+		[9 + plen] player position information
 		actions:
 		0: start digging (from undersurface) or use
 		1: stop digging (all parameters ignored)
@@ -1290,16 +1314,19 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
 		3: place block or item (to abovesurface)
 		4: use item
 	*/
-	u8 action = readU8(is);
-	u16 item_i = readU16(is);
-	std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary);
+	u8 action;
+	u16 item_i;
+	*pkt >> action;
+	*pkt >> item_i;
+	std::istringstream tmp_is(pkt->readLongString(), std::ios::binary);
 	PointedThing pointed;
 	pointed.deSerialize(tmp_is);
 
 	verbosestream << "TOSERVER_INTERACT: action=" << (int)action << ", item="
 			<< item_i << ", pointed=" << pointed.dump() << std::endl;
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1317,12 +1344,14 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
 		return;
 	}
 
-	if (player->isDead()) {
+	if (playersao->isDead()) {
 		verbosestream << "TOSERVER_INTERACT: " << player->getName()
-			<< " is dead. Ignoring packet";
+				<< " is dead. Ignoring packet";
 		return;
 	}
 
+	process_PlayerPos(player, playersao, pkt);
+
 	v3f player_pos = playersao->getLastGoodPosition();
 
 	// Update wielded item
@@ -1450,7 +1479,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
 			ToolCapabilities toolcap =
 					punchitem.getToolCapabilities(m_itemdef);
 			v3f dir = (pointed_object->getBasePosition() -
-					(player->getPosition() + player->getEyeOffset())
+					(playersao->getBasePosition() + playersao->getEyeOffset())
 						).normalize();
 			float time_from_last_punch =
 				playersao->resetTimeFromLastPunch();
@@ -1513,10 +1542,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
 					m_script->on_cheat(playersao, "finished_unknown_dig");
 				}
 				// Get player's wielded item
-				ItemStack playeritem;
-				InventoryList *mlist = playersao->getInventory()->getList("main");
-				if (mlist != NULL)
-					playeritem = mlist->getItem(playersao->getWieldIndex());
+				ItemStack playeritem = playersao->getWieldedItem();
 				ToolCapabilities playeritem_toolcap =
 						playeritem.getToolCapabilities(m_itemdef);
 				// Get diggability and expected digging time
@@ -1656,16 +1682,16 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
 		}
 
 	} // action == 4
-	
+
 	/*
 		5: rightclick air
 	*/
 	else if (action == 5) {
 		ItemStack item = playersao->getWieldedItem();
-		
-		actionstream << player->getName() << " activates " 
+
+		actionstream << player->getName() << " activates "
 				<< item.name << std::endl;
-		
+
 		if (m_script->item_OnSecondaryUse(
 				item, playersao)) {
 			if( playersao->setWieldedItem(item)) {
@@ -1693,9 +1719,7 @@ void Server::handleCommand_RemovedSounds(NetworkPacket* pkt)
 
 		*pkt >> id;
 
-		std::map<s32, ServerPlayingSound>::iterator i =
-			m_playing_sounds.find(id);
-
+		UNORDERED_MAP<s32, ServerPlayingSound>::iterator i = m_playing_sounds.find(id);
 		if (i == m_playing_sounds.end())
 			continue;
 
@@ -1721,7 +1745,8 @@ void Server::handleCommand_NodeMetaFields(NetworkPacket* pkt)
 		fields[fieldname] = pkt->readLongString();
 	}
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
@@ -1771,7 +1796,8 @@ void Server::handleCommand_InventoryFields(NetworkPacket* pkt)
 		fields[fieldname] = pkt->readLongString();
 	}
 
-	Player *player = m_env->getPlayer(pkt->getPeerId());
+	RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
 	if (player == NULL) {
 		errorstream << "Server::ProcessData(): Canceling: "
 				"No player for peer_id=" << pkt->getPeerId()
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index 3a2cb00..ccbb42c 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -247,6 +247,28 @@ static void deSerializeSimpleSoundSpec(SimpleSoundSpec &ss, std::istream &is)
 	ss.gain = readF1000(is);
 }
 
+void TextureSettings::readSettings()
+{
+	connected_glass                = g_settings->getBool("connected_glass");
+	opaque_water                   = g_settings->getBool("opaque_water");
+	bool enable_shaders            = g_settings->getBool("enable_shaders");
+	bool enable_bumpmapping        = g_settings->getBool("enable_bumpmapping");
+	bool enable_parallax_occlusion = g_settings->getBool("enable_parallax_occlusion");
+	enable_mesh_cache              = g_settings->getBool("enable_mesh_cache");
+	enable_minimap                 = g_settings->getBool("enable_minimap");
+	std::string leaves_style_str   = g_settings->get("leaves_style");
+
+	use_normal_texture = enable_shaders &&
+		(enable_bumpmapping || enable_parallax_occlusion);
+	if (leaves_style_str == "fancy") {
+		leaves_style = LEAVES_FANCY;
+	} else if (leaves_style_str == "simple") {
+		leaves_style = LEAVES_SIMPLE;
+	} else {
+		leaves_style = LEAVES_OPAQUE;
+	}
+}
+
 /*
 	ContentFeatures
 */
@@ -365,7 +387,10 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
 	writeU8(os, post_effect_color.getGreen());
 	writeU8(os, post_effect_color.getBlue());
 	writeU8(os, param_type);
-	writeU8(os, param_type_2);
+	if ((protocol_version < 28) && (param_type_2 == CPT2_MESHOPTIONS))
+		writeU8(os, CPT2_NONE);
+	else
+		writeU8(os, param_type_2);
 	writeU8(os, is_ground_content);
 	writeU8(os, light_propagates);
 	writeU8(os, sunlight_propagates);
@@ -457,6 +482,7 @@ void ContentFeatures::deSerialize(std::istream &is)
 	liquid_viscosity = readU8(is);
 	liquid_renewable = readU8(is);
 	light_source = readU8(is);
+	light_source = MYMIN(light_source, LIGHT_MAX);
 	damage_per_second = readU32(is);
 	node_box.deSerialize(is);
 	selection_box.deSerialize(is);
@@ -486,6 +512,254 @@ void ContentFeatures::deSerialize(std::istream &is)
 	}catch(SerializationError &e) {};
 }
 
+#ifndef SERVER
+void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile,
+		TileDef *tiledef, u32 shader_id, bool use_normal_texture,
+		bool backface_culling, u8 alpha, u8 material_type)
+{
+	tile->shader_id     = shader_id;
+	tile->texture       = tsrc->getTextureForMesh(tiledef->name, &tile->texture_id);
+	tile->alpha         = alpha;
+	tile->material_type = material_type;
+
+	// Normal texture and shader flags texture
+	if (use_normal_texture) {
+		tile->normal_texture = tsrc->getNormalTexture(tiledef->name);
+	}
+	tile->flags_texture = tsrc->getShaderFlagsTexture(tile->normal_texture ? true : false);
+
+	// Material flags
+	tile->material_flags = 0;
+	if (backface_culling)
+		tile->material_flags |= MATERIAL_FLAG_BACKFACE_CULLING;
+	if (tiledef->animation.type == TAT_VERTICAL_FRAMES)
+		tile->material_flags |= MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES;
+	if (tiledef->tileable_horizontal)
+		tile->material_flags |= MATERIAL_FLAG_TILEABLE_HORIZONTAL;
+	if (tiledef->tileable_vertical)
+		tile->material_flags |= MATERIAL_FLAG_TILEABLE_VERTICAL;
+
+	// Animation parameters
+	int frame_count = 1;
+	if (tile->material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) {
+		// Get texture size to determine frame count by aspect ratio
+		v2u32 size = tile->texture->getOriginalSize();
+		int frame_height = (float)size.X /
+				(float)tiledef->animation.aspect_w *
+				(float)tiledef->animation.aspect_h;
+		frame_count = size.Y / frame_height;
+		int frame_length_ms = 1000.0 * tiledef->animation.length / frame_count;
+		tile->animation_frame_count = frame_count;
+		tile->animation_frame_length_ms = frame_length_ms;
+	}
+
+	if (frame_count == 1) {
+		tile->material_flags &= ~MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES;
+	} else {
+		std::ostringstream os(std::ios::binary);
+		tile->frames.resize(frame_count);
+
+		for (int i = 0; i < frame_count; i++) {
+
+			FrameSpec frame;
+
+			os.str("");
+			os << tiledef->name << "^[verticalframe:"
+				<< frame_count << ":" << i;
+
+			frame.texture = tsrc->getTextureForMesh(os.str(), &frame.texture_id);
+			if (tile->normal_texture)
+				frame.normal_texture = tsrc->getNormalTexture(os.str());
+			frame.flags_texture = tile->flags_texture;
+			tile->frames[i] = frame;
+		}
+	}
+}
+#endif
+
+#ifndef SERVER
+void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc,
+	scene::ISceneManager *smgr, scene::IMeshManipulator *meshmanip,
+	IGameDef *gamedef, const TextureSettings &tsettings)
+{
+	// minimap pixel color - the average color of a texture
+	if (tsettings.enable_minimap && tiledef[0].name != "")
+		minimap_color = tsrc->getTextureAverageColor(tiledef[0].name);
+
+	// Figure out the actual tiles to use
+	TileDef tdef[6];
+	for (u32 j = 0; j < 6; j++) {
+		tdef[j] = tiledef[j];
+		if (tdef[j].name == "")
+			tdef[j].name = "unknown_node.png";
+	}
+
+	bool is_liquid = false;
+	bool is_water_surface = false;
+
+	u8 material_type = (alpha == 255) ?
+		TILE_MATERIAL_BASIC : TILE_MATERIAL_ALPHA;
+
+	switch (drawtype) {
+	default:
+	case NDT_NORMAL:
+		solidness = 2;
+		break;
+	case NDT_AIRLIKE:
+		solidness = 0;
+		break;
+	case NDT_LIQUID:
+		assert(liquid_type == LIQUID_SOURCE);
+		if (tsettings.opaque_water)
+			alpha = 255;
+		solidness = 1;
+		is_liquid = true;
+		break;
+	case NDT_FLOWINGLIQUID:
+		assert(liquid_type == LIQUID_FLOWING);
+		solidness = 0;
+		if (tsettings.opaque_water)
+			alpha = 255;
+		is_liquid = true;
+		break;
+	case NDT_GLASSLIKE:
+		solidness = 0;
+		visual_solidness = 1;
+		break;
+	case NDT_GLASSLIKE_FRAMED:
+		solidness = 0;
+		visual_solidness = 1;
+		break;
+	case NDT_GLASSLIKE_FRAMED_OPTIONAL:
+		solidness = 0;
+		visual_solidness = 1;
+		drawtype = tsettings.connected_glass ? NDT_GLASSLIKE_FRAMED : NDT_GLASSLIKE;
+		break;
+	case NDT_ALLFACES:
+		solidness = 0;
+		visual_solidness = 1;
+		break;
+	case NDT_ALLFACES_OPTIONAL:
+		if (tsettings.leaves_style == LEAVES_FANCY) {
+			drawtype = NDT_ALLFACES;
+			solidness = 0;
+			visual_solidness = 1;
+		} else if (tsettings.leaves_style == LEAVES_SIMPLE) {
+			for (u32 j = 0; j < 6; j++) {
+				if (tiledef_special[j].name != "")
+					tdef[j].name = tiledef_special[j].name;
+			}
+			drawtype = NDT_GLASSLIKE;
+			solidness = 0;
+			visual_solidness = 1;
+		} else {
+			drawtype = NDT_NORMAL;
+			solidness = 2;
+			for (u32 i = 0; i < 6; i++)
+				tdef[i].name += std::string("^[noalpha");
+		}
+		if (waving == 1)
+			material_type = TILE_MATERIAL_WAVING_LEAVES;
+		break;
+	case NDT_PLANTLIKE:
+		solidness = 0;
+		if (waving == 1)
+			material_type = TILE_MATERIAL_WAVING_PLANTS;
+		break;
+	case NDT_FIRELIKE:
+		solidness = 0;
+		break;
+	case NDT_MESH:
+		solidness = 0;
+		break;
+	case NDT_TORCHLIKE:
+	case NDT_SIGNLIKE:
+	case NDT_FENCELIKE:
+	case NDT_RAILLIKE:
+	case NDT_NODEBOX:
+		solidness = 0;
+		break;
+	}
+
+	if (is_liquid) {
+		material_type = (alpha == 255) ?
+			TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
+		if (name == "default:water_source")
+			is_water_surface = true;
+	}
+
+	u32 tile_shader[6];
+	for (u16 j = 0; j < 6; j++) {
+		tile_shader[j] = shdsrc->getShader("nodes_shader",
+			material_type, drawtype);
+	}
+
+	if (is_water_surface) {
+		tile_shader[0] = shdsrc->getShader("water_surface_shader",
+			material_type, drawtype);
+	}
+
+	// Tiles (fill in f->tiles[])
+	for (u16 j = 0; j < 6; j++) {
+		fillTileAttribs(tsrc, &tiles[j], &tdef[j], tile_shader[j],
+			tsettings.use_normal_texture,
+			tiledef[j].backface_culling, alpha, material_type);
+	}
+
+	// Special tiles (fill in f->special_tiles[])
+	for (u16 j = 0; j < CF_SPECIAL_COUNT; j++) {
+		fillTileAttribs(tsrc, &special_tiles[j], &tiledef_special[j],
+			tile_shader[j], tsettings.use_normal_texture,
+			tiledef_special[j].backface_culling, alpha, material_type);
+	}
+
+	if ((drawtype == NDT_MESH) && (mesh != "")) {
+		// Meshnode drawtype
+		// Read the mesh and apply scale
+		mesh_ptr[0] = gamedef->getMesh(mesh);
+		if (mesh_ptr[0]){
+			v3f scale = v3f(1.0, 1.0, 1.0) * BS * visual_scale;
+			scaleMesh(mesh_ptr[0], scale);
+			recalculateBoundingBox(mesh_ptr[0]);
+			meshmanip->recalculateNormals(mesh_ptr[0], true, false);
+		}
+	} else if ((drawtype == NDT_NODEBOX) &&
+			((node_box.type == NODEBOX_REGULAR) ||
+			(node_box.type == NODEBOX_FIXED)) &&
+			(!node_box.fixed.empty())) {
+		//Convert regular nodebox nodes to meshnodes
+		//Change the drawtype and apply scale
+		drawtype = NDT_MESH;
+		mesh_ptr[0] = convertNodeboxesToMesh(node_box.fixed);
+		v3f scale = v3f(1.0, 1.0, 1.0) * visual_scale;
+		scaleMesh(mesh_ptr[0], scale);
+		recalculateBoundingBox(mesh_ptr[0]);
+		meshmanip->recalculateNormals(mesh_ptr[0], true, false);
+	}
+
+	//Cache 6dfacedir and wallmounted rotated clones of meshes
+	if (tsettings.enable_mesh_cache && mesh_ptr[0] && (param_type_2 == CPT2_FACEDIR)) {
+		for (u16 j = 1; j < 24; j++) {
+			mesh_ptr[j] = cloneMesh(mesh_ptr[0]);
+			rotateMeshBy6dFacedir(mesh_ptr[j], j);
+			recalculateBoundingBox(mesh_ptr[j]);
+			meshmanip->recalculateNormals(mesh_ptr[j], true, false);
+		}
+	} else if (tsettings.enable_mesh_cache && mesh_ptr[0] && (param_type_2 == CPT2_WALLMOUNTED)) {
+		static const u8 wm_to_6d[6] = {20, 0, 16+1, 12+3, 8, 4+2};
+		for (u16 j = 1; j < 6; j++) {
+			mesh_ptr[j] = cloneMesh(mesh_ptr[0]);
+			rotateMeshBy6dFacedir(mesh_ptr[j], wm_to_6d[j]);
+			recalculateBoundingBox(mesh_ptr[j]);
+			meshmanip->recalculateNormals(mesh_ptr[j], true, false);
+		}
+		rotateMeshBy6dFacedir(mesh_ptr[0], wm_to_6d[0]);
+		recalculateBoundingBox(mesh_ptr[0]);
+		meshmanip->recalculateNormals(mesh_ptr[0], true, false);
+	}
+}
+#endif
+
 /*
 	CNodeDefManager
 */
@@ -505,6 +779,7 @@ public:
 	content_t allocateId();
 	virtual content_t set(const std::string &name, const ContentFeatures &def);
 	virtual content_t allocateDummy(const std::string &name);
+	virtual void removeNode(const std::string &name);
 	virtual void updateAliases(IItemDefManager *idef);
 	virtual void applyTextureOverrides(const std::string &override_filepath);
 	virtual void updateTextures(IGameDef *gamedef,
@@ -525,11 +800,6 @@ public:
 
 private:
 	void addNameIdMapping(content_t i, std::string name);
-#ifndef SERVER
-	void fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef,
-		u32 shader_id, bool use_normal_texture, bool backface_culling,
-		u8 alpha, u8 material_type);
-#endif
 
 	// Features indexed by id
 	std::vector<ContentFeatures> m_content_features;
@@ -541,12 +811,12 @@ private:
 	// item aliases too. Updated by updateAliases()
 	// Note: Not serialized.
 
-	std::map<std::string, content_t> m_name_id_mapping_with_aliases;
+	UNORDERED_MAP<std::string, content_t> m_name_id_mapping_with_aliases;
 
 	// A mapping from groups to a list of content_ts (and their levels)
 	// that belong to it.  Necessary for a direct lookup in getIds().
 	// Note: Not serialized.
-	std::map<std::string, GroupItems> m_group_to_items;
+	UNORDERED_MAP<std::string, GroupItems> m_group_to_items;
 
 	// Next possibly free id
 	content_t m_next_id;
@@ -669,7 +939,7 @@ inline const ContentFeatures& CNodeDefManager::get(const MapNode &n) const
 
 bool CNodeDefManager::getId(const std::string &name, content_t &result) const
 {
-	std::map<std::string, content_t>::const_iterator
+	UNORDERED_MAP<std::string, content_t>::const_iterator
 		i = m_name_id_mapping_with_aliases.find(name);
 	if(i == m_name_id_mapping_with_aliases.end())
 		return false;
@@ -699,7 +969,7 @@ bool CNodeDefManager::getIds(const std::string &name,
 	}
 	std::string group = name.substr(6);
 
-	std::map<std::string, GroupItems>::const_iterator
+	UNORDERED_MAP<std::string, GroupItems>::const_iterator
 		i = m_group_to_items.find(group);
 	if (i == m_group_to_items.end())
 		return true;
@@ -781,7 +1051,7 @@ content_t CNodeDefManager::set(const std::string &name, const ContentFeatures &d
 		i != def.groups.end(); ++i) {
 		std::string group_name = i->first;
 
-		std::map<std::string, GroupItems>::iterator
+		UNORDERED_MAP<std::string, GroupItems>::iterator
 			j = m_group_to_items.find(group_name);
 		if (j == m_group_to_items.end()) {
 			m_group_to_items[group_name].push_back(
@@ -804,6 +1074,40 @@ content_t CNodeDefManager::allocateDummy(const std::string &name)
 }
 
 
+void CNodeDefManager::removeNode(const std::string &name)
+{
+	// Pre-condition
+	assert(name != "");
+
+	// Erase name from name ID mapping
+	content_t id = CONTENT_IGNORE;
+	if (m_name_id_mapping.getId(name, id)) {
+		m_name_id_mapping.eraseName(name);
+		m_name_id_mapping_with_aliases.erase(name);
+	}
+
+	// Erase node content from all groups it belongs to
+	for (UNORDERED_MAP<std::string, GroupItems>::iterator iter_groups =
+			m_group_to_items.begin();
+			iter_groups != m_group_to_items.end();) {
+		GroupItems &items = iter_groups->second;
+		for (GroupItems::iterator iter_groupitems = items.begin();
+				iter_groupitems != items.end();) {
+			if (iter_groupitems->first == id)
+				items.erase(iter_groupitems++);
+			else
+				iter_groupitems++;
+		}
+
+		// Check if group is empty
+		if (items.size() == 0)
+			m_group_to_items.erase(iter_groups++);
+		else
+			iter_groups++;
+	}
+}
+
+
 void CNodeDefManager::updateAliases(IItemDefManager *idef)
 {
 	std::set<std::string> all = idef->getAll();
@@ -841,13 +1145,8 @@ void CNodeDefManager::applyTextureOverrides(const std::string &override_filepath
 		}
 
 		content_t id;
-		if (!getId(splitted[0], id)) {
-			errorstream << override_filepath
-				<< ":" << line_c << " Could not apply texture override \""
-				<< line << "\": Unknown node \""
-				<< splitted[0] << "\"" << std::endl;
-			continue;
-		}
+		if (!getId(splitted[0], id))
+			continue; // Ignore unknown node
 
 		ContentFeatures &nodedef = m_content_features[id];
 
@@ -890,271 +1189,18 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef,
 	IShaderSource *shdsrc = gamedef->getShaderSource();
 	scene::ISceneManager* smgr = gamedef->getSceneManager();
 	scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator();
-
-	bool connected_glass           = g_settings->getBool("connected_glass");
-	bool opaque_water              = g_settings->getBool("opaque_water");
-	bool enable_shaders            = g_settings->getBool("enable_shaders");
-	bool enable_bumpmapping        = g_settings->getBool("enable_bumpmapping");
-	bool enable_parallax_occlusion = g_settings->getBool("enable_parallax_occlusion");
-	bool enable_mesh_cache         = g_settings->getBool("enable_mesh_cache");
-	bool enable_minimap            = g_settings->getBool("enable_minimap");
-	std::string leaves_style       = g_settings->get("leaves_style");
-
-	bool use_normal_texture = enable_shaders &&
-		(enable_bumpmapping || enable_parallax_occlusion);
+	TextureSettings tsettings;
+	tsettings.readSettings();
 
 	u32 size = m_content_features.size();
 
 	for (u32 i = 0; i < size; i++) {
-		ContentFeatures *f = &m_content_features[i];
-
-		// minimap pixel color - the average color of a texture
-		if (enable_minimap && f->tiledef[0].name != "")
-			f->minimap_color = tsrc->getTextureAverageColor(f->tiledef[0].name);
-
-		// Figure out the actual tiles to use
-		TileDef tiledef[6];
-		for (u32 j = 0; j < 6; j++) {
-			tiledef[j] = f->tiledef[j];
-			if (tiledef[j].name == "")
-				tiledef[j].name = "unknown_node.png";
-		}
-
-		bool is_liquid = false;
-		bool is_water_surface = false;
-
-		u8 material_type = (f->alpha == 255) ?
-			TILE_MATERIAL_BASIC : TILE_MATERIAL_ALPHA;
-
-		switch (f->drawtype) {
-		default:
-		case NDT_NORMAL:
-			f->solidness = 2;
-			break;
-		case NDT_AIRLIKE:
-			f->solidness = 0;
-			break;
-		case NDT_LIQUID:
-			assert(f->liquid_type == LIQUID_SOURCE);
-			if (opaque_water)
-				f->alpha = 255;
-			f->solidness = 1;
-			is_liquid = true;
-			break;
-		case NDT_FLOWINGLIQUID:
-			assert(f->liquid_type == LIQUID_FLOWING);
-			f->solidness = 0;
-			if (opaque_water)
-				f->alpha = 255;
-			is_liquid = true;
-			break;
-		case NDT_GLASSLIKE:
-			f->solidness = 0;
-			f->visual_solidness = 1;
-			break;
-		case NDT_GLASSLIKE_FRAMED:
-			f->solidness = 0;
-			f->visual_solidness = 1;
-			break;
-		case NDT_GLASSLIKE_FRAMED_OPTIONAL:
-			f->solidness = 0;
-			f->visual_solidness = 1;
-			f->drawtype = connected_glass ? NDT_GLASSLIKE_FRAMED : NDT_GLASSLIKE;
-			break;
-		case NDT_ALLFACES:
-			f->solidness = 0;
-			f->visual_solidness = 1;
-			break;
-		case NDT_ALLFACES_OPTIONAL:
-			if (leaves_style == "fancy") {
-				f->drawtype = NDT_ALLFACES;
-				f->solidness = 0;
-				f->visual_solidness = 1;
-			} else if (leaves_style == "simple") {
-				for (u32 j = 0; j < 6; j++) {
-					if (f->tiledef_special[j].name != "")
-						tiledef[j].name = f->tiledef_special[j].name;
-				}
-				f->drawtype = NDT_GLASSLIKE;
-				f->solidness = 0;
-				f->visual_solidness = 1;
-			} else {
-				f->drawtype = NDT_NORMAL;
-				f->solidness = 2;
-				for (u32 i = 0; i < 6; i++)
-					tiledef[i].name += std::string("^[noalpha");
-			}
-			if (f->waving == 1)
-				material_type = TILE_MATERIAL_WAVING_LEAVES;
-			break;
-		case NDT_PLANTLIKE:
-			f->solidness = 0;
-			if (f->waving == 1)
-				material_type = TILE_MATERIAL_WAVING_PLANTS;
-			break;
-		case NDT_FIRELIKE:
-			f->solidness = 0;
-			break;
-		case NDT_MESH:
-			f->solidness = 0;
-			break;
-		case NDT_TORCHLIKE:
-		case NDT_SIGNLIKE:
-		case NDT_FENCELIKE:
-		case NDT_RAILLIKE:
-		case NDT_NODEBOX:
-			f->solidness = 0;
-			break;
-		}
-
-		if (is_liquid) {
-			material_type = (f->alpha == 255) ?
-				TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
-			if (f->name == "default:water_source")
-				is_water_surface = true;
-		}
-
-		u32 tile_shader[6];
-		for (u16 j = 0; j < 6; j++) {
-			tile_shader[j] = shdsrc->getShader("nodes_shader",
-				material_type, f->drawtype);
-		}
-
-		if (is_water_surface) {
-			tile_shader[0] = shdsrc->getShader("water_surface_shader",
-				material_type, f->drawtype);
-		}
-
-		// Tiles (fill in f->tiles[])
-		for (u16 j = 0; j < 6; j++) {
-			fillTileAttribs(tsrc, &f->tiles[j], &tiledef[j], tile_shader[j],
-				use_normal_texture, f->tiledef[j].backface_culling, f->alpha, material_type);
-		}
-
-		// Special tiles (fill in f->special_tiles[])
-		for (u16 j = 0; j < CF_SPECIAL_COUNT; j++) {
-			fillTileAttribs(tsrc, &f->special_tiles[j], &f->tiledef_special[j],
-				tile_shader[j], use_normal_texture,
-				f->tiledef_special[j].backface_culling, f->alpha, material_type);
-		}
-
-		if ((f->drawtype == NDT_MESH) && (f->mesh != "")) {
-			// Meshnode drawtype
-			// Read the mesh and apply scale
-			f->mesh_ptr[0] = gamedef->getMesh(f->mesh);
-			if (f->mesh_ptr[0]){
-				v3f scale = v3f(1.0, 1.0, 1.0) * BS * f->visual_scale;
-				scaleMesh(f->mesh_ptr[0], scale);
-				recalculateBoundingBox(f->mesh_ptr[0]);
-				meshmanip->recalculateNormals(f->mesh_ptr[0], true, false);
-			}
-		} else if ((f->drawtype == NDT_NODEBOX) &&
-				((f->node_box.type == NODEBOX_REGULAR) ||
-				(f->node_box.type == NODEBOX_FIXED)) &&
-				(!f->node_box.fixed.empty())) {
-			//Convert regular nodebox nodes to meshnodes
-			//Change the drawtype and apply scale
-			f->drawtype = NDT_MESH;
-			f->mesh_ptr[0] = convertNodeboxesToMesh(f->node_box.fixed);
-			v3f scale = v3f(1.0, 1.0, 1.0) * f->visual_scale;
-			scaleMesh(f->mesh_ptr[0], scale);
-			recalculateBoundingBox(f->mesh_ptr[0]);
-			meshmanip->recalculateNormals(f->mesh_ptr[0], true, false);
-		}
-
-		//Cache 6dfacedir and wallmounted rotated clones of meshes
-		if (enable_mesh_cache && f->mesh_ptr[0] && (f->param_type_2 == CPT2_FACEDIR)) {
-			for (u16 j = 1; j < 24; j++) {
-				f->mesh_ptr[j] = cloneMesh(f->mesh_ptr[0]);
-				rotateMeshBy6dFacedir(f->mesh_ptr[j], j);
-				recalculateBoundingBox(f->mesh_ptr[j]);
-				meshmanip->recalculateNormals(f->mesh_ptr[j], true, false);
-			}
-		} else if (enable_mesh_cache && f->mesh_ptr[0] && (f->param_type_2 == CPT2_WALLMOUNTED)) {
-			static const u8 wm_to_6d[6] = {20, 0, 16+1, 12+3, 8, 4+2};
-			for (u16 j = 1; j < 6; j++) {
-				f->mesh_ptr[j] = cloneMesh(f->mesh_ptr[0]);
-				rotateMeshBy6dFacedir(f->mesh_ptr[j], wm_to_6d[j]);
-				recalculateBoundingBox(f->mesh_ptr[j]);
-				meshmanip->recalculateNormals(f->mesh_ptr[j], true, false);
-			}
-			rotateMeshBy6dFacedir(f->mesh_ptr[0], wm_to_6d[0]);
-			recalculateBoundingBox(f->mesh_ptr[0]);
-			meshmanip->recalculateNormals(f->mesh_ptr[0], true, false);
-		}
-
+		m_content_features[i].updateTextures(tsrc, shdsrc, smgr, meshmanip, gamedef, tsettings);
 		progress_callback(progress_callback_args, i, size);
 	}
 #endif
 }
 
-
-#ifndef SERVER
-void CNodeDefManager::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile,
-		TileDef *tiledef, u32 shader_id, bool use_normal_texture,
-		bool backface_culling, u8 alpha, u8 material_type)
-{
-	tile->shader_id     = shader_id;
-	tile->texture       = tsrc->getTextureForMesh(tiledef->name, &tile->texture_id);
-	tile->alpha         = alpha;
-	tile->material_type = material_type;
-
-	// Normal texture and shader flags texture
-	if (use_normal_texture) {
-		tile->normal_texture = tsrc->getNormalTexture(tiledef->name);
-	}
-	tile->flags_texture = tsrc->getShaderFlagsTexture(tile->normal_texture ? true : false);
-
-	// Material flags
-	tile->material_flags = 0;
-	if (backface_culling)
-		tile->material_flags |= MATERIAL_FLAG_BACKFACE_CULLING;
-	if (tiledef->animation.type == TAT_VERTICAL_FRAMES)
-		tile->material_flags |= MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES;
-	if (tiledef->tileable_horizontal)
-		tile->material_flags |= MATERIAL_FLAG_TILEABLE_HORIZONTAL;
-	if (tiledef->tileable_vertical)
-		tile->material_flags |= MATERIAL_FLAG_TILEABLE_VERTICAL;
-
-	// Animation parameters
-	int frame_count = 1;
-	if (tile->material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) {
-		// Get texture size to determine frame count by aspect ratio
-		v2u32 size = tile->texture->getOriginalSize();
-		int frame_height = (float)size.X /
-				(float)tiledef->animation.aspect_w *
-				(float)tiledef->animation.aspect_h;
-		frame_count = size.Y / frame_height;
-		int frame_length_ms = 1000.0 * tiledef->animation.length / frame_count;
-		tile->animation_frame_count = frame_count;
-		tile->animation_frame_length_ms = frame_length_ms;
-	}
-
-	if (frame_count == 1) {
-		tile->material_flags &= ~MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES;
-	} else {
-		std::ostringstream os(std::ios::binary);
-		tile->frames.resize(frame_count);
-
-		for (int i = 0; i < frame_count; i++) {
-
-			FrameSpec frame;
-
-			os.str("");
-			os << tiledef->name << "^[verticalframe:"
-				<< frame_count << ":" << i;
-
-			frame.texture = tsrc->getTextureForMesh(os.str(), &frame.texture_id);
-			if (tile->normal_texture)
-				frame.normal_texture = tsrc->getNormalTexture(os.str());
-			frame.flags_texture = tile->flags_texture;
-			tile->frames[i] = frame;
-		}
-	}
-}
-#endif
-
-
 void CNodeDefManager::serialize(std::ostream &os, u16 protocol_version) const
 {
 	writeU8(os, 1); // version
@@ -1397,6 +1443,7 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
 		liquid_alternative_source = deSerializeString(is);
 		liquid_viscosity = readU8(is);
 		light_source = readU8(is);
+		light_source = MYMIN(light_source, LIGHT_MAX);
 		damage_per_second = readU32(is);
 		node_box.deSerialize(is);
 		selection_box.deSerialize(is);
diff --git a/src/nodedef.h b/src/nodedef.h
index 58d0faf..80396f9 100644
--- a/src/nodedef.h
+++ b/src/nodedef.h
@@ -65,6 +65,8 @@ enum ContentParamType2
 	CPT2_LEVELED,
 	// 2D rotation for things like plants
 	CPT2_DEGROTATE,
+	// Mesh options for plants
+	CPT2_MESHOPTIONS
 };
 
 enum LiquidType
@@ -112,6 +114,26 @@ struct NodeBox
 struct MapNode;
 class NodeMetadata;
 
+enum LeavesStyle {
+	LEAVES_FANCY,
+	LEAVES_SIMPLE,
+	LEAVES_OPAQUE,
+};
+
+class TextureSettings {
+public:
+	LeavesStyle leaves_style;
+	bool opaque_water;
+	bool connected_glass;
+	bool use_normal_texture;
+	bool enable_mesh_cache;
+	bool enable_minimap;
+
+	TextureSettings() {}
+
+	void readSettings();
+};
+
 enum NodeDrawType
 {
 	NDT_NORMAL, // A basic solid block
@@ -304,6 +326,15 @@ struct ContentFeatures
 		if(!isLiquid() || !f.isLiquid()) return false;
 		return (liquid_alternative_flowing == f.liquid_alternative_flowing);
 	}
+
+#ifndef SERVER
+	void fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef,
+		u32 shader_id, bool use_normal_texture, bool backface_culling,
+		u8 alpha, u8 material_type);
+	void updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc,
+		scene::ISceneManager *smgr, scene::IMeshManipulator *meshmanip,
+		IGameDef *gamedef, const TextureSettings &tsettings);
+#endif
 };
 
 class INodeDefManager {
@@ -353,6 +384,8 @@ public:
 			const ContentFeatures &def)=0;
 	// If returns CONTENT_IGNORE, could not allocate id
 	virtual content_t allocateDummy(const std::string &name)=0;
+	// Remove a node
+	virtual void removeNode(const std::string &name)=0;
 
 	/*
 		Update item alias mapping.
diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp
index 126889e..0801a02 100644
--- a/src/nodemetadata.cpp
+++ b/src/nodemetadata.cpp
@@ -74,6 +74,11 @@ void NodeMetadata::clear()
 	m_inventory->clear();
 }
 
+bool NodeMetadata::empty() const
+{
+	return m_stringvars.size() == 0 && m_inventory->getLists().size() == 0;
+}
+
 /*
 	NodeMetadataList
 */
@@ -84,14 +89,13 @@ void NodeMetadataList::serialize(std::ostream &os) const
 		Version 0 is a placeholder for "nothing to see here; go away."
 	*/
 
-	if(m_data.empty()){
+	u16 count = countNonEmpty();
+	if (count == 0) {
 		writeU8(os, 0); // version
 		return;
 	}
 
 	writeU8(os, 1); // version
-
-	u16 count = m_data.size();
 	writeU16(os, count);
 
 	for(std::map<v3s16, NodeMetadata*>::const_iterator
@@ -100,6 +104,8 @@ void NodeMetadataList::serialize(std::ostream &os) const
 	{
 		v3s16 p = i->first;
 		NodeMetadata *data = i->second;
+		if (data->empty())
+			continue;
 
 		u16 p16 = p.Z * MAP_BLOCKSIZE * MAP_BLOCKSIZE + p.Y * MAP_BLOCKSIZE + p.X;
 		writeU16(os, p16);
@@ -200,6 +206,17 @@ void NodeMetadataList::clear()
 	m_data.clear();
 }
 
+int NodeMetadataList::countNonEmpty() const
+{
+	int n = 0;
+	std::map<v3s16, NodeMetadata*>::const_iterator it;
+	for (it = m_data.begin(); it != m_data.end(); ++it) {
+		if (!it->second->empty())
+			n++;
+	}
+	return n;
+}
+
 std::string NodeMetadata::getString(const std::string &name,
 	unsigned short recursion) const
 {
diff --git a/src/nodemetadata.h b/src/nodemetadata.h
index 8d12982..da1bf59 100644
--- a/src/nodemetadata.h
+++ b/src/nodemetadata.h
@@ -47,6 +47,7 @@ public:
 	void deSerialize(std::istream &is);
 
 	void clear();
+	bool empty() const;
 
 	// Generic key/value store
 	std::string getString(const std::string &name, unsigned short recursion = 0) const;
@@ -94,6 +95,8 @@ public:
 	void clear();
 
 private:
+	int countNonEmpty() const;
+
 	std::map<v3s16, NodeMetadata *> m_data;
 };
 
diff --git a/src/nodetimer.cpp b/src/nodetimer.cpp
index 3509405..003d087 100644
--- a/src/nodetimer.cpp
+++ b/src/nodetimer.cpp
@@ -47,36 +47,38 @@ void NodeTimerList::serialize(std::ostream &os, u8 map_format_version) const
 {
 	if (map_format_version == 24) {
 		// Version 0 is a placeholder for "nothing to see here; go away."
-		if (m_data.empty()) {
+		if (m_timers.empty()) {
 			writeU8(os, 0); // version
 			return;
 		}
 		writeU8(os, 1); // version
-		writeU16(os, m_data.size());
+		writeU16(os, m_timers.size());
 	}
 
 	if (map_format_version >= 25) {
 		writeU8(os, 2 + 4 + 4); // length of the data for a single timer
-		writeU16(os, m_data.size());
+		writeU16(os, m_timers.size());
 	}
 
-	for (std::map<v3s16, NodeTimer>::const_iterator
-			i = m_data.begin();
-			i != m_data.end(); ++i) {
-		v3s16 p = i->first;
+	for (std::multimap<double, NodeTimer>::const_iterator
+			i = m_timers.begin();
+			i != m_timers.end(); ++i) {
 		NodeTimer t = i->second;
+		NodeTimer nt = NodeTimer(t.timeout,
+			t.timeout - (f32)(i->first - m_time), t.position);
+		v3s16 p = t.position;
 
 		u16 p16 = p.Z * MAP_BLOCKSIZE * MAP_BLOCKSIZE + p.Y * MAP_BLOCKSIZE + p.X;
 		writeU16(os, p16);
-		t.serialize(os);
+		nt.serialize(os);
 	}
 }
 
 void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
 {
-	m_data.clear();
+	clear();
 
-	if(map_format_version == 24){
+	if (map_format_version == 24) {
 		u8 timer_version = readU8(is);
 		if(timer_version == 0)
 			return;
@@ -84,7 +86,7 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
 			throw SerializationError("unsupported NodeTimerList version");
 	}
 
-	if(map_format_version >= 25){
+	if (map_format_version >= 25) {
 		u8 timer_data_len = readU8(is);
 		if(timer_data_len != 2+4+4)
 			throw SerializationError("unsupported NodeTimer data length");
@@ -92,8 +94,7 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
 
 	u16 count = readU16(is);
 
-	for(u16 i=0; i<count; i++)
-	{
+	for (u16 i = 0; i < count; i++) {
 		u16 p16 = readU16(is);
 
 		v3s16 p;
@@ -103,11 +104,10 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
 		p16 &= MAP_BLOCKSIZE - 1;
 		p.X = p16;
 
-		NodeTimer t;
+		NodeTimer t(p);
 		t.deSerialize(is);
 
-		if(t.timeout <= 0)
-		{
+		if (t.timeout <= 0) {
 			warningstream<<"NodeTimerList::deSerialize(): "
 					<<"invalid data at position"
 					<<"("<<p.X<<","<<p.Y<<","<<p.Z<<"): Ignoring."
@@ -115,8 +115,7 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
 			continue;
 		}
 
-		if(m_data.find(p) != m_data.end())
-		{
+		if (m_iterators.find(p) != m_iterators.end()) {
 			warningstream<<"NodeTimerList::deSerialize(): "
 					<<"already set data at position"
 					<<"("<<p.X<<","<<p.Y<<","<<p.Z<<"): Ignoring."
@@ -124,31 +123,30 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
 			continue;
 		}
 
-		m_data.insert(std::make_pair(p, t));
+		insert(t);
 	}
 }
 
-std::map<v3s16, NodeTimer> NodeTimerList::step(float dtime)
+std::vector<NodeTimer> NodeTimerList::step(float dtime)
 {
-	std::map<v3s16, NodeTimer> elapsed_timers;
-	// Increment timers
-	for(std::map<v3s16, NodeTimer>::iterator
-			i = m_data.begin();
-			i != m_data.end(); ++i){
-		v3s16 p = i->first;
+	std::vector<NodeTimer> elapsed_timers;
+	m_time += dtime;
+	if (m_next_trigger_time == -1. || m_time < m_next_trigger_time) {
+		return elapsed_timers;
+	}
+	std::multimap<double, NodeTimer>::iterator i = m_timers.begin();
+	// Process timers
+	for (; i != m_timers.end() && i->first <= m_time; ++i) {
 		NodeTimer t = i->second;
-		t.elapsed += dtime;
-		if(t.elapsed >= t.timeout)
-			elapsed_timers.insert(std::make_pair(p, t));
-		else
-			i->second = t;
+		t.elapsed = t.timeout + (f32)(m_time - i->first);
+		elapsed_timers.push_back(t);
+		m_iterators.erase(t.position);
 	}
 	// Delete elapsed timers
-	for(std::map<v3s16, NodeTimer>::const_iterator
-			i = elapsed_timers.begin();
-			i != elapsed_timers.end(); ++i){
-		v3s16 p = i->first;
-		m_data.erase(p);
-	}
+	m_timers.erase(m_timers.begin(), i);
+	if (m_timers.empty())
+		m_next_trigger_time = -1.;
+	else
+		m_next_trigger_time = m_timers.begin()->first;
 	return elapsed_timers;
 }
diff --git a/src/nodetimer.h b/src/nodetimer.h
index 9fb56ed..0fd43b2 100644
--- a/src/nodetimer.h
+++ b/src/nodetimer.h
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "irr_v3d.h"
 #include <iostream>
 #include <map>
+#include <vector>
 
 /*
 	NodeTimer provides per-node timed callback functionality.
@@ -36,8 +37,10 @@ class NodeTimer
 {
 public:
 	NodeTimer(): timeout(0.), elapsed(0.) {}
-	NodeTimer(f32 timeout_, f32 elapsed_):
-		timeout(timeout_), elapsed(elapsed_) {}
+	NodeTimer(const v3s16 &position_):
+		timeout(0.), elapsed(0.), position(position_) {}
+	NodeTimer(f32 timeout_, f32 elapsed_, v3s16 position_):
+		timeout(timeout_), elapsed(elapsed_), position(position_) {}
 	~NodeTimer() {}
 	
 	void serialize(std::ostream &os) const;
@@ -45,6 +48,7 @@ public:
 	
 	f32 timeout;
 	f32 elapsed;
+	v3s16 position;
 };
 
 /*
@@ -54,37 +58,78 @@ public:
 class NodeTimerList
 {
 public:
-	NodeTimerList() {}
+	NodeTimerList(): m_next_trigger_time(-1.), m_time(0.) {}
 	~NodeTimerList() {}
 	
 	void serialize(std::ostream &os, u8 map_format_version) const;
 	void deSerialize(std::istream &is, u8 map_format_version);
 	
 	// Get timer
-	NodeTimer get(v3s16 p){
-		std::map<v3s16, NodeTimer>::iterator n = m_data.find(p);
-		if(n == m_data.end())
+	NodeTimer get(const v3s16 &p) {
+		std::map<v3s16, std::multimap<double, NodeTimer>::iterator>::iterator n =
+			m_iterators.find(p);
+		if (n == m_iterators.end())
 			return NodeTimer();
-		return n->second;
+		NodeTimer t = n->second->second;
+		t.elapsed = t.timeout - (n->second->first - m_time);
+		return t;
 	}
 	// Deletes timer
-	void remove(v3s16 p){
-		m_data.erase(p);
+	void remove(v3s16 p) {
+		std::map<v3s16, std::multimap<double, NodeTimer>::iterator>::iterator n =
+			m_iterators.find(p);
+		if(n != m_iterators.end()) {
+			double removed_time = n->second->first;
+			m_timers.erase(n->second);
+			m_iterators.erase(n);
+			// Yes, this is float equality, but it is not a problem
+			// since we only test equality of floats as an ordered type
+			// and thus we never lose precision
+			if (removed_time == m_next_trigger_time) {
+				if (m_timers.empty())
+					m_next_trigger_time = -1.;
+				else
+					m_next_trigger_time = m_timers.begin()->first;
+			}
+		}
+	}
+	// Undefined behaviour if there already is a timer
+	void insert(NodeTimer timer) {
+		v3s16 p = timer.position;
+		double trigger_time = m_time + (double)(timer.timeout - timer.elapsed);
+		std::multimap<double, NodeTimer>::iterator it =
+			m_timers.insert(std::pair<double, NodeTimer>(
+				trigger_time, timer
+			));
+		m_iterators.insert(
+			std::pair<v3s16, std::multimap<double, NodeTimer>::iterator>(p, it));
+		if (m_next_trigger_time == -1. || trigger_time < m_next_trigger_time)
+			m_next_trigger_time = trigger_time;
 	}
 	// Deletes old timer and sets a new one
-	void set(v3s16 p, NodeTimer t){
-		m_data[p] = t;
+	inline void set(const NodeTimer &timer) {
+		remove(timer.position);
+		insert(timer);
 	}
 	// Deletes all timers
-	void clear(){
-		m_data.clear();
+	void clear() {
+		m_timers.clear();
+		m_iterators.clear();
+		m_next_trigger_time = -1.;
+	}
+
+	inline double getNextTriggerTime() {
+		return m_next_trigger_time;
 	}
 
-	// A step in time. Returns map of elapsed timers.
-	std::map<v3s16, NodeTimer> step(float dtime);
+	// Move forward in time, returns elapsed timers
+	std::vector<NodeTimer> step(float dtime);
 
 private:
-	std::map<v3s16, NodeTimer> m_data;
+	std::multimap<double, NodeTimer> m_timers;
+	std::map<v3s16, std::multimap<double, NodeTimer>::iterator> m_iterators;
+	double m_next_trigger_time;
+	double m_time;
 };
 
 #endif
diff --git a/src/noise.cpp b/src/noise.cpp
index 2ddc392..b918c99 100644
--- a/src/noise.cpp
+++ b/src/noise.cpp
@@ -93,22 +93,31 @@ u32 PcgRandom::range(u32 bound)
 	// If the bound is 0, we cover the whole RNG's range
 	if (bound == 0)
 		return next();
+
 	/*
-	If the bound is not a multiple of the RNG's range, it may cause bias,
-	e.g. a RNG has a range from 0 to 3 and we take want a number 0 to 2.
-	Using rand() % 3, the number 0 would be twice as likely to appear.
-	With a very large RNG range, the effect becomes less prevalent but
-	still present.  This can be solved by modifying the range of the RNG
-	to become a multiple of bound by dropping values above the a threshold.
-	In our example, threshold == 4 - 3 = 1 % 3 == 1, so reject 0, thus
-	making the range 3 with no bias.
-
-	This loop looks dangerous, but will always terminate due to the
-	RNG's property of uniformity.
+		This is an optimization of the expression:
+		  0x100000000ull % bound
+		since 64-bit modulo operations typically much slower than 32.
 	*/
 	u32 threshold = -bound % bound;
 	u32 r;
 
+	/*
+		If the bound is not a multiple of the RNG's range, it may cause bias,
+		e.g. a RNG has a range from 0 to 3 and we take want a number 0 to 2.
+		Using rand() % 3, the number 0 would be twice as likely to appear.
+		With a very large RNG range, the effect becomes less prevalent but
+		still present.
+
+		This can be solved by modifying the range of the RNG to become a
+		multiple of bound by dropping values above the a threshold.
+
+		In our example, threshold == 4 % 3 == 1, so reject values < 1
+		(that is, 0), thus making the range == 3 with no bias.
+
+		This loop may look dangerous, but will always terminate due to the
+		RNG's property of uniformity.
+	*/
 	while ((r = next()) < threshold)
 		;
 
@@ -156,7 +165,7 @@ s32 PcgRandom::randNormalDist(s32 min, s32 max, int num_trials)
 
 ///////////////////////////////////////////////////////////////////////////////
 
-float noise2d(int x, int y, int seed)
+float noise2d(int x, int y, s32 seed)
 {
 	unsigned int n = (NOISE_MAGIC_X * x + NOISE_MAGIC_Y * y
 			+ NOISE_MAGIC_SEED * seed) & 0x7fffffff;
@@ -166,7 +175,7 @@ float noise2d(int x, int y, int seed)
 }
 
 
-float noise3d(int x, int y, int z, int seed)
+float noise3d(int x, int y, int z, s32 seed)
 {
 	unsigned int n = (NOISE_MAGIC_X * x + NOISE_MAGIC_Y * y + NOISE_MAGIC_Z * z
 			+ NOISE_MAGIC_SEED * seed) & 0x7fffffff;
@@ -235,7 +244,7 @@ float triLinearInterpolationNoEase(
 	return linearInterpolation(u, v, z);
 }
 
-float noise2d_gradient(float x, float y, int seed, bool eased)
+float noise2d_gradient(float x, float y, s32 seed, bool eased)
 {
 	// Calculate the integer coordinates
 	int x0 = myfloor(x);
@@ -256,7 +265,7 @@ float noise2d_gradient(float x, float y, int seed, bool eased)
 }
 
 
-float noise3d_gradient(float x, float y, float z, int seed, bool eased)
+float noise3d_gradient(float x, float y, float z, s32 seed, bool eased)
 {
 	// Calculate the integer coordinates
 	int x0 = myfloor(x);
@@ -290,7 +299,7 @@ float noise3d_gradient(float x, float y, float z, int seed, bool eased)
 }
 
 
-float noise2d_perlin(float x, float y, int seed,
+float noise2d_perlin(float x, float y, s32 seed,
 	int octaves, float persistence, bool eased)
 {
 	float a = 0;
@@ -306,7 +315,7 @@ float noise2d_perlin(float x, float y, int seed,
 }
 
 
-float noise2d_perlin_abs(float x, float y, int seed,
+float noise2d_perlin_abs(float x, float y, s32 seed,
 	int octaves, float persistence, bool eased)
 {
 	float a = 0;
@@ -321,7 +330,7 @@ float noise2d_perlin_abs(float x, float y, int seed,
 }
 
 
-float noise3d_perlin(float x, float y, float z, int seed,
+float noise3d_perlin(float x, float y, float z, s32 seed,
 	int octaves, float persistence, bool eased)
 {
 	float a = 0;
@@ -336,7 +345,7 @@ float noise3d_perlin(float x, float y, float z, int seed,
 }
 
 
-float noise3d_perlin_abs(float x, float y, float z, int seed,
+float noise3d_perlin_abs(float x, float y, float z, s32 seed,
 	int octaves, float persistence, bool eased)
 {
 	float a = 0;
@@ -363,7 +372,7 @@ float contour(float v)
 ///////////////////////// [ New noise ] ////////////////////////////
 
 
-float NoisePerlin2D(NoiseParams *np, float x, float y, int seed)
+float NoisePerlin2D(NoiseParams *np, float x, float y, s32 seed)
 {
 	float a = 0;
 	float f = 1.0;
@@ -389,7 +398,7 @@ float NoisePerlin2D(NoiseParams *np, float x, float y, int seed)
 }
 
 
-float NoisePerlin3D(NoiseParams *np, float x, float y, float z, int seed)
+float NoisePerlin3D(NoiseParams *np, float x, float y, float z, s32 seed)
 {
 	float a = 0;
 	float f = 1.0;
@@ -416,7 +425,7 @@ float NoisePerlin3D(NoiseParams *np, float x, float y, float z, int seed)
 }
 
 
-Noise::Noise(NoiseParams *np_, int seed, u32 sx, u32 sy, u32 sz)
+Noise::Noise(NoiseParams *np_, s32 seed, u32 sx, u32 sy, u32 sz)
 {
 	memcpy(&np, np_, sizeof(np));
 	this->seed = seed;
@@ -543,7 +552,7 @@ void Noise::resizeNoiseBuf(bool is3d)
 void Noise::gradientMap2D(
 		float x, float y,
 		float step_x, float step_y,
-		int seed)
+		s32 seed)
 {
 	float v00, v01, v10, v11, u, v, orig_u;
 	u32 index, i, j, noisex, noisey;
@@ -607,7 +616,7 @@ void Noise::gradientMap2D(
 void Noise::gradientMap3D(
 		float x, float y, float z,
 		float step_x, float step_y, float step_z,
-		int seed)
+		s32 seed)
 {
 	float v000, v010, v100, v110;
 	float v001, v011, v101, v111;
diff --git a/src/noise.h b/src/noise.h
index 0e4252d..41b93ae 100644
--- a/src/noise.h
+++ b/src/noise.h
@@ -148,7 +148,7 @@ struct NoiseParams {
 class Noise {
 public:
 	NoiseParams np;
-	int seed;
+	s32 seed;
 	u32 sx;
 	u32 sy;
 	u32 sz;
@@ -157,7 +157,7 @@ public:
 	float *persist_buf;
 	float *result;
 
-	Noise(NoiseParams *np, int seed, u32 sx, u32 sy, u32 sz=1);
+	Noise(NoiseParams *np, s32 seed, u32 sx, u32 sy, u32 sz=1);
 	~Noise();
 
 	void setSize(u32 sx, u32 sy, u32 sz=1);
@@ -167,11 +167,11 @@ public:
 	void gradientMap2D(
 		float x, float y,
 		float step_x, float step_y,
-		int seed);
+		s32 seed);
 	void gradientMap3D(
 		float x, float y, float z,
 		float step_x, float step_y, float step_z,
-		int seed);
+		s32 seed);
 
 	float *perlinMap2D(float x, float y, float *persistence_map=NULL);
 	float *perlinMap3D(float x, float y, float z, float *persistence_map=NULL);
@@ -202,11 +202,11 @@ private:
 
 };
 
-float NoisePerlin2D(NoiseParams *np, float x, float y, int seed);
-float NoisePerlin3D(NoiseParams *np, float x, float y, float z, int seed);
+float NoisePerlin2D(NoiseParams *np, float x, float y, s32 seed);
+float NoisePerlin3D(NoiseParams *np, float x, float y, float z, s32 seed);
 
 inline float NoisePerlin2D_PO(NoiseParams *np, float x, float xoff,
-	float y, float yoff, int seed)
+	float y, float yoff, s32 seed)
 {
 	return NoisePerlin2D(np,
 		x + xoff * np->spread.X,
@@ -215,7 +215,7 @@ inline float NoisePerlin2D_PO(NoiseParams *np, float x, float xoff,
 }
 
 inline float NoisePerlin3D_PO(NoiseParams *np, float x, float xoff,
-	float y, float yoff, float z, float zoff, int seed)
+	float y, float yoff, float z, float zoff, s32 seed)
 {
 	return NoisePerlin3D(np,
 		x + xoff * np->spread.X,
@@ -225,22 +225,22 @@ inline float NoisePerlin3D_PO(NoiseParams *np, float x, float xoff,
 }
 
 // Return value: -1 ... 1
-float noise2d(int x, int y, int seed);
-float noise3d(int x, int y, int z, int seed);
+float noise2d(int x, int y, s32 seed);
+float noise3d(int x, int y, int z, s32 seed);
 
-float noise2d_gradient(float x, float y, int seed, bool eased=true);
-float noise3d_gradient(float x, float y, float z, int seed, bool eased=false);
+float noise2d_gradient(float x, float y, s32 seed, bool eased=true);
+float noise3d_gradient(float x, float y, float z, s32 seed, bool eased=false);
 
-float noise2d_perlin(float x, float y, int seed,
+float noise2d_perlin(float x, float y, s32 seed,
 		int octaves, float persistence, bool eased=true);
 
-float noise2d_perlin_abs(float x, float y, int seed,
+float noise2d_perlin_abs(float x, float y, s32 seed,
 		int octaves, float persistence, bool eased=true);
 
-float noise3d_perlin(float x, float y, float z, int seed,
+float noise3d_perlin(float x, float y, float z, s32 seed,
 		int octaves, float persistence, bool eased=false);
 
-float noise3d_perlin_abs(float x, float y, float z, int seed,
+float noise3d_perlin_abs(float x, float y, float z, s32 seed,
 		int octaves, float persistence, bool eased=false);
 
 inline float easeCurve(float t)
diff --git a/src/particles.cpp b/src/particles.cpp
index 525258a..acf9cc8 100644
--- a/src/particles.cpp
+++ b/src/particles.cpp
@@ -54,6 +54,7 @@ Particle::Particle(
 	float expirationtime,
 	float size,
 	bool collisiondetection,
+	bool collision_removal,
 	bool vertical,
 	video::ITexture *texture,
 	v2f texpos,
@@ -85,6 +86,7 @@ Particle::Particle(
 	m_player = player;
 	m_size = size;
 	m_collisiondetection = collisiondetection;
+	m_collision_removal = collision_removal;
 	m_vertical = vertical;
 
 	// Irrlicht stuff
@@ -126,20 +128,21 @@ void Particle::render()
 void Particle::step(float dtime)
 {
 	m_time += dtime;
-	if (m_collisiondetection)
-	{
+	if (m_collisiondetection) {
 		aabb3f box = m_collisionbox;
-		v3f p_pos = m_pos*BS;
-		v3f p_velocity = m_velocity*BS;
-		collisionMoveSimple(m_env, m_gamedef,
-			BS*0.5, box,
-			0, dtime,
-			&p_pos, &p_velocity, m_acceleration * BS);
-		m_pos = p_pos/BS;
-		m_velocity = p_velocity/BS;
-	}
-	else
-	{
+		v3f p_pos = m_pos * BS;
+		v3f p_velocity = m_velocity * BS;
+		collisionMoveResult r = collisionMoveSimple(m_env,
+			m_gamedef, BS * 0.5, box, 0, dtime, &p_pos,
+			&p_velocity, m_acceleration * BS);
+		if (m_collision_removal && r.collides) {
+			// force expiration of the particle
+			m_expiration = -1.0;
+		} else {
+			m_pos = p_pos / BS;
+			m_velocity = p_velocity / BS;
+		}
+	} else {
 		m_velocity += m_acceleration * dtime;
 		m_pos += m_velocity * dtime;
 	}
@@ -210,8 +213,8 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr,
 	u16 amount, float time,
 	v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc,
 	float minexptime, float maxexptime, float minsize, float maxsize,
-	bool collisiondetection, bool vertical, video::ITexture *texture, u32 id,
-	ParticleManager *p_manager) :
+	bool collisiondetection, bool collision_removal, u16 attached_id, bool vertical,
+	video::ITexture *texture, u32 id, ParticleManager *p_manager) :
 	m_particlemanager(p_manager)
 {
 	m_gamedef = gamedef;
@@ -230,6 +233,8 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr,
 	m_minsize = minsize;
 	m_maxsize = maxsize;
 	m_collisiondetection = collisiondetection;
+	m_collision_removal = collision_removal;
+	m_attached_id = attached_id;
 	m_vertical = vertical;
 	m_texture = texture;
 	m_time = 0;
@@ -247,6 +252,20 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
 {
 	m_time += dtime;
 
+	bool unloaded = false;
+	bool is_attached = false;
+	v3f attached_pos = v3f(0,0,0);
+	float attached_yaw = 0;
+	if (m_attached_id != 0) {
+		if (ClientActiveObject *attached = env->getActiveObject(m_attached_id)) {
+			attached_pos = attached->getPosition() / BS;
+			attached_yaw = attached->getYaw();
+			is_attached = true;
+		} else {
+			unloaded = true;
+		}
+	}
+
 	if (m_spawntime != 0) // Spawner exists for a predefined timespan
 	{
 		for(std::vector<float>::iterator i = m_spawntimes.begin();
@@ -256,32 +275,47 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
 			{
 				m_amount--;
 
-				v3f pos = random_v3f(m_minpos, m_maxpos);
-				v3f vel = random_v3f(m_minvel, m_maxvel);
-				v3f acc = random_v3f(m_minacc, m_maxacc);
-				float exptime = rand()/(float)RAND_MAX
-						*(m_maxexptime-m_minexptime)
-						+m_minexptime;
-				float size = rand()/(float)RAND_MAX
-						*(m_maxsize-m_minsize)
-						+m_minsize;
-
-				Particle* toadd = new Particle(
-					m_gamedef,
-					m_smgr,
-					m_player,
-					env,
-					pos,
-					vel,
-					acc,
-					exptime,
-					size,
-					m_collisiondetection,
-					m_vertical,
-					m_texture,
-					v2f(0.0, 0.0),
-					v2f(1.0, 1.0));
-				m_particlemanager->addParticle(toadd);
+				// Pretend to, but don't actually spawn a
+				// particle if it is attached to an unloaded
+				// object.
+				if (!unloaded) {
+					v3f pos = random_v3f(m_minpos, m_maxpos);
+					v3f vel = random_v3f(m_minvel, m_maxvel);
+					v3f acc = random_v3f(m_minacc, m_maxacc);
+
+					if (is_attached) {
+						// Apply attachment yaw and position
+						pos.rotateXZBy(attached_yaw);
+						pos += attached_pos;
+						vel.rotateXZBy(attached_yaw);
+						acc.rotateXZBy(attached_yaw);
+					}
+
+					float exptime = rand()/(float)RAND_MAX
+							*(m_maxexptime-m_minexptime)
+							+m_minexptime;
+					float size = rand()/(float)RAND_MAX
+							*(m_maxsize-m_minsize)
+							+m_minsize;
+
+					Particle* toadd = new Particle(
+						m_gamedef,
+						m_smgr,
+						m_player,
+						env,
+						pos,
+						vel,
+						acc,
+						exptime,
+						size,
+						m_collisiondetection,
+						m_collision_removal,
+						m_vertical,
+						m_texture,
+						v2f(0.0, 0.0),
+						v2f(1.0, 1.0));
+					m_particlemanager->addParticle(toadd);
+				}
 				i = m_spawntimes.erase(i);
 			}
 			else
@@ -292,6 +326,9 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
 	}
 	else // Spawner exists for an infinity timespan, spawn on a per-second base
 	{
+		// Skip this step if attached to an unloaded object
+		if (unloaded)
+			return;
 		for (int i = 0; i <= m_amount; i++)
 		{
 			if (rand()/(float)RAND_MAX < dtime)
@@ -299,6 +336,15 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
 				v3f pos = random_v3f(m_minpos, m_maxpos);
 				v3f vel = random_v3f(m_minvel, m_maxvel);
 				v3f acc = random_v3f(m_minacc, m_maxacc);
+
+				if (is_attached) {
+					// Apply attachment yaw and position
+					pos.rotateXZBy(attached_yaw);
+					pos += attached_pos;
+					vel.rotateXZBy(attached_yaw);
+					acc.rotateXZBy(attached_yaw);
+				}
+
 				float exptime = rand()/(float)RAND_MAX
 						*(m_maxexptime-m_minexptime)
 						+m_minexptime;
@@ -317,6 +363,7 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
 					exptime,
 					size,
 					m_collisiondetection,
+					m_collision_removal,
 					m_vertical,
 					m_texture,
 					v2f(0.0, 0.0),
@@ -446,6 +493,8 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef,
 					event->add_particlespawner.minsize,
 					event->add_particlespawner.maxsize,
 					event->add_particlespawner.collisiondetection,
+					event->add_particlespawner.collision_removal,
+					event->add_particlespawner.attached_id,
 					event->add_particlespawner.vertical,
 					texture,
 					event->add_particlespawner.id,
@@ -480,6 +529,7 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef,
 					event->spawn_particle.expirationtime,
 					event->spawn_particle.size,
 					event->spawn_particle.collisiondetection,
+					event->spawn_particle.collision_removal,
 					event->spawn_particle.vertical,
 					texture,
 					v2f(0.0, 0.0),
@@ -555,6 +605,7 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* s
 		visual_size,
 		true,
 		false,
+		false,
 		texture,
 		texpos,
 		texsize);
diff --git a/src/particles.h b/src/particles.h
index dda8438..eb8c666 100644
--- a/src/particles.h
+++ b/src/particles.h
@@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 struct ClientEvent;
 class ParticleManager;
+class ClientEnvironment;
 
 class Particle : public scene::ISceneNode
 {
@@ -45,6 +46,7 @@ class Particle : public scene::ISceneNode
 		float expirationtime,
 		float size,
 		bool collisiondetection,
+		bool collision_removal,
 		bool vertical,
 		video::ITexture *texture,
 		v2f texpos,
@@ -97,6 +99,7 @@ private:
 	float m_size;
 	u8 m_light;
 	bool m_collisiondetection;
+	bool m_collision_removal;
 	bool m_vertical;
 	v3s16 m_camera_offset;
 };
@@ -115,6 +118,8 @@ class ParticleSpawner
 		float minexptime, float maxexptime,
 		float minsize, float maxsize,
 		bool collisiondetection,
+		bool collision_removal,
+		u16 attached_id,
 		bool vertical,
 		video::ITexture *texture,
 		u32 id,
@@ -148,8 +153,9 @@ class ParticleSpawner
 	video::ITexture *m_texture;
 	std::vector<float> m_spawntimes;
 	bool m_collisiondetection;
+	bool m_collision_removal;
 	bool m_vertical;
-
+	u16 m_attached_id;
 };
 
 /**
diff --git a/src/player.cpp b/src/player.cpp
index 5949712..85bc639 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -19,49 +19,28 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "player.h"
 
-#include <fstream>
 #include "threading/mutex_auto_lock.h"
 #include "util/numeric.h"
 #include "hud.h"
 #include "constants.h"
 #include "gamedef.h"
 #include "settings.h"
-#include "content_sao.h"
-#include "filesys.h"
 #include "log.h"
 #include "porting.h"  // strlcpy
 
 
-Player::Player(IGameDef *gamedef, const char *name):
-	got_teleported(false),
-	touching_ground(false),
-	in_liquid(false),
-	in_liquid_stable(false),
-	liquid_viscosity(0),
-	is_climbing(false),
-	swimming_vertical(false),
-	camera_barely_in_ceiling(false),
-	inventory(gamedef->idef()),
-	hp(PLAYER_MAX_HP),
-	hurt_tilt_timer(0),
-	hurt_tilt_strength(0),
-	protocol_version(0),
+Player::Player(const char *name, IItemDefManager *idef):
+	inventory(idef),
 	peer_id(PEER_ID_INEXISTENT),
 	keyPressed(0),
 // protected
-	m_gamedef(gamedef),
-	m_breath(PLAYER_MAX_BREATH),
-	m_pitch(0),
-	m_yaw(0),
-	m_speed(0,0,0),
-	m_position(0,0,0),
-	m_collisionbox(-BS*0.30,0.0,-BS*0.30,BS*0.30,BS*1.75,BS*0.30),
-	m_dirty(false)
+	m_speed(0,0,0)
 {
 	strlcpy(m_name, name, PLAYERNAME_SIZE);
 
 	inventory.clear();
 	inventory.addList("main", PLAYER_INVENTORY_SIZE);
+	inventory.addList("hand", 1);
 	InventoryList *craft = inventory.addList("craft", 9);
 	craft->setWidth(3);
 	inventory.addList("craftpreview", 1);
@@ -92,13 +71,6 @@ Player::Player(IGameDef *gamedef, const char *name):
 	movement_gravity                = 9.81 * BS;
 	local_animation_speed           = 0.0;
 
-	// Movement overrides are multipliers and must be 1 by default
-	physics_override_speed        = 1;
-	physics_override_jump         = 1;
-	physics_override_gravity      = 1;
-	physics_override_sneak        = true;
-	physics_override_sneak_glitch = true;
-
 	hud_flags =
 		HUD_FLAG_HOTBAR_VISIBLE    | HUD_FLAG_HEALTHBAR_VISIBLE |
 		HUD_FLAG_CROSSHAIR_VISIBLE | HUD_FLAG_WIELDITEM_VISIBLE |
@@ -112,75 +84,6 @@ Player::~Player()
 	clearHud();
 }
 
-v3s16 Player::getLightPosition() const
-{
-	return floatToInt(m_position + v3f(0,BS+BS/2,0), BS);
-}
-
-void Player::serialize(std::ostream &os)
-{
-	// Utilize a Settings object for storing values
-	Settings args;
-	args.setS32("version", 1);
-	args.set("name", m_name);
-	//args.set("password", m_password);
-	args.setFloat("pitch", m_pitch);
-	args.setFloat("yaw", m_yaw);
-	args.setV3F("position", m_position);
-	args.setS32("hp", hp);
-	args.setS32("breath", m_breath);
-
-	args.writeLines(os);
-
-	os<<"PlayerArgsEnd\n";
-
-	inventory.serialize(os);
-}
-
-void Player::deSerialize(std::istream &is, std::string playername)
-{
-	Settings args;
-
-	if (!args.parseConfigLines(is, "PlayerArgsEnd")) {
-		throw SerializationError("PlayerArgsEnd of player " +
-				playername + " not found!");
-	}
-
-	m_dirty = true;
-	//args.getS32("version"); // Version field value not used
-	std::string name = args.get("name");
-	strlcpy(m_name, name.c_str(), PLAYERNAME_SIZE);
-	setPitch(args.getFloat("pitch"));
-	setYaw(args.getFloat("yaw"));
-	setPosition(args.getV3F("position"));
-	try{
-		hp = args.getS32("hp");
-	}catch(SettingNotFoundException &e) {
-		hp = PLAYER_MAX_HP;
-	}
-	try{
-		m_breath = args.getS32("breath");
-	}catch(SettingNotFoundException &e) {
-		m_breath = PLAYER_MAX_BREATH;
-	}
-
-	inventory.deSerialize(is);
-
-	if(inventory.getList("craftpreview") == NULL) {
-		// Convert players without craftpreview
-		inventory.addList("craftpreview", 1);
-
-		bool craftresult_is_preview = true;
-		if(args.exists("craftresult_is_preview"))
-			craftresult_is_preview = args.getBool("craftresult_is_preview");
-		if(craftresult_is_preview)
-		{
-			// Clear craftresult
-			inventory.getList("craftresult")->changeItem(0, ItemStack());
-		}
-	}
-}
-
 u32 Player::addHud(HudElement *toadd)
 {
 	MutexAutoLock lock(m_mutex);
@@ -226,81 +129,3 @@ void Player::clearHud()
 		hud.pop_back();
 	}
 }
-
-RemotePlayer::RemotePlayer(IGameDef *gamedef, const char *name):
-	Player(gamedef, name),
-	m_sao(NULL)
-{
-	movement_acceleration_default   = g_settings->getFloat("movement_acceleration_default")   * BS;
-	movement_acceleration_air       = g_settings->getFloat("movement_acceleration_air")       * BS;
-	movement_acceleration_fast      = g_settings->getFloat("movement_acceleration_fast")      * BS;
-	movement_speed_walk             = g_settings->getFloat("movement_speed_walk")             * BS;
-	movement_speed_crouch           = g_settings->getFloat("movement_speed_crouch")           * BS;
-	movement_speed_fast             = g_settings->getFloat("movement_speed_fast")             * BS;
-	movement_speed_climb            = g_settings->getFloat("movement_speed_climb")            * BS;
-	movement_speed_jump             = g_settings->getFloat("movement_speed_jump")             * BS;
-	movement_liquid_fluidity        = g_settings->getFloat("movement_liquid_fluidity")        * BS;
-	movement_liquid_fluidity_smooth = g_settings->getFloat("movement_liquid_fluidity_smooth") * BS;
-	movement_liquid_sink            = g_settings->getFloat("movement_liquid_sink")            * BS;
-	movement_gravity                = g_settings->getFloat("movement_gravity")                * BS;
-}
-
-void RemotePlayer::save(std::string savedir)
-{
-	/*
-	 * We have to open all possible player files in the players directory
-	 * and check their player names because some file systems are not
-	 * case-sensitive and player names are case-sensitive.
-	 */
-
-	// A player to deserialize files into to check their names
-	RemotePlayer testplayer(m_gamedef, "");
-
-	savedir += DIR_DELIM;
-	std::string path = savedir + m_name;
-	for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) {
-		if (!fs::PathExists(path)) {
-			// Open file and serialize
-			std::ostringstream ss(std::ios_base::binary);
-			serialize(ss);
-			if (!fs::safeWriteToFile(path, ss.str())) {
-				infostream << "Failed to write " << path << std::endl;
-			}
-			setModified(false);
-			return;
-		}
-		// Open file and deserialize
-		std::ifstream is(path.c_str(), std::ios_base::binary);
-		if (!is.good()) {
-			infostream << "Failed to open " << path << std::endl;
-			return;
-		}
-		testplayer.deSerialize(is, path);
-		is.close();
-		if (strcmp(testplayer.getName(), m_name) == 0) {
-			// Open file and serialize
-			std::ostringstream ss(std::ios_base::binary);
-			serialize(ss);
-			if (!fs::safeWriteToFile(path, ss.str())) {
-				infostream << "Failed to write " << path << std::endl;
-			}
-			setModified(false);
-			return;
-		}
-		path = savedir + m_name + itos(i);
-	}
-
-	infostream << "Didn't find free file for player " << m_name << std::endl;
-	return;
-}
-
-/*
-	RemotePlayer
-*/
-void RemotePlayer::setPosition(const v3f &position)
-{
-	Player::setPosition(position);
-	if(m_sao)
-		m_sao->setBasePosition(position);
-}
-
diff --git a/src/player.h b/src/player.h
index b317cda..5f9bb7e 100644
--- a/src/player.h
+++ b/src/player.h
@@ -46,7 +46,10 @@ struct PlayerControl
 		RMB = false;
 		pitch = 0;
 		yaw = 0;
+		sidew_move_joystick_axis = .0f;
+		forw_move_joystick_axis = .0f;
 	}
+
 	PlayerControl(
 		bool a_up,
 		bool a_down,
@@ -55,10 +58,13 @@ struct PlayerControl
 		bool a_jump,
 		bool a_aux1,
 		bool a_sneak,
+		bool a_zoom,
 		bool a_LMB,
 		bool a_RMB,
 		float a_pitch,
-		float a_yaw
+		float a_yaw,
+		float a_sidew_move_joystick_axis,
+		float a_forw_move_joystick_axis
 	)
 	{
 		up = a_up;
@@ -68,10 +74,13 @@ struct PlayerControl
 		jump = a_jump;
 		aux1 = a_aux1;
 		sneak = a_sneak;
+		zoom = a_zoom;
 		LMB = a_LMB;
 		RMB = a_RMB;
 		pitch = a_pitch;
 		yaw = a_yaw;
+		sidew_move_joystick_axis = a_sidew_move_joystick_axis;
+		forw_move_joystick_axis = a_forw_move_joystick_axis;
 	}
 	bool up;
 	bool down;
@@ -80,16 +89,17 @@ struct PlayerControl
 	bool jump;
 	bool aux1;
 	bool sneak;
+	bool zoom;
 	bool LMB;
 	bool RMB;
 	float pitch;
 	float yaw;
+	float sidew_move_joystick_axis;
+	float forw_move_joystick_axis;
 };
 
 class Map;
-class IGameDef;
 struct CollisionInfo;
-class PlayerSAO;
 struct HudElement;
 class Environment;
 
@@ -100,7 +110,7 @@ class Player
 {
 public:
 
-	Player(IGameDef *gamedef, const char *name);
+	Player(const char *name, IItemDefManager *idef);
 	virtual ~Player() = 0;
 
 	virtual void move(f32 dtime, Environment *env, f32 pos_max_d)
@@ -119,88 +129,10 @@ public:
 		m_speed = speed;
 	}
 
-	v3f getPosition()
-	{
-		return m_position;
-	}
-
-	v3s16 getLightPosition() const;
-
-	v3f getEyeOffset()
-	{
-		float eye_height = camera_barely_in_ceiling ? 1.5f : 1.625f;
-		return v3f(0, BS * eye_height, 0);
-	}
-
-	v3f getEyePosition()
-	{
-		return m_position + getEyeOffset();
-	}
-
-	virtual void setPosition(const v3f &position)
-	{
-		if (position != m_position)
-			m_dirty = true;
-		m_position = position;
-	}
-
-	void setPitch(f32 pitch)
-	{
-		if (pitch != m_pitch)
-			m_dirty = true;
-		m_pitch = pitch;
-	}
-
-	virtual void setYaw(f32 yaw)
-	{
-		if (yaw != m_yaw)
-			m_dirty = true;
-		m_yaw = yaw;
-	}
-
-	f32 getPitch()
-	{
-		return m_pitch;
-	}
-
-	f32 getYaw()
-	{
-		return m_yaw;
-	}
-
-	u16 getBreath()
-	{
-		return m_breath;
-	}
-
-	virtual void setBreath(u16 breath)
-	{
-		if (breath != m_breath)
-			m_dirty = true;
-		m_breath = breath;
-	}
-
-	f32 getRadPitch()
-	{
-		return -1.0 * m_pitch * core::DEGTORAD;
-	}
-
-	f32 getRadYaw()
-	{
-		return (m_yaw + 90.) * core::DEGTORAD;
-	}
+	const char *getName() const { return m_name; }
 
-	const char *getName() const
+	u32 getFreeHudID()
 	{
-		return m_name;
-	}
-
-	aabb3f getCollisionbox()
-	{
-		return m_collisionbox;
-	}
-
-	u32 getFreeHudID() {
 		size_t size = hud.size();
 		for (size_t i = 0; i != size; i++) {
 			if (!hud[i])
@@ -209,126 +141,6 @@ public:
 		return size;
 	}
 
-	void setHotbarItemcount(s32 hotbar_itemcount)
-	{
-		hud_hotbar_itemcount = hotbar_itemcount;
-	}
-
-	s32 getHotbarItemcount()
-	{
-		return hud_hotbar_itemcount;
-	}
-
-	void setHotbarImage(const std::string &name)
-	{
-		hud_hotbar_image = name;
-	}
-
-	std::string getHotbarImage()
-	{
-		return hud_hotbar_image;
-	}
-
-	void setHotbarSelectedImage(const std::string &name)
-	{
-		hud_hotbar_selected_image = name;
-	}
-
-	std::string getHotbarSelectedImage() {
-		return hud_hotbar_selected_image;
-	}
-
-	void setSky(const video::SColor &bgcolor, const std::string &type,
-		const std::vector<std::string> &params)
-	{
-		m_sky_bgcolor = bgcolor;
-		m_sky_type = type;
-		m_sky_params = params;
-	}
-
-	void getSky(video::SColor *bgcolor, std::string *type,
-		std::vector<std::string> *params)
-	{
-		*bgcolor = m_sky_bgcolor;
-		*type = m_sky_type;
-		*params = m_sky_params;
-	}
-
-	void overrideDayNightRatio(bool do_override, float ratio)
-	{
-		m_day_night_ratio_do_override = do_override;
-		m_day_night_ratio = ratio;
-	}
-
-	void getDayNightRatio(bool *do_override, float *ratio)
-	{
-		*do_override = m_day_night_ratio_do_override;
-		*ratio = m_day_night_ratio;
-	}
-
-	void setLocalAnimations(v2s32 frames[4], float frame_speed)
-	{
-		for (int i = 0; i < 4; i++)
-			local_animations[i] = frames[i];
-		local_animation_speed = frame_speed;
-	}
-
-	void getLocalAnimations(v2s32 *frames, float *frame_speed)
-	{
-		for (int i = 0; i < 4; i++)
-			frames[i] = local_animations[i];
-		*frame_speed = local_animation_speed;
-	}
-
-	virtual bool isLocal() const
-	{
-		return false;
-	}
-
-	virtual PlayerSAO *getPlayerSAO()
-	{
-		return NULL;
-	}
-
-	virtual void setPlayerSAO(PlayerSAO *sao)
-	{
-		FATAL_ERROR("FIXME");
-	}
-
-	/*
-		serialize() writes a bunch of text that can contain
-		any characters except a '\0', and such an ending that
-		deSerialize stops reading exactly at the right point.
-	*/
-	void serialize(std::ostream &os);
-	void deSerialize(std::istream &is, std::string playername);
-
-	bool checkModified() const
-	{
-		return m_dirty || inventory.checkModified();
-	}
-
-	void setModified(const bool x)
-	{
-		m_dirty = x;
-		if (x == false)
-			inventory.setModified(x);
-	}
-
-	// Use a function, if isDead can be defined by other conditions
-	bool isDead() { return hp == 0; }
-
-	bool got_teleported;
-	bool touching_ground;
-	// This oscillates so that the player jumps a bit above the surface
-	bool in_liquid;
-	// This is more stable and defines the maximum speed of the player
-	bool in_liquid_stable;
-	// Gets the viscosity of water to calculate friction
-	u8 liquid_viscosity;
-	bool is_climbing;
-	bool swimming_vertical;
-	bool camera_barely_in_ceiling;
 	v3f eye_offset_first;
 	v3f eye_offset_third;
 
@@ -347,67 +159,30 @@ public:
 	f32 movement_liquid_sink;
 	f32 movement_gravity;
 
-	float physics_override_speed;
-	float physics_override_jump;
-	float physics_override_gravity;
-	bool physics_override_sneak;
-	bool physics_override_sneak_glitch;
-
 	v2s32 local_animations[4];
 	float local_animation_speed;
 
-	u16 hp;
-
-	float hurt_tilt_timer;
-	float hurt_tilt_strength;
-
-	u16 protocol_version;
 	u16 peer_id;
 
 	std::string inventory_formspec;
 
 	PlayerControl control;
-	PlayerControl getPlayerControl()
-	{
-		return control;
-	}
+	const PlayerControl& getPlayerControl() { return control; }
 
 	u32 keyPressed;
 
-
 	HudElement* getHud(u32 id);
 	u32         addHud(HudElement* hud);
 	HudElement* removeHud(u32 id);
 	void        clearHud();
-	u32         maxHudId() {
-		return hud.size();
-	}
 
 	u32 hud_flags;
 	s32 hud_hotbar_itemcount;
-	std::string hud_hotbar_image;
-	std::string hud_hotbar_selected_image;
 protected:
-	IGameDef *m_gamedef;
-
 	char m_name[PLAYERNAME_SIZE];
-	u16 m_breath;
-	f32 m_pitch;
-	f32 m_yaw;
 	v3f m_speed;
-	v3f m_position;
-	aabb3f m_collisionbox;
-
-	bool m_dirty;
 
 	std::vector<HudElement *> hud;
-
-	std::string m_sky_type;
-	video::SColor m_sky_bgcolor;
-	std::vector<std::string> m_sky_params;
-
-	bool m_day_night_ratio_do_override;
-	float m_day_night_ratio;
 private:
 	// Protect some critical areas
 	// hud for example can be modified by EmergeThread
@@ -415,27 +190,5 @@ private:
 	Mutex m_mutex;
 };
 
-
-/*
-	Player on the server
-*/
-class RemotePlayer : public Player
-{
-public:
-	RemotePlayer(IGameDef *gamedef, const char *name);
-	virtual ~RemotePlayer() {}
-
-	void save(std::string savedir);
-
-	PlayerSAO *getPlayerSAO()
-	{ return m_sao; }
-	void setPlayerSAO(PlayerSAO *sao)
-	{ m_sao = sao; }
-	void setPosition(const v3f &position);
-
-private:
-	PlayerSAO *m_sao;
-};
-
 #endif
 
diff --git a/src/porting.cpp b/src/porting.cpp
index 98b85b7..023f0cc 100644
--- a/src/porting.cpp
+++ b/src/porting.cpp
@@ -75,11 +75,16 @@ bool * signal_handler_killstatus(void)
 #if !defined(_WIN32) // POSIX
 	#include <signal.h>
 
-void sigint_handler(int sig)
+void signal_handler(int sig)
 {
 	if (!g_killed) {
-		dstream << "INFO: sigint_handler(): "
-			<< "Ctrl-C pressed, shutting down." << std::endl;
+		if (sig == SIGINT) {
+			dstream << "INFO: signal_handler(): "
+				<< "Ctrl-C pressed, shutting down." << std::endl;
+		} else if (sig == SIGTERM) {
+			dstream << "INFO: signal_handler(): "
+				<< "got SIGTERM, shutting down." << std::endl;
+		}
 
 		// Comment out for less clutter when testing scripts
 		/*dstream << "INFO: sigint_handler(): "
@@ -88,13 +93,14 @@ void sigint_handler(int sig)
 
 		g_killed = true;
 	} else {
-		(void)signal(SIGINT, SIG_DFL);
+		(void)signal(sig, SIG_DFL);
 	}
 }
 
 void signal_handler_init(void)
 {
-	(void)signal(SIGINT, sigint_handler);
+	(void)signal(SIGINT, signal_handler);
+	(void)signal(SIGTERM, signal_handler);
 }
 
 #else // _WIN32
@@ -252,7 +258,7 @@ bool getCurrentExecPath(char *buf, size_t len)
 
 
 //// Linux
-#elif defined(linux) || defined(__linux) || defined(__linux__)
+#elif defined(__linux__)
 
 bool getCurrentExecPath(char *buf, size_t len)
 {
@@ -368,7 +374,7 @@ bool setSystemPaths()
 
 
 //// Linux
-#elif defined(linux) || defined(__linux)
+#elif defined(__linux__)
 
 bool setSystemPaths()
 {
@@ -605,6 +611,115 @@ void setXorgClassHint(const video::SExposedVideoData &video_data,
 #endif
 }
 
+bool setXorgWindowIcon(IrrlichtDevice *device)
+{
+#ifdef XORG_USED
+#	if RUN_IN_PLACE
+	return setXorgWindowIconFromPath(device,
+			path_share + "/misc/" PROJECT_NAME "-xorg-icon-128.png");
+#	else
+	// We have semi-support for reading in-place data if we are
+	// compiled with RUN_IN_PLACE. Don't break with this and
+	// also try the path_share location.
+	return
+		setXorgWindowIconFromPath(device,
+			ICON_DIR "/hicolor/128x128/apps/" PROJECT_NAME ".png") ||
+		setXorgWindowIconFromPath(device,
+			path_share + "/misc/" PROJECT_NAME "-xorg-icon-128.png");
+#	endif
+#else
+	return false;
+#endif
+}
+
+bool setXorgWindowIconFromPath(IrrlichtDevice *device,
+	const std::string &icon_file)
+{
+#ifdef XORG_USED
+
+	video::IVideoDriver *v_driver = device->getVideoDriver();
+
+	video::IImageLoader *image_loader = NULL;
+	u32 cnt = v_driver->getImageLoaderCount();
+	for (u32 i = 0; i < cnt; i++) {
+		if (v_driver->getImageLoader(i)->isALoadableFileExtension(icon_file.c_str())) {
+			image_loader = v_driver->getImageLoader(i);
+			break;
+		}
+	}
+
+	if (!image_loader) {
+		warningstream << "Could not find image loader for file '"
+			<< icon_file << "'" << std::endl;
+		return false;
+	}
+
+	io::IReadFile *icon_f = device->getFileSystem()->createAndOpenFile(icon_file.c_str());
+
+	if (!icon_f) {
+		warningstream << "Could not load icon file '"
+			<< icon_file << "'" << std::endl;
+		return false;
+	}
+
+	video::IImage *img = image_loader->loadImage(icon_f);
+
+	if (!img) {
+		warningstream << "Could not load icon file '"
+			<< icon_file << "'" << std::endl;
+		icon_f->drop();
+		return false;
+	}
+
+	u32 height = img->getDimension().Height;
+	u32 width = img->getDimension().Width;
+
+	size_t icon_buffer_len = 2 + height * width;
+	long *icon_buffer = new long[icon_buffer_len];
+
+	icon_buffer[0] = width;
+	icon_buffer[1] = height;
+
+	for (u32 x = 0; x < width; x++) {
+		for (u32 y = 0; y < height; y++) {
+			video::SColor col = img->getPixel(x, y);
+			long pixel_val = 0;
+			pixel_val |= (u8)col.getAlpha() << 24;
+			pixel_val |= (u8)col.getRed() << 16;
+			pixel_val |= (u8)col.getGreen() << 8;
+			pixel_val |= (u8)col.getBlue();
+			icon_buffer[2 + x + y * width] = pixel_val;
+		}
+	}
+
+	img->drop();
+	icon_f->drop();
+
+	const video::SExposedVideoData &video_data = v_driver->getExposedVideoData();
+
+	Display *x11_dpl = (Display *)video_data.OpenGLLinux.X11Display;
+
+	if (x11_dpl == NULL) {
+		warningstream << "Could not find x11 display for setting its icon."
+			<< std::endl;
+		delete [] icon_buffer;
+		return false;
+	}
+
+	Window x11_win = (Window)video_data.OpenGLLinux.X11Window;
+
+	Atom net_wm_icon = XInternAtom(x11_dpl, "_NET_WM_ICON", False);
+	Atom cardinal = XInternAtom(x11_dpl, "CARDINAL", False);
+	XChangeProperty(x11_dpl, x11_win,
+		net_wm_icon, cardinal, 32,
+		PropModeReplace, (const unsigned char *)icon_buffer,
+		icon_buffer_len);
+
+	delete [] icon_buffer;
+
+#endif
+	return true;
+}
 
 ////
 //// Video/Display Information (Client-only)
diff --git a/src/porting.h b/src/porting.h
index 4d51c50..f5c7efc 100644
--- a/src/porting.h
+++ b/src/porting.h
@@ -60,7 +60,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 	#include <unistd.h>
 	#include <stdint.h> //for uintptr_t
 
-	#if (defined(linux) || defined(__linux) || defined(__GNU__)) && !defined(_GNU_SOURCE)
+	// Use standard Posix macro for Linux
+	#if (defined(linux) || defined(__linux)) && !defined(__linux__)
+		#define __linux__ 
+	#endif
+	#if (defined(__linux__) || defined(__GNU__)) && !defined(_GNU_SOURCE)
 		#define _GNU_SOURCE
 	#endif
 
@@ -321,7 +325,7 @@ inline const char *getPlatformName()
 	return
 #if defined(ANDROID)
 	"Android"
-#elif defined(linux) || defined(__linux) || defined(__linux__)
+#elif defined(__linux__)
 	"Linux"
 #elif defined(_WIN32) || defined(_WIN64)
 	"Windows"
@@ -363,6 +367,11 @@ inline const char *getPlatformName()
 void setXorgClassHint(const video::SExposedVideoData &video_data,
 	const std::string &name);
 
+bool setXorgWindowIcon(IrrlichtDevice *device);
+
+bool setXorgWindowIconFromPath(IrrlichtDevice *device,
+	const std::string &icon_file);
+
 // This only needs to be called at the start of execution, since all future
 // threads in the process inherit this exception handler
 void setWin32ExceptionHandler();
diff --git a/src/reflowscan.cpp b/src/reflowscan.cpp
new file mode 100644
index 0000000..49b9406
--- /dev/null
+++ b/src/reflowscan.cpp
@@ -0,0 +1,206 @@
+/*
+Minetest
+Copyright (C) 2016 MillersMan <millersman at users.noreply.github.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "reflowscan.h"
+#include "map.h"
+#include "mapblock.h"
+#include "nodedef.h"
+#include "util/timetaker.h"
+
+
+ReflowScan::ReflowScan(Map *map, INodeDefManager *ndef) :
+	m_map(map),
+	m_ndef(ndef),
+	m_liquid_queue(NULL)
+{
+}
+
+void ReflowScan::scan(MapBlock *block, UniqueQueue<v3s16> *liquid_queue)
+{
+	m_block_pos = block->getPos();
+	m_rel_block_pos = block->getPosRelative();
+	m_liquid_queue = liquid_queue;
+
+	// Prepare the lookup which is a 3x3x3 array of the blocks surrounding the
+	// scanned block. Blocks are only added to the lookup if they are really
+	// needed. The lookup is indexed manually to use the same index in a
+	// bit-array (of uint32 type) which stores for unloaded blocks that they
+	// were already fetched from Map but were actually NULL.
+	memset(m_lookup, 0, sizeof(m_lookup));
+	int block_idx = 1 + (1 * 9) + (1 * 3);
+	m_lookup[block_idx] = block;
+	m_lookup_state_bitset = 1 << block_idx;
+
+	// Scan the columns in the block
+	for (s16 z = 0; z < MAP_BLOCKSIZE; z++)
+	for (s16 x = 0; x < MAP_BLOCKSIZE; x++) {
+		scanColumn(x, z);
+	}
+
+	// Scan neighbouring columns from the nearby blocks as they might contain
+	// liquid nodes that weren't allowed to flow to prevent gaps.
+	for (s16 i = 0; i < MAP_BLOCKSIZE; i++) {
+		scanColumn(i, -1);
+		scanColumn(i, MAP_BLOCKSIZE);
+		scanColumn(-1, i);
+		scanColumn(MAP_BLOCKSIZE, i);
+	}
+}
+
+inline MapBlock *ReflowScan::lookupBlock(int x, int y, int z)
+{
+	// Gets the block that contains (x,y,z) relativ to the scanned block.
+	// This uses a lookup as there might be many lookups into the same
+	// neighbouring block which makes fetches from Map costly.
+	int bx = (MAP_BLOCKSIZE + x) / MAP_BLOCKSIZE;
+	int by = (MAP_BLOCKSIZE + y) / MAP_BLOCKSIZE;
+	int bz = (MAP_BLOCKSIZE + z) / MAP_BLOCKSIZE;
+	int idx = (bx + (by * 9) + (bz * 3));
+	MapBlock *result = m_lookup[idx];
+	if (!result && (m_lookup_state_bitset & (1 << idx)) == 0) {
+		// The block wasn't requested yet so fetch it from Map and store it
+		// in the lookup
+		v3s16 pos = m_block_pos + v3s16(bx - 1, by - 1, bz - 1);
+		m_lookup[idx] = result = m_map->getBlockNoCreateNoEx(pos);
+		m_lookup_state_bitset |= (1 << idx);
+	}
+	return result;
+}
+
+inline bool ReflowScan::isLiquidFlowableTo(int x, int y, int z)
+{
+	// Tests whether (x,y,z) is a node to which liquid might flow.
+	bool valid_position;
+	MapBlock *block = lookupBlock(x, y, z);
+	if (block) {
+		int dx = (MAP_BLOCKSIZE + x) % MAP_BLOCKSIZE;
+		int dy = (MAP_BLOCKSIZE + y) % MAP_BLOCKSIZE;
+		int dz = (MAP_BLOCKSIZE + z) % MAP_BLOCKSIZE;
+		MapNode node = block->getNodeNoCheck(dx, dy, dz, &valid_position);
+		if (node.getContent() != CONTENT_IGNORE) {
+			const ContentFeatures &f = m_ndef->get(node);
+			// NOTE: No need to check for flowing nodes with lower liquid level
+			// as they should only occur on top of other columns where they
+			// will be added to the queue themselves.
+			return f.floodable;
+		}
+	}
+	return false;
+}
+
+inline bool ReflowScan::isLiquidHorizontallyFlowable(int x, int y, int z)
+{
+	// Check if the (x,y,z) might spread to one of the horizontally
+	// neighbouring nodes
+	return isLiquidFlowableTo(x - 1, y, z) ||
+		isLiquidFlowableTo(x + 1, y, z) ||
+		isLiquidFlowableTo(x, y, z - 1) ||
+		isLiquidFlowableTo(x, y, z + 1);
+}
+
+void ReflowScan::scanColumn(int x, int z)
+{
+	bool valid_position;
+
+	// Is the column inside a loaded block?
+	MapBlock *block = lookupBlock(x, 0, z);
+	if (!block)
+		return;
+
+	MapBlock *above = lookupBlock(x, MAP_BLOCKSIZE, z);
+	int dx = (MAP_BLOCKSIZE + x) % MAP_BLOCKSIZE;
+	int dz = (MAP_BLOCKSIZE + z) % MAP_BLOCKSIZE;
+
+	// Get the state from the node above the scanned block
+	bool was_ignore, was_liquid;
+	if (above) {
+		MapNode node = above->getNodeNoCheck(dx, 0, dz, &valid_position);
+		was_ignore = node.getContent() == CONTENT_IGNORE;
+		was_liquid = m_ndef->get(node).isLiquid();
+	} else {
+		was_ignore = true;
+		was_liquid = false;
+	}
+	bool was_checked = false;
+	bool was_pushed = false;
+
+	// Scan through the whole block
+	for (s16 y = MAP_BLOCKSIZE - 1; y >= 0; y--) {
+		MapNode node = block->getNodeNoCheck(dx, y, dz, &valid_position);
+		const ContentFeatures &f = m_ndef->get(node);
+		bool is_ignore = node.getContent() == CONTENT_IGNORE;
+		bool is_liquid = f.isLiquid();
+
+		if (is_ignore || was_ignore || is_liquid == was_liquid) {
+			// Neither topmost node of liquid column nor topmost node below column
+			was_checked = false;
+			was_pushed = false;
+		} else if (is_liquid) {
+			// This is the topmost node in the column
+			bool is_pushed = false;
+			if (f.liquid_type == LIQUID_FLOWING ||
+					isLiquidHorizontallyFlowable(x, y, z)) {
+				m_liquid_queue->push_back(m_rel_block_pos + v3s16(x, y, z));
+				is_pushed = true;
+			}
+			// Remember waschecked and waspushed to avoid repeated
+			// checks/pushes in case the column consists of only this node
+			was_checked = true;
+			was_pushed = is_pushed;
+		} else {
+			// This is the topmost node below a liquid column
+			if (!was_pushed && (f.floodable ||
+					(!was_checked && isLiquidHorizontallyFlowable(x, y + 1, z)))) {
+				// Activate the lowest node in the column which is one
+				// node above this one
+				m_liquid_queue->push_back(m_rel_block_pos + v3s16(x, y + 1, z));
+			}
+		}
+
+		was_liquid = is_liquid;
+		was_ignore = is_ignore;
+	}
+
+	// Check the node below the current block
+	MapBlock *below = lookupBlock(x, -1, z);
+	if (below) {
+		MapNode node = below->getNodeNoCheck(dx, MAP_BLOCKSIZE - 1, dz, &valid_position);
+		const ContentFeatures &f = m_ndef->get(node);
+		bool is_ignore = node.getContent() == CONTENT_IGNORE;
+		bool is_liquid = f.isLiquid();
+
+		if (is_ignore || was_ignore || is_liquid == was_liquid) {
+			// Neither topmost node of liquid column nor topmost node below column
+		} else if (is_liquid) {
+			// This is the topmost node in the column and might want to flow away
+			if (f.liquid_type == LIQUID_FLOWING ||
+					isLiquidHorizontallyFlowable(x, -1, z)) {
+				m_liquid_queue->push_back(m_rel_block_pos + v3s16(x, -1, z));
+			}
+		} else {
+			// This is the topmost node below a liquid column
+			if (!was_pushed && (f.floodable ||
+					(!was_checked && isLiquidHorizontallyFlowable(x, 0, z)))) {
+				// Activate the lowest node in the column which is one
+				// node above this one
+				m_liquid_queue->push_back(m_rel_block_pos + v3s16(x, 0, z));
+			}
+		}
+	}
+}
diff --git a/src/database-leveldb.h b/src/reflowscan.h
similarity index 50%
copy from src/database-leveldb.h
copy to src/reflowscan.h
index 4afe2fd..a6d289a 100644
--- a/src/database-leveldb.h
+++ b/src/reflowscan.h
@@ -1,6 +1,6 @@
 /*
 Minetest
-Copyright (C) 2013 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Copyright (C) 2016 MillersMan <millersman at users.noreply.github.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -17,33 +17,34 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef DATABASE_LEVELDB_HEADER
-#define DATABASE_LEVELDB_HEADER
+#ifndef REFLOWSCAN_H
+#define REFLOWSCAN_H
 
-#include "config.h"
+#include "util/container.h"
+#include "irrlichttypes_bloated.h"
 
-#if USE_LEVELDB
+class INodeDefManager;
+class Map;
+class MapBlock;
 
-#include "database.h"
-#include "leveldb/db.h"
-#include <string>
-
-class Database_LevelDB : public Database
-{
+class ReflowScan {
 public:
-	Database_LevelDB(const std::string &savedir);
-	~Database_LevelDB();
+	ReflowScan(Map *map, INodeDefManager *ndef);
+	void scan(MapBlock *block, UniqueQueue<v3s16> *liquid_queue);
 
-	virtual bool saveBlock(const v3s16 &pos, const std::string &data);
-	virtual std::string loadBlock(const v3s16 &pos);
-	virtual bool deleteBlock(const v3s16 &pos);
-	virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);
+private:
+	MapBlock *lookupBlock(int x, int y, int z);
+	bool isLiquidFlowableTo(int x, int y, int z);
+	bool isLiquidHorizontallyFlowable(int x, int y, int z);
+	void scanColumn(int x, int z);
 
 private:
-	leveldb::DB *m_database;
+	Map *m_map;
+	INodeDefManager *m_ndef;
+	v3s16 m_block_pos, m_rel_block_pos;
+	UniqueQueue<v3s16> *m_liquid_queue;
+	MapBlock *m_lookup[3 * 3 * 3];
+	u32 m_lookup_state_bitset;
 };
 
-#endif // USE_LEVELDB
-
-#endif
-
+#endif // REFLOWSCAN_H
diff --git a/src/remoteplayer.cpp b/src/remoteplayer.cpp
new file mode 100644
index 0000000..67ab891
--- /dev/null
+++ b/src/remoteplayer.cpp
@@ -0,0 +1,232 @@
+/*
+Minetest
+Copyright (C) 2010-2016 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Copyright (C) 2014-2016 nerzhul, Loic Blot <loic.blot at unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "remoteplayer.h"
+#include "content_sao.h"
+#include "filesys.h"
+#include "gamedef.h"
+#include "porting.h"  // strlcpy
+#include "settings.h"
+
+
+/*
+	RemotePlayer
+*/
+// static config cache for remoteplayer
+bool RemotePlayer::m_setting_cache_loaded = false;
+float RemotePlayer::m_setting_chat_message_limit_per_10sec = 0.0f;
+u16 RemotePlayer::m_setting_chat_message_limit_trigger_kick = 0;
+
+RemotePlayer::RemotePlayer(const char *name, IItemDefManager *idef):
+	Player(name, idef),
+	protocol_version(0),
+	m_sao(NULL),
+	m_dirty(false),
+	m_last_chat_message_sent(time(NULL)),
+	m_chat_message_allowance(5.0f),
+	m_message_rate_overhead(0),
+	hud_hotbar_image(""),
+	hud_hotbar_selected_image("")
+{
+	if (!RemotePlayer::m_setting_cache_loaded) {
+		RemotePlayer::m_setting_chat_message_limit_per_10sec =
+			g_settings->getFloat("chat_message_limit_per_10sec");
+		RemotePlayer::m_setting_chat_message_limit_trigger_kick =
+			g_settings->getU16("chat_message_limit_trigger_kick");
+		RemotePlayer::m_setting_cache_loaded = true;
+	}
+	movement_acceleration_default   = g_settings->getFloat("movement_acceleration_default")   * BS;
+	movement_acceleration_air       = g_settings->getFloat("movement_acceleration_air")       * BS;
+	movement_acceleration_fast      = g_settings->getFloat("movement_acceleration_fast")      * BS;
+	movement_speed_walk             = g_settings->getFloat("movement_speed_walk")             * BS;
+	movement_speed_crouch           = g_settings->getFloat("movement_speed_crouch")           * BS;
+	movement_speed_fast             = g_settings->getFloat("movement_speed_fast")             * BS;
+	movement_speed_climb            = g_settings->getFloat("movement_speed_climb")            * BS;
+	movement_speed_jump             = g_settings->getFloat("movement_speed_jump")             * BS;
+	movement_liquid_fluidity        = g_settings->getFloat("movement_liquid_fluidity")        * BS;
+	movement_liquid_fluidity_smooth = g_settings->getFloat("movement_liquid_fluidity_smooth") * BS;
+	movement_liquid_sink            = g_settings->getFloat("movement_liquid_sink")            * BS;
+	movement_gravity                = g_settings->getFloat("movement_gravity")                * BS;
+}
+
+void RemotePlayer::save(std::string savedir, IGameDef *gamedef)
+{
+	/*
+	 * We have to open all possible player files in the players directory
+	 * and check their player names because some file systems are not
+	 * case-sensitive and player names are case-sensitive.
+	 */
+
+	// A player to deserialize files into to check their names
+	RemotePlayer testplayer("", gamedef->idef());
+
+	savedir += DIR_DELIM;
+	std::string path = savedir + m_name;
+	for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) {
+		if (!fs::PathExists(path)) {
+			// Open file and serialize
+			std::ostringstream ss(std::ios_base::binary);
+			serialize(ss);
+			if (!fs::safeWriteToFile(path, ss.str())) {
+				infostream << "Failed to write " << path << std::endl;
+			}
+			setModified(false);
+			return;
+		}
+		// Open file and deserialize
+		std::ifstream is(path.c_str(), std::ios_base::binary);
+		if (!is.good()) {
+			infostream << "Failed to open " << path << std::endl;
+			return;
+		}
+		testplayer.deSerialize(is, path, NULL);
+		is.close();
+		if (strcmp(testplayer.getName(), m_name) == 0) {
+			// Open file and serialize
+			std::ostringstream ss(std::ios_base::binary);
+			serialize(ss);
+			if (!fs::safeWriteToFile(path, ss.str())) {
+				infostream << "Failed to write " << path << std::endl;
+			}
+			setModified(false);
+			return;
+		}
+		path = savedir + m_name + itos(i);
+	}
+
+	infostream << "Didn't find free file for player " << m_name << std::endl;
+	return;
+}
+
+void RemotePlayer::deSerialize(std::istream &is, const std::string &playername,
+		PlayerSAO *sao)
+{
+	Settings args;
+
+	if (!args.parseConfigLines(is, "PlayerArgsEnd")) {
+		throw SerializationError("PlayerArgsEnd of player " + playername + " not found!");
+	}
+
+	m_dirty = true;
+	//args.getS32("version"); // Version field value not used
+	std::string name = args.get("name");
+	strlcpy(m_name, name.c_str(), PLAYERNAME_SIZE);
+
+	if (sao) {
+		try {
+			sao->setHPRaw(args.getS32("hp"));
+		} catch(SettingNotFoundException &e) {
+			sao->setHPRaw(PLAYER_MAX_HP);
+		}
+
+		try {
+			sao->setBasePosition(args.getV3F("position"));
+		} catch (SettingNotFoundException &e) {}
+
+		try {
+			sao->setPitch(args.getFloat("pitch"));
+		} catch (SettingNotFoundException &e) {}
+		try {
+			sao->setYaw(args.getFloat("yaw"));
+		} catch (SettingNotFoundException &e) {}
+
+		try {
+			sao->setBreath(args.getS32("breath"));
+		} catch (SettingNotFoundException &e) {}
+	}
+
+	inventory.deSerialize(is);
+
+	if (inventory.getList("craftpreview") == NULL) {
+		// Convert players without craftpreview
+		inventory.addList("craftpreview", 1);
+
+		bool craftresult_is_preview = true;
+		if(args.exists("craftresult_is_preview"))
+			craftresult_is_preview = args.getBool("craftresult_is_preview");
+		if(craftresult_is_preview)
+		{
+			// Clear craftresult
+			inventory.getList("craftresult")->changeItem(0, ItemStack());
+		}
+	}
+}
+
+void RemotePlayer::serialize(std::ostream &os)
+{
+	// Utilize a Settings object for storing values
+	Settings args;
+	args.setS32("version", 1);
+	args.set("name", m_name);
+	//args.set("password", m_password);
+
+	// This should not happen
+	assert(m_sao);
+	args.setS32("hp", m_sao->getHP());
+	args.setV3F("position", m_sao->getBasePosition());
+	args.setFloat("pitch", m_sao->getPitch());
+	args.setFloat("yaw", m_sao->getYaw());
+	args.setS32("breath", m_sao->getBreath());
+
+	args.writeLines(os);
+
+	os<<"PlayerArgsEnd\n";
+
+	inventory.serialize(os);
+}
+
+const RemotePlayerChatResult RemotePlayer::canSendChatMessage()
+{
+	// Rate limit messages
+	u32 now = time(NULL);
+	float time_passed = now - m_last_chat_message_sent;
+	m_last_chat_message_sent = now;
+
+	// If this feature is disabled
+	if (m_setting_chat_message_limit_per_10sec <= 0.0) {
+		return RPLAYER_CHATRESULT_OK;
+	}
+
+	m_chat_message_allowance += time_passed * (m_setting_chat_message_limit_per_10sec / 8.0f);
+	if (m_chat_message_allowance > m_setting_chat_message_limit_per_10sec) {
+		m_chat_message_allowance = m_setting_chat_message_limit_per_10sec;
+	}
+
+	if (m_chat_message_allowance < 1.0f) {
+		infostream << "Player " << m_name
+				<< " chat limited due to excessive message amount." << std::endl;
+
+		// Kick player if flooding is too intensive
+		m_message_rate_overhead++;
+		if (m_message_rate_overhead > RemotePlayer::m_setting_chat_message_limit_trigger_kick) {
+			return RPLAYER_CHATRESULT_KICK;
+		}
+
+		return RPLAYER_CHATRESULT_FLOODING;
+	}
+
+	// Reinit message overhead
+	if (m_message_rate_overhead > 0) {
+		m_message_rate_overhead = 0;
+	}
+
+	m_chat_message_allowance -= 1.0f;
+	return RPLAYER_CHATRESULT_OK;
+}
diff --git a/src/remoteplayer.h b/src/remoteplayer.h
new file mode 100644
index 0000000..61b5a23
--- /dev/null
+++ b/src/remoteplayer.h
@@ -0,0 +1,160 @@
+/*
+Minetest
+Copyright (C) 2010-2016 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Copyright (C) 2014-2016 nerzhul, Loic Blot <loic.blot at unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef REMOTEPLAYER_HEADER
+#define REMOTEPLAYER_HEADER
+
+#include "player.h"
+
+class PlayerSAO;
+
+enum RemotePlayerChatResult {
+	RPLAYER_CHATRESULT_OK,
+	RPLAYER_CHATRESULT_FLOODING,
+	RPLAYER_CHATRESULT_KICK,
+};
+/*
+	Player on the server
+*/
+class RemotePlayer : public Player
+{
+public:
+	RemotePlayer(const char *name, IItemDefManager *idef);
+	virtual ~RemotePlayer() {}
+
+	void save(std::string savedir, IGameDef *gamedef);
+	void deSerialize(std::istream &is, const std::string &playername, PlayerSAO *sao);
+
+	PlayerSAO *getPlayerSAO() { return m_sao; }
+	void setPlayerSAO(PlayerSAO *sao) { m_sao = sao; }
+
+	const RemotePlayerChatResult canSendChatMessage();
+
+	void setHotbarItemcount(s32 hotbar_itemcount)
+	{
+		hud_hotbar_itemcount = hotbar_itemcount;
+	}
+
+	s32 getHotbarItemcount() const { return hud_hotbar_itemcount; }
+
+	void overrideDayNightRatio(bool do_override, float ratio)
+	{
+		m_day_night_ratio_do_override = do_override;
+		m_day_night_ratio = ratio;
+	}
+
+	void getDayNightRatio(bool *do_override, float *ratio)
+	{
+		*do_override = m_day_night_ratio_do_override;
+		*ratio = m_day_night_ratio;
+	}
+
+	void setHotbarImage(const std::string &name)
+	{
+		hud_hotbar_image = name;
+	}
+
+	std::string getHotbarImage() const
+	{
+		return hud_hotbar_image;
+	}
+
+	void setHotbarSelectedImage(const std::string &name)
+	{
+		hud_hotbar_selected_image = name;
+	}
+
+	const std::string &getHotbarSelectedImage() const
+	{
+		return hud_hotbar_selected_image;
+	}
+
+	void setSky(const video::SColor &bgcolor, const std::string &type,
+				const std::vector<std::string> &params)
+	{
+		m_sky_bgcolor = bgcolor;
+		m_sky_type = type;
+		m_sky_params = params;
+	}
+
+	void getSky(video::SColor *bgcolor, std::string *type,
+				std::vector<std::string> *params)
+	{
+		*bgcolor = m_sky_bgcolor;
+		*type = m_sky_type;
+		*params = m_sky_params;
+	}
+
+	bool checkModified() const { return m_dirty || inventory.checkModified(); }
+
+	void setModified(const bool x)
+	{
+		m_dirty = x;
+		if (!x)
+			inventory.setModified(x);
+	}
+
+	void setLocalAnimations(v2s32 frames[4], float frame_speed)
+	{
+		for (int i = 0; i < 4; i++)
+			local_animations[i] = frames[i];
+		local_animation_speed = frame_speed;
+	}
+
+	void getLocalAnimations(v2s32 *frames, float *frame_speed)
+	{
+		for (int i = 0; i < 4; i++)
+			frames[i] = local_animations[i];
+		*frame_speed = local_animation_speed;
+	}
+
+	void setDirty(bool dirty) { m_dirty = true; }
+
+	u16 protocol_version;
+private:
+	/*
+		serialize() writes a bunch of text that can contain
+		any characters except a '\0', and such an ending that
+		deSerialize stops reading exactly at the right point.
+	*/
+	void serialize(std::ostream &os);
+
+	PlayerSAO *m_sao;
+	bool m_dirty;
+
+	static bool m_setting_cache_loaded;
+	static float m_setting_chat_message_limit_per_10sec;
+	static u16 m_setting_chat_message_limit_trigger_kick;
+
+	u32 m_last_chat_message_sent;
+	float m_chat_message_allowance;
+	u16 m_message_rate_overhead;
+
+	bool m_day_night_ratio_do_override;
+	float m_day_night_ratio;
+	std::string hud_hotbar_image;
+	std::string hud_hotbar_selected_image;
+
+	std::string m_sky_type;
+	video::SColor m_sky_bgcolor;
+	std::vector<std::string> m_sky_params;
+};
+
+#endif
diff --git a/src/rollback.cpp b/src/rollback.cpp
index 2367c3a..4d34dec 100644
--- a/src/rollback.cpp
+++ b/src/rollback.cpp
@@ -42,6 +42,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 	}
 #define SQLOK(f) SQLRES(f, SQLITE_OK)
 
+#define SQLOK_ERRSTREAM(s, m)                             \
+	if ((s) != SQLITE_OK) {                               \
+		errorstream << "RollbackManager: " << (m) << ": " \
+			<< sqlite3_errmsg(db) << std::endl;           \
+	}
+
+#define FINALIZE_STATEMENT(statement) \
+	SQLOK_ERRSTREAM(sqlite3_finalize(statement), "Failed to finalize " #statement)
 
 class ItemStackRow : public ItemStack {
 public:
@@ -93,10 +101,10 @@ RollbackManager::RollbackManager(const std::string & world_path,
 	std::string migrating_flag = txt_filename + ".migrating";
 	database_path = world_path + DIR_DELIM "rollback.sqlite";
 
-	initDatabase();
+	bool created = initDatabase();
 
-	if (fs::PathExists(txt_filename) && (fs::PathExists(migrating_flag) ||
-			!fs::PathExists(database_path))) {
+	if (fs::PathExists(txt_filename) && (created ||
+			fs::PathExists(migrating_flag))) {
 		std::ofstream of(migrating_flag.c_str());
 		of.close();
 		migrate(txt_filename);
@@ -109,17 +117,17 @@ RollbackManager::~RollbackManager()
 {
 	flush();
 
-	SQLOK(sqlite3_finalize(stmt_insert));
-	SQLOK(sqlite3_finalize(stmt_replace));
-	SQLOK(sqlite3_finalize(stmt_select));
-	SQLOK(sqlite3_finalize(stmt_select_range));
-	SQLOK(sqlite3_finalize(stmt_select_withActor));
-	SQLOK(sqlite3_finalize(stmt_knownActor_select));
-	SQLOK(sqlite3_finalize(stmt_knownActor_insert));
-	SQLOK(sqlite3_finalize(stmt_knownNode_select));
-	SQLOK(sqlite3_finalize(stmt_knownNode_insert));
-
-	SQLOK(sqlite3_close(db));
+	FINALIZE_STATEMENT(stmt_insert);
+	FINALIZE_STATEMENT(stmt_replace);
+	FINALIZE_STATEMENT(stmt_select);
+	FINALIZE_STATEMENT(stmt_select_range);
+	FINALIZE_STATEMENT(stmt_select_withActor);
+	FINALIZE_STATEMENT(stmt_knownActor_select);
+	FINALIZE_STATEMENT(stmt_knownActor_insert);
+	FINALIZE_STATEMENT(stmt_knownNode_select);
+	FINALIZE_STATEMENT(stmt_knownNode_insert);
+
+	SQLOK_ERRSTREAM(sqlite3_close(db), "Could not close db");
 }
 
 
@@ -250,15 +258,15 @@ bool RollbackManager::createTables()
 }
 
 
-void RollbackManager::initDatabase()
+bool RollbackManager::initDatabase()
 {
 	verbosestream << "RollbackManager: Database connection setup" << std::endl;
 
-	bool needsCreate = !fs::PathExists(database_path);
+	bool needs_create = !fs::PathExists(database_path);
 	SQLOK(sqlite3_open_v2(database_path.c_str(), &db,
 			SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL));
 
-	if (needsCreate) {
+	if (needs_create) {
 		createTables();
 	}
 
@@ -374,6 +382,8 @@ void RollbackManager::initDatabase()
 		);
 	}
 	SQLOK(sqlite3_reset(stmt_knownNode_select));
+
+	return needs_create;
 }
 
 
@@ -672,23 +682,27 @@ void RollbackManager::migrate(const std::string & file_path)
 
 	std::streampos file_size = fh.tellg();
 
-	if (file_size > 10) {
+	if (file_size < 10) {
 		errorstream << "Empty rollback log." << std::endl;
 		return;
 	}
 
 	fh.seekg(0);
 
+	sqlite3_stmt *stmt_begin;
+	sqlite3_stmt *stmt_commit;
+	SQLOK(sqlite3_prepare_v2(db, "BEGIN", -1, &stmt_begin, NULL));
+	SQLOK(sqlite3_prepare_v2(db, "COMMIT", -1, &stmt_commit, NULL));
+
 	std::string bit;
 	int i = 0;
-	int id = 1;
 	time_t start = time(0);
 	time_t t = start;
-	sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
+	SQLRES(sqlite3_step(stmt_begin), SQLITE_DONE);
+	sqlite3_reset(stmt_begin);
 	do {
 		ActionRow row;
-
-		row.id = id;
+		row.id = 0;
 
 		// Get the timestamp
 		std::getline(fh, bit, ' ');
@@ -758,17 +772,24 @@ void RollbackManager::migrate(const std::string & file_path)
 		++i;
 
 		if (time(0) - t >= 1) {
-			sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
+			SQLRES(sqlite3_step(stmt_commit), SQLITE_DONE);
+			sqlite3_reset(stmt_commit);
 			t = time(0);
 			std::cout
 				<< " Done: " << static_cast<int>((static_cast<float>(fh.tellg()) / static_cast<float>(file_size)) * 100) << "%"
 				<< " Speed: " << i / (t - start) << "/second     \r" << std::flush;
-			sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
+			SQLRES(sqlite3_step(stmt_begin), SQLITE_DONE);
+			sqlite3_reset(stmt_begin);
 		}
 	} while (fh.good());
+	SQLRES(sqlite3_step(stmt_commit), SQLITE_DONE);
+	sqlite3_reset(stmt_commit);
+
+	SQLOK(sqlite3_finalize(stmt_begin));
+	SQLOK(sqlite3_finalize(stmt_commit));
 
 	std::cout
-		<< " Done: 100%                                   " << std::endl
+		<< " Done: 100%                                  " << std::endl
 		<< "Now you can delete the old rollback.txt file." << std::endl;
 }
 
diff --git a/src/rollback.h b/src/rollback.h
index c57e38a..a05ef8b 100644
--- a/src/rollback.h
+++ b/src/rollback.h
@@ -61,7 +61,7 @@ private:
 	const char * getActorName(const int id);
 	const char * getNodeName(const int id);
 	bool createTables();
-	void initDatabase();
+	bool initDatabase();
 	bool registerRow(const ActionRow & row);
 	const std::list<ActionRow> actionRowsFromSelect(sqlite3_stmt * stmt);
 	ActionRow actionRowFromRollbackAction(const RollbackAction & action);
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp
index 06e20c2..5417448 100644
--- a/src/script/common/c_content.cpp
+++ b/src/script/common/c_content.cpp
@@ -33,7 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "porting.h"
 #include "mg_schematic.h"
 #include "noise.h"
-#include "json/json.h"
+#include <json/json.h>
 
 struct EnumString es_TileAnimationType[] =
 {
@@ -65,9 +65,8 @@ ItemDefinition read_item_definition(lua_State* L,int index,
 	}
 	lua_pop(L, 1);
 
-	def.stack_max = getintfield_default(L, index, "stack_max", def.stack_max);
-	if(def.stack_max == 0)
-		def.stack_max = 1;
+	int stack_max = getintfield_default(L, index, "stack_max", def.stack_max);
+	def.stack_max = rangelim(stack_max, 1, U16_MAX);
 
 	lua_getfield(L, index, "on_use");
 	def.usable = lua_isfunction(L, -1);
@@ -527,6 +526,12 @@ ContentFeatures read_content_features(lua_State *L, int index)
 	// Amount of light the node emits
 	f.light_source = getintfield_default(L, index,
 			"light_source", f.light_source);
+	if (f.light_source > LIGHT_MAX) {
+		warningstream << "Node " << f.name.c_str()
+			<< " had greater light_source than " << LIGHT_MAX
+			<< ", it was reduced." << std::endl;
+		f.light_source = LIGHT_MAX;
+	}
 	f.damage_per_second = getintfield_default(L, index,
 			"damage_per_second", f.damage_per_second);
 
@@ -830,20 +835,18 @@ void push_tool_capabilities(lua_State *L,
 		// Create groupcaps table
 		lua_newtable(L);
 		// For each groupcap
-		for(std::map<std::string, ToolGroupCap>::const_iterator
-				i = toolcap.groupcaps.begin(); i != toolcap.groupcaps.end(); i++){
+		for (ToolGCMap::const_iterator i = toolcap.groupcaps.begin();
+			i != toolcap.groupcaps.end(); i++) {
 			// Create groupcap table
 			lua_newtable(L);
 			const std::string &name = i->first;
 			const ToolGroupCap &groupcap = i->second;
 			// Create subtable "times"
 			lua_newtable(L);
-			for(std::map<int, float>::const_iterator
-					i = groupcap.times.begin(); i != groupcap.times.end(); i++){
-				int rating = i->first;
-				float time = i->second;
-				lua_pushinteger(L, rating);
-				lua_pushnumber(L, time);
+			for (UNORDERED_MAP<int, float>::const_iterator
+					i = groupcap.times.begin(); i != groupcap.times.end(); i++) {
+				lua_pushinteger(L, i->first);
+				lua_pushnumber(L, i->second);
 				lua_settable(L, -3);
 			}
 			// Set subtable "times"
@@ -859,8 +862,8 @@ void push_tool_capabilities(lua_State *L,
 		//Create damage_groups table
 		lua_newtable(L);
 		// For each damage group
-		for(std::map<std::string, s16>::const_iterator
-				i = toolcap.damageGroups.begin(); i != toolcap.damageGroups.end(); i++){
+		for (DamageGroup::const_iterator i = toolcap.damageGroups.begin();
+			i != toolcap.damageGroups.end(); i++) {
 			// Create damage group table
 			lua_pushinteger(L, i->second);
 			lua_setfield(L, -2, i->first.c_str());
@@ -1066,8 +1069,7 @@ void push_flags_string(lua_State *L, FlagDesc *flagdesc, u32 flags, u32 flagmask
 /******************************************************************************/
 
 /******************************************************************************/
-void read_groups(lua_State *L, int index,
-		std::map<std::string, int> &result)
+void read_groups(lua_State *L, int index, ItemGroupList &result)
 {
 	if (!lua_istable(L,index))
 		return;
@@ -1086,11 +1088,10 @@ void read_groups(lua_State *L, int index,
 }
 
 /******************************************************************************/
-void push_groups(lua_State *L, const std::map<std::string, int> &groups)
+void push_groups(lua_State *L, const ItemGroupList &groups)
 {
 	lua_newtable(L);
-	std::map<std::string, int>::const_iterator it;
-	for (it = groups.begin(); it != groups.end(); ++it) {
+	for (ItemGroupList::const_iterator it = groups.begin(); it != groups.end(); ++it) {
 		lua_pushnumber(L, it->second);
 		lua_setfield(L, -2, it->first.c_str());
 	}
@@ -1250,8 +1251,13 @@ static bool push_json_value_helper(lua_State *L, const Json::Value &value,
 			lua_newtable(L);
 			for (Json::Value::const_iterator it = value.begin();
 					it != value.end(); ++it) {
+#ifndef JSONCPP_STRING
 				const char *str = it.memberName();
 				lua_pushstring(L, str ? str : "");
+#else
+				std::string str = it.name();
+				lua_pushstring(L, str.c_str());
+#endif
 				push_json_value_helper(L, *it, nullindex);
 				lua_rawset(L, -3);
 			}
diff --git a/src/script/common/c_content.h b/src/script/common/c_content.h
index 46416ad..2a2228b 100644
--- a/src/script/common/c_content.h
+++ b/src/script/common/c_content.h
@@ -33,11 +33,11 @@ extern "C" {
 }
 
 #include <iostream>
-#include <map>
 #include <vector>
 
 #include "irrlichttypes_bloated.h"
 #include "util/string.h"
+#include "itemgroup.h"
 
 namespace Json { class Value; }
 
@@ -106,10 +106,10 @@ void               pushnode                  (lua_State *L, const MapNode &n,
 NodeBox            read_nodebox              (lua_State *L, int index);
 
 void               read_groups               (lua_State *L, int index,
-                                              std::map<std::string, int> &result);
+                                              ItemGroupList &result);
 
 void               push_groups               (lua_State *L,
-                                              const std::map<std::string, int> &groups);
+                                              const ItemGroupList &groups);
 
 //TODO rename to "read_enum_field"
 int                getenumfield              (lua_State *L, int table,
diff --git a/src/script/common/c_converter.cpp b/src/script/common/c_converter.cpp
index 55c4a5f..f362989 100644
--- a/src/script/common/c_converter.cpp
+++ b/src/script/common/c_converter.cpp
@@ -23,6 +23,7 @@ extern "C" {
 }
 
 #include "util/numeric.h"
+#include "util/serialize.h"
 #include "util/string.h"
 #include "common/c_converter.h"
 #include "constants.h"
@@ -37,6 +38,14 @@ extern "C" {
 		} \
 	} while(0)
 #define CHECK_POS_COORD(name) CHECK_TYPE(-1, "position coordinate '" name "'", LUA_TNUMBER)
+#define CHECK_FLOAT_RANGE(value, name) \
+if (value < F1000_MIN || value > F1000_MAX) { \
+	std::ostringstream error_text; \
+	error_text << "Invalid float vector dimension range '" name "' " << \
+	"(expected " << F1000_MIN << " < " name " < " << F1000_MAX << \
+	" got " << value << ")." << std::endl; \
+	throw LuaError(error_text.str()); \
+}
 #define CHECK_POS_TAB(index) CHECK_TYPE(index, "position", LUA_TTABLE)
 
 
@@ -170,14 +179,17 @@ v3f check_v3f(lua_State *L, int index)
 	lua_getfield(L, index, "x");
 	CHECK_POS_COORD("x");
 	pos.X = lua_tonumber(L, -1);
+	CHECK_FLOAT_RANGE(pos.X, "x")
 	lua_pop(L, 1);
 	lua_getfield(L, index, "y");
 	CHECK_POS_COORD("y");
 	pos.Y = lua_tonumber(L, -1);
+	CHECK_FLOAT_RANGE(pos.Y, "y")
 	lua_pop(L, 1);
 	lua_getfield(L, index, "z");
 	CHECK_POS_COORD("z");
 	pos.Z = lua_tonumber(L, -1);
+	CHECK_FLOAT_RANGE(pos.Z, "z")
 	lua_pop(L, 1);
 	return pos;
 }
@@ -391,7 +403,7 @@ bool getintfield(lua_State *L, int table,
 	lua_getfield(L, table, fieldname);
 	bool got = false;
 	if(lua_isnumber(L, -1)){
-		result = lua_tonumber(L, -1);
+		result = lua_tointeger(L, -1);
 		got = true;
 	}
 	lua_pop(L, 1);
@@ -404,7 +416,7 @@ bool getintfield(lua_State *L, int table,
 	lua_getfield(L, table, fieldname);
 	bool got = false;
 	if(lua_isnumber(L, -1)){
-		result = lua_tonumber(L, -1);
+		result = lua_tointeger(L, -1);
 		got = true;
 	}
 	lua_pop(L, 1);
@@ -417,7 +429,7 @@ bool getintfield(lua_State *L, int table,
 	lua_getfield(L, table, fieldname);
 	bool got = false;
 	if(lua_isnumber(L, -1)){
-		result = lua_tonumber(L, -1);
+		result = lua_tointeger(L, -1);
 		got = true;
 	}
 	lua_pop(L, 1);
@@ -430,7 +442,7 @@ bool getintfield(lua_State *L, int table,
 	lua_getfield(L, table, fieldname);
 	bool got = false;
 	if(lua_isnumber(L, -1)){
-		result = lua_tonumber(L, -1);
+		result = lua_tointeger(L, -1);
 		got = true;
 	}
 	lua_pop(L, 1);
diff --git a/src/script/common/c_converter.h b/src/script/common/c_converter.h
index eefac0e..a5fbee7 100644
--- a/src/script/common/c_converter.h
+++ b/src/script/common/c_converter.h
@@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define C_CONVERTER_H_
 
 #include <vector>
-#include <map>
+#include "util/cpp11_container.h"
 
 #include "irrlichttypes_bloated.h"
 #include "common/c_types.h"
@@ -60,7 +60,7 @@ bool               getintfield(lua_State *L, int table,
 bool               getintfield(lua_State *L, int table,
                              const char *fieldname, u32 &result);
 void               read_groups(lua_State *L, int index,
-                             std::map<std::string, int> &result);
+                             UNORDERED_MAP<std::string, int> &result);
 bool               getboolfield(lua_State *L, int table,
                              const char *fieldname, bool &result);
 bool               getfloatfield(lua_State *L, int table,
diff --git a/src/script/cpp_api/s_async.cpp b/src/script/cpp_api/s_async.cpp
index 9bf3fcf..1fb84fa 100644
--- a/src/script/cpp_api/s_async.cpp
+++ b/src/script/cpp_api/s_async.cpp
@@ -81,6 +81,7 @@ bool AsyncEngine::registerFunction(const char* name, lua_CFunction func)
 	if (initDone) {
 		return false;
 	}
+
 	functionList[name] = func;
 	return true;
 }
@@ -203,7 +204,7 @@ void AsyncEngine::pushFinishedJobs(lua_State* L) {
 /******************************************************************************/
 void AsyncEngine::prepareEnvironment(lua_State* L, int top)
 {
-	for (std::map<std::string, lua_CFunction>::iterator it = functionList.begin();
+	for (UNORDERED_MAP<std::string, lua_CFunction>::iterator it = functionList.begin();
 			it != functionList.end(); it++) {
 		lua_pushstring(L, it->first.c_str());
 		lua_pushcfunction(L, it->second);
diff --git a/src/script/cpp_api/s_async.h b/src/script/cpp_api/s_async.h
index 8d612d5..016381e 100644
--- a/src/script/cpp_api/s_async.h
+++ b/src/script/cpp_api/s_async.h
@@ -132,7 +132,7 @@ private:
 	bool initDone;
 
 	// Internal store for registred functions
-	std::map<std::string, lua_CFunction> functionList;
+	UNORDERED_MAP<std::string, lua_CFunction> functionList;
 
 	// Internal counter to create job IDs
 	unsigned int jobIdCounter;
diff --git a/src/script/cpp_api/s_env.cpp b/src/script/cpp_api/s_env.cpp
index 82d0d4f..913d853 100644
--- a/src/script/cpp_api/s_env.cpp
+++ b/src/script/cpp_api/s_env.cpp
@@ -212,11 +212,13 @@ void ScriptApiEnv::on_emerge_area_completion(
 {
 	Server *server = getServer();
 
+	// This function should be executed with envlock held.
+	// The caller (LuaEmergeAreaCallback in src/script/lua_api/l_env.cpp)
+	// should have obtained the lock.
 	// Note that the order of these locks is important!  Envlock must *ALWAYS*
 	// be acquired before attempting to acquire scriptlock, or else ServerThread
 	// will try to acquire scriptlock after it already owns envlock, thus
 	// deadlocking EmergeThread and ServerThread
-	MutexAutoLock envlock(server->m_env_mutex);
 
 	SCRIPTAPI_PRECHECKHEADER
 
diff --git a/src/script/cpp_api/s_node.cpp b/src/script/cpp_api/s_node.cpp
index 17f0f0d..379ed77 100644
--- a/src/script/cpp_api/s_node.cpp
+++ b/src/script/cpp_api/s_node.cpp
@@ -58,6 +58,7 @@ struct EnumString ScriptApiNode::es_ContentParamType2[] =
 		{CPT2_WALLMOUNTED, "wallmounted"},
 		{CPT2_LEVELED, "leveled"},
 		{CPT2_DEGROTATE, "degrotate"},
+		{CPT2_MESHOPTIONS, "meshoptions"},
 		{0, NULL},
 	};
 
diff --git a/src/script/cpp_api/s_player.cpp b/src/script/cpp_api/s_player.cpp
index 8074306..a8c0747 100644
--- a/src/script/cpp_api/s_player.cpp
+++ b/src/script/cpp_api/s_player.cpp
@@ -135,7 +135,8 @@ void ScriptApiPlayer::on_joinplayer(ServerActiveObject *player)
 	runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
 }
 
-void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player)
+void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player,
+		bool timeout)
 {
 	SCRIPTAPI_PRECHECKHEADER
 
@@ -144,7 +145,8 @@ void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player)
 	lua_getfield(L, -1, "registered_on_leaveplayers");
 	// Call callbacks
 	objectrefGetOrCreate(L, player);
-	runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
+	lua_pushboolean(L, timeout);
+	runCallbacks(2, RUN_CALLBACKS_MODE_FIRST);
 }
 
 void ScriptApiPlayer::on_cheat(ServerActiveObject *player,
diff --git a/src/script/cpp_api/s_player.h b/src/script/cpp_api/s_player.h
index 2e4dc22..86ee1b0 100644
--- a/src/script/cpp_api/s_player.h
+++ b/src/script/cpp_api/s_player.h
@@ -38,7 +38,7 @@ public:
 	bool on_prejoinplayer(const std::string &name, const std::string &ip,
 		std::string *reason);
 	void on_joinplayer(ServerActiveObject *player);
-	void on_leaveplayer(ServerActiveObject *player);
+	void on_leaveplayer(ServerActiveObject *player, bool timeout);
 	void on_cheat(ServerActiveObject *player, const std::string &cheat_type);
 	bool on_punchplayer(ServerActiveObject *player,
 		ServerActiveObject *hitter, float time_from_last_punch,
diff --git a/src/script/cpp_api/s_security.cpp b/src/script/cpp_api/s_security.cpp
index 730235c..1b1f148 100644
--- a/src/script/cpp_api/s_security.cpp
+++ b/src/script/cpp_api/s_security.cpp
@@ -249,8 +249,8 @@ bool ScriptApiSecurity::isSecure(lua_State *L)
 
 #define CHECK_FILE_ERR(ret, fp) \
 	if (ret) { \
-		if (fp) std::fclose(fp); \
 		lua_pushfstring(L, "%s: %s", path, strerror(errno)); \
+		if (fp) std::fclose(fp); \
 		return false; \
 	}
 
@@ -285,39 +285,50 @@ bool ScriptApiSecurity::safeLoadFile(lua_State *L, const char *path)
 
 	if (c == LUA_SIGNATURE[0]) {
 		lua_pushliteral(L, "Bytecode prohibited when mod security is enabled.");
+		std::fclose(fp);
+		if (path) {
+			delete [] chunk_name;
+		}
 		return false;
 	}
 
 	// Read the file
 	int ret = std::fseek(fp, 0, SEEK_END);
 	CHECK_FILE_ERR(ret, fp);
-	if (ret) {
-		std::fclose(fp);
-		lua_pushfstring(L, "%s: %s", path, strerror(errno));
-		return false;
-	}
+
 	size_t size = std::ftell(fp) - start;
 	char *code = new char[size];
 	ret = std::fseek(fp, start, SEEK_SET);
-	CHECK_FILE_ERR(ret, fp);
 	if (ret) {
-		std::fclose(fp);
 		lua_pushfstring(L, "%s: %s", path, strerror(errno));
+		std::fclose(fp);
+		delete [] code;
+		if (path) {
+			delete [] chunk_name;
+		}
 		return false;
 	}
+
 	size_t num_read = std::fread(code, 1, size, fp);
 	if (path) {
 		std::fclose(fp);
 	}
 	if (num_read != size) {
 		lua_pushliteral(L, "Error reading file to load.");
+		delete [] code;
+		if (path) {
+			delete [] chunk_name;
+		}
 		return false;
 	}
 
 	if (luaL_loadbuffer(L, code, size, chunk_name)) {
+		delete [] code;
 		return false;
 	}
 
+	delete [] code;
+
 	if (path) {
 		delete [] chunk_name;
 	}
@@ -325,12 +336,15 @@ bool ScriptApiSecurity::safeLoadFile(lua_State *L, const char *path)
 }
 
 
-bool ScriptApiSecurity::checkPath(lua_State *L, const char *path)
+bool ScriptApiSecurity::checkPath(lua_State *L, const char *path,
+		bool write_required, bool *write_allowed)
 {
+	if (write_allowed)
+		*write_allowed = false;
+
 	std::string str;  // Transient
 
-	std::string norel_path = fs::RemoveRelativePathComponents(path);
-	std::string abs_path = fs::AbsolutePath(norel_path);
+	std::string abs_path = fs::AbsolutePath(path);
 
 	if (!abs_path.empty()) {
 		// Don't allow accessing the settings file
@@ -341,18 +355,29 @@ bool ScriptApiSecurity::checkPath(lua_State *L, const char *path)
 	// If we couldn't find the absolute path (path doesn't exist) then
 	// try removing the last components until it works (to allow
 	// non-existent files/folders for mkdir).
-	std::string cur_path = norel_path;
+	std::string cur_path = path;
 	std::string removed;
 	while (abs_path.empty() && !cur_path.empty()) {
-		std::string tmp_rmed;
-		cur_path = fs::RemoveLastPathComponent(cur_path, &tmp_rmed);
-		removed = tmp_rmed + (removed.empty() ? "" : DIR_DELIM + removed);
+		std::string component;
+		cur_path = fs::RemoveLastPathComponent(cur_path, &component);
+		if (component == "..") {
+			// Parent components can't be allowed or we could allow something like
+			// /home/user/minetest/worlds/foo/noexist/../../../../../../etc/passwd.
+			// If we have previous non-relative elements in the path we might be
+			// able to remove them so that things like worlds/foo/noexist/../auth.txt
+			// could be allowed, but those paths will be interpreted as nonexistent
+			// by the operating system anyways.
+			return false;
+		}
+		removed = component + (removed.empty() ? "" : DIR_DELIM + removed);
 		abs_path = fs::AbsolutePath(cur_path);
 	}
-	if (abs_path.empty()) return false;
+	if (abs_path.empty())
+		return false;
 	// Add the removed parts back so that you can't, eg, create a
 	// directory in worldmods if worldmods doesn't exist.
-	if (!removed.empty()) abs_path += DIR_DELIM + removed;
+	if (!removed.empty())
+		abs_path += DIR_DELIM + removed;
 
 	// Get server from registry
 	lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_SCRIPTAPI);
@@ -369,32 +394,53 @@ bool ScriptApiSecurity::checkPath(lua_State *L, const char *path)
 
 		// Builtin can access anything
 		if (mod_name == BUILTIN_MOD_NAME) {
+			if (write_allowed) *write_allowed = true;
 			return true;
 		}
 
 		// Allow paths in mod path
-		const ModSpec *mod = server->getModSpec(mod_name);
-		if (mod) {
-			str = fs::AbsolutePath(mod->path);
+		// Don't bother if write access isn't important, since it will be handled later
+		if (write_required || write_allowed != NULL) {
+			const ModSpec *mod = server->getModSpec(mod_name);
+			if (mod) {
+				str = fs::AbsolutePath(mod->path);
+				if (!str.empty() && fs::PathStartsWith(abs_path, str)) {
+					if (write_allowed) *write_allowed = true;
+					return true;
+				}
+			}
+		}
+	}
+	lua_pop(L, 1);  // Pop mod name
+
+	// Allow read-only access to all mod directories
+	if (!write_required) {
+		const std::vector<ModSpec> mods = server->getMods();
+		for (size_t i = 0; i < mods.size(); ++i) {
+			str = fs::AbsolutePath(mods[i].path);
 			if (!str.empty() && fs::PathStartsWith(abs_path, str)) {
 				return true;
 			}
 		}
 	}
-	lua_pop(L, 1);  // Pop mod name
 
 	str = fs::AbsolutePath(server->getWorldPath());
-	if (str.empty()) return false;
-	// Don't allow access to world mods.  We add to the absolute path
-	// of the world instead of getting the absolute paths directly
-	// because that won't work if they don't exist.
-	if (fs::PathStartsWith(abs_path, str + DIR_DELIM + "worldmods") ||
-			fs::PathStartsWith(abs_path, str + DIR_DELIM + "game")) {
-		return false;
-	}
-	// Allow all other paths in world path
-	if (fs::PathStartsWith(abs_path, str)) {
-		return true;
+	if (!str.empty()) {
+		// Don't allow access to other paths in the world mod/game path.
+		// These have to be blocked so you can't override a trusted mod
+		// by creating a mod with the same name in a world mod directory.
+		// We add to the absolute path of the world instead of getting
+		// the absolute paths directly because that won't work if they
+		// don't exist.
+		if (fs::PathStartsWith(abs_path, str + DIR_DELIM + "worldmods") ||
+				fs::PathStartsWith(abs_path, str + DIR_DELIM + "game")) {
+			return false;
+		}
+		// Allow all other paths in world path
+		if (fs::PathStartsWith(abs_path, str)) {
+			if (write_allowed) *write_allowed = true;
+			return true;
+		}
 	}
 
 	// Default to disallowing
@@ -465,7 +511,7 @@ int ScriptApiSecurity::sl_g_loadfile(lua_State *L)
 
 	if (lua_isstring(L, 1)) {
 		path = lua_tostring(L, 1);
-		CHECK_SECURE_PATH(L, path);
+		CHECK_SECURE_PATH_INTERNAL(L, path, false, NULL);
 	}
 
 	if (!safeLoadFile(L, path)) {
@@ -514,14 +560,28 @@ int ScriptApiSecurity::sl_g_require(lua_State *L)
 
 int ScriptApiSecurity::sl_io_open(lua_State *L)
 {
+	bool with_mode = lua_gettop(L) > 1;
+
 	luaL_checktype(L, 1, LUA_TSTRING);
 	const char *path = lua_tostring(L, 1);
-	CHECK_SECURE_PATH(L, path);
+
+	bool write_requested = false;
+	if (with_mode) {
+		luaL_checktype(L, 2, LUA_TSTRING);
+		const char *mode = lua_tostring(L, 2);
+		write_requested = strchr(mode, 'w') != NULL ||
+			strchr(mode, '+') != NULL ||
+			strchr(mode, 'a') != NULL;
+	}
+	CHECK_SECURE_PATH_INTERNAL(L, path, write_requested, NULL);
 
 	push_original(L, "io", "open");
 	lua_pushvalue(L, 1);
-	lua_pushvalue(L, 2);
-	lua_call(L, 2, 2);
+	if (with_mode) {
+		lua_pushvalue(L, 2);
+	}
+
+	lua_call(L, with_mode ? 2 : 1, 2);
 	return 2;
 }
 
@@ -530,7 +590,7 @@ int ScriptApiSecurity::sl_io_input(lua_State *L)
 {
 	if (lua_isstring(L, 1)) {
 		const char *path = lua_tostring(L, 1);
-		CHECK_SECURE_PATH(L, path);
+		CHECK_SECURE_PATH_INTERNAL(L, path, false, NULL);
 	}
 
 	push_original(L, "io", "input");
@@ -544,7 +604,7 @@ int ScriptApiSecurity::sl_io_output(lua_State *L)
 {
 	if (lua_isstring(L, 1)) {
 		const char *path = lua_tostring(L, 1);
-		CHECK_SECURE_PATH(L, path);
+		CHECK_SECURE_PATH_INTERNAL(L, path, true, NULL);
 	}
 
 	push_original(L, "io", "output");
@@ -558,16 +618,16 @@ int ScriptApiSecurity::sl_io_lines(lua_State *L)
 {
 	if (lua_isstring(L, 1)) {
 		const char *path = lua_tostring(L, 1);
-		CHECK_SECURE_PATH(L, path);
+		CHECK_SECURE_PATH_INTERNAL(L, path, false, NULL);
 	}
 
+	int top_precall = lua_gettop(L);
 	push_original(L, "io", "lines");
 	lua_pushvalue(L, 1);
-	int top_precall = lua_gettop(L);
 	lua_call(L, 1, LUA_MULTRET);
 	// Return number of arguments returned by the function,
 	// adjusting for the function being poped.
-	return lua_gettop(L) - (top_precall - 1);
+	return lua_gettop(L) - top_precall;
 }
 
 
@@ -575,11 +635,11 @@ int ScriptApiSecurity::sl_os_rename(lua_State *L)
 {
 	luaL_checktype(L, 1, LUA_TSTRING);
 	const char *path1 = lua_tostring(L, 1);
-	CHECK_SECURE_PATH(L, path1);
+	CHECK_SECURE_PATH_INTERNAL(L, path1, true, NULL);
 
 	luaL_checktype(L, 2, LUA_TSTRING);
 	const char *path2 = lua_tostring(L, 2);
-	CHECK_SECURE_PATH(L, path2);
+	CHECK_SECURE_PATH_INTERNAL(L, path2, true, NULL);
 
 	push_original(L, "os", "rename");
 	lua_pushvalue(L, 1);
@@ -593,7 +653,7 @@ int ScriptApiSecurity::sl_os_remove(lua_State *L)
 {
 	luaL_checktype(L, 1, LUA_TSTRING);
 	const char *path = lua_tostring(L, 1);
-	CHECK_SECURE_PATH(L, path);
+	CHECK_SECURE_PATH_INTERNAL(L, path, true, NULL);
 
 	push_original(L, "os", "remove");
 	lua_pushvalue(L, 1);
diff --git a/src/script/cpp_api/s_security.h b/src/script/cpp_api/s_security.h
index 97bc5c0..6876108 100644
--- a/src/script/cpp_api/s_security.h
+++ b/src/script/cpp_api/s_security.h
@@ -23,14 +23,18 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "cpp_api/s_base.h"
 
 
-#define CHECK_SECURE_PATH(L, path) \
-	if (!ScriptApiSecurity::checkPath(L, path)) { \
-		throw LuaError(std::string("Attempt to access external file ") + \
-					path + " with mod security on."); \
+#define CHECK_SECURE_PATH_INTERNAL(L, path, write_required, ptr) \
+	if (!ScriptApiSecurity::checkPath(L, path, write_required, ptr)) { \
+		throw LuaError(std::string("Mod security: Blocked attempted ") + \
+				(write_required ? "write to " : "read from ") + path); \
 	}
-#define CHECK_SECURE_PATH_OPTIONAL(L, path) \
+#define CHECK_SECURE_PATH(L, path, write_required) \
 	if (ScriptApiSecurity::isSecure(L)) { \
-		CHECK_SECURE_PATH(L, path); \
+		CHECK_SECURE_PATH_INTERNAL(L, path, write_required, NULL); \
+	}
+#define CHECK_SECURE_PATH_POSSIBLE_WRITE(L, path, ptr) \
+	if (ScriptApiSecurity::isSecure(L)) { \
+		CHECK_SECURE_PATH_INTERNAL(L, path, false, ptr); \
 	}
 
 
@@ -43,8 +47,9 @@ public:
 	static bool isSecure(lua_State *L);
 	// Loads a file as Lua code safely (doesn't allow bytecode).
 	static bool safeLoadFile(lua_State *L, const char *path);
-	// Checks if mods are allowed to read and write to the path
-	static bool checkPath(lua_State *L, const char *path);
+	// Checks if mods are allowed to read (and optionally write) to the path
+	static bool checkPath(lua_State *L, const char *path, bool write_required,
+			bool *write_allowed=NULL);
 
 private:
 	// Syntax: "sl_" <Library name or 'g' (global)> '_' <Function name>
diff --git a/src/script/lua_api/l_areastore.cpp b/src/script/lua_api/l_areastore.cpp
index 20e7875..09a5c78 100644
--- a/src/script/lua_api/l_areastore.cpp
+++ b/src/script/lua_api/l_areastore.cpp
@@ -111,6 +111,9 @@ int LuaAreaStore::l_get_area(lua_State *L)
 	const Area *res;
 
 	res = ast->getArea(id);
+	if (!res)
+		return 0;
+
 	push_area(L, res, include_borders, include_data);
 
 	return 1;
@@ -260,7 +263,7 @@ int LuaAreaStore::l_to_file(lua_State *L)
 	AreaStore *ast = o->as;
 
 	const char *filename = luaL_checkstring(L, 2);
-	CHECK_SECURE_PATH_OPTIONAL(L, filename);
+	CHECK_SECURE_PATH(L, filename, true);
 
 	std::ostringstream os(std::ios_base::binary);
 	ast->serialize(os);
@@ -291,7 +294,7 @@ int LuaAreaStore::l_from_file(lua_State *L)
 	LuaAreaStore *o = checkobject(L, 1);
 
 	const char *filename = luaL_checkstring(L, 2);
-	CHECK_SECURE_PATH_OPTIONAL(L, filename);
+	CHECK_SECURE_PATH(L, filename, false);
 
 	std::ifstream is(filename, std::ios::binary);
 	return deserialization_helper(L, o->as, is);
diff --git a/src/script/lua_api/l_craft.cpp b/src/script/lua_api/l_craft.cpp
index 391a013..2236566 100644
--- a/src/script/lua_api/l_craft.cpp
+++ b/src/script/lua_api/l_craft.cpp
@@ -34,7 +34,6 @@ struct EnumString ModApiCraft::es_CraftMethod[] =
 	{0, NULL},
 };
 
-
 // helper for register_craft
 bool ModApiCraft::readCraftRecipeShaped(lua_State *L, int index,
 		int &width, std::vector<std::string> &recipe)
@@ -281,6 +280,80 @@ int ModApiCraft::l_register_craft(lua_State *L)
 	return 0; /* number of results */
 }
 
+// clear_craft({[output=item], [recipe={{item00,item10},{item01,item11}}])
+int ModApiCraft::l_clear_craft(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+	luaL_checktype(L, 1, LUA_TTABLE);
+	int table = 1;
+
+	// Get the writable craft definition manager from the server
+	IWritableCraftDefManager *craftdef =
+			getServer(L)->getWritableCraftDefManager();
+
+	std::string output = getstringfield_default(L, table, "output", "");
+	std::string type = getstringfield_default(L, table, "type", "shaped");
+	CraftOutput c_output(output, 0);
+	if (output != "") {
+		if (craftdef->clearCraftRecipesByOutput(c_output, getServer(L)))
+			return 0;
+		else
+			throw LuaError("No craft recipe known for output"
+					" (output=\"" + output + "\")");
+	}
+	std::vector<std::string> recipe;
+	int width = 0;
+	CraftMethod method = CRAFT_METHOD_NORMAL;
+	/*
+		CraftDefinitionShaped
+	*/
+	if (type == "shaped") {
+		lua_getfield(L, table, "recipe");
+		if (lua_isnil(L, -1))
+			throw LuaError("Either output or recipe has to be defined");
+		if (!readCraftRecipeShaped(L, -1, width, recipe))
+			throw LuaError("Invalid crafting recipe");
+	}
+	/*
+		CraftDefinitionShapeless
+	*/
+	else if (type == "shapeless") {
+		lua_getfield(L, table, "recipe");
+		if (lua_isnil(L, -1))
+			throw LuaError("Either output or recipe has to be defined");
+		if (!readCraftRecipeShapeless(L, -1, recipe))
+			throw LuaError("Invalid crafting recipe");
+	}
+	/*
+		CraftDefinitionCooking
+	*/
+	else if (type == "cooking") {
+		method = CRAFT_METHOD_COOKING;
+		std::string rec = getstringfield_default(L, table, "recipe", "");
+		if (rec == "")
+			throw LuaError("Crafting definition (cooking)"
+					" is missing a recipe");
+		recipe.push_back(rec);
+	}
+	/*
+		CraftDefinitionFuel
+	*/
+	else if (type == "fuel") {
+		method = CRAFT_METHOD_FUEL;
+		std::string rec = getstringfield_default(L, table, "recipe", "");
+		if (rec == "")
+			throw LuaError("Crafting definition (fuel)"
+					" is missing a recipe");
+		recipe.push_back(rec);
+	} else {
+		throw LuaError("Unknown crafting definition type: \"" + type + "\"");
+	}
+	if (!craftdef->clearCraftRecipesByInput(method, width, recipe, getServer(L)))
+		throw LuaError("No crafting specified for input");
+	lua_pop(L, 1);
+	return 0;
+}
+
 // get_craft_result(input)
 int ModApiCraft::l_get_craft_result(lua_State *L)
 {
@@ -349,20 +422,28 @@ static void push_craft_recipe(lua_State *L, IGameDef *gdef,
 	}
 	lua_setfield(L, -2, "items");
 	setintfield(L, -1, "width", input.width);
+
+	std::string method_s;
 	switch (input.method) {
 	case CRAFT_METHOD_NORMAL:
-		lua_pushstring(L, "normal");
+		method_s = "normal";
 		break;
 	case CRAFT_METHOD_COOKING:
-		lua_pushstring(L, "cooking");
+		method_s = "cooking";
 		break;
 	case CRAFT_METHOD_FUEL:
-		lua_pushstring(L, "fuel");
+		method_s = "fuel";
 		break;
 	default:
-		lua_pushstring(L, "unknown");
+		method_s = "unknown";
 	}
+	lua_pushstring(L, method_s.c_str());
+	lua_setfield(L, -2, "method");
+
+	// Deprecated, only for compatibility's sake
+	lua_pushstring(L, method_s.c_str());
 	lua_setfield(L, -2, "type");
+
 	lua_pushstring(L, output.item.c_str());
 	lua_setfield(L, -2, "output");
 }
@@ -431,4 +512,5 @@ void ModApiCraft::Initialize(lua_State *L, int top)
 	API_FCT(get_craft_recipe);
 	API_FCT(get_craft_result);
 	API_FCT(register_craft);
+	API_FCT(clear_craft);
 }
diff --git a/src/script/lua_api/l_craft.h b/src/script/lua_api/l_craft.h
index 5486087..eb2bce7 100644
--- a/src/script/lua_api/l_craft.h
+++ b/src/script/lua_api/l_craft.h
@@ -33,6 +33,7 @@ private:
 	static int l_get_craft_recipe(lua_State *L);
 	static int l_get_all_craft_recipes(lua_State *L);
 	static int l_get_craft_result(lua_State *L);
+	static int l_clear_craft(lua_State *L);
 
 	static bool readCraftReplacements(lua_State *L, int index,
 			CraftReplacements &replacements);
diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp
index 8284c3f..68d1030 100644
--- a/src/script/lua_api/l_env.cpp
+++ b/src/script/lua_api/l_env.cpp
@@ -137,6 +137,10 @@ void LuaEmergeAreaCallback(v3s16 blockpos, EmergeAction action, void *param)
 	assert(state->script != NULL);
 	assert(state->refcount > 0);
 
+	// state must be protected by envlock
+	Server *server = state->script->getServer();
+	MutexAutoLock envlock(server->m_env_mutex);
+
 	state->refcount--;
 
 	state->script->on_emerge_area_completion(blockpos, action, state);
@@ -494,8 +498,8 @@ int ModApiEnvMod::l_get_player_by_name(lua_State *L)
 
 	// Do it
 	const char *name = luaL_checkstring(L, 1);
-	Player *player = env->getPlayer(name);
-	if(player == NULL){
+	RemotePlayer *player = dynamic_cast<RemotePlayer *>(env->getPlayer(name));
+	if (player == NULL){
 		lua_pushnil(L);
 		return 1;
 	}
@@ -758,7 +762,7 @@ int ModApiEnvMod::l_get_perlin_map(lua_State *L)
 		return 0;
 	v3s16 size = read_v3s16(L, 2);
 
-	int seed = (int)(env->getServerMap().getSeed());
+	s32 seed = (s32)(env->getServerMap().getSeed());
 	LuaPerlinNoiseMap *n = new LuaPerlinNoiseMap(&np, seed, size);
 	*(void **)(lua_newuserdata(L, sizeof(void *))) = n;
 	luaL_getmetatable(L, "PerlinNoiseMap");
diff --git a/src/script/lua_api/l_inventory.cpp b/src/script/lua_api/l_inventory.cpp
index de9f937..38eade6 100644
--- a/src/script/lua_api/l_inventory.cpp
+++ b/src/script/lua_api/l_inventory.cpp
@@ -420,7 +420,7 @@ void InvRef::create(lua_State *L, const InventoryLocation &loc)
 	luaL_getmetatable(L, className);
 	lua_setmetatable(L, -2);
 }
-void InvRef::createPlayer(lua_State *L, Player *player)
+void InvRef::createPlayer(lua_State *L, RemotePlayer *player)
 {
 	NO_MAP_LOCK_REQUIRED;
 	InventoryLocation loc;
@@ -520,16 +520,17 @@ int ModApiInventory::l_get_inventory(lua_State *L)
 	}
 }
 
-// create_detached_inventory_raw(name)
+// create_detached_inventory_raw(name, [player_name])
 int ModApiInventory::l_create_detached_inventory_raw(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	const char *name = luaL_checkstring(L, 1);
-	if(getServer(L)->createDetachedInventory(name) != NULL){
+	const char *player = lua_isstring(L, 2) ? lua_tostring(L, 2) : "";
+	if (getServer(L)->createDetachedInventory(name, player) != NULL) {
 		InventoryLocation loc;
 		loc.setDetached(name);
 		InvRef::create(L, loc);
-	}else{
+	} else {
 		lua_pushnil(L);
 	}
 	return 1;
diff --git a/src/script/lua_api/l_inventory.h b/src/script/lua_api/l_inventory.h
index 2d4b29d..cc53339 100644
--- a/src/script/lua_api/l_inventory.h
+++ b/src/script/lua_api/l_inventory.h
@@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "inventory.h"
 #include "inventorymanager.h"
 
-class Player;
+class RemotePlayer;
 
 /*
 	InvRef
@@ -112,7 +112,7 @@ public:
 	// Creates an InvRef and leaves it on top of stack
 	// Not callable from Lua; all references are created on the C side.
 	static void create(lua_State *L, const InventoryLocation &loc);
-	static void createPlayer(lua_State *L, Player *player);
+	static void createPlayer(lua_State *L, RemotePlayer *player);
 	static void createNodeMeta(lua_State *L, v3s16 p);
 	static void Register(lua_State *L);
 };
@@ -123,11 +123,6 @@ private:
 
 	static int l_get_inventory(lua_State *L);
 
-	static void inventory_set_list_from_lua(Inventory *inv, const char *name,
-			lua_State *L, int tableindex, int forcesize);
-	static void inventory_get_list_to_lua(Inventory *inv, const char *name,
-			lua_State *L);
-
 public:
 	static void Initialize(lua_State *L, int top);
 };
diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp
index 5381cba..ff0baea 100644
--- a/src/script/lua_api/l_item.cpp
+++ b/src/script/lua_api/l_item.cpp
@@ -525,6 +525,27 @@ int ModApiItemMod::l_register_item_raw(lua_State *L)
 	return 0; /* number of results */
 }
 
+// unregister_item(name)
+int ModApiItemMod::l_unregister_item_raw(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+	std::string name = luaL_checkstring(L, 1);
+
+	IWritableItemDefManager *idef =
+			getServer(L)->getWritableItemDefManager();
+
+	// Unregister the node
+	if (idef->get(name).type == ITEM_NODE) {
+		IWritableNodeDefManager *ndef =
+			getServer(L)->getWritableNodeDefManager();
+		ndef->removeNode(name);
+	}
+
+	idef->unregisterItem(name);
+
+	return 0; /* number of results */
+}
+
 // register_alias_raw(name, convert_to_name)
 int ModApiItemMod::l_register_alias_raw(lua_State *L)
 {
@@ -570,6 +591,7 @@ int ModApiItemMod::l_get_name_from_content_id(lua_State *L)
 void ModApiItemMod::Initialize(lua_State *L, int top)
 {
 	API_FCT(register_item_raw);
+	API_FCT(unregister_item_raw);
 	API_FCT(register_alias_raw);
 	API_FCT(get_content_id);
 	API_FCT(get_name_from_content_id);
diff --git a/src/script/lua_api/l_item.h b/src/script/lua_api/l_item.h
index 0f9e4ba..be919b7 100644
--- a/src/script/lua_api/l_item.h
+++ b/src/script/lua_api/l_item.h
@@ -135,6 +135,7 @@ public:
 class ModApiItemMod : public ModApiBase {
 private:
 	static int l_register_item_raw(lua_State *L);
+	static int l_unregister_item_raw(lua_State *L);
 	static int l_register_alias_raw(lua_State *L);
 	static int l_get_content_id(lua_State *L);
 	static int l_get_name_from_content_id(lua_State *L);
diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp
index 7b29db1..4a24846 100644
--- a/src/script/lua_api/l_mainmenu.cpp
+++ b/src/script/lua_api/l_mainmenu.cpp
@@ -31,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "filesys.h"
 #include "convert_json.h"
 #include "serverlist.h"
-#include "emerge.h"
+#include "mapgen.h"
 #include "sound.h"
 #include "settings.h"
 #include "log.h"
@@ -707,7 +707,7 @@ int ModApiMainMenu::l_set_topleft_text(lua_State *L)
 int ModApiMainMenu::l_get_mapgen_names(lua_State *L)
 {
 	std::vector<const char *> names;
-	EmergeManager::getMapgenNames(&names, lua_toboolean(L, 1));
+	Mapgen::getMapgenNames(&names, lua_toboolean(L, 1));
 
 	lua_newtable(L);
 	for (size_t i = 0; i != names.size(); i++) {
@@ -956,13 +956,6 @@ int ModApiMainMenu::l_show_file_open_dialog(lua_State *L)
 }
 
 /******************************************************************************/
-int ModApiMainMenu::l_get_version(lua_State *L)
-{
-	lua_pushstring(L, g_version_string);
-	return 1;
-}
-
-/******************************************************************************/
 int ModApiMainMenu::l_sound_play(lua_State *L)
 {
 	GUIEngine* engine = getGuiEngine(L);
@@ -1157,7 +1150,6 @@ void ModApiMainMenu::Initialize(lua_State *L, int top)
 	API_FCT(extract_zip);
 	API_FCT(get_mainmenu_path);
 	API_FCT(show_file_open_dialog);
-	API_FCT(get_version);
 	API_FCT(download_file);
 	API_FCT(get_modstore_details);
 	API_FCT(get_modstore_list);
@@ -1188,7 +1180,6 @@ void ModApiMainMenu::InitializeAsync(AsyncEngine& engine)
 	ASYNC_API_FCT(delete_dir);
 	ASYNC_API_FCT(copy_dir);
 	//ASYNC_API_FCT(extract_zip); //TODO remove dependency to GuiEngine
-	ASYNC_API_FCT(get_version);
 	ASYNC_API_FCT(download_file);
 	ASYNC_API_FCT(get_modstore_details);
 	ASYNC_API_FCT(get_modstore_list);
diff --git a/src/script/lua_api/l_mainmenu.h b/src/script/lua_api/l_mainmenu.h
index 405af25..ad5155a 100644
--- a/src/script/lua_api/l_mainmenu.h
+++ b/src/script/lua_api/l_mainmenu.h
@@ -79,8 +79,6 @@ private:
 
 	static int l_delete_favorite(lua_State *L);
 
-	static int l_get_version(lua_State *L);
-
 	static int l_sound_play(lua_State *L);
 
 	static int l_sound_stop(lua_State *L);
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp
index fb83917..bc1c32f 100644
--- a/src/script/lua_api/l_mapgen.cpp
+++ b/src/script/lua_api/l_mapgen.cpp
@@ -39,11 +39,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 struct EnumString ModApiMapgen::es_BiomeTerrainType[] =
 {
-	{BIOME_NORMAL, "normal"},
-	{BIOME_LIQUID, "liquid"},
-	{BIOME_NETHER, "nether"},
-	{BIOME_AETHER, "aether"},
-	{BIOME_FLAT,   "flat"},
+	{BIOMETYPE_NORMAL, "normal"},
+	{BIOMETYPE_LIQUID, "liquid"},
+	{BIOMETYPE_NETHER, "nether"},
+	{BIOMETYPE_AETHER, "aether"},
+	{BIOMETYPE_FLAT,   "flat"},
 	{0, NULL},
 };
 
@@ -100,7 +100,7 @@ Biome *get_or_load_biome(lua_State *L, int index,
 	BiomeManager *biomemgr);
 Biome *read_biome_def(lua_State *L, int index, INodeDefManager *ndef);
 size_t get_biome_list(lua_State *L, int index,
-	BiomeManager *biomemgr, std::set<u8> *biome_id_list);
+	BiomeManager *biomemgr, UNORDERED_SET<u8> *biome_id_list);
 
 Schematic *get_or_load_schematic(lua_State *L, int index,
 	SchematicManager *schemmgr, StringMap *replace_names);
@@ -244,7 +244,7 @@ bool read_schematic_def(lua_State *L, int index,
 	schem->schemdata = new MapNode[numnodes];
 
 	size_t names_base = names->size();
-	std::map<std::string, content_t> name_id_map;
+	UNORDERED_MAP<std::string, content_t> name_id_map;
 
 	u32 i = 0;
 	for (lua_pushnil(L); lua_next(L, -2); i++, lua_pop(L, 1)) {
@@ -266,7 +266,7 @@ bool read_schematic_def(lua_State *L, int index,
 		u8 param2 = getintfield_default(L, -1, "param2", 0);
 
 		//// Find or add new nodename-to-ID mapping
-		std::map<std::string, content_t>::iterator it = name_id_map.find(name);
+		UNORDERED_MAP<std::string, content_t>::iterator it = name_id_map.find(name);
 		content_t name_index;
 		if (it != name_id_map.end()) {
 			name_index = it->second;
@@ -371,13 +371,14 @@ Biome *read_biome_def(lua_State *L, int index, INodeDefManager *ndef)
 		return NULL;
 
 	BiomeType biometype = (BiomeType)getenumfield(L, index, "type",
-		ModApiMapgen::es_BiomeTerrainType, BIOME_NORMAL);
+		ModApiMapgen::es_BiomeTerrainType, BIOMETYPE_NORMAL);
 	Biome *b = BiomeManager::create(biometype);
 
 	b->name            = getstringfield_default(L, index, "name", "");
 	b->depth_top       = getintfield_default(L,    index, "depth_top",       0);
 	b->depth_filler    = getintfield_default(L,    index, "depth_filler",    -31000);
 	b->depth_water_top = getintfield_default(L,    index, "depth_water_top", 0);
+	b->depth_riverbed  = getintfield_default(L,    index, "depth_riverbed",  0);
 	b->y_min           = getintfield_default(L,    index, "y_min",           -31000);
 	b->y_max           = getintfield_default(L,    index, "y_max",           31000);
 	b->heat_point      = getfloatfield_default(L,  index, "heat_point",      0.f);
@@ -391,6 +392,7 @@ Biome *read_biome_def(lua_State *L, int index, INodeDefManager *ndef)
 	nn.push_back(getstringfield_default(L, index, "node_water_top",   ""));
 	nn.push_back(getstringfield_default(L, index, "node_water",       ""));
 	nn.push_back(getstringfield_default(L, index, "node_river_water", ""));
+	nn.push_back(getstringfield_default(L, index, "node_riverbed",    ""));
 	nn.push_back(getstringfield_default(L, index, "node_dust",        ""));
 	ndef->pendNodeResolve(b);
 
@@ -399,7 +401,7 @@ Biome *read_biome_def(lua_State *L, int index, INodeDefManager *ndef)
 
 
 size_t get_biome_list(lua_State *L, int index,
-	BiomeManager *biomemgr, std::set<u8> *biome_id_list)
+	BiomeManager *biomemgr, UNORDERED_SET<u8> *biome_id_list)
 {
 	if (index < 0)
 		index = lua_gettop(L) + 1 + index;
@@ -528,24 +530,26 @@ int ModApiMapgen::l_get_mapgen_object(lua_State *L)
 		return 1;
 	}
 	case MGOBJ_BIOMEMAP: {
-		if (!mg->biomemap)
+		if (!mg->biomegen)
 			return 0;
 
 		lua_newtable(L);
 		for (size_t i = 0; i != maplen; i++) {
-			lua_pushinteger(L, mg->biomemap[i]);
+			lua_pushinteger(L, mg->biomegen->biomemap[i]);
 			lua_rawseti(L, -2, i + 1);
 		}
 
 		return 1;
 	}
 	case MGOBJ_HEATMAP: {
-		if (!mg->heatmap)
+		if (!mg->biomegen || mg->biomegen->getType() != BIOMEGEN_ORIGINAL)
 			return 0;
 
+		BiomeGenOriginal *bg = (BiomeGenOriginal *)mg->biomegen;
+
 		lua_newtable(L);
 		for (size_t i = 0; i != maplen; i++) {
-			lua_pushnumber(L, mg->heatmap[i]);
+			lua_pushnumber(L, bg->heatmap[i]);
 			lua_rawseti(L, -2, i + 1);
 		}
 
@@ -553,12 +557,14 @@ int ModApiMapgen::l_get_mapgen_object(lua_State *L)
 	}
 
 	case MGOBJ_HUMIDMAP: {
-		if (!mg->humidmap)
+		if (!mg->biomegen || mg->biomegen->getType() != BIOMEGEN_ORIGINAL)
 			return 0;
 
+		BiomeGenOriginal *bg = (BiomeGenOriginal *)mg->biomegen;
+
 		lua_newtable(L);
 		for (size_t i = 0; i != maplen; i++) {
-			lua_pushnumber(L, mg->humidmap[i]);
+			lua_pushnumber(L, bg->humidmap[i]);
 			lua_rawseti(L, -2, i + 1);
 		}
 
@@ -594,24 +600,37 @@ int ModApiMapgen::l_get_mapgen_params(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 
-	MapgenParams *params = &getServer(L)->getEmergeManager()->params;
+	log_deprecated(L, "get_mapgen_params is deprecated; "
+		"use get_mapgen_setting instead");
+
+	std::string value;
+
+	MapSettingsManager *settingsmgr =
+		getServer(L)->getEmergeManager()->map_settings_mgr;
 
 	lua_newtable(L);
 
-	lua_pushstring(L, params->mg_name.c_str());
+	settingsmgr->getMapSetting("mg_name", &value);
+	lua_pushstring(L, value.c_str());
 	lua_setfield(L, -2, "mgname");
 
-	lua_pushinteger(L, params->seed);
+	settingsmgr->getMapSetting("seed", &value);
+	std::istringstream ss(value);
+	u64 seed;
+	ss >> seed;
+	lua_pushinteger(L, seed);
 	lua_setfield(L, -2, "seed");
 
-	lua_pushinteger(L, params->water_level);
+	settingsmgr->getMapSetting("water_level", &value);
+	lua_pushinteger(L, stoi(value, -32768, 32767));
 	lua_setfield(L, -2, "water_level");
 
-	lua_pushinteger(L, params->chunksize);
+	settingsmgr->getMapSetting("chunksize", &value);
+	lua_pushinteger(L, stoi(value, -32768, 32767));
 	lua_setfield(L, -2, "chunksize");
 
-	std::string flagstr = writeFlagString(params->flags, flagdesc_mapgen, U32_MAX);
-	lua_pushstring(L, flagstr.c_str());
+	settingsmgr->getMapSetting("mg_flags", &value);
+	lua_pushstring(L, value.c_str());
 	lua_setfield(L, -2, "flags");
 
 	return 1;
@@ -624,44 +643,120 @@ int ModApiMapgen::l_set_mapgen_params(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 
+	log_deprecated(L, "set_mapgen_params is deprecated; "
+		"use set_mapgen_setting instead");
+
 	if (!lua_istable(L, 1))
 		return 0;
 
-	EmergeManager *emerge = getServer(L)->getEmergeManager();
-	if (emerge->isRunning())
-		throw LuaError("Cannot set parameters while mapgen is running");
-
-	MapgenParams *params = &emerge->params;
-	u32 flags = 0, flagmask = 0;
+	MapSettingsManager *settingsmgr =
+		getServer(L)->getEmergeManager()->map_settings_mgr;
 
 	lua_getfield(L, 1, "mgname");
-	if (lua_isstring(L, -1)) {
-		params->mg_name = lua_tostring(L, -1);
-		delete params->sparams;
-		params->sparams = NULL;
-	}
+	if (lua_isstring(L, -1))
+		settingsmgr->setMapSetting("mg_name", lua_tostring(L, -1), true);
 
 	lua_getfield(L, 1, "seed");
 	if (lua_isnumber(L, -1))
-		params->seed = lua_tointeger(L, -1);
+		settingsmgr->setMapSetting("seed", lua_tostring(L, -1), true);
 
 	lua_getfield(L, 1, "water_level");
 	if (lua_isnumber(L, -1))
-		params->water_level = lua_tointeger(L, -1);
+		settingsmgr->setMapSetting("water_level", lua_tostring(L, -1), true);
 
 	lua_getfield(L, 1, "chunksize");
 	if (lua_isnumber(L, -1))
-		params->chunksize = lua_tointeger(L, -1);
+		settingsmgr->setMapSetting("chunksize", lua_tostring(L, -1), true);
 
 	warn_if_field_exists(L, 1, "flagmask",
 		"Deprecated: flags field now includes unset flags.");
-	lua_getfield(L, 1, "flagmask");
+
+	lua_getfield(L, 1, "flags");
 	if (lua_isstring(L, -1))
-		params->flags &= ~readFlagString(lua_tostring(L, -1), flagdesc_mapgen, NULL);
+		settingsmgr->setMapSetting("mg_flags", lua_tostring(L, -1), true);
+
+	return 0;
+}
+
+// get_mapgen_setting(name)
+int ModApiMapgen::l_get_mapgen_setting(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+
+	std::string value;
+	MapSettingsManager *settingsmgr =
+		getServer(L)->getEmergeManager()->map_settings_mgr;
 
-	if (getflagsfield(L, 1, "flags", flagdesc_mapgen, &flags, &flagmask)) {
-		params->flags &= ~flagmask;
-		params->flags |= flags;
+	const char *name = luaL_checkstring(L, 1);
+	if (!settingsmgr->getMapSetting(name, &value))
+		return 0;
+
+	lua_pushstring(L, value.c_str());
+	return 1;
+}
+
+// get_mapgen_setting_noiseparams(name)
+int ModApiMapgen::l_get_mapgen_setting_noiseparams(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+
+	NoiseParams np;
+	MapSettingsManager *settingsmgr =
+		getServer(L)->getEmergeManager()->map_settings_mgr;
+
+	const char *name = luaL_checkstring(L, 1);
+	if (!settingsmgr->getMapSettingNoiseParams(name, &np))
+		return 0;
+
+	push_noiseparams(L, &np);
+	return 1;
+}
+
+// set_mapgen_setting(name, value, override_meta)
+// set mapgen config values
+int ModApiMapgen::l_set_mapgen_setting(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+
+	MapSettingsManager *settingsmgr =
+		getServer(L)->getEmergeManager()->map_settings_mgr;
+
+	const char *name   = luaL_checkstring(L, 1);
+	const char *value  = luaL_checkstring(L, 2);
+	bool override_meta = lua_isboolean(L, 3) ? lua_toboolean(L, 3) : false;
+
+	if (!settingsmgr->setMapSetting(name, value, override_meta)) {
+		errorstream << "set_mapgen_setting: cannot set '"
+			<< name << "' after initialization" << std::endl;
+	}
+
+	return 0;
+}
+
+
+// set_mapgen_setting_noiseparams(name, noiseparams, set_default)
+// set mapgen config values for noise parameters
+int ModApiMapgen::l_set_mapgen_setting_noiseparams(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+
+	MapSettingsManager *settingsmgr =
+		getServer(L)->getEmergeManager()->map_settings_mgr;
+
+	const char *name = luaL_checkstring(L, 1);
+
+	NoiseParams np;
+	if (!read_noiseparams(L, 2, &np)) {
+		errorstream << "set_mapgen_setting_noiseparams: cannot set '" << name
+			<< "'; invalid noiseparams table" << std::endl;
+		return 0;
+	}
+
+	bool override_meta = lua_isboolean(L, 3) ? lua_toboolean(L, 3) : false;
+
+	if (!settingsmgr->setMapSettingNoiseParams(name, &np, override_meta)) {
+		errorstream << "set_mapgen_setting_noiseparams: cannot set '"
+			<< name << "' after initialization" << std::endl;
 	}
 
 	return 0;
@@ -677,8 +772,11 @@ int ModApiMapgen::l_set_noiseparams(lua_State *L)
 	const char *name = luaL_checkstring(L, 1);
 
 	NoiseParams np;
-	if (!read_noiseparams(L, 2, &np))
+	if (!read_noiseparams(L, 2, &np)) {
+		errorstream << "set_noiseparams: cannot set '" << name
+			<< "'; invalid noiseparams table" << std::endl;
 		return 0;
+	}
 
 	bool set_default = lua_isboolean(L, 3) ? lua_toboolean(L, 3) : true;
 
@@ -804,6 +902,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
 	deco->fill_ratio = getfloatfield_default(L, index, "fill_ratio", 0.02);
 	deco->y_min      = getintfield_default(L, index, "y_min", -31000);
 	deco->y_max      = getintfield_default(L, index, "y_max", 31000);
+	deco->nspawnby   = getintfield_default(L, index, "num_spawn_by", -1);
 	deco->sidelen    = getintfield_default(L, index, "sidelen", 8);
 	if (deco->sidelen <= 0) {
 		errorstream << "register_decoration: sidelen must be "
@@ -831,6 +930,14 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
 		errorstream << "register_decoration: couldn't get all biomes " << std::endl;
 	lua_pop(L, 1);
 
+	//// Get node name(s) to 'spawn by'
+	size_t nnames = getstringlistfield(L, index, "spawn_by", &deco->m_nodenames);
+	deco->m_nnlistsizes.push_back(nnames);
+	if (nnames == 0 && deco->nspawnby != -1) {
+		errorstream << "register_decoration: no spawn_by nodes defined,"
+			" but num_spawn_by specified" << std::endl;
+	}
+
 	//// Handle decoration type-specific parameters
 	bool success = false;
 	switch (decotype) {
@@ -864,12 +971,11 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
 
 bool read_deco_simple(lua_State *L, DecoSimple *deco)
 {
-	size_t nnames;
 	int index = 1;
+	int param2;
 
 	deco->deco_height     = getintfield_default(L, index, "height", 1);
 	deco->deco_height_max = getintfield_default(L, index, "height_max", 0);
-	deco->nspawnby        = getintfield_default(L, index, "num_spawn_by", -1);
 
 	if (deco->deco_height <= 0) {
 		errorstream << "register_decoration: simple decoration height"
@@ -877,7 +983,7 @@ bool read_deco_simple(lua_State *L, DecoSimple *deco)
 		return false;
 	}
 
-	nnames = getstringlistfield(L, index, "decoration", &deco->m_nodenames);
+	size_t nnames = getstringlistfield(L, index, "decoration", &deco->m_nodenames);
 	deco->m_nnlistsizes.push_back(nnames);
 	if (nnames == 0) {
 		errorstream << "register_decoration: no decoration nodes "
@@ -885,13 +991,13 @@ bool read_deco_simple(lua_State *L, DecoSimple *deco)
 		return false;
 	}
 
-	nnames = getstringlistfield(L, index, "spawn_by", &deco->m_nodenames);
-	deco->m_nnlistsizes.push_back(nnames);
-	if (nnames == 0 && deco->nspawnby != -1) {
-		errorstream << "register_decoration: no spawn_by nodes defined,"
-			" but num_spawn_by specified" << std::endl;
+	param2 = getintfield_default(L, index, "param2", 0);
+	if ((param2 < 0) || (param2 > 255)) {
+		errorstream << "register_decoration: param2 out of bounds (0-255)"
+			<< std::endl;
 		return false;
 	}
+	deco->deco_param2 = (u8)param2;
 
 	return true;
 }
@@ -1137,7 +1243,7 @@ int ModApiMapgen::l_generate_ores(lua_State *L)
 	EmergeManager *emerge = getServer(L)->getEmergeManager();
 
 	Mapgen mg;
-	mg.seed = emerge->params.seed;
+	mg.seed = emerge->mgparams->seed;
 	mg.vm   = LuaVoxelManip::checkobject(L, 1)->vm;
 	mg.ndef = getServer(L)->getNodeDefManager();
 
@@ -1163,7 +1269,7 @@ int ModApiMapgen::l_generate_decorations(lua_State *L)
 	EmergeManager *emerge = getServer(L)->getEmergeManager();
 
 	Mapgen mg;
-	mg.seed = emerge->params.seed;
+	mg.seed = emerge->mgparams->seed;
 	mg.vm   = LuaVoxelManip::checkobject(L, 1)->vm;
 	mg.ndef = getServer(L)->getNodeDefManager();
 
@@ -1189,7 +1295,7 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
 	INodeDefManager *ndef = getServer(L)->getNodeDefManager();
 
 	const char *filename = luaL_checkstring(L, 4);
-	CHECK_SECURE_PATH_OPTIONAL(L, filename);
+	CHECK_SECURE_PATH(L, filename, true);
 
 	Map *map = &(getEnv(L)->getMap());
 	Schematic schem;
@@ -1387,6 +1493,10 @@ void ModApiMapgen::Initialize(lua_State *L, int top)
 
 	API_FCT(get_mapgen_params);
 	API_FCT(set_mapgen_params);
+	API_FCT(get_mapgen_setting);
+	API_FCT(set_mapgen_setting);
+	API_FCT(get_mapgen_setting_noiseparams);
+	API_FCT(set_mapgen_setting_noiseparams);
 	API_FCT(set_noiseparams);
 	API_FCT(get_noiseparams);
 	API_FCT(set_gen_notify);
diff --git a/src/script/lua_api/l_mapgen.h b/src/script/lua_api/l_mapgen.h
index 9751c0d..bb94575 100644
--- a/src/script/lua_api/l_mapgen.h
+++ b/src/script/lua_api/l_mapgen.h
@@ -40,6 +40,18 @@ private:
 	// set mapgen parameters
 	static int l_set_mapgen_params(lua_State *L);
 
+	// get_mapgen_setting(name)
+	static int l_get_mapgen_setting(lua_State *L);
+
+	// set_mapgen_setting(name, value, override_meta)
+	static int l_set_mapgen_setting(lua_State *L);
+
+	// get_mapgen_setting_noiseparams(name)
+	static int l_get_mapgen_setting_noiseparams(lua_State *L);
+
+	// set_mapgen_setting_noiseparams(name, value, override_meta)
+	static int l_set_mapgen_setting_noiseparams(lua_State *L);
+
 	// set_noiseparam_defaults(name, noiseparams, set_default)
 	static int l_set_noiseparams(lua_State *L);
 
diff --git a/src/script/lua_api/l_nodetimer.cpp b/src/script/lua_api/l_nodetimer.cpp
index 6011135..3242d6e 100644
--- a/src/script/lua_api/l_nodetimer.cpp
+++ b/src/script/lua_api/l_nodetimer.cpp
@@ -45,7 +45,7 @@ int NodeTimerRef::l_set(lua_State *L)
 	if(env == NULL) return 0;
 	f32 t = luaL_checknumber(L,2);
 	f32 e = luaL_checknumber(L,3);
-	env->getMap().setNodeTimer(o->m_p,NodeTimer(t,e));
+	env->getMap().setNodeTimer(NodeTimer(t, e, o->m_p));
 	return 0;
 }
 
@@ -56,7 +56,7 @@ int NodeTimerRef::l_start(lua_State *L)
 	ServerEnvironment *env = o->m_env;
 	if(env == NULL) return 0;
 	f32 t = luaL_checknumber(L,2);
-	env->getMap().setNodeTimer(o->m_p,NodeTimer(t,0));
+	env->getMap().setNodeTimer(NodeTimer(t, 0, o->m_p));
 	return 0;
 }
 
diff --git a/src/script/lua_api/l_noise.cpp b/src/script/lua_api/l_noise.cpp
index 04dc604..e003937 100644
--- a/src/script/lua_api/l_noise.cpp
+++ b/src/script/lua_api/l_noise.cpp
@@ -146,7 +146,7 @@ const luaL_reg LuaPerlinNoise::methods[] = {
   LuaPerlinNoiseMap
 */
 
-LuaPerlinNoiseMap::LuaPerlinNoiseMap(NoiseParams *params, int seed, v3s16 size)
+LuaPerlinNoiseMap::LuaPerlinNoiseMap(NoiseParams *params, s32 seed, v3s16 size)
 {
 	m_is3d = size.Z > 1;
 	np = *params;
diff --git a/src/script/lua_api/l_noise.h b/src/script/lua_api/l_noise.h
index 492eb75..40bfd13 100644
--- a/src/script/lua_api/l_noise.h
+++ b/src/script/lua_api/l_noise.h
@@ -79,7 +79,7 @@ class LuaPerlinNoiseMap : public ModApiBase {
 	static int l_getMapSlice(lua_State *L);
 
 public:
-	LuaPerlinNoiseMap(NoiseParams *np, int seed, v3s16 size);
+	LuaPerlinNoiseMap(NoiseParams *np, s32 seed, v3s16 size);
 
 	~LuaPerlinNoiseMap();
 
@@ -111,7 +111,7 @@ private:
 	static int l_next(lua_State *L);
 
 public:
-	LuaPseudoRandom(int seed) :
+	LuaPseudoRandom(s32 seed) :
 		m_pseudo(seed) {}
 
 	// LuaPseudoRandom(seed)
diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp
index 6d6614e..2a8b8a6 100644
--- a/src/script/lua_api/l_object.cpp
+++ b/src/script/lua_api/l_object.cpp
@@ -107,7 +107,7 @@ PlayerSAO* ObjectRef::getplayersao(ObjectRef *ref)
 	return (PlayerSAO*)obj;
 }
 
-Player* ObjectRef::getplayer(ObjectRef *ref)
+RemotePlayer *ObjectRef::getplayer(ObjectRef *ref)
 {
 	PlayerSAO *playersao = getplayersao(ref);
 	if (playersao == NULL)
@@ -137,11 +137,12 @@ int ObjectRef::l_remove(lua_State *L)
 	if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER)
 		return 0;
 
-	std::set<int> child_ids = co->getAttachmentChildIds();
-	std::set<int>::iterator it;
+	UNORDERED_SET<int> child_ids = co->getAttachmentChildIds();
+	UNORDERED_SET<int>::iterator it;
 	for (it = child_ids.begin(); it != child_ids.end(); ++it) {
-		ServerActiveObject *child = env->getActiveObject(*it);
-		child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0));
+		// Child can be NULL if it was deleted earlier
+		if (ServerActiveObject *child = env->getActiveObject(*it))
+			child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0));
 	}
 
 	verbosestream<<"ObjectRef::l_remove(): id="<<co->getId()<<std::endl;
@@ -508,7 +509,7 @@ int ObjectRef::l_set_local_animation(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 	// Do it
@@ -533,7 +534,7 @@ int ObjectRef::l_get_local_animation(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -554,7 +555,7 @@ int ObjectRef::l_set_eye_offset(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 	// Do it
@@ -584,7 +585,7 @@ int ObjectRef::l_get_eye_offset(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 	// Do it
@@ -606,10 +607,10 @@ int ObjectRef::l_set_bone_position(lua_State *L)
 		bone = lua_tostring(L, 2);
 	v3f position = v3f(0, 0, 0);
 	if (!lua_isnil(L, 3))
-		position = read_v3f(L, 3);
+		position = check_v3f(L, 3);
 	v3f rotation = v3f(0, 0, 0);
 	if (!lua_isnil(L, 4))
-		rotation = read_v3f(L, 4);
+		rotation = check_v3f(L, 4);
 	co->setBonePosition(bone, position, rotation);
 	return 0;
 }
@@ -762,7 +763,7 @@ int ObjectRef::l_is_player(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	lua_pushboolean(L, (player != NULL));
 	return 1;
 }
@@ -973,7 +974,7 @@ int ObjectRef::l_is_player_connected(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	lua_pushboolean(L, (player != NULL && player->peer_id != 0));
 	return 1;
 }
@@ -983,7 +984,7 @@ int ObjectRef::l_get_player_name(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL) {
 		lua_pushlstring(L, "", 0);
 		return 1;
@@ -998,7 +999,7 @@ int ObjectRef::l_get_player_velocity(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL) {
 		lua_pushnil(L);
 		return 1;
@@ -1013,63 +1014,133 @@ int ObjectRef::l_get_look_dir(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
-	if (player == NULL) return 0;
+	PlayerSAO* co = getplayersao(ref);
+	if (co == NULL) return 0;
 	// Do it
-	float pitch = player->getRadPitch();
-	float yaw = player->getRadYaw();
+	float pitch = co->getRadPitchDep();
+	float yaw = co->getRadYawDep();
 	v3f v(cos(pitch)*cos(yaw), sin(pitch), cos(pitch)*sin(yaw));
 	push_v3f(L, v);
 	return 1;
 }
 
+// DEPRECATED
 // get_look_pitch(self)
 int ObjectRef::l_get_look_pitch(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
+
+	log_deprecated(L,
+		"Deprecated call to get_look_pitch, use get_look_vertical instead");
+
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
-	if (player == NULL) return 0;
+	PlayerSAO* co = getplayersao(ref);
+	if (co == NULL) return 0;
 	// Do it
-	lua_pushnumber(L, player->getRadPitch());
+	lua_pushnumber(L, co->getRadPitchDep());
 	return 1;
 }
 
+// DEPRECATED
 // get_look_yaw(self)
 int ObjectRef::l_get_look_yaw(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
+
+	log_deprecated(L,
+		"Deprecated call to get_look_yaw, use get_look_horizontal instead");
+
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
-	if (player == NULL) return 0;
+	PlayerSAO* co = getplayersao(ref);
+	if (co == NULL) return 0;
+	// Do it
+	lua_pushnumber(L, co->getRadYawDep());
+	return 1;
+}
+
+// get_look_pitch2(self)
+int ObjectRef::l_get_look_vertical(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+	ObjectRef *ref = checkobject(L, 1);
+	PlayerSAO* co = getplayersao(ref);
+	if (co == NULL) return 0;
+	// Do it
+	lua_pushnumber(L, co->getRadPitch());
+	return 1;
+}
+
+// get_look_yaw2(self)
+int ObjectRef::l_get_look_horizontal(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+	ObjectRef *ref = checkobject(L, 1);
+	PlayerSAO* co = getplayersao(ref);
+	if (co == NULL) return 0;
+	// Do it
+	lua_pushnumber(L, co->getRadYaw());
+	return 1;
+}
+
+// set_look_vertical(self, radians)
+int ObjectRef::l_set_look_vertical(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+	ObjectRef *ref = checkobject(L, 1);
+	PlayerSAO* co = getplayersao(ref);
+	if (co == NULL) return 0;
+	float pitch = luaL_checknumber(L, 2) * core::RADTODEG;
 	// Do it
-	lua_pushnumber(L, player->getRadYaw());
+	co->setPitchAndSend(pitch);
 	return 1;
 }
 
+// set_look_horizontal(self, radians)
+int ObjectRef::l_set_look_horizontal(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+	ObjectRef *ref = checkobject(L, 1);
+	PlayerSAO* co = getplayersao(ref);
+	if (co == NULL) return 0;
+	float yaw = luaL_checknumber(L, 2) * core::RADTODEG;
+	// Do it
+	co->setYawAndSend(yaw);
+	return 1;
+}
+
+// DEPRECATED
 // set_look_pitch(self, radians)
 int ObjectRef::l_set_look_pitch(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
+
+	log_deprecated(L,
+		"Deprecated call to set_look_pitch, use set_look_vertical instead.");
+
 	ObjectRef *ref = checkobject(L, 1);
 	PlayerSAO* co = getplayersao(ref);
 	if (co == NULL) return 0;
 	float pitch = luaL_checknumber(L, 2) * core::RADTODEG;
 	// Do it
-	co->setPitch(pitch);
+	co->setPitchAndSend(pitch);
 	return 1;
 }
 
+// DEPRECATED
 // set_look_yaw(self, radians)
 int ObjectRef::l_set_look_yaw(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
+
+	log_deprecated(L,
+		"Deprecated call to set_look_yaw, use set_look_horizontal instead.");
+
 	ObjectRef *ref = checkobject(L, 1);
 	PlayerSAO* co = getplayersao(ref);
 	if (co == NULL) return 0;
 	float yaw = luaL_checknumber(L, 2) * core::RADTODEG;
 	// Do it
-	co->setYaw(yaw);
+	co->setYawAndSend(yaw);
 	return 1;
 }
 
@@ -1109,7 +1180,7 @@ int ObjectRef::l_set_inventory_formspec(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL) return 0;
 	std::string formspec = luaL_checkstring(L, 2);
 
@@ -1124,7 +1195,7 @@ int ObjectRef::l_get_inventory_formspec(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL) return 0;
 
 	std::string formspec = player->inventory_formspec;
@@ -1137,13 +1208,13 @@ int ObjectRef::l_get_player_control(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL) {
 		lua_pushlstring(L, "", 0);
 		return 1;
 	}
-	// Do it
-	PlayerControl control = player->getPlayerControl();
+
+	const PlayerControl &control = player->getPlayerControl();
 	lua_newtable(L);
 	lua_pushboolean(L, control.up);
 	lua_setfield(L, -2, "up");
@@ -1171,7 +1242,7 @@ int ObjectRef::l_get_player_control_bits(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL) {
 		lua_pushlstring(L, "", 0);
 		return 1;
@@ -1186,7 +1257,7 @@ int ObjectRef::l_hud_add(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1249,7 +1320,7 @@ int ObjectRef::l_hud_remove(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1269,7 +1340,7 @@ int ObjectRef::l_hud_change(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1346,7 +1417,7 @@ int ObjectRef::l_hud_get(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1397,7 +1468,7 @@ int ObjectRef::l_hud_set_flags(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1423,7 +1494,7 @@ int ObjectRef::l_hud_get_flags(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1449,7 +1520,7 @@ int ObjectRef::l_hud_set_hotbar_itemcount(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1467,7 +1538,7 @@ int ObjectRef::l_hud_get_hotbar_itemcount(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1482,7 +1553,7 @@ int ObjectRef::l_hud_set_hotbar_image(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1497,7 +1568,7 @@ int ObjectRef::l_hud_get_hotbar_image(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1511,7 +1582,7 @@ int ObjectRef::l_hud_set_hotbar_selected_image(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1526,11 +1597,11 @@ int ObjectRef::l_hud_get_hotbar_selected_image(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
-	std::string name = getServer(L)->hudGetHotbarSelectedImage(player);
+	const std::string &name = getServer(L)->hudGetHotbarSelectedImage(player);
 	lua_pushlstring(L, name.c_str(), name.size());
 	return 1;
 }
@@ -1540,7 +1611,7 @@ int ObjectRef::l_set_sky(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1579,7 +1650,7 @@ int ObjectRef::l_get_sky(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 	video::SColor bgcolor(255, 255, 255, 255);
@@ -1607,7 +1678,7 @@ int ObjectRef::l_override_day_night_ratio(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1630,7 +1701,7 @@ int ObjectRef::l_get_day_night_ratio(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	ObjectRef *ref = checkobject(L, 1);
-	Player *player = getplayer(ref);
+	RemotePlayer *player = getplayer(ref);
 	if (player == NULL)
 		return 0;
 
@@ -1754,6 +1825,10 @@ const luaL_reg ObjectRef::methods[] = {
 	luamethod(ObjectRef, get_look_dir),
 	luamethod(ObjectRef, get_look_pitch),
 	luamethod(ObjectRef, get_look_yaw),
+	luamethod(ObjectRef, get_look_vertical),
+	luamethod(ObjectRef, get_look_horizontal),
+	luamethod(ObjectRef, set_look_horizontal),
+	luamethod(ObjectRef, set_look_vertical),
 	luamethod(ObjectRef, set_look_yaw),
 	luamethod(ObjectRef, set_look_pitch),
 	luamethod(ObjectRef, get_breath),
diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h
index a4457cc..09f10e4 100644
--- a/src/script/lua_api/l_object.h
+++ b/src/script/lua_api/l_object.h
@@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 class ServerActiveObject;
 class LuaEntitySAO;
 class PlayerSAO;
-class Player;
+class RemotePlayer;
 
 /*
 	ObjectRef
@@ -47,7 +47,7 @@ private:
 
 	static PlayerSAO* getplayersao(ObjectRef *ref);
 
-	static Player* getplayer(ObjectRef *ref);
+	static RemotePlayer *getplayer(ObjectRef *ref);
 
 	// Exported functions
 
@@ -189,15 +189,31 @@ private:
 	// get_look_dir(self)
 	static int l_get_look_dir(lua_State *L);
 
+	// DEPRECATED
 	// get_look_pitch(self)
 	static int l_get_look_pitch(lua_State *L);
 
+	// DEPRECATED
 	// get_look_yaw(self)
 	static int l_get_look_yaw(lua_State *L);
 
+	// get_look_pitch2(self)
+	static int l_get_look_vertical(lua_State *L);
+
+	// get_look_yaw2(self)
+	static int l_get_look_horizontal(lua_State *L);
+
+	// set_look_vertical(self, radians)
+	static int l_set_look_vertical(lua_State *L);
+
+	// set_look_horizontal(self, radians)
+	static int l_set_look_horizontal(lua_State *L);
+
+	// DEPRECATED
 	// set_look_pitch(self, radians)
 	static int l_set_look_pitch(lua_State *L);
 
+	// DEPRECATED
 	// set_look_yaw(self, radians)
 	static int l_set_look_yaw(lua_State *L);
 
diff --git a/src/script/lua_api/l_particles.cpp b/src/script/lua_api/l_particles.cpp
index f6c1725..667ac72 100644
--- a/src/script/lua_api/l_particles.cpp
+++ b/src/script/lua_api/l_particles.cpp
@@ -18,16 +18,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include "lua_api/l_particles.h"
+#include "lua_api/l_object.h"
 #include "lua_api/l_internal.h"
 #include "common/c_converter.h"
 #include "server.h"
+#include "particles.h"
 
 // add_particle({pos=, velocity=, acceleration=, expirationtime=,
-// 		size=, collisiondetection=, vertical=, texture=, player=})
+// 		size=, collisiondetection=, collision_removal=, vertical=,
+//		texture=, player=})
 // pos/velocity/acceleration = {x=num, y=num, z=num}
 // expirationtime = num (seconds)
 // size = num
 // collisiondetection = bool
+// collision_removal = bool
 // vertical = bool
 // texture = e.g."default_wood.png"
 int ModApiParticles::l_add_particle(lua_State *L)
@@ -41,8 +45,8 @@ int ModApiParticles::l_add_particle(lua_State *L)
 	float expirationtime, size;
 	expirationtime = size = 1;
 
-	bool collisiondetection, vertical;
-	collisiondetection = vertical = false;
+	bool collisiondetection, vertical, collision_removal;
+	collisiondetection = vertical = collision_removal = false;
 
 	std::string texture = "";
 	std::string playername = "";
@@ -94,12 +98,14 @@ int ModApiParticles::l_add_particle(lua_State *L)
 		size = getfloatfield_default(L, 1, "size", 1);
 		collisiondetection = getboolfield_default(L, 1,
 			"collisiondetection", collisiondetection);
+		collision_removal = getboolfield_default(L, 1,
+			"collision_removal", collision_removal);
 		vertical = getboolfield_default(L, 1, "vertical", vertical);
 		texture = getstringfield_default(L, 1, "texture", "");
 		playername = getstringfield_default(L, 1, "playername", "");
 	}
-	getServer(L)->spawnParticle(playername, pos, vel, acc,
-			expirationtime, size, collisiondetection, vertical, texture);
+	getServer(L)->spawnParticle(playername, pos, vel, acc, expirationtime, size,
+			collisiondetection, collision_removal, vertical, texture);
 	return 1;
 }
 
@@ -110,6 +116,7 @@ int ModApiParticles::l_add_particle(lua_State *L)
 //				minexptime=, maxexptime=,
 //				minsize=, maxsize=,
 //				collisiondetection=,
+//				collision_removal=,
 //				vertical=,
 //				texture=,
 //				player=})
@@ -117,6 +124,7 @@ int ModApiParticles::l_add_particle(lua_State *L)
 // minexptime/maxexptime = num (seconds)
 // minsize/maxsize = num
 // collisiondetection = bool
+// collision_removal = bool
 // vertical = bool
 // texture = e.g."default_wood.png"
 int ModApiParticles::l_add_particlespawner(lua_State *L)
@@ -129,8 +137,9 @@ int ModApiParticles::l_add_particlespawner(lua_State *L)
 	    minpos= maxpos= minvel= maxvel= minacc= maxacc= v3f(0, 0, 0);
 	float time, minexptime, maxexptime, minsize, maxsize;
 	      time= minexptime= maxexptime= minsize= maxsize= 1;
-	bool collisiondetection, vertical;
-	     collisiondetection= vertical= false;
+	bool collisiondetection, vertical, collision_removal;
+	     collisiondetection = vertical = collision_removal = false;
+	ServerActiveObject *attached = NULL;
 	std::string texture = "";
 	std::string playername = "";
 
@@ -189,6 +198,16 @@ int ModApiParticles::l_add_particlespawner(lua_State *L)
 		maxsize = getfloatfield_default(L, 1, "maxsize", maxsize);
 		collisiondetection = getboolfield_default(L, 1,
 			"collisiondetection", collisiondetection);
+		collision_removal = getboolfield_default(L, 1,
+			"collision_removal", collision_removal);
+
+		lua_getfield(L, 1, "attached");
+		if (!lua_isnil(L, -1)) {
+			ObjectRef *ref = ObjectRef::checkobject(L, -1);
+			lua_pop(L, 1);
+			attached = ObjectRef::getobject(ref);
+		}
+
 		vertical = getboolfield_default(L, 1, "vertical", vertical);
 		texture = getstringfield_default(L, 1, "texture", "");
 		playername = getstringfield_default(L, 1, "playername", "");
@@ -201,6 +220,8 @@ int ModApiParticles::l_add_particlespawner(lua_State *L)
 			minexptime, maxexptime,
 			minsize, maxsize,
 			collisiondetection,
+			collision_removal,
+			attached,
 			vertical,
 			texture, playername);
 	lua_pushnumber(L, id);
diff --git a/src/script/lua_api/l_server.cpp b/src/script/lua_api/l_server.cpp
index 59d3f5c..b6d44e0 100644
--- a/src/script/lua_api/l_server.cpp
+++ b/src/script/lua_api/l_server.cpp
@@ -45,6 +45,15 @@ int ModApiServer::l_get_server_status(lua_State *L)
 	return 1;
 }
 
+// get_server_uptime()
+int ModApiServer::l_get_server_uptime(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+	lua_pushnumber(L, getServer(L)->getUptime());
+	return 1;
+}
+
+
 // print(text)
 int ModApiServer::l_print(lua_State *L)
 {
@@ -106,7 +115,7 @@ int ModApiServer::l_get_player_ip(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	const char * name = luaL_checkstring(L, 1);
-	Player *player = getEnv(L)->getPlayer(name);
+	RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
 	if(player == NULL)
 	{
 		lua_pushnil(L); // no such player
@@ -133,9 +142,8 @@ int ModApiServer::l_get_player_information(lua_State *L)
 
 	NO_MAP_LOCK_REQUIRED;
 	const char * name = luaL_checkstring(L, 1);
-	Player *player = getEnv(L)->getPlayer(name);
-	if(player == NULL)
-	{
+	RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
+	if (player == NULL) {
 		lua_pushnil(L); // no such player
 		return 1;
 	}
@@ -278,15 +286,15 @@ int ModApiServer::l_ban_player(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	const char * name = luaL_checkstring(L, 1);
-	Player *player = getEnv(L)->getPlayer(name);
-	if(player == NULL)
-	{
+	RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
+	if (player == NULL) {
 		lua_pushboolean(L, false); // no such player
 		return 1;
 	}
 	try
 	{
-		Address addr = getServer(L)->getPeerAddress(getEnv(L)->getPlayer(name)->peer_id);
+		Address addr = getServer(L)->getPeerAddress(
+			dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name)->peer_id);
 		std::string ip_str = addr.serializeString();
 		getServer(L)->setIpBanned(ip_str, name);
 	}
@@ -314,9 +322,9 @@ int ModApiServer::l_kick_player(lua_State *L)
 	{
 		message = "Kicked.";
 	}
-	Player *player = getEnv(L)->getPlayer(name);
-	if (player == NULL)
-	{
+
+	RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
+	if (player == NULL) {
 		lua_pushboolean(L, false); // No such player
 		return 1;
 	}
@@ -508,6 +516,7 @@ void ModApiServer::Initialize(lua_State *L, int top)
 {
 	API_FCT(request_shutdown);
 	API_FCT(get_server_status);
+	API_FCT(get_server_uptime);
 	API_FCT(get_worldpath);
 	API_FCT(is_singleplayer);
 
diff --git a/src/script/lua_api/l_server.h b/src/script/lua_api/l_server.h
index 06a5ddc..1ad46d4 100644
--- a/src/script/lua_api/l_server.h
+++ b/src/script/lua_api/l_server.h
@@ -30,6 +30,9 @@ private:
 	// get_server_status()
 	static int l_get_server_status(lua_State *L);
 
+	// get_server_uptime()
+	static int l_get_server_uptime(lua_State *L);
+
 	// get_worldpath()
 	static int l_get_worldpath(lua_State *L);
 
diff --git a/src/script/lua_api/l_settings.cpp b/src/script/lua_api/l_settings.cpp
index 35b82b4..d3fe030 100644
--- a/src/script/lua_api/l_settings.cpp
+++ b/src/script/lua_api/l_settings.cpp
@@ -118,6 +118,11 @@ int LuaSettings::l_write(lua_State* L)
 	NO_MAP_LOCK_REQUIRED;
 	LuaSettings* o = checkobject(L, 1);
 
+	if (!o->m_write_allowed) {
+		throw LuaError("Settings: writing " + o->m_filename +
+				" not allowed with mod security on.");
+	}
+
 	bool success = o->m_settings->updateConfigFile(o->m_filename.c_str());
 	lua_pushboolean(L, success);
 
@@ -142,8 +147,9 @@ int LuaSettings::l_to_table(lua_State* L)
 	return 1;
 }
 
-LuaSettings::LuaSettings(const char* filename)
+LuaSettings::LuaSettings(const char* filename, bool write_allowed)
 {
+	m_write_allowed = write_allowed;
 	m_filename = std::string(filename);
 
 	m_settings = new Settings();
@@ -188,9 +194,10 @@ void LuaSettings::Register(lua_State* L)
 int LuaSettings::create_object(lua_State* L)
 {
 	NO_MAP_LOCK_REQUIRED;
+	bool write_allowed = true;
 	const char* filename = luaL_checkstring(L, 1);
-	CHECK_SECURE_PATH_OPTIONAL(L, filename);
-	LuaSettings* o = new LuaSettings(filename);
+	CHECK_SECURE_PATH_POSSIBLE_WRITE(L, filename, &write_allowed);
+	LuaSettings* o = new LuaSettings(filename, write_allowed);
 	*(void **)(lua_newuserdata(L, sizeof(void *))) = o;
 	luaL_getmetatable(L, className);
 	lua_setmetatable(L, -2);
diff --git a/src/script/lua_api/l_settings.h b/src/script/lua_api/l_settings.h
index cb0c09a..bca333e 100644
--- a/src/script/lua_api/l_settings.h
+++ b/src/script/lua_api/l_settings.h
@@ -53,11 +53,12 @@ private:
 	// to_table(self) -> {[key1]=value1,...}
 	static int l_to_table(lua_State* L);
 
+	bool m_write_allowed;
 	Settings* m_settings;
 	std::string m_filename;
 
 public:
-	LuaSettings(const char* filename);
+	LuaSettings(const char* filename, bool write_allowed);
 	~LuaSettings();
 
 	// LuaSettings(filename)
diff --git a/src/script/lua_api/l_util.cpp b/src/script/lua_api/l_util.cpp
index c3e6c89..26e2b98 100644
--- a/src/script/lua_api/l_util.cpp
+++ b/src/script/lua_api/l_util.cpp
@@ -23,7 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "common/c_content.h"
 #include "cpp_api/s_async.h"
 #include "serialization.h"
-#include "json/json.h"
+#include <json/json.h>
 #include "cpp_api/s_security.h"
 #include "porting.h"
 #include "debug.h"
@@ -32,8 +32,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "filesys.h"
 #include "settings.h"
 #include "util/auth.h"
+#include "util/base64.h"
+#include "config.h"
+#include "version.h"
 #include <algorithm>
 
+
 // log([level,] text)
 // Writes a line to the logger.
 // The one-argument version logs to infostream.
@@ -219,7 +223,7 @@ int ModApiUtil::l_write_json(lua_State *L)
 int ModApiUtil::l_get_dig_params(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
-	std::map<std::string, int> groups;
+	ItemGroupList groups;
 	read_groups(L, 1, groups);
 	ToolCapabilities tp = read_tool_capabilities(L, 2);
 	if(lua_isnoneornil(L, 3))
@@ -234,7 +238,7 @@ int ModApiUtil::l_get_dig_params(lua_State *L)
 int ModApiUtil::l_get_hit_params(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
-	std::map<std::string, int> groups;
+	UNORDERED_MAP<std::string, int> groups;
 	read_groups(L, 1, groups);
 	ToolCapabilities tp = read_tool_capabilities(L, 2);
 	if(lua_isnoneornil(L, 3))
@@ -245,6 +249,35 @@ int ModApiUtil::l_get_hit_params(lua_State *L)
 	return 1;
 }
 
+// check_password_entry(name, entry, password)
+int ModApiUtil::l_check_password_entry(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+	std::string name = luaL_checkstring(L, 1);
+	std::string entry = luaL_checkstring(L, 2);
+	std::string password = luaL_checkstring(L, 3);
+
+	if (base64_is_valid(entry)) {
+		std::string hash = translate_password(name, password);
+		lua_pushboolean(L, hash == entry);
+		return 1;
+	}
+
+	std::string salt;
+	std::string verifier;
+
+	if (!decode_srp_verifier_and_salt(entry, &verifier, &salt)) {
+		// invalid format
+		warningstream << "Invalid password format for " << name << std::endl;
+		lua_pushboolean(L, false);
+		return 1;
+	}
+	std::string gen_verifier = generate_srp_verifier(name, password, salt);
+
+	lua_pushboolean(L, gen_verifier == verifier);
+	return 1;
+}
+
 // get_password_hash(name, raw_password)
 int ModApiUtil::l_get_password_hash(lua_State *L)
 {
@@ -272,12 +305,14 @@ int ModApiUtil::l_is_yes(lua_State *L)
 	return 1;
 }
 
+// get_builtin_path()
 int ModApiUtil::l_get_builtin_path(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 
 	std::string path = porting::path_share + DIR_DELIM + "builtin";
 	lua_pushstring(L, path.c_str());
+
 	return 1;
 }
 
@@ -320,12 +355,40 @@ int ModApiUtil::l_decompress(lua_State *L)
 	return 1;
 }
 
+// encode_base64(string)
+int ModApiUtil::l_encode_base64(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+
+	size_t size;
+	const char *data = luaL_checklstring(L, 1, &size);
+
+	std::string out = base64_encode((const unsigned char *)(data), size);
+
+	lua_pushlstring(L, out.data(), out.size());
+	return 1;
+}
+
+// decode_base64(string)
+int ModApiUtil::l_decode_base64(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+
+	size_t size;
+	const char *data = luaL_checklstring(L, 1, &size);
+
+	std::string out = base64_decode(std::string(data, size));
+
+	lua_pushlstring(L, out.data(), out.size());
+	return 1;
+}
+
 // mkdir(path)
 int ModApiUtil::l_mkdir(lua_State *L)
 {
 	NO_MAP_LOCK_REQUIRED;
 	const char *path = luaL_checkstring(L, 1);
-	CHECK_SECURE_PATH_OPTIONAL(L, path);
+	CHECK_SECURE_PATH(L, path, true);
 	lua_pushboolean(L, fs::CreateAllDirs(path));
 	return 1;
 }
@@ -337,7 +400,7 @@ int ModApiUtil::l_get_dir_list(lua_State *L)
 	const char *path = luaL_checkstring(L, 1);
 	short is_dir = lua_isboolean(L, 2) ? lua_toboolean(L, 2) : -1;
 
-	CHECK_SECURE_PATH_OPTIONAL(L, path);
+	CHECK_SECURE_PATH(L, path, false);
 
 	std::vector<fs::DirListNode> list = fs::GetDirListing(path);
 
@@ -388,8 +451,9 @@ int ModApiUtil::l_request_insecure_environment(lua_State *L)
 	// Check secure.trusted_mods
 	const char *mod_name = lua_tostring(L, -1);
 	std::string trusted_mods = g_settings->get("secure.trusted_mods");
-	trusted_mods.erase(std::remove(trusted_mods.begin(),
-			trusted_mods.end(), ' '), trusted_mods.end());
+	trusted_mods.erase(std::remove_if(trusted_mods.begin(),
+			trusted_mods.end(), static_cast<int(*)(int)>(&std::isspace)),
+			trusted_mods.end());
 	std::vector<std::string> mod_list = str_split(trusted_mods, ',');
 	if (std::find(mod_list.begin(), mod_list.end(), mod_name) ==
 			mod_list.end()) {
@@ -401,6 +465,26 @@ int ModApiUtil::l_request_insecure_environment(lua_State *L)
 	return 1;
 }
 
+// get_version()
+int ModApiUtil::l_get_version(lua_State *L)
+{
+	lua_createtable(L, 0, 3);
+	int table = lua_gettop(L);
+
+	lua_pushstring(L, PROJECT_NAME_C);
+	lua_setfield(L, table, "project");
+
+	lua_pushstring(L, g_version_string);
+	lua_setfield(L, table, "string");
+
+	if (strcmp(g_version_string, g_version_hash)) {
+		lua_pushstring(L, g_version_hash);
+		lua_setfield(L, table, "hash");
+	}
+
+	return 1;
+}
+
 
 void ModApiUtil::Initialize(lua_State *L, int top)
 {
@@ -420,6 +504,7 @@ void ModApiUtil::Initialize(lua_State *L, int top)
 	API_FCT(get_dig_params);
 	API_FCT(get_hit_params);
 
+	API_FCT(check_password_entry);
 	API_FCT(get_password_hash);
 
 	API_FCT(is_yes);
@@ -433,6 +518,11 @@ void ModApiUtil::Initialize(lua_State *L, int top)
 	API_FCT(get_dir_list);
 
 	API_FCT(request_insecure_environment);
+
+	API_FCT(encode_base64);
+	API_FCT(decode_base64);
+
+	API_FCT(get_version);
 }
 
 void ModApiUtil::InitializeAsync(AsyncEngine& engine)
@@ -459,5 +549,10 @@ void ModApiUtil::InitializeAsync(AsyncEngine& engine)
 
 	ASYNC_API_FCT(mkdir);
 	ASYNC_API_FCT(get_dir_list);
+
+	ASYNC_API_FCT(encode_base64);
+	ASYNC_API_FCT(decode_base64);
+
+	ASYNC_API_FCT(get_version);
 }
 
diff --git a/src/script/lua_api/l_util.h b/src/script/lua_api/l_util.h
index 6fac7e7..9910704 100644
--- a/src/script/lua_api/l_util.h
+++ b/src/script/lua_api/l_util.h
@@ -71,6 +71,9 @@ private:
 	// get_hit_params(groups, tool_capabilities[, time_from_last_punch])
 	static int l_get_hit_params(lua_State *L);
 
+	// check_password_entry(name, entry, password)
+	static int l_check_password_entry(lua_State *L);
+
 	// get_password_hash(name, raw_password)
 	static int l_get_password_hash(lua_State *L);
 
@@ -95,6 +98,15 @@ private:
 	// request_insecure_environment()
 	static int l_request_insecure_environment(lua_State *L);
 
+	// encode_base64(string)
+	static int l_encode_base64(lua_State *L);
+
+	// decode_base64(string)
+	static int l_decode_base64(lua_State *L);
+
+	// get_version()
+	static int l_get_version(lua_State *L);
+
 public:
 	static void Initialize(lua_State *L, int top);
 
diff --git a/src/script/lua_api/l_vmanip.cpp b/src/script/lua_api/l_vmanip.cpp
index f138664..bdf720f 100644
--- a/src/script/lua_api/l_vmanip.cpp
+++ b/src/script/lua_api/l_vmanip.cpp
@@ -190,7 +190,7 @@ int LuaVoxelManip::l_calc_lighting(lua_State *L)
 	Mapgen mg;
 	mg.vm          = vm;
 	mg.ndef        = ndef;
-	mg.water_level = emerge->params.water_level;
+	mg.water_level = emerge->mgparams->water_level;
 
 	mg.calcLighting(pmin, pmax, fpmin, fpmax, propagate_shadow);
 
@@ -277,11 +277,17 @@ int LuaVoxelManip::l_get_param2_data(lua_State *L)
 	NO_MAP_LOCK_REQUIRED;
 
 	LuaVoxelManip *o = checkobject(L, 1);
+	bool use_buffer  = lua_istable(L, 2);
+
 	MMVManip *vm = o->vm;
 
 	u32 volume = vm->m_area.getVolume();
 
-	lua_newtable(L);
+	if (use_buffer)
+		lua_pushvalue(L, 2);
+	else
+		lua_newtable(L);
+
 	for (u32 i = 0; i != volume; i++) {
 		lua_Integer param2 = vm->m_data[i].param2;
 		lua_pushinteger(L, param2);
diff --git a/src/serialization.cpp b/src/serialization.cpp
index 79f66fc..d30e837 100644
--- a/src/serialization.cpp
+++ b/src/serialization.cpp
@@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "serialization.h"
 
 #include "util/serialize.h"
-#ifdef _WIN32
+#if defined(_WIN32) && !defined(WIN32_NO_ZLIB_WINAPI)
 	#define ZLIB_WINAPI
 #endif
 #include "zlib.h"
diff --git a/src/server.cpp b/src/server.cpp
index a3b686c..c9d5c71 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -184,9 +184,7 @@ Server::Server(
 {
 	m_liquid_transform_timer = 0.0;
 	m_liquid_transform_every = 1.0;
-	m_print_info_timer = 0.0;
 	m_masterserver_timer = 0.0;
-	m_objectdata_timer = 0.0;
 	m_emergethread_trigger_timer = 0.0;
 	m_savemap_timer = 0.0;
 
@@ -266,9 +264,6 @@ Server::Server(
 	//lock environment
 	MutexAutoLock envlock(m_env_mutex);
 
-	// Load mapgen params from Settings
-	m_emerge->loadMapgenParams();
-
 	// Create the Map (loads map_meta.txt, overriding configured mapgen params)
 	ServerMap *servermap = new ServerMap(path_world, this, m_emerge);
 
@@ -331,8 +326,11 @@ Server::Server(
 
 	m_clients.setEnv(m_env);
 
+	if (!servermap->settings_mgr.makeMapgenParams())
+		FATAL_ERROR("Couldn't create any mapgen type");
+
 	// Initialize mapgens
-	m_emerge->initMapgens();
+	m_emerge->initMapgens(servermap->getMapgenParams());
 
 	m_enable_rollback_recording = g_settings->getBool("enable_rollback_recording");
 	if (m_enable_rollback_recording) {
@@ -358,6 +356,7 @@ Server::Server(
 	add_legacy_abms(m_env, m_nodedef);
 
 	m_liquid_transform_every = g_settings->getFloat("liquid_update");
+	m_max_chatmessage_length = g_settings->getU16("chat_message_max_size");
 }
 
 Server::~Server()
@@ -402,11 +401,8 @@ Server::~Server()
 	m_emerge->stopThreads();
 
 	// Delete things in the reverse order of creation
-	delete m_env;
-
-	// N.B. the EmergeManager should be deleted after the Environment since Map
-	// depends on EmergeManager to write its current params to the map meta
 	delete m_emerge;
+	delete m_env;
 	delete m_rollback;
 	delete m_banmanager;
 	delete m_event;
@@ -655,7 +651,7 @@ void Server::AsyncRunStep(bool initial_step)
 					m_env->getGameTime(),
 					m_lag,
 					m_gamespec.id,
-					m_emerge->params.mg_name,
+					Mapgen::getMapgenName(m_emerge->mgparams->mgtype),
 					m_mods);
 			counter = 0.01;
 		}
@@ -671,7 +667,7 @@ void Server::AsyncRunStep(bool initial_step)
 		MutexAutoLock envlock(m_env_mutex);
 
 		m_clients.lock();
-		std::map<u16, RemoteClient*> clients = m_clients.getClientList();
+		UNORDERED_MAP<u16, RemoteClient*> clients = m_clients.getClientList();
 		ScopeProfiler sp(g_profiler, "Server: checking added and deleted objs");
 
 		// Radius inside which objects are active
@@ -687,8 +683,7 @@ void Server::AsyncRunStep(bool initial_step)
 		if (player_radius == 0 && is_transfer_limited)
 			player_radius = radius;
 
-		for (std::map<u16, RemoteClient*>::iterator
-			i = clients.begin();
+		for (UNORDERED_MAP<u16, RemoteClient*>::iterator i = clients.begin();
 			i != clients.end(); ++i) {
 			RemoteClient *client = i->second;
 
@@ -697,8 +692,8 @@ void Server::AsyncRunStep(bool initial_step)
 			if (client->getState() < CS_DefinitionsSent)
 				continue;
 
-			Player *player = m_env->getPlayer(client->peer_id);
-			if(player == NULL) {
+			RemotePlayer *player = m_env->getPlayer(client->peer_id);
+			if (player == NULL) {
 				// This can happen if the client timeouts somehow
 				/*warningstream<<FUNCTION_NAME<<": Client "
 						<<client->peer_id
@@ -706,11 +701,19 @@ void Server::AsyncRunStep(bool initial_step)
 				continue;
 			}
 
+			PlayerSAO *playersao = player->getPlayerSAO();
+			if (playersao == NULL)
+				continue;
+
+			s16 my_radius = MYMIN(radius, playersao->getWantedRange() * MAP_BLOCKSIZE);
+			if (my_radius <= 0) my_radius = radius;
+			//infostream << "Server: Active Radius " << my_radius << std::endl;
+
 			std::queue<u16> removed_objects;
 			std::queue<u16> added_objects;
-			m_env->getRemovedActiveObjects(player, radius, player_radius,
+			m_env->getRemovedActiveObjects(playersao, my_radius, player_radius,
 					client->m_known_objects, removed_objects);
-			m_env->getAddedActiveObjects(player, radius, player_radius,
+			m_env->getAddedActiveObjects(playersao, my_radius, player_radius,
 					client->m_known_objects, added_objects);
 
 			// Ignore if nothing happened
@@ -797,7 +800,7 @@ void Server::AsyncRunStep(bool initial_step)
 
 		// Key = object id
 		// Value = data sent by object
-		std::map<u16, std::vector<ActiveObjectMessage>* > buffered_messages;
+		UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* > buffered_messages;
 
 		// Get active object messages from environment
 		for(;;) {
@@ -806,7 +809,7 @@ void Server::AsyncRunStep(bool initial_step)
 				break;
 
 			std::vector<ActiveObjectMessage>* message_list = NULL;
-			std::map<u16, std::vector<ActiveObjectMessage>* >::iterator n;
+			UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* >::iterator n;
 			n = buffered_messages.find(aom.id);
 			if (n == buffered_messages.end()) {
 				message_list = new std::vector<ActiveObjectMessage>;
@@ -819,16 +822,15 @@ void Server::AsyncRunStep(bool initial_step)
 		}
 
 		m_clients.lock();
-		std::map<u16, RemoteClient*> clients = m_clients.getClientList();
+		UNORDERED_MAP<u16, RemoteClient*> clients = m_clients.getClientList();
 		// Route data to every client
-		for (std::map<u16, RemoteClient*>::iterator
-			i = clients.begin();
+		for (UNORDERED_MAP<u16, RemoteClient*>::iterator i = clients.begin();
 			i != clients.end(); ++i) {
 			RemoteClient *client = i->second;
 			std::string reliable_data;
 			std::string unreliable_data;
 			// Go through all objects in message buffer
-			for (std::map<u16, std::vector<ActiveObjectMessage>* >::iterator
+			for (UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* >::iterator
 					j = buffered_messages.begin();
 					j != buffered_messages.end(); ++j) {
 				// If object is not known by client, skip it
@@ -872,7 +874,7 @@ void Server::AsyncRunStep(bool initial_step)
 		m_clients.unlock();
 
 		// Clear buffered_messages
-		for(std::map<u16, std::vector<ActiveObjectMessage>* >::iterator
+		for (UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* >::iterator
 				i = buffered_messages.begin();
 				i != buffered_messages.end(); ++i) {
 			delete i->second;
@@ -1114,30 +1116,13 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id)
 	SendPlayerBreath(peer_id);
 
 	// Show death screen if necessary
-	if(player->isDead())
+	if (playersao->isDead())
 		SendDeathscreen(peer_id, false, v3f(0,0,0));
 
 	// Note things in chat if not in simple singleplayer mode
 	if(!m_simple_singleplayer_mode) {
 		// Send information about server to player in chat
 		SendChatMessage(peer_id, getStatusString());
-
-		// Send information about joining in chat
-		{
-			std::string name = "unknown";
-			Player *player = m_env->getPlayer(peer_id);
-			if(player != NULL)
-				name = player->getName();
-
-			std::wstring message;
-			message += L"*** ";
-			message += narrow_to_wide(name);
-			message += L" joined the game.";
-			SendChatMessage(PEER_ID_INEXISTENT,message);
-			if (m_admin_chat)
-				m_admin_chat->outgoing_queue.push_back(
-					new ChatEventNick(CET_NICK_ADD, name));
-		}
 	}
 	Address addr = getPeerAddress(player->peer_id);
 	std::string ip_str = addr.serializeString();
@@ -1146,11 +1131,11 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id)
 		Print out action
 	*/
 	{
-		std::vector<std::string> names = m_clients.getPlayerNames();
+		const std::vector<std::string> &names = m_clients.getPlayerNames();
 
-		actionstream<<player->getName() <<" joins game. List of players: ";
+		actionstream << player->getName() << " joins game. List of players: ";
 
-		for (std::vector<std::string>::iterator i = names.begin();
+		for (std::vector<std::string>::const_iterator i = names.begin();
 				i != names.end(); ++i) {
 			actionstream << *i << " ";
 		}
@@ -1277,7 +1262,7 @@ Inventory* Server::getInventory(const InventoryLocation &loc)
 		break;
 	case InventoryLocation::PLAYER:
 	{
-		Player *player = m_env->getPlayer(loc.name.c_str());
+		RemotePlayer *player = dynamic_cast<RemotePlayer *>(m_env->getPlayer(loc.name.c_str()));
 		if(!player)
 			return NULL;
 		PlayerSAO *playersao = player->getPlayerSAO();
@@ -1317,9 +1302,12 @@ void Server::setInventoryModified(const InventoryLocation &loc, bool playerSend)
 		if (!playerSend)
 			return;
 
-		Player *player = m_env->getPlayer(loc.name.c_str());
-		if(!player)
+		RemotePlayer *player =
+			dynamic_cast<RemotePlayer *>(m_env->getPlayer(loc.name.c_str()));
+
+		if (!player)
 			return;
+
 		PlayerSAO *playersao = player->getPlayerSAO();
 		if(!playersao)
 			return;
@@ -1663,8 +1651,12 @@ void Server::SendShowFormspecMessage(u16 peer_id, const std::string &formspec,
 	DSTACK(FUNCTION_NAME);
 
 	NetworkPacket pkt(TOCLIENT_SHOW_FORMSPEC, 0 , peer_id);
-
-	pkt.putLongString(FORMSPEC_VERSION_STRING + formspec);
+	if (formspec == "" ){
+		//the client should close the formspec
+		pkt.putLongString("");
+	} else {
+		pkt.putLongString(FORMSPEC_VERSION_STRING + formspec);
+	}
 	pkt << formname;
 
 	Send(&pkt);
@@ -1673,7 +1665,8 @@ void Server::SendShowFormspecMessage(u16 peer_id, const std::string &formspec,
 // Spawns a particle on peer with peer_id
 void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f acceleration,
 				float expirationtime, float size, bool collisiondetection,
-				bool vertical, std::string texture)
+				bool collision_removal,
+				bool vertical, const std::string &texture)
 {
 	DSTACK(FUNCTION_NAME);
 
@@ -1683,6 +1676,7 @@ void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f accelerat
 			<< size << collisiondetection;
 	pkt.putLongString(texture);
 	pkt << vertical;
+	pkt << collision_removal;
 
 	if (peer_id != PEER_ID_INEXISTENT) {
 		Send(&pkt);
@@ -1695,7 +1689,8 @@ void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f accelerat
 // Adds a ParticleSpawner on peer with peer_id
 void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3f minpos, v3f maxpos,
 	v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, float minexptime, float maxexptime,
-	float minsize, float maxsize, bool collisiondetection, bool vertical, std::string texture, u32 id)
+	float minsize, float maxsize, bool collisiondetection, bool collision_removal,
+	u16 attached_id, bool vertical, const std::string &texture, u32 id)
 {
 	DSTACK(FUNCTION_NAME);
 
@@ -1708,6 +1703,8 @@ void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3
 	pkt.putLongString(texture);
 
 	pkt << id << vertical;
+	pkt << collision_removal;
+	pkt << attached_id;
 
 	if (peer_id != PEER_ID_INEXISTENT) {
 		Send(&pkt);
@@ -1873,20 +1870,20 @@ void Server::SendPlayerBreath(u16 peer_id)
 void Server::SendMovePlayer(u16 peer_id)
 {
 	DSTACK(FUNCTION_NAME);
-	Player *player = m_env->getPlayer(peer_id);
+	RemotePlayer *player = m_env->getPlayer(peer_id);
 	assert(player);
+	PlayerSAO *sao = player->getPlayerSAO();
+	assert(sao);
 
 	NetworkPacket pkt(TOCLIENT_MOVE_PLAYER, sizeof(v3f) + sizeof(f32) * 2, peer_id);
-	pkt << player->getPosition() << player->getPitch() << player->getYaw();
+	pkt << sao->getBasePosition() << sao->getPitch() << sao->getYaw();
 
 	{
-		v3f pos = player->getPosition();
-		f32 pitch = player->getPitch();
-		f32 yaw = player->getYaw();
+		v3f pos = sao->getBasePosition();
 		verbosestream << "Server: Sending TOCLIENT_MOVE_PLAYER"
 				<< " pos=(" << pos.X << "," << pos.Y << "," << pos.Z << ")"
-				<< " pitch=" << pitch
-				<< " yaw=" << yaw
+				<< " pitch=" << sao->getPitch()
+				<< " yaw=" << sao->getYaw()
 				<< std::endl;
 	}
 
@@ -1912,7 +1909,7 @@ void Server::SendEyeOffset(u16 peer_id, v3f first, v3f third)
 }
 void Server::SendPlayerPrivileges(u16 peer_id)
 {
-	Player *player = m_env->getPlayer(peer_id);
+	RemotePlayer *player = m_env->getPlayer(peer_id);
 	assert(player);
 	if(player->peer_id == PEER_ID_INEXISTENT)
 		return;
@@ -1933,7 +1930,7 @@ void Server::SendPlayerPrivileges(u16 peer_id)
 
 void Server::SendPlayerInventoryFormspec(u16 peer_id)
 {
-	Player *player = m_env->getPlayer(peer_id);
+	RemotePlayer *player = m_env->getPlayer(peer_id);
 	assert(player);
 	if(player->peer_id == PEER_ID_INEXISTENT)
 		return;
@@ -1978,7 +1975,7 @@ s32 Server::playSound(const SimpleSoundSpec &spec,
 	std::vector<u16> dst_clients;
 	if(params.to_player != "")
 	{
-		Player *player = m_env->getPlayer(params.to_player.c_str());
+		RemotePlayer *player = m_env->getPlayer(params.to_player.c_str());
 		if(!player){
 			infostream<<"Server::playSound: Player \""<<params.to_player
 					<<"\" not found"<<std::endl;
@@ -1994,14 +1991,17 @@ s32 Server::playSound(const SimpleSoundSpec &spec,
 	else {
 		std::vector<u16> clients = m_clients.getClientIDs();
 
-		for(std::vector<u16>::iterator
-				i = clients.begin(); i != clients.end(); ++i) {
-			Player *player = m_env->getPlayer(*i);
-			if(!player)
+		for (std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) {
+			RemotePlayer *player = m_env->getPlayer(*i);
+			if (!player)
 				continue;
 
-			if(pos_exists) {
-				if(player->getPosition().getDistanceFrom(pos) >
+			PlayerSAO *sao = player->getPlayerSAO();
+			if (!sao)
+				continue;
+
+			if (pos_exists) {
+				if(sao->getBasePosition().getDistanceFrom(pos) >
 						params.max_hear_distance)
 					continue;
 			}
@@ -2033,16 +2033,15 @@ s32 Server::playSound(const SimpleSoundSpec &spec,
 void Server::stopSound(s32 handle)
 {
 	// Get sound reference
-	std::map<s32, ServerPlayingSound>::iterator i =
-			m_playing_sounds.find(handle);
-	if(i == m_playing_sounds.end())
+	UNORDERED_MAP<s32, ServerPlayingSound>::iterator i = m_playing_sounds.find(handle);
+	if (i == m_playing_sounds.end())
 		return;
 	ServerPlayingSound &psound = i->second;
 
 	NetworkPacket pkt(TOCLIENT_STOP_SOUND, 4);
 	pkt << handle;
 
-	for(std::set<u16>::iterator i = psound.clients.begin();
+	for (UNORDERED_SET<u16>::iterator i = psound.clients.begin();
 			i != psound.clients.end(); ++i) {
 		// Send as reliable
 		m_clients.send(*i, 0, &pkt, true);
@@ -2061,14 +2060,17 @@ void Server::sendRemoveNode(v3s16 p, u16 ignore_id,
 	pkt << p;
 
 	std::vector<u16> clients = m_clients.getClientIDs();
-	for(std::vector<u16>::iterator i = clients.begin();
-		i != clients.end(); ++i) {
+	for (std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) {
 		if (far_players) {
 			// Get player
-			if(Player *player = m_env->getPlayer(*i)) {
+			if (RemotePlayer *player = m_env->getPlayer(*i)) {
+				PlayerSAO *sao = player->getPlayerSAO();
+				if (!sao)
+					continue;
+
 				// If player is far away, only set modified blocks not sent
-				v3f player_pos = player->getPosition();
-				if(player_pos.getDistanceFrom(p_f) > maxd) {
+				v3f player_pos = sao->getBasePosition();
+				if (player_pos.getDistanceFrom(p_f) > maxd) {
 					far_players->push_back(*i);
 					continue;
 				}
@@ -2088,14 +2090,16 @@ void Server::sendAddNode(v3s16 p, MapNode n, u16 ignore_id,
 	v3f p_f = intToFloat(p, BS);
 
 	std::vector<u16> clients = m_clients.getClientIDs();
-	for(std::vector<u16>::iterator i = clients.begin();
-			i != clients.end(); ++i) {
-
-		if(far_players) {
+	for(std::vector<u16>::iterator i = clients.begin();	i != clients.end(); ++i) {
+		if (far_players) {
 			// Get player
-			if(Player *player = m_env->getPlayer(*i)) {
+			if (RemotePlayer *player = m_env->getPlayer(*i)) {
+				PlayerSAO *sao = player->getPlayerSAO();
+				if (!sao)
+					continue;
+
 				// If player is far away, only set modified blocks not sent
-				v3f player_pos = player->getPosition();
+				v3f player_pos = sao->getBasePosition();
 				if(player_pos.getDistanceFrom(p_f) > maxd) {
 					far_players->push_back(*i);
 					continue;
@@ -2339,7 +2343,7 @@ void Server::sendMediaAnnouncement(u16 peer_id)
 	NetworkPacket pkt(TOCLIENT_ANNOUNCE_MEDIA, 0, peer_id);
 	pkt << (u16) m_media.size();
 
-	for (std::map<std::string, MediaInfo>::iterator i = m_media.begin();
+	for (UNORDERED_MAP<std::string, MediaInfo>::iterator i = m_media.begin();
 			i != m_media.end(); ++i) {
 		pkt << i->first << i->second.sha1_digest;
 	}
@@ -2384,7 +2388,7 @@ void Server::sendRequestedMedia(u16 peer_id,
 			i != tosend.end(); ++i) {
 		const std::string &name = *i;
 
-		if(m_media.find(name) == m_media.end()) {
+		if (m_media.find(name) == m_media.end()) {
 			errorstream<<"Server::sendRequestedMedia(): Client asked for "
 					<<"unknown file \""<<(name)<<"\""<<std::endl;
 			continue;
@@ -2487,11 +2491,16 @@ void Server::sendDetachedInventory(const std::string &name, u16 peer_id)
 	NetworkPacket pkt(TOCLIENT_DETACHED_INVENTORY, 0, peer_id);
 	pkt.putRawString(s.c_str(), s.size());
 
-	if (peer_id != PEER_ID_INEXISTENT) {
-		Send(&pkt);
-	}
-	else {
-		m_clients.sendToAll(0, &pkt, true);
+	const std::string &check = m_detached_inventories_player[name];
+	if (peer_id == PEER_ID_INEXISTENT) {
+		if (check == "")
+			return m_clients.sendToAll(0, &pkt, true);
+		RemotePlayer *p = m_env->getPlayer(check.c_str());
+		if (p)
+			m_clients.send(p->peer_id, 0, &pkt, true);
+	} else {
+		if (check == "" || getPlayerName(peer_id) == check)
+			Send(&pkt);
 	}
 }
 
@@ -2645,44 +2654,26 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason)
 		/*
 			Clear references to playing sounds
 		*/
-		for(std::map<s32, ServerPlayingSound>::iterator
-				i = m_playing_sounds.begin();
-				i != m_playing_sounds.end();)
-		{
+		for (UNORDERED_MAP<s32, ServerPlayingSound>::iterator
+				 i = m_playing_sounds.begin(); i != m_playing_sounds.end();) {
 			ServerPlayingSound &psound = i->second;
 			psound.clients.erase(peer_id);
-			if(psound.clients.empty())
+			if (psound.clients.empty())
 				m_playing_sounds.erase(i++);
 			else
 				++i;
 		}
 
-		Player *player = m_env->getPlayer(peer_id);
-
-		// Collect information about leaving in chat
-		{
-			if(player != NULL && reason != CDR_DENY)
-			{
-				std::wstring name = narrow_to_wide(player->getName());
-				message += L"*** ";
-				message += name;
-				message += L" left the game.";
-				if(reason == CDR_TIMEOUT)
-					message += L" (timed out)";
-			}
-		}
+		RemotePlayer *player = m_env->getPlayer(peer_id);
 
 		/* Run scripts and remove from environment */
-		{
-			if(player != NULL)
-			{
-				PlayerSAO *playersao = player->getPlayerSAO();
-				assert(playersao);
+		if (player != NULL) {
+			PlayerSAO *playersao = player->getPlayerSAO();
+			assert(playersao);
 
-				m_script->on_leaveplayer(playersao);
+			m_script->on_leaveplayer(playersao, reason == CDR_TIMEOUT);
 
-				playersao->disconnected();
-			}
+			playersao->disconnected();
 		}
 
 		/*
@@ -2696,8 +2687,8 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason)
 				for(std::vector<u16>::iterator i = clients.begin();
 					i != clients.end(); ++i) {
 					// Get player
-					Player *player = m_env->getPlayer(*i);
-					if(!player)
+					RemotePlayer *player = m_env->getPlayer(*i);
+					if (!player)
 						continue;
 
 					// Get name of player
@@ -2724,7 +2715,7 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason)
 		SendChatMessage(PEER_ID_INEXISTENT,message);
 }
 
-void Server::UpdateCrafting(Player* player)
+void Server::UpdateCrafting(RemotePlayer *player)
 {
 	DSTACK(FUNCTION_NAME);
 
@@ -2734,7 +2725,8 @@ void Server::UpdateCrafting(Player* player)
 	loc.setPlayer(player->getName());
 	std::vector<ItemStack> output_replacements;
 	getCraftingResult(&player->inventory, preview, output_replacements, false, this);
-	m_env->getScriptIface()->item_CraftPredict(preview, player->getPlayerSAO(), (&player->inventory)->getList("craft"), loc);
+	m_env->getScriptIface()->item_CraftPredict(preview, player->getPlayerSAO(),
+			(&player->inventory)->getList("craft"), loc);
 
 	// Put the new preview in
 	InventoryList *plist = player->inventory.getList("craftpreview");
@@ -2763,8 +2755,7 @@ void Server::handleChatInterfaceEvent(ChatEvent *evt)
 }
 
 std::wstring Server::handleChat(const std::string &name, const std::wstring &wname,
-	const std::wstring &wmessage, bool check_shout_priv,
-	u16 peer_id_to_avoid_sending)
+	const std::wstring &wmessage, bool check_shout_priv, RemotePlayer *player)
 {
 	// If something goes wrong, this player is to blame
 	RollbackScopeActor rollback_scope(m_rollback,
@@ -2782,6 +2773,28 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna
 	if (ate)
 		return L"";
 
+	if (player) {
+		switch (player->canSendChatMessage()) {
+			case RPLAYER_CHATRESULT_FLOODING: {
+				std::wstringstream ws;
+				ws << L"You cannot send more messages. You are limited to "
+				<< g_settings->getFloat("chat_message_limit_per_10sec")
+				<< L" messages per 10 seconds.";
+				return ws.str();
+			}
+			case RPLAYER_CHATRESULT_KICK:
+				DenyAccess_Legacy(player->peer_id, L"You have been kicked due to message flooding.");
+				return L"";
+			case RPLAYER_CHATRESULT_OK: break;
+			default: FATAL_ERROR("Unhandled chat filtering result found.");
+		}
+	}
+
+	if (m_max_chatmessage_length > 0 && wmessage.length() > m_max_chatmessage_length) {
+		return L"Your message exceed the maximum chat message limit set on the server. "
+			L"It was refused. Send a shorter message";
+	}
+
 	// Commands are implemented in Lua, so only catch invalid
 	// commands that were not "eaten" and send an error back
 	if (wmessage[0] == L'/') {
@@ -2816,6 +2829,7 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna
 
 		std::vector<u16> clients = m_clients.getClientIDs();
 
+		u16 peer_id_to_avoid_sending = (player ? player->peer_id : PEER_ID_INEXISTENT);
 		for (u16 i = 0; i < clients.size(); i++) {
 			u16 cid = clients[i];
 			if (cid != peer_id_to_avoid_sending)
@@ -2854,16 +2868,16 @@ RemoteClient* Server::getClientNoEx(u16 peer_id, ClientState state_min)
 
 std::string Server::getPlayerName(u16 peer_id)
 {
-	Player *player = m_env->getPlayer(peer_id);
-	if(player == NULL)
+	RemotePlayer *player = m_env->getPlayer(peer_id);
+	if (player == NULL)
 		return "[id="+itos(peer_id)+"]";
 	return player->getName();
 }
 
 PlayerSAO* Server::getPlayerSAO(u16 peer_id)
 {
-	Player *player = m_env->getPlayer(peer_id);
-	if(player == NULL)
+	RemotePlayer *player = m_env->getPlayer(peer_id);
+	if (player == NULL)
 		return NULL;
 	return player->getPlayerSAO();
 }
@@ -2882,13 +2896,12 @@ std::wstring Server::getStatusString()
 	bool first = true;
 	os<<L", clients={";
 	std::vector<u16> clients = m_clients.getClientIDs();
-	for(std::vector<u16>::iterator i = clients.begin();
-		i != clients.end(); ++i) {
+	for (std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) {
 		// Get player
-		Player *player = m_env->getPlayer(*i);
+		RemotePlayer *player = m_env->getPlayer(*i);
 		// Get name of player
 		std::wstring name = L"unknown";
-		if(player != NULL)
+		if (player != NULL)
 			name = narrow_to_wide(player->getName());
 		// Add name to information string
 		if(!first)
@@ -2924,12 +2937,12 @@ void Server::reportPrivsModified(const std::string &name)
 		std::vector<u16> clients = m_clients.getClientIDs();
 		for(std::vector<u16>::iterator i = clients.begin();
 				i != clients.end(); ++i) {
-			Player *player = m_env->getPlayer(*i);
+			RemotePlayer *player = m_env->getPlayer(*i);
 			reportPrivsModified(player->getName());
 		}
 	} else {
-		Player *player = m_env->getPlayer(name.c_str());
-		if(!player)
+		RemotePlayer *player = m_env->getPlayer(name.c_str());
+		if (!player)
 			return;
 		SendPlayerPrivileges(player->peer_id);
 		PlayerSAO *sao = player->getPlayerSAO();
@@ -2943,8 +2956,8 @@ void Server::reportPrivsModified(const std::string &name)
 
 void Server::reportInventoryFormspecModified(const std::string &name)
 {
-	Player *player = m_env->getPlayer(name.c_str());
-	if(!player)
+	RemotePlayer *player = m_env->getPlayer(name.c_str());
+	if (!player)
 		return;
 	SendPlayerInventoryFormspec(player->peer_id);
 }
@@ -2974,7 +2987,7 @@ void Server::notifyPlayer(const char *name, const std::wstring &msg)
 		m_admin_chat->outgoing_queue.push_back(new ChatEventChat("", msg));
 	}
 
-	Player *player = m_env->getPlayer(name);
+	RemotePlayer *player = m_env->getPlayer(name);
 	if (!player) {
 		return;
 	}
@@ -2992,7 +3005,7 @@ bool Server::showFormspec(const char *playername, const std::string &formspec,
 	if (!m_env)
 		return false;
 
-	Player *player = m_env->getPlayer(playername);
+	RemotePlayer *player = m_env->getPlayer(playername);
 	if (!player)
 		return false;
 
@@ -3000,7 +3013,7 @@ bool Server::showFormspec(const char *playername, const std::string &formspec,
 	return true;
 }
 
-u32 Server::hudAdd(Player *player, HudElement *form)
+u32 Server::hudAdd(RemotePlayer *player, HudElement *form)
 {
 	if (!player)
 		return -1;
@@ -3012,7 +3025,7 @@ u32 Server::hudAdd(Player *player, HudElement *form)
 	return id;
 }
 
-bool Server::hudRemove(Player *player, u32 id) {
+bool Server::hudRemove(RemotePlayer *player, u32 id) {
 	if (!player)
 		return false;
 
@@ -3027,7 +3040,7 @@ bool Server::hudRemove(Player *player, u32 id) {
 	return true;
 }
 
-bool Server::hudChange(Player *player, u32 id, HudElementStat stat, void *data)
+bool Server::hudChange(RemotePlayer *player, u32 id, HudElementStat stat, void *data)
 {
 	if (!player)
 		return false;
@@ -3036,7 +3049,7 @@ bool Server::hudChange(Player *player, u32 id, HudElementStat stat, void *data)
 	return true;
 }
 
-bool Server::hudSetFlags(Player *player, u32 flags, u32 mask)
+bool Server::hudSetFlags(RemotePlayer *player, u32 flags, u32 mask)
 {
 	if (!player)
 		return false;
@@ -3054,10 +3067,11 @@ bool Server::hudSetFlags(Player *player, u32 flags, u32 mask)
 	return true;
 }
 
-bool Server::hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount)
+bool Server::hudSetHotbarItemcount(RemotePlayer *player, s32 hotbar_itemcount)
 {
 	if (!player)
 		return false;
+
 	if (hotbar_itemcount <= 0 || hotbar_itemcount > HUD_HOTBAR_ITEMCOUNT_MAX)
 		return false;
 
@@ -3068,14 +3082,7 @@ bool Server::hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount)
 	return true;
 }
 
-s32 Server::hudGetHotbarItemcount(Player *player)
-{
-	if (!player)
-		return 0;
-	return player->getHotbarItemcount();
-}
-
-void Server::hudSetHotbarImage(Player *player, std::string name)
+void Server::hudSetHotbarImage(RemotePlayer *player, std::string name)
 {
 	if (!player)
 		return;
@@ -3084,14 +3091,14 @@ void Server::hudSetHotbarImage(Player *player, std::string name)
 	SendHUDSetParam(player->peer_id, HUD_PARAM_HOTBAR_IMAGE, name);
 }
 
-std::string Server::hudGetHotbarImage(Player *player)
+std::string Server::hudGetHotbarImage(RemotePlayer *player)
 {
 	if (!player)
 		return "";
 	return player->getHotbarImage();
 }
 
-void Server::hudSetHotbarSelectedImage(Player *player, std::string name)
+void Server::hudSetHotbarSelectedImage(RemotePlayer *player, std::string name)
 {
 	if (!player)
 		return;
@@ -3100,16 +3107,8 @@ void Server::hudSetHotbarSelectedImage(Player *player, std::string name)
 	SendHUDSetParam(player->peer_id, HUD_PARAM_HOTBAR_SELECTED_IMAGE, name);
 }
 
-std::string Server::hudGetHotbarSelectedImage(Player *player)
-{
-	if (!player)
-		return "";
-
-	return player->getHotbarSelectedImage();
-}
-
-bool Server::setLocalPlayerAnimations(Player *player,
-	v2s32 animation_frames[4], f32 frame_speed)
+bool Server::setLocalPlayerAnimations(RemotePlayer *player,
+		v2s32 animation_frames[4], f32 frame_speed)
 {
 	if (!player)
 		return false;
@@ -3119,7 +3118,7 @@ bool Server::setLocalPlayerAnimations(Player *player,
 	return true;
 }
 
-bool Server::setPlayerEyeOffset(Player *player, v3f first, v3f third)
+bool Server::setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third)
 {
 	if (!player)
 		return false;
@@ -3130,7 +3129,7 @@ bool Server::setPlayerEyeOffset(Player *player, v3f first, v3f third)
 	return true;
 }
 
-bool Server::setSky(Player *player, const video::SColor &bgcolor,
+bool Server::setSky(RemotePlayer *player, const video::SColor &bgcolor,
 	const std::string &type, const std::vector<std::string> &params)
 {
 	if (!player)
@@ -3141,7 +3140,7 @@ bool Server::setSky(Player *player, const video::SColor &bgcolor,
 	return true;
 }
 
-bool Server::overrideDayNightRatio(Player *player, bool do_override,
+bool Server::overrideDayNightRatio(RemotePlayer *player, bool do_override,
 	float ratio)
 {
 	if (!player)
@@ -3160,7 +3159,8 @@ void Server::notifyPlayers(const std::wstring &msg)
 void Server::spawnParticle(const std::string &playername, v3f pos,
 	v3f velocity, v3f acceleration,
 	float expirationtime, float size, bool
-	collisiondetection, bool vertical, const std::string &texture)
+	collisiondetection, bool collision_removal,
+	bool vertical, const std::string &texture)
 {
 	// m_env will be NULL if the server is initializing
 	if (!m_env)
@@ -3168,20 +3168,22 @@ void Server::spawnParticle(const std::string &playername, v3f pos,
 
 	u16 peer_id = PEER_ID_INEXISTENT;
 	if (playername != "") {
-		Player* player = m_env->getPlayer(playername.c_str());
+		RemotePlayer *player = m_env->getPlayer(playername.c_str());
 		if (!player)
 			return;
 		peer_id = player->peer_id;
 	}
 
 	SendSpawnParticle(peer_id, pos, velocity, acceleration,
-			expirationtime, size, collisiondetection, vertical, texture);
+			expirationtime, size, collisiondetection,
+			collision_removal, vertical, texture);
 }
 
 u32 Server::addParticleSpawner(u16 amount, float spawntime,
 	v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc,
 	float minexptime, float maxexptime, float minsize, float maxsize,
-	bool collisiondetection, bool vertical, const std::string &texture,
+	bool collisiondetection, bool collision_removal,
+	ServerActiveObject *attached, bool vertical, const std::string &texture,
 	const std::string &playername)
 {
 	// m_env will be NULL if the server is initializing
@@ -3190,17 +3192,25 @@ u32 Server::addParticleSpawner(u16 amount, float spawntime,
 
 	u16 peer_id = PEER_ID_INEXISTENT;
 	if (playername != "") {
-		Player* player = m_env->getPlayer(playername.c_str());
+		RemotePlayer *player = m_env->getPlayer(playername.c_str());
 		if (!player)
 			return -1;
 		peer_id = player->peer_id;
 	}
 
-	u32 id = m_env->addParticleSpawner(spawntime);
+	u16 attached_id = attached ? attached->getId() : 0;
+
+	u32 id;
+	if (attached_id == 0)
+		id = m_env->addParticleSpawner(spawntime);
+	else
+		id = m_env->addParticleSpawner(spawntime, attached_id);
+
 	SendAddParticleSpawner(peer_id, amount, spawntime,
 		minpos, maxpos, minvel, maxvel, minacc, maxacc,
 		minexptime, maxexptime, minsize, maxsize,
-		collisiondetection, vertical, texture, id);
+		collisiondetection, collision_removal, attached_id, vertical,
+		texture, id);
 
 	return id;
 }
@@ -3213,7 +3223,7 @@ void Server::deleteParticleSpawner(const std::string &playername, u32 id)
 
 	u16 peer_id = PEER_ID_INEXISTENT;
 	if (playername != "") {
-		Player* player = m_env->getPlayer(playername.c_str());
+		RemotePlayer *player = m_env->getPlayer(playername.c_str());
 		if (!player)
 			return;
 		peer_id = player->peer_id;
@@ -3223,13 +3233,7 @@ void Server::deleteParticleSpawner(const std::string &playername, u32 id)
 	SendDeleteParticleSpawner(peer_id, id);
 }
 
-void Server::deleteParticleSpawnerAll(u32 id)
-{
-	m_env->deleteParticleSpawner(id);
-	SendDeleteParticleSpawner(PEER_ID_INEXISTENT, id);
-}
-
-Inventory* Server::createDetachedInventory(const std::string &name)
+Inventory* Server::createDetachedInventory(const std::string &name, const std::string &player)
 {
 	if(m_detached_inventories.count(name) > 0){
 		infostream<<"Server clearing detached inventory \""<<name<<"\""<<std::endl;
@@ -3240,6 +3244,7 @@ Inventory* Server::createDetachedInventory(const std::string &name)
 	Inventory *inv = new Inventory(m_itemdef);
 	sanity_check(inv);
 	m_detached_inventories[name] = inv;
+	m_detached_inventories_player[name] = player;
 	//TODO find a better way to do this
 	sendDetachedInventory(name,PEER_ID_INEXISTENT);
 	return inv;
@@ -3431,11 +3436,10 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id, u16 proto_version
 	/*
 		Try to get an existing player
 	*/
-	RemotePlayer *player = static_cast<RemotePlayer*>(m_env->getPlayer(name));
+	RemotePlayer *player = m_env->getPlayer(name);
 
 	// If player is already connected, cancel
-	if(player != NULL && player->peer_id != 0)
-	{
+	if (player != NULL && player->peer_id != 0) {
 		infostream<<"emergePlayer(): Player already connected"<<std::endl;
 		return NULL;
 	}
@@ -3443,27 +3447,24 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id, u16 proto_version
 	/*
 		If player with the wanted peer_id already exists, cancel.
 	*/
-	if(m_env->getPlayer(peer_id) != NULL)
-	{
+	if (m_env->getPlayer(peer_id) != NULL) {
 		infostream<<"emergePlayer(): Player with wrong name but same"
 				" peer_id already exists"<<std::endl;
 		return NULL;
 	}
 
-	// Load player if it isn't already loaded
-	if (!player) {
-		player = static_cast<RemotePlayer*>(m_env->loadPlayer(name));
-	}
+	// Create a new player active object
+	PlayerSAO *playersao = new PlayerSAO(m_env, peer_id, isSingleplayer());
+	player = m_env->loadPlayer(name, playersao);
 
 	// Create player if it doesn't exist
 	if (!player) {
 		newplayer = true;
-		player = new RemotePlayer(this, name);
+		player = new RemotePlayer(name, this->idef());
 		// Set player position
 		infostream<<"Server: Finding spawn place for player \""
 				<<name<<"\""<<std::endl;
-		v3f pos = findSpawnPos();
-		player->setPosition(pos);
+		playersao->setBasePosition(findSpawnPos());
 
 		// Make sure the player is saved
 		player->setModified(true);
@@ -3474,18 +3475,14 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id, u16 proto_version
 		// If the player exists, ensure that they respawn inside legal bounds
 		// This fixes an assert crash when the player can't be added
 		// to the environment
-		if (objectpos_over_limit(player->getPosition())) {
+		if (objectpos_over_limit(playersao->getBasePosition())) {
 			actionstream << "Respawn position for player \""
 				<< name << "\" outside limits, resetting" << std::endl;
-			v3f pos = findSpawnPos();
-			player->setPosition(pos);
+			playersao->setBasePosition(findSpawnPos());
 		}
 	}
 
-	// Create a new player active object
-	PlayerSAO *playersao = new PlayerSAO(m_env, player, peer_id,
-			getPlayerEffectivePrivs(player->getName()),
-			isSingleplayer());
+	playersao->initialize(player, getPlayerEffectivePrivs(player->getName()));
 
 	player->protocol_version = proto_version;
 
diff --git a/src/server.h b/src/server.h
index daf51de..4425d13 100644
--- a/src/server.h
+++ b/src/server.h
@@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "environment.h"
 #include "chat_interface.h"
 #include "clientiface.h"
+#include "remoteplayer.h"
 #include "network/networkpacket.h"
 #include <string>
 #include <list>
@@ -48,7 +49,6 @@ class IWritableCraftDefManager;
 class BanManager;
 class EventManager;
 class Inventory;
-class Player;
 class PlayerSAO;
 class IRollbackManager;
 struct RollbackAction;
@@ -64,31 +64,6 @@ enum ClientDeletionReason {
 	CDR_DENY
 };
 
-class MapEditEventIgnorer
-{
-public:
-	MapEditEventIgnorer(bool *flag):
-		m_flag(flag)
-	{
-		if(*m_flag == false)
-			*m_flag = true;
-		else
-			m_flag = NULL;
-	}
-
-	~MapEditEventIgnorer()
-	{
-		if(m_flag)
-		{
-			assert(*m_flag);
-			*m_flag = false;
-		}
-	}
-
-private:
-	bool *m_flag;
-};
-
 class MapEditEventAreaIgnorer
 {
 public:
@@ -157,7 +132,7 @@ struct ServerSoundParams
 struct ServerPlayingSound
 {
 	ServerSoundParams params;
-	std::set<u16> clients; // peer ids
+	UNORDERED_SET<u16> clients; // peer ids
 };
 
 class Server : public con::PeerHandler, public MapEventReceiver,
@@ -222,6 +197,10 @@ public:
 
 	void Send(NetworkPacket* pkt);
 
+	// Helper for handleCommand_PlayerPos and handleCommand_Interact
+	void process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
+		NetworkPacket *pkt);
+
 	// Both setter and getter need no envlock,
 	// can be called freely from threads
 	void setTimeOfDay(u32 time);
@@ -241,13 +220,12 @@ public:
 
 	// Connection must be locked when called
 	std::wstring getStatusString();
+	inline double getUptime() const { return m_uptime.m_value; }
 
 	// read shutdown state
-	inline bool getShutdownRequested()
-			{ return m_shutdown_requested; }
+	inline bool getShutdownRequested() const { return m_shutdown_requested; }
 
 	// request server to shutdown
-	inline void requestShutdown() { m_shutdown_requested = true; }
 	void requestShutdown(const std::string &msg, bool reconnect)
 	{
 		m_shutdown_requested = true;
@@ -275,7 +253,8 @@ public:
 	void spawnParticle(const std::string &playername,
 		v3f pos, v3f velocity, v3f acceleration,
 		float expirationtime, float size,
-		bool collisiondetection, bool vertical, const std::string &texture);
+		bool collisiondetection, bool collision_removal,
+		bool vertical, const std::string &texture);
 
 	u32 addParticleSpawner(u16 amount, float spawntime,
 		v3f minpos, v3f maxpos,
@@ -283,14 +262,15 @@ public:
 		v3f minacc, v3f maxacc,
 		float minexptime, float maxexptime,
 		float minsize, float maxsize,
-		bool collisiondetection, bool vertical, const std::string &texture,
+		bool collisiondetection, bool collision_removal,
+		ServerActiveObject *attached,
+		bool vertical, const std::string &texture,
 		const std::string &playername);
 
 	void deleteParticleSpawner(const std::string &playername, u32 id);
-	void deleteParticleSpawnerAll(u32 id);
 
 	// Creates or resets inventory
-	Inventory* createDetachedInventory(const std::string &name);
+	Inventory* createDetachedInventory(const std::string &name, const std::string &player="");
 
 	// Envlock and conlock should be locked when using scriptapi
 	GameScripting *getScriptIface(){ return m_script; }
@@ -318,11 +298,11 @@ public:
 	IWritableNodeDefManager* getWritableNodeDefManager();
 	IWritableCraftDefManager* getWritableCraftDefManager();
 
+	const std::vector<ModSpec> &getMods() const { return m_mods; }
 	const ModSpec* getModSpec(const std::string &modname) const;
 	void getModNames(std::vector<std::string> &modlist);
 	std::string getBuiltinLuaPath();
-	inline std::string getWorldPath() const
-			{ return m_path_world; }
+	inline std::string getWorldPath() const { return m_path_world; }
 
 	inline bool isSingleplayer()
 			{ return m_simple_singleplayer_mode; }
@@ -334,28 +314,32 @@ public:
 	Map & getMap() { return m_env->getMap(); }
 	ServerEnvironment & getEnv() { return *m_env; }
 
-	u32 hudAdd(Player *player, HudElement *element);
-	bool hudRemove(Player *player, u32 id);
-	bool hudChange(Player *player, u32 id, HudElementStat stat, void *value);
-	bool hudSetFlags(Player *player, u32 flags, u32 mask);
-	bool hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount);
-	s32 hudGetHotbarItemcount(Player *player);
-	void hudSetHotbarImage(Player *player, std::string name);
-	std::string hudGetHotbarImage(Player *player);
-	void hudSetHotbarSelectedImage(Player *player, std::string name);
-	std::string hudGetHotbarSelectedImage(Player *player);
+	u32 hudAdd(RemotePlayer *player, HudElement *element);
+	bool hudRemove(RemotePlayer *player, u32 id);
+	bool hudChange(RemotePlayer *player, u32 id, HudElementStat stat, void *value);
+	bool hudSetFlags(RemotePlayer *player, u32 flags, u32 mask);
+	bool hudSetHotbarItemcount(RemotePlayer *player, s32 hotbar_itemcount);
+	s32 hudGetHotbarItemcount(RemotePlayer *player) const
+			{ return player->getHotbarItemcount(); }
+	void hudSetHotbarImage(RemotePlayer *player, std::string name);
+	std::string hudGetHotbarImage(RemotePlayer *player);
+	void hudSetHotbarSelectedImage(RemotePlayer *player, std::string name);
+	const std::string &hudGetHotbarSelectedImage(RemotePlayer *player) const
+	{
+		return player->getHotbarSelectedImage();
+	}
 
 	inline Address getPeerAddress(u16 peer_id)
 			{ return m_con.GetPeerAddress(peer_id); }
 
-	bool setLocalPlayerAnimations(Player *player, v2s32 animation_frames[4], f32 frame_speed);
-	bool setPlayerEyeOffset(Player *player, v3f first, v3f third);
+	bool setLocalPlayerAnimations(RemotePlayer *player, v2s32 animation_frames[4],
+			f32 frame_speed);
+	bool setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third);
 
-	bool setSky(Player *player, const video::SColor &bgcolor,
+	bool setSky(RemotePlayer *player, const video::SColor &bgcolor,
 			const std::string &type, const std::vector<std::string> &params);
 
-	bool overrideDayNightRatio(Player *player, bool do_override,
-			float brightness);
+	bool overrideDayNightRatio(RemotePlayer *player, bool do_override, float brightness);
 
 	/* con::PeerHandler implementation. */
 	void peerAdded(con::Peer *peer);
@@ -456,7 +440,9 @@ private:
 		v3f minacc, v3f maxacc,
 		float minexptime, float maxexptime,
 		float minsize, float maxsize,
-		bool collisiondetection, bool vertical, std::string texture, u32 id);
+		bool collisiondetection, bool collision_removal,
+		u16 attached_id,
+		bool vertical, const std::string &texture, u32 id);
 
 	void SendDeleteParticleSpawner(u16 peer_id, u32 id);
 
@@ -464,7 +450,8 @@ private:
 	void SendSpawnParticle(u16 peer_id,
 		v3f pos, v3f velocity, v3f acceleration,
 		float expirationtime, float size,
-		bool collisiondetection, bool vertical, std::string texture);
+		bool collisiondetection, bool collision_removal,
+		bool vertical, const std::string &texture);
 
 	u32 SendActiveObjectRemoveAdd(u16 peer_id, const std::string &datas);
 	void SendActiveObjectMessages(u16 peer_id, const std::string &datas, bool reliable = true);
@@ -475,7 +462,7 @@ private:
 	void DiePlayer(u16 peer_id);
 	void RespawnPlayer(u16 peer_id);
 	void DeleteClient(u16 peer_id, ClientDeletionReason reason);
-	void UpdateCrafting(Player *player);
+	void UpdateCrafting(RemotePlayer *player);
 
 	void handleChatInterfaceEvent(ChatEvent *evt);
 
@@ -483,7 +470,7 @@ private:
 	std::wstring handleChat(const std::string &name, const std::wstring &wname,
 		const std::wstring &wmessage,
 		bool check_shout_priv = false,
-		u16 peer_id_to_avoid_sending = PEER_ID_INEXISTENT);
+		RemotePlayer *player = NULL);
 	void handleAdminChat(const ChatEventChat *evt);
 
 	v3f findSpawnPos();
@@ -518,6 +505,7 @@ private:
 	// If true, do not allow multiple players and hide some multiplayer
 	// functionality
 	bool m_simple_singleplayer_mode;
+	u16 m_max_chatmessage_length;
 
 	// Thread can set; step() will throw as ServerError
 	MutexedVariable<std::string> m_async_fatal_error;
@@ -525,9 +513,7 @@ private:
 	// Some timers
 	float m_liquid_transform_timer;
 	float m_liquid_transform_every;
-	float m_print_info_timer;
 	float m_masterserver_timer;
-	float m_objectdata_timer;
 	float m_emergethread_trigger_timer;
 	float m_savemap_timer;
 	IntervalLimiter m_map_timer_and_unload_interval;
@@ -649,12 +635,12 @@ private:
 	u16 m_ignore_map_edit_events_peer_id;
 
 	// media files known to server
-	std::map<std::string,MediaInfo> m_media;
+	UNORDERED_MAP<std::string, MediaInfo> m_media;
 
 	/*
 		Sounds
 	*/
-	std::map<s32, ServerPlayingSound> m_playing_sounds;
+	UNORDERED_MAP<s32, ServerPlayingSound> m_playing_sounds;
 	s32 m_next_sound_id;
 
 	/*
@@ -662,6 +648,8 @@ private:
 	*/
 	// key = name
 	std::map<std::string, Inventory*> m_detached_inventories;
+	// value = "" (visible to all players) or player name
+	std::map<std::string, std::string> m_detached_inventories_player;
 
 	DISABLE_CLASS_COPY(Server);
 };
diff --git a/src/serverlist.cpp b/src/serverlist.cpp
index de7962a..87ca5dc 100644
--- a/src/serverlist.cpp
+++ b/src/serverlist.cpp
@@ -29,7 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "porting.h"
 #include "log.h"
 #include "network/networkprotocol.h"
-#include "json/json.h"
+#include <json/json.h>
 #include "convert_json.h"
 #include "httpfetch.h"
 #include "util/string.h"
diff --git a/src/serverlist.h b/src/serverlist.h
index 8ffea44..0747c39 100644
--- a/src/serverlist.h
+++ b/src/serverlist.h
@@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <iostream>
 #include "config.h"
 #include "mods.h"
-#include "json/json.h"
+#include <json/json.h>
 
 #ifndef SERVERLIST_HEADER
 #define SERVERLIST_HEADER
diff --git a/src/serverobject.cpp b/src/serverobject.cpp
index 236d7e8..1912478 100644
--- a/src/serverobject.cpp
+++ b/src/serverobject.cpp
@@ -98,4 +98,3 @@ bool ServerActiveObject::setWieldedItem(const ItemStack &item)
 	}
 	return false;
 }
-
diff --git a/src/serverobject.h b/src/serverobject.h
index 597eb63..9884eb0 100644
--- a/src/serverobject.h
+++ b/src/serverobject.h
@@ -44,7 +44,6 @@ Some planning
 
 class ServerEnvironment;
 struct ItemStack;
-class Player;
 struct ToolCapabilities;
 struct ObjectProperties;
 
@@ -69,24 +68,24 @@ public:
 	// environment
 	virtual bool environmentDeletes() const
 	{ return true; }
-	
+
 	// Create a certain type of ServerActiveObject
 	static ServerActiveObject* create(ActiveObjectType type,
 			ServerEnvironment *env, u16 id, v3f pos,
 			const std::string &data);
-	
+
 	/*
 		Some simple getters/setters
 	*/
 	v3f getBasePosition(){ return m_base_position; }
 	void setBasePosition(v3f pos){ m_base_position = pos; }
 	ServerEnvironment* getEnv(){ return m_env; }
-	
+
 	/*
 		Some more dynamic interface
 	*/
-	
-	virtual void setPos(v3f pos)
+
+	virtual void setPos(const v3f &pos)
 		{ setBasePosition(pos); }
 	// continuous: if true, object does not stop immediately at pos
 	virtual void moveTo(v3f pos, bool continuous)
@@ -96,7 +95,7 @@ public:
 	virtual float getMinimumSavedMovement();
 
 	virtual std::string getDescription(){return "SAO";}
-	
+
 	/*
 		Step object in time.
 		Messages added to messages are sent to client over network.
@@ -108,13 +107,13 @@ public:
 			packet.
 	*/
 	virtual void step(float dtime, bool send_recommended){}
-	
+
 	/*
 		The return value of this is passed to the client-side object
 		when it is created
 	*/
 	virtual std::string getClientInitializationData(u16 protocol_version){return "";}
-	
+
 	/*
 		The return value of this is passed to the server-side object
 		when it is created (converted from static to active - actually
@@ -131,7 +130,7 @@ public:
 	*/
 	virtual bool isStaticAllowed() const
 	{return true;}
-	
+
 	// Returns tool wear
 	virtual int punch(v3f dir,
 			const ToolCapabilities *toolcap=NULL,
@@ -167,8 +166,8 @@ public:
 	{}
 	virtual void removeAttachmentChild(int child_id)
 	{}
-	virtual std::set<int> getAttachmentChildIds()
-	{ return std::set<int>(); }
+	virtual UNORDERED_SET<int> getAttachmentChildIds()
+	{ return UNORDERED_SET<int>(); }
 	virtual ObjectProperties* accessObjectProperties()
 	{ return NULL; }
 	virtual void notifyObjectPropertiesModified()
@@ -189,6 +188,15 @@ public:
 	{ return 0; }
 	virtual ItemStack getWieldedItem() const;
 	virtual bool setWieldedItem(const ItemStack &item);
+	inline void attachParticleSpawner(u32 id)
+	{
+		m_attached_particle_spawners.insert(id);
+	}
+	inline void detachParticleSpawner(u32 id)
+	{
+		m_attached_particle_spawners.erase(id);
+	}
+
 
 	/*
 		Number of players which know about this object. Object won't be
@@ -207,7 +215,7 @@ public:
 		- This can be set to true by anything else too.
 	*/
 	bool m_removed;
-	
+
 	/*
 		This is set to true when an object should be removed from the active
 		object list but couldn't be removed because the id has to be
@@ -218,7 +226,7 @@ public:
 		list.
 	*/
 	bool m_pending_deactivation;
-	
+
 	/*
 		Whether the object's static data has been stored to a block
 	*/
@@ -228,12 +236,12 @@ public:
 		a copy of the static data resides.
 	*/
 	v3s16 m_static_block;
-	
+
 	/*
 		Queue of messages to be sent to the client
 	*/
 	std::queue<ActiveObjectMessage> m_messages_out;
-	
+
 protected:
 	// Used for creating objects based on type
 	typedef ServerActiveObject* (*Factory)
@@ -243,6 +251,7 @@ protected:
 
 	ServerEnvironment *m_env;
 	v3f m_base_position;
+	UNORDERED_SET<u32> m_attached_particle_spawners;
 
 private:
 	// Used for creating objects based on type
diff --git a/src/settings.cpp b/src/settings.cpp
index 56afa61..c4c3c90 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -196,9 +196,8 @@ void Settings::writeLines(std::ostream &os, u32 tab_depth) const
 {
 	MutexAutoLock lock(m_mutex);
 
-	for (std::map<std::string, SettingsEntry>::const_iterator
-			it = m_settings.begin();
-			it != m_settings.end(); ++it)
+	for (SettingEntries::const_iterator it = m_settings.begin();
+		 	it != m_settings.end(); ++it)
 		printEntry(os, it->first, it->second, tab_depth);
 }
 
@@ -231,7 +230,7 @@ void Settings::printEntry(std::ostream &os, const std::string &name,
 bool Settings::updateConfigObject(std::istream &is, std::ostream &os,
 	const std::string &end, u32 tab_depth)
 {
-	std::map<std::string, SettingsEntry>::const_iterator it;
+	SettingEntries::const_iterator it;
 	std::set<std::string> present_entries;
 	std::string line, name, value;
 	bool was_modified = false;
@@ -381,7 +380,7 @@ const SettingsEntry &Settings::getEntry(const std::string &name) const
 {
 	MutexAutoLock lock(m_mutex);
 
-	std::map<std::string, SettingsEntry>::const_iterator n;
+	SettingEntries::const_iterator n;
 	if ((n = m_settings.find(name)) == m_settings.end()) {
 		if ((n = m_defaults.find(name)) == m_defaults.end())
 			throw SettingNotFoundException("Setting [" + name + "] not found.");
@@ -572,9 +571,8 @@ bool Settings::exists(const std::string &name) const
 std::vector<std::string> Settings::getNames() const
 {
 	std::vector<std::string> names;
-	for (std::map<std::string, SettingsEntry>::const_iterator
-			i = m_settings.begin();
-			i != m_settings.end(); ++i) {
+	for (SettingEntries::const_iterator i = m_settings.begin();
+		 	i != m_settings.end(); ++i) {
 		names.push_back(i->first);
 	}
 	return names;
@@ -880,7 +878,7 @@ bool Settings::remove(const std::string &name)
 {
 	MutexAutoLock lock(m_mutex);
 
-	std::map<std::string, SettingsEntry>::iterator it = m_settings.find(name);
+	SettingEntries::iterator it = m_settings.find(name);
 	if (it != m_settings.end()) {
 		delete it->second.group;
 		m_settings.erase(it);
@@ -912,7 +910,6 @@ void Settings::updateValue(const Settings &other, const std::string &name)
 
 	try {
 		std::string val = other.get(name);
-
 		m_settings[name] = val;
 	} catch (SettingNotFoundException &e) {
 	}
@@ -968,8 +965,9 @@ void Settings::updateNoLock(const Settings &other)
 
 void Settings::clearNoLock()
 {
-	std::map<std::string, SettingsEntry>::const_iterator it;
-	for (it = m_settings.begin(); it != m_settings.end(); ++it)
+
+	for (SettingEntries::const_iterator it = m_settings.begin();
+			it != m_settings.end(); ++it)
 		delete it->second.group;
 	m_settings.clear();
 
@@ -978,46 +976,45 @@ void Settings::clearNoLock()
 
 void Settings::clearDefaultsNoLock()
 {
-	std::map<std::string, SettingsEntry>::const_iterator it;
-	for (it = m_defaults.begin(); it != m_defaults.end(); ++it)
+	for (SettingEntries::const_iterator it = m_defaults.begin();
+			it != m_defaults.end(); ++it)
 		delete it->second.group;
 	m_defaults.clear();
 }
 
 
-void Settings::registerChangedCallback(std::string name,
-	setting_changed_callback cbf, void *userdata)
+void Settings::registerChangedCallback(const std::string &name,
+	SettingsChangedCallback cbf, void *userdata)
 {
-	MutexAutoLock lock(m_callbackMutex);
+	MutexAutoLock lock(m_callback_mutex);
 	m_callbacks[name].push_back(std::make_pair(cbf, userdata));
 }
 
-void Settings::deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata)
+void Settings::deregisterChangedCallback(const std::string &name,
+	SettingsChangedCallback cbf, void *userdata)
 {
-	MutexAutoLock lock(m_callbackMutex);
-	std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = m_callbacks.find(name);
-	if (iterToVector != m_callbacks.end())
-	{
-		std::vector<std::pair<setting_changed_callback, void*> > &vector = iterToVector->second;
+	MutexAutoLock lock(m_callback_mutex);
+	SettingsCallbackMap::iterator it_cbks = m_callbacks.find(name);
 
-		std::vector<std::pair<setting_changed_callback, void*> >::iterator position =
-			std::find(vector.begin(), vector.end(), std::make_pair(cbf, userdata));
+	if (it_cbks != m_callbacks.end()) {
+		SettingsCallbackList &cbks = it_cbks->second;
 
-		if (position != vector.end())
-			vector.erase(position);
+		SettingsCallbackList::iterator position =
+			std::find(cbks.begin(), cbks.end(), std::make_pair(cbf, userdata));
+
+		if (position != cbks.end())
+			cbks.erase(position);
 	}
 }
 
-void Settings::doCallbacks(const std::string name)
+void Settings::doCallbacks(const std::string &name) const
 {
-	MutexAutoLock lock(m_callbackMutex);
-	std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = m_callbacks.find(name);
-	if (iterToVector != m_callbacks.end())
-	{
-		std::vector<std::pair<setting_changed_callback, void*> >::iterator iter;
-		for (iter = iterToVector->second.begin(); iter != iterToVector->second.end(); ++iter)
-		{
-			(iter->first)(name, iter->second);
-		}
+	MutexAutoLock lock(m_callback_mutex);
+
+	SettingsCallbackMap::const_iterator it_cbks = m_callbacks.find(name);
+	if (it_cbks != m_callbacks.end()) {
+		SettingsCallbackList::const_iterator it;
+		for (it = it_cbks->second.begin(); it != it_cbks->second.end(); ++it)
+			(it->first)(name, it->second);
 	}
 }
diff --git a/src/settings.h b/src/settings.h
index 80d41fd..b197335 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -24,7 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/string.h"
 #include "threading/mutex.h"
 #include <string>
-#include <map>
+#include "util/cpp11_container.h"
 #include <list>
 #include <set>
 
@@ -35,8 +35,17 @@ struct NoiseParams;
 extern Settings *g_settings;
 extern std::string g_settings_path;
 
-/** function type to register a changed callback */
-typedef void (*setting_changed_callback)(const std::string &name, void *data);
+// Type for a settings changed callback function
+typedef void (*SettingsChangedCallback)(const std::string &name, void *data);
+
+typedef std::vector<
+	std::pair<
+		SettingsChangedCallback,
+		void *
+	>
+> SettingsCallbackList;
+
+typedef UNORDERED_MAP<std::string, SettingsCallbackList> SettingsCallbackMap;
 
 enum ValueType {
 	VALUETYPE_STRING,
@@ -89,6 +98,8 @@ struct SettingsEntry {
 	bool is_group;
 };
 
+typedef UNORDERED_MAP<std::string, SettingsEntry> SettingEntries;
+
 class Settings {
 public:
 	Settings() {}
@@ -209,24 +220,28 @@ public:
 	void clearDefaults();
 	void updateValue(const Settings &other, const std::string &name);
 	void update(const Settings &other);
-	void registerChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL);
-	void deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL);
 
-private:
+	void registerChangedCallback(const std::string &name,
+		SettingsChangedCallback cbf, void *userdata = NULL);
+	void deregisterChangedCallback(const std::string &name,
+		SettingsChangedCallback cbf, void *userdata = NULL);
 
+private:
 	void updateNoLock(const Settings &other);
 	void clearNoLock();
 	void clearDefaultsNoLock();
 
-	void doCallbacks(std::string name);
+	void doCallbacks(const std::string &name) const;
+
+	SettingEntries m_settings;
+	SettingEntries m_defaults;
 
-	std::map<std::string, SettingsEntry> m_settings;
-	std::map<std::string, SettingsEntry> m_defaults;
+	SettingsCallbackMap m_callbacks;
 
-	std::map<std::string, std::vector<std::pair<setting_changed_callback,void*> > > m_callbacks;
+	mutable Mutex m_callback_mutex;
 
-	mutable Mutex m_callbackMutex;
-	mutable Mutex m_mutex; // All methods that access m_settings/m_defaults directly should lock this.
+	// All methods that access m_settings/m_defaults directly should lock this.
+	mutable Mutex m_mutex;
 
 };
 
diff --git a/src/settings_translation_file.cpp b/src/settings_translation_file.cpp
index f7e14dd..39223d9 100644
--- a/src/settings_translation_file.cpp
+++ b/src/settings_translation_file.cpp
@@ -1,6 +1,6 @@
 // This file is automatically generated
 // It conatins a bunch of fake gettext calls, to tell xgettext about the strings in config files
-// To update it, refer to the bottom of builtin/mainmenu/tab_settings.lua
+// To update it, refer to the bottom of builtin/mainmenu/dlg_settings_advanced.lua
 
 fake_function() {
 	gettext("Client");
@@ -14,7 +14,7 @@ fake_function() {
 	gettext("Noclip");
 	gettext("If enabled together with fly mode, player is able to fly through solid nodes.\nThis requires the \"noclip\" privilege on the server.");
 	gettext("Cinematic mode");
-	gettext("Smooths camera when moving and looking around.\nUseful for recording videos.");
+	gettext("Smooths camera when looking around. Also called look or mouse smoothing.\nUseful for recording videos.");
 	gettext("Camera smoothing");
 	gettext("Smooths rotation of camera. 0 to disable.");
 	gettext("Camera smoothing in cinematic mode");
@@ -35,6 +35,12 @@ fake_function() {
 	gettext("Enable random user input (only used for testing).");
 	gettext("Continuous forward");
 	gettext("Continuous forward movement (only used for testing).");
+	gettext("Enable Joysticks");
+	gettext("Enable Joysticks");
+	gettext("Joystick button repetition interval");
+	gettext("The time in seconds it takes between repeated events\nwhen holding down a joystick button combination.");
+	gettext("Joystick frustum sensitivity");
+	gettext("The sensitivity of the joystick axes for moving the\ningame view frustum around.");
 	gettext("Forward key");
 	gettext("Key for moving the player forward.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
 	gettext("Backward key");
@@ -65,6 +71,8 @@ fake_function() {
 	gettext("Key for toggling fast mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
 	gettext("Noclip key");
 	gettext("Key for toggling noclip mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
+	gettext("Autorun key");
+	gettext("Key for toggling autorun.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
 	gettext("Cinematic mode key");
 	gettext("Key for toggling cinematic mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
 	gettext("Minimap key");
@@ -80,7 +88,7 @@ fake_function() {
 	gettext("Fog toggle key");
 	gettext("Key for toggling the display of the fog.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
 	gettext("Camera update toggle key");
-	gettext("Key for toggling the camrea update. Only used for development\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
+	gettext("Key for toggling the camera update. Only used for development\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
 	gettext("Debug info toggle key");
 	gettext("Key for toggling the display of debug info.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
 	gettext("Profiler toggle key");
@@ -146,7 +154,7 @@ fake_function() {
 	gettext("Experimental option, might cause visible spaces between blocks\nwhen set to higher number than 0.");
 	gettext("Shaders");
 	gettext("Shaders");
-	gettext("Shaders allow advanced visul effects and may increase performance on some video cards.\nThy only work with the OpenGL video backend.");
+	gettext("Shaders allow advanced visual effects and may increase performance on some video cards.\nThy only work with the OpenGL video backend.");
 	gettext("Tone Mapping");
 	gettext("Filmic tone mapping");
 	gettext("Enables filmic tone mapping");
@@ -188,7 +196,7 @@ fake_function() {
 	gettext("FPS in pause menu");
 	gettext("Maximum FPS when game is paused.");
 	gettext("Viewing range");
-	gettext("View distance in nodes.\nMin = 20");
+	gettext("View distance in nodes.");
 	gettext("Screen width");
 	gettext("Width component of the initial window size.");
 	gettext("Screen height");
@@ -201,6 +209,8 @@ fake_function() {
 	gettext("Vertical screen synchronization.");
 	gettext("Field of view");
 	gettext("Field of view in degrees.");
+	gettext("Field of view for zoom");
+	gettext("Field of view while zooming in degrees.\nThis requires the \"zoom\" privilege on the server.");
 	gettext("Gamma");
 	gettext("Adjust the gamma encoding for the light tables. Lower numbers are brighter.\nThis setting is for the client only and is ignored by the server.");
 	gettext("Texture path");
@@ -247,6 +257,8 @@ fake_function() {
 	gettext("The strength (darkness) of node ambient-occlusion shading.\nLower is darker, Higher is lighter. The valid range of values for this\nsetting is 0.25 to 4.0 inclusive. If the value is out of range it will be\nset to the nearest valid value.");
 	gettext("Inventory items animations");
 	gettext("Enables animation of inventory items.");
+	gettext("Fog Start");
+	gettext("Fraction of the visible distance at which fog starts to be rendered");
 	gettext("Menus");
 	gettext("Clouds in menu");
 	gettext("Use a cloud animation for the main menu background.");
@@ -255,7 +267,7 @@ fake_function() {
 	gettext("GUI scaling filter");
 	gettext("When gui_scaling_filter is true, all GUI images need to be\nfiltered in software, but some images are generated directly\nto hardware (e.g. render-to-texture for nodes in inventory).");
 	gettext("GUI scaling filter txr2img");
-	gettext("When gui_scaling_filter_txr2img is true, copy those images\nfrom hardware to software for scaling.  When false, fall back\nto the old scaling method, for video drivers that don't\npropery support downloading textures back from hardware.");
+	gettext("When gui_scaling_filter_txr2img is true, copy those images\nfrom hardware to software for scaling.  When false, fall back\nto the old scaling method, for video drivers that don't\nproperly support downloading textures back from hardware.");
 	gettext("Tooltip delay");
 	gettext("Delay showing tooltips, stated in milliseconds.");
 	gettext("Freetype fonts");
@@ -306,6 +318,8 @@ fake_function() {
 	gettext("Automaticaly report to the serverlist.");
 	gettext("Serverlist URL");
 	gettext("Announce to this serverlist.\nIf you want to announce your ipv6 address, use  serverlist_url = v6.servers.minetest.net.");
+	gettext("Disable escape sequences");
+	gettext("Disable escape sequences, e.g. chat coloring.\nUse this if you want to run a server with pre-0.4.14 clients and you want to disable\nthe escape sequences generated by mods.");
 	gettext("Network");
 	gettext("Server port");
 	gettext("Network port to listen (UDP).\nThis value will be overridden when starting from the main menu.");
@@ -318,10 +332,11 @@ fake_function() {
 	gettext("IPv6 server");
 	gettext("Enable/disable running an IPv6 server.  An IPv6 server may be restricted\nto IPv6 clients, depending on system configuration.\nIgnored if bind_address is set.");
 	gettext("Advanced");
-	gettext("Maximum simultaneously blocks send per client");
-	gettext("How many blocks are flying in the wire simultaneously per client.");
-	gettext("Maximum simultaneously bocks send total");
-	gettext("How many blocks are flying in the wire simultaneously for the whole server.");
+	gettext("Maximum simultaneous block sends per client");
+	gettext("Maximum number of blocks that are simultaneously sent per client.");
+	gettext("Maximum simultaneous block sends total");
+	gettext("Maximum number of blocks that are simultaneously sent in total.");
+	gettext("Delay in sending blocks after building");
 	gettext("To reduce lag, block transfers are slowed down when a player is building something.\nThis determines how long they are slowed down after placing or removing a node.");
 	gettext("Max. packets per iteration");
 	gettext("Maximum number of packets sent per send step, if you have a slow connection\ntry reducing it, but don't reduce it to a number below double of targeted\nclient number.");
@@ -397,17 +412,11 @@ fake_function() {
 	gettext("Advanced");
 	gettext("Deprecated Lua API handling");
 	gettext("Handling for deprecated lua api calls:\n-    legacy: (try to) mimic old behaviour (default for release).\n-    log: mimic and log backtrace of deprecated call (default for debug).\n-    error: abort on usage of deprecated call (suggested for mod developers).");
-	gettext("Mod profiling");
-	gettext("Useful for mod developers.");
-	gettext("Detailed mod profiling");
-	gettext("Detailed mod profile data. Useful for mod developers.");
-	gettext("Profiling print interval");
-	gettext("Profiler data print interval. 0 = disable. Useful for developers.");
 	gettext("Max. clearobjects extra blocks");
 	gettext("Number of extra blocks that can be loaded by /clearobjects at once.\nThis is a trade-off between sqlite transaction overhead and\nmemory consumption (4096=100MB, as a rule of thumb).");
 	gettext("Unload unused server data");
 	gettext("How much the server will wait before unloading unused mapblocks.\nHigher value is smoother, but will use more RAM.");
-	gettext("Maxmimum objects per block");
+	gettext("Maximum objects per block");
 	gettext("Maximum number of statically stored objects in a block.");
 	gettext("Synchronous SQLite");
 	gettext("See http://www.sqlite.org/pragma.html#pragma_synchronous");
@@ -427,6 +436,8 @@ fake_function() {
 	gettext("The time (in seconds) that the liquids queue may grow beyond processing\ncapacity until an attempt is made to decrease its size by dumping old queue\nitems.  A value of 0 disables the functionality.");
 	gettext("Liquid update tick");
 	gettext("Liquid update interval in seconds.");
+	gettext("block send optimize distance");
+	gettext("At this distance the server will aggressively optimize which blocks are sent to clients.\nSmall values potentially improve performance a lot, at the expense of visible rendering glitches.\n(some blocks will not be rendered under water and in caves, as well as sometimes on land)\nSetting this to a value greater than max_block_send_distance disables this optimization.\nStated in mapblocks (16 nodes)");
 	gettext("Mapgen");
 	gettext("Mapgen name");
 	gettext("Name of map generator to be used when creating a new world.\nCreating a world in the main menu will override this.");
@@ -437,7 +448,7 @@ fake_function() {
 	gettext("Map generation limit");
 	gettext("Where the map generator stops.\nPlease note:\n-    Limited to 31000 (setting above has no effect)\n-    The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n-    Those groups have an offset of -32, -32 nodes from the origin.\n-    Only groups which are within the map_generation_limit are generated");
 	gettext("Mapgen flags");
-	gettext("Global map generation attributes.\nIn Mapgen v6 the 'decorations' flag controls all decorations except trees\nand junglegrass, in all other mapgens this flag controls all decorations.\nThe default flags set in the engine are: caves, light, decorations\nThe flags string modifies the engine defaults.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
+	gettext("Global map generation attributes.\nIn Mapgen v6 the 'decorations' flag controls all decorations except trees\nand junglegrass, in all other mapgens this flag controls all decorations.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
 	gettext("Advanced");
 	gettext("Chunk size");
 	gettext("Size of chunks to be generated at once by mapgen, stated in mapblocks (16 nodes).");
@@ -466,7 +477,7 @@ fake_function() {
 	gettext("Mapgen v5 cave2 noise parameters");
 	gettext("Mapgen v6");
 	gettext("Mapgen v6 flags");
-	gettext("Map generation attributes specific to Mapgen v6.\nWhen snowbiomes are enabled jungles are automatically enabled, the 'jungles' flag is ignored.\nThe default flags set in the engine are: biomeblend, mudflow\nThe flags string modifies the engine defaults.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
+	gettext("Map generation attributes specific to Mapgen v6.\nWhen snowbiomes are enabled jungles are automatically enabled, the 'jungles' flag is ignored.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
 	gettext("Mapgen v6 desert frequency");
 	gettext("Controls size of deserts and beaches in Mapgen v6.\nWhen snowbiomes are enabled 'mgv6_freq_desert' is ignored.");
 	gettext("Mapgen v6 beach frequency");
@@ -483,23 +494,33 @@ fake_function() {
 	gettext("Mapgen v6 apple trees noise parameters");
 	gettext("Mapgen v7");
 	gettext("Mapgen v7 flags");
-	gettext("Map generation attributes specific to Mapgen v7.\nThe 'ridges' flag controls the rivers.\nThe default flags set in the engine are: mountains, ridges\nThe flags string modifies the engine defaults.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
+	gettext("Map generation attributes specific to Mapgen v7.\nThe 'ridges' flag enables the rivers.\nFloatlands are currently experimental and subject to change.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
 	gettext("Mapgen v7 cave width");
 	gettext("Controls width of tunnels, a smaller value creates wider tunnels.");
+	gettext("Mapgen v7 floatland mountain density");
+	gettext("Controls the density of floatland mountain terrain.\nIs an offset added to the 'np_mountain' noise value.");
+	gettext("Mapgen v7 floatland mountain height");
+	gettext("Typical maximum height, above and below midpoint, of floatland mountain terrain.");
+	gettext("Mapgen v7 floatland level");
+	gettext("Y-level of floatland midpoint and lake surface.");
+	gettext("Mapgen v7 shadow limit");
+	gettext("Y-level to which floatland shadows extend.");
 	gettext("Mapgen v7 terrain base noise parameters");
 	gettext("Mapgen v7 terrain altitude noise parameters");
 	gettext("Mapgen v7 terrain persistation noise parameters");
 	gettext("Mapgen v7 height select noise parameters");
 	gettext("Mapgen v7 filler depth noise parameters");
 	gettext("Mapgen v7 mount height noise parameters");
-	gettext("Mapgen v7 ridge water noise parameters");
+	gettext("Mapgen v7 river course noise parameters");
+	gettext("Mapgen v7 floatland base terrain noise parameters");
+	gettext("Mapgen v7 floatland base terrain height noise parameters");
 	gettext("Mapgen v7 mountain noise parameters");
-	gettext("Mapgen v7 ridge noise parameters");
+	gettext("Mapgen v7 river channel wall noise parameters");
 	gettext("Mapgen v7 cave1 noise parameters");
 	gettext("Mapgen v7 cave2 noise parameters");
 	gettext("Mapgen flat");
 	gettext("Mapgen flat flags");
-	gettext("Map generation attributes specific to Mapgen flat.\nOccasional lakes and hills can be added to the flat world.\nThe default flags set in the engine are: none\nThe flags string modifies the engine defaults.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
+	gettext("Map generation attributes specific to Mapgen flat.\nOccasional lakes and hills can be added to the flat world.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
 	gettext("Mapgen flat ground level");
 	gettext("Y of flat ground.");
 	gettext("Mapgen flat large cave depth");
@@ -547,7 +568,7 @@ fake_function() {
 	gettext("Mapgen Valleys");
 	gettext("General");
 	gettext("Valleys C Flags");
-	gettext("Map generation attributes specific to Mapgen Valleys.\n'altitude_chill' makes higher elevations colder, which may cause biome issues.\n'humid_rivers' modifies the humidity around rivers and in areas where water would tend to pool,\nit may interfere with delicately adjusted biomes.\nThe default flags set in the engine are: altitude_chill, humid_rivers\nThe flags string modifies the engine defaults.\nFlags that are not specified in the flag string are not modified from the defaul [...]
+	gettext("Map generation attributes specific to Mapgen Valleys.\n'altitude_chill' makes higher elevations colder, which may cause biome issues.\n'humid_rivers' modifies the humidity around rivers and in areas where water would tend to pool,\nit may interfere with delicately adjusted biomes.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
 	gettext("Altitude Chill");
 	gettext("The altitude at which temperature drops by 20C");
 	gettext("Large cave depth");
@@ -591,7 +612,31 @@ fake_function() {
 	gettext("Trusted mods");
 	gettext("Comma-separated list of trusted mods that are allowed to access insecure\nfunctions even when mod security is on (via request_insecure_environment()).");
 	gettext("HTTP Mods");
-	gettext("Comma-seperated list of mods that are allowed to access HTTP APIs, which\nallow them to upload and download data to/from the internet.");
+	gettext("Comma-separated list of mods that are allowed to access HTTP APIs, which\nallow them to upload and download data to/from the internet.");
+	gettext("Advanced");
+	gettext("Profiling");
+	gettext("Load the game profiler");
+	gettext("Load the game profiler to collect game profiling data.\nProvides a /profiler command to access the compiled profile.\nUseful for mod developers and server operators.");
+	gettext("Default report format");
+	gettext("The default format in which profiles are being saved,\nwhen calling `/profiler save [format]` without format.");
+	gettext("Report path");
+	gettext("The file path relative to your worldpath in which profiles will be saved to.\n");
+	gettext("Instrumentation");
+	gettext("Entity methods");
+	gettext("Instrument the methods of entities on registration.");
+	gettext("Active Block Modifiers");
+	gettext("Instrument the action function of Active Block Modifiers on registration.");
+	gettext("Loading Block Modifiers");
+	gettext("Instrument the action function of Loading Block Modifiers on registration.");
+	gettext("Chatcommands");
+	gettext("Instrument chatcommands on registration.");
+	gettext("Global callbacks");
+	gettext("Instrument global callback functions on registration.\n(anything you pass to a minetest.register_*() function)");
+	gettext("Advanced");
+	gettext("Builtin");
+	gettext("Instrument builtin.\nThis is usually only needed by core/builtin contributors");
+	gettext("Profiler");
+	gettext("Have the profiler instrument itself:\n* Instrument an empty function.\nThis estimates the overhead, that instrumentation is adding (+1 function call).\n* Instrument the sampler being used to update the statistics.");
 	gettext("Client and Server");
 	gettext("Player name");
 	gettext("Name of the player.\nWhen running a server, clients connecting with this name are admins.\nWhen starting from the main menu, this is overridden.");
@@ -617,4 +662,6 @@ fake_function() {
 	gettext("Modstore download URL");
 	gettext("Modstore mods list URL");
 	gettext("Modstore details URL");
+	gettext("Engine profiling data print interval");
+	gettext("Print the engine's profiling data in regular intervals (in seconds). 0 = disable. Useful for developers.");
 }
diff --git a/src/shader.cpp b/src/shader.cpp
index e13ab8d..c0ecf73 100644
--- a/src/shader.cpp
+++ b/src/shader.cpp
@@ -167,29 +167,27 @@ private:
 	}
 };
 
+
 /*
 	ShaderCallback: Sets constants that can be used in shaders
 */
 
-class IShaderConstantSetterRegistry
-{
-public:
-	virtual ~IShaderConstantSetterRegistry(){};
-	virtual void onSetConstants(video::IMaterialRendererServices *services,
-			bool is_highlevel, const std::string &name) = 0;
-};
-
 class ShaderCallback : public video::IShaderConstantSetCallBack
 {
-	IShaderConstantSetterRegistry *m_scsr;
-	std::string m_name;
+	std::vector<IShaderConstantSetter*> m_setters;
 
 public:
-	ShaderCallback(IShaderConstantSetterRegistry *scsr, const std::string &name):
-		m_scsr(scsr),
-		m_name(name)
-	{}
-	~ShaderCallback() {}
+	ShaderCallback(const std::vector<IShaderConstantSetterFactory*> &factories)
+	{
+		for (u32 i = 0; i < factories.size(); ++i)
+			m_setters.push_back(factories[i]->create());
+	}
+
+	~ShaderCallback()
+	{
+		for (u32 i = 0; i < m_setters.size(); ++i)
+			delete m_setters[i];
+	}
 
 	virtual void OnSetConstants(video::IMaterialRendererServices *services, s32 userData)
 	{
@@ -198,18 +196,25 @@ public:
 
 		bool is_highlevel = userData;
 
-		m_scsr->onSetConstants(services, is_highlevel, m_name);
+		for (u32 i = 0; i < m_setters.size(); ++i)
+			m_setters[i]->onSetConstants(services, is_highlevel);
 	}
 };
 
+
 /*
 	MainShaderConstantSetter: Set basic constants required for almost everything
 */
 
 class MainShaderConstantSetter : public IShaderConstantSetter
 {
+	CachedVertexShaderSetting<float, 16> m_world_view_proj;
+	CachedVertexShaderSetting<float, 16> m_world;
+
 public:
-	MainShaderConstantSetter(IrrlichtDevice *device)
+	MainShaderConstantSetter() :
+		m_world_view_proj("mWorldViewProj"),
+		m_world("mWorld")
 	{}
 	~MainShaderConstantSetter() {}
 
@@ -219,47 +224,40 @@ public:
 		video::IVideoDriver *driver = services->getVideoDriver();
 		sanity_check(driver);
 
-		// set inverted world matrix
-		core::matrix4 invWorld = driver->getTransform(video::ETS_WORLD);
-		invWorld.makeInverse();
-		if(is_highlevel)
-			services->setVertexShaderConstant("mInvWorld", invWorld.pointer(), 16);
-		else
-			services->setVertexShaderConstant(invWorld.pointer(), 0, 4);
-
-		// set clip matrix
+		// Set clip matrix
 		core::matrix4 worldViewProj;
 		worldViewProj = driver->getTransform(video::ETS_PROJECTION);
 		worldViewProj *= driver->getTransform(video::ETS_VIEW);
 		worldViewProj *= driver->getTransform(video::ETS_WORLD);
-		if(is_highlevel)
-			services->setVertexShaderConstant("mWorldViewProj", worldViewProj.pointer(), 16);
-		else
-			services->setVertexShaderConstant(worldViewProj.pointer(), 4, 4);
-
-		// set transposed world matrix
-		core::matrix4 transWorld = driver->getTransform(video::ETS_WORLD);
-		transWorld = transWorld.getTransposed();
-		if(is_highlevel)
-			services->setVertexShaderConstant("mTransWorld", transWorld.pointer(), 16);
+		if (is_highlevel)
+			m_world_view_proj.set(*reinterpret_cast<float(*)[16]>(worldViewProj.pointer()), services);
 		else
-			services->setVertexShaderConstant(transWorld.pointer(), 8, 4);
+			services->setVertexShaderConstant(worldViewProj.pointer(), 0, 4);
 
-		// set world matrix
+		// Set world matrix
 		core::matrix4 world = driver->getTransform(video::ETS_WORLD);
-		if(is_highlevel)
-			services->setVertexShaderConstant("mWorld", world.pointer(), 16);
+		if (is_highlevel)
+			m_world.set(*reinterpret_cast<float(*)[16]>(world.pointer()), services);
 		else
-			services->setVertexShaderConstant(world.pointer(), 8, 4);
+			services->setVertexShaderConstant(world.pointer(), 4, 4);
 
 	}
 };
 
+
+class MainShaderConstantSetterFactory : public IShaderConstantSetterFactory
+{
+public:
+	virtual IShaderConstantSetter* create()
+		{ return new MainShaderConstantSetter(); }
+};
+
+
 /*
 	ShaderSource
 */
 
-class ShaderSource : public IWritableShaderSource, public IShaderConstantSetterRegistry
+class ShaderSource : public IWritableShaderSource
 {
 public:
 	ShaderSource(IrrlichtDevice *device);
@@ -302,22 +300,17 @@ public:
 	// Shall be called from the main thread.
 	void rebuildShaders();
 
-	void addGlobalConstantSetter(IShaderConstantSetter *setter)
+	void addShaderConstantSetterFactory(IShaderConstantSetterFactory *setter)
 	{
-		m_global_setters.push_back(setter);
+		m_setter_factories.push_back(setter);
 	}
 
-	void onSetConstants(video::IMaterialRendererServices *services,
-			bool is_highlevel, const std::string &name);
-
 private:
 
 	// The id of the thread that is allowed to use irrlicht directly
 	threadid_t m_main_thread;
 	// The irrlicht device
 	IrrlichtDevice *m_device;
-	// The set-constants callback
-	ShaderCallback *m_shader_callback;
 
 	// Cache of source shaders
 	// This should be only accessed from the main thread
@@ -332,9 +325,11 @@ private:
 	// Queued shader fetches (to be processed by the main thread)
 	RequestQueue<std::string, u32, u8, u8> m_get_shader_queue;
 
-	// Global constant setters
-	// TODO: Delete these in the destructor
-	std::vector<IShaderConstantSetter*> m_global_setters;
+	// Global constant setter factories
+	std::vector<IShaderConstantSetterFactory *> m_setter_factories;
+
+	// Shader callbacks
+	std::vector<ShaderCallback *> m_callbacks;
 };
 
 IWritableShaderSource* createShaderSource(IrrlichtDevice *device)
@@ -347,8 +342,8 @@ IWritableShaderSource* createShaderSource(IrrlichtDevice *device)
 */
 ShaderInfo generate_shader(std::string name,
 		u8 material_type, u8 drawtype,
-		IrrlichtDevice *device,
-		video::IShaderConstantSetCallBack *callback,
+		IrrlichtDevice *device, std::vector<ShaderCallback *> &callbacks,
+		const std::vector<IShaderConstantSetterFactory*> &setter_factories,
 		SourceShaderCache *sourcecache);
 
 /*
@@ -364,28 +359,24 @@ ShaderSource::ShaderSource(IrrlichtDevice *device):
 {
 	assert(m_device); // Pre-condition
 
-	m_shader_callback = new ShaderCallback(this, "default");
-
 	m_main_thread = thr_get_current_thread_id();
 
 	// Add a dummy ShaderInfo as the first index, named ""
 	m_shaderinfo_cache.push_back(ShaderInfo());
 
 	// Add main global constant setter
-	addGlobalConstantSetter(new MainShaderConstantSetter(device));
+	addShaderConstantSetterFactory(new MainShaderConstantSetterFactory());
 }
 
 ShaderSource::~ShaderSource()
 {
-	for (std::vector<IShaderConstantSetter*>::iterator iter = m_global_setters.begin();
-			iter != m_global_setters.end(); ++iter) {
+	for (std::vector<ShaderCallback *>::iterator iter = m_callbacks.begin();
+			iter != m_callbacks.end(); ++iter) {
 		delete *iter;
 	}
-	m_global_setters.clear();
-
-	if (m_shader_callback) {
-		m_shader_callback->drop();
-		m_shader_callback = NULL;
+	for (std::vector<IShaderConstantSetterFactory *>::iterator iter = m_setter_factories.begin();
+			iter != m_setter_factories.end(); ++iter) {
+		delete *iter;
 	}
 }
 
@@ -461,8 +452,8 @@ u32 ShaderSource::getShaderIdDirect(const std::string &name,
 		return 0;
 	}
 
-	ShaderInfo info = generate_shader(name, material_type, drawtype, m_device,
-			m_shader_callback, &m_sourcecache);
+	ShaderInfo info = generate_shader(name, material_type, drawtype,
+			m_device, m_callbacks, m_setter_factories, &m_sourcecache);
 
 	/*
 		Add shader to caches (add dummy shaders too)
@@ -527,22 +518,16 @@ void ShaderSource::rebuildShaders()
 		ShaderInfo *info = &m_shaderinfo_cache[i];
 		if(info->name != ""){
 			*info = generate_shader(info->name, info->material_type,
-					info->drawtype, m_device, m_shader_callback, &m_sourcecache);
+					info->drawtype, m_device, m_callbacks,
+					m_setter_factories, &m_sourcecache);
 		}
 	}
 }
 
-void ShaderSource::onSetConstants(video::IMaterialRendererServices *services,
-		bool is_highlevel, const std::string &name)
-{
-	for(u32 i=0; i<m_global_setters.size(); i++){
-		IShaderConstantSetter *setter = m_global_setters[i];
-		setter->onSetConstants(services, is_highlevel);
-	}
-}
 
 ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
-		IrrlichtDevice *device,	video::IShaderConstantSetCallBack *callback,
+		IrrlichtDevice *device, std::vector<ShaderCallback *> &callbacks,
+		const std::vector<IShaderConstantSetterFactory*> &setter_factories,
 		SourceShaderCache *sourcecache)
 {
 	ShaderInfo shaderinfo;
@@ -572,7 +557,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
 	}
 
 	bool enable_shaders = g_settings->getBool("enable_shaders");
-	if(!enable_shaders)
+	if (!enable_shaders)
 		return shaderinfo;
 
 	video::IVideoDriver* driver = device->getVideoDriver();
@@ -766,6 +751,10 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
 	if (g_settings->getBool("tone_mapping"))
 		shaders_header += "#define ENABLE_TONE_MAPPING\n";
 
+	shaders_header += "#define FOG_START ";
+	shaders_header += ftos(rangelim(g_settings->getFloat("fog_start"), 0.0f, 0.99f));
+	shaders_header += "\n";
+
 	// Call addHighLevelShaderMaterial() or addShaderMaterial()
 	const c8* vertex_program_ptr = 0;
 	const c8* pixel_program_ptr = 0;
@@ -782,6 +771,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
 		geometry_program = shaders_header + geometry_program;
 		geometry_program_ptr = geometry_program.c_str();
 	}
+	ShaderCallback *cb = new ShaderCallback(setter_factories);
 	s32 shadermat = -1;
 	if(is_highlevel){
 		infostream<<"Compiling high level shaders for "<<name<<std::endl;
@@ -798,7 +788,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
 			scene::EPT_TRIANGLES,      // Geometry shader input
 			scene::EPT_TRIANGLE_STRIP, // Geometry shader output
 			0,                         // Support maximum number of vertices
-			callback,                  // Set-constant callback
+			cb, // Set-constant callback
 			shaderinfo.base_material,  // Base material
 			1                          // Userdata passed to callback
 			);
@@ -810,6 +800,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
 			dumpShaderProgram(warningstream, "Vertex", vertex_program);
 			dumpShaderProgram(warningstream, "Pixel", pixel_program);
 			dumpShaderProgram(warningstream, "Geometry", geometry_program);
+			delete cb;
 			return shaderinfo;
 		}
 	}
@@ -818,7 +809,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
 		shadermat = gpu->addShaderMaterial(
 			vertex_program_ptr,   // Vertex shader program
 			pixel_program_ptr,    // Pixel shader program
-			callback,             // Set-constant callback
+			cb, // Set-constant callback
 			shaderinfo.base_material,  // Base material
 			0                     // Userdata passed to callback
 			);
@@ -830,9 +821,11 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
 					<<std::endl;
 			dumpShaderProgram(warningstream, "Vertex", vertex_program);
 			dumpShaderProgram(warningstream,"Pixel", pixel_program);
+			delete cb;
 			return shaderinfo;
 		}
 	}
+	callbacks.push_back(cb);
 
 	// HACK, TODO: investigate this better
 	// Grab the material renderer once more so minetest doesn't crash on exit
diff --git a/src/shader.h b/src/shader.h
index b8aa88b..766871f 100644
--- a/src/shader.h
+++ b/src/shader.h
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #ifndef SHADER_HEADER
 #define SHADER_HEADER
 
+#include <IMaterialRendererServices.h>
 #include "irrlichttypes_extrabloated.h"
 #include "threads.h"
 #include <string>
@@ -43,8 +44,7 @@ class IGameDef;
 std::string getShaderPath(const std::string &name_of_shader,
 		const std::string &filename);
 
-struct ShaderInfo
-{
+struct ShaderInfo {
 	std::string name;
 	video::E_MATERIAL_TYPE base_material;
 	video::E_MATERIAL_TYPE material;
@@ -66,20 +66,66 @@ namespace irr { namespace video {
 	class IMaterialRendererServices;
 } }
 
-class IShaderConstantSetter
-{
+
+class IShaderConstantSetter {
 public:
 	virtual ~IShaderConstantSetter(){};
 	virtual void onSetConstants(video::IMaterialRendererServices *services,
 			bool is_highlevel) = 0;
 };
 
+
+class IShaderConstantSetterFactory {
+public:
+	virtual ~IShaderConstantSetterFactory() {};
+	virtual IShaderConstantSetter* create() = 0;
+};
+
+
+template <typename T, std::size_t count=1>
+class CachedShaderSetting {
+	const char *m_name;
+	T m_sent[count];
+	bool has_been_set;
+	bool is_pixel;
+protected:
+	CachedShaderSetting(const char *name, bool is_pixel) :
+		m_name(name), has_been_set(false), is_pixel(is_pixel)
+	{}
+public:
+	void set(const T value[count], video::IMaterialRendererServices *services)
+	{
+		if (has_been_set && std::equal(m_sent, m_sent + count, value))
+			return;
+		if (is_pixel)
+			services->setPixelShaderConstant(m_name, value, count);
+		else
+			services->setVertexShaderConstant(m_name, value, count);
+		std::copy(value, value + count, m_sent);
+		has_been_set = true;
+	}
+};
+
+template <typename T, std::size_t count = 1>
+class CachedPixelShaderSetting : public CachedShaderSetting<T, count> {
+public:
+	CachedPixelShaderSetting(const char *name) :
+		CachedShaderSetting<T, count>(name, true){}
+};
+
+template <typename T, std::size_t count = 1>
+class CachedVertexShaderSetting : public CachedShaderSetting<T, count> {
+public:
+	CachedVertexShaderSetting(const char *name) :
+		CachedShaderSetting<T, count>(name, false){}
+};
+
+
 /*
 	ShaderSource creates and caches shaders.
 */
 
-class IShaderSource
-{
+class IShaderSource {
 public:
 	IShaderSource(){}
 	virtual ~IShaderSource(){}
@@ -90,8 +136,7 @@ public:
 		const u8 material_type, const u8 drawtype){return 0;}
 };
 
-class IWritableShaderSource : public IShaderSource
-{
+class IWritableShaderSource : public IShaderSource {
 public:
 	IWritableShaderSource(){}
 	virtual ~IWritableShaderSource(){}
@@ -105,7 +150,7 @@ public:
 	virtual void insertSourceShader(const std::string &name_of_shader,
 		const std::string &filename, const std::string &program)=0;
 	virtual void rebuildShaders()=0;
-	virtual void addGlobalConstantSetter(IShaderConstantSetter *setter)=0;
+	virtual void addShaderConstantSetterFactory(IShaderConstantSetterFactory *setter) = 0;
 };
 
 IWritableShaderSource* createShaderSource(IrrlichtDevice *device);
diff --git a/src/sky.cpp b/src/sky.cpp
index 682ff05..211a2dc 100644
--- a/src/sky.cpp
+++ b/src/sky.cpp
@@ -4,37 +4,37 @@
 #include "ICameraSceneNode.h"
 #include "S3DVertex.h"
 #include "client/tile.h"
-#include "noise.h"            // easeCurve
+#include "noise.h"  // easeCurve
 #include "profiler.h"
 #include "util/numeric.h"
 #include <cmath>
 #include "settings.h"
-#include "camera.h"           // CameraModes
+#include "camera.h"  // CameraModes
+
 
-//! constructor
 Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
 		ITextureSource *tsrc):
 		scene::ISceneNode(parent, mgr, id),
 		m_visible(true),
-		m_fallback_bg_color(255,255,255,255),
+		m_fallback_bg_color(255, 255, 255, 255),
 		m_first_update(true),
 		m_brightness(0.5),
 		m_cloud_brightness(0.5),
-		m_bgcolor_bright_f(1,1,1,1),
-		m_skycolor_bright_f(1,1,1,1),
-		m_cloudcolor_bright_f(1,1,1,1)
+		m_bgcolor_bright_f(1, 1, 1, 1),
+		m_skycolor_bright_f(1, 1, 1, 1),
+		m_cloudcolor_bright_f(1, 1, 1, 1)
 {
 	setAutomaticCulling(scene::EAC_OFF);
-	m_box.MaxEdge.set(0,0,0);
-	m_box.MinEdge.set(0,0,0);
+	m_box.MaxEdge.set(0, 0, 0);
+	m_box.MinEdge.set(0, 0, 0);
 
-	// create material
+	// Create material
 
 	video::SMaterial mat;
 	mat.Lighting = false;
 	mat.ZBuffer = video::ECFN_NEVER;
 	mat.ZWriteEnable = false;
-	mat.AntiAliasing=0;
+	mat.AntiAliasing = 0;
 	mat.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE;
 	mat.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE;
 	mat.BackfaceCulling = false;
@@ -59,14 +59,15 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
 	m_moon_tonemap = tsrc->isKnownSourceImage("moon_tonemap.png") ?
 		tsrc->getTexture("moon_tonemap.png") : NULL;
 
-	if (m_sun_texture){
+	if (m_sun_texture) {
 		m_materials[3] = mat;
 		m_materials[3].setTexture(0, m_sun_texture);
 		m_materials[3].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
 		if (m_sun_tonemap)
 			m_materials[3].Lighting = true;
 	}
-	if (m_moon_texture){
+
+	if (m_moon_texture) {
 		m_materials[4] = mat;
 		m_materials[4].setTexture(0, m_moon_texture);
 		m_materials[4].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
@@ -74,11 +75,11 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
 			m_materials[4].Lighting = true;
 	}
 
-	for(u32 i=0; i<SKY_STAR_COUNT; i++){
+	for (u32 i = 0; i < SKY_STAR_COUNT; i++) {
 		m_stars[i] = v3f(
-			myrand_range(-10000,10000),
-			myrand_range(-10000,10000),
-			myrand_range(-10000,10000)
+			myrand_range(-10000, 10000),
+			myrand_range(-10000, 10000),
+			myrand_range(-10000, 10000)
 		);
 		m_stars[i].normalize();
 	}
@@ -86,6 +87,7 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
 	m_directional_colored_fog = g_settings->getBool("directional_colored_fog");
 }
 
+
 void Sky::OnRegisterSceneNode()
 {
 	if (IsVisible)
@@ -94,10 +96,10 @@ void Sky::OnRegisterSceneNode()
 	scene::ISceneNode::OnRegisterSceneNode();
 }
 
-//! renders the node.
+
 void Sky::render()
 {
-	if(!m_visible)
+	if (!m_visible)
 		return;
 
 	video::IVideoDriver* driver = SceneManager->getVideoDriver();
@@ -108,7 +110,7 @@ void Sky::render()
 	
 	ScopeProfiler sp(g_profiler, "Sky::render()", SPT_AVG);
 
-	// draw perspective skybox
+	// Draw perspective skybox
 
 	core::matrix4 translate(AbsoluteTransformation);
 	translate.setTranslation(camera->getAbsolutePosition());
@@ -120,16 +122,15 @@ void Sky::render()
 
 	driver->setTransform(video::ETS_WORLD, translate * scale);
 
-	if(m_sunlight_seen)
-	{
+	if (m_sunlight_seen) {
 		float sunsize = 0.07;
 		video::SColorf suncolor_f(1, 1, 0, 1);
 		suncolor_f.r = 1;
-		suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.7+m_time_brightness*(0.5)));
-		suncolor_f.b = MYMAX(0.0, m_brightness*0.95);
+		suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.7 + m_time_brightness * 0.5));
+		suncolor_f.b = MYMAX(0.0, m_brightness * 0.95);
 		video::SColorf suncolor2_f(1, 1, 1, 1);
 		suncolor_f.r = 1;
-		suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.85+m_time_brightness*(0.5)));
+		suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.85 + m_time_brightness * 0.5));
 		suncolor_f.b = MYMAX(0.0, m_brightness);
 
 		float moonsize = 0.04;
@@ -139,12 +140,12 @@ void Sky::render()
 		float nightlength = 0.415;
 		float wn = nightlength / 2;
 		float wicked_time_of_day = 0;
-		if(m_time_of_day > wn && m_time_of_day < 1.0 - wn)
-			wicked_time_of_day = (m_time_of_day - wn)/(1.0-wn*2)*0.5 + 0.25;
-		else if(m_time_of_day < 0.5)
+		if (m_time_of_day > wn && m_time_of_day < 1.0 - wn)
+			wicked_time_of_day = (m_time_of_day - wn) / (1.0 - wn * 2) * 0.5 + 0.25;
+		else if (m_time_of_day < 0.5)
 			wicked_time_of_day = m_time_of_day / wn * 0.25;
 		else
-			wicked_time_of_day = 1.0 - ((1.0-m_time_of_day) / wn * 0.25);
+			wicked_time_of_day = 1.0 - ((1.0 - m_time_of_day) / wn * 0.25);
 		/*std::cerr<<"time_of_day="<<m_time_of_day<<" -> "
 				<<"wicked_time_of_day="<<wicked_time_of_day<<std::endl;*/
 
@@ -154,98 +155,108 @@ void Sky::render()
 		video::SColor mooncolor2 = mooncolor2_f.toSColor();
 
 		// Calculate offset normalized to the X dimension of a 512x1 px tonemap
-		float offset=(1.0-fabs(sin((m_time_of_day - 0.5)*irr::core::PI)))*511;
+		float offset = (1.0 - fabs(sin((m_time_of_day - 0.5) * irr::core::PI))) * 511;
 
-		if (m_sun_tonemap){
+		if (m_sun_tonemap) {
 			u8 * texels = (u8 *)m_sun_tonemap->lock();
 			video::SColor* texel = (video::SColor *)(texels + (u32)offset * 4);
-			video::SColor texel_color (255,texel->getRed(),texel->getGreen(), texel->getBlue());
+			video::SColor texel_color (255, texel->getRed(),
+				texel->getGreen(), texel->getBlue());
 			m_sun_tonemap->unlock();
 			m_materials[3].EmissiveColor = texel_color;
 		}
-		if (m_moon_tonemap){
+
+		if (m_moon_tonemap) {
 			u8 * texels = (u8 *)m_moon_tonemap->lock();
 			video::SColor* texel = (video::SColor *)(texels + (u32)offset * 4);
-			video::SColor texel_color (255,texel->getRed(),texel->getGreen(), texel->getBlue());
+			video::SColor texel_color (255, texel->getRed(),
+				texel->getGreen(), texel->getBlue());
 			m_moon_tonemap->unlock();
 			m_materials[4].EmissiveColor = texel_color;
 		}
 
 		const f32 t = 1.0f;
 		const f32 o = 0.0f;
-		static const u16 indices[4] = {0,1,2,3};
+		static const u16 indices[4] = {0, 1, 2, 3};
 		video::S3DVertex vertices[4];
 		
 		driver->setMaterial(m_materials[1]);
 		
-		//video::SColor cloudyfogcolor(255,255,255,255);
 		video::SColor cloudyfogcolor = m_bgcolor;
-		//video::SColor cloudyfogcolor = m_bgcolor.getInterpolated(m_skycolor, 0.5);
 		
-		// Draw far cloudy fog thing
-		for(u32 j=0; j<4; j++)
-		{
+		// Draw far cloudy fog thing blended with skycolor
+		for (u32 j = 0; j < 4; j++) {
 			video::SColor c = cloudyfogcolor.getInterpolated(m_skycolor, 0.45);
-			vertices[0] = video::S3DVertex(-1, 0.08,-1, 0,0,1, c, t, t);
-			vertices[1] = video::S3DVertex( 1, 0.08,-1, 0,0,1, c, o, t);
-			vertices[2] = video::S3DVertex( 1, 0.12,-1, 0,0,1, c, o, o);
-			vertices[3] = video::S3DVertex(-1, 0.12,-1, 0,0,1, c, t, o);
-			for(u32 i=0; i<4; i++){
-				if(j==0)
+			vertices[0] = video::S3DVertex(-1, 0.08, -1, 0, 0, 1, c, t, t);
+			vertices[1] = video::S3DVertex( 1, 0.08, -1, 0, 0, 1, c, o, t);
+			vertices[2] = video::S3DVertex( 1, 0.12, -1, 0, 0, 1, c, o, o);
+			vertices[3] = video::S3DVertex(-1, 0.12, -1, 0, 0, 1, c, t, o);
+			for (u32 i = 0; i < 4; i++) {
+				if (j == 0)
 					// Don't switch
 					{}
-				else if(j==1)
+				else if (j == 1)
 					// Switch from -Z (south) to +X (east)
 					vertices[i].Pos.rotateXZBy(90);
-				else if(j==2)
+				else if (j == 2)
 					// Switch from -Z (south) to -X (west)
 					vertices[i].Pos.rotateXZBy(-90);
 				else
-					// Switch from -Z (south) to -Z (north)
+					// Switch from -Z (south) to +Z (north)
 					vertices[i].Pos.rotateXZBy(-180);
 			}
 			driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 		}
-		for(u32 j=0; j<4; j++)
-		{
+
+		// Draw far cloudy fog thing
+		for (u32 j = 0; j < 4; j++) {
 			video::SColor c = cloudyfogcolor;
-			vertices[0] = video::S3DVertex(-1,-1.0,-1, 0,0,1, c, t, t);
-			vertices[1] = video::S3DVertex( 1,-1.0,-1, 0,0,1, c, o, t);
-			vertices[2] = video::S3DVertex( 1, 0.08,-1, 0,0,1, c, o, o);
-			vertices[3] = video::S3DVertex(-1, 0.08,-1, 0,0,1, c, t, o);
-			for(u32 i=0; i<4; i++){
-				if(j==0)
+			vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 0, 1, c, t, t);
+			vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 0, 1, c, o, t);
+			vertices[2] = video::S3DVertex( 1, 0.08, -1, 0, 0, 1, c, o, o);
+			vertices[3] = video::S3DVertex(-1, 0.08, -1, 0, 0, 1, c, t, o);
+			for (u32 i = 0; i < 4; i++) {
+				if (j == 0)
 					// Don't switch
 					{}
-				else if(j==1)
+				else if (j == 1)
 					// Switch from -Z (south) to +X (east)
 					vertices[i].Pos.rotateXZBy(90);
-				else if(j==2)
+				else if (j == 2)
 					// Switch from -Z (south) to -X (west)
 					vertices[i].Pos.rotateXZBy(-90);
 				else
-					// Switch from -Z (south) to -Z (north)
+					// Switch from -Z (south) to +Z (north)
 					vertices[i].Pos.rotateXZBy(-180);
 			}
 			driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 		}
 
+		// Draw bottom far cloudy fog thing
+		video::SColor c = cloudyfogcolor;
+		vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 1, 0, c, t, t);
+		vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 1, 0, c, o, t);
+		vertices[2] = video::S3DVertex( 1, -1.0, 1, 0, 1, 0, c, o, o);
+		vertices[3] = video::S3DVertex(-1, -1.0, 1, 0, 1, 0, c, t, o);
+		driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
+
 		driver->setMaterial(m_materials[2]);
 
+		// Draw sunrise/sunset horizon glow texture (textures/base/pack/sunrisebg.png)
 		{
 			float mid1 = 0.25;
-			float mid = (wicked_time_of_day < 0.5 ? mid1 : (1.0 - mid1));
+			float mid = wicked_time_of_day < 0.5 ? mid1 : (1.0 - mid1);
 			float a_ = 1.0 - fabs(wicked_time_of_day - mid) * 35.0;
 			float a = easeCurve(MYMAX(0, MYMIN(1, a_)));
 			//std::cerr<<"a_="<<a_<<" a="<<a<<std::endl;
-			video::SColor c(255,255,255,255);
-			float y = -(1.0 - a) * 0.2;
-			vertices[0] = video::S3DVertex(-1,-0.05+y,-1, 0,0,1, c, t, t);
-			vertices[1] = video::S3DVertex( 1,-0.05+y,-1, 0,0,1, c, o, t);
-			vertices[2] = video::S3DVertex( 1, 0.2+y,-1, 0,0,1, c, o, o);
-			vertices[3] = video::S3DVertex(-1, 0.2+y,-1, 0,0,1, c, t, o);
-			for(u32 i=0; i<4; i++){
-				if(wicked_time_of_day < 0.5)
+			video::SColor c(255, 255, 255, 255);
+			float y = -(1.0 - a) * 0.22;
+			vertices[0] = video::S3DVertex(-1, -0.05 + y, -1, 0, 0, 1, c, t, t);
+			vertices[1] = video::S3DVertex( 1, -0.05 + y, -1, 0, 0, 1, c, o, t);
+			vertices[2] = video::S3DVertex( 1,   0.2 + y, -1, 0, 0, 1, c, o, o);
+			vertices[3] = video::S3DVertex(-1,   0.2 + y, -1, 0, 0, 1, c, t, o);
+			for (u32 i = 0; i < 4; i++) {
+				if (wicked_time_of_day < 0.5)
 					// Switch from -Z (south) to +X (east)
 					vertices[i].Pos.rotateXZBy(90);
 				else
@@ -256,17 +267,17 @@ void Sky::render()
 		}
 
 		// Draw sun
-		if(wicked_time_of_day > 0.15 && wicked_time_of_day < 0.85){
-			if (!m_sun_texture){
+		if (wicked_time_of_day > 0.15 && wicked_time_of_day < 0.85) {
+			if (!m_sun_texture) {
 				driver->setMaterial(m_materials[1]);
 				float d = sunsize * 1.7;
 				video::SColor c = suncolor;
-				c.setAlpha(0.05*255);
-				vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
-				vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
-				vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
-				vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
-				for(u32 i=0; i<4; i++){
+				c.setAlpha(0.05 * 255);
+				vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+				vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+				vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
+				vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
+				for (u32 i = 0; i < 4; i++) {
 					// Switch from -Z (south) to +X (east)
 					vertices[i].Pos.rotateXZBy(90);
 					vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -275,12 +286,12 @@ void Sky::render()
 
 				d = sunsize * 1.2;
 				c = suncolor;
-				c.setAlpha(0.15*255);
-				vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
-				vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
-				vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
-				vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
-				for(u32 i=0; i<4; i++){
+				c.setAlpha(0.15 * 255);
+				vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+				vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+				vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
+				vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
+				for (u32 i = 0; i < 4; i++) {
 					// Switch from -Z (south) to +X (east)
 					vertices[i].Pos.rotateXZBy(90);
 					vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -288,11 +299,11 @@ void Sky::render()
 				driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 
 				d = sunsize;
-				vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, suncolor, t, t);
-				vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, suncolor, o, t);
-				vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, suncolor, o, o);
-				vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, suncolor, t, o);
-				for(u32 i=0; i<4; i++){
+				vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, suncolor, t, t);
+				vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, suncolor, o, t);
+				vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, suncolor, o, o);
+				vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, suncolor, t, o);
+				for (u32 i = 0; i < 4; i++) {
 					// Switch from -Z (south) to +X (east)
 					vertices[i].Pos.rotateXZBy(90);
 					vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -300,11 +311,11 @@ void Sky::render()
 				driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 
 				d = sunsize * 0.7;
-				vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, suncolor2, t, t);
-				vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, suncolor2, o, t);
-				vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, suncolor2, o, o);
-				vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, suncolor2, t, o);
-				for(u32 i=0; i<4; i++){
+				vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, suncolor2, t, t);
+				vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, suncolor2, o, t);
+				vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, suncolor2, o, o);
+				vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, suncolor2, t, o);
+				for (u32 i = 0; i < 4; i++) {
 					// Switch from -Z (south) to +X (east)
 					vertices[i].Pos.rotateXZBy(90);
 					vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -315,14 +326,14 @@ void Sky::render()
 				float d = sunsize * 1.7;
 				video::SColor c;
 				if (m_sun_tonemap)
-					c = video::SColor (0,0,0,0);
+					c = video::SColor (0, 0, 0, 0);
 				else
-					c = video::SColor (255,255,255,255);
-				vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
-				vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
-				vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
-				vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
-				for(u32 i=0; i<4; i++){
+					c = video::SColor (255, 255, 255, 255);
+				vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+				vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+				vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
+				vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
+				for(u32 i = 0; i < 4; i++) {
 					// Switch from -Z (south) to +X (east)
 					vertices[i].Pos.rotateXZBy(90);
 					vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -332,18 +343,17 @@ void Sky::render()
 		}
 
 		// Draw moon
-		if(wicked_time_of_day < 0.3 || wicked_time_of_day > 0.7)
-		{
-			if (!m_moon_texture){
+		if (wicked_time_of_day < 0.3 || wicked_time_of_day > 0.7) {
+			if (!m_moon_texture) {
 				driver->setMaterial(m_materials[1]);
 				float d = moonsize * 1.9;
 				video::SColor c = mooncolor;
-				c.setAlpha(0.05*255);
-				vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
-				vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
-				vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
-				vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
-				for(u32 i=0; i<4; i++){
+				c.setAlpha(0.05 * 255);
+				vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+				vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+				vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
+				vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
+				for (u32 i = 0; i < 4; i++) {
 					// Switch from -Z (south) to -X (west)
 					vertices[i].Pos.rotateXZBy(-90);
 					vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -352,12 +362,12 @@ void Sky::render()
 			
 				d = moonsize * 1.3;
 				c = mooncolor;
-				c.setAlpha(0.15*255);
-				vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
-				vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
-				vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
-				vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
-				for(u32 i=0; i<4; i++){
+				c.setAlpha(0.15 * 255);
+				vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+				vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+				vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
+				vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
+				for (u32 i = 0; i < 4; i++) {
 					// Switch from -Z (south) to -X (west)
 					vertices[i].Pos.rotateXZBy(-90);
 					vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -365,11 +375,11 @@ void Sky::render()
 				driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 
 				d = moonsize;
-				vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, mooncolor, t, t);
-				vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, mooncolor, o, t);
-				vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, mooncolor, o, o);
-				vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, mooncolor, t, o);
-				for(u32 i=0; i<4; i++){
+				vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, mooncolor, t, t);
+				vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, mooncolor, o, t);
+				vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, mooncolor, o, o);
+				vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, mooncolor, t, o);
+				for (u32 i = 0; i < 4; i++) {
 					// Switch from -Z (south) to -X (west)
 					vertices[i].Pos.rotateXZBy(-90);
 					vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -377,11 +387,11 @@ void Sky::render()
 				driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 
 				float d2 = moonsize * 0.6;
-				vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, mooncolor2, t, t);
-				vertices[1] = video::S3DVertex( d2,-d,-1, 0,0,1, mooncolor2, o, t);
-				vertices[2] = video::S3DVertex( d2, d2,-1, 0,0,1, mooncolor2, o, o);
-				vertices[3] = video::S3DVertex(-d, d2,-1, 0,0,1, mooncolor2, t, o);
-				for(u32 i=0; i<4; i++){
+				vertices[0] = video::S3DVertex(-d, -d,  -1, 0, 0, 1, mooncolor2, t, t);
+				vertices[1] = video::S3DVertex( d2,-d,  -1, 0, 0, 1, mooncolor2, o, t);
+				vertices[2] = video::S3DVertex( d2, d2, -1, 0, 0, 1, mooncolor2, o, o);
+				vertices[3] = video::S3DVertex(-d,  d2, -1, 0, 0, 1, mooncolor2, t, o);
+				for (u32 i = 0; i < 4; i++) {
 					// Switch from -Z (south) to -X (west)
 					vertices[i].Pos.rotateXZBy(-90);
 					vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -392,14 +402,14 @@ void Sky::render()
 				float d = moonsize * 1.9;
 				video::SColor c;
 				if (m_moon_tonemap)
-					c = video::SColor (0,0,0,0);
+					c = video::SColor (0, 0, 0, 0);
 				else
-					c = video::SColor (255,255,255,255);
-				vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
-				vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
-				vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
-				vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
-				for(u32 i=0; i<4; i++){
+					c = video::SColor (255, 255, 255, 255);
+				vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+				vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+				vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
+				vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
+				for (u32 i = 0; i < 4; i++) {
 					// Switch from -Z (south) to -X (west)
 					vertices[i].Pos.rotateXZBy(-90);
 					vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -408,64 +418,63 @@ void Sky::render()
 			}
 		}
 
-		// Stars
+		// Draw stars
 		driver->setMaterial(m_materials[1]);
-		do{
+		do {
 			float starbrightness = MYMAX(0, MYMIN(1,
-					(0.285 - fabs(wicked_time_of_day < 0.5 ?
-					wicked_time_of_day : (1.0 - wicked_time_of_day))) * 10));
+				(0.285 - fabs(wicked_time_of_day < 0.5 ?
+				wicked_time_of_day : (1.0 - wicked_time_of_day))) * 10));
 			float f = starbrightness;
 			float d = 0.007;
-			video::SColor starcolor(255, f*90,f*90,f*90);
-			if(starcolor.getBlue() < m_skycolor.getBlue())
+			video::SColor starcolor(255, f * 90, f * 90, f * 90);
+			if (starcolor.getBlue() < m_skycolor.getBlue())
 				break;
-			u16 indices[SKY_STAR_COUNT*4];
-			video::S3DVertex vertices[SKY_STAR_COUNT*4];
-			for(u32 i=0; i<SKY_STAR_COUNT; i++){
-				indices[i*4+0] = i*4+0;
-				indices[i*4+1] = i*4+1;
-				indices[i*4+2] = i*4+2;
-				indices[i*4+3] = i*4+3;
+			u16 indices[SKY_STAR_COUNT * 4];
+			video::S3DVertex vertices[SKY_STAR_COUNT * 4];
+			for (u32 i = 0; i < SKY_STAR_COUNT; i++) {
+				indices[i * 4 + 0] = i * 4 + 0;
+				indices[i * 4 + 1] = i * 4 + 1;
+				indices[i * 4 + 2] = i * 4 + 2;
+				indices[i * 4 + 3] = i * 4 + 3;
 				v3f p = m_stars[i];
 				core::CMatrix4<f32> a;
-				a.buildRotateFromTo(v3f(0,1,0), v3f(d,1+d/2,0));
+				a.buildRotateFromTo(v3f(0, 1, 0), v3f(d, 1 + d / 2, 0));
 				v3f p1 = p;
 				a.rotateVect(p1);
-				a.buildRotateFromTo(v3f(0,1,0), v3f(d,1,d));
+				a.buildRotateFromTo(v3f(0, 1, 0), v3f(d, 1, d));
 				v3f p2 = p;
 				a.rotateVect(p2);
-				a.buildRotateFromTo(v3f(0,1,0), v3f(0,1-d/2,d));
+				a.buildRotateFromTo(v3f(0, 1, 0), v3f(0, 1 - d / 2, d));
 				v3f p3 = p;
 				a.rotateVect(p3);
 				p.rotateXYBy(wicked_time_of_day * 360 - 90);
 				p1.rotateXYBy(wicked_time_of_day * 360 - 90);
 				p2.rotateXYBy(wicked_time_of_day * 360 - 90);
 				p3.rotateXYBy(wicked_time_of_day * 360 - 90);
-				vertices[i*4+0].Pos = p;
-				vertices[i*4+0].Color = starcolor;
-				vertices[i*4+1].Pos = p1;
-				vertices[i*4+1].Color = starcolor;
-				vertices[i*4+2].Pos = p2;
-				vertices[i*4+2].Color = starcolor;
-				vertices[i*4+3].Pos = p3;
-				vertices[i*4+3].Color = starcolor;
+				vertices[i * 4 + 0].Pos = p;
+				vertices[i * 4 + 0].Color = starcolor;
+				vertices[i * 4 + 1].Pos = p1;
+				vertices[i * 4 + 1].Color = starcolor;
+				vertices[i * 4 + 2].Pos = p2;
+				vertices[i * 4 + 2].Color = starcolor;
+				vertices[i * 4 + 3].Pos = p3;
+				vertices[i * 4 + 3].Color = starcolor;
 			}
-			driver->drawVertexPrimitiveList(vertices, SKY_STAR_COUNT*4,
-					indices, SKY_STAR_COUNT, video::EVT_STANDARD,
-					scene::EPT_QUADS, video::EIT_16BIT);
-		}while(0);
+			driver->drawVertexPrimitiveList(vertices, SKY_STAR_COUNT * 4,
+				indices, SKY_STAR_COUNT, video::EVT_STANDARD,
+				scene::EPT_QUADS, video::EIT_16BIT);
+		} while(0);
 		
-		for(u32 j=0; j<2; j++)
-		{
-			//video::SColor c = m_skycolor;
+		// Draw far cloudy fog thing below east and west horizons
+		for (u32 j = 0; j < 2; j++) {
 			video::SColor c = cloudyfogcolor;
-			vertices[0] = video::S3DVertex(-1,-1.0,-1, 0,0,1, c, t, t);
-			vertices[1] = video::S3DVertex( 1,-1.0,-1, 0,0,1, c, o, t);
-			vertices[2] = video::S3DVertex( 1,-0.02,-1, 0,0,1, c, o, o);
-			vertices[3] = video::S3DVertex(-1,-0.02,-1, 0,0,1, c, t, o);
-			for(u32 i=0; i<4; i++){
-				//if(wicked_time_of_day < 0.5)
-				if(j==0)
+			vertices[0] = video::S3DVertex(-1, -1.0,  -1, 0, 0, 1, c, t, t);
+			vertices[1] = video::S3DVertex( 1, -1.0,  -1, 0, 0, 1, c, o, t);
+			vertices[2] = video::S3DVertex( 1, -0.02, -1, 0, 0, 1, c, o, o);
+			vertices[3] = video::S3DVertex(-1, -0.02, -1, 0, 0, 1, c, t, o);
+			for (u32 i = 0; i < 4; i++) {
+				//if (wicked_time_of_day < 0.5)
+				if (j == 0)
 					// Switch from -Z (south) to +X (east)
 					vertices[i].Pos.rotateXZBy(90);
 				else
@@ -477,20 +486,21 @@ void Sky::render()
 	}
 }
 
+
 void Sky::update(float time_of_day, float time_brightness,
 		float direct_brightness, bool sunlight_seen,
 		CameraMode cam_mode, float yaw, float pitch)
 {
 	// Stabilize initial brightness and color values by flooding updates
-	if(m_first_update){
+	if (m_first_update) {
 		/*dstream<<"First update with time_of_day="<<time_of_day
 				<<" time_brightness="<<time_brightness
 				<<" direct_brightness="<<direct_brightness
 				<<" sunlight_seen="<<sunlight_seen<<std::endl;*/
 		m_first_update = false;
-		for(u32 i=0; i<100; i++){
+		for (u32 i = 0; i < 100; i++) {
 			update(time_of_day, time_brightness, direct_brightness,
-					sunlight_seen, cam_mode, yaw, pitch);
+				sunlight_seen, cam_mode, yaw, pitch);
 		}
 		return;
 	}
@@ -501,39 +511,42 @@ void Sky::update(float time_of_day, float time_brightness,
 	
 	bool is_dawn = (time_brightness >= 0.20 && time_brightness < 0.35);
 
-	//video::SColorf bgcolor_bright_normal_f(170./255,200./255,230./255, 1.0);
-	video::SColorf bgcolor_bright_normal_f(155./255,193./255,240./255, 1.0);
-	video::SColorf bgcolor_bright_indoor_f(100./255,100./255,100./255, 1.0);
-	//video::SColorf bgcolor_bright_dawn_f(0.666,200./255*0.7,230./255*0.5,1.0);
-	//video::SColorf bgcolor_bright_dawn_f(0.666,0.549,0.220,1.0);
-	//video::SColorf bgcolor_bright_dawn_f(0.666*1.2,0.549*1.0,0.220*1.0, 1.0);
-	//video::SColorf bgcolor_bright_dawn_f(0.666*1.2,0.549*1.0,0.220*1.2,1.0);
-	video::SColorf bgcolor_bright_dawn_f
-			(155./255*1.2,193./255,240./255, 1.0);
-
-	video::SColorf skycolor_bright_normal_f =
-			video::SColor(255, 140, 186, 250);
-	video::SColorf skycolor_bright_dawn_f =
-			video::SColor(255, 180, 186, 250);
+	/*
+	Development colours
+
+	video::SColorf bgcolor_bright_normal_f(170. / 255, 200. / 255, 230. / 255, 1.0);
+	video::SColorf bgcolor_bright_dawn_f(0.666, 200. / 255 * 0.7, 230. / 255 * 0.5, 1.0);
+	video::SColorf bgcolor_bright_dawn_f(0.666, 0.549, 0.220, 1.0);
+	video::SColorf bgcolor_bright_dawn_f(0.666 * 1.2, 0.549 * 1.0, 0.220 * 1.0, 1.0);
+	video::SColorf bgcolor_bright_dawn_f(0.666 * 1.2, 0.549 * 1.0, 0.220 * 1.2, 1.0);
+
+	video::SColorf cloudcolor_bright_dawn_f(1.0, 0.591, 0.4);
+	video::SColorf cloudcolor_bright_dawn_f(1.0, 0.65, 0.44);
+	video::SColorf cloudcolor_bright_dawn_f(1.0, 0.7, 0.5);
+	*/
+
+	video::SColorf bgcolor_bright_normal_f = video::SColor(255, 155, 193, 240);
+	video::SColorf bgcolor_bright_indoor_f = video::SColor(255, 100, 100, 100);
+	video::SColorf bgcolor_bright_dawn_f = video::SColor(255, 186, 193, 240);
+	video::SColorf bgcolor_bright_night_f = video::SColor(255, 64, 144, 255);
+
+	video::SColorf skycolor_bright_normal_f = video::SColor(255, 140, 186, 250);
+	video::SColorf skycolor_bright_dawn_f = video::SColor(255, 180, 186, 250);
+	video::SColorf skycolor_bright_night_f = video::SColor(255, 0, 107, 255);
 	
-	video::SColorf cloudcolor_bright_normal_f =
-			video::SColor(255, 240,240,255);
-	//video::SColorf cloudcolor_bright_dawn_f(1.0, 0.591, 0.4);
-	//video::SColorf cloudcolor_bright_dawn_f(1.0, 0.65, 0.44);
-	//video::SColorf cloudcolor_bright_dawn_f(1.0, 0.7, 0.5);
-	video::SColorf cloudcolor_bright_dawn_f(1.0, 0.875, 0.75);
+	video::SColorf cloudcolor_bright_normal_f = video::SColor(255, 240, 240, 255);
+	video::SColorf cloudcolor_bright_dawn_f = video::SColor(255, 255, 223, 191);
 
 	float cloud_color_change_fraction = 0.95;
-	if(sunlight_seen){
-		if(fabs(time_brightness - m_brightness) < 0.2){
+	if (sunlight_seen) {
+		if (fabs(time_brightness - m_brightness) < 0.2) {
 			m_brightness = m_brightness * 0.95 + time_brightness * 0.05;
 		} else {
 			m_brightness = m_brightness * 0.80 + time_brightness * 0.20;
 			cloud_color_change_fraction = 0.0;
 		}
-	}
-	else{
-		if(direct_brightness < m_brightness)
+	} else {
+		if (direct_brightness < m_brightness)
 			m_brightness = m_brightness * 0.95 + direct_brightness * 0.05;
 		else
 			m_brightness = m_brightness * 0.98 + direct_brightness * 0.02;
@@ -541,29 +554,37 @@ void Sky::update(float time_of_day, float time_brightness,
 	
 	m_clouds_visible = true;
 	float color_change_fraction = 0.98;
-	if(sunlight_seen){
-		if(is_dawn){
+	if (sunlight_seen) {
+		if (is_dawn) {  // Dawn
 			m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated(
-					bgcolor_bright_dawn_f, color_change_fraction);
+				bgcolor_bright_dawn_f, color_change_fraction);
 			m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated(
-					skycolor_bright_dawn_f, color_change_fraction);
+				skycolor_bright_dawn_f, color_change_fraction);
 			m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated(
-					cloudcolor_bright_dawn_f, color_change_fraction);
+				cloudcolor_bright_dawn_f, color_change_fraction);
 		} else {
-			m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated(
+			if (time_brightness < 0.07) {  // Night
+				m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated(
+					bgcolor_bright_night_f, color_change_fraction);
+				m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated(
+					skycolor_bright_night_f, color_change_fraction);
+			} else {  // Day
+				m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated(
 					bgcolor_bright_normal_f, color_change_fraction);
-			m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated(
+				m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated(
 					skycolor_bright_normal_f, color_change_fraction);
+			}
+
 			m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated(
-					cloudcolor_bright_normal_f, color_change_fraction);
+				cloudcolor_bright_normal_f, color_change_fraction);
 		}
 	} else {
 		m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated(
-				bgcolor_bright_indoor_f, color_change_fraction);
+			bgcolor_bright_indoor_f, color_change_fraction);
 		m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated(
-				bgcolor_bright_indoor_f, color_change_fraction);
+			bgcolor_bright_indoor_f, color_change_fraction);
 		m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated(
-				cloudcolor_bright_normal_f, color_change_fraction);
+			cloudcolor_bright_normal_f, color_change_fraction);
 		m_clouds_visible = false;
 	}
 
@@ -572,63 +593,71 @@ void Sky::update(float time_of_day, float time_brightness,
 		255,
 		bgcolor_bright.getRed() * m_brightness,
 		bgcolor_bright.getGreen() * m_brightness,
-		bgcolor_bright.getBlue() * m_brightness);
+		bgcolor_bright.getBlue() * m_brightness
+	);
 
 	video::SColor skycolor_bright = m_skycolor_bright_f.toSColor();
 	m_skycolor = video::SColor(
 		255,
 		skycolor_bright.getRed() * m_brightness,
 		skycolor_bright.getGreen() * m_brightness,
-		skycolor_bright.getBlue() * m_brightness);
+		skycolor_bright.getBlue() * m_brightness
+	);
 
 	// Horizon coloring based on sun and moon direction during sunset and sunrise
 	video::SColor pointcolor = video::SColor(255, 255, 255, m_bgcolor.getAlpha());
 	if (m_directional_colored_fog) {
-		if (m_horizon_blend() != 0)
-		{
-			// calculate hemisphere value from yaw, (inverted in third person front view)
+		if (m_horizon_blend() != 0) {
+			// Calculate hemisphere value from yaw, (inverted in third person front view)
 			s8 dir_factor = 1;
 			if (cam_mode > CAMERA_MODE_THIRD)
 				dir_factor = -1;
-			f32 pointcolor_blend = wrapDegrees_0_360( yaw*dir_factor + 90);
+			f32 pointcolor_blend = wrapDegrees_0_360(yaw * dir_factor + 90);
 			if (pointcolor_blend > 180)
 				pointcolor_blend = 360 - pointcolor_blend;
 			pointcolor_blend /= 180;
-			// bound view angle to determine where transition starts and ends
-			pointcolor_blend = rangelim(1 - pointcolor_blend * 1.375, 0, 1 / 1.375) * 1.375;
-			// combine the colors when looking up or down, otherwise turning looks weird
-			pointcolor_blend += (0.5 - pointcolor_blend) * (1 - MYMIN((90 - std::abs(pitch)) / 90 * 1.5, 1));
-			// invert direction to match where the sun and moon are rising
+			// Bound view angle to determine where transition starts and ends
+			pointcolor_blend = rangelim(1 - pointcolor_blend * 1.375, 0, 1 / 1.375) *
+				1.375;
+			// Combine the colors when looking up or down, otherwise turning looks weird
+			pointcolor_blend += (0.5 - pointcolor_blend) *
+				(1 - MYMIN((90 - std::fabs(pitch)) / 90 * 1.5, 1));
+			// Invert direction to match where the sun and moon are rising
 			if (m_time_of_day > 0.5)
 				pointcolor_blend = 1 - pointcolor_blend;
-			// horizon colors of sun and moon
+			// Horizon colors of sun and moon
 			f32 pointcolor_light = rangelim(m_time_brightness * 3, 0.2, 1);
 
 			video::SColorf pointcolor_sun_f(1, 1, 1, 1);
-			if (m_sun_tonemap)
-			{
-				pointcolor_sun_f.r = pointcolor_light * (float)m_materials[3].EmissiveColor.getRed() / 255;
-				pointcolor_sun_f.b = pointcolor_light * (float)m_materials[3].EmissiveColor.getBlue() / 255;
-				pointcolor_sun_f.g = pointcolor_light * (float)m_materials[3].EmissiveColor.getGreen() / 255;
-			}
-			else
-			{
+			if (m_sun_tonemap) {
+				pointcolor_sun_f.r = pointcolor_light *
+					(float)m_materials[3].EmissiveColor.getRed() / 255;
+				pointcolor_sun_f.b = pointcolor_light *
+					(float)m_materials[3].EmissiveColor.getBlue() / 255;
+				pointcolor_sun_f.g = pointcolor_light *
+					(float)m_materials[3].EmissiveColor.getGreen() / 255;
+			} else {
 				pointcolor_sun_f.r = pointcolor_light * 1;
-				pointcolor_sun_f.b = pointcolor_light * (0.25 + (rangelim(m_time_brightness, 0.25, 0.75) - 0.25) * 2 * 0.75);
-				pointcolor_sun_f.g = pointcolor_light * (pointcolor_sun_f.b * 0.375 + (rangelim(m_time_brightness, 0.05, 0.15) - 0.05) * 10 * 0.625);
+				pointcolor_sun_f.b = pointcolor_light *
+					(0.25 + (rangelim(m_time_brightness, 0.25, 0.75) - 0.25) * 2 * 0.75);
+				pointcolor_sun_f.g = pointcolor_light * (pointcolor_sun_f.b * 0.375 +
+					(rangelim(m_time_brightness, 0.05, 0.15) - 0.05) * 10 * 0.625);
 			}
 
-			video::SColorf pointcolor_moon_f(0.5 * pointcolor_light, 0.6 * pointcolor_light, 0.8 * pointcolor_light, 1);
-			if (m_moon_tonemap)
-			{
-				pointcolor_moon_f.r = pointcolor_light * (float)m_materials[4].EmissiveColor.getRed() / 255;
-				pointcolor_moon_f.b = pointcolor_light * (float)m_materials[4].EmissiveColor.getBlue() / 255;
-				pointcolor_moon_f.g = pointcolor_light * (float)m_materials[4].EmissiveColor.getGreen() / 255;
+			video::SColorf pointcolor_moon_f(0.5 * pointcolor_light,
+				0.6 * pointcolor_light, 0.8 * pointcolor_light, 1);
+			if (m_moon_tonemap) {
+				pointcolor_moon_f.r = pointcolor_light *
+					(float)m_materials[4].EmissiveColor.getRed() / 255;
+				pointcolor_moon_f.b = pointcolor_light *
+					(float)m_materials[4].EmissiveColor.getBlue() / 255;
+				pointcolor_moon_f.g = pointcolor_light *
+					(float)m_materials[4].EmissiveColor.getGreen() / 255;
 			}
 
 			video::SColor pointcolor_sun = pointcolor_sun_f.toSColor();
 			video::SColor pointcolor_moon = pointcolor_moon_f.toSColor();
-			// calculate the blend color
+			// Calculate the blend color
 			pointcolor = m_mix_scolor(pointcolor_moon, pointcolor_sun, pointcolor_blend);
 		}
 		m_bgcolor = m_mix_scolor(m_bgcolor, pointcolor, m_horizon_blend() * 0.5);
@@ -636,29 +665,29 @@ void Sky::update(float time_of_day, float time_brightness,
 	}
 
 	float cloud_direct_brightness = 0;
-	if(sunlight_seen) {
+	if (sunlight_seen) {
 		if (!m_directional_colored_fog) {
 			cloud_direct_brightness = time_brightness;
-			if(time_brightness >= 0.2 && time_brightness < 0.7)
+			if (time_brightness >= 0.2 && time_brightness < 0.7)
 				cloud_direct_brightness *= 1.3;
-		}
-		else {
-			cloud_direct_brightness = MYMIN(m_horizon_blend() * 0.15 + m_time_brightness, 1);
+		} else {
+			cloud_direct_brightness = MYMIN(m_horizon_blend() * 0.15 +
+				m_time_brightness, 1);
 		}
 	} else {
 		cloud_direct_brightness = direct_brightness;
 	}
+
 	m_cloud_brightness = m_cloud_brightness * cloud_color_change_fraction +
-			cloud_direct_brightness * (1.0 - cloud_color_change_fraction);
+		cloud_direct_brightness * (1.0 - cloud_color_change_fraction);
 	m_cloudcolor_f = video::SColorf(
-			m_cloudcolor_bright_f.r * m_cloud_brightness,
-			m_cloudcolor_bright_f.g * m_cloud_brightness,
-			m_cloudcolor_bright_f.b * m_cloud_brightness,
-			1.0);
+		m_cloudcolor_bright_f.r * m_cloud_brightness,
+		m_cloudcolor_bright_f.g * m_cloud_brightness,
+		m_cloudcolor_bright_f.b * m_cloud_brightness,
+		1.0
+	);
 	if (m_directional_colored_fog) {
-		m_cloudcolor_f = m_mix_scolorf(m_cloudcolor_f, video::SColorf(pointcolor), m_horizon_blend() * 0.25);
+		m_cloudcolor_f = m_mix_scolorf(m_cloudcolor_f,
+			video::SColorf(pointcolor), m_horizon_blend() * 0.25);
 	}
-
 }
-
-
diff --git a/src/sound_openal.cpp b/src/sound_openal.cpp
index e2b6d93..317667f 100644
--- a/src/sound_openal.cpp
+++ b/src/sound_openal.cpp
@@ -41,9 +41,9 @@ with this program; ifnot, write to the Free Software Foundation, Inc.,
 #include "log.h"
 #include "util/numeric.h" // myrand()
 #include "porting.h"
-#include <map>
 #include <vector>
 #include <fstream>
+#include "util/cpp11_container.h"
 
 #define BUFFER_SIZE 30000
 
@@ -144,6 +144,7 @@ SoundBuffer *load_opened_ogg_file(OggVorbis_File *oggFile,
 			ov_clear(oggFile);
 			infostream << "Audio: Error decoding "
 				<< filename_for_logging << std::endl;
+			delete snd;
 			return NULL;
 		}
 
@@ -270,8 +271,8 @@ private:
 	ALCdevice *m_device;
 	ALCcontext *m_context;
 	int m_next_id;
-	std::map<std::string, std::vector<SoundBuffer*> > m_buffers;
-	std::map<int, PlayingSound*> m_sounds_playing;
+	UNORDERED_MAP<std::string, std::vector<SoundBuffer*> > m_buffers;
+	UNORDERED_MAP<int, PlayingSound*> m_sounds_playing;
 	v3f m_listener_pos;
 public:
 	bool m_is_initialized;
@@ -336,7 +337,7 @@ public:
 		alcCloseDevice(m_device);
 		m_device = NULL;
 
-		for (std::map<std::string, std::vector<SoundBuffer*> >::iterator i = m_buffers.begin();
+		for (UNORDERED_MAP<std::string, std::vector<SoundBuffer*> >::iterator i = m_buffers.begin();
 				i != m_buffers.end(); ++i) {
 			for (std::vector<SoundBuffer*>::iterator iter = (*i).second.begin();
 					iter != (*i).second.end(); ++iter) {
@@ -350,7 +351,7 @@ public:
 
 	void addBuffer(const std::string &name, SoundBuffer *buf)
 	{
-		std::map<std::string, std::vector<SoundBuffer*> >::iterator i =
+		UNORDERED_MAP<std::string, std::vector<SoundBuffer*> >::iterator i =
 				m_buffers.find(name);
 		if(i != m_buffers.end()){
 			i->second.push_back(buf);
@@ -364,7 +365,7 @@ public:
 
 	SoundBuffer* getBuffer(const std::string &name)
 	{
-		std::map<std::string, std::vector<SoundBuffer*> >::iterator i =
+		UNORDERED_MAP<std::string, std::vector<SoundBuffer*> >::iterator i =
 				m_buffers.find(name);
 		if(i == m_buffers.end())
 			return NULL;
@@ -442,8 +443,7 @@ public:
 
 	void deleteSound(int id)
 	{
-		std::map<int, PlayingSound*>::iterator i =
-				m_sounds_playing.find(id);
+		UNORDERED_MAP<int, PlayingSound*>::iterator i = m_sounds_playing.find(id);
 		if(i == m_sounds_playing.end())
 			return;
 		PlayingSound *sound = i->second;
@@ -483,10 +483,8 @@ public:
 				<<m_sounds_playing.size()<<" playing sounds, "
 				<<m_buffers.size()<<" sound names loaded"<<std::endl;
 		std::set<int> del_list;
-		for(std::map<int, PlayingSound*>::iterator
-				i = m_sounds_playing.begin();
-				i != m_sounds_playing.end(); ++i)
-		{
+		for(UNORDERED_MAP<int, PlayingSound*>::iterator i = m_sounds_playing.begin();
+				i != m_sounds_playing.end(); ++i) {
 			int id = i->first;
 			PlayingSound *sound = i->second;
 			// If not playing, remove it
@@ -582,9 +580,8 @@ public:
 	}
 	void updateSoundPosition(int id, v3f pos)
 	{
-		std::map<int, PlayingSound*>::iterator i =
-				m_sounds_playing.find(id);
-		if(i == m_sounds_playing.end())
+		UNORDERED_MAP<int, PlayingSound*>::iterator i = m_sounds_playing.find(id);
+		if (i == m_sounds_playing.end())
 			return;
 		PlayingSound *sound = i->second;
 
diff --git a/src/subgame.cpp b/src/subgame.cpp
index 7e9a0b3..55bbd39 100644
--- a/src/subgame.cpp
+++ b/src/subgame.cpp
@@ -313,8 +313,8 @@ bool loadGameConfAndInitWorld(const std::string &path, const SubgameSpec &gamesp
 		Settings conf;
 		MapgenParams params;
 
-		params.load(*g_settings);
-		params.save(conf);
+		params.readParams(g_settings);
+		params.writeParams(&conf);
 		conf.writeLines(oss);
 		oss << "[end_of_params]\n";
 
diff --git a/src/terminal_chat_console.cpp b/src/terminal_chat_console.cpp
index c86a960..a8c4eba 100644
--- a/src/terminal_chat_console.cpp
+++ b/src/terminal_chat_console.cpp
@@ -345,9 +345,11 @@ void TerminalChatConsole::step(int ch)
 		if (p.first > m_log_level)
 			continue;
 
-		m_chat_backend.addMessage(
-			utf8_to_wide(Logger::getLevelLabel(p.first)),
-			utf8_to_wide(p.second));
+		std::wstring error_message = utf8_to_wide(Logger::getLevelLabel(p.first));
+		if (!g_settings->getBool("disable_escape_sequences")) {
+			error_message = L"\x1b(c at red)" + error_message + L"\x1b(c at white)";
+		}
+		m_chat_backend.addMessage(error_message, utf8_to_wide(p.second));
 	}
 
 	// handle input
@@ -438,7 +440,7 @@ void TerminalChatConsole::draw_text()
 			continue;
 		for (u32 i = 0; i < line.fragments.size(); ++i) {
 			const ChatFormattedFragment& fragment = line.fragments[i];
-			addstr(wide_to_utf8(fragment.text).c_str());
+			addstr(wide_to_utf8(fragment.text.getString()).c_str());
 		}
 	}
 }
diff --git a/src/threading/event.cpp b/src/threading/event.cpp
index 165f9d8..0d5928f 100644
--- a/src/threading/event.cpp
+++ b/src/threading/event.cpp
@@ -27,8 +27,8 @@ DEALINGS IN THE SOFTWARE.
 
 Event::Event()
 {
-#if __cplusplus < 201103L
-#	ifdef _WIN32
+#ifndef USE_CPP11_MUTEX
+#	if USE_WIN_MUTEX
 	event = CreateEvent(NULL, false, false, NULL);
 #	else
 	pthread_cond_init(&cv, NULL);
@@ -38,10 +38,10 @@ Event::Event()
 #endif
 }
 
-#if __cplusplus < 201103L
+#ifndef USE_CPP11_MUTEX
 Event::~Event()
 {
-#ifdef _WIN32
+#if USE_WIN_MUTEX
 	CloseHandle(event);
 #else
 	pthread_cond_destroy(&cv);
@@ -53,13 +53,13 @@ Event::~Event()
 
 void Event::wait()
 {
-#if __cplusplus >= 201103L
+#if USE_CPP11_MUTEX
 	MutexAutoLock lock(mutex);
 	while (!notified) {
 		cv.wait(lock);
 	}
 	notified = false;
-#elif defined(_WIN32)
+#elif USE_WIN_MUTEX
 	WaitForSingleObject(event, INFINITE);
 #else
 	pthread_mutex_lock(&mutex);
@@ -74,11 +74,11 @@ void Event::wait()
 
 void Event::signal()
 {
-#if __cplusplus >= 201103L
+#if USE_CPP11_MUTEX
 	MutexAutoLock lock(mutex);
 	notified = true;
 	cv.notify_one();
-#elif defined(_WIN32)
+#elif USE_WIN_MUTEX
 	SetEvent(event);
 #else
 	pthread_mutex_lock(&mutex);
diff --git a/src/threading/event.h b/src/threading/event.h
index dd51645..26cb899 100644
--- a/src/threading/event.h
+++ b/src/threading/event.h
@@ -26,17 +26,12 @@ DEALINGS IN THE SOFTWARE.
 #ifndef THREADING_EVENT_H
 #define THREADING_EVENT_H
 
-#if __cplusplus >= 201103L
+#include "threads.h"
+
+#if USE_CPP11_MUTEX
 	#include <condition_variable>
 	#include "threading/mutex.h"
 	#include "threading/mutex_auto_lock.h"
-#elif defined(_WIN32)
-	#ifndef WIN32_LEAN_AND_MEAN
-		#define WIN32_LEAN_AND_MEAN
-	#endif
-	#include <windows.h>
-#else
-	#include <pthread.h>
 #endif
 
 
@@ -49,18 +44,18 @@ DEALINGS IN THE SOFTWARE.
 class Event {
 public:
 	Event();
-#if __cplusplus < 201103L
+#ifndef USE_CPP11_MUTEX
 	~Event();
 #endif
 	void wait();
 	void signal();
 
 private:
-#if __cplusplus >= 201103L
+#if USE_CPP11_MUTEX
 	std::condition_variable cv;
 	Mutex mutex;
 	bool notified;
-#elif defined(_WIN32)
+#elif USE_WIN_MUTEX
 	HANDLE event;
 #else
 	pthread_cond_t cv;
diff --git a/src/threading/mutex.cpp b/src/threading/mutex.cpp
index f2b07be..0908b5d 100644
--- a/src/threading/mutex.cpp
+++ b/src/threading/mutex.cpp
@@ -23,14 +23,13 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 */
 
-// Windows std::mutex is much slower than the critical section API
-#if __cplusplus < 201103L || defined(_WIN32)
+#include "threads.h"
+
+#ifndef USE_CPP11_MUTEX
 
 #include "threading/mutex.h"
 
-#ifndef _WIN32
-	#include <cassert>
-#endif
+#include <cassert>
 
 #define UNUSED(expr) do { (void)(expr); } while (0)
 
@@ -47,7 +46,7 @@ Mutex::Mutex(bool recursive)
 
 void Mutex::init_mutex(bool recursive)
 {
-#ifdef _WIN32
+#if USE_WIN_MUTEX
 	// Windows critical sections are recursive by default
 	UNUSED(recursive);
 
@@ -69,7 +68,7 @@ void Mutex::init_mutex(bool recursive)
 
 Mutex::~Mutex()
 {
-#ifdef _WIN32
+#if USE_WIN_MUTEX
 	DeleteCriticalSection(&mutex);
 #else
 	int ret = pthread_mutex_destroy(&mutex);
@@ -80,7 +79,7 @@ Mutex::~Mutex()
 
 void Mutex::lock()
 {
-#ifdef _WIN32
+#if USE_WIN_MUTEX
 	EnterCriticalSection(&mutex);
 #else
 	int ret = pthread_mutex_lock(&mutex);
@@ -91,7 +90,7 @@ void Mutex::lock()
 
 void Mutex::unlock()
 {
-#ifdef _WIN32
+#if USE_WIN_MUTEX
 	LeaveCriticalSection(&mutex);
 #else
 	int ret = pthread_mutex_unlock(&mutex);
@@ -104,5 +103,5 @@ RecursiveMutex::RecursiveMutex()
 	: Mutex(true)
 {}
 
-#endif
+#endif // C++11
 
diff --git a/src/threading/mutex.h b/src/threading/mutex.h
index dadbd05..fb5c029 100644
--- a/src/threading/mutex.h
+++ b/src/threading/mutex.h
@@ -26,14 +26,15 @@ DEALINGS IN THE SOFTWARE.
 #ifndef THREADING_MUTEX_H
 #define THREADING_MUTEX_H
 
-// Windows std::mutex is much slower than the critical section API
-#if __cplusplus >= 201103L && !defined(_WIN32)
+#include "threads.h"
+
+#if USE_CPP11_MUTEX
 	#include <mutex>
 	using Mutex = std::mutex;
 	using RecursiveMutex = std::recursive_mutex;
 #else
 
-#ifdef _WIN32
+#if USE_WIN_MUTEX
 	#ifndef _WIN32_WINNT
 		#define _WIN32_WINNT 0x0501
 	#endif
@@ -41,7 +42,7 @@ DEALINGS IN THE SOFTWARE.
 		#define WIN32_LEAN_AND_MEAN
 	#endif
 	#include <windows.h>
-#else // pthread
+#else
 	#include <pthread.h>
 #endif
 
@@ -59,9 +60,9 @@ protected:
 	Mutex(bool recursive);
 	void init_mutex(bool recursive);
 private:
-#ifdef _WIN32
+#if USE_WIN_MUTEX
 	CRITICAL_SECTION mutex;
-#else // pthread
+#else
 	pthread_mutex_t mutex;
 #endif
 
@@ -76,6 +77,6 @@ public:
 	DISABLE_CLASS_COPY(RecursiveMutex);
 };
 
-#endif  // C++11
+#endif // C++11
 
 #endif
diff --git a/src/threading/mutex_auto_lock.h b/src/threading/mutex_auto_lock.h
index 25caf7e..d79c68a 100644
--- a/src/threading/mutex_auto_lock.h
+++ b/src/threading/mutex_auto_lock.h
@@ -26,7 +26,9 @@ DEALINGS IN THE SOFTWARE.
 #ifndef THREADING_MUTEX_AUTO_LOCK_H
 #define THREADING_MUTEX_AUTO_LOCK_H
 
-#if __cplusplus >= 201103L
+#include "threads.h"
+
+#if USE_CPP11_MUTEX
 	#include <mutex>
 	using MutexAutoLock = std::unique_lock<std::mutex>;
 	using RecursiveMutexAutoLock = std::unique_lock<std::recursive_mutex>;
diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp
index 5161a6c..fbe4ba1 100644
--- a/src/threading/thread.cpp
+++ b/src/threading/thread.cpp
@@ -54,7 +54,7 @@ DEALINGS IN THE SOFTWARE.
 
 
 // for setName
-#if defined(linux) || defined(__linux)
+#if defined(__linux__)
 	#include <sys/prctl.h>
 #elif defined(__FreeBSD__) || defined(__OpenBSD__)
 	#include <pthread_np.h>
@@ -70,7 +70,7 @@ DEALINGS IN THE SOFTWARE.
 // for bindToProcessor
 #if __FreeBSD_version >= 702106
 	typedef cpuset_t cpu_set_t;
-#elif defined(__linux) || defined(linux)
+#elif defined(__linux__)
 	#include <sched.h>
 #elif defined(__sun) || defined(sun)
 	#include <sys/types.h>
@@ -198,7 +198,7 @@ bool Thread::kill()
 
 	m_running = false;
 
-#ifdef _WIN32
+#if USE_WIN_THREADS
 	TerminateThread(m_thread_handle, 0);
 	CloseHandle(m_thread_handle);
 #else
@@ -261,7 +261,7 @@ DWORD WINAPI Thread::threadProc(LPVOID param)
 
 void Thread::setName(const std::string &name)
 {
-#if defined(linux) || defined(__linux)
+#if defined(__linux__)
 
 	// It would be cleaner to do this with pthread_setname_np,
 	// which was added to glibc in version 2.12, but some major
@@ -310,10 +310,16 @@ void Thread::setName(const std::string &name)
 
 unsigned int Thread::getNumberOfProcessors()
 {
-#if __cplusplus >= 201103L
+#if USE_CPP11_THREADS
 
 	return std::thread::hardware_concurrency();
 
+#elif USE_WIN_THREADS
+
+	SYSTEM_INFO sysinfo;
+	GetSystemInfo(&sysinfo);
+	return sysinfo.dwNumberOfProcessors;
+
 #elif defined(_SC_NPROCESSORS_ONLN)
 
 	return sysconf(_SC_NPROCESSORS_ONLN);
@@ -335,12 +341,6 @@ unsigned int Thread::getNumberOfProcessors()
 
 	return get_nprocs();
 
-#elif defined(_WIN32)
-
-	SYSTEM_INFO sysinfo;
-	GetSystemInfo(&sysinfo);
-	return sysinfo.dwNumberOfProcessors;
-
 #elif defined(PTW32_VERSION) || defined(__hpux)
 
 	return pthread_num_processors_np();
@@ -359,11 +359,11 @@ bool Thread::bindToProcessor(unsigned int proc_number)
 
 	return false;
 
-#elif defined(_WIN32)
+#elif USE_WIN_THREADS
 
 	return SetThreadAffinityMask(getThreadHandle(), 1 << proc_number);
 
-#elif __FreeBSD_version >= 702106 || defined(__linux) || defined(linux)
+#elif __FreeBSD_version >= 702106 || defined(__linux__)
 
 	cpu_set_t cpuset;
 
@@ -407,7 +407,7 @@ bool Thread::bindToProcessor(unsigned int proc_number)
 
 bool Thread::setPriority(int prio)
 {
-#if defined(_WIN32)
+#if USE_WIN_THREADS
 
 	return SetThreadPriority(getThreadHandle(), prio);
 
diff --git a/src/threading/thread.h b/src/threading/thread.h
index de800ec..14a0e13 100644
--- a/src/threading/thread.h
+++ b/src/threading/thread.h
@@ -32,9 +32,6 @@ DEALINGS IN THE SOFTWARE.
 #include "threads.h"
 
 #include <string>
-#if USE_CPP11_THREADS
-	#include <thread> // for std::thread
-#endif
 #ifdef _AIX
 	#include <sys/thread.h> // for tid_t
 #endif
@@ -157,9 +154,11 @@ private:
 	Atomic<bool> m_running;
 	Mutex m_mutex;
 
-#ifndef USE_CPP11_THREADS
+#if USE_CPP11_THREADS
+	std::thread *m_thread_obj;
+#else
 	threadhandle_t m_thread_handle;
-#   if _WIN32
+#   if USE_WIN_THREADS
         threadid_t m_thread_id;
 #   endif
 #endif
@@ -172,10 +171,6 @@ private:
 	tid_t m_kernel_thread_id;
 #endif
 
-#if USE_CPP11_THREADS
-	std::thread *m_thread_obj;
-#endif
-
 	DISABLE_CLASS_COPY(Thread);
 };
 
diff --git a/src/threads.h b/src/threads.h
index d4306f6..ce98593 100644
--- a/src/threads.h
+++ b/src/threads.h
@@ -21,7 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define THREADS_HEADER
 
 //
-// Determine which threading API we will use
+// Determine which threading APIs we will use
 //
 #if __cplusplus >= 201103L
 	#define USE_CPP11_THREADS 1
@@ -31,11 +31,27 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 	#define USE_POSIX_THREADS 1
 #endif
 
+#if defined(_WIN32)
+	// Prefer critical section API because std::mutex is much slower on Windows
+	#define USE_WIN_MUTEX 1
+#elif __cplusplus >= 201103L
+	#define USE_CPP11_MUTEX 1
+#else
+	#define USE_POSIX_MUTEX 1
+#endif
+
 ///////////////
 
 
 #if USE_CPP11_THREADS
 	#include <thread>
+#elif USE_POSIX_THREADS
+	#include <pthread.h>
+#else
+	#ifndef WIN32_LEAN_AND_MEAN
+		#define WIN32_LEAN_AND_MEAN
+	#endif
+	#include <windows.h>
 #endif
 
 #include "threading/mutex.h"
diff --git a/src/tool.cpp b/src/tool.cpp
index 54b9f15..20b71fb 100644
--- a/src/tool.cpp
+++ b/src/tool.cpp
@@ -34,24 +34,23 @@ void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const
 	writeF1000(os, full_punch_interval);
 	writeS16(os, max_drop_level);
 	writeU32(os, groupcaps.size());
-	for(std::map<std::string, ToolGroupCap>::const_iterator
-			i = groupcaps.begin(); i != groupcaps.end(); ++i){
+	for (ToolGCMap::const_iterator i = groupcaps.begin(); i != groupcaps.end(); ++i) {
 		const std::string *name = &i->first;
 		const ToolGroupCap *cap = &i->second;
 		os<<serializeString(*name);
 		writeS16(os, cap->uses);
 		writeS16(os, cap->maxlevel);
 		writeU32(os, cap->times.size());
-		for(std::map<int, float>::const_iterator
-				i = cap->times.begin(); i != cap->times.end(); ++i){
+		for (UNORDERED_MAP<int, float>::const_iterator
+				i = cap->times.begin(); i != cap->times.end(); ++i) {
 			writeS16(os, i->first);
 			writeF1000(os, i->second);
 		}
 	}
 	if(protocol_version > 17){
 		writeU32(os, damageGroups.size());
-		for(std::map<std::string, s16>::const_iterator
-				i = damageGroups.begin(); i != damageGroups.end(); ++i){
+		for (DamageGroup::const_iterator i = damageGroups.begin();
+			 	i != damageGroups.end(); ++i) {
 			os<<serializeString(i->first);
 			writeS16(os, i->second);
 		}
@@ -106,7 +105,7 @@ DigParams getDigParams(const ItemGroupList &groups,
 	default:
 		break;
 	}
-	
+
 	// Values to be returned (with a bit of conversion)
 	bool result_diggable = false;
 	float result_time = 0.0;
@@ -115,8 +114,8 @@ DigParams getDigParams(const ItemGroupList &groups,
 
 	int level = itemgroup_get(groups, "level");
 	//infostream<<"level="<<level<<std::endl;
-	for(std::map<std::string, ToolGroupCap>::const_iterator
-			i = tp->groupcaps.begin(); i != tp->groupcaps.end(); ++i){
+	for (ToolGCMap::const_iterator i = tp->groupcaps.begin();
+		 	i != tp->groupcaps.end(); ++i) {
 		const std::string &name = i->first;
 		//infostream<<"group="<<name<<std::endl;
 		const ToolGroupCap &cap = i->second;
@@ -163,8 +162,8 @@ HitParams getHitParams(const ItemGroupList &armor_groups,
 	s16 damage = 0;
 	float full_punch_interval = tp->full_punch_interval;
 
-	for(std::map<std::string, s16>::const_iterator
-			i = tp->damageGroups.begin(); i != tp->damageGroups.end(); ++i){
+	for (DamageGroup::const_iterator i = tp->damageGroups.begin();
+			i != tp->damageGroups.end(); ++i) {
 		s16 armor = itemgroup_get(armor_groups, i->first);
 		damage += i->second * rangelim(time_from_last_punch / full_punch_interval, 0.0, 1.0)
 				* armor / 100.0;
@@ -197,7 +196,7 @@ PunchDamageResult getPunchDamage(
 				do_hit = false;
 		}
 	}
-	
+
 	PunchDamageResult result;
 	if(do_hit)
 	{
diff --git a/src/tool.h b/src/tool.h
index 509561a..ebba5b7 100644
--- a/src/tool.h
+++ b/src/tool.h
@@ -23,12 +23,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "irrlichttypes.h"
 #include <string>
 #include <iostream>
-#include <map>
+#include "util/cpp11_container.h"
 #include "itemgroup.h"
 
 struct ToolGroupCap
 {
-	std::map<int, float> times;
+	UNORDERED_MAP<int, float> times;
 	int maxlevel;
 	int uses;
 
@@ -39,8 +39,8 @@ struct ToolGroupCap
 
 	bool getTime(int rating, float *time) const
 	{
-		std::map<int, float>::const_iterator i = times.find(rating);
-		if(i == times.end()){
+		UNORDERED_MAP<int, float>::const_iterator i = times.find(rating);
+		if (i == times.end()) {
 			*time = 0;
 			return false;
 		}
@@ -50,22 +50,19 @@ struct ToolGroupCap
 };
 
 
-// CLANG SUCKS DONKEY BALLS
-typedef std::map<std::string, struct ToolGroupCap> ToolGCMap;
-typedef std::map<std::string, s16> DamageGroup;
+typedef UNORDERED_MAP<std::string, struct ToolGroupCap> ToolGCMap;
+typedef UNORDERED_MAP<std::string, s16> DamageGroup;
 
 struct ToolCapabilities
 {
 	float full_punch_interval;
 	int max_drop_level;
-	// CLANG SUCKS DONKEY BALLS
 	ToolGCMap groupcaps;
 	DamageGroup damageGroups;
 
 	ToolCapabilities(
 			float full_punch_interval_=1.4,
 			int max_drop_level_=1,
-			// CLANG SUCKS DONKEY BALLS
 			ToolGCMap groupcaps_=ToolGCMap(),
 			DamageGroup damageGroups_=DamageGroup()
 	):
diff --git a/src/touchscreengui.cpp b/src/touchscreengui.cpp
index f51b2d5..8d210c6 100644
--- a/src/touchscreengui.cpp
+++ b/src/touchscreengui.cpp
@@ -177,8 +177,10 @@ void AutoHideButtonBar::init(ISimpleTextureSource* tsrc,
 
 AutoHideButtonBar::~AutoHideButtonBar()
 {
-	m_starter.guibutton->setVisible(false);
-	m_starter.guibutton->drop();
+	if (m_starter.guibutton) {
+		m_starter.guibutton->setVisible(false);
+		m_starter.guibutton->drop();
+	}
 }
 
 void AutoHideButtonBar::addButton(touch_gui_button_id button_id,
@@ -414,7 +416,7 @@ void AutoHideButtonBar::show()
 TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, IEventReceiver* receiver):
 	m_device(device),
 	m_guienv(device->getGUIEnvironment()),
-	m_camera_yaw(0.0),
+	m_camera_yaw_change(0.0),
 	m_camera_pitch(0.0),
 	m_visible(false),
 	m_move_id(-1),
@@ -835,17 +837,11 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
 
 					/* adapt to similar behaviour as pc screen */
 					double d         = g_settings->getFloat("mouse_sensitivity") *4;
-					double old_yaw   = m_camera_yaw;
+					double old_yaw   = m_camera_yaw_change;
 					double old_pitch = m_camera_pitch;
 
-					m_camera_yaw   -= dx * d;
-					m_camera_pitch  = MYMIN(MYMAX( m_camera_pitch + (dy * d),-180),180);
-
-					while (m_camera_yaw < 0)
-						m_camera_yaw += 360;
-
-					while (m_camera_yaw > 360)
-						m_camera_yaw -= 360;
+					m_camera_yaw_change -= dx * d;
+					m_camera_pitch = MYMIN(MYMAX(m_camera_pitch + (dy * d), -180), 180);
 
 					// update shootline
 					m_shootline = m_device
diff --git a/src/touchscreengui.h b/src/touchscreengui.h
index d8106a2..53fc6d6 100644
--- a/src/touchscreengui.h
+++ b/src/touchscreengui.h
@@ -75,7 +75,7 @@ struct button_info {
 	float            repeatdelay;
 	irr::EKEY_CODE   keycode;
 	std::vector<int> ids;
-	IGUIButton*      guibutton;
+	IGUIButton*      guibutton = NULL;
 	bool             immediate_release;
 };
 
@@ -147,8 +147,14 @@ public:
 
 	void init(ISimpleTextureSource* tsrc);
 
-	double getYaw() { return m_camera_yaw; }
+	double getYawChange() {
+		double res = m_camera_yaw_change;
+		m_camera_yaw_change = 0;
+		return res;
+	}
+
 	double getPitch() { return m_camera_pitch; }
+
 	line3d<f32> getShootline() { return m_shootline; }
 
 	void step(float dtime);
@@ -170,7 +176,7 @@ private:
 	bool                    m_visible; // is the gui visible
 
 	/* value in degree */
-	double                  m_camera_yaw;
+	double                  m_camera_yaw_change;
 	double                  m_camera_pitch;
 
 	line3d<f32>             m_shootline;
diff --git a/src/treegen.cpp b/src/treegen.cpp
index 208f345..f37bf0e 100644
--- a/src/treegen.cpp
+++ b/src/treegen.cpp
@@ -31,7 +31,7 @@ namespace treegen
 {
 
 void make_tree(MMVManip &vmanip, v3s16 p0,
-		bool is_apple_tree, INodeDefManager *ndef, int seed)
+		bool is_apple_tree, INodeDefManager *ndef, s32 seed)
 {
 	/*
 		NOTE: Tree-placing code is currently duplicated in the engine
@@ -149,7 +149,7 @@ treegen::error make_ltree(MMVManip &vmanip, v3s16 p0,
 		INodeDefManager *ndef, TreeDef tree_definition)
 {
 	MapNode dirtnode(ndef->getId("mapgen_dirt"));
-	int seed;
+	s32 seed;
 	if (tree_definition.explicit_seed)
 		seed = tree_definition.seed + 14002;
 	else
@@ -649,7 +649,7 @@ v3f transposeMatrix(irr::core::matrix4 M, v3f v)
 }
 
 
-void make_jungletree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed)
+void make_jungletree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, s32 seed)
 {
 	/*
 		NOTE: Tree-placing code is currently duplicated in the engine
@@ -748,7 +748,7 @@ void make_jungletree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed
 }
 
 
-void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed)
+void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, s32 seed)
 {
 	/*
 		NOTE: Tree-placing code is currently duplicated in the engine
@@ -770,9 +770,9 @@ void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed)
 	MapNode snownode(c_snow);
 
 	PseudoRandom pr(seed);
-	s16 trunk_h = pr.range(9, 13);
+	u16 trunk_h = pr.range(9, 13);
 	v3s16 p1 = p0;
-	for (s16 ii = 0; ii < trunk_h; ii++) {
+	for (u16 ii = 0; ii < trunk_h; ii++) {
 		if (vmanip.m_area.contains(p1)) {
 			u32 vi = vmanip.m_area.index(p1);
 			vmanip.m_data[vi] = treenode;
@@ -790,7 +790,7 @@ void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed)
 		leaves_d[i] = 0;
 
 	// Upper branches
-	s16 dev = 3;
+	u16 dev = 3;
 	for (s16 yy = -1; yy <= 1; yy++) {
 		for (s16 zz = -dev; zz <= dev; zz++) {
 			u32 i = leaves_a.index(v3s16(-dev, yy, zz));
diff --git a/src/treegen.h b/src/treegen.h
index 4b0089d..4e6f95e 100644
--- a/src/treegen.h
+++ b/src/treegen.h
@@ -54,19 +54,19 @@ namespace treegen {
 		bool thin_branches;
 		MapNode fruitnode;
 		int fruit_chance;
-		int seed;
+		s32 seed;
 		bool explicit_seed;
 	};
 
 	// Add default tree
 	void make_tree(MMVManip &vmanip, v3s16 p0,
-		bool is_apple_tree, INodeDefManager *ndef, int seed);
+		bool is_apple_tree, INodeDefManager *ndef, s32 seed);
 	// Add jungle tree
 	void make_jungletree(MMVManip &vmanip, v3s16 p0,
-		INodeDefManager *ndef, int seed);
+		INodeDefManager *ndef, s32 seed);
 	// Add pine tree
 	void make_pine_tree(MMVManip &vmanip, v3s16 p0,
-		INodeDefManager *ndef, int seed);
+		INodeDefManager *ndef, s32 seed);
 
 	// Add L-Systems tree (used by engine)
 	treegen::error make_ltree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef,
diff --git a/src/unittest/CMakeLists.txt b/src/unittest/CMakeLists.txt
index a07ed8b..7ad3809 100644
--- a/src/unittest/CMakeLists.txt
+++ b/src/unittest/CMakeLists.txt
@@ -6,11 +6,13 @@ set (UNITTEST_SRCS
 	${CMAKE_CURRENT_SOURCE_DIR}/test_connection.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/test_filepath.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/test_inventory.cpp
+	${CMAKE_CURRENT_SOURCE_DIR}/test_map_settings_manager.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/test_mapnode.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/test_nodedef.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/test_noderesolver.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/test_noise.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/test_objdef.cpp
+	${CMAKE_CURRENT_SOURCE_DIR}/test_player.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/test_profiler.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/test_random.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/test_schematic.cpp
@@ -22,3 +24,7 @@ set (UNITTEST_SRCS
 	${CMAKE_CURRENT_SOURCE_DIR}/test_voxelalgorithms.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/test_voxelmanipulator.cpp
 	PARENT_SCOPE)
+
+set (UNITTEST_CLIENT_SRCS
+	${CMAKE_CURRENT_SOURCE_DIR}/test_keycode.cpp
+	PARENT_SCOPE)
diff --git a/src/unittest/test_filepath.cpp b/src/unittest/test_filepath.cpp
index 6ea7ac0..ac2d69b 100644
--- a/src/unittest/test_filepath.cpp
+++ b/src/unittest/test_filepath.cpp
@@ -252,6 +252,9 @@ void TestFilePath::testRemoveRelativePathComponent()
 	path = p(".");
 	result = fs::RemoveRelativePathComponents(path);
 	UASSERT(result == "");
+	path = p("../a");
+	result = fs::RemoveRelativePathComponents(path);
+	UASSERT(result == "");
 	path = p("./subdir/../..");
 	result = fs::RemoveRelativePathComponents(path);
 	UASSERT(result == "");
diff --git a/src/unittest/test_keycode.cpp b/src/unittest/test_keycode.cpp
new file mode 100644
index 0000000..dd3d75a
--- /dev/null
+++ b/src/unittest/test_keycode.cpp
@@ -0,0 +1,129 @@
+/*
+Minetest
+Copyright (C) 2016 sfan5 <sfan5 at live.de>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "test.h"
+
+#include <string>
+#include "exceptions.h"
+#include "keycode.h"
+
+class TestKeycode : public TestBase {
+public:
+	TestKeycode() { TestManager::registerTestModule(this); }
+	const char *getName() { return "TestKeycode"; }
+
+	void runTests(IGameDef *gamedef);
+
+	void testCreateFromString();
+	void testCreateFromSKeyInput();
+	void testCompare();
+};
+
+static TestKeycode g_test_instance;
+
+void TestKeycode::runTests(IGameDef *gamedef)
+{
+	TEST(testCreateFromString);
+	TEST(testCreateFromSKeyInput);
+	TEST(testCompare);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define UASSERTEQ_STR(one, two) UASSERT(strcmp(one, two) == 0)
+
+void TestKeycode::testCreateFromString()
+{
+	KeyPress k;
+
+	// Character key, from char
+	k = KeyPress("R");
+	UASSERTEQ_STR(k.sym(), "KEY_KEY_R");
+	UASSERTCMP(int, >, strlen(k.name()), 0); // should have human description
+
+	// Character key, from identifier
+	k = KeyPress("KEY_KEY_B");
+	UASSERTEQ_STR(k.sym(), "KEY_KEY_B");
+	UASSERTCMP(int, >, strlen(k.name()), 0);
+
+	// Non-Character key, from identifier
+	k = KeyPress("KEY_UP");
+	UASSERTEQ_STR(k.sym(), "KEY_UP");
+	UASSERTCMP(int, >, strlen(k.name()), 0);
+
+	k = KeyPress("KEY_F6");
+	UASSERTEQ_STR(k.sym(), "KEY_F6");
+	UASSERTCMP(int, >, strlen(k.name()), 0);
+
+	// Irrlicht-unknown key, from char
+	k = KeyPress("/");
+	UASSERTEQ_STR(k.sym(), "/");
+	UASSERTCMP(int, >, strlen(k.name()), 0);
+}
+
+void TestKeycode::testCreateFromSKeyInput()
+{
+	KeyPress k;
+	irr::SEvent::SKeyInput in;
+
+	// Character key
+	in.Key = irr::KEY_KEY_3;
+	in.Char = L'3';
+	k = KeyPress(in);
+	UASSERTEQ_STR(k.sym(), "KEY_KEY_3");
+
+	// Non-Character key
+	in.Key = irr::KEY_RSHIFT;
+	in.Char = L'\0';
+	k = KeyPress(in);
+	UASSERTEQ_STR(k.sym(), "KEY_RSHIFT");
+
+	// Irrlicht-unknown key
+	in.Key = irr::KEY_KEY_CODES_COUNT;
+	in.Char = L'?';
+	k = KeyPress(in);
+	UASSERTEQ_STR(k.sym(), "?");
+
+	// prefer_character mode
+	in.Key = irr::KEY_COMMA;
+	in.Char = L'G';
+	k = KeyPress(in, true);
+	UASSERTEQ_STR(k.sym(), "KEY_KEY_G");
+}
+
+void TestKeycode::testCompare()
+{
+	// Basic comparison
+	UASSERT(KeyPress("5") == KeyPress("KEY_KEY_5"));
+	UASSERT(!(KeyPress("5") == KeyPress("KEY_NUMPAD_5")));
+
+	// Matching char suffices
+	// note: This is a real-world example, Irrlicht maps XK_equal to irr::KEY_PLUS on Linux
+	irr::SEvent::SKeyInput in;
+	in.Key = irr::KEY_PLUS;
+	in.Char = L'=';
+	UASSERT(KeyPress("=") == KeyPress(in));
+
+	// Matching keycode suffices
+	irr::SEvent::SKeyInput in2;
+	in.Key = in2.Key = irr::KEY_OEM_CLEAR;
+	in.Char = L'\0';
+	in2.Char = L';';
+	UASSERT(KeyPress(in) == KeyPress(in2));
+}
diff --git a/src/unittest/test_map_settings_manager.cpp b/src/unittest/test_map_settings_manager.cpp
new file mode 100644
index 0000000..4f5ac80
--- /dev/null
+++ b/src/unittest/test_map_settings_manager.cpp
@@ -0,0 +1,261 @@
+ /*
+Minetest
+Copyright (C) 2010-2014 kwolekr, Ryan Kwolek <kwolekr at minetest.net>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "test.h"
+
+#include "noise.h"
+#include "settings.h"
+#include "mapgen_v5.h"
+#include "util/sha1.h"
+#include "map_settings_manager.h"
+
+class TestMapSettingsManager : public TestBase {
+public:
+	TestMapSettingsManager() { TestManager::registerTestModule(this); }
+	const char *getName() { return "TestMapSettingsManager"; }
+
+	void makeUserConfig(Settings *conf);
+	std::string makeMetaFile(bool make_corrupt);
+
+	void runTests(IGameDef *gamedef);
+
+	void testMapSettingsManager();
+	void testMapMetaSaveLoad();
+	void testMapMetaFailures();
+};
+
+static TestMapSettingsManager g_test_instance;
+
+void TestMapSettingsManager::runTests(IGameDef *gamedef)
+{
+	TEST(testMapSettingsManager);
+	TEST(testMapMetaSaveLoad);
+	TEST(testMapMetaFailures);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+
+void check_noise_params(const NoiseParams *np1, const NoiseParams *np2)
+{
+	UASSERTEQ(float, np1->offset, np2->offset);
+	UASSERTEQ(float, np1->scale, np2->scale);
+	UASSERT(np1->spread == np2->spread);
+	UASSERTEQ(s32, np1->seed, np2->seed);
+	UASSERTEQ(u16, np1->octaves, np2->octaves);
+	UASSERTEQ(float, np1->persist, np2->persist);
+	UASSERTEQ(float, np1->lacunarity, np2->lacunarity);
+	UASSERTEQ(u32, np1->flags, np2->flags);
+}
+
+
+std::string read_file_to_string(const std::string &filepath)
+{
+	std::string buf;
+	FILE *f = fopen(filepath.c_str(), "rb");
+	if (!f)
+		return "";
+
+	fseek(f, 0, SEEK_END);
+
+	long filesize = ftell(f);
+	if (filesize == -1) {
+		fclose(f);
+		return "";
+	}
+	rewind(f);
+
+	buf.resize(filesize);
+
+	UASSERTEQ(size_t, fread(&buf[0], 1, filesize, f), 1);
+
+	fclose(f);
+	return buf;
+}
+
+
+void TestMapSettingsManager::makeUserConfig(Settings *conf)
+{
+	conf->set("mg_name", "v7");
+	conf->set("seed", "5678");
+	conf->set("water_level", "20");
+	conf->set("mgv5_np_factor", "0, 12,  (500, 250, 500), 920382, 5, 0.45, 3.0");
+	conf->set("mgv5_np_height", "0, 15, (500, 250, 500), 841746,  5, 0.5,  3.0");
+	conf->set("mgv5_np_filler_depth", "20, 1, (150, 150, 150), 261, 4, 0.7,  1.0");
+	conf->set("mgv5_np_ground", "-43, 40, (80,  80,  80),  983240, 4, 0.55, 2.0");
+}
+
+
+std::string TestMapSettingsManager::makeMetaFile(bool make_corrupt)
+{
+	std::string metafile = getTestTempFile();
+
+	const char *metafile_contents =
+		"mg_name = v5\n"
+		"seed = 1234\n"
+		"mg_flags = light\n"
+		"mgv5_np_filler_depth = 20, 1, (150, 150, 150), 261, 4, 0.7,  1.0\n"
+		"mgv5_np_height = 20, 10, (250, 250, 250), 84174,  4, 0.5,  1.0\n";
+
+	FILE *f = fopen(metafile.c_str(), "wb");
+	UASSERT(f != NULL);
+
+	fputs(metafile_contents, f);
+	if (!make_corrupt)
+		fputs("[end_of_params]\n", f);
+
+	fclose(f);
+
+	return metafile;
+}
+
+
+void TestMapSettingsManager::testMapSettingsManager()
+{
+	Settings user_settings;
+	makeUserConfig(&user_settings);
+
+	std::string test_mapmeta_path = makeMetaFile(false);
+
+	MapSettingsManager mgr(&user_settings, test_mapmeta_path);
+	std::string value;
+
+	UASSERT(mgr.getMapSetting("mg_name", &value));
+	UASSERT(value == "v7");
+
+	// Pretend we're initializing the ServerMap
+	UASSERT(mgr.loadMapMeta());
+
+	// Pretend some scripts are requesting mapgen params
+	UASSERT(mgr.getMapSetting("mg_name", &value));
+	UASSERT(value == "v5");
+	UASSERT(mgr.getMapSetting("seed", &value));
+	UASSERT(value == "1234");
+	UASSERT(mgr.getMapSetting("water_level", &value));
+	UASSERT(value == "20");
+
+    // Pretend we have some mapgen settings configured from the scripting
+	UASSERT(mgr.setMapSetting("water_level", "15"));
+	UASSERT(mgr.setMapSetting("seed", "02468"));
+	UASSERT(mgr.setMapSetting("mg_flags", "nolight", true));
+
+	NoiseParams script_np_filler_depth(0, 100, v3f(200, 100, 200), 261, 4, 0.7, 2.0);
+	NoiseParams script_np_factor(0, 100, v3f(50, 50, 50), 920381, 3, 0.45, 2.0);
+	NoiseParams script_np_height(0, 100, v3f(450, 450, 450), 84174, 4, 0.5, 2.0);
+	NoiseParams meta_np_height(20, 10, v3f(250, 250, 250), 84174,  4, 0.5,  1.0);
+	NoiseParams user_np_ground(-43, 40, v3f(80,  80,  80),  983240, 4, 0.55, 2.0, NOISE_FLAG_EASED);
+
+	mgr.setMapSettingNoiseParams("mgv5_np_filler_depth", &script_np_filler_depth, true);
+	mgr.setMapSettingNoiseParams("mgv5_np_height", &script_np_height);
+	mgr.setMapSettingNoiseParams("mgv5_np_factor", &script_np_factor);
+
+	// Now make our Params and see if the values are correctly sourced
+	MapgenParams *params = mgr.makeMapgenParams();
+	UASSERT(params->mgtype == MAPGEN_V5);
+	UASSERT(params->chunksize == 5);
+	UASSERT(params->water_level == 15);
+	UASSERT(params->seed == 1234);
+	UASSERT((params->flags & MG_LIGHT) == 0);
+
+	MapgenV5Params *v5params = (MapgenV5Params *)params;
+
+	check_noise_params(&v5params->np_filler_depth, &script_np_filler_depth);
+	check_noise_params(&v5params->np_factor, &script_np_factor);
+	check_noise_params(&v5params->np_height, &meta_np_height);
+	check_noise_params(&v5params->np_ground, &user_np_ground);
+
+	UASSERT(mgr.setMapSetting("foobar", "25") == false);
+
+	// Pretend the ServerMap is shutting down
+	UASSERT(mgr.saveMapMeta());
+
+	// Make sure our interface expectations are met
+	UASSERT(mgr.mapgen_params == params);
+	UASSERT(mgr.makeMapgenParams() == params);
+
+#if 0
+	// TODO(paramat or hmmmm): change this to compare the result against a static file
+
+	// Load the resulting map_meta.txt and make sure it contains what we expect
+	unsigned char expected_contents_hash[20] = {
+		0x48, 0x3f, 0x88, 0x5a, 0xc0, 0x7a, 0x14, 0x48, 0xa4, 0x71,
+		0x78, 0x56, 0x95, 0x2d, 0xdc, 0x6a, 0xf7, 0x61, 0x36, 0x5f
+	};
+
+	SHA1 ctx;
+	std::string metafile_contents = read_file_to_string(test_mapmeta_path);
+	ctx.addBytes(&metafile_contents[0], metafile_contents.size());
+	unsigned char *sha1_result = ctx.getDigest();
+	int resultdiff = memcmp(sha1_result, expected_contents_hash, 20);
+	free(sha1_result);
+
+	UASSERT(!resultdiff);
+#endif
+}
+
+
+void TestMapSettingsManager::testMapMetaSaveLoad()
+{
+	Settings conf;
+	std::string path = getTestTempDirectory()
+		+ DIR_DELIM + "foobar" + DIR_DELIM + "map_meta.txt";
+
+	// Create a set of mapgen params and save them to map meta
+	conf.set("seed", "12345");
+	conf.set("water_level", "5");
+	MapSettingsManager mgr1(&conf, path);
+	MapgenParams *params1 = mgr1.makeMapgenParams();
+	UASSERT(params1);
+	UASSERT(mgr1.saveMapMeta());
+
+	// Now try loading the map meta to mapgen params
+	conf.set("seed", "67890");
+	conf.set("water_level", "32");
+	MapSettingsManager mgr2(&conf, path);
+	UASSERT(mgr2.loadMapMeta());
+	MapgenParams *params2 = mgr2.makeMapgenParams();
+	UASSERT(params2);
+
+	// Check that both results are correct
+	UASSERTEQ(u64, params1->seed, 12345);
+	UASSERTEQ(s16, params1->water_level, 5);
+	UASSERTEQ(u64, params2->seed, 12345);
+	UASSERTEQ(s16, params2->water_level, 5);
+}
+
+
+void TestMapSettingsManager::testMapMetaFailures()
+{
+	std::string test_mapmeta_path;
+	Settings conf;
+
+	// Check to see if it'll fail on a non-existent map meta file
+	test_mapmeta_path = "woobawooba/fgdfg/map_meta.txt";
+	UASSERT(!fs::PathExists(test_mapmeta_path));
+
+	MapSettingsManager mgr1(&conf, test_mapmeta_path);
+	UASSERT(!mgr1.loadMapMeta());
+
+	// Check to see if it'll fail on a corrupt map meta file
+	test_mapmeta_path = makeMetaFile(true);
+	UASSERT(fs::PathExists(test_mapmeta_path));
+
+	MapSettingsManager mgr2(&conf, test_mapmeta_path);
+	UASSERT(!mgr2.loadMapMeta());
+}
diff --git a/src/unittest/test_player.cpp b/src/unittest/test_player.cpp
new file mode 100644
index 0000000..85fbc8b
--- /dev/null
+++ b/src/unittest/test_player.cpp
@@ -0,0 +1,88 @@
+/*
+Minetest
+Copyright (C) 2010-2016 nerzhul, Loic Blot <loic.blot at unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "test.h"
+
+#include "exceptions.h"
+#include "remoteplayer.h"
+#include "content_sao.h"
+#include "server.h"
+
+class TestPlayer : public TestBase {
+public:
+	TestPlayer() { TestManager::registerTestModule(this); }
+	const char *getName() { return "TestPlayer"; }
+
+	void runTests(IGameDef *gamedef);
+
+	void testSave(IGameDef *gamedef);
+	void testLoad(IGameDef *gamedef);
+};
+
+static TestPlayer g_test_instance;
+
+void TestPlayer::runTests(IGameDef *gamedef)
+{
+	TEST(testSave, gamedef);
+	TEST(testLoad, gamedef);
+}
+
+void TestPlayer::testSave(IGameDef *gamedef)
+{
+	RemotePlayer rplayer("testplayer_save", gamedef->idef());
+	PlayerSAO sao(NULL, 1, false);
+	sao.initialize(&rplayer, std::set<std::string>());
+	rplayer.setPlayerSAO(&sao);
+	sao.setBreath(10);
+	sao.setHPRaw(8);
+	sao.setYaw(0.1f);
+	sao.setPitch(0.6f);
+	sao.setBasePosition(v3f(450.2f, -15.7f, 68.1f));
+	rplayer.save(".", gamedef);
+	UASSERT(fs::PathExists("testplayer_save"));
+}
+
+void TestPlayer::testLoad(IGameDef *gamedef)
+{
+	RemotePlayer rplayer("testplayer_load", gamedef->idef());
+	PlayerSAO sao(NULL, 1, false);
+	sao.initialize(&rplayer, std::set<std::string>());
+	rplayer.setPlayerSAO(&sao);
+	sao.setBreath(10);
+	sao.setHPRaw(8);
+	sao.setYaw(0.1f);
+	sao.setPitch(0.6f);
+	sao.setBasePosition(v3f(450.2f, -15.7f, 68.1f));
+	rplayer.save(".", gamedef);
+	UASSERT(fs::PathExists("testplayer_load"));
+
+	RemotePlayer rplayer_load("testplayer_load", gamedef->idef());
+	PlayerSAO sao_load(NULL, 2, false);
+	std::ifstream is("testplayer_load", std::ios_base::binary);
+	UASSERT(is.good());
+	rplayer_load.deSerialize(is, "testplayer_load", &sao_load);
+	is.close();
+
+	UASSERT(strcmp(rplayer_load.getName(), "testplayer_load") == 0);
+	UASSERT(sao_load.getBreath() == 10);
+	UASSERT(sao_load.getHP() == 8);
+	UASSERT(sao_load.getYaw() == 0.1f);
+	UASSERT(sao_load.getPitch() == 0.6f);
+	UASSERT(sao_load.getBasePosition() == v3f(450.2f, -15.7f, 68.1f));
+}
diff --git a/src/unittest/test_settings.cpp b/src/unittest/test_settings.cpp
index a82d734..733c7e9 100644
--- a/src/unittest/test_settings.cpp
+++ b/src/unittest/test_settings.cpp
@@ -32,7 +32,7 @@ public:
 	void testAllSettings();
 
 	static const char *config_text_before;
-	static const char *config_text_after;
+	static const std::string config_text_after;
 };
 
 static TestSettings g_test_instance;
@@ -69,7 +69,7 @@ const char *TestSettings::config_text_before =
 	"np_terrain = 5, 40, (250, 250, 250), 12341, 5, 0.7, 2.4\n"
 	"zoop = true";
 
-const char *TestSettings::config_text_after =
+const std::string TestSettings::config_text_after =
 	"leet = 1337\n"
 	"leetleet = 13371337\n"
 	"leetleet_neg = -13371337\n"
@@ -197,7 +197,10 @@ void TestSettings::testAllSettings()
 	UASSERT(s.updateConfigObject(is, os, "", 0) == true);
 	//printf(">>>> expected config:\n%s\n", TEST_CONFIG_TEXT_AFTER);
 	//printf(">>>> actual config:\n%s\n", os.str().c_str());
+#if __cplusplus < 201103L
+	// This test only works in older C++ versions than C++11 because we use unordered_map
 	UASSERT(os.str() == config_text_after);
+#endif
 	} catch (SettingNotFoundException &e) {
 		UASSERT(!"Setting not found!");
 	}
diff --git a/src/unittest/test_threading.cpp b/src/unittest/test_threading.cpp
index f0df85b..cdbf967 100644
--- a/src/unittest/test_threading.cpp
+++ b/src/unittest/test_threading.cpp
@@ -39,7 +39,9 @@ static TestThreading g_test_instance;
 
 void TestThreading::runTests(IGameDef *gamedef)
 {
+#if !(defined(__MACH__) && defined(__APPLE__))
 	TEST(testStartStopWait);
+#endif
 	TEST(testThreadKill);
 	TEST(testAtomicSemaphoreThread);
 }
@@ -161,6 +163,7 @@ private:
 void TestThreading::testAtomicSemaphoreThread()
 {
 	Atomic<u32> val;
+	val = 0;
 	Semaphore trigger;
 	static const u8 num_threads = 4;
 
diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt
index 0e7cbad..f571ab2 100644
--- a/src/util/CMakeLists.txt
+++ b/src/util/CMakeLists.txt
@@ -3,6 +3,7 @@ set(UTIL_SRCS
 	${CMAKE_CURRENT_SOURCE_DIR}/auth.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/base64.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/directiontables.cpp
+	${CMAKE_CURRENT_SOURCE_DIR}/enriched_string.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/numeric.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/pointedthing.cpp
 	${CMAKE_CURRENT_SOURCE_DIR}/serialize.cpp
diff --git a/src/util/areastore.cpp b/src/util/areastore.cpp
index 58f08a8..cef67da 100644
--- a/src/util/areastore.cpp
+++ b/src/util/areastore.cpp
@@ -95,6 +95,7 @@ void AreaStore::deserialize(std::istream &is)
 		is.read(data, data_len);
 		a.data = std::string(data, data_len);
 		insertArea(&a);
+		delete [] data;
 	}
 }
 
diff --git a/src/util/auth.h b/src/util/auth.h
index 1fd6ab4..7cdc7d7 100644
--- a/src/util/auth.h
+++ b/src/util/auth.h
@@ -45,6 +45,6 @@ std::string encode_srp_verifier(const std::string &verifier,
 /// Reads the DB-formatted SRP verifier and gets the verifier
 /// and salt components.
 bool decode_srp_verifier_and_salt(const std::string &encoded,
-	std::string *salt, std::string *bytes_v);
+	std::string *verifier, std::string *salt);
 
 #endif
diff --git a/src/itemgroup.h b/src/util/cpp11_container.h
similarity index 57%
copy from src/itemgroup.h
copy to src/util/cpp11_container.h
index f6ae867..88317c9 100644
--- a/src/itemgroup.h
+++ b/src/util/cpp11_container.h
@@ -1,6 +1,6 @@
 /*
 Minetest
-Copyright (C) 2013 celeron55, Perttu Ahola <celeron55 at gmail.com>
+Copyright (C) 2016 nerzhul, Loic Blot <loic.blot at unix-experience.fr>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -17,22 +17,27 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef ITEMGROUP_HEADER
-#define ITEMGROUP_HEADER
+#ifndef MT_CPP11CONTAINER_HEADER
+#define MT_CPP11CONTAINER_HEADER
 
-#include <string>
-#include <map>
-
-typedef std::map<std::string, int> ItemGroupList;
+#if __cplusplus >= 201103L
+#define USE_UNORDERED_CONTAINERS
+#endif
 
-static inline int itemgroup_get(const ItemGroupList &groups,
-		const std::string &name)
-{
-	std::map<std::string, int>::const_iterator i = groups.find(name);
-	if(i == groups.end())
-		return 0;
-	return i->second;
-}
+#if _MSC_VER >= 1600
+#define USE_UNORDERED_CONTAINERS
+#endif
 
+#ifdef USE_UNORDERED_CONTAINERS
+	#include <unordered_map>
+	#include <unordered_set>
+	#define UNORDERED_MAP std::unordered_map
+	#define UNORDERED_SET std::unordered_set
+#else
+	#include <map>
+	#include <set>
+	#define UNORDERED_MAP std::map
+	#define UNORDERED_SET std::set
 #endif
 
+#endif
diff --git a/src/util/enriched_string.cpp b/src/util/enriched_string.cpp
new file mode 100644
index 0000000..a7fc3a8
--- /dev/null
+++ b/src/util/enriched_string.cpp
@@ -0,0 +1,166 @@
+/*
+Copyright (C) 2013 xyz, Ilya Zhuravlev <whatever at xyz.is>
+Copyright (C) 2016 Nore, Nathanaël Courant <nore at mesecons.net>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "enriched_string.h"
+#include "util/string.h"
+#include "log.h"
+using namespace irr::video;
+
+EnrichedString::EnrichedString()
+{
+	clear();
+}
+
+EnrichedString::EnrichedString(const std::wstring &string,
+		const std::vector<SColor> &colors):
+	m_string(string),
+	m_colors(colors),
+	m_has_background(false)
+{}
+
+EnrichedString::EnrichedString(const std::wstring &s, const SColor &color)
+{
+	clear();
+	addAtEnd(s, color);
+}
+
+EnrichedString::EnrichedString(const wchar_t *str, const SColor &color)
+{
+	clear();
+	addAtEnd(std::wstring(str), color);
+}
+
+void EnrichedString::operator=(const wchar_t *str)
+{
+	clear();
+	addAtEnd(std::wstring(str), SColor(255, 255, 255, 255));
+}
+
+void EnrichedString::addAtEnd(const std::wstring &s, const SColor &initial_color)
+{
+	SColor color(initial_color);
+	size_t i = 0;
+	while (i < s.length()) {
+		if (s[i] != L'\x1b') {
+			m_string += s[i];
+			m_colors.push_back(color);
+			++i;
+			continue;
+		}
+		++i;
+		size_t start_index = i;
+		size_t length;
+		if (i == s.length()) {
+			break;
+		}
+		if (s[i] == L'(') {
+			++i;
+			++start_index;
+			while (i < s.length() && s[i] != L')') {
+				if (s[i] == L'\\') {
+					++i;
+				}
+				++i;
+			}
+			length = i - start_index;
+			++i;
+		} else {
+			++i;
+			length = 1;
+		}
+		std::wstring escape_sequence(s, start_index, length);
+		std::vector<std::wstring> parts = split(escape_sequence, L'@');
+		if (parts[0] == L"c") {
+			if (parts.size() < 2) {
+				continue;
+			}
+			parseColorString(wide_to_utf8(parts[1]), color, true);
+		} else if (parts[0] == L"b") {
+			if (parts.size() < 2) {
+				continue;
+			}
+			parseColorString(wide_to_utf8(parts[1]), m_background, true);
+			m_has_background = true;
+		}
+		continue;
+	}
+}
+
+void EnrichedString::addChar(const EnrichedString &source, size_t i)
+{
+	m_string += source.m_string[i];
+	m_colors.push_back(source.m_colors[i]);
+}
+
+void EnrichedString::addCharNoColor(wchar_t c)
+{
+	m_string += c;
+	if (m_colors.empty()) {
+		m_colors.push_back(SColor(255, 255, 255, 255));
+	} else {
+		m_colors.push_back(m_colors[m_colors.size() - 1]);
+	}
+}
+
+EnrichedString EnrichedString::operator+(const EnrichedString &other) const
+{
+	std::vector<SColor> result;
+	result.insert(result.end(), m_colors.begin(), m_colors.end());
+	result.insert(result.end(), other.m_colors.begin(), other.m_colors.end());
+	return EnrichedString(m_string + other.m_string, result);
+}
+
+void EnrichedString::operator+=(const EnrichedString &other)
+{
+	m_string += other.m_string;
+	m_colors.insert(m_colors.end(), other.m_colors.begin(), other.m_colors.end());
+}
+
+EnrichedString EnrichedString::substr(size_t pos, size_t len) const
+{
+	if (pos == m_string.length()) {
+		return EnrichedString();
+	}
+	if (len == std::string::npos || pos + len > m_string.length()) {
+		return EnrichedString(
+		           m_string.substr(pos, std::string::npos),
+		           std::vector<SColor>(m_colors.begin() + pos, m_colors.end())
+		       );
+	} else {
+		return EnrichedString(
+		           m_string.substr(pos, len),
+		           std::vector<SColor>(m_colors.begin() + pos, m_colors.begin() + pos + len)
+		       );
+	}
+}
+
+const wchar_t *EnrichedString::c_str() const
+{
+	return m_string.c_str();
+}
+
+const std::vector<SColor> &EnrichedString::getColors() const
+{
+	return m_colors;
+}
+
+const std::wstring &EnrichedString::getString() const
+{
+	return m_string;
+}
diff --git a/src/util/enriched_string.h b/src/util/enriched_string.h
new file mode 100644
index 0000000..1aca894
--- /dev/null
+++ b/src/util/enriched_string.h
@@ -0,0 +1,91 @@
+/*
+Copyright (C) 2013 xyz, Ilya Zhuravlev <whatever at xyz.is>
+Copyright (C) 2016 Nore, Nathanaël Courant <nore at mesecons.net>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef ENRICHEDSTRING_HEADER
+#define ENRICHEDSTRING_HEADER
+
+#include <string>
+#include <vector>
+#include <SColor.h>
+
+class EnrichedString {
+public:
+	EnrichedString();
+	EnrichedString(const std::wstring &s,
+		const irr::video::SColor &color = irr::video::SColor(255, 255, 255, 255));
+	EnrichedString(const wchar_t *str,
+		const irr::video::SColor &color = irr::video::SColor(255, 255, 255, 255));
+	EnrichedString(const std::wstring &string,
+		const std::vector<irr::video::SColor> &colors);
+	void operator=(const wchar_t *str);
+	void addAtEnd(const std::wstring &s, const irr::video::SColor &color);
+
+	// Adds the character source[i] at the end.
+	// An EnrichedString should always be able to be copied
+	// to the end of an existing EnrichedString that way.
+	void addChar(const EnrichedString &source, size_t i);
+
+	// Adds a single character at the end, without specifying its
+	// color. The color used will be the one from the last character.
+	void addCharNoColor(wchar_t c);
+
+	EnrichedString substr(size_t pos = 0, size_t len = std::string::npos) const;
+	EnrichedString operator+(const EnrichedString &other) const;
+	void operator+=(const EnrichedString &other);
+	const wchar_t *c_str() const;
+	const std::vector<irr::video::SColor> &getColors() const;
+	const std::wstring &getString() const;
+	inline bool operator==(const EnrichedString &other) const
+	{
+		return (m_string == other.m_string && m_colors == other.m_colors);
+	}
+	inline bool operator!=(const EnrichedString &other) const
+	{
+		return !(*this == other);
+	}
+	inline void clear()
+	{
+		m_string.clear();
+		m_colors.clear();
+		m_has_background = false;
+	}
+	inline bool empty() const
+	{
+		return m_string.empty();
+	}
+	inline size_t size() const
+	{
+		return m_string.size();
+	}
+	inline bool hasBackground() const
+	{
+		return m_has_background;
+	}
+	inline irr::video::SColor getBackground() const
+	{
+		return m_background;
+	}
+private:
+	std::wstring m_string;
+	std::vector<irr::video::SColor> m_colors;
+	bool m_has_background;
+	irr::video::SColor m_background;
+};
+
+#endif
diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp
index 42ebd90..a9e7ae5 100644
--- a/src/util/numeric.cpp
+++ b/src/util/numeric.cpp
@@ -27,7 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <string.h>
 #include <iostream>
 
-std::map<u16, std::vector<v3s16> > FacePositionCache::m_cache;
+UNORDERED_MAP<u16, std::vector<v3s16> > FacePositionCache::m_cache;
 Mutex FacePositionCache::m_cache_mutex;
 // Calculate the borders of a "d-radius" cube
 // TODO: Make it work without mutex and data races, probably thread-local
@@ -188,14 +188,19 @@ u64 murmur_hash_64_ua(const void *key, int len, unsigned int seed)
 }
 
 /*
-	blockpos: position of block in block coordinates
+	blockpos_b: position of block in block coordinates
 	camera_pos: position of camera in nodes
 	camera_dir: an unit vector pointing to camera direction
 	range: viewing range
+	distance_ptr: return location for distance from the camera
 */
 bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
 		f32 camera_fov, f32 range, f32 *distance_ptr)
 {
+	// Maximum radius of a block.  The magic number is
+	// sqrt(3.0) / 2.0 in literal form.
+	const f32 block_max_radius = 0.866025403784 * MAP_BLOCKSIZE * BS;
+
 	v3s16 blockpos_nodes = blockpos_b * MAP_BLOCKSIZE;
 
 	// Block center position
@@ -209,7 +214,7 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
 	v3f blockpos_relative = blockpos - camera_pos;
 
 	// Total distance
-	f32 d = blockpos_relative.getLength();
+	f32 d = MYMAX(0, blockpos_relative.getLength() - block_max_radius);
 
 	if(distance_ptr)
 		*distance_ptr = d;
@@ -218,13 +223,9 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
 	if(d > range)
 		return false;
 
-	// Maximum radius of a block.  The magic number is
-	// sqrt(3.0) / 2.0 in literal form.
-	f32 block_max_radius = 0.866025403784 * MAP_BLOCKSIZE * BS;
-
 	// If block is (nearly) touching the camera, don't
 	// bother validating further (that is, render it anyway)
-	if(d < block_max_radius)
+	if(d == 0)
 		return true;
 
 	// Adjust camera position, for purposes of computing the angle,
diff --git a/src/util/numeric.h b/src/util/numeric.h
index 6153278..4cdc254 100644
--- a/src/util/numeric.h
+++ b/src/util/numeric.h
@@ -26,8 +26,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "../irr_v3d.h"
 #include "../irr_aabb3d.h"
 #include "../threading/mutex.h"
+#include "cpp11_container.h"
 #include <list>
-#include <map>
 #include <vector>
 
 
@@ -41,26 +41,10 @@ public:
 	static std::vector<v3s16> getFacePositions(u16 d);
 private:
 	static void generateFacePosition(u16 d);
-	static std::map<u16, std::vector<v3s16> > m_cache;
+	static UNORDERED_MAP<u16, std::vector<v3s16> > m_cache;
 	static Mutex m_cache_mutex;
 };
 
-class IndentationRaiser
-{
-public:
-	IndentationRaiser(u16 *indentation)
-	{
-		m_indentation = indentation;
-		(*m_indentation)++;
-	}
-	~IndentationRaiser()
-	{
-		(*m_indentation)--;
-	}
-private:
-	u16 *m_indentation;
-};
-
 inline s16 getContainerPos(s16 p, s16 d)
 {
 	return (p>=0 ? p : p-d+1) / d;
@@ -149,23 +133,6 @@ inline bool isInArea(v3s16 p, v3s16 d)
 #define rangelim(d, min, max) ((d) < (min) ? (min) : ((d)>(max)?(max):(d)))
 #define myfloor(x) ((x) > 0.0 ? (int)(x) : (int)(x) - 1)
 
-inline v3s16 arealim(v3s16 p, s16 d)
-{
-	if(p.X < 0)
-		p.X = 0;
-	if(p.Y < 0)
-		p.Y = 0;
-	if(p.Z < 0)
-		p.Z = 0;
-	if(p.X > d-1)
-		p.X = d-1;
-	if(p.Y > d-1)
-		p.Y = d-1;
-	if(p.Z > d-1)
-		p.Z = d-1;
-	return p;
-}
-
 // The naive swap performs better than the xor version
 #define SWAP(t, x, y) do { \
 	t temp = x;            \
diff --git a/src/util/srp.cpp b/src/util/srp.cpp
index 0d3c938..77c1816 100644
--- a/src/util/srp.cpp
+++ b/src/util/srp.cpp
@@ -542,7 +542,7 @@ static SRP_Result fill_buff()
 
 	if (!fp) return SRP_ERR;
 
-	if (fread(g_rand_buff, sizeof(g_rand_buff), 1, fp) != 1) return SRP_ERR;
+	if (fread(g_rand_buff, sizeof(g_rand_buff), 1, fp) != 1) { fclose(fp); return SRP_ERR; }
 	if (fclose(fp)) return SRP_ERR;
 #endif
 	return SRP_OK;
diff --git a/src/util/string.cpp b/src/util/string.cpp
index 2c4143c..94064ef 100644
--- a/src/util/string.cpp
+++ b/src/util/string.cpp
@@ -314,7 +314,7 @@ std::string wide_to_narrow(const std::wstring &wcs)
 
 #endif
 
-std::string urlencode(std::string str)
+std::string urlencode(const std::string &str)
 {
 	// Encodes non-unreserved URI characters by a percent sign
 	// followed by two hex digits. See RFC 3986, section 2.3.
@@ -322,17 +322,18 @@ std::string urlencode(std::string str)
 	std::ostringstream oss(std::ios::binary);
 	for (u32 i = 0; i < str.size(); i++) {
 		unsigned char c = str[i];
-		if (isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~')
+		if (isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~') {
 			oss << c;
-		else
+		} else {
 			oss << "%"
 				<< url_hex_chars[(c & 0xf0) >> 4]
 				<< url_hex_chars[c & 0x0f];
+		}
 	}
 	return oss.str();
 }
 
-std::string urldecode(std::string str)
+std::string urldecode(const std::string &str)
 {
 	// Inverse of urlencode
 	std::ostringstream oss(std::ios::binary);
@@ -343,18 +344,20 @@ std::string urldecode(std::string str)
 				hex_digit_decode(str[i+2], lowvalue)) {
 			oss << (char) ((highvalue << 4) | lowvalue);
 			i += 2;
-		}
-		else
+		} else {
 			oss << str[i];
+		}
 	}
 	return oss.str();
 }
 
 u32 readFlagString(std::string str, const FlagDesc *flagdesc, u32 *flagmask)
 {
-	u32 result = 0, mask = 0;
+	u32 result = 0;
+	u32 mask = 0;
 	char *s = &str[0];
-	char *flagstr, *strpos = NULL;
+	char *flagstr;
+	char *strpos = NULL;
 
 	while ((flagstr = strtok_r(s, ",", &strpos))) {
 		s = NULL;
diff --git a/src/util/string.h b/src/util/string.h
index 40ef3e4..572c371 100644
--- a/src/util/string.h
+++ b/src/util/string.h
@@ -21,12 +21,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define UTIL_STRING_HEADER
 
 #include "irrlichttypes_bloated.h"
+#include "cpp11_container.h"
 #include <stdlib.h>
 #include <string>
 #include <cstring>
 #include <vector>
 #include <map>
 #include <sstream>
+#include <iomanip>
 #include <cctype>
 
 #define STRINGIFY(x) #x
@@ -53,7 +55,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 	(((unsigned char)(x) < 0xe0) ? 2 :     \
 	(((unsigned char)(x) < 0xf0) ? 3 : 4))
 
-typedef std::map<std::string, std::string> StringMap;
+typedef UNORDERED_MAP<std::string, std::string> StringMap;
 
 struct FlagDesc {
 	const char *name;
@@ -77,8 +79,8 @@ wchar_t *narrow_to_wide_c(const char *str);
 std::wstring narrow_to_wide(const std::string &mbs);
 std::string wide_to_narrow(const std::wstring &wcs);
 
-std::string urlencode(std::string str);
-std::string urldecode(std::string str);
+std::string urlencode(const std::string &str);
+std::string urldecode(const std::string &str);
 u32 readFlagString(std::string str, const FlagDesc *flagdesc, u32 *flagmask);
 std::string writeFlagString(u32 flags, const FlagDesc *flagdesc, u32 flagmask);
 size_t mystrlcpy(char *dst, const char *src, size_t size);
@@ -350,23 +352,57 @@ inline T from_string(const std::string &str)
 /// Returns a 64-bit signed value represented by the string \p str (decimal).
 inline s64 stoi64(const std::string &str) { return from_string<s64>(str); }
 
-// TODO: Replace with C++11 std::to_string.
+#if __cplusplus < 201103L
+namespace std {
 
 /// Returns a string representing the value \p val.
 template <typename T>
-inline std::string to_string(T val)
+inline string to_string(T val)
 {
-	std::ostringstream oss;
+	ostringstream oss;
 	oss << val;
 	return oss.str();
 }
+#define DEFINE_STD_TOSTRING_FLOATINGPOINT(T)		\
+	template <>					\
+	inline string to_string<T>(T val)		\
+	{						\
+		ostringstream oss;			\
+		oss << std::fixed			\
+			<< std::setprecision(6)		\
+			<< val;				\
+		return oss.str();			\
+	}
+DEFINE_STD_TOSTRING_FLOATINGPOINT(float)
+DEFINE_STD_TOSTRING_FLOATINGPOINT(double)
+DEFINE_STD_TOSTRING_FLOATINGPOINT(long double)
+
+#undef DEFINE_STD_TOSTRING_FLOATINGPOINT
+
+/// Returns a wide string representing the value \p val
+template <typename T>
+inline wstring to_wstring(T val)
+{
+      return utf8_to_wide(to_string(val));
+}
+}
+#endif
 
 /// Returns a string representing the decimal value of the 32-bit value \p i.
-inline std::string itos(s32 i) { return to_string(i); }
+inline std::string itos(s32 i) { return std::to_string(i); }
 /// Returns a string representing the decimal value of the 64-bit value \p i.
-inline std::string i64tos(s64 i) { return to_string(i); }
+inline std::string i64tos(s64 i) { return std::to_string(i); }
+
+// std::to_string uses the '%.6f' conversion, which is inconsistent with
+// std::ostream::operator<<() and impractical too.  ftos() uses the
+// more generic and std::ostream::operator<<()-compatible '%G' format.
 /// Returns a string representing the decimal value of the float value \p f.
-inline std::string ftos(float f) { return to_string(f); }
+inline std::string ftos(float f)
+{
+	std::ostringstream oss;
+	oss << f;
+	return oss.str();
+}
 
 
 /**
@@ -519,6 +555,38 @@ std::basic_string<T> unescape_enriched(const std::basic_string<T> &s)
 	return output;
 }
 
+template <typename T>
+std::vector<std::basic_string<T> > split(const std::basic_string<T> &s, T delim)
+{
+	std::vector<std::basic_string<T> > tokens;
+
+	std::basic_string<T> current;
+	bool last_was_escape = false;
+	for (size_t i = 0; i < s.length(); i++) {
+		T si = s[i];
+		if (last_was_escape) {
+			current += '\\';
+			current += si;
+			last_was_escape = false;
+		} else {
+			if (si == delim) {
+				tokens.push_back(current);
+				current = std::basic_string<T>();
+				last_was_escape = false;
+			} else if (si == '\\') {
+				last_was_escape = true;
+			} else {
+				current += si;
+				last_was_escape = false;
+			}
+		}
+	}
+	//push last element
+	tokens.push_back(current);
+
+	return tokens;
+}
+
 /**
  * Checks that all characters in \p to_check are a decimal digits.
  *
diff --git a/src/voxelalgorithms.cpp b/src/voxelalgorithms.cpp
index f067a22..93cc33a 100644
--- a/src/voxelalgorithms.cpp
+++ b/src/voxelalgorithms.cpp
@@ -19,6 +19,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "voxelalgorithms.h"
 #include "nodedef.h"
+#include "mapblock.h"
+#include "map.h"
 
 namespace voxalgo
 {
@@ -153,5 +155,597 @@ SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a,
 	return SunlightPropagateResult(bottom_sunlight_valid);
 }
 
+/*!
+ * A direction.
+ * 0=X+
+ * 1=Y+
+ * 2=Z+
+ * 3=Z-
+ * 4=Y-
+ * 5=X-
+ * 6=no direction
+ * Two directions are opposite only if their sum is 5.
+ */
+typedef u8 direction;
+/*!
+ * Relative node position.
+ * This represents a node's position in its map block.
+ * All coordinates must be between 0 and 15.
+ */
+typedef v3s16 relative_v3;
+/*!
+ * Position of a map block (block coordinates).
+ * One block_pos unit is as long as 16 node position units.
+ */
+typedef v3s16 mapblock_v3;
+
+//! Contains information about a node whose light is about to change.
+struct ChangingLight {
+	//! Relative position of the node in its map block.
+	relative_v3 rel_position;
+	//! Position of the node's block.
+	mapblock_v3 block_position;
+	//! Pointer to the node's block.
+	MapBlock *block;
+	/*!
+	 * Direction from the node that caused this node's changing
+	 * to this node.
+	 */
+	direction source_direction;
+
+	ChangingLight() :
+		rel_position(),
+		block_position(),
+		block(NULL),
+		source_direction(6)
+	{}
+
+	ChangingLight(relative_v3 rel_pos, mapblock_v3 block_pos,
+		MapBlock *b, direction source_dir) :
+		rel_position(rel_pos),
+		block_position(block_pos),
+		block(b),
+		source_direction(source_dir)
+	{}
+};
+
+/*!
+ * A fast, priority queue-like container to contain ChangingLights.
+ * The ChangingLights are ordered by the given light levels.
+ * The brightest ChangingLight is returned first.
+ */
+struct LightQueue {
+	//! For each light level there is a vector.
+	std::vector<ChangingLight> lights[LIGHT_SUN + 1];
+	//! Light of the brightest ChangingLight in the queue.
+	u8 max_light;
+
+	/*!
+	 * Creates a LightQueue.
+	 * \param reserve for each light level that many slots are reserved.
+	 */
+	LightQueue(size_t reserve)
+	{
+		max_light = LIGHT_SUN;
+		for (u8 i = 0; i <= LIGHT_SUN; i++) {
+			lights[i].reserve(reserve);
+		}
+	}
+
+	/*!
+	 * Returns the next brightest ChangingLight and
+	 * removes it from the queue.
+	 * If there were no elements in the queue, the given parameters
+	 * remain unmodified.
+	 * \param light light level of the popped ChangingLight
+	 * \param data the ChangingLight that was popped
+	 * \returns true if there was a ChangingLight in the queue.
+	 */
+	bool next(u8 &light, ChangingLight &data)
+	{
+		while (lights[max_light].empty()) {
+			if (max_light == 0) {
+				return false;
+			}
+			max_light--;
+		}
+		light = max_light;
+		data = lights[max_light].back();
+		lights[max_light].pop_back();
+		return true;
+	}
+
+	/*!
+	 * Adds an element to the queue.
+	 * The parameters are the same as in ChangingLight's constructor.
+	 * \param light light level of the ChangingLight
+	 */
+	inline void push(u8 light, const relative_v3 &rel_pos,
+		const mapblock_v3 &block_pos, MapBlock *block,
+		direction source_dir)
+	{
+		assert(light <= LIGHT_SUN);
+		lights[light].push_back(
+			ChangingLight(rel_pos, block_pos, block, source_dir));
+	}
+};
+
+/*!
+ * This type of light queue is for unlighting.
+ * A node can be pushed in it only if its raw light is zero.
+ * This prevents pushing nodes twice into this queue.
+ * The light of the pushed ChangingLight must be the
+ * light of the node before unlighting it.
+ */
+typedef LightQueue UnlightQueue;
+/*!
+ * This type of light queue is for spreading lights.
+ * While spreading lights, all the nodes in it must
+ * have the same light as the light level the ChangingLights
+ * were pushed into this queue with. This prevents unnecessary
+ * re-pushing of the nodes into the queue.
+ * If a node doesn't let light trough but emits light, it can be added
+ * too.
+ */
+typedef LightQueue ReLightQueue;
+
+/*!
+ * neighbor_dirs[i] points towards
+ * the direction i.
+ * See the definition of the type "direction"
+ */
+const static v3s16 neighbor_dirs[6] = {
+	v3s16(1, 0, 0), // right
+	v3s16(0, 1, 0), // top
+	v3s16(0, 0, 1), // back
+	v3s16(0, 0, -1), // front
+	v3s16(0, -1, 0), // bottom
+	v3s16(-1, 0, 0), // left
+};
+
+/*!
+ * Transforms the given map block offset by one node towards
+ * the specified direction.
+ * \param dir the direction of the transformation
+ * \param rel_pos the node's relative position in its map block
+ * \param block_pos position of the node's block
+ */
+bool step_rel_block_pos(direction dir, relative_v3 &rel_pos,
+	mapblock_v3 &block_pos)
+{
+	switch (dir) {
+	case 0:
+		if (rel_pos.X < MAP_BLOCKSIZE - 1) {
+			rel_pos.X++;
+		} else {
+			rel_pos.X = 0;
+			block_pos.X++;
+			return true;
+		}
+		break;
+	case 1:
+		if (rel_pos.Y < MAP_BLOCKSIZE - 1) {
+			rel_pos.Y++;
+		} else {
+			rel_pos.Y = 0;
+			block_pos.Y++;
+			return true;
+		}
+		break;
+	case 2:
+		if (rel_pos.Z < MAP_BLOCKSIZE - 1) {
+			rel_pos.Z++;
+		} else {
+			rel_pos.Z = 0;
+			block_pos.Z++;
+			return true;
+		}
+		break;
+	case 3:
+		if (rel_pos.Z > 0) {
+			rel_pos.Z--;
+		} else {
+			rel_pos.Z = MAP_BLOCKSIZE - 1;
+			block_pos.Z--;
+			return true;
+		}
+		break;
+	case 4:
+		if (rel_pos.Y > 0) {
+			rel_pos.Y--;
+		} else {
+			rel_pos.Y = MAP_BLOCKSIZE - 1;
+			block_pos.Y--;
+			return true;
+		}
+		break;
+	case 5:
+		if (rel_pos.X > 0) {
+			rel_pos.X--;
+		} else {
+			rel_pos.X = MAP_BLOCKSIZE - 1;
+			block_pos.X--;
+			return true;
+		}
+		break;
+	}
+	return false;
+}
+
+/*
+ * Removes all light that is potentially emitted by the specified
+ * light sources. These nodes will have zero light.
+ * Returns all nodes whose light became zero but should be re-lighted.
+ *
+ * \param bank the light bank in which the procedure operates
+ * \param from_nodes nodes whose light is removed
+ * \param light_sources nodes that should be re-lighted
+ * \param modified_blocks output, all modified map blocks are added to this
+ */
+void unspread_light(Map *map, INodeDefManager *nodemgr, LightBank bank,
+	UnlightQueue &from_nodes, ReLightQueue &light_sources,
+	std::map<v3s16, MapBlock*> &modified_blocks)
+{
+	// Stores data popped from from_nodes
+	u8 current_light;
+	ChangingLight current;
+	// Data of the current neighbor
+	mapblock_v3 neighbor_block_pos;
+	relative_v3 neighbor_rel_pos;
+	// A dummy boolean
+	bool is_valid_position;
+	// Direction of the brightest neighbor of the node
+	direction source_dir;
+	while (from_nodes.next(current_light, current)) {
+		// For all nodes that need unlighting
+
+		// There is no brightest neighbor
+		source_dir = 6;
+		// The current node
+		const MapNode &node = current.block->getNodeNoCheck(
+			current.rel_position, &is_valid_position);
+		const ContentFeatures &f = nodemgr->get(node);
+		// If the node emits light, it behaves like it had a
+		// brighter neighbor.
+		u8 brightest_neighbor_light = f.light_source + 1;
+		for (direction i = 0; i < 6; i++) {
+			//For each neighbor
+
+			// The node that changed this node has already zero light
+			// and it can't give light to this node
+			if (current.source_direction + i == 5) {
+				continue;
+			}
+			// Get the neighbor's position and block
+			neighbor_rel_pos = current.rel_position;
+			neighbor_block_pos = current.block_position;
+			MapBlock *neighbor_block;
+			if (step_rel_block_pos(i, neighbor_rel_pos, neighbor_block_pos)) {
+				neighbor_block = map->getBlockNoCreateNoEx(neighbor_block_pos);
+				if (neighbor_block == NULL) {
+					continue;
+				}
+			} else {
+				neighbor_block = current.block;
+			}
+			// Get the neighbor itself
+			MapNode neighbor = neighbor_block->getNodeNoCheck(neighbor_rel_pos,
+				&is_valid_position);
+			const ContentFeatures &neighbor_f = nodemgr->get(
+				neighbor.getContent());
+			u8 neighbor_light = neighbor.getLightRaw(bank, neighbor_f);
+			// If the neighbor has at least as much light as this node, then
+			// it won't lose its light, since it should have been added to
+			// from_nodes earlier, so its light would be zero.
+			if (neighbor_f.light_propagates && neighbor_light < current_light) {
+				// Unlight, but only if the node has light.
+				if (neighbor_light > 0) {
+					neighbor.setLight(bank, 0, neighbor_f);
+					neighbor_block->setNodeNoCheck(neighbor_rel_pos, neighbor);
+					from_nodes.push(neighbor_light, neighbor_rel_pos,
+						neighbor_block_pos, neighbor_block, i);
+					// The current node was modified earlier, so its block
+					// is in modified_blocks.
+					if (current.block != neighbor_block) {
+						modified_blocks[neighbor_block_pos] = neighbor_block;
+					}
+				}
+			} else {
+				// The neighbor can light up this node.
+				if (neighbor_light < neighbor_f.light_source) {
+					neighbor_light = neighbor_f.light_source;
+				}
+				if (brightest_neighbor_light < neighbor_light) {
+					brightest_neighbor_light = neighbor_light;
+					source_dir = i;
+				}
+			}
+		}
+		// If the brightest neighbor is able to light up this node,
+		// then add this node to the output nodes.
+		if (brightest_neighbor_light > 1 && f.light_propagates) {
+			brightest_neighbor_light--;
+			light_sources.push(brightest_neighbor_light, current.rel_position,
+				current.block_position, current.block,
+				(source_dir == 6) ? 6 : 5 - source_dir
+				/* with opposite direction*/);
+		}
+	}
+}
+
+/*
+ * Spreads light from the specified starting nodes.
+ *
+ * Before calling this procedure, make sure that all ChangingLights
+ * in light_sources have as much light on the map as they have in
+ * light_sources (if the queue contains a node multiple times, the brightest
+ * occurrence counts).
+ *
+ * \param bank the light bank in which the procedure operates
+ * \param light_sources starting nodes
+ * \param modified_blocks output, all modified map blocks are added to this
+ */
+void spread_light(Map *map, INodeDefManager *nodemgr, LightBank bank,
+	LightQueue &light_sources, std::map<v3s16, MapBlock*> &modified_blocks)
+{
+	// The light the current node can provide to its neighbors.
+	u8 spreading_light;
+	// The ChangingLight for the current node.
+	ChangingLight current;
+	// Position of the current neighbor.
+	mapblock_v3 neighbor_block_pos;
+	relative_v3 neighbor_rel_pos;
+	// A dummy boolean.
+	bool is_valid_position;
+	while (light_sources.next(spreading_light, current)) {
+		spreading_light--;
+		for (direction i = 0; i < 6; i++) {
+			// This node can't light up its light source
+			if (current.source_direction + i == 5) {
+				continue;
+			}
+			// Get the neighbor's position and block
+			neighbor_rel_pos = current.rel_position;
+			neighbor_block_pos = current.block_position;
+			MapBlock *neighbor_block;
+			if (step_rel_block_pos(i, neighbor_rel_pos, neighbor_block_pos)) {
+				neighbor_block = map->getBlockNoCreateNoEx(neighbor_block_pos);
+				if (neighbor_block == NULL) {
+					continue;
+				}
+			} else {
+				neighbor_block = current.block;
+			}
+			// Get the neighbor itself
+			MapNode neighbor = neighbor_block->getNodeNoCheck(neighbor_rel_pos,
+				&is_valid_position);
+			const ContentFeatures &f = nodemgr->get(neighbor.getContent());
+			if (f.light_propagates) {
+				// Light up the neighbor, if it has less light than it should.
+				u8 neighbor_light = neighbor.getLightRaw(bank, f);
+				if (neighbor_light < spreading_light) {
+					neighbor.setLight(bank, spreading_light, f);
+					neighbor_block->setNodeNoCheck(neighbor_rel_pos, neighbor);
+					light_sources.push(spreading_light, neighbor_rel_pos,
+						neighbor_block_pos, neighbor_block, i);
+					// The current node was modified earlier, so its block
+					// is in modified_blocks.
+					if (current.block != neighbor_block) {
+						modified_blocks[neighbor_block_pos] = neighbor_block;
+					}
+				}
+			}
+		}
+	}
+}
+
+/*!
+ * Returns true if the node gets sunlight from the
+ * node above it.
+ *
+ * \param pos position of the node.
+ */
+bool is_sunlight_above(Map *map, v3s16 pos, INodeDefManager *ndef)
+{
+	bool sunlight = true;
+	mapblock_v3 source_block_pos;
+	relative_v3 source_rel_pos;
+	getNodeBlockPosWithOffset(pos + v3s16(0, 1, 0), source_block_pos,
+		source_rel_pos);
+	// If the node above has sunlight, this node also can get it.
+	MapBlock *source_block = map->getBlockNoCreateNoEx(source_block_pos);
+	if (source_block == NULL) {
+		// But if there is no node above, then use heuristics
+		MapBlock *node_block = map->getBlockNoCreateNoEx(getNodeBlockPos(pos));
+		if (node_block == NULL) {
+			sunlight = false;
+		} else {
+			sunlight = !node_block->getIsUnderground();
+		}
+	} else {
+		bool is_valid_position;
+		MapNode above = source_block->getNodeNoCheck(source_rel_pos,
+			&is_valid_position);
+		if (is_valid_position) {
+			if (above.getContent() == CONTENT_IGNORE) {
+				// Trust heuristics
+				if (source_block->getIsUnderground()) {
+					sunlight = false;
+				}
+			} else if (above.getLight(LIGHTBANK_DAY, ndef) != LIGHT_SUN) {
+				// If the node above doesn't have sunlight, this
+				// node is in shadow.
+				sunlight = false;
+			}
+		}
+	}
+	return sunlight;
+}
+
+static const LightBank banks[] = { LIGHTBANK_DAY, LIGHTBANK_NIGHT };
+
+void update_lighting_nodes(Map *map, INodeDefManager *ndef,
+	std::vector<std::pair<v3s16, MapNode> > &oldnodes,
+	std::map<v3s16, MapBlock*> &modified_blocks)
+{
+	// For node getter functions
+	bool is_valid_position;
+
+	// Process each light bank separately
+	for (s32 i = 0; i < 2; i++) {
+		LightBank bank = banks[i];
+		UnlightQueue disappearing_lights(256);
+		ReLightQueue light_sources(256);
+		// For each changed node process sunlight and initialize
+		for (std::vector<std::pair<v3s16, MapNode> >::iterator it =
+				oldnodes.begin(); it < oldnodes.end(); ++it) {
+			// Get position and block of the changed node
+			v3s16 p = it->first;
+			relative_v3 rel_pos;
+			mapblock_v3 block_pos;
+			getNodeBlockPosWithOffset(p, block_pos, rel_pos);
+			MapBlock *block = map->getBlockNoCreateNoEx(block_pos);
+			if (block == NULL || block->isDummy()) {
+				continue;
+			}
+			// Get the new node
+			MapNode n = block->getNodeNoCheck(rel_pos, &is_valid_position);
+			if (!is_valid_position) {
+				break;
+			}
+
+			// Light of the old node
+			u8 old_light = it->second.getLight(bank, ndef);
+
+			// Add the block of the added node to modified_blocks
+			modified_blocks[block_pos] = block;
+
+			// Get new light level of the node
+			u8 new_light = 0;
+			if (ndef->get(n).light_propagates) {
+				if (bank == LIGHTBANK_DAY && ndef->get(n).sunlight_propagates
+					&& is_sunlight_above(map, p, ndef)) {
+					new_light = LIGHT_SUN;
+				} else {
+					new_light = ndef->get(n).light_source;
+					for (int i = 0; i < 6; i++) {
+						v3s16 p2 = p + neighbor_dirs[i];
+						bool is_valid;
+						MapNode n2 = map->getNodeNoEx(p2, &is_valid);
+						if (is_valid) {
+							u8 spread = n2.getLight(bank, ndef);
+							// If the neighbor is at least as bright as
+							// this node then its light is not from
+							// this node.
+							// Its light can spread to this node.
+							if (spread > new_light && spread >= old_light) {
+								new_light = spread - 1;
+							}
+						}
+					}
+				}
+			} else {
+				// If this is an opaque node, it still can emit light.
+				new_light = ndef->get(n).light_source;
+			}
+
+			if (new_light > 0) {
+				light_sources.push(new_light, rel_pos, block_pos, block, 6);
+			}
+
+			if (new_light < old_light) {
+				// The node became opaque or doesn't provide as much
+				// light as the previous one, so it must be unlighted.
+
+				// Add to unlight queue
+				n.setLight(bank, 0, ndef);
+				block->setNodeNoCheck(rel_pos, n);
+				disappearing_lights.push(old_light, rel_pos, block_pos, block,
+					6);
+
+				// Remove sunlight, if there was any
+				if (bank == LIGHTBANK_DAY && old_light == LIGHT_SUN) {
+					for (s16 y = p.Y - 1;; y--) {
+						v3s16 n2pos(p.X, y, p.Z);
+
+						MapNode n2;
+
+						n2 = map->getNodeNoEx(n2pos, &is_valid_position);
+						if (!is_valid_position)
+							break;
+
+						// If this node doesn't have sunlight, the nodes below
+						// it don't have too.
+						if (n2.getLight(LIGHTBANK_DAY, ndef) != LIGHT_SUN) {
+							break;
+						}
+						// Remove sunlight and add to unlight queue.
+						n2.setLight(LIGHTBANK_DAY, 0, ndef);
+						map->setNode(n2pos, n2);
+						relative_v3 rel_pos2;
+						mapblock_v3 block_pos2;
+						getNodeBlockPosWithOffset(n2pos, block_pos2, rel_pos2);
+						MapBlock *block2 = map->getBlockNoCreateNoEx(
+							block_pos2);
+						disappearing_lights.push(LIGHT_SUN, rel_pos2,
+							block_pos2, block2,
+							4 /* The node above caused the change */);
+					}
+				}
+			} else if (new_light > old_light) {
+				// It is sure that the node provides more light than the previous
+				// one, unlighting is not necessary.
+				// Propagate sunlight
+				if (bank == LIGHTBANK_DAY && new_light == LIGHT_SUN) {
+					for (s16 y = p.Y - 1;; y--) {
+						v3s16 n2pos(p.X, y, p.Z);
+
+						MapNode n2;
+
+						n2 = map->getNodeNoEx(n2pos, &is_valid_position);
+						if (!is_valid_position)
+							break;
+
+						// This should not happen, but if the node has sunlight
+						// then the iteration should stop.
+						if (n2.getLight(LIGHTBANK_DAY, ndef) == LIGHT_SUN) {
+							break;
+						}
+						// If the node terminates sunlight, stop.
+						if (!ndef->get(n2).sunlight_propagates) {
+							break;
+						}
+						relative_v3 rel_pos2;
+						mapblock_v3 block_pos2;
+						getNodeBlockPosWithOffset(n2pos, block_pos2, rel_pos2);
+						MapBlock *block2 = map->getBlockNoCreateNoEx(
+							block_pos2);
+						// Mark node for lighting.
+						light_sources.push(LIGHT_SUN, rel_pos2, block_pos2,
+							block2, 4);
+					}
+				}
+			}
+
+		}
+		// Remove lights
+		unspread_light(map, ndef, bank, disappearing_lights, light_sources,
+			modified_blocks);
+		// Initialize light values for light spreading.
+		for (u8 i = 0; i <= LIGHT_SUN; i++) {
+			const std::vector<ChangingLight> &lights = light_sources.lights[i];
+			for (std::vector<ChangingLight>::const_iterator it = lights.begin();
+					it < lights.end(); it++) {
+				MapNode n = it->block->getNodeNoCheck(it->rel_position,
+					&is_valid_position);
+				n.setLight(bank, i, ndef);
+				it->block->setNodeNoCheck(it->rel_position, n);
+			}
+		}
+		// Spread lights.
+		spread_light(map, ndef, bank, light_sources, modified_blocks);
+	}
+}
+
 } // namespace voxalgo
 
diff --git a/src/voxelalgorithms.h b/src/voxelalgorithms.h
index 2eba6a1..3632546 100644
--- a/src/voxelalgorithms.h
+++ b/src/voxelalgorithms.h
@@ -25,6 +25,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <set>
 #include <map>
 
+class Map;
+class MapBlock;
+
 namespace voxalgo
 {
 
@@ -52,6 +55,24 @@ SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a,
 		std::set<v3s16> & light_sources,
 		INodeDefManager *ndef);
 
+/*!
+ * Updates the lighting on the map.
+ * The result will be correct only if
+ * no nodes were changed except the given ones.
+ * Before calling this procedure make sure that all new nodes on
+ * the map have zero light level!
+ *
+ * \param oldnodes contains the MapNodes that were replaced by the new
+ * MapNodes and their positions
+ * \param modified_blocks output, contains all map blocks that
+ * the function modified
+ */
+void update_lighting_nodes(
+	Map *map,
+	INodeDefManager *ndef,
+	std::vector<std::pair<v3s16, MapNode> > &oldnodes,
+	std::map<v3s16, MapBlock*> &modified_blocks);
+
 } // namespace voxalgo
 
 #endif
diff --git a/textures/base/pack/halo.png b/textures/base/pack/halo.png
index eaea782..ed3ff9d 100644
Binary files a/textures/base/pack/halo.png and b/textures/base/pack/halo.png differ
diff --git a/textures/base/pack/no_screenshot.png b/textures/base/pack/no_screenshot.png
index fbaacc9..8c70898 100644
Binary files a/textures/base/pack/no_screenshot.png and b/textures/base/pack/no_screenshot.png differ
diff --git a/textures/base/pack/smoke_puff.png b/textures/base/pack/smoke_puff.png
index 8824a73..488b50f 100644
Binary files a/textures/base/pack/smoke_puff.png and b/textures/base/pack/smoke_puff.png differ
diff --git a/util/buildbot/buildwin32.sh b/util/buildbot/buildwin32.sh
index 78d189b..e58c25c 100755
--- a/util/buildbot/buildwin32.sh
+++ b/util/buildbot/buildwin32.sh
@@ -13,15 +13,15 @@ packagedir=$builddir/packages
 libdir=$builddir/libs
 
 toolchain_file=$dir/toolchain_mingw.cmake
-irrlicht_version=1.8.1
-ogg_version=1.2.1
-vorbis_version=1.3.3
-curl_version=7.38.0
+irrlicht_version=1.8.4
+ogg_version=1.3.2
+vorbis_version=1.3.5
+curl_version=7.50.3
 gettext_version=0.14.4
-freetype_version=2.3.5
-sqlite3_version=3.8.7.4
-luajit_version=2.0.1
-leveldb_version=1.15
+freetype_version=2.7
+sqlite3_version=3.14.2
+luajit_version=2.1.0-beta2
+leveldb_version=1.18
 zlib_version=1.2.8
 
 mkdir -p $packagedir
@@ -34,44 +34,38 @@ cd $builddir
 	-c -O $packagedir/irrlicht-$irrlicht_version.zip
 [ -e $packagedir/zlib-$zlib_version.zip ] || wget http://minetest.kitsunemimi.pw/zlib-$zlib_version-win32.zip \
 	-c -O $packagedir/zlib-$zlib_version.zip
-[ -e $packagedir/libogg-$ogg_version-dev.7z ] || wget http://minetest.kitsunemimi.pw/libogg-$ogg_version-dev.7z \
-	-c -O $packagedir/libogg-$ogg_version-dev.7z
-[ -e $packagedir/libogg-$ogg_version-dll.7z ] || wget http://minetest.kitsunemimi.pw/libogg-$ogg_version-dll.7z \
-	-c -O $packagedir/libogg-$ogg_version-dll.7z
-[ -e $packagedir/libvorbis-$vorbis_version-dev.7z ] || wget http://minetest.kitsunemimi.pw/libvorbis-$vorbis_version-dev.7z \
-	-c -O $packagedir/libvorbis-$vorbis_version-dev.7z
-[ -e $packagedir/libvorbis-$vorbis_version-dll.7z ] || wget http://minetest.kitsunemimi.pw/libvorbis-$vorbis_version-dll.7z \
-	-c -O $packagedir/libvorbis-$vorbis_version-dll.7z
-[ -e $packagedir/libcurl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/libcurl-$curl_version-win32.zip \
-	-c -O $packagedir/libcurl-$curl_version.zip
+[ -e $packagedir/libogg-$ogg_version.zip ] || wget http://minetest.kitsunemimi.pw/libogg-$ogg_version-win32.zip \
+	-c -O $packagedir/libogg-$ogg_version.zip
+[ -e $packagedir/libvorbis-$vorbis_version.zip ] || wget http://minetest.kitsunemimi.pw/libvorbis-$vorbis_version-win32.zip \
+	-c -O $packagedir/libvorbis-$vorbis_version.zip
+[ -e $packagedir/curl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/curl-$curl_version-win32.zip \
+	-c -O $packagedir/curl-$curl_version.zip
 [ -e $packagedir/gettext-$gettext_version.zip ] || wget http://minetest.kitsunemimi.pw/gettext-$gettext_version.zip \
 	-c -O $packagedir/gettext-$gettext_version.zip
-[ -e $packagedir/libfreetype-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/libfreetype-$freetype_version-win32.zip \
-	-c -O $packagedir/libfreetype-$freetype_version.zip
+[ -e $packagedir/freetype2-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/freetype2-$freetype_version-win32.zip \
+	-c -O $packagedir/freetype2-$freetype_version.zip
 [ -e $packagedir/sqlite3-$sqlite3_version.zip ] || wget http://minetest.kitsunemimi.pw/sqlite3-$sqlite3_version-win32.zip \
 	-c -O $packagedir/sqlite3-$sqlite3_version.zip
-[ -e $packagedir/luajit-$luajit_version-static-win32.zip ] || wget http://minetest.kitsunemimi.pw/luajit-$luajit_version-static-win32.zip \
-	-c -O $packagedir/luajit-$luajit_version-static-win32.zip
-[ -e $packagedir/libleveldb-$leveldb_version-win32.zip ] || wget http://minetest.kitsunemimi.pw/libleveldb-$leveldb_version-win32.zip \
-	-c -O $packagedir/libleveldb-$leveldb_version-win32.zip
+[ -e $packagedir/luajit-$luajit_version.zip ] || wget http://minetest.kitsunemimi.pw/luajit-$luajit_version-win32.zip \
+	-c -O $packagedir/luajit-$luajit_version.zip
+[ -e $packagedir/libleveldb-$leveldb_version.zip ] || wget http://minetest.kitsunemimi.pw/libleveldb-$leveldb_version-win32.zip \
+	-c -O $packagedir/libleveldb-$leveldb_version.zip
 [ -e $packagedir/openal_stripped.zip ] || wget http://minetest.kitsunemimi.pw/openal_stripped.zip \
 	-c -O $packagedir/openal_stripped.zip
 
 # Extract stuff
 cd $libdir
-[ -d irrlicht-$irrlicht_version ] || unzip -o $packagedir/irrlicht-$irrlicht_version.zip
+[ -d irrlicht ] || unzip -o $packagedir/irrlicht-$irrlicht_version.zip -d irrlicht
 [ -d zlib ] || unzip -o $packagedir/zlib-$zlib_version.zip -d zlib
-[ -d libogg/include ] || 7z x -y -olibogg $packagedir/libogg-$ogg_version-dev.7z
-[ -d libogg/bin ] || 7z x -y -olibogg $packagedir/libogg-$ogg_version-dll.7z
-[ -d libvorbis/include ] || 7z x -y -olibvorbis $packagedir/libvorbis-$vorbis_version-dev.7z
-[ -d libvorbis/bin ] || 7z x -y -olibvorbis $packagedir/libvorbis-$vorbis_version-dll.7z
-[ -d libcurl ] || unzip -o $packagedir/libcurl-$curl_version.zip -d libcurl
+[ -d libogg ] || unzip -o $packagedir/libogg-$ogg_version.zip -d libogg
+[ -d libvorbis ] || unzip -o $packagedir/libvorbis-$vorbis_version.zip -d libvorbis
+[ -d libcurl ] || unzip -o $packagedir/curl-$curl_version.zip -d libcurl
 [ -d gettext ] || unzip -o $packagedir/gettext-$gettext_version.zip -d gettext
-[ -d freetype ] || unzip -o $packagedir/libfreetype-$freetype_version.zip -d freetype
+[ -d freetype ] || unzip -o $packagedir/freetype2-$freetype_version.zip -d freetype
 [ -d sqlite3 ] || unzip -o $packagedir/sqlite3-$sqlite3_version.zip -d sqlite3
 [ -d openal_stripped ] || unzip -o $packagedir/openal_stripped.zip
-[ -d luajit ] || unzip -o $packagedir/luajit-$luajit_version-static-win32.zip -d luajit
-[ -d leveldb ] || unzip -o $packagedir/libleveldb-$leveldb_version-win32.zip -d leveldb
+[ -d luajit ] || unzip -o $packagedir/luajit-$luajit_version.zip -d luajit
+[ -d leveldb ] || unzip -o $packagedir/libleveldb-$leveldb_version.zip -d leveldb
 
 # Get minetest
 cd $builddir
@@ -81,7 +75,7 @@ else
 	[ -d minetest ] && (cd minetest && git pull) || (git clone https://github.com/minetest/minetest)
 fi
 cd minetest
-git_hash=`git show | head -c14 | tail -c7`
+git_hash=$(git rev-parse --short HEAD)
 
 # Get minetest_game
 cd games
@@ -107,14 +101,13 @@ cmake .. \
 	-DENABLE_FREETYPE=1 \
 	-DENABLE_LEVELDB=1 \
 	\
-	-DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht-$irrlicht_version/include \
-	-DIRRLICHT_LIBRARY=$libdir/irrlicht-$irrlicht_version/lib/Win32-gcc/libIrrlicht.dll.a \
-	-DIRRLICHT_DLL=$libdir/irrlicht-$irrlicht_version/bin/Win32-gcc/Irrlicht.dll \
+	-DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht/include \
+	-DIRRLICHT_LIBRARY=$libdir/irrlicht/lib/Win32-gcc/libIrrlicht.dll.a \
+	-DIRRLICHT_DLL=$libdir/irrlicht/bin/Win32-gcc/Irrlicht.dll \
 	\
 	-DZLIB_INCLUDE_DIR=$libdir/zlib/include \
-	-DZLIB_LIBRARIES=$libdir/zlib/lib/zlibwapi.dll.a \
+	-DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \
 	-DZLIB_DLL=$libdir/zlib/bin/zlib1.dll \
-	-DZLIBWAPI_DLL=$libdir/zlib/bin/zlibwapi.dll \
 	\
 	-DLUA_INCLUDE_DIR=$libdir/luajit/include \
 	-DLUA_LIBRARY=$libdir/luajit/libluajit.a \
@@ -145,9 +138,9 @@ cmake .. \
 	-DGETTEXT_LIBRARY=$libdir/gettext/lib/libintl.dll.a \
 	\
 	-DFREETYPE_INCLUDE_DIR_freetype2=$libdir/freetype/include/freetype2 \
-	-DFREETYPE_INCLUDE_DIR_ft2build=$libdir/freetype/include \
+	-DFREETYPE_INCLUDE_DIR_ft2build=$libdir/freetype/include/freetype2 \
 	-DFREETYPE_LIBRARY=$libdir/freetype/lib/libfreetype.dll.a \
-	-DFREETYPE_DLL=$libdir/freetype/bin/freetype6.dll \
+	-DFREETYPE_DLL=$libdir/freetype/bin/libfreetype-6.dll \
 	\
 	-DSQLITE3_INCLUDE_DIR=$libdir/sqlite3/include \
 	-DSQLITE3_LIBRARY=$libdir/sqlite3/lib/libsqlite3.dll.a \
diff --git a/util/buildbot/buildwin64.sh b/util/buildbot/buildwin64.sh
index e13cbd0..1c31fe4 100755
--- a/util/buildbot/buildwin64.sh
+++ b/util/buildbot/buildwin64.sh
@@ -13,15 +13,15 @@ packagedir=$builddir/packages
 libdir=$builddir/libs
 
 toolchain_file=$dir/toolchain_mingw64.cmake
-irrlicht_version=1.8.1
-ogg_version=1.3.1
-vorbis_version=1.3.4
-curl_version=7.38.0
+irrlicht_version=1.8.4
+ogg_version=1.3.2
+vorbis_version=1.3.5
+curl_version=7.50.3
 gettext_version=0.18.2
-freetype_version=2.5.3
-sqlite3_version=3.8.7.4
-luajit_version=2.0.3
-leveldb_version=1.15
+freetype_version=2.7
+sqlite3_version=3.14.2
+luajit_version=2.1.0-beta2
+leveldb_version=1.18
 zlib_version=1.2.8
 
 mkdir -p $packagedir
@@ -38,15 +38,15 @@ cd $builddir
 	-c -O $packagedir/libogg-$ogg_version.zip
 [ -e $packagedir/libvorbis-$vorbis_version.zip ] || wget http://minetest.kitsunemimi.pw/libvorbis-$vorbis_version-win64.zip \
 	-c -O $packagedir/libvorbis-$vorbis_version.zip
-[ -e $packagedir/libcurl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/libcurl-$curl_version-win64.zip \
-	-c -O $packagedir/libcurl-$curl_version.zip
+[ -e $packagedir/curl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/curl-$curl_version-win64.zip \
+	-c -O $packagedir/curl-$curl_version.zip
 [ -e $packagedir/gettext-$gettext_version.zip ] || wget http://minetest.kitsunemimi.pw/gettext-$gettext_version-win64.zip \
 	-c -O $packagedir/gettext-$gettext_version.zip
-[ -e $packagedir/freetype-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/libfreetype-$freetype_version-win64.zip \
-	-c -O $packagedir/freetype-$freetype_version.zip
+[ -e $packagedir/freetype2-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/freetype2-$freetype_version-win64.zip \
+	-c -O $packagedir/freetype2-$freetype_version.zip
 [ -e $packagedir/sqlite3-$sqlite3_version.zip ] || wget http://minetest.kitsunemimi.pw/sqlite3-$sqlite3_version-win64.zip \
 	-c -O $packagedir/sqlite3-$sqlite3_version.zip
-[ -e $packagedir/luajit-$luajit_version.zip ] || wget http://minetest.kitsunemimi.pw/luajit-$luajit_version-static-win64.zip \
+[ -e $packagedir/luajit-$luajit_version.zip ] || wget http://minetest.kitsunemimi.pw/luajit-$luajit_version-win64.zip \
 	-c -O $packagedir/luajit-$luajit_version.zip
 [ -e $packagedir/libleveldb-$leveldb_version.zip ] || wget http://minetest.kitsunemimi.pw/libleveldb-$leveldb_version-win64.zip \
 	-c -O $packagedir/libleveldb-$leveldb_version.zip
@@ -56,13 +56,13 @@ cd $builddir
 
 # Extract stuff
 cd $libdir
-[ -d irrlicht-$irrlicht_version ] || unzip -o $packagedir/irrlicht-$irrlicht_version.zip
+[ -d irrlicht ] || unzip -o $packagedir/irrlicht-$irrlicht_version.zip -d irrlicht
 [ -d zlib ] || unzip -o $packagedir/zlib-$zlib_version.zip -d zlib
 [ -d libogg ] || unzip -o $packagedir/libogg-$ogg_version.zip -d libogg
 [ -d libvorbis ] || unzip -o $packagedir/libvorbis-$vorbis_version.zip -d libvorbis
-[ -d libcurl ] || unzip -o $packagedir/libcurl-$curl_version.zip -d libcurl
+[ -d libcurl ] || unzip -o $packagedir/curl-$curl_version.zip -d libcurl
 [ -d gettext ] || unzip -o $packagedir/gettext-$gettext_version.zip -d gettext
-[ -d freetype ] || unzip -o $packagedir/freetype-$freetype_version.zip -d freetype
+[ -d freetype ] || unzip -o $packagedir/freetype2-$freetype_version.zip -d freetype
 [ -d sqlite3 ] || unzip -o $packagedir/sqlite3-$sqlite3_version.zip -d sqlite3
 [ -d openal_stripped ] || unzip -o $packagedir/openal_stripped.zip
 [ -d luajit ] || unzip -o $packagedir/luajit-$luajit_version.zip -d luajit
@@ -76,7 +76,7 @@ else
 	[ -d minetest ] && (cd minetest && git pull) || (git clone https://github.com/minetest/minetest)
 fi
 cd minetest
-git_hash=`git show | head -c14 | tail -c7`
+git_hash=$(git rev-parse --short HEAD)
 
 # Get minetest_game
 cd games
@@ -102,9 +102,9 @@ cmake .. \
 	-DENABLE_FREETYPE=1 \
 	-DENABLE_LEVELDB=1 \
 	\
-	-DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht-$irrlicht_version/include \
-	-DIRRLICHT_LIBRARY=$libdir/irrlicht-$irrlicht_version/lib/Win64-gcc/libIrrlicht.dll.a \
-	-DIRRLICHT_DLL=$libdir/irrlicht-$irrlicht_version/bin/Win64-gcc/Irrlicht.dll \
+	-DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht/include \
+	-DIRRLICHT_LIBRARY=$libdir/irrlicht/lib/Win64-gcc/libIrrlicht.dll.a \
+	-DIRRLICHT_DLL=$libdir/irrlicht/bin/Win64-gcc/Irrlicht.dll \
 	\
 	-DZLIB_INCLUDE_DIR=$libdir/zlib/include \
 	-DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \
@@ -131,6 +131,13 @@ cmake .. \
 	-DCURL_INCLUDE_DIR=$libdir/libcurl/include \
 	-DCURL_LIBRARY=$libdir/libcurl/lib/libcurl.dll.a \
 	\
+	-DCUSTOM_GETTEXT_PATH=$libdir/gettext \
+	-DGETTEXT_MSGFMT=`which msgfmt` \
+	-DGETTEXT_DLL=$libdir/gettext/bin/libintl-8.dll \
+	-DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv-2.dll \
+	-DGETTEXT_INCLUDE_DIR=$libdir/gettext/include \
+	-DGETTEXT_LIBRARY=$libdir/gettext/lib/libintl.dll.a \
+	\
 	-DFREETYPE_INCLUDE_DIR_freetype2=$libdir/freetype/include/freetype2 \
 	-DFREETYPE_INCLUDE_DIR_ft2build=$libdir/freetype/include/freetype2 \
 	-DFREETYPE_LIBRARY=$libdir/freetype/lib/libfreetype.dll.a \
@@ -142,14 +149,7 @@ cmake .. \
 	\
 	-DLEVELDB_INCLUDE_DIR=$libdir/leveldb/include \
 	-DLEVELDB_LIBRARY=$libdir/leveldb/lib/libleveldb.dll.a \
-	-DLEVELDB_DLL=$libdir/leveldb/bin/libleveldb.dll \
-	\
-	-DCUSTOM_GETTEXT_PATH=$libdir/gettext \
-	-DGETTEXT_MSGFMT=`which msgfmt` \
-	-DGETTEXT_DLL=$libdir/gettext/bin/libintl-8.dll \
-	-DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv-2.dll \
-	-DGETTEXT_INCLUDE_DIR=$libdir/gettext/include \
-	-DGETTEXT_LIBRARY=$libdir/gettext/lib/libintl.dll.a
+	-DLEVELDB_DLL=$libdir/leveldb/bin/libleveldb.dll
 
 make package -j2
 
diff --git a/util/travis/before_install.sh b/util/travis/before_install.sh
index 58dc42b..8913719 100755
--- a/util/travis/before_install.sh
+++ b/util/travis/before_install.sh
@@ -1,29 +1,27 @@
 #!/bin/bash -e
+echo "Preparing for $TRAVIS_COMMIT_RANGE"
+. util/travis/common.sh
+
+needs_compile || exit 0
 
 if [[ $TRAVIS_OS_NAME == "linux" ]]; then
-	if [[ $CC == "clang" ]]; then
-		export PATH="/usr/bin/:$PATH"
-		sudo sh -c 'echo "deb http://ppa.launchpad.net/eudoxos/llvm-3.1/ubuntu precise main" >> /etc/apt/sources.list'
-		sudo apt-key adv --keyserver pool.sks-keyservers.net --recv-keys 92DE8183
-		sudo apt-get update
-		sudo apt-get install llvm-3.1
-		sudo apt-get install clang
-	fi
 	sudo apt-get update
-	sudo apt-get install p7zip-full
+	sudo apt-get install p7zip-full $COMPILER
 fi
 
 if [[ $PLATFORM == "Unix" ]]; then
 	if [[ $TRAVIS_OS_NAME == "linux" ]]; then
 		sudo apt-get install libirrlicht-dev cmake libbz2-dev libpng12-dev \
 			libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev \
-			libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev gettext
+			libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev \
+			gettext libpq-dev postgresql-server-dev-all
 		# Linking to LevelDB is broken, use a custom build
 		wget http://minetest.kitsunemimi.pw/libleveldb-1.18-ubuntu12.04.7z
 		sudo 7z x -o/usr libleveldb-1.18-ubuntu12.04.7z
 	else
 		brew update
 		brew install freetype gettext hiredis irrlicht jpeg leveldb libogg libvorbis luajit
+		#brew upgrade postgresql
 	fi
 elif [[ $PLATFORM == "Win32" ]]; then
 	wget http://minetest.kitsunemimi.pw/mingw_w64_i686_ubuntu12.04_4.9.1.7z -O mingw.7z
diff --git a/util/travis/common.sh b/util/travis/common.sh
new file mode 100644
index 0000000..16c7db3
--- /dev/null
+++ b/util/travis/common.sh
@@ -0,0 +1,8 @@
+#!/bin/bash -e
+
+# Relative to git-repository root:
+TRIGGER_COMPILE_PATHS="src/|CMakeLists.txt|cmake/Modules/|util/travis/|util/buildbot/"
+
+needs_compile() {
+	git diff --name-only $TRAVIS_COMMIT_RANGE | egrep -q "^($TRIGGER_COMPILE_PATHS)"
+}
diff --git a/util/travis/script.sh b/util/travis/script.sh
index 870954e..1bafb26 100755
--- a/util/travis/script.sh
+++ b/util/travis/script.sh
@@ -1,9 +1,16 @@
 #!/bin/bash -e
+. util/travis/common.sh
+
+needs_compile || exit 0
 
 if [[ $PLATFORM == "Unix" ]]; then
 	mkdir -p travisbuild
 	cd travisbuild || exit 1
 	CMAKE_FLAGS=''
+	if [[ $COMPILER == "g++-6" ]]; then
+		export CC=gcc-6
+		export CXX=g++-6
+	fi
 	# Clang builds with FreeType fail on Travis
 	if [[ $CC == "clang" ]]; then
 		CMAKE_FLAGS+=' -DENABLE_FREETYPE=FALSE'

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/minetest-v04x.git



More information about the Pkg-games-commits mailing list