diff --git a/build/config_editor.cfg b/build/config_editor.cfg
index 1f0c7fee806022c5511574530000145b1211a0c6..8a02e596e8f10929760a7b9cef98d2a6a78508ea 100644
--- a/build/config_editor.cfg
+++ b/build/config_editor.cfg
@@ -6,6 +6,8 @@ cl_mode_editor 1
 
 r_stats 2
 
+r_clear_color 1
+
 hud_draw 0
 hud_crosshair 0
 hud_rangefinder 0
diff --git a/source/anim/Renderable.cpp b/source/anim/Renderable.cpp
index d3a49219136eb34791aa71ed9094576f889f99d8..f58eaae30dc27e8d247ab591ed913ea0ee82702b 100644
--- a/source/anim/Renderable.cpp
+++ b/source/anim/Renderable.cpp
@@ -20,6 +20,11 @@ UINT XMETHODCALLTYPE CRenderable::getPriorityForStage(X_RENDER_STAGE stage)
 
 void XMETHODCALLTYPE CRenderable::renderStage(X_RENDER_STAGE stage, IXRenderableVisibility *pVisibility)
 {
+	if(!m_isEnabled)
+	{
+		return;
+	}
+
 	CRenderableVisibility *pVis = NULL;
 	if(pVisibility)
 	{
diff --git a/source/anim/Renderable.h b/source/anim/Renderable.h
index 07f43523d76b1face9182ae1c54183b5d82db62f..6510650ba42342524fcb48acb116fc023d7febfb 100644
--- a/source/anim/Renderable.h
+++ b/source/anim/Renderable.h
@@ -42,11 +42,18 @@ public:
 	}
 
 	IXMaterialSystem* getMaterialSystem();
+
+	void setEnabled(bool set)
+	{
+		m_isEnabled = set;
+	}
 protected:
 	IGXDevice *m_pDevice = NULL;
 	IXMaterialSystem *m_pMaterialSystem = NULL;
 	ID m_idPlugin = -1;
 
+	bool m_isEnabled = true;
+
 	CAnimatedModelProvider *m_pAnimatedModelProvider = NULL;
 	CDynamicModelProvider *m_pDynamicModelProvider = NULL;
 };
diff --git a/source/anim/plugin_main.cpp b/source/anim/plugin_main.cpp
index 1766ff3eeeb315a215d49312a2f0d6e08f8ad211..ddfac260134d8351379e579fc3fe2cf000f8114b 100644
--- a/source/anim/plugin_main.cpp
+++ b/source/anim/plugin_main.cpp
@@ -24,6 +24,32 @@ protected:
 	CDynamicModelProvider *m_pDynamicModelProvider;
 };
 
+class CLoadLevelEventListener final: public IEventListener<XEventLevel>
+{
+public:
+	CLoadLevelEventListener(CRenderable *pRenderable):
+		m_pRenderable(pRenderable)
+	{}
+	void onEvent(const XEventLevel *pData)
+	{
+		switch(pData->type)
+		{
+		case XEventLevel::TYPE_LOAD_BEGIN:
+			m_pRenderable->setEnabled(false);
+			break;
+		case XEventLevel::TYPE_LOAD_END:
+			m_pRenderable->setEnabled(true);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+protected:
+	CRenderable *m_pRenderable;
+};
+
 class CDSEPlugin: public IXUnknownImplementation<IXPlugin>
 {
 public:
@@ -34,8 +60,10 @@ public:
 		m_pRenderable = new CRenderable(getID(), m_pAnimatedModelProvider, m_pDynamicModelProvider);
 		m_pUpdatable = new CUpdatable(m_pAnimatedModelProvider, m_pDynamicModelProvider);
 		m_pLevelSizeEventListener = new CLevelSizeEventListener(m_pAnimatedModelProvider, m_pDynamicModelProvider);
+		m_pLevelLoadEventListener = new CLoadLevelEventListener(m_pRenderable);
 
 		m_pCore->getEventChannel<XEventLevelSize>(EVENT_LEVEL_GET_SIZE_GUID)->addListener(m_pLevelSizeEventListener);
+		m_pCore->getEventChannel<XEventLevel>(EVENT_LEVEL_GUID)->addListener(m_pLevelLoadEventListener);
 	}
 
 	void XMETHODCALLTYPE startup(IXCore *pCore) override
@@ -130,6 +158,7 @@ protected:
 	CAnimatedModelProvider *m_pAnimatedModelProvider = NULL;
 	CDynamicModelProvider *m_pDynamicModelProvider = NULL;
 	CLevelSizeEventListener *m_pLevelSizeEventListener = NULL;
+	CLoadLevelEventListener *m_pLevelLoadEventListener = NULL;
 };
 
 DECLARE_XPLUGIN(CDSEPlugin);
diff --git a/source/core/concmd.cpp b/source/core/concmd.cpp
index 32fa000c11be9b6c83f7eba341e8c48a05584ccb..ea874861762619dd796b547bc8dff6eab6f155d4 100644
--- a/source/core/concmd.cpp
+++ b/source/core/concmd.cpp
@@ -108,6 +108,42 @@ SX_LIB_API XDEPRECATED void Core_0RegisterConcmdClsArg(const char * name, void *
 
 Mutex g_conUpdMtx;
 
+class CAlias;
+void Core_0RegisterConcmdAlias(const char *name, CAlias *pAlias, const char * desc);
+void ConsoleExecInternal(char * cmd);
+class CAlias final
+{
+public:
+	CAlias(const char *szName, const char *szDesc):
+		m_sName(szName),
+		m_sDesc(szDesc ? szDesc : "")
+	{
+	}
+
+	void execute()
+	{
+		for(UINT i = 0, l = m_aCommands.size(); i < l; ++i)
+		{
+			char *szStr = strdupa(m_aCommands[i].c_str());
+			ConsoleExecInternal(szStr);
+		}
+	}
+	void addCommand(const char *str)
+	{
+		m_aCommands.push_back(str);
+	}
+
+	void reg()
+	{
+		Core_0RegisterConcmdAlias(m_sName.c_str(), this, m_sDesc.c_str());
+	}
+private:
+	String m_sName;
+	String m_sDesc;
+	Array<String> m_aCommands;
+};
+CAlias *g_pNewAlias = NULL;
+
 void ConsoleExecInternal(char * cmd, char * args)
 {
 	const AssotiativeArray<String, ConCmd>::Node * pNode;
@@ -242,6 +278,12 @@ void ConsoleExecInternal(char * cmd, char * args)
 }
 void ConsoleExecInternal(char * cmd)
 {
+	if(g_pNewAlias && fstrcmp(cmd, "endalias"))
+	{
+		g_pNewAlias->addCommand(cmd);
+		return;
+	}
+
 	char * space = cmd;
 	while((*++space) && !isspace(*space));
 	if(*space)
@@ -343,6 +385,41 @@ SX_LIB_API XDEPRECATED void Core_0ConsoleExecCmd(const char * format, ...)
 	mem_delete_a(cbuf);
 }
 
+
+void Core_0RegisterConcmdAlias(const char *name, CAlias *pAlias, const char * desc)
+{
+	String sName(name);
+
+	ConCmd c;
+	c.type = CMD_CLS;
+	c.cls = (ConCmdStub*)pAlias;
+	c.cmd.clscmd = (SXCONCMDCLS)&CAlias::execute;
+	c.szDesc = NULL;
+	c.isAlias = true;
+	if(desc)
+	{
+		c.szDesc = new char[strlen(desc) + 1];
+		strcpy(c.szDesc, desc);
+	}
+
+	const AssotiativeArray<String, ConCmd>::Node *pNode;
+	if(g_mCmds.KeyExists(sName, &pNode))
+	{
+		if(pNode->Val->isAlias)
+		{
+			CAlias *ptr = (CAlias*)pNode->Val->cls;
+			mem_delete(ptr);
+		}
+		if(pNode->Val->szDesc)
+		{
+			mem_delete_a(pNode->Val->szDesc);
+		}
+	}
+
+	g_mCmds[sName] = c;
+}
+
+
 void echo(int argc, const char ** argv)
 {
 	for(int i = 1; i < argc; ++i)
@@ -620,6 +697,33 @@ void cmd_cmdlist(int argc, const char ** argv)
 	DumpCCommands();
 }
 
+void cmd_alias(int argc, const char **argv)
+{
+	if(argc == 2 || argc == 3)
+	{
+		if(g_pNewAlias)
+		{
+			printf(COLOR_RED "Cannot create nested alias! Removing previous!\n" COLOR_RESET);
+			mem_delete(g_pNewAlias);
+		}
+		g_pNewAlias = new CAlias(argv[1], argc == 3 ? argv[2] : NULL);
+	}
+	else
+	{
+		printf(COLOR_GREEN "Usage:\n    " COLOR_LGREEN "alias <name> [<description>]" COLOR_GREEN " - Create new alias\n" COLOR_RESET);
+	}
+}
+void cmd_endalias()
+{
+	if(!g_pNewAlias)
+	{
+		printf(COLOR_RED "No alias was started!\n" COLOR_RESET);
+		return;
+	}
+	g_pNewAlias->reg();
+	g_pNewAlias = NULL;
+}
+
 void ConsoleRegisterCmds()
 {
 	Core_0RegisterConcmdArg("echo", echo, "Echoes all parameters to console");
@@ -631,6 +735,8 @@ void ConsoleRegisterCmds()
 	Core_0RegisterConcmdArg("cvarlist", cmd_cvarlist, "List all CVars");
 	Core_0RegisterConcmdArg("cmdlist", cmd_cmdlist, "List all Commands");
 	Core_0RegisterConcmd("perf_dump", cmd_perf_dump, "Show perfMon stats");
+	Core_0RegisterConcmdArg("alias", cmd_alias, "Begin alias creation");
+	Core_0RegisterConcmd("endalias", cmd_endalias, "End alias creation");
 
 	Core_0RegisterCVarInt("con_width", 80, "Ширина окна консоли");
 	Core_0RegisterCVarInt("con_height", 25, "Высота окна консоли");
diff --git a/source/core/concmd.h b/source/core/concmd.h
index 86b5981820aa4baa240fb750ea63f41272f34b0d..d401384970917a799ce3fbcd6ae208e5155ca2e1 100644
--- a/source/core/concmd.h
+++ b/source/core/concmd.h
@@ -22,14 +22,15 @@ enum ConCmdType
 struct ConCmd
 {
 	ConCmdType type;
-	ConCmdStub * cls;
+	ConCmdStub *cls;
 	union
 	{
-		void * cmd;
+		void *cmd;
 		SXCONCMDCLS clscmd;
 		SXCONCMDCLSARG clscmdarg;
 	} cmd;
-	char * szDesc;
+	char *szDesc;
+	bool isAlias = false;
 };
 
 bool ConsoleConnect(const char *szName = 0, bool bNewInstance = false);
diff --git a/source/game/GameData.cpp b/source/game/GameData.cpp
index 5c544c95b381cc2fa2904b483e7cd00e214b2eea..7efb990990460a026b4050e7816afd278ca2dce7 100644
--- a/source/game/GameData.cpp
+++ b/source/game/GameData.cpp
@@ -1187,6 +1187,8 @@ GameData::GameData(HWND hWnd, bool isGame):
 }
 GameData::~GameData()
 {
+	EndMap();
+
 	mem_release(g_pAsyncTaskRunner);
 	//mem_delete(g_pRagdoll);
 	mem_delete(g_pEditable);
diff --git a/source/render/RenderPipeline.cpp b/source/render/RenderPipeline.cpp
index d64a070ba51315f609299f82b1f44d70c9267b3a..5ec47998e7abab30fc736a4948762e064b94bef1 100644
--- a/source/render/RenderPipeline.cpp
+++ b/source/render/RenderPipeline.cpp
@@ -25,6 +25,8 @@ CRenderPipeline::CRenderPipeline(IGXDevice *pDevice):
 	Core_0RegisterCVarBool("dev_lpv_cubes", false, "Отображать сетку LPV");
 	Core_0RegisterCVarBool("dev_lpv_points", false, "Отображать VPL при инъекции в LPV");
 
+	Core_0RegisterCVarBool("r_clear_color", false, "Очищать буфер перед выводом кадра");
+
 	Core_0RegisterCVarFloat("hdr_adapted_coef", 0.3f, "Коэфициент привыкания к освещению (0,1] (медлено, быстро)");
 	Core_0RegisterCVarFloat("hdr_base_value", 0.2f, "Базовое значение для тонмаппинга  (0,0.5] (темно, ярко)");
 	
@@ -829,6 +831,8 @@ void CRenderPipeline::renderGBuffer()
 {
 	IGXContext *pCtx = m_pDevice->getThreadContext();
 
+	static const bool *r_clear_color = GET_PCVAR_BOOL("r_clear_color");
+
 	m_pMaterialSystem->bindRenderPass(m_pRenderPassGBuffer);
 
 	pCtx->setRasterizerState(NULL);
@@ -859,7 +863,7 @@ void CRenderPipeline::renderGBuffer()
 
 	pCtx->setColorTarget(pColorSurf);
 	//pCtx->clear(GX_CLEAR_COLOR | GX_CLEAR_DEPTH | GX_CLEAR_STENCIL, RENDER_DEFAUL_BACKGROUND_COLOR, 0.0f);
-	pCtx->clear(GX_CLEAR_DEPTH | GX_CLEAR_STENCIL, RENDER_DEFAUL_BACKGROUND_COLOR, 0.0f);
+	pCtx->clear(GX_CLEAR_DEPTH | GX_CLEAR_STENCIL | (*r_clear_color ? GX_CLEAR_COLOR : 0), RENDER_DEFAUL_BACKGROUND_COLOR, 0.0f);
 
 	pCtx->setColorTarget(pNormalSurf, 1);
 	pCtx->setColorTarget(pParamSurf, 2);
diff --git a/source/terrax/terrax.cpp b/source/terrax/terrax.cpp
index 4f2fe39c99ad29a354f2500ebed4268c60f2d138..26b466eb8d510e7807954cfc08971483a8cb2cc0 100644
--- a/source/terrax/terrax.cpp
+++ b/source/terrax/terrax.cpp
@@ -896,9 +896,9 @@ int main(int argc, char **argv)
 	mem_delete(pPipeline);
 	mem_release(g_pCameraConstantBuffer);
 	mem_delete(g_pGrid);
-	mem_delete(g_pUndoManager);
 	//SkyXEngine_Kill();
 	mem_release(pEngine);
+	mem_delete(g_pUndoManager);
 	return result;
 }