diff --git a/.luacheckrc b/.luacheckrc
index c00e028e792823182275e9e36c5a30789d9e3eed..b1eb1c99f50000f7f38834b68fee9d10182c1c15 100644
--- a/.luacheckrc
+++ b/.luacheckrc
@@ -25,6 +25,7 @@ stds.minetest = {
 }
 
 read_globals = {
+	"farming",
 	"intllib",
 	"mg",
 }
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 612b615019f09b56e2bc650e2fc2c80becd8b317..1ccd36dccb721a905847e56a8ee839295b4c25ff 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,7 +9,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
 
 ### Added
 
-- Brazilian translation.
+- Brazilian and Dutch translations.
+
+### Deprecated
+
+- Deprecated hoes to follow Minetest Game's deprecation of hoes
+  made of "rare" materials.
+  - Hoes are still available in existing worlds, but they
+    cannot be crafted anymore.
 
 ### Fixed
 
diff --git a/depends.txt b/depends.txt
index 02190529c7594f54cdbdb54fa6611de38852a04d..0dc152fb93ba49b2f84a1394850e1de26d7e904d 100644
--- a/depends.txt
+++ b/depends.txt
@@ -1,2 +1,3 @@
 default
 mg?
+farming?
diff --git a/init.lua b/init.lua
index 1a77ad39a45afa037e1d35121d1d490e9db85967..cc6f27dd98d993bd73600c0ee8ac02a0d28feedf 100644
--- a/init.lua
+++ b/init.lua
@@ -37,37 +37,6 @@ end
 local default_stone_sounds = default.node_sound_stone_defaults()
 local default_metal_sounds = default.node_sound_metal_defaults()
 
-local function hoe_on_use(itemstack, user, pointed_thing, uses)
-	local pt = pointed_thing
-	-- Check if pointing at a node:
-	if not pt then
-		return
-	end
-	if pt.type ~= "node" then
-		return
-	end
-
-	local under = minetest.get_node(pt.under)
-	local pos = {x = pt.under.x, y = pt.under.y + 1, z = pt.under.z}
-	local above = minetest.get_node(pos)
-
-	-- Return if any of the nodes is not registered:
-	if not minetest.registered_nodes[under.name] then return end
-	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 dirt:
-	if minetest.get_item_group(under.name, "soil") ~= 1 then return end
-
-	-- Turn the node into soil, wear out item and play sound:
-	minetest.set_node(pt.under, {name ="farming:soil"})
-	minetest.sound_play("default_dig_crumbly", {pos = pt.under, gain = 0.5})
-	itemstack:add_wear(65535 / (uses - 1))
-	return itemstack
-end
-
 local function get_recipe(c, name)
 	if name == "sword" then
 		return {{c}, {c}, {"group:stick"}}
@@ -81,9 +50,6 @@ local function get_recipe(c, name)
 	if name == "pick" then
 		return {{c, c, c}, {"", "group:stick", ""}, {"", "group:stick", ""}}
 	end
-	if name == "hoe" then
-		return {{c, c}, {"", "group:stick"}, {"", "group:stick"}}
-	end
 	if name == "block" then
 		return {{c, c, c}, {c, c, c}, {c, c, c}}
 	end
@@ -189,7 +155,7 @@ local function add_ore(modname, description, mineral_name, oredef)
 				max_drop_level = 3,
 				groupcaps = tooldef
 			},
-            sound = {breaks = "default_tool_breaks"},
+			sound = {breaks = "default_tool_breaks"},
 		}
 
 		if tool_name == "sword" then
@@ -214,27 +180,33 @@ local function add_ore(modname, description, mineral_name, oredef)
 			tdef.full_punch_interval = oredef.full_punch_interval
 			tdef.tool_capabilities.damage_groups = oredef.damage_groups
 			tdef.description = S("%s Shovel"):format(S(description))
-            tdef.wield_image = toolimg_base .. tool_name .. ".png^[transformR90"
+			tdef.wield_image = toolimg_base .. tool_name .. ".png^[transformR90"
 		end
 
-		if tool_name == "hoe" then
+		local fulltool_name = tool_base .. tool_name .. tool_post
+
+		if tool_name == "hoe" and minetest.get_modpath("farming") then
+			tdef.max_uses = tooldef.uses
 			tdef.description = S("%s Hoe"):format(S(description))
-			local uses = tooldef.uses
-			tooldef.uses = nil
-			tdef.on_use = function(itemstack, user, pointed_thing)
-				return hoe_on_use(itemstack, user, pointed_thing, uses)
+			farming.register_hoe(fulltool_name, tdef)
+		end
+
+		-- Hoe registration is handled above.
+		-- There are no crafting recipes for hoes, as they have been
+		-- deprecated from Minetest Game:
+		-- https://github.com/minetest/minetest_game/commit/9c459e77a
+		if tool_name ~= "hoe" then
+			minetest.register_tool(fulltool_name, tdef)
+
+			if oredef.makes.ingot then
+				minetest.register_craft({
+					output = fulltool_name,
+					recipe = get_recipe(ingot, tool_name)
+				})
 			end
 		end
 
-		local fulltool_name = tool_base .. tool_name .. tool_post
-		minetest.register_tool(fulltool_name, tdef)
 		minetest.register_alias(tool_name .. tool_post, fulltool_name)
-		if oredef.makes.ingot then
-			minetest.register_craft({
-				output = fulltool_name,
-				recipe = get_recipe(ingot, tool_name)
-			})
-		end
 	end
 end
 
diff --git a/locale/de.txt b/locale/de.txt
index 2eb6075797af826699e36f9547a72f8d698b77b9..070faf9fa2520e4fff956e0ae15b20b0bf432ea0 100644
--- a/locale/de.txt
+++ b/locale/de.txt
@@ -10,7 +10,6 @@
 %s Shovel = %sschaufel
 %s Axe = %saxt
 %s Sword = %sschwert
-%s Hoe = %shacke
 
 Copper = Kupfer
 Tin = Zinn
diff --git a/locale/nl.txt b/locale/nl.txt
index c90eb60761d616c231e1c5487168eca38d0b5db8..954045f4bae7794890b13593b53cb4802ef40b0d 100644
--- a/locale/nl.txt
+++ b/locale/nl.txt
@@ -8,7 +8,6 @@
 %s Shovel = %s Schep
 %s Axe = %s Bijl
 %s Sword = %s Zwaard
-%s Hoe = %s Schoffel
 
 Copper = Koper
 Tin = Tin