diff --git a/rules.d/020-0.4.3/tag b/rules.d/020-0.4.3/tag
new file mode 100644
index 0000000..17b2ccd
--- /dev/null
+++ b/rules.d/020-0.4.3/tag
@@ -0,0 +1 @@
+0.4.3
diff --git a/rules.d/020-0.4.3/worldtest_generate.patch b/rules.d/020-0.4.3/worldtest_generate.patch
new file mode 100644
index 0000000..698a9ae
--- /dev/null
+++ b/rules.d/020-0.4.3/worldtest_generate.patch
@@ -0,0 +1,92 @@
+diff --git a/src/server.cpp b/src/server.cpp
+index 893d03b..06cdaad 100644
+--- a/src/server.cpp
++++ b/src/server.cpp
+@@ -212,6 +212,10 @@ void * EmergeThread::Thread()
+ */
+
+ bool only_from_disk = true;
++ //
++ // This doesn't seem to really work in our case
++ only_from_disk = false;
++ //
+
+ {
+ core::map::Iterator i;
+@@ -1306,6 +1310,47 @@ void Server::AsyncRunStep()
+ }
+ }
+
++ //
++ // Quit when blocks near origin have been loaded or generated
++ {
++ JMutexAutoLock envlock(m_env_mutex);
++ // Make sure EmergeThread runs
++ m_emergethread.trigger();
++ // Check area near origin
++ Map *map = &m_env->getMap();
++ if(
++ map->getBlockNoCreateNoEx(v3s16(0,0,0)) &&
++ map->getBlockNoCreateNoEx(v3s16(0,0,0))->isGenerated() &&
++ map->getBlockNoCreateNoEx(v3s16(0,0,-1)) &&
++ map->getBlockNoCreateNoEx(v3s16(0,0,-1))->isGenerated() &&
++ map->getBlockNoCreateNoEx(v3s16(0,-1,0)) &&
++ map->getBlockNoCreateNoEx(v3s16(0,-1,0))->isGenerated() &&
++ map->getBlockNoCreateNoEx(v3s16(0,-1,-1)) &&
++ map->getBlockNoCreateNoEx(v3s16(0,-1,-1))->isGenerated() &&
++ map->getBlockNoCreateNoEx(v3s16(-1,0,0)) &&
++ map->getBlockNoCreateNoEx(v3s16(-1,0,0))->isGenerated() &&
++ map->getBlockNoCreateNoEx(v3s16(-1,0,-1)) &&
++ map->getBlockNoCreateNoEx(v3s16(-1,0,-1))->isGenerated() &&
++ map->getBlockNoCreateNoEx(v3s16(-1,-1,0)) &&
++ map->getBlockNoCreateNoEx(v3s16(-1,-1,0))->isGenerated() &&
++ map->getBlockNoCreateNoEx(v3s16(-1,-1,-1)) &&
++ map->getBlockNoCreateNoEx(v3s16(-1,-1,-1))->isGenerated()
++ ){
++ static bool message_triggered = false;
++ if(!message_triggered){
++ dstream<set("worldtest_command", "loaded");
++ }
++ if(g_settings->exists("worldtest_command") &&
++ g_settings->get("worldtest_command") == "done")
++ m_shutdown_requested = true;
++ }
++ }
++ //
++
+ {
+ JMutexAutoLock lock(m_env_mutex);
+ // Step environment
+@@ -1318,6 +1363,7 @@ void Server::AsyncRunStep()
+ if(m_map_timer_and_unload_interval.step(dtime, map_timer_and_unload_dtime))
+ {
+ JMutexAutoLock lock(m_env_mutex);
++
+ // Run Map's timers and unload unused data
+ ScopeProfiler sp(g_profiler, "Server: map timer and unload");
+ m_env->getMap().timerUpdate(map_timer_and_unload_dtime,
+@@ -4853,6 +4899,20 @@ void dedicated_server_loop(Server &server, bool &kill)
+ {
+ DSTACK(__FUNCTION_NAME);
+
++ //
++ // Load or generate blocks near origin
++ dstream<
++
+ verbosestream<<"dedicated_server_loop()"<