diff --git a/build/engine/shaders/terrax/geom2d.ps b/build/engine/shaders/terrax/geom2d.ps
new file mode 100644
index 0000000000000000000000000000000000000000..56cb608a6a9507794a1075cf248d83c51b777ac7
--- /dev/null
+++ b/build/engine/shaders/terrax/geom2d.ps
@@ -0,0 +1,16 @@
+
+/*
+gbuffer.ps
+
+*/
+
+// #include <struct.h>
+// #include <mtrl.h>
+// #include <const.h>
+
+//##########################################################################
+
+float4 main(): SV_TARGET
+{
+	return(float4(0.5f, 0.0f, 0.0f, 1.0f));
+}
diff --git a/build/engine/shaders/terrax/terrax_colored.ps b/build/engine/shaders/terrax/terrax_colored.ps
index 6b321dbb0c64e059512267ffd2e7886f0470bacc..c127169ff924cb3e9bc973c2a6ca4cb5212d529f 100644
--- a/build/engine/shaders/terrax/terrax_colored.ps
+++ b/build/engine/shaders/terrax/terrax_colored.ps
@@ -3,7 +3,7 @@
 terrax_colored.ps
 */
 
-#include <../struct.h>
+#include <struct.h>
 
 //##########################################################################
 
diff --git a/build/engine/shaders/terrax/terrax_textured.ps b/build/engine/shaders/terrax/terrax_textured.ps
index ce2ac9c26c5623bee843932b7d52523beb524fa1..e4473967ccb2456fec800b568583b8c02af449ee 100644
--- a/build/engine/shaders/terrax/terrax_textured.ps
+++ b/build/engine/shaders/terrax/terrax_textured.ps
@@ -3,7 +3,7 @@
 terrax_textured.ps
 */
 
-#include <../struct.h>
+#include <struct.h>
 
 //##########################################################################
 
diff --git a/source/anim/Renderable.cpp b/source/anim/Renderable.cpp
index 0529e4c3b8eb9bd1770e4f1772236fe115268b7e..37eb7b005c925e4d33692d0965ab8266bf65bea4 100644
--- a/source/anim/Renderable.cpp
+++ b/source/anim/Renderable.cpp
@@ -52,6 +52,7 @@ void XMETHODCALLTYPE CRenderable::renderStage(X_RENDER_STAGE stage, IXRenderable
 	case XRS_EDITOR_2D:
 		m_pAnimatedModelProvider->render(pVis);
 		m_pDynamicModelProvider->render(false, pVis);
+		m_pDynamicModelProvider->render(true, pVis);
 		break;
 	}
 }
diff --git a/source/mtrl/MaterialSystem.cpp b/source/mtrl/MaterialSystem.cpp
index c16d6ffd15930f83ccceef4d30098e5f89a93da6..88a866c9eea247ecc0f21070e699d72f3f17cfb1 100644
--- a/source/mtrl/MaterialSystem.cpp
+++ b/source/mtrl/MaterialSystem.cpp
@@ -340,7 +340,7 @@ void XMETHODCALLTYPE CMaterialSystem::bindMaterial(IXMaterial *pMaterial)
 			return;
 		}
 
-		MaterialVariantVS *pVS = &m_pCurrentRP->aPassVariants[m_uCurrentRPvariant].aVertexShaders[m_pCurrentVS->uID];
+		MaterialVariantVS *pVS = &m_pCurrentRP->aPassFormats[m_pCurrentVS->pVertexFormat->uID].aPassVariants[m_uCurrentRPvariant].aVertexShaders[m_pCurrentVS->uID];
 		ID idShaderSet = -1;
 		if(m_pCurrentGS)
 		{
@@ -584,6 +584,7 @@ XVertexFormatHandler* XMETHODCALLTYPE CMaterialSystem::registerVertexFormat(cons
 	}
 
 	VertexFormatData &format = m_mVertexFormats[szName];
+	format.uID = m_mVertexFormats.Size() - 1;
 
 	XVertexOutputElement *pTmp = pDecl;
 	int iCount = 0;
@@ -603,6 +604,8 @@ XVertexFormatHandler* XMETHODCALLTYPE CMaterialSystem::registerVertexFormat(cons
 		++pTmp;
 	}
 
+	m_isMateriallesRenderPassDirty = true;
+
 	updateReferences();
 
 	return(&format);
@@ -647,6 +650,8 @@ XVertexShaderHandler* XMETHODCALLTYPE CMaterialSystem::registerVertexShader(XVer
 	vsData->uID = pVertexFormatData->aVS.size();
 	pVertexFormatData->aVS.push_back(vsData);
 
+	m_isMateriallesRenderPassDirty = true;
+
 	updateReferences();
 
 	return(vsData);
@@ -682,6 +687,8 @@ XGeometryShaderHandler* XMETHODCALLTYPE CMaterialSystem::registerGeometryShader(
 	gsData->uID = m_aGeometryShaders.size();
 	m_aGeometryShaders.push_back(gsData);
 
+	m_isMateriallesRenderPassDirty = true;
+
 	updateReferences();
 
 	return(gsData);
@@ -704,7 +711,12 @@ XRenderPassHandler* XMETHODCALLTYPE CMaterialSystem::registerRenderPass(const ch
 	pass.szName = strdup(szName);
 	pass.szShaderFile = strdup(szShaderFile);
 	pass.bSkipMaterialShader = bSkipMaterialShader;
-	assert(!bSkipMaterialShader && "bSkipMaterialShader is not currently supported!");
+	//assert(!bSkipMaterialShader && "bSkipMaterialShader is not currently supported!");
+
+	if(bSkipMaterialShader)
+	{
+		m_isMateriallesRenderPassDirty = true;
+	}
 
 	while(pTextures && pTextures->szName)
 	{
@@ -892,6 +904,8 @@ XMaterialShaderHandler* XMETHODCALLTYPE CMaterialSystem::registerMaterialShader(
 		pPass->pRenderPass = (RenderPass*)pPasses->pRenderPass;
 		pPass->isDirty = true;
 
+		assert(!pPass->pRenderPass->bSkipMaterialShader && "Cannot use renderpass which is set to ignore material shaders!");
+
 		pPass->szShaderFile = strdups(pPasses->szShaderFile);
 		pPass->szEntryPoint = strdups(pPasses->szEntryPoint);
 
@@ -1385,66 +1399,59 @@ void CMaterialSystem::updateReferences()
 		}
 	}
 
-#if 0
-	for(AssotiativeArray<String, RenderPass>::Iterator i = m_mRenderPasses.begin(); i; i++)
+#if 1
+	if(m_isMateriallesRenderPassDirty)
 	{
-		RenderPass *pRP = i.second;
-		if(!pRP->bSkipMaterialShader)
-		{
-			continue;
-		}
-
-
-		String sVSOstruct;
-		for(UINT k = 0, kl = pShader->pVertexFormat->aDecl.size(); k < kl; ++k)
+		for(AssotiativeArray<String, RenderPass>::Iterator i = m_mRenderPasses.begin(); i; i++)
 		{
-			XVertexOutputElement *el = &pShader->pVertexFormat->aDecl[k];
-			if(k != 0)
+			RenderPass *pRP = i.second;
+			if(!pRP->bSkipMaterialShader)
 			{
-				sVSOstruct += "; ";
+				continue;
 			}
-			sVSOstruct += String(getHLSLType(el->type)) + " " + el->szName + ": " + getHLSLSemantic(el->usage);
-		}
 
 
-		Array<GXMacro> aVariantDefines = pRP->aDefines;
-		aVariantDefines.push_back({"XMAT_PS_STRUCT()", sVSOstruct.c_str()});
-		aVariantDefines.push_back({"XMAT_MS_TEXTURES()", ""});
-		aVariantDefines.push_back({"XMAT_MS_SAMPLERS()", ""});
-		aVariantDefines.push_back({"XMATERIAL_OUTPUT_STRUCT()", ""});
-		
+			Array<GXMacro> aVariantDefines = pRP->aDefines;
 
-		UINT uOldSize = aVariantDefines.size();
+			UINT uOldSize = aVariantDefines.size();
 
-		pRP->aPassVariants.clearFast();
-		for(UINT uPassVariant = 0, uPassVariantl = pRP->aVariants.size(); uPassVariant < uPassVariantl; ++uPassVariant)
-		{
-			aVariantDefines.resizeFast(uOldSize);
-
-			auto &aPassVariants = pPass->pRenderPass->aVariants[uPassVariant];
-			for(UINT m = 0, ml = aPassVariants.size(); m < ml; ++m)
+			for(AssotiativeArray<String, VertexFormatData>::Iterator i = m_mVertexFormats.begin(); i; i++)
 			{
-				aVariantDefines.push_back(aPassVariants[m]);
-			}
+				VertexFormatData *pFormat = i.second;
+				pRP->aPassFormats[pFormat->uID].aPassVariants.clearFast();
+				for(UINT uPassVariant = 0, uPassVariantl = pRP->aVariants.size(); uPassVariant < uPassVariantl; ++uPassVariant)
+				{
+					aVariantDefines.resizeFast(uOldSize);
 
-			aVariantDefines.push_back({NULL, NULL});
+					auto &aPassVariants = pRP->aVariants[uPassVariant];
+					for(UINT m = 0, ml = aPassVariants.size(); m < ml; ++m)
+					{
+						aVariantDefines.push_back(aPassVariants[m]);
+					}
 
-			ID idShader = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, pMetaPass->szShaderFile, NULL, &aVariantDefines[0]);
-			pVariant->aPassVariants[uPassVariant].idShader = idShader;
+					aVariantDefines.push_back({NULL, NULL});
 
+					ID idShader = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, pRP->szShaderFile, NULL, &aVariantDefines[0]);
+					pRP->aPassFormats[pFormat->uID].aPassVariants[uPassVariant].idShader = idShader;
 
-			pVariant->aPassVariants[uPassVariant].aVertexShaders.clearFast();
-			for(UINT j = 0, jl = pShader->pVertexFormat->aVS.size(); j < jl; ++j)
-			{
-				VertexShaderData *pVS = pShader->pVertexFormat->aVS[j];
-				MaterialVariantVS &vs = pVariant->aPassVariants[uPassVariant].aVertexShaders[j];
-				vs.idSet = SGCore_ShaderCreateKit(pVS->idShader, idShader);
 
-				for(UINT k = 0, kl = pShader->pVertexFormat->aGS.size(); k < kl; ++k)
-				{
-					GeometryShaderData *pGS = pShader->pVertexFormat->aGS[k];
-					vs.aGeometryShaders[k] = SGCore_ShaderCreateKit(pVS->idShader, idShader, pGS->idShader);
+					pRP->aPassFormats[pFormat->uID].aPassVariants[uPassVariant].aVertexShaders.clearFast();
+
+
+					for(UINT j = 0, jl = pFormat->aVS.size(); j < jl; ++j)
+					{
+						VertexShaderData *pVS = pFormat->aVS[j];
+						MaterialVariantVS &vs = pRP->aPassFormats[pFormat->uID].aPassVariants[uPassVariant].aVertexShaders[j];
+						vs.idSet = SGCore_ShaderCreateKit(pVS->idShader, idShader);
+
+						for(UINT k = 0, kl = pFormat->aGS.size(); k < kl; ++k)
+						{
+							GeometryShaderData *pGS = pFormat->aGS[k];
+							vs.aGeometryShaders[k] = SGCore_ShaderCreateKit(pVS->idShader, idShader, pGS->idShader);
+						}
+					}
 				}
+
 			}
 		}
 	}
diff --git a/source/mtrl/MaterialSystem.h b/source/mtrl/MaterialSystem.h
index b315a3c2b8ac01403790be26fa8294cf8eb31c1a..0eedd93413ec96eec4077dc6971d9ccca3acbf9a 100644
--- a/source/mtrl/MaterialSystem.h
+++ b/source/mtrl/MaterialSystem.h
@@ -390,6 +390,7 @@ protected:
 
 	struct VertexFormatData: public XVertexFormatHandler
 	{
+		UINT uID;
 		Array<XVertexOutputElement> aDecl;
 		Array<VertexShaderData*> aVS;
 		Array<GeometryShaderData*> aGS;
@@ -408,6 +409,11 @@ protected:
 		Array<MaterialVariantVS> aVertexShaders;
 	};
 
+	struct RenderPassVertexFormat
+	{
+		Array<MaterialVariantPass> aPassVariants;
+	};
+
 	struct RenderPass: public XRenderPassHandler
 	{
 		const char *szName;
@@ -418,7 +424,7 @@ protected:
 		Array<GXMacro> aDefines;
 
 		bool bSkipMaterialShader;
-		Array<MaterialVariantPass> aPassVariants;
+		Array<RenderPassVertexFormat> aPassFormats; // used only if bSkipMaterialShader
 
 		Array<Array<GXMacro>> aVariants;
 	};
@@ -508,7 +514,7 @@ protected:
 	Array<GeometryShader*> m_aGeometryShaders;
 	MemAlloc<GeometryShaderData> m_aGeometryShadersData;
 
-
+	bool m_isMateriallesRenderPassDirty = false;
 	AssotiativeArray<String, RenderPass> m_mRenderPasses;
 	AssotiativeArray<String, MaterialShader> m_mMaterialShaders;
 
diff --git a/source/terrax/terrax.cpp b/source/terrax/terrax.cpp
index 18f840b59f737aec06f4c141c8084517e515b5db..a73832effd4129bf0cce73bbcf45588ed7091ddf 100644
--- a/source/terrax/terrax.cpp
+++ b/source/terrax/terrax.cpp
@@ -220,8 +220,8 @@ public:
 		m_pMaterialSystem = (IXMaterialSystem*)pPluginManager->getInterface(IXMATERIALSYSTEM_GUID);
 
 		{
-			m_pRenderPassGeometry2D = m_pMaterialSystem->getRenderPass("xGBuffer");
-			// m_pRenderPassGeometry2D = m_pMaterialSystem->registerRenderPass("xEditor2D", "terrax/geom2d.ps", NULL, NULL, NULL, NULL, true);
+			//m_pRenderPassGeometry2D = m_pMaterialSystem->getRenderPass("xGBuffer");
+			m_pRenderPassGeometry2D = m_pMaterialSystem->registerRenderPass("xEditor2D", "terrax/geom2d.ps", NULL, NULL, NULL, NULL, true);
 		}
 	}
 	~CRenderPipeline()