diff --git a/binaries/data/mods/public/gui/options/options.xml b/binaries/data/mods/public/gui/options/options.xml
index b6de0e9..352fc97 100644
--- a/binaries/data/mods/public/gui/options/options.xml
+++ b/binaries/data/mods/public/gui/options/options.xml
@@ -31,16 +31,160 @@
         </object>
         <object name="GraphicsSettings" type="image" sprite="BackgroundIndentFillDark" size="316 16 616 100%-16">
             <object style="TitleText" type="text" size="0 5 100% 25">Graphics Settings</object>
+
             <object size="0 25 65% 50" type="text" style="RightLabelText" ghost="true">Enable Shadows</object>
             <object name="ShadowsCFG" size="70% 30 70%+25 55" type="checkbox" style="StoneCrossBox">
-                <action on="Load">this.checked = Engine.Renderer_GetShadowsEnabled();</action>
-                <action on="Press">Engine.Renderer_SetShadowsEnabled(this.checked);</action>
+                <action on="Load">
+                    if (Engine.Renderer_GetShadowsAvailable()) {
+                        Engine.ConfigDB_GetValue("user", "shadows") === "true" ? this.checked = true : this.checked = false;
+                    } else {
+                        this.enabled = false;
+                        this.checked = false;
+                    }
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetShadowsEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "shadows", String(this.checked));
+                </action>
             </object>
+
             <object size="0 50 65% 75" type="text" style="RightLabelText" ghost="true">Enable Shadow Filtering</object>
             <object name="ShadowPCFCFGNow" size="70% 55 70%+25 80" type="checkbox" style="StoneCrossBox">
-                <action on="Load">this.checked = Engine.Renderer_GetShadowPCFEnabled();</action>
-                <action on="Press">Engine.Renderer_SetShadowPCFEnabled(this.checked);</action>
+                <action on="Load">
+                    Engine.ConfigDB_GetValue("user", "shadowpcf") === "true" ? this.checked = true : this.checked = false;
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetShadowPCFEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "shadowpcf", String(this.checked));
+                </action>
+            </object>
+
+            <object size="0 75 65% 100" type="text" style="RightLabelText" ghost="true">Normal water</object>
+            <object name="normalWaterCFG" size="70% 80 70%+25 105" type="checkbox" style="StoneCrossBox">
+                <action on="Load">
+                    Engine.ConfigDB_GetValue("user", "waternormals") === "true" ? this.checked = true : this.checked = false;
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetWaterNormalEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "waternormals", String(this.checked));
+                </action>
+            </object>
+
+            <object size="0 100 65% 125" type="text" style="RightLabelText" ghost="true">Real depth water</object>
+            <object name="realDepthWaterCFG" size="70% 105 70%+25 130" type="checkbox" style="StoneCrossBox">
+                <action on="Load">
+                    Engine.ConfigDB_GetValue("user", "waterrealdepth") === "true" ? this.checked = true : this.checked = false;
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetWaterRealDepthEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "waterrealdepth", String(this.checked));
+                </action>
+            </object>
+
+            <object size="0 125 65% 150" type="text" style="RightLabelText" ghost="true">Water foam</object>
+            <object name="waterFoamCFG" size="70% 130 70%+25 155" type="checkbox" style="StoneCrossBox">
+                <action on="Load">
+                    Engine.ConfigDB_GetValue("user", "waterfoam") === "true" ? this.checked = true : this.checked = false;
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetWaterFoamEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "waterfoam", String(this.checked));
+                </action>
+            </object>
+
+            <object size="0 150 65% 175" type="text" style="RightLabelText" ghost="true">Coastal Waves</object>
+            <object name="coastalWavesCFG" size="70% 155 70%+25 180" type="checkbox" style="StoneCrossBox">
+                <action on="Load">
+                    Engine.ConfigDB_GetValue("user", "watercoastalwaves") === "true" ? this.checked = true : this.checked = false;
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetWaterCoastalWavesEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "watercoastalwaves", String(this.checked));
+                </action>
+            </object>
+
+            <object size="0 175 65% 200" type="text" style="RightLabelText" ghost="true">Water reflection</object>
+            <object name="waterReflectionCFG" size="70% 180 70%+25 205" type="checkbox" style="StoneCrossBox">
+                <action on="Load">
+                    Engine.ConfigDB_GetValue("user", "waterreflection") === "true" ? this.checked = true : this.checked = false;
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetWaterReflectionEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "waterreflection", String(this.checked));
+                </action>
+            </object>
+
+            <object size="0 200 65% 225" type="text" style="RightLabelText" ghost="true">Water refraction</object>
+            <object name="waterRefractionCFG" size="70% 205 70%+25 230" type="checkbox" style="StoneCrossBox">
+                <action on="Load">
+                    Engine.ConfigDB_GetValue("user", "waterrefraction") === "true" ? this.checked = true : this.checked = false;
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetWaterReafraction(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "waterrefraction", String(this.checked));
+                </action>
             </object>
+
+            <object size="0 225 65% 250" type="text" style="RightLabelText" ghost="true">Water shadows</object>
+            <object name="waterShadowsCFG" size="70% 230 70%+25 255" type="checkbox" style="StoneCrossBox">
+                <action on="Load">
+                    Engine.ConfigDB_GetValue("user", "watershadows") === "true" ? this.checked = true : this.checked = false;
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetWaterShadowEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "watershadows", String(this.checked));
+                </action>
+            </object>
+
+            <object size="0 250 65% 275" type="text" style="RightLabelText" ghost="true">Particles</object>
+            <object name="particlesCFG" size="70% 255 70%+25 280" type="checkbox" style="StoneCrossBox">
+                <action on="Load">
+                    Engine.ConfigDB_GetValue("user", "particles") === "true" ? this.checked = true : this.checked = false;
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetParticlesEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "particles", String(this.checked));
+                </action>
+            </object>
+
+            <object size="0 275 65% 300" type="text" style="RightLabelText" ghost="true">Silhouettes</object>
+            <object name="silhouettesCFG" size="70% 280 70%+25 305" type="checkbox" style="StoneCrossBox">
+                <action on="Load">
+                    Engine.ConfigDB_GetValue("user", "silhouettes") === "true" ? this.checked = true : this.checked = false;
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetSilhouettesEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "silhouettes", String(this.checked));
+                </action>
+            </object>
+
+            <object size="0 300 65% 325" type="text" style="RightLabelText" ghost="true">Show sky</object>
+            <object name="showSkyCFG" size="70% 305 70%+25 330" type="checkbox" style="StoneCrossBox">
+                <action on="Load">
+                    Engine.ConfigDB_GetValue("user", "showsky") === "true" ? this.checked = true : this.checked = false;
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetShowSkyEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "showsky", String(this.checked));
+                </action>
+            </object>
+
+            <object size="0 325 65% 350" type="text" style="RightLabelText" ghost="true">Use OpenGL VBO</object>
+            <object name="noGLVBOCFG" size="70% 330 70%+25 355" type="checkbox" style="StoneCrossBox">
+                <action on="Load">
+                    if (Engine.Renderer_GetGLVBOAvailable()) {
+                        Engine.ConfigDB_GetValue("user", "novbo") === "true" ? this.checked = false : this.checked = true;
+                    } else {
+                        this.enabled = false;
+                        this.checked = false;
+                    }
+                </action>
+                <action on="Press">
+                    Engine.Renderer_SetWaterRealDepthEnabled(this.checked);
+                    Engine.ConfigDB_CreateValue("user", "novbo", String(this.checked));
+                </action>
+            </object>
+
         </object>
         <object name="SoundSettings" type="image" sprite="BackgroundIndentFillDark" size="616 16 916 100%-16">
             <object style="TitleText" type="text" size="0 5 100% 25">Sound Settings</object>
@@ -60,26 +204,6 @@
             </object>
         </object>
 <!--
-             Settings / shadows 
-            <object size="0 10 100%-80 35" type="text" style="RightLabelText" ghost="true">Enable Shadows</object>
-            <object name="shadowsCheckbox" size="100%-56 15 100%-30 40" type="checkbox" style="StoneCrossBox" checked="true">
-                    <action on="Load">this.checked = Engine.Renderer_GetShadowsEnabled();</action>
-                    <action on="Press">Engine.Renderer_SetShadowsEnabled(this.checked);</action>
-            </object>	
-             Settings / Shadow PCF 
-            <object size="0 35 100%-80 60" type="text" style="RightLabelText" ghost="true">Enable Shadow Filtering</object>
-            <object name="shadowPCFCheckbox" size="100%-56 40 100%-30 65" type="checkbox" style="StoneCrossBox" checked="true">
-                    <action on="Load">this.checked = Engine.Renderer_GetShadowPCFEnabled();</action>
-                    <action on="Press">Engine.Renderer_SetShadowPCFEnabled(this.checked);</action>
-            </object>
-
-             Settings / Water 
-            <object size="0 60 100%-80 85" type="text" style="RightLabelText" ghost="true">Enable Water Reflections</object>
-            <object name="fancyWaterCheckbox" size="100%-56 65 100%-30 90"  type="checkbox" style="StoneCrossBox" checked="true">
-                    <action on="Load">this.checked = Engine.Renderer_GetWaterNormalEnabled();</action>
-                    <action on="Press">Engine.Renderer_SetWaterNormalEnabled(this.checked);</action>
-            </object>
-
              Settings / Music
             <object size="0 60 100%-80 85" type="text" style="RightLabelText" ghost="true">Enable Music</object>
             <object size="100%-56 65 100%-30 90" type="checkbox" style="StoneCrossBox" checked="true">
diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp
index 35f85eb..6543d89 100644
--- a/source/ps/GameSetup/GameSetup.cpp
+++ b/source/ps/GameSetup/GameSetup.cpp
@@ -599,6 +599,8 @@ static void InitRenderer()
 
 	// set renderer options from command line options - NOVBO must be set before opening the renderer
 	g_Renderer.SetOptionBool(CRenderer::OPT_NOVBO, g_NoGLVBO);
+
+	g_Shadows = g_Shadows && g_Renderer.GetCapabilities().m_Shadows;
 	g_Renderer.SetOptionBool(CRenderer::OPT_SHADOWS, g_Shadows);
 
 	g_Renderer.SetOptionBool(CRenderer::OPT_WATERNORMAL, g_WaterNormal);
@@ -1011,15 +1013,6 @@ void InitGraphics(const CmdLineArgs& args, int flags)
 		// TODO: i18n
 	}
 
-	if (!ogl_HaveExtension("GL_ARB_texture_env_crossbar"))
-	{
-		DEBUG_DISPLAY_ERROR(
-			L"The GL_ARB_texture_env_crossbar extension doesn't appear to be available on your computer."
-			L" Shadows are not available and overall graphics quality might suffer."
-			L" You are advised to try installing newer drivers and/or upgrade your graphics card.");
-		g_Shadows = false;
-	}
-
 	ogl_WarnIfError();
 	InitRenderer();
 
diff --git a/source/renderer/scripting/JSInterface_Renderer.cpp b/source/renderer/scripting/JSInterface_Renderer.cpp
index 88331d1..f72be0f 100644
--- a/source/renderer/scripting/JSInterface_Renderer.cpp
+++ b/source/renderer/scripting/JSInterface_Renderer.cpp
@@ -31,6 +31,7 @@ void JSI_Renderer::Set##SCRIPTNAME##Enabled(void* UNUSED(cbdata), bool Enabled)
 	g_Renderer.SetOptionBool(CRenderer::OPT_##NAME, Enabled); \
 }
 
+IMPLEMENT_BOOLEAN_SCRIPT_SETTING(NOVBO, NoGLVBO);
 IMPLEMENT_BOOLEAN_SCRIPT_SETTING(PARTICLES, Particles);
 IMPLEMENT_BOOLEAN_SCRIPT_SETTING(PREFERGLSL, PreferGLSL);
 IMPLEMENT_BOOLEAN_SCRIPT_SETTING(WATERNORMAL, WaterNormal);
@@ -57,6 +58,32 @@ void JSI_Renderer::SetRenderPath(void* UNUSED(cbdata), std::string name)
 	g_Renderer.SetRenderPath(CRenderer::GetRenderPathByName(name));
 }
 
+bool JSI_Renderer::GetGLVBOAvailable(void* UNUSED(cbdata))
+{
+	if (!g_Renderer.GetCapabilities().m_VBO)
+	{
+		DEBUG_DISPLAY_ERROR(
+			L" OpenGL Vertex Buffer Objects are not available."
+			L" You are advised to try installing newer drivers and/or upgrade your graphics card.");
+		return false;
+	} else {
+		return true;
+	}
+}
+
+bool JSI_Renderer::GetShadowsAvailable(void* UNUSED(cbdata))
+{
+	if (!g_Renderer.GetCapabilities().m_Shadows)
+	{
+		DEBUG_DISPLAY_ERROR(
+			L" Shadows are not available and overall graphics quality might suffer."
+			L" You are advised to try installing newer drivers and/or upgrade your graphics card.");
+		return false;
+	} else {
+		return true;
+	}
+}
+
 
 #define REGISTER_BOOLEAN_SCRIPT_SETTING(NAME) \
 scriptInterface.RegisterFunction<bool, &JSI_Renderer::Get##NAME##Enabled>("Renderer_Get" #NAME "Enabled"); \
@@ -66,6 +93,8 @@ void JSI_Renderer::RegisterScriptFunctions(ScriptInterface& scriptInterface)
 {
 	scriptInterface.RegisterFunction<std::string, &JSI_Renderer::GetRenderPath>("Renderer_GetRenderPath");
 	scriptInterface.RegisterFunction<void, std::string, &JSI_Renderer::SetRenderPath>("Renderer_SetRenderPath");
+	scriptInterface.RegisterFunction<bool, &JSI_Renderer::GetGLVBOAvailable>("Renderer_GetGLVBOAvailable");
+	scriptInterface.RegisterFunction<bool, &JSI_Renderer::GetShadowsAvailable>("Renderer_GetShadowsAvailable");
 	REGISTER_BOOLEAN_SCRIPT_SETTING(Shadows);
 	REGISTER_BOOLEAN_SCRIPT_SETTING(ShadowPCF);
 	REGISTER_BOOLEAN_SCRIPT_SETTING(Particles);
diff --git a/source/renderer/scripting/JSInterface_Renderer.h b/source/renderer/scripting/JSInterface_Renderer.h
index eca4afa..e87bbdf 100644
--- a/source/renderer/scripting/JSInterface_Renderer.h
+++ b/source/renderer/scripting/JSInterface_Renderer.h
@@ -29,7 +29,10 @@ namespace JSI_Renderer
 {
 	std::string GetRenderPath(void* cbdata);
 	void SetRenderPath(void* cbdata, std::string name);
+	bool GetGLVBOAvailable(void* cbdata);
+	bool GetShadowsAvailable(void* cbdata);
 
+	DECLARE_BOOLEAN_SCRIPT_SETTING(NoGLVBO);
 	DECLARE_BOOLEAN_SCRIPT_SETTING(Shadows);
 	DECLARE_BOOLEAN_SCRIPT_SETTING(ShadowPCF);
 	DECLARE_BOOLEAN_SCRIPT_SETTING(Particles);
