diff --git a/src/am_map.c b/src/am_map.c
index 4ad40b7aa6dae765c564ff7caac338f216e9f32d..6cd9a3f0f15b2e8c9d4eda4663b2c5247500124c 100644
--- a/src/am_map.c
+++ b/src/am_map.c
@@ -346,15 +346,21 @@ static void AM_initVariables(void)
 }
 
 //
-// should be called at the start of every level
-// right now, i figure it out myself
+// Called when the screen size changed.
 //
-static void AM_LevelInit(void)
+static void AM_FrameBufferInit(void)
 {
 	f_x = f_y = 0;
 	f_w = vid.width;
 	f_h = vid.height;
+}
 
+//
+// should be called at the start of every level
+// right now, i figure it out myself
+//
+static void AM_LevelInit(void)
+{
 	AM_findMinMaxBoundaries();
 	scale_mtof = FixedDiv(min_scale_mtof*10, 7*FRACUNIT);
 	if (scale_mtof > max_scale_mtof)
@@ -376,7 +382,7 @@ void AM_Stop(void)
   *
   * \sa AM_Stop
   */
-static inline void AM_Start(void)
+void AM_Start(void)
 {
 	static INT32 lastlevel = -1;
 
@@ -385,8 +391,12 @@ static inline void AM_Start(void)
 	am_stopped = false;
 	if (lastlevel != gamemap || am_recalc) // screen size changed
 	{
-		AM_LevelInit();
-		lastlevel = gamemap;
+		AM_FrameBufferInit();
+		if (lastlevel != gamemap)
+		{
+			AM_LevelInit();
+			lastlevel = gamemap;
+		}
 		am_recalc = false;
 	}
 	AM_initVariables();
diff --git a/src/am_map.h b/src/am_map.h
index 462bb3d6d7b0adf15140f55705fbb76642725089..0560207bb41821f7ce09eb14d63ee3a62dfcfb97 100644
--- a/src/am_map.h
+++ b/src/am_map.h
@@ -38,6 +38,9 @@ void AM_Ticker(void);
 // Called by main loop, instead of view drawer if automap is active.
 void AM_Drawer(void);
 
+// Enables the automap.
+void AM_Start(void);
+
 // Called to force the automap to quit if the level is completed while it is up.
 void AM_Stop(void);
 
diff --git a/src/screen.c b/src/screen.c
index 5bb304c0844708545d18a18b4d8e0335e61faf74..fcf6c6b0bdf6f417964a58817fae9af208edb240 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -360,10 +360,13 @@ void SCR_Recalc(void)
 	vid.fsmalldupy = vid.smalldupy*FRACUNIT;
 #endif
 
-	// toggle off automap because some screensize-dependent values will
+	// toggle off (then back on) the automap because some screensize-dependent values will
 	// be calculated next time the automap is activated.
 	if (automapactive)
-		AM_Stop();
+	{
+		am_recalc = true;
+		AM_Start();
+	}
 
 	// set the screen[x] ptrs on the new vidbuffers
 	V_Init();