diff --git a/RefreshCS.csproj b/RefreshCS.csproj
index 88078d5..b524dd6 100644
--- a/RefreshCS.csproj
+++ b/RefreshCS.csproj
@@ -4,7 +4,6 @@
     <TargetFramework>netstandard2.0</TargetFramework>
     <RootNamespace>RefreshCS</RootNamespace>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <Platforms>x64</Platforms>
   </PropertyGroup>
 
 	<ItemGroup>
diff --git a/src/Refresh.cs b/src/Refresh.cs
index ccaefef..01c1db3 100644
--- a/src/Refresh.cs
+++ b/src/Refresh.cs
@@ -35,8 +35,8 @@ namespace RefreshCS
 
 		/* Version */
 
-		public const uint REFRESH_MAJOR_VERSION = 1;
-		public const uint REFRESH_MINOR_VERSION = 15;
+		public const uint REFRESH_MAJOR_VERSION = 2;
+		public const uint REFRESH_MINOR_VERSION = 0;
 		public const uint REFRESH_PATCH_VERSION = 0;
 
 		public const uint REFRESH_COMPILED_VERSION = (
@@ -308,6 +308,12 @@ namespace RefreshCS
 			IntOpaqueWhite
 		}
 
+		public enum SetDataOptions
+		{
+			Discard,
+			Overwrite
+		}
+
 		public enum Backend
 		{
 			DontCare,
@@ -358,10 +364,31 @@ namespace RefreshCS
 		public struct TextureSlice
 		{
 			public IntPtr texture;
-			public Rect rectangle;
-			public uint depth;
-			public uint layer;
-			public uint level;
+			public uint mipLevel;
+			public uint baseLayer;
+			public uint layerCount;
+			public uint x;
+			public uint y;
+			public uint z;
+			public uint w;
+			public uint h;
+			public uint d;
+		}
+
+		[StructLayout(LayoutKind.Sequential)]
+		public struct BufferImageCopy
+		{
+			public uint bufferOffset;
+			public uint bufferStride;
+			public uint bufferImageHeight;
+		}
+
+		[StructLayout(LayoutKind.Sequential)]
+		public struct BufferCopy
+		{
+			public uint srcOffset;
+			public uint dstOffset;
+			public uint size;
 		}
 
 		[StructLayout(LayoutKind.Sequential)]
@@ -469,7 +496,7 @@ namespace RefreshCS
 			public IntPtr shaderModule;
 			[MarshalAs(UnmanagedType.LPStr)]
 			public string entryPointName;
-			public ulong uniformBufferSize;
+			public uint uniformBufferSize;
 			public uint samplerBindingCount;
 		}
 
@@ -479,7 +506,7 @@ namespace RefreshCS
 			public IntPtr shaderModule;
 			[MarshalAs(UnmanagedType.LPStr)]
 			public string entryPointName;
-			public ulong uniformBufferSize;
+			public uint uniformBufferSize;
 			public uint bufferBindingCount;
 			public uint imageBindingCount;
 		}
@@ -511,8 +538,7 @@ namespace RefreshCS
 			public CompareOp compareOp;
 			public byte depthBoundsTestEnable;
 			public byte stencilTestEnable;
-			public StencilOpState frontStencilState;
-			public StencilOpState backStencilState;
+			public StencilOpState stencilState;
 			public float minDepthBounds;
 			public float maxDepthBounds;
 		}
@@ -599,64 +625,7 @@ namespace RefreshCS
 		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
 		public static extern void Refresh_DestroyDevice(IntPtr device);
 
-		/* Drawing */
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_DrawInstancedPrimitives(
-			IntPtr device,
-			IntPtr commandBuffer,
-			uint baseVertex,
-			uint startIndex,
-			uint primitiveCount,
-			uint instanceCount,
-			uint vertexParamOffset,
-			uint fragmentParamOffset
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_DrawIndexedPrimitives(
-			IntPtr device,
-			IntPtr commandBuffer,
-			uint baseVertex,
-			uint startIndex,
-			uint primitiveCount,
-			uint vertexParamOffset,
-			uint fragmentParamOffset
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_DrawPrimitives(
-			IntPtr device,
-			IntPtr commandBuffer,
-			uint vertexStart,
-			uint primitiveCount,
-			uint vertexParamOffset,
-			uint fragmentParamOffset
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_DrawPrimitivesIndirect(
-			IntPtr device,
-			IntPtr commandBuffer,
-			IntPtr buffer,
-			uint offsetInBytes,
-			uint drawCount,
-			uint stride,
-			uint vertexParamOffset,
-			uint fragmentParamOffset
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_DispatchCompute(
-			IntPtr device,
-			IntPtr commandBuffer,
-			uint groupCountX,
-			uint groupCountY,
-			uint groupCountZ,
-			uint computeParamOffset
-		);
-
-		/* Creates */
+		/* State Creation */
 
 		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
 		public static extern IntPtr Refresh_CreateComputePipeline(
@@ -689,100 +658,16 @@ namespace RefreshCS
 		);
 
 		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern IntPtr Refresh_CreateBuffer(
+		public static extern IntPtr Refresh_CreateGpuBuffer(
 			IntPtr device,
 			BufferUsageFlags usageFlags,
 			uint sizeInBytes
 		);
 
-		/* Setters */
-
 		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_SetTextureData(
+		public static extern IntPtr Refresh_CreateCpuBuffer(
 			IntPtr device,
-			IntPtr commandBuffer,
-			in TextureSlice textureSlice,
-			IntPtr data,
-			uint dataLengthInBytes
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_SetTextureDataYUV(
-			IntPtr device,
-			IntPtr commandBuffer,
-			IntPtr y,
-			IntPtr u,
-			IntPtr v,
-			uint yWidth,
-			uint yHeight,
-			uint uvWidth,
-			uint uvHeight,
-			IntPtr yDataPtr,
-			IntPtr uDataPtr,
-			IntPtr vDataPtr,
-			uint yDataLength,
-			uint uvDataLength,
-			uint yStride,
-			uint uvStride
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_CopyTextureToTexture(
-			IntPtr device,
-			IntPtr commandBuffer,
-			in TextureSlice sourceTextureSlice,
-			in TextureSlice destinationTextureSlice,
-			Filter filter
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_CopyTextureToBuffer(
-			IntPtr device,
-			IntPtr commandBuffer,
-			in TextureSlice textureSlice,
-			IntPtr buffer
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_GetBufferData(
-			IntPtr device,
-			IntPtr buffer,
-			IntPtr data,
-			uint dataLengthInBytes
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_SetBufferData(
-			IntPtr device,
-			IntPtr commandBuffer,
-			IntPtr buffer,
-			uint offsetInBytes,
-			IntPtr data,
-			uint dataLengthInBytes
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern uint Refresh_PushVertexShaderUniforms(
-			IntPtr device,
-			IntPtr commandBuffer,
-			IntPtr data,
-			uint dataLengthInBytes
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern uint Refresh_PushFragmentShaderUniforms(
-			IntPtr device,
-			IntPtr commandBuffer,
-			IntPtr data,
-			uint dataLengthInBytes
-		);
-
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern uint Refresh_PushComputeShaderUniforms(
-			IntPtr device,
-			IntPtr commandBuffer,
-			IntPtr data,
-			uint dataLengthInBytes
+			uint sizeInBytes
 		);
 
 		/* Disposal */
@@ -800,7 +685,13 @@ namespace RefreshCS
 		);
 
 		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_QueueDestroyBuffer(
+		public static extern void Refresh_QueueDestroyGpuBuffer(
+			IntPtr device,
+			IntPtr buffer
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_QueueDestroyCpuBuffer(
 			IntPtr device,
 			IntPtr buffer
 		);
@@ -843,12 +734,6 @@ namespace RefreshCS
 			DepthStencilAttachmentInfo* depthStencilAttachmentInfo /* can be NULL */
 		);
 
-		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
-		public static extern void Refresh_EndRenderPass(
-			IntPtr device,
-			IntPtr commandBuffer
-		);
-
 		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
 		public static extern void Refresh_BindGraphicsPipeline(
 			IntPtr device,
@@ -905,6 +790,73 @@ namespace RefreshCS
 			IntPtr pSamplers
 		);
 
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_PushVertexShaderUniforms(
+			IntPtr device,
+			IntPtr commandBuffer,
+			IntPtr data,
+			uint dataLengthInBytes
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_PushFragmentShaderUniforms(
+			IntPtr device,
+			IntPtr commandBuffer,
+			IntPtr data,
+			uint dataLengthInBytes
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_DrawInstancedPrimitives(
+			IntPtr device,
+			IntPtr commandBuffer,
+			uint baseVertex,
+			uint startIndex,
+			uint primitiveCount,
+			uint instanceCount
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_DrawIndexedPrimitives(
+			IntPtr device,
+			IntPtr commandBuffer,
+			uint baseVertex,
+			uint startIndex,
+			uint primitiveCount
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_DrawPrimitives(
+			IntPtr device,
+			IntPtr commandBuffer,
+			uint vertexStart,
+			uint primitiveCount
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_DrawPrimitivesIndirect(
+			IntPtr device,
+			IntPtr commandBuffer,
+			IntPtr buffer,
+			uint offsetInBytes,
+			uint drawCount,
+			uint stride
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_EndRenderPass(
+			IntPtr device,
+			IntPtr commandBuffer
+		);
+
+		/* Compute Pass */
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_BeginComputePass(
+			IntPtr device,
+			IntPtr commandBuffer
+		);
+
 		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
 		public static extern void Refresh_BindComputePipeline(
 			IntPtr device,
@@ -923,7 +875,142 @@ namespace RefreshCS
 		public static extern void Refresh_BindComputeTextures(
 			IntPtr device,
 			IntPtr commandBuffer,
-			IntPtr pTextures
+			IntPtr pTextures,
+			IntPtr pLevels
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_PushComputeShaderUniforms(
+			IntPtr device,
+			IntPtr commandBuffer,
+			IntPtr data,
+			uint dataLengthInBytes
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_DispatchCompute(
+			IntPtr device,
+			IntPtr commandBuffer,
+			uint groupCountX,
+			uint groupCountY,
+			uint groupCountZ
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_EndComputePass(
+			IntPtr device,
+			IntPtr commandBuffer
+		);
+
+		/* CpuBuffer Set/Get */
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern IntPtr Refresh_SetData(
+			IntPtr device,
+			IntPtr data,
+			IntPtr cpuBuffer,
+			in BufferCopy copyParams,
+			SetDataOptions option
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_GetData(
+			IntPtr device,
+			IntPtr cpuBuffer,
+			IntPtr data,
+			in BufferCopy copyParams
+		);
+
+		/* Copy Pass */
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_BeginCopyPass(
+			IntPtr device,
+			IntPtr commandBuffer
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_UploadToTexture(
+			IntPtr device,
+			IntPtr commandBuffer,
+			IntPtr cpuBuffer,
+			in TextureSlice textureSlice,
+			in BufferImageCopy copyParams
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_UploadToBuffer(
+			IntPtr device,
+			IntPtr commandBuffer,
+			IntPtr cpuBuffer,
+			IntPtr gpuBuffer,
+			in BufferCopy copyParams
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_DownloadFromTexture(
+			IntPtr device,
+			IntPtr commandBuffer,
+			in TextureSlice textureSlice,
+			IntPtr cpuBuffer,
+			in BufferImageCopy copyParams
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_DownloadFromBuffer(
+			IntPtr device,
+			IntPtr commandBuffer,
+			IntPtr gpuBuffer,
+			IntPtr cpuBuffer,
+			in BufferCopy copyParams
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_CopyTextureToTexture(
+			IntPtr device,
+			IntPtr commandBuffer,
+			in TextureSlice source,
+			in TextureSlice destination
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_CopyTextureToBuffer(
+			IntPtr device,
+			IntPtr commandBuffer,
+			in TextureSlice textureSlice,
+			IntPtr gpuBuffer,
+			in BufferImageCopy copyParams
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_CopyBufferToTexture(
+			IntPtr device,
+			IntPtr commandBuffer,
+			IntPtr gpuBuffer,
+			in TextureSlice textureSlice,
+			in BufferImageCopy bufferImageCopy
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_CopyBufferToBuffer(
+			IntPtr device,
+			IntPtr commandBuffer,
+			IntPtr source,
+			IntPtr destination,
+			in BufferCopy copyParams
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_GenerateMipmaps(
+			IntPtr device,
+			IntPtr commandBuffer,
+			IntPtr texture
+		);
+
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern void Refresh_EndCopyPass(
+			IntPtr device,
+			IntPtr commandBuffer
 		);
 
 		/* Submission/Presentation */
@@ -1014,6 +1101,15 @@ namespace RefreshCS
 			out int len
 		);
 
+		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
+		public static extern byte Refresh_Image_Info(
+			IntPtr bufferPtr,
+			int bufferLength,
+			out int w,
+			out int h,
+			out int len
+		);
+
 		[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]
 		public static extern void Refresh_Image_Free(IntPtr mem);