diff --git a/src/i_video.h b/src/i_video.h
index 76b984d252d9463d43f3f66178636af1c3f885b3..8f87a360e90f0c52b0296decf8d106c6973debf8 100644
--- a/src/i_video.h
+++ b/src/i_video.h
@@ -32,10 +32,13 @@ typedef enum
 	render_none = 3  // for dedicated server
 } rendermode_t;
 
-/**	\brief currect render mode
+/**	\brief current render mode
 */
 extern rendermode_t rendermode;
 
+/**	\brief hardware renderer loaded
+*/
+extern boolean hwrenderloaded;
 
 /**	\brief use highcolor modes if true
 */
@@ -44,6 +47,9 @@ extern boolean highcolor;
 /**	\brief setup video mode
 */
 void I_StartupGraphics(void);
+
+/**	\brief setup hardware mode
+*/
 void I_StartupHardwareGraphics(void);
 
 /**	\brief restore old video mode
@@ -82,9 +88,12 @@ INT32 VID_GetModeForSize(INT32 w, INT32 h);
 
 	\param	modenum	video mode to set to
 
-	\return	currect video mode
+	\return	current video mode
 */
 INT32 VID_SetMode(INT32 modenum);
+
+/**	\brief Checks the render state
+*/
 void VID_CheckRenderer(void);
 
 /**	\brief	The VID_GetModeName function
diff --git a/src/screen.c b/src/screen.c
index 5bb304c0844708545d18a18b4d8e0335e61faf74..5406ee46fa7e257b9bcdcccc268561d065648047 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -461,7 +461,7 @@ void SCR_ChangeRenderer(void)
 	{
 		target_renderer = cv_renderer.value;
 #ifdef HWRENDER
-		if (M_CheckParm("-opengl"))
+		if (M_CheckParm("-opengl") && hwrenderloaded)
 			target_renderer = rendermode = render_opengl;
 		else
 #endif
diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c
index 0911ca6069ef0ed0abc49ec1397c3645d3f79346..e4f4790fd6c47cb80c4418822d6649a93f3778e8 100644
--- a/src/sdl/i_video.c
+++ b/src/sdl/i_video.c
@@ -93,7 +93,8 @@ static INT32 numVidModes = -1;
 */
 static char vidModeName[33][32]; // allow 33 different modes
 
-rendermode_t rendermode=render_soft;
+rendermode_t rendermode = render_soft;
+static rendermode_t chosenrendermode = render_soft; // set by command line arguments
 
 boolean highcolor = false;
 
@@ -103,6 +104,7 @@ static consvar_t cv_stretch = {"stretch", "Off", CV_SAVE|CV_NOSHOWHELP, CV_OnOff
 static consvar_t cv_alwaysgrabmouse = {"alwaysgrabmouse", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
 
 UINT8 graphics_started = 0; // Is used in console.c and screen.c
+boolean hwrenderloaded = false;
 
 // To disable fullscreen at startup; is set in VID_PrepareModeList
 boolean allow_fullscreen = false;
@@ -1454,14 +1456,44 @@ static SDL_bool Impl_CreateContext(void)
 	return SDL_TRUE;
 }
 
+#ifdef HWRENDER
+static void VID_CheckGLLoaded(rendermode_t oldrender)
+{
+	if (!hwrenderloaded) // Well, it didn't work the first time anyway.
+	{
+		CONS_Alert(CONS_ERROR, "OpenGL never loaded\n");
+		rendermode = oldrender;
+		if (chosenrendermode == render_opengl) // fallback to software
+			rendermode = render_soft;
+		if (setrenderneeded)
+		{
+			CV_StealthSetValue(&cv_renderer, oldrender);
+			CV_StealthSetValue(&cv_newrenderer, oldrender);
+			setrenderneeded = 0;
+		}
+	}
+}
+#endif
+
 void VID_CheckRenderer(void)
 {
+	rendermode_t oldrenderer = rendermode;
+
 	if (dedicated)
 		return;
 
+#ifdef HWRENDER
+	if (!graphics_started)
+		VID_CheckGLLoaded(oldrenderer);
+#endif
+
 	if (setrenderneeded)
 	{
 		rendermode = setrenderneeded;
+#ifdef HWRENDER
+		if (setrenderneeded == render_opengl)
+			VID_CheckGLLoaded(oldrenderer);
+#endif
 		Impl_CreateContext();
 	}
 
@@ -1484,9 +1516,15 @@ void VID_CheckRenderer(void)
 	else if (rendermode == render_opengl)
 	{
 		I_StartupHardwareGraphics();
-		R_InitHardwareMode();
-		HWR_Switch();
+		// Needs to check if switching failed somehow, too.
+		if (rendermode == render_opengl)
+		{
+			R_InitHardwareMode();
+			HWR_Switch();
+		}
 	}
+#else
+	(void)oldrenderer;
 #endif
 }
 
@@ -1651,10 +1689,10 @@ void I_StartupGraphics(void)
 
 #ifdef HWRENDER
 	if (M_CheckParm("-opengl"))
-		rendermode = render_opengl;
+		chosenrendermode = rendermode = render_opengl;
 	else if (M_CheckParm("-software"))
 #endif
-		rendermode = render_soft;
+		chosenrendermode = rendermode = render_soft;
 
 	usesdl2soft = M_CheckParm("-softblit");
 	borderlesswindow = M_CheckParm("-borderless");
@@ -1760,9 +1798,13 @@ void I_StartupHardwareGraphics(void)
 		HWD.pfnInitCustomShaders= hwSym("InitCustomShaders",NULL);
 
 		if (!HWD.pfnInit()) // let load the OpenGL library
+		{
 			rendermode = render_soft;
+			setrenderneeded = 0;
+		}
 		else
-			glstartup = true;
+			hwrenderloaded = true;
+		glstartup = true;
 	}
 #endif
 }
diff --git a/src/sdl/ogl_sdl.c b/src/sdl/ogl_sdl.c
index e20e4d091d1e2e00f68f908f87655784c16706d2..bbaaeea80444c933e59307d353f66a7d6389a812 100644
--- a/src/sdl/ogl_sdl.c
+++ b/src/sdl/ogl_sdl.c
@@ -129,15 +129,15 @@ boolean LoadGL(void)
 			return SetupGLfunc();
 		else
 		{
-			I_OutputMsg("Could not load GLU Library: %s\n", GLULibname);
+			CONS_Alert(CONS_ERROR, "Could not load GLU Library: %s\n", GLULibname);
 			if (!M_CheckParm ("-GLUlib"))
-				I_OutputMsg("If you know what is the GLU library's name, use -GLUlib\n");
+				CONS_Alert(CONS_ERROR, "If you know what is the GLU library's name, use -GLUlib\n");
 		}
 	}
 	else
 	{
-		I_OutputMsg("Could not load GLU Library\n");
-		I_OutputMsg("If you know what is the GLU library's name, use -GLUlib\n");
+		CONS_Alert(CONS_ERROR, "Could not load GLU Library\n");
+		CONS_Alert(CONS_ERROR, "If you know what is the GLU library's name, use -GLUlib\n");
 	}
 #endif
 	return SetupGLfunc();