diff --git a/source/anim/AnimatedModelShared.cpp b/source/anim/AnimatedModelShared.cpp
index b145ecf5759aa4222110478733b68193828b559e..5f02b1032888f53eb20b3ee28cb123df4cdc0c45 100644
--- a/source/anim/AnimatedModelShared.cpp
+++ b/source/anim/AnimatedModelShared.cpp
@@ -536,6 +536,8 @@ bool CAnimatedModelShared::init(UINT uResourceCount, IXResourceModelAnimated **p
 
 		if(m_pDevice)
 		{
+			bool useDelayedInit = false;
+
 			m_ppRenderBuffer = new IGXRenderBuffer*[m_uLodCount];
 			m_ppIndexBuffer = new IGXIndexBuffer*[m_uLodCount];
 
@@ -558,10 +560,13 @@ bool CAnimatedModelShared::init(UINT uResourceCount, IXResourceModelAnimated **p
 					m_puTempTotalIndices[i] = aLodIndexCount[i];
 					m_puTempTotalVertices[i] = aLodVertexCount[i];
 
-					m_pProvider->scheduleSharedGPUinit(this);
+					useDelayedInit = true;
 				}
+			}
 
-
+			if(useDelayedInit)
+			{
+				m_pProvider->scheduleSharedGPUinit(this);
 			}
 		}
 			
diff --git a/source/render/RenderPipeline.cpp b/source/render/RenderPipeline.cpp
index 30bbfdd1dc85cde1b8e4c8b3066e931a2c3349da..d64a070ba51315f609299f82b1f44d70c9267b3a 100644
--- a/source/render/RenderPipeline.cpp
+++ b/source/render/RenderPipeline.cpp
@@ -1527,8 +1527,13 @@ void CRenderPipeline::renderPostprocessFinal()
 
 	m_pMaterialSystem->bindRenderPass(m_pRenderPassPostprocess);
 }
-void CRenderPipeline::renderEditor2D()
+void CRenderPipeline::renderEditor2D(IXRenderableVisibility *pVisibility)
 {
+	if(!pVisibility)
+	{
+		pVisibility = m_pMainCameraVisibility;
+	}
+
 	SMMATRIX mVP;
 	Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &mVP);
 	float3 vCamPos;
@@ -1542,7 +1547,7 @@ void CRenderPipeline::renderEditor2D()
 	m_pDevice->getThreadContext()->setPSConstant(m_pCameraShaderData, SCR_OBSERVER_CAMERA);
 	m_pDevice->getThreadContext()->setGSConstant(m_pCameraShaderData, SCR_OBSERVER_CAMERA);
 
-	renderStage(XRS_EDITOR_2D);
+	renderStage(XRS_EDITOR_2D, pVisibility);
 }
 
 IXUI* CRenderPipeline::getXUI()
diff --git a/source/render/RenderPipeline.h b/source/render/RenderPipeline.h
index b1d4480feae105df05deed02ea54432b74fc69fa..090e4ea1eb082dd96d7d23cdc43acea1af090b88 100644
--- a/source/render/RenderPipeline.h
+++ b/source/render/RenderPipeline.h
@@ -40,7 +40,7 @@ protected:
 	void renderPostprocessMain() override;
 	void renderTransparent() override;
 	void renderPostprocessFinal() override;
-	void renderEditor2D() override;
+	void renderEditor2D(IXRenderableVisibility *pVisibility = NULL) override;
 
 protected:
 	UINT getIndexForStage(X_RENDER_STAGE stage);
diff --git a/source/terrax/terrax.cpp b/source/terrax/terrax.cpp
index 88eca8c7a7a4a96170b96d477e33422db4dc64f5..4f2fe39c99ad29a354f2500ebed4268c60f2d138 100644
--- a/source/terrax/terrax.cpp
+++ b/source/terrax/terrax.cpp
@@ -19,6 +19,7 @@ See the license in LICENSE
 
 #include <xcommon/editor/IXEditorObject.h>
 #include <xcommon/editor/IXEditable.h>
+#include <xcommon/IXRenderable.h>
 #include <mtrl/IXMaterialSystem.h>
 #include "UndoManager.h"
 #include "Tools.h"
@@ -257,9 +258,20 @@ public:
 			//m_pRenderPassGeometry2D = m_pMaterialSystem->getRenderPass("xGBuffer");
 			m_pRenderPassGeometry2D = m_pMaterialSystem->registerRenderPass("xEditor2D", "terrax/geom2d.ps", NULL, NULL, NULL, NULL, true);
 		}
+
+		m_pCameraVisibility[0] = NULL;
+		for(UINT i = 0; i < 3; ++i)
+		{
+			newVisData(&m_pCameraVisibility[i + 1]);
+		}
 	}
 	~CRenderPipeline()
 	{
+		for(UINT i = 0; i < 3; ++i)
+		{
+			mem_release(m_pCameraVisibility[i + 1]);
+		}
+
 		m_pCore->setRenderPipeline(m_pOldPipeline);
 		mem_release(m_pOldPipeline);
 	}
@@ -288,6 +300,9 @@ public:
 		ICamera **pCameras = g_xConfig.m_pViewportCamera + 1;
 		float *fScales = g_xConfig.m_fViewportScale + 1;
 		X_2D_VIEW *views = g_xConfig.m_x2DView + 1;
+		IXRenderableVisibility **pCameraVisibility = m_pCameraVisibility + 1;
+
+		//[i + 1]
 		//ICamera *p3DCamera = SRender_GetCamera();
 		pDXDevice->setSamplerState(NULL, 0);
 		//#############################################################################
@@ -319,6 +334,8 @@ public:
 			Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &mProj);
 			Core_RMatrixSet(G_RI_MATRIX_VIEWPROJ, &(mView * mProj));
 
+			pCameras[i]->updateFrustum(&mProj);
+
 			g_pCameraConstantBuffer->update(&SMMatrixIdentity);
 			pDXDevice->setVSConstant(g_pCameraConstantBuffer, SCR_OBJECT);
 
@@ -327,7 +344,7 @@ public:
 
 			XRender2D(views[i], fScales[i], true);
 
-			renderEditor2D();
+			renderEditor2D(pCameraVisibility[i]);
 
 			Core_RIntSet(G_RI_INT_RENDERSTATE, RENDER_STATE_MATERIAL);
 			pDXDevice->setVSConstant(g_pCameraConstantBuffer, SCR_OBJECT);
@@ -366,6 +383,11 @@ public:
 	void updateVisibility() override
 	{
 		m_pOldPipeline->updateVisibility();
+
+		for(UINT i = 0; i < 3; ++i)
+		{
+			m_pCameraVisibility[i + 1]->updateForCamera(g_xConfig.m_pViewportCamera[i + 1]);
+		}
 	}
 
 	void renderStage(X_RENDER_STAGE stage, IXRenderableVisibility *pVisibility = NULL) override
@@ -413,9 +435,9 @@ public:
 	{
 		m_pOldPipeline->renderPostprocessFinal();
 	}
-	void renderEditor2D() override
+	void renderEditor2D(IXRenderableVisibility *pVisibility) override
 	{
-		m_pOldPipeline->renderEditor2D();
+		m_pOldPipeline->renderEditor2D(pVisibility);
 	}
 
 	IXCore *m_pCore;
@@ -423,6 +445,8 @@ public:
 	IXMaterialSystem *m_pMaterialSystem = NULL;
 
 	XRenderPassHandler *m_pRenderPassGeometry2D = NULL;
+
+	IXRenderableVisibility *m_pCameraVisibility[4];
 };
 
 #if defined(_WINDOWS)
diff --git a/source/xSound/SoundLayer.cpp b/source/xSound/SoundLayer.cpp
index 7f8e4fffafef3658d142720cc3762da87188b623..5618ccab209b1f6d61683795defe7cdad1d804d1 100644
--- a/source/xSound/SoundLayer.cpp
+++ b/source/xSound/SoundLayer.cpp
@@ -12,25 +12,25 @@ CSoundLayer::~CSoundLayer()
 	if (m_pParent)
 		m_pParent->delLayer(this);
 
-	for (maplayer::Iterator i = m_mapLayers.begin(); i; i++)
+	for(maplayer::Iterator i = m_mapLayers.begin(); i; ++i)
 	{
 		mem_release(m_mapLayers[i.first]);
 		m_mapLayers.erase(i.first);
 	}
 
-	for (MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; i++)
+	for(MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; ++i)
 	{
 		/*mem_release(m_mapSndPlayers[i.first]);
 		m_mapSndPlayers.erase(i.first);*/
 		ArrayPlayer *oAP = i.second;
-		for (int k = 0, kl = oAP->size(); k < kl; ++k)
+		for(int k = 0, kl = oAP->size(); k < kl; ++k)
 		{
 			mem_release(oAP->get(k));
 		}
 	}
 	m_mapSndPlayers.clear();
 
-	for (MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; i++)
+	for (MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; ++i)
 	{
 		/*mem_release(m_mapSndEmitters[i.first]);
 		m_mapSndEmitters.erase(i.first);*/
@@ -81,9 +81,9 @@ void CSoundLayer::addLayer(CSoundLayer *pLayer, const char *szName)
 
 void CSoundLayer::delLayer(const CSoundLayer *pLayer)
 {
-	for (maplayer::Iterator i = m_mapLayers.begin(); i; i++)
+	for(maplayer::Iterator i = m_mapLayers.begin(); i; ++i)
 	{
-		if (m_mapLayers[i.first] == pLayer)
+		if(m_mapLayers[i.first] == pLayer)
 		{
 			m_mapLayers.erase(i.first);
 			break;
@@ -113,7 +113,7 @@ void CSoundLayer::delSndPlayer(const CSoundPlayer *pSndPlayer)
 		}
 	}
 
-	/*for (MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; i++)
+	/*for (MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; ++i)
 	{
 		if (m_mapSndPlayers[i.first] == pSndPlayer)
 		{
@@ -145,7 +145,7 @@ void CSoundLayer::delSndEmitter(const CSoundEmitter *pSndEmitter)
 			m_mapSndEmitters[szName].erase(i);
 		}
 	}
-	/*for (MapPlayer::Iterator i = m_mapSndEmitters.begin(); i; i++)
+	/*for (MapPlayer::Iterator i = m_mapSndEmitters.begin(); i; ++i)
 	{
 		if (m_mapSndEmitters[i.first] == pSndEmitter)
 		{
@@ -185,9 +185,9 @@ IXSoundLayer* XMETHODCALLTYPE CSoundLayer::findLayer(const char *szName)
 
 	IXSoundLayer *pFound = NULL;
 
-	for (maplayer::Iterator i = m_mapLayers.begin(); i; i++)
+	for(maplayer::Iterator i = m_mapLayers.begin(); i; ++i)
 	{
-		if ((pFound = m_mapLayers[i.first]->findLayer(szName)))
+		if((pFound = m_mapLayers[i.first]->findLayer(szName)))
 			break;
 	}
 
@@ -294,27 +294,27 @@ void XMETHODCALLTYPE CSoundLayer::play(bool canPlay)
 
 	m_isPlaying = canPlay;
 
-	for (maplayer::Iterator i = m_mapLayers.begin(); i; i++)
+	for(maplayer::Iterator i = m_mapLayers.begin(); i; ++i)
 		m_mapLayers[i.first]->play(canPlay);
 
-	for (MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; i++)
+	for(MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; ++i)
 	{
 		/*if (canPlay)
 			m_mapSndPlayers[i.first]->resume();
-		else
+			else
 			m_mapSndPlayers[i.first]->pause();*/
 
 		ArrayPlayer *oAP = i.second;
-		for (int k = 0, kl = oAP->size(); k < kl; ++k)
+		for(int k = 0, kl = oAP->size(); k < kl; ++k)
 		{
-			if (canPlay)
+			if(canPlay)
 				oAP->get(k)->resume();
 			else
 				oAP->get(k)->pause();
 		}
 	}
 
-	for (MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; i++)
+	for (MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; ++i)
 	{
 		/*if (canPlay)
 			m_mapSndEmitters[i.first]->resume();
@@ -341,29 +341,29 @@ bool XMETHODCALLTYPE CSoundLayer::isPlaying() const
 
 void CSoundLayer::update(const float3 &vListenerPos, const float3 &vListenerDir, const float3 &vListenerUp)
 {
-	for (maplayer::Iterator i = m_mapLayers.begin(); i; i++)
+	for(maplayer::Iterator i = m_mapLayers.begin(); i; ++i)
 	{
-		if (m_mapLayers[i.first])
+		if(m_mapLayers[i.first])
 			m_mapLayers[i.first]->update(vListenerPos, vListenerDir, vListenerUp);
 	}
 
-	for (MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; i++)
+	for(MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; ++i)
 	{
 		/*if (m_mapSndPlayers[i.first])
 			m_mapSndPlayers[i.first]->update(vListenerPos, vListenerDir, vListenerUp);*/
 
 		ArrayPlayer *oAP = i.second;
-		for (int k = 0, kl = oAP->size(); k < kl; ++k)
+		for(int k = 0, kl = oAP->size(); k < kl; ++k)
 			oAP->get(k)->update(vListenerPos, vListenerDir, vListenerUp);
 	}
 
-	for (MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; i++)
+	for(MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; ++i)
 	{
 		/*if (m_mapSndEmitters[i.first])
 			m_mapSndEmitters[i.first]->update(vListenerPos, vListenerDir, vListenerUp);*/
 
 		ArrayEmitter *oAE = i.second;
-		for (int k = 0, kl = oAE->size(); k < kl; ++k)
+		for(int k = 0, kl = oAE->size(); k < kl; ++k)
 			oAE->get(k)->update(vListenerPos, vListenerDir, vListenerUp);
 	}
 }
diff --git a/source/xSound/SoundSystem.cpp b/source/xSound/SoundSystem.cpp
index 7109a7ce15a4cd4ce9788905557b132c430b1acd..87c83c36caadb4027f6c83076c7065922c95c279 100644
--- a/source/xSound/SoundSystem.cpp
+++ b/source/xSound/SoundSystem.cpp
@@ -110,9 +110,9 @@ IXAudioCodecTarget* CSoundSystem::getCodecTarget(const char *szName)
 	IXAudioCodecTarget *pTarget = NULL;
 	IXAudioCodecTarget *pTarget2 = NULL;
 
-	for (mapcodec::Iterator i = m_mapCodecs.begin(); i != m_mapCodecs.end(); i++)
+	for(mapcodec::Iterator i = m_mapCodecs.begin(); i; ++i)
 	{
-		if (m_mapCodecs[i.first]->open(szPath, "", &pTarget, false))
+		if(m_mapCodecs[i.first]->open(szPath, "", &pTarget, false))
 		{
 			pCodec = m_mapCodecs[i.first];
 			break;
@@ -283,7 +283,7 @@ IXSoundLayer* XMETHODCALLTYPE CSoundSystem::findLayer(const char *szName)
 
 IXAudioCodec* CSoundSystem::getCodecSave()
 {
-	for (mapcodec::Iterator i = m_mapCodecs.begin(); i != m_mapCodecs.end(); i++)
+	for (mapcodec::Iterator i = m_mapCodecs.begin(); i; ++i)
 	{
 		if (m_mapCodecs[i.first]->canSave())
 			return m_mapCodecs[i.first];
diff --git a/source/xcommon/IXRenderPipeline.h b/source/xcommon/IXRenderPipeline.h
index 0f73383fba4be1d1ad0eef3dcce0fd54d06535c5..070298a47c4fb7b6e80071043c42f14d424f7b5b 100644
--- a/source/xcommon/IXRenderPipeline.h
+++ b/source/xcommon/IXRenderPipeline.h
@@ -43,7 +43,7 @@ public:
 	virtual void renderPostprocessMain() = 0;
 	virtual void renderTransparent() = 0;
 	virtual void renderPostprocessFinal() = 0;
-	virtual void renderEditor2D() = 0;
+	virtual void renderEditor2D(IXRenderableVisibility *pVisibility = NULL) = 0;
 };
 
 #endif