diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js
index cca97b7184..940eeda02d 100755
--- a/examples/utilities/tools/renderEngineDebug.js
+++ b/examples/utilities/tools/renderEngineDebug.js
@@ -66,6 +66,12 @@ var overlaysCounter = new CounterWidget(panel, "Overlays",
 var showDisplayStatusFlag = 1;
 var showNetworkStatusFlag = 2;
 
+panel.newCheckbox("Debug deferred buffer",
+    function(value) { Scene.setEngineDisplayDebugDeferredBuffer(value > 0); },
+    function() { return Scene.doEngineDisplayDebugDeferredBuffer() > 0; },
+    function(value) { return value > 0; }
+);
+
 panel.newCheckbox("Display status",
     function(value) { Scene.setEngineDisplayItemStatus(value ?
                                                        Scene.doEngineDisplayItemStatus() | showDisplayStatusFlag :
diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index cc9a47f793..8fa772e316 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -3621,7 +3621,9 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se
         renderContext._maxDrawnOpaqueItems = sceneInterface->getEngineMaxDrawnOpaqueItems();
         renderContext._maxDrawnTransparentItems = sceneInterface->getEngineMaxDrawnTransparentItems();
         renderContext._maxDrawnOverlay3DItems = sceneInterface->getEngineMaxDrawnOverlay3DItems();
-
+        
+        renderContext._drawDebugDeferredBuffer = sceneInterface->doEngineDisplayDebugDeferredBuffer();
+        
         renderContext._drawItemStatus = sceneInterface->doEngineDisplayItemStatus();
         if (Menu::getInstance()->isOptionChecked(MenuOption::PhysicsShowOwned)) {
             renderContext._drawItemStatus |= render::showNetworkStatusFlag;
diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp
index e1c31f943e..efb78c888c 100644
--- a/libraries/render-utils/src/DebugDeferredBuffer.cpp
+++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp
@@ -17,6 +17,7 @@
 #include <ViewFrustum.h>
 
 #include "GeometryCache.h"
+#include "FramebufferCache.h"
 
 #include "debug_deferred_buffer_vert.h"
 #include "debug_deferred_buffer_frag.h"
@@ -33,16 +34,8 @@ const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline() {
         gpu::Shader::BindingSet slotBindings;
         gpu::Shader::makeProgram(*program, slotBindings);
         
-        auto state = std::make_shared<gpu::State>();
-        
-        state->setDepthTest(false, false, gpu::LESS_EQUAL);
-        
-        // Blend on transparent
-        state->setBlendFunction(true,
-                                gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA);
-        
         // Good to go add the brand new pipeline
-        _pipeline.reset(gpu::Pipeline::create(program, state));
+        _pipeline.reset(gpu::Pipeline::create(program, std::make_shared<gpu::State>()));
     }
     return _pipeline;
 }
@@ -53,6 +46,9 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren
     assert(renderContext->args->_viewFrustum);
     RenderArgs* args = renderContext->args;
     gpu::doInBatch(args->_context, [&](gpu::Batch& batch) {
+        auto geometryBuffer = DependencyManager::get<GeometryCache>();
+        auto framebufferCache = DependencyManager::get<FramebufferCache>();
+        
         
         glm::mat4 projMat;
         Transform viewMat;
@@ -64,9 +60,11 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren
         
         batch.setPipeline(getPipeline());
         
+        batch.setResourceTexture(0, framebufferCache->getPrimaryNormalTexture());
+        
         glm::vec4 color(0.0f, 0.0f, 1.0f, 1.0f);
         glm::vec2 bottomLeft(0.0f, -1.0f);
         glm::vec2 topRight(1.0f, 1.0f);
-        DependencyManager::get<GeometryCache>()->renderQuad(batch, bottomLeft, topRight, color);
+        geometryBuffer->renderQuad(batch, bottomLeft, topRight, color);
     });
 }
\ No newline at end of file
diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp
index 43ddd5b7ae..0f939682c8 100755
--- a/libraries/render-utils/src/RenderDeferredTask.cpp
+++ b/libraries/render-utils/src/RenderDeferredTask.cpp
@@ -114,6 +114,8 @@ RenderDeferredTask::RenderDeferredTask() : Task() {
     _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput())));
     
     _jobs.push_back(Job(new DebugDeferredBuffer::JobModel("DebugDeferredBuffer")));
+    _jobs.back().setEnabled(false);
+    _drawDebugDeferredBufferIndex = _jobs.size() - 1;
     
     // Grab a texture map representing the different status icons and assign that to the drawStatsuJob
     auto iconMapPath = PathUtils::resourcesPath() + "icons/statusIconAtlas.svg";
@@ -154,10 +156,13 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend
         return;
     }
 
+    // Make sure we turn the deferred buffer debug on/off
+    setDrawDebugDeferredBuffer(renderContext->_drawDebugDeferredBuffer);
+    
     // Make sure we turn the displayItemStatus on/off
     setDrawItemStatus(renderContext->_drawItemStatus);
     
-    //Make sure we display hit effect on screen, as desired from a script
+    // Make sure we display hit effect on screen, as desired from a script
     setDrawHitEffect(renderContext->_drawHitEffect);
     
 
diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h
index e75edd20da..09a2761926 100755
--- a/libraries/render-utils/src/RenderDeferredTask.h
+++ b/libraries/render-utils/src/RenderDeferredTask.h
@@ -93,16 +93,23 @@ public:
     ~RenderDeferredTask();
 
     render::Jobs _jobs;
-
+    
+    int _drawDebugDeferredBufferIndex = -1;
     int _drawStatusJobIndex = -1;
     int _drawHitEffectJobIndex = -1;
-
+    
+    void setDrawDebugDeferredBuffer(int draw) {
+        if (_drawDebugDeferredBufferIndex >= 0) {
+            _jobs[_drawDebugDeferredBufferIndex].setEnabled(draw > 0);
+        }
+    }
+    bool doDrawDebugDeferredBuffer() const { if (_drawDebugDeferredBufferIndex >= 0) { return _jobs[_drawDebugDeferredBufferIndex].isEnabled(); } else { return false; } }
+    
     void setDrawItemStatus(int draw) {
         if (_drawStatusJobIndex >= 0) {
             _jobs[_drawStatusJobIndex].setEnabled(draw > 0);
         }
     }
-
     bool doDrawItemStatus() const { if (_drawStatusJobIndex >= 0) { return _jobs[_drawStatusJobIndex].isEnabled(); } else { return false; } }
     
     void setDrawHitEffect(bool draw) { if (_drawHitEffectJobIndex >= 0) { _jobs[_drawHitEffectJobIndex].setEnabled(draw); } }
diff --git a/libraries/render-utils/src/debug_deferred_buffer.slf b/libraries/render-utils/src/debug_deferred_buffer.slf
index c33773aa40..212a51c1ed 100644
--- a/libraries/render-utils/src/debug_deferred_buffer.slf
+++ b/libraries/render-utils/src/debug_deferred_buffer.slf
@@ -12,10 +12,11 @@
 //  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
 //
 
-<@include DeferredBufferWrite.slh@>
+<@include DeferredBuffer.slh@>
 
+in vec2 uv;
 out vec4 outFragColor;
 
 void main(void) {
-    outFragColor = vec4(0.0, 0.0, 1.0, 1.0);
+    outFragColor = texture(normalMap, uv);
 }
\ No newline at end of file
diff --git a/libraries/render-utils/src/debug_deferred_buffer.slv b/libraries/render-utils/src/debug_deferred_buffer.slv
index b1b7b18f86..85ff2b651d 100644
--- a/libraries/render-utils/src/debug_deferred_buffer.slv
+++ b/libraries/render-utils/src/debug_deferred_buffer.slv
@@ -14,6 +14,9 @@
 
 <@include gpu/Inputs.slh@>
 
+out vec2 uv;
+
 void main(void) {
+    uv = (inPosition.xy + 1.0) * 0.5;
     gl_Position = inPosition;
 }
\ No newline at end of file
diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h
index 7c11246cff..ab56d68291 100644
--- a/libraries/render/src/render/Engine.h
+++ b/libraries/render/src/render/Engine.h
@@ -53,6 +53,7 @@ public:
     int _numDrawnOverlay3DItems = 0;
     int _maxDrawnOverlay3DItems = -1;
 
+    int _drawDebugDeferredBuffer = 0;
     int _drawItemStatus = 0;
     bool _drawHitEffect = false;
 
diff --git a/libraries/script-engine/src/SceneScriptingInterface.h b/libraries/script-engine/src/SceneScriptingInterface.h
index 6be0ce44a8..eac35ad5bb 100644
--- a/libraries/script-engine/src/SceneScriptingInterface.h
+++ b/libraries/script-engine/src/SceneScriptingInterface.h
@@ -106,7 +106,10 @@ public:
     Q_INVOKABLE int getEngineMaxDrawnTransparentItems() { return _maxDrawnTransparentItems; }
     Q_INVOKABLE void setEngineMaxDrawnOverlay3DItems(int count) { _maxDrawnOverlay3DItems = count; }
     Q_INVOKABLE int getEngineMaxDrawnOverlay3DItems() { return _maxDrawnOverlay3DItems; }
-
+    
+    Q_INVOKABLE void setEngineDisplayDebugDeferredBuffer(int display) { _drawDebugDeferredBuffer = display; }
+    Q_INVOKABLE int doEngineDisplayDebugDeferredBuffer() { return _drawDebugDeferredBuffer; }
+    
     Q_INVOKABLE void setEngineDisplayItemStatus(int display) { _drawItemStatus = display; }
     Q_INVOKABLE int doEngineDisplayItemStatus() { return _drawItemStatus; }
     
@@ -142,7 +145,8 @@ protected:
     int _maxDrawnOpaqueItems = -1;
     int _maxDrawnTransparentItems = -1;
     int _maxDrawnOverlay3DItems = -1;
-
+    
+    int _drawDebugDeferredBuffer = 0;
     int _drawItemStatus = 0;
     
     bool _drawHitEffect = false;