diff --git a/minetest.conf.example b/minetest.conf.example
index 243c84f3a0e60fd3eb96eef5adf8162bc71f0b74..fa54bde8dc0cdecd9b64c06992b0b06afdd61302 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -68,6 +68,8 @@
 # If FPS would go higher than this, limit it by sleeping
 # (to not waste CPU power for no benefit)
 #fps_max = 60
+# Maximum FPS when game is paused
+#pause_fps_max = 20
 # The allowed adjustment range for the automatic rendering range adjustment
 #viewing_range_nodes_max = 160
 #viewing_range_nodes_min = 35
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index 5a1dabebf77443201b5c0d9df6e0f75319e47e2c..a7187faea9a662868e0669faf2c4954076e26cb0 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -77,6 +77,7 @@ void set_default_settings(Settings *settings)
 
 	settings->setDefault("wanted_fps", "30");
 	settings->setDefault("fps_max", "60");
+	settings->setDefault("pause_fps_max", "20");
 	// A bit more than the server will send around the player, to make fog blend well
 	settings->setDefault("viewing_range_nodes_max", "240");
 	settings->setDefault("viewing_range_nodes_min", "35");
diff --git a/src/game.cpp b/src/game.cpp
index c768440d3deabf62450e1febda54871e87a681c4..b751a2b627e8eef9955a5b1f0bad0fdb3e2ab6d0 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -1513,7 +1513,9 @@ void the_game(
 		*/
 
 		{
-			float fps_max = g_settings->getFloat("fps_max");
+			float fps_max = g_menumgr.pausesGame() ?
+					g_settings->getFloat("pause_fps_max") :
+					g_settings->getFloat("fps_max");
 			u32 frametime_min = 1000./fps_max;
 			
 			if(busytime_u32 < frametime_min)
@@ -2192,25 +2194,28 @@ void the_game(
 			LocalPlayer* player = client.getEnv().getLocalPlayer();
 			player->keyPressed=keyPressed;
 		}
-		
+
 		/*
-			Run server
+			Run server, client (and process environments)
 		*/
-
-		if(server != NULL)
+		bool can_be_and_is_paused =
+				(simple_singleplayer_mode && g_menumgr.pausesGame());
+		if(can_be_and_is_paused)
 		{
-			//TimeTaker timer("server->step(dtime)");
-			server->step(dtime);
+			// No time passes
+			dtime = 0;
 		}
-
-		/*
-			Process environment
-		*/
-		
+		else
 		{
-			//TimeTaker timer("client.step(dtime)");
-			client.step(dtime);
-			//client.step(dtime_avg1);
+			if(server != NULL)
+			{
+				//TimeTaker timer("server->step(dtime)");
+				server->step(dtime);
+			}
+			{
+				//TimeTaker timer("client.step(dtime)");
+				client.step(dtime);
+			}
 		}
 
 		{
diff --git a/src/guiPauseMenu.h b/src/guiPauseMenu.h
index 25011a34ad5fbcb00fd04e4b339830c8371b56b2..2808c93b158b86af9e9e6eaa45dfc913b81e98e6 100644
--- a/src/guiPauseMenu.h
+++ b/src/guiPauseMenu.h
@@ -51,7 +51,9 @@ class GUIPauseMenu : public GUIModalMenu
 	void drawMenu();
 
 	bool OnEvent(const SEvent& event);
-	
+
+	bool pausesGame(){ return true; }
+
 private:
 	IGameCallback *m_gamecallback;
 	bool m_simple_singleplayer_mode;
diff --git a/src/guiVolumeChange.h b/src/guiVolumeChange.h
index 1dcc7fbde8a641db501d3e4905831624fe55d649..5258ee1071be7bdda4ccceb55babc1debf8bf175 100644
--- a/src/guiVolumeChange.h
+++ b/src/guiVolumeChange.h
@@ -44,6 +44,8 @@ class GUIVolumeChange : public GUIModalMenu
 
 	bool OnEvent(const SEvent& event);
 	
+	bool pausesGame(){ return true; }
+
 private:
 	Client* m_client;
 
diff --git a/src/mainmenumanager.h b/src/mainmenumanager.h
index d151cf48d663b33958e8be9defacb316b9f81e0a..ecfb89fd3111091184eaedaf2b97fde710a8c7a2 100644
--- a/src/mainmenumanager.h
+++ b/src/mainmenumanager.h
@@ -91,6 +91,17 @@ class MainMenuManager : public IMenuManager
 		return m_stack.size();
 	}
 
+	bool pausesGame()
+	{
+		for(std::list<GUIModalMenu*>::iterator
+				i = m_stack.begin(); i != m_stack.end(); ++i)
+		{
+			if((*i)->pausesGame())
+				return true;
+		}
+		return false;
+	}
+
 	std::list<GUIModalMenu*> m_stack;
 };
 
diff --git a/src/modalMenu.h b/src/modalMenu.h
index c8b45a247a8cb233de94e1eb0b790deecb9190f4..251b7aa3b60a86af18524631f8377621974320dd 100644
--- a/src/modalMenu.h
+++ b/src/modalMenu.h
@@ -124,6 +124,7 @@ class GUIModalMenu : public gui::IGUIElement
 	virtual void drawMenu() = 0;
 	virtual bool preprocessEvent(const SEvent& event) { return false; };
 	virtual bool OnEvent(const SEvent& event) { return false; };
+	virtual bool pausesGame(){ return false; } // Used for pause menu
 
 protected:
 	//bool m_force_regenerate_gui;