diff --git a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp
index 089e181f96..05b2f09932 100644
--- a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp
+++ b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp
@@ -18,6 +18,7 @@
 #include "D3DBase.h"
 #include "Render.h"
 #include "FramebufferManager.h"
+#include "VideoConfig.h"
 
 namespace FBManager
 {
@@ -25,6 +26,10 @@ namespace FBManager
 static LPDIRECT3DTEXTURE9 s_efb_color_texture;
 static LPDIRECT3DSURFACE9 s_efb_color_surface;
 static LPDIRECT3DSURFACE9 s_efb_depth_surface;
+
+static LPDIRECT3DSURFACE9 s_efb_color_OffScreensurface;
+
+
 static D3DFORMAT s_efb_color_surface_Format;
 static D3DFORMAT s_efb_depth_surface_Format;
 #undef CHECK
@@ -32,6 +37,8 @@ static D3DFORMAT s_efb_depth_surface_Format;
 
 LPDIRECT3DSURFACE9 GetEFBColorRTSurface() { return s_efb_color_surface; }
 LPDIRECT3DSURFACE9 GetEFBDepthRTSurface() { return s_efb_depth_surface; }
+LPDIRECT3DSURFACE9 GetEFBColorOffScreenRTSurface() { return s_efb_color_OffScreensurface; }
+
 D3DFORMAT GetEFBDepthRTSurfaceFormat(){return s_efb_depth_surface_Format;}
 D3DFORMAT GetEFBColorRTSurfaceFormat(){return s_efb_color_surface_Format;}
 
@@ -61,29 +68,40 @@ void Create()
 	CHECK(hr);
 
   	hr = s_efb_color_texture->GetSurfaceLevel(0, &s_efb_color_surface);
+	CHECK(hr);	
+	hr = D3D::dev->CreateOffscreenPlainSurface(target_width, target_height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &s_efb_color_OffScreensurface, NULL );
 	CHECK(hr);
-
 	//Select Zbuffer format supported by hadware.
-	s_efb_depth_surface_Format = D3DFMT_D32F_LOCKABLE;
+	if (g_ActiveConfig.bEFBAccessEnable)
+	{
+		s_efb_depth_surface_Format = D3DFMT_D32F_LOCKABLE;
+	}
+	else
+	{
+		s_efb_depth_surface_Format = D3DFMT_D24S8;
+	}
 	hr = D3D::dev->CreateDepthStencilSurface(target_width, target_height, D3DFMT_D32F_LOCKABLE,
-		                                     D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL);
+											 D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL);
 	if (FAILED(hr))
 	{
 		s_efb_depth_surface_Format = D3DFMT_D16_LOCKABLE;
 		hr = D3D::dev->CreateDepthStencilSurface(target_width, target_height, D3DFMT_D16_LOCKABLE,
-		                                     D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL);
+											 D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL);
 		if(FAILED(hr))
 		{
 			s_efb_depth_surface_Format = D3DFMT_D24S8;
 			hr = D3D::dev->CreateDepthStencilSurface(target_width, target_height, D3DFMT_D24S8,
-		                                     D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL);
+											 D3DMULTISAMPLE_NONE, 0, FALSE, &s_efb_depth_surface, NULL);
 		}
-	}
+	}	
 	CHECK(hr);
 }
 
 void Destroy()
 {
+	if(s_efb_color_OffScreensurface)
+		s_efb_color_OffScreensurface->Release();
+
 	if(s_efb_depth_surface)
 		s_efb_depth_surface->Release();
 	s_efb_depth_surface = NULL;
diff --git a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h
index 3fa298c16c..59dbd62604 100644
--- a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h
+++ b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h
@@ -34,6 +34,8 @@ LPDIRECT3DTEXTURE9 GetEFBDepthTexture(const EFBRectangle& sourceRc);
 
 LPDIRECT3DSURFACE9 GetEFBColorRTSurface();
 LPDIRECT3DSURFACE9 GetEFBDepthRTSurface();
+LPDIRECT3DSURFACE9 GetEFBColorOffScreenRTSurface();
+LPDIRECT3DSURFACE9 GetEFBDepthOffScreenRTSurface();
 D3DFORMAT GetEFBDepthRTSurfaceFormat();
 D3DFORMAT GetEFBColorRTSurfaceFormat();
 
diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp
index 801f982e72..7cf3b803d4 100644
--- a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp
+++ b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp
@@ -444,6 +444,10 @@ u32 Renderer::AccessEFB(EFBAccessType type, int x, int y)
 	//Get the working buffer and it's format
 	LPDIRECT3DSURFACE9 pBuffer = (type == PEEK_Z || type == POKE_Z) ? 
 		FBManager::GetEFBDepthRTSurface() : FBManager::GetEFBColorRTSurface();
+	
+	LPDIRECT3DSURFACE9 pOffScreenBuffer = (type == PEEK_Z || type == POKE_Z) ? 
+		FBManager::GetEFBDepthRTSurface() : FBManager::GetEFBColorOffScreenRTSurface();
+
 	D3DLOCKED_RECT drect;
 	
 	D3DFORMAT BufferFormat = (type == PEEK_Z || type == POKE_Z) ? 
@@ -469,10 +473,6 @@ u32 Renderer::AccessEFB(EFBAccessType type, int x, int y)
 	TargetRectangle targetPixelRc = Renderer::ConvertEFBRectangle(efbPixelRc);
 
 
-	// Sample from the center of the target region.
-	int srcX = (targetPixelRc.left + targetPixelRc.right) / 2;
-	int srcY = (targetPixelRc.top + targetPixelRc.bottom) / 2;
-
 	u32 z = 0;
 	float val = 0.0f;
 	HRESULT hr;
@@ -483,7 +483,18 @@ u32 Renderer::AccessEFB(EFBAccessType type, int x, int y)
 	RectToLock.top = targetPixelRc.top;
 	
 	//lock the buffer
-	if((hr = pBuffer->LockRect(&drect, &RectToLock, D3DLOCK_READONLY)) != D3D_OK)
+
+	if(!(type == PEEK_Z || type == POKE_Z))
+	{
+		hr = D3D::dev->StretchRect(pBuffer,&RectToLock,pOffScreenBuffer,&RectToLock, D3DTEXF_NONE);
+		if(FAILED(hr))
+		{
+			PanicAlert("Unable to copy data to mem buffer");
+			return 0;
+		}
+	}
+
+	if((hr = pOffScreenBuffer->LockRect(&drect, &RectToLock, D3DLOCK_READONLY)) != D3D_OK)
 		PanicAlert("ERROR: %s", hr == D3DERR_WASSTILLDRAWING ? "Still drawing" :
 											  hr == D3DERR_INVALIDCALL     ? "Invalid call" : "w00t");