From 1be047d316a43b73fcfb5ed7b5ec30bb6d7e21f7 Mon Sep 17 00:00:00 2001
From: Magnus Norddahl <dpjudas@users.noreply.github.com>
Date: Thu, 8 Aug 2019 03:19:11 +0200
Subject: [PATCH] - Simplify D3DDevice

---
 Source/Core/Controls/RenderTargetControl.cs |   8 -
 Source/Core/Data/DataManager.cs             | 108 ++--
 Source/Core/Data/ImageData.cs               |  10 +-
 Source/Core/GZBuilder/md3/ModelReader.cs    |  60 +-
 Source/Core/General/General.cs              |  62 ---
 Source/Core/General/Launcher.cs             |   1 -
 Source/Core/General/MapManager.cs           |   2 -
 Source/Core/Rendering/D3DDevice.cs          | 577 +++-----------------
 Source/Core/Rendering/D3DShader.cs          |   8 +-
 Source/Core/Rendering/Display2DShader.cs    |   6 +-
 Source/Core/Rendering/FlatQuad.cs           |   2 +-
 Source/Core/Rendering/Renderer2D.cs         | 558 +++++++++----------
 Source/Core/Rendering/Renderer3D.cs         | 341 ++++++------
 Source/Core/Rendering/SurfaceManager.cs     |  13 +-
 Source/Core/Rendering/TextLabel.cs          |   9 +-
 Source/Core/Rendering/Things2DShader.cs     |   8 +-
 Source/Core/Rendering/VisualVertexHandle.cs |   4 +-
 Source/Core/Rendering/World3DShader.cs      |   2 +-
 Source/Core/SlimDX.cs                       | 260 +--------
 Source/Core/VisualModes/VisualSector.cs     |   3 +-
 Source/Core/VisualModes/VisualThing.cs      |   5 +-
 Source/Core/Windows/MainForm.cs             |   3 -
 22 files changed, 603 insertions(+), 1447 deletions(-)

diff --git a/Source/Core/Controls/RenderTargetControl.cs b/Source/Core/Controls/RenderTargetControl.cs
index 20c13af93..5442b74b4 100755
--- a/Source/Core/Controls/RenderTargetControl.cs
+++ b/Source/Core/Controls/RenderTargetControl.cs
@@ -71,14 +71,6 @@ namespace CodeImp.DoomBuilder.Controls
 
 		#region ================== Overrides
 		
-		// Paint method
-		protected override void OnPaint(PaintEventArgs pe)
-		{
-			// Pass on to base
-			// Do we really want this?
-			if(!D3DDevice.IsRendering) base.RaisePaintEvent(this, pe); //mxd. Dont raise event when in the middle of rendering
-		}
-
 		//mxd
 		protected override void OnKeyUp(KeyEventArgs e) 
 		{
diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs
index d3d921e66..2949f6091 100755
--- a/Source/Core/Data/DataManager.cs
+++ b/Source/Core/Data/DataManager.cs
@@ -920,7 +920,7 @@ namespace CodeImp.DoomBuilder.Data
 			if(modeldefentries[type].LoadState != ModelLoadState.None) return true;
 
 			//create models
-			ModelReader.Load(modeldefentries[type], containers, General.Map.Graphics.Device);
+			ModelReader.Load(modeldefentries[type], containers);
 
 			if(modeldefentries[type].Model != null) 
 			{
@@ -3310,24 +3310,17 @@ namespace CodeImp.DoomBuilder.Data
 					General.ErrorLogger.Add(ErrorType.Warning, "Skybox creation failed: unable to load texture \"" + skytex + "\"");
 				
 				// Use the built-in texture
-				if(General.Map.Graphics.CheckAvailability())
-				{
-					ImageData tex = LoadInternalTexture("MissingSky3D.png");
-					tex.CreateTexture();
-                    Bitmap bmp = tex.GetBitmap();
-                    Bitmap sky;
-                    lock (bmp)
-                    {
-                        sky = new Bitmap(bmp);
-                    }
-					sky.RotateFlip(RotateFlipType.RotateNoneFlipX); // We don't want our built-in image mirrored...
-					skybox = MakeClassicSkyBox(sky);
-					tex.Dispose();
-				}
-				else
-				{
-					General.ErrorLogger.Add(ErrorType.Warning, "Skybox creation failed: Direct3D device is not available");
-				}
+				ImageData tex = LoadInternalTexture("MissingSky3D.png");
+				tex.CreateTexture();
+                Bitmap bmp = tex.GetBitmap();
+                Bitmap sky;
+                lock (bmp)
+                {
+                    sky = new Bitmap(bmp);
+                }
+				sky.RotateFlip(RotateFlipType.RotateNoneFlipX); // We don't want our built-in image mirrored...
+				skybox = MakeClassicSkyBox(sky);
+				tex.Dispose();
 			}
 		}
 
@@ -3426,38 +3419,26 @@ namespace CodeImp.DoomBuilder.Data
 			}
 
 			// 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);
+			Texture rendertarget = new Texture(cubemaptexsize, cubemaptexsize, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
 
-			// 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;
-			}
+            // Start rendering
+            General.Map.Graphics.StartRendering(true, new Color4(), rendertarget, true);
 
 			// Load the skysphere model...
 			BoundingBoxSizes bbs = new BoundingBoxSizes();
 			Stream modeldata = General.ThisAssembly.GetManifestResourceStream("CodeImp.DoomBuilder.Resources.SkySphere.md3");
-			ModelReader.MD3LoadResult meshes = ModelReader.ReadMD3Model(ref bbs, new Dictionary<int, string>(), modeldata, device, 0);
+			ModelReader.MD3LoadResult meshes = ModelReader.ReadMD3Model(ref bbs, new Dictionary<int, string>(), modeldata, 0);
 			if(meshes.Meshes.Count != 3) throw new Exception("Skybox creation failed: " 
 				+ (string.IsNullOrEmpty(meshes.Errors) ? "skybox model must contain 3 surfaces" : meshes.Errors));
 
 			// Make skysphere textures...
-			Texture texside = TextureFromBitmap(device, skyimage);
-			Texture textop = TextureFromBitmap(device, topimg);
-			Texture texbottom = TextureFromBitmap(device, bottomimg);
+			Texture texside = TextureFromBitmap(skyimage);
+			Texture textop = TextureFromBitmap(topimg);
+			Texture texbottom = TextureFromBitmap(bottomimg);
 
 			// Calculate model scaling (gl.skydone.cpp:RenderDome() in GZDoom)
 			float yscale;
@@ -3470,14 +3451,13 @@ namespace CodeImp.DoomBuilder.Data
 			yscale *= 1.65f;
 
 			// Make cubemap texture
-			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);
-			device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Clamp);
-			device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Clamp);
+			CubeTexture cubemap = new CubeTexture(cubemaptexsize, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
+
+            // Set render settings...
+            General.Map.Graphics.SetRenderState(RenderState.ZEnable, false);
+            General.Map.Graphics.SetRenderState(RenderState.CullMode, Cull.None);
+            General.Map.Graphics.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Clamp);
+            General.Map.Graphics.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Clamp);
 			
 			// Setup matrices
 			Vector3 offset = new Vector3(0f, 0f, -1.8f); // Sphere size is 10 mu
@@ -3516,29 +3496,7 @@ namespace CodeImp.DoomBuilder.Data
 					meshes.Meshes[j].DrawSubset(0);
 				}
 
-				// 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...");
-				}
-
-				// Unlock and dispose
-				sysmemsurf.UnlockRectangle();
-				targetsurf.UnlockRectangle();
-				targetsurf.Dispose();
+                General.Map.Graphics.CopyTexture(rendertarget, cubemap, (CubeMapFace)i);
 			}
 
 			// End rendering
@@ -3548,8 +3506,6 @@ namespace CodeImp.DoomBuilder.Data
 
 			// Dispose unneeded stuff
 			rendertarget.Dispose();
-			depthbuffer.Dispose();
-			sysmemsurf.Dispose();
 			textop.Dispose();
 			texside.Dispose();
 			texbottom.Dispose();
@@ -3695,7 +3651,7 @@ namespace CodeImp.DoomBuilder.Data
 		// sides[] must contain 6 square Po2 images in this order: North, East, South, West, Top, Bottom
 		private static CubeTexture MakeSkyBox(Bitmap[] sides, int targetsize, bool fliptop)
 		{
-			CubeTexture cubemap = new CubeTexture(General.Map.Graphics.Device, targetsize, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
+			CubeTexture cubemap = new CubeTexture(targetsize, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
 
 			// Draw faces
 			sides[3].RotateFlip(RotateFlipType.Rotate90FlipNone);
@@ -3721,7 +3677,7 @@ namespace CodeImp.DoomBuilder.Data
 
 		private static void DrawCubemapFace(CubeTexture texture, CubeMapFace face, Bitmap image)
 		{
-			DataRectangle rect = texture.LockRectangle(face, 0, LockFlags.NoSystemLock);
+			DataRectangle rect = texture.LockRectangle(face, 0, LockFlags.None);
 			
 			if(rect.Data.CanWrite)
 			{
@@ -3807,7 +3763,7 @@ namespace CodeImp.DoomBuilder.Data
 			return Matrix.LookAtLH(eye, lookdir, updir);
 		}
 
-		private static Texture TextureFromBitmap(Device device, Image image)
+		private static Texture TextureFromBitmap(Image image)
 		{
 			using(MemoryStream ms = new MemoryStream())
 			{
@@ -3816,9 +3772,7 @@ namespace CodeImp.DoomBuilder.Data
 
 				// Classic skies textures can be NPo2 (and D3D Texture is resized to Po2 by default),
 				// so we need to explicitly specify the size
-				return Texture.FromStream(device, ms, (int) ms.Length,
-										  image.Size.Width, image.Size.Height, 0, Usage.None, Format.Unknown,
-										  Pool.Managed, Filter.None, Filter.None, 0);
+				return Texture.FromStream(ms, (int) ms.Length, image.Size.Width, image.Size.Height, 0, Usage.None, Format.Unknown, Pool.Managed);
 			}
 		}
 		
diff --git a/Source/Core/Data/ImageData.cs b/Source/Core/Data/ImageData.cs
index 4dea7b137..134261d53 100755
--- a/Source/Core/Data/ImageData.cs
+++ b/Source/Core/Data/ImageData.cs
@@ -475,21 +475,17 @@ namespace CodeImp.DoomBuilder.Data
 					memstream.Seek(0, SeekOrigin.Begin);
 					if(dynamictexture)
 					{
-						texture = Texture.FromStream(General.Map.Graphics.Device, memstream, (int)memstream.Length,
-										img.Size.Width, img.Size.Height, mipmaplevels, Usage.Dynamic, Format.A8R8G8B8,
-										Pool.Default, General.Map.Graphics.PostFilter, General.Map.Graphics.MipGenerateFilter, 0);
+						texture = Texture.FromStream(memstream, (int)memstream.Length, img.Size.Width, img.Size.Height, mipmaplevels, Usage.Dynamic, Format.A8R8G8B8, Pool.Default);
 					}
 					else
 					{
-						texture = Texture.FromStream(General.Map.Graphics.Device, memstream, (int)memstream.Length,
-										img.Size.Width, img.Size.Height, mipmaplevels, Usage.None, Format.Unknown,
-										Pool.Managed, General.Map.Graphics.PostFilter, General.Map.Graphics.MipGenerateFilter, 0);
+						texture = Texture.FromStream(memstream, (int)memstream.Length, img.Size.Width, img.Size.Height, mipmaplevels, Usage.None, Format.Unknown, Pool.Managed);
 					}
 					memstream.Dispose();
 					
 					if(dynamictexture)
 					{
-						if((width != texture.GetLevelDescription(0).Width) || (height != texture.GetLevelDescription(0).Height))
+						if((width != texture.Width) || (height != texture.Height))
 							throw new Exception("Could not create a texture with the same size as the image.");
 					}
 
diff --git a/Source/Core/GZBuilder/md3/ModelReader.cs b/Source/Core/GZBuilder/md3/ModelReader.cs
index 90d374b6c..a1382803f 100755
--- a/Source/Core/GZBuilder/md3/ModelReader.cs
+++ b/Source/Core/GZBuilder/md3/ModelReader.cs
@@ -49,13 +49,13 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 
 		#region ================== Load
 
-		public static void Load(ModelData mde, List<DataReader> containers, Device device)
+		public static void Load(ModelData mde, List<DataReader> containers)
 		{
-			if(mde.IsVoxel) LoadKVX(mde, containers, device);
-			else LoadModel(mde, containers, device);
+			if(mde.IsVoxel) LoadKVX(mde, containers);
+			else LoadModel(mde, containers);
 		}
 
-		private static void LoadKVX(ModelData mde, List<DataReader> containers, Device device)
+		private static void LoadKVX(ModelData mde, List<DataReader> containers)
 		{
 			mde.Model = new GZModel();
 			string unused = string.Empty;
@@ -68,7 +68,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 					if(ms == null) continue;
 
 					//load kvx
-					ReadKVX(mde, ms, device);
+					ReadKVX(mde, ms);
 
 					//done
 					ms.Close();
@@ -86,7 +86,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 			}
 		}
 
-		private static void LoadModel(ModelData mde, List<DataReader> containers, Device device)
+		private static void LoadModel(ModelData mde, List<DataReader> containers)
 		{
 			mde.Model = new GZModel();
 			BoundingBoxSizes bbs = new BoundingBoxSizes();
@@ -120,13 +120,13 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 							General.ErrorLogger.Add(ErrorType.Error, "Error while loading \"" + mde.ModelNames[i] + "\": frame names are not supported for MD3 models!");
 							continue;
 						}
-						result = ReadMD3Model(ref bbs, skins, ms, device, mde.FrameIndices[i]);
+						result = ReadMD3Model(ref bbs, skins, ms, mde.FrameIndices[i]);
 						break;
 					case ".md2":
-						result = ReadMD2Model(ref bbs, ms, device, mde.FrameIndices[i], mde.FrameNames[i]);
+						result = ReadMD2Model(ref bbs, ms, mde.FrameIndices[i], mde.FrameNames[i]);
 						break;
                     case ".3d":
-                        result = Read3DModel(ref bbs, skins, ms, device, mde.FrameIndices[i], mde.ModelNames[i], containers);
+                        result = Read3DModel(ref bbs, skins, ms, mde.FrameIndices[i], mde.ModelNames[i], containers);
                         break;
 					default:
 						result.Errors = "model format is not supported";
@@ -181,7 +181,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 							if(path.IndexOf(Path.DirectorySeparatorChar) == -1)
 								path = Path.Combine(Path.GetDirectoryName(mde.ModelNames[i]), path);
 
-							Texture t = LoadTexture(containers, path, device);
+							Texture t = LoadTexture(containers, path);
 
 							if(t == null)
 							{
@@ -196,7 +196,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 					//Try to use texture loaded from MODELDEFS
 					else
 					{
-						Texture t = LoadTexture(containers, mde.SkinNames[i], device);
+						Texture t = LoadTexture(containers, mde.SkinNames[i]);
 						if(t == null)
 						{
 							mde.Model.Textures.Add(General.Map.Data.UnknownTexture3D.Texture);
@@ -273,7 +273,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
             public Vector3D Normal;
         }
 
-        internal static MD3LoadResult Read3DModel(ref BoundingBoxSizes bbs, Dictionary<int, string> skins, Stream s, Device device, int frame, string filename, List<DataReader> containers)
+        internal static MD3LoadResult Read3DModel(ref BoundingBoxSizes bbs, Dictionary<int, string> skins, Stream s, int frame, string filename, List<DataReader> containers)
         {
             Stream stream_d;
             Stream stream_a;
@@ -473,7 +473,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
                     }
                 }
 
-                CreateMesh(device, ref result, out_verts, out_polys);
+                CreateMesh(ref result, out_verts, out_polys);
                 result.Skins.Add("");
             }
             else
@@ -507,7 +507,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
                         }
                     }
 
-                    CreateMesh(device, ref result, out_verts, out_polys);
+                    CreateMesh(ref result, out_verts, out_polys);
                     result.Skins.Add(skins.ContainsKey(k)?skins[k].ToLowerInvariant():string.Empty);
                 }
             }
@@ -519,7 +519,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 
         #region ================== MD3
 
-        internal static MD3LoadResult ReadMD3Model(ref BoundingBoxSizes bbs, Dictionary<int, string> skins, Stream s, Device device, int frame)
+        internal static MD3LoadResult ReadMD3Model(ref BoundingBoxSizes bbs, Dictionary<int, string> skins, Stream s, int frame)
 		{
 			long start = s.Position;
 			MD3LoadResult result = new MD3LoadResult();
@@ -604,7 +604,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 				if(!useskins)
 				{
 					//create mesh
-					CreateMesh(device, ref result, vertList, polyIndecesList);
+					CreateMesh(ref result, vertList, polyIndecesList);
 					result.Skins.Add("");
 				}
 				else
@@ -628,7 +628,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 							polyIndecesList.AddRange(group.Value[i].ToArray());
 						}
 
-						CreateMesh(device, ref result, vertListsPerTexture[group.Key], polyIndecesList);
+						CreateMesh(ref result, vertListsPerTexture[group.Key], polyIndecesList);
 						result.Skins.Add(group.Key.ToLowerInvariant());
 					}
 				}
@@ -725,7 +725,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 
 		#region ================== MD2
 
-		private static MD3LoadResult ReadMD2Model(ref BoundingBoxSizes bbs, Stream s, Device device, int frame, string framename)
+		private static MD3LoadResult ReadMD2Model(ref BoundingBoxSizes bbs, Stream s, int frame, string framename)
 		{
 			long start = s.Position;
 			MD3LoadResult result = new MD3LoadResult();
@@ -885,7 +885,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 				}
 
 				//mesh
-				Mesh mesh = new Mesh(device, polyIndecesList.Count / 3, vertList.Count, MeshFlags.Use32Bit | MeshFlags.IndexBufferManaged | MeshFlags.VertexBufferManaged, vertexElements);
+				Mesh mesh = new Mesh(polyIndecesList.Count / 3, vertList.Count, MeshFlags.Use32Bit | MeshFlags.IndexBufferManaged | MeshFlags.VertexBufferManaged, vertexElements);
 
 				using(DataStream stream = mesh.LockVertexBuffer(LockFlags.None))
 				{
@@ -899,8 +899,6 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 				}
 				mesh.UnlockIndexBuffer();
 
-				mesh.OptimizeInPlace(MeshOptimizeFlags.AttributeSort);
-
 				//store in result
 				result.Meshes.Add(mesh);
 				result.Skins.Add(""); //no skin support for MD2
@@ -913,7 +911,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 
 		#region ================== KVX
 
-		private static void ReadKVX(ModelData mde, Stream stream, Device device)
+		private static void ReadKVX(ModelData mde, Stream stream)
 		{
 			PixelColor[] palette = new PixelColor[256];
 			List<WorldVertex> verts = new List<WorldVertex>();
@@ -1075,7 +1073,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 			using(Bitmap bmp = CreateVoxelTexture(palette)) bmp.Save(memstream, ImageFormat.Bmp);
 			memstream.Seek(0, SeekOrigin.Begin);
 
-			Texture texture = Texture.FromStream(device, memstream, (int)memstream.Length, 64, 64, 0, Usage.None, Format.Unknown, Pool.Managed, Filter.Point, Filter.Box, 0);
+			Texture texture = Texture.FromStream(memstream, (int)memstream.Length, 64, 64, 0, Usage.None, Format.Unknown, Pool.Managed);
 			memstream.Dispose();
 
 			// Add texture
@@ -1085,7 +1083,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 			MeshFlags meshflags = MeshFlags.Managed;
 			if(indices.Count > ushort.MaxValue - 1) meshflags |= MeshFlags.Use32Bit;
 
-			Mesh mesh = new Mesh(device, facescount, verts.Count, meshflags, vertexElements);
+			Mesh mesh = new Mesh(facescount, verts.Count, meshflags, vertexElements);
 
 			DataStream mstream = mesh.VertexBuffer.Lock(0, 0, LockFlags.None);
 			mstream.WriteRange(verts.ToArray());
@@ -1100,8 +1098,6 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 
 			mesh.IndexBuffer.Unlock();
 
-			mesh.OptimizeInPlace(MeshOptimizeFlags.AttributeSort);
-
 			// Add mesh
 			mde.Model.Meshes.Add(mesh);
 		}
@@ -1239,7 +1235,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 			return null;
 		}
 
-		private static Texture LoadTexture(List<DataReader> containers, string path, Device device)
+		private static Texture LoadTexture(List<DataReader> containers, string path)
 		{
 			if(string.IsNullOrEmpty(path)) return null;
 
@@ -1259,7 +1255,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 				if(bitmap != null)
 				{
 					BitmapData bmlock = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
-					texture = new Texture(device, bitmap.Width, bitmap.Height, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
+					texture = new Texture(bitmap.Width, bitmap.Height, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
 
 					DataRectangle textureLock = texture.LockRectangle(0, LockFlags.None);
 					textureLock.Data.WriteRange(bmlock.Scan0, bmlock.Height * bmlock.Stride);
@@ -1270,7 +1266,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 			}
 			else
 			{
-				texture = Texture.FromStream(device, ms);
+				texture = Texture.FromStream(ms);
 
 				ms.Close();
 			}
@@ -1278,10 +1274,10 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 			return texture;
 		}
 
-		private static void CreateMesh(Device device, ref MD3LoadResult result, List<WorldVertex> verts, List<int> indices)
+		private static void CreateMesh(ref MD3LoadResult result, List<WorldVertex> verts, List<int> indices)
 		{
 			//create mesh
-			Mesh mesh = new Mesh(device, indices.Count / 3, verts.Count, MeshFlags.Use32Bit | MeshFlags.IndexBufferManaged | MeshFlags.VertexBufferManaged, vertexElements);
+			Mesh mesh = new Mesh(indices.Count / 3, verts.Count, MeshFlags.Use32Bit | MeshFlags.IndexBufferManaged | MeshFlags.VertexBufferManaged, vertexElements);
 
 			using(DataStream stream = mesh.LockVertexBuffer(LockFlags.None))
 			{
@@ -1295,8 +1291,6 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
 			}
 			mesh.UnlockIndexBuffer();
 
-			mesh.OptimizeInPlace(MeshOptimizeFlags.AttributeSort);
-
 			//store in result
 			result.Meshes.Add(mesh);
 		}
diff --git a/Source/Core/General/General.cs b/Source/Core/General/General.cs
index 0a2f1c310..1a306f3b1 100755
--- a/Source/Core/General/General.cs
+++ b/Source/Core/General/General.cs
@@ -544,9 +544,6 @@ namespace CodeImp.DoomBuilder
 			//mxd. Set CultureInfo
 			Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
 			
-			// Hook to DLL loading failure event
-			AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
-			
 			// Set current thread name
 			Thread.CurrentThread.Name = "Main Application";
 
@@ -638,12 +635,6 @@ namespace CodeImp.DoomBuilder
 					mainwindow.Update();
 				}
 				
-				// Start Direct3D
-				General.WriteLogLine("Starting Direct3D graphics driver...");
-				try { D3DDevice.Startup(); }
-				catch(Direct3D9NotFoundException e) { AskDownloadDirectX(e.Message); return; }
-				catch(Direct3DX9NotFoundException e) { AskDownloadDirectX(e.Message); return; }
-				
 				// Load plugin manager
 				General.WriteLogLine("Loading plugins...");
 				plugins = new PluginManager();
@@ -741,58 +732,6 @@ namespace CodeImp.DoomBuilder
 			}
 		}
 
-		// This handles DLL linking errors
-		private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
-		{
-			// Check if SlimDX failed loading
-			if(args.Name.Contains("SlimDX")) AskDownloadSlimDX();
-
-			// Return null
-			return null;
-		}
-		
-		// This asks the user to download DirectX
-		private static void AskDownloadDirectX(string message)
-		{
-			// Cancel loading map from command-line parameters, if any.
-			// This causes problems, because when the window is shown, the map will
-			// be loaded and DirectX is initialized (which we seem to be missing)
-			CancelAutoMapLoad();
-			
-			// Ask the user to download DirectX
-			if(MessageBox.Show("Unable to initialize DirectX: " + message + Environment.NewLine + Environment.NewLine +
-				"Do you want to install and/or update Microsoft DirectX 9.0 now?", "DirectX 9.0 Error", MessageBoxButtons.YesNo,
-				MessageBoxIcon.Exclamation) == DialogResult.Yes)
-			{
-				// Go to DirectX End-User Runtime Web Installer page (mxd)
-				OpenWebsite("https://www.microsoft.com/en-us/download/details.aspx?id=35&44F86079-8679-400C-BFF2-9CA5F2BCBDFC=1");
-			}
-
-			// End program here
-			Terminate(false);
-		}
-
-		// This asks the user to download SlimDX (mxd)
-		private static void AskDownloadSlimDX() 
-		{
-			// Cancel loading map from command-line parameters, if any.
-			// This causes problems, because when the window is shown, the map will
-			// be loaded and SlimDX is initialized (which we seem to be missing)
-			CancelAutoMapLoad();
-
-			// Ask the user to download SlimDX
-			if(MessageBox.Show("This application requires the latest version of SlimDX for .NET 2.0 installed on your computer." + Environment.NewLine +
-				"Do you want to install SlimDX now?", "SlimDX Error", MessageBoxButtons.YesNo,
-				MessageBoxIcon.Exclamation) == DialogResult.Yes) 
-			{
-				// Go to SlimDX download page
-				OpenWebsite("http://slimdx.org/download.php");
-			}
-
-			// End program here
-			Terminate(false);
-		}
-
 		// This parses the command line arguments
 		private static void ParseCommandLineArgs(string[] args)
 		{
@@ -1034,7 +973,6 @@ namespace CodeImp.DoomBuilder
 				if(mainwindow != null) { mainwindow.Dispose(); mainwindow = null; }
 				if(actions != null) { actions.Dispose(); actions = null; }
 				if(types != null) { types.Dispose(); types = null; }
-				try { D3DDevice.Terminate(); } catch { }
 
 				// Application ends here and now
 				General.WriteLogLine("Termination done");
diff --git a/Source/Core/General/Launcher.cs b/Source/Core/General/Launcher.cs
index 387446506..048080a47 100755
--- a/Source/Core/General/Launcher.cs
+++ b/Source/Core/General/Launcher.cs
@@ -395,7 +395,6 @@ namespace CodeImp.DoomBuilder
 				// Device reset may be needed...
 				if(General.Editing.Mode is ClassicMode)
 				{
-					General.Map.Graphics.Reset();
 					General.MainWindow.RedrawDisplay();
 				}
 			}
diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs
index 0a8a69ed3..fd495ccae 100755
--- a/Source/Core/General/MapManager.cs
+++ b/Source/Core/General/MapManager.cs
@@ -262,7 +262,6 @@ namespace CodeImp.DoomBuilder
 			// Initiate graphics
 			General.WriteLogLine("Initializing graphics device...");
 			graphics = new D3DDevice(General.MainWindow.Display);
-			if(!graphics.Initialize()) return false;
 
 			// Create renderers
 			renderer2d = new Renderer2D(graphics);
@@ -370,7 +369,6 @@ namespace CodeImp.DoomBuilder
 			// Initiate graphics
 			General.WriteLogLine("Initializing graphics device...");
 			graphics = new D3DDevice(General.MainWindow.Display);
-			if(!graphics.Initialize()) return false;
 
 			// Create renderers
 			renderer2d = new Renderer2D(graphics);
diff --git a/Source/Core/Rendering/D3DDevice.cs b/Source/Core/Rendering/D3DDevice.cs
index 80a4d923d..f6f2c098c 100755
--- a/Source/Core/Rendering/D3DDevice.cs
+++ b/Source/Core/Rendering/D3DDevice.cs
@@ -29,529 +29,94 @@ using SlimDX.Direct3D9;
 
 namespace CodeImp.DoomBuilder.Rendering
 {
-	internal class D3DDevice : IDisposable
-	{
-		#region ================== Constants
-
-		// NVPerfHUD device name
-		private const string NVPERFHUD_ADAPTER = "NVPerfHUD";
-
-		//mxd. Anisotropic filtering steps
-		public static readonly List<float> AF_STEPS = new List<float> { 1.0f, 2.0f, 4.0f, 8.0f, 16.0f }; 
+    internal class D3DDevice : IDisposable
+    {
+		internal D3DDevice(RenderTargetControl rendertarget)
+		{
+			RenderTarget = rendertarget;
+            Shaders = new ShaderManager(this);
+            SetupSettings();
+        }
+
+        public void SetStreamSource(int index, VertexBuffer buffer, long offset, long stride) { }
+        public void SetRenderState(RenderState state, float v) { }
+        public void SetRenderState(RenderState state, bool v) { }
+        public void SetRenderState(RenderState state, int v) { }
+        public void SetRenderState(RenderState state, Compare v) { }
+        public void SetRenderState(RenderState state, Cull v) { }
+        public void SetRenderState(RenderState state, Blend v) { }
+        public void SetRenderState(RenderState state, BlendOperation v) { }
+        public void SetRenderState(RenderState state, FillMode v) { }
+        public Matrix GetTransform(TransformState state) { return Matrix.Identity; }
+        public void SetTransform(TransformState state, Matrix matrix) { }
+        public void SetSamplerState(int unit, SamplerState state, TextureAddress address) { }
+        public void DrawPrimitives(PrimitiveType type, int startIndex, int primitiveCount) { }
+        public void DrawUserPrimitives<T>(PrimitiveType type, int startIndex, int primitiveCount, T[] data) where T : struct { }
+        public void SetVertexDeclaration(VertexDeclaration decl) { }
+
+        public void Dispose() { }
+
+		internal void RegisterResource(ID3DResource res) { }
+		internal void UnregisterResource(ID3DResource res) { }
+
+        public void StartRendering(bool clear, Color4 backcolor)
+        {
+            //if (clear)
+            //    Clear(ClearFlags.Target | ClearFlags.ZBuffer, backcolor, 1f, 0);
+        }
+        public void StartRendering(bool clear, Color4 backcolor, Texture target, bool usedepthbuffer)
+        {
+            //if (clear)
+            //    Clear(ClearFlags.Target, backcolor, 1f, 0);
+        }
+        public void FinishRendering() { }
+        public void Present() { }
+        public void ClearTexture(Color4 backcolor, Texture texture) { }
+        public void CopyTexture(Texture src, CubeTexture dst, CubeMapFace face) { }
+
+        //mxd. Anisotropic filtering steps
+        public static readonly List<float> AF_STEPS = new List<float> { 1.0f, 2.0f, 4.0f, 8.0f, 16.0f }; 
 		
 		//mxd. Antialiasing steps
 		public static readonly List<int> AA_STEPS = new List<int> { 0, 2, 4, 8 };
 
-		#endregion
-
-		#region ================== Variables
-
-		// Settings
-		private int adapter;
-		private Filter postfilter;
-		private Filter mipgeneratefilter;
-		private static bool isrendering; //mxd
-		
-		// Main objects
-		private static Direct3D d3d;
-		private RenderTargetControl rendertarget;
-		private Capabilities devicecaps;
-		private Device device;
-		private Viewport viewport;
-		private readonly HashSet<ID3DResource> resources;
-		private ShaderManager shaders;
-		private Surface backbuffer;
-		private Surface depthbuffer;
-		
-		// Disposing
-		private bool isdisposed;
-
-		#endregion
-
-		#region ================== Properties
-
-		internal Device Device { get { return device; } }
-		public bool IsDisposed { get { return isdisposed; } }
-		public static bool IsRendering { get { return isrendering; } } //mxd
-		internal RenderTargetControl RenderTarget { get { return rendertarget; } }
-		internal Viewport Viewport { get { return viewport; } }
-		internal ShaderManager Shaders { get { return shaders; } }
-		internal Surface BackBuffer { get { return backbuffer; } }
-		internal Surface DepthBuffer { get { return depthbuffer; } }
-		internal Filter PostFilter { get { return postfilter; } }
-		internal Filter MipGenerateFilter { get { return mipgeneratefilter; } }
-		
-		#endregion
-
-		#region ================== Constructor / Disposer
-
-		// Constructor
-		internal D3DDevice(RenderTargetControl rendertarget)
-		{
-			// Set render target
-			this.rendertarget = rendertarget;
-
-			// Create resources list
-			resources = new HashSet<ID3DResource>();
-			
-			// We have no destructor
-			GC.SuppressFinalize(this);
-		}
-
-		// Disposer
-		public void Dispose()
-		{
-			// Not already disposed?
-			if(!isdisposed)
-			{
-				// Clean up
-				foreach(ID3DResource res in resources) res.UnloadResource();
-				if(shaders != null) shaders.Dispose();
-				rendertarget = null;
-				if(backbuffer != null) backbuffer.Dispose();
-				if(depthbuffer != null) depthbuffer.Dispose();
-				if(device != null) device.Dispose();
-
-				if(ObjectTable.Objects.Count > 1) //mxd. Direct3D itself is not disposed while the editor is running
-				{
-					//mxd. Get rid of any remaining D3D objects...
-					foreach(ComObject o in ObjectTable.Objects) 
-					{
-						if(o is Direct3D) continue; // Don't dispose the device itself...
-						General.WriteLogLine("WARNING: D3D resource " + o
-							+ (o.Tag != null ? " (" + o.Tag + ")" : string.Empty) + " was not disposed properly!"
-							+ (o.CreationSource != null ? " Stack trace: " + o.CreationSource : string.Empty));
-						o.Dispose();
-					}
-
-#if DEBUG
-					General.ShowWarningMessage("Some D3D resources were not disposed properly! See the event log for more details.",
-					                           MessageBoxButtons.OK);
-#endif
-				}
-				
-				// Done
-				isrendering = false; //mxd
-				isdisposed = true;
-			}
-		}
-
-		#endregion
-
-		#region ================== Renderstates
+		internal RenderTargetControl RenderTarget { get; private set; }
+		internal ShaderManager Shaders { get; private set; }
 
-		// This completes initialization after the device has started or has been reset
 		public void SetupSettings()
 		{
 			// Setup renderstates
-			device.SetRenderState(RenderState.AlphaBlendEnable, false);
-			device.SetRenderState(RenderState.AlphaBlendEnable, false);
-			device.SetRenderState(RenderState.AlphaFunc, Compare.GreaterEqual);
-			device.SetRenderState(RenderState.AlphaRef, 0x0000007E);
-			device.SetRenderState(RenderState.AlphaTestEnable, false);
-			device.SetRenderState(RenderState.Ambient, Color.White.ToArgb());
-			device.SetRenderState(RenderState.AmbientMaterialSource, ColorSource.Material);
-			device.SetRenderState(RenderState.AntialiasedLineEnable, false);
-			device.SetRenderState(RenderState.Clipping, true);
-			device.SetRenderState(RenderState.ColorVertex, false);
-			device.SetRenderState(RenderState.ColorWriteEnable, ColorWriteEnable.Red | ColorWriteEnable.Green | ColorWriteEnable.Blue | ColorWriteEnable.Alpha);
-			device.SetRenderState(RenderState.CullMode, Cull.None);
-			device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
-			device.SetRenderState(RenderState.DiffuseMaterialSource, ColorSource.Color1);
-			//device.SetRenderState(RenderState.DitherEnable, true);
-			device.SetRenderState(RenderState.FillMode, FillMode.Solid);
-			device.SetRenderState(RenderState.FogEnable, false);
-			device.SetRenderState(RenderState.FogTableMode, FogMode.Linear);
-			device.SetRenderState(RenderState.Lighting, false);
-			device.SetRenderState(RenderState.LocalViewer, false);
-			device.SetRenderState(RenderState.MultisampleAntialias, (General.Settings.AntiAliasingSamples > 0)); //mxd
-			device.SetRenderState(RenderState.NormalizeNormals, false);
-			device.SetRenderState(RenderState.PointSpriteEnable, false);
-			device.SetRenderState(RenderState.RangeFogEnable, false);
-			device.SetRenderState(RenderState.ShadeMode, ShadeMode.Gouraud);
-			device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
-			device.SetRenderState(RenderState.SpecularEnable, false);
-			device.SetRenderState(RenderState.StencilEnable, false);
-			device.SetRenderState(RenderState.TextureFactor, -1);
-			device.SetRenderState(RenderState.ZEnable, false);
-			device.SetRenderState(RenderState.ZWriteEnable, false);
-			device.PixelShader = null;
-			device.VertexShader = null;
+			SetRenderState(RenderState.AlphaBlendEnable, false);
+			SetRenderState(RenderState.AlphaFunc, Compare.GreaterEqual);
+			SetRenderState(RenderState.AlphaRef, 0x0000007E);
+			SetRenderState(RenderState.AlphaTestEnable, false);
+			SetRenderState(RenderState.CullMode, Cull.None);
+			SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
+			SetRenderState(RenderState.FillMode, FillMode.Solid);
+			SetRenderState(RenderState.FogEnable, false);
+			SetRenderState(RenderState.MultisampleAntialias, (General.Settings.AntiAliasingSamples > 0));
+			SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
+			SetRenderState(RenderState.TextureFactor, -1);
+			SetRenderState(RenderState.ZEnable, false);
+			SetRenderState(RenderState.ZWriteEnable, false);
 
 			// Matrices
-			device.SetTransform(TransformState.World, Matrix.Identity);
-			device.SetTransform(TransformState.View, Matrix.Identity);
-			device.SetTransform(TransformState.Projection, Matrix.Identity);
+			SetTransform(TransformState.World, Matrix.Identity);
+			SetTransform(TransformState.View, Matrix.Identity);
+			SetTransform(TransformState.Projection, Matrix.Identity);
 			
 			// Texture addressing
-			device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
-			device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
-			device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
-			
-			// Setup material
-			device.Material = new Material {
-				Ambient = new Color4(Color.White),
-				Diffuse = new Color4(Color.White),
-				Specular = new Color4(Color.White)
-			};
+			SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
+			SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
+			SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
 			
 			// Shader settings
-			shaders.World3D.SetConstants(General.Settings.VisualBilinear, Math.Min(devicecaps.MaxAnisotropy, General.Settings.FilterAnisotropy));
-			
-			// Texture filters
-			postfilter = Filter.Point;
-			mipgeneratefilter = Filter.Box;
+			Shaders.World3D.SetConstants(General.Settings.VisualBilinear, General.Settings.FilterAnisotropy);
 			
 			// Initialize presentations
 			Presentation.Initialize();
 		}
 
-		#endregion
-
-		#region ================== Initialization
-		
-		// This starts up Direct3D
-		public static void Startup()
-		{
-			d3d = new Direct3D();
-		}
-		
-		// This terminates Direct3D
-		public static void Terminate()
-		{
-			if(d3d != null)
-			{
-				d3d.Dispose();
-				d3d = null;
-			}
-		}
-		
-		// This initializes the graphics
-		public bool Initialize()
-		{
-			// Use default adapter
-			this.adapter = 0; // Manager.Adapters.Default.Adapter;
-
-			try
-			{
-				// Make present parameters
-				PresentParameters displaypp = CreatePresentParameters(adapter);
-
-				// Determine device type for compatability with NVPerfHUD
-				DeviceType devtype;
-				if(d3d.Adapters[adapter].Details.Description.EndsWith(NVPERFHUD_ADAPTER))
-					devtype = DeviceType.Reference;
-				else
-					devtype = DeviceType.Hardware;
-
-				//mxd. Check maximum supported AA level...
-				for(int i = AA_STEPS.Count - 1; i > 0; i--)
-				{
-					if(General.Settings.AntiAliasingSamples < AA_STEPS[i]) continue;
-					if(d3d.CheckDeviceMultisampleType(this.adapter, devtype, d3d.Adapters[adapter].CurrentDisplayMode.Format, displaypp.Windowed, (MultisampleType)AA_STEPS[i]))
-						break;
-
-					if(General.Settings.AntiAliasingSamples > AA_STEPS[i - 1])
-					{
-						General.Settings.AntiAliasingSamples = AA_STEPS[i - 1];
-						
-						// TODO: looks like setting Multisample here just resets it to MultisampleType.None, 
-						// regardless of value in displaypp.Multisample. Why?..
-						displaypp.Multisample = (MultisampleType)General.Settings.AntiAliasingSamples;
-					}
-				}
-
-				// Get the device capabilities
-				devicecaps = d3d.GetDeviceCaps(adapter, devtype);
-
-				// Check if this adapter supports TnL
-				if((devicecaps.DeviceCaps & DeviceCaps.HWTransformAndLight) != 0)
-				{
-					// Initialize with hardware TnL
-					device = new Device(d3d, adapter, devtype, rendertarget.Handle,
-								CreateFlags.HardwareVertexProcessing, displaypp);
-				}
-				else
-				{
-					// Initialize with software TnL
-					device = new Device(d3d, adapter, devtype, rendertarget.Handle,
-								CreateFlags.SoftwareVertexProcessing, displaypp);
-				}
-			}
-			catch(Exception)
-			{
-				// Failed
-				MessageBox.Show(General.MainWindow, "Unable to initialize the Direct3D video device. Another application may have taken exclusive mode on this video device or the device does not support Direct3D at all.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
-				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);
-
-			// Keep a reference to the original buffers
-			backbuffer = device.GetBackBuffer(0, 0);
-			depthbuffer = device.DepthStencilSurface;
-
-			// Get the viewport
-			viewport = device.Viewport;
-
-			// Create shader manager
-			shaders = new ShaderManager(this);
-			
-			// Initialize settings
-			SetupSettings();
-			
-			// Done
-			return true;
-		}
-
-		// This is to disable the automatic resize reset
-		/*private static void CancelResize(object sender, CancelEventArgs e)
-		{
-			// Cancel resize event
-			e.Cancel = true;
-		}*/
-		
-		// This creates present parameters
-		private PresentParameters CreatePresentParameters(int adapter)
-		{
-			PresentParameters displaypp = new PresentParameters();
-
-			// Get current display mode
-			DisplayMode currentmode = d3d.Adapters[adapter].CurrentDisplayMode;
-
-			// Make present parameters
-			displaypp.Windowed = true;
-			displaypp.SwapEffect = SwapEffect.Discard;
-			displaypp.BackBufferCount = 1;
-			displaypp.BackBufferFormat = currentmode.Format;
-			displaypp.BackBufferWidth = rendertarget.ClientSize.Width;
-			displaypp.BackBufferHeight = rendertarget.ClientSize.Height;
-			displaypp.EnableAutoDepthStencil = true;
-			displaypp.AutoDepthStencilFormat = Format.D24X8; //Format.D16;
-			displaypp.Multisample = (MultisampleType)General.Settings.AntiAliasingSamples;
-			displaypp.PresentationInterval = PresentInterval.Immediate;
-
-			// Return result
-			return displaypp;
-		}
-		
-		#endregion
-
-		#region ================== Resetting
-
-		// This registers a resource
-		internal void RegisterResource(ID3DResource res)
-		{
-			// Add resource
-			resources.Add(res);
-		}
-
-		// This unregisters a resource
-		internal void UnregisterResource(ID3DResource res)
-		{
-			// Remove resource
-			resources.Remove(res);
-		}
-		
-		// This resets the device and returns true on success
-		internal bool Reset()
-		{
-			// Unload all Direct3D resources
-			foreach(ID3DResource res in resources) res.UnloadResource();
-
-			// Lose backbuffers
-			if(backbuffer != null) backbuffer.Dispose();
-			if(depthbuffer != null) depthbuffer.Dispose();
-			backbuffer = null;
-			depthbuffer = null;
-
-			try
-			{
-				// Make present parameters
-				PresentParameters displaypp = CreatePresentParameters(adapter);
-				
-				// Reset the device
-				device.Reset(displaypp);
-			}
-#if DEBUG
-			catch(Exception e)
-			{
-				// Failed to re-initialize
-				Console.WriteLine("Device reset failed: " + e.Message);
-				return false;
-			}
-#else
-			catch(Exception) 
-			{
-				// Failed to re-initialize
-				return false;
-			}
-#endif
-
-			// Keep a reference to the original buffers
-			backbuffer = device.GetBackBuffer(0, 0);
-			depthbuffer = device.DepthStencilSurface;
-
-			// Get the viewport
-			viewport = device.Viewport;
-
-			// Reload all Direct3D resources
-			foreach(ID3DResource res in resources) res.ReloadResource();
-
-			// Re-apply settings
-			SetupSettings();
-			
-			// Success
-			return true;
-		}
-
-        #endregion
-
-        #region ================== Rendering
-
-		// This begins a drawing session
-		public bool StartRendering(bool clear, Color4 backcolor, Surface target, Surface depthbuffer)
-		{
-			// Check if we can render
-			if(CheckAvailability() && !isrendering) //mxd. Added isrendering check
-			{
-				// Set rendertarget
-				device.DepthStencilSurface = depthbuffer;
-				device.SetRenderTarget(0, target);
-				
-				// Clear the screen
-				if(clear)
-				{
-					if(depthbuffer != null)
-						device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, backcolor, 1f, 0);
-					else
-						device.Clear(ClearFlags.Target, backcolor, 1f, 0);
-				}
-
-                // Ready to render
-                // [ZZ] Sometimes (apparently during massive lag) this may cause invalid call exception.
-                //      Let's put this code here until proper fix is available.
-                //      For now, eat the initial exception and try to recover.
-                for (int i = 0; i < 2; i++)
-                {
-                    try
-                    {
-                        device.BeginScene();
-                        break;
-                    }
-                    catch (SlimDXException e)
-                    {
-                        if (i != 0) throw e;
-                        else
-                        {
-                            if (!CheckAvailability())
-                            {
-                                isrendering = false;
-                                return false;
-                            }
-
-                            Reset();
-                        }
-                    }
-                }
-
-				isrendering = true; //mxd
-				return true;
-			}
-			else
-			{
-				// Minimized, you cannot see anything
-				isrendering = false; //mxd
-				return false;
-			}
-		}
-
-		// This clears a target
-		public void ClearRendertarget(Color4 backcolor, Surface target, Surface depthbuffer)
-		{
-			// Set rendertarget
-			device.DepthStencilSurface = depthbuffer;
-			device.SetRenderTarget(0, target);
-
-			if(depthbuffer != null)
-				device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, backcolor, 1f, 0);
-			else
-				device.Clear(ClearFlags.Target, backcolor, 1f, 0);
-		}
-
-		// This ends a drawing session
-		public void FinishRendering()
-		{
-			try
-			{
-				// Done
-				device.EndScene();
-				isrendering = false; //mxd
-			}
-			// Errors are not a problem here
-			catch(Exception) { }
-		}
-
-		// This presents what has been drawn
-		public void Present()
-		{
-			try
-			{
-				device.Present();
-				isrendering = false; //mxd
-			}
-			// Errors are not a problem here
-			catch(Exception) { }
-		}
-		
-		// This checks if we can use the hardware at this moment
-		public bool CheckAvailability()
-		{
-			// When minimized, the hardware is not available
-			if(General.MainWindow.WindowState != FormWindowState.Minimized)
-			{
-				// Test the cooperative level
-				Result coopresult = device.TestCooperativeLevel();
-
-				// Check if device must be reset
-				if(!coopresult.IsSuccess)
-				{
-					// Should we reset?
-					if(coopresult.Name == "D3DERR_DEVICENOTRESET")
-					{
-						// Device is lost and must be reset now
-						Reset();
-					}
-
-					// Impossible to render at this point
-					return false;
-				}
-				else
-				{
-					// Ready to go!
-					return true;
-				}
-			}
-			else
-			{
-				// Minimized
-				return false;
-			}
-		}
-		
-		#endregion
-
-		#region ================== Tools
-
 		// Make a color from ARGB
 		public static int ARGB(float a, float r, float g, float b)
 		{
@@ -587,7 +152,5 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			return new Vector2D(v2.X, v2.Y);
 		}
-
-		#endregion
-	}
+    }
 }
diff --git a/Source/Core/Rendering/D3DShader.cs b/Source/Core/Rendering/D3DShader.cs
index b68aebe76..a1f035d31 100755
--- a/Source/Core/Rendering/D3DShader.cs
+++ b/Source/Core/Rendering/D3DShader.cs
@@ -101,7 +101,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			try
 			{
 				// Compile effect
-				fx = Effect.FromStream(General.Map.Graphics.Device, fxdata, null, null, null, ShaderFlags.None, null, out errors);
+				fx = Effect.FromStream(fxdata, ShaderFlags.None, out errors);
 				if(!string.IsNullOrEmpty(errors))
 				{
 					throw new Exception("Errors in effect file " + fxfile + ": " + errors);
@@ -118,7 +118,7 @@ namespace CodeImp.DoomBuilder.Rendering
 					fxdata.Seek(0, SeekOrigin.Begin);
 					
 					// Compile effect
-					fx = Effect.FromStream(General.Map.Graphics.Device, fxdata, null, null, null, ShaderFlags.Debug, null, out debugerrors);
+					fx = Effect.FromStream(fxdata, ShaderFlags.Debug, out debugerrors);
 					if(!string.IsNullOrEmpty(debugerrors))
 					{
 						throw new Exception("Errors in effect file " + fxfile + ": " + debugerrors);
@@ -155,10 +155,10 @@ namespace CodeImp.DoomBuilder.Rendering
 		public void Begin()
 		{
 			// Set vertex declaration
-			General.Map.Graphics.Device.VertexDeclaration = vertexdecl;
+			General.Map.Graphics.SetVertexDeclaration(vertexdecl);
 
 			// Set effect
-			effect.Begin(FX.DoNotSaveState);
+			effect.Begin();
 		}
 
 		// This begins a pass
diff --git a/Source/Core/Rendering/Display2DShader.cs b/Source/Core/Rendering/Display2DShader.cs
index b2c1e3382..63481acb8 100755
--- a/Source/Core/Rendering/Display2DShader.cs
+++ b/Source/Core/Rendering/Display2DShader.cs
@@ -84,7 +84,7 @@ namespace CodeImp.DoomBuilder.Rendering
 				new VertexElement(0, 16, DeclarationType.Float2, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0),
 				VertexElement.VertexDeclarationEnd
 			};
-			vertexdecl = new VertexDeclaration(General.Map.Graphics.Device, elements);
+			vertexdecl = new VertexDeclaration(elements);
 
 			// We have no destructor
 			GC.SuppressFinalize(this);
@@ -117,8 +117,8 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			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);
+			Matrix world = manager.D3DDevice.GetTransform(TransformState.World);
+			Matrix view = manager.D3DDevice.GetTransform(TransformState.View);
 			effect.SetValue(transformsettings, world * view);
 			TextureFilter filter = (bilinear ? TextureFilter.Linear : TextureFilter.Point);
 			effect.SetValue(filtersettings, (int)filter);
diff --git a/Source/Core/Rendering/FlatQuad.cs b/Source/Core/Rendering/FlatQuad.cs
index 59ea7da57..7c493a8f5 100755
--- a/Source/Core/Rendering/FlatQuad.cs
+++ b/Source/Core/Rendering/FlatQuad.cs
@@ -259,7 +259,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		public void Render(D3DDevice device)
 		{
 			// Render the quad
-			device.Device.DrawUserPrimitives(type, 0, 2, vertices);
+			device.DrawUserPrimitives(type, 0, 2, vertices);
 		}
 		
 		#endregion
diff --git a/Source/Core/Rendering/Renderer2D.cs b/Source/Core/Rendering/Renderer2D.cs
index c7ec6966a..d0c61a7cb 100755
--- a/Source/Core/Rendering/Renderer2D.cs
+++ b/Source/Core/Rendering/Renderer2D.cs
@@ -29,7 +29,6 @@ using CodeImp.DoomBuilder.Editing;
 using CodeImp.DoomBuilder.GZBuilder.Data; //mxd
 using CodeImp.DoomBuilder.Config; //mxd
 using CodeImp.DoomBuilder.GZBuilder;
-using SlimDX.Direct3D10_1;
 
 #endregion
 
@@ -71,7 +70,6 @@ namespace CodeImp.DoomBuilder.Rendering
 
 		// Locking data
 		private DataRectangle plotlocked;
-		private Surface targetsurface;
 
 		// Rendertarget sizes
 		private Size windowsize;
@@ -183,133 +181,127 @@ namespace CodeImp.DoomBuilder.Rendering
 		public unsafe void Present()
 		{
 			General.Plugins.OnPresentDisplayBegin();
-			
-			// Start drawing
-			if(graphics.StartRendering(true, General.Colors.Background.ToColorValue(), graphics.BackBuffer, graphics.DepthBuffer))
-			{
-				// Renderstates that count for this whole sequence
-				graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-				graphics.Device.SetRenderState(RenderState.ZEnable, false);
-				graphics.Device.SetRenderState(RenderState.FogEnable, false);
-				graphics.Device.SetStreamSource(0, screenverts, 0, sizeof(FlatVertex));
-				graphics.Device.SetTransform(TransformState.World, Matrix.Identity);
-				graphics.Shaders.Display2D.Begin();
 
-				// Go for all layers
-				foreach(PresentLayer layer in present.layers)
-				{
-					int aapass;
+            // Start drawing
+            graphics.StartRendering(true, General.Colors.Background.ToColorValue());
 
-					// Set blending mode
-					switch(layer.blending)
-					{
-						case BlendingMode.None:
-							graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-							graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-							graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-							break;
-
-						case BlendingMode.Mask:
-							graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-							graphics.Device.SetRenderState(RenderState.AlphaTestEnable, true);
-							graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-							break;
-
-						case BlendingMode.Alpha:
-							graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-							graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-							graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
-							graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
-							graphics.Device.SetRenderState(RenderState.TextureFactor, (new Color4(layer.alpha, 1f, 1f, 1f)).ToArgb());
-							break;
-
-						case BlendingMode.Additive:
-							graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-							graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-							graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
-							graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.One);
-							graphics.Device.SetRenderState(RenderState.TextureFactor, (new Color4(layer.alpha, 1f, 1f, 1f)).ToArgb());
-							break;
-					}
+			// Renderstates that count for this whole sequence
+			graphics.SetRenderState(RenderState.CullMode, Cull.None);
+			graphics.SetRenderState(RenderState.ZEnable, false);
+			graphics.SetRenderState(RenderState.FogEnable, false);
+			graphics.SetStreamSource(0, screenverts, 0, sizeof(FlatVertex));
+			graphics.SetTransform(TransformState.World, Matrix.Identity);
+			graphics.Shaders.Display2D.Begin();
 
-					// Check which pass to use
-					if(layer.antialiasing && General.Settings.QualityDisplay) aapass = 0; else aapass = 1;
+			// Go for all layers
+			foreach(PresentLayer layer in present.layers)
+			{
+				int aapass;
 
-					// Render layer
-					switch(layer.layer)
-					{
-						// BACKGROUND
-						case RendererLayer.Background:
-							if((backimageverts == null) || (General.Map.Grid.Background.Texture == null)) break;
-							graphics.Shaders.Display2D.Texture1 = General.Map.Grid.Background.Texture;
-							graphics.Shaders.Display2D.SetSettings(1f / windowsize.Width, 1f / windowsize.Height, FSAA_FACTOR, layer.alpha, false);
-							graphics.Shaders.Display2D.BeginPass(aapass);
-							graphics.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 0, 2, backimageverts);
-							graphics.Shaders.Display2D.EndPass();
-							graphics.Device.SetStreamSource(0, screenverts, 0, sizeof(FlatVertex));
-							break;
-
-						// GRID
-						case RendererLayer.Grid:
-							graphics.Shaders.Display2D.Texture1 = backtex;
-							graphics.Shaders.Display2D.SetSettings(1f / backsize.Width, 1f / backsize.Height, FSAA_FACTOR, layer.alpha, false);
-							graphics.Shaders.Display2D.BeginPass(aapass);
-							graphics.Device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
-							graphics.Shaders.Display2D.EndPass();
-							break;
-
-						// GEOMETRY
-						case RendererLayer.Geometry:
-							graphics.Shaders.Display2D.Texture1 = plottertex;
-							graphics.Shaders.Display2D.SetSettings(1f / structsize.Width, 1f / structsize.Height, FSAA_FACTOR, layer.alpha, false);
-							graphics.Shaders.Display2D.BeginPass(aapass);
-							graphics.Device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
-							graphics.Shaders.Display2D.EndPass();
-							break;
-
-						// THINGS
-						case RendererLayer.Things:
-							graphics.Shaders.Display2D.Texture1 = thingstex;
-							graphics.Shaders.Display2D.SetSettings(1f / thingssize.Width, 1f / thingssize.Height, FSAA_FACTOR, layer.alpha, false);
-							graphics.Shaders.Display2D.BeginPass(aapass);
-							graphics.Device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
-							graphics.Shaders.Display2D.EndPass();
-							break;
-
-						// OVERLAY
-						case RendererLayer.Overlay:
-							graphics.Shaders.Display2D.Texture1 = overlaytex;
-							graphics.Shaders.Display2D.SetSettings(1f / overlaysize.Width, 1f / overlaysize.Height, FSAA_FACTOR, layer.alpha, false);
-							graphics.Shaders.Display2D.BeginPass(aapass);
-							graphics.Device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
-							graphics.Shaders.Display2D.EndPass();
-							break;
-
-						// SURFACE
-						case RendererLayer.Surface:
-							graphics.Shaders.Display2D.Texture1 = surfacetex;
-							graphics.Shaders.Display2D.SetSettings(1f / overlaysize.Width, 1f / overlaysize.Height, FSAA_FACTOR, layer.alpha, false);
-							graphics.Shaders.Display2D.BeginPass(aapass);
-							graphics.Device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
-							graphics.Shaders.Display2D.EndPass();
-							break;
-					}
+				// Set blending mode
+				switch(layer.blending)
+				{
+					case BlendingMode.None:
+						graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+						graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+						graphics.SetRenderState(RenderState.TextureFactor, -1);
+						break;
+
+					case BlendingMode.Mask:
+						graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+						graphics.SetRenderState(RenderState.AlphaTestEnable, true);
+						graphics.SetRenderState(RenderState.TextureFactor, -1);
+						break;
+
+					case BlendingMode.Alpha:
+						graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+						graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+						graphics.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
+						graphics.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
+						graphics.SetRenderState(RenderState.TextureFactor, (new Color4(layer.alpha, 1f, 1f, 1f)).ToArgb());
+						break;
+
+					case BlendingMode.Additive:
+						graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+						graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+						graphics.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
+						graphics.SetRenderState(RenderState.DestinationBlend, Blend.One);
+						graphics.SetRenderState(RenderState.TextureFactor, (new Color4(layer.alpha, 1f, 1f, 1f)).ToArgb());
+						break;
 				}
 
-				// Done
-				graphics.Shaders.Display2D.End();
-				graphics.FinishRendering();
-				graphics.Present();
+				// Check which pass to use
+				if(layer.antialiasing && General.Settings.QualityDisplay) aapass = 0; else aapass = 1;
 
-				// Release binds
-				graphics.Shaders.Display2D.Texture1 = null;
-				graphics.Device.SetStreamSource(0, null, 0, 0);
-			}
-			else
-			{
-				// Request delayed redraw
-				General.MainWindow.DelayedRedraw();
+				// Render layer
+				switch(layer.layer)
+				{
+					// BACKGROUND
+					case RendererLayer.Background:
+						if((backimageverts == null) || (General.Map.Grid.Background.Texture == null)) break;
+						graphics.Shaders.Display2D.Texture1 = General.Map.Grid.Background.Texture;
+						graphics.Shaders.Display2D.SetSettings(1f / windowsize.Width, 1f / windowsize.Height, FSAA_FACTOR, layer.alpha, false);
+						graphics.Shaders.Display2D.BeginPass(aapass);
+						graphics.DrawUserPrimitives(PrimitiveType.TriangleStrip, 0, 2, backimageverts);
+						graphics.Shaders.Display2D.EndPass();
+						graphics.SetStreamSource(0, screenverts, 0, sizeof(FlatVertex));
+						break;
+
+					// GRID
+					case RendererLayer.Grid:
+						graphics.Shaders.Display2D.Texture1 = backtex;
+						graphics.Shaders.Display2D.SetSettings(1f / backsize.Width, 1f / backsize.Height, FSAA_FACTOR, layer.alpha, false);
+						graphics.Shaders.Display2D.BeginPass(aapass);
+						graphics.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
+						graphics.Shaders.Display2D.EndPass();
+						break;
+
+					// GEOMETRY
+					case RendererLayer.Geometry:
+						graphics.Shaders.Display2D.Texture1 = plottertex;
+						graphics.Shaders.Display2D.SetSettings(1f / structsize.Width, 1f / structsize.Height, FSAA_FACTOR, layer.alpha, false);
+						graphics.Shaders.Display2D.BeginPass(aapass);
+						graphics.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
+						graphics.Shaders.Display2D.EndPass();
+						break;
+
+					// THINGS
+					case RendererLayer.Things:
+						graphics.Shaders.Display2D.Texture1 = thingstex;
+						graphics.Shaders.Display2D.SetSettings(1f / thingssize.Width, 1f / thingssize.Height, FSAA_FACTOR, layer.alpha, false);
+						graphics.Shaders.Display2D.BeginPass(aapass);
+						graphics.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
+						graphics.Shaders.Display2D.EndPass();
+						break;
+
+					// OVERLAY
+					case RendererLayer.Overlay:
+						graphics.Shaders.Display2D.Texture1 = overlaytex;
+						graphics.Shaders.Display2D.SetSettings(1f / overlaysize.Width, 1f / overlaysize.Height, FSAA_FACTOR, layer.alpha, false);
+						graphics.Shaders.Display2D.BeginPass(aapass);
+						graphics.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
+						graphics.Shaders.Display2D.EndPass();
+						break;
+
+					// SURFACE
+					case RendererLayer.Surface:
+						graphics.Shaders.Display2D.Texture1 = surfacetex;
+						graphics.Shaders.Display2D.SetSettings(1f / overlaysize.Width, 1f / overlaysize.Height, FSAA_FACTOR, layer.alpha, false);
+						graphics.Shaders.Display2D.BeginPass(aapass);
+						graphics.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
+						graphics.Shaders.Display2D.EndPass();
+						break;
+				}
 			}
+
+			// Done
+			graphics.Shaders.Display2D.End();
+			graphics.FinishRendering();
+			graphics.Present();
+
+			// Release binds
+			graphics.Shaders.Display2D.Texture1 = null;
+			graphics.SetStreamSource(0, null, 0, 0);
 		}
 		
 		#endregion
@@ -374,25 +366,21 @@ namespace CodeImp.DoomBuilder.Rendering
 			windowsize.Height = graphics.RenderTarget.ClientSize.Height;
 
 			// Create rendertargets textures
-			plottertex = new Texture(graphics.Device, windowsize.Width, windowsize.Height, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
-			thingstex = new Texture(graphics.Device, windowsize.Width, windowsize.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
-			backtex = new Texture(graphics.Device, windowsize.Width, windowsize.Height, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
-			overlaytex = new Texture(graphics.Device, windowsize.Width, windowsize.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
-			surfacetex = new Texture(graphics.Device, windowsize.Width, windowsize.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
+			plottertex = new Texture(windowsize.Width, windowsize.Height, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
+			thingstex = new Texture(windowsize.Width, windowsize.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
+			backtex = new Texture(windowsize.Width, windowsize.Height, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
+			overlaytex = new Texture(windowsize.Width, windowsize.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
+			surfacetex = new Texture(windowsize.Width, windowsize.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
 			
 			// Get the real surface sizes
-			SurfaceDescription sd = plottertex.GetLevelDescription(0);
-			structsize.Width = sd.Width;
-			structsize.Height = sd.Height;
-			sd = thingstex.GetLevelDescription(0);
-			thingssize.Width = sd.Width;
-			thingssize.Height = sd.Height;
-			sd = backtex.GetLevelDescription(0);
-			backsize.Width = sd.Width;
-			backsize.Height = sd.Height;
-			sd = overlaytex.GetLevelDescription(0);
-			overlaysize.Width = sd.Width;
-			overlaysize.Height = sd.Height;
+			structsize.Width = plottertex.Width;
+			structsize.Height = plottertex.Height;
+			thingssize.Width = thingstex.Width;
+			thingssize.Height = thingstex.Height;
+			backsize.Width = backtex.Width;
+			backsize.Height = backtex.Height;
+			overlaysize.Width = overlaytex.Width;
+			overlaysize.Height = overlaytex.Height;
 			
 			// Clear rendertargets
 			// This may cause a crash when resetting because it recursively
@@ -400,15 +388,15 @@ namespace CodeImp.DoomBuilder.Rendering
 			//StartPlotter(true); Finish();
 			//StartThings(true); Finish();
 			//StartOverlay(true); Finish();
-			graphics.ClearRendertarget(General.Colors.Background.WithAlpha(0).ToColorValue(), thingstex.GetSurfaceLevel(0), null);
-			graphics.ClearRendertarget(General.Colors.Background.WithAlpha(0).ToColorValue(), overlaytex.GetSurfaceLevel(0), null);
+			graphics.ClearTexture(General.Colors.Background.WithAlpha(0).ToColorValue(), thingstex);
+			graphics.ClearTexture(General.Colors.Background.WithAlpha(0).ToColorValue(), overlaytex);
 			
 			// Create vertex buffers
-			screenverts = new VertexBuffer(graphics.Device, 4 * sizeof(FlatVertex), Usage.Dynamic | Usage.WriteOnly, VertexFormat.None, Pool.Default);
-			thingsvertices = new VertexBuffer(graphics.Device, THING_BUFFER_SIZE * 12 * sizeof(FlatVertex), Usage.Dynamic | Usage.WriteOnly, VertexFormat.None, Pool.Default);
+			screenverts = new VertexBuffer(4 * sizeof(FlatVertex), Usage.Dynamic | Usage.WriteOnly, VertexFormat.None, Pool.Default);
+			thingsvertices = new VertexBuffer(THING_BUFFER_SIZE * 12 * sizeof(FlatVertex), Usage.Dynamic | Usage.WriteOnly, VertexFormat.None, Pool.Default);
 
 			// Make screen vertices
-			DataStream stream = screenverts.Lock(0, 4 * sizeof(FlatVertex), LockFlags.Discard | LockFlags.NoSystemLock);
+			DataStream stream = screenverts.Lock(0, 4 * sizeof(FlatVertex), LockFlags.Discard);
 			FlatVertex[] verts = CreateScreenVerts(structsize);
 			stream.WriteRange(verts);
 			screenverts.Unlock();
@@ -495,8 +483,8 @@ namespace CodeImp.DoomBuilder.Rendering
 
 			Matrix scaling = Matrix.Scaling((1f / windowsize.Width) * 2f, (1f / windowsize.Height) * -2f, 1f);
 			Matrix translate = Matrix.Translation(-(float)windowsize.Width * 0.5f, -(float)windowsize.Height * 0.5f, 0f);
-			graphics.Device.SetTransform(TransformState.View, translate * scaling);
-			graphics.Device.SetTransform(TransformState.Projection, Matrix.Identity);
+			graphics.SetTransform(TransformState.View, translate * scaling);
+			graphics.SetTransform(TransformState.Projection, Matrix.Identity);
 			Vector2D lt = DisplayToMap(new Vector2D(0.0f, 0.0f));
 			Vector2D rb = DisplayToMap(new Vector2D(windowsize.Width, windowsize.Height));
 			viewport = new RectangleF(lt.x, lt.y, rb.x - lt.x, rb.y - lt.y);
@@ -510,11 +498,11 @@ namespace CodeImp.DoomBuilder.Rendering
 			{
 				Matrix translate = Matrix.Translation(translatex, translatey, 0f);
 				Matrix scaling = Matrix.Scaling(scale, -scale, 1f);
-				graphics.Device.SetTransform(TransformState.World, translate * scaling);
+				graphics.SetTransform(TransformState.World, translate * scaling);
 			}
 			else
 			{
-				graphics.Device.SetTransform(TransformState.World, Matrix.Identity);
+				graphics.SetTransform(TransformState.World, Matrix.Identity);
 			}
 		}
 		
@@ -650,7 +638,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(plottertex != null)
 			{
 				// Lock structures rendertarget memory
-				plotlocked = plottertex.LockRectangle(0, LockFlags.NoSystemLock);
+				plotlocked = plottertex.LockRectangle(0, LockFlags.None);
 
 				// Create structures plotter
 				plotter = new Plotter((PixelColor*)plotlocked.Data.DataPointer.ToPointer(), plotlocked.Pitch / sizeof(PixelColor), structsize.Height, structsize.Width, structsize.Height);
@@ -691,17 +679,11 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(thingstex != null)
 			{
 				// Set the rendertarget to the things texture
-				targetsurface = thingstex.GetSurfaceLevel(0);
-				if(graphics.StartRendering(clear, General.Colors.Background.WithAlpha(0).ToColorValue(), targetsurface, null))
-				{
-					// Ready for rendering
-					UpdateTransformations();
-					return true;
-				}
+                graphics.StartRendering(clear, General.Colors.Background.WithAlpha(0).ToColorValue(), thingstex, false);
 
-				// Can't render!
-				Finish();
-				return false;
+				// Ready for rendering
+				UpdateTransformations();
+				return true;
 			}
 
 			// Can't render!
@@ -727,17 +709,11 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(overlaytex != null)
 			{
 				// Set the rendertarget to the things texture
-				targetsurface = overlaytex.GetSurfaceLevel(0);
-				if(graphics.StartRendering(clear, General.Colors.Background.WithAlpha(0).ToColorValue(), targetsurface, null))
-				{
-					// Ready for rendering
-					UpdateTransformations();
-					return true;
-				}
+                graphics.StartRendering(clear, General.Colors.Background.WithAlpha(0).ToColorValue(), overlaytex, false);
 
-				// Can't render!
-				Finish();
-				return false;
+				// Ready for rendering
+				UpdateTransformations();
+				return true;
 			}
 
 			// Can't render!
@@ -761,16 +737,6 @@ namespace CodeImp.DoomBuilder.Rendering
 			{
 				// Stop rendering
 				graphics.FinishRendering();
-				
-				// Release rendertarget
-				try
-				{
-					graphics.Device.DepthStencilSurface = graphics.DepthBuffer;
-					graphics.Device.SetRenderTarget(0, graphics.BackBuffer);
-				}
-				catch(Exception) { }
-				if(targetsurface != null) targetsurface.Dispose();
-				targetsurface = null;
 			}
 			
 			// Done
@@ -831,7 +797,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			   lastgridx != offsetx || lastgridy != offsety || drawmapcenter != lastdrawmapcenter)
 			{
 				// Lock background rendertarget memory
-				DataRectangle lockedrect = backtex.LockRectangle(0, LockFlags.NoSystemLock);
+				DataRectangle lockedrect = backtex.LockRectangle(0, LockFlags.None);
 
 				// Create a plotter
 				Plotter gridplotter = new Plotter((PixelColor*)lockedrect.Data.DataPointer.ToPointer(), lockedrect.Pitch / sizeof(PixelColor), backsize.Height, backsize.Width, backsize.Height);
@@ -1257,15 +1223,15 @@ namespace CodeImp.DoomBuilder.Rendering
 				bool isthingsmode = (General.Editing.Mode.GetType().Name == "ThingsMode");
 				
 				// Set renderstates for things rendering
-				graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-				graphics.Device.SetRenderState(RenderState.ZEnable, false);
-				graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-				graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
-				graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
-				graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-				graphics.Device.SetRenderState(RenderState.FogEnable, false);
-				graphics.Device.SetRenderState(RenderState.TextureFactor, alphacolor.ToArgb());
-				graphics.Device.SetStreamSource(0, thingsvertices, 0, FlatVertex.Stride);
+				graphics.SetRenderState(RenderState.CullMode, Cull.None);
+				graphics.SetRenderState(RenderState.ZEnable, false);
+				graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+				graphics.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
+				graphics.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
+				graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+				graphics.SetRenderState(RenderState.FogEnable, false);
+				graphics.SetRenderState(RenderState.TextureFactor, alphacolor.ToArgb());
+				graphics.SetStreamSource(0, thingsvertices, 0, FlatVertex.Stride);
 				
 				// Set things texture
 				graphics.Shaders.Things2D.Texture1 = General.Map.Data.ThingTexture.Texture; //mxd
@@ -1325,7 +1291,7 @@ namespace CodeImp.DoomBuilder.Rendering
 						stream.Dispose();
 						
 						// Draw!
-						graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
+						graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
 						buffercount = 0;
 						
 						// Determine next lock size
@@ -1341,7 +1307,7 @@ namespace CodeImp.DoomBuilder.Rendering
 				
 				// Draw what's still remaining
 				if(buffercount > 0)
-					graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
+					graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
 
 				// Done
 				graphics.Shaders.Things2D.EndPass();
@@ -1474,7 +1440,7 @@ namespace CodeImp.DoomBuilder.Rendering
 								stream.Dispose();
 
 								// Draw!
-								graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
+								graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
 
 								buffercount = 0;
 
@@ -1490,7 +1456,7 @@ namespace CodeImp.DoomBuilder.Rendering
 						stream.Dispose();
 
 						// Draw what's still remaining
-						if(buffercount > 0) graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
+						if(buffercount > 0) graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
 					}
 				}
 
@@ -1527,7 +1493,7 @@ namespace CodeImp.DoomBuilder.Rendering
 						stream.Dispose();
 
 						// Draw!
-						graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
+						graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
 						buffercount = 0;
 
 						// Determine next lock size
@@ -1543,7 +1509,7 @@ namespace CodeImp.DoomBuilder.Rendering
 
 				// Draw what's still remaining
 				if(buffercount > 0) 
-					graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
+					graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
 
 				//Done with this pass
 				graphics.Shaders.Things2D.EndPass();
@@ -1552,9 +1518,9 @@ namespace CodeImp.DoomBuilder.Rendering
 				if(General.Settings.GZDrawModelsMode != ModelRenderMode.NONE) 
 				{
 					// Set renderstates for rendering
-					graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-					graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-					graphics.Device.SetRenderState(RenderState.FillMode, FillMode.Wireframe);
+					graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+					graphics.SetRenderState(RenderState.TextureFactor, -1);
+					graphics.SetRenderState(RenderState.FillMode, FillMode.Wireframe);
 
 					graphics.Shaders.Things2D.BeginPass(2);
 
@@ -1601,7 +1567,7 @@ namespace CodeImp.DoomBuilder.Rendering
 
 					//Done with this pass
 					graphics.Shaders.Things2D.EndPass();
-					graphics.Device.SetRenderState(RenderState.FillMode, FillMode.Solid);
+					graphics.SetRenderState(RenderState.FillMode, FillMode.Solid);
 				}
 
 				graphics.Shaders.Things2D.End();
@@ -1639,44 +1605,42 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(surfacetex != null)
 			{
 				// Set the rendertarget to the surface texture
-				targetsurface = surfacetex.GetSurfaceLevel(0);
-				if(graphics.StartRendering(true, General.Colors.Background.WithAlpha(0).ToColorValue(), targetsurface, null))
-				{
-					// Make sure anything we need is loaded
-					General.Map.Data.UnknownTexture3D.CreateTexture();
-					General.Map.Data.MissingTexture3D.CreateTexture(); //mxd
-
-					// Set transformations
-					UpdateTransformations();
-
-					// Set states
-					graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-					graphics.Device.SetRenderState(RenderState.ZEnable, false);
-					graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-					graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-					graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-					graphics.Device.SetRenderState(RenderState.FogEnable, false);
-					SetWorldTransformation(true);
-					graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
+                graphics.StartRendering(true, General.Colors.Background.WithAlpha(0).ToColorValue(), surfacetex, false);
+
+				// Make sure anything we need is loaded
+				General.Map.Data.UnknownTexture3D.CreateTexture();
+				General.Map.Data.MissingTexture3D.CreateTexture(); //mxd
+
+				// Set transformations
+				UpdateTransformations();
+
+				// Set states
+				graphics.SetRenderState(RenderState.CullMode, Cull.None);
+				graphics.SetRenderState(RenderState.ZEnable, false);
+				graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+				graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+				graphics.SetRenderState(RenderState.TextureFactor, -1);
+				graphics.SetRenderState(RenderState.FogEnable, false);
+				SetWorldTransformation(true);
+				graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
 					
-					// Prepare for rendering
-					switch(viewmode)
-					{
-						case ViewMode.Brightness:
-							surfaces.RenderSectorBrightness(yviewport);
-							surfaces.RenderSectorSurfaces(graphics);
-							break;
+				// Prepare for rendering
+				switch(viewmode)
+				{
+					case ViewMode.Brightness:
+						surfaces.RenderSectorBrightness(yviewport);
+						surfaces.RenderSectorSurfaces(graphics);
+						break;
 							
-						case ViewMode.FloorTextures:
-							surfaces.RenderSectorFloors(yviewport);
-							surfaces.RenderSectorSurfaces(graphics);
-							break;
+					case ViewMode.FloorTextures:
+						surfaces.RenderSectorFloors(yviewport);
+						surfaces.RenderSectorSurfaces(graphics);
+						break;
 							
-						case ViewMode.CeilingTextures:
-							surfaces.RenderSectorCeilings(yviewport);
-							surfaces.RenderSectorSurfaces(graphics);
-							break;
-					}
+					case ViewMode.CeilingTextures:
+						surfaces.RenderSectorCeilings(yviewport);
+						surfaces.RenderSectorSurfaces(graphics);
+						break;
 				}
 			}
 			
@@ -1709,12 +1673,12 @@ namespace CodeImp.DoomBuilder.Rendering
 				}
 
 				// Set renderstates for rendering
-				graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-				graphics.Device.SetRenderState(RenderState.ZEnable, false);
-				graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-				graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-				graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-				graphics.Device.SetRenderState(RenderState.FogEnable, false);
+				graphics.SetRenderState(RenderState.CullMode, Cull.None);
+				graphics.SetRenderState(RenderState.ZEnable, false);
+				graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+				graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+				graphics.SetRenderState(RenderState.TextureFactor, -1);
+				graphics.SetRenderState(RenderState.FogEnable, false);
 				graphics.Shaders.Display2D.Texture1 = t;
 				SetWorldTransformation(transformcoords);
 				graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
@@ -1722,7 +1686,7 @@ namespace CodeImp.DoomBuilder.Rendering
 				// Draw
 				graphics.Shaders.Display2D.Begin();
 				graphics.Shaders.Display2D.BeginPass(1);
-				graphics.Device.DrawUserPrimitives(PrimitiveType.TriangleList, 0, vertices.Length / 3, vertices);
+				graphics.DrawUserPrimitives(PrimitiveType.TriangleList, 0, vertices.Length / 3, vertices);
 				graphics.Shaders.Display2D.EndPass();
 				graphics.Shaders.Display2D.End();
 			}
@@ -1734,12 +1698,12 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(vertices.Length < 3) return;
 
 			// Set renderstates for rendering
-			graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-			graphics.Device.SetRenderState(RenderState.ZEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-			graphics.Device.SetRenderState(RenderState.FogEnable, false);
+			graphics.SetRenderState(RenderState.CullMode, Cull.None);
+			graphics.SetRenderState(RenderState.ZEnable, false);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.FogEnable, false);
 
 			SetWorldTransformation(true);
 			graphics.Shaders.Things2D.FillColor = new Color4(color);
@@ -1748,7 +1712,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			// Draw
 			graphics.Shaders.Things2D.Begin();
 			graphics.Shaders.Things2D.BeginPass(2);
-			graphics.Device.DrawUserPrimitives(PrimitiveType.TriangleList, 0, vertices.Length / 3, vertices);
+			graphics.DrawUserPrimitives(PrimitiveType.TriangleList, 0, vertices.Length / 3, vertices);
 			graphics.Shaders.Things2D.EndPass();
 			graphics.Shaders.Things2D.End();
 		}
@@ -1765,21 +1729,21 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(label.SkipRendering) return;
 			
 			// Set renderstates for rendering
-			graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-			graphics.Device.SetRenderState(RenderState.ZEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-			graphics.Device.SetRenderState(RenderState.FogEnable, false);
+			graphics.SetRenderState(RenderState.CullMode, Cull.None);
+			graphics.SetRenderState(RenderState.ZEnable, false);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.FogEnable, false);
 			graphics.Shaders.Display2D.Texture1 = label.Texture;
 			SetWorldTransformation(false);
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, false);
-			graphics.Device.SetStreamSource(0, label.VertexBuffer, 0, FlatVertex.Stride);
+			graphics.SetStreamSource(0, label.VertexBuffer, 0, FlatVertex.Stride);
 
 			// Draw
 			graphics.Shaders.Display2D.Begin();
 			graphics.Shaders.Display2D.BeginPass(1); //mxd
-			graphics.Device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
+			graphics.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
 			graphics.Shaders.Display2D.EndPass();
 			graphics.Shaders.Display2D.End();
 		}
@@ -1799,12 +1763,12 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(labels.Count == skipped) return;
 			
 			// Set renderstates for rendering
-			graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-			graphics.Device.SetRenderState(RenderState.ZEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-			graphics.Device.SetRenderState(RenderState.FogEnable, false);
+			graphics.SetRenderState(RenderState.CullMode, Cull.None);
+			graphics.SetRenderState(RenderState.ZEnable, false);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.FogEnable, false);
 			SetWorldTransformation(false);
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, false);
 			
@@ -1819,10 +1783,10 @@ namespace CodeImp.DoomBuilder.Rendering
 				{
 					graphics.Shaders.Display2D.Texture1 = label.Texture;
 					graphics.Shaders.Display2D.ApplySettings();
-					graphics.Device.SetStreamSource(0, label.VertexBuffer, 0, FlatVertex.Stride);
+					graphics.SetStreamSource(0, label.VertexBuffer, 0, FlatVertex.Stride);
 
 					// Draw
-					graphics.Device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
+					graphics.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
 				}
 			}
 			
@@ -1874,12 +1838,12 @@ namespace CodeImp.DoomBuilder.Rendering
 			quads[3].SetColors(c.ToInt());
 			
 			// Set renderstates for rendering
-			graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-			graphics.Device.SetRenderState(RenderState.ZEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-			graphics.Device.SetRenderState(RenderState.FogEnable, false);
+			graphics.SetRenderState(RenderState.CullMode, Cull.None);
+			graphics.SetRenderState(RenderState.ZEnable, false);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.FogEnable, false);
 			SetWorldTransformation(false);
 			graphics.Shaders.Display2D.Texture1 = General.Map.Data.WhiteTexture.Texture;
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
@@ -1912,12 +1876,12 @@ namespace CodeImp.DoomBuilder.Rendering
 			quad.SetColors(c.ToInt());
 			
 			// Set renderstates for rendering
-			graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-			graphics.Device.SetRenderState(RenderState.ZEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-			graphics.Device.SetRenderState(RenderState.FogEnable, false);
+			graphics.SetRenderState(RenderState.CullMode, Cull.None);
+			graphics.SetRenderState(RenderState.ZEnable, false);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.FogEnable, false);
 			SetWorldTransformation(false);
 			graphics.Shaders.Display2D.Texture1 = General.Map.Data.WhiteTexture.Texture;
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
@@ -1947,12 +1911,12 @@ namespace CodeImp.DoomBuilder.Rendering
 			quad.SetColors(c.ToInt());
 
 			// Set renderstates for rendering
-			graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-			graphics.Device.SetRenderState(RenderState.ZEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-			graphics.Device.SetRenderState(RenderState.FogEnable, false);
+			graphics.SetRenderState(RenderState.CullMode, Cull.None);
+			graphics.SetRenderState(RenderState.ZEnable, false);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.FogEnable, false);
 			SetWorldTransformation(false);
 			graphics.Shaders.Display2D.Texture1 = texture.Texture;
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
@@ -2045,19 +2009,19 @@ namespace CodeImp.DoomBuilder.Rendering
 			}
 
 			// Write to buffer
-			VertexBuffer vb = new VertexBuffer(General.Map.Graphics.Device, FlatVertex.Stride * verts.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
+			VertexBuffer vb = new VertexBuffer(FlatVertex.Stride * verts.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
 			DataStream s = vb.Lock(0, FlatVertex.Stride * verts.Length, LockFlags.Discard);
 			s.WriteRange(verts);
 			vb.Unlock();
 			s.Dispose();
 
 			// Set renderstates for rendering
-			graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-			graphics.Device.SetRenderState(RenderState.ZEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-			graphics.Device.SetRenderState(RenderState.FogEnable, false);
+			graphics.SetRenderState(RenderState.CullMode, Cull.None);
+			graphics.SetRenderState(RenderState.ZEnable, false);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.FogEnable, false);
 			SetWorldTransformation(false);
 			graphics.Shaders.Display2D.Texture1 = General.Map.Data.WhiteTexture.Texture;
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
@@ -2065,8 +2029,8 @@ namespace CodeImp.DoomBuilder.Rendering
 			// Draw
 			graphics.Shaders.Display2D.Begin();
 			graphics.Shaders.Display2D.BeginPass(1);
-			graphics.Device.SetStreamSource(0, vb, 0, FlatVertex.Stride);
-			graphics.Device.DrawPrimitives(PrimitiveType.LineList, 0, pointscount / 2);
+			graphics.SetStreamSource(0, vb, 0, FlatVertex.Stride);
+			graphics.DrawPrimitives(PrimitiveType.LineList, 0, pointscount / 2);
 			graphics.Shaders.Display2D.EndPass();
 			graphics.Shaders.Display2D.End();
 			vb.Dispose();
@@ -2107,12 +2071,12 @@ namespace CodeImp.DoomBuilder.Rendering
 			verts[3].c = c.ToInt();
 			
 			// Set renderstates for rendering
-			graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-			graphics.Device.SetRenderState(RenderState.ZEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-			graphics.Device.SetRenderState(RenderState.FogEnable, false);
+			graphics.SetRenderState(RenderState.CullMode, Cull.None);
+			graphics.SetRenderState(RenderState.ZEnable, false);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.FogEnable, false);
 			SetWorldTransformation(false);
 			graphics.Shaders.Display2D.Texture1 = General.Map.Data.WhiteTexture.Texture;
 			graphics.Shaders.Display2D.SetSettings(1f, 1f, 0f, 1f, General.Settings.ClassicBilinear);
@@ -2120,7 +2084,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			// Draw
 			graphics.Shaders.Display2D.Begin();
 			graphics.Shaders.Display2D.BeginPass(0);
-			graphics.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 0, 2, verts);
+			graphics.DrawUserPrimitives(PrimitiveType.TriangleStrip, 0, 2, verts);
 			graphics.Shaders.Display2D.EndPass();
 			graphics.Shaders.Display2D.End();
 		}
diff --git a/Source/Core/Rendering/Renderer3D.cs b/Source/Core/Rendering/Renderer3D.cs
index 46a412dc2..119411597 100755
--- a/Source/Core/Rendering/Renderer3D.cs
+++ b/Source/Core/Rendering/Renderer3D.cs
@@ -292,9 +292,9 @@ namespace CodeImp.DoomBuilder.Rendering
 		// This sets the appropriate view matrix
 		public void ApplyMatrices2D()
 		{
-			graphics.Device.SetTransform(TransformState.World, world);
-			graphics.Device.SetTransform(TransformState.Projection, Matrix.Identity);
-			graphics.Device.SetTransform(TransformState.View, view2d);
+			graphics.SetTransform(TransformState.World, world);
+			graphics.SetTransform(TransformState.Projection, Matrix.Identity);
+			graphics.SetTransform(TransformState.View, view2d);
 		}
 		
 		#endregion
@@ -304,65 +304,56 @@ namespace CodeImp.DoomBuilder.Rendering
 		// This starts rendering
 		public bool Start()
 		{
-			// Start drawing
-			if(graphics.StartRendering(true, General.Colors.Background.ToColorValue(), graphics.BackBuffer, graphics.DepthBuffer))
-			{
-				// Beginning renderstates
-				graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-				graphics.Device.SetRenderState(RenderState.ZEnable, false);
-				graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-				graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-				graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
-				graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
-				graphics.Device.SetRenderState(RenderState.FogEnable, false);
-				graphics.Device.SetRenderState(RenderState.FogDensity, 1.0f);
-				graphics.Device.SetRenderState(RenderState.FogColor, General.Colors.Background.ToInt());
-				graphics.Device.SetRenderState(RenderState.FogStart, General.Settings.ViewDistance * FOG_RANGE);
-				graphics.Device.SetRenderState(RenderState.FogEnd, General.Settings.ViewDistance);
-				graphics.Device.SetRenderState(RenderState.FogTableMode, FogMode.Linear);
-				graphics.Device.SetRenderState(RenderState.RangeFogEnable, false);
-				graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-				graphics.Shaders.World3D.HighlightColor = new Color4(); //mxd
-
-				// Texture addressing
-				graphics.Device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
-				graphics.Device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
-				graphics.Device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
-
-				// Matrices
-				world = Matrix.Identity;
-				ApplyMatrices3D();
-
-				// Highlight
-				if(General.Settings.AnimateVisualSelection)
-				{
-					highlightglow = (float)Math.Sin(Clock.CurrentTime / 100.0f) * 0.1f + 0.4f;
-					highlightglowinv = -highlightglow + 0.8f;
-				}
-				else
-				{
-					highlightglow = 0.4f;
-					highlightglowinv = 0.3f;
-				}
-				
-				// Determine shader pass to use
-				shaderpass = (fullbrightness ? 1 : 0);
-
-				// Create crosshair vertices
-				if(crosshairverts == null)
-					CreateCrosshairVerts(new Size(General.Map.Data.Crosshair3D.Width, General.Map.Data.Crosshair3D.Height));
+            // Start drawing
+            graphics.StartRendering(true, General.Colors.Background.ToColorValue());
+
+			// Beginning renderstates
+			graphics.SetRenderState(RenderState.CullMode, Cull.None);
+			graphics.SetRenderState(RenderState.ZEnable, false);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
+			graphics.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
+			graphics.SetRenderState(RenderState.FogEnable, false);
+			graphics.SetRenderState(RenderState.FogColor, General.Colors.Background.ToInt());
+			graphics.SetRenderState(RenderState.FogStart, General.Settings.ViewDistance * FOG_RANGE);
+			graphics.SetRenderState(RenderState.FogEnd, General.Settings.ViewDistance);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.Shaders.World3D.HighlightColor = new Color4(); //mxd
+
+			// Texture addressing
+			graphics.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
+			graphics.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
+			graphics.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
+
+			// Matrices
+			world = Matrix.Identity;
+			ApplyMatrices3D();
 
-				//mxd. Crate vertex handle
-				if(vertexhandle == null) vertexhandle = new VisualVertexHandle();
-				
-				// Ready
-				return true;
+			// Highlight
+			if(General.Settings.AnimateVisualSelection)
+			{
+				highlightglow = (float)Math.Sin(Clock.CurrentTime / 100.0f) * 0.1f + 0.4f;
+				highlightglowinv = -highlightglow + 0.8f;
 			}
 			else
 			{
-				// Can't render now
-				return false;
+				highlightglow = 0.4f;
+				highlightglowinv = 0.3f;
 			}
+				
+			// Determine shader pass to use
+			shaderpass = (fullbrightness ? 1 : 0);
+
+			// 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;
 		}
 		
 		// This begins rendering world geometry
@@ -392,12 +383,12 @@ namespace CodeImp.DoomBuilder.Rendering
 				UpdateLights();
 
 			// Initial renderstates
-			graphics.Device.SetRenderState(RenderState.CullMode, Cull.Counterclockwise);
-			graphics.Device.SetRenderState(RenderState.ZEnable, true);
-			graphics.Device.SetRenderState(RenderState.ZWriteEnable, true);
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.CullMode, Cull.Counterclockwise);
+			graphics.SetRenderState(RenderState.ZEnable, true);
+			graphics.SetRenderState(RenderState.ZWriteEnable, true);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, false);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
 			graphics.Shaders.World3D.Begin();
 
 			//mxd. SKY PASS
@@ -416,10 +407,10 @@ namespace CodeImp.DoomBuilder.Rendering
 			//mxd. Render models, without backface culling
 			if(maskedmodelthings.Count > 0)
 			{
-				graphics.Device.SetRenderState(RenderState.AlphaTestEnable, true);
-				graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
+				graphics.SetRenderState(RenderState.AlphaTestEnable, true);
+				graphics.SetRenderState(RenderState.CullMode, Cull.None);
 				RenderModels(false, false);
-                graphics.Device.SetRenderState(RenderState.CullMode, Cull.Counterclockwise);
+                graphics.SetRenderState(RenderState.CullMode, Cull.Counterclockwise);
 			}
 
 			// MASK PASS
@@ -427,7 +418,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			{
 				world = Matrix.Identity;
 				ApplyMatrices3D();
-				graphics.Device.SetRenderState(RenderState.AlphaTestEnable, true);
+				graphics.SetRenderState(RenderState.AlphaTestEnable, true);
 				RenderSinglePass(maskedgeo, maskedthings);
 			}
 
@@ -436,22 +427,22 @@ namespace CodeImp.DoomBuilder.Rendering
 			{
 				world = Matrix.Identity;
 				ApplyMatrices3D();
-				graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-				graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-				graphics.Device.SetRenderState(RenderState.ZWriteEnable, false);
-				graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.One);
+				graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+				graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+				graphics.SetRenderState(RenderState.ZWriteEnable, false);
+				graphics.SetRenderState(RenderState.DestinationBlend, Blend.One);
 				
 				RenderLights(solidgeo, lightthings);
 				RenderLights(maskedgeo, lightthings);
 
                 if (maskedmodelthings.Count > 0)
                 {
-                    graphics.Device.SetRenderState(RenderState.AlphaTestEnable, true);
-                    graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
+                    graphics.SetRenderState(RenderState.AlphaTestEnable, true);
+                    graphics.SetRenderState(RenderState.CullMode, Cull.None);
                     graphics.Shaders.World3D.IgnoreNormals = true;
                     RenderModels(true, false);
                     graphics.Shaders.World3D.IgnoreNormals = false;
-                    graphics.Device.SetRenderState(RenderState.CullMode, Cull.Counterclockwise);
+                    graphics.SetRenderState(RenderState.CullMode, Cull.Counterclockwise);
                 }
             }
 
@@ -460,10 +451,10 @@ namespace CodeImp.DoomBuilder.Rendering
 			{
 				world = Matrix.Identity;
 				ApplyMatrices3D();
-				graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-				graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-				graphics.Device.SetRenderState(RenderState.ZWriteEnable, false);
-				graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
+				graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+				graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+				graphics.SetRenderState(RenderState.ZWriteEnable, false);
+				graphics.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
 				RenderTranslucentPass(translucentgeo, translucentthings);
 			}
 
@@ -472,27 +463,27 @@ namespace CodeImp.DoomBuilder.Rendering
             {
                 world = Matrix.Identity;
                 ApplyMatrices3D();
-                graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-                graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-                graphics.Device.SetRenderState(RenderState.ZWriteEnable, false);
-                graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.One);
+                graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+                graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+                graphics.SetRenderState(RenderState.ZWriteEnable, false);
+                graphics.SetRenderState(RenderState.DestinationBlend, Blend.One);
                 RenderTranslucentLights(translucentgeo, lightthings);
             }
 
 			//mxd. Render translucent models, with backface culling
 			if(translucentmodelthings.Count > 0)
 			{
-				graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-				graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-				graphics.Device.SetRenderState(RenderState.ZWriteEnable, false);
-				graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
+				graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+				graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+				graphics.SetRenderState(RenderState.ZWriteEnable, false);
+				graphics.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
                 RenderModels(false, true);
             }
 
             // [ZZ] light pass on alpha models
             if (General.Settings.GZDrawLightsMode != LightRenderMode.NONE && !fullbrightness && lightthings.Count > 0 && translucentmodelthings.Count > 0)
             {
-                graphics.Device.SetRenderState(RenderState.AlphaTestEnable, true);
+                graphics.SetRenderState(RenderState.AlphaTestEnable, true);
                 graphics.Shaders.World3D.IgnoreNormals = true;
                 RenderModels(true, true);
                 graphics.Shaders.World3D.IgnoreNormals = false;
@@ -599,11 +590,11 @@ namespace CodeImp.DoomBuilder.Rendering
 		//It should render faster and it has fancy arrow! :)
 		private void RenderThingCages() 
 		{
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.ZWriteEnable, false);
-			graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
-			graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.SourceAlpha);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.ZWriteEnable, false);
+			graphics.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
+			graphics.SetRenderState(RenderState.DestinationBlend, Blend.SourceAlpha);
 
 			graphics.Shaders.World3D.BeginPass(16);
 
@@ -624,13 +615,13 @@ namespace CodeImp.DoomBuilder.Rendering
 
 				//Render cage
 				graphics.Shaders.World3D.ApplySettings();
-				graphics.Device.SetStreamSource(0, t.CageBuffer, 0, WorldVertex.Stride);
-				graphics.Device.DrawPrimitives(PrimitiveType.LineList, 0, t.CageLength);
+				graphics.SetStreamSource(0, t.CageBuffer, 0, WorldVertex.Stride);
+				graphics.DrawPrimitives(PrimitiveType.LineList, 0, t.CageLength);
 			}
 
 			// Done
 			graphics.Shaders.World3D.EndPass();
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
 		}
 
 		//mxd
@@ -638,11 +629,11 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			if(visualvertices == null) return;
 
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.ZWriteEnable, false);
-			graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
-			graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.SourceAlpha);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.ZWriteEnable, false);
+			graphics.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
+			graphics.SetRenderState(RenderState.DestinationBlend, Blend.SourceAlpha);
 
 			graphics.Shaders.World3D.BeginPass(16);
 
@@ -666,13 +657,13 @@ 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.DrawPrimitives(PrimitiveType.LineList, 0, 8);
+				graphics.SetStreamSource(0, v.CeilingVertex ? vertexhandle.Upper : vertexhandle.Lower, 0, WorldVertex.Stride);
+				graphics.DrawPrimitives(PrimitiveType.LineList, 0, 8);
 			}
 
 			// Done
 			graphics.Shaders.World3D.EndPass();
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
 		}
 
 		//mxd
@@ -730,18 +721,18 @@ namespace CodeImp.DoomBuilder.Rendering
 				}
 			}
 
-			VertexBuffer vb = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * verts.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
+			VertexBuffer vb = new VertexBuffer(WorldVertex.Stride * verts.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
 			DataStream s = vb.Lock(0, WorldVertex.Stride * verts.Length, LockFlags.Discard);
 			s.WriteRange(verts);
 			vb.Unlock();
 			s.Dispose();
 			
 			//begin rendering
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.ZWriteEnable, false);
-			graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
-			graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.SourceAlpha);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.ZWriteEnable, false);
+			graphics.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
+			graphics.SetRenderState(RenderState.DestinationBlend, Blend.SourceAlpha);
 
 			graphics.Shaders.World3D.BeginPass(15);
 
@@ -750,12 +741,12 @@ namespace CodeImp.DoomBuilder.Rendering
 
 			//render
 			graphics.Shaders.World3D.ApplySettings();
-			graphics.Device.SetStreamSource(0, vb, 0, WorldVertex.Stride);
-			graphics.Device.DrawPrimitives(PrimitiveType.LineList, 0, pointscount / 2);
+			graphics.SetStreamSource(0, vb, 0, WorldVertex.Stride);
+			graphics.DrawPrimitives(PrimitiveType.LineList, 0, pointscount / 2);
 
 			// Done
 			graphics.Shaders.World3D.EndPass();
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
 			vb.Dispose();
 		}
 
@@ -809,7 +800,7 @@ namespace CodeImp.DoomBuilder.Rendering
 							sector = g.Sector;
 
 							// Set stream source
-							graphics.Device.SetStreamSource(0, sector.GeometryBuffer, 0, WorldVertex.Stride);
+							graphics.SetStreamSource(0, sector.GeometryBuffer, 0, WorldVertex.Stride);
 						}
 						else
 						{
@@ -859,7 +850,7 @@ namespace CodeImp.DoomBuilder.Rendering
 						graphics.Shaders.World3D.ApplySettings();
 						
 						// Render!
-						graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
+						graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
 					}
 				}
 			}
@@ -868,10 +859,10 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(thingspass.Count > 0)
 			{
 				// Texture addressing
-				graphics.Device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Clamp);
-				graphics.Device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Clamp);
-				graphics.Device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Clamp);
-				graphics.Device.SetRenderState(RenderState.CullMode, Cull.None); //mxd. Disable backside culling, because otherwise sprites with positive ScaleY and negative ScaleX will be facing away from the camera...
+				graphics.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Clamp);
+				graphics.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Clamp);
+				graphics.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Clamp);
+				graphics.SetRenderState(RenderState.CullMode, Cull.None); //mxd. Disable backside culling, because otherwise sprites with positive ScaleY and negative ScaleX will be facing away from the camera...
 
 				Color4 vertexcolor = new Color4(); //mxd
 
@@ -971,10 +962,10 @@ namespace CodeImp.DoomBuilder.Rendering
 							graphics.Shaders.World3D.ApplySettings();
 
 							// Apply buffer
-							graphics.Device.SetStreamSource(0, t.GeometryBuffer, 0, WorldVertex.Stride);
+							graphics.SetStreamSource(0, t.GeometryBuffer, 0, WorldVertex.Stride);
 
 							// Render!
-							graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, t.Triangles);
+							graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, t.Triangles);
                         }
 					}
 
@@ -983,10 +974,10 @@ namespace CodeImp.DoomBuilder.Rendering
                 }
 
                 // Texture addressing
-                graphics.Device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
-				graphics.Device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
-				graphics.Device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
-				graphics.Device.SetRenderState(RenderState.CullMode, Cull.Counterclockwise); //mxd
+                graphics.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
+				graphics.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
+				graphics.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
+				graphics.SetRenderState(RenderState.CullMode, Cull.Counterclockwise); //mxd
 			}
 
 			// Done rendering with this shader
@@ -1051,11 +1042,11 @@ namespace CodeImp.DoomBuilder.Rendering
 					switch(g.RenderPass)
 					{
 						case RenderPass.Additive:
-							graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.One);
+							graphics.SetRenderState(RenderState.DestinationBlend, Blend.One);
 							break;
 
 						case RenderPass.Alpha:
-							graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
+							graphics.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
 							break;
 					}
 
@@ -1096,7 +1087,7 @@ namespace CodeImp.DoomBuilder.Rendering
 						sector = g.Sector;
 
 						// Set stream source
-						graphics.Device.SetStreamSource(0, sector.GeometryBuffer, 0, WorldVertex.Stride);
+						graphics.SetStreamSource(0, sector.GeometryBuffer, 0, WorldVertex.Stride);
 					}
 					else
 					{
@@ -1146,7 +1137,7 @@ namespace CodeImp.DoomBuilder.Rendering
                     graphics.Shaders.World3D.ApplySettings();
 
                     // Render!
-                    graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
+                    graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
                 }
                 else graphics.Shaders.World3D.Desaturation = 0f;
             }
@@ -1155,10 +1146,10 @@ namespace CodeImp.DoomBuilder.Rendering
 			if(thingspass.Count > 0)
 			{
 				// Texture addressing
-				graphics.Device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Clamp);
-				graphics.Device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Clamp);
-				graphics.Device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Clamp);
-				graphics.Device.SetRenderState(RenderState.CullMode, Cull.None); //mxd. Disable backside culling, because otherwise sprites with positive ScaleY and negative ScaleX will be facing away from the camera...
+				graphics.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Clamp);
+				graphics.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Clamp);
+				graphics.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Clamp);
+				graphics.SetRenderState(RenderState.CullMode, Cull.None); //mxd. Disable backside culling, because otherwise sprites with positive ScaleY and negative ScaleX will be facing away from the camera...
 
 				// Sort geometry by camera distance. First vertex of the BoundingBox is it's center
 				thingspass.Sort(delegate(VisualThing vt1, VisualThing vt2)
@@ -1193,11 +1184,11 @@ namespace CodeImp.DoomBuilder.Rendering
 						switch(t.RenderPass)
 						{
 							case RenderPass.Additive:
-								graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.One);
+								graphics.SetRenderState(RenderState.DestinationBlend, Blend.One);
 								break;
 
 							case RenderPass.Alpha:
-								graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
+								graphics.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
 								break;
 						}
 
@@ -1292,10 +1283,10 @@ namespace CodeImp.DoomBuilder.Rendering
 						graphics.Shaders.World3D.ApplySettings();
 
 						// Apply buffer
-						graphics.Device.SetStreamSource(0, t.GeometryBuffer, 0, WorldVertex.Stride);
+						graphics.SetStreamSource(0, t.GeometryBuffer, 0, WorldVertex.Stride);
 
 						// Render!
-						graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, 0, t.Triangles);
+						graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, t.Triangles);
 					}
 				}
 
@@ -1303,10 +1294,10 @@ namespace CodeImp.DoomBuilder.Rendering
                 graphics.Shaders.World3D.StencilColor = new Color4(0f, 1f, 1f, 1f);
 
                 // Texture addressing
-                graphics.Device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
-				graphics.Device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
-				graphics.Device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
-				graphics.Device.SetRenderState(RenderState.CullMode, Cull.Counterclockwise); //mxd
+                graphics.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
+				graphics.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
+				graphics.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
+				graphics.SetRenderState(RenderState.CullMode, Cull.Counterclockwise); //mxd
 			}
 
 			// Done rendering with this shader
@@ -1370,7 +1361,7 @@ namespace CodeImp.DoomBuilder.Rendering
                         sector = g.Sector;
 
                         // Set stream source
-                        graphics.Device.SetStreamSource(0, sector.GeometryBuffer, 0, WorldVertex.Stride);
+                        graphics.SetStreamSource(0, sector.GeometryBuffer, 0, WorldVertex.Stride);
                     }
                     else
                     {
@@ -1394,7 +1385,7 @@ namespace CodeImp.DoomBuilder.Rendering
                 Vector4 lpr;
                 if (lightOffsets[0] > 0)
                 {
-                    graphics.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
+                    graphics.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
 
                     for (int i = 0; i < count; i++)
                     {
@@ -1413,7 +1404,7 @@ namespace CodeImp.DoomBuilder.Rendering
                             }
                             else graphics.Shaders.World3D.SpotLight = false;
                             graphics.Shaders.World3D.ApplySettings();
-                            graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
+                            graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
                         }
                     }
                 }
@@ -1422,7 +1413,7 @@ namespace CodeImp.DoomBuilder.Rendering
                 if (lightOffsets[1] > 0)
                 {
                     count += lightOffsets[1];
-                    graphics.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
+                    graphics.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
 
                     for (int i = lightOffsets[0]; i < count; i++)
                     {
@@ -1441,7 +1432,7 @@ namespace CodeImp.DoomBuilder.Rendering
                             }
                             else graphics.Shaders.World3D.SpotLight = false;
                             graphics.Shaders.World3D.ApplySettings();
-                            graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
+                            graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
                         }
                     }
                 }
@@ -1450,7 +1441,7 @@ namespace CodeImp.DoomBuilder.Rendering
                 if (lightOffsets[2] > 0)
                 {
                     count += lightOffsets[2];
-                    graphics.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
+                    graphics.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
 
                     for (int i = lightOffsets[0] + lightOffsets[1]; i < count; i++)
                     {
@@ -1469,7 +1460,7 @@ namespace CodeImp.DoomBuilder.Rendering
                             }
                             else graphics.Shaders.World3D.SpotLight = false;
                             graphics.Shaders.World3D.ApplySettings();
-                            graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
+                            graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
                         }
                     }
                 }
@@ -1478,7 +1469,7 @@ namespace CodeImp.DoomBuilder.Rendering
                 if (lightOffsets[3] > 0)
                 {
                     count += lightOffsets[3];
-                    graphics.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.ReverseSubtract);
+                    graphics.SetRenderState(RenderState.BlendOperation, BlendOperation.ReverseSubtract);
 
                     for (int i = lightOffsets[0] + lightOffsets[1] + lightOffsets[2]; i < count; i++)
                     {
@@ -1498,7 +1489,7 @@ namespace CodeImp.DoomBuilder.Rendering
                             }
                             else graphics.Shaders.World3D.SpotLight = false;
                             graphics.Shaders.World3D.ApplySettings();
-                            graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
+                            graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
                         }
                     }
                 }
@@ -1518,15 +1509,15 @@ namespace CodeImp.DoomBuilder.Rendering
 
             VisualSector sector = null;
 
-            graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.One);
-            graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.BlendFactor);
+            graphics.SetRenderState(RenderState.SourceBlend, Blend.One);
+            graphics.SetRenderState(RenderState.DestinationBlend, Blend.BlendFactor);
 
             //
             RenderLightsFromGeometryList(geometrytolit, lights, sector, true);
 
             //
             graphics.Shaders.World3D.EndPass();
-            graphics.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
+            graphics.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
         }
 
         //
@@ -1541,8 +1532,8 @@ namespace CodeImp.DoomBuilder.Rendering
 
             VisualSector sector = null;
 
-            graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.One);
-            graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.BlendFactor);
+            graphics.SetRenderState(RenderState.SourceBlend, Blend.One);
+            graphics.SetRenderState(RenderState.DestinationBlend, Blend.BlendFactor);
 
             foreach (KeyValuePair<ImageData, List<VisualGeometry>> group in geometrytolit)
             {
@@ -1553,7 +1544,7 @@ namespace CodeImp.DoomBuilder.Rendering
             }
 
             graphics.Shaders.World3D.EndPass();
-            graphics.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
+            graphics.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
         }
 
         //mxd. Render models
@@ -1601,11 +1592,11 @@ namespace CodeImp.DoomBuilder.Rendering
                         switch (t.RenderPass)
                         {
                             case RenderPass.Additive:
-                                graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.One);
+                                graphics.SetRenderState(RenderState.DestinationBlend, Blend.One);
                                 break;
 
                             case RenderPass.Alpha:
-                                graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
+                                graphics.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
                                 break;
                         }
 
@@ -1688,7 +1679,7 @@ namespace CodeImp.DoomBuilder.Rendering
                         // normal lights
                         if (lightOffsets[0] > 0)
                         {
-                            graphics.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
+                            graphics.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
 
                             for (int i = 0; i < count; i++)
                             {
@@ -1716,7 +1707,7 @@ namespace CodeImp.DoomBuilder.Rendering
                         if (lightOffsets[1] > 0)
                         {
                             count += lightOffsets[1];
-                            graphics.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
+                            graphics.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
 
                             for (int i = lightOffsets[0]; i < count; i++)
                             {
@@ -1744,7 +1735,7 @@ namespace CodeImp.DoomBuilder.Rendering
                         if (lightOffsets[2] > 0)
                         {
                             count += lightOffsets[2];
-                            graphics.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
+                            graphics.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
 
                             for (int i = lightOffsets[0] + lightOffsets[1]; i < count; i++)
                             {
@@ -1772,7 +1763,7 @@ namespace CodeImp.DoomBuilder.Rendering
                         if (lightOffsets[3] > 0)
                         {
                             count += lightOffsets[3];
-                            graphics.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.ReverseSubtract);
+                            graphics.SetRenderState(RenderState.BlendOperation, BlendOperation.ReverseSubtract);
 
                             for (int i = lightOffsets[0] + lightOffsets[1] + lightOffsets[2]; i < count; i++)
                             {
@@ -1801,7 +1792,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			}
 
 			graphics.Shaders.World3D.EndPass();
-            if (lightpass) graphics.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
+            if (lightpass) graphics.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
         }
 
 		//mxd
@@ -1831,7 +1822,7 @@ namespace CodeImp.DoomBuilder.Rendering
 						sector = g.Sector;
 
 						// Set stream source
-						graphics.Device.SetStreamSource(0, sector.GeometryBuffer, 0, WorldVertex.Stride);
+						graphics.SetStreamSource(0, sector.GeometryBuffer, 0, WorldVertex.Stride);
 					}
 					else
 					{
@@ -1848,7 +1839,7 @@ namespace CodeImp.DoomBuilder.Rendering
 					graphics.Shaders.World3D.ApplySettings();
 
 					// Render!
-					graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
+					graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
 				}
 			}
 
@@ -2071,15 +2062,15 @@ namespace CodeImp.DoomBuilder.Rendering
 			ApplyMatrices3D();
 			
 			// Set renderstates
-			graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
-			graphics.Device.SetRenderState(RenderState.ZEnable, false);
-			graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
-			graphics.Device.SetRenderState(RenderState.AlphaTestEnable, false);
-			graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
-			graphics.Device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
-			graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
-			graphics.Device.SetTransform(TransformState.World, Matrix.Identity);
-			graphics.Device.SetTransform(TransformState.Projection, Matrix.Identity);
+			graphics.SetRenderState(RenderState.CullMode, Cull.None);
+			graphics.SetRenderState(RenderState.ZEnable, false);
+			graphics.SetRenderState(RenderState.AlphaBlendEnable, true);
+			graphics.SetRenderState(RenderState.AlphaTestEnable, false);
+			graphics.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
+			graphics.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
+			graphics.SetRenderState(RenderState.TextureFactor, -1);
+			graphics.SetTransform(TransformState.World, Matrix.Identity);
+			graphics.SetTransform(TransformState.Projection, Matrix.Identity);
 			ApplyMatrices2D();
 			
 			// Texture
@@ -2098,7 +2089,7 @@ namespace CodeImp.DoomBuilder.Rendering
 			graphics.Shaders.Display2D.Begin();
 			graphics.Shaders.Display2D.SetSettings(1.0f, 1.0f, 0.0f, 1.0f, true);
 			graphics.Shaders.Display2D.BeginPass(1);
-			graphics.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 0, 2, crosshairverts);
+			graphics.DrawUserPrimitives(PrimitiveType.TriangleStrip, 0, 2, crosshairverts);
 			graphics.Shaders.Display2D.EndPass();
 			graphics.Shaders.Display2D.End();
 		}
@@ -2106,7 +2097,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		// This switches fog on and off
 		public void SetFogMode(bool usefog)
 		{
-			graphics.Device.SetRenderState(RenderState.FogEnable, usefog);
+			graphics.SetRenderState(RenderState.FogEnable, usefog);
 		}
 
 		// This siwtches crosshair busy icon on and off
diff --git a/Source/Core/Rendering/SurfaceManager.cs b/Source/Core/Rendering/SurfaceManager.cs
index 7dc8211c4..18617b212 100755
--- a/Source/Core/Rendering/SurfaceManager.cs
+++ b/Source/Core/Rendering/SurfaceManager.cs
@@ -141,8 +141,7 @@ namespace CodeImp.DoomBuilder.Rendering
 				for(int i = 0; i < set.Value.buffersizes.Count; i++)
 				{
 					// Make the new buffer!
-					VertexBuffer b = new VertexBuffer(General.Map.Graphics.Device, FlatVertex.Stride * set.Value.buffersizes[i],
-													Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
+					VertexBuffer b = new VertexBuffer(FlatVertex.Stride * set.Value.buffersizes[i], Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
 
 					// Start refilling the buffer with sector geometry
 					DataStream bstream = b.Lock(0, FlatVertex.Stride * set.Value.buffersizes[i], LockFlags.Discard);
@@ -282,8 +281,7 @@ namespace CodeImp.DoomBuilder.Rendering
 					if(!resourcesunloaded)
 					{
 						// Make the new buffer!
-						vb = new VertexBuffer(General.Map.Graphics.Device, FlatVertex.Stride * buffernumvertices,
-												Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
+						vb = new VertexBuffer(FlatVertex.Stride * buffernumvertices, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
 
 						// Add it.
 						set.buffers.Add(vb);
@@ -334,8 +332,7 @@ namespace CodeImp.DoomBuilder.Rendering
 					if(!resourcesunloaded)
 					{
 						// Make the new buffer and lock it
-						vb = new VertexBuffer(General.Map.Graphics.Device, FlatVertex.Stride * buffernumvertices,
-												Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
+						vb = new VertexBuffer(FlatVertex.Stride * buffernumvertices, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
 						bstream = vb.Lock(0, FlatVertex.Stride * theseentries.Count * verticesperentry, LockFlags.Discard);
 					}
 					
@@ -682,11 +679,11 @@ namespace CodeImp.DoomBuilder.Rendering
 						if(set.buffers[entry.bufferindex] != lastbuffer)
 						{
 							lastbuffer = set.buffers[entry.bufferindex];
-							graphics.Device.SetStreamSource(0, lastbuffer, 0, FlatVertex.Stride);
+							graphics.SetStreamSource(0, lastbuffer, 0, FlatVertex.Stride);
 						}
 
 						// Draw
-						graphics.Device.DrawPrimitives(PrimitiveType.TriangleList, entry.vertexoffset + (entry.numvertices * surfacevertexoffsetmul), entry.numvertices / 3);
+						graphics.DrawPrimitives(PrimitiveType.TriangleList, entry.vertexoffset + (entry.numvertices * surfacevertexoffsetmul), entry.numvertices / 3);
 					}
 					
 					graphics.Shaders.Display2D.EndPass();
diff --git a/Source/Core/Rendering/TextLabel.cs b/Source/Core/Rendering/TextLabel.cs
index a72af7330..d3ec9eca7 100755
--- a/Source/Core/Rendering/TextLabel.cs
+++ b/Source/Core/Rendering/TextLabel.cs
@@ -337,20 +337,17 @@ namespace CodeImp.DoomBuilder.Rendering
 						img.Save(memstream, ImageFormat.Bmp);
 						memstream.Seek(0, SeekOrigin.Begin);
 
-						texture = Texture.FromStream(General.Map.Graphics.Device, memstream, (int)memstream.Length,
-								img.Size.Width, img.Size.Height, 1, Usage.None, Format.Unknown,
-								Pool.Managed, General.Map.Graphics.PostFilter, General.Map.Graphics.MipGenerateFilter, 0);
+						texture = Texture.FromStream(memstream, (int)memstream.Length, img.Size.Width, img.Size.Height, 1, Usage.None, Format.Unknown, Pool.Managed);
 					}
 
 					//mxd. Create the buffer
 					if(textbuffer == null || textbuffer.Disposed)
 					{
-						textbuffer = new VertexBuffer(General.Map.Graphics.Device, 4 * FlatVertex.Stride,
-												  Usage.Dynamic | Usage.WriteOnly, VertexFormat.None, Pool.Default);
+						textbuffer = new VertexBuffer(4 * FlatVertex.Stride, Usage.Dynamic | Usage.WriteOnly, VertexFormat.None, Pool.Default);
 					}
 
 					//mxd. Lock the buffer
-					using(DataStream stream = textbuffer.Lock(0, 4 * FlatVertex.Stride, LockFlags.Discard | LockFlags.NoSystemLock))
+					using(DataStream stream = textbuffer.Lock(0, 4 * FlatVertex.Stride, LockFlags.Discard))
 					{
 						FlatQuad quad = new FlatQuad(PrimitiveType.TriangleStrip, beginx, beginy, beginx + texturesize.Width, beginy + texturesize.Height);
 						stream.WriteRange(quad.Vertices);
diff --git a/Source/Core/Rendering/Things2DShader.cs b/Source/Core/Rendering/Things2DShader.cs
index 115c227f3..b7304f75f 100755
--- a/Source/Core/Rendering/Things2DShader.cs
+++ b/Source/Core/Rendering/Things2DShader.cs
@@ -99,7 +99,7 @@ namespace CodeImp.DoomBuilder.Rendering
 				new VertexElement(0, 16, DeclarationType.Float2, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0),
 				VertexElement.VertexDeclarationEnd
 			};
-			vertexdecl = new VertexDeclaration(General.Map.Graphics.Device, elements);
+			vertexdecl = new VertexDeclaration(elements);
 
 			// We have no destructor
 			GC.SuppressFinalize(this);
@@ -132,8 +132,8 @@ namespace CodeImp.DoomBuilder.Rendering
 		{
 			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);
+			Matrix world = manager.D3DDevice.GetTransform(TransformState.World);
+			Matrix view = manager.D3DDevice.GetTransform(TransformState.View);
 			effect.SetValue(transformsettings, world * view);
 			settingschanged = true; //mxd
 		}
@@ -141,7 +141,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		//mxd. Used to render models
 		public void SetTransformSettings(Matrix world)
 		{
-			Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
+			Matrix view = manager.D3DDevice.GetTransform(TransformState.View);
 			effect.SetValue(transformsettings, world * view);
 			settingschanged = true;
 		}
diff --git a/Source/Core/Rendering/VisualVertexHandle.cs b/Source/Core/Rendering/VisualVertexHandle.cs
index ae10280ac..68cd81b7f 100755
--- a/Source/Core/Rendering/VisualVertexHandle.cs
+++ b/Source/Core/Rendering/VisualVertexHandle.cs
@@ -85,7 +85,7 @@ namespace CodeImp.DoomBuilder.Rendering
 									   v2, v3,
 									   v3, v0 };
 
-			upper = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * vu.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
+			upper = new VertexBuffer(WorldVertex.Stride * vu.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
 			upper.Lock(0, WorldVertex.Stride * vu.Length, LockFlags.None).WriteRange(vu);
 			upper.Unlock();
 
@@ -99,7 +99,7 @@ namespace CodeImp.DoomBuilder.Rendering
 									  v6, v7,
 									  v7, v4 };
 
-			lower = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * vl.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
+			lower = new VertexBuffer(WorldVertex.Stride * vl.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
 			lower.Lock(0, WorldVertex.Stride * vl.Length, LockFlags.None).WriteRange(vl);
 			lower.Unlock();
 		}
diff --git a/Source/Core/Rendering/World3DShader.cs b/Source/Core/Rendering/World3DShader.cs
index ed6fc8e8a..c860ca5da 100755
--- a/Source/Core/Rendering/World3DShader.cs
+++ b/Source/Core/Rendering/World3DShader.cs
@@ -312,7 +312,7 @@ namespace CodeImp.DoomBuilder.Rendering
 				VertexElement.VertexDeclarationEnd
 			};
 
-			vertexdecl = new VertexDeclaration(General.Map.Graphics.Device, ve);
+			vertexdecl = new VertexDeclaration(ve);
 
 			// We have no destructor
 			GC.SuppressFinalize(this);
diff --git a/Source/Core/SlimDX.cs b/Source/Core/SlimDX.cs
index eff32fd25..fc5c68009 100644
--- a/Source/Core/SlimDX.cs
+++ b/Source/Core/SlimDX.cs
@@ -2,78 +2,12 @@
 
 namespace SlimDX
 {
-    #region Device context
-    namespace Direct3D9
-    {
-        public class Device
-        {
-            public Device(Direct3D d3d, int adapter, DeviceType type, IntPtr windowHandle, CreateFlags createFlags, PresentParameters pp) { }
-
-            public void Reset(PresentParameters pp) { }
-
-            public void SetStreamSource(int index, VertexBuffer buffer, long offset, long stride) { }
-            public void SetRenderState(RenderState state, float v) { }
-            public void SetRenderState(RenderState state, bool v) { }
-            public void SetRenderState(RenderState state, int v) { }
-            public void SetRenderState(RenderState state, Compare v) { }
-            public void SetRenderState(RenderState state, ColorWriteEnable v) { }
-            public void SetRenderState(RenderState state, ColorSource v) { }
-            public void SetRenderState(RenderState state, Cull v) { }
-            public void SetRenderState(RenderState state, Blend v) { }
-            public void SetRenderState(RenderState state, BlendOperation v) { }
-            public void SetRenderState(RenderState state, FillMode v) { }
-            public void SetRenderState(RenderState state, FogMode v) { }
-            public void SetRenderState(RenderState state, ShadeMode v) { }
-
-            public Matrix GetTransform(TransformState state) { return Matrix.Identity; }
-            public void SetTransform(TransformState state, Matrix matrix) { }
-
-            public void SetSamplerState(int unit, SamplerState state, TextureAddress address) { }
-
-            public void BeginScene() { }
-            public void EndScene() { }
-            public void Present() { }
-
-            public void Clear(ClearFlags flags, Color4 color, float depth, int stencil) { }
-            public void DrawPrimitives(PrimitiveType type, int startIndex, int primitiveCount) { }
-            public void DrawUserPrimitives<T>(PrimitiveType type, int startIndex, int primitiveCount, T[] data) where T : struct { }
-
-            public void GetRenderTargetData(Surface renderTarget, Surface destinationSurface) { } // Copies the render-target data from device memory to system memory
-
-            public void SetRenderTarget(int i, Surface surface) { }
-
-            public Surface GetBackBuffer(int i, int j) { return null; }
-
-            public Capabilities Capabilities { get; }
-            public Material Material { private get; set; }
-            public VertexDeclaration VertexDeclaration { private get; set; }
-            public object PixelShader { private get; set; }
-            public object VertexShader { private get; set; }
-            public Surface DepthStencilSurface { get; set; }
-            public Viewport Viewport { get; private set; }
-
-            public Result TestCooperativeLevel() { return new Result { IsSuccess = true }; }
-
-            public void Dispose() { }
-        }
-
-        public class Material
-        {
-            public Color4 Ambient;
-            public Color4 Diffuse;
-            public Color4 Specular;
-        }
-
-        public struct Viewport { }
-    }
-    #endregion
-
     #region High level mesh rendering
     namespace Direct3D9
     {
         public class Mesh
         {
-            public Mesh(Device device, int indexCount, int vertexCount, MeshFlags flags, VertexElement[] elements) { }
+            public Mesh(int indexCount, int vertexCount, MeshFlags flags, VertexElement[] elements) { }
 
             public VertexBuffer VertexBuffer { get; private set; }
             public IndexBuffer IndexBuffer { get; private set; }
@@ -83,20 +17,14 @@ namespace SlimDX
             public void UnlockVertexBuffer() { }
             public void UnlockIndexBuffer() { }
 
-            public void OptimizeInPlace(MeshOptimizeFlags flags) { }
-
             public void DrawSubset(int index) { }
 
             public void Dispose() { }
         }
 
-        public class Macro { }
-        public class Include { }
-        public class EffectPool { }
-
         public class Effect
         {
-            public static Effect FromStream(Device device, System.IO.Stream stream, Macro[] macro, Include include, string skipConstants, ShaderFlags flags, EffectPool pool, out string errors) { errors = ""; return null; }
+            public static Effect FromStream(System.IO.Stream stream, ShaderFlags flags, out string errors) { errors = ""; return null; }
 
             public void SetTexture(EffectHandle handle, BaseTexture texture) { }
             public void SetValue<T>(EffectHandle handle, T value) where T : struct { }
@@ -104,7 +32,7 @@ namespace SlimDX
             public string Technique { set; private get; }
             public void CommitChanges() { }
 
-            public void Begin(FX fx) { }
+            public void Begin() { }
             public void BeginPass(int index) { }
             public void EndPass() { }
             public void End() { }
@@ -124,7 +52,7 @@ namespace SlimDX
     {
         public class VertexDeclaration
         {
-            public VertexDeclaration(Device device, VertexElement[] elements) { }
+            public VertexDeclaration(VertexElement[] elements) { }
             public void Dispose() { }
         }
 
@@ -141,15 +69,15 @@ namespace SlimDX
     {
         public class VertexBuffer
         {
-            public VertexBuffer(Device device, int sizeInBytes, Usage usage, VertexFormat format, Pool pool) { }
+            public VertexBuffer(int sizeInBytes, Usage usage, VertexFormat format, Pool pool) { }
 
             public DataStream Lock(int offset, int size, LockFlags flags) { return null; }
             public void Unlock() { }
 
             public object Tag { get; set; }
 
-            public bool Disposed { get; }
-            public void Dispose() { }
+            public bool Disposed { get; private set; }
+            public void Dispose() { Disposed = true; }
         }
 
         public class IndexBuffer
@@ -159,8 +87,8 @@ namespace SlimDX
 
             public object Tag { get; set; }
 
-            public bool Disposed { get; }
-            public void Dispose() { }
+            public bool Disposed { get; private set; }
+            public void Dispose() { Disposed = true; }
         }
     }
     #endregion
@@ -168,27 +96,6 @@ namespace SlimDX
     #region Images (textures and surfaces)
     namespace Direct3D9
     {
-        public class Surface
-        {
-            public static Surface CreateRenderTarget(Device device, int width, int height, Format format, MultisampleType multisample, int multisampleQuality, bool lockable) { return null; }
-            public static Surface CreateDepthStencil(Device device, int width, int height, Format format, MultisampleType multisample, int multisampleQuality, bool discard) { return null; }
-            public static Surface CreateOffscreenPlain(Device device, int width, int height, Format format, Pool pool) { return null; }
-
-            public SurfaceDescription Description { get; private set; }
-
-            public DataRectangle LockRectangle(LockFlags flags) { return null; }
-            public void UnlockRectangle() { }
-
-            public void Dispose() { }
-        }
-
-        public class SurfaceDescription
-        {
-            public int Width { get; set; }
-            public int Height { get; set; }
-            public Format Format { get; set; }
-        }
-
         public class BaseTexture
         {
             public bool Disposed { get; }
@@ -197,25 +104,23 @@ namespace SlimDX
 
         public class Texture : BaseTexture
         {
-            public Texture(Device device, int width, int height, int levels, Usage usage, Format format, Pool pool) { }
+            public Texture(int width, int height, int levels, Usage usage, Format format, Pool pool) { }
+
+            public int Width { get; private set; }
+            public int Height { get; private set; }
 
             public object Tag { get; set; }
 
             public DataRectangle LockRectangle(int level, LockFlags flags) { return null; }
             public void UnlockRectangle(int level) { }
 
-            public SurfaceDescription GetLevelDescription(int level) { return null; }
-            public Surface GetSurfaceLevel(int level) { return null; }
-
-            public static Texture FromStream(Device device, System.IO.Stream stream) { return null; }
-            public static Texture FromStream(Device device, System.IO.Stream stream, int length, int width, int height, int levels, Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorkey) { return null; }
+            public static Texture FromStream(System.IO.Stream stream) { return null; }
+            public static Texture FromStream(System.IO.Stream stream, int length, int width, int height, int levels, Usage usage, Format format, Pool pool) { return null; }
         }
 
         public class CubeTexture : BaseTexture
         {
-            public CubeTexture(Device device, int size, int levels, Usage usage, Format format, Pool pool) { }
-
-            public Surface GetCubeMapSurface(CubeMapFace face, int level) { return null; }
+            public CubeTexture(int size, int levels, Usage usage, Format format, Pool pool) { }
 
             public DataRectangle LockRectangle(CubeMapFace face, int level, LockFlags flags) { return null; }
             public void UnlockRectangle(CubeMapFace face, int level) { }
@@ -259,65 +164,38 @@ namespace SlimDX
             AlphaFunc,
             AlphaRef,
             AlphaTestEnable,
-            Ambient,
-            AmbientMaterialSource,
-            AntialiasedLineEnable,
-            Clipping,
-            ColorVertex,
-            ColorWriteEnable,
             CullMode,
             BlendOperation,
             SourceBlend,
             DestinationBlend,
-            DiffuseMaterialSource,
             FillMode,
             FogEnable,
-            FogTableMode,
-            FogDensity,
             FogColor,
             FogStart,
             FogEnd,
-            Lighting,
-            LocalViewer,
             MultisampleAntialias,
-            NormalizeNormals,
-            PointSpriteEnable,
-            RangeFogEnable,
-            ShadeMode,
-            SpecularEnable,
-            StencilEnable,
             TextureFactor,
             ZEnable,
             ZWriteEnable
         }
 
         public enum Compare { GreaterEqual }
-        public enum ColorWriteEnable { Red, Green, Blue, Alpha }
-        public enum ColorSource { Material, Color1 }
         public enum Cull { None, Counterclockwise }
         public enum Blend { InverseSourceAlpha, SourceAlpha, One, BlendFactor }
         public enum BlendOperation { Add, ReverseSubtract }
         public enum FillMode { Solid, Wireframe }
-        public enum FogMode { Linear }
-        public enum ShadeMode { Gouraud }
         public enum TransformState { World, View, Projection }
         public enum SamplerState { AddressU, AddressV, AddressW }
         public enum TextureAddress { Wrap, Clamp }
         public enum ClearFlags { Target, ZBuffer }
-        public enum Format { Unknown, A8R8G8B8, D24X8 }
+        public enum Format { Unknown, A8R8G8B8 }
         public enum Usage { None, WriteOnly, Dynamic, RenderTarget }
         public enum VertexFormat { None }
         public enum Pool { Default, Managed, SystemMemory }
-        public enum LockFlags { None, Discard, NoSystemLock }
+        public enum LockFlags { None, Discard }
         public enum MeshFlags { Use32Bit, IndexBufferManaged, VertexBufferManaged, Managed }
-        public enum MeshOptimizeFlags { AttributeSort }
         public enum ShaderFlags { None, Debug }
-        public enum FX { DoNotSaveState }
-        public enum SwapEffect { Discard }
-        public enum MultisampleType { None }
-        public enum PresentInterval { Immediate }
         public enum PrimitiveType { LineList, TriangleList, TriangleStrip }
-        public enum Filter { None, Point, Box }
         public enum CubeMapFace { PositiveX, PositiveY, PositiveZ, NegativeX, NegativeY, NegativeZ }
         public enum TextureFilter { None, Point, Linear, Anisotropic }
         public enum DeclarationType { Float2, Float3, Color }
@@ -586,71 +464,6 @@ namespace SlimDX
     }
     #endregion
 
-    #region Direct3D init
-    namespace Direct3D9
-    {
-        public enum DeviceType { Reference, Hardware }
-        public enum CreateFlags { SoftwareVertexProcessing, HardwareVertexProcessing }
-        public enum DeviceCaps { HWTransformAndLight }
-
-        public class Direct3D : ComObject
-        {
-            public Capabilities GetDeviceCaps(int adapter, DeviceType type) { return null; }
-            public bool CheckDeviceMultisampleType(int adapter, DeviceType type, Format format, bool windowed, MultisampleType multisample) { return true; }
-
-            public Adapter[] Adapters = new Adapter[1];
-        }
-
-        public class AdapterDetails
-        {
-            public string Description { get; private set; }
-        }
-
-        public class DisplayMode
-        {
-            public Format Format { get; private set; }
-        }
-
-        public class Adapter
-        {
-            public AdapterDetails Details { get; private set; }
-            public DisplayMode CurrentDisplayMode { get; private set; }
-        }
-
-        public class ShaderVersion
-        {
-            public int Major;
-        }
-
-        public class Capabilities
-        {
-            public float MaxAnisotropy { get; }
-            public DeviceCaps DeviceCaps { get; }
-            public ShaderVersion PixelShaderVersion { get; }
-        }
-
-        public class Result
-        {
-            public bool IsSuccess { get; set; }
-            public string Name { get; set; }
-        }
-
-        public class PresentParameters
-        {
-            public bool Windowed { get; set; }
-            public SwapEffect SwapEffect { private get; set; }
-            public int BackBufferCount { private get; set; }
-            public Format BackBufferFormat { private get; set; }
-            public int BackBufferWidth { private get; set; }
-            public int BackBufferHeight { private get; set; }
-            public bool EnableAutoDepthStencil { private get; set; }
-            public Format AutoDepthStencilFormat { private get; set; }
-            public MultisampleType Multisample { private get; set; }
-            public PresentInterval PresentationInterval { private get; set; }
-        }
-    }
-    #endregion
-
     #region DirectInput mouse handling
     namespace DirectInput
     {
@@ -707,47 +520,12 @@ namespace SlimDX
     }
     #endregion
 
-    #region COM infrastructure
-    public class ComObject
-    {
-        public object Tag { get; set; }
-        public string CreationSource { get; set; }
-        public void Dispose() { }
-    }
-
-    public class ObjectTable
-    {
-        public static System.Collections.Generic.List<ComObject> Objects = new System.Collections.Generic.List<ComObject>();
-    }
-    #endregion
-
     #region Exceptions
-    public class SlimDXException : ApplicationException
-    {
-    }
-
-    namespace Direct3D9
-    {
-        public class Direct3D9NotFoundException : SlimDXException
-        {
-        }
-
-        public class Direct3DX9NotFoundException : SlimDXException
-        {
-        }
-    }
-
     namespace DirectInput
     {
-        public class DirectInputException : SlimDXException
+        public class DirectInputException : ApplicationException
         {
         }
     }
     #endregion
-
-    #region Junk
-    namespace Direct3D10_1
-    {
-    }
-    #endregion
 }
diff --git a/Source/Core/VisualModes/VisualSector.cs b/Source/Core/VisualModes/VisualSector.cs
index 307aca7bb..dc29185a6 100755
--- a/Source/Core/VisualModes/VisualSector.cs
+++ b/Source/Core/VisualModes/VisualSector.cs
@@ -139,8 +139,7 @@ namespace CodeImp.DoomBuilder.VisualModes
 			if(numverts > 0)
 			{
 				// Make a new buffer
-				geobuffer = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * numverts,
-											 Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
+				geobuffer = new VertexBuffer(WorldVertex.Stride * numverts, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
 
 				// Fill the buffer
 				DataStream bufferstream = geobuffer.Lock(0, WorldVertex.Stride * numverts, LockFlags.Discard);
diff --git a/Source/Core/VisualModes/VisualThing.cs b/Source/Core/VisualModes/VisualThing.cs
index 782cef556..26601e7ca 100755
--- a/Source/Core/VisualModes/VisualThing.cs
+++ b/Source/Core/VisualModes/VisualThing.cs
@@ -527,8 +527,7 @@ namespace CodeImp.DoomBuilder.VisualModes
 					for(int i = 0; i < vertices.Length; i++)
 					{
 						// Make a new buffer
-						geobuffers[i] = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * vertices[i].Length,
-													 Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
+						geobuffers[i] = new VertexBuffer(WorldVertex.Stride * vertices[i].Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
 
 						// Fill the buffer
 						DataStream bufferstream = geobuffers[i].Lock(0, WorldVertex.Stride * vertices[i].Length, LockFlags.Discard);
@@ -618,7 +617,7 @@ namespace CodeImp.DoomBuilder.VisualModes
 				// Create buffer
 				WorldVertex[] cv = cageverts.ToArray();
 				cagelength = cv.Length / 2;
-				cagebuffer = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * cv.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
+				cagebuffer = new VertexBuffer(WorldVertex.Stride * cv.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
 				cagebuffer.Lock(0, WorldVertex.Stride * cv.Length, LockFlags.None).WriteRange(cv);
 				cagebuffer.Unlock();
 
diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs
index 290c2366a..63d23ecba 100755
--- a/Source/Core/Windows/MainForm.cs
+++ b/Source/Core/Windows/MainForm.cs
@@ -1060,9 +1060,6 @@ namespace CodeImp.DoomBuilder.Windows
 				// Display was resized?
 				if(displayresized)
 				{
-					// Reset graphics to match changes
-					General.Map.Graphics.Reset();
-
 					//mxd. Aspect ratio may've been changed
 					General.Map.CRenderer3D.CreateProjection();
 				}
-- 
GitLab