diff --git a/indra/newview/lldrawpoolpbropaque.cpp b/indra/newview/lldrawpoolpbropaque.cpp
index 2478aa0cff1a5a740302be2b6056b612536820f5..f23d2d04a8e19b0960e7b117d5af79a05eb873cf 100644
--- a/indra/newview/lldrawpoolpbropaque.cpp
+++ b/indra/newview/lldrawpoolpbropaque.cpp
@@ -73,6 +73,12 @@ void LLDrawPoolPBROpaque::renderDeferred(S32 pass)
          return;
     }
 
+    const U32 type = LLPipeline::RENDER_TYPE_PASS_PBR_OPAQUE;
+    if (!gPipeline.hasRenderType(type))
+    {
+        return;
+    }
+
     gGL.flush();
 
     LLGLDisable blend(GL_BLEND);
@@ -86,7 +92,37 @@ void LLDrawPoolPBROpaque::renderDeferred(S32 pass)
 
     // TODO: handle under water?
     // if (LLPipeline::sUnderWaterRender)
-    // PASS_SIMPLE or PASS_MATERIAL
-    //pushBatches(LLRenderPass::PASS_SIMPLE, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
-}
+    LLCullResult::drawinfo_iterator begin = gPipeline.beginRenderMap(type);
+    LLCullResult::drawinfo_iterator end = gPipeline.endRenderMap(type);
+
+    for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i)
+    {
+        LLDrawInfo& params = **i;
+
+//gGL.getTexUnit(0)->activate();
 
+        if (mShaderLevel > 1)
+        {
+            if (params.mTexture.notNull())
+            {
+                gGL.getTexUnit(-1)->bindFast(params.mTexture); // diffuse
+            }
+        }
+
+        if (params.mNormalMap)
+        {
+            gDeferredPBROpaqueProgram.bindTexture(LLShaderMgr::BUMP_MAP, params.mNormalMap);
+        }
+
+        if (params.mSpecularMap)
+        {
+            gDeferredPBROpaqueProgram.bindTexture(LLShaderMgr::SPECULAR_MAP, params.mSpecularMap); // Packed Occlusion Roughness Metal
+        }
+
+        // Similar to LLDrawPooLMaterials::pushMaterialsBatch(params, getVertexDataMask(), false);
+
+        LLRenderPass::applyModelMatrix(params);
+        params.mVertexBuffer->setBufferFast(getVertexDataMask());
+        params.mVertexBuffer->drawRangeFast(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
+    }
+}
diff --git a/indra/newview/lldrawpoolpbropaque.h b/indra/newview/lldrawpoolpbropaque.h
index ada806a3bf2bec8f41efc61d8adddc9b185f704e..413bcb800cd58ec85a21f9400df7b2a0e88b2702 100644
--- a/indra/newview/lldrawpoolpbropaque.h
+++ b/indra/newview/lldrawpoolpbropaque.h
@@ -34,11 +34,14 @@ class LLDrawPoolPBROpaque : public LLRenderPass
 public:
     enum
     {
-       VERTEX_DATA_MASK = 0
-                        | LLVertexBuffer::MAP_VERTEX
-                        | LLVertexBuffer::MAP_NORMAL
-                        | LLVertexBuffer::MAP_TEXCOORD0
-                        | LLVertexBuffer::MAP_COLOR
+        // See: DEFERRED_VB_MASK
+        VERTEX_DATA_MASK = 0
+                         | LLVertexBuffer::MAP_VERTEX
+                         | LLVertexBuffer::MAP_NORMAL
+                         | LLVertexBuffer::MAP_TEXCOORD0 // Diffuse
+                         | LLVertexBuffer::MAP_TEXCOORD1 // Normal
+                         | LLVertexBuffer::MAP_TEXCOORD2 // Spec <-- ORM Occlusion Roughness Metal
+                         | LLVertexBuffer::MAP_COLOR
     };
     virtual U32 getVertexDataMask() { return VERTEX_DATA_MASK; }
 
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index c041d2470cacf846331505daf3ab40927998628f..d0f7f70c81ec74579edff7c282a53f2ef1606213 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -1626,9 +1626,9 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
             gDeferredPBROpaqueProgram.mShaderFiles.clear();
             gDeferredPBROpaqueProgram.mShaderFiles.push_back(make_pair("deferred/pbropaqueV.glsl", GL_VERTEX_SHADER_ARB));
             gDeferredPBROpaqueProgram.mShaderFiles.push_back(make_pair("deferred/pbropaqueF.glsl", GL_FRAGMENT_SHADER_ARB));
-            gDeferredPBROpaqueProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
             gDeferredPBROpaqueProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
-            //gDeferredPBROpaqueProgram.addPermutation("HAS_NORMAL_MAP", "1");
+            gDeferredPBROpaqueProgram.addPermutation("HAS_NORMAL_MAP", "1");
+            gDeferredPBROpaqueProgram.addPermutation("HAS_SPECULAR_MAP", "1");
             success = gDeferredPBROpaqueProgram.createShader(NULL, NULL);
             llassert(success);
         }