diff --git a/Source/Core/Data/ColorImage.cs b/Source/Core/Data/ColorImage.cs
index 67f09416c484dead872bd8b5d5166c0a4f17c61c..0c125fc2152cfeee6901997503f0171a84889757 100644
--- a/Source/Core/Data/ColorImage.cs
+++ b/Source/Core/Data/ColorImage.cs
@@ -13,7 +13,7 @@
  */
 
 #endregion
-
+/*
 #region ================== Namespaces
 
 using System;
@@ -97,3 +97,4 @@ namespace CodeImp.DoomBuilder.Data
 		#endregion
 	}
 }
+*/
\ No newline at end of file
diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs
index cf988f289a16d21a07f5737e8b9ac09a3e96e938..191410224e0689dac97fe6a7c57b7a2ea3518306 100644
--- a/Source/Core/Data/DataManager.cs
+++ b/Source/Core/Data/DataManager.cs
@@ -498,6 +498,9 @@ namespace CodeImp.DoomBuilder.Data
 				// Add to all
 				alltextures.AddFlat(img.Value);
 			}
+
+			//mxd. Create skybox texture(s)
+			SetupSkybox();
 			
 			// Start background loading
 			StartBackgroundLoader();
@@ -1875,9 +1878,8 @@ namespace CodeImp.DoomBuilder.Data
 				return;
 			}
 
-			// Reset skybox texture
-			skybox.Dispose();
-			skybox = null;
+			// Rebuild skybox texture
+			SetupSkybox();
 
 			// Rebuild geometry if in Visual mode
 			if(General.Editing.Mode != null && General.Editing.Mode.GetType().Name == "BaseVisualMode") 
@@ -2357,11 +2359,6 @@ namespace CodeImp.DoomBuilder.Data
 
 		#region ================== mxd. Skybox Making
 
-		internal void UpdateSkybox()
-		{
-			if(skybox == null) SetupSkybox();
-		}
-
 		private void SetupSkybox()
 		{
 			// Get rid of old texture
@@ -2489,14 +2486,33 @@ namespace CodeImp.DoomBuilder.Data
 				}
 			}
 
-			// Load the skysphere model...
+			// Get Device and shader...
 			Device device = General.Map.Graphics.Device;
 			World3DShader effect = General.Map.Graphics.Shaders.World3D;
-			
+
+			// Make custom rendertarget
+			const int cubemaptexsize = 1024;
+			Surface rendertarget = Surface.CreateRenderTarget(device, cubemaptexsize, cubemaptexsize, Format.A8R8G8B8, MultisampleType.None, 0, false);
+			Surface depthbuffer = Surface.CreateDepthStencil(device, cubemaptexsize, cubemaptexsize, General.Map.Graphics.DepthBuffer.Description.Format, MultisampleType.None, 0, false);
+
+			// Start rendering
+			if(!General.Map.Graphics.StartRendering(true, new Color4(), rendertarget, depthbuffer))
+			{
+				General.ErrorLogger.Add(ErrorType.Error, "Skybox creation failed: unable to start rendering...");
+
+				// Get rid of unmanaged stuff...
+				rendertarget.Dispose();
+				depthbuffer.Dispose();
+
+				// No dice...
+				return null;
+			}
+
+			// Load the skysphere model...
 			BoundingBoxSizes bbs = new BoundingBoxSizes();
 			Stream modeldata = General.ThisAssembly.GetManifestResourceStream("CodeImp.DoomBuilder.Resources.SkySphere.md3");
-			ModelReader.MD3LoadResult result = ModelReader.ReadMD3Model(ref bbs, true, modeldata, device, 0);
-			if(result.Meshes.Count != 3) throw new Exception("Skybox creation failed: " + result.Errors);
+			ModelReader.MD3LoadResult meshes = ModelReader.ReadMD3Model(ref bbs, true, modeldata, device, 0);
+			if(meshes.Meshes.Count != 3) throw new Exception("Skybox creation failed: " + meshes.Errors);
 
 			// Make skysphere textures...
 			Texture texside = TextureFromBitmap(device, skyimage);
@@ -2511,16 +2527,13 @@ namespace CodeImp.DoomBuilder.Data
 			else yscale = 1.2f * 1.17f;
 
 			// Make cubemap texture
-			const int cubemaptexsize = 1024;
-			CubeTexture cubemap = new CubeTexture(device, cubemaptexsize, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
+			CubeTexture cubemap = new CubeTexture(device, cubemaptexsize, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
+			Surface sysmemsurf = Surface.CreateOffscreenPlain(device, cubemaptexsize, cubemaptexsize, Format.A8R8G8B8, Pool.SystemMemory);
 
 			// Set render settings...
 			device.SetRenderState(RenderState.ZEnable, false);
 			device.SetRenderState(RenderState.CullMode, Cull.None);
-
-			// Make custom rendertarget
-			Surface rendertarget = Surface.CreateRenderTarget(device, cubemaptexsize, cubemaptexsize, Format.A8R8G8B8, MultisampleType.None, 0, false);
-
+			
 			// Setup matrices
 			Vector3 offset = new Vector3(0f, 0f, -1.8f); // Sphere size is 10 mu
 			Matrix mworld = Matrix.Multiply(Matrix.Identity, Matrix.Translation(offset) * Matrix.Scaling(1.0f, 1.0f, yscale));
@@ -2529,17 +2542,9 @@ namespace CodeImp.DoomBuilder.Data
 			// Place camera at origin
 			effect.CameraPosition = new Vector4();
 
-			// Set the rendertarget to our own RT surface
-			device.SetRenderTarget(0, rendertarget);
-
-			// Set custom depth stencil
-			device.DepthStencilSurface = Surface.CreateDepthStencil(device, cubemaptexsize, cubemaptexsize, General.Map.Graphics.DepthBuffer.Description.Format, MultisampleType.None, 0, false);
-
-			// Begin rendering
-			device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.DarkRed, 1.0f, 0);
-			device.BeginScene();
+			// Begin fullbright shaderpass
 			effect.Begin();
-			effect.BeginPass(1); // Fullbright pass
+			effect.BeginPass(1);
 
 			// Render to the six faces of the cube map
 			for(int i = 0; i < 6; i++)
@@ -2548,10 +2553,10 @@ namespace CodeImp.DoomBuilder.Data
 				effect.WorldViewProj = mworld * faceview * mprojection;
 
 				// Render the skysphere meshes
-				for(int j = 0; j < result.Meshes.Count; j++)
+				for(int j = 0; j < meshes.Meshes.Count; j++)
 				{
 					// Set appropriate texture
-					switch(result.Skins[j])
+					switch(meshes.Skins[j])
 					{
 						case "top.png": effect.Texture1 = textop; break;
 						case "bottom.png": effect.Texture1 = texbottom; break;
@@ -2563,29 +2568,49 @@ namespace CodeImp.DoomBuilder.Data
 					effect.ApplySettings();
 
 					// Render mesh
-					result.Meshes[j].DrawSubset(0);
+					meshes.Meshes[j].DrawSubset(0);
 				}
 
-				// Copy the rendered image from our RT surface to the texture face
-				Surface cubeface = cubemap.GetCubeMapSurface((CubeMapFace)i, 0);
-				device.StretchRectangle(rendertarget, cubeface, TextureFilter.None);
+				// Get rendered data from video memory...
+				device.GetRenderTargetData(rendertarget, sysmemsurf);
+
+				// ...Then copy it to destination texture
+				Surface targetsurf = cubemap.GetCubeMapSurface((CubeMapFace)i, 0);
+				DataRectangle sourcerect = sysmemsurf.LockRectangle(LockFlags.NoSystemLock);
+				DataRectangle targetrect = targetsurf.LockRectangle(LockFlags.NoSystemLock);
+
+				if(sourcerect.Data.CanRead && targetrect.Data.CanWrite)
+				{
+					byte[] data = new byte[sourcerect.Data.Length];
+					sourcerect.Data.ReadRange(data, 0, (int)sourcerect.Data.Length);
+					targetrect.Data.Write(data, 0, data.Length);
+				}
+				else
+				{
+					General.ErrorLogger.Add(ErrorType.Error, "Skybox creation failed: unable to copy to CubeTexture surface...");
+				}
 
-				cubeface.Dispose();
+				// Unlock and dispose
+				sysmemsurf.UnlockRectangle();
+				targetsurf.UnlockRectangle();
+				targetsurf.Dispose();
 			}
 
 			// End rendering
 			effect.EndPass();
 			effect.End();
-			device.EndScene();
+			General.Map.Graphics.FinishRendering();
 
 			// Dispose unneeded stuff
 			rendertarget.Dispose();
+			depthbuffer.Dispose();
+			sysmemsurf.Dispose();
 			textop.Dispose();
 			texside.Dispose();
 			texbottom.Dispose();
 
 			// Dispose skybox meshes
-			foreach(Mesh m in result.Meshes) m.Dispose();
+			foreach(Mesh m in meshes.Meshes) m.Dispose();
 
 			// All done...
 			return cubemap;
diff --git a/Source/Core/Rendering/D3DDevice.cs b/Source/Core/Rendering/D3DDevice.cs
index 0f7f0cd91e6f5bd4145707b69fb4029364c14d64..e328027c887051077a56869b58f6c527981ad548 100644
--- a/Source/Core/Rendering/D3DDevice.cs
+++ b/Source/Core/Rendering/D3DDevice.cs
@@ -164,66 +164,20 @@ namespace CodeImp.DoomBuilder.Rendering
 			device.SetTransform(TransformState.View, Matrix.Identity);
 			device.SetTransform(TransformState.Projection, Matrix.Identity);
 			
-			// Sampler settings
-			if(General.Settings.ClassicBilinear)
-			{
-				device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Linear);
-				device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear);
-				device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear);
-				device.SetSamplerState(0, SamplerState.MipMapLodBias, 0f);
-			}
-			else
-			{
-				device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Point);
-				device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Point);
-				device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Point);
-				device.SetSamplerState(0, SamplerState.MipMapLodBias, 0f);
-			}
-			
 			// Texture addressing
 			device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
 			device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
 			device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
-
-			// First texture stage
-			device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Modulate);
-			device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
-			device.SetTextureStageState(0, TextureStage.ColorArg2, TextureArgument.Diffuse);
-			device.SetTextureStageState(0, TextureStage.ResultArg, TextureArgument.Current);
-			device.SetTextureStageState(0, TextureStage.TexCoordIndex, 0);
-
-			// Second texture stage
-			device.SetTextureStageState(1, TextureStage.ColorOperation, TextureOperation.Modulate);
-			device.SetTextureStageState(1, TextureStage.ColorArg1, TextureArgument.Current);
-			device.SetTextureStageState(1, TextureStage.ColorArg2, TextureArgument.TFactor);
-			device.SetTextureStageState(1, TextureStage.ResultArg, TextureArgument.Current);
-			device.SetTextureStageState(1, TextureStage.TexCoordIndex, 0);
-
-			// No more further stages
-			device.SetTextureStageState(2, TextureStage.ColorOperation, TextureOperation.Disable);
-			
-			// First alpha stage
-			device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.Modulate);
-			device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture);
-			device.SetTextureStageState(0, TextureStage.AlphaArg2, TextureArgument.Diffuse);
-
-			// Second alpha stage
-			device.SetTextureStageState(1, TextureStage.AlphaOperation, TextureOperation.Modulate);
-			device.SetTextureStageState(1, TextureStage.AlphaArg1, TextureArgument.Current);
-			device.SetTextureStageState(1, TextureStage.AlphaArg2, TextureArgument.TFactor);
-			
-			// No more further stages
-			device.SetTextureStageState(2, TextureStage.AlphaOperation, TextureOperation.Disable);
 			
 			// Setup material
-			Material material = new Material();
-			material.Ambient = new Color4(Color.White);
-			material.Diffuse = new Color4(Color.White);
-			material.Specular = new Color4(Color.White);
-			device.Material = material;
+			device.Material = new Material {
+				Ambient = new Color4(Color.White),
+				Diffuse = new Color4(Color.White),
+				Specular = new Color4(Color.White)
+			};
 			
 			// Shader settings
-			shaders.World3D.SetConstants(General.Settings.VisualBilinear, true, General.Settings.FilterAnisotropy);
+			shaders.World3D.SetConstants(General.Settings.VisualBilinear, General.Settings.FilterAnisotropy);
 			
 			// Texture filters
 			postfilter = Filter.Point;
@@ -295,6 +249,14 @@ namespace CodeImp.DoomBuilder.Rendering
 				return false;
 			}
 
+			//mxd. Check if we can use shaders
+			if(device.Capabilities.PixelShaderVersion.Major < 2)
+			{
+				// Failed
+				MessageBox.Show(General.MainWindow, "Unable to initialize the Direct3D video device. Video device with Shader Model 2.0 support is required.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
+				return false;
+			}
+
 			// Add event to cancel resize event
 			//device.DeviceResizing += new CancelEventHandler(CancelResize);
 
diff --git a/Source/Core/Rendering/D3DShader.cs b/Source/Core/Rendering/D3DShader.cs
index b67b48f8dce433c948792668b0818770669c04a0..deae788bcf08acece5362e8e279b323c05798cee 100644
--- a/Source/Core/Rendering/D3DShader.cs
+++ b/Source/Core/Rendering/D3DShader.cs
@@ -91,9 +91,6 @@ namespace CodeImp.DoomBuilder.Rendering
 		// This loads an effect
 		protected Effect LoadEffect(string fxfile)
 		{
-			// Return null when not using shaders
-			if(!manager.Enabled) return null;
-
 			Effect fx;
 			string errors = string.Empty;
 			
@@ -145,31 +142,31 @@ namespace CodeImp.DoomBuilder.Rendering
 			General.Map.Graphics.Device.VertexDeclaration = vertexdecl;
 
 			// Set effect
-			if(manager.Enabled) effect.Begin(FX.DoNotSaveState);
+			effect.Begin(FX.DoNotSaveState);
 		}
 
 		// This begins a pass
 		public virtual void BeginPass(int index)
 		{
-			if(manager.Enabled) effect.BeginPass(index);
+			effect.BeginPass(index);
 		}
 
 		// This ends a pass
 		public void EndPass()
 		{
-			if(manager.Enabled) effect.EndPass();
+			effect.EndPass();
 		}
 		
 		// This ends te shader
 		public void End()
 		{
-			if(manager.Enabled) effect.End();
+			effect.End();
 		}
 
 		// This applies properties during a pass
 		public void ApplySettings()
 		{
-			if(manager.Enabled && settingschanged)
+			if(settingschanged)
 			{
 				effect.CommitChanges();
 				settingschanged = false; //mxd
diff --git a/Source/Core/Rendering/Display2DShader.cs b/Source/Core/Rendering/Display2DShader.cs
index 48ad5f96d42721161752662780f6f3a433ff6c76..5bf3c2d3cfeed3b5121ea32122f7d6d0ea9a783e 100644
--- a/Source/Core/Rendering/Display2DShader.cs
+++ b/Source/Core/Rendering/Display2DShader.cs
@@ -38,7 +38,7 @@ namespace CodeImp.DoomBuilder.Rendering
 
 		#region ================== Properties
 
-		public Texture Texture1 { set { if(manager.Enabled) effect.SetTexture(texture1, value); settingschanged = true; } }
+		public Texture Texture1 { set { effect.SetTexture(texture1, value); settingschanged = true; } }
 		
 		#endregion
 
@@ -97,79 +97,14 @@ namespace CodeImp.DoomBuilder.Rendering
 		// This sets the settings
 		public void SetSettings(float texelx, float texely, float fsaafactor, float alpha, bool bilinear)
 		{
-			if(manager.Enabled)
-			{
-				Vector4 values = new Vector4(texelx, texely, fsaafactor, alpha);
-				effect.SetValue(rendersettings, values);
-				Matrix world = manager.D3DDevice.Device.GetTransform(TransformState.World);
-				Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
-				effect.SetValue(transformsettings, world * view);
-				TextureFilter filter = (bilinear ? TextureFilter.Linear : TextureFilter.Point);
-				effect.SetValue(filtersettings, (int)filter);
-				settingschanged = true; //mxd
-			}
-		}
-
-		// This sets up the render pipeline
-		public override void BeginPass(int index)
-		{
-			if(!manager.Enabled)
-			{
-				Device device = manager.D3DDevice.Device;
-				
-				// Sampler settings
-				if(General.Settings.ClassicBilinear)
-				{
-					device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Linear);
-					device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear);
-					device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear);
-					device.SetSamplerState(0, SamplerState.MipMapLodBias, 0f);
-				}
-				else
-				{
-					device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Point);
-					device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Point);
-					device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Point);
-					device.SetSamplerState(0, SamplerState.MipMapLodBias, 0f);
-				}
-
-				// Texture addressing
-				device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
-				device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
-				device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
-
-				// First texture stage
-				device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Modulate);
-				device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
-				device.SetTextureStageState(0, TextureStage.ColorArg2, TextureArgument.Diffuse);
-				device.SetTextureStageState(0, TextureStage.ResultArg, TextureArgument.Current);
-				device.SetTextureStageState(0, TextureStage.TexCoordIndex, 0);
-
-				// Second texture stage
-				device.SetTextureStageState(1, TextureStage.ColorOperation, TextureOperation.Modulate);
-				device.SetTextureStageState(1, TextureStage.ColorArg1, TextureArgument.Current);
-				device.SetTextureStageState(1, TextureStage.ColorArg2, TextureArgument.TFactor);
-				device.SetTextureStageState(1, TextureStage.ResultArg, TextureArgument.Current);
-				device.SetTextureStageState(1, TextureStage.TexCoordIndex, 0);
-
-				// No more further stages
-				device.SetTextureStageState(2, TextureStage.ColorOperation, TextureOperation.Disable);
-
-				// First alpha stage
-				device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.Modulate);
-				device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture);
-				device.SetTextureStageState(0, TextureStage.AlphaArg2, TextureArgument.Diffuse);
-
-				// Second alpha stage
-				device.SetTextureStageState(1, TextureStage.AlphaOperation, TextureOperation.Modulate);
-				device.SetTextureStageState(1, TextureStage.AlphaArg1, TextureArgument.Current);
-				device.SetTextureStageState(1, TextureStage.AlphaArg2, TextureArgument.TFactor);
-
-				// No more further stages
-				device.SetTextureStageState(2, TextureStage.AlphaOperation, TextureOperation.Disable);
-			}
-
-			base.BeginPass(index);
+			Vector4 values = new Vector4(texelx, texely, fsaafactor, alpha);
+			effect.SetValue(rendersettings, values);
+			Matrix world = manager.D3DDevice.Device.GetTransform(TransformState.World);
+			Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
+			effect.SetValue(transformsettings, world * view);
+			TextureFilter filter = (bilinear ? TextureFilter.Linear : TextureFilter.Point);
+			effect.SetValue(filtersettings, (int)filter);
+			settingschanged = true; //mxd
 		}
 		
 		#endregion
diff --git a/Source/Core/Rendering/Renderer.cs b/Source/Core/Rendering/Renderer.cs
index 85d8c7f31a396cb5bb24a2bd01e93b6edcec46fc..719b00e54a03276babf7e59ada8da07b0f3ed654 100644
--- a/Source/Core/Rendering/Renderer.cs
+++ b/Source/Core/Rendering/Renderer.cs
@@ -159,7 +159,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		}
 
 		// This is called when the graphics need to be reset
-		public virtual void Reset() { }
+		//public virtual void Reset() { }
 
 		// For DirectX resources
 		public virtual void UnloadResource() { }
diff --git a/Source/Core/Rendering/Renderer2D.cs b/Source/Core/Rendering/Renderer2D.cs
index 36d29ad23722dcbf0aa93f55e3fc41fc9e155b92..208143db30bbcbc753ac19243df39877a583fd0a 100644
--- a/Source/Core/Rendering/Renderer2D.cs
+++ b/Source/Core/Rendering/Renderer2D.cs
@@ -350,11 +350,11 @@ namespace CodeImp.DoomBuilder.Rendering
 		}
 
 		// This resets the graphics
-		public override void Reset()
+		/*public override void Reset()
 		{
 			UnloadResource();
 			ReloadResource();
-		}
+		}*/
 
 		// This destroys the rendertargets
 		public void DestroyRendertargets()
diff --git a/Source/Core/Rendering/Renderer3D.cs b/Source/Core/Rendering/Renderer3D.cs
index 5c3f7158a7c3eb4cddc4fc8952bd00d788e7168e..257e8d4bf6745084ecb83908433d7060888298af 100644
--- a/Source/Core/Rendering/Renderer3D.cs
+++ b/Source/Core/Rendering/Renderer3D.cs
@@ -70,7 +70,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		// Thing cage
 		private bool renderthingcages;
 		//mxd
-		private VisualVertexHandle vertexHandle;
+		private VisualVertexHandle vertexhandle;
 		private int[] lightOffsets;
 		
 		// Crosshair
@@ -81,8 +81,6 @@ namespace CodeImp.DoomBuilder.Rendering
 		private IVisualPickable highlighted;
 		private float highlightglow;
 		private float highlightglowinv;
-		private ColorImage highlightimage;
-		private ColorImage selectionimage;
 		private bool showselection;
 		private bool showhighlight;
 		
@@ -144,8 +142,6 @@ namespace CodeImp.DoomBuilder.Rendering
 			// Initialize
 			CreateProjection();
 			CreateMatrices2D();
-			SetupHelperObjects(); //mxd
-			SetupTextures();
 			renderthingcages = true;
 			showselection = true;
 			showhighlight = true;
@@ -166,11 +162,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(!isdisposed)
 			{
 				// Clean up
-				if(selectionimage != null) selectionimage.Dispose();
-				if(highlightimage != null) highlightimage.Dispose();
-				selectionimage = null;
-				highlightimage = null;
-				vertexHandle.Dispose(); //mxd
+				if(vertexhandle != null) vertexhandle.Dispose(); //mxd
 				
 				// Done
 				base.Dispose();
@@ -186,11 +178,6 @@ namespace CodeImp.DoomBuilder.Rendering
 		public override void UnloadResource()
 		{
 			crosshairverts = null;
-
-			if(selectionimage != null) selectionimage.Dispose();
-			if(highlightimage != null) highlightimage.Dispose();
-			selectionimage = null;
-			highlightimage = null;
 		}
 		
 		// This is called resets when the device is reset
@@ -198,7 +185,6 @@ namespace CodeImp.DoomBuilder.Rendering
 		public override void ReloadResource()
 		{
 			CreateMatrices2D();
-			SetupTextures();
 		}
 
 		// This makes screen vertices for display
@@ -233,32 +219,14 @@ namespace CodeImp.DoomBuilder.Rendering
 
 		#region ================== Resources
 
-		// This loads the textures for highlight and selection if we need them
-		private void SetupTextures()
-		{
-			if(!graphics.Shaders.Enabled)
-			{
-				highlightimage = new ColorImage(General.Colors.Highlight, 32, 32);
-				highlightimage.LoadImage();
-				highlightimage.CreateTexture();
-				
-				selectionimage = new ColorImage(General.Colors.Selection, 32, 32);
-				selectionimage.LoadImage();
-				selectionimage.CreateTexture();
-			}
-		}
-
-		//mxd
-		private void SetupHelperObjects() 
-		{
-			vertexHandle = new VisualVertexHandle();
-		}
-
 		//mxd
 		internal void UpdateVertexHandle()
 		{
-			vertexHandle.UnloadResource();
-			vertexHandle.ReloadResource();
+			if(vertexhandle != null)
+			{
+				vertexhandle.UnloadResource();
+				vertexhandle.ReloadResource();
+			}
 		}
 
 		#endregion
@@ -284,9 +252,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			
 			// Make the projection matrix
 			projection = Matrix.PerspectiveFovRH(fovy, aspect, PROJ_NEAR_PLANE, General.Settings.ViewDistance);
-
-			// Apply matrices
-			ApplyMatrices3D();
+			viewproj = view3d * projection; //mxd
 		}
 		
 		// This creates matrices for a camera view
@@ -388,6 +354,9 @@ namespace CodeImp.DoomBuilder.Rendering
 				// Create crosshair vertices
 				if(crosshairverts == null)
 					CreateCrosshairVerts(new Size(General.Map.Data.Crosshair3D.Width, General.Map.Data.Crosshair3D.Height));
+
+				//mxd. Crate vertex handle
+				if(vertexhandle == null) vertexhandle = new VisualVertexHandle();
 				
 				// Ready
 				return true;
@@ -645,7 +614,7 @@ namespace CodeImp.DoomBuilder.Rendering
 
 				//Commence drawing!!11
 				graphics.Shaders.World3D.ApplySettings();
-				graphics.Device.SetStreamSource(0, v.CeilingVertex ? vertexHandle.Upper : vertexHandle.Lower, 0, WorldVertex.Stride);
+				graphics.Device.SetStreamSource(0, v.CeilingVertex ? vertexhandle.Upper : vertexhandle.Lower, 0, WorldVertex.Stride);
 				graphics.Device.DrawPrimitives(PrimitiveType.LineList, 0, 8);
 			}
 
diff --git a/Source/Core/Rendering/ShaderManager.cs b/Source/Core/Rendering/ShaderManager.cs
index 243715413a279dcf8030dbeaa688472917da8888..3497645fd8fc0e77299df4deaf85d5c88a2423d6 100644
--- a/Source/Core/Rendering/ShaderManager.cs
+++ b/Source/Core/Rendering/ShaderManager.cs
@@ -32,8 +32,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		#region ================== Variables
 
 		// Settings
-		private string shadertechnique;
-		private bool useshaders;
+		private readonly string shadertechnique;
 		
 		// Shaders
 		private Display2DShader display2dshader;
@@ -50,7 +49,6 @@ namespace CodeImp.DoomBuilder.Rendering
 
 		#region ================== Properties
 
-		public bool Enabled { get { return useshaders; } }
 		public string ShaderTechnique { get { return shadertechnique; } }
 		public Display2DShader Display2D { get { return display2dshader; } }
 		public Things2DShader Things2D { get { return things2dshader; } }
@@ -67,6 +65,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			// Initialize
 			this.device = device;
+			shadertechnique = "SM20"; //mxd
 			
 			// Load
 			ReloadResource();
@@ -111,11 +110,6 @@ namespace CodeImp.DoomBuilder.Rendering
 		// Load resources
 		public void ReloadResource()
 		{
-			// Check if we can use shaders
-			Capabilities caps = General.Map.Graphics.Device.Capabilities;
-			useshaders = (caps.PixelShaderVersion.Major >= 2);
-			shadertechnique = "SM20";
-
 			// Initialize effects
 			display2dshader = new Display2DShader(this);
 			things2dshader = new Things2DShader(this);
diff --git a/Source/Core/Rendering/SurfaceManager.cs b/Source/Core/Rendering/SurfaceManager.cs
index d5109d4523b95a5623d7a3481816fec0444489bc..6be14c33a8e247cbe659104a6c0274312bd14557 100644
--- a/Source/Core/Rendering/SurfaceManager.cs
+++ b/Source/Core/Rendering/SurfaceManager.cs
@@ -665,7 +665,6 @@ namespace CodeImp.DoomBuilder.Rendering
 				{
 					// Set texture
 					graphics.Shaders.Display2D.Texture1 = imgsurfaces.Key.Texture;
-					if(!graphics.Shaders.Enabled) graphics.Device.SetTexture(0, imgsurfaces.Key.Texture);
 
 					graphics.Shaders.Display2D.BeginPass(pass);
 					
diff --git a/Source/Core/Rendering/Things2DShader.cs b/Source/Core/Rendering/Things2DShader.cs
index 1f1fd495640240e83b399f48bf0831551e03516d..0b41641070d6a55bfaab19343ca7e203db9e2712 100644
--- a/Source/Core/Rendering/Things2DShader.cs
+++ b/Source/Core/Rendering/Things2DShader.cs
@@ -38,7 +38,7 @@ namespace CodeImp.DoomBuilder.Rendering
 
 		#region ================== Properties
 
-		public Texture Texture1 { set { if(manager.Enabled) effect.SetTexture(texture1, value); settingschanged = true; } }
+		public Texture Texture1 { set { effect.SetTexture(texture1, value); settingschanged = true; } }
 		
 		//mxd
 		private Color4 fc;
@@ -46,7 +46,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			set
 			{
-				if(manager.Enabled && fc != value)
+				if(fc != value)
 				{
 					effect.SetValue(fillcolor, value);
 					fc = value;
@@ -112,88 +112,20 @@ namespace CodeImp.DoomBuilder.Rendering
 		// This sets the settings
 		public void SetSettings(float alpha)
 		{
-			if(manager.Enabled)
-			{
-				Vector4 values = new Vector4(0.0f, 0.0f, 1.0f, alpha);
-				effect.SetValue(rendersettings, values);
-				Matrix world = manager.D3DDevice.Device.GetTransform(TransformState.World);
-				Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
-				effect.SetValue(transformsettings, world * view);
-				settingschanged = true; //mxd
-			}
+			Vector4 values = new Vector4(0.0f, 0.0f, 1.0f, alpha);
+			effect.SetValue(rendersettings, values);
+			Matrix world = manager.D3DDevice.Device.GetTransform(TransformState.World);
+			Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
+			effect.SetValue(transformsettings, world * view);
+			settingschanged = true; //mxd
 		}
 
 		//mxd. Used to render models
 		public void SetTransformSettings(Matrix world)
 		{
-			if(manager.Enabled) 
-			{
-				Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
-				effect.SetValue(transformsettings, world * view);
-				settingschanged = true;
-			}
-		}
-		
-		// This sets up the render pipeline
-		public override void BeginPass(int index)
-		{
-			if(!manager.Enabled)
-			{
-				Device device = manager.D3DDevice.Device;
-				
-				// Sampler settings
-				if(General.Settings.ClassicBilinear)
-				{
-					device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Linear);
-					device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear);
-					device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear);
-					device.SetSamplerState(0, SamplerState.MipMapLodBias, 0f);
-				}
-				else
-				{
-					device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Point);
-					device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Point);
-					device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Point);
-					device.SetSamplerState(0, SamplerState.MipMapLodBias, 0f);
-				}
-
-				// Texture addressing
-				device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
-				device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
-				device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
-
-				// First texture stage
-				device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Modulate);
-				device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
-				device.SetTextureStageState(0, TextureStage.ColorArg2, TextureArgument.Diffuse);
-				device.SetTextureStageState(0, TextureStage.ResultArg, TextureArgument.Current);
-				device.SetTextureStageState(0, TextureStage.TexCoordIndex, 0);
-
-				// Second texture stage
-				device.SetTextureStageState(1, TextureStage.ColorOperation, TextureOperation.Modulate);
-				device.SetTextureStageState(1, TextureStage.ColorArg1, TextureArgument.Current);
-				device.SetTextureStageState(1, TextureStage.ColorArg2, TextureArgument.TFactor);
-				device.SetTextureStageState(1, TextureStage.ResultArg, TextureArgument.Current);
-				device.SetTextureStageState(1, TextureStage.TexCoordIndex, 0);
-
-				// No more further stages
-				device.SetTextureStageState(2, TextureStage.ColorOperation, TextureOperation.Disable);
-
-				// First alpha stage
-				device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.Modulate);
-				device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture);
-				device.SetTextureStageState(0, TextureStage.AlphaArg2, TextureArgument.Diffuse);
-
-				// Second alpha stage
-				device.SetTextureStageState(1, TextureStage.AlphaOperation, TextureOperation.Modulate);
-				device.SetTextureStageState(1, TextureStage.AlphaArg1, TextureArgument.Current);
-				device.SetTextureStageState(1, TextureStage.AlphaArg2, TextureArgument.TFactor);
-
-				// No more further stages
-				device.SetTextureStageState(2, TextureStage.AlphaOperation, TextureOperation.Disable);
-			}
-
-			base.BeginPass(index);
+			Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
+			effect.SetValue(transformsettings, world * view);
+			settingschanged = true;
 		}
 		
 		#endregion
diff --git a/Source/Core/Rendering/World3DShader.cs b/Source/Core/Rendering/World3DShader.cs
index a2d023ecf86577da27af097d376d4afc0b6dfa93..0cec5ca85697219547201bcae01c213581c73c04 100644
--- a/Source/Core/Rendering/World3DShader.cs
+++ b/Source/Core/Rendering/World3DShader.cs
@@ -58,7 +58,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			set
 			{
-				if(manager.Enabled && wwp != value)
+				if(wwp != value)
 				{
 					effect.SetValue(worldviewproj, value);
 					wwp = value;
@@ -67,7 +67,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			}
 		}
 
-		public BaseTexture Texture1 { set { if(manager.Enabled) effect.SetTexture(texture1, value); settingschanged = true; } }
+		public BaseTexture Texture1 { set { effect.SetTexture(texture1, value); settingschanged = true; } }
 
 		//mxd
 		private Color4 vertexcolor;
@@ -75,7 +75,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			set 
 			{
-				if(manager.Enabled && vertexcolor != value)
+				if(vertexcolor != value)
 				{
 					effect.SetValue(vertexColorHadle, value);
 					vertexcolor = value;
@@ -90,7 +90,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			set
 			{
-				if(manager.Enabled && lightcolor != value)
+				if(lightcolor != value)
 				{
 					effect.SetValue(lightColorHandle, value);
 					lightcolor = value;
@@ -104,7 +104,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			set
 			{
-				if(manager.Enabled && value != lightpos)
+				if(lightpos != value)
 				{
 					effect.SetValue(lightPositionAndRadiusHandle, value);
 					lightpos = value;
@@ -119,7 +119,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			set
 			{
-				if(manager.Enabled && campos != value)
+				if(campos != value)
 				{
 					effect.SetValue(camPosHandle, value);
 					campos = value;
@@ -133,7 +133,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			set
 			{
-				if(manager.Enabled && mworld != value)
+				if(mworld != value)
 				{
 					effect.SetValue(world, value);
 					mworld = value;
@@ -148,7 +148,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			set
 			{
-				if(manager.Enabled && hicolor != value)
+				if(hicolor != value)
 				{
 					effect.SetValue(highlightcolor, value);
 					hicolor = value;
@@ -190,27 +190,15 @@ namespace CodeImp.DoomBuilder.Rendering
 			}
 
 			// Initialize world vertex declaration
-			if(manager.Enabled) //mxd
-			{ 
-				vertexElements = new[] 
-				{
-					new VertexElement(0, 0, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Position, 0),
-					new VertexElement(0, 12, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0),
-					new VertexElement(0, 16, DeclarationType.Float2, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0),
-					new VertexElement(0, 24, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Normal, 0), //mxd
-					VertexElement.VertexDeclarationEnd
-				};
-			} 
-			else 
+			vertexElements = new[] 
 			{
-				vertexElements = new[] 
-				{
-					new VertexElement(0, 0, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Position, 0),
-					new VertexElement(0, 12, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0),
-					new VertexElement(0, 16, DeclarationType.Float2, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0),
-					VertexElement.VertexDeclarationEnd
-				};
-			}
+				new VertexElement(0, 0, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Position, 0),
+				new VertexElement(0, 12, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0),
+				new VertexElement(0, 16, DeclarationType.Float2, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0),
+				new VertexElement(0, 24, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Normal, 0), //mxd
+				VertexElement.VertexDeclarationEnd
+			};
+
 			vertexdecl = new VertexDeclaration(General.Map.Graphics.Device, vertexElements);
 
 			// We have no destructor
@@ -249,148 +237,24 @@ namespace CodeImp.DoomBuilder.Rendering
 		#region ================== Methods
 
 		// This sets the constant settings
-		public void SetConstants(bool bilinear, bool useanisotropic, float maxanisotropy)
+		public void SetConstants(bool bilinear, float maxanisotropy)
 		{
-			if(manager.Enabled)
+			if(bilinear)
 			{
-				if(bilinear)
-				{
-					if(useanisotropic)
-					{
-						effect.SetValue(magfiltersettings, (int)TextureFilter.Linear);
-						effect.SetValue(minfiltersettings, (int)TextureFilter.Anisotropic);
-						effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear);
-						effect.SetValue(maxanisotropysetting, maxanisotropy);
-					}
-					else
-					{
-						effect.SetValue(magfiltersettings, (int)TextureFilter.Linear);
-						effect.SetValue(minfiltersettings, (int)TextureFilter.Linear);
-						effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear);
-						effect.SetValue(maxanisotropysetting, 1.0f);
-					}
-				}
-				else
-				{
-					effect.SetValue(magfiltersettings, (int)TextureFilter.Point);
-					effect.SetValue(minfiltersettings, (int)TextureFilter.Point);
-					effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear);
-					effect.SetValue(maxanisotropysetting, 1.0f);
-				}
-
-				settingschanged = true; //mxd
+				effect.SetValue(magfiltersettings, (int)TextureFilter.Linear);
+				effect.SetValue(minfiltersettings, (int)TextureFilter.Anisotropic);
+				effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear);
+				effect.SetValue(maxanisotropysetting, maxanisotropy);
 			}
-		}
-
-		// This sets up the render pipeline
-		public override void BeginPass(int index)
-		{
-			if(!manager.Enabled)
+			else
 			{
-				Device device = manager.D3DDevice.Device;
-				
-				// Sampler settings
-				if(General.Settings.VisualBilinear)
-				{
-					device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Linear);
-					device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear);
-					device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear);
-					device.SetSamplerState(0, SamplerState.MipMapLodBias, 0f);
-				}
-				else
-				{
-					device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Point);
-					device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Point);
-					device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear);
-					device.SetSamplerState(0, SamplerState.MipMapLodBias, 0f);
-				}
-
-				// Texture addressing
-				device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
-				device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
-				device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
-				
-				// First texture stage
-				//mxd
-				//if((index == 0) || (index == 2))
-				if((index == 0) || (index == 2) || (index == 4) || (index == 6) || (index == 8) || (index == 10) || (index == 12) || (index == 14) || index > 15)
-				{
-					// Normal
-					device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Modulate);
-					device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
-					device.SetTextureStageState(0, TextureStage.ColorArg2, TextureArgument.Diffuse);
-					device.SetTextureStageState(0, TextureStage.ResultArg, TextureArgument.Current);
-					device.SetTextureStageState(0, TextureStage.TexCoordIndex, 0);
-				}
-				else
-				{
-					// Full brightness
-					device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.SelectArg1);
-					device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
-					device.SetTextureStageState(0, TextureStage.ResultArg, TextureArgument.Current);
-					device.SetTextureStageState(0, TextureStage.TexCoordIndex, 0);
-				}
-
-				// First alpha stage
-				device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.Modulate);
-				device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture);
-				device.SetTextureStageState(0, TextureStage.AlphaArg2, TextureArgument.Diffuse);
-				
-				// Second texture stage
-				device.SetTextureStageState(1, TextureStage.ColorOperation, TextureOperation.Modulate);
-				device.SetTextureStageState(1, TextureStage.ColorArg1, TextureArgument.Current);
-				device.SetTextureStageState(1, TextureStage.ColorArg2, TextureArgument.TFactor);
-				device.SetTextureStageState(1, TextureStage.ResultArg, TextureArgument.Current);
-				device.SetTextureStageState(1, TextureStage.TexCoordIndex, 0);
-
-				// Second alpha stage
-				device.SetTextureStageState(1, TextureStage.AlphaOperation, TextureOperation.Modulate);
-				device.SetTextureStageState(1, TextureStage.AlphaArg1, TextureArgument.Current);
-				device.SetTextureStageState(1, TextureStage.AlphaArg2, TextureArgument.TFactor);
-
-				// Highlight?
-				//mxd
-				//if(index > 1) 2 3 6 10 14
-				//if((index > 1 && index < 4) || (index > 5 && index < 8) || (index > 9 && index < 12) || (index > 13 && index < 16))
-				if(index == 2 || index == 3 || index == 6 || index == 10 || index == 14)
-				{
-					// Third texture stage
-					device.SetTextureStageState(2, TextureStage.ColorOperation, TextureOperation.AddSigned);
-					device.SetTextureStageState(2, TextureStage.ColorArg1, TextureArgument.Current);
-					device.SetTextureStageState(2, TextureStage.ColorArg2, TextureArgument.Texture);
-					device.SetTextureStageState(2, TextureStage.ColorArg0, TextureArgument.Texture);
-					device.SetTextureStageState(2, TextureStage.ResultArg, TextureArgument.Current);
-					device.SetTextureStageState(2, TextureStage.TexCoordIndex, 0);
-
-					// Third alpha stage
-					device.SetTextureStageState(2, TextureStage.AlphaOperation, TextureOperation.SelectArg1);
-					device.SetTextureStageState(2, TextureStage.AlphaArg1, TextureArgument.Current);
-
-					// Fourth texture stage
-					device.SetTextureStageState(3, TextureStage.ColorOperation, TextureOperation.AddSigned);
-					device.SetTextureStageState(3, TextureStage.ColorArg1, TextureArgument.Current);
-					device.SetTextureStageState(3, TextureStage.ColorArg2, TextureArgument.Texture);
-					device.SetTextureStageState(3, TextureStage.ColorArg0, TextureArgument.Texture);
-					device.SetTextureStageState(3, TextureStage.ResultArg, TextureArgument.Current);
-					device.SetTextureStageState(3, TextureStage.TexCoordIndex, 0);
-
-					// Fourth alpha stage
-					device.SetTextureStageState(3, TextureStage.AlphaOperation, TextureOperation.SelectArg1);
-					device.SetTextureStageState(3, TextureStage.AlphaArg1, TextureArgument.Current);
-
-					// No more further stages
-					device.SetTextureStageState(4, TextureStage.ColorOperation, TextureOperation.Disable);
-					device.SetTextureStageState(4, TextureStage.AlphaOperation, TextureOperation.Disable);
-				}
-				else
-				{
-					// No more further stages
-					device.SetTextureStageState(2, TextureStage.ColorOperation, TextureOperation.Disable);
-					device.SetTextureStageState(2, TextureStage.AlphaOperation, TextureOperation.Disable);
-				}
+				effect.SetValue(magfiltersettings, (int)TextureFilter.Point);
+				effect.SetValue(minfiltersettings, (int)TextureFilter.Point);
+				effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear);
+				effect.SetValue(maxanisotropysetting, 1.0f);
 			}
 
-			base.BeginPass(index);
+			settingschanged = true; //mxd
 		}
 		
 		#endregion
diff --git a/Source/Core/VisualModes/VisualMode.cs b/Source/Core/VisualModes/VisualMode.cs
index f8f93ae0874e94ee698307c809f765606dbc189c..40fa7711ee40ee6905323c0959934097d3236ea2 100644
--- a/Source/Core/VisualModes/VisualMode.cs
+++ b/Source/Core/VisualModes/VisualMode.cs
@@ -158,9 +158,6 @@ namespace CodeImp.DoomBuilder.VisualModes
 		{
 			base.OnEngage();
 
-			//mxd. Sky texture may need recreating
-			General.Map.Data.UpdateSkybox();
-
 			// Update projection (mxd)
 			General.Map.CRenderer3D.CreateProjection();
 			
@@ -881,9 +878,6 @@ namespace CodeImp.DoomBuilder.VisualModes
 			// Make new blockmap
 			FillBlockMap();
 
-			//mxd. Sky texture may need recreating
-			General.Map.Data.UpdateSkybox();
-
 			// Visibility culling (this re-creates the needed resources)
 			DoCulling();
 		}
diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs
index 2382206740e41b4414889857d0149375da9a55a5..355b4b91da8b8c78f07030f9dcb219547bbde7d3 100644
--- a/Source/Core/Windows/MainForm.cs
+++ b/Source/Core/Windows/MainForm.cs
@@ -1067,6 +1067,9 @@ namespace CodeImp.DoomBuilder.Windows
 				{
 					// Reset graphics to match changes
 					General.Map.Graphics.Reset();
+
+					//mxd. Aspect ratio may've been changed
+					General.Map.CRenderer3D.CreateProjection();
 				}
 
 				// This is a dirty trick to give the display a new mousemove event with correct arguments
@@ -4001,21 +4004,19 @@ namespace CodeImp.DoomBuilder.Windows
 			float deltatime = curtime - lastupdatetime;
 			lastupdatetime = curtime;
 			
-			// In exclusive mouse mode?
-			if(mouseinput != null)
+			if((General.Map != null) && (General.Editing.Mode != null))
 			{
-				// Process mouse input
-				Vector2D deltamouse = mouseinput.Process();
-				if((General.Map != null) && (General.Editing.Mode != null))
+				// In exclusive mouse mode?
+				if(mouseinput != null)
 				{
+					Vector2D deltamouse = mouseinput.Process();
 					General.Plugins.OnEditMouseInput(deltamouse);
 					General.Editing.Mode.OnMouseInput(deltamouse);
 				}
-			}
-			
-			// Process signal
-			if((General.Map != null) && (General.Editing.Mode != null))
+
+				// Process signal
 				General.Editing.Mode.OnProcess(deltatime);
+			}
 		}
 
 		#endregion
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
index c231860de417629f17d56facd684351c54090396..4e020853511748444d1fcaa29dd2978e5fad82a3 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
@@ -1277,6 +1277,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		{
 			base.ResourcesReloaded();
 			RebuildElementData();
+			UpdateChangedObjects(); //mxd
 			PickTarget();
 		}